Hi Thomas, > Le 2 août 2019 à 09:43, Thomas Petazzoni <thomas.petazz...@bootlin.com> a > écrit : > > Hello, > > As part of the Buildroot [0] project, we have a system of build > machines that continuously build a large number of open-source > packages.
Great! > The problem is caused by the following piece of Makefile logic in > examples/c/reccalc/local.mk: > > %D%/scan.c %D%/scan.h: %D%/scan.stamp > @test -f $@ || rm -f %D%/scan.stamp > @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/scan.stamp > > %D%/scan.stamp: %D%/scan.l > $(AM_V_LEX)rm -f $@ $@.tmp > $(AM_V_at)$(MKDIR_P) %D% > $(AM_V_at)touch $@.tmp > $(AM_V_at)$(LEX) -o%D%/scan.c --header-file=%D%/scan.h > $(srcdir)/%D%/scan.l > $(AM_V_at)mv $@.tmp $@ > > The problem is that scan.c and scan.h already depend on scan.stamp, so > it triggers the scan.stamp: scan.l rule. But then in addition, the > commands in the scan.c/scan.h rule also run a sub-make to re-create > scan.stamp, and those two sub-make invocations are executed in > parallel, causing a race. Yes. I'm aware of the problem, but it was not causing any harm. So far. Yet I continuously use concurrent builds (including on the CI). > In practice, it means that the scan.stamp: scan.l rule is executed 3 > times! Yes. And it's on purpose. Run "info automake 'Multiple Outputs'" to get the details of why things are this way (or see https://www.gnu.org/software/automake/manual/html_node/Multiple-Outputs.html). > One interesting point though is that this issue only appears with our > build machine that has a fairly old version of make (3.81), and > apparently not on other build machines. Well, it seems kinda useless to launch the same job several times, maybe that was addressed in more recent versions of GNU Make. > Would it be possible to fix this issue ? I thought Automake did not support headers generated by Flex, but it appear it does. Could you please confirm that this patch fixes your problem? (I can't check it on the CI, for some unrelated reason.) Cheers! commit 192f9f3f093c5f123a1759366d990bab111cdd6b Author: Akim Demaille <akim.demai...@gmail.com> Date: Sat Aug 3 18:57:24 2019 +0200 examples: rely on ylwrap Reported by Thomas Petazzoni. https://lists.gnu.org/archive/html/bug-bison/2019-08/msg00000.html * examples/c/reccalc/scan.l: Generate scan.h. * examples/c/reccalc/local.mk: Remove dedicated rules, leave the handling of multiple outputs to Automake's ylwrap. diff --git a/THANKS b/THANKS index 14a26d76..5ee4b29a 100644 --- a/THANKS +++ b/THANKS @@ -171,6 +171,7 @@ Sum Wu s...@geekhouse.org Théophile Ranquet theophile.ranq...@gmail.com Thiru Ramakrishnan thiru.ramakrish...@gmail.com Thomas Jahns ja...@dkrz.de +Thomas Petazzoni thomas.petazz...@bootlin.com Tim Josling t...@melbpc.org.au Tim Landscheidt t...@tim-landscheidt.de Tim Van Holder tim.van.hol...@pandora.be diff --git a/examples/c/reccalc/local.mk b/examples/c/reccalc/local.mk index bb64b214..2d99fa62 100644 --- a/examples/c/reccalc/local.mk +++ b/examples/c/reccalc/local.mk @@ -37,18 +37,6 @@ endif FLEX_WORKS DASH = - %D%/reccalc$(DASH)parse.o: %D%/scan.h -%D%/scan.c %D%/scan.h: %D%/scan.stamp - @test -f $@ || rm -f %D%/scan.stamp - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/scan.stamp - -%D%/scan.stamp: %D%/scan.l - $(AM_V_LEX)rm -f $@ $@.tmp - $(AM_V_at)$(MKDIR_P) %D% - $(AM_V_at)touch $@.tmp - $(AM_V_at)$(LEX) -o%D%/scan.c --header-file=%D%/scan.h $(srcdir)/%D%/scan.l - $(AM_V_at)mv $@.tmp $@ - - EXTRA_DIST += %D%/reccalc.test %D%/scan.l dist_reccalc_DATA = %D%/parse.y %D%/scan.l %D%/Makefile %D%/README.md CLEANFILES += %D%/parse.[ch] %D%/parse.output %D%/scan.[ch] %D%/*.stamp diff --git a/examples/c/reccalc/scan.l b/examples/c/reccalc/scan.l index fbb781aa..f8ae829b 100644 --- a/examples/c/reccalc/scan.l +++ b/examples/c/reccalc/scan.l @@ -3,7 +3,7 @@ /* Disable Flex features we don't need, to avoid warnings. */ %option nodefault noinput nounput noyywrap -%option reentrant +%option reentrant header-file="scan.h" %{ #include <assert.h>