use std::path::Path; fn main() { let out_dir = std::env::var_os("OUT_DIR").unwrap(); let out_dir = Path::new(&out_dir); let manifest_dir = std::env::var_os("CARGO_MANIFEST_DIR").unwrap(); let manifest_dir = Path::new(&manifest_dir); let assembly_files = [ "src/alloc.asm", "src/ast.asm", "src/codegen.asm", "src/vec.asm", "src/tokeniser.asm", "src/lib.asm", "src/int_to_str.asm", "src/file.asm", ]; let include_files = ["src/tokeniser.inc", "src/ast.inc"]; println!("cargo:rerun-if-changed=build.rs"); for file in assembly_files.iter().chain(include_files.iter()) { println!( "cargo:rerun-if-changed={}/{}", manifest_dir.parent().unwrap().display(), file ); } println!("cargo:rustc-link-search=native={}", out_dir.display()); let working_dir = manifest_dir.parent().unwrap(); for file in assembly_files.iter().map(|f| Path::new(f)) { let path = working_dir.join(file); let obj = file.with_extension("o").file_name().unwrap().to_owned(); let lib = format!("lib{}.a", file.file_stem().unwrap().to_str().unwrap()); std::process::Command::new("nasm") .current_dir(working_dir) .arg(path) .arg("-g") .arg("-f") .arg("elf64") .arg("-o") .arg(out_dir.join(&obj)) .status() .expect("Failed to assemble assembly files"); std::process::Command::new("ar") .current_dir(working_dir) .arg("crs") .arg(out_dir.join(lib)) .arg(out_dir.join(obj)) .status() .expect("Failed to create static library from object files"); println!( "cargo:rustc-link-lib=static={}", file.file_stem().unwrap().to_str().unwrap() ); } std::process::Command::new("../tools/asm2rust") .current_dir(working_dir) .args(&assembly_files) .args(&include_files) .arg("-o") .arg(out_dir .join("bindings.rs") ) .status().expect("Failed to generate Rust bindings from assembly files"); }