# klibc.m4 serial 99
## Copyright (C) 1995-2003 Free Software Foundation, Inc.
## This file is free software, distributed under the terms of the GNU
## General Public License.  As a special exception to the GNU General
## Public License, this file may be distributed as part of a program
## that contains a configuration script generated by Autoconf, under
## the same distribution terms as the rest of that program.
##
## This file can can be used in projects which are not available under
## the GNU General Public License or the GNU Library General Public
## License but which still want to provide support for the GNU gettext
## functionality.
## Please note that the actual code of the KLIBC Library is partly covered
## by the GNU Library General Public License, and party copyrighted by the
## Regents of The University of California, and the rest is covered by a
## MIT style license.

# Authors:
#   Martin Schlemmer <azarah@nosferatu.za.org>, 2005.


# AC_CHECK_KLIBC
# --------------
# Check if the user wants KLIBC support enabled.  If so, set KLIBC=yes and
# fill in KLIBC_PREFIX, KLIBC_BINDIR, KLIBC_SBINDIR, KLIBC_LIBDIR and
# KLIBC_INCLUDEDIR.  CC is also set to the proper klcc executable.
# NOTE:  This should be called before AC_PROG_CC, and before header, function
#        or type checks.
AC_DEFUN([AC_CHECK_KLIBC],
[AC_BEFORE([$0], [AC_PROG_CC])
AC_REQUIRE([AC_CANONICAL_HOST])
AC_ARG_ENABLE([klibc],
              [AS_HELP_STRING([--enable-klibc],
                              [Enable linking to klibc [no].  You need at
                               least klibc-1.0 or later for this.  Set KLCC
                               to the absolute file name of klcc if not in
                               the PATH])],
              [KLIBC=$enableval], [KLIBC=no])
AC_ARG_ENABLE([klibc-layout],
              [AS_HELP_STRING([--enable-klibc-layout],
                              [Enable installing binaries, libraries and
                               headers into the klibc prefix [yes] ])],
              [if test "X$KLIBC" != Xno; then
                 KLIBC_LAYOUT=$enableval
               else
                 KLIBC_LAYOUT=no
               fi],
              [if test "X$KLIBC" != Xno; then
                 KLIBC_LAYOUT=yes
               else
                 KLIBC_LAYOUT=no
               fi])

if test "X$KLIBC" != Xno; then
  # Basic cross compiling support.  I do not think it is wise to use
  # AC_CHECK_TOOL, because if we are cross compiling, we do not want
  # just 'klcc' to be returned ...
  if test "${host_alias}" != "${build_alias}"; then
    AC_CHECK_PROGS([KLCC], [${host_alias}-klcc], [no])
  else
    AC_CHECK_PROGS([KLCC], [klcc], [no])
  fi
  if test "X$KLCC" = Xno; then
    AC_MSG_ERROR([cannot find klibc frontend 'klcc'!])
  fi

  CC="$KLCC"
  CFLAGS="-Os"

  KLIBC_KCROSS="$($KLCC -print-klibc-kcross 2>/dev/null)"
  KLIBC_PREFIX="$($KLCC -print-klibc-prefix 2>/dev/null)"
  KLIBC_BIN_DIR="$($KLCC -print-klibc-bindir 2>/dev/null)"
  KLIBC_SBIN_DIR="${KLIBC_PREFIX}/${KLIBC_KCROSS}sbin"
  KLIBC_LIB_DIR="$($KLCC -print-klibc-libdir 2>/dev/null)"
  KLIBC_INCLUDE_DIR="$($KLCC -print-klibc-includedir 2>/dev/null)"

  if test "X$KLIBC_LAYOUT" != Xno; then
    prefix="$KLIBC_PREFIX"
    bindir="$KLIBC_BIN_DIR"
    sbindir="$KLIBC_SBIN_DIR"
    libdir="$KLIBC_LIB_DIR"
    includedir="$KLIBC_INCLUDE_DIR"
  fi

  # At least KLIBC_LIB_DIR should be valid, else klibc is too old or
  # something went wrong
  if test ! -d "$KLIBC_LIB_DIR"; then
    AC_MSG_ERROR([your klibc installation is too old or not functional!])
  fi
fi

AC_SUBST(KLIBC)
])# AC_CHECK_KLIBC

