From 1cffe6208b382817fb72ed269b03943ccd88b5d8 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Tue, 1 Jun 2010 09:45:08 +0200 Subject: [PATCH] Configure: be more cross-compilation friendly. Rewrite CL_GMP_SET_UINTD so it works for cross-compilation too. --- m4/gmp.m4 | 67 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/m4/gmp.m4 b/m4/gmp.m4 index e0e5ef3..455c200 100644 --- a/m4/gmp.m4 +++ b/m4/gmp.m4 @@ -36,33 +36,46 @@ cl_cv_new_libgmp="yes", cl_cv_new_libgmp="no") dnl What is sizeof(mp_limb_t)? (It has to match sizeof(uintD) later.) AC_DEFUN([CL_GMP_SET_UINTD], [AC_CACHE_CHECK([how large gmp demands uintD to be], cl_cv_gmp_set_uintd, [ - AC_TRY_RUN([#include -#include -int main() { - FILE *f=fopen("conftestval", "w"); - if (!f) return(255); - if (sizeof(mp_limb_t) > sizeof(long)) - fprintf(f, "long long"); - else if (sizeof(mp_limb_t) == sizeof(long)) - fprintf(f, "long"); - else if (sizeof(mp_limb_t) == sizeof(int)) - fprintf(f, "int"); - else return(sizeof(mp_limb_t)); -#if defined(__GMP_BITS_PER_MP_LIMB) - /* Is there a nail in a limb? */ - if (8*sizeof(mp_limb_t)!=__GMP_BITS_PER_MP_LIMB) - return(254); -#endif - return(0); -}], cl_cv_gmp_set_uintd=`cat conftestval` - cl_gmp_demands="GMP_DEMANDS_UINTD_`echo ${cl_cv_gmp_set_uintd} | sed -e 'y/ gilnot/_GILNOT/'`", - gmp_retval="$ac_status" - if test x$gmp_retval = "x255"; then AC_MSG_ERROR([error opening output file.]); fi - if test x$gmp_retval = "x254"; then AC_MSG_ERROR([nails in MP limbs are unsupported.]); fi - AC_MSG_ERROR([Don't know which C-type has sizeof $gmp_retval.]), - AC_MSG_ERROR([cross-compiling - cannot determine])) -]) -AC_DEFINE_UNQUOTED($cl_gmp_demands) + dnl Note: we don't run any of compiled programs here, so this method + dnl both works for native and cross compilation + cl_gmp_demands="UNKNOWN" + cl_gmp_has_nails="no" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + template struct Static_Assert; + template<> struct Static_Assert { }; + #if defined(__GMP_BITS_PER_MP_LIMB) + Static_Assert<8*sizeof(mp_limb_t) == __GMP_BITS_PER_MP_LIMB> check; + #endif]], [[]])], [], [cl_gmp_has_nails="yes"]) + if test "x$cl_gmp_has_nails" = "xyes"; then + AC_MSG_ERROR([nails in MP libms are unsupported.]) + fi + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + template struct Static_Assert; + template<> struct Static_Assert { }; + Static_Assert sizeof(long)> check;]], [[]])], + [cl_gmp_demands='GMP_DEMANDS_UINTD_LONG_LONG'], []) + if test "x$cl_gmp_demands" = "xUNKNOWN"; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + template struct Static_Assert; + template<> struct Static_Assert { }; + Static_Assert check;]], [[]])], + [cl_gmp_demands='GMP_DEMANDS_UINTD_LONG'], []) + fi + if test "x$cl_gmp_demands" = "xUNKNOWN"; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + template struct Static_Assert; + template<> struct Static_Assert { }; + Static_Assert check;]], [[]])], + [cl_gmp_demands='GMP_DEMANDS_UINTD_INT'], []) + fi + if test "x$cl_gmp_demands" = "xUNKNOWN"; then + AC_MSG_ERROR([Don't know which C-type has sizeof(mp_limb_t)]) + else + cl_cv_gmp_set_uintd="$cl_gmp_demands" + fi + ]) +AC_DEFINE_UNQUOTED($cl_cv_gmp_set_uintd) ]) dnl Whether or not to use GMP. Sets CL_USE_GMP.