1132720Skandnl
2132720Skandnl This file contains macros for testing linkage.
3132720Skandnl
4132720Skan
5132720Skandnl
6132720Skandnl Check to see if the (math function) argument passed is
7132720Skandnl declared when using the c++ compiler
8132720Skandnl ASSUMES argument is a math function with ONE parameter
9132720Skandnl
10132720Skandnl GLIBCXX_CHECK_MATH_DECL_1
11132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_1], [
12132720Skan  AC_MSG_CHECKING([for $1 declaration])
13132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
14132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
15132720Skan      AC_LANG_SAVE
16132720Skan      AC_LANG_CPLUSPLUS
17132720Skan      AC_TRY_COMPILE([#include <math.h>
18132720Skan		      #ifdef HAVE_IEEEFP_H
19132720Skan		      #include <ieeefp.h>
20132720Skan		      #endif
21132720Skan		     ],
22132720Skan                     [ $1(0);],
23132720Skan                      [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
24132720Skan      AC_LANG_RESTORE
25132720Skan    ])
26132720Skan  fi
27132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
28132720Skan])
29132720Skan
30169691Skan
31169691Skandnl 
32169691Skandnl Define autoheader template for using the underscore functions
33169691Skandnl For each parameter, create a macro where if func doesn't exist,
34169691Skandnl but _func does, then it will "#define func _func".
35132720Skandnl
36169691Skandnl GLIBCXX_MAYBE_UNDERSCORED_FUNCS
37169691SkanAC_DEFUN([GLIBCXX_MAYBE_UNDERSCORED_FUNCS], 
38169691Skan[AC_FOREACH([glibcxx_ufunc], [$1],
39169691Skan  [AH_VERBATIM(_[]glibcxx_ufunc,
40169691Skan[#if defined (]AS_TR_CPP(HAVE__[]glibcxx_ufunc)[) && ! defined (]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[)
41169691Skan# define ]AS_TR_CPP(HAVE_[]glibcxx_ufunc)[ 1
42169691Skan# define ]glibcxx_ufunc[ _]glibcxx_ufunc[
43169691Skan#endif])])
44169691Skan])
45169691Skan
46169691Skan
47169691Skandnl
48132720Skandnl Check to see if the (math function) argument passed is
49132720Skandnl 1) declared when using the c++ compiler
50132720Skandnl 2) has "C" linkage
51132720Skandnl 3) if not, see if 1) and 2) for argument prepended with '_'
52132720Skandnl
53132720Skandnl Define HAVE_CARGF etc if "cargf" is declared and links
54132720Skandnl
55132720Skandnl argument 1 is name of function to check
56132720Skandnl
57132720Skandnl ASSUMES argument is a math function with ONE parameter
58132720Skandnl
59132720Skandnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1
60132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1], [
61132720Skan  GLIBCXX_CHECK_MATH_DECL_1($1)
62132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
63132720Skan    AC_CHECK_FUNCS($1)
64132720Skan  else
65132720Skan    GLIBCXX_CHECK_MATH_DECL_1(_$1)
66132720Skan    if test x$glibcxx_cv_func__$1_use = x"yes"; then
67132720Skan      AC_CHECK_FUNCS(_$1)
68132720Skan    fi
69132720Skan  fi
70169691Skan  GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
71132720Skan])
72132720Skan
73132720Skan
74132720Skandnl
75132720Skandnl Like GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1, but does a bunch of
76132720Skandnl of functions at once.  It's an all-or-nothing check -- either
77132720Skandnl HAVE_XYZ is defined for each of the functions, or for none of them.
78132720Skandnl Doing it this way saves significant configure time.
79132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1], [
80169691Skan  define([funclist],patsubst($3,\(\w+\)\(\W*\),\1 ))dnl
81132720Skan  AC_MSG_CHECKING([for $1 functions])
82132720Skan  AC_CACHE_VAL(glibcxx_cv_func_$2_use, [
83132720Skan    AC_LANG_SAVE
84132720Skan    AC_LANG_CPLUSPLUS
85132720Skan    AC_TRY_COMPILE([#include <math.h>],
86169691Skan                   patsubst(funclist,[\w+],[\& (0);]),
87132720Skan                   [glibcxx_cv_func_$2_use=yes],
88132720Skan                   [glibcxx_cv_func_$2_use=no])
89132720Skan    AC_LANG_RESTORE])
90132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$2_use)
91132720Skan  if test x$glibcxx_cv_func_$2_use = x"yes"; then
92169691Skan    AC_CHECK_FUNCS(funclist)
93169691Skan  else
94169691Skan    AC_MSG_CHECKING([for _$1 functions])
95169691Skan    AC_CACHE_VAL(glibcxx_cv_func__$2_use, [
96169691Skan      AC_LANG_SAVE
97169691Skan      AC_LANG_CPLUSPLUS
98169691Skan      AC_TRY_COMPILE([#include <math.h>],
99169691Skan                     patsubst(funclist,[\w+],[_\& (0);]),
100169691Skan                     [glibcxx_cv_func__$2_use=yes],
101169691Skan                     [glibcxx_cv_func__$2_use=no])
102169691Skan      AC_LANG_RESTORE])
103169691Skan    AC_MSG_RESULT($glibcxx_cv_func__$2_use)
104169691Skan    if test x$glibcxx_cv_func__$2_use = x"yes"; then
105169691Skan      AC_CHECK_FUNCS(patsubst(funclist,[\w+],[_\&]))
106169691Skan    fi
107132720Skan  fi
108169691Skan  GLIBCXX_MAYBE_UNDERSCORED_FUNCS(funclist)
109169691Skan  undefine([funclist])
110132720Skan])
111132720Skan
112132720Skandnl
113132720Skandnl Check to see if the (math function) argument passed is
114132720Skandnl declared when using the c++ compiler
115132720Skandnl ASSUMES argument is a math function with TWO parameters
116132720Skandnl
117132720Skandnl GLIBCXX_CHECK_MATH_DECL_2
118132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_2], [
119132720Skan  AC_MSG_CHECKING([for $1 declaration])
120132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
121132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
122132720Skan      AC_LANG_SAVE
123132720Skan      AC_LANG_CPLUSPLUS
124132720Skan      AC_TRY_COMPILE([#include <math.h>],
125132720Skan                     [ $1(0, 0);],
126132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
127132720Skan      AC_LANG_RESTORE
128132720Skan    ])
129132720Skan  fi
130132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
131132720Skan])
132132720Skan
133132720Skandnl
134132720Skandnl Check to see if the (math function) argument passed is
135132720Skandnl 1) declared when using the c++ compiler
136132720Skandnl 2) has "C" linkage
137132720Skandnl
138132720Skandnl Define HAVE_CARGF etc if "cargf" is declared and links
139132720Skandnl
140132720Skandnl argument 1 is name of function to check
141132720Skandnl
142132720Skandnl ASSUMES argument is a math function with TWO parameters
143132720Skandnl
144132720Skandnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2
145132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2], [
146132720Skan  GLIBCXX_CHECK_MATH_DECL_2($1)
147132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
148132720Skan    AC_CHECK_FUNCS($1)
149132720Skan  else
150132720Skan    GLIBCXX_CHECK_MATH_DECL_2(_$1)
151132720Skan    if test x$glibcxx_cv_func__$1_use = x"yes"; then
152132720Skan      AC_CHECK_FUNCS(_$1)
153132720Skan    fi
154132720Skan  fi
155169691Skan  GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
156132720Skan])
157132720Skan
158132720Skan
159132720Skandnl
160132720Skandnl Check to see if the (math function) argument passed is
161132720Skandnl declared when using the c++ compiler
162132720Skandnl ASSUMES argument is a math function with THREE parameters
163132720Skandnl
164132720Skandnl GLIBCXX_CHECK_MATH_DECL_3
165132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_3], [
166132720Skan  AC_MSG_CHECKING([for $1 declaration])
167132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
168132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
169132720Skan      AC_LANG_SAVE
170132720Skan      AC_LANG_CPLUSPLUS
171132720Skan      AC_TRY_COMPILE([#include <math.h>],
172132720Skan                     [ $1(0, 0, 0);],
173132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
174132720Skan      AC_LANG_RESTORE
175132720Skan    ])
176132720Skan  fi
177132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
178132720Skan])
179132720Skan
180132720Skandnl
181132720Skandnl Check to see if the (math function) argument passed is
182132720Skandnl 1) declared when using the c++ compiler
183132720Skandnl 2) has "C" linkage
184132720Skandnl
185132720Skandnl Define HAVE_CARGF etc if "cargf" is declared and links
186132720Skandnl
187132720Skandnl argument 1 is name of function to check
188132720Skandnl
189132720Skandnl ASSUMES argument is a math function with THREE parameters
190132720Skandnl
191132720Skandnl GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3
192132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3], [
193132720Skan  GLIBCXX_CHECK_MATH_DECL_3($1)
194132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
195132720Skan    AC_CHECK_FUNCS($1)
196132720Skan  else
197132720Skan    GLIBCXX_CHECK_MATH_DECL_3(_$1)
198132720Skan    if test x$glibcxx_cv_func__$1_use = x"yes"; then
199132720Skan      AC_CHECK_FUNCS(_$1)
200132720Skan    fi
201132720Skan  fi
202169691Skan  GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
203132720Skan])
204132720Skan
205132720Skan
206132720Skandnl
207132720Skandnl Check to see if the (stdlib function) argument passed is
208132720Skandnl 1) declared when using the c++ compiler
209132720Skandnl 2) has "C" linkage
210132720Skandnl
211132720Skandnl argument 1 is name of function to check
212132720Skandnl
213132720Skandnl ASSUMES argument is a stdlib function without parameters
214132720Skandnl
215132720Skandnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0
216132720SkanAC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_0], [
217132720Skan  AC_MSG_CHECKING([for $1 declaration])
218132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
219132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
220132720Skan      AC_LANG_SAVE
221132720Skan      AC_LANG_CPLUSPLUS
222132720Skan      AC_TRY_COMPILE([#include <stdlib.h>],
223132720Skan                     [ $1();],
224132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
225132720Skan      AC_LANG_RESTORE
226132720Skan    ])
227132720Skan  fi
228132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
229132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
230132720Skan    AC_CHECK_FUNCS($1)
231132720Skan  fi
232132720Skan])
233132720Skan
234132720Skan
235132720Skandnl
236132720Skandnl Check to see if the (stdlib function) argument passed is
237132720Skandnl 1) declared when using the c++ compiler
238132720Skandnl 2) has "C" linkage
239132720Skandnl
240132720Skandnl argument 1 is name of function to check
241132720Skandnl
242146897Skandnl ASSUMES argument is a stdlib function with TWO parameters
243132720Skandnl
244132720Skandnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2
245132720SkanAC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2], [
246132720Skan  AC_MSG_CHECKING([for $1 declaration])
247132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
248132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
249132720Skan      AC_LANG_SAVE
250132720Skan      AC_LANG_CPLUSPLUS
251132720Skan      AC_TRY_COMPILE([#include <stdlib.h>],
252132720Skan                     [ $1(0, 0);],
253132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
254132720Skan      AC_LANG_RESTORE
255132720Skan    ])
256132720Skan  fi
257132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
258132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
259132720Skan    AC_CHECK_FUNCS($1)
260132720Skan  fi
261169691Skan  GLIBCXX_MAYBE_UNDERSCORED_FUNCS($1)
262132720Skan])
263132720Skan
264132720Skan
265132720Skandnl
266132720Skandnl Check to see if the (stdlib function) argument passed is
267132720Skandnl 1) declared when using the c++ compiler
268132720Skandnl 2) has "C" linkage
269132720Skandnl
270132720Skandnl argument 1 is name of function to check
271132720Skandnl
272146897Skandnl ASSUMES argument is a stdlib function with THREE parameters
273132720Skandnl
274132720Skandnl GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3
275132720SkanAC_DEFUN([GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3], [
276132720Skan  AC_MSG_CHECKING([for $1 declaration])
277132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
278132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
279132720Skan      AC_LANG_SAVE
280132720Skan      AC_LANG_CPLUSPLUS
281132720Skan      AC_TRY_COMPILE([#include <stdlib.h>],
282132720Skan                     [ $1(0, 0, 0);],
283132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
284132720Skan      AC_LANG_RESTORE
285132720Skan    ])
286132720Skan  fi
287132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
288132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
289132720Skan    AC_CHECK_FUNCS($1)
290132720Skan  fi
291132720Skan])
292132720Skan
293132720Skandnl
294132720Skandnl Because the builtins are picky picky picky about the arguments they take,
295132720Skandnl do an explict linkage tests here.
296132720Skandnl Check to see if the (math function) argument passed is
297132720Skandnl 1) declared when using the c++ compiler
298132720Skandnl 2) has "C" linkage
299132720Skandnl
300132720Skandnl Define HAVE_CARGF etc if "cargf" is declared and links
301132720Skandnl
302132720Skandnl argument 1 is name of function to check
303132720Skandnl
304132720Skandnl ASSUMES argument is a math function with ONE parameter
305132720Skandnl
306132720Skandnl GLIBCXX_CHECK_BUILTIN_MATH_DECL_LINKAGE_1
307132720SkanAC_DEFUN([GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1], [
308132720Skan  AC_MSG_CHECKING([for $1 declaration])
309132720Skan  if test x${glibcxx_cv_func_$1_use+set} != xset; then
310132720Skan    AC_CACHE_VAL(glibcxx_cv_func_$1_use, [
311132720Skan      AC_LANG_SAVE
312132720Skan      AC_LANG_CPLUSPLUS
313132720Skan      AC_TRY_COMPILE([#include <math.h>],
314132720Skan                     [ $1(0);],
315132720Skan                     [glibcxx_cv_func_$1_use=yes], [glibcxx_cv_func_$1_use=no])
316132720Skan      AC_LANG_RESTORE
317132720Skan    ])
318132720Skan  fi
319132720Skan  AC_MSG_RESULT($glibcxx_cv_func_$1_use)
320132720Skan  if test x$glibcxx_cv_func_$1_use = x"yes"; then
321132720Skan    AC_MSG_CHECKING([for $1 linkage])
322132720Skan    if test x${glibcxx_cv_func_$1_link+set} != xset; then
323132720Skan      AC_CACHE_VAL(glibcxx_cv_func_$1_link, [
324132720Skan        AC_TRY_LINK([#include <math.h>],
325132720Skan                    [ $1(0);],
326132720Skan                    [glibcxx_cv_func_$1_link=yes], [glibcxx_cv_func_$1_link=no])
327132720Skan      ])
328132720Skan    fi
329132720Skan    AC_MSG_RESULT($glibcxx_cv_func_$1_link)
330169691Skan    define([NAME], [translit([$1],[abcdefghijklmnopqrstuvwxyz],
331169691Skan    				  [ABCDEFGHIJKLMNOPQRSTUVWXYZ])])
332132720Skan    if test x$glibcxx_cv_func_$1_link = x"yes"; then
333169691Skan      AC_DEFINE([HAVE_]NAME, 1, [Define if the compiler/host combination has $1.])
334132720Skan    fi
335169691Skan    undefine([NAME])
336132720Skan  fi
337132720Skan])
338132720Skan
339132720Skan
340132720Skandnl
341132720Skandnl Check to see what builtin math functions are supported
342132720Skandnl
343132720Skandnl check for __builtin_abs
344132720Skandnl check for __builtin_fabsf
345132720Skandnl check for __builtin_fabs
346132720Skandnl check for __builtin_fabl
347132720Skandnl check for __builtin_labs
348132720Skandnl check for __builtin_sqrtf
349132720Skandnl check for __builtin_sqrtl
350132720Skandnl check for __builtin_sqrt
351132720Skandnl check for __builtin_sinf
352132720Skandnl check for __builtin_sin
353132720Skandnl check for __builtin_sinl
354132720Skandnl check for __builtin_cosf
355132720Skandnl check for __builtin_cos
356132720Skandnl check for __builtin_cosl
357132720Skandnl
358132720Skandnl GLIBCXX_CHECK_BUILTIN_MATH_SUPPORT
359132720SkanAC_DEFUN([GLIBCXX_CHECK_BUILTIN_MATH_SUPPORT], [
360132720Skan  dnl Test for builtin math functions.
361132720Skan  dnl These are made in gcc/c-common.c
362132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_abs)
363132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_fabsf)
364132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_fabs)
365132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_fabsl)
366132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_labs)
367132720Skan
368132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtf)
369132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrt)
370132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sqrtl)
371132720Skan
372132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinf)
373132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sin)
374132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_sinl)
375132720Skan
376132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_cosf)
377132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_cos)
378132720Skan  GLIBCXX_CHECK_BUILTIN_MATH_DECL_AND_LINKAGE_1(__builtin_cosl)
379132720Skan])
380132720Skan
381132720Skandnl
382132720Skandnl Check to see what the underlying c library is like
383132720Skandnl These checks need to do two things:
384132720Skandnl 1) make sure the name is declared when using the c++ compiler
385132720Skandnl 2) make sure the name has "C" linkage
386132720Skandnl This might seem like overkill but experience has shown that it's not...
387132720Skandnl
388132720Skandnl Define HAVE_STRTOLD if "strtold" is declared and links
389132720Skandnl Define HAVE_STRTOF if "strtof" is declared and links
390132720Skandnl
391132720Skandnl GLIBCXX_CHECK_STDLIB_SUPPORT
392132720SkanAC_DEFUN([GLIBCXX_CHECK_STDLIB_SUPPORT], [
393132720Skan  ac_test_CXXFLAGS="${CXXFLAGS+set}"
394132720Skan  ac_save_CXXFLAGS="$CXXFLAGS"
395132720Skan  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'
396132720Skan
397132720Skan  GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtold)
398132720Skan  GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_2(strtof)
399132720Skan
400132720Skan  CXXFLAGS="$ac_save_CXXFLAGS"
401132720Skan])
402132720Skan
403132720Skandnl
404132720Skandnl Check to see what the underlying c library or math library is like.
405132720Skandnl These checks need to do two things:
406132720Skandnl 1) make sure the name is declared when using the c++ compiler
407132720Skandnl 2) make sure the name has "C" linkage
408132720Skandnl This might seem like overkill but experience has shown that it's not...
409132720Skandnl
410132720Skandnl Define HAVE_CARGF etc if "cargf" is found.
411132720Skandnl
412132720Skandnl GLIBCXX_CHECK_MATH_SUPPORT
413132720SkanAC_DEFUN([GLIBCXX_CHECK_MATH_SUPPORT], [
414132720Skan  ac_test_CXXFLAGS="${CXXFLAGS+set}"
415132720Skan  ac_save_CXXFLAGS="$CXXFLAGS"
416132720Skan  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'
417132720Skan
418132720Skan  dnl Check libm
419132720Skan  AC_CHECK_LIB(m, sin, libm="-lm")
420132720Skan  ac_save_LIBS="$LIBS"
421132720Skan  LIBS="$LIBS $libm"
422132720Skan
423132720Skan  dnl Check to see if certain C math functions exist.
424132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinf)
425132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnan)
426132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finite)
427132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(copysign)
428132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincos)
429132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fpclass)
430132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(qfpclass)
431132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypot)
432132720Skan
433132720Skan  dnl Check to see if basic C math functions have float versions.
434132720Skan  GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float trig,
435132720Skan                                          float_trig,
436132720Skan                                          acosf asinf atanf \
437132720Skan                                          cosf sinf tanf \
438132720Skan                                          coshf sinhf tanhf)
439132720Skan  GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(float round,
440132720Skan                                          float_round,
441132720Skan                                          ceilf floorf)
442132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expf)
443132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanf)
444132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinff)
445132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2f)
446132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsf)
447132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodf)
448132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpf)
449132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotf)
450132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpf)
451132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logf)
452132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10f)
453132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modff)
454169691Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modf)
455132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powf)
456132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtf)
457132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosf)
458132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitef)
459132720Skan
460132720Skan  dnl Check to see if basic C math functions have long double versions.
461132720Skan  GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double trig,
462132720Skan                                          long_double_trig,
463132720Skan                                          acosl asinl atanl \
464132720Skan                                          cosl sinl tanl \
465132720Skan                                          coshl sinhl tanhl)
466132720Skan  GLIBCXX_CHECK_MATH_DECLS_AND_LINKAGES_1(long double round,
467132720Skan                                          long_double_round,
468132720Skan                                          ceill floorl)
469132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isnanl)
470132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(isinfl)
471132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(copysignl)
472132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(atan2l)
473132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(expl)
474132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(fabsl)
475132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(fmodl)
476132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(frexpl)
477132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(hypotl)
478132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(ldexpl)
479132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(logl)
480132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(log10l)
481132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(modfl)
482132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_2(powl)
483132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(sqrtl)
484132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_3(sincosl)
485132720Skan  GLIBCXX_CHECK_MATH_DECL_AND_LINKAGE_1(finitel)
486132720Skan
487132720Skan  LIBS="$ac_save_LIBS"
488132720Skan  CXXFLAGS="$ac_save_CXXFLAGS"
489132720Skan])
490132720Skan
491132720Skan
492132720Skandnl
493132720Skandnl Check to see if there is native support for complex
494132720Skandnl
495132720Skandnl Don't compile bits in math/* if native support exits.
496132720Skandnl
497132720Skandnl Define USE_COMPLEX_LONG_DOUBLE etc if "copysignl" is found.
498132720Skandnl
499132720Skandnl GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
500132720SkanAC_DEFUN([GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT], [
501132720Skan  dnl Check for complex versions of math functions of platform.  This will
502132720Skan  dnl always pass if libm is available, and fail if it isn't.  If it is
503132720Skan  dnl available, we assume we'll need it later, so add it to LIBS.
504132720Skan  AC_CHECK_LIB(m, main)
505132720Skan  AC_REPLACE_MATHFUNCS(copysignf)
506132720Skan
507132720Skan  dnl For __signbit to signbit conversions.
508132720Skan  dnl Not sure why this is done, as these will be macros mostly. 
509132720Skan  dnl Should probably coordinate this with std_cmath.h.
510132720Skan  AC_CHECK_FUNCS([__signbit], , [LIBMATHOBJS="$LIBMATHOBJS signbit.lo"])
511132720Skan
512132720Skan  AC_CHECK_FUNCS([__signbitf], , [LIBMATHOBJS="$LIBMATHOBJS signbitf.lo"])
513132720Skan
514132720Skan  dnl Compile the long double complex functions only if the function
515132720Skan  dnl provides the non-complex long double functions that are needed.
516132720Skan  dnl Currently this includes copysignl, which should be
517132720Skan  dnl cached from the GLIBCXX_CHECK_MATH_SUPPORT macro, above.
518132720Skan  if test x$ac_cv_func_copysignl = x"yes"; then
519132720Skan    AC_CHECK_FUNCS([__signbitl], , [LIBMATHOBJS="$LIBMATHOBJS signbitl.lo"])
520132720Skan  fi
521132720Skan
522132720Skan  # Used in libmath/Makefile.am.
523132720Skan  if test -n "$LIBMATHOBJS"; then
524132720Skan    need_libmath=yes
525132720Skan  fi
526132720Skan  AC_SUBST(LIBMATHOBJS)
527132720Skan])
528132720Skan
529132720Skan
530132720Skan# Check for functions in math library.
531132720Skan# Ulrich Drepper <drepper@cygnus.com>, 1998.
532132720Skan#
533132720Skan# This file can be copied and used freely without restrictions.  It can
534132720Skan# be used in projects which are not available under the GNU Public License
535132720Skan# but which still want to provide support for the GNU gettext functionality.
536132720Skan# Please note that the actual code is *not* freely available.
537132720Skan#
538132720Skan# serial 1
539132720Skan#
540132720Skandnl AC_REPLACE_MATHFUNCS(FUNCTION...)
541132720SkanAC_DEFUN([AC_REPLACE_MATHFUNCS],
542132720Skan[AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])])
543