Post by Bruno HaibleThis is because /usr/include/gnu-versions.h now defines
https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=ccf970c7a77e86f4f5ef8ecc5e637114b1c0136a
The motivation of _GNU_GLOB_INTERFACE_VERSION == 2 being the new handling
of dangling symlinks, and this change being already in gnulib since 2017-08-31
http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=commitdiff;h=fd1daf4e1824bb46c08ba6244b4d41c8cecb3642
it looks like gnulib's replacement is not needed when
_GNU_GLOB_INTERFACE_VERSION == 2. And indeed this patch works fine for me.
Tested on glibc 2.23, recent glibc, and mingw; including the C++ tests.
Pushed.
2018-03-16 Bruno Haible <***@clisp.org>
glob: Don't compile replacements on recent glibc systems.
* lib/glob.in.h: Use the usual idiom for the double-inclusion guard. If
REPLACE_GLOB is 0, include the system's <glob.h> and use
_GL_CXXALIAS_SYS.
* m4/glob.m4 (gl_GLOB): Set REPLACE_GLOB instead of GLOB_H. Accept
_GNU_GLOB_INTERFACE_VERSION 2 as well. Delete the file conf$$-globtest
inside the AC_RUN_IFELSE block. Remove GL_GENERATE_GLOB_H conditional.
* modules/glob (Dependencies): Test REPLACE_GLOB instead of GLOB_H.
Remove snippet/warn-on-use.
(configure.ac): Test REPLACE_GLOB instead of GLOB_H.
(Makefile.am): Create glob.h always. Update list of substitutions in
glob.h. Don't depend on $(WARN_ON_USE_H).
diff --git a/lib/glob.in.h b/lib/glob.in.h
index cc3f48c..656c1eb 100644
--- a/lib/glob.in.h
+++ b/lib/glob.in.h
@@ -17,21 +17,22 @@
You should have received a copy of the GNU General Public License
along with this program; if not, see <https://www.gnu.org/licenses/>. */
-#ifndef _GL_GLOB_H
-#define _GL_GLOB_H
+#ifndef ***@GUARD_PREFIX@_GLOB_H
-#include <libc-config.h>
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
-#include <stddef.h>
+/* The include_next requires a split double-inclusion guard. */
+#if !@REPLACE_GLOB@
+# @INCLUDE_NEXT@ @NEXT_GLOB_H@
+#endif
-/* On some systems, such as AIX 5.1, <sys/stat.h> does a "#define stat stat64".
- Make sure this definition is seen before glob-libc.h defines types that
- rely on 'struct stat'. */
-#include <sys/stat.h>
+#ifndef ***@GUARD_PREFIX@_GLOB_H
+#define ***@GUARD_PREFIX@_GLOB_H
-#ifndef __USE_GNU
-# define __USE_GNU 1
-#endif
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
/* GCC 2.95 and later have "__restrict"; C99 compilers have
"restrict", and "configure" may have defined "restrict".
@@ -48,35 +49,71 @@
# endif
#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef int (*_gl_glob_errfunc_fn) (const char *, int);
+#ifdef __cplusplus
+}
+#endif
+
+
+#if @REPLACE_GLOB@
+
+
+/* Preparations for including the standard GNU C Library header. */
+
+# include <libc-config.h>
+
+# include <stddef.h>
+
+/* On some systems, such as AIX 5.1, <sys/stat.h> does a "#define stat stat64".
+ Make sure this definition is seen before glob-libc.h defines types that
+ rely on 'struct stat'. */
+# include <sys/stat.h>
+
+# ifndef __USE_GNU
+# define __USE_GNU 1
+# endif
+
+# define glob rpl_glob
+# define globfree rpl_globfree
+# define glob_pattern_p rpl_glob_pattern_p
+# define __glob_pattern_p glob_pattern_p
-#define glob rpl_glob
-#define globfree rpl_globfree
-#define glob_pattern_p rpl_glob_pattern_p
-#define __glob_pattern_p glob_pattern_p
+# define __GLOB_GNULIB 1
-#define __GLOB_GNULIB 1
/* Now the standard GNU C Library header should work. */
-#include "glob-libc.h"
+# include "glob-libc.h"
-__BEGIN_DECLS
-typedef int (*_gl_glob_errfunc_fn) (const char *, int);
-__END_DECLS
-#if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef glob
-# undef globfree
-# undef glob_pattern_p
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef glob
+# undef globfree
+# undef glob_pattern_p
_GL_CXXALIAS_RPL (glob, int, (const char *_Restrict_ __pattern, int __flags,
_gl_glob_errfunc_fn __errfunc,
glob_t *_Restrict_ __pglob));
_GL_CXXALIAS_RPL (globfree, void, (glob_t *__pglob));
_GL_CXXALIAS_RPL (glob_pattern_p, int, (const char *__pattern, int __quote));
-# if 0 /* The C function name is rpl_glob, not glob. */
+# endif
+
+#else
+
+_GL_CXXALIAS_SYS (glob, int, (const char *_Restrict_ __pattern, int __flags,
+ _gl_glob_errfunc_fn __errfunc,
+ glob_t *_Restrict_ __pglob));
+_GL_CXXALIAS_SYS (globfree, void, (glob_t *__pglob));
+_GL_CXXALIAS_SYS (glob_pattern_p, int, (const char *__pattern, int __quote));
+
+#endif
+
+#if 0 /* The C function name is rpl_glob in some cases, not glob. */
_GL_CXXALIASWARN (glob);
_GL_CXXALIASWARN (globfree);
_GL_CXXALIASWARN (glob_pattern_p);
-# endif
#endif
-#endif /* _GL_GLOB_H */
+#endif /* ***@GUARD_PREFIX@_GLOB_H */
+#endif /* ***@GUARD_PREFIX@_GLOB_H */
diff --git a/m4/glob.m4 b/m4/glob.m4
index 9dedb41..37cb917 100644
--- a/m4/glob.m4
+++ b/m4/glob.m4
@@ -1,4 +1,4 @@
-# glob.m4 serial 16
+# glob.m4 serial 18
dnl Copyright (C) 2005-2007, 2009-2018 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -9,54 +9,58 @@ dnl with or without modifications, as long as this notice is preserved.
# always include <glob.h> for the glob prototypes.
AC_DEFUN([gl_GLOB],
-[ GLOB_H=
- AC_CHECK_HEADERS([glob.h], [], [GLOB_H=glob.h])
+[
+ dnl <glob.h> is always overridden, because of the C++ GNULIB_NAMESPACE.
+ gl_CHECK_NEXT_HEADERS([glob.h])
+ if test $ac_cv_header_glob_h = yes; then
+ REPLACE_GLOB=0
+ else
+ REPLACE_GLOB=1
+ fi
- if test -z "$GLOB_H"; then
- AC_CACHE_CHECK([for GNU glob interface version 1],
- [gl_cv_gnu_glob_interface_version_1],
+ if test $REPLACE_GLOB = 0; then
+ AC_CACHE_CHECK([for GNU glob interface version 1 or 2],
+ [gl_cv_gnu_glob_interface_version_1_2],
[ AC_COMPILE_IFELSE([AC_LANG_SOURCE(
[[#include <gnu-versions.h>
-char a[_GNU_GLOB_INTERFACE_VERSION == 1 ? 1 : -1];]])],
- [gl_cv_gnu_glob_interface_version_1=yes],
- [gl_cv_gnu_glob_interface_version_1=no])])
+char a[_GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2 ? 1 : -1];]])],
+ [gl_cv_gnu_glob_interface_version_1_2=yes],
+ [gl_cv_gnu_glob_interface_version_1_2=no])])
- if test "$gl_cv_gnu_glob_interface_version_1" = "no"; then
- GLOB_H=glob.h
+ if test "$gl_cv_gnu_glob_interface_version_1_2" = "no"; then
+ REPLACE_GLOB=1
fi
fi
- if test -z "$GLOB_H"; then
+ if test $REPLACE_GLOB = 0; then
AC_CACHE_CHECK([whether glob lists broken symlinks],
[gl_cv_glob_lists_symlinks],
-[ if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then
- gl_cv_glob_lists_symlinks=maybe
- else
- # If we can't make a symlink, then we cannot test this issue. Be
- # pessimistic about this.
- gl_cv_glob_lists_symlinks=no
- fi
-
- if test $gl_cv_glob_lists_symlinks = maybe; then
- AC_RUN_IFELSE([
+ [if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then
+ gl_cv_glob_lists_symlinks=maybe
+ else
+ # If we can't make a symlink, then we cannot test this issue. Be
+ # pessimistic about this.
+ gl_cv_glob_lists_symlinks=no
+ fi
+ if test $gl_cv_glob_lists_symlinks = maybe; then
+ AC_RUN_IFELSE([
AC_LANG_PROGRAM(
[[#include <stddef.h>
#include <glob.h>]],
[[glob_t found;
if (glob ("conf*-globtest", 0, NULL, &found) == GLOB_NOMATCH) return 1;]])],
- [gl_cv_glob_lists_symlinks=yes],
- [gl_cv_glob_lists_symlinks=no], [gl_cv_glob_lists_symlinks=no])
- fi])
+ [gl_cv_glob_lists_symlinks=yes],
+ [gl_cv_glob_lists_symlinks=no], [gl_cv_glob_lists_symlinks=no])
+ fi
+ rm -f conf$$-globtest
+ ])
if test $gl_cv_glob_lists_symlinks = no; then
- GLOB_H=glob.h
+ REPLACE_GLOB=1
fi
fi
- rm -f conf$$-globtest
-
- AC_SUBST([GLOB_H])
- AM_CONDITIONAL([GL_GENERATE_GLOB_H], [test -n "$GLOB_H"])
+ AC_SUBST([REPLACE_GLOB])
])
# Prerequisites of lib/glob.*.
diff --git a/modules/glob b/modules/glob
index 3a43222..94b3fd0 100644
--- a/modules/glob
+++ b/modules/glob
@@ -16,31 +16,30 @@ c99
extensions
largefile
snippet/c++defs
-snippet/warn-on-use
-alloca [test -n "$GLOB_H"]
-builtin-expect [test -n "$GLOB_H"]
-closedir [test -n "$GLOB_H"]
-d-type [test -n "$GLOB_H"]
-flexmember [test -n "$GLOB_H"]
-fnmatch [test -n "$GLOB_H"]
-getlogin_r [test -n "$GLOB_H"]
-libc-config [test -n "$GLOB_H"]
-lstat [test -n "$GLOB_H"]
-memchr [test -n "$GLOB_H"]
-mempcpy [test -n "$GLOB_H"]
-opendir [test -n "$GLOB_H"]
-readdir [test -n "$GLOB_H"]
-scratch_buffer [test -n "$GLOB_H"]
-stdbool [test -n "$GLOB_H"]
-stdint [test -n "$GLOB_H"]
-strdup [test -n "$GLOB_H"]
-sys_stat [test -n "$GLOB_H"]
-unistd [test -n "$GLOB_H"]
-malloc-posix [test -n "$GLOB_H"]
+alloca [test $REPLACE_GLOB = 1]
+builtin-expect [test $REPLACE_GLOB = 1]
+closedir [test $REPLACE_GLOB = 1]
+d-type [test $REPLACE_GLOB = 1]
+flexmember [test $REPLACE_GLOB = 1]
+fnmatch [test $REPLACE_GLOB = 1]
+getlogin_r [test $REPLACE_GLOB = 1]
+libc-config [test $REPLACE_GLOB = 1]
+lstat [test $REPLACE_GLOB = 1]
+memchr [test $REPLACE_GLOB = 1]
+mempcpy [test $REPLACE_GLOB = 1]
+opendir [test $REPLACE_GLOB = 1]
+readdir [test $REPLACE_GLOB = 1]
+scratch_buffer [test $REPLACE_GLOB = 1]
+stdbool [test $REPLACE_GLOB = 1]
+stdint [test $REPLACE_GLOB = 1]
+strdup [test $REPLACE_GLOB = 1]
+sys_stat [test $REPLACE_GLOB = 1]
+unistd [test $REPLACE_GLOB = 1]
+malloc-posix [test $REPLACE_GLOB = 1]
configure.ac:
gl_GLOB
-if test -n "$GLOB_H"; then
+if test $REPLACE_GLOB = 1; then
AC_LIBOBJ([glob])
AC_LIBOBJ([glob_pattern_p])
AC_LIBOBJ([globfree])
@@ -48,23 +47,22 @@ if test -n "$GLOB_H"; then
fi
Makefile.am:
-BUILT_SOURCES += $(GLOB_H)
+BUILT_SOURCES += glob.h
-# We need the following in order to create <glob.h> when the system
-# doesn't have one that works with the given compiler.
-if GL_GENERATE_GLOB_H
-glob.h: glob.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+# We need the following in order to create <glob.h>.
+glob.h: glob.in.h $(top_builddir)/config.status $(CXXDEFS_H)
$(AM_V_GEN)rm -f $@-t $@ && \
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
- sed -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
- -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ sed -e 's|@''GUARD_PREFIX''@|${gl_include_guard_prefix}|g' \
+ -e 's|@''REPLACE_GLOB''@|$(REPLACE_GLOB)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_GLOB_H''@|$(NEXT_GLOB_H)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
< $(srcdir)/glob.in.h; \
} > $@-t && \
mv -f $@-t $@
-else
-glob.h: $(top_builddir)/config.status
- rm -f $@
-endif
MOSTLYCLEANFILES += glob.h glob.h-t
Include: