Move the thrice-repeated "64bitint is buggy?" test from hints to Configure.
authorH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Thu, 29 Aug 2013 07:32:21 +0000 (09:32 +0200)
committerH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Thu, 29 Aug 2013 07:32:21 +0000 (09:32 +0200)
Backport 16e6698bf53cbe5099ca8f3

OpenBSD and its two* forks each have the same "is 64 bit int support buggy?"
test code as a callback unit duplicated in their hints files. As the code is
portable C, there seems to be no harm in moving it to Configure, and running
the test on all platforms. This reduces code duplication, and will reduce it
further if another OpenBSD fork appears.

* This week.

U/perl/use64bits.U

index 0b5e971..3a96dc8 100644 (file)
@@ -6,7 +6,7 @@
 ?RCS: License or the Artistic License, as specified in the README file.
 ?RCS:
 ?MAKE:use64bitint use64bitall archname64: Myread Oldconfig Setvar test \
-       usemorebits longsize ccflags d_quad
+       usemorebits longsize ccflags d_quad uquadtype Compile rm_try
 ?MAKE: -pick add $@ %<
 ?Y:TOP
 ?S:use64bitint:
@@ -64,6 +64,8 @@
 ?LINT:extern use64bitints
 ?LINT:extern use64bitsint
 ?LINT:extern use64bitsall
+?T:libcquad
+?F:!try
 ?F:!use64bitint.cbu
 ?F:!use64bitall.cbu
 : Do we want 64bit support
@@ -213,6 +215,59 @@ if $test -f use64bitint.cbu; then
 fi
 case "$use64bitint" in
 "$define"|true|[yY]*)
+       : This test was common to all the OpenBSD forks, and seems harmless for
+       : other platforms:
+       echo " "
+       echo "Checking if your C library has broken 64-bit functions..." >&4
+       cat >try.c <<EOCP
+#include <stdio.h>
+typedef $uquadtype myULL;
+int main (void)
+{
+    struct {
+       double d;
+       myULL  u;
+    } *p, test[] = {
+       {4294967303.15, 4294967303ULL},
+       {4294967294.2,  4294967294ULL},
+       {4294967295.7,  4294967295ULL},
+       {0.0, 0ULL}
+    };
+    for (p = test; p->u; p++) {
+       myULL x = (myULL)p->d;
+       if (x != p->u) {
+           printf("buggy\n");
+           return 0;
+       }
+    }
+    printf("ok\n");
+    return 0;
+}
+EOCP
+       set try
+       if eval $compile_ok; then
+           libcquad=`./try`
+           echo "Your C library's 64-bit functions are $libcquad."
+       else
+           echo "(I can't seem to compile the test program.)"
+           echo "Assuming that your C library's 64-bit functions are ok."
+           libcquad="ok"
+       fi
+       $rm_try
+
+       case "$libcquad" in
+           buggy*)
+               cat >&4 <<EOM
+
+*** You have a C library with broken 64-bit functions.
+*** 64-bit support does not work reliably in this configuration.
+*** Please rerun Configure without -Duse64bitint and/or -Dusemorebits.
+*** Cannot continue, aborting.
+
+EOM
+               exit 1
+               ;;
+       esac
        case "$longsize" in
        4) case "$archname64" in
           '') archname64=64int ;;