Update Makefile

- Add BINDIR, MANDIR env vars
- add check-dep target that checks for cargo/rustc version
- add ANSI formatting output with NO_COLOR support
- add help target
- move manpage installation to install-doc target
- move bin installation to install-bin target
- add dist target
- add warning if BINDIR is not inside $PATH
- add warning if MANDIR is not inside $MANPATH/manpath
async
Manos Pitsidianakis 2020-01-29 21:44:55 +02:00
parent f55311bfbd
commit e3cd33f0e3
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
1 changed files with 106 additions and 18 deletions

124
Makefile
View File

@ -1,35 +1,123 @@
.POSIX:
.SUFFIXES:
meli:
cargo build $(FEATURES)--release
# Options
PREFIX ?= /usr/local
BINDIR ?= ${PREFIX}/bin
MANDIR ?= ${PREFIX}/share/man
CARGO_TARGET_DIR ?= target
MIN_RUSTC ?= 1.39.0
CARGO_BIN ?= cargo
# Installation parameters
MANPAGES ?= meli.1 meli.conf.5 meli-themes.5
ifdef MELI_FEATURES
FEATURES ?= --features="$(MELI_FEATURES)"
else
FEATURES ?=
endif
ifndef MANPATH
MANPATH = `manpath`
endif
VERSION ?= `sed -n "s/^version\s*=\s*\"\(.*\)\"/\1/p" Cargo.toml`
# Output parameters
BOLD ?= tput bold
UNDERLINE ?= tput smul
ANSI_RESET ?= tput sgr0
ifdef NO_COLOR
RED ?=
GREEN ?=
CARGO_COLOR ?= --color=never
else
RED ?= tput setaf 1
GREEN ?= tput setaf 2
endif
.POSIX:
.SUFFIXES:
help:
@echo "For a quick start, build and install locally:\n `${BOLD}``${GREEN}`PREFIX=~/.local make install`${ANSI_RESET}`\n"
@echo "Available subcommands:"
@echo " - `${BOLD}`install`${ANSI_RESET}` (installs binary and documentation)"
@echo " - `${BOLD}`uninstall`${ANSI_RESET}`"
@echo "Secondary subcommands:"
@echo " - `${BOLD}`clean`${ANSI_RESET}` (cleans build artifacts)"
@echo " - `${BOLD}`check-deps`${ANSI_RESET}` (checks dependencies)"
@echo " - `${BOLD}`install-bin`${ANSI_RESET}` (installs binary to BINDIR)"
@echo " - `${BOLD}`install-doc`${ANSI_RESET}` (installs manpages to MANDIR)"
@echo " - `${BOLD}`help`${ANSI_RESET}` (prints this information)"
@echo "\nENVIRONMENT variables of interest:"
@echo "* PREFIX = ${PREFIX}"
@echo "* MELI_FEATURES = ${MELI_FEATURES}"
@echo "* BINDIR = ${BINDIR}"
@echo "* MANDIR = ${MANDIR}"
meli: check-deps
${CARGO_BIN} build ${CARGO_COLOR}--target-dir="${CARGO_TARGET_DIR}" $(FEATURES)--release
.PHONY: check-deps
check-deps:
@if ! echo ${MIN_RUSTC}\\n`${CARGO_BIN} --version | cut -d ' ' -f 2` | sort -CV; then echo "rust version >= `${RED}`${MIN_RUSTC}`${ANSI_RESET}` required, found: `which ${CARGO_BIN}` `${CARGO_BIN} --version | cut -d ' ' -f 2`" \
"\nYour options:\n - Set CARGO_BIN to a supported version\n - Install a supported version from your distribution's package manager\n - Install a supported version from `${UNDERLINE}`https://rustup.rs/`${ANSI_RESET}`" ; exit 1; fi
.PHONY: clean
clean:
rm -r ./target/
-rm -rf ./${CARGO_TARGET_DIR}/
.PHONY: distclean
distclean: clean
@rm -f meli-${VERSION}.tar.gz
.PHONY: uninstall
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/meli
rm $(DESTDIR)$(PREFIX)/share/man/man1/meli.1.gz
rm $(DESTDIR)$(PREFIX)/share/man/man5/meli.conf.5.gz
rm -f $(DESTDIR)${BINDIR}/meli
-rm $(DESTDIR)${MANDIR}/man1/meli.1.gz
-rm $(DESTDIR)${MANDIR}/man5/meli.conf.5.gz
-rm $(DESTDIR)${MANDIR}/man5/meli-themes.5.gz
.PHONY: install-doc
install-doc:
ifndef NO_MAN
@mkdir -p $(DESTDIR)${MANDIR}/man1
@mkdir -p $(DESTDIR)${MANDIR}/man5
@echo " - `${BOLD}`Installing manpages to `${ANSI_RESET}`${DESTDIR}${MANDIR}:"
@for MANPAGE in ${MANPAGES}; do \
SECTION=`echo $${MANPAGE} | rev | cut -d "." -f 1`; \
MANPAGEPATH=${DESTDIR}${MANDIR}/man$${SECTION}/$${MANPAGE}.gz; \
echo " * installing $${MANPAGE} → `${GREEN}`$${MANPAGEPATH}`${ANSI_RESET}`"; \
gzip < $${MANPAGE} > $${MANPAGEPATH} \
; done
@case ":${MANPATH}:" in \
*:${DESTDIR}${MANDIR}:*) echo -n "";; \
*) echo "\n`${RED}``${BOLD}`WARNING`${ANSI_RESET}`: `${UNDERLINE}`Path ${DESTDIR}${MANDIR} is not contained in your MANPATH variable or the output of \`manpath\` command.`${ANSI_RESET}` \`man\` might fail finding the installed manpages. Consider adding it if necessary.\nMANPATH variable / output of \`manpath\`: ${MANPATH}" ;; \
esac
else
@echo "NO_MAN is defined, so no documentation is going to be installed."
endif
.PHONY: install-bin
install-bin: meli
@mkdir -p $(DESTDIR)${BINDIR}
@echo " - `${BOLD}`Installing binary to `${ANSI_RESET}``${GREEN}`${DESTDIR}${BINDIR}/meli`${ANSI_RESET}`"
@case ":${PATH}:" in \
*:${DESTDIR}${BINDIR}:*) echo -n "";; \
*) echo "\n`${RED}``${BOLD}`WARNING`${ANSI_RESET}`: `${UNDERLINE}`Path ${DESTDIR}${BINDIR} is not contained in your PATH variable.`${ANSI_RESET}` Consider adding it if necessary.\nPATH variable: ${PATH}";; \
esac
@install -D ./${CARGO_TARGET_DIR}/release/meli $(DESTDIR)${BINDIR}/meli
.PHONY: install
install: meli
mkdir -p $(DESTDIR)$(PREFIX)/bin
mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1
mkdir -p $(DESTDIR)$(PREFIX)/share/man/man5
cp -f target/release/meli $(DESTDIR)$(PREFIX)/bin
gzip < meli.1 > $(DESTDIR)$(PREFIX)/share/man/man1/meli.1.gz
gzip < meli.conf.5 > $(DESTDIR)$(PREFIX)/share/man/man5/meli.conf.5.gz
@echo "\n You might want to read the \"STARTING WITH meli\" section in the manpage (\`man meli\`)"
@echo " - Report bugs in the mailing list or git issue tracker https://git.meli.delivery"
.NOTPARALLEL: yes
install: meli install-bin install-doc
ifndef NO_MAN
@echo "\n You're ready to go. You might want to read the \"STARTING WITH meli\" section in the manpage (\`man meli\`)"
endif
@echo " - Report bugs in the mailing list or git issue tracker `${UNDERLINE}`https://git.meli.delivery`${ANSI_RESET}`"
@echo " - If you have a specific feature or workflow you want to use, you can post in the mailing list or git issue tracker."
.PHONY: dist
dist:
@git archive --format=tar.gz --prefix=meli-${VERSION}/ HEAD >meli-${VERSION}.tar.gz
@echo meli-${VERSION}.tar.gz