-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Apple deployment target, SDK root and SDK version #129432
Labels
C-discussion
Category: Discussion or questions that doesn't represent real issues.
O-apple
Operating system: Apple (macOS, iOS, tvOS, visionOS, watchOS)
Comments
rustbot
added
needs-triage
This issue may need triage. Remove it if it has been sufficiently triaged.
O-apple
Operating system: Apple (macOS, iOS, tvOS, visionOS, watchOS)
labels
Aug 22, 2024
This was referenced Aug 22, 2024
lolbinarycat
added
the
C-discussion
Category: Discussion or questions that doesn't represent real issues.
label
Sep 3, 2024
This was referenced Sep 7, 2024
workingjubilee
added a commit
to workingjubilee/rustc
that referenced
this issue
Sep 9, 2024
…jieyouxu Test codegen when setting deployment target Test our codegen in different scenarios when setting the deployment target. There are many places here where this is still incorrect, these will be fixed in rust-lang#129342, rust-lang#129367 and rust-lang#129369. See rust-lang#129432 for the bigger picture. Tested locally using: ```console ./x test tests/run-make/apple-deployment-target --target="aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7s-apple-ios,i386-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin" ``` The only Apple targets that aren't tested by the above command are: - `arm64e-apple-darwin`, failed to build, see rust-lang/cc-rs#1205. - `armv7k-apple-watchos`, failed to link, see rust-lang#130071. - `arm64e-apple-ios`, failed to link, see rust-lang#130085. - `i686-apple-darwin`, requires a bit of setup and an older machine, see [the docs](https://doc.rust-lang.org/nightly/rustc/platform-support/i686-apple-darwin.html). - `i386-apple-ios` requires you to set `IPHONEOS_DEPLOYMENT_TARGET=10.0` for the test helpers to work, will be fixed by rust-lang/cc-rs#1030. But all of this is as it was before this PR. Fixes rust-lang#47825, since we now have a test that compiles a `dylib` for `aarch64-apple-ios`. Split out from rust-lang#129342, see that for a little bit of the review that this has gone through already. r? petrochenkov `@rustbot` label O-apple
workingjubilee
added a commit
to workingjubilee/rustc
that referenced
this issue
Sep 9, 2024
…jieyouxu Test codegen when setting deployment target Test our codegen in different scenarios when setting the deployment target. There are many places here where this is still incorrect, these will be fixed in rust-lang#129342, rust-lang#129367 and rust-lang#129369. See rust-lang#129432 for the bigger picture. Tested locally using: ```console ./x test tests/run-make/apple-deployment-target --target="aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7s-apple-ios,i386-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin" ``` The only Apple targets that aren't tested by the above command are: - `arm64e-apple-darwin`, failed to build, see rust-lang/cc-rs#1205. - `armv7k-apple-watchos`, failed to link, see rust-lang#130071. - `arm64e-apple-ios`, failed to link, see rust-lang#130085. - `i686-apple-darwin`, requires a bit of setup and an older machine, see [the docs](https://doc.rust-lang.org/nightly/rustc/platform-support/i686-apple-darwin.html). - `i386-apple-ios` requires you to set `IPHONEOS_DEPLOYMENT_TARGET=10.0` for the test helpers to work, will be fixed by rust-lang/cc-rs#1030. But all of this is as it was before this PR. Fixes rust-lang#47825, since we now have a test that compiles a `dylib` for `aarch64-apple-ios`. Split out from rust-lang#129342, see that for a little bit of the review that this has gone through already. r? petrochenkov ``@rustbot`` label O-apple
workingjubilee
added a commit
to workingjubilee/rustc
that referenced
this issue
Sep 9, 2024
…jieyouxu Test codegen when setting deployment target Test our codegen in different scenarios when setting the deployment target. There are many places here where this is still incorrect, these will be fixed in rust-lang#129342, rust-lang#129367 and rust-lang#129369. See rust-lang#129432 for the bigger picture. Tested locally using: ```console ./x test tests/run-make/apple-deployment-target --target="aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7s-apple-ios,i386-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin" ``` The only Apple targets that aren't tested by the above command are: - `arm64e-apple-darwin`, failed to build, see rust-lang/cc-rs#1205. - `armv7k-apple-watchos`, failed to link, see rust-lang#130071. - `arm64e-apple-ios`, failed to link, see rust-lang#130085. - `i686-apple-darwin`, requires a bit of setup and an older machine, see [the docs](https://doc.rust-lang.org/nightly/rustc/platform-support/i686-apple-darwin.html). - `i386-apple-ios` requires you to set `IPHONEOS_DEPLOYMENT_TARGET=10.0` for the test helpers to work, will be fixed by rust-lang/cc-rs#1030. But all of this is as it was before this PR. Fixes rust-lang#47825, since we now have a test that compiles a `dylib` for `aarch64-apple-ios`. Split out from rust-lang#129342, see that for a little bit of the review that this has gone through already. r? petrochenkov ```@rustbot``` label O-apple
rust-timer
added a commit
to rust-lang-ci/rust
that referenced
this issue
Sep 9, 2024
Rollup merge of rust-lang#130068 - madsmtm:deployment-target-test, r=jieyouxu Test codegen when setting deployment target Test our codegen in different scenarios when setting the deployment target. There are many places here where this is still incorrect, these will be fixed in rust-lang#129342, rust-lang#129367 and rust-lang#129369. See rust-lang#129432 for the bigger picture. Tested locally using: ```console ./x test tests/run-make/apple-deployment-target --target="aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7s-apple-ios,i386-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin" ``` The only Apple targets that aren't tested by the above command are: - `arm64e-apple-darwin`, failed to build, see rust-lang/cc-rs#1205. - `armv7k-apple-watchos`, failed to link, see rust-lang#130071. - `arm64e-apple-ios`, failed to link, see rust-lang#130085. - `i686-apple-darwin`, requires a bit of setup and an older machine, see [the docs](https://doc.rust-lang.org/nightly/rustc/platform-support/i686-apple-darwin.html). - `i386-apple-ios` requires you to set `IPHONEOS_DEPLOYMENT_TARGET=10.0` for the test helpers to work, will be fixed by rust-lang/cc-rs#1030. But all of this is as it was before this PR. Fixes rust-lang#47825, since we now have a test that compiles a `dylib` for `aarch64-apple-ios`. Split out from rust-lang#129342, see that for a little bit of the review that this has gone through already. r? petrochenkov ```@rustbot``` label O-apple
RalfJung
pushed a commit
to RalfJung/miri
that referenced
this issue
Sep 10, 2024
Test codegen when setting deployment target Test our codegen in different scenarios when setting the deployment target. There are many places here where this is still incorrect, these will be fixed in rust-lang/rust#129342, rust-lang/rust#129367 and rust-lang/rust#129369. See rust-lang/rust#129432 for the bigger picture. Tested locally using: ```console ./x test tests/run-make/apple-deployment-target --target="aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7s-apple-ios,i386-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin" ``` The only Apple targets that aren't tested by the above command are: - `arm64e-apple-darwin`, failed to build, see rust-lang/cc-rs#1205. - `armv7k-apple-watchos`, failed to link, see rust-lang/rust#130071. - `arm64e-apple-ios`, failed to link, see rust-lang/rust#130085. - `i686-apple-darwin`, requires a bit of setup and an older machine, see [the docs](https://doc.rust-lang.org/nightly/rustc/platform-support/i686-apple-darwin.html). - `i386-apple-ios` requires you to set `IPHONEOS_DEPLOYMENT_TARGET=10.0` for the test helpers to work, will be fixed by rust-lang/cc-rs#1030. But all of this is as it was before this PR. Fixes rust-lang/rust#47825, since we now have a test that compiles a `dylib` for `aarch64-apple-ios`. Split out from rust-lang/rust#129342, see that for a little bit of the review that this has gone through already. r? petrochenkov ```@rustbot``` label O-apple
bors
added a commit
to rust-lang-ci/rust
that referenced
this issue
Sep 12, 2024
… r=jieyouxu Pass deployment target when linking with CC on Apple targets This PR effectively implements what's also being considered in the `cc` crate [here](rust-lang/cc-rs#1030 (comment)), that is: - When linking macOS targets with CC, pass the `-mmacosx-version-min=.` option to specify the desired deployment target. Also, no longer pass `-m32`/`-m64`, these are redundant since we already pass `-arch`. - When linking with CC on iOS, tvOS, watchOS and visionOS, only pass `-target` (we assume for these targets that CC forwards to Clang). This is required to get the linker to emit the correct `LC_BUILD_VERSION` of the final binary. See rust-lang#129432 for more motivation behind this change. r? compiler CC `@BlackHoleFox`
Zalathar
added a commit
to Zalathar/rust
that referenced
this issue
Sep 12, 2024
…nt-targets, r=jieyouxu Fix default/minimum deployment target for Aarch64 simulator targets The minimum that `rustc` encoded did not match [the version in Clang](https://github.com/llvm/llvm-project/blob/llvmorg-18.1.8/llvm/lib/TargetParser/Triple.cpp#L1900-L1932), and that meant that that when linking, Clang ended up bumping the version. See rust-lang#129432 for more motivation behind this change. Specifically, this PR sets the correct deployment target of the following targets: - `aarch64-apple-ios-sim` from 10.0 to 14.0 - `aarch64-apple-tvos-sim` from 10.0 to 14.0 - `aarch64-apple-watchos-sim` from 5.0 to 7.0 - `aarch64-apple-ios-macabi` from 13.1 to 14.0 I have chosen not to document the `-sim` changes in the platform support docs, as it is fundamentally uninteresting; the normal targets (e.g. `aarch64-apple-ios`) still have the same deployment target, and that's what developers should actually target. r? compiler CC `@BlackHoleFox`
Zalathar
added a commit
to Zalathar/rust
that referenced
this issue
Sep 12, 2024
…nt-targets, r=jieyouxu Fix default/minimum deployment target for Aarch64 simulator targets The minimum that `rustc` encoded did not match [the version in Clang](https://github.com/llvm/llvm-project/blob/llvmorg-18.1.8/llvm/lib/TargetParser/Triple.cpp#L1900-L1932), and that meant that that when linking, Clang ended up bumping the version. See rust-lang#129432 for more motivation behind this change. Specifically, this PR sets the correct deployment target of the following targets: - `aarch64-apple-ios-sim` from 10.0 to 14.0 - `aarch64-apple-tvos-sim` from 10.0 to 14.0 - `aarch64-apple-watchos-sim` from 5.0 to 7.0 - `aarch64-apple-ios-macabi` from 13.1 to 14.0 I have chosen not to document the `-sim` changes in the platform support docs, as it is fundamentally uninteresting; the normal targets (e.g. `aarch64-apple-ios`) still have the same deployment target, and that's what developers should actually target. r? compiler CC `@BlackHoleFox`
rust-timer
added a commit
to rust-lang-ci/rust
that referenced
this issue
Sep 12, 2024
Rollup merge of rust-lang#129367 - madsmtm:fix-apple-aarch64-deployment-targets, r=jieyouxu Fix default/minimum deployment target for Aarch64 simulator targets The minimum that `rustc` encoded did not match [the version in Clang](https://github.com/llvm/llvm-project/blob/llvmorg-18.1.8/llvm/lib/TargetParser/Triple.cpp#L1900-L1932), and that meant that that when linking, Clang ended up bumping the version. See rust-lang#129432 for more motivation behind this change. Specifically, this PR sets the correct deployment target of the following targets: - `aarch64-apple-ios-sim` from 10.0 to 14.0 - `aarch64-apple-tvos-sim` from 10.0 to 14.0 - `aarch64-apple-watchos-sim` from 5.0 to 7.0 - `aarch64-apple-ios-macabi` from 13.1 to 14.0 I have chosen not to document the `-sim` changes in the platform support docs, as it is fundamentally uninteresting; the normal targets (e.g. `aarch64-apple-ios`) still have the same deployment target, and that's what developers should actually target. r? compiler CC `@BlackHoleFox`
github-actions bot
pushed a commit
to rust-lang/miri
that referenced
this issue
Sep 14, 2024
Pass deployment target when linking with CC on Apple targets This PR effectively implements what's also being considered in the `cc` crate [here](rust-lang/cc-rs#1030 (comment)), that is: - When linking macOS targets with CC, pass the `-mmacosx-version-min=.` option to specify the desired deployment target. Also, no longer pass `-m32`/`-m64`, these are redundant since we already pass `-arch`. - When linking with CC on iOS, tvOS, watchOS and visionOS, only pass `-target` (we assume for these targets that CC forwards to Clang). This is required to get the linker to emit the correct `LC_BUILD_VERSION` of the final binary. See rust-lang/rust#129432 for more motivation behind this change. r? compiler CC `@BlackHoleFox`
Zalathar
added a commit
to Zalathar/rust
that referenced
this issue
Sep 14, 2024
…eyouxu Fix `SDKROOT` ignore on macOS `rustc` has code to detect when `SDKROOT` is obviously set for the wrong platform, so that it can choose to ignore it. This is a pretty important feature for Cargo build scripts and proc macros, since you will often have `SDKROOT` set to an iOS platform there. However, the code was checking for an old SDK version name `"macosx10.15"` that was previously configured by `add_apple_sdk`, but nowadays configured to the correct `"macosx"`. I think this error was introduced in part rust-lang#77202 and in rust-lang#100286. Fixes part of rust-lang#80817 (linking with `-Clinker=ld` now works), though more work is still needed in this area, see also rust-lang#129432. `@rustbot` label O-macos A-cross
Zalathar
added a commit
to Zalathar/rust
that referenced
this issue
Sep 14, 2024
…eyouxu Fix `SDKROOT` ignore on macOS `rustc` has code to detect when `SDKROOT` is obviously set for the wrong platform, so that it can choose to ignore it. This is a pretty important feature for Cargo build scripts and proc macros, since you will often have `SDKROOT` set to an iOS platform there. However, the code was checking for an old SDK version name `"macosx10.15"` that was previously configured by `add_apple_sdk`, but nowadays configured to the correct `"macosx"`. I think this error was introduced in part rust-lang#77202 and in rust-lang#100286. Fixes part of rust-lang#80817 (linking with `-Clinker=ld` now works), though more work is still needed in this area, see also rust-lang#129432. ``@rustbot`` label O-macos A-cross
rust-timer
added a commit
to rust-lang-ci/rust
that referenced
this issue
Sep 14, 2024
Rollup merge of rust-lang#130334 - madsmtm:macos-sdkroot-ignore, r=jieyouxu Fix `SDKROOT` ignore on macOS `rustc` has code to detect when `SDKROOT` is obviously set for the wrong platform, so that it can choose to ignore it. This is a pretty important feature for Cargo build scripts and proc macros, since you will often have `SDKROOT` set to an iOS platform there. However, the code was checking for an old SDK version name `"macosx10.15"` that was previously configured by `add_apple_sdk`, but nowadays configured to the correct `"macosx"`. I think this error was introduced in part rust-lang#77202 and in rust-lang#100286. Fixes part of rust-lang#80817 (linking with `-Clinker=ld` now works), though more work is still needed in this area, see also rust-lang#129432. ``@rustbot`` label O-macos A-cross
saethlin
removed
the
needs-triage
This issue may need triage. Remove it if it has been sufficiently triaged.
label
Sep 26, 2024
This was referenced Sep 28, 2024
Open
matthiaskrgr
added a commit
to matthiaskrgr/rust
that referenced
this issue
Oct 2, 2024
…r=jieyouxu Apple: Do not specify an SDK version in `rlib` object files This was added in rust-lang#114114, but is unnecessary, since it ends up being overwritten when linking anyhow, and it feels wrong to embed some arbitrary SDK version in here. The object files produced by LLVM also do not set this, and the tooling shows `n/a` when it's `0`, so it seems to genuinely be optional in object files. I've also added a test for the different places the SDK version shows up, and documented a bit more in the code how SDK versions work. See rust-lang#129432 for the bigger picture. Tested with (excludes the same few targets as in rust-lang#130435): ```console ./x test tests/run-make/apple-sdk-version --target aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7k-apple-watchos,armv7s-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin IPHONEOS_DEPLOYMENT_TARGET=10.0 ./x test tests/run-make/apple-sdk-version --target=i386-apple-ios ``` CC `@BlackHoleFox,` you [originally commented on these values](rust-lang#114114 (comment)). `@rustbot` label O-apple
rust-timer
added a commit
to rust-lang-ci/rust
that referenced
this issue
Oct 2, 2024
Rollup merge of rust-lang#131016 - madsmtm:no-sdk-version-in-object, r=jieyouxu Apple: Do not specify an SDK version in `rlib` object files This was added in rust-lang#114114, but is unnecessary, since it ends up being overwritten when linking anyhow, and it feels wrong to embed some arbitrary SDK version in here. The object files produced by LLVM also do not set this, and the tooling shows `n/a` when it's `0`, so it seems to genuinely be optional in object files. I've also added a test for the different places the SDK version shows up, and documented a bit more in the code how SDK versions work. See rust-lang#129432 for the bigger picture. Tested with (excludes the same few targets as in rust-lang#130435): ```console ./x test tests/run-make/apple-sdk-version --target aarch64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-macabi,aarch64-apple-ios-sim,aarch64-apple-tvos,aarch64-apple-tvos-sim,aarch64-apple-visionos,aarch64-apple-visionos-sim,aarch64-apple-watchos,aarch64-apple-watchos-sim,arm64_32-apple-watchos,armv7k-apple-watchos,armv7s-apple-ios,x86_64-apple-darwin,x86_64-apple-ios,x86_64-apple-ios-macabi,x86_64-apple-tvos,x86_64-apple-watchos-sim,x86_64h-apple-darwin IPHONEOS_DEPLOYMENT_TARGET=10.0 ./x test tests/run-make/apple-sdk-version --target=i386-apple-ios ``` CC `@BlackHoleFox,` you [originally commented on these values](rust-lang#114114 (comment)). `@rustbot` label O-apple
This was referenced Oct 9, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
C-discussion
Category: Discussion or questions that doesn't represent real issues.
O-apple
Operating system: Apple (macOS, iOS, tvOS, visionOS, watchOS)
I've been looking into our handling of the deployment targets and SDK paths on Apple platforms, and I've found it to be somewhat inconsistent and in some places outright incorrect. I'm opening this issue to give context to the PRs I've been (and will be) opening to fix it.
Deployment targets
The "deployment target" is the minimum operating system version that the final binary will work on. It can be configured with the
*_DEPLOYMENT_TARGET
environment variables, and setting it allows us to enable certain optimizations. Currently this is done primarily in the codegen backend LLVM, though it could also be done by Cranelift or GCC if they wanted to, and also bystd
or other library crates.By default, Clang takes the default deployment target from the SDK, which is usually quite high.
rustc
chooses a different approach here, and compiles by default for the minimum supported version, which I believe is the right choice, as it forces users to use the correct*_DEPLOYMENT_TARGET
if they need to use newer features.I've aligned the default/minimum versions of this variable with Clang in #129367, and made sure we rebuild when the user changes it in #129342.
SDKROOT
The SDK root contains system header files and linker Text-Based stub files (
.tbd
). The SDK path is passed to the static linker (ld
) so that it can tell which system library a given symbol comes from, and in turn write this information in the final Mach-O, so that it can be read by the dynamic linker (dyld
) at runtime.System libraries have been "hidden away" in the
dyld
cache since macOS 11 Big Sur, and since Rust does not distribute the linker stubs (unlike e.g.zig cc
does on macOS), the SDK root is effectively always required to link anything (whether it's a cross-compile or not).The correct way to invoke e.g. Clang, then, is using
xcrun
to pass the desired SDK in theSDKROOT
environment variable, e.g.:$ xcrun --sdk iphoneos clang -target aarch64-apple-ios-macabi foo.c -o foo
This is not the full story, however: The binary at
/usr/bin/clang
is actually a trampoline that (effectively) invokesxcrun
and then calls out to the actualclang
binary distributed with Xcode, which means that a plainclang foo.c
command usually works, at least when compiling for the host macOS. (In the case where you've compiled Clang from source instead, then this won't work, and you have to provide the SDK root).rustc
is in a bit of a trickier position than Clang though:/usr/bin
, and as such don't get the affordances of automatically havingSDKROOT
set.rustc
will be invoked for different targets, but with the sameSDKROOT
. E.g. compiling build scripts when running Cargo under Xcode,SDKROOT
will usually be set for an iOS SDK, while the build script will be targetting the host macOS.Some of this already works (and kudos to the people that have implemented this in the past), but it's currently incomplete, which means we as a stop-gap end up shelling out to
xcrun
to let it figure out a SDK root for us. I believe thatrustc
should, when linking, re-implement the SDK discovery logic thatxcrun
does, see #131433, and should always set the SDK root when invoking the linker, see #131477.SDK version and
LC_BUILD_VERSION
The SDK root is also used for something else in Clang: To find the SDK version, and embed it, together with the deployment target, in the
LC_BUILD_VERSION
of the produced (Mach-O) binary. It is quite important that this load command is present, otherwise the linker may refuse to link the binary (see #114114 and #111384), as it cannot reliably figure out the target OS and ABI.The SDK version is used by
dyld
to emit more errors on newer binaries (see here and here), but also by system frameworks internally to change behaviour when compiled for an older SDK, for example-[NSView wantsBestResolutionOpenGLSurface]
. I suspect the deployment target to be used to similar purposes.#129369 ensures that we consistently set the deployment target for all produced binaries.
The SDK version is set differently by
rustc
depending on what kind of binary is being produced:0
orn/a
).0
in Apple: Do not specify an SDK version inrlib
object files #131016 to match LLVM.cc
: Give Clang the SDK root, and let them figure it out.ld
: Set to be equal to the deployment target. I think a better approach here would be to read the SDK version from theSDKSettings.json
, to match what Clang does. I have implemented this in WIP: Parse Apple SDK versions #131478.Conclusion
Within the constraints that we have (Cargo is target agnostic, and won't deal with this, though it's better positioned to do so IMO), I think that the approach that
rustc
takes is a fairly good, and would be even better with a few fixes ;).Just to clarify, in the end,
rustc
's dependency on these variables (i.e. the effect on incremental compilation) would be roughly:*_DEPLOYMENT_TARGET
: Codegen.SDKROOT
/DEVELOPER_DIR
//var/db/xcode_select_link
/...: Linking.That is, ideally
cargo check
shouldn't be influenced by them at all, andcargo build
only re-link the last binaries if the SDK root changed, and should recompile all binaries if the deployment target changed.We will also need to ensure that the
cc
crate also handles all of this correctly too (see for example #128419 for a current issue) (it's much more difficult there, since they have backwards compatibility issues).@rustbot label O-apple
CC the Apple experts I know of:
@simlay, @BlackHoleFox, @thomcc, @shepmaster
The text was updated successfully, but these errors were encountered: