Skip to content

Add strip_level_select for per-target stripping - #4167

Open
nmattia wants to merge 1 commit into
bazelbuild:mainfrom
nmattia:nm-strip-level-select
Open

Add strip_level_select for per-target stripping#4167
nmattia wants to merge 1 commit into
bazelbuild:mainfrom
nmattia:nm-strip-level-select

Conversation

@nmattia

@nmattia nmattia commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes #3730

This adds a new tag class, strip_level_select, which allows specifying the strip level for a collection of triples (inspired by annotation_select in the crate extension).

@nmattia

nmattia commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

@illicitonion I wasn't sure about the exact semantics of strip_level = None when registering the toolchains, and I'm not 100% sure what it expects (should all triples be listed?). Let me know your thoughts!

Closes bazelbuild#3730

This adds a new tag class, `strip_level_select`, which allows specifying
the strip level for a collection of triples (inspired by
`annotation_select` in the `crate` extension).
@nmattia
nmattia force-pushed the nm-strip-level-select branch from f23049b to f8f382c Compare July 24, 2026 12:27
pull Bot pushed a commit to bit-cook/ic that referenced this pull request Jul 27, 2026
This drops our local rules_rust patch which we used to hardcode strip
values, and instead use the new `strip_level_select` tag:

bazelbuild/rules_rust#4167
@illicitonion
illicitonion self-requested a review September 2, 2026 15:48
pull Bot pushed a commit to mikeyhodl/ic that referenced this pull request Sep 11, 2026
Upgrades `rules_rust` from 0.71.3 to 0.74.0, stops depending on the
`dfinity/rules_rust` fork, and drops two local patches that 0.74.0 makes
redundant.

## Drops the fork

The pin was an `archive_override` on `dfinity/rules_rust`, whose sole
commit adds a `strip_level_select` tag class
([bazelbuild/rules_rust#4167](bazelbuild/rules_rust#4167),
still open upstream). That tag's only caller was removed in 9e29205
when hermetic-llvm replaced zig cc — clang emits deterministic debug
info, so the `strip_level_select(none)` workaround went away with it.
`strip_level` now appears nowhere in the repo outside the patch file, so
the fork is dead code.

```diff
-bazel_dep(name = "rules_rust", version = "0.71.3")
-archive_override(
+bazel_dep(name = "rules_rust", version = "0.74.0")
+single_version_override(
     module_name = "rules_rust",
-    integrity = "sha256-5GXwZtp5VlNxMI+dolYYxhyhG5f5ReZ5qz30gAbPsrg=",
     patch_strip = 1,
     patches = ["//bazel:rules_rust_static_runtime.patch"],
-    strip_prefix = "rules_rust-f8f382c7e351a797242ce4a92262342f8994e265",
-    type = "tar.gz",
-    urls = ["https://codeload.github.com/dfinity/rules_rust/tar.gz/f8f382c7e351a797242ce4a92262342f8994e265"],
 )
```

No integrity hash, no `strip_prefix`, no URL, and no fork to rebase on
every future release — a bump is now a one-line version change. Checked
before switching: BCR's `rules_rust/0.74.0/source.json` carries no
patches of its own, and `rules_rust` is depended on **only by the root
module** (`bazel mod explain rules_rust`), so nothing else can pull MVS
off 0.74.0.

## Regenerates `bazel/rules_rust_static_runtime.patch`

The `rust_doc_test` half of the patch is **upstream as of 0.74.0**
([dfinity#4220](bazelbuild/rules_rust#4220), commit
`ed7afd2fc`) and is a superset of ours — it threads the runtime libs
through `rustdoc_compile_action`'s return value rather than recomputing
them, adds an empty-lib-root guard we lacked (an empty root would emit
`--strip_substring=/`, which the writer applies as a plain string
replacement), and ships a unit test. So the patch no longer carries it.

What remains is the dylib/cdylib static-runtime preference, which is
still not upstream and has no replacement mechanism (no new `unwindlib`,
toolchain or rule attribute controls C++ runtime linkage in this range).
dfinity#4220 also introduced a **new** site in `rustdoc.bzl` that picks the
dynamic runtime for dylib/cdylib, which the old patch would have missed
— leaving a cdylib doc test with the static runtime in its action inputs
but the dynamic runtime's names in its `-l` flags. The policy therefore
now lives in a single exported `cc_runtime_libs` helper, shared by all
three sites that choose a runtime (`collect_inputs`,
`_add_native_link_flags`, and rustdoc's doc-test link flags), so inputs
and link flags stay consistent by construction.

The patch applies with **zero fuzz and zero offset** (`git apply
--check` and `patch -F0`), verified against the release tarball
specifically, not just the git tag.

## Drops `bazel/rustix.patch`

That patch deleted rustix's `can_compile()` probe artifact from
`OUT_DIR` — which rules_rust captures as a cacheable
`CargoBuildScriptRun` output — because the artifact was not
byte-reproducible. 0.74.0 makes it unnecessary:
[dfinity#4202](bazelbuild/rules_rust#4202) adds
`--remap-path-prefix=${pwd}=.` to the `CARGO_ENCODED_RUSTFLAGS` that
`cargo_build_script` passes to build scripts, and rustix's
`can_compile()` forwards all of them to its probe `rustc`.

## Follow-ups (not in this PR)

- The remaining dylib/cdylib half of the static-runtime patch has no
upstream issue. Opening one would let it retire the way the doc-test
half just did — though upstream deliberately links the dynamic runtime
for shared libraries (its own `runtime_libs_test/shared_library` asserts
exactly that), so it would need a toolchain-level opt-in rather than a
straight behaviour change.
- `.claude/CLAUDE.md`'s repin trigger could mention the `rules_rust`
pin, since a bump on its own requires `./bin/bazel-pin.sh --force`.
- If the rustix probe ever regresses (a toolchain bump, or anything
adding a remap-scope rustflag), the fix is rules_rust 0.74.0's new
`remove_nondeterministic_out_dir_files`: appending
`rustix_test_can_compile` to
`--@rules_rust//cargo/settings:out_dir_volatile_file_basenames`
(re-listing its seven defaults, since the flag replaces rather than
extends) empties `OUT_DIR` again with no crate patch and no repin. That,
not a resurrected `bazel/rustix.patch`.
- Worth an upstream issue: `cargo_build_script` could pass the same
`${output_base}`/`${exec_root}` remaps that `rustc.bzl` already passes,
closing the symlink gap described above.
- The `dfinity/rules_rust` fork branches can be deleted once this
merges; nothing will reference the fork any more.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

Cannot specify per-target strip_level in MODULE.bazel

1 participant