summaryrefslogtreecommitdiff
path: root/dev-build/netsurf-buildsystem/files/netsurf-buildsystem-1.9-parallel-pre-post-targets.patch
blob: f1e51e7c52519dbd5ea64d33d26e0aa85fc67482 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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