]> www.ginac.de Git - cln.git/blob - m4/gmp.m4
Finalize CLN 1.3.5 release.
[cln.git] / m4 / gmp.m4
1 dnl -*- Autoconf -*-
2 dnl Copyright (C) 1993-2008 Free Software Foundation, Inc.
3 dnl This file is free software, distributed under the terms of the GNU
4 dnl General Public License.  As a special exception to the GNU General
5 dnl Public License, this file may be distributed as part of a program
6 dnl that contains a configuration script generated by Autoconf, under
7 dnl the same distribution terms as the rest of that program.
8
9 dnl From Richard B. Kreckel.
10
11 AC_PREREQ(2.13)
12
13 dnl Is the gmp header file new enough? (should be implemented with an argument)
14 AC_DEFUN([CL_GMP_H_VERSION],
15 [AC_CACHE_CHECK([for recent enough gmp.h], cl_cv_new_gmp_h, [
16   AC_TRY_CPP([#include <gmp.h>
17 #if !defined(__GNU_MP_VERSION) || (__GNU_MP_VERSION < 3)
18  #error "ancient gmp.h"
19 #endif],
20 cl_cv_new_gmp_h="yes", cl_cv_new_gmp_h="no")
21 ])])dnl
22
23 dnl Does libgmp provide some functionality introduced in version 3.0?
24 AC_DEFUN([CL_GMP_CHECK],
25 [AC_CACHE_CHECK([for working libgmp], cl_cv_new_libgmp, [
26     SAVELIBS=$LIBS
27     LIBS="$LIBS -lgmp"
28     AC_TRY_LINK([#include <gmp.h>],[mpn_divexact_by3(0,0,0)],
29 cl_cv_new_libgmp="yes", cl_cv_new_libgmp="no")
30     LIBS=$SAVELIBS])
31     if test "$cl_cv_new_libgmp" = yes; then
32       LIBS="$LIBS -lgmp"
33     fi
34 ])
35
36 dnl What is sizeof(mp_limb_t)?  (It has to match sizeof(uintD) later.)
37 AC_DEFUN([CL_GMP_SET_UINTD],
38 [AC_CACHE_CHECK([how large gmp demands uintD to be], cl_cv_gmp_set_uintd, [
39     dnl Note: we don't run any of compiled programs here, so this method
40     dnl both works for native and cross compilation
41     cl_gmp_demands="UNKNOWN"
42     cl_gmp_has_nails="no"
43     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gmp.h>
44          template<bool COND> struct Static_Assert;
45          template<> struct Static_Assert<true> { };
46          #if defined(__GMP_BITS_PER_MP_LIMB)
47          Static_Assert<8*sizeof(mp_limb_t) == __GMP_BITS_PER_MP_LIMB> check;
48          #endif]], [[]])], [], [cl_gmp_has_nails="yes"])
49     if test "x$cl_gmp_has_nails" = "xyes"; then
50         AC_MSG_ERROR([nails in MP libms are unsupported.])
51     fi
52     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gmp.h>
53          template<bool COND> struct Static_Assert;
54          template<> struct Static_Assert<true> { };
55          Static_Assert<(sizeof(mp_limb_t) > sizeof(long))> check;]], [[]])],
56          [cl_gmp_demands='GMP_DEMANDS_UINTD_LONG_LONG'], [])
57     if test "x$cl_gmp_demands" = "xUNKNOWN"; then
58         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gmp.h>
59              template<bool COND> struct Static_Assert;
60              template<> struct Static_Assert<true> { };
61              Static_Assert<sizeof(mp_limb_t) == sizeof(long)> check;]], [[]])],
62              [cl_gmp_demands='GMP_DEMANDS_UINTD_LONG'], [])
63     fi
64     if test "x$cl_gmp_demands" = "xUNKNOWN"; then
65         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
66              #include <gmp.h>
67              template<bool COND> struct Static_Assert;
68              template<> struct Static_Assert<true> { };
69              Static_Assert<sizeof(mp_limb_t) == sizeof(int)> check;]], [[]])],
70              [cl_gmp_demands='GMP_DEMANDS_UINTD_INT'], [])
71     fi
72     if test "x$cl_gmp_demands" = "xUNKNOWN"; then
73         AC_MSG_ERROR([Don't know which C-type has sizeof(mp_limb_t)])
74     else
75         cl_cv_gmp_set_uintd="$cl_gmp_demands"
76     fi 
77     ])
78 AC_DEFINE_UNQUOTED($cl_cv_gmp_set_uintd)
79 ])
80
81 dnl Whether or not to use GMP. Sets CL_USE_GMP.
82 dnl Also sets CPPFLAGS, LDFLAGS if --with-gmp=DIR was specified.
83 AC_DEFUN([CL_LIBGMP],
84 [AC_ARG_WITH(gmp, AS_HELP_STRING([--with-gmp@<:@=DIR@:>@],
85   [use external low-level functions from GNU MP (installed in prefix DIR) @<:@default=yes@:>@.]),[
86     with_gmp="$withval"
87   ],
88   with_gmp="yes")
89 case $with_gmp in
90   yes)
91     dnl --with-gmp
92     CL_GMP_H_VERSION
93     if test "$cl_cv_new_gmp_h" = yes; then
94       CL_GMP_CHECK
95       if test "$cl_cv_new_libgmp" = yes; then
96         CL_GMP_SET_UINTD
97         AC_DEFINE(CL_USE_GMP, 1, [Define if GNU MP library is available])
98       else
99         AC_MSG_WARN([The GNU MP library is too old to be used.])
100       fi
101     else
102       AC_MSG_WARN([The header file <gmp.h> is too old to be used.])
103     fi
104   ;;
105   no)
106     dnl --without-gmp
107   ;;
108   *)
109     dnl --with-gmp=DIR
110     case $withval in
111       [[\\/$]]* | ?:[[\\/]]* )
112       ;;
113       *) AC_MSG_ERROR([expected an absolute directory name for --with-gmp: $withval])
114       ;;
115     esac
116     saved_CPPFLAGS="$CPPFLAGS"
117     CPPFLAGS="$CPPFLAGS -I${withval}/include"
118     saved_LDFLAGS="$LDFLAGS"
119     LDFLAGS="$LDFLAGS -L${withval}/lib"
120     AC_LIB_LINKFLAGS_FROM_LIBS([GMP_RPATH_CFG], [$LDFLAGS])
121     LDFLAGS="$GMP_RPATH_CFG $LDFLAGS"
122     AC_MSG_NOTICE([Using "\"$LDFLAGS\"" rpath to link with GMP])
123     CL_GMP_H_VERSION
124     if test "$cl_cv_new_gmp_h" = yes; then
125       CL_GMP_CHECK
126       if test "$cl_cv_new_libgmp" = yes; then
127         CL_GMP_SET_UINTD
128         AC_DEFINE(CL_USE_GMP)
129       else
130         AC_MSG_WARN([The GNU MP library is too old to be used.])
131         CPPFLAGS="$saved_CPPFLAGS"
132         LDFLAGS="$saved_LDFLAGS"
133       fi
134     else
135       AC_MSG_WARN([The header file <gmp.h> is too old to be used.])
136       CPPFLAGS="$saved_CPPFLAGS"
137       LDFLAGS="$saved_LDFLAGS"
138     fi
139   ;;
140 esac
141 ])