package: make bison a relocatable package

Suggested by David Barto
https://lists.gnu.org/archive/html/help-bison/2015-02/msg00004.html
and Victor Zverovich.
https://lists.gnu.org/archive/html/bison-patches/2018-10/msg00121.html

This is very easy to do, thanks to work by Bruno Haible in gnulib.
See "Supporting Relocation" in gnulib's documentation.

* bootstrap.conf: We need relocatable-prog and relocatable-script (for yacc).

* src/yacc.in: New.
* configure.ac, src/local.mk: Instantiate it.
* src/main.c, src/output.c (main, pkgdatadir): Use relocatable2.

* doc/bison.texi (FAQ): Document it.
This commit is contained in:
Akim Demaille
2018-12-25 08:19:50 +01:00
parent 53f1a0b114
commit a4ede8f85b
15 changed files with 105 additions and 16 deletions

9
NEWS
View File

@@ -24,6 +24,15 @@ GNU Bison NEWS
** New features ** New features
*** Bison is now relocatable
If you pass '--enable-relocatable' to 'configure', Bison is relocatable.
A relocatable program can be moved or copied to a different location on
the file system. It can also be used through mount points for network
sharing. It is possible to make symlinks to the installed and moved
programs, and invoke them through the symlink.
*** %expect and %expect-rr modifiers on individual rules *** %expect and %expect-rr modifiers on individual rules
One can now document (and check) which rules participate in shift/reduce One can now document (and check) which rules participate in shift/reduce

10
README
View File

@@ -8,6 +8,16 @@ Bison requires GNU m4 1.4.6 or later. See:
https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz
** Relocatability
If you pass '--enable-relocatable' to 'configure', Bison is relocatable.
A relocatable program can be moved or copied to a different location on the
file system. It can also be used through mount points for network sharing.
It is possible to make symlinks to the installed and moved programs, and
invoke them through the symlink.
See "Enabling Relocatability" in the documentation.
** Internationalization ** Internationalization
Bison supports two catalogs: one for Bison itself (i.e., for the Bison supports two catalogs: one for Bison itself (i.e., for the
maintainer-side parser generation), and one for the generated parsers (i.e., maintainer-side parser generation), and one for the generated parsers (i.e.,

2
THANKS
View File

@@ -40,6 +40,7 @@ Dagobert Michelsen dam@baltic-online.de
Daniel Frużyński daniel@poradnik-webmastera.com Daniel Frużyński daniel@poradnik-webmastera.com
Daniel Galloway dg1751@att.com Daniel Galloway dg1751@att.com
Daniel Hagerty hag@gnu.org Daniel Hagerty hag@gnu.org
David Barto david.barto@sparqlcity.com
David J. MacKenzie djm@gnu.org David J. MacKenzie djm@gnu.org
David Kastrup dak@gnu.org David Kastrup dak@gnu.org
David Michael fedora.dm0@gmail.com David Michael fedora.dm0@gmail.com
@@ -174,6 +175,7 @@ Troy A. Johnson troyj@ecn.purdue.edu
Tys Lefering gccbison@gmail.com Tys Lefering gccbison@gmail.com
Valentin Tolmer nitnelave1@gmail.com Valentin Tolmer nitnelave1@gmail.com
Victor Khomenko victor.khomenko@newcastle.ac.uk Victor Khomenko victor.khomenko@newcastle.ac.uk
Victor Zverovich victor.zverovich@gmail.com
Vin Shelton acs@alumni.princeton.edu Vin Shelton acs@alumni.princeton.edu
W.C.A. Wijngaards wouter@NLnetLabs.nl W.C.A. Wijngaards wouter@NLnetLabs.nl
Wayne Green wayne@infosavvy.com Wayne Green wayne@infosavvy.com

View File

@@ -35,6 +35,7 @@ gnulib_modules='
quote quotearg quote quotearg
readme-release readme-release
realloc-posix realloc-posix
relocatable-prog relocatable-script
spawn-pipe stdbool stpcpy strdup-posix strerror strverscmp spawn-pipe stdbool stpcpy strdup-posix strerror strverscmp
timevar timevar
unistd unistd-safer unlink unlocked-io unistd unistd-safer unlink unlocked-io

View File

@@ -23,3 +23,7 @@
/useless-if-before-free /useless-if-before-free
/vc-list-files /vc-list-files
/ylwrap /ylwrap
/config.libpath
/install-reloc
/reloc-ldflags
/relocatable.sh.in

View File

@@ -203,6 +203,7 @@ AC_ARG_ENABLE([yacc],
[do not build a yacc command or an -ly library])], [do not build a yacc command or an -ly library])],
, [enable_yacc=yes]) , [enable_yacc=yes])
AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes]) AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes])
AC_CONFIG_FILES([src/yacc], [chmod +x src/yacc])
# Checks for programs. # Checks for programs.
AM_MISSING_PROG([DOT], [dot]) AM_MISSING_PROG([DOT], [dot])

1
doc/.gitignore vendored
View File

@@ -30,3 +30,4 @@
/stamp-vti /stamp-vti
/version.texi /version.texi
/yacc.1 /yacc.1
/relocatable.texi

View File

@@ -382,6 +382,7 @@ Frequently Asked Questions
* Strings are Destroyed:: @code{yylval} Loses Track of Strings * Strings are Destroyed:: @code{yylval} Loses Track of Strings
* Implementing Gotos/Loops:: Control Flow in the Calculator * Implementing Gotos/Loops:: Control Flow in the Calculator
* Multiple start-symbols:: Factoring closely related grammars * Multiple start-symbols:: Factoring closely related grammars
* Enabling Relocatability:: Moving Bison/using it through network shares
* Secure? Conform?:: Is Bison POSIX safe? * Secure? Conform?:: Is Bison POSIX safe?
* I can't build Bison:: Troubleshooting * I can't build Bison:: Troubleshooting
* Where can I find help?:: Troubleshouting * Where can I find help?:: Troubleshouting
@@ -12875,6 +12876,7 @@ are addressed.
* Implementing Gotos/Loops:: Control Flow in the Calculator * Implementing Gotos/Loops:: Control Flow in the Calculator
* Multiple start-symbols:: Factoring closely related grammars * Multiple start-symbols:: Factoring closely related grammars
* Secure? Conform?:: Is Bison POSIX safe? * Secure? Conform?:: Is Bison POSIX safe?
* Enabling Relocatability:: Moving Bison/using it through network shares
* I can't build Bison:: Troubleshooting * I can't build Bison:: Troubleshooting
* Where can I find help?:: Troubleshouting * Where can I find help?:: Troubleshouting
* Bug Reports:: Troublereporting * Bug Reports:: Troublereporting
@@ -13156,6 +13158,8 @@ However, Bison is intended to be a reliable program that conforms to the
POSIX specification for Yacc. If you run into problems, please send us a POSIX specification for Yacc. If you run into problems, please send us a
bug report. bug report.
@include relocatable.texi
@node I can't build Bison @node I can't build Bison
@section I can't build Bison @section I can't build Bison
@@ -13209,7 +13213,7 @@ hearts.
I found a bug. What should I include in the bug report? I found a bug. What should I include in the bug report?
@end quotation @end quotation
Before you send a bug report, make sure you are using the latest Before sending a bug report, make sure you are using the latest
version. Check @url{https://ftp.gnu.org/pub/gnu/bison/} or one of its version. Check @url{https://ftp.gnu.org/pub/gnu/bison/} or one of its
mirrors. Be sure to include the version number in your bug report. If mirrors. Be sure to include the version number in your bug report. If
the bug is present in the latest version but not in a previous version, the bug is present in the latest version but not in a previous version,

View File

@@ -19,7 +19,8 @@ info_TEXINFOS = doc/bison.texi
doc_bison_TEXINFOS = \ doc_bison_TEXINFOS = \
$(CROSS_OPTIONS_TEXI) \ $(CROSS_OPTIONS_TEXI) \
doc/fdl.texi \ doc/fdl.texi \
doc/gpl-3.0.texi doc/gpl-3.0.texi \
doc/relocatable.texi
# Cannot express dependencies directly on file names because of Automake. # Cannot express dependencies directly on file names because of Automake.
# Obfuscate with a variable. # Obfuscate with a variable.

15
lib/.gitignore vendored
View File

@@ -294,3 +294,18 @@
/bitset/ /bitset/
/bitsetv.c /bitsetv.c
/bitsetv.h /bitsetv.h
/allocator.c
/allocator.h
/areadlink.c
/areadlink.h
/canonicalize-lgpl.c
/careadlinkat.c
/careadlinkat.h
/progreloc.c
/readlink.c
/relocatable.c
/relocatable.h
/relocwrapper.c
/setenv.c
/xreadlink.c
/xreadlink.h

4
m4/.gitignore vendored
View File

@@ -191,3 +191,7 @@
/sys_resource_h.m4 /sys_resource_h.m4
/timespec.m4 /timespec.m4
/intl-thread-locale.m4 /intl-thread-locale.m4
/canonicalize.m4
/readlink.m4
/relocatable-lib.m4
/relocatable.m4

View File

@@ -13,10 +13,17 @@
## You should have received a copy of the GNU General Public License ## You should have received a copy of the GNU General Public License
## along with this program. If not, see <http://www.gnu.org/licenses/>. ## along with this program. If not, see <http://www.gnu.org/licenses/>.
CLEANDIRS += %D%/*.dSYM
bin_PROGRAMS = src/bison bin_PROGRAMS = src/bison
# Prettify Automake-computed names of compiled objects. # Prettify Automake-computed names of compiled objects.
src_bison_SHORTNAME = bison src_bison_SHORTNAME = bison
src_bison_CPPFLAGS = $(AM_CPPFLAGS) -DINSTALLDIR=\"$(bindir)\"
if RELOCATABLE_VIA_LD
src_bison_LDFLAGS = `$(RELOCATABLE_LDFLAGS) $(bindir)`
endif
src_bison_CFLAGS = $(AM_CFLAGS) $(WERROR_CFLAGS) src_bison_CFLAGS = $(AM_CFLAGS) $(WERROR_CFLAGS)
src_bison_SOURCES = \ src_bison_SOURCES = \
src/AnnotationList.c \ src/AnnotationList.c \
@@ -127,16 +134,7 @@ src_bison_LDADD = \
## ------ ## ## ------ ##
if ENABLE_YACC if ENABLE_YACC
bin_SCRIPTS = src/yacc nodist_bin_SCRIPTS = src/yacc
endif endif
EXTRA_SCRIPTS = src/yacc EXTRA_SCRIPTS = src/yacc
MOSTLYCLEANFILES += src/yacc MOSTLYCLEANFILES += src/yacc
CLEANDIRS += %D%/*.dSYM
src/yacc:
$(AM_V_GEN)rm -f $@ $@.tmp
$(AM_V_at)$(MKDIR_P) src
$(AM_V_at)echo '#! /bin/sh' >$@.tmp
$(AM_V_at)echo "exec '$(bindir)/bison' -y "'"$$@"' >>$@.tmp
$(AM_V_at)chmod a+x $@.tmp
$(AM_V_at)mv $@.tmp $@

View File

@@ -26,6 +26,7 @@
#include <configmake.h> #include <configmake.h>
#include <progname.h> #include <progname.h>
#include <quotearg.h> #include <quotearg.h>
#include <relocatable.h> /* relocate2 */
#include <timevar.h> #include <timevar.h>
#include "LR0.h" #include "LR0.h"
@@ -58,10 +59,16 @@
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
#define DEPENDS_ON_LIBINTL 1
set_program_name (argv[0]); set_program_name (argv[0]);
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
(void) bindtextdomain (PACKAGE, LOCALEDIR); {
(void) bindtextdomain ("bison-runtime", LOCALEDIR); char *cp = NULL;
char const *localedir = relocate2 (LOCALEDIR, &cp);
(void) bindtextdomain (PACKAGE, localedir);
(void) bindtextdomain ("bison-runtime", localedir);
free (cp);
}
(void) textdomain (PACKAGE); (void) textdomain (PACKAGE);
{ {

View File

@@ -26,6 +26,7 @@
#include <get-errno.h> #include <get-errno.h>
#include <path-join.h> #include <path-join.h>
#include <quotearg.h> #include <quotearg.h>
#include <relocatable.h> /* relocate2 */
#include <spawn-pipe.h> #include <spawn-pipe.h>
#include <timevar.h> #include <timevar.h>
#include <wait-process.h> #include <wait-process.h>
@@ -44,6 +45,9 @@
static struct obstack format_obstack; static struct obstack format_obstack;
/* Memory allocated by relocate2, to free. */
static char *relocate_buffer = NULL;
/*-------------------------------------------------------------------. /*-------------------------------------------------------------------.
| Create a function NAME which associates to the muscle NAME the | | Create a function NAME which associates to the muscle NAME the |
@@ -718,11 +722,17 @@ output (void)
unlink_generated_sources (); unlink_generated_sources ();
obstack_free (&format_obstack, NULL); obstack_free (&format_obstack, NULL);
free (relocate_buffer);
} }
char const * char const *
pkgdatadir (void) pkgdatadir (void)
{ {
char const *cp = getenv ("BISON_PKGDATADIR"); if (relocate_buffer)
return cp ? cp : PKGDATADIR; return relocate_buffer;
else
{
char const *cp = getenv ("BISON_PKGDATADIR");
return cp ? cp : relocate2 (PKGDATADIR, &relocate_buffer);
}
} }

22
src/yacc.in Normal file
View File

@@ -0,0 +1,22 @@
#! /bin/sh
@relocatable_sh@
if test "@RELOCATABLE@" = yes; then
exec_prefix="@exec_prefix@"
bindir="@bindir@"
orig_installdir="$bindir" # see Makefile.am's *_SCRIPTS variables
func_find_curr_installdir # determine curr_installdir
func_find_prefixes
relocate () {
echo "$1/" \
| sed -e "s%^${orig_installprefix}/%${curr_installprefix}/%" \
| sed -e 's,/$,,'
}
else
relocate () {
echo "$1"
}
fi
bindir=`relocate "@bindir@"`
exec "$bindir/bison" -y "$@"