Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > In particular INSTALL_SYMLINKS=Y will result in a link tree like: > > bin/git > libexec/git -> ../bin/git > libexec/git-add -> ../bin/git > > Whereas NO_INSTALL_HARDLINKS=Y in cases where the "ln" would fail would result in: > > bin/git > libexec/git > libexec/git-add -> git > > I.e. we duplicated the "git" between the bin/ and libexec/ > directories (by default they're hardlinked), and potentially had had > e.g. "git-add" pointing at the libexec/git hardlink (or more likely if > "ln" is failing, a copy), instead of the bin/git. > > Now we'll instead use the same symlinks to point to the bindir. I > don't see any reason not to do so, and no breakage related to this has > been reported with INSTALL_SYMLINKS in all this time. I just did it > this way to maintain bug-for-bug compatibility at the time. Makes sense. I do not see a reason why libexec/git-add that points at ../bin/git would cause problems, either. > +# Define NO_INSTALL_HARDLINKS if you'd like to have programs in bin/ > +# and libexec/ either symlinked (we try with INSTALL_SYMLINKS first), > +# or if that fails fall back on a "cp" instead of a "ln". Useful for > +# when you don't want hardlinks at all. So without INSTALL_SYMLINKS and with NO_INSTALL_HARDLINKS, the only remaining choice is "cp". With both set, we favour "ln -s" over "cp" and do not allow "ln". With INSTALL_SYMLINKS and without NO_INSTALL_HARDLINKS, we try "ln -s", "ln" and finally "cp". With neither, we try "ln" and fall back to "cp"? That precedence order does make sense. > @@ -3019,33 +3020,30 @@ endif > } && \ > for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ > $(RM) "$$bindir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > + test -n "$(INSTALL_SYMLINKS)" -o "$(NO_INSTALL_HARDLINKS)" && \ I had an impression that we avoid -o/-a used with "test" (instead we'd use "test && test" or "test || test")? In either case, if we are told to favor "ln -s", or told not to use "ln", we try "ln -s"? That does not make much sense to me, though. What do I need to do if I do not ever want symbolic links? Is it impossible now? > ln -s "git$X" "$$bindir/$$p" || \ > { test -z "$(NO_INSTALL_HARDLINKS)" && \ > ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ > - ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ > cp "$$bindir/git$X" "$$bindir/$$p" || exit; }; \ > done && \ > for p in $(BUILT_INS); do \ > $(RM) "$$execdir/$$p" && \ > if test -z "$(SKIP_DASHED_BUILT_INS)"; \ > then \ > - test -n "$(INSTALL_SYMLINKS)" && \ > + test -n "$(INSTALL_SYMLINKS)" -o "$(NO_INSTALL_HARDLINKS)" && \ Perhaps the same comment applies here and to the next hunk, too? > ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" "$$execdir/$$p" || \ > { test -z "$(NO_INSTALL_HARDLINKS)" && \ > ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ > - ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ > cp "$$execdir/git$X" "$$execdir/$$p" || exit; }; \ > fi \ > done && \ > remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ > for p in $$remote_curl_aliases; do \ > $(RM) "$$execdir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > + test -n "$(INSTALL_SYMLINKS)" -o "$(NO_INSTALL_HARDLINKS)" && \ > ln -s "git-remote-http$X" "$$execdir/$$p" || \ > { test -z "$(NO_INSTALL_HARDLINKS)" && \ > ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ > - ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ > cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ > done && \ > ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"