This is an automated email from the ASF dual-hosted git repository.
acassis 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 c027e7c3e4c tools: fix stale archive members surviving a
Kconfig-driven CSRCS change
c027e7c3e4c is described below
commit c027e7c3e4c803a4bc59ae94eaebba4948ed2514
Author: Alan Carvalho de Assis <[email protected]>
AuthorDate: Tue Jul 28 05:52:38 2026 -0300
tools: fix stale archive members surviving a Kconfig-driven CSRCS change
During the Toybox port to NuttX, Claude noticed that changes in the
menuconfig weren't taking affect. This issue exists for a long time on
NuttX, in fact BayLibre's presentation from 2017 make jokes about our
building system not been reliable:
https://www.youtube.com/watch?v=XUJK2htXxKw&t=320s
Stale archive members from $(AR)'s additive-only behavior can linger
after Kconfig toggles change which files provide a symbol, causing dead
weight or "multiple definition" link errors on incremental builds.
Fixed by splitting ARCHIVE into two macros: ARCHIVE keeps the original
additive behavior for apps/libapps.a, which many independent
subdirectories contribute to across a build, while the new
ARCHIVE_REBUILD deletes then archives for the far more common case
of a single Makefile building its own self-contained $(OBJS)
- all 39 such call sites now use it.
Assisted-By: Claude Sonnet 5
Signed-off-by: Alan C. Assis <[email protected]>
---
arch/arm/src/Makefile | 6 +++---
arch/arm64/src/Makefile | 6 +++---
arch/avr/src/Makefile | 2 +-
arch/ceva/src/Makefile | 4 ++--
arch/hc/src/Makefile | 2 +-
arch/mips/src/Makefile | 2 +-
arch/misoc/src/Makefile | 2 +-
arch/or1k/src/Makefile | 6 +++---
arch/renesas/src/Makefile | 2 +-
arch/risc-v/src/Makefile | 6 +++---
arch/sim/src/Makefile | 2 +-
arch/sparc/src/Makefile | 2 +-
arch/tricore/src/Makefile | 6 +++---
arch/x86/src/Makefile | 2 +-
arch/x86_64/src/Makefile | 6 +++---
arch/xtensa/src/Makefile | 6 +++---
arch/z16/src/Makefile | 2 +-
audio/Makefile | 2 +-
binfmt/Makefile | 2 +-
boards/Makefile | 2 +-
crypto/Makefile | 2 +-
drivers/Makefile | 2 +-
fs/Makefile | 2 +-
graphics/Makefile | 2 +-
libs/libbuiltin/Makefile | 2 +-
libs/libc/Makefile | 2 +-
libs/libc/zoneinfo/Makefile | 2 +-
libs/libdsp/Makefile | 2 +-
libs/libm/Makefile | 2 +-
libs/libnx/Makefile | 2 +-
libs/libxx/Makefile | 2 +-
mm/Makefile | 2 +-
net/Makefile | 2 +-
openamp/Makefile | 2 +-
pass1/Makefile | 2 +-
sched/Makefile | 2 +-
syscall/Makefile | 6 +++---
tools/Config.mk | 50 +++++++++++++++++++++++++++++++++++++++++++++
video/Makefile | 2 +-
wireless/Makefile | 2 +-
40 files changed, 106 insertions(+), 56 deletions(-)
diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index db4bcac8026..77ef444647c 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -183,14 +183,14 @@ $(STARTUP_OBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(STARTUP_OBJS) $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(STARTUP_OBJS) $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board$(DELIM)libboard$(LIBEXT): FORCE
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/arm64/src/Makefile b/arch/arm64/src/Makefile
index 568325b89dd..28cbe46a1d0 100644
--- a/arch/arm64/src/Makefile
+++ b/arch/arm64/src/Makefile
@@ -147,14 +147,14 @@ $(STARTUP_OBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(OBJS) $(STARTUP_OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(UOBJS) $(STARTUP_OBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board$(DELIM)libboard$(LIBEXT): FORCE
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/avr/src/Makefile b/arch/avr/src/Makefile
index d29713af00b..a63b6516d69 100644
--- a/arch/avr/src/Makefile
+++ b/arch/avr/src/Makefile
@@ -86,7 +86,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/ceva/src/Makefile b/arch/ceva/src/Makefile
index ee40c9a9647..39ba1c5baa8 100644
--- a/arch/ceva/src/Makefile
+++ b/arch/ceva/src/Makefile
@@ -125,10 +125,10 @@ $(sort $(COBJS) $(UCOBJS)): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN) $(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
$(UBIN): $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
board$(DELIM)libboard$(LIBEXT):
ifeq ($(CONFIG_ARCH_XC5),y)
diff --git a/arch/hc/src/Makefile b/arch/hc/src/Makefile
index 426a8e98771..5d815e27737 100644
--- a/arch/hc/src/Makefile
+++ b/arch/hc/src/Makefile
@@ -98,7 +98,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/mips/src/Makefile b/arch/mips/src/Makefile
index f5c2da2d870..4cf636f2fa9 100644
--- a/arch/mips/src/Makefile
+++ b/arch/mips/src/Makefile
@@ -84,7 +84,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/misoc/src/Makefile b/arch/misoc/src/Makefile
index 0a95a28cdf2..dcd1131af7b 100644
--- a/arch/misoc/src/Makefile
+++ b/arch/misoc/src/Makefile
@@ -88,7 +88,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/or1k/src/Makefile b/arch/or1k/src/Makefile
index b773fd97512..ef238866dc4 100644
--- a/arch/or1k/src/Makefile
+++ b/arch/or1k/src/Makefile
@@ -115,14 +115,14 @@ $(COBJS) $(UCOBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board$(DELIM)libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/renesas/src/Makefile b/arch/renesas/src/Makefile
index 40f421edefd..de6b348e658 100644
--- a/arch/renesas/src/Makefile
+++ b/arch/renesas/src/Makefile
@@ -92,7 +92,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/risc-v/src/Makefile b/arch/risc-v/src/Makefile
index a20e9b20c4c..3a75dd4d501 100644
--- a/arch/risc-v/src/Makefile
+++ b/arch/risc-v/src/Makefile
@@ -148,14 +148,14 @@ $(STARTUP_OBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(STARTUP_OBJS) $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(STARTUP_OBJS) $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT): FORCE
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index ffff6f58854..280c3a8b050 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -417,7 +417,7 @@ $(HOSTMOBJS): %$(OBJEXT): %.m
# The architecture-specific library
libarch$(LIBEXT): $(NUTTXOBJS)
- $(call ARCHIVE, $@, $(NUTTXOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(NUTTXOBJS))
# The "board"-specific library. Of course, there really are no boards in
# the simulation. However, this is a good place to keep parts of the
simulation
diff --git a/arch/sparc/src/Makefile b/arch/sparc/src/Makefile
index 62f4da37bdb..86be642790e 100644
--- a/arch/sparc/src/Makefile
+++ b/arch/sparc/src/Makefile
@@ -101,7 +101,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board TOPDIR="$(TOPDIR)" libboard$(LIBEXT)
EXTRADEFINES=$(EXTRADEFINES)
diff --git a/arch/tricore/src/Makefile b/arch/tricore/src/Makefile
index e86d95bfa1f..524d0865428 100644
--- a/arch/tricore/src/Makefile
+++ b/arch/tricore/src/Makefile
@@ -147,14 +147,14 @@ $(COBJS) $(UCOBJS) $(HEAD_COBJ): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board$(DELIM)libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/x86/src/Makefile b/arch/x86/src/Makefile
index 8c3e7704eae..363a0577619 100644
--- a/arch/x86/src/Makefile
+++ b/arch/x86/src/Makefile
@@ -110,7 +110,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/x86_64/src/Makefile b/arch/x86_64/src/Makefile
index 967a9760f46..4bf961970b8 100644
--- a/arch/x86_64/src/Makefile
+++ b/arch/x86_64/src/Makefile
@@ -120,14 +120,14 @@ $(STARTUP_OBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(OBJS) $(STARTUP_OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(UOBJS) $(STARTUP_OBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT): FORCE
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/xtensa/src/Makefile b/arch/xtensa/src/Makefile
index cdaeaa8b013..31425e38fa3 100644
--- a/arch/xtensa/src/Makefile
+++ b/arch/xtensa/src/Makefile
@@ -150,14 +150,14 @@ $(STARTUP_ELF_OBJS): %$(OBJEXT): %.c
ifeq ($(CONFIG_BUILD_FLAT),y)
$(BIN): $(STARTUP_ELF_OBJS) $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
else
$(BIN): $(STARTUP_ELF_OBJS) $(UOBJS)
- $(call ARCHIVE, $@, $(UOBJS))
+ $(call ARCHIVE_REBUILD, $@, $(UOBJS))
endif
$(KBIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT): FORCE
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/arch/z16/src/Makefile b/arch/z16/src/Makefile
index 043ecfd3aa1..af5ddb6e9e3 100644
--- a/arch/z16/src/Makefile
+++ b/arch/z16/src/Makefile
@@ -78,7 +78,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
libarch$(LIBEXT): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
board/libboard$(LIBEXT):
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
diff --git a/audio/Makefile b/audio/Makefile
index a635a920d03..46722c2b266 100644
--- a/audio/Makefile
+++ b/audio/Makefile
@@ -54,7 +54,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/binfmt/Makefile b/binfmt/Makefile
index 31d84b1d50c..6ebd09632f3 100644
--- a/binfmt/Makefile
+++ b/binfmt/Makefile
@@ -82,7 +82,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/boards/Makefile b/boards/Makefile
index 9b8a272527f..07b31a71234 100644
--- a/boards/Makefile
+++ b/boards/Makefile
@@ -64,7 +64,7 @@ $(CXXOBJS): %$(OBJEXT): %.cxx
$(call COMPILEXX, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds) $(CXXSRCS:.cxx=.ddx)
$(call CATFILE, Make.dep, $^)
diff --git a/crypto/Makefile b/crypto/Makefile
index d0a237ce768..31ec601fe00 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -102,7 +102,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/drivers/Makefile b/drivers/Makefile
index adeb7a25f02..dd39ff4d7f1 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -108,7 +108,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
context::
diff --git a/fs/Makefile b/fs/Makefile
index 342e0ea12e5..ad2bdedc3d6 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -89,7 +89,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
context::
diff --git a/graphics/Makefile b/graphics/Makefile
index 36da16e98f3..5827524ae30 100644
--- a/graphics/Makefile
+++ b/graphics/Makefile
@@ -105,7 +105,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
mklibgraphics: $(BIN)
diff --git a/libs/libbuiltin/Makefile b/libs/libbuiltin/Makefile
index 2728539da4c..4d424b95446 100644
--- a/libs/libbuiltin/Makefile
+++ b/libs/libbuiltin/Makefile
@@ -66,7 +66,7 @@ context:: bin kbin
depend:: .depend
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
# C library for the kernel phase of the two-pass kernel build
diff --git a/libs/libc/Makefile b/libs/libc/Makefile
index 8a027ed0fc6..a04fb9d393c 100644
--- a/libs/libc/Makefile
+++ b/libs/libc/Makefile
@@ -161,7 +161,7 @@ $(COBJS): $(BINDIR)$(DELIMS)%$(OBJEXT): %.c
# the user phase of the two-pass kernel build
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
ifeq ($(CONFIG_LIBC_ZONEINFO_ROMFS),y)
$(Q) $(MAKE) -C zoneinfo all BIN=$(BIN)
endif
diff --git a/libs/libc/zoneinfo/Makefile b/libs/libc/zoneinfo/Makefile
index 671f01e438f..68fc62873d3 100644
--- a/libs/libc/zoneinfo/Makefile
+++ b/libs/libc/zoneinfo/Makefile
@@ -48,7 +48,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
.built: .tzbuilt romfs $(OBJS)
- $(call ARCHIVE, ..$(DELIM)$(BIN), $(OBJS))
+ $(call ARCHIVE_REBUILD, ..$(DELIM)$(BIN), $(OBJS))
$(Q) touch .built
# ROMFS file system containing the TZ database
diff --git a/libs/libdsp/Makefile b/libs/libdsp/Makefile
index 551f42ae4a4..4794930c387 100644
--- a/libs/libdsp/Makefile
+++ b/libs/libdsp/Makefile
@@ -62,7 +62,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/libs/libm/Makefile b/libs/libm/Makefile
index 7affdf61629..372612ddd47 100644
--- a/libs/libm/Makefile
+++ b/libs/libm/Makefile
@@ -56,7 +56,7 @@ $(COBJS): $(BINDIR)$(DELIM)$(DELIM)%$(OBJEXT): %.c
# the user phase of the two-pass kernel build
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
# math library for the kernel phase of the two-pass kernel build
diff --git a/libs/libnx/Makefile b/libs/libnx/Makefile
index 232c0136bb9..b16b6166cf8 100644
--- a/libs/libnx/Makefile
+++ b/libs/libnx/Makefile
@@ -216,7 +216,7 @@ $(COBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.c
# the user phase of the two-pass kernel build
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
# NX library for the kernel phase of the two-pass kernel build
diff --git a/libs/libxx/Makefile b/libs/libxx/Makefile
index 617ed23c83d..48f1a68ccc4 100644
--- a/libs/libxx/Makefile
+++ b/libs/libxx/Makefile
@@ -77,7 +77,7 @@ $(CPPOBJS): %$(OBJEXT): %.cpp
$(call COMPILEXX, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
context::
diff --git a/mm/Makefile b/mm/Makefile
index df4ee9db13e..d69adcc934f 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -80,7 +80,7 @@ $(COBJS): $(BINDIR)$(DELIMS)%$(OBJEXT): %.c
# the user phase of the two-pass kernel build
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
# Memory manager for the kernel phase of the two-pass kernel build
diff --git a/net/Makefile b/net/Makefile
index 5c58a6c7784..476f0ea5cd8 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -86,7 +86,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/openamp/Makefile b/openamp/Makefile
index 1d9efb707fd..966ca30b71c 100644
--- a/openamp/Makefile
+++ b/openamp/Makefile
@@ -46,7 +46,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
context::
diff --git a/pass1/Makefile b/pass1/Makefile
index 5524ea29310..83fb88cb043 100644
--- a/pass1/Makefile
+++ b/pass1/Makefile
@@ -43,7 +43,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/sched/Makefile b/sched/Makefile
index 705cfbfcbfd..79e81e0bbe2 100644
--- a/sched/Makefile
+++ b/sched/Makefile
@@ -65,7 +65,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/syscall/Makefile b/syscall/Makefile
index 800c0f5168e..12070c1474c 100644
--- a/syscall/Makefile
+++ b/syscall/Makefile
@@ -72,13 +72,13 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN1): $(PROXY_OBJS)
- $(call ARCHIVE, $@, $(PROXY_OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(PROXY_OBJS))
$(BIN2): $(STUB_OBJS)
- $(call ARCHIVE, $@, $(STUB_OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(STUB_OBJS))
$(BIN3): $(WRAP_OBJS)
- $(call ARCHIVE, $@, $(WRAP_OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(WRAP_OBJS))
$(SYSCALLWRAPS): .context
diff --git a/tools/Config.mk b/tools/Config.mk
index c000d644808..bc5d2ffd542 100644
--- a/tools/Config.mk
+++ b/tools/Config.mk
@@ -443,6 +443,21 @@ endef
# Note: The fileN strings may not contain spaces or characters that may be
# interpreted strangely by the shell
#
+# Purely additive: $(AR) only adds or replaces the members it's given, it
+# never removes anything already in the archive. That's exactly right for
+# a target that many independent callers each contribute a partial object
+# list to over the life of a build (apps/libapps.a, built up one
+# subdirectory's objects at a time via apps/Make.defs' ARLOCK, which wraps
+# this same macro as `flock $1.lock $(call ARCHIVE, $1, $2)` to serialize
+# concurrent contributions under -j) -- rebuilding from scratch on every
+# call would only ever leave the last contributor's objects behind. Use
+# ARCHIVE_REBUILD instead for the other shape: a single Makefile archiving
+# its own complete, self-contained object list in one call.
+#
+# This has to stay a single command, not two separate recipe lines: flock
+# execs its argument directly rather than handing it to a shell, so a
+# second recipe line here would run outside the lock entirely.
+#
# Depends on these settings defined in board-specific Make.defs file
# installed at $(TOPDIR)/Make.defs:
#
@@ -457,6 +472,41 @@ define ARCHIVE
$(AR) $1 $2
endef
+# ARCHIVE_REBUILD - Replace an archive's entire contents with a list of files
+# Example: $(call ARCHIVE_REBUILD, archive-file, "file1 file2 file3 ...")
+#
+# For the common case ARCHIVE itself doesn't cover: a single Makefile
+# archiving its own complete object list ($(OBJS), derived from CSRCS/
+# ASRCS) in one call, as nearly every "$(BIN): $(OBJS)" rule in the tree
+# does (libs/libc, libs/libm, sched, drivers, fs, mm, net, graphics,
+# video, binfmt, crypto, boards, arch/*/src, ...). There, $2 is meant to
+# be the archive's entire, authoritative contents, not one contribution
+# among several -- so remove any pre-existing archive-file first. Without
+# that, a Kconfig change that alters which files CSRCS puts in $2 (e.g.
+# one implementation of a function replacing another under a different
+# filename) leaves whatever was archived under the old configuration
+# lingering in the .a indefinitely across an incremental build: best case
+# dead weight, worst case a stale, outdated definition the linker picks up
+# instead of the current one, silently or as a "multiple definition" error
+# if the two coexist. Rebuilding the archive from scratch every time this
+# rule fires costs a few milliseconds even for a large (700+ member)
+# library, which is worth paying to not carry that risk.
+#
+# Depends on these settings defined in board-specific Make.defs file
+# installed at $(TOPDIR)/Make.defs:
+#
+# AR - The command to invoke the archiver (includes any options)
+#
+# Depends on this settings defined in board-specific defconfig file installed
+# at $(TOPDIR)/.config:
+#
+# CONFIG_WINDOWS_NATIVE - Defined for a Windows native build
+
+define ARCHIVE_REBUILD
+ $(Q) rm -f $1
+ $(AR) $1 $2
+endef
+
# PRELINK - Prelink a list of files
# This is useful when files were compiled with fvisibility=hidden.
# Any symbol which was not explicitly made global is invisible outside the
diff --git a/video/Makefile b/video/Makefile
index a6728ff3664..0cc5c96c1ee 100644
--- a/video/Makefile
+++ b/video/Makefile
@@ -48,7 +48,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)
diff --git a/wireless/Makefile b/wireless/Makefile
index 84bd8243851..97d3b71ea57 100644
--- a/wireless/Makefile
+++ b/wireless/Makefile
@@ -46,7 +46,7 @@ $(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
$(BIN): $(OBJS)
- $(call ARCHIVE, $@, $(OBJS))
+ $(call ARCHIVE_REBUILD, $@, $(OBJS))
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
$(call CATFILE, Make.dep, $^)