from-scratch/lang/libcompiler/build.rs
2025-11-06 15:31:55 +01:00

71 lines
2.2 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(|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");
}