build.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use std::path::PathBuf;
  2. use std::{env, fs};
  3. fn read_dependent_script(script: &str) -> Result<String, Box<dyn std::error::Error>> {
  4. let content = fs::read_to_string(script)?;
  5. println!("cargo:rerun-if-changed={}", script);
  6. Ok(content)
  7. }
  8. fn process_ldscript_riscv64(script: &mut String) -> Result<(), Box<dyn std::error::Error>> {
  9. println!("cargo:extra-link-args= --no-check-sections");
  10. let memory = read_dependent_script("src/arch/riscv64/memory.x")?;
  11. let link = read_dependent_script("src/arch/riscv64/link.x")?;
  12. *script = memory + script;
  13. script.push_str(&link);
  14. Ok(())
  15. }
  16. fn process_ldscript_loongarch64(script: &mut String) -> Result<(), Box<dyn std::error::Error>> {
  17. println!("cargo:extra-link-args= --no-check-sections");
  18. let memory = read_dependent_script("src/arch/loongarch64/memory.x")?;
  19. let link = read_dependent_script("src/arch/loongarch64/link.x")?;
  20. *script = memory + script;
  21. script.push_str(&link);
  22. Ok(())
  23. }
  24. fn process_ldscript_x86(script: &mut String) -> Result<(), Box<dyn std::error::Error>> {
  25. // Otherwise `bootstrap.rs` might be ignored and not linked in.
  26. println!("cargo:extra-link-args=--undefined=move_mbr --no-check-sections");
  27. let memory = read_dependent_script("src/arch/x86_64/memory.x")?;
  28. let link = read_dependent_script("src/arch/x86_64/link.x")?;
  29. *script = memory + script;
  30. script.push_str(&link);
  31. Ok(())
  32. }
  33. fn process_ldscript_arch(
  34. script: &mut String,
  35. arch: &str,
  36. ) -> Result<(), Box<dyn std::error::Error>> {
  37. match arch {
  38. "x86_64" => {
  39. process_ldscript_x86(script)?;
  40. }
  41. "riscv64" => {
  42. process_ldscript_riscv64(script)?;
  43. }
  44. "loongarch64" => {
  45. process_ldscript_loongarch64(script)?;
  46. }
  47. _ => panic!("Unsupported architecture: {}", arch),
  48. }
  49. Ok(())
  50. }
  51. fn main() -> Result<(), Box<dyn std::error::Error>> {
  52. let out_dir = PathBuf::from(env::var("OUT_DIR")?);
  53. let out_script = out_dir.join("link.x");
  54. let in_script = "src/link.x.in";
  55. let mut script = read_dependent_script(in_script)?;
  56. process_ldscript_arch(&mut script, &env::var("CARGO_CFG_TARGET_ARCH")?)?;
  57. fs::write(out_script, script)?;
  58. println!("cargo:rustc-link-search={}", out_dir.display());
  59. Ok(())
  60. }