From 5dba2de20bd9a9e63ef67ddbe288f3f1f6f86f96 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 9 Mar 2026 21:57:43 -0600 Subject: [PATCH] feat(buildmeta): add CompatArches and universal binary arch types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CompatArches returns what a given OS+arch can execute — OS-level facts like Rosetta 2 (darwin arm64 runs x86_64), Windows ARM emulation, and x86-64 micro-arch backward compat. Also adds ArchUniversal1 (PPC+x86) and ArchUniversal2 (x86_64+ARM64). Per-package/per-version overrides (libc compat, nonstandard naming) remain the installer config's responsibility. --- internal/buildmeta/buildmeta.go | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/internal/buildmeta/buildmeta.go b/internal/buildmeta/buildmeta.go index 533ae1f..1076e1d 100644 --- a/internal/buildmeta/buildmeta.go +++ b/internal/buildmeta/buildmeta.go @@ -43,6 +43,10 @@ const ( ArchS390X Arch = "s390x" ArchMIPS64 Arch = "mips64" ArchMIPS Arch = "mips" + + // Universal (fat) binary architectures for macOS. + ArchUniversal1 Arch = "universal1" // PPC + x86 (Rosetta 1 era) + ArchUniversal2 Arch = "universal2" // x86_64 + ARM64 (Rosetta 2 era) ) // Libc represents the C library a binary is linked against. @@ -102,3 +106,42 @@ func (t Target) Triplet() string { return string(t.OS) + "-" + string(t.Arch) + "-" + string(t.Libc) } +// CompatArches returns the architectures that the given OS+arch +// combination can execute, ordered from most specific to least. +// The input arch is always first. +// +// These are OS-level facts (hardware + translation layer), not +// package-specific. Per-package overrides belong in installer config. +func CompatArches(os OS, arch Arch) []Arch { + switch os { + case OSDarwin: + switch arch { + case ArchARM64: + // Rosetta 2: Apple Silicon runs x86_64 binaries. + return []Arch{ArchARM64, ArchUniversal2, ArchAMD64} + case ArchAMD64: + return []Arch{ArchAMD64, ArchUniversal2, ArchX86} + } + case OSWindows: + switch arch { + case ArchARM64: + // Windows on ARM emulates x86_64 and x86. + return []Arch{ArchARM64, ArchAMD64, ArchX86} + } + } + + // Micro-architecture fallbacks (universal across all OSes). + switch arch { + case ArchAMD64v4: + return []Arch{ArchAMD64v4, ArchAMD64v3, ArchAMD64v2, ArchAMD64} + case ArchAMD64v3: + return []Arch{ArchAMD64v3, ArchAMD64v2, ArchAMD64} + case ArchAMD64v2: + return []Arch{ArchAMD64v2, ArchAMD64} + case ArchARMv7: + return []Arch{ArchARMv7, ArchARMv6} + } + + return []Arch{arch} +} +