<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/c8612c6024feb06e1806b5549ccde5384db4163d">https://github.com/macports/macports-legacy-support/commit/c8612c6024feb06e1806b5549ccde5384db4163d</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit c8612c6024feb06e1806b5549ccde5384db4163d
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sat Oct 19 17:09:51 2024 -0700
<span style='display:block; white-space:pre;color:#404040;'> Makefile: Fix parallel builds.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Creating directories with "install -d" suffers from a race condition,
</span><span style='display:block; white-space:pre;color:#404040;'> because, although it first-order avoids creating directories that
</span><span style='display:block; white-space:pre;color:#404040;'> already exist, if multiple instances attempt to create a given
</span><span style='display:block; white-space:pre;color:#404040;'> directory at the same time, the error due to a collision is not
</span><span style='display:block; white-space:pre;color:#404040;'> correctly handled. To get around this, we make separate recipes for
</span><span style='display:block; white-space:pre;color:#404040;'> directory creation, with dependencies on them in the rules that
</span><span style='display:block; white-space:pre;color:#404040;'> populate them.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Unfortunately, this makes the automatic variables useless for some of
</span><span style='display:block; white-space:pre;color:#404040;'> the populating commands, since they include the directories. In such
</span><span style='display:block; white-space:pre;color:#404040;'> cases, we need to use explicit variables for the input files.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Maintaining the unused ability to put static and dynamic libraries in
</span><span style='display:block; white-space:pre;color:#404040;'> separate directories (while not actually being separate) would have
</span><span style='display:block; white-space:pre;color:#404040;'> complicated things, so that capability has been dropped.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This special treatment of directories is not applied to the
</span><span style='display:block; white-space:pre;color:#404040;'> installation of headers, since that's a complicated multi-directory
</span><span style='display:block; white-space:pre;color:#404040;'> target only used in a single recipe, and hence not vulnerable to
</span><span style='display:block; white-space:pre;color:#404040;'> parallelism.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> All builds now succeed with parallelism, including those that
</span><span style='display:block; white-space:pre;color:#404040;'> previously exhibited a failure.
</span>---
Makefile | 54 ++++++++++++++++++++++++++++--------------------------
1 file changed, 28 insertions(+), 26 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/Makefile b/Makefile
</span><span style='display:block; white-space:pre;color:#808080;'>index 70875b5..188269d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,11 +30,10 @@ SYSLIBFILE = lib$(SYSLIBNAME)$(SOEXT)
</span> DLIBPATH = $(LIBDIR)/$(DLIBFILE)
SLIBPATH = $(LIBDIR)/$(SLIBFILE)
SYSLIBPATH = $(LIBDIR)/$(SYSLIBFILE)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-BUILDDLIBDIR = lib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-BUILDSLIBDIR = lib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-BUILDDLIBPATH = $(BUILDDLIBDIR)/$(DLIBFILE)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-BUILDSLIBPATH = $(BUILDSLIBDIR)/$(SLIBFILE)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-BUILDSYSLIBPATH = $(BUILDDLIBDIR)/$(SYSLIBFILE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+BUILDLIBDIR = lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+BUILDDLIBPATH = $(BUILDLIBDIR)/$(DLIBFILE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+BUILDSLIBPATH = $(BUILDLIBDIR)/$(SLIBFILE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+BUILDSYSLIBPATH = $(BUILDLIBDIR)/$(SYSLIBFILE)
</span> SOCURVERSION ?= 1.0
SOCOMPATVERSION ?= 1.0
BUILDDLIBFLAGS = -dynamiclib -headerpad_max_install_names \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -98,9 +97,12 @@ DLIBOBJEXT = .dl.o
</span> SLIBOBJEXT = .o
DLIBOBJS := $(patsubst %.c,%$(DLIBOBJEXT),$(LIBSRCS))
MULTIDLIBOBJS := $(patsubst %.c,%$(DLIBOBJEXT),$(MULTISRCS))
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ALLDLIBOBJS := $(DLIBOBJS) $(MULTIDLIBOBJS)
</span> SLIBOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(LIBSRCS))
MULTISLIBOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(MULTISRCS))
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ALLSLIBOBJS := $(SLIBOBJS) $(MULTISLIBOBJS)
</span> ADDOBJS := $(patsubst %.c,%$(SLIBOBJEXT),$(ADDSRCS))
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ALLSYSLIBOBJS := $(ALLDLIBOBJS) $(ADDOBJS)
</span>
# Defs for filtering out empty object files
#
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,7 +138,7 @@ DARWINRUNS := $(patsubst \
</span> TESTDIR = test
TESTNAMEPREFIX = $(TESTDIR)/test_
TESTRUNPREFIX = run_
<span style='display:block; white-space:pre;background:#ffe0e0;'>-TESTLDFLAGS = -L$(BUILDDLIBDIR) $(ALLLDFLAGS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+TESTLDFLAGS = -L$(BUILDLIBDIR) $(ALLLDFLAGS)
</span> TESTLIBS = -l$(LIBNAME)
TESTSRCS_C := $(wildcard $(TESTNAMEPREFIX)*.c)
TESTOBJS_C := $(patsubst %.c,%.o,$(TESTSRCS_C))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -300,30 +302,33 @@ $(SLIBOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS)
</span> $(ADDOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS)
$(CC) -c -I$(SRCINCDIR) $(ALLCFLAGS) $(SLIBCFLAGS) $< -o $@
<span style='display:block; white-space:pre;background:#ffe0e0;'>-dlibobjs: $(DLIBOBJS) $(MULTIDLIBOBJS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+dlibobjs: $(ALLDLIBOBJS)
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-syslibobjs: $(DLIBOBJS) $(MULTIDLIBOBJS) $(ADDOBJS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+syslibobjs: $(ALLSYSLIBOBJS)
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-slibobjs: $(SLIBOBJS) $(MULTISLIBOBJS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+slibobjs: $(ALLSLIBOBJS)
</span>
allobjs: dlibobjs slibobjs syslibobjs
<span style='display:block; white-space:pre;background:#ffe0e0;'>-$(SOBJLIST): $(SLIBOBJS) $(MULTISLIBOBJS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Create a list of nonempty static object files.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(SOBJLIST): $(ALLSLIBOBJS)
</span> $(CC) -c $(ALLCFLAGS) $(SLIBCFLAGS) -xc /dev/null -o $(EMPTYSOBJ)
for f in $^; do cmp -s $(EMPTYSOBJ) $$f || echo $$f; done > $@
<span style='display:block; white-space:pre;background:#ffe0e0;'>-$(BUILDDLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(BUILDDLIBDIR)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(CC) $(BUILDDLIBFLAGS) $(ALLLDFLAGS) $^ -o $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Make the directories separate targets to avoid collisions in parallel builds.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(BUILDLIBDIR) $(DESTDIR)$(LIBDIR):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(MKINSTALLDIRS) $@
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-$(BUILDSYSLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS) $(ADDOBJS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(BUILDDLIBDIR)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(CC) $(BUILDSYSLIBFLAGS) $(ALLLDFLAGS) $(SYSREEXPORTFLAG) $^ -o $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(BUILDDLIBPATH): $(ALLDLIBOBJS) $(BUILDLIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(CC) $(BUILDDLIBFLAGS) $(ALLLDFLAGS) $(ALLDLIBOBJS) -o $@
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-$(BUILDSLIBPATH): $(SOBJLIST)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(BUILDSLIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(BUILDSYSLIBPATH): $(ALLSYSLIBOBJS) $(BUILDLIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(CC) $(BUILDSYSLIBFLAGS) $(ALLLDFLAGS) $(SYSREEXPORTFLAG) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(ALLSYSLIBOBJS) -o $@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(BUILDSLIBPATH): $(SOBJLIST) $(BUILDLIBDIR)
</span> $(RM) $@
<span style='display:block; white-space:pre;background:#ffe0e0;'>- $(AR) $(BUILDSLIBFLAGS) $@ $$(cat $^)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $(AR) $(BUILDSLIBFLAGS) $@ $$(cat $<)
</span>
$(TESTOBJS_C): %.o: %.c $(ALLHEADERS)
$(CC) -c -std=c99 -I$(SRCINCDIR) $(ALLCFLAGS) $< -o $@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -440,18 +445,15 @@ install-headers:
</span>
install-lib: install-dlib install-slib install-syslib
<span style='display:block; white-space:pre;background:#ffe0e0;'>-install-dlib: $(BUILDDLIBPATH)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+install-dlib: $(BUILDDLIBPATH) $(DESTDIR)$(LIBDIR)
</span> $(INSTALL_PROGRAM) $(BUILDDLIBPATH) $(DESTDIR)$(LIBDIR)
$(POSTINSTALL) -id $(DLIBPATH) $(DESTDIR)$(DLIBPATH)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-install-syslib: $(BUILDSYSLIBPATH)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+install-syslib: $(BUILDSYSLIBPATH) $(DESTDIR)$(LIBDIR)
</span> $(INSTALL_PROGRAM) $(BUILDSYSLIBPATH) $(DESTDIR)$(LIBDIR)
$(POSTINSTALL) -id $(SYSLIBPATH) $(DESTDIR)$(SYSLIBPATH)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-install-slib: $(BUILDSLIBPATH)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+install-slib: $(BUILDSLIBPATH) $(DESTDIR)$(LIBDIR)
</span> $(INSTALL_DATA) $(BUILDSLIBPATH) $(DESTDIR)$(LIBDIR)
install-tiger: $(TIGERBINS)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -475,7 +477,7 @@ test_clean: xtest_clean $(MANRUNPREFIX)clean
</span> clean: $(MANRUNPREFIX)clean test_clean
$(RM) $(foreach D,$(SRCDIR),$D/*.o $D/*.o.* $D/*.d)
$(RM) $(BUILDDLIBPATH) $(BUILDSLIBPATH) $(BUILDSYSLIBPATH) $(TESTPRGS) test/test_cmath_* test/test_faccessat_setuid
<span style='display:block; white-space:pre;background:#ffe0e0;'>- @$(RMDIR) $(BUILDDLIBDIR) $(BUILDSLIBDIR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @$(RMDIR) $(BUILDLIBDIR)
</span>
.PHONY: all dlib syslib slib clean check test test_cmath xtest test_static
.PHONY: $(TESTRUNS) $(XTESTRUNS) $(MANTESTRUNS)
</pre><pre style='margin:0'>
</pre>