269 lines
7.1 KiB
Ruby
Raw Normal View History

require "formula"
require "compilers"
2013-11-27 17:29:06 -06:00
2013-08-19 12:32:59 -05:00
module SharedEnvExtension
include CompilerConstants
2013-08-19 12:32:59 -05:00
CC_FLAG_VARS = %w{CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS}
FC_FLAG_VARS = %w{FCFLAGS FFLAGS}
SANITIZED_VARS = %w[
CDPATH GREP_OPTIONS CLICOLOR_FORCE
CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH
CC CXX OBJC OBJCXX CPP MAKE LD LDSHARED
CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS
MACOSX_DEPLOYMENT_TARGET SDKROOT DEVELOPER_DIR
CMAKE_PREFIX_PATH CMAKE_INCLUDE_PATH CMAKE_FRAMEWORK_PATH
GOBIN GOPATH GOROOT
LIBRARY_PATH
]
def setup_build_environment(formula=nil)
@formula = formula
reset
end
def reset
SANITIZED_VARS.each { |k| delete(k) }
end
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|
old = self[key]
if old.nil? || old.empty?
self[key] = value
else
self[key] += separator + 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|
old = self[key]
if old.nil? || old.empty?
self[key] = value
else
self[key] = value + separator + old
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
def prepend_create_path key, path
path = Pathname.new(path) unless path.is_a? Pathname
path.mkpath
prepend_path key, path
end
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, '')
2014-07-18 11:43:37 -05:00
delete(key) if self[key].empty?
2013-08-19 12:32:59 -05:00
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
@compiler ||= if (cc = ARGV.cc)
warn_about_non_apple_gcc($&) if cc =~ GNU_GCC_REGEXP
fetch_compiler(cc, "--cc")
elsif (cc = homebrew_cc)
warn_about_non_apple_gcc($&) if cc =~ GNU_GCC_REGEXP
compiler = fetch_compiler(cc, "HOMEBREW_CC")
if @formula
compilers = [compiler] + CompilerSelector.compilers
compiler = CompilerSelector.select_for(@formula, compilers)
end
compiler
elsif @formula
CompilerSelector.select_for(@formula)
else
MacOS.default_compiler
end
end
def determine_cc
COMPILER_SYMBOL_MAP.invert.fetch(compiler, compiler)
end
2014-06-22 18:43:01 -05:00
COMPILERS.each do |compiler|
define_method(compiler) do
@compiler = compiler
self.cc = determine_cc
self.cxx = determine_cxx
end
end
2013-08-19 12:32:59 -05:00
# Snow Leopard defines an NCURSES value the opposite of most distros
# See: https://bugs.python.org/issue6848
2013-08-19 12:32:59 -05:00
# 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
flags = []
2013-08-30 19:00:19 -05:00
if fc
2013-08-19 12:32:59 -05:00
ohai "Building with an alternative Fortran compiler"
puts "This is unsupported."
2013-08-30 19:00:19 -05:00
self['F77'] ||= fc
2013-08-19 12:32:59 -05:00
if ARGV.include? '--default-fortran-flags'
flags = FC_FLAG_VARS.reject { |key| self[key] }
2013-08-30 18:59:58 -05:00
elsif values_at(*FC_FLAG_VARS).compact.empty?
2013-08-19 12:32:59 -05:00
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
else
if (gfortran = which('gfortran', (HOMEBREW_PREFIX/'bin').to_s))
ohai "Using Homebrew-provided fortran compiler."
elsif (gfortran = which('gfortran', ORIGINAL_PATHS.join(File::PATH_SEPARATOR)))
ohai "Using a fortran compiler found at #{gfortran}."
end
if gfortran
puts "This may be changed by setting the FC environment variable."
self['FC'] = self['F77'] = gfortran
flags = FC_FLAG_VARS
end
2013-08-19 12:32:59 -05:00
end
flags.each { |key| self[key] = cflags }
set_cpu_flags(flags)
2013-08-19 12:32:59 -05:00
end
# ld64 is a newer linker provided for Xcode 2.5
def ld64
ld64 = Formulary.factory('ld64')
self['LD'] = ld64.bin/'ld'
append "LDFLAGS", "-B#{ld64.bin}/"
end
def gcc_version_formula(name)
version = name[GNU_GCC_REGEXP, 1]
gcc_version_name = "gcc#{version.delete('.')}"
gcc_path = HOMEBREW_PREFIX.join("opt", "gcc", "bin", name)
gcc_formula = Formulary.factory "gcc"
gcc_versions_path = HOMEBREW_PREFIX.join("opt", gcc_version_name, "bin", name)
if gcc_path.exist?
gcc_formula
elsif gcc_versions_path.exist?
Formulary.factory gcc_version_name
elsif gcc_formula.version.to_s.include?(version)
gcc_formula
elsif (gcc_versions_formula = Formulary.factory(gcc_version_name) rescue nil)
gcc_versions_formula
else
gcc_formula
end
end
def warn_about_non_apple_gcc(name)
gcc_version_name = name.delete(".-")
begin
gcc_formula = gcc_version_formula(name)
if gcc_formula.name == "gcc"
return if gcc_formula.opt_prefix.exist?
raise <<-EOS.undent
The Homebrew GCC was not installed.
You must:
brew install gcc
EOS
end
if !gcc_formula.opt_prefix.exist?
raise <<-EOS.undent
The requested Homebrew GCC, #{gcc_version_name}, was not installed.
You must:
brew tap homebrew/versions
brew install #{gcc_version_name}
EOS
end
rescue FormulaUnavailableError
raise <<-EOS.undent
Homebrew GCC requested, but formula #{gcc_version_name} not found!
You may need to: brew tap homebrew/versions
EOS
end
end
def permit_arch_flags; end
2014-05-18 14:34:31 -05:00
private
def cc= val
self["CC"] = self["OBJC"] = val.to_s
end
def cxx= val
self["CXX"] = self["OBJCXX"] = val.to_s
end
2014-05-18 14:34:31 -05:00
def homebrew_cc
self["HOMEBREW_CC"]
end
def fetch_compiler(value, source)
COMPILER_SYMBOL_MAP.fetch(value) do |other|
case other
when GNU_GCC_REGEXP
other
else
raise "Invalid value for #{source}: #{other}"
end
end
end
2013-08-19 12:32:59 -05:00
end