Add rust sanitizer support with vendored deps

This commit is contained in:
Raúl Marín 2024-04-09 17:15:15 +02:00
parent e274bd7b64
commit 88b11f7352
3 changed files with 40 additions and 8 deletions

2
contrib/rust_vendor vendored

@ -1 +1 @@
Subproject commit dfaa5b14e611bc7883a23b4c157275d2a4c63fae Subproject commit e7859fff9fcaa31256ef76afa1b65687f6814dbd

View File

@ -1,24 +1,47 @@
As we have multiple projects we use a workspace to manage them (it's way simpler and leads to less issues). In order As we have multiple projects we use a workspace to manage them (it's way simpler and leads to less issues). In order
to vendor all the dependencies we need to store both the registry and the packages themselves. to vendor all the dependencies we need to store both the registry and the packages themselves.
* First step: (Re)-generate the Cargo.lock file (run under `workspace/`) Note that this includes the exact `std` dependencies for the rustc version used in CI (currently nightly-2023-07-04),
so you need to install `rustup component add rust-src` for the specific version.
* First step: (Re)-generate the Cargo.lock file (run under `workspace/`).
```bash ```bash
$ cargo generate-lockfile cargo generate-lockfile
``` ```
* Generate the local registry: * Generate the local registry:
To install the tool if you don't already have it: Note that we use both commands to vendor both registry and crates. No idea why both are necessary.
* First we need to install the tool if you don't already have it:
```bash ```bash
cargo install --version 0.2.6 cargo-local-registry cargo install --version 0.2.6 cargo-local-registry
``` ```
Now run: * Now add the local packages:
```bash ```bash
cargo local-registry --git --sync Cargo.lock ../../contrib/rust_vendor export CH_TOP_DIR=$(git rev-parse --show-toplevel)
cargo vendor --no-delete --locked ../../contrib/rust_vendor export RUSTC_ROOT=$(rustc --print=sysroot)
cd "$CH_TOP_DIR"/rust/workspace
cargo local-registry --git --sync Cargo.lock "$CH_TOP_DIR"/contrib/rust_vendor
cp "$RUSTC_ROOT"/lib/rustlib/src/rust/Cargo.lock "$RUSTC_ROOT"/lib/rustlib/src/rust/library/std/
cargo local-registry --no-delete --git --sync "$RUSTC_ROOT"/lib/rustlib/src/rust/library/std/Cargo.lock "$CH_TOP_DIR"/contrib/rust_vendor
cp "$RUSTC_ROOT"/lib/rustlib/src/rust/Cargo.lock "$RUSTC_ROOT"/lib/rustlib/src/rust/library/test/
cargo local-registry --no-delete --git --sync "$RUSTC_ROOT"/lib/rustlib/src/rust/library/test/Cargo.lock "$CH_TOP_DIR"/contrib/rust_vendor
cargo vendor --no-delete --locked "$CH_TOP_DIR"/contrib/rust_vendor
cd "$RUSTC_ROOT"/lib/rustlib/src/rust/library/std/
cargo vendor --no-delete "$CH_TOP_DIR"/contrib/rust_vendor
cd "$RUSTC_ROOT"/lib/rustlib/src/rust/library/test/
cargo vendor --no-delete "$CH_TOP_DIR"/contrib/rust_vendor
rm "$RUSTC_ROOT"/lib/rustlib/src/rust/library/std/Cargo.lock "$RUSTC_ROOT"/lib/rustlib/src/rust/library/test/Cargo.lock
cd "$CH_TOP_DIR"/rust/workspace
``` ```
Note that we use both commands to vendor both registry and crates. No idea why both are necessary. The `rustc --print=sysroot` part includes `std` dependencies, required to build with sanitizer flags. It must be kept
in sync with the rustc version used in CI.

View File

@ -1,6 +1,15 @@
[env] [env]
CFLAGS = "@RUST_CFLAGS@"
CXXFLAGS = "@RUST_CXXFLAGS@" CXXFLAGS = "@RUST_CXXFLAGS@"
[build]
rustflags = @RUSTFLAGS@
rustdocflags = @RUSTFLAGS@
@RUSTCWRAPPER@
[unstable]
@RUST_CARGO_BUILD_STD@
[source.crates-io] [source.crates-io]
registry = 'sparse+https://index.crates.io/' registry = 'sparse+https://index.crates.io/'
replace-with = 'local-registry' replace-with = 'local-registry'