How can I force `build.rs` to run again without cleaning my whole project?

rustc-link-lib
rust build-dependencies
build rs set environment variable
cargo clean
cargo build
cargo-script
build rust code

How can I force build.rs to run again without cleaning my whole project? I checked cargo build --help but I couldn't find anything related to build.rs.

If you print

"cargo:rerun-if-changed=<FILE>"

the build will be triggered every time the file has changed.

rerun-if-changed=PATH is a path to a file or directory which indicates that the build script should be re-run if it changes (detected by a more-recent last-modified timestamp on the file). Normally build scripts are re-run if any file inside the crate root changes, but this can be used to scope changes to just a small set of files. -- source

I'm not aware of a solution without changing a file manually (I just put a whitespace anywhere in my build.rs, it will be removed by rustfmt though).

I have several buildscripts in my projects, and mostly these two lines give me a nice solution:

println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=path/to/Cargo.lock");

but I guess you are looking for a command rustc/cargo command. Anyway, you can put in a small script, which will edit a certain file, which will trigger the build-process.

Beginning Xcode, You can use this ability as a more exacting alternative to a clean build. By checking a source file's build flag, you can force it to be rebuilt, even when the build flag for a file and then modifying it causes Xcode to, once again, There are a few facilities for compiling a single file without launching the entire build process. If the build script inherently does not need to re-run under any circumstance, then emitting cargo:rerun-if-changed=build.rs is a simple way to prevent it from being re-run. Cargo automatically handles whether or not the script itself needs to be recompiled, and of course the script will be re-run after it has been recompiled. Otherwise, specifying

If build.rs changes, Cargo already rebuilds the project:

Note that if the build script itself (or one of its dependencies) changes, then it's rebuilt and rerun unconditionally, so cargo:rerun-if-changed=build.rs is almost always redundant (unless you want to ignore changes in all other files except for build.rs). doc

On Linux, I will just do touch build.rs && cargo build. For Windows, see Windows equivalent of the Linux command 'touch'?

cargo build should have --force option · Issue #1101 · rust-lang , Sometimes I need to force a rebuild of a target, because it compiled if cargo build accepted a --force flag that makes it consider the current but developing a compiler plugin, and just wanting to 'run' it again. build` (`cargo clean && cargo build`) to force recompilation of project (and No one assigned. If this is your first opportunity at managing a project, here’s how you can efficiently manage a project from start to finish. Plan Your Project. Each and every project manager will tell you that the success of your project comes down to planning. This may take some effort initially, but in the long-run having a clearly defined project plan

Air Force Civil Engineer, A small alteration project for a building included a washup area for which the planner base , it was returned to the supply system without a credit to the BCE ' s O & M funds . Again the BCE lost the purchasing power of those O & M funds . will also demonstrate to the entire work force that you really do have an active  For a multi-project solution, "rebuild solution" does a "clean" followed by a "build" for each project (possibly in parallel). Whereas a "clean solution" followed by a "build solution" first cleans all projects (possibly in parallel) and then builds all projects (possibly in parallel). This difference in sequencing of events can become significant when inter-project dependencies come into play.

If you got target under gitignore (which you should) this might be useful for any file changes when you're developing and testing the build script.

if Path::new(".git/HEAD").exists() {
    println!("cargo:rerun-if-changed=.git/HEAD");
}

Add `cargo clean --no-deps` · Issue #7156 · rust-lang/cargo · GitHub, This PR add a --no-deps option to preserve all non-workspace artifacts. The flag name and docs are modeled after cargo doc --no-deps . I want to clean my project, but preserve the dependencies so my next cargo build is significantly faster. is simpler to clean a sys crate than it is to configure a build.rs to force a rebuild  Deleting all the caches makes download all the dependacies again. so it take so long time and it is boring thing wait again again to re download all the dependancies. How ever i could be able to resolve this below way.

I can offer the solution that works for me well.

Add the following to build.rs file to a dependency that have to be rebuilt everytime:

use failure::{format_err, Error};
use std::env;
use std::path::PathBuf;
use std::process::Command;

/// Just useful trait to run a command
trait RunIt {
    fn run_it(&mut self, err: &str) -> Result<(), Error>;
}

impl RunIt for Command {
    fn run_it(&mut self, err: &str) -> Result<(), Error> {
        let output = self.output()?;
        if !output.status.success() {
            let out = String::from_utf8_lossy(&output.stderr);
            eprintln!("{}", out);
            Err(format_err!("{}", err))
        } else {
            Ok(())
        }
    }
}

fn main() -> Result<(), Error> {

    // Your build stuff

    // Activate this feature to rebuild this dependency everytime
    if cfg!(feature = "refresh") {
        Command::new("touch")
            .args(&["build.rs"])
            .run_it("Can't touch the build file")?;
    }

    Ok(())
}

Add the feature to Cargo.toml to declare the feature:

[package]
name = "sensitive-crate"

[features]
default = []
refresh = []

And activate refresh feature to rebuild the dependency everytime:

[package]
name = "my_project_1"

[dependencies]
sensitive-crate = { path = "../sensitive-crate", features = ["refresh"] }

Build Scripts, 4.3.1. cargo generate-lockfile · 4.3.2. cargo locate-project · 4.3.3. cargo Placing a file named build.rs in the root of a package will cause Cargo to compile section below, to narrow the focus of what triggers a build script to run again. of the package, unless there is no library target, in which case it is passed to all targets. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. Learn more . Difference between clean project and rebuild project in android studio. Ask Question Asked 5 years, 11 months ago. Active 1 year, 4

Building the Perfect PC, Keep track of the screws and other small parts Building a PC yields an As we can attest, one errant screw left on the floor can destroy a vacuum cleaner. Use force when necessary, but use it cautiously Many books tell you never to force 15 seconds, but that may be the most important 15 seconds of the whole project. Finally, add the project back into eclipse and eclipse will recreate those 2 files and a new configuration for your project. My specific issue was that it a project that was missing a Java Builder because it thought it was a scala project. The only way for me to reset this was by removing the project, deleting the 2 files, and adding it back in.

Municipal Journal, No plans have been made either by private companies or by the city for the collection to build a crematory for the incineration of all refuse matter and garbage on the city solons should have an opportunity to examine the project a trifle more scatter sand and building refuse 0n the streets without cleaning up afterward. With this in mind, how can Plan/build/run be implemented ? Project managers in a plan department, loosing gradually understanding of technology and buisness ? Developpers in a build department who are required to go through plan to organize their work ? And after go live, the same developpers do no longer intervene in support (despite they know system best), because support is run and not build ?

Municipal Journal and Engineer, A plan for the consumption of all the garbage of Oakland in the making denatured of all refuse matter and garbage on grounds at the disposal works'is again that the city solons should have an opportunity to examine the project a trifle more scatter sand and building refuse on the streets without cleaning up afterward. - The executing process is like launching a boat.…The project is finally underway.…Executing a project starts with lining up the people…and other resources you need…to perform the project.…Once you get team members onboard,…you help them get to know their assignments,…the overall project environment,…and their teammates.…To do that, hold a kickoff meeting.…The project

Comments
  • I don't understand "Note that if the build script itself (or one of its dependencies) changes, then it's rebuilt and rerun unconditionally, so cargo:rerun-if-changed=build.rs is almost always redundant (unless you want to ignore changes in all other files except for build.rs)." this is not needed
  • It should not be needed, however, I noticed that sometimes it does not work (maybe this was a bug, which has been solved now?).
  • thanks this was a super helpful departure from the typical solutions