From d4503b1202c65df1fd636695aa633d5a60997ee8 Mon Sep 17 00:00:00 2001 From: Max Howell Date: Thu, 30 Aug 2012 10:03:26 -0400 Subject: [PATCH] Fixes Homebrew/homebrew#14542; ocaml superenv issues This patch removes most of the settings for CC, CXX etc. because we are trying to be minimal. Then we force the compiler to Homebrew's choice underneath in superenv. We however leave LD because we prefer that build-systems use the c-compiler for linking, it generally works better (copiously tested), however when the build-system explicitly calls ld, we respect that. This gets around the ocaml bug in question, since somehow clang was crashing during link, but the ld tool itself (which is kind of clang, kind of llvm-gcc) is okay with this. Also moved the setting of O (so that cc-args are refurbished) into a make wrapper. Not sure if this matter much, but seems more consistent. --- Library/ENV/4.3/cc | 50 +++++++++++++++++++++--------------- Library/ENV/4.3/make | 3 +++ Library/Homebrew/formula.rb | 4 --- Library/Homebrew/superenv.rb | 17 ++++-------- 4 files changed, 37 insertions(+), 37 deletions(-) create mode 100755 Library/ENV/4.3/make diff --git a/Library/ENV/4.3/cc b/Library/ENV/4.3/cc index acc0227c21..ffd15f2e3c 100755 --- a/Library/ENV/4.3/cc +++ b/Library/ENV/4.3/cc @@ -44,29 +44,29 @@ class Cmd end end def tool - case @cmd - when /gcc/ then 'gcc' - when /g\+\+/ then 'g++' - when 'clang', 'clang++' - @cmd - when 'ld', 'cpp', 'cc' - ENV['HOMEBREW_CC'].chuzzle or 'clang' - when 'c++' - case ENV['HOMEBREW_CC'] - when /gcc/ then 'g++' - else 'clang++' + @tool ||= if @cmd.include? '++' + if ENV['HOMEBREW_CC'].chuzzle =~ /gcc/ + 'g++' + else + 'clang++' end + elsif @cmd == 'ld' + 'ld' else - abort "Unknown command: #{@cmd}" + ENV['HOMEBREW_CC'].chuzzle or 'clang' end end def args - args = if cccfg? 'O' + args = if cccfg? 'O' and tool != 'ld' refurbished_args else @args.dup end - args.unshift("--sysroot=#$sdkroot") if nclt? + if @cmd != 'ld' + args.unshift("--sysroot=#$sdkroot") + else + args.unshift($sdkroot).unshift("-syslibroot") + end if nclt? case mode when :cpp %w{-E} + cppflags + args @@ -110,13 +110,7 @@ class Cmd args << arg end end - - rms = @args - args - %w{CPPFLAGS LDFLAGS CXXFLAGS CFLAGS}.each do |flag| - unison = ENV[flag].split(' ') & rms - puts "Warning! #{unison*' '} removed from #{flag.upcase} by superenv" unless unison.empty? - end - + make_fuss(args) args end def cflags @@ -141,6 +135,20 @@ class Cmd # they override the system options. sys.to_flags('-isystem') + opt.to_flags('-I') end + def make_fuss args + dels = @args - args + if ENV['VERBOSE'] + adds = args - @args + puts "brew: Superenv removed: #{dels*' '}" unless dels.empty? + puts "brew: Superenv added: #{adds*' '}" unless adds.empty? + else + %w{CPPFLAGS LDFLAGS CXXFLAGS CFLAGS}.each do |flag| + next unless ENV[flag] + flags = dels.select{|del| ENV[flag].include? del }.join(' ') + puts "brew: superenv removed `#{flags}' from #{flag}" unless flags.empty? + end + end + end end ####################################################################### sanity diff --git a/Library/ENV/4.3/make b/Library/ENV/4.3/make new file mode 100755 index 0000000000..7e5196e6ae --- /dev/null +++ b/Library/ENV/4.3/make @@ -0,0 +1,3 @@ +#!/bin/sh +export HOMEBREW_CCCFG="O$HOMEBREW_CCCFG" +exec xcrun make "$@" diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 08e01a7d78..78209feb75 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -470,8 +470,6 @@ protected removed_ENV_variables = case if args.empty? then cmd.split(' ').first else cmd end when "xcodebuild" ENV.remove_cc_etc - when /^make\b/ - ENV.append 'HOMEBREW_CCCFG', "O", '' end if ARGV.verbose? @@ -502,8 +500,6 @@ protected rescue raise BuildError.new(self, cmd, args, $?) - ensure - ENV['HOMEBREW_CCCFG'] = ENV['HOMEBREW_CCCFG'].delete('O') if ENV['HOMEBREW_CCCFG'] end public diff --git a/Library/Homebrew/superenv.rb b/Library/Homebrew/superenv.rb index 46e6bafa0f..f059283ce2 100644 --- a/Library/Homebrew/superenv.rb +++ b/Library/Homebrew/superenv.rb @@ -28,7 +28,7 @@ class << ENV alias_method :x11?, :x11 def reset - %w{CC CXX LD CPP OBJC MAKE + %w{CC CXX CPP OBJC MAKE CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS MACOS_DEPLOYMENT_TARGET SDKROOT CMAKE_PREFIX_PATH CMAKE_INCLUDE_PATH CMAKE_FRAMEWORK_PATH}. @@ -40,11 +40,7 @@ class << ENV def setup_build_environment reset - ENV['CC'] = 'cc' - ENV['CXX'] = 'c++' - ENV['LD'] = 'ld' - ENV['CPP'] = 'cpp' - ENV['MAKE'] = 'make' + ENV['LD'] = 'cc' ENV['MAKEFLAGS'] ||= "-j#{determine_make_jobs}" ENV['PATH'] = determine_path ENV['PKG_CONFIG_PATH'] = determine_pkg_config_path @@ -184,16 +180,13 @@ class << ENV end alias_method :j1, :deparallelize def gcc - ENV['CC'] = "gcc" - ENV['CXX'] = "g++" + ENV['HOMEBREW_CC'] = "gcc" end def llvm - ENV['CC'] = "llvm-gcc" - ENV['CXX'] = "llvm-g++" + ENV['HOMEBREW_CC'] = "llvm-gcc" end def clang - ENV['CC'] = "clang" - ENV['CXX'] = "clang++" + ENV['HOMEBREW_CC'] = "clang" end def make_jobs ENV['MAKEFLAGS'] =~ /-\w*j(\d)+/