# for each target.SRCS, generate target.OBJS, target.a and add target.OBJS to all $(foreach V,$(filter %.SRCS, ${.VARIABLES}),\ $(eval $(V:%.SRCS=%.OBJS) += $(foreach f,$($(V)),$(addsuffix .o,$(basename $(f))))) \ $(eval $(V:%.SRCS=%.a): $($(V:%.SRCS=%.OBJS))) \ $(eval all: $($(V:%.SRCS=%.OBJS))) \ ) # extra flags CFLAGS += -isysteminclude -I../lib \ -Werror=implicit-function-declaration CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ \ -Werror=shadow # Suffix rules .SUFFIXES: .s .S .c .cpp .o %.a: @echo ' AR $@' @${AR} ${ARFLAGS} $@ $(filter %.o,$^) .s.o: @echo ' AS $^' @$(AS) $(ASFLAGS) -c -o $@ $^ .S.o: @echo ' CC $^' @$(CC) $(CFLAGS) -c -o $@ $^ .c.o: @echo ' CC $^' @$(CC) $(CFLAGS) -c -o $@ $^ .cpp.o: @echo ' CXX $^' @$(CXX) $(CXXFLAGS) -c -o $@ $^ %.elf: @echo ' LD $@' @${LD} ${LDFLAGS} -o $@ $^ @echo -n ' B2b ' @b2sum $@ | cut -d' ' -f1 # test rules tst/test_%: tst/%.cc @echo ' CXX TEST $@' @$(TEST_CXX) $(TEST_CXXFLAGS) $< -o $@ .PHONY: test.base valgrind.base clean.base FORCE test.base: $(TESTS) @echo " -> Running tests in $(shell pwd | xargs basename)" @$(foreach f,$^,echo " -> $f"; ./$f &&) echo "Done" valgrind.base: $(TESTS) @echo " -> Running valgrind on tests in $(shell pwd | xargs basename)" @$(foreach f,$^,echo " -> $f"; valgrind --leak-check=full ./$f;) clean.base: FORCE @echo " -> Cleaning $(shell pwd | xargs basename)" @$(foreach V,$(filter %.OBJS, ${.VARIABLES}), rm -rf $($(V))) @rm -rf *.a @rm -rf include @rm -rf tst/test_* %: %.base ; FORCE: ;