Description:
GNU Make version of fnmatch()/glob() functions.  This is a holdover from
a very old version of the globbing library.

Files:
lib/fnmatch.c
lib/fnmatch.in.h
lib/glob.c
lib/glob.in.h

configure.ac:
# Check the system to see if it provides GNU glob.  If not, use our
# 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])

# Tell build.sh which to use
USE_SYSTEM_GLOB="$make_cv_sys_gnu_glob"
AC_SUBST([USE_SYSTEM_GLOB])

Makefile.am:
if !USE_SYSTEM_GLOB
libgnu_a_SOURCES += fnmatch.c

BUILT_SOURCES += fnmatch.h

fnmatch.h: fnmatch.in.h $(top_builddir)/config.status
	$(AM_V_GEN)rm -f $@-t $@ && \
	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
	  cat $(srcdir)/fnmatch.in.h; \
	} > $@-t && \
	mv -f $@-t $@

MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t

libgnu_a_SOURCES += glob.c

BUILT_SOURCES += glob.h

glob.h: glob.in.h $(top_builddir)/config.status
	$(AM_V_GEN)rm -f $@-t $@ && \
	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
	  cat $(srcdir)/glob.in.h; \
	} > $@-t && \
	mv -f $@-t $@

MOSTLYCLEANFILES += glob.h glob.h-t
endif

EXTRA_DIST += fnmatch.in.h glob.in.h

Include:
<glob.h>

License:
LGPLv2+

Maintainer:
all, glibc
