bazelbuild / bazelbuild/rules_rust

Is rules_rust adding too many dependencies to the rustc CLI?

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

Description

I am comparing what cargo and rules_rust generate in terms of the rustc command line.

I setup a 1:1 comparison where each one depends one very large dependency (datafusion).

The difference in command line is massive. For instance, it appears that every transitive dependency is added to the command line when using the Bazel rules. I was expecting them to be close but that our bazel rules would show significantly more input files due to the toolchain dependencies (which do not show up in the Cargo output).

## Library

### Cargo
`Cargo.toml`
```toml
[package]
name = "rustc_lib_test"
version = "0.1.0"
edition = "2021"

[dependencies]
datafusion = "43.0.0"
```

`lib.rs`
```rust
pub fn add(left: u64, right: u64) -> u64 {
left + right
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
```

`cargo build --verbose` to see the output:
```
Compiling rustc_lib_test v0.1.0 (/home/sschwartz/dev/playground/rustc_lib_test)
Running `/home/sschwartz/.rustup/toolchains/1.80-x86_64-unknown-linux-gnu/bin/rustc --crate-name rustc_lib_test --edition=2021 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=207 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs)' --check-cfg 'cfg(feature, values())' -C metadata=f7243f4cb3e2af92 -C extra-filename=-f7243f4cb3e2af92 --out-dir /home/sschwartz/dev/playground/rustc_lib_test/target/debug/deps -C incremental=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/incremental -L dependency=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/deps --extern datafusion=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/deps/libdatafusion-718e7861d77c65d0.rmeta -L native=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/build/bzip2-sys-286f47a460bead30/out/lib -L native=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/build/lzma-sys-9c91f5e4b289e14a/out -L native=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/build/zstd-sys-6b9356312b31bfce/out -L native=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/build/blake3-b73b7dfc07d07f11/out -L native=/home/sschwartz/dev/playground/rustc_lib_test/target/debug/build/blake3-b73b7dfc07d07f11/out`
```

### Bazel

`BUILD.bazel`
```starlark
load("@rules_rust//rust:defs.bzl", "rust_library")

package(default_visibility = ["//visibility:public"])

rust_library(
name = "bazel_rustc_lib_test",
srcs = ["lib.rs"],
deps = [
"@crates_io//:datafusion",
],
)
```

`lib.rs`
```rust
pub fn add(left: u64, right: u64) -> u64 {
left + right
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
```

`aquery` to get the output:
```
bazel aquery //tools/testing:bazel_rustc_lib_test > rustc_lib_test.aquery.dbg.txt
```

[rustc_lib_test.aquery.dbg.txt](https://github.com/user-attachments/files/17851165/rustc_lib_test.aquery.dbg.txt)

## Binary

### Cargo
`Cargo.toml`
```toml
[package]
name = "rustc_bin_test"
version = "0.1.0"
edition = "2021"

[dependencies]
datafusion = "43.0.0"
```

`main.rs`
```rust
fn main() {
println!("Hello, world!");
}
```

`cargo build --verbose` to see the output:
```
Compiling rustc_bin_test v0.1.0 (/home/sschwartz/dev/playground/rustc_bin_test)
Running `/home/sschwartz/.rustup/toolchains/1.80-x86_64-unknown-linux-gnu/bin/rustc --crate-name rustc_bin_test --edition=2021 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=98 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg 'cfg(docsrs)' --check-cfg 'cfg(feature, values())' -C metadata=b9ced09a3af3e361 -C extra-filename=-b9ced09a3af3e361 --out-dir /home/sschwartz/dev/playground/rustc_bin_test/target/debug/deps -C incremental=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/incremental -L dependency=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/deps --extern datafusion=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/deps/libdatafusion-718e7861d77c65d0.rlib -L native=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/build/bzip2-sys-286f47a460bead30/out/lib -L native=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/build/lzma-sys-9c91f5e4b289e14a/out -L native=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/build/zstd-sys-6b9356312b31bfce/out -L native=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/build/blake3-b73b7dfc07d07f11/out -L native=/home/sschwartz/dev/playground/rustc_bin_test/target/debug/build/blake3-b73b7dfc07d07f11/out`
```

### Bazel

`BUILD.bazel`
```starlark
load("@rules_rust//rust:defs.bzl", "rust_binary")

package(default_visibility = ["//visibility:public"])

rust_binary(
name = "bazel_rustc_bin_test",
srcs = ["rustc_test.rs"],
deps = [
"@crates_io//:datafusion",
],
)
```
`rustc_test.rs`
```rust
fn main() {
println!("Hello, world!");
}
```

`aquery` to get the output:
```
bazel aquery //tools/testing:bazel_rustc_bin_test > rustc_bin_test.aquery.dbg.txt
```
[rustc_bin_test.aquery.dbg.txt](https://github.com/user-attachments/files/17851163/rustc_bin_test.aquery.dbg.txt)

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.