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

define([LIBC_LINUX_VERSION],[3.2.0])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_TRY_COMPILE([#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 */])[
# error kernel headers missing or too old
#endif], [],
	       [libc_cv_linuxVER='LIBC_LINUX_VERSION or later'],
	       [libc_cv_linuxVER='missing or too old!'])])
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" || arch_minimum_kernel=3.2.0
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_TRY_COMPILE([#include <linux/version.h>
#if LINUX_VERSION_CODE < $decnum
# error kernel headers too old
#endif], [], [libc_minimum_kernel=ok], [libc_minimum_kernel='too old!'])
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

if test -n "$sysheaders"; then
  CPPFLAGS=$OLD_CPPFLAGS
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

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)
