subdirs = prog1 prog2 clean_subdirs = $(patsubst %, clean_%, $(subdirs)) .PHONY: all clean $(subdirs) $(clean_subdirs) all: $(subdirs) $(subdirs): cd $@ && $(MAKE) clean: $(clean_subdirs) $(clean_subdirs): clean_% : cd $* && $(MAKE) clean