# -*- makefile -*- include $(patsubst %,$(SRCDIR)/%/Make.tests,$(TEST_SUBDIRS)) PROGS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_PROGS)) TESTS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_TESTS)) EXTRA_GRADES = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_EXTRA_GRADES)) ALLPUTS = $(addsuffix .allput,$(TESTS) $(EXTRA_GRADES)) OUTPUTS = $(addsuffix .output,$(TESTS) $(EXTRA_GRADES)) ERRORS = $(addsuffix .errors,$(TESTS) $(EXTRA_GRADES)) RESULTS = $(addsuffix .result,$(TESTS) $(EXTRA_GRADES)) ifdef PROGS include ../../Makefile.userprog endif TIMEOUT = 60 clean:: rm -f $(OUTPUTS) $(ERRORS) $(RESULTS) $(ALLPUTS) grade:: results $(SRCDIR)/tests/make-grade $(SRCDIR) $< $(GRADING_FILE) | tee $@ # klaar@ida 2011-01-12: new rule to re-run only failed tests # use with care, it will mess with the file dates recheck:: os.dsk # @echo "Cleaning all tests that failed on last run:"; @for d in $(TESTS) $(EXTRA_GRADES); do \ if echo PASS | cmp -s $$d.result -; then \ # echo "TOUCH $$d"; \ touch $$d.??????; \ else \ # echo "CLEAN $$d"; \ rm -f $$d.??????; \ fi; \ done @$(MAKE) check @touch os.dsk @echo "WARNING: Only failed tests was rerun on new version." check:: results @cat results @COUNT="`egrep '^(pass|FAIL) ' $< | wc -l | sed 's/[ ]//g;'`"; \ FAILURES="`egrep '^FAIL ' $< | wc -l | sed 's/[ ]//g;'`"; \ if [ $$FAILURES = 0 ]; then \ echo "All $$COUNT tests passed."; \ else \ echo "$$FAILURES of $$COUNT tests failed."; \ exit 1; \ fi results: $(RESULTS) @for d in $(TESTS) $(EXTRA_GRADES); do \ if echo PASS | cmp -s $$d.result -; then \ echo "pass $$d"; \ else \ echo "FAIL $$d"; \ fi; \ done > $@ outputs:: $(OUTPUTS) $(foreach prog,$(PROGS),$(eval $(prog).output: $(prog))) $(foreach test,$(TESTS),$(eval $(test).output: $($(test)_PUTFILES))) $(foreach test,$(TESTS),$(eval $(test).output: TEST = $(test))) # Prevent an environment variable VERBOSE from surprising us. VERBOSE = # klaar@ida 2015-05-12: to run gmake check in Solaris ifneq (0, $(shell expr `uname -s` : 'Linux')) TESTCMD = pintos -v -k -T $(TIMEOUT) else TESTCMD = spintos -v -k -T $(TIMEOUT) endif TESTCMD += $(SIMULATOR) TESTCMD += $(PINTOSOPTS) ifeq ($(filter userprog, $(KERNEL_SUBDIRS)), userprog) TESTCMD += --fs-disk=$(FSDISK) TESTCMD += $(foreach file,$(PUTFILES),-p $(file) -a $(notdir $(file))) endif ifeq ($(filter vm, $(KERNEL_SUBDIRS)), vm) TESTCMD += --swap-disk=4 endif TESTCMD += -- -q # klaar@ida 2016-05: new kernel flag ifeq ($(filter -F=%, $(KERNELFLAGS)),) # BUG: Why is this not filtered out? TESTCMD += -F=10000 endif TESTCMD += $(KERNELFLAGS) ifeq ($(filter userprog, $(KERNEL_SUBDIRS)), userprog) TESTCMD += -f endif TESTCMD += $(if $($(TEST)_ARGS),run '$(*F) $($(TEST)_ARGS)',run $(*F)) TESTCMD += < /dev/null TESTCMD += 2> $(TEST).errors $(if $(VERBOSE),|tee,>) $(TEST).allput # klaar@ida 2011-01-12: added "allput" to be able to strip debug # messages before checking %.output: os.dsk $(TESTCMD) @grep -v '^# .*$$' $(TEST).allput > $(TEST).output %.result: %.ck %.output perl -I$(SRCDIR) $< $* $@