]> git.ipfire.org Git - thirdparty/make.git/commitdiff
* gl/modules/make-glob: Avoid glibc glob if bug #866 is present
authorPaul Smith <psmith@gnu.org>
Sun, 19 Feb 2023 22:43:12 +0000 (17:43 -0500)
committerPaul Smith <psmith@gnu.org>
Sun, 19 Feb 2023 22:43:12 +0000 (17:43 -0500)
configure.ac
gl/modules/make-glob

index 2f1168e94a657acf5f86585a00f59991242bba14..ac183b54d05f89fd08fc026c60de2f6a46eb225d 100644 (file)
@@ -353,14 +353,14 @@ AS_CASE([/$make_cv_load/$user_load/],
 # For example passing -rdynamic to the SunPRO linker gives a warning
 # but succeeds and creates a shared object, not an executable!
 AS_IF([test "$make_cv_load" = yes], [
-  AC_MSG_CHECKING([If the linker accepts -Wl,--export-dynamic])
+  AC_MSG_CHECKING([if the linker accepts -Wl,--export-dynamic])
   old_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
   AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){}])],
     [AC_MSG_RESULT([yes])
      AC_SUBST([AM_LDFLAGS], [-Wl,--export-dynamic])],
     [AC_MSG_RESULT([no])
-     AC_MSG_CHECKING([If the linker accepts -rdynamic])
+     AC_MSG_CHECKING([if the linker accepts -rdynamic])
      LDFLAGS="$old_LDFLAGS -rdynamic"
      AC_LINK_IFELSE([AC_LANG_SOURCE([int main(){}])],
        [AC_MSG_RESULT([yes])
index 3b6cdee2cd13a88f99413454e40152bfd0b8cdab..1193ed9763e4d1f96fd123fd0d1fa2c93760fc16 100644 (file)
@@ -10,21 +10,59 @@ lib/glob.in.h
 
 configure.ac:
 # Check the system to see if it provides GNU glob.  If not, use our
-# local version.
-AC_CACHE_CHECK([if system libc has GNU glob], [make_cv_sys_gnu_glob],
-[ AC_EGREP_CPP([gnu glob],[
-#include <features.h>
-#include <glob.h>
-#include <fnmatch.h>
-
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
-   gnu glob
-# endif
-#endif],
-        [make_cv_sys_gnu_glob=yes],
-        [make_cv_sys_gnu_glob=no])])
+# local version.  Also avoid versions of glibc which have symlink bug
+# https://sourceware.org/bugzilla/show_bug.cgi?id=866 (test from gnulib)
+AC_CACHE_CHECK([if system libc has working GNU glob], [make_cv_sys_gnu_glob],[
+  if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then
+    make_check_symlink=yes
+  else
+    make_check_symlink=no
+  fi
+  if test $cross_compiling = yes || test $make_check_symlink = no; then
+    # When cross-compiling or without symlink support, check the version
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+        [[#include <features.h>
+          #include <gnu-versions.h>
+          #include <glob.h>
+          #include <fnmatch.h>
+        ]],
+        [[
+          #if _GNU_GLOB_INTERFACE_VERSION == 0
+            GNU glob not available in libc
+          #elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 27)
+            GNU glob in libc has dangling symlink bug
+          #endif
+        ]])],
+      [make_cv_sys_gnu_glob=yes],
+      [make_cv_sys_gnu_glob=no])
+  else
+    # Check for GNU glob, and that it handles dangling symlinks properly
+    AC_RUN_IFELSE(
+      [AC_LANG_PROGRAM(
+        [[#include <features.h>
+          #include <gnu-versions.h>
+          #include <glob.h>
+          #include <fnmatch.h>
+        ]],
+        [[
+          #if _GNU_GLOB_INTERFACE_VERSION == 0
+          return 1;
+          #else
+          glob_t found;
+          if (glob ("conf*-globtest", 0, 0, &found) == GLOB_NOMATCH)
+            return 1;
+          globfree (&found);
+          #endif
+        ]])],
+      [make_cv_sys_gnu_glob=yes],
+      [make_cv_sys_gnu_glob=no],
+      [dnl We don't get here.
+       :
+      ])
+  fi
+  test $make_check_symlink = no || rm -f conf$$-globtest
+])
 
 # Tell automake about this, so it can build the right .c files.
 AM_CONDITIONAL([USE_SYSTEM_GLOB], [test "$make_cv_sys_gnu_glob" = yes])