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(Path::new) { let path = working_dir.join(file); let obj = file.with_extension("o").file_name().unwrap().to_owned(); let obj_path = out_dir.join(&obj); std::process::Command::new("nasm") .current_dir(working_dir) .arg(path) .arg("-wreloc-abs") .arg("-g") .arg("-f") .arg("elf64") .arg("-o") .arg(&obj_path) .status() .expect("Failed to assemble assembly files"); println!("cargo:rustc-link-arg={}", obj_path.display()); // let _lib = format!("lib{}.a", file.file_stem().unwrap().to_str().unwrap()); // 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"); }