2015-11-11 14:45:23 +00:00
|
|
|
#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby -W0
|
2012-09-03 11:56:29 -04:00
|
|
|
|
2014-06-03 10:14:58 -05:00
|
|
|
$:.unshift Dir["/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/{1.8,2.0.0}"].first
|
2015-08-03 13:09:07 +01:00
|
|
|
require "pathname"
|
|
|
|
require "set"
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
|
|
|
|
class Cmd
|
2015-02-08 20:04:06 -05:00
|
|
|
attr_reader :config, :prefix, :cellar, :tmpdir, :sysroot
|
2015-02-08 20:04:07 -05:00
|
|
|
attr_reader :archflags, :optflags
|
2013-11-21 14:50:35 -06:00
|
|
|
|
2015-02-12 19:13:03 -05:00
|
|
|
def initialize(arg0, args)
|
|
|
|
@arg0 = arg0
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
@args = args.freeze
|
2015-02-08 20:04:06 -05:00
|
|
|
@config = ENV.fetch("HOMEBREW_CCCFG") { "" }
|
2015-08-03 13:09:07 +01:00
|
|
|
@prefix = ENV["HOMEBREW_PREFIX"]
|
|
|
|
@cellar = ENV["HOMEBREW_CELLAR"]
|
|
|
|
@tmpdir = ENV["HOMEBREW_TEMP"]
|
|
|
|
@sysroot = ENV["HOMEBREW_SDKROOT"]
|
2015-02-08 20:04:07 -05:00
|
|
|
@archflags = ENV.fetch("HOMEBREW_ARCHFLAGS") { "" }.split(" ")
|
|
|
|
@optflags = ENV.fetch("HOMEBREW_OPTFLAGS") { "" }.split(" ")
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def mode
|
2015-08-06 15:45:52 +08:00
|
|
|
if @arg0 == "cpp" || @arg0 == "ld"
|
2012-08-31 09:18:05 -04:00
|
|
|
@arg0.to_sym
|
2015-08-03 13:09:07 +01:00
|
|
|
elsif @args.include? "-c"
|
2013-10-07 00:40:32 -07:00
|
|
|
if @arg0 =~ /(?:c|g|clang)\+\+/
|
|
|
|
:cxx
|
|
|
|
else
|
|
|
|
:cc
|
|
|
|
end
|
2015-08-03 13:09:07 +01:00
|
|
|
elsif @args.include? "-E"
|
2013-08-31 10:43:23 -05:00
|
|
|
:ccE
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
else
|
2013-10-07 00:40:32 -07:00
|
|
|
if @arg0 =~ /(?:c|g|clang)\+\+/
|
|
|
|
:cxxld
|
|
|
|
else
|
|
|
|
:ccld
|
|
|
|
end
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def tool
|
2012-09-03 11:56:29 -04:00
|
|
|
@tool ||= case @arg0
|
2015-08-03 13:09:07 +01:00
|
|
|
when "ld" then "ld"
|
|
|
|
when "cpp" then "cpp"
|
2015-05-26 18:52:00 -04:00
|
|
|
when /\w\+\+(-\d(\.\d)?)?$/
|
2015-08-03 13:09:07 +01:00
|
|
|
case ENV["HOMEBREW_CC"]
|
2013-05-27 12:54:07 -05:00
|
|
|
when /clang/
|
2015-08-03 13:09:07 +01:00
|
|
|
"clang++"
|
2013-05-27 12:54:07 -05:00
|
|
|
when /llvm-gcc/
|
2015-08-03 13:09:07 +01:00
|
|
|
"llvm-g++-4.2"
|
2015-05-26 18:52:00 -04:00
|
|
|
when /gcc(-\d(\.\d)?)?$/
|
2015-08-03 13:09:07 +01:00
|
|
|
"g++" + $1.to_s
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
|
|
|
else
|
2013-10-16 17:53:01 -07:00
|
|
|
# Note that this is a universal fallback, so that we'll always invoke
|
|
|
|
# HOMEBREW_CC regardless of what name under which the tool was invoked.
|
2015-08-03 13:09:07 +01:00
|
|
|
ENV["HOMEBREW_CC"]
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def args
|
2015-08-06 15:45:52 +08:00
|
|
|
if @args.length == 1 && @args[0] == "-v"
|
2014-03-25 08:15:31 +00:00
|
|
|
# Don't add linker arguments if -v passed as sole option. This stops gcc
|
|
|
|
# -v with no other arguments from outputting a linker error. Some
|
|
|
|
# software uses gcc -v (wrongly) to sniff the GCC version.
|
|
|
|
return @args.dup
|
|
|
|
end
|
2015-02-08 20:04:06 -05:00
|
|
|
|
|
|
|
if !refurbish_args? || tool == "ld" || configure?
|
2014-02-28 20:37:33 -06:00
|
|
|
args = @args.dup
|
2012-08-31 09:18:05 -04:00
|
|
|
else
|
2014-02-28 20:37:33 -06:00
|
|
|
args = refurbished_args
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-05-19 14:18:23 -05:00
|
|
|
if sysroot
|
2014-04-21 00:17:22 -05:00
|
|
|
if tool == "ld"
|
2014-05-19 14:18:23 -05:00
|
|
|
args << "-syslibroot" << sysroot
|
2014-04-21 00:17:22 -05:00
|
|
|
else
|
2014-10-27 23:59:47 -05:00
|
|
|
args << "-isysroot" << sysroot << "--sysroot=#{sysroot}"
|
2014-04-21 00:17:22 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-02-10 20:27:26 -05:00
|
|
|
case mode
|
2013-11-10 18:24:49 -06:00
|
|
|
when :ccld
|
2013-08-31 10:38:18 -05:00
|
|
|
cflags + args + cppflags + ldflags
|
2013-11-10 18:24:49 -06:00
|
|
|
when :cxxld
|
|
|
|
cxxflags + args + cppflags + ldflags
|
|
|
|
when :cc
|
2013-08-31 10:38:18 -05:00
|
|
|
cflags + args + cppflags
|
2013-11-10 18:24:49 -06:00
|
|
|
when :cxx
|
|
|
|
cxxflags + args + cppflags
|
2013-08-31 10:43:23 -05:00
|
|
|
when :ccE
|
2013-08-31 11:14:38 -05:00
|
|
|
args + cppflags
|
2013-08-31 10:43:23 -05:00
|
|
|
when :cpp
|
|
|
|
args + cppflags
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
when :ld
|
|
|
|
ldflags + args
|
2015-02-12 20:09:31 -05:00
|
|
|
end
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def refurbished_args
|
2014-05-19 14:18:23 -05:00
|
|
|
@lset = Set.new(library_paths + system_library_paths)
|
|
|
|
@iset = Set.new(isystem_paths + include_paths)
|
2012-09-03 14:34:42 -04:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
args = []
|
2014-05-06 15:21:01 -05:00
|
|
|
enum = @args.each
|
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
loop do
|
2014-05-06 15:21:01 -05:00
|
|
|
case arg = enum.next
|
|
|
|
when "-arch"
|
2015-02-08 20:04:06 -05:00
|
|
|
if permit_arch_flags?
|
2014-05-14 00:00:59 -05:00
|
|
|
args << arg << enum.next
|
|
|
|
else
|
|
|
|
enum.next
|
|
|
|
end
|
2014-05-22 09:18:34 -05:00
|
|
|
when "-m32", "-m64"
|
2015-02-08 20:04:06 -05:00
|
|
|
args << arg if permit_arch_flags?
|
2014-05-06 15:21:01 -05:00
|
|
|
when /^-Xarch_/
|
|
|
|
refurbished = refurbish_arg(enum.next, enum)
|
|
|
|
unless refurbished.empty?
|
|
|
|
args << arg
|
|
|
|
args += refurbished
|
|
|
|
end
|
|
|
|
else
|
|
|
|
args += refurbish_arg(arg, enum)
|
|
|
|
end
|
2014-05-06 15:21:01 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
args
|
|
|
|
end
|
|
|
|
|
|
|
|
def refurbish_arg(arg, enum)
|
|
|
|
args = []
|
|
|
|
|
|
|
|
case arg
|
2015-12-29 11:56:55 +00:00
|
|
|
when /^-g\d?$/, /^-gstabs\d+/, "-gstabs+", /^-ggdb\d?/,
|
2014-05-10 16:54:30 -05:00
|
|
|
/^-march=.+/, /^-mtune=.+/, /^-mcpu=.+/,
|
2015-08-03 13:09:07 +01:00
|
|
|
/^-O[0-9zs]?$/, "-fast", "-no-cpp-precomp",
|
|
|
|
"-pedantic", "-pedantic-errors", "-Wno-long-double",
|
|
|
|
"-Wno-unused-but-set-variable"
|
|
|
|
when "-fopenmp", "-lgomp", "-mno-fused-madd", "-fforce-addr", "-fno-defer-pop",
|
|
|
|
"-mno-dynamic-no-pic", "-fearly-inlining", /^-f(?:no-)?inline-functions-called-once/,
|
|
|
|
/^-finline-limit/, /^-f(?:no-)?check-new/, "-fno-delete-null-pointer-checks",
|
|
|
|
"-fcaller-saves", "-fthread-jumps", "-fno-reorder-blocks", "-fcse-skip-blocks",
|
|
|
|
"-frerun-cse-after-loop", "-frerun-loop-opt", "-fcse-follow-jumps",
|
|
|
|
"-fno-regmove", "-fno-for-scope", "-fno-tree-pre", "-fno-tree-dominator-opts",
|
|
|
|
"-fuse-linker-plugin"
|
2014-05-06 15:21:01 -05:00
|
|
|
# clang doesn't support these flags
|
2015-08-03 13:09:07 +01:00
|
|
|
args << arg unless tool =~ /^clang/
|
2016-01-11 22:23:33 -04:00
|
|
|
when "-Wno-deprecated-register"
|
|
|
|
# older gccs don't support these flags
|
|
|
|
args << arg unless tool =~ /^gcc-4.[02]/
|
2014-05-06 19:29:18 -05:00
|
|
|
when /^-W[alp],/, /^-Wno-/
|
|
|
|
args << arg
|
2014-05-06 15:21:01 -05:00
|
|
|
when /^-W.*/
|
2014-05-06 19:29:18 -05:00
|
|
|
# prune warnings
|
2015-08-03 13:09:07 +01:00
|
|
|
when "-macosx_version_min", "-dylib_install_name"
|
2014-05-06 15:21:01 -05:00
|
|
|
args << "-Wl,#{arg},#{enum.next}"
|
2015-08-03 13:09:07 +01:00
|
|
|
when "-multiply_definedsuppress"
|
2014-05-06 15:21:01 -05:00
|
|
|
args << "-Wl,-multiply_defined,suppress"
|
2015-08-03 13:09:07 +01:00
|
|
|
when "-undefineddynamic_lookup"
|
2014-05-06 15:21:01 -05:00
|
|
|
args << "-Wl,-undefined,dynamic_lookup"
|
2014-05-12 22:15:33 -05:00
|
|
|
when /^-isysroot/, /^--sysroot/
|
2015-09-24 18:43:49 -04:00
|
|
|
sdk = enum.next
|
|
|
|
# We set the sysroot for OS X SDKs
|
|
|
|
args << "-isysroot" << sdk unless sdk.downcase.include? "osx"
|
2015-08-03 13:09:07 +01:00
|
|
|
when "-dylib"
|
2014-05-06 15:21:01 -05:00
|
|
|
args << "-Wl,#{arg}"
|
|
|
|
when /^-I(.+)?/
|
|
|
|
# Support both "-Ifoo" (one argument) and "-I foo" (two arguments)
|
|
|
|
val = chuzzle($1) || enum.next
|
|
|
|
path = canonical_path(val)
|
|
|
|
args << "-I#{val}" if keep?(path) && @iset.add?(path)
|
|
|
|
when /^-L(.+)?/
|
|
|
|
val = chuzzle($1) || enum.next
|
|
|
|
path = canonical_path(val)
|
|
|
|
args << "-L#{val}" if keep?(path) && @lset.add?(path)
|
|
|
|
else
|
|
|
|
args << arg
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-05-06 15:21:01 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
args
|
|
|
|
end
|
2013-12-27 15:46:36 -06:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def keep?(path)
|
2015-02-07 13:20:10 -05:00
|
|
|
path.start_with?(prefix, cellar, tmpdir) || !path.start_with?("/opt", "/sw", "/usr/X11")
|
2013-12-27 15:46:36 -06:00
|
|
|
end
|
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def cflags
|
2013-10-07 00:40:32 -07:00
|
|
|
args = []
|
|
|
|
|
2015-02-08 20:04:06 -05:00
|
|
|
return args unless refurbish_args? || configure?
|
2013-11-11 12:14:23 -06:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
args << "-pipe"
|
|
|
|
args << "-w" unless configure?
|
2015-02-08 20:04:07 -05:00
|
|
|
args << "-#{ENV["HOMEBREW_OPTIMIZATION_LEVEL"]}"
|
2013-11-12 12:00:18 -06:00
|
|
|
args.concat(optflags)
|
|
|
|
args.concat(archflags)
|
|
|
|
args << "-std=#{@arg0}" if @arg0 =~ /c[89]9/
|
|
|
|
args
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2013-11-12 12:00:18 -06:00
|
|
|
def cxxflags
|
|
|
|
args = cflags
|
2015-02-08 20:04:06 -05:00
|
|
|
args << "-std=c++11" if cxx11?
|
|
|
|
args << "-stdlib=libc++" if libcxx?
|
|
|
|
args << "-stdlib=libstdc++" if libstdcxx?
|
2013-11-12 12:00:18 -06:00
|
|
|
args
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-05-19 14:18:23 -05:00
|
|
|
def cppflags
|
|
|
|
path_flags("-isystem", isystem_paths) + path_flags("-I", include_paths)
|
2012-09-03 14:34:42 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
def ldflags
|
2014-05-19 14:18:23 -05:00
|
|
|
args = path_flags("-L", library_paths)
|
2013-08-23 11:36:03 -05:00
|
|
|
case mode
|
2014-05-10 17:10:40 -05:00
|
|
|
when :ld
|
|
|
|
args << "-headerpad_max_install_names"
|
|
|
|
when :ccld, :cxxld
|
|
|
|
args << "-Wl,-headerpad_max_install_names"
|
2013-08-23 11:36:03 -05:00
|
|
|
end
|
|
|
|
args
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-05-19 14:18:23 -05:00
|
|
|
def isystem_paths
|
|
|
|
path_split("HOMEBREW_ISYSTEM_PATHS")
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_paths
|
|
|
|
path_split("HOMEBREW_INCLUDE_PATHS")
|
|
|
|
end
|
|
|
|
|
|
|
|
def library_paths
|
|
|
|
path_split("HOMEBREW_LIBRARY_PATHS")
|
|
|
|
end
|
|
|
|
|
|
|
|
def system_library_paths
|
2015-08-03 13:09:07 +01:00
|
|
|
%W[#{sysroot}/usr/lib /usr/local/lib]
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2013-11-04 11:02:12 -06:00
|
|
|
def configure?
|
2013-11-15 00:15:50 -06:00
|
|
|
# configure scripts generated with autoconf 2.61 or later export as_nl
|
2015-08-03 13:09:07 +01:00
|
|
|
ENV.key? "as_nl"
|
2013-11-04 11:02:12 -06:00
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2015-02-08 20:04:06 -05:00
|
|
|
def refurbish_args?
|
2015-02-08 20:04:06 -05:00
|
|
|
config.include?("O")
|
2015-02-08 20:04:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def cxx11?
|
2015-02-08 20:04:06 -05:00
|
|
|
config.include?("x")
|
2015-02-08 20:04:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def libcxx?
|
2015-02-08 20:04:06 -05:00
|
|
|
config.include?("g")
|
2015-02-08 20:04:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def libstdcxx?
|
2015-02-08 20:04:06 -05:00
|
|
|
config.include?("h")
|
2015-02-08 20:04:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def permit_arch_flags?
|
2015-02-08 20:04:06 -05:00
|
|
|
config.include?("K")
|
2015-02-08 20:04:06 -05:00
|
|
|
end
|
|
|
|
|
2014-04-20 19:57:01 -05:00
|
|
|
def canonical_path(path)
|
|
|
|
path = Pathname.new(path)
|
|
|
|
path = path.realpath if path.exist?
|
|
|
|
path.to_s
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-04-20 19:54:32 -05:00
|
|
|
def path_flags(prefix, paths)
|
|
|
|
paths = paths.uniq.select { |path| File.directory?(path) }
|
|
|
|
paths.map! { |path| prefix + path }
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-04-20 22:39:47 -05:00
|
|
|
def path_split(key)
|
|
|
|
ENV.fetch(key) { "" }.split(File::PATH_SEPARATOR)
|
|
|
|
end
|
2014-04-21 00:17:22 -05:00
|
|
|
|
2014-04-20 22:39:47 -05:00
|
|
|
def chuzzle(val)
|
|
|
|
return val if val.nil?
|
|
|
|
val = val.chomp
|
|
|
|
return val unless val.empty?
|
|
|
|
end
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
end
|
|
|
|
|
2015-02-10 20:27:26 -05:00
|
|
|
def log(basename, argv, tool, args)
|
|
|
|
return unless ENV.key?("HOMEBREW_CC_LOG_PATH")
|
|
|
|
|
|
|
|
adds = args - argv
|
|
|
|
dels = argv - args
|
|
|
|
|
|
|
|
s = ""
|
|
|
|
s << "#{basename} called with: #{argv.join(" ")}\n"
|
|
|
|
s << "superenv removed: #{dels.join(" ")}\n" unless dels.empty?
|
|
|
|
s << "superenv added: #{adds.join(" ")}\n" unless adds.empty?
|
|
|
|
s << "superenv executed: #{tool} #{args.join(" ")}\n\n"
|
|
|
|
File.open("#{ENV["HOMEBREW_CC_LOG_PATH"]}.cc", "a+") { |f| f.write(s) }
|
|
|
|
end
|
|
|
|
|
2013-03-03 22:11:26 -06:00
|
|
|
if __FILE__ == $PROGRAM_NAME
|
|
|
|
##################################################################### sanity
|
2015-08-03 13:09:07 +01:00
|
|
|
abort "The build-tool has reset ENV. --env=std required." unless ENV["HOMEBREW_BREW_FILE"]
|
superenv: build-environments that just work
1. A minimal build environment, we don't set CFLAGS, CPPFLAGS, LDFLAGS, etc. the rationale being, the less that is set, the less variables we are introducing that can break builds.
2. A set of scripts that replace cc, ld, etc. and inject the -I, -L, etc. flags we need into the args passed to the build-tools.
Because we now have complete control over compiler instantiations we do a variety of clean-up tasks, like removing bad flags, enforcing universal builds and ensuring makefiles don't try to change the order of library and include paths from ones that work to ones that don't.
The previous ENV-system is still available when --env=std is specified.
superenv applies to Xcode >= 4.3 only currently.
2012-08-11 12:30:51 -04:00
|
|
|
|
2014-04-20 22:39:47 -05:00
|
|
|
if (cc = ENV["HOMEBREW_CC"]).nil? || cc.empty? || cc == "cc"
|
2013-03-03 22:11:26 -06:00
|
|
|
# those values are not allowed
|
2015-08-03 13:09:07 +01:00
|
|
|
ENV["HOMEBREW_CC"] = "clang"
|
2013-03-03 22:11:26 -06:00
|
|
|
end
|
2012-09-03 11:56:29 -04:00
|
|
|
|
2013-03-03 22:11:26 -06:00
|
|
|
####################################################################### main
|
2013-11-17 11:53:55 -06:00
|
|
|
|
2015-02-12 19:13:03 -05:00
|
|
|
dirname, basename = File.split($0)
|
2013-11-17 11:53:55 -06:00
|
|
|
|
2015-02-12 19:13:03 -05:00
|
|
|
cmd = Cmd.new(basename, ARGV)
|
2015-08-03 13:09:07 +01:00
|
|
|
tool = cmd.tool
|
|
|
|
args = cmd.args
|
2013-11-17 11:53:55 -06:00
|
|
|
|
2015-02-10 20:27:26 -05:00
|
|
|
log(basename, ARGV, tool, args)
|
2013-11-17 11:53:55 -06:00
|
|
|
|
2014-08-17 17:34:51 -05:00
|
|
|
args << { :close_others => false } if RUBY_VERSION >= "2.0"
|
2015-02-12 19:13:03 -05:00
|
|
|
exec "#{dirname}/xcrun", tool, *args
|
2013-03-03 22:11:26 -06:00
|
|
|
end
|