diff --git a/Makefile b/Makefile index 40b4e83f8..f82caf5af 100644 --- a/Makefile +++ b/Makefile @@ -149,15 +149,12 @@ tmp/$(1)_test: $(1)/test.rs endef # Main rules -ifeq ($(BUILD), $(PROGS)) all: $(EXES_PATHS) build/uutils -include build/uutils.d -build/uutils: uutils/uutils.rs $(addprefix build/, $(addsuffix .timestamp, $(CRATES))) - $(RUSTC) $(RUSTCFLAGS) -L build/ --dep-info $@.d uutils/uutils.rs -o $@ -else -all: $(EXES_PATHS) -endif +build/uutils: uutils/uutils.rs build/mkuutils $(addprefix build/, $(addsuffix .timestamp, $(CRATES))) + build/mkuutils build/gen/uutils.rs $(BUILD) + $(RUSTC) $(RUSTCFLAGS) -L build/ --dep-info $@.d build/gen/uutils.rs -o $@ # Dependencies LIBCRYPTO = $(shell $(RUSTC) --crate-file-name --crate-type rlib deps/rust-crypto/src/rust-crypto/lib.rs) @@ -168,6 +165,9 @@ build/$(LIBCRYPTO): | build build/mkmain: mkmain.rs | build $(RUSTC) $(RUSTCFLAGS) -L build mkmain.rs -o $@ +build/mkuutils: mkuutils.rs | build + $(RUSTC) $(RUSTCFLAGS) -L build mkuutils.rs -o $@ + deps: build/$(LIBCRYPTO) crates: diff --git a/mkuutils.rs b/mkuutils.rs new file mode 100644 index 000000000..2ca17b66c --- /dev/null +++ b/mkuutils.rs @@ -0,0 +1,48 @@ +use std::io::{File, Truncate, Write}; +use std::os; +use std::path::Path; + +fn main() { + let args = os::args(); + if args.len() < 3 { + println!("usage: mkuutils "); + os::set_exit_status(1); + return; + } + + let mut crates = String::new(); + let mut util_map = String::new(); + let mut hashsum = false; + for prog in args.slice_from(2).iter() { + match prog.as_slice() { + "md5sum" | "sha1sum" | "sha224sum" | "sha256sum" | "sha384sum" | "sha512sum" => { + if !hashsum { + crates.push_str("extern crate hashsum;\n"); + hashsum = true; + } + util_map.push_str(format!("map.insert(\"{}\", hashsum::uumain);\n", prog).as_slice()); + } + "true" => util_map.push_str("map.insert(\"true\", uutrue);\n"), + "false" => util_map.push_str("map.insert(\"false\", uufalse);\n"), + "sync" => { + crates.push_str("extern crate uusync;\n"); + util_map.push_str("map.insert(\"sync\", uusync::uumain);\n"); + } + _ => { + crates.push_str(format!("extern crate {};\n", prog).as_slice()); + util_map.push_str(format!("map.insert(\"{prog}\", {prog}::uumain);\n", prog = prog).as_slice()); + } + } + } + let outfile = args.get(1).as_slice(); + + // XXX: this all just assumes that the IO works correctly + let mut out = File::open_mode(&Path::new(outfile), Truncate, Write).unwrap(); + let mut input = File::open(&Path::new("uutils/uutils.rs")).unwrap(); + let main = input.read_to_str().unwrap().replace("@CRATES@", crates.as_slice()).replace("@UTIL_MAP@", util_map.as_slice()); + + match out.write(main.as_bytes()) { + Err(e) => fail!("{}", e), + _ => (), + } +} diff --git a/uutils/uutils.rs b/uutils/uutils.rs index 1c710a6aa..308017848 100644 --- a/uutils/uutils.rs +++ b/uutils/uutils.rs @@ -11,59 +11,7 @@ extern crate getopts; -extern crate base64; -extern crate basename; -extern crate cat; -extern crate chroot; -extern crate cksum; -extern crate comm; -extern crate cp; -extern crate cut; -extern crate dirname; -extern crate du; -extern crate echo; -extern crate env; -extern crate factor; -extern crate fmt; -extern crate fold; -extern crate groups; -extern crate head; -extern crate hostid; -extern crate hostname; -extern crate id; -extern crate kill; -extern crate link; -extern crate logname; -extern crate hashsum; -extern crate mkdir; -extern crate mkfifo; -extern crate nl; -extern crate nohup; -extern crate paste; -extern crate printenv; -extern crate pwd; -extern crate realpath; -extern crate relpath; -extern crate rm; -extern crate rmdir; -extern crate seq; -extern crate sleep; -extern crate sum; -extern crate uusync; -extern crate tac; -extern crate tail; -extern crate tee; -extern crate touch; -extern crate tr; -extern crate truncate; -extern crate tty; -extern crate uname; -extern crate unlink; -extern crate uptime; -extern crate users; -extern crate wc; -extern crate whoami; -extern crate yes; +@CRATES@ use std::os; use std::collections::hashmap::HashMap; @@ -76,66 +24,7 @@ fn util_map() -> HashMap<&str, fn(Vec) -> int> { fn uufalse(_: Vec) -> int { 1 } let mut map = HashMap::new(); - map.insert("base64", base64::uumain); - map.insert("basename", basename::uumain); - map.insert("cat", cat::uumain); - map.insert("chroot", chroot::uumain); - map.insert("cksum", cksum::uumain); - map.insert("comm", comm::uumain); - map.insert("cp", cp::uumain); - map.insert("cut", cut::uumain); - map.insert("dirname", dirname::uumain); - map.insert("du", du::uumain); - map.insert("echo", echo::uumain); - map.insert("env", env::uumain); - map.insert("factor", factor::uumain); - map.insert("false", uufalse); - map.insert("fmt", fmt::uumain); - map.insert("fold", fold::uumain); - map.insert("groups", groups::uumain); - map.insert("head", head::uumain); - map.insert("hostid", hostid::uumain); - map.insert("hostname", hostname::uumain); - map.insert("id", id::uumain); - map.insert("kill", kill::uumain); - map.insert("link", link::uumain); - map.insert("logname", logname::uumain); - map.insert("md5sum", hashsum::uumain); - map.insert("sha1sum", hashsum::uumain); - map.insert("sha224sum", hashsum::uumain); - map.insert("sha256sum", hashsum::uumain); - map.insert("sha384sum", hashsum::uumain); - map.insert("sha512sum", hashsum::uumain); - map.insert("mkdir", mkdir::uumain); - map.insert("mkfifo", mkfifo::uumain); - map.insert("nl", nl::uumain); - map.insert("nohup", nohup::uumain); - map.insert("paste", paste::uumain); - map.insert("printenv", printenv::uumain); - map.insert("pwd", pwd::uumain); - map.insert("realpath", realpath::uumain); - map.insert("relpath", relpath::uumain); - map.insert("rm", rm::uumain); - map.insert("rmdir", rmdir::uumain); - map.insert("seq", seq::uumain); - map.insert("sleep", sleep::uumain); - map.insert("sum", sum::uumain); - map.insert("sync", uusync::uumain); - map.insert("tac", tac::uumain); - map.insert("tail", tail::uumain); - map.insert("tee", tee::uumain); - map.insert("touch", touch::uumain); - map.insert("tr", tr::uumain); - map.insert("true", uutrue); - map.insert("truncate", truncate::uumain); - map.insert("tty", tty::uumain); - map.insert("uname", uname::uumain); - map.insert("unlink", unlink::uumain); - map.insert("uptime", uptime::uumain); - map.insert("users", users::uumain); - map.insert("wc", wc::uumain); - map.insert("whoami", whoami::uumain); - map.insert("yes", yes::uumain); + @UTIL_MAP@ map }