[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#857831: gcc build in gnattools apparently not safe for parallel builds



Package: src:gcc-7
Followup-For: Bug #857831
Control: tags -1 + patch

The attached patch fixes the new race condition introduced by previous
attempt.
--- a/debian/patches/ada-gnattools-cross.diff
+++ b/debian/patches/ada-gnattools-cross.diff
@@ -247,23 +247,28 @@ Index: b/src/gnattools/Makefile.in
  	"exeext=$(exeext)" \
  	"fsrcdir=$(fsrcdir)" \
  	"srcdir=$(fsrcdir)" \
-@@ -192,12 +199,18 @@
+@@ -190,6 +199,10 @@
+ # to be able to build gnatmake without a version of gnatmake around. Once 
+ # everything has been compiled once, gnatmake can be recompiled with itself 
  # (see target regnattools) 
++gnattools-native: export LD_LIBRARY_PATH := \
++  '$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(vsndir):$(rtsdir)'
++# Useful even for 1st pass, as ../../gnatmake may already be
++# dynamically linked in case this target has already been invokated.
  gnattools-native: $(GCC_DIR)/stamp-tools $(GCC_DIR)/stamp-gnatlib-rts
  	# gnattools1
-+# The export is necessary in case the target is run twice.
-+	LD_LIBRARY_PATH='$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(vsndir):$(rtsdir)' \
  	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
- 	  $(TOOLS_FLAGS_TO_PASS_NATIVE) \
- 	  ../../gnatmake$(exeext) ../../gnatlink$(exeext)
+@@ -198,6 +211,13 @@
  	# gnattools2
+ 	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
+ 	  $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools
 +# The hard-coded object lists for gnatbind/make/link contain unneeded
 +# objects. Use the fresh tools to recompute dependencies.
-+	LD_LIBRARY_PATH='$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(vsndir):$(rtsdir)' \
- 	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
--	  $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools
-+	  $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools \
-+	  gnatbind-re gnatmake-re gnatlink-re
++# A separate Make run avoids race conditions between gnatmakes
++# building the same object for common-tools and gnat*-re.
++# (parallelism is already forbidden between gnat*-re targets)
++	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
++	  $(TOOLS_FLAGS_TO_PASS_NATIVE) gnatbind-re gnatmake-re gnatlink-re
  
  # gnatmake/link can be built with recent gnatmake/link if they are available.
  # This is especially convenient for building cross tools or for rebuilding

Reply to: