Mac Hardware: provide a more Mac-specific implementation of can_run?
This commit is contained in:
parent
d7ff53fa1d
commit
944bff4de2
@ -107,6 +107,20 @@ module Hardware
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Determines whether the current CPU and macOS combination
|
||||||
|
# can run an executable of the specified architecture.
|
||||||
|
# `arch` is a symbol in the same format returned by
|
||||||
|
# Hardware::CPU.family
|
||||||
|
def can_run?(arch)
|
||||||
|
if Hardware::CPU.intel?
|
||||||
|
intel_can_run? arch
|
||||||
|
elsif Hardware::CPU.ppc?
|
||||||
|
ppc_can_run? arch
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def features
|
def features
|
||||||
@features ||= sysctl_n(
|
@features ||= sysctl_n(
|
||||||
"machdep.cpu.features",
|
"machdep.cpu.features",
|
||||||
@ -162,6 +176,35 @@ module Hardware
|
|||||||
@properties[keys] = Utils.popen_read("/usr/sbin/sysctl", "-n", *keys)
|
@properties[keys] = Utils.popen_read("/usr/sbin/sysctl", "-n", *keys)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def intel_can_run?(arch)
|
||||||
|
case arch
|
||||||
|
when :ppc
|
||||||
|
# Rosetta is still available
|
||||||
|
MacOS.version < :lion
|
||||||
|
when :ppc64
|
||||||
|
# Rosetta never supported PPC64
|
||||||
|
false
|
||||||
|
when :x86_64
|
||||||
|
Hardware::CPU.is_64_bit?
|
||||||
|
when :i386
|
||||||
|
true
|
||||||
|
else # dunno
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def ppc_can_run?(arch)
|
||||||
|
case arch
|
||||||
|
when :ppc
|
||||||
|
true
|
||||||
|
when :ppc64
|
||||||
|
Hardware::CPU.is_64_bit?
|
||||||
|
else
|
||||||
|
# Intel is never supported
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
56
Library/Homebrew/test/os/mac/hardware_spec.rb
Normal file
56
Library/Homebrew/test/os/mac/hardware_spec.rb
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
require "hardware"
|
||||||
|
require "extend/os/mac/hardware/cpu"
|
||||||
|
|
||||||
|
describe Hardware::CPU do
|
||||||
|
describe "::can_run?" do
|
||||||
|
it "reports that Intel Macs can run Intel executables" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :intel
|
||||||
|
allow(Hardware::CPU).to receive(:bits).and_return 64
|
||||||
|
expect(Hardware::CPU.can_run?(:i386)).to be true
|
||||||
|
expect(Hardware::CPU.can_run?(:x86_64)).to be true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports that PowerPC Macs can run PowerPC executables" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :ppc
|
||||||
|
allow(Hardware::CPU).to receive(:bits).and_return 64
|
||||||
|
expect(Hardware::CPU.can_run?(:ppc)).to be true
|
||||||
|
expect(Hardware::CPU.can_run?(:ppc64)).to be true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports that 32-bit Intel Macs can't run x86_64 executables" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :intel
|
||||||
|
allow(Hardware::CPU).to receive(:bits).and_return 32
|
||||||
|
expect(Hardware::CPU.can_run?(:x86_64)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports that 32-bit PowerPC Macs can't run ppc64 executables" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :ppc
|
||||||
|
allow(Hardware::CPU).to receive(:bits).and_return 32
|
||||||
|
expect(Hardware::CPU.can_run?(:ppc64)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports that Intel Macs can only run 32-bit PowerPC executables on 10.6 and older" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :intel
|
||||||
|
allow(OS::Mac).to receive(:version).and_return OS::Mac::Version.new "10.6"
|
||||||
|
expect(Hardware::CPU.can_run?(:ppc)).to be true
|
||||||
|
|
||||||
|
allow(OS::Mac).to receive(:version).and_return OS::Mac::Version.new "10.7"
|
||||||
|
expect(Hardware::CPU.can_run?(:ppc)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports that PowerPC Macs can't run Intel executables" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :ppc
|
||||||
|
expect(Hardware::CPU.can_run?(:i386)).to be false
|
||||||
|
expect(Hardware::CPU.can_run?(:x86_64)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false for unknown CPU types" do
|
||||||
|
allow(Hardware::CPU).to receive(:type).and_return :dunno
|
||||||
|
expect(Hardware::CPU.can_run?(:i386)).to be false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false for unknown arches" do
|
||||||
|
expect(Hardware::CPU.can_run?(:blah)).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user