diff options
Diffstat (limited to 'Library/ENV')
| l--------- | Library/ENV/4.3/c++ | 1 | ||||
| -rwxr-xr-x | Library/ENV/4.3/cc | 140 | ||||
| l--------- | Library/ENV/4.3/clang | 1 | ||||
| l--------- | Library/ENV/4.3/clang++ | 1 | ||||
| l--------- | Library/ENV/4.3/cpp | 1 | ||||
| l--------- | Library/ENV/4.3/g++ | 1 | ||||
| l--------- | Library/ENV/4.3/gcc | 1 | ||||
| l--------- | Library/ENV/4.3/i686-apple-darwin11-llvm-g++-4.2 | 1 | ||||
| l--------- | Library/ENV/4.3/i686-apple-darwin11-llvm-gcc-4.2 | 1 | ||||
| l--------- | Library/ENV/4.3/ld | 1 | ||||
| l--------- | Library/ENV/4.3/llvm-g++ | 1 | ||||
| l--------- | Library/ENV/4.3/llvm-g++-4.2 | 1 | ||||
| l--------- | Library/ENV/4.3/llvm-gcc | 1 | ||||
| l--------- | Library/ENV/4.3/llvm-gcc-4.2 | 1 | ||||
| -rwxr-xr-x | Library/ENV/4.3/xcrun | 12 | ||||
| -rw-r--r-- | Library/ENV/libsuperenv.rb | 41 |
16 files changed, 206 insertions, 0 deletions
diff --git a/Library/ENV/4.3/c++ b/Library/ENV/4.3/c++ new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/c++ @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/cc b/Library/ENV/4.3/cc new file mode 100755 index 000000000..8673c7527 --- /dev/null +++ b/Library/ENV/4.3/cc @@ -0,0 +1,140 @@ +#!/usr/bin/ruby -W0 +#TODO make it work with homebrew/dupes/gcc +#TODO? If we find -mmacosx-version-min=10.8, change sdkroot? warn visibly if no such SDK? +#TODO fix pkg-config files, should point to /usr/local or /usr/local/opt +#TODO for easier to understand code, don't monkey-patch ENV, just set via a hash from a helper class +#TODO create mechanism to specify build effects like %w{-O0 -O4 vanilla-arg-parsing sdk=10.6} etc. +#TODO DSL for lame-env (and rename to typical-env or something better) +#TODO consider always setting CC to cc and instead having HOMEBREW_CC to force cc choice in end toolchain +# in verbose mode print out things like "gcc called, but redirecting to clang" if that happens +#TODO `brew sh`: https://github.com/mxcl/homebrew/issues/14381#issuecomment-8017538 + +require "#{File.dirname __FILE__}/../libsuperenv" +require 'set' + +def cccfg? flags + flags.split('').all?{|c| ENV['HOMEBREW_CCCFG'].include? c } if ENV['HOMEBREW_CCCFG'] +end +def nclt? + $sdkroot != nil +end +def cmake_prefixes + @prefixes ||= ENV['CMAKE_PREFIX_PATH'].split(':').reject do |path| + case path + when '/usr/local' then !nclt? + when '/usr', '/', "#$sdkroot/usr" then true + end + end +end + +class Cmd + def initialize path, args + @cmd = path.basename.freeze + @args = args.freeze + end + def mode + if @cmd == 'cpp' or @cmd == 'ld' + @cmd.to_sym + elsif @args.include? '-c' + :cc + elsif @args.include? '-E' + :cpp + else + :ccld + 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++' + end + else + abort "Unknown command: #{@cmd}" + end + end + def args + args = if cccfg? 'O' + refurbished_args + else + @args.dup + end + args.unshift("--sysroot=#$sdkroot") if nclt? + case mode + when :cpp + %w{-E} + cppflags + args + when :ld + ldflags + args + when :cc + cflags + cppflags + args + when :ccld + cflags + cppflags + ldflags + args + end.compact + end + def refurbished_args + iset = Set.new(cmake_prefixes.map{|prefix| "#{prefix}/include" }) + lset = Set.new + args = [] + whittler = @args.each + loop do + case arg = whittler.next + when '-arch', /^-Xarch_/ + whittler.next + when /^-g\d?/, /^-gstabs\d+/, '-gstabs+', /^-ggdb\d?/, '-gdwarf-2', + /^-march=.+/, /^-mtune=.+/, '-m64', '-m32', + /^-O[0-9zs]/, '-fast', + %r{^-[IL]/opt/local}, %r{^-[IL]/sw}, # no macports/fink + %r{^-[IL]/usr/X11}, %r{^-[IL]/opt/X11}, # we add X11 ourselves + '-pedantic', '-pedantic-errors' + when /^-W.*/ + args << arg if arg =~ /^-Wl,/ + when /^-I(.+)/ + # it is okay to add a space after the -I; so let's support it + path = $1.chuzzle || whittler.next + args << "-I#{path}" if iset.add?(path.cleanpath) + when /^-l(.+)/ + lib = $1.chuzzle || whittler.next + args << "-l#{lib}" if lset.add?(lib) + else + args << arg + end + end + args + end + def cflags + if cccfg? 'Ob' + %w{-mtune=generic -Oz} + elsif cccfg? 'O' + u = '-arch i386 -arch x86_64' if cccfg? 'u' + c = case tool when 'clang', 'clang++' then '-march=native' end + %w{-pipe -w -Os} << u << c + else + [] + end + end + def ldflags + cmake_prefixes.map{|prefix| "#{prefix}/lib" }.to_flags('-L') + end + def cppflags + all = cmake_prefixes.map{|prefix| "#{prefix}/include" } + opt = all.select{|prefix| prefix =~ %r{^#$brewfix/opt} } + sys = all - opt + ENV['CMAKE_INCLUDE_PATH'].split(':') + # we want our keg-only includes to be found before system includes so that + # they override the system options. + sys.to_flags('-isystem') + opt.to_flags('-I') + end +end + +####################################################################### sanity +abort "The build-tool has reset ENV. --lame-env required." unless ENV['HOMEBREW_BREW_FILE'] + +######################################################################### main +cmd = Cmd.new($0, ARGV) +exec "xcrun", cmd.tool, *cmd.args diff --git a/Library/ENV/4.3/clang b/Library/ENV/4.3/clang new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/clang @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/clang++ b/Library/ENV/4.3/clang++ new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/clang++ @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/cpp b/Library/ENV/4.3/cpp new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/cpp @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/g++ b/Library/ENV/4.3/g++ new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/g++ @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/gcc b/Library/ENV/4.3/gcc new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/gcc @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/i686-apple-darwin11-llvm-g++-4.2 b/Library/ENV/4.3/i686-apple-darwin11-llvm-g++-4.2 new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/i686-apple-darwin11-llvm-g++-4.2 @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/i686-apple-darwin11-llvm-gcc-4.2 b/Library/ENV/4.3/i686-apple-darwin11-llvm-gcc-4.2 new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/i686-apple-darwin11-llvm-gcc-4.2 @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/ld b/Library/ENV/4.3/ld new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/ld @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/llvm-g++ b/Library/ENV/4.3/llvm-g++ new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/llvm-g++ @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/llvm-g++-4.2 b/Library/ENV/4.3/llvm-g++-4.2 new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/llvm-g++-4.2 @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/llvm-gcc b/Library/ENV/4.3/llvm-gcc new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/llvm-gcc @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/llvm-gcc-4.2 b/Library/ENV/4.3/llvm-gcc-4.2 new file mode 120000 index 000000000..2652f5f42 --- /dev/null +++ b/Library/ENV/4.3/llvm-gcc-4.2 @@ -0,0 +1 @@ +cc
\ No newline at end of file diff --git a/Library/ENV/4.3/xcrun b/Library/ENV/4.3/xcrun new file mode 100755 index 000000000..3d2dd642e --- /dev/null +++ b/Library/ENV/4.3/xcrun @@ -0,0 +1,12 @@ +#!/bin/bash +# This wrapper because 4.3 xcrun doesn't work with CLT-only configurations +# But many build-systems expect it to work. This fixes that. +# NOTE only works if they call xcrun without a full-path. Cross your fingers! + +if [ $HOMEBREW_SDKROOT ]; then + exec /usr/bin/xcrun "$@" +else + cmd="$1" + shift + exec "/usr/bin/$cmd" "$@" +fi diff --git a/Library/ENV/libsuperenv.rb b/Library/ENV/libsuperenv.rb new file mode 100644 index 000000000..dcd97efce --- /dev/null +++ b/Library/ENV/libsuperenv.rb @@ -0,0 +1,41 @@ +# Yes, a good deal of this could be imported from Homebrew-proper +# But Homebrew-proper is dog-slow currently, and I didn't want every cc +# instantiation to be slower be a tangible amount. + +class String + def directory?; File.directory? self end + def basename; File.basename self end + def cleanpath; require 'pathname'; Pathname.new(self).realpath.to_s rescue self end + def chuzzle; s = chomp; s unless s.empty? end + def dirname; File.dirname(self) end +end + +class NilClass + def chuzzle; end + def directory?; false end + def split(x); [] end +end + +class Array + def to_flags prefix + select{|path| path.directory? }.uniq.map{|path| prefix+path } + end +end + +module Kernel extend self + alias :_exec :exec + def exec *args + path = File.expand_path('~/Library/Logs/Homebrew/cc.log') + open(path, 'a') do |f| + f.print '[', $0 + f.print " -%s" % ENV['HOMEBREW_CCCFG'] if ENV['HOMEBREW_CCCFG'] + f.print '] ' + f.puts args.join(' ') + f.puts + end + _exec *args + end +end if ENV['HOMEBREW_LOG'] + +$brewfix = "#{__FILE__}/../../../".cleanpath.freeze +$sdkroot = ENV['HOMEBREW_SDKROOT'].freeze |
