diff --git a/Makefile b/Makefile index 97d389d7c..e5477b630 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,15 @@ # Config options PROFILE ?= debug +ifneq (,$(filter install, $(MAKECMDGOALS))) +override PROFILE:=release +override BUILD:=INSTALL +override DONT_BUILD:=DONT_INSTALL +endif + MULTICALL ?= n PROFILE_CMD := -ifeq (${PROFILE},release) +ifeq ($(PROFILE),release) PROFILE_CMD = --release endif @@ -12,11 +18,16 @@ CARGO ?= cargo CARGOFLAGS ?= # Install directories +FS_ROOT ?= / PREFIX ?= /usr/local BINDIR ?= /bin LIBDIR ?= /lib -INSTALLDIR=$(DESTDIR)$(PREFIX) +INSTALLDIR_BIN=$(FS_ROOT)$(PREFIX)$(BINDIR) +INSTALLDIR_LIB=$(FS_ROOT)$(PREFIX)$(LIBDIR) + +#prefix to apply to uutils binary and all tool binaries +PROG_PREFIX ?= # This won't support any directory with spaces in its name, but you can just # make a symlink without spaces that points to the directory. @@ -189,11 +200,11 @@ endef EXES := \ $(sort $(filter $(BUILD),$(filter-out $(DONT_BUILD),$(PROGS)))) +INSTALL ?= $(EXES) + INSTALLEES := \ $(sort $(filter $(INSTALL),$(filter-out $(DONT_INSTALL),$(EXES) uutils))) -INSTALL ?= $(EXES) - # Shared library extension SYSTEM := $(shell uname) DYLIB_EXT := @@ -261,26 +272,24 @@ distclean: clean $(CARGO) clean $(CARGOFLAGS) && $(CARGO) update $(CARGOFLAGS) # TODO: figure out if there is way for prefixes to work with the symlinks -install: build - PROFILE_CMD=--release - mkdir -p $(INSTALLDIR)$(BINDIR) +install: build + mkdir -p $(INSTALLDIR_BIN) + rm -f $(addprefix $(INSTALLDIR_BIN)/$(PROG_PREFIX),$(INSTALLEES)) ifeq (${MULTICALL}, y) - install $(BUILDDIR)/uutils $(INSTALLDIR)$(BINDIR)/$(PROG_PREFIX)uutils - cd $(INSTALLDIR)$(BINDIR) - $(foreach prog, $(INSTALLEES), ln -s $(PROG_PREFIX)uutils $$prog;) + install $(BUILDDIR)/uutils $(INSTALLDIR_BIN)/$(PROG_PREFIX)uutils + $(foreach prog, $(INSTALLEES), cd $(INSTALLDIR_BIN) && ln -s $(PROG_PREFIX)uutils $(PROG_PREFIX)$(prog);) else - $(foreach prog, $(INSTALLEES); \ - install $(PKG_BUILDDIR)/$$prog $(INSTALLDIR)$(BINDIR)/$(PROG_PREFIX)$$prog;) + $(foreach prog, $(INSTALLEES), \ + install $(PKG_BUILDDIR)/$(prog) $(INSTALLDIR_BIN)/$(PROG_PREFIX)$(prog);) endif - mkdir -p $(INSTALLDIR)$(LIBDIR) - $(foreach lib, $(LIBS), install $(BUILDDIR)/$$lib $(INSTALLDIR)$(LIBDIR)/$$lib;) + mkdir -p $(INSTALLDIR_LIB) + $(foreach lib, $(LIBS), install $(BUILDDIR)/$$lib $(INSTALLDIR_LIB)/$(lib);) uninstall: - rm -f $(addprefix $(INSTALLDIR)$(BINDIR)/$(PROG_PREFIX),$(PROGS)) - rm -f $(addprefix $(INSTALLDIR)$(LIBDIR)/,$(LIBS)) - -uninstall-multicall: - rm -f $(addprefix $(INSTALLDIR)$(BINDIR)/,$(PROGS) $(PROG_PREFIX)uutils) - rm -f $(addprefix $(INSTALLDIR)$(LIBDIR)/,$(LIBS)) +ifeq (${MULTICALL}, y) + rm -f $(addprefix $(INSTALLDIR_BIN)/,$(PROG_PREFIX)uutils) +endif + rm -f $(addprefix $(INSTALLDIR_BIN)/$(PROG_PREFIX),$(PROGS)) + rm -f $(addprefix $(INSTALLDIR_LIB)/,$(LIBS)) .PHONY: all build test distclean clean busytest install uninstall diff --git a/README.md b/README.md index 2675aa74d..7125ce710 100644 --- a/README.md +++ b/README.md @@ -64,14 +64,19 @@ To install only a few of the available utilities: make INSTALL='UTILITY_1 UTILITY_2' install ``` -To install every program with a prefix: +To install every program with a prefix (e.g. uu-echo uu-cat): ``` make PROG_PREFIX=PREFIX_GOES_HERE install ``` To install the multicall binary: ``` -make install-multicall +make MULTICALL=y install +``` + +Set install parent directory (default value is /usr/local): +``` +make PREFIX=/my/path install ``` Uninstallation Instructions @@ -89,7 +94,12 @@ make PROG_PREFIX=PREFIX_GOES_HERE uninstall To uninstall the multicall binary: ``` -make uninstall-multicall +make MULTICALL=y uninstall +``` + +To uninstall from a custom parent directory: +``` +make PREFIX=/my/path uninstall ``` Test Instructions diff --git a/src/uutils/uutils.rs b/src/uutils/uutils.rs index de335b6f2..69bafedd5 100644 --- a/src/uutils/uutils.rs +++ b/src/uutils/uutils.rs @@ -49,14 +49,26 @@ fn main() { None => (), } - if !(binary_as_util.ends_with("uutils") || binary_as_util.starts_with("uutils")) { - println!("{}: applet not found", binary_as_util); - std::process::exit(1); + if binary_as_util.ends_with("uutils") || binary_as_util.starts_with("uutils") { + args.remove(0); + } else { + let mut found = false; + for util in umap.keys() { + if binary_as_util.ends_with(util) { + args[0] = util.clone().to_owned(); + found = true; + break; + } + } + if ! found { + println!("{}: applet not found", binary_as_util); + std::process::exit(1); + } } // try first arg as util name. - if args.len() >= 2 { - args.remove(0); + if args.len() >= 1 { + let util = &args[0][..]; match umap.get(util) {