use crate::path;
use clap::Parser;
use std::path::PathBuf;
use std::process::Command;
#[derive(Parser)]
pub struct Args {
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
args: Vec<String>,
}
pub fn run(args: &Args) {
let argv: Vec<&str> = args.args.iter().map(String::as_str).collect();
let status = make_command(&argv)
.status()
.unwrap_or_else(|e| {
eprintln!("❌ failed to run make: {e}");
std::process::exit(1);
});
std::process::exit(status.code().unwrap_or(1));
}
pub fn make_command(make_args: &[&str]) -> Command {
prepend_tool_path();
#[cfg(target_os = "windows")]
{
let mut line = String::from("make");
for a in make_args {
line.push_str(" '");
line.push_str(&a.replace('\'', r"'\''"));
line.push('\'');
}
let mut c = Command::new("sh");
c.arg("-c").arg(line);
return c;
}
#[cfg(not(target_os = "windows"))]
{
let mut c = Command::new("make");
c.args(make_args);
c
}
}
pub fn prepend_tool_path() {
if !path::is_installed() {
eprintln!("❌ SGDK not installed. Please run `sgdkx install` first.");
std::process::exit(1);
}
let sgdk_dir = path::sgdk_dir();
let sgdk_bin = sgdk_dir.join("bin");
let mut prepend: Vec<PathBuf> = Vec::new();
if let Some(jre) = path::jre_dir() {
prepend.push(jre.join("bin"));
}
if let Some(tc) = path::toolchain_dir() {
prepend.push(tc.join("bin"));
}
prepend.push(sgdk_bin);
let mut paths = prepend;
if let Some(orig) = std::env::var_os("PATH") {
paths.extend(std::env::split_paths(&orig));
}
let new_path = std::env::join_paths(&paths).expect("failed to build PATH");
let gdk = sgdk_dir.to_string_lossy().replace('\\', "/");
unsafe {
std::env::set_var("GDK", &gdk);
std::env::set_var("PATH", &new_path);
}
}