summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: bf4ea2365e432d99bc85758badd77e2a53b28b00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# 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 -rf ./${CARGO_TARGET_DIR}/

.PHONY: distclean
distclean: clean
	@rm -f meli-${VERSION}.tar.gz

.PHONY: uninstall
uninstall:
	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
.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