use std::path::Path;
use std::{env, fs, process};
const TARGETS: &[&str] = &["x86-64"];
fn main() {
let manifest = env::var("CARGO_MANIFEST_DIR").expect("cargo sets CARGO_MANIFEST_DIR");
let out = env::var("OUT_DIR").expect("cargo sets OUT_DIR");
for target in TARGETS {
let name = format!("rules/{target}.rules");
println!("cargo::rerun-if-changed={name}");
let source = Path::new(&manifest).join(&name);
let text = match fs::read_to_string(&source) {
Ok(text) => text,
Err(e) => fail(&format!("could not read {}: {e}", source.display())),
};
let rules = match rucc_rules::parse(&name, &text) {
Ok(rules) => rules,
Err(errors) => fail(&errors[0].to_string()),
};
let matcher = match rucc_rules::Matcher::build(&name, &rules) {
Ok(matcher) => matcher,
Err(errors) => fail(&errors[0].to_string()),
};
let table = match rucc_rules::emit(&name, &rules, &matcher) {
Ok(table) => table,
Err(errors) => fail(&errors[0].to_string()),
};
let generated = Path::new(&out).join(format!("{target}.rs"));
if let Err(e) = fs::write(&generated, table) {
fail(&format!("could not write {}: {e}", generated.display()));
}
}
}
fn fail(message: &str) -> ! {
eprintln!("rucc-codegen: {message}");
process::exit(1);
}