.POSIX: DATE = 1970-01-01 VERSION = 0.1.0 NAME = siphash 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 EXEC = ./ ## Where to store the installation. Empty by default. DESTDIR = LDLIBS = .SUFFIXES: .SUFFIXES: .in .c .o .a .bin .bin-check .in: sed \ -e 's:@VERSION@:$(VERSION):g' \ -e 's:@DATE@:$(DATE):g' \ -e 's:@NAME@:$(NAME):g' \ < $< > $@ if [ -x $< ]; then chmod +x $@; fi .c.o: $(CC) $(CFLAGS) -o $@ -c $< .a.bin: $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) all: include deps.mk sources.h = $(sources.c:.c=.h) sources.o = $(sources.c:.c=.o) tests.o = $(tests.c:.c=.o) tests.a = $(tests.c:.c=.a) tests.bin = $(tests.c:.c=.bin) objects = \ $(sources.o) \ $(tests.o) \ src/main.o \ archives = \ lib$(NAME).a \ $(tests.a) \ $(NAME).a \ sources = \ $(sources.c) \ $(sources.h) \ src/meta.h.in \ src/meta.h \ src/main.c \ src/$(NAME).h \ derived-assets = \ $(objects) \ $(archives) \ src/meta.h \ $(tests.bin) \ $(NAME).bin \ side-assets = \ ## Default target. Builds all artifacts required for testing ## and installation. all: $(derived-assets) lib$(NAME).a: $(sources.o) $(NAME).a: $(sources.o) src/main.o src/meta.h $(objects): Makefile deps.mk src/main.o: src/$(NAME).h $(archives): $(AR) $(ARFLAGS) $@ $? tests.bin-check = $(tests.c:.c=.bin-check) $(tests.bin-check): $(EXEC)$*.bin check-unit: $(tests.bin-check) integration-tests = \ tests/cli-opts.sh \ tests/assert-identical.sh \ $(integration-tests): $(NAME).bin ALWAYS sh $@ $(EXEC)$(NAME).bin check-integration: $(integration-tests) ## 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: check-unit check-integration ## 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)$(LIBDIR)' \ '$(DESTDIR)$(SRCDIR)' \ '$(DESTDIR)$(INCLUDEDIR)' \ cp $(NAME).bin '$(DESTDIR)$(BINDIR)'/$(NAME) cp lib$(NAME).a '$(DESTDIR)$(LIBDIR)' cp src/$(NAME).h '$(DESTDIR)$(INCLUDEDIR)' cp $(sources) '$(DESTDIR)$(SRCDIR)' ## 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)$(LIBDIR)'/lib$(NAME).a \ '$(DESTDIR)$(INCLUDEDIR)'/$(NAME).h \ '$(DESTDIR)$(SRCDIR)' \ ALWAYS: