use std::{env, ffi, process};
use anyhow::Context;
use crate::{gnu_target, pkg::get_sysroot, status_error, target, toolchain};
pub fn command<S: AsRef<ffi::OsStr>>(program: S) -> anyhow::Result<process::Command> {
let toolchain_dir = toolchain().context("unable to init toolchain")?;
{
let path = env::var_os("PATH").unwrap_or(ffi::OsString::new());
let mut paths = env::split_paths(&path).collect::<Vec<_>>();
paths.insert(0, toolchain_dir.join("bin"));
let new_path = env::join_paths(paths)?;
env::set_var("PATH", new_path);
}
let ar = format!("{}-ar", gnu_target());
let cc = format!("{}-gcc", gnu_target());
let cxx = format!("{}-g++", gnu_target());
let cc_target_var = target().replace("-", "_");
let cargo_target_var = cc_target_var.to_uppercase();
let mut command = process::Command::new(program);
command.env(format!("AR_{}", cc_target_var), &ar);
command.env(format!("CARGO_TARGET_{}_LINKER", cargo_target_var), &cc);
command.env(format!("CC_{}", cc_target_var), &cc);
command.env(format!("CXX_{}", cc_target_var), &cxx);
command.env("RUSTUP_TOOLCHAIN", &toolchain_dir);
command.env("TARGET", target());
command.env("GNU_TARGET", gnu_target());
command.env(
"CFLAGS_riscv64gc_unknown_redox",
"-march=rv64gc -mabi=lp64d",
);
if let Some(sysroot) = get_sysroot() {
command.env(
format!("PKG_CONFIG_PATH_{}", cc_target_var),
sysroot.join("lib/pkgconfig"),
);
command.env(
format!("PKG_CONFIG_SYSROOT_DIR_{}", cc_target_var),
&sysroot,
);
}
Ok(command)
}
fn inner<I: Iterator<Item = String>>(args: I) -> anyhow::Result<()> {
command("env")?.args(args).status().and_then(status_error)?;
Ok(())
}
pub fn main(args: &[String]) {
match inner(args.iter().cloned().skip(2)) {
Ok(()) => {
process::exit(0);
}
Err(err) => {
eprintln!("redoxer env: {:#}", err);
process::exit(1);
}
}
}