#                     The MCLinker project
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.

##############################################################################
### WARNING: this file contains embedded tabs.  Do not run untabify on this file.

####################
#  m4 includes
m4_include(m4/acx_pthread.m4)
####################
#  Autoconf/Automake Initialization

dnl AC_INIT(PKG_NAME, BUILD_VERSION, BUG_REPORTER)
AC_INIT([MCLinker],[dev],[mclinker@googlegroups.com])
AC_PREREQ(2.59)

AC_CONFIG_SRCDIR([./COPYING])
AC_CONFIG_AUX_DIR([scripts])
AC_CONFIG_MACRO_DIR([m4])

dnl Check the target for which we're linking and the host that will do the
dnl linking. This will tell us which MCLINKER will be used for linking
dnl input objects into output. This needs to be done early because
dnl following tests depend on it.
AC_CANONICAL_TARGET

AM_INIT_AUTOMAKE([1.9 dist-bzip2 foreign subdir-objects silent-rules])

AM_SILENT_RULES([yes])

####################
#  Versioning, see VERSION
MAJOR=2
MINOR=9
MICRO=0
BUILD=dev

DEV_VERSION=$MAJOR.$MINOR.$MICRO-$BUILD
PKG_VERSION=$MAJOR.$MINOR.$MICRO-$BUILD
MCLD_VERSION=$DEV_VERSION
AC_SUBST(MCLD_VERSION)
AC_DEFINE_UNQUOTED([MCLD_VERSION], ["$MCLD_VERSION"])
AH_TEMPLATE([MCLD_VERSION], [MCLINKER version])

####################
#  Languages
AC_PROG_CC
AC_PROG_CXX

AC_PATH_PROG([FLEX],[flex])
AX_PROG_FLEX_VERSION([2.5.35],[],[AC_MSG_ERROR([Require flex 2.5.35 or later])])
AC_PATH_PROG([BISON],[bison])
AX_PROG_BISON_VERSION([2.4.3],[3.1],[],
                      [AC_MSG_ERROR([Require bison >= 2.4.3 and < 3.1])])

AC_LANG([C++])
LT_INIT

####################
#  Check for libraries

#  Configure pthreads.
AC_ARG_WITH([pthreads],
            [AS_HELP_STRING([--with-pthreads],
               [use pthreads (default is yes)])],
            [with_pthreads=$withval],
            [with_pthreads=check])

have_pthreads=no
AS_IF([test "x$with_pthreads" != "xno"],
      [ACX_PTHREAD(
        [],
        [AS_IF([test "x$with_pthreads" != "xcheck"],
               [AC_MSG_FAILURE(
                 [--with-pthreads was specified, but unable to be used])])])
       have_pthreads="$acx_pthread_ok"])
AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" == "xyes"])
AC_SUBST(PTHREAD_CFLAGS)
AC_SUBST(PTHREAD_LIBS)

####################
# Configure optimized build
AC_ARG_ENABLE(optimized,
            [AS_HELP_STRING([--enable-optimized],
                [turn on unit-tests (default is no)])],
            [case "${enableval}" in
              yes) optimized=true ;;
              no)  optimized=false ;;
              *) AC_MSG_ERROR(bad value ${enableval} for --enable-optimized) ;;
             esac],
             [optimized=false])
AM_CONDITIONAL([ENABLE_OPTIMIZED],[test "x${optimized}" == "xtrue" ])

####################
# Configure compiler warnings
AC_MSG_CHECKING([for optional compiler flags])
CXX_FLAG_CHECK(NO_VARIADIC_MACROS, [-Wno-variadic-macros])
CXX_FLAG_CHECK(NO_COVERED_SWITCH_DEFAULT, [-Wno-covered-switch-default])
CXX_FLAG_CHECK(NO_C99_EXTENSIONS, [-Wno-c99-extensions])
AC_MSG_RESULT([$NO_VARIADIC_MACROS $NO_COVERED_SWITCH_DEFAULT $NO_C99_EXTENSIONS])

####################
# Check for header files
AC_CHECK_HEADERS([fcntl.h unistd.h])
AC_CHECK_HEADERS([sys/mman.h])
AC_CHECK_HEADERS([cxxabi.h])
AC_CHECK_HEADERS([zlib.h])

####################
# Configure LLVM
CHECK_LLVM([3.6])
ENUM_MCLD_TARGETS
CHECK_ALONE_TARGET

# Config.h
AC_CONFIG_HEADER(include/mcld/Config/Config.h)

AH_TOP([
//===- Config.h.in --------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_CONFIG_H
#define MCLD_CONFIG_H
])

AH_BOTTOM([
#define MCLD_REGION_CHUNK_SIZE 32
#define MCLD_NUM_OF_INPUTS 32
#define MCLD_SECTIONS_PER_INPUT 16
#define MCLD_SYMBOLS_PER_INPUT 128
#define MCLD_RELOCATIONS_PER_INPUT 1024

#define MCLD_SEGMENTS_PER_OUTPUT 8

#endif
])

####################
# OUTPUT
AC_CONFIG_FILES([VERSION])
AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([include/Makefile])
AC_CONFIG_FILES([lib/Makefile])
AC_CONFIG_FILES([utils/Makefile])
AC_CONFIG_FILES([utils/gtest/Makefile])
AC_CONFIG_FILES([utils/gtestmain/Makefile])
AC_CONFIG_FILES([utils/zlib/Makefile])
AC_CONFIG_FILES([unittests/Makefile])
AC_CONFIG_FILES([include/mcld/Config/Targets.def])
AC_CONFIG_FILES([include/mcld/Config/Linkers.def])
AC_CONFIG_FILES([tools/Makefile])
AC_CONFIG_FILES([tools/mcld/Makefile])
AC_CONFIG_FILES([test/Makefile])

AC_OUTPUT
