From c329c44db94a941974d6bfc8a8f661ebf5efa615 Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 5 Mar 2023 11:33:30 +0200 Subject: Add TARGETBIN and TARGETLIB rules --- rules.mk | 80 +++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 36 deletions(-) (limited to 'rules.mk') 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: -- cgit v1.2.1