Re: [PATCH v2] Makefile: dedup archives in $(LIBS) so link recipes don't repeat them
- From
Harald Nordgren <haraldnordgren@gmail.com>
- Date
- Jun 19, 2026, 08:00 UTC
- Message-ID
- <CAHwyqnWBb65dC+qSYTw9SKdufjibUmTm065feM5D9906H5SQ4w@mail.gmail.com>
- In-Reply-To
- <pull.2314.v2.git.git.1780610623006.gitgitgadget@gmail.com>
Hi!
I think this would be quite nice to fix for all the macOS developers (I don't know how many we have who are active on this list), but when running repeated tests it does take up some space on the terminal:
```` ❯ git rebase --keep-base -x 'make -s && cd t && prove -j8 t345?-history*.sh && echo'
Executing: make -s && cd t && prove -j8 t345?-history*.sh && echo GIT_VERSION=2.55.0.rc1.20.g1e31474ef6 ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' t3450-history.sh ......... ok t3453-history-fixup.sh ... ok t3451-history-reword.sh .. ok t3452-history-split.sh ... ok All tests successful. Files=4, Tests=69, 7 wallclock secs ( 0.02 usr 0.01 sys + 4.14 cusr 5.39 csys = 9.56 CPU) Result: PASS
Executing: make -s && cd t && prove -j8 t345?-history*.sh && echo GIT_VERSION=2.55.0.rc1.21.g498da64046 ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' t3450-history.sh ......... ok t3453-history-fixup.sh ... ok t3451-history-reword.sh .. ok t3452-history-split.sh ... ok All tests successful. Files=4, Tests=69, 7 wallclock secs ( 0.02 usr 0.01 sys + 4.16 cusr 5.41 csys = 9.60 CPU) Result: PASS
Executing: make -s && cd t && prove -j8 t345?-history*.sh && echo GIT_VERSION=2.55.0.rc1.22.g0050368e96 ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' t3450-history.sh ......... ok t3455-history-squash.sh .. ok t3453-history-fixup.sh ... ok t3451-history-reword.sh .. ok t3452-history-split.sh ... ok All tests successful. Files=5, Tests=86, 7 wallclock secs ( 0.03 usr 0.01 sys + 4.89 cusr 6.36 csys = 11.29 CPU) Result: PASS
Executing: make -s && cd t && prove -j8 t345?-history*.sh && echo GIT_VERSION=2.55.0.rc1.23.gb86b93bda1 ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' ld: warning: ignoring duplicate libraries: 'libgit.a', 'target/release/libgitcore.a' t3450-history.sh ......... ok t3455-history-squash.sh .. ok t3453-history-fixup.sh ... ok t3451-history-reword.sh .. ok t3452-history-split.sh ... ok All tests successful. Files=5, Tests=88, 7 wallclock secs ( 0.03 usr 0.01 sys + 5.01 cusr 6.54 csys = 11.59 CPU) Result: PASS
Successfully rebased and updated refs/heads/rebase-fixup-fold. ```
Harald
On Fri, Jun 5, 2026 at 12:03 AM Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com> wrote:
Show 119 quoted lines
> > From: Harald Nordgren <haraldnordgren@gmail.com> > > 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 <haraldnordgren@gmail.com> > --- > 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 <haraldnordgren@gmail.com> > > ## 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 <haraldnordgren@gmail.com> > > ## 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