# Configure script for libada.
#   Copyright 2003, 2004, 2009, 2012 Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

sinclude(../config/acx.m4)
sinclude(../config/override.m4)

AC_INIT

AC_CONFIG_SRCDIR([Makefile.in])

# Command-line options.
# Very limited version of AC_MAINTAINER_MODE.
AC_ARG_ENABLE([maintainer-mode],
  [AC_HELP_STRING([--enable-maintainer-mode],
                 [enable make rules and dependencies not useful (and
                  sometimes confusing) to the casual installer])],
  [case ${enable_maintainer_mode} in
     yes) MAINT='' ;;
     no) MAINT='#' ;;
     *) AC_MSG_ERROR([--enable-maintainer-mode must be yes or no]) ;;
   esac
   maintainer_mode=${enableval}],
  [MAINT='#'])
AC_SUBST([MAINT])dnl

# Start of actual configure tests

AC_PROG_INSTALL

AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET

ACX_NONCANONICAL_HOST
ACX_NONCANONICAL_TARGET

# Need to pass this down for now :-P
AC_PROG_LN_S

# Target-specific stuff (defaults)
TOOLS_TARGET_PAIRS=
EXTRA_GNATTOOLS=

# Per-target case statement
# -------------------------
case "${target}" in
  *-*-aix*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-aix.adb"
    ;;
  *-*-darwin*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-darwin.adb"
    ;;
  *-*-dragonfly*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
    ;;
  *-*-freebsd*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
    ;;
  *-*-linux*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
    ;;
  *-*-vxworks*)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
    ;;
  *-*-cygwin32* | *-*-mingw32* | *-*-pe)
    TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
    EXTRA_GNATTOOLS='../../gnatdll$(exeext)'
    ;;
esac

AC_SUBST(TOOLS_TARGET_PAIRS)
AC_SUBST(EXTRA_GNATTOOLS)

# From user or toplevel makefile.
AC_SUBST(ADA_CFLAGS)

# This is testing the CC passed from the toplevel Makefile, not the
# one we will select below.
AC_PROG_CC
warn_cflags=
if test "x$GCC" = "xyes"; then
  warn_cflags='$(GCC_WARN_CFLAGS)'
fi
AC_SUBST(warn_cflags)

# Determine what to build for 'gnattools'.  Test after the above,
# because testing for CC sets the final value of cross_compiling, even
# if we end up using a different CC.  We want to build
# gnattools-native when: (a) this is a native build, i.e.,
# cross_compiling=no, otherwise we know we cannot run binaries
# produced by the toolchain used for the build, not even the binaries
# created within ../gcc/; (b) build and host are the same, otherwise
# this is to be regarded as a cross build environment even if it seems
# that we can run host binaries; (c) host and target are the same,
# otherwise the tools in ../gcc/ generate code for a different
# platform.  If you change this test, be sure to adjust
# ../gcc/ada/gcc-interface/config-lang.in as well.
if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then
  default_gnattools_target="gnattools-native"
else
  default_gnattools_target="gnattools-cross"
fi
AC_SUBST([default_gnattools_target])

# Output: create a Makefile.
AC_CONFIG_FILES([Makefile])

AC_OUTPUT
