Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a simpler way to run clippy on my build script?

In a Cargo project, I can easily run clippy on my src code using this command:

rustup run nightly cargo clippy

However, if I'm using a build script, I'd like to run clippy on that as well. For instance, if my build.rs file looks like this:

fn main() {
    let foo = "Hello, world!";
    println!("{}", foo);
}

I'd like to see this when I run clippy:

warning: use of a blacklisted/placeholder name `foo`, #[warn(blacklisted_name)] on by default
 --> build.rs:2:9
  |
2 |     let foo = "Hello, world!";
  |         ^^^
  |
  = help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#blacklisted_name

The only way I can think of to run clippy on my build script is to copy it into a cargo new temporary project, run clippy, make my changes there, and copy back, but this is horribly inconvenient and quickly becomes infeasible when build dependencies and the like are added to the mix.

Is there a simpler way to analyze my build script with clippy?

like image 419
Sam Estep Avatar asked Jan 05 '17 03:01

Sam Estep


People also ask

Does cargo Clippy run cargo check?

cargo clippy runs Clippy, while cargo check only tries to compile with rustc. cargo clippy should give all errors and warnings of cargo check combined with Clippy specific warnings.


1 Answers

There are two ways to use Clippy: the cargo clippy command and the clippy compiler plugin. cargo clippy detects the build script as a dependency of the main project, so it doesn't load the compiler plugin.

Therefore, the other option is to use the compiler plugin directly. The instructions for doing this are in clippy's README. We need to make a few adaptations for using it on the build script, though.

First, we need to add clippy as a build dependency:

[build-dependencies]
clippy = { version = "*", optional = true }

[features]
default = []

Adding it to [dependencies] instead will not work (the result is error[E0463]: can't find crate for `clippy`), as Cargo will not pass the path to dependencies to the compiler when building the build script.

Then, we need to add this at the top of build.rs:

#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]

Finally, we need to build with the clippy feature enabled:

$ cargo build --features clippy

If you want to run clippy on both the build script and on the main project when you use the command above, add the same clippy dependency to [dependencies], then add the cfg_attr attributes to the crate root(s) (lib.rs, main.rs, etc.).

like image 123
Francis Gagné Avatar answered Sep 23 '22 04:09

Francis Gagné