72 lines
2.3 KiB
Rust
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");
|
|
}
|