dnl Copyright (C) 2000-2001 Free Software Foundation, Inc.
dnl This file is part of the GNU CHARSET Library.
dnl
dnl The GNU CHARSET Library is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Library General Public License as
dnl published by the Free Software Foundation; either version 2 of the
dnl License, or (at your option) any later version.
dnl
dnl The GNU CHARSET Library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dnl Library General Public License for more details.
dnl
dnl You should have received a copy of the GNU Library General Public License
dnl along with the GNU CHARSET Library; see the file COPYING.LIB.  If not,
dnl write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
dnl Boston, MA 02111-1307, USA.

AC_PREREQ(2.13)

AC_INIT(lib/localcharset.c)
AC_CONFIG_AUX_DIR(autoconf)
AC_CONFIG_HEADER(config.h)
AC_PROG_MAKE_SET
PACKAGE=libcharset
VERSION=1.0
AC_SUBST(PACKAGE)
AC_SUBST(VERSION)

dnl           checks for programs

AC_PROG_CC
AC_PROG_CPP
AC_PROG_GCC_TRADITIONAL
AC_PROG_INSTALL

dnl           check for host type

AC_CANONICAL_HOST

dnl           checks for UNIX variants that set DEFS

AC_AIX
AC_MINIX
AC_ISC_POSIX

dnl           checks for compiler output filename suffixes

AC_OBJEXT
AC_EXEEXT

dnl           check for build configuration

AM_PROG_LIBTOOL

dnl           checks for header files and functions

jm_LANGINFO_CODESET
jm_GLIBC21
AC_CHECK_HEADERS(stddef.h stdlib.h string.h)
AC_CHECK_FUNCS(setlocale)

AC_OUTPUT(Makefile lib/Makefile)
