.POSIX: DATE = 1970-01-01 VERSION = 0.1.0 NAME = papod NAME_UC = $(NAME) ## Installation prefix. Defaults to "/usr". PREFIX = /usr BINDIR = $(PREFIX)/bin LIBDIR = $(PREFIX)/lib INCLUDEDIR = $(PREFIX)/include SRCDIR = $(PREFIX)/src/$(NAME) SHAREDIR = $(PREFIX)/share LOCALEDIR = $(SHAREDIR)/locale MANDIR = $(SHAREDIR)/man JAVADIR = $(SHAREDIR)/java EXEC = ./ ## Where to store the installation. Empty by default. DESTDIR = LDLIBS = JAVA = java -client CLASSPATH = `printf '$(JARPATH)/%s.jar\n' $(JARDEPS) | paste -sd:` JARDEPS = \ cracha \ fiinha \ jasm \ labareda \ peer \ dtmc \ base \ clojure .SUFFIXES: .SUFFIXES: .in .clj .class .class-check .jar .jar-check .adoc .po .mo .SUFFIXES: .sh .sh-check .in: sed \ -e 's:@VERSION@:$(VERSION):g' \ -e 's:@DATE@:$(DATE):g' \ -e 's:@NAME@:$(NAME):g' \ -e 's:@JAVADIR@:$(JAVADIR):g' \ -e "s_@CLASSPATH@_$(CLASSPATH)_g" \ < $< > $@ if [ -x $< ]; then chmod +x $@; fi .adoc: asciidoctor -b manpage -o $@ $< .po.mo: msgfmt -cfv -o $@ $< all: include deps.mk integration.sh-check = $(integration.sh:.sh=.sh-check) fuzz.class-check = $(fuzz.clj:.clj=.class-check) inits = \ src/$(NAME)__init.class \ tests/unit__init.class \ tests/integration__init.class \ $(fuzzinit.class) \ manpages.N.adoc = $(manpages.en.N.adoc) $(manpages.XX.N.adoc) manpages.N = $(manpages.N.adoc:.adoc=) doc/$(NAME).en.3 sources.mo = $(sources.po:.po=.mo) sources = \ src/$(NAME).bin.in \ src/$(NAME).clj \ src/labareda.edn \ derived-assets = \ $(inits) \ $(NAME).jar \ unit.jar \ integration.jar \ src/$(NAME).bin \ schema.edn \ src/cli.edn \ $(manpages.XX.N.adoc) \ $(manpages.N) \ $(sources.mo) \ doc/$(NAME).en.3.adoc \ side-assets = \ src/$(NAME)/ \ src/*.class \ tests/*.class \ tests/fuzz/*.class \ datomic.log \ $(NAME).daemon.socket \ $(NAME).commander.socket \ ## Default target. Builds all artifacts required for testing ## and installation. all: $(derived-assets) $(inits): Makefile deps.mk $(integration.sh): $(NAME).jar $(fuzzinit.class): $(NAME).jar src/$(NAME)__init.class: src/$(NAME).clj tests/unit__init.class: tests/unit.clj $(NAME).jar tests/integration__init.class: tests/integration.clj $(NAME).jar $(inits): rm -f $@ JAR=`if [ $(@D) != 'src' ]; then echo $(NAME).jar:; fi`; \ DIR=`echo $@ | cut -d/ -f1`; \ NS=`echo $@ | cut -d/ -f2- | sed 's/__.*$$//' | tr / .`; \ $(JAVA) -ea --class-path $$DIR:$$JAR$(CLASSPATH) clojure.main -e \ "(binding [*compile-path* \"$$DIR\"] \ (compile '$$NS))" src/cli.edn: src/labareda.edn labareda compile < src/labareda.edn > $@ $(NAME).jar: src/$(NAME)__init.class src/cli.edn cd src && jar -cvf ../$@ `find . -name '*.class'` cli.edn unit.jar: tests/unit__init.class integration.jar: tests/integration__init.class unit.jar integration.jar: cd tests && jar -cvf ../$@ $**.class schema.edn: $(NAME).jar $(JAVA) -ea --class-path $(NAME).jar:$(CLASSPATH) clojure.main -e \ "(do (require '$(NAME) 'clojure.pprint) \ (clojure.pprint/pprint @#'$(NAME)/schema))" > $@ $(manpages.XX.N.adoc): po/doc/po4a.cfg po4a --no-update --translate-only $@ po/doc/po4a.cfg doc/$(NAME).en.3.adoc: $(NAME).jar env CLASSPATH="$(CLASSPATH)" base $(NAME).jar > $@ src/schema.edn-check: schema.edn diff -U10 src/schema.edn schema.edn unit.jar-check: unit.jar integration.jar-check: integration.jar unit.jar-check integration.jar-check: $(JAVA) -ea --class-path $*.jar:$(NAME).jar:$(CLASSPATH) $* check-unit: unit.jar-check check-unit: src/schema.edn-check $(integration.sh-check): env CLASSPATH="$(CLASSPATH)" \ sh $*.sh check-integration: integration.jar-check check-integration: $(integration.sh-check) check-integration: fuzz ## Run all tests. Each test suite is isolated, so that a parallel ## build can run tests at the same time. The required artifacts ## are created if missing. check-acceptance: papod.jar sh tests/acceptance.sh \ --tb=short -q check: check-unit check-integration FUZZSEC=1 $(fuzz.class-check): $(JAVA) -ea --class-path tests:$(NAME).jar:$(CLASSPATH) \ `echo $* | cut -d/ -f2- | tr / .` $(FUZZSEC) fuzz: $(fuzz.class-check) ## Remove *all* derived artifacts produced during the build. ## A dedicated test asserts that this is always true. clean: rm -rf $(derived-assets) $(side-assets) ## Installs into $(DESTDIR)$(PREFIX). Its dependency target ## ensures that all installable artifacts are crafted beforehand. install: all mkdir -p \ '$(DESTDIR)$(BINDIR)' \ '$(DESTDIR)$(JAVADIR)' \ '$(DESTDIR)$(SRCDIR)' \ cp src/$(NAME).bin '$(DESTDIR)$(BINDIR)'/$(NAME) cp $(NAME).jar '$(DESTDIR)$(JAVADIR)' cp $(sources) '$(DESTDIR)$(SRCDIR)' instool '$(DESTDIR)$(MANDIR)' install man $(manpages.N) instool '$(DESTDIR)$(LOCALEDIR)' install mo $(sources.mo) ## Uninstalls from $(DESTDIR)$(PREFIX). This is a perfect mirror ## of the "install" target, and removes *all* that was installed. ## A dedicated test asserts that this is always true. uninstall: rm -rf \ '$(DESTDIR)$(BINDIR)'/$(NAME) \ '$(DESTDIR)$(JAVADIR)'/$(NAME).jar \ '$(DESTDIR)$(SRCDIR)' \ instool '$(DESTDIR)$(MANDIR)' uninstall man $(manpages.N) instool '$(DESTDIR)$(LOCALEDIR)' uninstall mo $(sources.mo) ## Run it locally. run: all java $(JAVA) -ea --class-path $(NAME).jar:$(CLASSPATH) papod ALWAYS: