rust-lang/cargo

Build script not rerun when target rustflags change

Nemo157 opened this issue · 0 comments

Problem

Some crates such as anyhow utilize the CARGO_ENCODED_RUSTFLAGS to customize their build. When a build is performed with only the target rustflags changed the build script does not get rerun, so the build customization from it is inconsistent with the build environment for the library itself.

Steps

> cargo dl -e anyhow@=1.0.75 && cd anyhow-1.0.75
                          anyhow@=1.0.75   extracted anyhow 1.0.75 to anyhow-1.0.75

> cargo build --target x86_64-unknown-linux-gnu -v
   Compiling anyhow v1.0.75 (/tmp/tmp.7WdQVxA9Y6/anyhow-1.0.75)
     Running `rustc --crate-name build_script_build --edition=2018 build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=ec4d899bd2351612 -C extra-filename=-ec4d899bd2351612 --out-dir /run/user/1000/cargo-home/target/shared/debug/build/anyhow-ec4d899bd2351612 -C incremental=/run/user/1000/cargo-home/target/shared/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps`
     Running `/run/user/1000/cargo-home/target/shared/debug/build/anyhow-ec4d899bd2351612/build-script-build`
     Running `rustc --crate-name anyhow --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=7ea480d8b9426c5d -C extra-filename=-7ea480d8b9426c5d --out-dir /run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps --cfg backtrace`
    Finished dev [unoptimized + debuginfo] target(s) in 0.46s

> RUSTFLAGS=-Zallow-features= cargo build --target x86_64-unknown-linux-gnu -v
       Dirty anyhow v1.0.75 (/tmp/tmp.7WdQVxA9Y6/anyhow-1.0.75): the rustflags changed
   Compiling anyhow v1.0.75 (/tmp/tmp.7WdQVxA9Y6/anyhow-1.0.75)
     Running `rustc --crate-name anyhow --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=7ea480d8b9426c5d -C extra-filename=-7ea480d8b9426c5d --out-dir /run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps -Zallow-features= --cfg backtrace`
error[E0725]: the feature `error_generic_member_access` is not in the list of allowed features
   --> src/lib.rs:214:32
    |
214 | #![cfg_attr(backtrace, feature(error_generic_member_access))]
    |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0658]: use of unstable library feature 'error_generic_member_access'
 --> src/context.rs:7:5
  |
7 | use std::error::Request;
  |     ^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #99301 <https://github.com/rust-lang/rust/issues/99301> for more information
  = help: add `#![feature(error_generic_member_access)]` to the crate attributes to enable

...

error: could not compile `anyhow` (lib) due to 24 previous errors

Caused by:
  process didn't exit successfully: `rustc --crate-name anyhow --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=7ea480d8b9426c5d -C extra-filename=-7ea480d8b9426c5d --out-dir /run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps -Zallow-features= --cfg backtrace` (exit status: 1)

> cargo clean
     Removed 138 files, 20.5MiB total

> RUSTFLAGS=-Zallow-features= cargo build --target x86_64-unknown-linux-gnu -v
   Compiling anyhow v1.0.75 (/tmp/tmp.7WdQVxA9Y6/anyhow-1.0.75)
     Running `rustc --crate-name build_script_build --edition=2018 build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=ec4d899bd2351612 -C extra-filename=-ec4d899bd2351612 --out-dir /run/user/1000/cargo-home/target/shared/debug/build/anyhow-ec4d899bd2351612 -C incremental=/run/user/1000/cargo-home/target/shared/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps`
     Running `/run/user/1000/cargo-home/target/shared/debug/build/anyhow-ec4d899bd2351612/build-script-build`
     Running `rustc --crate-name anyhow --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=201 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="std"' -C metadata=7ea480d8b9426c5d -C extra-filename=-7ea480d8b9426c5d --out-dir /run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/run/user/1000/cargo-home/target/shared/x86_64-unknown-linux-gnu/debug/deps -L dependency=/run/user/1000/cargo-home/target/shared/debug/deps -Zallow-features=`
    Finished dev [unoptimized + debuginfo] target(s) in 0.40s

Possible Solution(s)

It seems like Cargo's input environment variables to the build-script-execution should be part of its fingerprint, since by my understanding it's not possible for the build script to use rerun-if-env-changed with these variables.

Notes

Without --target the build-script-build is influenced by the RUSTFLAGS and so implicitly the build-script-execution is rerun after rebuilding the script itself.

Version

cargo 1.76.0-nightly (6790a5127 2023-11-10)
release: 1.76.0-nightly
commit-hash: 6790a5127895debec95c24aefaeb18e059270df3
commit-date: 2023-11-10
host: x86_64-unknown-linux-gnu
libgit2: 1.7.1 (sys:0.18.1 vendored)
libcurl: 8.4.0-DEV (sys:0.4.68+curl-8.4.0 vendored ssl:OpenSSL/1.1.1u)
ssl: OpenSSL 1.1.1u  30 May 2023
os: NixOS 23.5.0 [64-bit]