-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix IPHONEOS_DEPLOYMENT_TARGET
on Mac Catalyst
#121296
Changes from all commits
94ddbb6
92d4b31
3cb4e34
cd530fc
a3cf493
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -97,28 +97,39 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { | |
_ => os.into(), | ||
}; | ||
|
||
let platform_version: StaticCow<str> = match os { | ||
"ios" => ios_lld_platform_version(arch), | ||
"tvos" => tvos_lld_platform_version(), | ||
"watchos" => watchos_lld_platform_version(), | ||
"macos" => macos_lld_platform_version(arch), | ||
_ => unreachable!(), | ||
} | ||
.into(); | ||
|
||
let arch = arch.target_name(); | ||
let min_version: StaticCow<str> = { | ||
let (major, minor) = match os { | ||
"ios" => ios_deployment_target(arch, abi), | ||
"tvos" => tvos_deployment_target(), | ||
"watchos" => watchos_deployment_target(), | ||
"macos" => macos_deployment_target(arch), | ||
_ => unreachable!(), | ||
}; | ||
format!("{major}.{minor}").into() | ||
}; | ||
let sdk_version = min_version.clone(); | ||
|
||
let mut args = TargetOptions::link_args( | ||
LinkerFlavor::Darwin(Cc::No, Lld::No), | ||
&["-arch", arch, "-platform_version"], | ||
&["-arch", arch.target_name(), "-platform_version"], | ||
); | ||
add_link_args_iter( | ||
&mut args, | ||
LinkerFlavor::Darwin(Cc::No, Lld::No), | ||
[platform_name, platform_version.clone(), platform_version].into_iter(), | ||
[platform_name, min_version, sdk_version].into_iter(), | ||
); | ||
if abi != "macabi" { | ||
add_link_args(&mut args, LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-arch", arch]); | ||
add_link_args( | ||
&mut args, | ||
LinkerFlavor::Darwin(Cc::Yes, Lld::No), | ||
&["-arch", arch.target_name()], | ||
); | ||
} else { | ||
add_link_args_iter( | ||
&mut args, | ||
LinkerFlavor::Darwin(Cc::Yes, Lld::No), | ||
["-target".into(), mac_catalyst_llvm_target(arch).into()].into_iter(), | ||
); | ||
} | ||
|
||
args | ||
|
@@ -131,7 +142,7 @@ pub fn opts(os: &'static str, arch: Arch) -> TargetOptions { | |
abi: abi.into(), | ||
os: os.into(), | ||
cpu: arch.target_cpu().into(), | ||
link_env_remove: link_env_remove(arch, os), | ||
link_env_remove: link_env_remove(os), | ||
vendor: "apple".into(), | ||
linker_flavor: LinkerFlavor::Darwin(Cc::Yes, Lld::No), | ||
// macOS has -dead_strip, which doesn't rely on function_sections | ||
|
@@ -220,16 +231,13 @@ pub fn deployment_target(target: &Target) -> Option<(u32, u32)> { | |
}; | ||
macos_deployment_target(arch) | ||
} | ||
"ios" => match &*target.abi { | ||
"macabi" => mac_catalyst_deployment_target(), | ||
_ => { | ||
let arch = match target.arch.as_ref() { | ||
"arm64e" => Arm64e, | ||
_ => Arm64, | ||
}; | ||
ios_deployment_target(arch) | ||
} | ||
}, | ||
"ios" => { | ||
let arch = match target.arch.as_ref() { | ||
"arm64e" => Arm64e, | ||
_ => Arm64, | ||
}; | ||
ios_deployment_target(arch, &target.abi) | ||
} | ||
"watchos" => watchos_deployment_target(), | ||
"tvos" => tvos_deployment_target(), | ||
_ => return None, | ||
|
@@ -260,17 +268,12 @@ fn macos_deployment_target(arch: Arch) -> (u32, u32) { | |
.unwrap_or_else(|| macos_default_deployment_target(arch)) | ||
} | ||
|
||
fn macos_lld_platform_version(arch: Arch) -> String { | ||
let (major, minor) = macos_deployment_target(arch); | ||
format!("{major}.{minor}") | ||
} | ||
|
||
pub fn macos_llvm_target(arch: Arch) -> String { | ||
let (major, minor) = macos_deployment_target(arch); | ||
format!("{}-apple-macosx{}.{}.0", arch.target_name(), major, minor) | ||
} | ||
|
||
fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]> { | ||
fn link_env_remove(os: &'static str) -> StaticCow<[StaticCow<str>]> { | ||
// Apple platforms only officially support macOS as a host for any compilation. | ||
// | ||
// If building for macOS, we go ahead and remove any erroneous environment state | ||
|
@@ -298,47 +301,41 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]> | |
env_remove.push("TVOS_DEPLOYMENT_TARGET".into()); | ||
env_remove.into() | ||
} else { | ||
// Otherwise if cross-compiling for a different OS/SDK, remove any part | ||
// Otherwise if cross-compiling for a different OS/SDK (including Mac Catalyst), remove any part | ||
// of the linking environment that's wrong and reversed. | ||
match arch { | ||
Armv7k | Armv7s | Arm64 | Arm64e | Arm64_32 | I386 | I386_sim | I686 | X86_64 | ||
| X86_64_sim | X86_64h | Arm64_sim => { | ||
cvs!["MACOSX_DEPLOYMENT_TARGET"] | ||
} | ||
X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"], | ||
} | ||
cvs!["MACOSX_DEPLOYMENT_TARGET"] | ||
} | ||
} | ||
|
||
fn ios_deployment_target(arch: Arch) -> (u32, u32) { | ||
fn ios_deployment_target(arch: Arch, abi: &str) -> (u32, u32) { | ||
// If you are looking for the default deployment target, prefer `rustc --print deployment-target`. | ||
let (major, minor) = if arch == Arm64e { (14, 0) } else { (10, 0) }; | ||
let (major, minor) = match (arch, abi) { | ||
(Arm64e, _) => (14, 0), | ||
// Mac Catalyst defaults to 13.1 in Clang. | ||
(_, "macabi") => (13, 1), | ||
_ => (10, 0), | ||
}; | ||
from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((major, minor)) | ||
} | ||
|
||
fn mac_catalyst_deployment_target() -> (u32, u32) { | ||
// If you are looking for the default deployment target, prefer `rustc --print deployment-target`. | ||
from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((14, 0)) | ||
} | ||
|
||
pub fn ios_llvm_target(arch: Arch) -> String { | ||
// Modern iOS tooling extracts information about deployment target | ||
// from LC_BUILD_VERSION. This load command will only be emitted when | ||
// we build with a version specific `llvm_target`, with the version | ||
// set high enough. Luckily one LC_BUILD_VERSION is enough, for Xcode | ||
// to pick it up (since std and core are still built with the fallback | ||
// of version 7.0 and hence emit the old LC_IPHONE_MIN_VERSION). | ||
let (major, minor) = ios_deployment_target(arch); | ||
let (major, minor) = ios_deployment_target(arch, ""); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Feels a bit odd to use an empty string when we have There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mostly just tried to follow the existing conventions for the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have opened #124762 to fix part of this now |
||
format!("{}-apple-ios{}.{}.0", arch.target_name(), major, minor) | ||
} | ||
|
||
fn ios_lld_platform_version(arch: Arch) -> String { | ||
let (major, minor) = ios_deployment_target(arch); | ||
format!("{major}.{minor}") | ||
pub fn mac_catalyst_llvm_target(arch: Arch) -> String { | ||
let (major, minor) = ios_deployment_target(arch, "macabi"); | ||
format!("{}-apple-ios{}.{}.0-macabi", arch.target_name(), major, minor) | ||
} | ||
|
||
pub fn ios_sim_llvm_target(arch: Arch) -> String { | ||
let (major, minor) = ios_deployment_target(arch); | ||
let (major, minor) = ios_deployment_target(arch, "sim"); | ||
format!("{}-apple-ios{}.{}.0-simulator", arch.target_name(), major, minor) | ||
} | ||
|
||
|
@@ -347,11 +344,6 @@ fn tvos_deployment_target() -> (u32, u32) { | |
from_set_deployment_target("TVOS_DEPLOYMENT_TARGET").unwrap_or((10, 0)) | ||
} | ||
|
||
fn tvos_lld_platform_version() -> String { | ||
let (major, minor) = tvos_deployment_target(); | ||
format!("{major}.{minor}") | ||
} | ||
|
||
pub fn tvos_llvm_target(arch: Arch) -> String { | ||
let (major, minor) = tvos_deployment_target(); | ||
format!("{}-apple-tvos{}.{}.0", arch.target_name(), major, minor) | ||
|
@@ -367,11 +359,6 @@ fn watchos_deployment_target() -> (u32, u32) { | |
from_set_deployment_target("WATCHOS_DEPLOYMENT_TARGET").unwrap_or((5, 0)) | ||
} | ||
|
||
fn watchos_lld_platform_version() -> String { | ||
let (major, minor) = watchos_deployment_target(); | ||
format!("{major}.{minor}") | ||
} | ||
|
||
pub fn watchos_sim_llvm_target(arch: Arch) -> String { | ||
let (major, minor) = watchos_deployment_target(); | ||
format!("{}-apple-watchos{}.{}.0-simulator", arch.target_name(), major, minor) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know it's not your code, but I wish this function took
impl IntoIterator
. Maybe a future cleanup.