mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
7c85e6e0e9
AR incrementally adds file without removing files. If a c file is deleted or disabled(submodule removal) it is not removed from archive and still ends up in the final elf file. This fix removes the need to do 'make clean' for this case. However it will break cases where an APPLICATION and a MODULE or two modules have the same name and only worked because source files names where different.
103 lines
3.0 KiB
Makefile
103 lines
3.0 KiB
Makefile
ifeq (, $(__RIOTBUILD_FLAG))
|
|
$(error You cannot build a module on its own. Use "make" in your application's directory instead.)
|
|
endif
|
|
|
|
unexport DIRS
|
|
DIRS := $(sort $(abspath ${DIRS}))
|
|
|
|
MODULE ?= $(shell basename $(CURDIR))
|
|
|
|
.PHONY: all ${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
|
|
|
|
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)
|
|
DEP := $(OBJC:.o=.d) $(OBJCXX:.o=.d) $(ASSMOBJ:.o=.d)
|
|
|
|
$(BINDIR)/$(MODULE)/:
|
|
$(Q)mkdir -p $@
|
|
|
|
$(BINDIR)/$(MODULE).a $(OBJ): | $(BINDIR)/$(MODULE)/
|
|
|
|
$(BINDIR)/$(MODULE).a: $(OBJ) | ${DIRS:%=ALL--%}
|
|
@# Recreate archive to cleanup deleted/non selected source files objects
|
|
$(Q)$(RM) $@
|
|
$(Q)$(AR) $(ARFLAGS) $@ $^
|
|
|
|
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) -MD -MP -c -o $@ $(abspath $<)
|
|
|
|
$(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) -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) -MD -MP -c -o $@ $(abspath $<)
|
|
|
|
# pull in dependency info for *existing* .o files
|
|
# deleted header files will be silently ignored
|
|
-include $(DEP)
|