GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/unix/sysv/linux.

# Don't bother trying to generate any glue code to be compatible with the
# existing system library, because we are the only system library.
inhibit_glue=yes

define([LIBC_LINUX_VERSION],[2.6.19])dnl
if test -n "$sysheaders"; then
  OLD_CPPFLAGS=$CPPFLAGS
  CPPFLAGS="$CPPFLAGS $SYSINCLUDES"
fi
define([libc_cv_linuxVER], [libc_cv_linux]patsubst(LIBC_LINUX_VERSION,[\.]))dnl
AC_CACHE_CHECK(installed Linux kernel header files, libc_cv_linuxVER, [dnl
AC_EGREP_CPP([eat flaming death], [#include <linux/version.h>
#if !defined LINUX_VERSION_CODE || LINUX_VERSION_CODE < ]dnl
patsubst(LIBC_LINUX_VERSION,[^\([^.]*\)\.\([^.]*\)\.\([^.]*\)$],dnl
[ (\1 *65536+ \2 *256+ \3) /* \1.\2.\3 */])[
eat flaming death
#endif],
	     libc_cv_linuxVER='TOO OLD!',
	     libc_cv_linuxVER='LIBC_LINUX_VERSION or later')])
if test "$libc_cv_linuxVER" != 'LIBC_LINUX_VERSION or later'; then
  AC_MSG_ERROR([GNU libc requires kernel header files from
Linux LIBC_LINUX_VERSION or later to be installed before configuring.
The kernel header files are found usually in /usr/include/asm and
/usr/include/linux; make sure these directories use files from
Linux LIBC_LINUX_VERSION or later.  This check uses <linux/version.h>, so
make sure that file was built correctly when installing the kernel header
files.  To use kernel headers not from /usr/include/linux, use the
configure option --with-headers.])
fi

# If the user gave a minimal version number test whether the available
# kernel headers are young enough.  Additionally we have minimal
# kernel versions for some architectures.  If a previous configure fragment
# set arch_minimum_kernel already, let that override our defaults here.
# Note that we presume such a fragment has set libc_cv_gcc_unwind_find_fde
# if appropriate too.
test -n "$arch_minimum_kernel" ||
case "$machine" in
  i386*)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  x86_64/x32)
    arch_minimum_kernel=3.4.0
    ;;
  powerpc/powerpc32*)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  s390/s390-32)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  s390/s390-64)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  sh*)
    arch_minimum_kernel=2.6.16
    libc_cv_gcc_unwind_find_fde=yes
    ;;
  sparc/sparc64*)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  sparc*)
    libc_cv_gcc_unwind_find_fde=yes
    arch_minimum_kernel=2.6.16
    ;;
  *)
    arch_minimum_kernel=2.6.16
    ;;
esac
if test -n "$minimum_kernel"; then
  changequote(,)
  user_version=$((`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 65536 + \2 \* 256 + \3/'`))
  arch_version=$((`echo "$arch_minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 65536 + \2 \* 256 + \3/'`))
  changequote([,])
  if test $user_version -lt $arch_version; then
    AC_MSG_WARN([minimum kernel version reset to $arch_minimum_kernel])
    minimum_kernel=$arch_minimum_kernel
  fi
else
  minimum_kernel=$arch_minimum_kernel
fi

AC_MSG_CHECKING(for kernel header at least $minimum_kernel)
changequote(,)dnl
decnum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/(\1 * 65536 + \2 * 256 + \3)/'`;
abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`;
changequote([,])dnl
AC_EGREP_CPP([eat flaming death], [#include <linux/version.h>
#if LINUX_VERSION_CODE < $decnum
eat flaming death
#endif], libc_minimum_kernel='too old!', libc_minimum_kernel=ok)
AC_MSG_RESULT($libc_minimum_kernel)
if test "$libc_minimum_kernel" = ok; then
  AC_DEFINE_UNQUOTED(__LINUX_KERNEL_VERSION, $decnum)
  AC_DEFINE_UNQUOTED(__ABI_TAG_VERSION, $abinum)
else
  AC_MSG_ERROR([*** The available kernel headers are older than the requested
*** compatible kernel version])
fi

# Until we start requiring 2.6.37+ headers, we need to check for the
# availability of linux/fanotify.h for testing purposes.
AC_CHECK_HEADER(linux/fanotify.h,
  [AC_DEFINE(HAVE_LINUX_FANOTIFY_H)], ,
  [/* No default includes.  */])

# The result of the above test for the use of the FDE code is invalid if
# the user overrides the decision about the minimum ABI.
if test "$oldest_abi" != default && test "2.2.4" \< "$oldest_abi"; then
  libc_cv_gcc_unwind_find_fde=no
fi

if test -n "$sysheaders"; then
  CPPFLAGS=$OLD_CPPFLAGS
fi

# Under Linux the NPTL add-on should be available.
case $add_ons in
  # It is available.  Good.
  *nptl*)
    nptl_missing=
    ;;
  *)
    nptl_missing=yes
    ;;
esac

if test "$nptl_missing"; then
  if test $enable_sanity = yes; then
    echo "\
*** On GNU/Linux systems it is normal to compile GNU libc with the
*** \`nptl' add-on.  Without that, the library will be
*** incompatible with normal GNU/Linux systems.
*** If you really mean to not use this add-on, run configure again
*** using the extra parameter \`--disable-sanity-checks'."
    exit 1
  else
    echo "\
*** WARNING: Are you sure you do not want to use the \`nptl'
*** add-on?"
  fi
fi

if test "$prefix" = "/usr/local" -o "$prefix" = "/usr/local/" -o "$prefix" = "NONE"; then
  if test $enable_sanity = yes; then
    echo "\
*** On GNU/Linux systems the GNU C Library should not be installed into
*** /usr/local since this might make your system totally unusable.
*** We strongly advise to use a different prefix.  For details read the FAQ.
*** If you really mean to do this, run configure again using the extra
*** parameter \`--disable-sanity-checks'."
    exit 1
  else
    echo "\
*** WARNING: Do you really want to install the GNU C Library into /usr/local?
*** This might make your system totally unusable, for details read the FAQ."
  fi
fi


# One Linux we use ldconfig.
use_ldconfig=yes

# We need some extensions to the `ldd' script.
changequote(,)
case "$machine" in
  i[3456]86*)
    ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed
    ;;
  s390*)
    ldd_rewrite_script=sysdeps/unix/sysv/linux/s390/ldd-rewrite.sed
    ;;
  sparc*)
    ldd_rewrite_script=sysdeps/unix/sysv/linux/sparc/ldd-rewrite.sed
    ;;
  x86_64*)
    ldd_rewrite_script=sysdeps/unix/sysv/linux/x86_64/ldd-rewrite.sed
    ;;
  powerpc*)
    ldd_rewrite_script=sysdeps/unix/sysv/linux/powerpc/ldd-rewrite.sed
    ;;
  *)
    ;;
esac
changequote([,])

if test $host = $build; then
  # If $prefix/include/{net,scsi} are symlinks, make install will
  # clobber what they're linked to (probably a kernel tree).
  # test -L ought to work on all Linux boxes.
  if test "x$prefix" != xNONE; then
    ac_prefix=$prefix
  else
    ac_prefix=$ac_default_prefix
  fi
  AC_MSG_CHECKING([for symlinks in ${ac_prefix}/include])
  ac_message=
  if test -L ${ac_prefix}/include/net; then
    ac_message="$ac_message
   ${ac_prefix}/include/net is a symlink"
  fi
  if test -L ${ac_prefix}/include/scsi; then
    ac_message="$ac_message
   ${ac_prefix}/include/scsi is a symlink"
  fi
  if test -n "$ac_message"; then
    AC_MSG_ERROR([$ac_message
\`make install' will destroy the target of the link(s).
Delete the links and re-run configure, or better still, move the entire
${ac_prefix}/include directory out of the way.])
  else
    AC_MSG_RESULT(ok)
  fi
fi

# We have inlined syscalls.
AC_DEFINE(HAVE_INLINED_SYSCALLS)
