Skip to content

Improve hermetic toolchain support, add static stdlib support - #1853

Merged
keith merged 25 commits into
mainfrom
ks/use-hermetic-toolchain-on-linux-ci
Jul 24, 2026
Merged

Improve hermetic toolchain support, add static stdlib support#1853
keith merged 25 commits into
mainfrom
ks/use-hermetic-toolchain-on-linux-ci

Conversation

@keith

@keith keith commented Jul 10, 2026

Copy link
Copy Markdown
Member

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:

# 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

@keith
keith force-pushed the ks/use-hermetic-toolchain-on-linux-ci branch from ea8fc68 to d6a1072 Compare July 10, 2026 23:47
@keith keith changed the title Use hermetic toolchain on Linux CI Improve hermetic toolchain support, add static stdlib support Jul 24, 2026
@keith
keith marked this pull request as ready for review July 24, 2026 03:19
@keith
keith merged commit ba17849 into main Jul 24, 2026
16 checks passed
@keith
keith deleted the ks/use-hermetic-toolchain-on-linux-ci branch July 24, 2026 03:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants