foo1: x1 x3 .WAIT x2 foo2: x2 .WAIT x3 foo3: x1 x2 x3 foo4: y1 y2 y3 1: A .WAIT B 2: B .WAIT C 3: C .WAIT A 4: C A x2 x3 y1 y2 y3 A B C: echo $@ ; sleep 2 ; echo finished $@ x1: echo $@ ; sleep 4 ; echo finished $@ all: a b $(WAIT) c d s-e s-f all2: a b c $(WAIT) d e $(WAIT) f g h $(WAIT) i $(WAIT) $(WAIT) j k all3: a b sub3 i j all4: a b sub4 i j .PHONY: all1 all2 all3 sub3 clean sub3: c d e f g h .NOTPARALLEL: sub3 sub4: c .WAIT d .WAIT e .WAIT f .WAIT g .WAIT h clean: rm -f [a-k] [stu]-* a b c d e f g h i j k: @echo Starting update of $@; sleep 2; echo touch $@; echo Finished update of $@ s-%: u-% $(WAIT) t-% @echo Starting update of $@; sleep 2; echo touch $@; echo Finished update of $@ t-%: @echo Starting update of $@; sleep 2; echo touch $@; echo Finished update of $@ u-%: @echo Starting update of $@; sleep 2; echo touch $@; echo Finished update of $@