blob: 5f4379045763ad9138eea1e809c695aa657172c1 [file] [log] [blame] [edit]
/* Copyright (c) 2015 The Robigalia Project Developers
* Licensed under the Apache License, Version 2.0
* <LICENSE-APACHE or
* http://www.apache.org/licenses/LICENSE-2.0> or the MIT
* license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
* at your option. All files in the project carrying such
* notice may not be copied, modified, or distributed except
* according to those terms.
*/
use std::env;
use std::process::Command;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let cargo_target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap();
let cargo_target_pointer_width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap();
// XXX(mwitkowski): For now tools lives in sel4-sys crate, so lets use that
let tools_dir = format!("{}/../../../cantrip/apps/system/components/cantrip-os-common/src/sel4-sys/tools",
env::var("CARGO_MANIFEST_DIR").unwrap());
println!(
"target_arch = {} target_pointer_width = {}",
cargo_target_arch, cargo_target_pointer_width
);
// Default to python3 (maybe necessary for code divergence)
let python_bin = env::var("PYTHON").unwrap_or_else(|_| "python3".to_string());
// Default to "seL4" for backwards compat; can either use git submodule or
// symbolic link (neither recommended)
let sel4_dir = env::var("SEL4_DIR").unwrap_or_else(
|_| format!("{}/cantrip/kernel", env::var("ROOTDIR").unwrap())
);
println!("sel4_dir {}", sel4_dir);
// If SEL4_OUT_DIR is not set we expect the kernel build at a fixed
// location relative to the ROOTDIR env variable.
println!("SEL4_OUT_DIR {:?}", env::var("SEL4_OUT_DIR"));
let sel4_out_dir = env::var("SEL4_OUT_DIR").unwrap_or_else(
|_| format!("{}/out/cantrip/kernel", env::var("ROOTDIR").unwrap())
);
println!("sel4_out_dir {}", sel4_out_dir);
// Dredge seL4 kernel config for settings we need as features to generate
// correct code: e.g. CONFIG_KERNEL_MCS enables MCS support which changes
// the system call numbering.
let features = sel4_config::get_sel4_features(&sel4_out_dir);
println!("features = {:?}", features);
let mut has_mcs = false;
for feature in features {
println!("cargo:rustc-cfg=feature=\"{}\"", feature);
if feature.as_str() == "CONFIG_KERNEL_MCS" { has_mcs = true; }
}
// Use CARGO_TARGET_ARCH and CARGO_TARGET_POINTER_WIDTH
// to select the target architecture;
// NB: this mimics the logic in lib.rs
let (arch, archdir) = match cargo_target_arch.as_str() {
"x86" => ("ia32", "x86"),
"x86_64" => ("x86_64", "x86"),
"arm" => match cargo_target_pointer_width.as_str() {
"32" => ("aarch32", "arm"),
"64" => ("aarch64", "arm"),
_ => {
panic!("Unsupported arm word size {}", cargo_target_pointer_width);
}
},
"aarch64" => ("aarch64", "arm"),
"riscv32" => ("riscv32", "riscv"),
"riscv64" => ("riscv64", "riscv"),
_ => {
panic!("Unsupported architecture {}", cargo_target_arch);
}
};
let xml_interfaces_file = format!("{}/libsel4/include/interfaces/sel4.xml", sel4_dir);
let outfile = format!("{}/{}_syscall_stub.rs", out_dir, arch);
let xml_arch_file = &*format!(
"{}/libsel4/arch_include/{}/interfaces/sel4arch.xml",
sel4_dir, archdir
);
let xml_sel4_arch_file = format!(
"{}/libsel4/sel4_arch_include/{}/interfaces/sel4arch.xml",
sel4_dir, arch
);
let mut cmd = Command::new("/usr/bin/env");
cmd.arg(&python_bin)
.arg(&format!("{}/syscall_stub_gen.py", tools_dir));
if has_mcs {
cmd.arg("--mcs");
}
cmd.args(&[
"-a",
arch,
"-w",
cargo_target_pointer_width.as_str(),
"--buffer",
"-o",
&*outfile,
&*xml_interfaces_file,
&*xml_arch_file,
&*xml_sel4_arch_file,
]);
println!("Running: {:?}", cmd);
assert!(cmd.status().unwrap().success());
}