fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo::rustc-check-cfg=cfg(probers_docsrs)");
println!("cargo:rerun-if-changed=targets");
println!("cargo:rerun-if-env-changed=PROBE_RS_TARGETS_DIR");
handle_builtin_targets();
}
#[cfg(not(feature = "builtin-targets"))]
fn handle_builtin_targets() {
}
#[cfg(feature = "builtin-targets")]
fn handle_builtin_targets() {
builtin_targets::process();
}
#[cfg(feature = "builtin-targets")]
mod builtin_targets {
use std::env;
use std::fs::{read_dir, read_to_string};
use std::io;
use std::path::Path;
use probe_rs_target::ChipFamily;
pub fn process() {
let mut families = Vec::new();
let mut process_target_yaml = |file: &Path| {
let string = read_to_string(file).unwrap_or_else(|error| {
panic!(
"Failed to read target file {} because:\n{error}",
file.display()
)
});
match serde_yaml::from_str::<ChipFamily>(&string) {
Ok(family) => families.push(family),
Err(error) => panic!(
"Failed to parse target file: {} because:\n{error}",
file.display()
),
}
};
visit_dirs("targets", &mut process_target_yaml).unwrap();
if let Ok(additional_target_dir) = env::var("PROBE_RS_TARGETS_DIR") {
println!("cargo:rerun-if-changed={additional_target_dir}");
visit_dirs(additional_target_dir, &mut process_target_yaml).unwrap();
}
let families_bin =
bincode::serialize(&families).expect("Failed to serialize families as bincode");
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("targets.bincode");
std::fs::write(dest_path, &families_bin).unwrap();
if let Err(deserialize_error) = bincode::deserialize::<Vec<ChipFamily>>(&families_bin) {
panic!(
"Failed to deserialize supported target definitions from bincode: {deserialize_error:?}"
);
}
}
fn visit_dirs(dir: impl AsRef<Path>, process: &mut impl FnMut(&Path)) -> io::Result<()> {
fn visit_dirs_impl(dir: &Path, process: &mut impl FnMut(&Path)) -> io::Result<()> {
for entry in read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
visit_dirs_impl(&path, process)?;
} else {
process(&path);
}
}
Ok(())
}
let dir = dir.as_ref();
if !dir.is_dir() {
return Ok(());
}
visit_dirs_impl(dir, process)
}
}