1 dnl 2 dnl This file contains macros for testing linkage. 3 dnl 4 5 dnl 6 dnl Check to see if the (math function) argument passed is 7 dnl declared when using the c++ compiler 8 dnl ASSUMES argument is a math function with ONE parameter 9 dnl 10 dnl GLIBCXX_CHECK_MATH_DECL_1 11 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_1], [ 12 AC_MSG_CHECKING([for $1 declaration]) 13 if test x${glibcxx_cv_func_$1_use+set} != xset; then 14 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 15 AC_LANG_SAVE 16 AC_LANG_CPLUSPLUS 17 AC_TRY_COMPILE([#include <math.h> 18 #ifdef HAVE_IEEEFP_H 19 #include <ieeefp.h> 20 #endif 21 ], 22 [ $1(0);], 23 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 24 AC_LANG_RESTORE 25 ]) 26 fi 27 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 28 ]) 29 30 31 dnl 32 dnl Define autoheader template for using the underscore functions 33 dnl For each parameter, create a macro where if func doesn't exist, 34 dnl but _func does, then it will "#define func _func". 35 dnl 36 dnl GLIBCXX_MAYBE_UNDERSCORED_FUNCS 37 AC_DEFUN([GLIBCXX_MAYBE_UNDERSCORED_FUNCS], 38 [AC_FOREACH([glibcxx_ufunc], [$1], 39 [AH_VERBATIM(_[]glibcxx_ufunc, 40 [#if defined (]AS_TR_CPP(HAVE__[]glibcxx_ufunc)[) && ! defined (]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[) 41 # define ]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[ 1 42 # define ]glibcxx_ufunc[ _]glibcxx_ufunc[ 43 #endif])]) 44 ]) 45 46 47 dnl 48 dnl Check to see if the (math function) argument passed is 49 dnl 1) declared when using the c++ compiler 50 dnl 2) has "C" linkage 51 dnl 3) if not, see if 1) and 2) for argument prepended with '_' 52 dnl 53 dnl Define HAVE_CARGF etc if "cargf" is declared and links 54 dnl 55 dnl argument 1 is name of function to check 56 dnl 57 dnl ASSUMES argument is a math function with ONE parameter 58 dnl 59 dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1 60 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1], [ 61 GLIBCXX_CHECK_MATH_DECL_1($1) 62 if test x$glibcxx_cv_func_$1_use = x"yes"; then 63 AC_CHECK_FUNCS($1) 64 else 65 GLIBCXX_CHECK_MATH_DECL_1(_$1) 66 if test x$glibcxx_cv_func__$1_use = x"yes"; then 67 AC_CHECK_FUNCS(_$1) 68 fi 69 fi 70 GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1) 71 ]) 72 73 74 dnl 75 dnl Like GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1, but does a bunch of 76 dnl of functions at once. It's an all-or-nothing check -- either 77 dnl HAVE_XYZ is defined for each of the functions, or for none of them. 78 dnl Doing it this way saves significant configure time. 79 AC_DEFUN([GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1], [ 80 define([funclist],patsubst($3,\(\w+\)\(\W*\),\1 ))dnl 81 AC_MSG_CHECKING([for $1 functions]) 82 AC_CACHE_VAL(glibcxx_cv_func_$2_use, [ 83 AC_LANG_SAVE 84 AC_LANG_CPLUSPLUS 85 AC_TRY_COMPILE([#include <math.h>], 86 patsubst(funclist,[\w+],[\& (0);]), 87 [glibcxx_cv_func_$2_use=yes], 88 [glibcxx_cv_func_$2_use=no]) 89 AC_LANG_RESTORE]) 90 AC_MSG_RESULT($glibcxx_cv_func_$2_use) 91 if test x$glibcxx_cv_func_$2_use = x"yes"; then 92 AC_CHECK_FUNCS(funclist) 93 else 94 AC_MSG_CHECKING([for _$1 functions]) 95 AC_CACHE_VAL(glibcxx_cv_func__$2_use, [ 96 AC_LANG_SAVE 97 AC_LANG_CPLUSPLUS 98 AC_TRY_COMPILE([#include <math.h>], 99 patsubst(funclist,[\w+],[_\& (0);]), 100 [glibcxx_cv_func__$2_use=yes], 101 [glibcxx_cv_func__$2_use=no]) 102 AC_LANG_RESTORE]) 103 AC_MSG_RESULT($glibcxx_cv_func__$2_use) 104 if test x$glibcxx_cv_func__$2_use = x"yes"; then 105 AC_CHECK_FUNCS(patsubst(funclist,[\w+],[_\&])) 106 fi 107 fi 108 GLIBCXX_MAYBE_UNDERSCORED_FUNCS(funclist) 109 undefine([funclist]) 110 ]) 111 112 dnl 113 dnl Check to see if the (math function) argument passed is 114 dnl declared when using the c++ compiler 115 dnl ASSUMES argument is a math function with TWO parameters 116 dnl 117 dnl GLIBCXX_CHECK_MATH_DECL_2 118 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_2], [ 119 AC_MSG_CHECKING([for $1 declaration]) 120 if test x${glibcxx_cv_func_$1_use+set} != xset; then 121 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 122 AC_LANG_SAVE 123 AC_LANG_CPLUSPLUS 124 AC_TRY_COMPILE([#include <math.h>], 125 [ $1(0, 0);], 126 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 127 AC_LANG_RESTORE 128 ]) 129 fi 130 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 131 ]) 132 133 dnl 134 dnl Check to see if the (math function) argument passed is 135 dnl 1) declared when using the c++ compiler 136 dnl 2) has "C" linkage 137 dnl 138 dnl Define HAVE_CARGF etc if "cargf" is declared and links 139 dnl 140 dnl argument 1 is name of function to check 141 dnl 142 dnl ASSUMES argument is a math function with TWO parameters 143 dnl 144 dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2 145 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2], [ 146 GLIBCXX_CHECK_MATH_DECL_2($1) 147 if test x$glibcxx_cv_func_$1_use = x"yes"; then 148 AC_CHECK_FUNCS($1) 149 else 150 GLIBCXX_CHECK_MATH_DECL_2(_$1) 151 if test x$glibcxx_cv_func__$1_use = x"yes"; then 152 AC_CHECK_FUNCS(_$1) 153 fi 154 fi 155 GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1) 156 ]) 157 158 159 dnl 160 dnl Check to see if the (math function) argument passed is 161 dnl declared when using the c++ compiler 162 dnl ASSUMES argument is a math function with THREE parameters 163 dnl 164 dnl GLIBCXX_CHECK_MATH_DECL_3 165 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_3], [ 166 AC_MSG_CHECKING([for $1 declaration]) 167 if test x${glibcxx_cv_func_$1_use+set} != xset; then 168 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 169 AC_LANG_SAVE 170 AC_LANG_CPLUSPLUS 171 AC_TRY_COMPILE([#include <math.h>], 172 [ $1(0, 0, 0);], 173 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 174 AC_LANG_RESTORE 175 ]) 176 fi 177 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 178 ]) 179 180 dnl 181 dnl Check to see if the (math function) argument passed is 182 dnl 1) declared when using the c++ compiler 183 dnl 2) has "C" linkage 184 dnl 185 dnl Define HAVE_CARGF etc if "cargf" is declared and links 186 dnl 187 dnl argument 1 is name of function to check 188 dnl 189 dnl ASSUMES argument is a math function with THREE parameters 190 dnl 191 dnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3 192 AC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3], [ 193 GLIBCXX_CHECK_MATH_DECL_3($1) 194 if test x$glibcxx_cv_func_$1_use = x"yes"; then 195 AC_CHECK_FUNCS($1) 196 else 197 GLIBCXX_CHECK_MATH_DECL_3(_$1) 198 if test x$glibcxx_cv_func__$1_use = x"yes"; then 199 AC_CHECK_FUNCS(_$1) 200 fi 201 fi 202 GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1) 203 ]) 204 205 206 dnl 207 dnl Check to see if the (stdlib function) argument passed is 208 dnl 1) declared when using the c++ compiler 209 dnl 2) has "C" linkage 210 dnl 211 dnl argument 1 is name of function to check 212 dnl 213 dnl ASSUMES argument is a stdlib function without parameters 214 dnl 215 dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0 216 AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0], [ 217 AC_MSG_CHECKING([for $1 declaration]) 218 if test x${glibcxx_cv_func_$1_use+set} != xset; then 219 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 220 AC_LANG_SAVE 221 AC_LANG_CPLUSPLUS 222 AC_TRY_COMPILE([#include <stdlib.h>], 223 [ $1();], 224 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 225 AC_LANG_RESTORE 226 ]) 227 fi 228 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 229 if test x$glibcxx_cv_func_$1_use = x"yes"; then 230 AC_CHECK_FUNCS($1) 231 fi 232 ]) 233 234 235 dnl 236 dnl Check to see if the (stdlib function) argument passed is 237 dnl 1) declared when using the c++ compiler 238 dnl 2) has "C" linkage 239 dnl 240 dnl argument 1 is name of function to check 241 dnl 242 dnl ASSUMES argument is a stdlib function with ONE parameter 243 dnl 244 dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_1 245 AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_1], [ 246 AC_MSG_CHECKING([for $1 declaration]) 247 if test x${glibcxx_cv_func_$1_use+set} != xset; then 248 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 249 AC_LANG_SAVE 250 AC_LANG_CPLUSPLUS 251 AC_TRY_COMPILE([#include <stdlib.h>], 252 [ $1(0);], 253 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 254 AC_LANG_RESTORE 255 ]) 256 fi 257 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 258 if test x$glibcxx_cv_func_$1_use = x"yes"; then 259 AC_CHECK_FUNCS($1) 260 fi 261 ]) 262 263 264 dnl 265 dnl Check to see if the (stdlib function) argument passed is 266 dnl 1) declared when using the c++ compiler 267 dnl 2) has "C" linkage 268 dnl 269 dnl argument 1 is name of function to check 270 dnl 271 dnl ASSUMES argument is a stdlib function with TWO parameters 272 dnl 273 dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2 274 AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2], [ 275 AC_MSG_CHECKING([for $1 declaration]) 276 if test x${glibcxx_cv_func_$1_use+set} != xset; then 277 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 278 AC_LANG_SAVE 279 AC_LANG_CPLUSPLUS 280 AC_TRY_COMPILE([#include <stdlib.h>], 281 [ $1(0, 0);], 282 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 283 AC_LANG_RESTORE 284 ]) 285 fi 286 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 287 if test x$glibcxx_cv_func_$1_use = x"yes"; then 288 AC_CHECK_FUNCS($1) 289 fi 290 GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1) 291 ]) 292 293 294 dnl 295 dnl Check to see if the (stdlib function) argument passed is 296 dnl 1) declared when using the c++ compiler 297 dnl 2) has "C" linkage 298 dnl 299 dnl argument 1 is name of function to check 300 dnl 301 dnl ASSUMES argument is a stdlib function with THREE parameters 302 dnl 303 dnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3 304 AC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3], [ 305 AC_MSG_CHECKING([for $1 declaration]) 306 if test x${glibcxx_cv_func_$1_use+set} != xset; then 307 AC_CACHE_VAL(glibcxx_cv_func_$1_use, [ 308 AC_LANG_SAVE 309 AC_LANG_CPLUSPLUS 310 AC_TRY_COMPILE([#include <stdlib.h>], 311 [ $1(0, 0, 0);], 312 [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no]) 313 AC_LANG_RESTORE 314 ]) 315 fi 316 AC_MSG_RESULT($glibcxx_cv_func_$1_use) 317 if test x$glibcxx_cv_func_$1_use = x"yes"; then 318 AC_CHECK_FUNCS($1) 319 fi 320 ]) 321 322 dnl 323 dnl Check to see what the underlying c library is like 324 dnl These checks need to do two things: 325 dnl 1) make sure the name is declared when using the c++ compiler 326 dnl 2) make sure the name has "C" linkage 327 dnl This might seem like overkill but experience has shown that it's not... 328 dnl 329 dnl Define HAVE_STRTOLD if "strtold" is declared and links 330 dnl Define HAVE_STRTOF if "strtof" is declared and links 331 dnl 332 dnl GLIBCXX_CHECK_STDLIB_SUPPORT 333 AC_DEFUN([GLIBCXX_CHECK_STDLIB_SUPPORT], [ 334 ac_test_CXXFLAGS="${CXXFLAGS+set}" 335 ac_save_CXXFLAGS="$CXXFLAGS" 336 CXXFLAGS='-fno-builtin -D_GNU_SOURCE' 337 338 GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_1(at_quick_exit) 339 GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_1(quick_exit) 340 GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtold) 341 GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtof) 342 343 CXXFLAGS="$ac_save_CXXFLAGS" 344 ]) 345 346 dnl 347 dnl Check to see what the underlying c library or math library is like. 348 dnl These checks need to do two things: 349 dnl 1) make sure the name is declared when using the c++ compiler 350 dnl 2) make sure the name has "C" linkage 351 dnl This might seem like overkill but experience has shown that it's not... 352 dnl 353 dnl Define HAVE_CARGF etc if "cargf" is found. 354 dnl 355 dnl GLIBCXX_CHECK_MATH_SUPPORT 356 AC_DEFUN([GLIBCXX_CHECK_MATH_SUPPORT], [ 357 ac_test_CXXFLAGS="${CXXFLAGS+set}" 358 ac_save_CXXFLAGS="$CXXFLAGS" 359 CXXFLAGS='-fno-builtin -D_GNU_SOURCE' 360 361 dnl Check libm 362 AC_CHECK_LIB(m, sin, libm="-lm") 363 ac_save_LIBS="$LIBS" 364 LIBS="$LIBS $libm" 365 366 dnl Check to see if certain C math functions exist. 367 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinf) 368 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnan) 369 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finite) 370 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincos) 371 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fpclass) 372 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(qfpclass) 373 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypot) 374 375 dnl Check to see if basic C math functions have float versions. 376 GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float trig, 377 float_trig, 378 acosf asinf atanf \ 379 cosf sinf tanf \ 380 coshf sinhf tanhf) 381 GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float round, 382 float_round, 383 ceilf floorf) 384 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expf) 385 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanf) 386 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinff) 387 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2f) 388 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsf) 389 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodf) 390 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpf) 391 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotf) 392 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpf) 393 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logf) 394 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10f) 395 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modff) 396 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modf) 397 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powf) 398 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtf) 399 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosf) 400 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitef) 401 402 dnl Check to see if basic C math functions have long double versions. 403 GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double trig, 404 long_double_trig, 405 acosl asinl atanl \ 406 cosl sinl tanl \ 407 coshl sinhl tanhl) 408 GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double round, 409 long_double_round, 410 ceill floorl) 411 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanl) 412 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinfl) 413 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2l) 414 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expl) 415 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsl) 416 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodl) 417 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpl) 418 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotl) 419 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpl) 420 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logl) 421 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10l) 422 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modfl) 423 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powl) 424 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtl) 425 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosl) 426 GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitel) 427 428 LIBS="$ac_save_LIBS" 429 CXXFLAGS="$ac_save_CXXFLAGS" 430 ]) 431