Browse Source

Merge pull request #10 from AzureMarker/feature/configurable_romfs_path

pull/17/head
Meziu 3 years ago committed by GitHub
parent
commit
aa66d3d987
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 48
      src/main.rs

48
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,16 @@ 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, is_default_romfs) = 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()));
} else if !is_default_romfs {
eprintln!(
"Could not find configured RomFS dir: {}",
romfs_path.display()
);
process::exit(1);
} }
let mut process = process let mut process = process
@ -323,3 +333,35 @@ 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.
/// 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)
}

Loading…
Cancel
Save