use std::{env, fmt::Debug, fs::File, path::PathBuf, result};
mod aarch64;
mod dummy;
#[derive(Debug, Default)]
pub struct MkLinker {
pub(crate) offset: usize,
}
impl MkLinker {
pub fn set_start_offset(&mut self, offset: usize) {
self.offset = offset;
}
pub fn genlinker(self) -> Result<()> {
let target = env::var("TARGET").map_err(|_| MlError::FsError)?;
let out = &PathBuf::from(env::var_os("OUT_DIR").ok_or(MlError::FsError)?);
let mut f = File::create(out.join("linker.lds")).map_err(|_| MlError::FsError)?;
if target.starts_with("aarch64") {
aarch64::arch_write_linker(&mut f, &self)?;
} else {
dummy::arch_write_linker(&mut f, &self)?;
}
println!("cargo:rustc-link-search={}", out.display());
println!("cargo:rustc-link-arg=-Tlinker.lds");
Ok(())
}
}
pub type Result<T> = result::Result<T, MlError>;
pub enum MlError {
Unknown,
UnImpl,
FsError,
EnvError,
}
impl Debug for MlError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let error = match self {
Self::Unknown => "未知错误",
Self::UnImpl => "未实现",
Self::FsError => "本机文件系统错误",
Self::EnvError => "环境变量错误",
};
write!(f, "{error}")
}
}