.POSIX:
PREFIX       = /usr/local
MANPREFIX    = '$(PREFIX)/share/man'
VERSION      = 0.2.1
DATE         = 2021-02-23
NAME         = remembering
MAILING_LIST = public-inbox
TRANSLATIONS = pt fr eo
CONTRIBLANGS =


.SUFFIXES:
.SUFFIXES: .in .to .c .o

.in:
	sed -e 's:@VERSION@:$(VERSION):g' -e 's:@DATE@:$(DATE):g' < $< > $@
	if [ -x $< ]; then chmod +x $@; fi

.c.o:
	$(CC) $(CFLAGS)        -o $@ -c $<

.c.to:
	$(CC) $(CFLAGS) -DTEST -o $@ -c $<


manpages.en.in = \
	doc/remembering.en.1.in \
	doc/remembering.en.5.in
manpages.in = $(manpages.en.in) \
	doc/remembering.pt.1.in \
	doc/remembering.fr.1.in \
	doc/remembering.eo.1.in \
	doc/remembering.pt.5.in \
	doc/remembering.fr.5.in \
	doc/remembering.eo.5.in
manpages = $(manpages.in:.in=)

sources = \
	src/logerr.c \
	src/remembering.c
objects   = $(sources:.c=.o)
t-sources = $(sources) src/tests-lib.c
t-objects = $(t-sources:.c=.to)


all: src/remembering remembering $(manpages)


remembering: $(objects)
	$(CC) $(LDFLAGS) -o $@ $(objects)   $(LDLIBS)

remembering-tests: $(t-objects)
	$(CC) $(LDFLAGS) -o $@ $(t-objects) $(LDLIBS)

src/config.h:
	printf '#ifndef REMEMBERING_CONFIG_H\n'         >> $@
	printf '#define REMEMBERING_CONFIG_H\n'         >> $@
	printf '\n'                                     >> $@
	printf '#define _POSIX_C_SOURCE 200809L\n'      >> $@
	printf '#define VERSION         "$(VERSION)"\n' >> $@
	printf '#define DATE            "$(DATE)"\n'    >> $@
	printf '#define PROGNAME        "$(NAME)"\n'    >> $@
	printf '\n'                                     >> $@
	printf '#endif\n'                               >> $@

src/remembering: src/remembering.in
$(objects) $(t-objects): src/config.h
src/tests-lib.to: src/tests-lib.h
src/logerr.o src/logerr.to: src/logerr.h
src/remembering.o: src/logerr.o
src/remembering.to: src/logerr.to src/tests-lib.to

check: all remembering-tests
	./remembering-tests
	sh tests/assert-catgets.sh $(t-sources)
	sh tests/c-lint.sh $(t-sources)
	sh tests/cli-opts.sh
	sh tests/ranking.sh
	sh tests/signals.sh

clean:
	rm -rf \
		public/ $(manpages) README.*.md CHANGELOG.*.md messages.mo \
		vgcore* tmp/ src/config.h $(objects) $(t-objects)          \
		remembering remembering-tests src/remembering              \
		tests/test-profiles/

install: all
	mkdir -p '$(DESTDIR)$(PREFIX)/bin'
	cp src/remembering '$(DESTDIR)$(PREFIX)/bin'
	sh aux/workflow/manpages.sh -ip '$(DESTDIR)$(MANPREFIX)' $(manpages)

uninstall:
	rm -f '$(DESTDIR)$(PREFIX)/bin/remembering'
	sh aux/workflow/manpages.sh -up '$(DESTDIR)$(MANPREFIX)' $(manpages)


#
# Personal workflow targets
#

dev-check: check public
	sh aux/assert-shellcheck.sh
	sh aux/workflow/assert-todos.sh
	sh aux/workflow/assert-changelog.sh -n '$(NAME)' $(EXTRA_VERSION)
	sh aux/workflow/assert-readme.sh -n '$(NAME)' -m '$(MAILING_LIST)' \
		$(EXTRA_VERSION)
	sh aux/workflow/assert-manpages.sh -n '$(NAME)' -m '$(MAILING_LIST)' \
		-l '$(TRANSLATIONS) en' $(manpages.en.in)
	sh aux/workflow/repocheck.sh

dist:
	sh aux/workflow/dist.sh -d '$(DATE)' -V '$(VERSION)' \
		-n '$(NAME)' -m '$(MAILING_LIST)'

README.en.md: README.md
	ln -fs $? $@

CHANGELOG.en.md: CHANGELOG.md
	ln -fs $? $@

l10n-gen: README.en.md CHANGELOG.en.md $(manpages.en.in)
	sh aux/workflow/l10n.sh -l '$(TRANSLATIONS)' -L '$(CONTRIBLANGS)' $?

public/makefile.svg: Makefile
	mkdir -p '$(@D)'
	makefile2graph check | dot -Tsvg > $@

public: l10n-gen TODOs.md $(manpages) public/makefile.svg
	sh aux/workflow/public.sh -l '$(TRANSLATIONS) $(CONTRIBLANGS) en' \
		-N '$(NAME_UC)' -n '$(NAME)' -m '$(MAILING_LIST)' -o public
	sh doc/manpages.sh -Ho public $(manpages)

spellcheck: public
	sh aux/workflow/assert-spelling.sh -l '$(TRANSLATIONS) en' \
		$$(find public -type f -name '*.html')