cbindgen/build.rs
Jonathan Schwender 25132a3690 Add --depfile option
Add an option to output a depfile for outside build-systems to learn
the source file dependencies of the bindings.
This can be used by 3rd party build system integrations to only rerun
bindgen when necessary.

Testing is done via CMake integration tests, since CMake
is a 3rd party buildsystem which supports depfiles.
2023-05-29 18:56:53 +02:00

98 lines
2.7 KiB
Rust

fn generate_tests() {
use std::env;
use std::ffi::OsStr;
use std::fs::{self, File};
use std::io::Write;
use std::path::{Path, PathBuf};
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap();
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let tests_dir = manifest_dir.join("tests").join("rust");
let tests = fs::read_dir(&tests_dir).unwrap();
let entries = tests.map(|t| t.expect("Couldn't read test file"));
println!("cargo:rerun-if-changed={}", tests_dir.display());
for entry in entries {
let path_segment = if entry.file_type().unwrap().is_file() {
match entry.path().extension().and_then(OsStr::to_str) {
Some("rs") => {}
_ => continue,
};
entry
.path()
.file_stem()
.unwrap()
.to_str()
.unwrap()
.to_owned()
} else {
entry.file_name().to_str().unwrap().to_owned()
};
let identifier = path_segment
.replace(|c| !char::is_alphanumeric(c), "_")
.replace("__", "_");
writeln!(
dst,
"test_file!(test_{}, {:?}, {:?});",
identifier,
path_segment,
entry.path(),
)
.unwrap();
}
dst.flush().unwrap();
}
fn generate_depfile_tests() {
use std::env;
use std::fs::{self, File};
use std::io::Write;
use std::path::{Path, PathBuf};
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
let mut dst = File::create(Path::new(&out_dir).join("depfile_tests.rs")).unwrap();
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let tests_dir = manifest_dir.join("tests").join("depfile");
let tests = fs::read_dir(&tests_dir).unwrap();
let entries = tests.map(|t| t.expect("Couldn't read test file"));
println!("cargo:rerun-if-changed={}", tests_dir.display());
for entry in entries {
if entry.file_type().unwrap().is_file() {
continue;
};
let path_segment = entry.file_name().to_str().unwrap().to_owned();
let identifier = path_segment
.replace(|c| !char::is_alphanumeric(c), "_")
.replace("__", "_");
writeln!(
dst,
"test_file!(test_depfile_{}, {:?}, {:?});",
identifier,
path_segment,
entry.path(),
)
.unwrap();
}
dst.flush().unwrap();
}
fn main() {
generate_tests();
generate_depfile_tests();
}