1use std::char; 2use std::env; 3use std::ffi::OsStr; 4use std::fs::{self, File}; 5use std::io::Write; 6use std::path::{Path, PathBuf}; 7 8pub fn main() { 9 let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); 10 let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap(); 11 12 let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); 13 let headers_dir = manifest_dir.join("tests").join("headers"); 14 15 let headers = match fs::read_dir(headers_dir) { 16 Ok(dir) => dir, 17 // We may not have headers directory after packaging. 18 Err(..) => return, 19 }; 20 21 let entries = 22 headers.map(|result| result.expect("Couldn't read header file")); 23 24 println!("cargo:rerun-if-changed=tests/headers"); 25 26 for entry in entries { 27 match entry.path().extension().and_then(OsStr::to_str) { 28 Some("h") | Some("hpp") => { 29 let func = entry 30 .file_name() 31 .to_str() 32 .unwrap() 33 .replace(|c| !char::is_alphanumeric(c), "_") 34 .replace("__", "_") 35 .to_lowercase(); 36 writeln!( 37 dst, 38 "test_header!(header_{}, {:?});", 39 func, 40 entry.path(), 41 ) 42 .unwrap(); 43 } 44 _ => {} 45 } 46 } 47 48 dst.flush().unwrap(); 49} 50