# 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 CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ # Suffix rules %.a: @echo ' AR $@' @${AR} ${ARFLAGS} $@ $(filter %.o,$^) .SUFFIXES: .s .S .c .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 $@ $^ # Test rules TEST_CXX := c++ GTEST := $(shell pkg-config --cflags --libs gtest gtest_main) GMOCK := $(shell pkg-config --cflags --libs gmock) tst/test_%: tst/%.cc @echo ' CXX TEST $@' @$(TEST_CXX) $< -o $@ $(GTEST) $(GMOCK) .PHONY: test valgrind test: $(TESTS) $(foreach f,$^,./$f;) valgrind: $(TESTS) $(foreach f,$^,valgrind --leak-check=full ./$f;) # clean target .PHONY: clean FORCE clean: @$(foreach V,$(filter %.OBJS, ${.VARIABLES}), rm -rf $($(V))) @rm -rf include @rm -rf tst/test_* FORCE: