define SRC_LANG_RULE =
$(if $($1),,$(eval $1 := t)\
$(eval MOD := $(filter $(MODULES),$(firstword $(subst /, ,$(subst $(SRC_DIR),,$(dir $1))))))\
-$(eval FLG := $(MOD:%=-I% ))\
+$(eval FLG := $(MOD:%=-I$(SRC_DIR)/% ))\
$(if $(wildcard $1),
$(eval DEPS := $(filter-out \ %:,$(shell $($2_C) $(FLG) -M -MG $1)))\
$(eval DDEPS := $(filter $(DRIVER_DIR:$(SRC_DIR)/%=%/%),$(DEPS)))\
$(eval DRIVER_LDVALS := $(file <$(1:%.$2=%.ld)))
$(eval DRIVER_LFLAGS := $(filter -l%,$(DRIVER_LDVALS)))
$(eval DRIVER_MODULES += $(filter-out -l%,$(DRIVER_LDVALS)))
-
+$(eval DRIVER_MODULES := $(sort $(DRIVER_MODULES)))
# List of module archives to link together during compilation
$(eval DRIVER_ARCHIVES := $(DRIVER_MODULES:%=$(SRC_DIR)/%.$($2_AROBJ)))
$(eval DRIVER_DEPS := $(DRIVER_SOB) $(DRIVER_ARCHIVES))
# a single locally-linked (no external -L libs) object (for simplified linking
# modules as static libs).#######################################################
define MODULE_ARCRULE =
-$(eval ARCDEPS := $(filter $1/%.$(c_OBJ),$(foreach lang,$(LANGS),$($(lang)_MOD_TRG))))\
-$(eval MAKE_TARGETS+= $1.$(c_AROBJ))\
+$(eval ARCDEPS := $(filter $(SRC_DIR)/$1/%.$(c_OBJ),$(foreach lang,$(LANGS),$($(lang)_MOD_TRG))))\
+$(eval MAKE_TARGETS+= $(SRC_DIR)/$1.$(c_AROBJ))\
$(SRC_DIR)/$1.$(c_AROBJ): $(ARCDEPS)
$(c_AR) cr $$@ $$^