from-scratch/lang/libcompiler/build.rs
2025-11-13 14:39:45 +01:00

72 lines
2.3 KiB
Rust

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");
}