diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 157 |
1 files changed, 133 insertions, 24 deletions
@@ -1,44 +1,153 @@ .POSIX: -PREFIX = /usr -NAME = siphash -LIBDIR = $(PREFIX)/lib -INCLUDEDIR = $(PREFIX)/include -SRCDIR = $(PREFIX)/src/$(NAME) +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 = -all: lib$(NAME).a -lib$(NAME).a: lib$(NAME).a($(NAME).o) -lib$(NAME).a: lib$(NAME).a(halfsiphash.o) +.SUFFIXES: +.SUFFIXES: .in .c .o .a .bin .bin-check -$(NAME).o: $(NAME).h -halfsiphash.o: halfsiphash.h +.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 $< -test.o: halfsiphash.h siphash.h vectors.h -test.bin: test.o testmain.o lib$(NAME).a - $(CC) $(LDFLAGS) -o $@ test.o testmain.o lib$(NAME).a $(LDLIBS) +.a.bin: + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) -check: test.bin - ./test.bin +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 -f *.o *.a - rm -f test.bin + 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)' \ - '$(DESTDIR)$(SRCDIR)' - cp lib$(NAME).a '$(DESTDIR)$(LIBDIR)' - cp $(NAME).h '$(DESTDIR)$(INCLUDEDIR)' - cp $(NAME).h $(NAME).c '$(DESTDIR)$(SRCDIR)' + 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)$(LIBDIR)'/lib$(NAME).a \ - '$(DESTDIR)$(INCLUDEDIR)'/$(NAME).h \ - '$(DESTDIR)$(SRCDIR)' + '$(DESTDIR)$(BINDIR)'/$(NAME) \ + '$(DESTDIR)$(LIBDIR)'/lib$(NAME).a \ + '$(DESTDIR)$(INCLUDEDIR)'/$(NAME).h \ + '$(DESTDIR)$(SRCDIR)' \ + + + +ALWAYS: |