blob: 2b426a449dea0714cfe4c4e26dbe3b47e063ac62 [file] [log] [blame]
//! Generate a module with a custom `#[path=...]` for each of the files in our
//! libclang version-specific test expectations so that they get their layout
//! tests run. We need to do this because cargo doesn't automatically detect
//! tests subdirectories.
use std::env;
use std::fs;
use std::io::Write;
use std::path::Path;
const LIBCLANG_VERSION_DIRS: &'static [&'static str] = &[
"libclang-3.9",
"libclang-4",
"libclang-5",
"libclang-9",
];
fn main() {
println!("cargo:rerun-if-changed=build.rs");
let mut test_string = String::new();
for dir in LIBCLANG_VERSION_DIRS {
let dir = Path::new(&env::var_os("CARGO_MANIFEST_DIR").unwrap())
.join("tests")
.join(dir);
println!("cargo:rerun-if-changed={}", dir.display());
for entry in fs::read_dir(dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
let path = path.canonicalize().unwrap_or_else(|_| path.into());
if path.extension().map(|e| e.to_string_lossy()) !=
Some("rs".into())
{
continue;
}
println!("cargo:rerun-if-changed={}", path.display());
let module_name: String = path
.display()
.to_string()
.chars()
.map(|c| match c {
'a'..='z' | 'A'..='Z' | '0'..='9' => c,
_ => '_',
})
.collect();
test_string.push_str(&format!(
r###"
#[path = "{}"]
mod {};
"###,
path.display(),
module_name,
));
}
}
let out_path = Path::new(&env::var_os("OUT_DIR").unwrap())
.join("libclang_version_specific_generated_tests.rs");
let mut test_file = fs::File::create(out_path).unwrap();
test_file.write_all(test_string.as_bytes()).unwrap();
}