diff options
Diffstat (limited to 'Library/Homebrew/hardware.rb')
| -rw-r--r-- | Library/Homebrew/hardware.rb | 106 |
1 files changed, 106 insertions, 0 deletions
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 |
