aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile157
1 files changed, 133 insertions, 24 deletions
diff --git a/Makefile b/Makefile
index b8784b2..95d66de 100644
--- a/Makefile
+++ b/Makefile
@@ -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: