Skip to content

cargo sometimes fails to run a build.rs that generates the src/lib.rs #4468

Closed as not planned
@pnkfelix

Description

@pnkfelix

This came up in the context of tango, specifically the tango-demo project, which attempts to show off that one can have all checked-files under src/ be markdown source rather than Rust source.

The intention is that the build script will always regenerate the src/lib.rs if it is out of date or has been deleted.

However, this sometimes does not happen. It is hard for me to tell exactly what the scenario is that is causing it to fail.

Here is a sample project that hopefully captures the essence of what I am trying to do:

Two files (only) at outset:

gen-lib/
|
+- Cargo.toml
|
+- build.rs

Cargo.toml:

[package]
name = "gen-lib"
version = "0.1.0"
authors = ["Felix S. Klock II <pnkfelix@pnkfx.org>"]

[dependencies]

[lib]
name = "gen_lib"
path = "src/lib.rs"

build.rs:

use std::fs::{self, File};
use std::io::{self, Write};

fn main() {
    generate_lib_rs().unwrap();
}

fn generate_lib_rs() -> Result<(), io::Error> {
    match fs::create_dir("src") {
        Ok(_) => (), // great, we built it.
        Err(_) => (), // okay, lets assume that was a file-exists error...
    }

    let mut f = File::create("src/lib.rs")?;
    write!(f, "{}", "\
#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}
")
}

Here is an example of a troubling interaction. Sometimes cargo build seems to know to run the build script, but other times it gives up as soon as it sees that the src/lib.rs does not exist. And I do not see any hints as to why there is a difference in the --verbose output.

% rm -rf src target build.rs~ Cargo.lock Cargo.toml~
% ls && echo && date && echo && cargo build --verbose -vv && echo && date
build.rs  Cargo.toml

Mon Sep  4 15:44:05 CEST 2017

   Compiling gen-lib v0.1.0 (file:///home/pnkfelix/Dev/Rust/gen-lib)
     Running `rustc --crate-name build_script_build build.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=66f9d79c9066950c -C extra-filename=-66f9d79c9066950c --out-dir /home/pnkfelix/Dev/Rust/gen-lib/\
target/debug/build/gen-lib-66f9d79c9066950c -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps`
     Running `/home/pnkfelix/Dev/Rust/gen-lib/target/debug/build/gen-lib-66f9d79c9066950c/build-script-build`
     Running `rustc --crate-name gen_lib src/lib.rs --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8fb3f0fed1d71daa -C extra-filename=-8fb3f0fed1d71daa --out-dir /home/pnkfelix/Dev/Rust/gen-lib/target/de\
bug/deps -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps`
    Finished dev [unoptimized + debuginfo] target(s) in 0.45 secs

Mon Sep  4 15:44:06 CEST 2017
% ls && echo && date && echo && cargo build --verbose -vv && echo && date
build.rs  Cargo.lock  Cargo.toml  src  target

Mon Sep  4 15:44:10 CEST 2017

   Compiling gen-lib v0.1.0 (file:///home/pnkfelix/Dev/Rust/gen-lib)
     Running `/home/pnkfelix/Dev/Rust/gen-lib/target/debug/build/gen-lib-66f9d79c9066950c/build-script-build`
     Running `rustc --crate-name gen_lib src/lib.rs --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8fb3f0fed1d71daa -C extra-filename=-8fb3f0fed1d71daa --out-dir /home/pnkfelix/Dev/Rust/gen-lib/target/de\
bug/deps -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps`
    Finished dev [unoptimized + debuginfo] target(s) in 0.12 secs

Mon Sep  4 15:44:10 CEST 2017
% rm src/lib.rs # can we recover from removing the generated file first?
% ls && echo && date && echo && cargo build --verbose -vv && echo && date
build.rs  Cargo.lock  Cargo.toml  src  target

Mon Sep  4 15:44:14 CEST 2017

   Compiling gen-lib v0.1.0 (file:///home/pnkfelix/Dev/Rust/gen-lib)
     Running `/home/pnkfelix/Dev/Rust/gen-lib/target/debug/build/gen-lib-66f9d79c9066950c/build-script-build`
     Running `rustc --crate-name gen_lib src/lib.rs --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8fb3f0fed1d71daa -C extra-filename=-8fb3f0fed1d71daa --out-dir /home/pnkfelix/Dev/Rust/gen-lib/target/de\
bug/deps -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps`
    Finished dev [unoptimized + debuginfo] target(s) in 0.12 secs

Mon Sep  4 15:44:14 CEST 2017
% rm src/lib.rs # We happened to recover above. But does a second attempt fail?
% ls && echo && date && echo && cargo build --verbose -vv && echo && date
build.rs  Cargo.lock  Cargo.toml  src  target

Mon Sep  4 15:44:18 CEST 2017

   Compiling gen-lib v0.1.0 (file:///home/pnkfelix/Dev/Rust/gen-lib)
     Running `rustc --crate-name gen_lib src/lib.rs --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8fb3f0fed1d71daa -C extra-filename=-8fb3f0fed1d71daa --out-dir /home/pnkfelix/Dev/Rust/gen-lib/target/de\
bug/deps -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps`
error: couldn't read "src/lib.rs": No such file or directory (os error 2)

error: Could not compile `gen-lib`.

Caused by:
  process didn't exit successfully: `rustc --crate-name gen_lib src/lib.rs --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=8fb3f0fed1d71daa -C extra-filename=-8fb3f0fed1d71daa --out-dir /home/pnkfelix/Dev\
/Rust/gen-lib/target/debug/deps -L dependency=/home/pnkfelix/Dev/Rust/gen-lib/target/debug/deps` (exit code: 101)
%

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions