use color_eyre::eyre::eyre; use std::process::Command; fn main() -> color_eyre::Result<()> { color_eyre::install()?; println!("Building example assembly program"); let assembly_exe_path = &format!("{}/asmprog", std::env::var("OUT_DIR")?); let assembly_obj_path = &format!("{}.o", assembly_exe_path); let status = Command::new("nasm") .args(&["-f", "elf64", "src/prog.nasm", "-o", assembly_obj_path]) .status()?; if !status.success() { return Err(eyre!("Nasm build failed")); } let status = Command::new("ld") .args(&[assembly_obj_path, "-o", assembly_exe_path]) .status()?; if !status.success() { return Err(eyre!("Linking assembly program failed")); } println!("cargo:rustc-env=ASM_PROG_PATH={}", assembly_exe_path); println!("cargo:rerun-if-changed=src/prog.nasm"); println!("Building example C program"); let c_exe_path = &format!("{}/cprog", std::env::var("OUT_DIR")?); let status = Command::new("gcc") .args(&["-o", c_exe_path, "src/prog.c"]) .status()?; if !status.success() { return Err(eyre!("C program compilation failed")); } println!("cargo:rustc-env=C_PROG_PATH={}", c_exe_path); println!("cargo:rerun-if-changed=src/prog.c"); Ok(()) }