blob: 7ee8f86fbf348662b03fb2fe98bcdbb0467471e0 [file] [log] [blame]
AC_PREREQ([2.67])
AC_INIT(mpdecimal, 2.4.0, mpdecimal-bugs@bytereef.org, mpdecimal, http://www.bytereef.org/mpdecimal/index.html)
AC_CONFIG_HEADER(config.h)
AC_CONFIG_FILES([Makefile libmpdec/Makefile tests/Makefile libmpdec/mpdecimal.h])
AC_ARG_VAR(MACHINE, [force configuration: x64, uint128, ansi64, ppro, ansi32, ansi-legacy])
LIBSTATIC=libmpdec.a
LIBSONAME=libmpdec.so.2
LIBSHARED=libmpdec.so.2.4.0
AC_SUBST(LIBSTATIC)
AC_SUBST(LIBSONAME)
AC_SUBST(LIBSHARED)
# Apparently purely informational for this particular build:
AC_CANONICAL_HOST
AC_SUBST(build)
AC_SUBST(host)
# Language and compiler:
AC_LANG_C
saved_cflags=$CFLAGS
AC_PROG_CC
CFLAGS=$saved_cflags
# ar and ranlib:
AC_CHECK_TOOL(AR, ar, ar)
AC_PROG_RANLIB
AC_SUBST(RANLIB)
# System and machine type (only used for Solaris and Darwin):
AC_MSG_CHECKING(system as reported by uname -s)
ac_sys_system=`uname -s`
AC_MSG_RESULT($ac_sys_system)
# Checks for header files:
AC_HEADER_STDC
AC_CHECK_HEADERS(inttypes.h stdint.h)
# Type availability checks:
AC_TYPE_SIZE_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_CHECK_TYPE(__uint128_t, AC_DEFINE(HAVE_UINT128_T, 1,
[Define if your compiler provides __uint128_t.]),,)
# Sizes of various types:
AC_CHECK_SIZEOF(size_t, 4)
AC_CHECK_SIZEOF(__uint128_t, 8)
# x64 with gcc asm:
AC_MSG_CHECKING(for x64 gcc inline assembler)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
__asm__ __volatile__ ("movq %rcx, %rax");
]])],[have_gcc_asm_for_x64=yes],[have_gcc_asm_for_x64=no])
AC_MSG_RESULT($have_gcc_asm_for_x64)
if test "$have_gcc_asm_for_x64" = yes; then
AC_DEFINE(HAVE_GCC_ASM_FOR_X64, 1,
[Define if we can use x64 gcc inline assembler.])
fi
# x87 with gcc asm:
AC_MSG_CHECKING(for x87 gcc inline assembler)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
unsigned short cw;
__asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
__asm__ __volatile__ ("fldcw %0" : : "m" (cw));
]])],[have_gcc_asm_for_x87=yes],[have_gcc_asm_for_x87=no])
AC_MSG_RESULT($have_gcc_asm_for_x87)
if test "$have_gcc_asm_for_x87" = yes; then
AC_DEFINE(HAVE_GCC_ASM_FOR_X87, 1,
[Define if we can use x87 gcc inline assembler.])
fi
# Availability of -O2:
AC_MSG_CHECKING(for -O2)
saved_cflags="$CFLAGS"
CFLAGS="-O2"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
]])],[have_O2=yes],[have_O2=no])
AC_MSG_RESULT($have_O2)
CFLAGS="$saved_cflags"
# Install program:
AC_PROG_INSTALL
AC_SUBST(INSTALL)
# _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
# http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
AC_MSG_CHECKING(for glibc _FORTIFY_SOURCE/memmove bug)
saved_cflags="$CFLAGS"
CFLAGS="-O2 -D_FORTIFY_SOURCE=2"
if test "$have_O2" = no; then
CFLAGS=""
fi
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo(void *p, void *q) { memmove(p, q, 19); }
int main() {
char a[32] = "123456789000000000";
foo(&a[9], a);
if (strcmp(a, "123456789123456789000000000") != 0)
return 1;
foo(a, &a[9]);
if (strcmp(a, "123456789000000000") != 0)
return 1;
return 0;
}
]])],
[have_glibc_memmove_bug=no],
[have_glibc_memmove_bug=yes],
[have_glibc_memmove_bug=undefined])
CFLAGS="$saved_cflags"
AC_MSG_RESULT($have_glibc_memmove_bug)
if test "$have_glibc_memmove_bug" = yes; then
AC_DEFINE(HAVE_GLIBC_MEMMOVE_BUG, 1,
[Define if glibc has incorrect _FORTIFY_SOURCE wrappers
for memmove and bcopy.])
fi
# suncc is dectected as cc:
case $ac_sys_system in
sun*|Sun*)
case $CC in
cc)
CC=suncc
;;
esac
esac
# Compiler dependent settings:
MPD_WARN="-Wall"
MPD_OPT="-O2 -fpic"
MPD_PGEN=
MPD_PUSE=
case $CC in
*gcc*)
MPD_WARN="-Wall -W -Wno-unknown-pragmas -std=c99 -pedantic"
MPD_OPT="-O2 -fpic"
MPD_PGEN="-fprofile-generate -fprofile-values"
MPD_PUSE="-fprofile-use -freorder-blocks"
;;
*icc*)
AR=xiar
MPD_WARN="-Wall -Wno-unknown-pragmas"
MPD_OPT="-O2 -fpic"
MPD_PGEN="-wd11505 -prof-gen"
MPD_PUSE="-wd11505 -prof-use"
;;
*clang*)
MPD_WARN="-Wall -W -Wno-unknown-pragmas"
MPD_OPT="-O2 -fpic"
;;
*suncc*)
MPD_WARN=
MPD_OPT="-O2 -fpic"
;;
*ccomp*)
MPD_WARN=
MPD_CONFIG="-DCONFIG_32 -DANSI -DLEGACY_COMPILER"
MPD_OPT="-fstruct-passing -fstruct-assign"
LD="gcc"
LDFLAGS="-m32"
;;
esac
# Values for the MPD_HEADER_CONFIG variable:
CONFIG_64="
/* ABI: 64-bit */
#ifdef CONFIG_32
#error \"cannot use CONFIG_32 with 64-bit header.\"
#endif
#ifndef CONFIG_64
#define CONFIG_64
#endif"
CONFIG_32="
/* ABI: 32-bit */
#ifdef CONFIG_64
#error \"cannot use CONFIG_64 with 32-bit header.\"
#endif
#ifndef CONFIG_32
#define CONFIG_32
#endif"
CONFIG_32_LEGACY="
/* ABI: 32-bit */
#ifdef CONFIG_64
#error \"cannot use CONFIG_64 with 32-bit header.\"
#endif
#ifndef CONFIG_32
#define CONFIG_32
#endif
/* libmpdec was compiled without support for int64_t */
#ifndef LEGACY_COMPILER
#define LEGACY_COMPILER
#endif"
CONFIG_UNIVERSAL="
/* Mac OS X: support for building universal binaries */
#if defined(CONFIG_64) || defined(CONFIG_32)
#error \"cannot use CONFIG_64 or CONFIG_32 with universal header.\"
#endif
#if defined(__ppc__)
#define CONFIG_32
#define ANSI
#elif defined(__ppc64__)
#define CONFIG_64
#define ANSI
#elif defined(__i386__)
#define CONFIG_32
#define ANSI
#elif defined(__x86_64__)
#define CONFIG_64
#define ASM
#else
#error \"unknown architecture for universal build.\"
#endif"
CONFIG_FULLCOV="
/* DO NOT USE IN PRODUCTION! */
#if defined(CONFIG_64) || !defined(CONFIG_32)
#error \"CONFIG_32 must be defined for full coverage.\"
#endif"
# Auto-detect machine dependent settings:
M64=
M32=
if test -n "$MACHINE"; then
M64="-m64 "
M32="-m32 "
case "$MACHINE" in
x64|uint128|ansi64|full_coverage|ppro|ansi32|ansi-legacy|universal)
: ;;
*)
echo "configure: error: invalid MACHINE variable: $MACHINE"
exit 1 ;;
esac
elif test $ac_cv_sizeof_size_t -eq 8; then
if test $have_gcc_asm_for_x64 = yes; then
MACHINE="x64"
elif test $ac_cv_sizeof__uint128_t -eq 8; then
MACHINE="uint128"
else
MACHINE="ansi64"
fi
else
# Macros for detecting uint64_t and int64_t are unreliable:
case $CC in
*ccomp*)
MACHINE="ansi-legacy"
;;
*)
MACHINE="ansi32"
;;
esac
if test $have_gcc_asm_for_x87 = yes; then
case $CC in
*gcc*|*clang*) # icc >= 11.0 works as well
case $ac_sys_system in
darwin*|Darwin*)
;;
*)
MACHINE="ppro"
;;
esac
;;
esac
fi
fi
# Set configuration variables:
MPD_PREC=9
MPD_DPREC=18
CONFIGURE_LDFLAGS=
case "$MACHINE" in
x64)
MPD_HEADER_CONFIG=$CONFIG_64
MPD_CONFIG=$M64"-DCONFIG_64 -DASM"
CONFIGURE_LDFLAGS=$M64
MPD_PREC=19
MPD_DPREC=38
;;
uint128)
MPD_HEADER_CONFIG=$CONFIG_64
MPD_CONFIG=$M64"-DCONFIG_64 -DANSI -DHAVE_UINT128_T"
CONFIGURE_LDFLAGS=$M64
MPD_PREC=19
MPD_DPREC=38
;;
ansi64)
MPD_HEADER_CONFIG=$CONFIG_64
MPD_CONFIG=$M64"-DCONFIG_64 -DANSI"
CONFIGURE_LDFLAGS=$M64
MPD_PREC=19
MPD_DPREC=38
;;
full_coverage)
# Formerly ansi64c32, for testing only!
MPD_HEADER_CONFIG=$CONFIG_FULLCOV
MPD_CONFIG=$M64"-DCONFIG_32 -DANSI"
CONFIGURE_LDFLAGS=$M64
;;
ppro)
MPD_HEADER_CONFIG=$CONFIG_32
MPD_CONFIG=$M32"-DCONFIG_32 -DPPRO -DASM"
CONFIGURE_LDFLAGS=$M32
# Some versions of gcc miscompile inline asm:
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
# http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
case $CC in
*gcc*)
AC_MSG_CHECKING(for gcc ipa-pure-const bug)
saved_cflags="$CFLAGS"
CFLAGS="-O2"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
__attribute__((noinline)) int
foo(int *p) {
int r;
asm ( "movl \$6, (%1)\n\t"
"xorl %0, %0\n\t"
: "=r" (r) : "r" (p) : "memory"
);
return r;
}
int main() {
int p = 8;
if ((foo(&p) ? : p) != 6)
return 1;
return 0;
}
]])],
[have_ipa_pure_const_bug=no],
[have_ipa_pure_const_bug=yes],
[have_ipa_pure_const_bug=undefined])
CFLAGS="$saved_cflags"
AC_MSG_RESULT($have_ipa_pure_const_bug)
if test "$have_ipa_pure_const_bug" = yes; then
MPD_CONFIG="$MPD_CONFIG -fno-ipa-pure-const"
AC_DEFINE(HAVE_IPA_PURE_CONST_BUG, 1,
[Define if gcc has the ipa-pure-const bug.])
fi
;;
esac
;;
ansi32)
MPD_HEADER_CONFIG=$CONFIG_32
MPD_CONFIG=$M32"-DCONFIG_32 -DANSI"
CONFIGURE_LDFLAGS=$M32
;;
ansi-legacy)
MPD_HEADER_CONFIG=$CONFIG_32_LEGACY
MPD_CONFIG=$M32"-DCONFIG_32 -DANSI -DLEGACY_COMPILER"
CONFIGURE_LDFLAGS=$M32
;;
universal)
MPD_HEADER_CONFIG=$CONFIG_UNIVERSAL
MPD_CONFIG="-DUNIVERSAL"
esac
# Substitute variables and generate output:
if test -z "$LD"; then
LD="$CC"
fi
AC_SUBST(LD)
AC_SUBST(AR)
AC_SUBST(MPD_HEADER)
AC_SUBST(MPD_WARN)
AC_SUBST(MPD_CONFIG)
AC_SUBST(MPD_HEADER_CONFIG)
AC_SUBST(MPD_OPT)
AC_SUBST(MPD_PGEN)
AC_SUBST(MPD_PUSE)
AC_SUBST(MPD_PREC)
AC_SUBST(MPD_DPREC)
if test -z "$CFLAGS"; then
CONFIGURE_CFLAGS="$MPD_WARN $MPD_CONFIG $MPD_OPT"
else
CONFIGURE_CFLAGS="$MPD_WARN $MPD_CONFIG $MPD_OPT $CFLAGS"
fi
if test "$have_glibc_memmove_bug" = yes; then
CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -U_FORTIFY_SOURCE"
fi
if test -n "$LDFLAGS"; then
CONFIGURE_LDFLAGS="$LDFLAGS"
fi
AC_SUBST(CONFIGURE_CFLAGS)
AC_SUBST(CONFIGURE_LDFLAGS)
AC_OUTPUT
GLIBC_MEMMOVE_BUG_WARN="
***************************** WARNING *********************************
Detected glibc _FORTIFY_SOURCE/memmove bug. See:
http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
Enabling -U_FORTIFY_SOURCE workaround. If -D_FORTIFY_SOURCE is also
present in the command line, make sure that the order of the two
options is:
... -D_FORTIFY_SOURCE=2 ... -U_FORTIFY_SOURCE ...
A better solution is to upgrade glibc or to report the bug to your
OS vendor.
***************************** WARNING *********************************
"
if test "$have_glibc_memmove_bug" = yes; then
echo "$GLIBC_MEMMOVE_BUG_WARN"
fi