rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
97.08k stars 12.54k forks source link

Warn for `cfg!(target_* = "whatever")` usage in build scripts #125441

Open weiznich opened 4 months ago

weiznich commented 4 months ago

Code

if cfg!(target_feature = "sse2") {
    // …
}

Current output

No warning

Desired output

A warning pointing at `cfg!(target_feature = "sse2")` stating that this will be likely wrong for the target system if you cross compile

Rationale and extra context

I would expect a warning that explains that cfg!(target_*) will be evaluated in the context of the host system that compiles the build script and not in the context of the target system. It seems to be a common mistake for crate authors writing build scripts to use cfg! and not std::env in combination with the environment variables set by cargo. The warning should suggest that the later variant is the correct solution there.

Other cases

No response

Rust Version

rustc 1.78.0 (9b00956e5 2024-04-29)
binary: rustc
commit-hash: 9b00956e56009bab2aa15d7bff10916599e3d6d6
commit-date: 2024-04-29
host: x86_64-unknown-linux-gnu
release: 1.78.0
LLVM version: 18.1.2

Anything else?

No response

Urgau commented 4 months ago

This is indeed a foot-gun that users might encountered, and I agree that a lint seems appropriate.

However adding this kind of very targetted lint (Cargo specific knowledge) seems out of place for rustc, and given that are use-case for #[cfg(target_* = "...")] in build script, albeit very small, I think this proposed lint should probably live in Clippy.

cc https://github.com/rust-lang/rust-clippy/issues/9419