int main (void) { unsigned long c; mp_limb_t t[4] = { -1, -1, -1, -1 }; #if defined(__cplusplus) printf ("A C++ compiler is used.\n"); #endif printf ("GMP ..... Library: %-12s Header: %d.%d.%d\n", gmp_version, __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL); printf ("MPFR .... Library: %-12s Header: %s (based on %d.%d.%d)\n", mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR, MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL); printf ("MPFR patches: %s\n\n", mpfr_get_patches ()); #ifdef __GMP_CC printf ("__GMP_CC = \"%s\"\n", __GMP_CC); #endif #ifdef __GMP_CFLAGS printf ("__GMP_CFLAGS = \"%s\"\n", __GMP_CFLAGS); #endif printf ("GMP_LIMB_BITS = %d\n", (int) GMP_LIMB_BITS); printf ("GMP_NAIL_BITS = %d\n", (int) GMP_NAIL_BITS); printf ("GMP_NUMB_BITS = %d\n", (int) GMP_NUMB_BITS); printf ("mp_bits_per_limb = %d\n", (int) mp_bits_per_limb); printf ("sizeof(mp_limb_t) = %d\n", (int) sizeof(mp_limb_t)); if (mp_bits_per_limb != GMP_LIMB_BITS) printf ("Warning! mp_bits_per_limb != GMP_LIMB_BITS\n"); if (GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT) printf ("Warning! GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT\n"); c = mpn_popcount (t, 1); printf ("The GMP library expects %lu bits in a mp_limb_t.\n", c); if (c != GMP_LIMB_BITS) printf ("Warning! This is different from GMP_LIMB_BITS!\n" "Different ABI caused by a GMP library upgrade?\n"); failure_test (); return 0; }
int main (void) { unsigned long c; mp_limb_t t[4] = { -1, -1, -1, -1 }; #if defined(__cplusplus) printf ("A C++ compiler is used.\n"); #endif printf ("GMP ..... Library: %-12s Header: %d.%d.%d\n", gmp_version, __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL); printf ("MPFR .... Library: %-12s Header: %s (based on %d.%d.%d)\n", mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR, MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL); #if MPFR_VERSION_MAJOR >= 3 printf ("MPFR features: TLS = %s, decimal = %s", mpfr_buildopt_tls_p () ? "yes" : "no", mpfr_buildopt_decimal_p () ? "yes" : "no"); # if MPFR_VERSION_MAJOR > 3 || MPFR_VERSION_MINOR >= 1 printf (", GMP internals = %s\nMPFR tuning: %s", mpfr_buildopt_gmpinternals_p () ? "yes" : "no", mpfr_buildopt_tune_case ()); # endif printf ("\n"); #endif printf ("MPFR patches: %s\n\n", mpfr_get_patches ()); #ifdef __GMP_CC printf ("__GMP_CC = \"%s\"\n", __GMP_CC); #endif #ifdef __GMP_CFLAGS printf ("__GMP_CFLAGS = \"%s\"\n", __GMP_CFLAGS); #endif printf ("GMP_LIMB_BITS = %d\n", (int) GMP_LIMB_BITS); printf ("GMP_NAIL_BITS = %d\n", (int) GMP_NAIL_BITS); printf ("GMP_NUMB_BITS = %d\n", (int) GMP_NUMB_BITS); printf ("mp_bits_per_limb = %d\n", (int) mp_bits_per_limb); printf ("sizeof(mp_limb_t) = %d\n", (int) sizeof(mp_limb_t)); if (mp_bits_per_limb != GMP_LIMB_BITS) printf ("Warning! mp_bits_per_limb != GMP_LIMB_BITS\n"); if (GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT) printf ("Warning! GMP_LIMB_BITS != sizeof(mp_limb_t) * CHAR_BIT\n"); c = mpn_popcount (t, 1); printf ("The GMP library expects %lu bits in a mp_limb_t.\n", c); if (c != GMP_LIMB_BITS) printf ("Warning! This is different from GMP_LIMB_BITS!\n" "Different ABI caused by a GMP library upgrade?\n"); printf ("\n"); printf ("sizeof(mpfr_prec_t) = %d (%s type)\n", (int) sizeof(mpfr_prec_t), SIGNED_STR((mpfr_prec_t) -1)); #if MPFR_VERSION_MAJOR >= 3 printf ("sizeof(mpfr_exp_t) = %d (%s type)\n", (int) sizeof(mpfr_exp_t), SIGNED_STR((mpfr_exp_t) -1)); #endif #ifdef _MPFR_PREC_FORMAT printf ("_MPFR_PREC_FORMAT = %d\n", (int) _MPFR_PREC_FORMAT); #endif /* Note: "long" is sufficient for all current _MPFR_PREC_FORMAT values (1, 2, 3). Thus we do not need to depend on ISO C99 or later. */ printf ("MPFR_PREC_MIN = %ld (%s)\n", (long) MPFR_PREC_MIN, SIGNED (MPFR_PREC_MIN)); printf ("MPFR_PREC_MAX = %ld (%s)\n", (long) MPFR_PREC_MAX, SIGNED (MPFR_PREC_MAX)); #ifdef _MPFR_EXP_FORMAT printf ("_MPFR_EXP_FORMAT = %d\n", (int) _MPFR_EXP_FORMAT); #endif printf ("sizeof(mpfr_t) = %d\n", (int) sizeof(mpfr_t)); failure_test (); return 0; }
static void patches (void) { const char *p = mpfr_get_patches (); printf ("MPFR patches: %s\n", p[0] ? p : "[none]"); }
int main (void) { char buffer[256]; int err = 0; #ifdef __MPIR_VERSION printf ("[tversion] MPIR: header %d.%d.%d, library %s\n", __MPIR_VERSION, __MPIR_VERSION_MINOR, __MPIR_VERSION_PATCHLEVEL, mpir_version); #else printf ("[tversion] GMP: header %d.%d.%d, library %s\n", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL, gmp_version); #endif if (strcmp (mpfr_buildopt_tune_case (), MPFR_TUNE_CASE) != 0) { printf ("ERROR! mpfr_buildopt_tune_case() and MPFR_TUNE_CASE" " do not match!\n %s\n %s\n", mpfr_buildopt_tune_case (), MPFR_TUNE_CASE); err = 1; } else printf ("[tversion] MPFR tuning parameters from %s\n", MPFR_TUNE_CASE); if (strcmp (mpfr_get_patches (), "") != 0) printf ("[tversion] MPFR patches: %s\n", mpfr_get_patches ()); /* Test the MPFR version. */ test_version (); sprintf (buffer, "%d.%d.%d", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL); if (strcmp (buffer, gmp_version) == 0) return err; if (__GNU_MP_VERSION_PATCHLEVEL == 0) { sprintf (buffer, "%d.%d", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR); if (strcmp (buffer, gmp_version) == 0) return err; } /* In some cases, it may be acceptable to have different versions for the header and the library, in particular when shared libraries are used (e.g., after a bug-fix upgrade of the library, and versioning ensures that this can be done only when the binary interface is compatible). However, when recompiling software like here, this should never happen (except if GMP has been upgraded between two "make check" runs, but there's no reason for that). A difference between the versions of gmp.h and libgmp probably indicates either a bad configuration or some other inconsistency in the development environment, and it is better to fail (in particular for automatic installations). */ printf ("ERROR! The versions of gmp.h (%s) and libgmp (%s) do not " "match.\nThe possible causes are:\n", buffer, gmp_version); printf (" * A bad configuration in your include/library search paths.\n" " * An inconsistency in the include/library search paths of\n" " your development environment; an example:\n" " http://gcc.gnu.org/ml/gcc-help/2010-11/msg00359.html\n" " * GMP has been upgraded after the first \"make check\".\n" " In such a case, try again after a \"make clean\".\n" " * A new or non-standard version naming is used in GMP.\n" " In this case, a patch may already be available on the\n" " MPFR web site. Otherwise please report the problem.\n"); printf ("In the first two cases, this may lead to errors, in particular" " with MPFR.\nIf some other tests fail, please solve that" " problem first.\n"); return 1; }
int main (void) { int err = 0; /* Test the GMP and MPFR versions. */ if (test_version ()) exit (1); printf ("[tversion] MPFR %s\n", MPFR_VERSION_STRING); /* TODO: We may want to output info for non-GNUC-compat compilers too. See: * http://sourceforge.net/p/predef/wiki/Compilers/ * http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros * * For ICC, do not check the __ICC macro as it is obsolete and not always * defined. */ #define COMP "[tversion] Compiler: " #ifdef __INTEL_COMPILER # ifdef __VERSION__ # define ICCV " [" __VERSION__ "]" # else # define ICCV "" # endif printf (COMP "ICC %d.%d.%d" ICCV "\n", __INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE); #elif (defined(__GNUC__) || defined(__clang__)) && defined(__VERSION__) # ifdef __clang__ # define COMP2 COMP # else # define COMP2 COMP "GCC " # endif printf (COMP2 "%s\n", __VERSION__); #endif /************** More information about the C implementation **************/ /* The following macros are currently used by src/mpfr-cvers.h and/or src/mpfr-impl.h; they may have an influcence on how MPFR is compiled. */ #if defined(__STDC__) || defined(__STDC_VERSION__) printf ("[tversion] C standard: __STDC__ = " #if defined(__STDC__) MAKE_STR(__STDC__) #else "undef" #endif ", __STDC_VERSION__ = " #if defined(__STDC_VERSION__) MAKE_STR(__STDC_VERSION__) #else "undef" #endif "\n"); #endif #if defined(__GNUC__) printf ("[tversion] __GNUC__ = " MAKE_STR(__GNUC__) ", __GNUC_MINOR__ = " #if defined(__GNUC_MINOR__) MAKE_STR(__GNUC_MINOR__) #else "undef" #endif "\n"); #endif #if defined(__ICC) || defined(__INTEL_COMPILER) printf ("[tversion] Intel compiler: __ICC = " #if defined(__ICC) MAKE_STR(__ICC) #else "undef" #endif ", __INTEL_COMPILER = " #if defined(__INTEL_COMPILER) MAKE_STR(__INTEL_COMPILER) #else "undef" #endif "\n"); #endif #if defined(_WIN32) || defined(_MSC_VER) printf ("[tversion] MS Windows: _WIN32 = " #if defined(_WIN32) MAKE_STR(_WIN32) #else "undef" #endif ", _MSC_VER = " #if defined(_MSC_VER) MAKE_STR(_MSC_VER) #else "undef" #endif "\n"); #endif #if defined(__GLIBC__) printf ("[tversion] __GLIBC__ = " MAKE_STR(__GLIBC__) ", __GLIBC_MINOR__ = " #if defined(__GLIBC_MINOR__) MAKE_STR(__GLIBC_MINOR__) #else "undef" #endif "\n"); #endif /*************************************************************************/ #ifdef __MPIR_VERSION printf ("[tversion] MPIR: header %d.%d.%d, library %s\n", __MPIR_VERSION, __MPIR_VERSION_MINOR, __MPIR_VERSION_PATCHLEVEL, mpir_version); #else #ifdef MPFR_USE_MINI_GMP printf ("[tversion] mini-gmp\n"); #else printf ("[tversion] GMP: header %d.%d.%d, library %s\n", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL, gmp_version); #endif #endif /* The following output is also useful under Unix, where one should get: WinDLL: __GMP_LIBGMP_DLL = 0, MPFR_WIN_THREAD_SAFE_DLL = undef If this is not the case, something is probably broken. We cannot test automatically as some MS Windows implementations may declare some Unix (POSIX) compatibility; for instance, Cygwin32 defines __unix__ (but Cygwin64 does not, probably because providing both MS Windows API and POSIX API is not possible with a 64-bit ABI, since MS Windows is LLP64 and Unix is LP64). */ printf ("[tversion] WinDLL: __GMP_LIBGMP_DLL = " #if defined(__GMP_LIBGMP_DLL) MAKE_STR(__GMP_LIBGMP_DLL) #else "undef" #endif ", MPFR_WIN_THREAD_SAFE_DLL = " #if defined(MPFR_WIN_THREAD_SAFE_DLL) MAKE_STR(MPFR_WIN_THREAD_SAFE_DLL) #else "undef" #endif "\n"); if ( #ifdef MPFR_USE_THREAD_SAFE ! #endif mpfr_buildopt_tls_p ()) { printf ("ERROR! mpfr_buildopt_tls_p() and macros" " do not match!\n"); err = 1; } if ( #ifdef MPFR_WANT_FLOAT128 ! #endif mpfr_buildopt_float128_p ()) { printf ("ERROR! mpfr_buildopt_float128_p() and macros" " do not match!\n"); err = 1; } if ( #ifdef MPFR_WANT_DECIMAL_FLOATS ! #endif mpfr_buildopt_decimal_p ()) { printf ("ERROR! mpfr_buildopt_decimal_p() and macros" " do not match!\n"); err = 1; } if ( #if defined(MPFR_HAVE_GMP_IMPL) || defined(WANT_GMP_INTERNALS) ! #endif mpfr_buildopt_gmpinternals_p ()) { printf ("ERROR! mpfr_buildopt_gmpinternals_p() and macros" " do not match!\n"); err = 1; } printf ("[tversion] TLS = %s, float128 = %s, decimal = %s," " GMP internals = %s\n", mpfr_buildopt_tls_p () ? "yes" : "no", mpfr_buildopt_float128_p () ? "yes" : "no", mpfr_buildopt_decimal_p () ? "yes" : "no", mpfr_buildopt_gmpinternals_p () ? "yes" : "no"); printf ("[tversion] intmax_t = " #if defined(_MPFR_H_HAVE_INTMAX_T) "yes" #else "no" #endif ", printf = " #if defined(HAVE_STDARG) && !defined(MPFR_USE_MINI_GMP) "yes" #else "no" #endif "\n"); printf ("[tversion] gmp_printf: hhd = " #if defined(NPRINTF_HH) "no" #else "yes" #endif ", lld = " #if defined(NPRINTF_LL) "no" #else "yes" #endif ", jd = " #if defined(NPRINTF_J) "no" #else "yes" #endif ", td = " #if defined(NPRINTF_T) "no" #elif defined(PRINTF_T) "yes" #else "?" #endif ", Ld = " #if defined(NPRINTF_L) "no" #elif defined(PRINTF_L) "yes" #else "?" #endif "\n"); if (strcmp (mpfr_buildopt_tune_case (), MPFR_TUNE_CASE) != 0) { printf ("ERROR! mpfr_buildopt_tune_case() and MPFR_TUNE_CASE" " do not match!\n %s\n %s\n", mpfr_buildopt_tune_case (), MPFR_TUNE_CASE); err = 1; } else printf ("[tversion] MPFR tuning parameters from %s\n", MPFR_TUNE_CASE); if (strcmp (mpfr_get_patches (), "") != 0) printf ("[tversion] MPFR patches: %s\n", mpfr_get_patches ()); tests_start_mpfr (); if (locale != NULL) printf ("[tversion] Locale: %s\n", locale); /* The memory limit should not be changed for "make check". The warning below signals a possible user mistake. Do not use "%zu" because it is not available in C90; the type mpfr_ueexp_t should be sufficiently large. */ if (tests_memory_limit != DEFAULT_MEMORY_LIMIT) printf ("[tversion] Warning! Memory limit changed to %" MPFR_EXP_FSPEC "u\n", (mpfr_ueexp_t) tests_memory_limit); tests_end_mpfr (); return err; }