Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    437eea66
    intl: Unbreak intl build with bison 3 when no regeneration is needed [PR92008] · 437eea66
    Jakub Jelinek authored
    As Iain reported, my change broke the case when one has bison >= 3,
    but make decides there is no reason to regenerate plural.c, unfortunately
    that seems to be a scenario I haven't tested.  The problem is that
    the pregenerated plural.c has been generated with bison 1.35, but when
    config.h says HAVE_BISON3, the code assumes it is the bison3 variant.
    What used to work fine is when one has bison >= 3 and plural.c has been
    regenerated (e.g. do touch intl/plural.y and it will work), or when
    one doesn't have any bison (then nothing is regenerated, but HAVE_BISON3
    isn't defined either), or when one has bison < 3 and doesn't need to
    regenerate, or when one has bison < 3 and it is regenerated.
    
    The following patch fixes this, by killing the HAVE_BISON3 macro from
    config.h, and instead remembering the fact whether plural.c has been created
    with bison < 3 or bison >= 3 in a separate new plural-config.h header.
    The way this works:
    - user doesn't have bison
    - user has bison >= 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y
    - user has bison < 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y
    	pregenerated !USE_BISON3 plural.c and plural-config.h from source
    	dir is used, nothing in the objdir
    - user has bison >= 3 and intl/plural.y is newer
    	Makefile generates plural.c and USE_BISON3 plural-config.h in the
    	objdir, which is then used in preference to srcdir copies
    - user has bison < 3 and intl/plural.y is newer
    	Makefile generates plural.c and !USE_BISON3 plural-config.h in the
    	objdir, which is then used in preference to srcdir copies
    I have tested all these cases and make all-yes worked in all the cases.
    If one uses the unsupported ./configure where srcdir == objdir, I guess
    (though haven't tested) that it should still work, just it would be nice
    if such people didn't try to check in the plural{.c,-config.h} they have
    regenerated.
    What doesn't work, but didn't work before either (just tested gcc-9 branch
    too) is when one doesn't have bison and plural.y is newer than plural.c.
    Don't do that ;)
    
    2020-04-16  Jakub Jelinek  <jakub@redhat.com>
    
    	PR bootstrap/92008
    intl/
    	* configure.ac: Remove HAVE_BISON3 AC_DEFINE.
    	* Makefile.in (HEADERS): Add plural-config.h.
    	(.y.c): Also create plural-config.h.
    	(dcigettext.o loadmsgcat.o plural.o plural-exp.o): Also depend
    	on plural-config.h.
    	(plural-config.h): Depend on plural.c.
    	* plural-exp.h: Include plural-config.h.  Use USE_BISON3 instead
    	of HAVE_BISON3.
    	* plural.y: Use USE_BISON3 instead of HAVE_BISON3.
    	* configure: Regenerated.
    	* plural.c: Regenerated.
    	* config.h.in: Regenerated.
    	* plural-config.h: Generated.
    contrib/
    	* gcc_update: Add intl/plural.y dependency for intl/plural-config.h.
    437eea66
    History
    intl: Unbreak intl build with bison 3 when no regeneration is needed [PR92008]
    Jakub Jelinek authored
    As Iain reported, my change broke the case when one has bison >= 3,
    but make decides there is no reason to regenerate plural.c, unfortunately
    that seems to be a scenario I haven't tested.  The problem is that
    the pregenerated plural.c has been generated with bison 1.35, but when
    config.h says HAVE_BISON3, the code assumes it is the bison3 variant.
    What used to work fine is when one has bison >= 3 and plural.c has been
    regenerated (e.g. do touch intl/plural.y and it will work), or when
    one doesn't have any bison (then nothing is regenerated, but HAVE_BISON3
    isn't defined either), or when one has bison < 3 and doesn't need to
    regenerate, or when one has bison < 3 and it is regenerated.
    
    The following patch fixes this, by killing the HAVE_BISON3 macro from
    config.h, and instead remembering the fact whether plural.c has been created
    with bison < 3 or bison >= 3 in a separate new plural-config.h header.
    The way this works:
    - user doesn't have bison
    - user has bison >= 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y
    - user has bison < 3, but intl/{plural-config.h,plural.c} aren't older than intl/plural.y
    	pregenerated !USE_BISON3 plural.c and plural-config.h from source
    	dir is used, nothing in the objdir
    - user has bison >= 3 and intl/plural.y is newer
    	Makefile generates plural.c and USE_BISON3 plural-config.h in the
    	objdir, which is then used in preference to srcdir copies
    - user has bison < 3 and intl/plural.y is newer
    	Makefile generates plural.c and !USE_BISON3 plural-config.h in the
    	objdir, which is then used in preference to srcdir copies
    I have tested all these cases and make all-yes worked in all the cases.
    If one uses the unsupported ./configure where srcdir == objdir, I guess
    (though haven't tested) that it should still work, just it would be nice
    if such people didn't try to check in the plural{.c,-config.h} they have
    regenerated.
    What doesn't work, but didn't work before either (just tested gcc-9 branch
    too) is when one doesn't have bison and plural.y is newer than plural.c.
    Don't do that ;)
    
    2020-04-16  Jakub Jelinek  <jakub@redhat.com>
    
    	PR bootstrap/92008
    intl/
    	* configure.ac: Remove HAVE_BISON3 AC_DEFINE.
    	* Makefile.in (HEADERS): Add plural-config.h.
    	(.y.c): Also create plural-config.h.
    	(dcigettext.o loadmsgcat.o plural.o plural-exp.o): Also depend
    	on plural-config.h.
    	(plural-config.h): Depend on plural.c.
    	* plural-exp.h: Include plural-config.h.  Use USE_BISON3 instead
    	of HAVE_BISON3.
    	* plural.y: Use USE_BISON3 instead of HAVE_BISON3.
    	* configure: Regenerated.
    	* plural.c: Regenerated.
    	* config.h.in: Regenerated.
    	* plural-config.h: Generated.
    contrib/
    	* gcc_update: Add intl/plural.y dependency for intl/plural-config.h.
configure.ac 2.15 KiB