yggdrasil/lib/abi/build.rs

52 lines
1.5 KiB
Rust
Raw Permalink Normal View History

2024-10-10 18:06:54 +03:00
use std::{env, fs, path::Path};
2024-03-12 13:48:09 +02:00
use abi_generator::{
abi::{ty::TypeWidth, AbiBuilder},
syntax::UnwrapFancy,
TargetEnv,
};
fn load_abi_definitions<P: AsRef<Path>>(path: P) -> String {
let mut content = String::new();
for file in fs::read_dir(path).unwrap() {
let file = file.unwrap();
if file.path().extension().map(|x| x == "abi").unwrap_or(false) {
println!("cargo:rerun-if-changed={}", file.path().display());
content.extend(fs::read_to_string(file.path()));
}
}
content
}
2024-10-10 18:06:54 +03:00
fn generate_abi<P: AsRef<Path>>(target_is_64bit: bool, abi_path: P) {
2024-03-12 13:48:09 +02:00
let output_dir = std::env::var("OUT_DIR").expect("$OUT_DIR not set");
let generated_types = Path::new(&output_dir).join("generated_types.rs");
2024-10-10 18:06:54 +03:00
let target_env = if target_is_64bit {
2024-03-12 13:48:09 +02:00
TargetEnv {
thin_pointer_width: TypeWidth::U64,
2024-10-10 18:06:54 +03:00
fat_pointer_width: TypeWidth::U128,
}
} else {
TargetEnv {
thin_pointer_width: TypeWidth::U32,
2024-03-12 13:48:09 +02:00
fat_pointer_width: TypeWidth::U64,
2024-10-10 18:06:54 +03:00
}
};
let abi = load_abi_definitions(abi_path);
let abi = AbiBuilder::from_string(&abi, target_env).unwrap_fancy(&abi);
2024-03-12 13:48:09 +02:00
let types = prettyplease::unparse(
&abi.emit_file(true, false)
.unwrap_fancy("Could not emit types"),
);
fs::write(generated_types, types).unwrap();
}
fn main() {
2024-10-10 18:06:54 +03:00
let target_is_64bit = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap() == "64";
generate_abi(target_is_64bit, "def");
2024-03-12 13:48:09 +02:00
}