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");