mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 20:44:39 +08:00
arch/*/src/Makefile: Avoid uncessary relinking of the nuttx binary.
The goal is to only execute recipes when there is an actual change in the prerequisites. There are several issues which cause the nuttx binary target to be re-made every time the top level make is run. 1. Previously the target nuttx$(EXEEXT), was used, but make resolved this in the relative directory make -C $(ARCH_SRC), and couldn’t find it (need an absolute path: `$(TOPDIR)/..). 2. The .tmp prerequisite for nuttx was always deleted 3. libboard's recipe had a sub-make which may or may not update that target. This was a phony target, and was therefore always considered out of date. These issues were causing the nuttx recipe to be run every make, which was hiding some missing prerequisites: 1. the .config is a prerequisite for the .tmp target 2. libapps.a (and other linklibs) are pre-requisites for nuttx Changes: The changes are only in the build system, and only for arm. Track nuttx$(EXEEXT) via vpath so Make knows when it's already up to date without an explicit path. Add $(TOPDIR)/.config as a dependency to the linker script preprocessing so config changes trigger re-preprocessing. Keep the .tmp linker script on disk (clean already removes it) so timestamp-based dependency checking works across builds. These .tmp files need to be added to the gitignore or the CI will complain. Use FORCE pattern for board/libboard to ensure it's always checked but use the actual library file as the link dependency so nuttx is only re-linked when library content changes. Add staging libs as dependency to nuttx link rule so changed app libs trigger re-link. Signed-off-by: Liam Hickey <williamhickey@geotab.com>
This commit is contained in:
committed by
Alin Jerpelea
parent
aff8ea572a
commit
13ba91a33f
@@ -37,6 +37,10 @@ etctmp/
|
||||
*.pyc
|
||||
*.mapfile
|
||||
*.SystemMap
|
||||
*.ld.tmp
|
||||
*.script.tmp
|
||||
*.script.dfu.tmp
|
||||
*.linkcmd.tmp
|
||||
*~
|
||||
\#*\#
|
||||
.\#*
|
||||
|
||||
@@ -161,6 +161,8 @@ VPATH += chip
|
||||
VPATH += common
|
||||
VPATH += $(ARCH_SUBDIR)
|
||||
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
ifeq ($(CONFIG_ARM_TOOLCHAIN_IAR),y)
|
||||
VPATH += common$(DELIM)iar
|
||||
else # ifeq ($(CONFIG_ARCH_TOOLCHAIN_GNU),y)
|
||||
@@ -170,8 +172,6 @@ endif
|
||||
|
||||
all: $(HEAD_OBJ) $(BIN)
|
||||
|
||||
.PHONY: board$(DELIM)libboard$(LIBEXT)
|
||||
|
||||
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
|
||||
@@ -192,9 +192,13 @@ endif
|
||||
$(KBIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
board$(DELIM)libboard$(LIBEXT):
|
||||
board$(DELIM)libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
.PHONY: FORCE
|
||||
|
||||
FORCE:
|
||||
|
||||
# When multiple linking, these two additional linking objects will be included
|
||||
|
||||
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
|
||||
@@ -218,10 +222,10 @@ define LINK_ALLSYMS_KASAN
|
||||
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
|
||||
endef
|
||||
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
|
||||
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
|
||||
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
|
||||
$(Q) echo "LD: nuttx"
|
||||
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
|
||||
$(Q) $(LD) $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
|
||||
@@ -242,7 +246,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
||||
sort > $(TOPDIR)$(DELIM)System.map
|
||||
endif
|
||||
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
|
||||
# This is part of the top-level export target
|
||||
# Note that there may not be a head object if layout is handled
|
||||
|
||||
@@ -132,9 +132,9 @@ VPATH += chip
|
||||
VPATH += common
|
||||
VPATH += $(ARCH_SUBDIR)
|
||||
|
||||
all: $(HEAD_OBJ) $(BIN)
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
.PHONY: board$(DELIM)libboard$(LIBEXT)
|
||||
all: $(HEAD_OBJ) $(BIN)
|
||||
|
||||
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
@@ -156,9 +156,13 @@ endif
|
||||
$(KBIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
board$(DELIM)libboard$(LIBEXT):
|
||||
board$(DELIM)libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
.PHONY: FORCE
|
||||
|
||||
FORCE:
|
||||
|
||||
# When multiple linking, these two additional linking objects will be included
|
||||
|
||||
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
|
||||
@@ -182,10 +186,10 @@ define LINK_ALLSYMS_KASAN
|
||||
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
|
||||
endef
|
||||
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
|
||||
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
|
||||
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
|
||||
$(Q) echo "LD: nuttx"
|
||||
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
|
||||
$(Q) $(LD) --entry=__start $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
|
||||
@@ -206,7 +210,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
||||
sort > $(TOPDIR)$(DELIM)System.map
|
||||
endif
|
||||
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
|
||||
# This is part of the top-level export target
|
||||
# Note that there may not be a head object if layout is handled
|
||||
|
||||
@@ -133,9 +133,9 @@ VPATH += $(SBI_DIR)
|
||||
VPATH += $(ARCH_SUBDIR)
|
||||
VPATH += $(CHIP_DIR)
|
||||
|
||||
all: $(HEAD_OBJ) $(BIN)
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
.PHONY: board/libboard$(LIBEXT)
|
||||
all: $(HEAD_OBJ) $(BIN)
|
||||
|
||||
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
@@ -157,9 +157,13 @@ endif
|
||||
$(KBIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
board/libboard$(LIBEXT):
|
||||
board/libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
.PHONY: FORCE
|
||||
|
||||
FORCE:
|
||||
|
||||
# When multiple linking, these two additional linking objects will be included
|
||||
|
||||
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
|
||||
@@ -183,10 +187,10 @@ define LINK_ALLSYMS_KASAN
|
||||
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
|
||||
endef
|
||||
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
|
||||
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
|
||||
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
|
||||
$(Q) echo "LD: nuttx"
|
||||
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
|
||||
$(Q) $(LD) $(LDENTRY) $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
|
||||
@@ -207,7 +211,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
||||
sort > $(TOPDIR)/System.map
|
||||
endif
|
||||
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
|
||||
# This is part of the top-level export target
|
||||
# Note that there may not be a head object if layout is handled
|
||||
|
||||
@@ -106,6 +106,8 @@ else
|
||||
endif
|
||||
DEPPATH = $(patsubst %,--dep-path %,$(subst :, ,$(VPATH)))
|
||||
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
CFLAGS += -fvisibility=default
|
||||
HOSTCFLAGS = $(ARCHWARNINGS) $(ARCHOPTIMIZATION) \
|
||||
$(ARCHCFLAGS) $(HOSTINCLUDES) $(EXTRAFLAGS) -D__SIM__ \
|
||||
@@ -401,7 +403,7 @@ RELLIBS += -lboard
|
||||
|
||||
all: sim_head$(OBJEXT) libarch$(LIBEXT)
|
||||
|
||||
.PHONY: export_startup clean distclean cleanrel depend board/libboard$(LIBEXT)
|
||||
.PHONY: export_startup clean distclean cleanrel depend FORCE
|
||||
|
||||
$(AOBJS): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
@@ -428,9 +430,11 @@ libarch$(LIBEXT): $(NUTTXOBJS)
|
||||
# the simulation. However, this is a good place to keep parts of the simulation
|
||||
# that are not hardware-related.
|
||||
|
||||
board/libboard$(LIBEXT):
|
||||
board/libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
FORCE:
|
||||
|
||||
# A partially linked object containing only NuttX code (no interface to host OS)
|
||||
# Change the names of most symbols that conflict with libc symbols.
|
||||
# Generate the final NuttX binary by linking the host-specific objects with the NuttX
|
||||
|
||||
@@ -105,9 +105,9 @@ endif
|
||||
|
||||
VPATH = chip:common:$(ARCH_SUBDIR)
|
||||
|
||||
all: libarch$(LIBEXT)
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
.PHONY: board/libboard$(LIBEXT)
|
||||
all: libarch$(LIBEXT)
|
||||
|
||||
$(AOBJS): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
@@ -129,9 +129,13 @@ endif
|
||||
$(KBIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
board/libboard$(LIBEXT):
|
||||
board/libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
.PHONY: FORCE
|
||||
|
||||
FORCE:
|
||||
|
||||
ifeq ($(CONFIG_ALLSYMS),y)
|
||||
EXTRA_LIBS += allsyms$(OBJEXT)
|
||||
endif
|
||||
@@ -154,10 +158,10 @@ define LINK_ALLSYMS_KASAN
|
||||
$(LDSTARTGROUP) $(EXTRA_LIBS) --no-relax $(LDLIBS) $(LDENDGROUP)
|
||||
endef
|
||||
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
|
||||
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
|
||||
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
|
||||
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
|
||||
@echo "LD: nuttx$(EXEEXT)"
|
||||
|
||||
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
|
||||
@@ -170,7 +174,6 @@ else
|
||||
$(Q) $(call LINK_ALLSYMS_KASAN)
|
||||
$(Q) $(call LINK_ALLSYMS_KASAN)
|
||||
endif
|
||||
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
|
||||
ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
$(Q) $(NM) $(NUTTX) | \
|
||||
@@ -217,6 +220,7 @@ clean:
|
||||
ifeq ($(BOARDMAKE),y)
|
||||
$(Q) $(MAKE) -C board clean
|
||||
endif
|
||||
$(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
$(call DELFILE, libarch$(LIBEXT))
|
||||
$(call CLEAN)
|
||||
|
||||
|
||||
@@ -135,9 +135,9 @@ VPATH += common/espressif
|
||||
VPATH += $(ARCH_SUBDIR)
|
||||
VPATH += $(CHIP_DIR)
|
||||
|
||||
all: $(STARTUP_OBJS) libarch$(LIBEXT)
|
||||
vpath nuttx$(EXEEXT) $(TOPDIR)
|
||||
|
||||
.PHONY: board/libboard$(LIBEXT)
|
||||
all: $(STARTUP_OBJS) libarch$(LIBEXT)
|
||||
|
||||
$(AOBJS) $(UAOBJS) $(HEAD_AOBJ): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
@@ -159,9 +159,13 @@ endif
|
||||
$(KBIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
board/libboard$(LIBEXT):
|
||||
board/libboard$(LIBEXT): FORCE
|
||||
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
|
||||
|
||||
.PHONY: FORCE
|
||||
|
||||
FORCE:
|
||||
|
||||
define LINK_ALLSYMS
|
||||
$(Q) $(TOPDIR)/tools/mkallsyms.py $(NUTTX) allsyms.tmp --orderbyname $(CONFIG_SYMTAB_ORDEREDBYNAME)
|
||||
$(Q) $(call COMPILE, allsyms.tmp, allsyms$(OBJEXT), -x c)
|
||||
@@ -171,10 +175,10 @@ define LINK_ALLSYMS
|
||||
$(Q) $(call DELFILE, allsyms.tmp allsyms$(OBJEXT))
|
||||
endef
|
||||
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
|
||||
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
|
||||
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
|
||||
|
||||
nuttx$(EXEEXT): $(STARTUP_OBJS) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
|
||||
nuttx$(EXEEXT): $(STARTUP_OBJS) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
|
||||
$(Q) echo "LD: nuttx"
|
||||
ifneq ($(CONFIG_ALLSYMS),y)
|
||||
$(Q) $(LD) --entry=__start $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
|
||||
@@ -193,7 +197,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
||||
sort > $(TOPDIR)/System.map
|
||||
endif
|
||||
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
|
||||
|
||||
# This is part of the top-level export target
|
||||
|
||||
|
||||
@@ -91,9 +91,9 @@ endif
|
||||
# To ensure uname information is newest,
|
||||
# add lib_utsname.o to phony target for force rebuild
|
||||
|
||||
#if !defined(CONFIG_LIBC_UNAME_DISABLE_TIMESTAMP)
|
||||
ifeq ($(CONFIG_LIBC_UNAME_DISABLE_TIMESTAMP),)
|
||||
.PHONY: bin$(DELIM)lib_utsname$(OBJEXT) kbin$(DELIM)lib_utsname$(OBJEXT)
|
||||
#endif
|
||||
endif
|
||||
|
||||
# Add the misc directory to the build
|
||||
|
||||
|
||||
+4
-3
@@ -266,11 +266,12 @@ tools/mkconfig$(HOSTEXEEXT): prebuild
|
||||
include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT)
|
||||
$(Q) grep -v "CONFIG_BASE_DEFCONFIG" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.tmp"
|
||||
$(Q) if ! cmp -s "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.orig" ; then \
|
||||
sed -i.bak -e "/CONFIG_BASE_DEFCONFIG/ { /-dirty/! s/\"$$/-dirty\"/; }" "$(TOPDIR)/.config" ; \
|
||||
sed -e "/CONFIG_BASE_DEFCONFIG/ { /-dirty/! s/\"$$/-dirty\"/; }" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.dirty" ; \
|
||||
else \
|
||||
sed -i.bak "s/-dirty//g" "$(TOPDIR)/.config"; \
|
||||
sed "s/-dirty//g" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.dirty"; \
|
||||
fi
|
||||
$(Q) rm -f "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.bak"
|
||||
$(Q) rm -f "$(TOPDIR)/.config.tmp"
|
||||
$(Q) $(call TESTANDREPLACEFILE, $(TOPDIR)/.config.dirty, $(TOPDIR)/.config)
|
||||
$(Q) tools/mkconfig $(TOPDIR) > $@.tmp
|
||||
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user