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
_______________________________________________
netsurf-dev mailing list -- netsurf-dev@netsurf-browser.org
To unsubscribe send an email to netsurf-dev-le...@netsurf-browser.org

Reply via email to