aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew')
-rw-r--r--Library/Homebrew/brewkit.rb84
-rw-r--r--Library/Homebrew/hardware.rb106
-rw-r--r--Library/Homebrew/hw.model.rb88
-rwxr-xr-xLibrary/Homebrew/unittest.rb16
4 files changed, 159 insertions, 135 deletions
diff --git a/Library/Homebrew/brewkit.rb b/Library/Homebrew/brewkit.rb
index 6d80a1233..18d30a4d1 100644
--- a/Library/Homebrew/brewkit.rb
+++ b/Library/Homebrew/brewkit.rb
@@ -21,11 +21,10 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
-require 'osx/cocoa' # to get number of cores
require 'fileutils'
require 'formula'
require 'download_strategy'
-require 'hw.model'
+require 'hardware'
# TODO
# 1. Indeed, there should be an option to build 32 or 64 bit binaries
@@ -34,7 +33,7 @@ require 'hw.model'
# build systems we support to do it.
-`sw_vers -productVersion` =~ /(10\.\d+)(\.\d+)?/
+`/usr/bin/sw_vers -productVersion` =~ /(10\.\d+)(\.\d+)?/
MACOS_VERSION=$1.to_f
ENV['MACOSX_DEPLOYMENT_TARGET']=MACOS_VERSION.to_s
@@ -43,33 +42,21 @@ ENV['LDFLAGS']='' # to be consistent, we ignore the existing environment
# this is first, so when you see it in output, you notice it
cflags='-O3'
-# optimise all the way to eleven, references:
-# http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
-# http://forums.mozillazine.org/viewtopic.php?f=12&t=577299
-# http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/i386-and-x86_002d64-Options.html
-case hw_model
- when :core1
- # Core DUO is a 32 bit chip
- # NOTE technically we can do -msse4 with gcc 4.2, but I can't test it, so
- # haven't tried it, if you have a core1 chip, then please test and commit --mxcl
- cflags<<" -march=prescott -mfpmath=sse -msse3 -mmmx"
- when :core2
- # Core 2 DUO is a 64 bit chip
- if MACOS_VERSION >= 10.6
- # 64 bits baby! -mfpmath=sse is automatically switched on by -m64
- # GCC 4.3 has a -march=core2, but this is 4.2 and nocona is correct
- cflags<<" -m64 -march=nocona -msse4 -mmmx"
- ENV['LDFLAGS']="-arch x86_64"
- else
- # We don't build 64 bit before 10.6 as nothing else is 64 bit, so any
- # libraries we build would be unusable by 32 bit software
- cflags<<" -march=nocona -mfpmath=sse -msse3 -mmmx"
- end
- when :xeon
- # TODO what optimisations for xeon?
+if MACOS_VERSION >= 10.6
+ if Hardware.is_64bit?
+ # 64 bits baby!
+ cflags<<" -m64"
+ ENV['LDFLAGS']="-arch x86_64"
+ end
+else
+ # GCC 4.2.1 is smart and will figure out the right compile flags
+ # http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/i386-and-x86_002d64-Options.html
+ cflags<<"-march=native"
+end
- when :ppc then abort "Sorry, Homebrew does not support PowerPC architectures"
- when :dunno then abort "Sorry, Homebrew cannot determine what kind of Mac this is!"
+case Hardware.cpu_type
+when :ppc then abort "Sorry, Homebrew does not support PowerPC architectures"
+when :dunno then abort "Sorry, Homebrew cannot determine what kind of Mac this is!"
end
# -w: keep signal to noise high
@@ -77,14 +64,13 @@ end
ENV['CFLAGS']="#{cflags} -w -pipe -fomit-frame-pointer -mmacosx-version-min=#{MACOS_VERSION}"
ENV['CXXFLAGS']=ENV['CFLAGS']
-# lets use gcc 4.2, it is newer and "better", at least I believe so, mail me
-# if I'm wrong
+# lets use gcc 4.2, Xcode does after all
if MACOS_VERSION==10.5
ENV['CC']='gcc-4.2'
ENV['CXX']='g++-4.2'
end
# compile faster
-ENV['MAKEFLAGS']="-j#{OSX::NSProcessInfo.processInfo.processorCount}"
+ENV['MAKEFLAGS']="-j#{Hardware.processor_count}"
# /usr/local is always in the build system path
@@ -109,6 +95,16 @@ module HomebrewEnvExtension
self['CC']='gcc-4.0'
self['CXX']='g++-4.0'
end
+
+ # argh, we have to figure out the compile options ourselves and get
+ # rid of -march=native, so we optimise all the way to eleven, references:
+ # http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel
+ # http://forums.mozillazine.org/viewtopic.php?f=12&t=577299
+ # http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/i386-and-x86_002d64-Options.html
+ remove_from_cflags '-march=native'
+ append_to_cflags Hardware.gcc_march
+ append_to_cflags Hardware.gcc_msse
+ append_to_cflags Hardware.gcc_mmx
end
def osx_10_4
self['MACOSX_DEPLOYMENT_TARGET']=nil
@@ -118,10 +114,11 @@ module HomebrewEnvExtension
%w[-mfpmath=sse -msse3 -mmmx -march=\w+].each {|s| remove_from_cflags s}
end
def libxml2
- self['CXXFLAGS']=self['CFLAGS']+=' -I/usr/include/libxml2'
+ append_to_cflags ' -I/usr/include/libxml2'
end
# TODO rename or alias to x11
def libpng
+ # CPPFLAGS are the C-PreProcessor flags, *not* C++!
append 'CPPFLAGS', '-I/usr/X11R6/include'
append 'LDFLAGS', '-L/usr/X11R6/lib'
end
@@ -129,7 +126,7 @@ module HomebrewEnvExtension
def enable_warnings
remove_from_cflags '-w'
end
-
+
private
def append key, value
ref=self[key]
@@ -139,14 +136,18 @@ private
self[key]=ref+' '+value
end
end
- def remove key, rx
+ def append_to_cflags f
+ append 'CFLAGS', f
+ append 'CXXFLAGS', f
+ end
+ def remove key, value
return if self[key].nil?
- # sub! doesn't work as "the string is frozen"
- self[key]=self[key].sub rx, ''
+ self[key]=self[key].sub value, '' # can't use sub! on ENV
self[key]=nil if self[key].empty? # keep things clean
end
- def remove_from_cflags rx
- %w[CFLAGS CXXFLAGS].each {|key| remove key, rx}
+ def remove_from_cflags f
+ remove 'CFLAGS', f
+ remove 'CXXFLAGS', f
end
end
@@ -157,7 +158,7 @@ ENV.extend HomebrewEnvExtension
# http://github.com/mxcl/homebrew/issues/#issue/13
paths=ENV['PATH'].split(':').reject do |p|
p.squeeze! '/'
- p=~%r[^/opt/local] or p=~%r[^/sw]
+ p =~ %r[^/opt/local] or p =~ %r[^/sw]
end
ENV['PATH']=paths*':'
@@ -169,7 +170,6 @@ def inreplace(path, before, after)
after.gsub! "\\", "\\\\"
after.gsub! "/", "\\/"
- # TODO this sucks
- # either use 'ed', or allow regexp and use a proper ruby function
+ # FIXME use proper Ruby for teh exceptions!
safe_system "perl", "-pi", "-e", "s/#{before}/#{after}/g", path
end
diff --git a/Library/Homebrew/hardware.rb b/Library/Homebrew/hardware.rb
new file mode 100644
index 000000000..55de6fd0b
--- /dev/null
+++ b/Library/Homebrew/hardware.rb
@@ -0,0 +1,106 @@
+# Copyright 2009 Max Howell and other contributors.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+class Hardware
+ # These methods use info spewed out by sysctl.
+ # Look in <mach/machine.h> for decoding info.
+
+ def self.cpu_type
+ @@cpu_type ||= `/usr/sbin/sysctl -n hw.cputype`.to_i
+
+ case @@cpu_type
+ when 7
+ :intel
+ when 18
+ :ppc
+ else
+ :dunno
+ end
+ end
+
+ def self.intel_family
+ @@intel_family ||= `/usr/sbin/sysctl -n hw.cpufamily`.to_i
+
+ case @@intel_family
+ when 0x73d67300 # Yonah: Core Solo/Duo
+ :core
+ when 0x426f69ef # Merom: Core 2 Duo
+ :core2
+ when 0x78ea4fbc # Penryn
+ :penryn
+ when 0x6b5a4cd2 # Nehalem
+ :nehalem
+ else
+ :dunno
+ end
+ end
+
+ def self.processor_count
+ @@processor_count ||= `/usr/sbin/sysctl -n hw.ncpu`.to_i
+ end
+
+ def self.gcc_march # what to pass to gcc
+ @@gcc_march ||= if self.cpu_type == :intel
+ case self.intel_family
+ when :core
+ " -march=prescott"
+ when :core2, :penryn, :nehalem
+ # GCC 4.3 has a -march=core2, but this isn't 4.3 and nocona is correct
+ " -march=nocona"
+ end
+ else
+ ""
+ end
+ end
+
+ def self.gcc_msse # what to pass to gcc
+ # avoid sse4 for now in case it blows up
+ @@gcc_msse ||= if sysctl_bool("hw.optional.sse3")
+ " -msse3 -mfpmath=sse"
+ else
+ ""
+ end
+ end
+
+ def self.gcc_mmmx # what to pass to gcc
+ @@gcc_mmmx ||= if sysctl_bool("hw.optional.mmx")
+ " -mmmx"
+ else
+ ""
+ end
+ end
+
+ def self.is_64bit?
+ @@is_64bit ||= sysctl_bool("hw.cpu64bit_capable")
+ end
+
+protected
+ def self.sysctl_bool(property)
+ result = nil
+ IO.popen("/usr/sbin/sysctl -n #{property} 2>/dev/null") do |f|
+ result = f.gets.to_i # should be 0 or 1
+ end
+ $?.success? && result == 1 # sysctl call succeded and printed 1
+ end
+end
diff --git a/Library/Homebrew/hw.model.rb b/Library/Homebrew/hw.model.rb
deleted file mode 100644
index 9edcdd03f..000000000
--- a/Library/Homebrew/hw.model.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright 2009 Max Howell and other contributors.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-
-# The output of the command is in the form of: `MacBook2,1'
-# This yields: "MacBook", 2, 1
-def hw_model_output
- model=`/usr/sbin/sysctl hw.model`.match /hw.model: (\w+)(\d+),(\d+)/
- yield model[1], model[2].to_i, model[3].to_i
-end
-
-# http://support.apple.com/kb/HT3696
-# http://www.cocoadev.com/index.pl?MacintoshModels
-def hw_model
- hw_model_output do |model, major, minor|
- case model
- when "iMac"
- if major <= 4
- :core1
- else
- $unknown_hw_model=true if major > 8
- :core2
- end
-
- when "MacBookAir"
- $unknown_hw_model=true if major > 1
- :core2
-
- when "MacBook"
- if major <= 1
- :core1
- else
- $unknown_hw_model=true if major > 4
- :core2
- end
-
- when "MacBookPro"
- if major <= 1
- :core1
- else
- $unknown_hw_model=true if major > 5
- :core2
- end
-
- when "Macmini" # Mac mini (Core Duo/Solo)
- $unknown_hw_model=true if major > 1
- :core
-
- when "MacPro"
- $unknown_hw_model=true if major > 3
- # 'Xeon' is a marketing term, not a specific CPU:
- # http://en.wikipedia.org/wiki/Xeon
- # adamv says: I have a Mac Pro at work (MacPro4,1) and will try
- # some compiler options out.
- :xeon
-
- when "PowerBook", "PowerMac", "RackMac" then :ppc
-
- when "Xserve"
- $unknown_hw_model=true if major > 2
- :xeon
-
- when "ADP" then :dunno # Developer Transition Kit
- when "M43ADP" then :dunno # Development Mac Pro
- else :dunno
- end
- end
-end
diff --git a/Library/Homebrew/unittest.rb b/Library/Homebrew/unittest.rb
index 7943640fd..729cb7997 100755
--- a/Library/Homebrew/unittest.rb
+++ b/Library/Homebrew/unittest.rb
@@ -12,6 +12,7 @@ require 'download_strategy'
require 'keg'
require 'utils'
require 'brew.h'
+require 'hardware.rb'
# these are defined in bin/brew, but we don't want to break our actual
# homebrew tree, and we do want to test everything :)
@@ -332,11 +333,16 @@ class BeerTasting <Test::Unit::TestCase
assert_equal '1.9.1-p243', f.version
end
- def test_hw_model
- require 'hw.model.rb'
- # this will raise if we don't recognise your mac, but that prolly
- # indicates something went wrong rather than we don't know
- assert %w[core1 core2 xeon ppc].include?(hw_model.to_s)
+ # these will raise if we don't recognise your mac, but that prolly
+ # indicates something went wrong rather than we don't know
+ def test_hardware_cpu_type
+ assert [:intel, :ppc].include?(Hardware.cpu_type)
+ end
+
+ def test_hardware_intel_family
+ if Hardware.cpu_type == :intel
+ assert [:core, :core2, :penryn, :nehalem].include?(Hardware.intel_family)
+ end
end
def test_brew_h