summaryrefslogtreecommitdiff
blob: 8ae0448873564a15707e3312845fa4451be2841f (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
https://listmaster.pepperfish.net/hyperkitty/list/netsurf-dev@netsurf-browser.org/thread/NUOLUXAZS2GYBJ3Q5GCTGSYLKOX3MCME/

From 1a6171aa8fd69b20f5c7d2be31ab00539adae959 Mon Sep 17 00:00:00 2001
From: Michael Orlitzky <michael@orlitzky.com>
Date: Mon, 14 Aug 2023 12:43:54 -0400
Subject: [PATCH] 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 | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/makefiles/Makefile.top b/makefiles/Makefile.top
index caac166..dafdfaa 100644
--- a/makefiles/Makefile.top
+++ b/makefiles/Makefile.top
@@ -176,6 +176,11 @@ OBJECTS := $(addprefix $(BUILDDIR)/,$(filter %.o, \
 		$(subst /,_,$(subst .cmhg,.o,$(SOURCES))) \
 		$(subst /,_,$(subst .s,.o,$(SOURCES)))))
 
+# Ensure that PRE_TARGETS are built before OBJECTS, and POST_TARGETS
+# after them.
+$(OBJECTS): $(PRE_TARGETS)
+$(POST_TARGETS): $(OBJECTS)
+
 bin_for_test = $(addprefix $(BUILDDIR)/,$(firstword $(subst :, ,$(ITEM))))
 TEST_BINARIES := $(foreach ITEM,$(TEST_ITEMS),$(bin_for_test))
 
-- 
2.41.0