From 488ccfdf70762127bd21f36492748d407b3e9fc6 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Sun, 18 Jul 2021 10:48:03 +0800 Subject: [PATCH] formula_cellar_checks: check keg for mismatched arches There have been a few instances I've noticed that we've been silently installing binaries built for x86_64 on ARM. There's probably more that I haven't found yet, so it seems useful to check this with an audit. --- Library/Homebrew/formula_cellar_checks.rb | 17 +++++++++++++++++ Library/Homebrew/os/mac/mach.rb | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/formula_cellar_checks.rb b/Library/Homebrew/formula_cellar_checks.rb index 77e6050314..187c055ff4 100644 --- a/Library/Homebrew/formula_cellar_checks.rb +++ b/Library/Homebrew/formula_cellar_checks.rb @@ -314,6 +314,22 @@ module FormulaCellarChecks "No `cpuid` instruction detected. #{formula} should not use `ENV.runtime_cpu_detection`." end + def check_binary_arches(formula) + return unless formula.prefix.directory? + + keg = Keg.new(formula.prefix) + mismatches = keg.binary_executable_or_library_files.reject do |file| + file.arch == Hardware::CPU.arch + end + return if mismatches.empty? + + <<~EOS + Binaries built for a non-native architecture were installed into #{formula}'s prefix. + The offending files are: + #{mismatches * "\n "} + EOS + end + def audit_installed @new_formula ||= false @@ -334,6 +350,7 @@ module FormulaCellarChecks problem_if_output(check_plist(formula.prefix, formula.plist)) problem_if_output(check_python_symlinks(formula.name, formula.keg_only?)) problem_if_output(check_cpuid_instruction(formula)) + problem_if_output(check_binary_arches(formula)) end alias generic_audit_installed audit_installed diff --git a/Library/Homebrew/os/mac/mach.rb b/Library/Homebrew/os/mac/mach.rb index adae8e32f6..0b4d8a0c63 100644 --- a/Library/Homebrew/os/mac/mach.rb +++ b/Library/Homebrew/os/mac/mach.rb @@ -29,7 +29,7 @@ module MachOShim machos.each do |m| arch = case m.cputype - when :x86_64, :i386, :ppc64 then m.cputype + when :x86_64, :i386, :ppc64, :arm64, :arm then m.cputype when :ppc then :ppc7400 else :dunno end