Node:Installation on Unix, Next:Installation on non-Unix systems, Previous:Installation and Customization, Up:Installation and Customization

### 8.1 Installation on Unix

FFTW comes with a `configure` program in the GNU style. Installation can be as simple as:

    ./configure
    make
    make install

This will build the uniprocessor complex and real transform libraries along with the test programs. (We recommend that you use GNU `make` if it is available; on some systems it is called `gmake`.) The "`make install`" command installs the fftw and rfftw libraries in standard places, and typically requires root privileges (unless you specify a different install directory with the `--prefix` flag to `configure`). You can also type "`make check`" to put the FFTW test programs through their paces. If you have problems during configuration or compilation, you may want to run "`make distclean`" before trying again; this ensures that you don't have any stale files left over from previous compilation attempts.

The `configure` script chooses the `gcc` compiler by default, if it is available; you can select some other compiler with:

    ./configure CC="<the name of your C compiler>"

The `configure` script knows good `CFLAGS` (C compiler flags) for a few systems. If your system is not known, the `configure` script will print out a warning. In this case, you should re-configure FFTW with the command

    ./configure CFLAGS="<write your CFLAGS here>"

and then compile as usual. If you do find an optimal set of `CFLAGS` for your system, please let us know what they are (along with the output of `config.guess`) so that we can include them in future releases.

`configure` supports all the standard flags defined by the GNU Coding Standards; see the `INSTALL` file in FFTW or the GNU web page. Note especially `--help` to list all flags and `--enable-shared` to create shared, rather than static, libraries. `configure` also accepts a few FFTW-specific flags, particularly:

- `--enable-float`: Produces a single-precision version of FFTW (`float`) instead of the default double-precision (`double`). See Precision.
- `--enable-long-double`: Produces a long-double precision version of FFTW (`long double`) instead of the default double-precision (`double`). The `configure` script will halt with an error message is `long double` is the same size as `double` on your machine/compiler. See Precision.
- `--enable-threads`: Enables compilation and installation of the FFTW threads library (see Multi-threaded FFTW), which provides a simple interface to parallel transforms for SMP systems. (By default, the threads routines are not compiled.)
- `--with-openmp`, `--with-sgimp`: In conjunction with `--enable-threads`, causes the multi-threaded FFTW library to use OpenMP or SGI MP compiler directives in order to induce parallelism, rather than spawning its own threads directly. (Useful especially for programs already employing such directives, in order to minimize conflicts between different parallelization mechanisms.)
- `--disable-fortran`: Disables inclusion of Fortran-callable wrapper routines (see Calling FFTW from Fortran) in the standard FFTW libraries. These wrapper routines increase the library size by only a negligible amount, so they are included by default as long as the `configure` script finds a Fortran compiler on your system.
- `--with-slow-timer`: Disables the use of hardware cycle counters, and falls back on `gettimeofday` or `clock`. This greatly worsens performance, and should generally not be used (unless you don't have a cycle counter but still really want an optimized plan regardless of the time). See Cycle Counters.
- `--enable-sse`, `--enable-sse2`, `--enable-k7`, `--enable-altivec`: Enable the compilation of SIMD code for SSE (Pentium III+), SSE2 (Pentium IV+), 3dNow! (AMD K7 and others), or AltiVec (PowerPC G4+). SSE, 3dNow!, and AltiVec only work with `--enable-float` (above), while SSE2 only works in double precision (the default). The resulting code will still work on earlier CPUs lacking the SIMD extensions (SIMD is automatically disabled, although the FFTW library is still larger).
  - These options, with the exception of `--enable-k7` (which uses assembly), require a compiler supporting SIMD extensions, and compiler support is still a bit flaky. We have tested SIMD with `gcc` versions 3.x (which miscompile AltiVec permutations on Linux, but we have an assembly workaround) and with Intel's `icc` 6.0 (which misaligns SSE constants, but we have a workaround). Some 3.x versions of `gcc` crash during compilation, and `gcc` 2.95 miscompiles AltiVec on MacOS X.
  - With the Linux kernel, you may have to recompile the kernel with the option to support SSE/SSE2/AltiVec (see the "Processor type and features" settings).
  - With AltiVec and `gcc`, you may have to use the `-mabi=altivec` option when compiling any code that links to FFTW, in order to properly align the stack; otherwise, FFTW could crash when it tries to use an AltiVec feature. (This is not necessary on MacOS X.)
  - With SSE/SSE2 and `gcc`, you should use a version of gcc that properly aligns the stack when compiling any code that links to FFTW. By default, `gcc` 2.95 and later versions align the stack as needed, but you should not use the `-Os` option or the `-mpreferred-stack-boundary` option with an argument less than 4.

To force `configure` to use a particular C compiler (instead of the default, usually `gcc`), set the environment variable `CC` to the name of the desired compiler before running `configure`; you may also need to set the flags via the variable `CFLAGS`.