[codex] Use only hermetic Swift toolchains - #1816
Draft
dzbarsky wants to merge 1 commit into
Draft
Conversation
Member
|
I think we should move to hermetic toolchains for windows / linux (and maybe provide toolchain entrypoints for the non-hermetic ones?) but for macOS you're not "allowed" to ship app store apps with the swift.org toolchains, so we have to keep using xcode for that. i do also like the idea of dropping the custom toolchain support and instead use macOS hermetic ones for local testing of new toolchains, but that wouldn't support custom build toolchains either so we'd have to still make it work with that |
keith
added a commit
that referenced
this pull request
Jul 24, 2026
Previously hermetic toolchains for the host didn't work correctly
because the shared runtime rpaths wasn't setup correctly. As part of
trying to fix that I implemented static-stdlib support hoping to enable
that by default. Unfortunately the Swift toolchain doesn't ship a static
XCTest version, so you can't use static-stdlib 100% of the time. This
means toolchains that want to support this feature must provide dynamic
and static runtimes, and we pick between those in the rules.
New behavior:
- The hermetic toolchains provide `dynamic_runtime` (previously
`runtime)` and `static_runtime` files
- By default binary targets (besides `swift_test`) default to statically
linking the swift stdlib. This makes these binaries more portable, but
also makes them larger
- `swift_test` targets are always linked dynamically
- When linking dynamically, the shared libraries for all Swift stdlib
libraries are provided for linking, and bazel automatically adds the
correct rpaths
- When not using any of these features (aka the non-hermetic system
toolchain), the behavior is unchanged. We still add a non-hermetic
rpath to the system Swift install directory.
- Defaulting to static linking can be controlled with the
`swift.static_stdlib` feature. Setting it on non-linux platforms does
nothing
- We provide a default sysroot for ubuntu for static linking, as well as
a
default cc_toolchain based on Swift's installed `clang`.
General setup:
```bzl
# MODULE.bazel
swift = use_extension("//swift:extensions.bzl", "swift", dev_dependency = True)
swift.toolchain(
name = "swift_toolchain",
swift_version = "6.3.2",
)
use_repo(swift, "swift_toolchain")
register_toolchains(
"@swift_toolchain//:cc_toolchain_exec_ubuntu22.04",
"@swift_toolchain//:swift_toolchain_exec_ubuntu22.04",
dev_dependency = True,
)
```
This registers the relevant toolchains for Swift and C++
(required for linking even if you don't have any C/C++)
Closes #1686
Work towards #8
Work towards #1813
Work towards #1816
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
swift_autoconfiguration,@rules_swift_local_config, hostswiftclookup, and the Xcode toolchain lookup fallbackswift.toolchainand update repository setup, release notes, and CI configurationMotivation
Host Swift discovery made compiler selection depend on
PATH, installed Xcode toolchains, and repository evaluation environment. The registered Swift compiler should instead be an explicit, versioned Bazel input.User impact
Root modules must declare the
swiftextension, select their build-host platforms, and register@swift_toolchain//:all. Apple builds still require Xcode for SDKs and linking, but Swift compiler actions use the downloaded hermetic toolchain.Validation
buildifierandclang-formatbazel build //examples/apple/objc_interop:objc_interop //test/fixtures/synthesize_interface:synthesized_interfaceexternal/+swift+swift_toolchain_xcode/usr/bin/swiftcThe broader
//test:precompiled_modulessuite is blocked locally because the Xcode 15.4-generated@system_sdkrepository does not containTesting; the directly affected precompiled-module test passes.