Skip to content

[codex] Use only hermetic Swift toolchains - #1816

Draft
dzbarsky wants to merge 1 commit into
bazelbuild:mainfrom
dzbarsky:codex/hermetic-swiftc-only
Draft

[codex] Use only hermetic Swift toolchains#1816
dzbarsky wants to merge 1 commit into
bazelbuild:mainfrom
dzbarsky:codex/hermetic-swiftc-only

Conversation

@dzbarsky

Copy link
Copy Markdown
Contributor

Summary

  • remove swift_autoconfiguration, @rules_swift_local_config, host swiftc lookup, and the Xcode toolchain lookup fallback
  • generate Linux and Apple Swift toolchains from the downloaded swift.org archive, while continuing to use Xcode for Apple SDK and linker metadata
  • add explicit platform selection to swift.toolchain and update repository setup, release notes, and CI configuration

Motivation

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 swift extension, 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

  • buildifier and clang-format
  • generated documentation diff tests
  • focused Swift toolchain, precompiled-module, and synthesized-interface tests
  • bazel build //examples/apple/objc_interop:objc_interop //test/fixtures/synthesize_interface:synthesized_interface
  • action inspection confirmed external/+swift+swift_toolchain_xcode/usr/bin/swiftc

The broader //test:precompiled_modules suite is blocked locally because the Xcode 15.4-generated @system_sdk repository does not contain Testing; the directly affected precompiled-module test passes.

@keith keith added this to the 4.0.0 milestone Jun 23, 2026
@keith

keith commented Jun 23, 2026

Copy link
Copy Markdown
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants