build.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. {
  16. let tram_src = "src/cpu/x86_64/apic/tram.asm";
  17. let tram_dst = format!("{}/tram", target_dir);
  18. asm_build(tram_src, &tram_dst, &[])?;
  19. }
  20. for file in Path::new("entry/x86_64").read_dir()?.flatten() {
  21. let mut dst_name = file.file_name().to_string_lossy().to_string();
  22. dst_name += ".o";
  23. let src_path = file.path();
  24. let dst_path = format!("{}/{}", target_dir, dst_name);
  25. asm_build(src_path.to_str().unwrap(), &dst_path, &["-f", "elf64"])?;
  26. println!("cargo:rustc-link-arg={}", dst_path);
  27. println!("cargo:rerun-if-changed={}", src_path.to_str().unwrap());
  28. }
  29. println!(
  30. "cargo:rustc-link-arg=-T{}/h2o.ld",
  31. env::var("CARGO_MANIFEST_DIR")?
  32. );
  33. println!(
  34. "cargo:rerun-if-changed={}/h2o.ld",
  35. env::var("CARGO_MANIFEST_DIR")?
  36. );
  37. Ok(())
  38. }