aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/hardware.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/hardware.rb')
-rw-r--r--Library/Homebrew/hardware.rb106
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