diff options
Diffstat (limited to 'rules.mk')
-rw-r--r-- | rules.mk | 93 |
1 files changed, 73 insertions, 20 deletions
@@ -1,36 +1,88 @@ -# for each target.SRCS, generate target.OBJS, target.a and add target.OBJS to all +# generate objects from sources +# args 1: target.SRCS +# returns: target.OBJS +objects = $(foreach f,$($1),$(addsuffix _${ARCH}.o,$(basename $f))) + +# generate depends from .S .c .cpp sources +# args 1: target.SRCS +# returns: target.DEPS +depends = $(foreach f,$(filter %.S %.c %.cpp,$($1)),$(addsuffix .d,$(basename $f))) + +# default target +all: targets + @echo " -> Built all in $(shell pwd | xargs basename)" + +# for each target.SRCS +# - generate target.OBJS +# - generate target.DEPS and include them +# - generate target.a that depends on target.OBJS +# - add target.a to TARGETS $(foreach V,$(filter %.SRCS, ${.VARIABLES}),\ - $(eval $(V:%.SRCS=%.OBJS) += $(foreach f,$($(V)),$(addsuffix .o,$(basename $(f))))) \ + $(eval $(V:%.SRCS=%.OBJS) := $(call objects,$V)) \ + $(eval TARGET.OBJS += $(V:%.SRCS=%.OBJS)) \ + $(eval $(V:%.SRCS=%.DEPS) := $(call depends,$V)) \ + $(eval include $($(V:%.SRCS=%.DEPS))) \ + $(eval TARGET.DEPS += $(V:%.SRCS=%.DEPS)) \ $(eval $(V:%.SRCS=%.a): $($(V:%.SRCS=%.OBJS))) \ - $(eval all: $($(V:%.SRCS=%.OBJS))) \ + $(eval TARGETS += $(V:%.SRCS=%.a)) \ ) +TESTS.DEPS = $(foreach F,${TESTS},$(addsuffix .d,$F)) +include ${TESTS.DEPS} + +debug: + @echo "targets: ${TARGETS}" + @echo " OBJS: ${TARGET.OBJS}" + @echo " DEPS: ${TARGET.DEPS}" + @echo "tests : ${TESTS}" + @echo " DEPS: ${TESTS.DEPS}" + +%.info: + @echo "Target: $(basename $@)" + @echo " SRCS: ${$(basename $@).SRCS}" + @echo " OBJS: ${$(basename $@).OBJS}" + @echo " DEPS: ${$(basename $@).DEPS}" + +targets: ${TARGETS} + # extra flags CFLAGS += -I../lib \ -Werror=implicit-function-declaration CXXFLAGS += -I../lib -Drestrict=__restrict__ +# Depndency rules +%.d: %.S + @${CC} ${CFLAGS} -M -MT $(<:.S=_${ARCH}.o) $< -MF $@ + +%.d: %.c + @${CC} ${CFLAGS} -M -MT $(<:.c=_${ARCH}.o) $< -MF $@ + +%.d: %.cpp + @${CXX} ${CXXFLAGS} -M -MT $(<:.cpp=_${ARCH}.o) $< -MF $@ + +%.d: %.cc + @${TEST_CXX} ${TEST_CXXFLAGS} -M -MT $(<:.cc=_${ARCH}.o) $< -MF $@ + # Suffix rules -.SUFFIXES: .s .S .c .cpp .o %.a: @echo ' AR $@' @${AR} ${ARFLAGS} $@ $(filter %.o,$^) -.s.o: - @echo ' AS $^' - @$(AS) $(ASFLAGS) -c -o $@ $^ +%_${ARCH}.o: %.s + @echo ' AS $<' + @$(AS) $(ASFLAGS) -c -o $@ $< -.S.o: - @echo ' CC $^' - @$(CC) $(CFLAGS) -c -o $@ $^ +%_${ARCH}.o: %.S + @echo ' CC $<' + @$(CC) $(CFLAGS) -c -o $@ $< -.c.o: - @echo ' CC $^' - @$(CC) $(CFLAGS) -c -o $@ $^ +%_${ARCH}.o: %.c + @echo ' CC $<' + @$(CC) $(CFLAGS) -c -o $@ $< -.cpp.o: - @echo ' CXX $^' - @$(CXX) $(CXXFLAGS) -c -o $@ $^ +%_${ARCH}.o: %.cpp + @echo ' CXX $<' + @$(CXX) $(CXXFLAGS) -c -o $@ $< %.elf: @echo ' LD $@' @@ -39,24 +91,25 @@ CXXFLAGS += -I../lib -Drestrict=__restrict__ @b2sum $@ | cut -d' ' -f1 # test rules -tst/test_%: tst/%.cc +tst/%: tst/%.cc @echo ' CXX TEST $@' @$(TEST_CXX) $(TEST_CXXFLAGS) $< -o $@ .PHONY: test.base valgrind.base clean.base FORCE -test.base: $(TESTS) +test.base: ${TESTS} @echo " -> Running tests in $(shell pwd | xargs basename)" @$(foreach f,$^,echo " -> $f"; ./$f &&) echo "Done" -valgrind.base: $(TESTS) +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))) + @$(foreach V,$(filter %.DEPS, ${.VARIABLES}), rm -rf $($(V))) @rm -rf *.a - @rm -rf tst/test_* + @rm -rf ${TESTS} %: %.base ; |