aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Library/Homebrew/cmd/test.rb2
-rw-r--r--Library/Homebrew/compat.rb1
-rw-r--r--Library/Homebrew/compat/env.rb13
-rw-r--r--Library/Homebrew/extend/ENV.rb387
-rw-r--r--Library/Homebrew/extend/ENV/shared.rb118
-rw-r--r--Library/Homebrew/extend/ENV/std.rb387
-rw-r--r--Library/Homebrew/test/testing_env.rb2
7 files changed, 509 insertions, 401 deletions
diff --git a/Library/Homebrew/cmd/test.rb b/Library/Homebrew/cmd/test.rb
index ecc087436..cd5c095bc 100644
--- a/Library/Homebrew/cmd/test.rb
+++ b/Library/Homebrew/cmd/test.rb
@@ -10,7 +10,7 @@ module Homebrew extend self
def test
raise FormulaUnspecifiedError if ARGV.named.empty?
- ENV.extend(HomebrewEnvExtension)
+ ENV.extend(Stdenv)
ENV.setup_build_environment
ARGV.formulae.each do |f|
diff --git a/Library/Homebrew/compat.rb b/Library/Homebrew/compat.rb
index 697355f15..a5c28e46b 100644
--- a/Library/Homebrew/compat.rb
+++ b/Library/Homebrew/compat.rb
@@ -1,4 +1,3 @@
-require 'compat/env'
require 'compat/fails_with_llvm'
require 'compat/formula'
require 'compat/hardware'
diff --git a/Library/Homebrew/compat/env.rb b/Library/Homebrew/compat/env.rb
deleted file mode 100644
index 73f9b0009..000000000
--- a/Library/Homebrew/compat/env.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-module HomebrewEnvExtension
- def use_clang?
- compiler == :clang
- end
-
- def use_gcc?
- compiler == :gcc
- end
-
- def use_llvm?
- compiler == :llvm
- end
-end
diff --git a/Library/Homebrew/extend/ENV.rb b/Library/Homebrew/extend/ENV.rb
index f311d14ee..52404a1c8 100644
--- a/Library/Homebrew/extend/ENV.rb
+++ b/Library/Homebrew/extend/ENV.rb
@@ -1,5 +1,6 @@
require 'hardware'
require 'extend/ENV/shared'
+require 'extend/ENV/std'
require 'extend/ENV/super'
def superenv?
@@ -14,393 +15,9 @@ module EnvActivation
if superenv?
extend(Superenv)
else
- extend(HomebrewEnvExtension)
+ extend(Stdenv)
end
end
end
ENV.extend(EnvActivation)
-
-module HomebrewEnvExtension
- include SharedEnvExtension
-
- SAFE_CFLAGS_FLAGS = "-w -pipe"
- DEFAULT_FLAGS = '-march=core2 -msse4'
-
- def self.extended(base)
- unless ORIGINAL_PATHS.include? HOMEBREW_PREFIX/'bin'
- base.prepend_path 'PATH', "#{HOMEBREW_PREFIX}/bin"
- end
- end
-
- def setup_build_environment
- # Clear CDPATH to avoid make issues that depend on changing directories
- delete('CDPATH')
- delete('GREP_OPTIONS') # can break CMake (lol)
- delete('CLICOLOR_FORCE') # autotools doesn't like this
- %w{CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH}.each { |k| delete(k) }
- remove_cc_etc
-
- if MacOS.version >= :mountain_lion
- # Mountain Lion's sed is stricter, and errors out when
- # it encounters files with mixed character sets
- delete('LC_ALL')
- self['LC_CTYPE']="C"
- end
-
- # Set the default pkg-config search path, overriding the built-in paths
- # Anything in PKG_CONFIG_PATH is searched before paths in this variable
- self['PKG_CONFIG_LIBDIR'] = determine_pkg_config_libdir
-
- # make any aclocal stuff installed in Homebrew available
- self['ACLOCAL_PATH'] = "#{HOMEBREW_PREFIX}/share/aclocal" if MacOS::Xcode.provides_autotools?
-
- self['MAKEFLAGS'] = "-j#{self.make_jobs}"
-
- unless HOMEBREW_PREFIX.to_s == '/usr/local'
- # /usr/local is already an -isystem and -L directory so we skip it
- self['CPPFLAGS'] = "-isystem #{HOMEBREW_PREFIX}/include"
- self['LDFLAGS'] = "-L#{HOMEBREW_PREFIX}/lib"
- # CMake ignores the variables above
- self['CMAKE_PREFIX_PATH'] = "#{HOMEBREW_PREFIX}"
- end
-
- if (HOMEBREW_PREFIX/'Frameworks').exist?
- append 'CPPFLAGS', "-F#{HOMEBREW_PREFIX}/Frameworks"
- append 'LDFLAGS', "-F#{HOMEBREW_PREFIX}/Frameworks"
- self['CMAKE_FRAMEWORK_PATH'] = HOMEBREW_PREFIX/"Frameworks"
- end
-
- # Os is the default Apple uses for all its stuff so let's trust them
- set_cflags "-Os #{SAFE_CFLAGS_FLAGS}"
-
- # set us up for the user's compiler choice
- self.send self.compiler
-
- # we must have a working compiler!
- unless self['CC']
- @compiler = MacOS.default_compiler
- self.send @compiler
- self['CC'] = self['OBJC'] = MacOS.locate("cc")
- self['CXX'] = self['OBJCXX'] = MacOS.locate("c++")
- end
-
- # Add lib and include etc. from the current macosxsdk to compiler flags:
- macosxsdk MacOS.version
-
- # For Xcode 4.3 (*without* the "Command Line Tools for Xcode") compiler and tools inside of Xcode:
- if not MacOS::CLT.installed? and MacOS::Xcode.installed? and MacOS::Xcode.version >= "4.3"
- # Some tools (clang, etc.) are in the xctoolchain dir of Xcode
- append 'PATH', "#{MacOS.xctoolchain_path}/usr/bin", ":" if MacOS.xctoolchain_path
- # Others are now at /Applications/Xcode.app/Contents/Developer/usr/bin
- append 'PATH', "#{MacOS.dev_tools_path}", ":"
- end
- end
-
- def determine_pkg_config_libdir
- paths = []
- paths << HOMEBREW_PREFIX/'lib/pkgconfig'
- paths << HOMEBREW_PREFIX/'share/pkgconfig'
- paths << HOMEBREW_REPOSITORY/"Library/ENV/pkgconfig/#{MacOS.version}"
- paths << '/usr/lib/pkgconfig'
- paths.select { |d| File.directory? d }.join(':')
- end
-
- def deparallelize
- remove 'MAKEFLAGS', /-j\d+/
- end
- alias_method :j1, :deparallelize
-
- # recommended by Apple, but, eg. wget won't compile with this flag, so…
- def fast
- remove_from_cflags(/-O./)
- append_to_cflags '-fast'
- end
- def O4
- # LLVM link-time optimization
- remove_from_cflags(/-O./)
- append_to_cflags '-O4'
- end
- def O3
- # Sometimes O4 just takes fucking forever
- remove_from_cflags(/-O./)
- append_to_cflags '-O3'
- end
- def O2
- # Sometimes O3 doesn't work or produces bad binaries
- remove_from_cflags(/-O./)
- append_to_cflags '-O2'
- end
- def Os
- # Sometimes you just want a small one
- remove_from_cflags(/-O./)
- append_to_cflags '-Os'
- end
- def Og
- # Sometimes you want a debug build
- remove_from_cflags(/-O./)
- append_to_cflags '-g -O0'
- end
- def O1
- # Sometimes even O2 doesn't work :(
- remove_from_cflags(/-O./)
- append_to_cflags '-O1'
- end
-
- def gcc_4_0_1
- # we don't use locate because gcc 4.0 has not been provided since Xcode 4
- self['CC'] = self['OBJC'] = "#{MacOS.dev_tools_path}/gcc-4.0"
- self['CXX'] = self['OBJCXX'] = "#{MacOS.dev_tools_path}/g++-4.0"
- replace_in_cflags '-O4', '-O3'
- set_cpu_cflags '-march=nocona -mssse3'
- @compiler = :gcc
- end
- alias_method :gcc_4_0, :gcc_4_0_1
-
- # if your formula doesn't like CC having spaces use this
- def expand_xcrun
- self['CC'] =~ %r{/usr/bin/xcrun (.*)}
- self['CC'] = `/usr/bin/xcrun -find #{$1}`.chomp if $1
- self['CXX'] =~ %r{/usr/bin/xcrun (.*)}
- self['CXX'] = `/usr/bin/xcrun -find #{$1}`.chomp if $1
- self['OBJC'] = self['CC']
- self['OBJCXX'] = self['CXX']
- end
-
- def gcc
- # Apple stopped shipping gcc-4.2 with Xcode 4.2
- # However they still provide a gcc symlink to llvm
- # But we don't want LLVM of course.
-
- self['CC'] = self['OBJC'] = MacOS.locate("gcc-4.2")
- self['CXX'] = self['OBJCXX'] = MacOS.locate("g++-4.2")
-
- unless self['CC']
- self['CC'] = self['OBJC'] = "#{HOMEBREW_PREFIX}/bin/gcc-4.2"
- self['CXX'] = self['OBJCXX'] = "#{HOMEBREW_PREFIX}/bin/g++-4.2"
- raise "GCC could not be found" unless File.exist? self['CC']
- end
-
- if not self['CC'] =~ %r{^/usr/bin/xcrun }
- raise "GCC could not be found" if Pathname.new(self['CC']).realpath.to_s =~ /llvm/
- end
-
- replace_in_cflags '-O4', '-O3'
- set_cpu_cflags
- @compiler = :gcc
- end
- alias_method :gcc_4_2, :gcc
-
- def llvm
- self['CC'] = self['OBJC'] = MacOS.locate("llvm-gcc")
- self['CXX'] = self['OBJCXX'] = MacOS.locate("llvm-g++")
- set_cpu_cflags
- @compiler = :llvm
- end
-
- def clang
- self['CC'] = self['OBJC'] = MacOS.locate("clang")
- self['CXX'] = self['OBJCXX'] = MacOS.locate("clang++")
- replace_in_cflags(/-Xarch_#{Hardware::CPU.arch_32_bit} (-march=\S*)/, '\1')
- # Clang mistakenly enables AES-NI on plain Nehalem
- set_cpu_cflags '-march=native', :nehalem => '-march=native -Xclang -target-feature -Xclang -aes'
- append_to_cflags '-Qunused-arguments'
- @compiler = :clang
- end
-
- def remove_macosxsdk version=MacOS.version
- # Clear all lib and include dirs from CFLAGS, CPPFLAGS, LDFLAGS that were
- # previously added by macosxsdk
- version = version.to_s
- remove_from_cflags(/ ?-mmacosx-version-min=10\.\d/)
- delete('MACOSX_DEPLOYMENT_TARGET')
- delete('CPATH')
- remove 'LDFLAGS', "-L#{HOMEBREW_PREFIX}/lib"
-
- if (sdk = MacOS.sdk_path(version)) && !MacOS::CLT.installed?
- delete('SDKROOT')
- remove_from_cflags "-isysroot #{sdk}"
- remove 'CPPFLAGS', "-isysroot #{sdk}"
- remove 'LDFLAGS', "-isysroot #{sdk}"
- if HOMEBREW_PREFIX.to_s == '/usr/local'
- delete('CMAKE_PREFIX_PATH')
- else
- # It was set in setup_build_environment, so we have to restore it here.
- self['CMAKE_PREFIX_PATH'] = "#{HOMEBREW_PREFIX}"
- end
- remove 'CMAKE_FRAMEWORK_PATH', "#{sdk}/System/Library/Frameworks"
- end
- end
-
- def macosxsdk version=MacOS.version
- return unless MACOS
- # Sets all needed lib and include dirs to CFLAGS, CPPFLAGS, LDFLAGS.
- remove_macosxsdk
- version = version.to_s
- append_to_cflags("-mmacosx-version-min=#{version}")
- self['MACOSX_DEPLOYMENT_TARGET'] = version
- self['CPATH'] = "#{HOMEBREW_PREFIX}/include"
- prepend 'LDFLAGS', "-L#{HOMEBREW_PREFIX}/lib"
-
- if (sdk = MacOS.sdk_path(version)) && !MacOS::CLT.installed?
- # Extra setup to support Xcode 4.3+ without CLT.
- self['SDKROOT'] = sdk
- # Tell clang/gcc where system include's are:
- append 'CPATH', "#{sdk}/usr/include", ":"
- # The -isysroot is needed, too, because of the Frameworks
- append_to_cflags "-isysroot #{sdk}"
- append 'CPPFLAGS', "-isysroot #{sdk}"
- # And the linker needs to find sdk/usr/lib
- append 'LDFLAGS', "-isysroot #{sdk}"
- # Needed to build cmake itself and perhaps some cmake projects:
- append 'CMAKE_PREFIX_PATH', "#{sdk}/usr", ':'
- append 'CMAKE_FRAMEWORK_PATH', "#{sdk}/System/Library/Frameworks", ':'
- end
- end
-
- def minimal_optimization
- self['CFLAGS'] = self['CXXFLAGS'] = "-Os #{SAFE_CFLAGS_FLAGS}"
- macosxsdk unless MacOS::CLT.installed?
- end
- def no_optimization
- self['CFLAGS'] = self['CXXFLAGS'] = SAFE_CFLAGS_FLAGS
- macosxsdk unless MacOS::CLT.installed?
- end
-
- # Some configure scripts won't find libxml2 without help
- def libxml2
- if MacOS::CLT.installed?
- append 'CPPFLAGS', '-I/usr/include/libxml2'
- else
- # Use the includes form the sdk
- append 'CPPFLAGS', "-I#{MacOS.sdk_path}/usr/include/libxml2"
- end
- end
-
- def x11
- # There are some config scripts here that should go in the PATH
- append 'PATH', MacOS::X11.bin, ':'
-
- # Append these to PKG_CONFIG_LIBDIR so they are searched
- # *after* our own pkgconfig directories, as we dupe some of the
- # libs in XQuartz.
- append 'PKG_CONFIG_LIBDIR', MacOS::X11.lib/'pkgconfig', ':'
- append 'PKG_CONFIG_LIBDIR', MacOS::X11.share/'pkgconfig', ':'
-
- append 'LDFLAGS', "-L#{MacOS::X11.lib}"
- append 'CMAKE_PREFIX_PATH', MacOS::X11.prefix, ':'
- append 'CMAKE_INCLUDE_PATH', MacOS::X11.include, ':'
-
- append 'CPPFLAGS', "-I#{MacOS::X11.include}"
-
- append 'ACLOCAL_PATH', MacOS::X11.share/'aclocal', ':'
-
- unless MacOS::CLT.installed?
- append 'CMAKE_PREFIX_PATH', MacOS.sdk_path/'usr/X11', ':'
- append 'CPPFLAGS', "-I#{MacOS::X11.include}/freetype2"
- append 'CFLAGS', "-I#{MacOS::X11.include}"
- end
- end
- alias_method :libpng, :x11
-
- # we've seen some packages fail to build when warnings are disabled!
- def enable_warnings
- remove_from_cflags '-w'
- remove_from_cflags '-Qunused-arguments'
- end
-
- def m64
- append_to_cflags '-m64'
- append 'LDFLAGS', "-arch #{Hardware::CPU.arch_64_bit}"
- end
- def m32
- append_to_cflags '-m32'
- append 'LDFLAGS', "-arch #{Hardware::CPU.arch_32_bit}"
- end
-
- def universal_binary
- append_to_cflags Hardware::CPU.universal_archs.as_arch_flags
- replace_in_cflags '-O4', '-O3' # O4 seems to cause the build to fail
- append 'LDFLAGS', Hardware::CPU.universal_archs.as_arch_flags
-
- if compiler != :clang && Hardware.is_32_bit?
- # Can't mix "-march" for a 32-bit CPU with "-arch x86_64"
- replace_in_cflags(/-march=\S*/, "-Xarch_#{Hardware::CPU.arch_32_bit} \\0")
- end
- end
-
- def replace_in_cflags before, after
- CC_FLAG_VARS.each do |key|
- self[key] = self[key].sub(before, after) if has_key?(key)
- end
- end
-
- # Convenience method to set all C compiler flags in one shot.
- def set_cflags val
- CC_FLAG_VARS.each { |key| self[key] = val }
- end
-
- # Sets architecture-specific flags for every environment variable
- # given in the list `flags`.
- def set_cpu_flags flags, default=DEFAULT_FLAGS, map=Hardware::CPU.optimization_flags
- cflags =~ %r{(-Xarch_#{Hardware::CPU.arch_32_bit} )-march=}
- xarch = $1.to_s
- remove flags, %r{(-Xarch_#{Hardware::CPU.arch_32_bit} )?-march=\S*}
- remove flags, %r{( -Xclang \S+)+}
- remove flags, %r{-mssse3}
- remove flags, %r{-msse4(\.\d)?}
- append flags, xarch unless xarch.empty?
-
- if ARGV.build_bottle?
- append flags, Hardware::CPU.optimization_flags[Hardware.oldest_cpu]
- else
- # Don't set -msse3 and older flags because -march does that for us
- append flags, map.fetch(Hardware::CPU.family, default)
- end
-
- # not really a 'CPU' cflag, but is only used with clang
- remove flags, '-Qunused-arguments'
- end
-
- def set_cpu_cflags default=DEFAULT_FLAGS, map=Hardware::CPU.optimization_flags
- set_cpu_flags CC_FLAG_VARS, default, map
- end
-
- # actually c-compiler, so cc would be a better name
- def compiler
- # test for --flags first so that installs can be overridden on a per
- # install basis. Then test for ENVs in inverse order to flags, this is
- # sensible, trust me
- @compiler ||= if ARGV.include? '--use-gcc'
- :gcc
- elsif ARGV.include? '--use-llvm'
- :llvm
- elsif ARGV.include? '--use-clang'
- :clang
- elsif self['HOMEBREW_USE_CLANG']
- :clang
- elsif self['HOMEBREW_USE_LLVM']
- :llvm
- elsif self['HOMEBREW_USE_GCC']
- :gcc
- else
- MacOS.default_compiler
- end
- end
-
- def make_jobs
- # '-j' requires a positive integral argument
- if self['HOMEBREW_MAKE_JOBS'].to_i > 0
- self['HOMEBREW_MAKE_JOBS'].to_i
- else
- Hardware::CPU.cores
- end
- end
-
- # ld64 is a newer linker provided for Xcode 2.5
- def ld64
- ld64 = Formula.factory('ld64')
- self['LD'] = ld64.bin/'ld'
- append "LDFLAGS", "-B#{ld64.bin.to_s+"/"}"
- end
-end
diff --git a/Library/Homebrew/extend/ENV/shared.rb b/Library/Homebrew/extend/ENV/shared.rb
new file mode 100644
index 000000000..b8d17b2c3
--- /dev/null
+++ b/Library/Homebrew/extend/ENV/shared.rb
@@ -0,0 +1,118 @@
+module SharedEnvExtension
+ CC_FLAG_VARS = %w{CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS}
+ FC_FLAG_VARS = %w{FCFLAGS FFLAGS}
+
+ def remove_cc_etc
+ keys = %w{CC CXX OBJC OBJCXX LD CPP CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS}
+ removed = Hash[*keys.map{ |key| [key, self[key]] }.flatten]
+ keys.each do |key|
+ delete(key)
+ end
+ removed
+ end
+ def append_to_cflags newflags
+ append(CC_FLAG_VARS, newflags)
+ end
+ def remove_from_cflags val
+ remove CC_FLAG_VARS, val
+ end
+ def append keys, value, separator = ' '
+ value = value.to_s
+ Array(keys).each do |key|
+ unless self[key].to_s.empty?
+ self[key] = self[key] + separator + value.to_s
+ else
+ self[key] = value.to_s
+ end
+ end
+ end
+ def prepend keys, value, separator = ' '
+ Array(keys).each do |key|
+ unless self[key].to_s.empty?
+ self[key] = value.to_s + separator + self[key]
+ else
+ self[key] = value.to_s
+ end
+ end
+ end
+ def prepend_path key, path
+ prepend key, path, ':' if File.directory? path
+ end
+ def remove keys, value
+ Array(keys).each do |key|
+ next unless self[key]
+ self[key] = self[key].sub(value, '')
+ delete(key) if self[key].to_s.empty?
+ end if value
+ end
+
+ def cc; self['CC'] or "cc"; end
+ def cxx; self['CXX'] or "c++"; end
+ def cflags; self['CFLAGS']; end
+ def cxxflags; self['CXXFLAGS']; end
+ def cppflags; self['CPPFLAGS']; end
+ def ldflags; self['LDFLAGS']; end
+ def fc; self['FC']; end
+ def fflags; self['FFLAGS']; end
+ def fcflags; self['FCFLAGS']; end
+
+ # Snow Leopard defines an NCURSES value the opposite of most distros
+ # See: http://bugs.python.org/issue6848
+ # Currently only used by aalib in core
+ def ncurses_define
+ append 'CPPFLAGS', "-DNCURSES_OPAQUE=0"
+ end
+
+ def userpaths!
+ paths = ORIGINAL_PATHS.map { |p| p.realpath.to_s rescue nil } - %w{/usr/X11/bin /opt/X11/bin}
+ self['PATH'] = paths.unshift(*self['PATH'].split(":")).uniq.join(":")
+ # XXX hot fix to prefer brewed stuff (e.g. python) over /usr/bin.
+ prepend 'PATH', HOMEBREW_PREFIX/'bin', ':'
+ end
+
+ def with_build_environment
+ old_env = to_hash
+ setup_build_environment
+ yield
+ ensure
+ replace(old_env)
+ end
+
+ def fortran
+ # superenv removes these PATHs, but this option needs them
+ # TODO fix better, probably by making a super-fc
+ self['PATH'] += ":#{HOMEBREW_PREFIX}/bin:/usr/local/bin"
+
+ if self['FC']
+ ohai "Building with an alternative Fortran compiler"
+ puts "This is unsupported."
+ self['F77'] ||= self['FC']
+
+ if ARGV.include? '--default-fortran-flags'
+ flags_to_set = []
+ flags_to_set << 'FCFLAGS' unless self['FCFLAGS']
+ flags_to_set << 'FFLAGS' unless self['FFLAGS']
+ flags_to_set.each {|key| self[key] = cflags}
+ set_cpu_flags(flags_to_set)
+ elsif not self['FCFLAGS'] or self['FFLAGS']
+ opoo <<-EOS.undent
+ No Fortran optimization information was provided. You may want to consider
+ setting FCFLAGS and FFLAGS or pass the `--default-fortran-flags` option to
+ `brew install` if your compiler is compatible with GCC.
+
+ If you like the default optimization level of your compiler, ignore this
+ warning.
+ EOS
+ end
+
+ elsif which 'gfortran'
+ ohai "Using Homebrew-provided fortran compiler."
+ puts "This may be changed by setting the FC environment variable."
+ self['FC'] = which 'gfortran'
+ self['F77'] = self['FC']
+
+ FC_FLAG_VARS.each {|key| self[key] = cflags}
+ set_cpu_flags(FC_FLAG_VARS)
+ end
+ end
+end
diff --git a/Library/Homebrew/extend/ENV/std.rb b/Library/Homebrew/extend/ENV/std.rb
new file mode 100644
index 000000000..0bc9cbf97
--- /dev/null
+++ b/Library/Homebrew/extend/ENV/std.rb
@@ -0,0 +1,387 @@
+require 'hardware'
+require 'macos'
+require 'extend/ENV/shared'
+
+module Stdenv
+ include SharedEnvExtension
+
+ SAFE_CFLAGS_FLAGS = "-w -pipe"
+ DEFAULT_FLAGS = '-march=core2 -msse4'
+
+ def self.extended(base)
+ unless ORIGINAL_PATHS.include? HOMEBREW_PREFIX/'bin'
+ base.prepend_path 'PATH', "#{HOMEBREW_PREFIX}/bin"
+ end
+ end
+
+ def setup_build_environment
+ # Clear CDPATH to avoid make issues that depend on changing directories
+ delete('CDPATH')
+ delete('GREP_OPTIONS') # can break CMake (lol)
+ delete('CLICOLOR_FORCE') # autotools doesn't like this
+ %w{CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH}.each { |k| delete(k) }
+ remove_cc_etc
+
+ if MacOS.version >= :mountain_lion
+ # Mountain Lion's sed is stricter, and errors out when
+ # it encounters files with mixed character sets
+ delete('LC_ALL')
+ self['LC_CTYPE']="C"
+ end
+
+ # Set the default pkg-config search path, overriding the built-in paths
+ # Anything in PKG_CONFIG_PATH is searched before paths in this variable
+ self['PKG_CONFIG_LIBDIR'] = determine_pkg_config_libdir
+
+ # make any aclocal stuff installed in Homebrew available
+ self['ACLOCAL_PATH'] = "#{HOMEBREW_PREFIX}/share/aclocal" if MacOS::Xcode.provides_autotools?
+
+ self['MAKEFLAGS'] = "-j#{self.make_jobs}"
+
+ unless HOMEBREW_PREFIX.to_s == '/usr/local'
+ # /usr/local is already an -isystem and -L directory so we skip it
+ self['CPPFLAGS'] = "-isystem #{HOMEBREW_PREFIX}/include"
+ self['LDFLAGS'] = "-L#{HOMEBREW_PREFIX}/lib"
+ # CMake ignores the variables above
+ self['CMAKE_PREFIX_PATH'] = "#{HOMEBREW_PREFIX}"
+ end
+
+ if (HOMEBREW_PREFIX/'Frameworks').exist?
+ append 'CPPFLAGS', "-F#{HOMEBREW_PREFIX}/Frameworks"
+ append 'LDFLAGS', "-F#{HOMEBREW_PREFIX}/Frameworks"
+ self['CMAKE_FRAMEWORK_PATH'] = HOMEBREW_PREFIX/"Frameworks"
+ end
+
+ # Os is the default Apple uses for all its stuff so let's trust them
+ set_cflags "-Os #{SAFE_CFLAGS_FLAGS}"
+
+ # set us up for the user's compiler choice
+ self.send self.compiler
+
+ # we must have a working compiler!
+ unless self['CC']
+ @compiler = MacOS.default_compiler
+ self.send @compiler
+ self['CC'] = self['OBJC'] = MacOS.locate("cc")
+ self['CXX'] = self['OBJCXX'] = MacOS.locate("c++")
+ end
+
+ # Add lib and include etc. from the current macosxsdk to compiler flags:
+ macosxsdk MacOS.version
+
+ # For Xcode 4.3 (*without* the "Command Line Tools for Xcode") compiler and tools inside of Xcode:
+ if not MacOS::CLT.installed? and MacOS::Xcode.installed? and MacOS::Xcode.version >= "4.3"
+ # Some tools (clang, etc.) are in the xctoolchain dir of Xcode
+ append 'PATH', "#{MacOS.xctoolchain_path}/usr/bin", ":" if MacOS.xctoolchain_path
+ # Others are now at /Applications/Xcode.app/Contents/Developer/usr/bin
+ append 'PATH', "#{MacOS.dev_tools_path}", ":"
+ end
+ end
+
+ def determine_pkg_config_libdir
+ paths = []
+ paths << HOMEBREW_PREFIX/'lib/pkgconfig'
+ paths << HOMEBREW_PREFIX/'share/pkgconfig'
+ paths << HOMEBREW_REPOSITORY/"Library/ENV/pkgconfig/#{MacOS.version}"
+ paths << '/usr/lib/pkgconfig'
+ paths.select { |d| File.directory? d }.join(':')
+ end
+
+ def deparallelize
+ remove 'MAKEFLAGS', /-j\d+/
+ end
+ alias_method :j1, :deparallelize
+
+ # recommended by Apple, but, eg. wget won't compile with this flag, so…
+ def fast
+ remove_from_cflags(/-O./)
+ append_to_cflags '-fast'
+ end
+ def O4
+ # LLVM link-time optimization
+ remove_from_cflags(/-O./)
+ append_to_cflags '-O4'
+ end
+ def O3
+ # Sometimes O4 just takes fucking forever
+ remove_from_cflags(/-O./)
+ append_to_cflags '-O3'
+ end
+ def O2
+ # Sometimes O3 doesn't work or produces bad binaries
+ remove_from_cflags(/-O./)
+ append_to_cflags '-O2'
+ end
+ def Os
+ # Sometimes you just want a small one
+ remove_from_cflags(/-O./)
+ append_to_cflags '-Os'
+ end
+ def Og
+ # Sometimes you want a debug build
+ remove_from_cflags(/-O./)
+ append_to_cflags '-g -O0'
+ end
+ def O1
+ # Sometimes even O2 doesn't work :(
+ remove_from_cflags(/-O./)
+ append_to_cflags '-O1'
+ end
+
+ def gcc_4_0_1
+ # we don't use locate because gcc 4.0 has not been provided since Xcode 4
+ self['CC'] = self['OBJC'] = "#{MacOS.dev_tools_path}/gcc-4.0"
+ self['CXX'] = self['OBJCXX'] = "#{MacOS.dev_tools_path}/g++-4.0"
+ replace_in_cflags '-O4', '-O3'
+ set_cpu_cflags '-march=nocona -mssse3'
+ @compiler = :gcc
+ end
+ alias_method :gcc_4_0, :gcc_4_0_1
+
+ # if your formula doesn't like CC having spaces use this
+ def expand_xcrun
+ self['CC'] =~ %r{/usr/bin/xcrun (.*)}
+ self['CC'] = `/usr/bin/xcrun -find #{$1}`.chomp if $1
+ self['CXX'] =~ %r{/usr/bin/xcrun (.*)}
+ self['CXX'] = `/usr/bin/xcrun -find #{$1}`.chomp if $1
+ self['OBJC'] = self['CC']
+ self['OBJCXX'] = self['CXX']
+ end
+
+ def gcc
+ # Apple stopped shipping gcc-4.2 with Xcode 4.2
+ # However they still provide a gcc symlink to llvm
+ # But we don't want LLVM of course.
+
+ self['CC'] = self['OBJC'] = MacOS.locate("gcc-4.2")
+ self['CXX'] = self['OBJCXX'] = MacOS.locate("g++-4.2")
+
+ unless self['CC']
+ self['CC'] = self['OBJC'] = "#{HOMEBREW_PREFIX}/bin/gcc-4.2"
+ self['CXX'] = self['OBJCXX'] = "#{HOMEBREW_PREFIX}/bin/g++-4.2"
+ raise "GCC could not be found" unless File.exist? self['CC']
+ end
+
+ if not self['CC'] =~ %r{^/usr/bin/xcrun }
+ raise "GCC could not be found" if Pathname.new(self['CC']).realpath.to_s =~ /llvm/
+ end
+
+ replace_in_cflags '-O4', '-O3'
+ set_cpu_cflags
+ @compiler = :gcc
+ end
+ alias_method :gcc_4_2, :gcc
+
+ def llvm
+ self['CC'] = self['OBJC'] = MacOS.locate("llvm-gcc")
+ self['CXX'] = self['OBJCXX'] = MacOS.locate("llvm-g++")
+ set_cpu_cflags
+ @compiler = :llvm
+ end
+
+ def clang
+ self['CC'] = self['OBJC'] = MacOS.locate("clang")
+ self['CXX'] = self['OBJCXX'] = MacOS.locate("clang++")
+ replace_in_cflags(/-Xarch_#{Hardware::CPU.arch_32_bit} (-march=\S*)/, '\1')
+ # Clang mistakenly enables AES-NI on plain Nehalem
+ set_cpu_cflags '-march=native', :nehalem => '-march=native -Xclang -target-feature -Xclang -aes'
+ append_to_cflags '-Qunused-arguments'
+ @compiler = :clang
+ end
+
+ def remove_macosxsdk version=MacOS.version
+ # Clear all lib and include dirs from CFLAGS, CPPFLAGS, LDFLAGS that were
+ # previously added by macosxsdk
+ version = version.to_s
+ remove_from_cflags(/ ?-mmacosx-version-min=10\.\d/)
+ delete('MACOSX_DEPLOYMENT_TARGET')
+ delete('CPATH')
+ remove 'LDFLAGS', "-L#{HOMEBREW_PREFIX}/lib"
+
+ if (sdk = MacOS.sdk_path(version)) && !MacOS::CLT.installed?
+ delete('SDKROOT')
+ remove_from_cflags "-isysroot #{sdk}"
+ remove 'CPPFLAGS', "-isysroot #{sdk}"
+ remove 'LDFLAGS', "-isysroot #{sdk}"
+ if HOMEBREW_PREFIX.to_s == '/usr/local'
+ delete('CMAKE_PREFIX_PATH')
+ else
+ # It was set in setup_build_environment, so we have to restore it here.
+ self['CMAKE_PREFIX_PATH'] = "#{HOMEBREW_PREFIX}"
+ end
+ remove 'CMAKE_FRAMEWORK_PATH', "#{sdk}/System/Library/Frameworks"
+ end
+ end
+
+ def macosxsdk version=MacOS.version
+ return unless MACOS
+ # Sets all needed lib and include dirs to CFLAGS, CPPFLAGS, LDFLAGS.
+ remove_macosxsdk
+ version = version.to_s
+ append_to_cflags("-mmacosx-version-min=#{version}")
+ self['MACOSX_DEPLOYMENT_TARGET'] = version
+ self['CPATH'] = "#{HOMEBREW_PREFIX}/include"
+ prepend 'LDFLAGS', "-L#{HOMEBREW_PREFIX}/lib"
+
+ if (sdk = MacOS.sdk_path(version)) && !MacOS::CLT.installed?
+ # Extra setup to support Xcode 4.3+ without CLT.
+ self['SDKROOT'] = sdk
+ # Tell clang/gcc where system include's are:
+ append 'CPATH', "#{sdk}/usr/include", ":"
+ # The -isysroot is needed, too, because of the Frameworks
+ append_to_cflags "-isysroot #{sdk}"
+ append 'CPPFLAGS', "-isysroot #{sdk}"
+ # And the linker needs to find sdk/usr/lib
+ append 'LDFLAGS', "-isysroot #{sdk}"
+ # Needed to build cmake itself and perhaps some cmake projects:
+ append 'CMAKE_PREFIX_PATH', "#{sdk}/usr", ':'
+ append 'CMAKE_FRAMEWORK_PATH', "#{sdk}/System/Library/Frameworks", ':'
+ end
+ end
+
+ def minimal_optimization
+ self['CFLAGS'] = self['CXXFLAGS'] = "-Os #{SAFE_CFLAGS_FLAGS}"
+ macosxsdk unless MacOS::CLT.installed?
+ end
+ def no_optimization
+ self['CFLAGS'] = self['CXXFLAGS'] = SAFE_CFLAGS_FLAGS
+ macosxsdk unless MacOS::CLT.installed?
+ end
+
+ # Some configure scripts won't find libxml2 without help
+ def libxml2
+ if MacOS::CLT.installed?
+ append 'CPPFLAGS', '-I/usr/include/libxml2'
+ else
+ # Use the includes form the sdk
+ append 'CPPFLAGS', "-I#{MacOS.sdk_path}/usr/include/libxml2"
+ end
+ end
+
+ def x11
+ # There are some config scripts here that should go in the PATH
+ append 'PATH', MacOS::X11.bin, ':'
+
+ # Append these to PKG_CONFIG_LIBDIR so they are searched
+ # *after* our own pkgconfig directories, as we dupe some of the
+ # libs in XQuartz.
+ append 'PKG_CONFIG_LIBDIR', MacOS::X11.lib/'pkgconfig', ':'
+ append 'PKG_CONFIG_LIBDIR', MacOS::X11.share/'pkgconfig', ':'
+
+ append 'LDFLAGS', "-L#{MacOS::X11.lib}"
+ append 'CMAKE_PREFIX_PATH', MacOS::X11.prefix, ':'
+ append 'CMAKE_INCLUDE_PATH', MacOS::X11.include, ':'
+
+ append 'CPPFLAGS', "-I#{MacOS::X11.include}"
+
+ append 'ACLOCAL_PATH', MacOS::X11.share/'aclocal', ':'
+
+ unless MacOS::CLT.installed?
+ append 'CMAKE_PREFIX_PATH', MacOS.sdk_path/'usr/X11', ':'
+ append 'CPPFLAGS', "-I#{MacOS::X11.include}/freetype2"
+ append 'CFLAGS', "-I#{MacOS::X11.include}"
+ end
+ end
+ alias_method :libpng, :x11
+
+ # we've seen some packages fail to build when warnings are disabled!
+ def enable_warnings
+ remove_from_cflags '-w'
+ remove_from_cflags '-Qunused-arguments'
+ end
+
+ def m64
+ append_to_cflags '-m64'
+ append 'LDFLAGS', "-arch #{Hardware::CPU.arch_64_bit}"
+ end
+ def m32
+ append_to_cflags '-m32'
+ append 'LDFLAGS', "-arch #{Hardware::CPU.arch_32_bit}"
+ end
+
+ def universal_binary
+ append_to_cflags Hardware::CPU.universal_archs.as_arch_flags
+ replace_in_cflags '-O4', '-O3' # O4 seems to cause the build to fail
+ append 'LDFLAGS', Hardware::CPU.universal_archs.as_arch_flags
+
+ if compiler != :clang && Hardware.is_32_bit?
+ # Can't mix "-march" for a 32-bit CPU with "-arch x86_64"
+ replace_in_cflags(/-march=\S*/, "-Xarch_#{Hardware::CPU.arch_32_bit} \\0")
+ end
+ end
+
+ def replace_in_cflags before, after
+ CC_FLAG_VARS.each do |key|
+ self[key] = self[key].sub(before, after) if has_key?(key)
+ end
+ end
+
+ # Convenience method to set all C compiler flags in one shot.
+ def set_cflags val
+ CC_FLAG_VARS.each { |key| self[key] = val }
+ end
+
+ # Sets architecture-specific flags for every environment variable
+ # given in the list `flags`.
+ def set_cpu_flags flags, default=DEFAULT_FLAGS, map=Hardware::CPU.optimization_flags
+ cflags =~ %r{(-Xarch_#{Hardware::CPU.arch_32_bit} )-march=}
+ xarch = $1.to_s
+ remove flags, %r{(-Xarch_#{Hardware::CPU.arch_32_bit} )?-march=\S*}
+ remove flags, %r{( -Xclang \S+)+}
+ remove flags, %r{-mssse3}
+ remove flags, %r{-msse4(\.\d)?}
+ append flags, xarch unless xarch.empty?
+
+ if ARGV.build_bottle?
+ append flags, Hardware::CPU.optimization_flags[Hardware.oldest_cpu]
+ else
+ # Don't set -msse3 and older flags because -march does that for us
+ append flags, map.fetch(Hardware::CPU.family, default)
+ end
+
+ # not really a 'CPU' cflag, but is only used with clang
+ remove flags, '-Qunused-arguments'
+ end
+
+ def set_cpu_cflags default=DEFAULT_FLAGS, map=Hardware::CPU.optimization_flags
+ set_cpu_flags CC_FLAG_VARS, default, map
+ end
+
+ # actually c-compiler, so cc would be a better name
+ def compiler
+ # test for --flags first so that installs can be overridden on a per
+ # install basis. Then test for ENVs in inverse order to flags, this is
+ # sensible, trust me
+ @compiler ||= if ARGV.include? '--use-gcc'
+ :gcc
+ elsif ARGV.include? '--use-llvm'
+ :llvm
+ elsif ARGV.include? '--use-clang'
+ :clang
+ elsif self['HOMEBREW_USE_CLANG']
+ :clang
+ elsif self['HOMEBREW_USE_LLVM']
+ :llvm
+ elsif self['HOMEBREW_USE_GCC']
+ :gcc
+ else
+ MacOS.default_compiler
+ end
+ end
+
+ def make_jobs
+ # '-j' requires a positive integral argument
+ if self['HOMEBREW_MAKE_JOBS'].to_i > 0
+ self['HOMEBREW_MAKE_JOBS'].to_i
+ else
+ Hardware::CPU.cores
+ end
+ end
+
+ # ld64 is a newer linker provided for Xcode 2.5
+ def ld64
+ ld64 = Formula.factory('ld64')
+ self['LD'] = ld64.bin/'ld'
+ append "LDFLAGS", "-B#{ld64.bin.to_s+"/"}"
+ end
+end
diff --git a/Library/Homebrew/test/testing_env.rb b/Library/Homebrew/test/testing_env.rb
index 9e04f2c33..5c2efed73 100644
--- a/Library/Homebrew/test/testing_env.rb
+++ b/Library/Homebrew/test/testing_env.rb
@@ -72,7 +72,7 @@ require 'test/unit' # must be after at_exit
require 'extend/ARGV' # needs to be after test/unit to avoid conflict with OptionsParser
require 'extend/ENV'
ARGV.extend(HomebrewArgvExtension)
-ENV.extend(HomebrewEnvExtension)
+ENV.extend(Stdenv)
begin
require 'rubygems'