use rustc_cfg::Cfg; use toml::Table; use std::env; use std::path::Path; use std::process::Command; fn parse_kconfig(arch: &str) -> Option<()> { println!("cargo:rerun-if-changed=config.toml"); assert!(Path::new("config.toml.example").try_exists().unwrap()); if !Path::new("config.toml").try_exists().unwrap() { std::fs::copy("config.toml.example", "config.toml").unwrap(); } let config_str = std::fs::read_to_string("config.toml").unwrap(); let root: Table = toml::from_str(&config_str).unwrap(); let altfeatures = root.get("arch")?.as_table().unwrap() .get(arch)?.as_table().unwrap() .get("features")?.as_table().unwrap(); for (name, value) in altfeatures { let choice = value.as_str().unwrap(); assert!(matches!(choice, "always" | "never" | "auto")); println!("cargo:rustc-cfg=cpu_feature_{choice}=\"{name}\""); } Some(()) } fn main() { println!("cargo:rustc-env=TARGET={}", env::var("TARGET").unwrap()); let out_dir = env::var("OUT_DIR").unwrap(); let cfg = Cfg::new(env::var_os("TARGET").unwrap()).unwrap(); let arch_str = cfg.target_arch.as_str(); match arch_str { "aarch64" => { // Build pre kstart init asm code for aarch64 /*TODO: do we need any of this? println!("cargo:rerun-if-changed=src/arch/aarch64/init/pre_kstart/early_init.S"); cc::Build::new() .file("src/arch/aarch64/init/pre_kstart/early_init.S") .target("aarch64-unknown-redox") .compile("early_init"); */ }, "x86" => { println!("cargo:rerun-if-changed=src/asm/x86/trampoline.asm"); let status = Command::new("nasm") .arg("-f").arg("bin") .arg("-o").arg(format!("{}/trampoline", out_dir)) .arg("src/asm/x86/trampoline.asm") .status() .expect("failed to run nasm"); if ! status.success() { panic!("nasm failed with exit status {}", status); } }, "x86_64" => { println!("cargo:rerun-if-changed=src/asm/x86_64/trampoline.asm"); let status = Command::new("nasm") .arg("-f").arg("bin") .arg("-o").arg(format!("{}/trampoline", out_dir)) .arg("src/asm/x86_64/trampoline.asm") .status() .expect("failed to run nasm"); if ! status.success() { panic!("nasm failed with exit status {}", status); } } _ => (), } let _ = parse_kconfig(arch_str); }