This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Configure: scan for truncl.
[metaconfig.git] / U / perl / d_modfl.U
1 ?RCS: $Id$
2 ?RCS:
3 ?RCS: Copyright (c) 2000 Jarkko Hietaniemi
4 ?RCS:
5 ?RCS: You may distribute under the terms of either the GNU General Public
6 ?RCS: License or the Artistic License, as specified in the README file.
7 ?RCS:
8 ?MAKE:d_modfl d_modflproto d_modfl_pow32_bug: Inlibc Compile Hasproto cat \
9         rm_try test sPRIfldbl d_longdbl osname gccversion ccflags run \
10         uselongdouble i_math \
11         d_sqrtl d_aintl d_copysignl d_ilogbl d_scalbnl d_frexpl d_ldexpl \
12         d_truncl
13 ?MAKE:  -pick add $@ %<
14 ?S:d_modfl:
15 ?S:     This variable conditionally defines the HAS_MODFL symbol, which
16 ?S:     indicates to the C program that the modfl() routine is available.
17 ?S:.
18 ?S:d_modflproto:
19 ?S:     This symbol, if defined, indicates that the system provides
20 ?S:     a prototype for the modfl() function.  Otherwise, it is up
21 ?S:     to the program to supply one.  C99 says it should be
22 ?S:             long double modfl(long double, long double *);
23 ?S:.
24 ?S:d_modfl_pow32_bug:
25 ?S:     This variable conditionally defines the HAS_MODFL_POW32_BUG symbol,
26 ?S:     which indicates that modfl() is broken for long doubles >= pow(2, 32).
27 ?S:     For example from 4294967303.150000 one would get 4294967302.000000
28 ?S:     and 1.150000.  The bug has been seen in certain versions of glibc,
29 ?S:     release 2.2.2 is known to be okay.
30 ?S:.
31 ?C:HAS_MODFL:
32 ?C:     This symbol, if defined, indicates that the modfl routine is
33 ?C:     available to split a long double x into a fractional part f and
34 ?C:     an integer part i such that |f| < 1.0 and (f + i) = x.
35 ?C:.
36 ?C:HAS_MODFL_PROTO:
37 ?C:     This symbol, if defined, indicates that the system provides
38 ?C:     a prototype for the modfl() function.  Otherwise, it is up
39 ?C:     to the program to supply one.
40 ?C:.
41 ?C:HAS_MODFL_POW32_BUG:
42 ?C:     This symbol, if defined, indicates that the modfl routine is
43 ?C:     broken for long doubles >= pow(2, 32).
44 ?C:     For example from 4294967303.150000 one would get 4294967302.000000
45 ?C:     and 1.150000.  The bug has been seen in certain versions of glibc,
46 ?C:     release 2.2.2 is known to be okay.
47 ?C:.
48 ?H:#$d_modfl HAS_MODFL          /**/
49 ?H:#$d_modflproto HAS_MODFL_PROTO               /**/
50 ?H:#$d_modfl_pow32_bug HAS_MODFL_POW32_BUG              /**/
51 ?H:.
52 ?T:foo saveccflags message
53 ?F:!try
54 ?LINT:set d_modflproto
55 ?LINT:change ccflags
56 : see if modfl exists
57 set modfl d_modfl
58 eval $inlibc
59
60 : see if prototype for modfl is available
61 echo " "
62 set d_modflproto modfl $i_math math.h
63 eval $hasproto
64
65 d_modfl_pow32_bug="$undef"
66
67 case "$d_longdbl$d_modfl" in
68 $define$define)
69         $cat <<EOM
70 Checking to see whether your modfl() is okay for large values...
71 EOM
72 $cat >try.c <<EOCP
73 #include <math.h>
74 #include <stdio.h>
75 EOCP
76 if $test "X$d_modflproto" != "X$define"; then
77         $cat >>try.c <<EOCP
78 /* Sigh. many current glibcs provide the function, but do not prototype it. */
79 long double modfl (long double, long double *);
80 EOCP
81 fi
82 $cat >>try.c <<EOCP
83 int main() {
84     long double nv = 4294967303.15;
85     long double v, w;
86     v = modfl(nv, &w);
87 #ifdef __GLIBC__
88     printf("glibc");
89 #endif
90     printf(" %"$sPRIfldbl" %"$sPRIfldbl" %"$sPRIfldbl"\n", nv, v, w);
91     return 0;
92 }
93 EOCP
94         case "$osname:$gccversion" in
95         aix:)   saveccflags="$ccflags"
96                 ccflags="$ccflags -qlongdouble" ;; # to avoid core dump
97         esac
98         set try
99         if eval $compile; then
100                 foo=`$run ./try`
101                 case "$foo" in
102                 *" 4294967303.150000 1.150000 4294967302.000000")
103                         echo >&4 "Your modfl() is broken for large values."
104                         d_modfl_pow32_bug="$define"
105                         case "$foo" in
106                         glibc)  echo >&4 "You should upgrade your glibc to at least 2.2.2 to get a fixed modfl()."
107                         ;;
108                         esac
109                         ;;
110                 *" 4294967303.150000 0.150000 4294967303.000000")
111                         echo >&4 "Your modfl() seems okay for large values."
112                         ;;
113                 *)      echo >&4 "I don't understand your modfl() at all."
114                         d_modfl="$undef"
115                         ;;
116                 esac
117                 $rm_try
118         else
119                 echo "I cannot figure out whether your modfl() is okay, assuming it isn't."
120                 d_modfl="$undef"
121         fi
122         case "$osname:$gccversion" in
123         aix:)   ccflags="$saveccflags" ;; # restore
124         esac
125         ;;
126 esac
127
128 if $test "$uselongdouble" = "$define"; then
129     message=""
130     if $test "$d_sqrtl" != "$define"; then
131         message="$message sqrtl"
132     fi
133     if $test "$d_modfl" != "$define"; then
134         if $test "$d_truncl:$d_copysignl" = "$define:$define"; then
135             echo "You have both truncl and copysignl, so I can emulate modfl."
136         else
137             if $test "$d_aintl:$d_copysignl" = "$define:$define"; then
138                 echo "You have both aintl and copysignl, so I can emulate modfl."
139             else
140                 message="$message modfl"
141             fi
142         fi
143     fi
144     if $test "$d_frexpl" != "$define"; then
145         if $test "$d_ilogbl:$d_scalbnl" = "$define:$define"; then
146             echo "You have both ilogbl and scalbnl, so I can emulate frexpl."
147         else
148             message="$message frexpl"
149         fi
150     fi
151     if $test "$d_ldexpl" != "$define"; then
152         message="$message ldexpl"
153     fi
154
155     if $test "$message" != ""; then
156         $cat <<EOM >&4
157
158 *** You requested the use of long doubles but you do not seem to have
159 *** the following mathematical functions needed for long double support:
160 ***    $message
161 *** Please rerun Configure without -Duselongdouble and/or -Dusemorebits.
162 *** Cannot continue, aborting.
163
164 EOM
165
166         exit 1
167     fi
168 fi
169