Browse Source

Read the RomFS path from Cargo.toml

pull/10/head
AzureMarker 3 years ago
parent
commit
2813bbc21f
No known key found for this signature in database
GPG Key ID: 47A133F3BF9D03D3
  1. 36
      src/main.rs

36
src/main.rs

@ -1,6 +1,6 @@
use cargo_metadata::{MetadataCommand, Package}; use cargo_metadata::{MetadataCommand, Package};
use rustc_version::{Channel, Version}; use rustc_version::{Channel, Version};
use std::path::Path; use std::path::{Path, PathBuf};
use std::{ use std::{
env, fmt, io, env, fmt, io,
process::{self, Command, Stdio}, process::{self, Command, Stdio},
@ -13,6 +13,7 @@ struct CTRConfig {
description: String, description: String,
icon: String, icon: String,
target_path: String, target_path: String,
cargo_manifest_path: PathBuf,
} }
#[derive(Ord, PartialOrd, PartialEq, Eq, Debug)] #[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")), .unwrap_or_else(|| String::from("Homebrew Application")),
icon, icon,
target_path, target_path,
cargo_manifest_path: package.manifest_path.clone().into(),
} }
} }
@ -290,8 +292,10 @@ fn build_3dsx(config: &CTRConfig) {
.arg(format!("--smdh={}.smdh", config.target_path)); .arg(format!("--smdh={}.smdh", config.target_path));
// If romfs directory exists, automatically include it // If romfs directory exists, automatically include it
if Path::new("./romfs").is_dir() { let romfs_path = get_romfs_path(config);
process = process.arg("--romfs=./romfs"); if romfs_path.is_dir() {
println!("Adding RomFS from {}", romfs_path.display());
process = process.arg(format!("--romfs={}", romfs_path.display()));
} }
let mut process = process let mut process = process
@ -323,3 +327,29 @@ fn link(config: &CTRConfig) {
process::exit(status.code().unwrap_or(1)); process::exit(status.code().unwrap_or(1));
} }
} }
/// Read the RomFS path from the Cargo manifest. If it's unset, use the default.
fn get_romfs_path(config: &CTRConfig) -> PathBuf {
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 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("romfs");
let mut romfs_path = manifest_path.clone();
romfs_path.pop(); // Pop Cargo.toml
romfs_path.push(romfs_dir_setting);
romfs_path
}

Loading…
Cancel
Save