use std::io::Result;
use std::path::Path;
fn main() {
let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
let platform = axconfig::PLATFORM;
if platform != "dummy" {
gen_linker_script(&arch, platform).unwrap();
}
}
fn gen_linker_script(arch: &str, platform: &str) -> Result<()> {
let fname = format!("linker_{platform}.lds");
let output_arch = if arch == "x86_64" {
"i386:x86-64"
} else if arch.contains("riscv") {
"riscv" } else {
arch
};
let ld_content = std::fs::read_to_string("linker.lds.S")?;
let ld_content = ld_content.replace("%ARCH%", output_arch);
let ld_content = ld_content.replace(
"%KERNEL_BASE%",
&format!("{:#x}", axconfig::plat::KERNEL_BASE_VADDR),
);
let ld_content = ld_content.replace("%CPU_NUM%", &format!("{}", axconfig::plat::CPU_NUM));
let ld_content = ld_content.replace(
"%DWARF%",
if std::env::var("DWARF").is_ok_and(|v| v == "y") {
r#"debug_abbrev : { . += SIZEOF(.debug_abbrev); }
debug_addr : { . += SIZEOF(.debug_addr); }
debug_aranges : { . += SIZEOF(.debug_aranges); }
debug_info : { . += SIZEOF(.debug_info); }
debug_line : { . += SIZEOF(.debug_line); }
debug_line_str : { . += SIZEOF(.debug_line_str); }
debug_ranges : { . += SIZEOF(.debug_ranges); }
debug_rnglists : { . += SIZEOF(.debug_rnglists); }
debug_str : { . += SIZEOF(.debug_str); }
debug_str_offsets : { . += SIZEOF(.debug_str_offsets); }"#
} else {
""
},
);
let out_dir = std::env::var("OUT_DIR").unwrap();
let out_path = Path::new(&out_dir).join("../../..").join(fname);
std::fs::write(out_path, ld_content)?;
Ok(())
}