                        Installing MPFR
                        ===============

Note: In case of problem, please read this INSTALL file carefully before
reporting a bug, in particular Section "In case of problem" below. Some
problems are due to bad configuration on the user side (not specific to
MPFR).

0. You first need to install GMP. See <http://www.gnu.org/software/gmp/>.
   MPFR requires GMP version 4.1 or later.

1. Extract the files from the archive.

2. It is strongly advised to apply the latest patches (if this has
   not been done yet), e.g.
     wget http://www.mpfr.org/mpfr-2.4.1/patches
     patch -N -Z -p1 < patches
   or
     curl http://www.mpfr.org/mpfr-2.4.1/patches | patch -N -Z -p1

3. In the MPFR directory, to detect your system, type:
     ./configure
   possibly with options (see below, in particular if this step or
   one of the following fails).
   Note: paths provided in configure options must always be absolute
   (relative paths are not supported).

4. To build the library, type:
     make

5. To check the built library (runs the test files), type:
     make check

6. To install it (default "/usr/local" | see "--prefix" option), type:
     make install

If you installed MPFR (header and library) in directories that are
not searched by default by the compiler and/or linking tools, then,
like with other libraries, you may need to set up some environment
variables such as C_INCLUDE_PATH (to find the header mpfr.h),
LIBRARY_PATH (to find the library), and if the shared library has
been installed, LD_LIBRARY_PATH (before execution) or LD_RUN_PATH
(before linking); this list is not exhaustive and some environment
variables may be specific to your system. "make install" gives some
instructions; please read them. You can also find more information
in the manuals of your compiler and linker. The MPFR FAQ may also
give some information.

Remember that if you have several MPFR (or GMP) versions installed
(e.g., one with the system, and one, newer, by you), you will not
necessarily get a compilation/linking error if a wrong library is
used (e.g., because LD_LIBRARY_PATH has not been set correctly).
But unexpected results may occur.

Under Mac OS X, if the shared library was not installed and you use
Apple's linker (this is the default), you will also need to provide
the -search_paths_first linker flag ("-Wl,-search_paths_first" when
you link via gcc) to make sure that the right library is selected,
as by default, Apple's linker selects a shared library preferably,
even when it is farther in the library paths. We recall that if a
wrong library is selected due to this behavior, unexpected results
may occur.


Building the documentation
==========================

To build the documentation in various formats, you may first need to
install recent versions of some utilities such as texinfo.

* Type "make info" to produce the documentation in the info format.

* Type "make pdf" to produce the documentation in the PDF format.

* Type "make dvi" to produce the documentation in the DVI format.

* Type "make ps" to produce the documentation in the Postscript format.

* Type "make html" to produce the documentation in the HTML format
  (in several pages); if you want only one output HTML file, then
  type "makeinfo --html --no-split mpfr.texi" instead.


Building MPFR with internal GMP header files
============================================

MPFR built with internal GMP header files is a bit faster, so you may want
to build it with them. Just do this in step 1:

  ./configure --with-gmp-build=GMPBUILD

where GMPBUILD is the GMP build directory. The needed header files are:
gmp-impl.h, longlong.h and all the necessary headers to use them.

Warning: the library obtained in this way may use some internal GMP
symbols, and thus dynamically linking your software with a different
version of GMP might fail, even though it is declared as compatible
by Libtool's versioning system.


./configure options
===================

--prefix=DIR            installs MPFR headers and library in DIR/include and
                        DIR/lib respectively (the default is "/usr/local").

--with-gmp-include=DIR  assumes that DIR contains gmp.h
--with-gmp-lib=DIR      assumes that DIR contains the GMP library
--with-gmp=DIR          assumes that DIR is where you have installed GMP.
                        same as --with-gmp-lib=DIR/lib
                        and     --with-gmp-include=DIR/include
                        (use either --with-gmp alone or one or both of
                        --with-gmp-lib/--with-gmp-include)
                        Warning! Do not use these options if you have
                        CPPFLAGS and/or LDFLAGS containing a -I or -L
                        option with a directory that contains a GMP
                        header or library file, as these options just
                        add -I and -L options to CPPFLAGS and LDFLAGS
                        *after* the ones that are currently declared,
                        so that DIR will have a lower precedence. Also,
                        this may not work if DIR is a system directory.

--with-gmp-build=DIR    assumes that DIR contains the source of GMP and
                        enables the use of GMP internals.
                        Try to set CC/CFLAGS to GMP's ones. This is not
                        guaranteed to work as the configure script does
                        some compiler tests earlier, and the change may
                        be too late.
                        Warning! This option and the group of options
                        --with-gmp are mutually exclusive.

--enable-assert         build MPFR with assertions.

--enable-thread-safe    build MPFR as thread safe, using compiler-level
                        Thread Local Storage (TLS). Note: TLS support is
                        roughly tested by configure. If configure detects
                        that TLS does not work (because of the compiler,
                        linker or system libraries), it will output an
                        error message, telling you to build MPFR without
                        thread safe. For instance, though Mac OS X uses
                        GCC, it may not currently support GCC's __thread
                        storage class.

Run "./configure --help" to see the other options (autoconf default options).


In case of problem
==================

First, look for any warning message in the configure output.

Several documents may help you to solve the problem:
  * this INSTALL file, in particular information given below;
  * the FAQ (either the FAQ.html file distributed with MPFR, or the
    on-line version <http://www.mpfr.org/faq.html>, which may be more
    up-to-date);
  * the MPFR web page for this version <http://www.mpfr.org/mpfr-2.4.1/>,
    which lists bugs found in this version and provides some patches.

If the "configure" fails, please check that the C compiler and its
options are the same as those for the GMP build (specially the ABI).
You can see the latter with the following command:

  grep "^CC\|^CFLAGS" GMPBUILD/Makefile

if the GMP build directory is available. Then type:

  ./configure <configure options> CC=<C compiler> CFLAGS=<compiler options>

and continue the install. On some platforms, you should provide further
options to match those used by GMP, or set some environment variables.
For instance, see the "Notes on AIX/PowerPC" section below.

Warning! Do NOT use optimization options that can change the semantics
of math operations, such as GCC's -ffast-math or Sun CC's -fast.
Otherwise conversions from/to double's may be incorrect on infinities,
NaN's and signed zeros. Since native FP arithmetic is used in a few
places only, such options would not make MPFR faster anyway.

On some platforms, try with "gmake" (GNU make) instead of "make".
Problems have been reported with the Tru64 make.

If the build was OK, but the tests failed to link with GMP or gave an
error like

  undefined reference to `__gmp_get_memory_functions'

meaning that the GMP library was not found or a wrong GMP library was
selected by the linker, then your library search paths are probably
not correctly set (some paths are missing or they are specified in an
incorrect order).

Such problems commonly occur under GNU/Linux machines, where default
header and library paths may be inconsistent: gcc is configured to
search /usr/local/include by default, while /usr/local/lib is not in
the default search paths. If you have a GMP version installed in /usr
(provided by the OS) and a new one installed in /usr/local, then the
header of the new GMP version and the library of the old GMP version
will be used! A typical error is the above one in "make check". The
solution is to add /usr/local/include to your C_INCLUDE_PATH and to
add /usr/local/lib to your LIBRARY_PATH and LD_LIBRARY_PATH (and/or
LD_RUN_PATH), as said above. Alternatively, you can use --with-gmp*
configure options (described above), e.g. --with-gmp=/usr/local, but
other software that uses GMP and/or MPFR will need correct paths too,
and environment variables allow to set them in a global way.

For instance, under Unix, where paths are separated by a colon:

  * With POSIX sh-compatible shells (e.g. sh, ksh, bash, zsh):
    export C_INCLUDE_PATH="/usr/local/include:/other/path/include"
    export LIBRARY_PATH="/usr/local/lib:/other/path/lib"
    export LD_LIBRARY_PATH="$LIBRARY_PATH"

  * With csh or tcsh:
    setenv C_INCLUDE_PATH "/usr/local/include:/other/path/include"
    setenv LIBRARY_PATH "/usr/local/lib:/other/path/lib"
    setenv LD_LIBRARY_PATH "$LIBRARY_PATH"

If you can't solve your problem, you should contact us at <mpfr@loria.fr>,
indicating the machine and operating system used (uname -a), the compiler
and version used (gcc -v if you use gcc), the configure options used if
any (including variables such as CC and CFLAGS), the version of GMP and
MPFR used, and a description of the problem encountered. Please send us
also the log of the "configure" (config.log).

Note that even if you can build MPFR with a C++ compiler, you can't run
the test suite: C and C++ are not the same language! You should use a C
compiler instead.


Notes on FreeBSD 4.3
====================

FreeBSD 4.3 is provided with an incorrect <float.h> header file, and
MPFR tests related to long double's may fail. If you cannot upgrade
the system, you can still use MPFR with FreeBSD 4.3, but you should
not use conversions with the long double type.


Notes on AIX/PowerPC
====================

The following has been tested on AIX 5.3 (powerpc-ibm-aix5.3.0.0) with
gcc 3.3.2 and GMP 4.2.1.

Before building and testing MPFR, you should set the OBJECT_MODE
environment variable to 64 (as GMP selects the 64-bit ABI by default),
e.g. with:

  export OBJECT_MODE=64

(in a sh-compatible shell). But you should also provide a correct CFLAGS
value to the "configure" script: using --with-gmp-build is not sufficient
due to the early compiler tests, as gcc will not compile any program if
OBJECT_MODE is 64 and the -maix64 option is not provided.


Notes on 32-bit Windows Applications (win32)
============================================

1 - We advise to use mingw (http://www.mingw.org/), which is simpler and
    less demanding than Cygwin. Contrary to Cygwin, it also provides native
    Windows code. The binaries compiled with Cygwin require a dynamic
    library (cygwin.dll) to work; there is a Cygwin option -mno-cygwin to
    build native code, but it may require some non-portable tricks.

2 - If you just want to make a binary with gcc, there is nothing to do:
    GMP, MPFR and the program compile exactly as under Linux.

3 - If you want to make libraries to work under another Windows compiler
    like Visual C / C++, you have two options.  Since the unix-like *.a
    library files are compatible with Windows *.lib files, you can simply
    rename all *.a libraries to *.lib.  The second option is to build
    MPFR with the Microsoft Visual Studio compiler to produce Windows
    libraries directly (Visual Studio build projects for MPFR are
    available at http://fp.gladman.plus.com/computing/gmp4win.htm).

    With gmp-4.1.3, the only remaining problem seems to be the "alloca" calls
    in GMP. Configuring GMP and MPFR with --enable-alloca=malloc-reentrant
    should work (if you build MPFR with GMP internal files).

    Or you could add the library
     "$MINGWIN$/lib/gcc-lib/mingw32/$VERSION$/libgcc.a"
    to your project: it contains all the extra-functions needed by a program
    compiled by gcc (division of 64-bit integer, bcopy, alloca...).
    Of course, include it if and only if your compiler is not gcc.

4 - On Windows32 / MinGW, if all the tests fail, try to run the test suite
    with "make check EXEEXT=".

5 - To avoid using the Microsoft runtime (which might not be conform to ISO C),
    you can use the MinGW runtime package (which is an integral part of MinGW).
    For example, with MinGW versions 3.15 and later you can get an
    ISO-compliant printf() if you compile your application with either
    '-ansi', '-posix' or '-D__USE_MINGW_ANSI_STDIO'. For example, you can
    compile and test MPFR with CC="gcc -D__USE_MINGW_ANSI_STDIO".

    For example under Win32, the following problem has been experienced with
    MPFR 2.4.0 RC1 and the MSVC runtime (msvcrt.dll):

       Error in mpfr_vsprintf (s, "%.*Zi, %R*e, %Lf%n", ...);
       expected: "00000010610209857723, -1.2345678875e+07, 0.032258"
       got:      "00000010610209857723, -1.2345678875e+07, -0.000000"
       FAIL: tsprintf.exe

    This error is due to the MSVC runtime not supporting the L length modifier
    for formatted output (e.g. printf with %Lf). You can check this with the
    following program:

       #include <stdio.h>
       int main (void)
       {
         long double d = 1. / 31.;
         printf ("%Lf\n", d);
         return 0;
       }

    The expected output is 0.032258.

    Note: The L modifier has been standard for a long time (it was added
    in ISO C89).

Notes on 64-bit Windows Applications (x64)
==========================================

[See the Notes on 32-bit Windows Applications, which might be relevant here,
 in particular when running a 64-bit operating system]

Cygwin and mingw do not yet offer support for native Windows 64 builds but
the 32-bit version of MPFR can be used to build 32-bit applications that
will run on 64-bit Windows systems (see above). MPFR can be built as a native
64-bit static or DLL library for Windows 64 using the Visual Studio build
projects at http://fp.gladman.plus.com/computing/gmp4win.htm.
