ifeq (, $(__RIOTBUILD_FLAG)) $(error You cannot build a module on its own. Use "make" in your application's directory instead.) endif # # enable second expansion of prerequisites. # # Doing that here enables it globally for all modules and the application. # # See https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html # for what it can be used for. .SECONDEXPANSION: unexport DIRS DIRS := $(sort $(abspath $(DIRS))) MODULE ?= $(shell basename $(CURDIR)) .PHONY: all clean $(DIRS:%=ALL--%) $(DIRS:%=CLEAN--%) all: $(BINDIR)/$(MODULE).a ..nothing ..nothing: @: clean:: $(DIRS:%=CLEAN--%) $(DIRS:%=ALL--%): $(QQ)"$(MAKE)" -C $(@:ALL--%=%) $(DIRS:%=CLEAN--%): $(QQ)"$(MAKE)" -C $(@:CLEAN--%=%) clean ## submodules ifeq (1, $(SUBMODULES)) # don't use *.c as SRC if SRC is empty (e.g., no module selected) NO_AUTO_SRC := 1 # allow different submodule basename (e.g., MODULE=cpu_periph_common, but match just periph_%) BASE_MODULE ?= $(MODULE) # for each $(BASE_MODULE)_ in USEMODULE, add .c to SRC SRC += $(patsubst $(BASE_MODULE)_%,%.c,$(filter $(BASE_MODULE)_%,$(USEMODULE))) # don't fail if a selected *.c file does not exist ifeq (1, $(SUBMODULES_NOFORCE)) SRC := $(filter $(SRC), $(wildcard *.c)) endif endif # By default consider C++ files has a .cpp extension SRCXXEXT ?= cpp ifeq ($(strip $(SRC))$(NO_AUTO_SRC),) SRC := $(filter-out $(SRC_NOLTO), $(wildcard *.c)) endif ifeq ($(strip $(SRCXX))$(NO_AUTO_SRC),) SRCXX := $(wildcard *.$(SRCXXEXT)) endif ifeq ($(strip $(ASMSRC))$(NO_AUTO_SRC),) ASMSRC := $(wildcard *.s) endif ifeq ($(strip $(ASSMSRC))$(NO_AUTO_SRC),) ASSMSRC := $(wildcard *.S) endif # include makefile snippets for packages in $(USEPKG) that modify GENSRC: -include $(USEPKG:%=$(RIOTPKG)/%/Makefile.gensrc) GENOBJC := $(GENSRC:%.c=%.o) OBJC_LTO := $(SRC:%.c=$(BINDIR)/$(MODULE)/%.o) OBJC_NOLTO := $(SRC_NOLTO:%.c=$(BINDIR)/$(MODULE)/%.o) OBJC := $(OBJC_NOLTO) $(OBJC_LTO) OBJCXX := $(SRCXX:%.$(SRCXXEXT)=$(BINDIR)/$(MODULE)/%.o) ASMOBJ := $(ASMSRC:%.s=$(BINDIR)/$(MODULE)/%.o) ASSMOBJ := $(ASSMSRC:%.S=$(BINDIR)/$(MODULE)/%.o) OBJ := $(OBJC) $(OBJCXX) $(ASMOBJ) $(ASSMOBJ) $(GENOBJC) DEP := $(OBJC:.o=.d) $(OBJCXX:.o=.d) $(ASSMOBJ:.o=.d) include $(RIOTMAKE)/blob.inc.mk $(BINDIR)/$(MODULE)/: $(Q)mkdir -p $@ $(BINDIR)/$(MODULE).a $(OBJ): | $(BINDIR)/$(MODULE)/ # Build the archive from the output directory to create relative thin archives # This allows having them valid in and outside of docker $(BINDIR)/$(MODULE).a: $(OBJ) | $(DIRS:%=ALL--%) @# Recreate archive to cleanup deleted/non selected source files objects $(Q)$(RM) $@ $(Q)cd $(@D) && $(AR) $(ARFLAGS) $(@F) $(subst $(@D)/,,$^) CXXFLAGS = $(filter-out $(CXXUWFLAGS), $(CFLAGS)) $(CXXEXFLAGS) CCASFLAGS = $(filter-out $(CCASUWFLAGS), $(CFLAGS)) $(CCASEXFLAGS) # compile and generate dependency info $(OBJC_LTO): CFLAGS+=$(LTOFLAGS) $(OBJC): $(BINDIR)/$(MODULE)/%.o: %.c $(RIOTBUILD_CONFIG_HEADER_C) $(KCONFIG_GENERATED_AUTOCONF_HEADER_C) $(Q)$(CCACHE) $(CC) \ -DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$(abspath $<))\" \ -DRIOT_FILE_NOPATH=\"$(notdir $<)\" \ $(CFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $(abspath $<) $(GENOBJC): %.o: %.c $(RIOTBUILD_CONFIG_HEADER_C) $(KCONFIG_GENERATED_AUTOCONF_HEADER_C) $(Q) $(CCACHE) $(CC) \ -DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$<)\" \ -DRIOT_FILE_NOPATH=\"$(notdir $<)\" \ $(CFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $< $(OBJCXX): $(BINDIR)/$(MODULE)/%.o: %.$(SRCXXEXT) $(RIOTBUILD_CONFIG_HEADER_C) $(KCONFIG_GENERATED_AUTOCONF_HEADER_C) $(Q)$(CCACHE) $(CXX) \ -DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$(abspath $<))\" \ -DRIOT_FILE_NOPATH=\"$(notdir $<)\" \ $(CXXFLAGS) $(CXXINCLUDES) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $(abspath $<) $(ASMOBJ): $(BINDIR)/$(MODULE)/%.o: %.s $(Q)$(AS) $(ASFLAGS) -o $@ $(abspath $<) $(ASSMOBJ): $(BINDIR)/$(MODULE)/%.o: %.S $(RIOTBUILD_CONFIG_HEADER_C) $(KCONFIG_GENERATED_AUTOCONF_HEADER_C) $(Q)$(CCAS) $(CCASFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $(abspath $<) # pull in dependency info for *existing* .o files # deleted header files will be silently ignored -include $(DEP)