summaryrefslogtreecommitdiff
path: root/dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch')
-rw-r--r--dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch b/dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch
new file mode 100644
index 000000000000..f1e51e7c5251
--- /dev/null
+++ b/dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch
@@ -0,0 +1,74 @@
+From 067a5105a76e51eebcdf7e7786d1f91040442d47 Mon Sep 17 00:00:00 2001
+From: Michael Orlitzky <michael@orlitzky.com>
+Date: Mon, 14 Aug 2023 13:23:09 -0400
+Subject: makefiles/Makefile.top: dependencies for PRE_ and POST_TARGETS
+
+The PRE_TARGETS and POST_TARGETS are supposed to be built before and
+after $(OBJECTS), respectively -- at least according to the comments
+in Makefile.top:
+
+ # List of targets to run before building $(OBJECT)
+ PRE_TARGETS :=
+ # List of targets to run after building $(OBJECT)
+ POST_TARGETS :=
+
+The default target however builds them at the same time as $(OUTPUT),
+
+ # Default target
+ all: $(PRE_TARGETS) $(OUTPUT) $(POST_TARGETS)
+
+where $(OUTPUT) basically just builds $(OBJECTS):
+
+ $(OUTPUT): $(BUILDDIR)/stamp $(OBJECTS)
+ ...
+
+As a result, there is a race condition when $(OBJECTS) truly requires
+$(PRE_TARGETS), because they may be built at the same time. The same
+problem arises the other way around with $(POST_TARGETS). As a
+demonstration, one can try to build the libsvgtiny shared library
+directly (note: the details are platform-dependent),
+
+ $ BD=build-x86_64-pc-linux-gnu-x86_64-pc-linux-gnu-release-lib-shared
+ $ make COMPONENT_TYPE=lib-shared "${BD}/libsvgtiny.so.0.1.7"
+ COMPILE: src/svgtiny.c
+ ...
+ src/svgtiny.c:24:10: fatal error: autogenerated_colors.c: No such file or directory
+ 24 | #include "autogenerated_colors.c"
+ | ^~~~~~~~~~~~~~~~~~~~~~~~
+ compilation terminated.
+
+This is because $(PRE_TARGETS) is not satisfied. In practice, this
+condition seems hard to hit unintentionally, but it can happen if you
+are building in parallel and extemely unlucky. A user discovered it in
+Gentoo bug 711200.
+
+The fix simply adds the stated dependencies on $(OBJECTS) and
+$(POST_TARGETS) to guarantee the correct order.
+---
+ makefiles/Makefile.top | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/makefiles/Makefile.top b/makefiles/Makefile.top
+index 0b0fe22..2a41697 100644
+--- a/makefiles/Makefile.top
++++ b/makefiles/Makefile.top
+@@ -422,6 +422,16 @@ else
+ endif
+ endif
+
++ifneq ($(PRE_TARGETS),)
++# Ensure that PRE_TARGETS are built before OBJECTS.
++$(OBJECTS): $(PRE_TARGETS)
++endif
++
++ifneq ($(POST_TARGETS),)
++# Ensure that POST_TARGETS are built after OBJECTS.
++$(POST_TARGETS): $(OBJECTS)
++endif
++
+ ###############################################################################
+ # Autogenerated, implied rules
+ ###############################################################################
+--
+cgit v1.2.1
+