brew/Library/Homebrew/hardware.rb

107 lines
3.0 KiB
Ruby
Raw Normal View History

# 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