mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
9c8b7a064b
This adds a check to decide if Kconfig should run on a build. It will run if any of the following conditions is true: - A file with '.config' extension is present in the application folder - A 'Kconfig' file is present in the application folder - A previous configuration file is present (e.g. from a previous call to menuconfig) - menuconfig is being called This assumes that Kconfig will not generate any default configurations just from the Kconfig files outside the application folder (i.e. module configuration via Kconfig is disabled by default). Should this change, the check would not longer be valid, and Kconfig would have to run on every build.
135 lines
4.1 KiB
Makefile
135 lines
4.1 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
|
|
|
|
# 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 := $(filter-out $(SRCXXEXCLUDE),$(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)
|
|
|
|
# Define dependencies for object files
|
|
OBJ_DEPS += $(RIOTBUILD_CONFIG_HEADER_C)
|
|
ifneq (,$(SHOULD_RUN_KCONFIG))
|
|
OBJ_DEPS += $(KCONFIG_GENERATED_AUTOCONF_HEADER_C)
|
|
endif
|
|
|
|
$(OBJC): $(BINDIR)/$(MODULE)/%.o: %.c $(OBJ_DEPS)
|
|
$(Q)$(CCACHE) $(CC) \
|
|
-DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$(abspath $<))\" \
|
|
-DRIOT_FILE_NOPATH=\"$(notdir $<)\" \
|
|
$(CFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $(abspath $<)
|
|
|
|
$(GENOBJC): %.o: %.c $(OBJ_DEPS)
|
|
$(Q) $(CCACHE) $(CC) \
|
|
-DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$<)\" \
|
|
-DRIOT_FILE_NOPATH=\"$(notdir $<)\" \
|
|
$(CFLAGS) $(INCLUDES) -MQ '$@' -MD -MP -c -o $@ $<
|
|
|
|
$(OBJCXX): $(BINDIR)/$(MODULE)/%.o: %.$(SRCXXEXT) $(OBJ_DEPS)
|
|
$(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 $(OBJ_DEPS)
|
|
$(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)
|