aboutsummaryrefslogtreecommitdiff
path: root/rules.mk
diff options
context:
space:
mode:
Diffstat (limited to 'rules.mk')
-rw-r--r--rules.mk80
1 files changed, 44 insertions, 36 deletions
diff --git a/rules.mk b/rules.mk
index 05994ab..833664d 100644
--- a/rules.mk
+++ b/rules.mk
@@ -5,50 +5,53 @@
objects = $(foreach f,$($1),$(addsuffix $2.o,$(basename $f)))
# generate depends from .S .c .cpp sources
-# args 1: target.SRCS
+# arg 1: target.SRCS
+# arg 2: dependency suffix prefix
# returns: target.DEPS
-depends = $(foreach f,$(filter %.S %.c %.cpp,$($1)),$(addsuffix .d,$(basename $f)))
+depends = $(foreach f,$(filter %.S %.c %.cpp,$($1)),$(addsuffix $2.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) := $(call objects,$V,_${ARCH})) \
- $(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 TARGETS += $(V:%.SRCS=%.a)) \
+
+
+# TARGETBIN: binaries using the target architecture
+$(foreach T,${TARGETBIN},\
+ $(eval $T.OBJS += $(call objects,$T.SRCS,_${ARCH}) ) \
+ $(eval $T.DEPS += $(call depends,$T.SRCS,_${ARCH}) ) \
+ $(eval include $($T.DEPS) ) \
+ $(eval $T.elf: ${$T.OBJS} ) \
+ $(eval DEFAULT_TARGETS += $T.elf) \
+)
+
+# TARGETLIB: static libraries using the target architecture
+$(foreach T,${TARGETLIB},\
+ $(eval $T.OBJS += $(call objects,$T.SRCS,_${ARCH}) ) \
+ $(eval $T.DEPS += $(call depends,$T.SRCS,_${ARCH}) ) \
+ $(eval include $($T.DEPS) ) \
+ $(eval $T.a: ${$T.OBJS} ) \
+ $(eval DEFAULT_TARGETS += $T.a) \
)
-# for each target in HOSTTARGETBIN
-# - generate target.OBJS from target.SRCS
-# - generate target.DEPS from target.SRCS
-# - include target.DEPS
-# - generate target.exe depending on target.OBJS
+# HOSTTARGETBIN: binaries using the host compiler
$(foreach T,${HOSTTARGETBIN},\
- $(eval $T.OBJS := $(call objects,$T.SRC,) ) \
- $(eval $T.DEPS := $(call depends,$T.SRC) ) \
+ $(eval $T.OBJS += $(call objects,$T.SRCS,) ) \
+ $(eval $T.DEPS += $(call depends,$T.SRCS,) ) \
+ $(eval include $($T.DEPS) ) \
$(eval $T: ${$T.OBJS}; @echo ' LD HOST $T'; ${HOST_CC} ${HOST_LDFLAGS} -o $T ${$T.OBJS} ) \
+ $(eval DEFAULT_TARGETS += $T) \
)
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}"
- @echo "HOSTTARGETBIN: ${HOSTTARGETBIN}"
+ @echo "TARGETBIN ${TARGETBIN}"
+ @echo "TARGETLIB ${TARGETLIB}"
+ @echo "HOSTTARGETBIN ${HOSTTARGETBIN}"
+ @echo "HOSTTARGETLIB ${HOSTTARGETLIB}"
+ @echo "DEFAULT_TARGETS ${DEFAULT_TARGETS}"
+ @echo "TESTS ${TESTS}"
+ @echo " DEPS ${TESTS.DEPS}"
%.info:
@echo "Target: $(basename $@)"
@@ -56,25 +59,30 @@ debug:
@echo " OBJS: ${$(basename $@).OBJS}"
@echo " DEPS: ${$(basename $@).DEPS}"
-targets: ${TARGETS}
+targets: ${DEFAULT_TARGETS}
+ @echo " -> Built ${DEFAULT_TARGETS}"
# extra flags
${ARCH}_CFLAGS += -I../lib/libk \
-Werror=implicit-function-declaration
${ARCH}_CXXFLAGS += -I../lib/libk -Drestrict=__restrict__
-# Depndency rules
-%.d: %.S
+# Target depndency rules
+%_${ARCH}.d: %.S
@${${ARCH}_CC} ${${ARCH}_CFLAGS} -M -MT $(<:.S=_${ARCH}.o) $< -MF $@
-%.d: %.c
+%_${ARCH}.d: %.c
@${${ARCH}_CC} ${${ARCH}_CFLAGS} -M -MT $(<:.c=_${ARCH}.o) $< -MF $@
-%.d: %.cpp
+%_${ARCH}.d: %.cpp
@${${ARCH}_CXX} ${${ARCH}_CXXFLAGS} -M -MT $(<:.cpp=_${ARCH}.o) $< -MF $@
+# Host dependency rules
+%.d: %.c
+ @${HOST_CC} ${HOST_CFLAGS} -M -MT $(<:.c=.o) $< -MF $@
+
%.d: %.cc
- @${HOST_CXX} ${HOST_CXXFLAGS} -M -MT $(<:.cc=_${ARCH}.o) $< -MF $@
+ @${HOST_CXX} ${HOST_CXXFLAGS} -M -MT $(<:.cc=) $< -MF $@
# Target suffix rules
%.a: