diff --git a/src/main.rs b/src/main.rs index 3fa406c..6791218 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use cargo_metadata::{MetadataCommand, Package}; use rustc_version::{Channel, Version}; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::{ env, fmt, io, process::{self, Command, Stdio}, @@ -13,6 +13,7 @@ struct CTRConfig { description: String, icon: String, target_path: String, + cargo_manifest_path: PathBuf, } #[derive(Ord, PartialOrd, PartialEq, Eq, Debug)] @@ -258,6 +259,7 @@ fn get_metadata(args: &[&str], opt_level: &str) -> CTRConfig { .unwrap_or_else(|| String::from("Homebrew Application")), icon, target_path, + cargo_manifest_path: package.manifest_path.clone().into(), } } @@ -290,8 +292,16 @@ fn build_3dsx(config: &CTRConfig) { .arg(format!("--smdh={}.smdh", config.target_path)); // If romfs directory exists, automatically include it - if Path::new("./romfs").is_dir() { - process = process.arg("--romfs=./romfs"); + let (romfs_path, is_default_romfs) = get_romfs_path(config); + if romfs_path.is_dir() { + println!("Adding RomFS from {}", romfs_path.display()); + process = process.arg(format!("--romfs={}", romfs_path.display())); + } else if !is_default_romfs { + eprintln!( + "Could not find configured RomFS dir: {}", + romfs_path.display() + ); + process::exit(1); } let mut process = process @@ -323,3 +333,35 @@ fn link(config: &CTRConfig) { process::exit(status.code().unwrap_or(1)); } } + +/// Read the RomFS path from the Cargo manifest. If it's unset, use the default. +/// The returned boolean is true when the default is used. +fn get_romfs_path(config: &CTRConfig) -> (PathBuf, bool) { + let manifest_path = &config.cargo_manifest_path; + let manifest_str = std::fs::read_to_string(manifest_path) + .unwrap_or_else(|e| panic!("Could not open {}: {e}", manifest_path.display())); + let manifest_data: toml::Value = + toml::de::from_str(&manifest_str).expect("Could not parse Cargo manifest as TOML"); + + // Find the romfs setting and compute the path + let mut is_default = false; + let romfs_dir_setting = manifest_data + .as_table() + .and_then(|table| table.get("package")) + .and_then(toml::Value::as_table) + .and_then(|table| table.get("metadata")) + .and_then(toml::Value::as_table) + .and_then(|table| table.get("cargo-3ds")) + .and_then(toml::Value::as_table) + .and_then(|table| table.get("romfs_dir")) + .and_then(toml::Value::as_str) + .unwrap_or_else(|| { + is_default = true; + "romfs" + }); + let mut romfs_path = manifest_path.clone(); + romfs_path.pop(); // Pop Cargo.toml + romfs_path.push(romfs_dir_setting); + + (romfs_path, is_default) +}