SUBDIRS := $(shell ls -1d */ 2> /dev/null |sed s/\\///) OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c)) $(patsubst %.cc,%.o,$(wildcard *.cc)) CXXFLAGS := -O3 CFLAGS := -O3 LINKER_OPTIONS := -ldl -lpthread #called in the top directory main: $(OBJECTS) subdirs $(CXX) -o main `find . -name "*.o"` $(LINKER_OPTIONS) @echo building complete #all submakes run this .PHONY: recurse recurse: $(OBJECTS) subdirs #auto dependency generation for C and C++ .depend: $(CXX) -MM *.c* > .depend -include .depend #recursively call make on all subdirs .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) #run Makefile if it exists in directory, otherwise copy and recurse $(SUBDIRS): cp Makefile $@ $(MAKE) -C $@ recurse .PHONY: clean clean: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir clean_recurse; \ done rm -f main .depend *.o .PHONY: clean_recurse clean_recurse: rm -f .depend Makefile *.o