diff --git a/.cirrus.yml b/.cirrus.yml index 698f9afb0..66de0739c 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -35,7 +35,7 @@ freebsd_task: macos_arm64_task: name: Test (arm64 macOS) macos_instance: - image: ghcr.io/cirruslabs/macos-monterey-xcode + image: ghcr.io/cirruslabs/macos-monterey-xcode:latest env: PATH: $HOME/.cargo/bin:/opt/homebrew/opt/python@3.10/bin:$PATH target_cache: diff --git a/src/build_context.rs b/src/build_context.rs index bc92c4619..c4051d0b5 100644 --- a/src/build_context.rs +++ b/src/build_context.rs @@ -1154,9 +1154,32 @@ fn macosx_deployment_target( } pub(crate) fn rustc_macosx_target_version(target: &str) -> (u16, u16) { - use std::process::Command; + use std::process::{Command, Stdio}; use target_lexicon::OperatingSystem; + // On rustc 1.71.0+ we can use `rustc --print deployment-target` + if let Ok(output) = Command::new("rustc") + .stderr(Stdio::piped()) + .stdout(Stdio::piped()) + .env_remove("MACOSX_DEPLOYMENT_TARGET") + .args(["--target", target]) + .args(["--print", "deployment-target"]) + .output() + { + if output.status.success() { + let target_version = std::str::from_utf8(&output.stdout) + .unwrap() + .split('=') + .last() + .and_then(|v| v.trim().split_once('.')); + if let Some((major, minor)) = target_version { + let major: u16 = major.parse().unwrap(); + let minor: u16 = minor.parse().unwrap(); + return (major, minor); + } + } + } + let fallback_version = if target == "aarch64-apple-darwin" { (11, 0) } else {