mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
dc845841f0
By passing the -MT flag with the absolute path to the object we make sure that the compiler generates dependency files with rules that match our building rules.
126 lines
3.9 KiB
Makefile
126 lines
3.9 KiB
Makefile
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)_<name> in USEMODULE, add <name>.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
|
|
|
|
ifeq ($(strip $(SRC))$(NO_AUTO_SRC),)
|
|
SRC := $(filter-out $(SRC_NOLTO), $(wildcard *.c))
|
|
endif
|
|
ifeq ($(strip $(SRCXX))$(NO_AUTO_SRC),)
|
|
SRCXX := $(wildcard *.cpp)
|
|
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:%.cpp=$(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)
|
|
$(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)
|
|
$(Q) $(CCACHE) $(CC) \
|
|
-DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$<)\" \
|
|
-DRIOT_FILE_NOPATH=\"$(notdir $<)\" \
|
|
$(CFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $<
|
|
|
|
$(OBJCXX): $(BINDIR)/$(MODULE)/%.o: %.cpp $(RIOTBUILD_CONFIG_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)
|
|
$(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)
|