# unit-tests.mk: build test programs and run them for `make test'
#
################################################################
# Copyright (C) 2001, 2002 Tom Lord
#
# See the file "COPYING" for further information about
# the copyright and warranty status of this work.
#
ifndef unit-tests-mk
unit-tests-mk := 1
# Build and run unit tests.
#
# Optionally set on entry:
#
# $(mains) a list of source files defining "main"
# (default "$(notdir $(wildcard $(srcdir)/unit-*.c) $(wildcard $(srcdir)/test-*.c))")
#
# $(libs) additional libraries to link against
# (no default)
#
# $(test-scripts) a list of shell scripts that perform tests
# (default "$(wildcard $(srcdir)/*.sh)")
#
# $(test-headers) a list of headers that should compile in isolation
# (default none)
#
# If $(test-headers) is not defined, it can be derived from two other
# optional variables:
#
# $(tested-headers) a list of headers to test, relative to some
# some root directory
#
# $(tested-prefix) the root directory for $(tested-headers)
#
# For each tested header, "foo.h", `make all' compiles "hdr-foo.c" which
# does nothing but include "foo.h".
#
# Derived:
#
# $(test-progs) := $(patsubst %.c, %, $(mains))
#
#
# Target `test' depends on `tests-timestamp'.
#
# `tests-timestamp' depends on `test-progs' and `test-scripts'.
# The action is to run all scripts. If they all exit with status 0,
# then `touch tests-timestamp'.
#
# After "make all", the build directory will contain "Programs" which
# contains the names of the programs that were built. (See also
# "programs.mk")
#
ifndef mains
mains := $(notdir $(wildcard $(srcdir)/unit-*.c) $(wildcard $(srcdir)/test-*.c))
endif
include $(makefiles)/programs.mk
ifndef test-progs
test-progs := $(patsubst %.c, %, $(mains))
endif
ifndef test-scripts
test-scripts := $(wildcard $(srcdir)/*.sh)
endif
ifndef test-headers
ifdef tested-headers
ifdef tested-prefix
test-headers := $(addprefix $(tested-prefix)/, $(tested-headers))
else
test-headers := $(tested-headers)
endif
endif
endif
header-prog = $(addprefix hdr-, $(patsubst %.h, %.c, $(notdir $(1))))
header-obj = $(addprefix hdr-, $(patsubst %.h, %.o, $(notdir $(1))))
prog-header = $(filter %/$(patsubst hdr-%.c,%.h,$(1)), $(test-headers))
header-objs := $(call header-obj, $(test-headers))
header-progs := $(call header-prog, $(test-headers))
header-deps := $(patsubst %.c, %.d, $(header-progs))
################################################################
# header file compilation tests (at "make all")
#
################################################################
all: $(header-objs)
$(header-progs):
echo "#include \"$(call prog-header, $@)\"" > $@
ifndef clean-only
ifneq "$(header-deps)" ""
-include $(header-deps)
endif
endif
################################################################
# test script execution (at "make test")
#
################################################################
test: tests-timestamp
ifeq ($(test-scripts),)
tests-timestamp: $(test-progs)
else
tests-timestamp: $(test-progs) $(test-scripts)
objroot=$(objroot) ; \
export objroot ; \
srcroot=$(srcroot) ; \
export srcroot ; \
set -e ; \
for s in $(test-scripts) ; do \
$(SHELL) $$s; \
done
touch tests-timestamp
endif
################################################################
# clean target
#
################################################################
clean: clean-unit-tests
clean-unit-tests:
for f in tests-timestamp $(header-progs) $(header-objs) $(header-deps) ; do \
test ! -e $$f || rm $$f ; \
done
endif
# arch-tag: Tom Lord Tue Dec 4 14:47:19 2001 (unit-tests.mk)
#
syntax highlighted by Code2HTML, v. 0.9.1