1
1

build.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #![feature(exit_status_error)]
  2. use std::{env, error::Error, path::Path};
  3. fn asm_build(input: &str, output: &str, flags: &[&str]) -> Result<(), Box<dyn Error>> {
  4. use std::process::Command;
  5. println!("cargo:rerun-if-changed={input}");
  6. let mut cmd = Command::new("nasm");
  7. cmd.args([input, "-o", output])
  8. .args(flags)
  9. .status()?
  10. .exit_ok()?;
  11. Ok(())
  12. }
  13. fn main() -> Result<(), Box<dyn Error>> {
  14. let target_dir = env::var("OUT_DIR")?;
  15. for file in Path::new("entry/x86_64").read_dir()?.flatten() {
  16. let mut dst_name = file.file_name().to_string_lossy().to_string();
  17. dst_name += ".o";
  18. let src_path = file.path();
  19. let dst_path = format!("{target_dir}/{dst_name}");
  20. asm_build(src_path.to_str().unwrap(), &dst_path, &["-f", "elf64"])?;
  21. println!("cargo:rustc-link-arg={dst_path}");
  22. println!("cargo:rerun-if-changed={}", src_path.to_str().unwrap());
  23. }
  24. println!(
  25. "cargo:rustc-link-arg=-T{}/tinit.ld",
  26. env::var("CARGO_MANIFEST_DIR")?
  27. );
  28. println!(
  29. "cargo:rerun-if-changed={}/tinit.ld",
  30. env::var("CARGO_MANIFEST_DIR")?
  31. );
  32. Ok(())
  33. }