aboutsummaryrefslogtreecommitdiff
path: root/rules.mk
diff options
context:
space:
mode:
Diffstat (limited to 'rules.mk')
-rw-r--r--rules.mk93
1 files changed, 73 insertions, 20 deletions
diff --git a/rules.mk b/rules.mk
index bfaf2e1..a3a2b52 100644
--- a/rules.mk
+++ b/rules.mk
@@ -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 ;