use anyhow::Result;
mod cargo_cmd;
mod cli;
mod command;
mod sysroot;
mod toolchain;
use cargo_cmd::CargoCmd;
use cli::Args;
pub use command::Command;
pub fn cargo() -> Result<Command> {
Command::new()
}
impl Args {
pub fn sysroot_dir(&self) -> std::path::PathBuf {
self.target_dir.join("sysroot")
}
pub fn triplet_dir(&self) -> std::path::PathBuf {
self.sysroot_dir()
.join("lib")
.join("rustlib")
.join(&self.target)
}
pub fn build_dir(&self) -> std::path::PathBuf {
self.sysroot_dir().join("target")
}
pub fn libs_dir(&self) -> std::path::PathBuf {
self.triplet_dir().join("lib")
}
pub fn includes_dir(&self) -> std::path::PathBuf {
self.triplet_dir().join("include")
}
pub fn crate_dir(&self) -> std::path::PathBuf {
self.sysroot_dir().join("crate")
}
}
trait CargoCommandExt {
fn populate_from_args(&mut self, args: &Args) -> &mut Self;
}
impl CargoCommandExt for std::process::Command {
fn populate_from_args(&mut self, args: &Args) -> &mut Self {
self.target(&args.target);
self.sysroot(args.sysroot_dir());
self.append_rustflags("--cfg=hyperlight");
self.append_rustflags("--check-cfg=cfg(hyperlight)");
self.entrypoint("entrypoint");
if let Some(clang) = &args.clang {
self.cc_env(&args.target, clang);
} else {
self.cc_env(&args.target, "clang");
}
if let Some(ar) = &args.ar {
self.ar_env(&args.target, ar);
} else {
}
self.append_cflags(&args.target, toolchain::cflags(args));
self
}
}
impl Args {
pub fn prepare_sysroot(&self) -> Result<()> {
sysroot::build(self)?;
toolchain::prepare(self)?;
Ok(())
}
}