summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-01-29 21:44:55 +0200
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-01-31 03:54:58 +0200
commite3cd33f0e3ed20b59f15e876f39a03744f254215 (patch)
tree5e3700462592ca4201b6113e5e2fbb11cc1c7f72 /Makefile
parentf55311bfbda53e905f90c5cf8e074efc0d3b41e2 (diff)
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
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile124
1 files changed, 106 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index 41f1aa92..bf4ea236 100644
--- a/Makefile
+++ b/Makefile
@@ -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