bazelbuild / bazelbuild/rules_rust

`dev_components` in `rust_register_toolchains` doesn't work for all toolchains

Open
#2,543 0 comments 0 reactions 0 assignees View on GitHub
needs-triage
Dominant language
Starlark
Stars
843
Forks
651
Avg merge
2d 18h
Merged PRs (30d)
15

Description

When using `rust_register_toolchains`, if I use `dev_components = True` and ios (or android) in `extra_target_triples`, I get this error during a `bazel build`:

```
ERROR: An error occurred during the fetch of repository 'rust_linux_x86_64__aarch64-linux-android__nightly_tools':
Traceback (most recent call last):
File "/home/runner/.cache/bazel/_bazel_runner/1fa4b8b6e5f813a6f30004917b5fca72/external/rules_rust/rust/repositories.bzl", line 374, column 31, in _rust_toolchain_tools_repository_impl
load_rustc_dev_nightly(ctx, target_triple)
File "/home/runner/.cache/bazel/_bazel_runner/1fa4b8b6e5f813a6f30004917b5fca72/external/rules_rust/rust/private/repository_utils.bzl", line 582, column 24, in load_rustc_dev_nightly
load_arbitrary_tool(
File "/home/runner/.cache/bazel/_bazel_runner/1fa4b8b6e5f813a6f30004917b5fca72/external/rules_rust/rust/private/repository_utils.bzl", line 733, column 42, in load_arbitrary_tool
result = ctx.download_and_extract(
Error in download_and_extract: java.io.IOException: Error downloading [https://static.rust-lang.org/dist/2024-02-22/rustc-dev-nightly-aarch64-linux-android.tar.xz] to /home/runner/.cache/bazel/_bazel_runner/1fa4b8b6e5f813a6f30004917b5fca72/external/rust_linux_x86_64__aarch64-linux-android__nightly_tools/temp11823504000632298494/rustc-dev-nightly-aarch64-linux-android.tar.xz: GET returned 404 Not Found
```

Here is how I use rust_rules:
```py
http_archive(
name = "rules_rust",
integrity = "sha256-ZQGWDD5NoySV0eEAfe0HaaU0yxlcMN6jaqVPnYo/A2E=",
urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.38.0/rules_rust-v0.38.0.tar.gz"],
)

load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")

rules_rust_dependencies()

rust_register_toolchains(
edition = "2021",
extra_target_triples = [
"aarch64-apple-ios-sim",
"aarch64-apple-ios",
"aarch64-linux-android",
"x86_64-unknown-linux-gnu",
"x86_64-apple-ios",
"wasm32-unknown-unknown",
],
rustfmt_version = "nightly/2024-02-22",
versions = ["nightly/2024-02-22"],
dev_components=True,
)
```

I added some prints in `rust/repositories.bzl` and I discovered that 49 toolchains were being declared:

```
rust_darwin_aarch64__aarch64-apple-darwin__nightly
rust_darwin_aarch64__aarch64-apple-ios-sim__nightly
rust_darwin_aarch64__aarch64-apple-ios__nightly
rust_darwin_aarch64__aarch64-linux-android__nightly
rust_darwin_aarch64__x86_64-unknown-linux-gnu__nightly
rust_darwin_aarch64__x86_64-apple-ios__nightly
rust_darwin_aarch64__wasm32-unknown-unknown__nightly
rust_windows_aarch64__aarch64-pc-windows-msvc__nightly
rust_windows_aarch64__aarch64-apple-ios-sim__nightly
rust_windows_aarch64__aarch64-apple-ios__nightly
rust_windows_aarch64__aarch64-linux-android__nightly
rust_windows_aarch64__x86_64-unknown-linux-gnu__nightly
rust_windows_aarch64__x86_64-apple-ios__nightly
rust_windows_aarch64__wasm32-unknown-unknown__nightly
rust_linux_aarch64__aarch64-unknown-linux-gnu__nightly
rust_linux_aarch64__aarch64-apple-ios-sim__nightly
rust_linux_aarch64__aarch64-apple-ios__nightly
rust_linux_aarch64__aarch64-linux-android__nightly
rust_linux_aarch64__x86_64-unknown-linux-gnu__nightly
rust_linux_aarch64__x86_64-apple-ios__nightly
rust_linux_aarch64__wasm32-unknown-unknown__nightly
rust_darwin_x86_64__x86_64-apple-darwin__nightly
rust_darwin_x86_64__aarch64-apple-ios-sim__nightly
rust_darwin_x86_64__aarch64-apple-ios__nightly
rust_darwin_x86_64__aarch64-linux-android__nightly
rust_darwin_x86_64__x86_64-unknown-linux-gnu__nightly
rust_darwin_x86_64__x86_64-apple-ios__nightly
rust_darwin_x86_64__wasm32-unknown-unknown__nightly
rust_windows_x86_64__x86_64-pc-windows-msvc__nightly
rust_windows_x86_64__aarch64-apple-ios-sim__nightly
rust_windows_x86_64__aarch64-apple-ios__nightly
rust_windows_x86_64__aarch64-linux-android__nightly
rust_windows_x86_64__x86_64-unknown-linux-gnu__nightly
rust_windows_x86_64__x86_64-apple-ios__nightly
rust_windows_x86_64__wasm32-unknown-unknown__nightly
rust_freebsd_x86_64__x86_64-unknown-freebsd__nightly
rust_freebsd_x86_64__aarch64-apple-ios-sim__nightly
rust_freebsd_x86_64__aarch64-apple-ios__nightly
rust_freebsd_x86_64__aarch64-linux-android__nightly
rust_freebsd_x86_64__x86_64-unknown-linux-gnu__nightly
rust_freebsd_x86_64__x86_64-apple-ios__nightly
rust_freebsd_x86_64__wasm32-unknown-unknown__nightly
rust_linux_x86_64__x86_64-unknown-linux-gnu__nightly
rust_linux_x86_64__aarch64-apple-ios-sim__nightly
rust_linux_x86_64__aarch64-apple-ios__nightly
rust_linux_x86_64__aarch64-linux-android__nightly
rust_linux_x86_64__x86_64-unknown-linux-gnu__nightly
rust_linux_x86_64__x86_64-apple-ios__nightly
rust_linux_x86_64__wasm32-unknown-unknown__nightly
```

Which is the cartesian product between my `extra_target_triples` and rules_rust's `DEFAULT_TOOLCHAIN_TRIPLES`

I was able to fix my problem by patching the rules_rust `http_archive` this way:
```diff
diff --git a/rust/repositories.bzl b/rust/repositories.bzl
index 610baa79..d50b303d 100644
--- a/rust/repositories.bzl
+++ b/rust/repositories.bzl
@@ -978,13 +978,17 @@ def rust_repository_set(
elif type(extra_target_triples) == "dict":
target_compatible_with = extra_target_triples.get(toolchain.target_triple)

+ dev_components_for_toolchain = dev_components
+ if '-ios_' in toolchain.name or '-android_' in toolchain.name:
+ dev_components_for_toolchain = False
+
all_toolchain_names.append(rust_toolchain_repository(
name = toolchain.name,
allocator_library = allocator_library,
global_allocator_library = global_allocator_library,
auth = auth,
channel = toolchain.channel.name,
- dev_components = dev_components,
+ dev_components = dev_components_for_toolchain,
edition = edition,
exec_triple = exec_triple,
extra_exec_rustc_flags = extra_exec_rustc_flags,
```

Is there a way for me to avoid that problem without relying on a rules_rust patch?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.