libgloss: probable parallel build issues
Commit Message
Hello,
I have been experiencing seemingly random build failures in libgloss under
extreme concurrent build scenarios. These errors don't seem to arise under
normal `make -jN` builds but are coming up under high concurrent builds in
CI scenarios. For example: N parallel builds all running at `make -jN -lN`
where N is something like $(nproc).
A sample of the errors I am seeing:
cp: cannot create regular file 'arm/iq80310.specs': No such file or
directory
Fatal error: can't create arm/redboot-crt0.o: No such file or directory.
I think these are cropping up because specs files are being copied into the
arm build tree but the mkdir doesn't depend on them. There are other
items that seem to suffer from a similar issue like the crt0.o and
redboot-crt0.o copies. I suspect I am running into these issues more
frequently under CI due to the elevated I/O wait.
I've attached a patch that I am working on to try and address the issues
via am__dirstamp on the items that have failed for me. I'm not sure if that
is the best approach and I am almost certain it is not complete, however,
it does appear to alleviate the build failures for my workload. There is
some additional context available at https://bugs.gentoo.org/978951 where I
first reported the bug.
Best,
Alex Barker
@@ -21,7 +21,7 @@
%D%/redboot-crt0.o \
%D%/redboot-syscalls.o
-%D%/redboot-syscalls.o: %D%/redboot-syscalls.c
+%D%/redboot-syscalls.o: %D%/redboot-syscalls.c | %D%/$(am__dirstamp)
$(AM_V_CC)$(COMPILE) -DSEMIHOST_V2 -o $@ -c $<
## rdpmon files.
@@ -37,7 +37,7 @@
%D%/trap.S \
%D%/truncate.c
-%D%/rdpmon-crt0.o: %D%/crt0.S
+%D%/rdpmon-crt0.o: %D%/crt0.S | %D%/$(am__dirstamp)
$(AM_V_CPPAS)$(CPPASCOMPILE) -DSEMIHOST_V2 -DARM_RDP_MONITOR -o $@ -c $<
## rdimon files.
@@ -58,10 +58,10 @@
%C%_RDIMON_CPPFLAGS = -DSEMIHOST_V2 -DARM_RDI_MONITOR
%C%_RDIMON_V2M_CPPFLAGS = $(%C%_RDIMON_CPPFLAGS) -DSEMIHOST_V2_MIXED_MODE
-%D%/rdimon-crt0.o: %D%/crt0.S
+%D%/rdimon-crt0.o: %D%/crt0.S | %D%/$(am__dirstamp)
$(AM_V_CPPAS)$(CPPASCOMPILE) $(%C%_RDIMON_CPPFLAGS) -o $@ -c $<
-%D%/rdimon-crt0-v2m.o: %D%/crt0.S
+%D%/rdimon-crt0-v2m.o: %D%/crt0.S | %D%/$(am__dirstamp)
$(AM_V_CPPAS)$(CPPASCOMPILE) $(%C%_RDIMON_V2M_CPPFLAGS) -o $@ -c $<
%C%_librdimon_a_SOURCES = $(%C%_librdpmon_a_SOURCES)
@@ -77,11 +77,15 @@
multilibtool_DATA += \
$(%C%_SPECS)
+## crt0 objects in multilibtool_DATA are compiled by the implicit .S.o
+## rule, which lacks the am__dirstamp.
+%D%/crt0.o %D%/linux-crt0.o %D%/redboot-crt0.o: | %D%/$(am__dirstamp)
+
## Make copies of the scripts to facilitate in-tree bootstrapping.
-%D%/%.specs: %D%/$(ARM_OBJTYPE)%.specs
+%D%/%.specs: %D%/$(ARM_OBJTYPE)%.specs | %D%/$(am__dirstamp)
$(AM_V_GEN)cp $< $@
-%D%/%.ld: %D%/$(ARM_OBJTYPE)%.ld
+%D%/%.ld: %D%/$(ARM_OBJTYPE)%.ld | %D%/$(am__dirstamp)
$(AM_V_GEN)cp $< $@
CLEANFILES += $(%C%_SPECS)
@@ -10359,22 +10359,24 @@
@CONFIG_AARCH64_TRUE@aarch64/cpu-init/rdimon-aem-v8-r.$(OBJEXT): aarch64/cpu-init/rdimon-aem-el3.S aarch64/cpu-init/$(am__dirstamp)
@CONFIG_AARCH64_TRUE@ $(AM_V_CC)$(COMPILE) $(aarch64_cpu_init_CPPFLAGS) -DARM_RDI_MONITOR -DBUILD_FOR_R_PROFILE -o $@ -c $<
-@CONFIG_ARM_TRUE@arm/redboot-syscalls.o: arm/redboot-syscalls.c
+@CONFIG_ARM_TRUE@arm/redboot-syscalls.o: arm/redboot-syscalls.c | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_CC)$(COMPILE) -DSEMIHOST_V2 -o $@ -c $<
-@CONFIG_ARM_TRUE@arm/rdpmon-crt0.o: arm/crt0.S
+@CONFIG_ARM_TRUE@arm/rdpmon-crt0.o: arm/crt0.S | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -DSEMIHOST_V2 -DARM_RDP_MONITOR -o $@ -c $<
-@CONFIG_ARM_TRUE@arm/rdimon-crt0.o: arm/crt0.S
+@CONFIG_ARM_TRUE@arm/rdimon-crt0.o: arm/crt0.S | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) $(arm_RDIMON_CPPFLAGS) -o $@ -c $<
-@CONFIG_ARM_TRUE@arm/rdimon-crt0-v2m.o: arm/crt0.S
+@CONFIG_ARM_TRUE@arm/rdimon-crt0-v2m.o: arm/crt0.S | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) $(arm_RDIMON_V2M_CPPFLAGS) -o $@ -c $<
-@CONFIG_ARM_TRUE@arm/%.specs: arm/$(ARM_OBJTYPE)%.specs
+@CONFIG_ARM_TRUE@arm/crt0.o arm/linux-crt0.o arm/redboot-crt0.o: | arm/$(am__dirstamp)
+
+@CONFIG_ARM_TRUE@arm/%.specs: arm/$(ARM_OBJTYPE)%.specs | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_GEN)cp $< $@
-@CONFIG_ARM_TRUE@arm/%.ld: arm/$(ARM_OBJTYPE)%.ld
+@CONFIG_ARM_TRUE@arm/%.ld: arm/$(ARM_OBJTYPE)%.ld | arm/$(am__dirstamp)
@CONFIG_ARM_TRUE@ $(AM_V_GEN)cp $< $@
@CONFIG_ARM_TRUE@arm/cpu-init/$(am__dirstamp):