From c027e7c3e4c803a4bc59ae94eaebba4948ed2514 Mon Sep 17 00:00:00 2001 From: Alan Carvalho de Assis Date: Tue, 28 Jul 2026 05:52:38 -0300 Subject: [PATCH] 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 --- 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, $^)