#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([Apache Ignite C++], [2.7.5.38010], [dev@ignite.apache.org], [ignite], [ignite.apache.org])

AC_CANONICAL_HOST
AC_CONFIG_MACRO_DIR([m4])
AC_LANG([C++])

AM_INIT_AUTOMAKE([-Wall foreign subdir-objects])
AC_CONFIG_HEADERS(config.h)

# Enable silent rules by default
AM_SILENT_RULES([yes])

# Checks for programs.
AC_PROG_CPP
AM_PROG_AR

# Initialize Libtool
LT_INIT

AC_ARG_ENABLE([odbc],
    [AS_HELP_STRING([--enable-odbc],[build included ODBC driver [default=no]])],
    [ case "${enableval}" in
        yes) odbc=true ;;
        no) odbc=false ;;
        *) AC_MSG_ERROR(bad value ${enableval} for --enable-odbc) ;;
        esac
    ],
    [odbc=false]
)

AC_ARG_ENABLE([core],
    [AS_HELP_STRING([--enable-core],[build Ignite core library [default=yes]])],
    [ case "${enableval}" in
        yes) core=true ;;
        no) core=false ;;
        *) AC_MSG_ERROR(bad value ${enableval} for --enable-core) ;;
        esac],
    [core=true]
)

AC_ARG_ENABLE([thin-client],
    [AS_HELP_STRING([--enable-thin-client],[build Thin C++ client [default=yes]])],
    [ case "${enableval}" in
        yes) thin_client=true ;;
        no) thin_client=false ;;
        *) AC_MSG_ERROR(bad value ${enableval} for --enable-thin-client) ;;
        esac
    ],
    [thin_client=true]
)

AC_ARG_ENABLE([node],
    [AS_HELP_STRING([--enable-node],[build stand-alone node binary [default=yes]])],
    [ case "${enableval}" in
        yes) node=true ;;
        no) node=false ;;
        *) AC_MSG_ERROR(bad value ${enableval} for --enable-node) ;;
        esac],
    [node=true]
)

AM_CONDITIONAL([COND_ODBC], [test "x$odbc" = "xtrue"])
AM_CONDITIONAL([COND_CORE], [test "x$core" = "xtrue"])
AM_CONDITIONAL([COND_THIN_CLIENT], [test "x$thin_client" = "xtrue"])
AM_CONDITIONAL([COND_NODE], [test "x$node" = "xtrue"])

AC_CONFIG_FILES([ \
    Makefile \
    common/os/linux/include/Makefile \
    common/include/Makefile \
    common/Makefile \
    binary/include/Makefile \
    binary/Makefile \
    odbc/include/Makefile \
    odbc/Makefile \
    core/include/Makefile \
    core/Makefile \
    core/ignite.pc \
    jni/include/Makefile \
    jni/Makefile \
    thin-client/include/Makefile \
    thin-client/Makefile \
    ignite/Makefile \
])

AC_OUTPUT
