use minijinja::{context, Environment}; use owo_colors::OwoColorize; use std::fs; fn main() { // Protocol tests run on the host without a board feature. Cargo doesn't // expose `cfg(test)` to build scripts, so we rely on an env var set by // the justfile `test` recipe. See: `just test` if std::env::var_os("DONGLORA_HOST_TEST").is_some() { return; } let board_dir = "src/board"; let boards: Vec = fs::read_dir(board_dir) .expect("failed to read src/board directory") .filter_map(|e| { let p = e.ok()?.path(); let stem = p.file_stem()?.to_str()?; // Exclude non-board files: mod.rs, traits.rs, and platform helpers (esp32s3.rs). if p.is_file() && p.extension()? == "rs" && !matches!(stem, "mod" | "traits" | "esp32s3") { return Some(p.file_stem()?.to_str()?.to_string()); } None }) .collect(); let enabled: Vec<_> = std::env::vars() .filter(|(k, _)| k.starts_with("CARGO_FEATURE_")) .map(|(k, _)| k.replace("CARGO_FEATURE_", "").to_lowercase()) .filter(|f| boards.contains(f)) .collect(); match enabled.len() { 0 => panic!( "\n\n{}\n", format!("No board selected! Found: {:?}", boards) .red() .bold() ), 1 => println!("cargo:rustc-cfg=board_selected"), _ => panic!( "\n\n{}\n", format!("Conflict: Multiple boards enabled {:?}", enabled) .yellow() .bold() ), } let mut env = Environment::new(); let template = fs::read_to_string("src/board/mod.rs.j2").expect("missing src/board/mod.rs.j2"); env.add_template("mod", &template) .expect("failed to parse board template"); let rendered = env .get_template("mod") .expect("template not found") .render(context!(boards => boards)) .expect("failed to render board module"); fs::write("src/board/mod.rs", rendered).expect("failed to write src/board/mod.rs"); println!("cargo:rerun-if-changed=src/board/mod.rs.j2"); println!("cargo:rerun-if-changed={}", board_dir); // cortex-m-rt's link.x does `INCLUDE memory.x`. Copy our nRF layout into // OUT_DIR (which cortex-m-rt already adds to the linker search path) so it's // only visible to ARM builds. Keeping it out of the project root prevents // the linker from shadowing esp-hal's generated memory.x on Xtensa builds. let target = std::env::var("TARGET").unwrap_or_default(); if !target.starts_with("xtensa") { let out_dir = std::env::var("OUT_DIR").unwrap(); fs::copy("ld/nrf52840-memory.x", format!("{out_dir}/memory.x")) .expect("failed to copy ld/nrf52840-memory.x"); println!("cargo:rustc-link-search={out_dir}"); } println!("cargo:rerun-if-changed=ld/nrf52840-memory.x"); }