|
|
|
use cargo_3ds::commands::{CargoCommand, Input};
|
|
|
|
use cargo_3ds::{build_3dsx, build_elf, build_smdh, check_rust_version, get_metadata, link};
|
|
|
|
use clap::Parser;
|
|
|
|
use std::process;
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
check_rust_version();
|
|
|
|
|
|
|
|
let mut input: Input = Input::parse();
|
|
|
|
|
|
|
|
let should_link = input.cmd == CargoCommand::Build
|
|
|
|
|| (input.cmd == CargoCommand::Test
|
|
|
|
&& if input.cargo_opts.contains(&"--no-run".to_string()) {
|
|
|
|
false
|
|
|
|
} else {
|
|
|
|
input.cargo_opts.push("--no-run".to_string());
|
|
|
|
true
|
|
|
|
});
|
|
|
|
|
|
|
|
let message_format = if let Some(pos) = input
|
|
|
|
.cargo_opts
|
|
|
|
.iter()
|
|
|
|
.position(|s| s.starts_with("--message-format"))
|
|
|
|
{
|
|
|
|
let arg = input.cargo_opts.remove(pos);
|
|
|
|
let format = if let Some((_, format)) = arg.split_once('=')
|
|
|
|
{
|
|
|
|
format.to_string()
|
|
|
|
} else {
|
|
|
|
input.cargo_opts.remove(pos).to_string()
|
|
|
|
};
|
|
|
|
if !format.starts_with("json") {
|
|
|
|
eprintln!("error: non-JSON `message-format` is not supported");
|
|
|
|
process::exit(1);
|
|
|
|
} else {
|
|
|
|
format
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
"json-render-diagnostics".to_string()
|
|
|
|
};
|
|
|
|
|
|
|
|
let (status, messages) = build_elf(input.cmd, &message_format, &input.cargo_opts);
|
|
|
|
|
|
|
|
if !status.success() {
|
|
|
|
process::exit(status.code().unwrap_or(1));
|
|
|
|
}
|
|
|
|
|
|
|
|
if !input.cmd.should_build_3dsx() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("Getting metadata");
|
|
|
|
let app_conf = get_metadata(&messages);
|
|
|
|
|
|
|
|
println!("Building smdh:{}", app_conf.path_smdh().display());
|
|
|
|
build_smdh(&app_conf);
|
|
|
|
|
|
|
|
println!("Building 3dsx: {}", app_conf.path_3dsx().display());
|
|
|
|
build_3dsx(&app_conf);
|
|
|
|
|
|
|
|
if should_link {
|
|
|
|
println!("Running 3dslink");
|
|
|
|
link(&app_conf);
|
|
|
|
}
|
|
|
|
}
|