TESTS = examples threads p1 userprog p2 vm p3 filesys p4 PATH := $(shell pwd)/../src/utils:$(PATH) all: @echo "This Makefile has only \`check' targets." check: $(MAKE) -C .. distclean for d in $(TESTS); do $(MAKE) $$d || exit 1; done @echo All tests passed. clean: rm -rf $(TESTS) define mk-sandbox rm -rf $@ && mkdir $@ && cp -R ../src $@/src cd $@/src && $(MAKE) -s clean endef define run-tests cd $@/src/$(PROJECT) && time $(MAKE) check endef define grade-tests cd $@/src/$(PROJECT) && $(MAKE) grade cd $@/src/$(PROJECT) && grep -q PERFECT build/grade cd $@/src/$(PROJECT) && grep -qv warning build/grade endef define compile cd $@/src/$(PROJECT) && $(MAKE) endef define clean rm -rf $@ endef define apply-patch (cd $@ && patch -p0) < ../solutions/$@.patch endef PROJECT = $@ p1: PROJECT = threads p2: PROJECT = userprog p3: PROJECT = vm p4: PROJECT = filesys # Tests that just compile the provided code. threads:: $(mk-sandbox) $(compile) $(run-tests) TESTS=tests/threads/alarm-single $(clean) examples userprog vm filesys:: $(mk-sandbox) $(compile) $(clean) # Tests for the reference solutions. p1 p2 p3 p4:: $(mk-sandbox) $(apply-patch) $(run-tests) $(grade-tests) $(clean)