          | | |
MakefileCXX=g++ LD=ld INC_PATH=#-Iwhatever LIB_PATH=#-Lwhatever CXXFLAGS=-g -Wall -Wextra -O3 LDFLAGS=-lm -lpthread
pc:=% rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
.SUFFIXES: .PHONY: all all: program ifneq ($(MAKECMDGOALS),clean) include $(call rwildcard,.build,*.d) endif
program: .build/main.o .build/supporting.o $(CXX) -B$(LD) -o $@ $(LIB_PATH) $(LDFLAGS) $^
.SECONDEXPANSION: .build/%.o .build/%.o: $$(patsubst .build/$$(pc).o,$$(pc).cpp,$$@) $$(patsubst $$(pc).o,$$(pc).cpp.d,$$@) | DIR/$$@ $(CXX) $(CXXFLAGS) $(INC_PATH) -I$(dir $<) -c -o $@ $<
.PHONY: clean clean: rm -rf .build rm -f program
.SECONDEXPANSION: .build/%.d .build/%.d: % | DIR/$$@ @{ printf "%s " $@; $(CXX) -M$(if $(filter g%,$(CXX)),M) $(INC_PATH) -I$(dir $<) $<; } > $@.new @{ [ ! -f $@ ] || [ -z "$$(cksum $@ $@.new | tr -d .new | uniq -u)" ]; } && mv -f $@.new $@ || rm $@.new
DIR/%: @[ -d $* ] || mkdir -p $(dir $*) # https://stackoverflow.com/a/18726681 NOOP/%: @:
| | |