This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 13ba91a33fb arch/*/src/Makefile: Avoid uncessary relinking of the
nuttx binary.
13ba91a33fb is described below
commit 13ba91a33fb307baa1881176f72ff3d2c372b9d7
Author: Liam Hickey <[email protected]>
AuthorDate: Thu Apr 9 08:38:18 2026 -0400
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 <[email protected]>
---
.gitignore | 4 ++++
arch/arm/src/Makefile | 15 +++++++++------
arch/arm64/src/Makefile | 15 +++++++++------
arch/risc-v/src/Makefile | 15 +++++++++------
arch/sim/src/Makefile | 8 ++++++--
arch/x86_64/src/Makefile | 16 ++++++++++------
arch/xtensa/src/Makefile | 15 +++++++++------
libs/libc/misc/Make.defs | 4 ++--
tools/Unix.mk | 7 ++++---
9 files changed, 62 insertions(+), 37 deletions(-)
diff --git a/.gitignore b/.gitignore
index defa36b2225..bf11fd52ab7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,10 @@ etctmp/
*.pyc
*.mapfile
*.SystemMap
+*.ld.tmp
+*.script.tmp
+*.script.dfu.tmp
+*.linkcmd.tmp
*~
\#*\#
.\#*
diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index 7c6da2a3eaa..db4bcac8026 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -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
diff --git a/arch/arm64/src/Makefile b/arch/arm64/src/Makefile
index 73cefe97d48..568325b89dd 100644
--- a/arch/arm64/src/Makefile
+++ b/arch/arm64/src/Makefile
@@ -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
diff --git a/arch/risc-v/src/Makefile b/arch/risc-v/src/Makefile
index be9ea8bdce3..a20e9b20c4c 100644
--- a/arch/risc-v/src/Makefile
+++ b/arch/risc-v/src/Makefile
@@ -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
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 78a46793b40..e50dc83d720 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -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
diff --git a/arch/x86_64/src/Makefile b/arch/x86_64/src/Makefile
index 0089fbab5f3..967a9760f46 100644
--- a/arch/x86_64/src/Makefile
+++ b/arch/x86_64/src/Makefile
@@ -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)
diff --git a/arch/xtensa/src/Makefile b/arch/xtensa/src/Makefile
index a21db44c16b..cdaeaa8b013 100644
--- a/arch/xtensa/src/Makefile
+++ b/arch/xtensa/src/Makefile
@@ -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
diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs
index 812379b7064..98b896d4a68 100644
--- a/libs/libc/misc/Make.defs
+++ b/libs/libc/misc/Make.defs
@@ -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
diff --git a/tools/Unix.mk b/tools/Unix.mk
index f25c323831f..5abdda08310 100644
--- a/tools/Unix.mk
+++ b/tools/Unix.mk
@@ -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) > [email protected]
$(Q) $(call TESTANDREPLACEFILE, [email protected], $@)