From: Harald Nordgren Date: Wed, 10 Jun 2026 13:24:04 GMT Subject: Re: [PATCH v2] Makefile: dedup archives in $(LIBS) so link recipes don't repeat them Message-ID: In-Reply-To: Hi Johannes! Maybe this could be interesting for you to look at too. Harald On Fri, Jun 5, 2026 at 12:03 AM Harald Nordgren via GitGitGadget wrote: > > From: Harald Nordgren > > A handful of link recipes listed archive files twice: once explicitly > via $(filter %.a,$^) and again implicitly through $(LIBS), which > expanded to $(filter-out %.o,$(GITLIBS)) $(EXTLIBS). On macOS the > linker warned about the duplicates: > > ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' > > Redefine $(LIBS) to list archive prerequisites from $^ first, then > the rest of the library list with those archives filtered out so each > appears only once. > > Signed-off-by: Harald Nordgren > --- > Makefile: drop duplicate %.a from test-helper link rule > > Redefine $(LIBS) to list archive prerequisites from $^ first, then the > rest of the library list to avoid brittleness in the future. > > Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2314%2FHaraldNordgren%2Fmakefile-test-helper-dedup-libs-v2 > Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2314/HaraldNordgren/makefile-test-helper-dedup-libs-v2 > Pull-Request: https://github.com/git/git/pull/2314 > > Range-diff vs v1: > > 1: f6166450b0 ! 1: 0ef442ea05 Makefile: drop duplicate %.a from link recipes > @@ Metadata > Author: Harald Nordgren > > ## Commit message ## > - Makefile: drop duplicate %.a from link recipes > + Makefile: dedup archives in $(LIBS) so link recipes don't repeat them > > - Three link recipes list archive files twice on the link line: once > - via $(filter %.a,$^) and again through $(LIBS), which expands to > - $(filter-out %.o,$(GITLIBS)) $(EXTLIBS). On macOS the linker warns > - about the duplicates: > + A handful of link recipes listed archive files twice: once explicitly > + via $(filter %.a,$^) and again implicitly through $(LIBS), which > + expanded to $(filter-out %.o,$(GITLIBS)) $(EXTLIBS). On macOS the > + linker warned about the duplicates: > > ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' > > - Drop the redundant filter from the test-helper, fuzz-program, and > - unit-test recipes so they match the pattern used by other link > - recipes in the file. > + Redefine $(LIBS) to list archive prerequisites from $^ first, then > + the rest of the library list with those archives filtered out so each > + appears only once. > > Signed-off-by: Harald Nordgren > > ## Makefile ## > +@@ Makefile: endif > + # > + # where we use it as a dependency. Since we also pull object files > + # from the dependency list, that would make each entry appear twice. > +-LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS) > ++# Archives from $^ come first, then the rest with those archives > ++# filtered out so each appears only once. > ++LIBS = $(filter %.a,$^) $(filter-out $(filter %.a,$^),$(filter-out %.o,$(GITLIBS)) $(EXTLIBS)) > + > + BASIC_CFLAGS += $(COMPAT_CFLAGS) > + LIB_OBJS += $(COMPAT_OBJS) > @@ Makefile: perf: all > t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o > > > > Makefile | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/Makefile b/Makefile > index b31ecb0756..a828a66f28 100644 > --- a/Makefile > +++ b/Makefile > @@ -2503,7 +2503,9 @@ endif > # > # where we use it as a dependency. Since we also pull object files > # from the dependency list, that would make each entry appear twice. > -LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS) > +# Archives from $^ come first, then the rest with those archives > +# filtered out so each appears only once. > +LIBS = $(filter %.a,$^) $(filter-out $(filter %.a,$^),$(filter-out %.o,$(GITLIBS)) $(EXTLIBS)) > > BASIC_CFLAGS += $(COMPAT_CFLAGS) > LIB_OBJS += $(COMPAT_OBJS) > @@ -3392,7 +3394,7 @@ perf: all > t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS)) $(UNIT_TEST_DIR)/test-lib.o > > t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS) > - $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS) > + $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) > > check-sha1:: t/helper/test-tool$X > t/helper/test-sha1.sh > @@ -4015,13 +4017,13 @@ fuzz-all: $(FUZZ_PROGRAMS) > $(FUZZ_PROGRAMS): %: %.o oss-fuzz/dummy-cmd-main.o $(GITLIBS) GIT-LDFLAGS > $(QUIET_LINK)$(FUZZ_CXX) $(FUZZ_CXXFLAGS) -o $@ $(ALL_LDFLAGS) \ > -Wl,--allow-multiple-definition \ > - $(filter %.o,$^) $(filter %.a,$^) $(LIBS) $(LIB_FUZZING_ENGINE) > + $(filter %.o,$^) $(LIBS) $(LIB_FUZZING_ENGINE) > > $(UNIT_TEST_PROGS): $(UNIT_TEST_BIN)/%$X: $(UNIT_TEST_DIR)/%.o $(UNIT_TEST_OBJS) \ > $(GITLIBS) GIT-LDFLAGS > $(call mkdir_p_parent_template) > $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \ > - $(filter %.o,$^) $(filter %.a,$^) $(LIBS) > + $(filter %.o,$^) $(LIBS) > > GIT-TEST-SUITES: FORCE > @FLAGS='$(CLAR_TEST_SUITES)'; \ > > base-commit: 9ac3f193c05c2237e2b14ebaa1149e9fc8a1abe0 > -- > gitgitgadget