147 lines
4.6 KiB
Ruby
Raw Normal View History

2013-08-19 12:32:59 -05:00
module SharedEnvExtension
CC_FLAG_VARS = %w{CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS}
FC_FLAG_VARS = %w{FCFLAGS FFLAGS}
COMPILERS = ['clang', 'gcc-4.0', 'gcc-4.2', 'llvm-gcc']
COMPLER_ALIASES = {'gcc' => 'gcc-4.2', 'llvm' => 'llvm-gcc'}
COMPILER_SYMBOL_MAP = { 'gcc-4.0' => :gcc_4_0,
'gcc-4.2' => :gcc,
'llvm-gcc' => :llvm,
'clang' => :clang }
2013-08-19 12:32:59 -05:00
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
2013-08-19 12:32:59 -05:00
else
self[key] = value
2013-08-19 12:32:59 -05:00
end
end
end
def prepend keys, value, separator = ' '
value = value.to_s
2013-08-19 12:32:59 -05:00
Array(keys).each do |key|
unless self[key].to_s.empty?
self[key] = value + separator + self[key]
2013-08-19 12:32:59 -05:00
else
self[key] = value
2013-08-19 12:32:59 -05:00
end
end
end
2013-08-19 17:21:13 -05:00
def append_path key, path
append key, path, File::PATH_SEPARATOR if File.directory? path
end
2013-08-19 12:32:59 -05:00
def prepend_path key, path
prepend key, path, File::PATH_SEPARATOR if File.directory? path
2013-08-19 12:32:59 -05:00
end
2013-08-19 17:21:13 -05:00
2013-08-19 12:32:59 -05:00
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']; end
def cxx; self['CXX']; end
2013-08-19 12:32:59 -05:00
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
def compiler
if (cc = ARGV.cc)
raise("Invalid value for --cc: #{cc}") if COMPILERS.grep(cc).empty?
COMPILER_SYMBOL_MAP.fetch(cc, cc)
elsif ARGV.include? '--use-gcc'
gcc_installed = Formula.factory('apple-gcc42').installed? rescue false
# fall back to something else on systems without Apple gcc
if MacOS.locate('gcc-4.2') || gcc_installed
:gcc
else
raise "gcc-4.2 not found!"
end
elsif ARGV.include? '--use-llvm'
:llvm
elsif ARGV.include? '--use-clang'
:clang
elsif self['HOMEBREW_CC']
cc = COMPLER_ALIASES.fetch(self['HOMEBREW_CC'], self['HOMEBREW_CC'])
COMPILER_SYMBOL_MAP.fetch(cc) do |invalid|
opoo "Invalid value for HOMEBREW_CC: #{invalid}"
MacOS.default_compiler
end
else
MacOS.default_compiler
end
end
2013-08-19 12:32:59 -05:00
# 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}
2013-08-19 14:07:14 -05:00
self['PATH'] = paths.unshift(*self['PATH'].split(File::PATH_SEPARATOR)).uniq.join(File::PATH_SEPARATOR)
2013-08-19 12:32:59 -05:00
# XXX hot fix to prefer brewed stuff (e.g. python) over /usr/bin.
2013-08-19 17:21:13 -05:00
prepend_path 'PATH', HOMEBREW_PREFIX/'bin'
2013-08-19 12:32:59 -05:00
end
def fortran
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
2013-08-30 16:27:31 -05:00
elsif (gfortran = which('gfortran', ORIGINAL_PATHS.join(File::PATH_SEPARATOR)))
2013-08-19 12:32:59 -05:00
ohai "Using Homebrew-provided fortran compiler."
puts "This may be changed by setting the FC environment variable."
2013-08-30 16:27:31 -05:00
self['FC'] = self['F77'] = gfortran
2013-08-19 12:32:59 -05:00
FC_FLAG_VARS.each {|key| self[key] = cflags}
set_cpu_flags(FC_FLAG_VARS)
end
end
end