From ed7d5c2b5b777486add9806dc2c9041fcfcb5631 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Tue, 19 May 2020 22:05:22 +0200 Subject: [PATCH] src: make path to m4 relocatable Commit a4ede8f85b0c9a254fcb01e5888cee1983095669 ("package: make bison a relocatable package") made Bison relocatable, but in fact it still contains one absolute reference: the M4 variable, which points to the M4 program. Let's fix that by using relocate(), see if an M4 binary is available at the relocated location, and otherwise fallback to the original M4 location. See https://lists.gnu.org/r/bison-patches/2020-05/msg00078.html, and https://lists.gnu.org/r/bison-patches/2020-05/msg00087.html. * src/files.h, src/files.c (m4path): New. * src/output.c: Use it. --- NEWS | 4 ++++ src/files.c | 22 +++++++++++++++++++++- src/files.h | 3 +++ src/output.c | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index f5eb8032..a807b545 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Changes + + When installed to be relocatable (via configure --enable-relocatable), + bison will now also look for a relocated m4. * Noteworthy changes in release 3.6.2 (2020-05-17) [stable] diff --git a/src/files.c b/src/files.c index 71c10e34..5b743ab5 100644 --- a/src/files.c +++ b/src/files.c @@ -22,13 +22,16 @@ #include "system.h" #include /* PKGDATADIR */ -#include #include +#include #include #include #include #include /* relocate2 */ #include +#include +#include +#include #include #include "complain.h" @@ -421,6 +424,23 @@ pkgdatadir (void) } } +char const * +m4path (void) +{ + char const *m4 = getenv ("M4"); + if (m4) + return m4; + + /* We don't use relocate2() to store the temporary buffer and re-use + it, because m4path() is only called once. */ + char const *m4_relocated = relocate (M4); + struct stat buf; + if (stat (m4_relocated, &buf) == 0) + return m4_relocated; + + return M4; +} + void output_file_names_free (void) { diff --git a/src/files.h b/src/files.h index 00814ad0..64b6f8b5 100644 --- a/src/files.h +++ b/src/files.h @@ -64,6 +64,9 @@ extern char *all_but_ext; /* Where our data files are installed. */ char const *pkgdatadir (void); +/* Where the m4 program is installed. */ +char const *m4path (void); + void compute_output_file_names (void); void output_file_names_free (void); diff --git a/src/output.c b/src/output.c index 1871fd75..ebe75095 100644 --- a/src/output.c +++ b/src/output.c @@ -682,7 +682,7 @@ static void output_skeleton (void) { /* Compute the names of the package data dir and skeleton files. */ - char const *m4 = (m4 = getenv ("M4")) ? m4 : M4; + char const *m4 = m4path (); char const *datadir = pkgdatadir (); char *skeldir = xpath_join (datadir, "skeletons"); char *m4sugar = xpath_join (datadir, "m4sugar/m4sugar.m4");