#!/bin/sh

# (C) 2007, Robert Bradshaw, William Hart, William Stein, Michael Abshoff
# (C) 2011, William Hart
# (C) 2012, William Hart, Jean-Pierre Flori, Thomas DuBuisson
# (C) 2012, Jan Engelhardt

PREFIX="/usr/local"
GMP_DIR="/usr/local"
MPFR_DIR="/usr/local"
NTL_DIR="/usr/local"
GC_DIR="/usr/local"
BLAS_DIR="/usr/local"
WANT_NTL=0
WANT_BLAS=0
SHARED=1
STATIC=1
TLS=1
PTHREAD=1
REENTRANT=0
WANT_GC=0
WANT_TLS=0
WANT_CXX=0
ASSERT=0
BUILD=
EXTENSIONS=
EXT_MODS=
EXTRA_BUILD=
FLINT_DLL=0
FLINT_LIBNAME=
FLINT_SOLIB=0

# soname version, minor release number and patch number

# Every major version of Flint (1.0, 1.1, 1.2, etc.) gets
# a new major soname number.

# Every time a release happens where interfaces are added
# to Flint, the minor soname number gets incremented.

# Every patch that is made that doesn't change the Flint
# interface updates the patch number.

# However, if backwards incompatible changes are made, both
# the minor and patch numbers are set to 0. (Hopefully this
# doesn't happen in practice.)

# flint => soname
# 2.5.0 => 13.5.0
# 2.5.1 => 13.5.1
# 2.5.2 => 13.5.2
# 2.6.0 => 14.0.0
# 2.6.1 => 14.0.1
# 2.6.2 => 14.0.2
# 2.6.3 => 14.0.3
# 2.7.0 => 15.0.0

FLINT_MAJOR=15
FLINT_MINOR=0
FLINT_PATCH=0

usage()
{
   echo "Usage: ./configure <options> <args>"
   echo "   where <options> may be"
   echo "     -h display usage information"
   echo "   where <args> may be:"
   echo "     --prefix=<path>      Specify path to installation location (default: /usr/local)"
   echo "     --with-mpir=<path>   Specify location of MPIR (default: /usr/local)"
   echo "     --with-gmp=<path>    Specify location of GMP (default: /usr/local)"
   echo "     --with-mpfr=<path>   Specify location of MPFR (default: /usr/local)"
   echo "     --with-blas[=<path>] Use BLAS and specify its location (default: /usr/local)"
   echo "     --without-blas       Do not use BLAS (default)"
   echo "     --with-ntl[=<path>]  Build NTL interface and specify its location (default: /usr/local)"
   echo "     --without-ntl        Do not build NTL interface (default)"
   echo "     --extensions=<path>  Specify location of extension modules"
   echo "     --build=arch-os      Specify architecture/OS combination rather than use values from uname -m/-s"
   echo "     --enable-shared      Build a shared library (default)"
   echo "     --disable-shared     Do not build a shared library"
   echo "     --enable-static      Build a static library (default)"
   echo "     --disable-static     Do not build a static library"
   echo "     --single             Faster [non-reentrant if tls or pthread not used] version of library (default)"
   echo "     --reentrant          Build fully reentrant [with or without tls, with pthread] version of library"
   echo "     --with-gc=<path>     GC safe build with path to gc"
   echo "     --enable-pthread     Use pthread (default)"
   echo "     --disable-pthread    Do not use pthread"
   echo "     --enable-tls         Use thread-local storage (default)"
   echo "     --disable-tls        Do not use thread-local storage"
   echo "     --enable-assert      Enable use of asserts (use for debug builds only)"
   echo "     --disable-assert     Disable use of asserts (default)"
   echo "     --enable-cxx         Enable C++ wrapper tests"
   echo "     --disable-cxx        Disable C++ wrapper tests (default)"
   echo "     CC=<name>            Use the C compiler with the given name (default: gcc)"
   echo "     CXX=<name>           Use the C++ compiler with the given name (default: g++)"
   echo "     AR=<name>            Use the AR library builder with the given name (default: ar)"
   echo "     LDCONFIG=<name>      Use the given ldconfig tool"
   echo "     CFLAGS=<flags>       Pass the given flags to the compiler"
   echo "     CXXFLAGS=<flags>     Pass the given flags to the C++ compiler"
   echo "     ABI=[32|64]          Tell the compiler to use given ABI (default: empty)"
}

absolute_path(){
   dirlist="$1"
   retval=""
   for dir in $dirlist; do
      case $dir in
        /*) dir=$dir;;
        *) dir=$PWD/$dir;;
      esac
      retval=$retval" "$dir
   done
   echo $retval
}

#begin config.log
echo "/* This file is autogenerated by ./configure -- do not edit! */" > config.log
echo "./configure $@" >> config.log

while [ "$1" != "" ]; do
   PARAM=`echo $1 | sed 's/=.*//'`
   VALUE=`echo $1 | sed 's/[^=]*//; s/=//'`
   case "$PARAM" in
      -h|--help)
         usage
         exit 0
         ;;
      --with-mpir|--with-gmp)
         GMP_DIR=$(absolute_path "$VALUE")
         ;;
      --with-mpfr)
         MPFR_DIR=$(absolute_path "$VALUE")
         ;;
      --with-ntl)
         WANT_NTL=1
         if [ ! -z "$VALUE" ]; then
            NTL_DIR=$(absolute_path "$VALUE")
         fi
         ;;
      --without-ntl)
         WANT_NTL=0
         ;;
      --with-blas)
         WANT_BLAS=1
         if [ ! -z "$VALUE" ]; then
            BLAS_DIR=$(absolute_path "$VALUE")
         fi
         ;;
      --without-blas)
         WANT_BLAS=0
         ;;
      --extensions)
         EXTENSIONS=$(absolute_path "$VALUE")
         ;;
      --build)
         BUILD="$VALUE"
         ;;
      --prefix)
         PREFIX=$(absolute_path "$VALUE")
         ;;
      --enable-shared)
         SHARED=1
         ;;
      --disable-shared)
         SHARED=0
         ;;
      --enable-static)
         STATIC=1
         ;;
      --disable-static)
         STATIC=0
         ;;
      --single)
         REENTRANT=0
         ;;
      --reentrant)
         REENTRANT=1
         ;;
      --with-gc)
         WANT_GC=1
         if [ ! -z "$VALUE" ]; then
            GC_DIR="$VALUE"
         fi
         ;;
      --enable-pthread)
         PTHREAD=1
         ;;
      --disable-pthread)
         PTHREAD=0
         ;;
      --enable-tls)
         TLS=1
         WANT_TLS=1;;
      --disable-tls)
         TLS=0
         WANT_TLS=2;;
      --enable-assert)
         ASSERT=1
         ;;
      --disable-assert)
         ASSERT=0
         ;;
      --enable-cxx)
         WANT_CXX=1
         ;;
      --disable-cxx)
         WANT_CXX=0
         ;;
      AR)
         AR="$VALUE"
         ;;
      CC)
         CC="$VALUE"
         ;;
      LDCONFIG)
         LDCONFIG="$VALUE"
         ;;
      CXX)
         CXX="$VALUE"
         ;;
      CFLAGS)
         CFLAGS="$VALUE"
         ;;
      CXXFLAGS)
         CXXFLAGS="$VALUE"
         ;;
      ABI)
         ABI="$VALUE"
         ;;
      *)
         usage
         exit 1
         ;;
   esac
   shift
done

#find dependencies

LIBS="m"

if [ -d "${GMP_DIR}/lib" ]; then
   GMP_LIB_DIR="${GMP_DIR}/lib"
   GMP_INC_DIR="${GMP_DIR}/include"
elif [ -d "${GMP_DIR}/lib64" ]; then
   GMP_LIB_DIR="${GMP_DIR}/lib64"
   GMP_INC_DIR="${GMP_DIR}/include"
elif [ -d "${GMP_DIR}/.libs" ]; then
   GMP_LIB_DIR="${GMP_DIR}/.libs"
   GMP_INC_DIR="${GMP_DIR}"
else
   echo "Invalid GMP directory"
   echo "Invalid GMP directory: ${GMP_DIR}" >> config.log
   exit 1
fi
LIB_DIRS="${LIB_DIRS} ${GMP_LIB_DIR}"
INC_DIRS="${INC_DIRS} ${GMP_INC_DIR}"
LIBS="${LIBS} gmp"

if [ -d "${MPFR_DIR}/lib" ]; then
   MPFR_LIB_DIR="${MPFR_DIR}/lib"
   MPFR_INC_DIR="${MPFR_DIR}/include"
elif [ -d "${MPFR_DIR}/lib64" ]; then
   MPFR_LIB_DIR="${MPFR_DIR}/lib64"
   MPFR_INC_DIR="${MPFR_DIR}/include"
elif [ -d "${MPFR_DIR}/.libs" ]; then
   MPFR_LIB_DIR="${MPFR_DIR}/.libs"
   MPFR_INC_DIR="${MPFR_DIR}"
elif [ -d "${MPFR_DIR}/src/.libs" ]; then
   MPFR_LIB_DIR="${MPFR_DIR}/src/.libs"
   MPFR_INC_DIR="${MPFR_DIR}/src"
else
   echo "Invalid MPFR directory"
   echo "Invalid MPFR directory: ${MPFR_DIR}" >> config.log
   exit 1
fi
LIB_DIRS="${LIB_DIRS} ${MPFR_LIB_DIR}"
INC_DIRS="${INC_DIRS} ${MPFR_INC_DIR}"
LIBS="${LIBS} mpfr"

#configure extra libraries

if [ "$WANT_NTL" = "1" ]; then
   if [ -d "${NTL_DIR}/lib" ]; then
      NTL_LIB_DIR="${NTL_DIR}/lib"
      NTL_INC_DIR="${NTL_DIR}/include"
   elif [ -d "${NTL_DIR}/lib64" ]; then
      NTL_LIB_DIR="${NTL_DIR}/lib64"
      NTL_INC_DIR="${NTL_DIR}/include"
   else
      echo "Invalid NTL directory"
      echo "Invalid NTL directory: ${NTL_DIR}" >> config.log
      exit 1
   fi
   EXTRA_INC_DIRS="${EXTRA_INC_DIRS} ${NTL_INC_DIR}"
   EXTRA_LIB_DIRS="${EXTRA_LIB_DIRS} ${NTL_LIB_DIR}"
   EXTRA_LIBS="${EXTRA_LIBS} ntl"
fi

if [ "$WANT_BLAS" = "1" ]; then
   if [ -d "${BLAS_DIR}" ]; then
      BLAS_LIB_DIR="${BLAS_DIR}"
      BLAS_INC_DIR="${BLAS_DIR}"
   else
      echo "Invalid BLAS directory"
      echo "Invalid BLAS directory: ${BLAS_DIR}" >> config.log
      exit 1
   fi
   EXTRA_INC_DIRS="${EXTRA_INC_DIRS} ${BLAS_INC_DIR}"
   EXTRA_LIB_DIRS="${EXTRA_LIB_DIRS} ${BLAS_LIB_DIR}"
   EXTRA_LIBS="${EXTRA_LIBS} openblas"
fi
CONFIG_BLAS="#define FLINT_USES_BLAS ${WANT_BLAS}"

if [ "$WANT_GC" = "1" ]; then
   if [ -d "${GC_DIR}" ]; then
      GC_LIB_DIR="${GC_DIR}/lib"
      GC_INC_DIR="${GC_DIR}/include"
   else
      echo "Invalid GC directory"
      echo "Invalid GC directory: ${GC_DIR}" >> config.log
      exit 1
   fi
   EXTRA_INC_DIRS="${EXTRA_INC_DIRS} ${GC_INC_DIR}"
   EXTRA_LIB_DIRS="${EXTRA_LIB_DIRS} ${GC_LIB_DIR}"
   EXTRA_LIBS="${EXTRA_LIBS} gc"
fi
CONFIG_GC="#define FLINT_USES_GC ${WANT_GC}"

# defaults for CC, CXX and AR

if [ -z "$CC" ]; then
   CC=gcc
fi

if [ -z "$CXX" ]; then
   CXX=g++
fi

if [ -z "$AR" ]; then
   AR=ar
fi

#handle gc and reentrant flags

if [ "$WANT_GC" = "1" ]; then
      TLS=0
      if [ "$WANT_TLS" = "1" ]; then
          echo "****WARNING**** GC does not support TLS....disabling TLS"
	  echo "GC does not support TLS....disabling TLS" >> config.log
      fi
      cp fmpz/link/fmpz_gc.c fmpz/fmpz.c
      cp fmpz-conversions-gc.in fmpz-conversions.h
else
   if [ "$REENTRANT" = "1" ]; then
      cp fmpz/link/fmpz_reentrant.c fmpz/fmpz.c
      cp fmpz-conversions-reentrant.in fmpz-conversions.h
   else
      cp fmpz/link/fmpz_single.c fmpz/fmpz.c
      cp fmpz-conversions-single.in fmpz-conversions.h
   fi
fi
# Architecture handler

KERNEL=`uname`

if [ -z "$BUILD" ]; then
   ARCH=`uname -m`

   if [ "$(uname | cut -d_ -f1)" = "MSYS" ]; then
      if [ "$ARCH" = "x86_64" ]; then
         OS="MINGW64"
      else
         OS="MINGW32"
      fi
   elif [ "$(uname | cut -d_ -f1)" = "MINGW32" ]; then
      if [ "$ABI" = "64" ]; then
         OS="MINGW64"
      else
         OS="MINGW32"
      fi 
   elif [ "$(uname | cut -d_ -f1)" = "MINGW64" ]; then
      if [ "$ABI" = "32" ]; then
         OS="MINGW32"
      else
         OS="MINGW64"
      fi
   elif [ "$(uname | cut -d_ -f1)" = "CYGWIN" ]; then
      if [ "$ARCH" = "x86_64" ]; then
         if [ "$ABI" = "32" ]; then
            OS="CYGWIN32"
         else
            OS="CYGWIN64"
            ABI="64"
         fi
      else
         OS="CYGWIN32"
      fi
   else
      OS=`uname -s`
   fi
else
   ARCH=`echo "$BUILD" | cut -d- -f1`
   OS=`echo "$BUILD" | cut -d- -f2`
fi

case "$ARCH" in
   x86_64 | amd64)
      MACHINE="x86_64";;
   x86 | i*86 | pc)
      MACHINE="x86";;
   ia64)
      MACHINE="ia64";;
   sparc | sun4*)
      MACHINE="sparc";;
   sparc64)
      MACHINE="sparc64";;
   ppc64 | powerpc64)
      MACHINE="ppc64";;
   ppc | powerpc | [P|p]ower*)
      MACHINE="ppc";;
   mips64)
      MACHINE="mips64";;
   *)
      MACHINE="unknown";;
esac

#ABI flag
if [ "$ABI" = "32" ]; then
   ABI_FLAG="-m32"
   case "$MACHINE" in
      x86_64)
         MACHINE="x86";;
      sparc64)
         MACHINE="sparc";;
      ppc64)
         MACHINE="ppc";;
      *)
         ;;
   esac
elif [ "$ABI" = "64" ]; then
   ABI_FLAG="-m64"
   if [ "$MACHINE" = "sparc" ]; then
      MACHINE="sparc64"
   fi
   if [ "$MACHINE" = "x86" ]; then
      MACHINE="x86_64"
   fi
fi

if [ "$MACHINE" = "sparc" ] || [ "$MACHINE" = "sparc64" ]; then
   if [ "$CC" = "gcc" ]; then
      CC="gcc -mno-relax"
   fi
fi

echo "Configuring...${MACHINE}-${OS}"
echo "Configuring...${MACHINE}-${OS}" >> config.log

#FLINT shared library

if [ -z "$FLINT_LIB" ]; then
   case "$OS" in
      Darwin)
         FLINT_LIBNAME="libflint.dylib"
         FLINT_LIB="libflint-$FLINT_MAJOR.dylib"
         EXTRA_SHARED_FLAGS="-install_name `pwd`/$FLINT_LIB"
         EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -compatibility_version $FLINT_MAJOR.$FLINT_MINOR"
         EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -current_version $FLINT_MAJOR.$FLINT_MINOR.$FLINT_PATCH"
         ;;
      CYGWIN* | MINGW*)
         FLINT_LIBNAME="libflint.dll"
         FLINT_LIB="libflint-$FLINT_MAJOR.dll"
         EXTRA_SHARED_FLAGS="-static-libgcc"
         EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -shared"
         EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -Wl,--export-all-symbols"
         EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -Wl,-soname,libflint-$FLINT_MAJOR.dll.$FLINT_MINOR.$FLINT_PATCH"
         FLINT_DLL=1
         ;;
      *)
         FLINT_LIBNAME="libflint.so"
         FLINT_LIB="libflint.so.$FLINT_MAJOR.$FLINT_MINOR.$FLINT_PATCH"
         EXTRA_SHARED_FLAGS="-Wl,-soname,libflint.so.$FLINT_MAJOR"
         FLINT_SOLIB=1
         ;;
   esac
 EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -Wl,-rpath,$GMP_LIB_DIR"
 EXTRA_SHARED_FLAGS="$EXTRA_SHARED_FLAGS -Wl,-rpath,$MPFR_LIB_DIR"
fi

# sometimes LDCONFIG is not to be found in the path. Look at some common places.
case "$OS" in
   MINGW*|CYGWIN*|Darwin|FreeBSD)
      LDCONFIG="true";;
   *)
      if [ -z "$LDCONFIG" ]; then
         LDCONFIG="true"
         if [ "$FLINT_SOLIB" = "1" ]; then
            if command -v ldconfig > /dev/null; then
               LDCONFIG="ldconfig"
            elif [ -x /sbin/ldconfig ]; then
               LDCONFIG="/sbin/ldconfig"
            fi
         fi
      fi;;
esac

#extension for executables

if [ -z "$EXEEXT" ]; then
   case "$OS" in
      CYGWIN* | MINGW*)
         EXEEXT=".exe";;
      *)
         EXEEXT="";;
   esac
fi

#don't build both shared and static lib on MinGW and Cygwin

case "$OS" in
   CYGWIN* | MINGW*)
      if [ "$STATIC" = "1" ] && [ "$SHARED" = "1" ]; then
         echo "Building both static and shared versions of MPIR/GMP on $OS is currently"
         echo "unsupported, and so is it for MPFR and FLINT."
         echo "You should pass --disable-shared or --disable-static to configure"
         echo "depending on the versions of MPIR/GMP and MPFR you built."
         echo "Both static and shared libraries is not permitted on $OS" >> config.log
	 exit 1
      fi
      ;;
   *)
      ;;
esac 

#select fft_tuning parameters

case "$MACHINE" in
   x86_64 | ia64 | sparc64 | ppc64)
      cp fft_tuning64.in fft_tuning.h;;
   *)
      cp fft_tuning32.in fft_tuning.h;;
esac

#test for popcnt flag and set needed CFLAGS

mkdir -p build
rm -f build/test-popcnt > /dev/null 2>&1
MSG="Testing __builtin_popcountl..."
printf "%s" "$MSG"
printf "%s" "$MSG" >> config.log
echo "int main(int argc, char ** argv) { 
#if defined(_WIN64)
return __builtin_popcountll(argc) == 100;
#else
return __builtin_popcountl(argc) == 100;
#endif 
}" > build/test-popcnt.c
$CC build/test-popcnt.c -o ./build/test-popcnt > /dev/null 2>&1
if [ $? -eq 0 ]; then
   printf "%s\n" "yes"
   echo "yes" >> config.log
   CONFIG_POPCNT_INTRINSICS="#define FLINT_USES_POPCNT"

   if [ "$MACHINE" = "x86_64" ]; then
      MSG="Testing native popcount..."
      printf "%s" "$MSG"
      printf "%s" "$MSG" >> config.log
      touch build/test-popcnt.c
      rm build/test-popcnt
      $CC -mpopcnt build/test-popcnt.c -o ./build/test-popcnt > /dev/null 2>&1
      build/test-popcnt > /dev/null 2>&1
      if [ $? -eq 0 ]; then
         printf "%s\n" "yes"
         echo "yes" >> config.log
	 POPCNT_FLAG="-mpopcnt"
      else
         printf "%s\n" "no"
	 echo "no" >> config.log
      fi
      rm -f build/test-popcnt{,.c}
   #in case -mpopcnt is not available, the test program will use an illegal
   #instruction and that will print out something on stderr when the if
   #construction is exited, whence the following "2> /dev/null"
   fi 2> /dev/null
else
   rm -f build/test-popcnt.c
   printf "%s\n" "no"
   echo "no" >> config.log
fi

#defaults for CFLAGS
if [ -z "$CFLAGS" ]; then
   if [ "$OS" = "MINGW64" ]; then
      CFLAGS="-std=c99 -O2 -funroll-loops -g $POPCNT_FLAG $ABI_FLAG"
      ANSI_FLAG=""
   elif [ "$OS" = "CYGWIN64" ]; then
      CFLAGS="-O2 -funroll-loops -g -D _WIN64 $POPCNT_FLAG $ABI_FLAG"
      ANSI_FLAG=""
   elif [ "$MACHINE" = "mips64" ]; then
      CFLAGS="-O2 -funroll-loops -g $POPCNT_FLAG $ABI_FLAG"
      ANSI_FLAG=""
   elif test "$KERNEL" = "FreeBSD" -o "$OS" = "OpenBSD"; then
      CFLAGS="-std=c99 -pedantic -Wall -O2 -funroll-loops -g $POPCNT_FLAG $ABI_FLAG"
      ANSI_FLAG=""
      CXXFLAGS="-std=c++11 -pedantic -Wall -O2 -funroll-loops -g $POPCNT_FLAG $ABI_FLAG"
   else
      ANSI_FLAG="-ansi"
      CFLAGS="-pedantic -Wall -O2 -funroll-loops -g $POPCNT_FLAG $ABI_FLAG"
   fi
fi

#this is needed on PPC G5 and does not hurt on other OS Xes

if [ "$KERNEL" = Darwin ]; then
   CFLAGS="-fno-common $CFLAGS"
fi

#PIC flag

if [ -z "$PIC_FLAG" ]; then
   case "$OS" in
      CYGWIN* | MINGW*)
         ;;
      *)
         PIC_FLAG="-fPIC";;
   esac
fi

#test support for thread-local storage

CONFIG_TLS="#define FLINT_USES_TLS 0"

if [ "$TLS" = "1" ]; then
   mkdir -p build
   rm -f build/test-tls > /dev/null 2>&1
   MSG="Testing __thread..."
   printf "%s" "$MSG"
   printf "%s" "$MSG" >> config.log
   echo "__thread int x = 42; int main(int argc, char ** argv) { return x != 42; }" > build/test-tls.c
   $CC build/test-tls.c -o ./build/test-tls > /dev/null 2>&1
   if [ $? -eq 0 ]; then
      build/test-tls > /dev/null 2>&1
      if [ $? -eq 0 ]; then
         printf "%s\n" "yes"
	 echo "yes" >> config.log
         CONFIG_TLS="#define FLINT_USES_TLS 1"
      else
         printf "%s\n" "no"
	 echo "no" >> config.log
      fi
      rm -f build/test-tls{,.c}
   else
      rm -f build/test-tls.c
      printf "%s\n" "no"
      echo "no" >> config.log
   #build-tls can segfault on systems where tls is not available
   fi 2> /dev/null
fi

#fenv configuration

CONFIG_FENV="#define FLINT_USES_FENV 0"

mkdir -p build
MSG="Testing fenv..."
printf "%s" "$MSG"
printf "%s" "$MSG" >> config.log
echo "#include <fenv.h>" > build/test-fenv.h
echo "#ifndef FE_DOWNWARD" >> build/test-fenv.h
echo "#error FE_DOWNWARD not available" >> build/test-fenv.h
echo "#endif" >> build/test-fenv.h
if ($CC -E build/test-fenv.h > /dev/null 2>&1) then
    printf "%s\n" "yes"
    echo "yes" >> config.log
    CONFIG_FENV="#define FLINT_USES_FENV 1"
else
    printf "%s\n" "no"
    echo "no" >> config.log
fi
rm -f build/test-fenv.h

#pthread configuration

CONFIG_PTHREAD="#define FLINT_USES_PTHREAD ${PTHREAD}"

#cpu_set_t configuration

CONFIG_CPU_SET_T="#define FLINT_USES_CPUSET 0"

mkdir -p build
MSG="Testing cpu_set_t..."
printf "%s" "$MSG"
printf "%s" "$MSG" >> config.log
echo "#define _GNU_SOURCE
#include <sched.h>
#include <pthread.h>
int main(){cpu_set_t s;CPU_ZERO(&s); pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), 0); return 0;}" > build/test-cpu_set_t.c
$CC build/test-cpu_set_t.c -lpthread -o ./build/test-cpu_set_t > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rm -f build/test-cpu_set_t
    printf "%s\n" "yes"
    echo "yes" >> config.log
    CONFIG_CPU_SET_T="#define FLINT_USES_CPUSET 1"
else
    printf "%s\n" "no"
    echo "no" >> config.log
fi
rm -f build/test-cpu_set_t.c


#external modules

EXTRA_INC_DIRS="${EXTRA_INC_DIRS} ${EXTENSIONS}"

#include paths

INCS="-I\$(CURDIR) -I\$(CURDIR)/build"
for INC_DIR in ${INC_DIRS} ${EXTRA_INC_DIRS}; do
   INCS="${INCS} -I${INC_DIR}"
done

#library paths

LLIBS="-L\$(CURDIR)"
for LIB_DIR in ${LIB_DIRS} ${EXTRA_LIB_DIRS}; do
   LLIBS="${LLIBS} -L${LIB_DIR}"
done

#linker params

if [ "$PTHREAD" = "1" ]; then
   lLIBS2="-lpthread ${lLIBS2}"
fi


for LIB in ${EXTRA_LIBS} ${LIBS}; do
   lLIBS2="-l${LIB} ${lLIBS2}"
done
lLIBS="-lflint $lLIBS2"
LIBS2="$LLIBS $lLIBS2"
LIBS="$LLIBS $lLIBS"

#cxx

if [ "$WANT_CXX" = "1" ]; then
   EXTRA_BUILD="$EXTRA_BUILD flintxx"
fi

if [ -z "$CXXFLAGS" ]; then
   CXXFLAGS="$CFLAGS"
fi

#write out flint-config.h

echo "/* This file is autogenerated by ./configure -- do not edit! */" > flint-config.h
echo "$CONFIG_POPCNT_INTRINSICS" >> flint-config.h
echo "$CONFIG_BLAS" >> flint-config.h
echo "$CONFIG_TLS" >> flint-config.h
echo "$CONFIG_FENV" >> flint-config.h
echo "$CONFIG_PTHREAD" >> flint-config.h
echo "$CONFIG_GC" >> flint-config.h
echo "$CONFIG_CPU_SET_T" >> flint-config.h
echo "#define FLINT_REENTRANT $REENTRANT" >> flint-config.h
echo "#define FLINT_WANT_ASSERT $ASSERT" >> flint-config.h
if [ "$FLINT_DLL" = "1" ]; then
   echo "#ifdef FLINT_USE_DLL" >> flint-config.h
   echo "#define FLINT_DLL __declspec(dllimport)" >> flint-config.h
   echo "#else" >> flint-config.h
   echo "#define FLINT_DLL __declspec(dllexport)" >> flint-config.h
   echo "#endif" >> flint-config.h
else
   echo "#define FLINT_DLL" >> flint-config.h
fi

#write out Makefile

echo "# This file is autogenerated by ./configure -- do not edit!" > Makefile
echo "" >> Makefile
echo "SHELL=/bin/sh" >> Makefile
echo "" >> Makefile
echo "GMP_LIB_DIR=$GMP_LIB_DIR" >> Makefile
echo "MPFR_LIB_DIR=$MPFR_LIB_DIR" >> Makefile
echo "" >> Makefile
echo "FLINT_STATIC=$STATIC" >> Makefile
echo "FLINT_SHARED=$SHARED" >> Makefile
echo "FLINT_LIB=$FLINT_LIB" >> Makefile
echo "FLINT_LIBNAME=$FLINT_LIBNAME" >> Makefile
echo "OS=$OS" >> Makefile
echo "FLINT_SOLIB=$FLINT_SOLIB" >> Makefile
echo "FLINT_MAJOR=$FLINT_MAJOR" >> Makefile
echo "EXEEXT=$EXEEXT" >> Makefile
echo "PREFIX=$PREFIX" >> Makefile
echo "" >> Makefile
echo "WANT_NTL=$WANT_NTL" >> Makefile
echo "" >> Makefile
echo "INCS=$INCS" >> Makefile
echo "LIBS=$LIBS" >> Makefile
echo "LIBS2=$LIBS2" >> Makefile
echo "" >> Makefile
echo "CC=$CC" >> Makefile
echo "CXX=$CXX" >> Makefile
echo "AR=$AR" >> Makefile
echo "LDCONFIG=$LDCONFIG" >> Makefile
echo "" >> Makefile
echo "CFLAGS=$ANSI_FLAG $CFLAGS" >> Makefile
echo "CXXFLAGS=$CXXFLAGS" >> Makefile
echo "ABI_FLAG=$ABI_FLAG" >> Makefile
echo "PIC_FLAG=$PIC_FLAG" >> Makefile
echo "EXTRA_SHARED_FLAGS=$EXTRA_SHARED_FLAGS" >> Makefile
echo "" >> Makefile
echo "EXTENSIONS=$EXTENSIONS" >> Makefile
echo "EXTRA_BUILD_DIRS=$EXTRA_BUILD" >> Makefile
echo "" >> Makefile


cat Makefile.in >> Makefile

echo "FLINT was successfully configured."
echo "FLINT was successfully configured." >> config.log
