## 2 Installing GMP ¶

GMP has an autoconf/automake/libtool based configuration system. On a Unix-like system a basic build can be done with

    ./configure
    make

Some self-tests can be run with

    make check

And you can install (under `/usr/local` by default) with

    make install

If you experience problems, please report them to gmp-bugs@gmplib.org. See Reporting Bugs, for information on what to include in useful bug reports.

### 2.1 Build Options ¶

All the usual autoconf configure options are available, run ‘`./configure --help`’ for a summary. The file `INSTALL.autoconf` has some generic installation information too.

Tools ¶

  ‘`configure`’ requires various Unix-like tools. See Notes for Particular Systems, for some options on non-Unix systems.

  It might be possible to build without the help of ‘`configure`’, certainly all the code is there, but unfortunately you’ll be on your own.

Build Directory ¶

  To compile in a separate build directory, `cd` to that directory, and prefix the configure command with the path to the GMP source directory. For example

      cd /my/build/dir
      /my/sources/gmp-6.3.0/configure

  Not all ‘`make`’ programs have the necessary features (`VPATH`) to support this. In particular, SunOS and Slowaris `make` have bugs that make them unable to build in a separate directory. Use GNU `make` instead.

`--prefix` and `--exec-prefix` ¶

  The `--prefix` option can be used in the normal way to direct GMP to install under a particular tree. The default is ‘`/usr/local`’.

  `--exec-prefix` can be used to direct architecture-dependent files like `libgmp.a` to a different location. This can be used to share architecture-independent parts like the documentation, but separate the dependent parts. Note however that `gmp.h` is architecture-dependent since it encodes certain aspects of `libgmp`, so it will be necessary to ensure both `$prefix/include` and `$exec_prefix/include` are available to the compiler.

`--disable-shared`, `--disable-static` ¶

  By default both shared and static libraries are built (where possible), but one or other can be disabled. Shared libraries result in smaller executables and permit code sharing between separate running processes, but on some CPUs are slightly slower, having a small cost on each function call.

Native Compilation, `--build=CPU-VENDOR-OS` ¶

  For normal native compilation, the system can be specified with ‘`--build`’. By default ‘`./configure`’ uses the output from running ‘`./config.guess`’. On some systems ‘`./config.guess`’ can determine the exact CPU type, on others it will be necessary to give it explicitly. For example,

      ./configure --build=ultrasparc-sun-solaris2.7

  In all cases the ‘`OS`’ part is important, since it controls how libtool generates shared libraries. Running ‘`./config.guess`’ is the simplest way to see what it should be, if you don’t know already.

Cross Compilation, `--host=CPU-VENDOR-OS` ¶

  When cross-compiling, the system used for compiling is given by ‘`--build`’ and the system where the library will run is given by ‘`--host`’. For example when using a FreeBSD Athlon system to build GNU/Linux m68k binaries,

      ./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu

  Compiler tools are sought first with the host system type as a prefix. For example `m68k-mac-linux-gnu-ranlib` is tried, then plain `ranlib`. This makes it possible for a set of cross-compiling tools to co-exist with native tools. The prefix is the argument to ‘`--host`’, and this can be an alias, such as ‘`m68k-linux`’. But note that tools don’t have to be set up this way, it’s enough to just have a `PATH` with a suitable cross-compiling `cc` etc.

  Compiling for a different CPU in the same family as the build system is a form of cross-compilation, though very possibly this would merely be special options on a native compiler. In any case ‘`./configure`’ avoids depending on being able to run code on the build system, which is important when creating binaries for a newer CPU since they very possibly won’t run on the build system.

  In all cases the compiler must be able to produce an executable (of whatever format) from a standard C `main`. Although only object files will go to make up `libgmp`, ‘`./configure`’ uses linking tests for various purposes, such as determining what functions are available on the host system.

  Currently a warning is given unless an explicit ‘`--build`’ is used when cross-compiling, because it may not be possible to correctly guess the build system type if the `PATH` has only a cross-compiling `cc`.

  Note that the ‘`--target`’ option is not appropriate for GMP. It’s for use when building compiler tools, with ‘`--host`’ being where they will run, and ‘`--target`’ what they’ll produce code for. Ordinary programs or libraries like GMP are only interested in the ‘`--host`’ part, being where they’ll run. (Some past versions of GMP used ‘`--target`’ incorrectly.)

CPU types ¶

  In general, if you want a library that runs as fast as possible, you should configure GMP for the exact CPU type your system uses. However, this may mean the binaries won’t run on older members of the family, and might run slower on other members, older or newer. The best idea is always to build GMP for the exact machine type you intend to run it on.

  The following CPUs have specific support. See `configure.ac` for details of what code and compiler options they select.

  - Alpha: ‘`alpha`’, ‘`alphaev5`’, ‘`alphaev56`’, ‘`alphapca56`’, ‘`alphapca57`’, ‘`alphaev6`’, ‘`alphaev67`’, ‘`alphaev68`’, ‘`alphaev7`’
  - Cray: ‘`c90`’, ‘`j90`’, ‘`t90`’, ‘`sv1`’
  - HPPA: ‘`hppa1.0`’, ‘`hppa1.1`’, ‘`hppa2.0`’, ‘`hppa2.0n`’, ‘`hppa2.0w`’, ‘`hppa64`’
  - IA-64: ‘`ia64`’, ‘`itanium`’, ‘`itanium2`’
  - MIPS: ‘`mips`’, ‘`mips3`’, ‘`mips64`’
  - Motorola: ‘`m68k`’, ‘`m68000`’, ‘`m68010`’, ‘`m68020`’, ‘`m68030`’, ‘`m68040`’, ‘`m68060`’, ‘`m68302`’, ‘`m68360`’, ‘`m88k`’, ‘`m88110`’
  - POWER: ‘`power`’, ‘`power1`’, ‘`power2`’, ‘`power2sc`’
  - PowerPC: ‘`powerpc`’, ‘`powerpc64`’, ‘`powerpc401`’, ‘`powerpc403`’, ‘`powerpc405`’, ‘`powerpc505`’, ‘`powerpc601`’, ‘`powerpc602`’, ‘`powerpc603`’, ‘`powerpc603e`’, ‘`powerpc604`’, ‘`powerpc604e`’, ‘`powerpc620`’, ‘`powerpc630`’, ‘`powerpc740`’, ‘`powerpc7400`’, ‘`powerpc7450`’, ‘`powerpc750`’, ‘`powerpc801`’, ‘`powerpc821`’, ‘`powerpc823`’, ‘`powerpc860`’, ‘`powerpc970`’
  - SPARC: ‘`sparc`’, ‘`sparcv8`’, ‘`microsparc`’, ‘`supersparc`’, ‘`sparcv9`’, ‘`ultrasparc`’, ‘`ultrasparc2`’, ‘`ultrasparc2i`’, ‘`ultrasparc3`’, ‘`sparc64`’
  - x86 family: ‘`i386`’, ‘`i486`’, ‘`i586`’, ‘`pentium`’, ‘`pentiummmx`’, ‘`pentiumpro`’, ‘`pentium2`’, ‘`pentium3`’, ‘`pentium4`’, ‘`k6`’, ‘`k62`’, ‘`k63`’, ‘`athlon`’, ‘`amd64`’, ‘`viac3`’, ‘`viac32`’
  - Other: ‘`arm`’, ‘`sh`’, ‘`sh2`’, ‘`vax`’,

  CPUs not listed will use generic C code.

Generic C Build ¶

  If some of the assembly code causes problems, or if otherwise desired, the generic C code can be selected with the configure `--disable-assembly`.

  Note that this will run quite slowly, but it should be portable and should at least make it possible to get something running if all else fails.

Fat binary, `--enable-fat` ¶

  Using `--enable-fat` selects a “fat binary” build on x86, where optimized low level subroutines are chosen at runtime according to the CPU detected. This means more code, but gives good performance on all x86 chips. (This option might become available for more architectures in the future.)

`ABI` ¶

  On some systems GMP supports multiple ABIs (application binary interfaces), meaning data type sizes and calling conventions. By default GMP chooses the best ABI available, but a particular ABI can be selected. For example

      ./configure --host=mips64-sgi-irix6 ABI=n32

  See ABI and ISA, for the available choices on relevant CPUs, and what applications need to do.

`CC`, `CFLAGS` ¶

  By default the C compiler used is chosen from among some likely candidates, with `gcc` normally preferred if it’s present. The usual ‘`CC=whatever`’ can be passed to ‘`./configure`’ to choose something different.

  For various systems, default compiler flags are set based on the CPU and compiler. The usual ‘`CFLAGS="-whatever"`’ can be passed to ‘`./configure`’ to use something different or to set good flags for systems GMP doesn’t otherwise know.

  The ‘`CC`’ and ‘`CFLAGS`’ used are printed during ‘`./configure`’, and can be found in each generated `Makefile`. This is the easiest way to check the defaults when considering changing or adding something.

  Note that when ‘`CC`’ and ‘`CFLAGS`’ are specified on a system supporting multiple ABIs it’s important to give an explicit ‘`ABI=whatever`’, since GMP can’t determine the ABI just from the flags and won’t be able to select the correct assembly code.

  If just ‘`CC`’ is selected then normal default ‘`CFLAGS`’ for that compiler will be used (if GMP recognises it). For example ‘`CC=gcc`’ can be used to force the use of GCC, with default flags (and default ABI).

`CPPFLAGS` ¶

  Any flags like ‘`-D`’ defines or ‘`-I`’ includes required by the preprocessor should be set in ‘`CPPFLAGS`’ rather than ‘`CFLAGS`’. Compiling is done with both ‘`CPPFLAGS`’ and ‘`CFLAGS`’, but preprocessing uses just ‘`CPPFLAGS`’. This distinction is because most preprocessors won’t accept all the flags the compiler does. Preprocessing is done separately in some configure tests.

`CC_FOR_BUILD` ¶

  Some build-time programs are compiled and run to generate host-specific data tables. ‘`CC_FOR_BUILD`’ is the compiler used for this. It doesn’t need to be in any particular ABI or mode, it merely needs to generate executables that can run. The default is to try the selected ‘`CC`’ and some likely candidates such as ‘`cc`’ and ‘`gcc`’, looking for something that works.

  No flags are used with ‘`CC_FOR_BUILD`’ because a simple invocation like ‘`cc foo.c`’ should be enough. If some particular options are required they can be included as for instance ‘`CC_FOR_BUILD="cc -whatever"`’.

C++ Support, `--enable-cxx` ¶

  C++ support in GMP can be enabled with ‘`--enable-cxx`’, in which case a C++ compiler will be required. As a convenience ‘`--enable-cxx=detect`’ can be used to enable C++ support only if a compiler can be found. The C++ support consists of a library `libgmpxx.la` and header file `gmpxx.h` (see Headers and Libraries).

  A separate `libgmpxx.la` has been adopted rather than having C++ objects within `libgmp.la` in order to ensure dynamic linked C programs aren’t bloated by a dependency on the C++ standard library, and to avoid any chance that the C++ compiler could be required when linking plain C programs.

  `libgmpxx.la` will use certain internals from `libgmp.la` and can only be expected to work with `libgmp.la` from the same GMP version. Future changes to the relevant internals will be accompanied by renaming, so a mismatch will cause unresolved symbols rather than perhaps mysterious misbehaviour.

  In general `libgmpxx.la` will be usable only with the C++ compiler that built it, since name mangling and runtime support are usually incompatible between different compilers.

`CXX`, `CXXFLAGS` ¶

  When C++ support is enabled, the C++ compiler and its flags can be set with variables ‘`CXX`’ and ‘`CXXFLAGS`’ in the usual way. The default for ‘`CXX`’ is the first compiler that works from a list of likely candidates, with `g++` normally preferred when available. The default for ‘`CXXFLAGS`’ is to try ‘`CFLAGS`’, ‘`CFLAGS`’ without ‘`-g`’, then for `g++` either ‘`-g -O2`’ or ‘`-O2`’, or for other compilers ‘`-g`’ or nothing. Trying ‘`CFLAGS`’ this way is convenient when using ‘`gcc`’ and ‘`g++`’ together, since the flags for ‘`gcc`’ will usually suit ‘`g++`’.

  It’s important that the C and C++ compilers match, meaning their startup and runtime support routines are compatible and that they generate code in the same ABI (if there’s a choice of ABIs on the system). ‘`./configure`’ isn’t currently able to check these things very well itself, so for that reason ‘`--disable-cxx`’ is the default, to avoid a build failure due to a compiler mismatch. Perhaps this will change in the future.

  Incidentally, it’s normally not good enough to set ‘`CXX`’ to the same as ‘`CC`’. Although `gcc` for instance recognises `foo.cc` as C++ code, only `g++` will invoke the linker the right way when building an executable or shared library from C++ object files.

Temporary Memory, `--enable-alloca=<choice>` ¶

  GMP allocates temporary workspace using one of the following three methods, which can be selected with for instance ‘`--enable-alloca=malloc-reentrant`’.

  - ‘`alloca`’ - C library or compiler builtin.
  - ‘`malloc-reentrant`’ - the heap, in a re-entrant fashion.
  - ‘`malloc-notreentrant`’ - the heap, with global variables.

  For convenience, the following choices are also available. ‘`--disable-alloca`’ is the same as ‘`no`’.

  - ‘`yes`’ - a synonym for ‘`alloca`’.
  - ‘`no`’ - a synonym for ‘`malloc-reentrant`’.
  - ‘`reentrant`’ - `alloca` if available, otherwise ‘`malloc-reentrant`’. This is the default.
  - ‘`notreentrant`’ - `alloca` if available, otherwise ‘`malloc-notreentrant`’.

  `alloca` is reentrant and fast, and is recommended. It actually allocates just small blocks on the stack; larger ones use malloc-reentrant.

  ‘`malloc-reentrant`’ is, as the name suggests, reentrant and thread safe, but ‘`malloc-notreentrant`’ is faster and should be used if reentrancy is not required.

  The two malloc methods in fact use the memory allocation functions selected by `mp_set_memory_functions`, these being `malloc` and friends by default. See Custom Allocation.

  An additional choice ‘`--enable-alloca=debug`’ is available, to help when debugging memory related problems (see Debugging).

FFT Multiplication, `--disable-fft` ¶

  By default multiplications are done using Karatsuba, 3-way Toom, higher degree Toom, and Fermat FFT. The FFT is only used on large to very large operands and can be disabled to save code size if desired.

Assertion Checking, `--enable-assert` ¶

  This option enables some consistency checking within the library. This can be of use while debugging, see Debugging.

Execution Profiling, `--enable-profiling=prof/gprof/instrument` ¶

  Enable profiling support, in one of various styles, see Profiling.

`MPN_PATH` ¶

  Various assembly versions of each mpn subroutines are provided. For a given CPU, a search is made through a path to choose a version of each. For example ‘`sparcv8`’ has

      MPN_PATH="sparc32/v8 sparc32 generic"

  which means look first for v8 code, then plain sparc32 (which is v7), and finally fall back on generic C. Knowledgeable users with special requirements can specify a different path. Normally this is completely unnecessary.

Documentation ¶

  The source for the document you’re now reading is `doc/gmp.texi`, in Texinfo format, see Texinfo in Texinfo.

  Info format ‘`doc/gmp.info`’ is included in the distribution. The usual automake targets are available to make PostScript, DVI, PDF and HTML (these will require various TeX and Texinfo tools).

  DocBook and XML can be generated by the Texinfo `makeinfo` program too, see Options for `makeinfo` in Texinfo.

  Some supplementary notes can also be found in the `doc` subdirectory.

### 2.2 ABI and ISA ¶

ABI (Application Binary Interface) refers to the calling conventions between functions, meaning what registers are used and what sizes the various C data types are. ISA (Instruction Set Architecture) refers to the instructions and registers a CPU has available.

Some 64-bit ISA CPUs have both a 64-bit ABI and a 32-bit ABI defined, the latter for compatibility with older CPUs in the family. GMP supports some CPUs like this in both ABIs. In fact within GMP ‘`ABI`’ means a combination of chip ABI, plus how GMP chooses to use it. For example in some 32-bit ABIs, GMP may support a limb as either a 32-bit `long` or a 64-bit `long long`.

By default GMP chooses the best ABI available for a given system, and this generally gives significantly greater speed. But an ABI can be chosen explicitly to make GMP compatible with other libraries, or particular application requirements. For example,

    ./configure ABI=32

In all cases it’s vital that all object code used in a given program is compiled for the same ABI.

Usually a limb is implemented as a `long`. When a `long long` limb is used this is encoded in the generated `gmp.h`. This is convenient for applications, but it does mean that `gmp.h` will vary, and can’t be just copied around. `gmp.h` remains compiler independent though, since all compilers for a particular ABI will be expected to use the same limb type.

Currently no attempt is made to follow whatever conventions a system has for installing library or header files built for a particular ABI. This will probably only matter when installing multiple builds of GMP, and it might be as simple as configuring with a special ‘`libdir`’, or it might require more than that. Note that builds for different ABIs need to be done separately, with a fresh `./configure` and `make` each.

AMD64 (‘`x86_64`’) ¶

  On AMD64 systems supporting both 32-bit and 64-bit modes for applications, the following ABI choices are available.

  ‘`ABI=64`’

    The 64-bit ABI uses 64-bit limbs and pointers and makes full use of the chip architecture. This is the default. Applications will usually not need special compiler flags, but for reference the option is

        gcc  -m64

  ‘`ABI=32`’

    The 32-bit ABI is the usual i386 conventions. This will be slower, and is not recommended except for inter-operating with other code not yet 64-bit capable. Applications must be compiled with

        gcc  -m32

    (In GCC 2.95 and earlier there’s no ‘`-m32`’ option, it’s the only mode.)

  ‘`ABI=x32`’

    The x32 ABI uses 64-bit limbs but 32-bit pointers. Like the 64-bit ABI, it makes full use of the chip’s arithmetic capabilities. This ABI is not supported by all operating systems.

        gcc  -mx32

HPPA 2.0 (‘`hppa2.0*`’, ‘`hppa64`’) ¶
  ‘`ABI=2.0w`’

    The 2.0w ABI uses 64-bit limbs and pointers and is available on HP-UX 11 or up. Applications must be compiled with

        gcc [built for 2.0w]
        cc  +DD64

  ‘`ABI=2.0n`’

    The 2.0n ABI means the 32-bit HPPA 1.0 ABI and all its normal calling conventions, but with 64-bit instructions permitted within functions. GMP uses a 64-bit `long long` for a limb. This ABI is available on hppa64 GNU/Linux and on HP-UX 10 or higher. Applications must be compiled with

        gcc [built for 2.0n]
        cc  +DA2.0 +e

    Note that current versions of GCC (e.g. 3.2) don’t generate 64-bit instructions for `long long` operations and so may be slower than for 2.0w. (The GMP assembly code is the same though.)

  ‘`ABI=1.0`’

    HPPA 2.0 CPUs can run all HPPA 1.0 and 1.1 code in the 32-bit HPPA 1.0 ABI. No special compiler options are needed for applications.

  All three ABIs are available for CPU types ‘`hppa2.0w`’, ‘`hppa2.0`’ and ‘`hppa64`’, but for CPU type ‘`hppa2.0n`’ only 2.0n or 1.0 are considered.

  Note that GCC on HP-UX has no options to choose between 2.0n and 2.0w modes, unlike HP `cc`. Instead it must be built for one or the other ABI. GMP will detect how it was built, and skip to the corresponding ‘`ABI`’.

IA-64 under HP-UX (‘`ia64*-*-hpux*`’, ‘`itanium*-*-hpux*`’) ¶

  HP-UX supports two ABIs for IA-64. GMP performance is the same in both.

  ‘`ABI=32`’

    In the 32-bit ABI, pointers, `int`s and `long`s are 32 bits and GMP uses a 64 bit `long long` for a limb. Applications can be compiled without any special flags since this ABI is the default in both HP C and GCC, but for reference the flags are

        gcc  -milp32
        cc   +DD32

  ‘`ABI=64`’

    In the 64-bit ABI, `long`s and pointers are 64 bits and GMP uses a `long` for a limb. Applications must be compiled with

        gcc  -mlp64
        cc   +DD64

  On other IA-64 systems, GNU/Linux for instance, ‘`ABI=64`’ is the only choice.

MIPS under IRIX 6 (‘`mips*-*-irix[6789]`’) ¶

  IRIX 6 always has a 64-bit MIPS 3 or better CPU, and supports ABIs o32, n32, and 64. n32 or 64 are recommended, and GMP performance will be the same in each. The default is n32.

  ‘`ABI=o32`’

    The o32 ABI is 32-bit pointers and integers, and no 64-bit operations. GMP will be slower than in n32 or 64, this option only exists to support old compilers, e.g. GCC 2.7.2. Applications can be compiled with no special flags on an old compiler, or on a newer compiler with

        gcc  -mabi=32
        cc   -32

  ‘`ABI=n32`’

    The n32 ABI is 32-bit pointers and integers, but with a 64-bit limb using a `long long`. Applications must be compiled with

        gcc  -mabi=n32
        cc   -n32

  ‘`ABI=64`’

    The 64-bit ABI is 64-bit pointers and integers. Applications must be compiled with

        gcc  -mabi=64
        cc   -64

  Note that MIPS GNU/Linux, as of kernel version 2.2, doesn’t have the necessary support for n32 or 64 and so only gets a 32-bit limb and the MIPS 2 code.

PowerPC 64 (‘`powerpc64`’, ‘`powerpc620`’, ‘`powerpc630`’, ‘`powerpc970`’, ‘`power4`’, ‘`power5`’) ¶
  ‘`ABI=mode64`’ ¶

    The AIX 64 ABI uses 64-bit limbs and pointers and is the default on PowerPC 64 ‘`*-*-aix*`’ systems. Applications must be compiled with

        gcc  -maix64
        xlc  -q64

    On 64-bit GNU/Linux, BSD, and Mac OS X/Darwin systems, the applications must be compiled with

        gcc  -m64

  ‘`ABI=mode32`’

    The ‘`mode32`’ ABI uses a 64-bit `long long` limb but with the chip still in 32-bit mode and using 32-bit calling conventions. This is the default for systems where the true 64-bit ABI is unavailable. No special compiler options are typically needed for applications. This ABI is not available under AIX.

  ‘`ABI=32`’

    This is the basic 32-bit PowerPC ABI, with a 32-bit limb. No special compiler options are needed for applications.

  GMP’s speed is greatest for the ‘`mode64`’ ABI, the ‘`mode32`’ ABI is 2nd best. In ‘`ABI=32`’ only the 32-bit ISA is used and this doesn’t make full use of a 64-bit chip.

Sparc V9 (‘`sparc64`’, ‘`sparcv9`’, ‘`ultrasparc*`’) ¶
  ‘`ABI=64`’

    The 64-bit V9 ABI is available on the various BSD sparc64 ports, recent versions of Sparc64 GNU/Linux, and Solaris 2.7 and up (when the kernel is in 64-bit mode). GCC 3.2 or higher, or Sun `cc` is required. On GNU/Linux, depending on the default `gcc` mode, applications must be compiled with

        gcc  -m64

    On Solaris applications must be compiled with

        gcc  -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9
        cc   -xarch=v9

    On the BSD sparc64 systems no special options are required, since 64-bits is the only ABI available.

  ‘`ABI=32`’

    For the basic 32-bit ABI, GMP still uses as much of the V9 ISA as it can. In the Sun documentation this combination is known as “v8plus”. On GNU/Linux, depending on the default `gcc` mode, applications may need to be compiled with

        gcc  -m32

    On Solaris, no special compiler options are required for applications, though using something like the following is recommended. (`gcc` 2.8 and earlier only support ‘`-mv8`’ though.)

        gcc  -mv8plus
        cc   -xarch=v8plus

  GMP speed is greatest in ‘`ABI=64`’, so it’s the default where available. The speed is partly because there are extra registers available and partly because 64-bits is considered the more important case and has therefore had better code written for it.

  Don’t be confused by the names of the ‘`-m`’ and ‘`-x`’ compiler options, they’re called ‘`arch`’ but effectively control both ABI and ISA.

  On Solaris 2.6 and earlier, only ‘`ABI=32`’ is available since the kernel doesn’t save all registers.

  On Solaris 2.7 with the kernel in 32-bit mode, a normal native build will reject ‘`ABI=64`’ because the resulting executables won’t run. ‘`ABI=64`’ can still be built if desired by making it look like a cross-compile, for example

      ./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64

### 2.3 Notes for Package Builds ¶

GMP should present no great difficulties for packaging in a binary distribution.

Libtool is used to build the library and ‘`-version-info`’ is set appropriately, having started from ‘`3:0:0`’ in GMP 3.0 (see Library interface versions in GNU Libtool).

The GMP 4 series will be upwardly binary compatible in each release and will be upwardly binary compatible with all of the GMP 3 series. Additional function interfaces may be added in each release, so on systems where libtool versioning is not fully checked by the loader an auxiliary mechanism may be needed to express that a dynamic linked application depends on a new enough GMP.

An auxiliary mechanism may also be needed to express that `libgmpxx.la` (from `--enable-cxx`, see Build Options) requires `libgmp.la` from the same GMP version, since this is not done by the libtool versioning, nor otherwise. A mismatch will result in unresolved symbols from the linker, or perhaps the loader.

When building a package for a CPU family, care should be taken to use ‘`--host`’ (or ‘`--build`’) to choose the least common denominator among the CPUs which might use the package. For example this might mean plain ‘`sparc`’ (meaning V7) for SPARCs.

For x86s, `--enable-fat` sets things up for a fat binary build, making a runtime selection of optimized low level routines. This is a good choice for packaging to run on a range of x86 chips.

Users who care about speed will want GMP built for their exact CPU type, to make best use of the available optimizations. Providing a way to suitably rebuild a package may be useful. This could be as simple as making it possible for a user to omit ‘`--build`’ (and ‘`--host`’) so ‘`./config.guess`’ will detect the CPU. But a way to manually specify a ‘`--build`’ will be wanted for systems where ‘`./config.guess`’ is inexact.

On systems with multiple ABIs, a packaged build will need to decide which among the choices is to be provided, see ABI and ISA. A given run of ‘`./configure`’ etc will only build one ABI. If a second ABI is also required then a second run of ‘`./configure`’ etc must be made, starting from a clean directory tree (‘`make distclean`’).

As noted under “ABI and ISA”, currently no attempt is made to follow system conventions for install locations that vary with ABI, such as `/usr/lib/sparcv9` for ‘`ABI=64`’ as opposed to `/usr/lib` for ‘`ABI=32`’. A package build can override ‘`libdir`’ and other standard variables as necessary.

Note that `gmp.h` is a generated file, and will be architecture and ABI dependent. When attempting to install two ABIs simultaneously it will be important that an application compile gets the correct `gmp.h` for its desired ABI. If compiler include paths don’t vary with ABI options then it might be necessary to create a `/usr/include/gmp.h` which tests preprocessor symbols and chooses the correct actual `gmp.h`.

### 2.4 Notes for Particular Systems ¶

AIX 3 and 4 ¶

  On systems ‘`*-*-aix[34]*`’ shared libraries are disabled by default, since some versions of the native `ar` fail on the convenience libraries used. A shared build can be attempted with

      ./configure --enable-shared --disable-static

  Note that the ‘`--disable-static`’ is necessary because in a shared build libtool makes `libgmp.a` a symlink to `libgmp.so`, apparently for the benefit of old versions of `ld` which only recognise `.a`, but unfortunately this is done even if a fully functional `ld` is available.

ARM ¶

  On systems ‘`arm*-*-*`’, versions of GCC up to and including 2.95.3 have a bug in unsigned division, giving wrong results for some operands. GMP ‘`./configure`’ will demand GCC 2.95.4 or later.

Compaq C++ ¶

  Compaq C++ on OSF 5.1 has two flavours of `iostream`, a standard one and an old pre-standard one (see ‘`man iostream_intro`’). GMP can only use the standard one, which unfortunately is not the default but must be selected by defining `__USE_STD_IOSTREAM`. Configure with for instance

      ./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM

Floating Point Mode ¶

  On some systems, the hardware floating point has a control mode which can set all operations to be done in a particular precision, for instance single, double or extended on x86 systems (x87 floating point). The GMP functions involving a `double` cannot be expected to operate to their full precision when the hardware is in single precision mode. Of course this affects all code, including application code, not just GMP.

FreeBSD 7.x, 8.x, 9.0, 9.1, 9.2 ¶

  `m4` in these releases of FreeBSD has an eval function which ignores its 2nd and 3rd arguments, which makes it unsuitable for `.asm` file processing. ‘`./configure`’ will detect the problem and either abort or choose another m4 in the `PATH`. The bug is fixed in FreeBSD 9.3 and 10.0, so either upgrade or use GNU m4. Note that the FreeBSD package system installs GNU m4 under the name ‘`gm4`’, which GMP cannot guess.

FreeBSD 7.x, 8.x, 9.x ¶

  GMP releases starting with 6.0 do not support ‘`ABI=32`’ on FreeBSD/amd64 prior to release 10.0 of the system. The cause is a broken `limits.h`, which GMP no longer works around.

MS-DOS and MS Windows ¶

  On an MS-DOS system DJGPP can be used to build GMP, and on an MS Windows system Cygwin, DJGPP and MINGW can be used. All three are excellent ports of GCC and the various GNU tools.

      https://www.cygwin.com/
      http://www.delorie.com/djgpp/
      http://www.mingw.org/

  Microsoft also publishes an Interix “Services for Unix” which can be used to build GMP on Windows (with a normal ‘`./configure`’), but it’s not free software.

MS Windows DLLs ¶

  On systems ‘`*-*-cygwin*`’, ‘`*-*-mingw*`’ and ‘`*-*-pw32*`’ by default GMP builds only a static library, but a DLL can be built instead using

      ./configure --disable-static --enable-shared

  Static and DLL libraries can’t both be built, since certain export directives in `gmp.h` must be different.

  A MINGW DLL build of GMP can be used with Microsoft C. Libtool doesn’t install a `.lib` format import library, but it can be created with MS `lib` as follows, and copied to the install directory. Similarly for `libmp` and `libgmpxx`.

      cd .libs
      lib /def:libgmp-3.dll.def /out:libgmp-3.lib

  MINGW uses the C runtime library ‘`msvcrt.dll`’ for I/O, so applications wanting to use the GMP I/O routines must be compiled with ‘`cl /MD`’ to do the same. If one of the other C runtime library choices provided by MS C is desired then the suggestion is to use the GMP string functions and confine I/O to the application.

Motorola 68k CPU Types ¶

  ‘`m68k`’ is taken to mean 68000. ‘`m68020`’ or higher will give a performance boost on applicable CPUs. ‘`m68360`’ can be used for CPU32 series chips. ‘`m68302`’ can be used for “Dragonball” series chips, though this is merely a synonym for ‘`m68000`’.

NetBSD 5.x ¶

  `m4` in these releases of NetBSD has an eval function which ignores its 2nd and 3rd arguments, which makes it unsuitable for `.asm` file processing. ‘`./configure`’ will detect the problem and either abort or choose another m4 in the `PATH`. The bug is fixed in NetBSD 6, so either upgrade or use GNU m4. Note that the NetBSD package system installs GNU m4 under the name ‘`gm4`’, which GMP cannot guess.

OpenBSD 2.6 ¶

  `m4` in this release of OpenBSD has a bug in `eval` that makes it unsuitable for `.asm` file processing. ‘`./configure`’ will detect the problem and either abort or choose another m4 in the `PATH`. The bug is fixed in OpenBSD 2.7, so either upgrade or use GNU m4.

Power CPU Types ¶

  In GMP, CPU types ‘`power*`’ and ‘`powerpc*`’ will each use instructions not available on the other, so it’s important to choose the right one for the CPU that will be used. Currently GMP has no assembly code support for using just the common instruction subset. To get executables that run on both, the current suggestion is to use the generic C code (`--disable-assembly`), possibly with appropriate compiler options (like ‘`-mcpu=common`’ for `gcc`). CPU ‘`rs6000`’ (which is not a CPU but a family of workstations) is accepted by `config.sub`, but is currently equivalent to `--disable-assembly`.

Sparc CPU Types ¶

  ‘`sparcv8`’ or ‘`supersparc`’ on relevant systems will give a significant performance increase over the V7 code selected by plain ‘`sparc`’.

Sparc App Regs ¶

  The GMP assembly code for both 32-bit and 64-bit Sparc clobbers the “application registers” `g2`, `g3` and `g4`, the same way that the GCC default ‘`-mapp-regs`’ does (see SPARC Options in Using the GNU Compiler Collection (GCC)).

  This makes that code unsuitable for use with the special V9 ‘`-mcmodel=embmedany`’ (which uses `g4` as a data segment pointer), and for applications wanting to use those registers for special purposes. In these cases the only suggestion currently is to build GMP with `--disable-assembly` to avoid the assembly code.

SunOS 4 ¶

  `/usr/bin/m4` lacks various features needed to process `.asm` files, and instead ‘`./configure`’ will automatically use `/usr/5bin/m4`, which we believe is always available (if not then use GNU m4).

x86 CPU Types ¶

  ‘`i586`’, ‘`pentium`’ or ‘`pentiummmx`’ code is good for its intended P5 Pentium chips, but quite slow when run on Intel P6 class chips (PPro, P-II, P-III). ‘`i386`’ is a better choice when making binaries that must run on both.

x86 MMX and SSE2 Code ¶

  If the CPU selected has MMX code but the assembler doesn’t support it, a warning is given and non-MMX code is used instead. This will be an inferior build, since the MMX code that’s present is there because it’s faster than the corresponding plain integer code. The same applies to SSE2.

  Old versions of ‘`gas`’ don’t support MMX instructions, in particular version 1.92.3 that comes with FreeBSD 2.2.8 or the more recent OpenBSD 3.1 doesn’t.

  Solaris 2.6 and 2.7 `as` generate incorrect object code for register to register `movq` instructions, and so can’t be used for MMX code. Install a recent `gas` if MMX code is wanted on these systems.

### 2.5 Known Build Problems ¶

You might find more up-to-date information at https://gmplib.org/.

Compiler link options

  The version of libtool currently in use rather aggressively strips compiler options when linking a shared library. This will hopefully be relaxed in the future, but for now if this is a problem the suggestion is to create a little script to hide them, and for instance configure with

      ./configure CC=gcc-with-my-options

DJGPP (‘`*-*-msdosdjgpp*`’) ¶

  The DJGPP port of `bash` 2.03 is unable to run the ‘`configure`’ script, it exits silently, having died writing a preamble to `config.log`. Use `bash` 2.04 or higher.

  ‘`make all`’ was found to run out of memory during the final `libgmp.la` link on one system tested, despite having 64MiB available. Running ‘`make libgmp.la`’ directly helped, perhaps recursing into the various subdirectories uses up memory.

GNU binutils `strip` prior to 2.12 ¶

  `strip` from GNU binutils 2.11 and earlier should not be used on the static libraries `libgmp.a` and `libmp.a` since it will discard all but the last of multiple archive members with the same name, like the three versions of `init.o` in `libgmp.a`. Binutils 2.12 or higher can be used successfully.

  The shared libraries `libgmp.so` and `libmp.so` are not affected by this and any version of `strip` can be used on them.

`make` syntax error ¶

  On certain versions of SCO OpenServer 5 and IRIX 6.5 the native `make` is unable to handle the long dependencies list for `libgmp.la`. The symptom is a “syntax error” on the following line of the top-level `Makefile`.

      libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES)

  Either use GNU Make, or as a workaround remove `$(libgmp_la_DEPENDENCIES)` from that line (which will make the initial build work, but if any recompiling is done `libgmp.la` might not be rebuilt).

MacOS X (‘`*-*-darwin*`’) ¶

  Libtool currently only knows how to create shared libraries on MacOS X using the native `cc` (which is a modified GCC), not a plain GCC. A static-only build should work though (‘`--disable-shared`’).

NeXT prior to 3.3 ¶

  The system compiler on old versions of NeXT was a massacred and old GCC, even if it called itself `cc`. This compiler cannot be used to build GMP, you need to get a real GCC, and install that. (NeXT may have fixed this in release 3.3 of their system.)

POWER and PowerPC ¶

  Bugs in GCC 2.7.2 (and 2.6.3) mean it can’t be used to compile GMP on POWER or PowerPC. If you want to use GCC for these machines, get GCC 2.7.2.1 (or later).

Sequent Symmetry ¶

  Use the GNU assembler instead of the system assembler, since the latter has serious bugs.

Solaris 2.6 ¶

  The system `sed` prints an error “Output line too long” when libtool builds `libgmp.la`. This doesn’t seem to cause any obvious ill effects, but GNU `sed` is recommended, to avoid any doubt.

Sparc Solaris 2.7 with gcc 2.95.2 in ‘`ABI=32`’ ¶

  A shared library build of GMP seems to fail in this combination, it builds but then fails the tests, apparently due to some incorrect data relocations within `gmp_randinit_lc_2exp_size`. The exact cause is unknown, ‘`--disable-shared`’ is recommended.

### 2.6 Performance optimization ¶

For optimal performance, build GMP for the exact CPU type of the target computer, see Build Options.

Unlike what is the case for most other programs, the compiler typically doesn’t matter much, since GMP uses assembly language for the most critical operation.

In particular for long-running GMP applications, and applications demanding extremely large numbers, building and running the `tuneup` program in the `tune` subdirectory can be important. For example,

    cd tune
    make tuneup
    ./tuneup

will generate better contents for the `gmp-mparam.h` parameter file.

To use the results, put the output in the file indicated in the ‘`Parameters for ...`’ header. Then recompile from scratch.

The `tuneup` program takes one useful parameter, ‘`-f NNN`’, which instructs the program how long to check FFT multiply parameters. If you’re going to use GMP for extremely large numbers, you may want to run `tuneup` with a large NNN value.