On Thu, 2019-05-02 at 02:13 -0400, Jeffrey Walton wrote:
> Hi Everyone,
>
> I'm working from the 4.2.1 tarball. I see __alloca has caused some
> grief. (
> https://lists.gnu.org/archive/html/bug-make/2017-11/msg00020.html
>
> and friends).
>
> There have been no GNU Make releases since June 2016. The problem is
> still present, and it does not look like it is going to be fixed
> anytime soon.
>
> What is the official patch to fix the problem? Does someone have a
> 'diff -u' or a 'git diff'?
Applying the attached patch to a downloaded source tarball of GNU make
4.2.1 should allow it to work correctly with the latest GNU libc
versions.
Note the info at the top of the patch: if you're building from a
tarball you need to "touch" a few files to ensure that it doesn't try
to rebuild autotools files.
Apply this patch to the results of unpacking a make 4.2.1 tarball,
then run the following commands:
touch aclocal.m4
touch Makefile.in
touch configure
Now you should be able to reconfigure and rebuild.
--- a/configure.ac 2016-06-06 08:27:31.000000000 -0400
+++ b/configure.ac 2019-05-04 14:24:17.102496612 -0400
@@ -399,10 +399,9 @@
#include <glob.h>
#include <fnmatch.h>
-#define GLOB_INTERFACE_VERSION 1
#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
+# if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
gnu glob
# endif
#endif],
--- a/dir.c 2016-05-31 03:17:26.000000000 -0400
+++ b/dir.c 2019-05-04 14:24:11.134431911 -0400
@@ -407,6 +407,7 @@
const char *name; /* Name of the file. */
size_t length;
short impossible; /* This file is impossible. */
+ unsigned char type;
};
static unsigned long
@@ -731,6 +732,9 @@
#else
df->name = strcache_add_len (d->d_name, len);
#endif
+#ifdef _DIRENT_HAVE_D_TYPE
+ df->type = d->d_type;
+#endif
df->length = len;
df->impossible = 0;
hash_insert_at (&dir->dirfiles, df, dirfile_slot);
@@ -1242,7 +1246,7 @@
d->d_namlen = len - 1;
#endif
#ifdef _DIRENT_HAVE_D_TYPE
- d->d_type = DT_UNKNOWN;
+ d->d_type = df->type;
#endif
memcpy (d->d_name, df->name, len);
return d;
@@ -1299,15 +1303,40 @@
}
#endif
+/* Similarly for lstat. */
+#if !defined(lstat) && !defined(WINDOWS32) || defined(VMS)
+# ifndef VMS
+# ifndef HAVE_SYS_STAT_H
+int lstat (const char *path, struct stat *sbuf);
+# endif
+# else
+ /* We are done with the fake lstat. Go back to the real lstat */
+# ifdef lstat
+# undef lstat
+# endif
+# endif
+# define local_lstat lstat
+#elif defined(WINDOWS32)
+/* Windows doesn't support lstat(). */
+# define local_lstat local_stat
+#else
+static int
+local_lstat (const char *path, struct stat *buf)
+{
+ int e;
+ EINTRLOOP (e, lstat (path, buf));
+ return e;
+}
+#endif
+
void
dir_setup_glob (glob_t *gl)
{
gl->gl_opendir = open_dirstream;
gl->gl_readdir = read_dirstream;
gl->gl_closedir = free;
+ gl->gl_lstat = local_lstat;
gl->gl_stat = local_stat;
- /* We don't bother setting gl_lstat, since glob never calls it.
- The slot is only there for compatibility with 4.4 BSD. */
}
void
--- a/tests/run_make_tests.pl
+++ b/tests/run_make_tests.pl
@@ -58,6 +58,9 @@ if ($^O eq 'VMS')
*CORE::GLOBAL::rmdir = \&vms_rmdir;
}
+use FindBin;
+use lib "$FindBin::Bin";
+
require "test_driver.pl";
require "config-flags.pm";
--- a/configure 2016-06-10 19:03:21.000000000 -0400
+++ b/configure 2019-05-04 14:33:03.212667798 -0400
@@ -11481,10 +11481,9 @@
#include <glob.h>
#include <fnmatch.h>
-#define GLOB_INTERFACE_VERSION 1
#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
+# if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
gnu glob
# endif
#endif
_______________________________________________
Bug-make mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-make