mirror of
https://review.haiku-os.org/buildtools
synced 2024-11-23 07:18:49 +01:00
88896a1144
Change-Id: I42dc2a783b3e0082a7583cc7ecaa6b043ba162f4 Reviewed-on: https://review.haiku-os.org/c/buildtools/+/3021 Reviewed-by: Fredrik Holmqvist <fredrik.holmqvist@gmail.com>
847 lines
33 KiB
Plaintext
847 lines
33 KiB
Plaintext
dnl Process this file with autoconf to produce a configure script.
|
|
|
|
dnl WARNING! C code starting with # (preprocessor directives) must not
|
|
dnl be indented!
|
|
|
|
AC_COPYRIGHT([
|
|
Copyright 1999-2020 Free Software Foundation, Inc.
|
|
Contributed by the AriC and Caramba projects, INRIA.
|
|
|
|
This file is part of the GNU MPFR Library.
|
|
|
|
The GNU MPFR Library is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published
|
|
by the Free Software Foundation; either version 3 of the License, or (at
|
|
your option) any later version.
|
|
|
|
The GNU MPFR Library 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 Lesser General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
|
|
https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
|
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
])
|
|
|
|
dnl Add check-news when it checks for more than 15 lines
|
|
AC_INIT([MPFR],[4.1.0])
|
|
|
|
dnl Older Automake versions than 1.13 may still be supported, but no longer
|
|
dnl tested, and many things have changed in 1.13. Moreover the INSTALL file
|
|
dnl and MPFR manual assume that MPFR has been built using Automake 1.13+
|
|
dnl (due to parallel tests, introduced by default in Automake 1.13).
|
|
dnl The subdir-objects option is needed due to configuration related to
|
|
dnl mini-gmp, which has sources in an external directory.
|
|
AM_INIT_AUTOMAKE([1.13 no-define dist-bzip2 dist-xz dist-zip subdir-objects])
|
|
AM_MAINTAINER_MODE(enable)
|
|
|
|
AC_CONFIG_MACRO_DIR([m4])
|
|
|
|
dnl Some AC_RUN_IFELSE programs need to be able to return several values
|
|
dnl (e.g., in a format detection, one for each possible format). But the
|
|
dnl Autoconf manual says: "This exit status might be that of a failed
|
|
dnl compilation, or it might be that of a failed program execution."
|
|
dnl Unfortunately, we cannot know whether a non-zero exit status comes
|
|
dnl from a failed compilation, so that the detection may be incorrect.
|
|
dnl Since failures generally occur with a small exit status, the value 77
|
|
dnl is reserved for skipped tests by Autoconf, and values larger than 125
|
|
dnl have special meanings in POSIX[*], good candidates for success are 0
|
|
dnl and values from 80 to 125.
|
|
dnl https://tldp.org/LDP/abs/html/exitcodes.html suggests the range 64-113
|
|
dnl but note that /usr/include/sysexits.h now allocates previously unused
|
|
dnl exit codes from 64 - 78 (for various kinds of errors).
|
|
dnl
|
|
dnl Alternatively, the test program could output the result to a file and
|
|
dnl return with the 0 exit status if it could do that successfully.
|
|
dnl
|
|
dnl [*] 2.8.2 Exit Status for Commands
|
|
dnl https://pubs.opengroup.org/onlinepubs/9699919799//utilities/V3_chap02.html#tag_18_08_02
|
|
|
|
test_CFLAGS=${CFLAGS+set}
|
|
|
|
dnl Check if user request its CC and CFLAGS
|
|
if test -n "$CFLAGS" || test -n "$CC" ; then
|
|
user_redefine_cc=yes
|
|
fi
|
|
|
|
dnl Basic Autoconf macros. At this point, they must not make Autoconf
|
|
dnl choose a compiler because of the CC and CFLAGS setup from gmp.h!
|
|
|
|
AC_CANONICAL_HOST
|
|
|
|
AC_PROG_EGREP
|
|
AC_PROG_SED
|
|
|
|
dnl To use a separate config header.
|
|
dnl There is still some problem with GMP's HAVE_CONFIG
|
|
dnl AC_CONFIG_HEADERS([mpfrconf.h:mpfrconf.in])
|
|
|
|
unset gmp_lib_path GMP_CFLAGS GMP_CC
|
|
|
|
dnl ********************************************************************
|
|
dnl Extra arguments to configure (AC_ARG_WITH and AC_ARG_ENABLE)
|
|
|
|
AC_ARG_WITH(gmp_include,
|
|
[ --with-gmp-include=DIR GMP include directory ],
|
|
MPFR_PARSE_DIRECTORY(["$withval"],[withval])
|
|
CPPFLAGS="$CPPFLAGS -I$withval")
|
|
|
|
AC_ARG_WITH(gmp_lib,
|
|
[ --with-gmp-lib=DIR GMP lib directory ], [
|
|
MPFR_PARSE_DIRECTORY(["$withval"],[withval])
|
|
LDFLAGS="$LDFLAGS -L$withval"
|
|
gmp_lib_path="$withval"
|
|
])
|
|
|
|
AC_ARG_WITH(gmp,
|
|
[ --with-gmp=DIR GMP install directory ], [
|
|
MPFR_PARSE_DIRECTORY(["$withval"],[withval])
|
|
if test -z "$with_gmp_lib" && test -z "$with_gmp_include" ; then
|
|
CPPFLAGS="$CPPFLAGS -I$withval/include"
|
|
LDFLAGS="$LDFLAGS -L$withval/lib"
|
|
gmp_lib_path="$withval/lib"
|
|
else
|
|
AC_MSG_FAILURE([Do not use --with-gmp and --with-gmp-include/--with-gmp-lib options simultaneously.])
|
|
fi
|
|
])
|
|
|
|
AC_ARG_WITH(gmp_build,
|
|
[ --with-gmp-build=DIR GMP build directory (please read INSTALL file)],
|
|
[
|
|
MPFR_PARSE_DIRECTORY(["$withval"],[withval])
|
|
if test -z "$gmp_lib_path" && test -z "$with_gmp_include" ; then
|
|
CPPFLAGS="$CPPFLAGS -I$withval -I$withval/tune"
|
|
LDFLAGS="$LDFLAGS -L$withval -L$withval/.libs -L$withval/tune"
|
|
gmp_lib_path="$withval$PATH_SEPARATOR$withval/.libs$PATH_SEPARATOR$withval/tune"
|
|
if test -r $withval/Makefile ; then
|
|
GMP_CFLAGS=`$SED -n 's/^CFLAGS = //p' $withval/Makefile`
|
|
GMP_CC=`$SED -n 's/^CC = //p' $withval/Makefile`
|
|
GMP_SOURCE=`$SED -n 's/^srcdir = *//p' $withval/Makefile`
|
|
case "$GMP_SOURCE" in
|
|
.) GMP_SOURCE="" ;;
|
|
/*) ;;
|
|
?*) GMP_SOURCE="$withval/$GMP_SOURCE" ;;
|
|
esac
|
|
if test -d "$GMP_SOURCE" ; then
|
|
CPPFLAGS="$CPPFLAGS -I$GMP_SOURCE -I$GMP_SOURCE/tune"
|
|
fi
|
|
fi
|
|
use_gmp_build=yes
|
|
else
|
|
AC_MSG_FAILURE([Do not use --with-gmp-build and other --with-gmp options simultaneously.])
|
|
fi
|
|
])
|
|
|
|
AC_ARG_WITH(mini_gmp,
|
|
[ --with-mini-gmp=DIR use mini-gmp (sources in DIR) instead of GMP
|
|
(experimental, please read doc/mini-gmp file)],
|
|
[
|
|
MPFR_PARSE_DIRECTORY(["$withval"],[withval])
|
|
if test -z "$gmp_lib_path" && test -z "$with_gmp_include" && \
|
|
test -z "$use_gmp_build"; then
|
|
if test -f "$withval/mini-gmp.c" && test -f "$withval/mini-gmp.h"; then
|
|
AC_DEFINE([MPFR_USE_MINI_GMP],1,[Use mini-gmp])
|
|
mini_gmp_path="$withval"
|
|
AC_SUBST(mini_gmp_path)
|
|
else
|
|
AC_MSG_FAILURE([mini-gmp.{c,h} not found in $withval])
|
|
fi
|
|
else
|
|
AC_MSG_FAILURE([Do not use --with-mini-gmp and other --with-gmp options simultaneously.])
|
|
fi
|
|
])
|
|
|
|
AC_ARG_WITH(mulhigh_size,
|
|
[ --with-mulhigh-size=NUM internal threshold table for mulhigh],
|
|
AC_DEFINE_UNQUOTED([MPFR_MULHIGH_SIZE],$withval, [Mulhigh size]))
|
|
|
|
AC_ARG_ENABLE(gmp-internals,
|
|
[ --enable-gmp-internals enable use of GMP undocumented functions [[default=no]]],
|
|
[ case $enableval in
|
|
yes) AC_DEFINE([WANT_GMP_INTERNALS],1,[Want GMP internals]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-gmp-internals: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(assert,
|
|
[ --enable-assert enable ASSERT checking [[default=no]]],
|
|
[ case $enableval in
|
|
yes) AC_DEFINE([MPFR_WANT_ASSERT],1,[Want all simple assertions]) ;;
|
|
none) AC_DEFINE([MPFR_WANT_ASSERT],-1,[Do no want any assertion]) ;;
|
|
no) ;;
|
|
full) AC_DEFINE([MPFR_WANT_ASSERT],2,[Want full assertions]) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-assert: yes, no, none or full]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(logging,
|
|
[ --enable-logging enable MPFR logging (needs nested functions
|
|
and the 'cleanup' attribute) [[default=no]]],
|
|
[ case $enableval in
|
|
yes) AC_DEFINE([MPFR_USE_LOGGING],1,[Enable MPFR logging support]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-logging: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(thread-safe,
|
|
[ --disable-thread-safe explicitly disable TLS support
|
|
--enable-thread-safe build MPFR as thread safe, i.e. with TLS support
|
|
(the system must support it) [[default=autodetect]]],
|
|
[ case $enableval in
|
|
yes) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-thread-safe: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(shared-cache,
|
|
[ --enable-shared-cache enable use of caches shared by all threads,
|
|
for all MPFR constants. It usually makes MPFR
|
|
dependent on PTHREAD [[default=no]]],
|
|
[ case $enableval in
|
|
yes)
|
|
AC_DEFINE([MPFR_WANT_SHARED_CACHE],1,[Want shared cache]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-shared-cache: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(warnings,
|
|
[ --enable-warnings allow MPFR to output warnings to stderr [[default=no]]],
|
|
[ case $enableval in
|
|
yes) AC_DEFINE([MPFR_USE_WARNINGS],1,[Allow MPFR to output warnings to stderr]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-warnings: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(tests-timeout,
|
|
[ --enable-tests-timeout=NUM
|
|
[[for developers]] enable timeout for test programs
|
|
(NUM seconds, <= 9999) [[default=no]]; if this is
|
|
enabled, the environment variable $MPFR_TESTS_TIMEOUT
|
|
overrides NUM (0: no timeout)],
|
|
[ case $enableval in
|
|
no) ;;
|
|
yes) AC_DEFINE([MPFR_TESTS_TIMEOUT], 0, [timeout limit]) ;;
|
|
[[0-9]]|[[0-9]][[0-9]]|[[0-9]][[0-9]][[0-9]]|[[0-9]][[0-9]][[0-9]][[0-9]])
|
|
AC_DEFINE_UNQUOTED([MPFR_TESTS_TIMEOUT], $enableval, [timeout limit]) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-tests-timeout]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(tune-for-coverage,
|
|
[ --enable-tune-for-coverage
|
|
[[for developers]] tune MPFR for coverage tests],
|
|
[ case $enableval in
|
|
no) ;;
|
|
yes) AC_DEFINE([MPFR_TUNE_COVERAGE], 1, [tune for coverage]) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-tune-for-coverage]) ;;
|
|
esac])
|
|
|
|
dnl Support for _Decimal64 and _Decimal128 (ISO/IEC TS 18661).
|
|
dnl See acinclude.m4 for more information and tests.
|
|
dnl FIXME: differentiate the support of _Decimal64 and _Decimal128, e.g.
|
|
dnl --enable-decimal64 for _Decimal64
|
|
dnl --enable-decimal128 for _Decimal128
|
|
dnl --enable-decimal-float would explicitly enable both (or fail).
|
|
dnl --disable-decimal-float would explicitly disable both.
|
|
AC_ARG_ENABLE(decimal-float,
|
|
[ --disable-decimal-float explicitly disable decimal floats support
|
|
--enable-decimal-float build conversion functions from/to decimal floats
|
|
(see INSTALL file for details) [[default=auto]]],
|
|
[ case $enableval in
|
|
yes|no|auto|bid|dpd|generic) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-decimal-float]) ;;
|
|
esac])
|
|
|
|
dnl Warning! Not to be confused with _Decimal128. Thus it is better
|
|
dnl to say binary128 in the description. It can correspond to either
|
|
dnl _Float128 (ISO/IEC TS 18661) or __float128 (old type name).
|
|
AC_ARG_ENABLE(float128,
|
|
[ --disable-float128 explicitly disable binary128 support
|
|
--enable-float128 build conversion functions from/to binary128
|
|
(_Float128 or __float128) [[default=autodetect]]],
|
|
[ case $enableval in
|
|
yes) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-float128: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(debug-prediction,
|
|
[ --enable-debug-prediction
|
|
[[for developers]] enable debug of branch prediction
|
|
(for x86 and x86-64 with GCC, static libs)],
|
|
[ case $enableval in
|
|
yes) if test "$enable_shared" != no; then
|
|
AC_MSG_ERROR([--enable-debug-prediction can only work in static mode (--disable-shared)])
|
|
fi
|
|
AC_DEFINE([MPFR_DEBUG_PREDICTION],1,
|
|
[Enable debug of branch prediction]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-debug-prediction: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(lto,
|
|
[ --enable-lto build MPFR with link-time-optimization
|
|
(experimental) [[default: no]]],
|
|
[ case $enableval in
|
|
yes) if test "$enable_shared" != "no"; then
|
|
AC_MSG_ERROR([--enable-lto can only work in static mode (--disable-shared)])
|
|
fi
|
|
enable_lto=yes
|
|
;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-lto: yes or no]) ;;
|
|
esac])
|
|
|
|
AC_ARG_ENABLE(formally-proven-code,
|
|
[ --enable-formally-proven-code
|
|
use formally proven code when available
|
|
(needs a C99 compiler) [[default=no]]],
|
|
[ case $enableval in
|
|
yes) AC_DEFINE([MPFR_WANT_PROVEN_CODE],1,[Want formally proven code]) ;;
|
|
no) ;;
|
|
*) AC_MSG_ERROR([bad value for --enable-formally-proven-code: yes or no]) ;;
|
|
esac])
|
|
|
|
dnl Makefile.am files can use "if MINI_GMP" / ... / "endif".
|
|
AM_CONDITIONAL([MINI_GMP], [test -n "$mini_gmp_path"])
|
|
|
|
dnl First, detect incompatibilities between the above configure options.
|
|
AC_MSG_CHECKING([whether configure options are compatible])
|
|
if test "$enable_logging" = yes; then
|
|
if test "$enable_thread_safe" = yes; then
|
|
AC_MSG_RESULT([no])
|
|
AC_MSG_ERROR([enable either logging or thread-safe, not both])
|
|
fi
|
|
dnl The following test is done only to output a specific error message,
|
|
dnl as there would otherwise be an error due to enable_thread_safe=no.
|
|
if test "$enable_shared_cache" = yes; then
|
|
AC_MSG_RESULT([no])
|
|
AC_MSG_ERROR([shared cache does not work with logging support])
|
|
fi
|
|
enable_thread_safe=no
|
|
fi
|
|
if test "$enable_shared_cache" = yes; then
|
|
if test "$enable_thread_safe" = no; then
|
|
AC_MSG_RESULT([no])
|
|
AC_MSG_ERROR([shared cache needs thread-safe support])
|
|
fi
|
|
enable_thread_safe=yes
|
|
fi
|
|
AC_MSG_RESULT([yes])
|
|
|
|
|
|
dnl
|
|
dnl Setup CC and CFLAGS
|
|
dnl
|
|
|
|
dnl ********************************************************************
|
|
dnl Check for CC and CFLAGS in gmp.h
|
|
|
|
dnl Warning! The following tests must be done before Autoconf selects
|
|
dnl a compiler. This means that some macros such as AC_PROG_CC and
|
|
dnl AM_PROG_AR must be put after the following code.
|
|
|
|
dnl We do not do this check if mini-gmp is used.
|
|
|
|
if test -z "$user_redefine_cc" && \
|
|
test "$cross_compiling" != yes && \
|
|
test "${with_mini_gmp+set}" != set ; then
|
|
|
|
dnl We need to guess the C preprocessor instead of using AC_PROG_CPP,
|
|
dnl since AC_PROG_CPP implies AC_PROG_CC, which chooses a compiler
|
|
dnl (before we have the chance to get it from gmp.h) and does some
|
|
dnl checking related to this compiler (such as dependency tracking
|
|
dnl options); if the compiler changes due to __GMP_CC in gmp.h, one
|
|
dnl would have incorrect settings.
|
|
if test -z "$GMP_CC$GMP_CFLAGS" ; then
|
|
AC_MSG_CHECKING(for CC and CFLAGS in gmp.h)
|
|
GMP_CC=__GMP_CC
|
|
GMP_CFLAGS=__GMP_CFLAGS
|
|
# /lib/cpp under Solaris doesn't support some environment variables
|
|
# used by GCC, such as C_INCLUDE_PATH. If the user has set up such
|
|
# environment variables, he probably wants to use them. So, let us
|
|
# prefer cpp and gcc to /lib/cpp. However, note that this won't
|
|
# work if GCC has been installed with versioned names only (e.g.
|
|
# with cpp-5 and gcc-5).
|
|
for cpp in "cpp -P" "cpp" "gcc -P -E" "gcc -E" "/lib/cpp -P" "/lib/cpp" "cc -P -E" "cc -E" "c99 -P -E" "c99 -E" "clang -E" "cl -E" "icl -E"
|
|
do
|
|
# Get CC
|
|
echo "#include \"gmp.h\"" > conftest.c
|
|
echo "MPFR_OPTION __GMP_CC" >> conftest.c
|
|
$cpp $CPPFLAGS conftest.c 2> /dev/null > conftest.txt
|
|
test $? -ne 0 && continue
|
|
GMP_CC=`$EGREP MPFR_OPTION conftest.txt | $SED -e 's/MPFR_OPTION //g;s/ *" *//g'`
|
|
# Get CFLAGS
|
|
echo "#include \"gmp.h\"" > conftest.c
|
|
echo "MPFR_OPTION __GMP_CFLAGS" >> conftest.c
|
|
$cpp $CPPFLAGS conftest.c 2> /dev/null > conftest.txt
|
|
test $? -ne 0 && continue
|
|
[GMP_CFLAGS=`$EGREP MPFR_OPTION conftest.txt | $SED -e 's/[ "]-pedantic[ "]/ /g;s/MPFR_OPTION //g;s/ *" *//g'`]
|
|
break
|
|
done
|
|
rm -f conftest*
|
|
if test "x$GMP_CC" = "x__GMP_CC" || test "x$GMP_CFLAGS" = "x__GMP_CFLAGS" ; then
|
|
AC_MSG_RESULT(failed)
|
|
GMP_CFLAGS=
|
|
GMP_CC=
|
|
else
|
|
AC_MSG_RESULT([CC=$GMP_CC CFLAGS=$GMP_CFLAGS])
|
|
fi
|
|
fi
|
|
|
|
dnl But these variables may be invalid, so we must check them first.
|
|
dnl Note: we do not use AC_RUN_IFELSE, as it implies AC_PROG_CC.
|
|
if test -n "$GMP_CC$GMP_CFLAGS" ; then
|
|
AC_MSG_CHECKING(for CC=$GMP_CC and CFLAGS=$GMP_CFLAGS)
|
|
echo "int main (void) { return 0; }" > conftest.c
|
|
if $GMP_CC $GMP_CFLAGS -o conftest conftest.c 2> /dev/null ; then
|
|
AC_MSG_RESULT(yes)
|
|
CFLAGS=$GMP_CFLAGS
|
|
CC=$GMP_CC
|
|
else
|
|
AC_MSG_RESULT(no)
|
|
fi
|
|
rm -f conftest*
|
|
fi
|
|
|
|
fi
|
|
|
|
dnl ********************************************************************
|
|
|
|
AC_PROG_CC
|
|
AC_PROG_CPP
|
|
AC_LANG(C)
|
|
|
|
dnl AM_PROG_AR is needed so that ar-lib (wrapper for Microsoft lib.exe)
|
|
dnl gets installed by "automake -i" (if absent, "automake --warnings=all"
|
|
dnl gives a warning).
|
|
AM_PROG_AR
|
|
|
|
dnl This must done before MPFR_CONFIGS.
|
|
LT_INIT(win32-dll)
|
|
|
|
dnl Warning: This test is *only* for CFLAGS settings.
|
|
dnl If the compiler is ICC, add some specific flags, except on MS-Windows.
|
|
dnl Don't add warnings flags (Otherwise you'll get more than 20000 warnings).
|
|
dnl Add -long_double flags? Don't use -pc64 !
|
|
dnl Notes (VL):
|
|
dnl * With icc 10.1 20080212 on itanium, the __ICC macro is not defined,
|
|
dnl even when the -icc option is used (contrary to what is documented
|
|
dnl on the icc man page).
|
|
dnl * When ICC is correctly detected (__ICC macro defined), unsetting
|
|
dnl the GCC variable confuses libtool. See:
|
|
dnl https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=485421
|
|
dnl * If need be, the gcc predefined macros __GNUC_* can be disabled
|
|
dnl thanks to the -no-gcc option.
|
|
dnl * Now use -mieee-fp instead of -mp (ICC 13 says: option '-mp' is
|
|
dnl deprecated and will be removed in a future release.). According
|
|
dnl to "icc -help", both options are equivalent; it also suggests
|
|
dnl to use -fp-model <arg> instead of -mp, but what is <arg>? Anyway
|
|
dnl -mieee-fp solves the tset_d failure due to a negative zero. This
|
|
dnl option has been introduced in ICC 9.0 for Linux (2005-06):
|
|
dnl http://www.ncsa.illinois.edu/UserInfo/Resources/Software/Intel/Compilers/9.0/C_ReleaseNotes.htm
|
|
AC_MSG_CHECKING(for non-MS-Windows ICC)
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
#if (!defined(__ICC) && !defined(__INTEL_COMPILER)) || defined(_WIN32)
|
|
# error "Not a non-MS-Windows ICC"
|
|
error
|
|
#endif
|
|
]], [[]])],[
|
|
AC_MSG_RESULT(yes)
|
|
CFLAGS="-fp_port -mieee-fp -wd1572 -wd265 -wd186 -wd239 $CFLAGS"
|
|
],[AC_MSG_RESULT(no)])
|
|
|
|
dnl If CFLAGS has not been set explicitly and the compiler is GCC, then
|
|
dnl use some specific flags. But don't touch user other flags.
|
|
dnl Note: This is done even when CFLAGS has been set from GMP's CFLAGS
|
|
dnl (__GMP_CFLAGS macro in gmp.h) above. The consequence is that this
|
|
dnl might yield a compilation failure if the -Werror option appears in
|
|
dnl __GMP_CFLAGS. But in this case, since -Werror is not used by default,
|
|
dnl one may expect that the user would also set CFLAGS for MPFR.
|
|
dnl Note: When the compiler is GCC not in C++ mode, -Wc++-compat may be
|
|
dnl interesting, but it has been introduced in GCC 4.1 only.
|
|
if test "$test_CFLAGS" != set && test -n "$GCC"; then
|
|
CFLAGS="-Wpointer-arith $CFLAGS"
|
|
AC_MSG_CHECKING(whether the selected language is C++)
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
#if defined (__cplusplus)
|
|
# error "C++"
|
|
error
|
|
#endif
|
|
]], [[]])],[
|
|
AC_MSG_RESULT(no)
|
|
CFLAGS="-Wmissing-prototypes $CFLAGS"
|
|
],[
|
|
AC_MSG_RESULT(yes)
|
|
CFLAGS="-Wmissing-declarations -Wno-sign-compare $CFLAGS"
|
|
])
|
|
CFLAGS="-Wall $CFLAGS"
|
|
fi
|
|
|
|
AM_PROG_CC_C_O
|
|
|
|
case $host in
|
|
*-apple-darwin*)
|
|
dnl This allows to take the first GMP library in the library paths,
|
|
dnl whether it is dynamic or static. This behavior is more sensible,
|
|
dnl in particular because it is the only way to link with a version
|
|
dnl only available in static form when another version is available
|
|
dnl in dynamic, and also for consistency, because the compiler will
|
|
dnl take the first gmp.h found in the include paths (so, we need to
|
|
dnl take a library that corresponds to this header file). This is a
|
|
dnl common problem with darwin.
|
|
MPFR_LD_SEARCH_PATHS_FIRST ;;
|
|
esac
|
|
|
|
AC_C_CONST
|
|
AC_C_VOLATILE
|
|
dnl Determine the endianness of integer. But since MPFR doesn't use
|
|
dnl AC_CONFIG_HEADERS, configure cannot provide such information for
|
|
dnl universal binaries containing variants with different endianness
|
|
dnl (i.e. generic code must be used).
|
|
AC_C_BIGENDIAN([AC_DEFINE(HAVE_BIG_ENDIAN)],[AC_DEFINE(HAVE_LITTLE_ENDIAN)],
|
|
[true],[true])
|
|
|
|
# (Based on GMP 5.1)
|
|
# clock_gettime is in librt on *-*-osf5.1 and on glibc < 2.17, so add -lrt to
|
|
# TUNE_LIBS if needed (e.g. if clock_gettime is not already in the C library).
|
|
# On linux (tested on x86_32, 2.6.26), clock_getres reports ns accuracy,
|
|
# while in a quick test on osf, clock_getres said only 1 millisecond.
|
|
old_LIBS="$LIBS"
|
|
AC_SEARCH_LIBS(clock_gettime, rt, [
|
|
AC_DEFINE([HAVE_CLOCK_GETTIME],1,[Define to 1 if you have the `clock_gettime' function])])
|
|
TUNE_LIBS="$LIBS"
|
|
LIBS="$old_LIBS"
|
|
AC_SUBST(TUNE_LIBS)
|
|
|
|
dnl Under Linux, make sure that the old dtags are used if LD_LIBRARY_PATH
|
|
dnl is defined. The issue is that with the new dtags, LD_LIBRARY_PATH has
|
|
dnl the precedence over the run path, so that if a compatible MPFR library
|
|
dnl is installed in some directory from $LD_LIBRARY_PATH, then the tested
|
|
dnl MPFR library will be this library instead of the MPFR library from the
|
|
dnl build tree. Other OS with the same issue might be added later.
|
|
dnl
|
|
dnl References:
|
|
dnl https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732
|
|
dnl http://lists.gnu.org/archive/html/libtool/2017-05/msg00000.html
|
|
dnl
|
|
dnl We need to check whether --disable-new-dtags is supported as alternate
|
|
dnl linkers may be used (e.g., with tcc: CC=tcc LD=tcc).
|
|
dnl
|
|
case $host in
|
|
*-*-linux*)
|
|
if test -n "$LD_LIBRARY_PATH"; then
|
|
saved_LDFLAGS="$LDFLAGS"
|
|
LDFLAGS="$LDFLAGS -Wl,--disable-new-dtags"
|
|
AC_MSG_CHECKING(whether --disable-new-dtags is supported by the linker)
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
int main (void) { return 0; }
|
|
]])],
|
|
[AC_MSG_RESULT(yes (use it since LD_LIBRARY_PATH is set))],
|
|
[AC_MSG_RESULT(no)
|
|
LDFLAGS="$saved_LDFLAGS"
|
|
])
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
dnl MPFR_CONFIGS uses LDFLAGS, thus must be invoked after LDFLAGS has
|
|
dnl been determined completely.
|
|
MPFR_CONFIGS
|
|
|
|
dnl
|
|
dnl For mpfr-longlong.h - TODO: should be replaced (see acinclude.m4).
|
|
dnl
|
|
|
|
GMP_C_ATTRIBUTE_MODE
|
|
|
|
|
|
dnl
|
|
dnl Setup related to GMP / mini-gmp
|
|
dnl
|
|
|
|
if test -z "$mini_gmp_path" ; then
|
|
|
|
dnl Setup for GMP
|
|
|
|
dnl Check GMP Header
|
|
AC_MSG_CHECKING(for gmp.h)
|
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
#include "gmp.h"
|
|
]])],[AC_MSG_RESULT(yes)],[
|
|
AC_MSG_RESULT(no)
|
|
AC_MSG_ERROR([gmp.h can't be found, or is unusable.])
|
|
])
|
|
|
|
dnl Configs for Windows DLLs.
|
|
dnl libtool requires "-no-undefined" for win32 dll
|
|
dnl
|
|
dnl "-Wl,output-def" is used to get a .def file for use by MS lib to make
|
|
dnl a .lib import library, described in the manual.
|
|
dnl
|
|
dnl Incidentally, libtool does generate an import library libmpfr.dll.a,
|
|
dnl but it's "ar" format and cannot be used by the MS linker. There
|
|
dnl doesn't seem to be any GNU tool for generating or converting to .lib.
|
|
dnl
|
|
dnl The DLL version (the number in libmpfr-*.dll.def below) must be the
|
|
dnl version of the oldest supported interface (i.e. CURRENT - AGE in
|
|
dnl src/Makefile.am).
|
|
AC_SUBST(MPFR_LDFLAGS)
|
|
AC_SUBST(LIBMPFR_LDFLAGS)
|
|
case $host in
|
|
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
|
|
AC_MSG_CHECKING(for DLL/static GMP)
|
|
if test "$enable_shared" = yes; then
|
|
MPFR_LDFLAGS="$MPFR_LDFLAGS -no-undefined"
|
|
LIBMPFR_LDFLAGS="$LIBMPFR_LDFLAGS -Wl,--output-def,.libs/libmpfr-6.dll.def"
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
#include "gmp.h"
|
|
#if !__GMP_LIBGMP_DLL
|
|
# error "Dead man"
|
|
error
|
|
#endif
|
|
]], [[]])],[AC_MSG_RESULT(DLL)],[
|
|
AC_MSG_RESULT(static)
|
|
AC_MSG_ERROR([libgmp isn't provided as a DLL: use --enable-static --disable-shared]) ])
|
|
else
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
#include "gmp.h"
|
|
#if __GMP_LIBGMP_DLL
|
|
# error "Dead man"
|
|
error
|
|
#endif
|
|
]], [[]])],[AC_MSG_RESULT(static)],[
|
|
AC_MSG_RESULT(DLL)
|
|
AC_MSG_ERROR([libgmp is provided as a DLL: use --disable-static --enable-shared]) ])
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
dnl Check minimal GMP version
|
|
dnl We only guarantee that with a *functional* and recent enough GMP version,
|
|
dnl MPFR will compile; we do not guarantee that GMP will compile.
|
|
dnl In particular fat builds are broken in GMP 4.3.2 and GMP 5.0.0
|
|
dnl (at least on 64-bit Core 2 under Linux),
|
|
dnl see <https://gmplib.org/list-archives/gmp-bugs/2011-August/002345.html>.
|
|
AC_MSG_CHECKING(for recent GMP)
|
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
#include "gmp.h"
|
|
#if (__GNU_MP_VERSION*100+__GNU_MP_VERSION_MINOR*10 < 500)
|
|
# error "GMP 5.0.0 or newer is required"
|
|
error
|
|
#endif
|
|
]])],[AC_MSG_RESULT(yes)],[
|
|
AC_MSG_RESULT(no)
|
|
AC_MSG_ERROR([GMP 5.0.0 or newer is required])
|
|
])
|
|
|
|
dnl Check if gmp.h is usable at link time; this may detect errors such as
|
|
dnl with GMP 4.1, which uses "extern __inline__" unconditionally with all
|
|
dnl GCC versions, which breaks by default with GCC 5 (this problem with
|
|
dnl GMP 4.1 is no longer possible as we now require GMP 5.0.0 or newer,
|
|
dnl but the same kind of problem may occur in the future).
|
|
dnl Note: No linking is done against the GMP library at this time, as we
|
|
dnl do not use any GMP symbol. The goal of this test is to avoid obscure
|
|
dnl errors with the following gmp.h tests.
|
|
AC_MSG_CHECKING(usable gmp.h at link time)
|
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
|
#include "gmp.h"
|
|
]],[[]])],[AC_MSG_RESULT(yes)],[
|
|
AC_MSG_RESULT(no)
|
|
AC_MSG_ERROR([there is an incompatibility between gmp.h and the compiler.
|
|
See 'config.log' for details.])
|
|
])
|
|
|
|
dnl Check if we can use internal header files of GMP (only --with-gmp-build)
|
|
if test "$use_gmp_build" = yes ; then
|
|
AC_MSG_CHECKING(for gmp internal files)
|
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
#include "gmp.h"
|
|
#include "gmp-impl.h"
|
|
#include "longlong.h"
|
|
]])],[
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE([MPFR_HAVE_GMP_IMPL],1,[Use GMP Internal Files])
|
|
],[
|
|
AC_MSG_ERROR([header files gmp-impl.h and longlong.h not found])
|
|
])
|
|
fi
|
|
|
|
dnl Check for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency.
|
|
dnl Problems may occur if gmp.h was generated with some ABI
|
|
dnl and is used with another ABI (or if nails are used).
|
|
dnl This test doesn't need to link with libgmp (at least it shouldn't).
|
|
AC_MSG_CHECKING(for GMP_NUMB_BITS and sizeof(mp_limb_t) consistency)
|
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
|
#include <stdio.h>
|
|
#include <limits.h>
|
|
#include "gmp.h"
|
|
]], [[
|
|
if (GMP_NUMB_BITS == sizeof(mp_limb_t) * CHAR_BIT)
|
|
return 0;
|
|
fprintf (stderr, "GMP_NUMB_BITS = %ld\n", (long) GMP_NUMB_BITS);
|
|
fprintf (stderr, "sizeof(mp_limb_t) = %ld\n", (long) sizeof(mp_limb_t));
|
|
fprintf (stderr, "sizeof(mp_limb_t) * CHAR_BIT = %ld != GMP_NUMB_BITS\n",
|
|
(long) (sizeof(mp_limb_t) * CHAR_BIT));
|
|
return 1;
|
|
]])], [AC_MSG_RESULT(yes)], [
|
|
AC_MSG_RESULT(no)
|
|
AC_MSG_ERROR([GMP_NUMB_BITS and sizeof(mp_limb_t) are not consistent.
|
|
You probably need to change some of the GMP or MPFR compile options.
|
|
See 'config.log' for details (search for GMP_NUMB_BITS).])],
|
|
[AC_MSG_RESULT([cannot test])])
|
|
|
|
dnl Check if we can link with GMP
|
|
AC_CHECK_LIB(gmp, __gmpz_init, [LIBS="-lgmp $LIBS"],
|
|
[AC_MSG_ERROR([libgmp not found or uses a different ABI (including static vs shared).
|
|
Please read the INSTALL file -- see "In case of problem".])])
|
|
|
|
dnl Check for corresponding 'gmp.h' and libgmp
|
|
AC_MSG_CHECKING(if gmp.h version and libgmp version are the same)
|
|
dnl We do not set LD_LIBRARY_PATH, as it is not possible to set it just
|
|
dnl before the test program is run, and we do not want to affect other
|
|
dnl programs (such as the compiler), because the behavior could be
|
|
dnl incorrect and even have security implications.
|
|
dnl WARNING! LD_RUN_PATH is not taken into account by the GNU gold ld,
|
|
dnl e.g. from binutils-gold 2.22-5 under Debian; see
|
|
dnl https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=660813
|
|
saved_LD_RUN_PATH="$LD_RUN_PATH"
|
|
LD_RUN_PATH="${LD_RUN_PATH:+$LD_RUN_PATH$PATH_SEPARATOR}$gmp_lib_path"
|
|
export LD_RUN_PATH
|
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "gmp.h"
|
|
]], [[
|
|
char buffer[100];
|
|
sprintf (buffer, "%d.%d.%d", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR,
|
|
__GNU_MP_VERSION_PATCHLEVEL);
|
|
printf ("(%s/%s) ", buffer, gmp_version);
|
|
fflush (stdout);
|
|
/* Also put information in config.log (stderr) */
|
|
fprintf (stderr, "gmp.h: %s / libgmp: %s\n", buffer, gmp_version);
|
|
if (strcmp (buffer, gmp_version) == 0)
|
|
return 0;
|
|
if (__GNU_MP_VERSION_PATCHLEVEL != 0)
|
|
return 1;
|
|
sprintf (buffer, "%d.%d", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR);
|
|
return (strcmp (buffer, gmp_version) != 0) ? 1 : 0;
|
|
]])],
|
|
[AC_MSG_RESULT(yes)
|
|
MPFR_CHECK_GMP
|
|
MPFR_CHECK_DBL2INT_BUG
|
|
MPFR_CHECK_PRINTF_SPEC
|
|
MPFR_CHECK_PRINTF_GROUPFLAG],
|
|
[AC_MSG_RESULT(no)
|
|
AC_MSG_WARN([==========================================================])
|
|
AC_MSG_WARN(['gmp.h' and 'libgmp' seem to have different versions or])
|
|
AC_MSG_WARN([we cannot run a program linked with GMP (if you cannot])
|
|
AC_MSG_WARN([see the version numbers above). A cause may be different])
|
|
AC_MSG_WARN([GMP versions with different ABI's or the use of --with-gmp])
|
|
AC_MSG_WARN([or --with-gmp-include with a system include directory])
|
|
AC_MSG_WARN([(such as /usr/include or /usr/local/include). Another])
|
|
AC_MSG_WARN([cause may be that LD_RUN_PATH is not honored (problem])
|
|
AC_MSG_WARN([seen under OpenBSD 6.6).])
|
|
AC_MSG_WARN([However since we can't use 'libtool' inside the configure,])
|
|
AC_MSG_WARN([we can't be sure. See 'config.log' for details.])
|
|
AC_MSG_WARN([CC="$CC"])
|
|
AC_MSG_WARN([CFLAGS="$CFLAGS"])
|
|
AC_MSG_WARN([CPPFLAGS="$CPPFLAGS"])
|
|
AC_MSG_WARN([LDFLAGS="$LDFLAGS"])
|
|
AC_MSG_WARN([LIBS="$LIBS"])
|
|
AC_MSG_WARN([Temporary LD_RUN_PATH was "$LD_RUN_PATH".])
|
|
AC_MSG_WARN([==========================================================])
|
|
],AC_MSG_RESULT([cannot test])
|
|
)
|
|
LD_RUN_PATH="$saved_LD_RUN_PATH"
|
|
|
|
dnl __gmpn_sbpi1_divappr_q is an internal GMP symbol; thus its behavior
|
|
dnl may change or this symbol may be removed in the future (without being
|
|
dnl handled by the library versioning system, which is even worse, as this
|
|
dnl can mean undetected incompatibilities in case of GMP library upgrade,
|
|
dnl without rebuilding MPFR). So, this symbol must not be used, unless
|
|
dnl WANT_GMP_INTERNALS is defined. Only the GMP public API should be used
|
|
dnl by default, in particular by binary distributions. Moreover the check
|
|
dnl below may yield an incorrect result as libtool isn't used in configure
|
|
dnl (see above).
|
|
AC_CHECK_FUNCS([__gmpn_sbpi1_divappr_q])
|
|
dnl same for other GMP internal functions
|
|
AC_CHECK_FUNCS([__gmpn_invert_limb])
|
|
dnl mpn_rsblsh1_n(rp, up, vp, n) does {rp, n} <- 2 * {vp, n} - {up, n}
|
|
AC_CHECK_FUNCS([__gmpn_rsblsh1_n])
|
|
|
|
MPFR_CHECK_MP_LIMB_T_VS_LONG
|
|
MPFR_CHECK_MP_LIMB_T_VS_INTMAX
|
|
|
|
else
|
|
|
|
dnl Setup for mini-gmp
|
|
|
|
dnl Let us make the configure script clean up the mini-gmp.* files
|
|
dnl and add the symbolic links to mini-gmp.{c,h} instead of relying
|
|
dnl on timestamp-based make rules, which may not work when testing
|
|
dnl several mini-gmp versions (whose source can go back in time).
|
|
mpfr_build_src="${ac_top_build_prefix}src"
|
|
mkdir -p "$mpfr_build_src"
|
|
rm -f -- "$mpfr_build_src"/mini-gmp.*
|
|
for i in c h
|
|
do
|
|
ln -s -- "$mini_gmp_path/mini-gmp.$i" "$mpfr_build_src/mini-gmp.$i"
|
|
done
|
|
|
|
dnl First check whether mini-gmp defines GMP_NUMB_BITS. If it doesn't,
|
|
dnl then guess the value from the size of mp_limb_t.
|
|
AC_MSG_CHECKING(for GMP_NUMB_BITS)
|
|
how="from mini-gmp.h"
|
|
saved_CPPFLAGS="$CPPFLAGS"
|
|
CPPFLAGS="$CPPFLAGS -I$mpfr_build_src"
|
|
AC_COMPUTE_INT(mini_gmp_numb_bits, [(GMP_NUMB_BITS)],
|
|
[#include <mini-gmp.h>],
|
|
[how="not in mini-gmp.h; guessed"
|
|
AC_COMPUTE_INT(mini_gmp_numb_bits, [(sizeof(mp_limb_t) * CHAR_BIT)],
|
|
[#include <limits.h>
|
|
#include <mini-gmp.h>],
|
|
[AC_MSG_FAILURE([cannot define GMP_NUMB_BITS])])
|
|
AC_DEFINE_UNQUOTED([GMP_NUMB_BITS], $mini_gmp_numb_bits, [number of bits in a limb])
|
|
])
|
|
CPPFLAGS="$saved_CPPFLAGS"
|
|
AC_MSG_RESULT([$mini_gmp_numb_bits bits ($how)])
|
|
|
|
dnl We need to check the availability of lrand48 (used by random_limb)
|
|
dnl and srand48 (used by gmp_randseed_ui), in particular because these
|
|
dnl functions are not part of the ISO C standard.
|
|
AC_CHECK_FUNC(lrand48,,AC_MSG_FAILURE([MPFR + mini-gmp requires lrand48]))
|
|
AC_CHECK_FUNC(srand48,,AC_MSG_FAILURE([MPFR + mini-gmp requires srand48]))
|
|
|
|
fi
|
|
|
|
dnl End of setup related to GMP / mini-gmp
|
|
|
|
dnl The getrusage function is needed for MPFR bench (cf tools/bench)
|
|
AC_CHECK_FUNCS([getrusage])
|
|
|
|
dnl Remove also many macros (AC_DEFINE), which are unused by MPFR and
|
|
dnl pollute (and slow down because libtool has to parse them) the build.
|
|
if test -f confdefs.h; then
|
|
for i in PACKAGE_ HAVE_STRING HAVE_DLFCN_H HAVE_MEM STDC_HEADERS \
|
|
HAVE_STDLIB_H HAVE_UNISTD_H HAVE_STDC_HEADERS \
|
|
HAVE_SYS_STAT_H HAVE_SYS_TYPES_H PROTOTYPES __PROTOTYPES
|
|
do
|
|
$SED "/#define $i/d" < confdefs.h > confdefs.tmp
|
|
mv confdefs.tmp confdefs.h
|
|
done
|
|
fi
|
|
|
|
if $EGREP -q -e '-dev$' $srcdir/VERSION; then
|
|
AC_SUBST([DATAFILES])dnl
|
|
DATAFILES=`echo \`$SED -n \
|
|
's/^ *data_check *("\(data\/[[^"]]*\)".*/tests\/\1/p' \
|
|
$srcdir/tests/*.c\``
|
|
fi
|
|
|
|
dnl Output
|
|
AC_CONFIG_FILES([Makefile mpfr.pc doc/Makefile src/Makefile tests/Makefile tune/Makefile src/mparam.h:src/mparam_h.in tools/bench/Makefile])
|
|
AC_OUTPUT
|
|
|
|
dnl NEWS README AUTHORS Changelog
|