src: make path to m4 relocatable

Commit a4ede8f85b ("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.
This commit is contained in:
Thomas Petazzoni
2020-05-19 22:05:22 +02:00
committed by Akim Demaille
parent 1ce02e13c3
commit ed7d5c2b5b
4 changed files with 29 additions and 2 deletions

4
NEWS
View File

@@ -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]

View File

@@ -22,13 +22,16 @@
#include "system.h"
#include <configmake.h> /* PKGDATADIR */
#include <error.h>
#include <dirname.h>
#include <error.h>
#include <get-errno.h>
#include <quote.h>
#include <quotearg.h>
#include <relocatable.h> /* relocate2 */
#include <stdio-safer.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <xstrndup.h>
#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)
{

View File

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

View File

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