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, $^)

Reply via email to