diff --git a/crates/uv-python/src/platform.rs b/crates/uv-python/src/platform.rs index 6fc84c725..a8c951d67 100644 --- a/crates/uv-python/src/platform.rs +++ b/crates/uv-python/src/platform.rs @@ -157,8 +157,10 @@ impl Arch { // TODO: Implement `variant` support checks - // Windows ARM64 runs emulated x86_64 binaries transparently - if cfg!(windows) && matches!(self.family, target_lexicon::Architecture::Aarch64(_)) { + // macOS aarch64 and Windows ARM64 runs emulated x86_64 binaries transparently + if (cfg!(windows) || cfg!(target_os = "macos")) + && matches!(self.family, target_lexicon::Architecture::Aarch64(_)) + { return other.family == target_lexicon::Architecture::X86_64; } diff --git a/crates/uv/tests/it/python_install.rs b/crates/uv/tests/it/python_install.rs index c2d2f3267..b2ffff3da 100644 --- a/crates/uv/tests/it/python_install.rs +++ b/crates/uv/tests/it/python_install.rs @@ -1416,3 +1416,73 @@ fn python_install_cached() { Caused by: An offline Python installation was requested, but cpython-3.12.10[DATE]-[PLATFORM].tar.gz) is missing in python-cache "); } + +#[cfg(target_os = "macos")] +#[test] +fn python_install_emulated_macos() { + let context: TestContext = TestContext::new_with_versions(&[]) + .with_filtered_exe_suffix() + .with_managed_python_dirs(); + + // Before installation, `uv python list` should not show the x86_64 download + uv_snapshot!(context.filters(), context.python_list().arg("3.13"), @r" + success: true + exit_code: 0 + ----- stdout ----- + cpython-3.13.3-macos-aarch64-none + + ----- stderr ----- + "); + + // Install an x86_64 version (assuming an aarch64 host) + uv_snapshot!(context.filters(), context.python_install().arg("cpython-3.13-macos-x86_64"), @r" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Installed Python 3.13.3 in [TIME] + + cpython-3.13.3-macos-x86_64-none + "); + + // It should be discoverable with `uv python find` + uv_snapshot!(context.filters(), context.python_find().arg("3.13"), @r" + success: true + exit_code: 0 + ----- stdout ----- + [TEMP_DIR]/managed/cpython-3.13.3-macos-x86_64-none/bin/python3.13 + + ----- stderr ----- + "); + + // And included in `uv python list` + uv_snapshot!(context.filters(), context.python_list().arg("3.13"), @r" + success: true + exit_code: 0 + ----- stdout ----- + cpython-3.13.3-macos-x86_64-none managed/cpython-3.13.3-macos-x86_64-none/bin/python3.13 + cpython-3.13.3-macos-aarch64-none + + ----- stderr ----- + "); + + uv_snapshot!(context.filters(), context.python_install().arg("cpython-3.13-macos-aarch64"), @r" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Installed Python 3.13.3 in [TIME] + + cpython-3.13.3-macos-aarch64-none + "); + + // Once we've installed the native version, it should be preferred over x86_64 + uv_snapshot!(context.filters(), context.python_find().arg("3.13"), @r" + success: true + exit_code: 0 + ----- stdout ----- + [TEMP_DIR]/managed/cpython-3.13.3-macos-x86_64-none/bin/python3.13 + + ----- stderr ----- + "); +}