Re: [PATCH v2] bison: fix the parallel build

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
Hi Mingli!

> Le 14 mai 2020 à 06:35, [email protected] a écrit :
> 
> Explicitly make the BUILT_SOURCES which are the generated headers such
> as stdio.h, fcntl.h and etc to be the dependencies of the gl_LIBOBJS
> such as libbison_a-sprintf.o, libbison_a-printf.o and etc to guarantee
> the BUILT_SOURCES is generated before begin to compile
> EXTRA_lib_libbison_a_SOURCES such as fprintf.c in parallel builid,
> otherwise there may come below error:
> 
> | muscle-tab.c:(.text+0x77a): undefined reference to `rpl_sprintf'
> 
> It does the same for src_bison_OBJECTS and lib_libbison_a_OBJECTS to
> make sure BUILT_SOURCES generated before begin to compile
> src_bison_SOURCES which contains AnnotationList.c and etc.
> 
> BTW, the MOSTLYCLEANFILES also contains the generated header needs to
> be created early in the build process, so add it also in to avoid
> below error:
> 
> | ./lib/uniwidth/width.c:21:10: fatal error: uniwidth.h: No such file or directory

Thank you very much for the analysis and proposed solution!

But I still do not understand how this can happen.

The generated headers that you are referring to (stdio.h, fcntl.h)
are all put into BUILT_SOURCES.  On my machine, Makefile reads:

BUILT_SOURCES = $(mfcalc_sources) $(am__append_8) $(rpcalc_sources) \
	$(simple_sources) $(ALLOCA_H) lib/configmake.h $(ERRNO_H) \
	lib/fcntl.h $(FLOAT_H) $(GETOPT_H) $(GETOPT_CDEFS_H) \
	lib/inttypes.h $(TEXTSTYLE_H) $(LIMITS_H) $(am__append_23) \
	lib/math.h lib/sched.h lib/signal.h lib/spawn.h $(STDBOOL_H) \
	$(STDDEF_H) $(STDINT_H) lib/stdio.h lib/stdlib.h lib/string.h \
	lib/sys/resource.h $(am__append_28) lib/sys/time.h \
	lib/sys/times.h lib/sys/types.h lib/sys/wait.h lib/time.h \
	lib/unistd.h $(LIBUNISTRING_UNITYPES_H) \
	$(LIBUNISTRING_UNIWIDTH_H) lib/wchar.h lib/wctype.h \
	src/parse-gram.c src/parse-gram.h src/scan-code.c \
	src/scan-gram.c src/scan-skel.c $(top_srcdir)/.version

(stdio.h and fcntl.h are in there.  And uniwidth.h is also in there,
as $(LIBUNISTRING_UNIWIDTH_H)).


And "make all" is:

all: $(BUILT_SOURCES)
	$(MAKE) $(AM_MAKEFLAGS) all-recursive

So the built sources are always built before the object files.  Thus I
do not understand how it is possible for:

1. libbison_a-sprintf.o, libbison_a-printf.o to be built before
   stdio.h

2. Likewise with lib/uniwidth/width.c wrt uniwidth.h


Your patch certainly addresses your concern, but actually it's "overkill".
For instance:

+$(gl_LIBOBJS): $(BUILT_SOURCES) $(MOSTLYCLEANFILES:%.h)

results in the fact that all the files in gl_LIBOBJS depend on all the
$(BUILT_SOURCES), which is not true and would result in more compilations
than truly needed if one of the BUILT_SOURCES is changed.



There's a question in the ticket I believe is unanswered: how exactly
is Bison built?  Where can I read the recipe?  I would like to see how
"configure" is run, and how "make" is run too.  You gave me the configure
call, but I would like to see the full sequence.
(https://github.com/akimd/bison/issues/31#issuecomment-608987970)
I found it nowhere in
https://autobuilder.yoctoproject.org/typhoon/#/builders/92/builds/2205/steps/8/logs/step1d
but I'm uneasy with this environment.



Please understand my hesitations.

1. gnulib.mk is generated via gnulib, and gnulib is a project independent
  from Bison used by many projects.  I cannot just push changes over there
  without a strong case.

2. I still don't understand why the theory does not apply to your case,
  and maybe there are more bugs lurking because we are applying workarounds
  instead of addressing the core issue: some BUILT_SOURCES were not
  generated before the actual compilations.


Thanks in advance!

	Akim
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.