diff --git a/Cargo.lock b/Cargo.lock index c30f4ad..d3d2134 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,100 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "clap" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "equivalent" version = "1.0.1" @@ -14,6 +108,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "indexmap" version = "2.2.5" @@ -34,6 +134,7 @@ checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" name = "ngen" version = "0.1.0" dependencies = [ + "clap", "toml", ] @@ -84,6 +185,12 @@ dependencies = [ "serde", ] +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "syn" version = "2.0.52" @@ -135,6 +242,78 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "winnow" version = "0.6.5" diff --git a/Cargo.toml b/Cargo.toml index dbc0109..745b6a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +clap = { version = "4.5.1", features = ["derive"] } toml = "0.8.10" diff --git a/src/main.rs b/src/main.rs index 0217f0a..be77f4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,16 @@ +use clap::Parser; use std::fs::{read, write}; use toml::{Table, Value}; +#[derive(Parser)] +struct Args { + #[arg(short, long, default_value = "ngen.toml")] + config_file: String, + + #[arg(short, long, default_value = "build.ninja")] + output_file: String, +} + fn print_tabs(num: usize) { for _ in 0..num { print!(" "); @@ -71,7 +81,8 @@ fn target_generator(name: &str, config_table: &Table) -> String { }; ret.push_str(&format!( - r#"# BEGIN TARGET {name} + "\ +# BEGIN TARGET {name} rule cc_{name} deps = gcc depfile = $dep @@ -84,7 +95,7 @@ rule link_{name} build $builddir/{name}/obj: mkdir build $builddir/{name}/dep: mkdir -"# +" )); let sources = config_table .get("sources") @@ -101,7 +112,7 @@ build $builddir/{name}/dep: mkdir let obj_name = format!("$builddir/{name}/obj/{new_file}.o"); let dep_name = format!("$builddir/{name}/dep/{new_file}.o.d"); ret.push_str(&format!( - "build {obj_name}: cc_{name} {s} | build.ninja || $builddir/{name}/obj $builddir/{name}/dep\n dep = {dep_name}\n" + "build {obj_name}: cc_{name} {s}\n dep = {dep_name}\n" )); object_list.push(obj_name); } @@ -117,7 +128,7 @@ build $builddir/{name}/dep: mkdir ret.push_str(&format!("\nbuild $builddir/{name}/{outfile}: link_{name} ")); ret.push_str(&object_list.join(" ")); ret.push_str(&format!( - " \nbuild {name}: phony $builddir/{name}/{outfile}\n" + " || $builddir/{name}/obj $builddir/{name}/dep\nbuild {name}: phony $builddir/{name}/{outfile}\n" )); ret.push_str(&format!("# END TARGET {name}\n")); @@ -125,15 +136,19 @@ build $builddir/{name}/dep: mkdir } fn main() { - let conf_file_name = "ngen.toml"; + let args = Args::parse(); + let output_file = &args.output_file; + let config_file_name = &args.config_file; + let conf_file_bytes = - read(conf_file_name).unwrap_or_else(|e| panic!("fatal: could not read file: {e}")); + read(config_file_name).unwrap_or_else(|e| panic!("fatal: could not read file: {e}")); let conf_file = String::from_utf8_lossy(&conf_file_bytes); let conf = toml::from_str::(&conf_file) .unwrap_or_else(|e| panic!("fatal: could not parse config file: {e}")); - let mut ninjafile = String::from(&format!( - r#"# Generated by ngen. Do not modify by hand. + let mut ninjafile = String::from( + "\ +# Generated by ngen. Do not modify by hand. builddir = build @@ -142,13 +157,15 @@ rule mkdir description = Creating directory $out rule regen - command = ngen -f $in + command = ngen -c $in -o $out generator = 1 - description = Regenerating build.ninja + description = Regenerating $out -build build.ninja: regen ngen.toml - pool = console -"#, +", + ); + + ninjafile.push_str(&format!( + "build {output_file}: regen {config_file_name}\n pool = console\n" )); for k in conf.keys() { @@ -167,6 +184,6 @@ build build.ninja: regen ngen.toml } } - write("build.ninja", ninjafile) + write(output_file, ninjafile) .unwrap_or_else(|e| panic!("fatal: could not write ninja file: {e}")); }