blob: b24f4556000b30d8b75b98a80d4b93c7a4284604 [file] [log] [blame]
dnl
dnl This file contains macros for testing linkage.
dnl
dnl
dnl Check to see if the (math function) argument passed is
dnl declared when using the c++ compiler
dnl ASSUMES argument is a math function with ONE parameter
dnl
dnl GLIBCXX_CHECK_MATH_DECL_1
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_1], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <math.h>
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
],
[ $1(0);],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
])
dnl
dnl Define autoheader template for using the underscore functions
dnl For each parameter, create a macro where if func doesn't exist,
dnl but _func does, then it will "#define func _func".
dnl
dnl GLIBCXX_MAYBE_UNDERSCORED_FUNCS
AC_DEFUN([GLIBCXX_MAYBE_UNDERSCORED_FUNCS],
[AC_FOREACH([glibcxx_ufunc], [$1],
[AH_VERBATIM(_[]glibcxx_ufunc,
[#if defined (]AS_TR_CPP(HAVE__[]glibcxx_ufunc)[) && ! defined (]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[)
# define ]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[ 1
# define ]glibcxx_ufunc[ _]glibcxx_ufunc[
#endif])])
])
dnl
dnl Check to see if the (math function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl 3) if not, see if 1) and 2) for argument prepended with '_'
dnl
dnl Define HAVE_CARGF etc if "cargf" is declared and links
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a math function with ONE parameter
dnl
dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1], [
GLIBCXX_CHECK_MATH_DECL_1($1)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
else
GLIBCXX_CHECK_MATH_DECL_1(_$1)
if test x$glibcxx_cv_func__$1_use = x"yes"; then
AC_CHECK_FUNCS(_$1)
fi
fi
GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
])
dnl
dnl Like GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1, but does a bunch of
dnl of functions at once. It's an all-or-nothing check -- either
dnl HAVE_XYZ is defined for each of the functions, or for none of them.
dnl Doing it this way saves significant configure time.
AC_DEFUN([GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1], [
define([funclist],patsubst($3,\(\w+\)\(\W*\),\1 ))dnl
AC_MSG_CHECKING([for $1 functions])
AC_CACHE_VAL(glibcxx_cv_func_$2_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <math.h>],
patsubst(funclist,[\w+],[\& (0);]),
[glibcxx_cv_func_$2_use=yes],
[glibcxx_cv_func_$2_use=no])
AC_LANG_RESTORE])
AC_MSG_RESULT($glibcxx_cv_func_$2_use)
if test x$glibcxx_cv_func_$2_use = x"yes"; then
AC_CHECK_FUNCS(funclist)
else
AC_MSG_CHECKING([for _$1 functions])
AC_CACHE_VAL(glibcxx_cv_func__$2_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <math.h>],
patsubst(funclist,[\w+],[_\& (0);]),
[glibcxx_cv_func__$2_use=yes],
[glibcxx_cv_func__$2_use=no])
AC_LANG_RESTORE])
AC_MSG_RESULT($glibcxx_cv_func__$2_use)
if test x$glibcxx_cv_func__$2_use = x"yes"; then
AC_CHECK_FUNCS(patsubst(funclist,[\w+],[_\&]))
fi
fi
GLIBCXX_MAYBE_UNDERSCORED_FUNCS(funclist)
undefine([funclist])
])
dnl
dnl Check to see if the (math function) argument passed is
dnl declared when using the c++ compiler
dnl ASSUMES argument is a math function with TWO parameters
dnl
dnl GLIBCXX_CHECK_MATH_DECL_2
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_2], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <math.h>],
[ $1(0, 0);],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
])
dnl
dnl Check to see if the (math function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl
dnl Define HAVE_CARGF etc if "cargf" is declared and links
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a math function with TWO parameters
dnl
dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2], [
GLIBCXX_CHECK_MATH_DECL_2($1)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
else
GLIBCXX_CHECK_MATH_DECL_2(_$1)
if test x$glibcxx_cv_func__$1_use = x"yes"; then
AC_CHECK_FUNCS(_$1)
fi
fi
GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
])
dnl
dnl Check to see if the (math function) argument passed is
dnl declared when using the c++ compiler
dnl ASSUMES argument is a math function with THREE parameters
dnl
dnl GLIBCXX_CHECK_MATH_DECL_3
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_3], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <math.h>],
[ $1(0, 0, 0);],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
])
dnl
dnl Check to see if the (math function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl
dnl Define HAVE_CARGF etc if "cargf" is declared and links
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a math function with THREE parameters
dnl
dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3
AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3], [
GLIBCXX_CHECK_MATH_DECL_3($1)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
else
GLIBCXX_CHECK_MATH_DECL_3(_$1)
if test x$glibcxx_cv_func__$1_use = x"yes"; then
AC_CHECK_FUNCS(_$1)
fi
fi
GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
])
dnl
dnl Check to see if the (stdlib function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a stdlib function without parameters
dnl
dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0
AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <stdlib.h>],
[ $1();],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
fi
])
dnl
dnl Check to see if the (stdlib function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a stdlib function with TWO parameters
dnl
dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2
AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <stdlib.h>],
[ $1(0, 0);],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
fi
GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
])
dnl
dnl Check to see if the (stdlib function) argument passed is
dnl 1) declared when using the c++ compiler
dnl 2) has "C" linkage
dnl
dnl argument 1 is name of function to check
dnl
dnl ASSUMES argument is a stdlib function with THREE parameters
dnl
dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3
AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3], [
AC_MSG_CHECKING([for $1 declaration])
if test x${glibcxx_cv_func_$1_use+set} != xset; then
AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_COMPILE([#include <stdlib.h>],
[ $1(0, 0, 0);],
[glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
AC_LANG_RESTORE
])
fi
AC_MSG_RESULT($glibcxx_cv_func_$1_use)
if test x$glibcxx_cv_func_$1_use = x"yes"; then
AC_CHECK_FUNCS($1)
fi
])
dnl
dnl Check to see what the underlying c library is like
dnl These checks need to do two things:
dnl 1) make sure the name is declared when using the c++ compiler
dnl 2) make sure the name has "C" linkage
dnl This might seem like overkill but experience has shown that it's not...
dnl
dnl Define HAVE_STRTOLD if "strtold" is declared and links
dnl Define HAVE_STRTOF if "strtof" is declared and links
dnl
dnl GLIBCXX_CHECK_STDLIB_SUPPORT
AC_DEFUN([GLIBCXX_CHECK_STDLIB_SUPPORT], [
ac_test_CXXFLAGS="${CXXFLAGS+set}"
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS='-fno-builtin -D_GNU_SOURCE'
GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtold)
GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtof)
CXXFLAGS="$ac_save_CXXFLAGS"
])
dnl
dnl Check to see what the underlying c library or math library is like.
dnl These checks need to do two things:
dnl 1) make sure the name is declared when using the c++ compiler
dnl 2) make sure the name has "C" linkage
dnl This might seem like overkill but experience has shown that it's not...
dnl
dnl Define HAVE_CARGF etc if "cargf" is found.
dnl
dnl GLIBCXX_CHECK_MATH_SUPPORT
AC_DEFUN([GLIBCXX_CHECK_MATH_SUPPORT], [
ac_test_CXXFLAGS="${CXXFLAGS+set}"
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS='-fno-builtin -D_GNU_SOURCE'
dnl Check libm
AC_CHECK_LIB(m, sin, libm="-lm")
ac_save_LIBS="$LIBS"
LIBS="$LIBS $libm"
dnl Check to see if certain C math functions exist.
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnan)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finite)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincos)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fpclass)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(qfpclass)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypot)
dnl Check to see if basic C math functions have float versions.
GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float trig,
float_trig,
acosf asinf atanf \
cosf sinf tanf \
coshf sinhf tanhf)
GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float round,
float_round,
ceilf floorf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinff)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2f)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10f)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modff)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosf)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitef)
dnl Check to see if basic C math functions have long double versions.
GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double trig,
long_double_trig,
acosl asinl atanl \
cosl sinl tanl \
coshl sinhl tanhl)
GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double round,
long_double_round,
ceill floorl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinfl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2l)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10l)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modfl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosl)
GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitel)
LIBS="$ac_save_LIBS"
CXXFLAGS="$ac_save_CXXFLAGS"
])