This is doc/gccinstall.info, produced by makeinfo version 4.13 from
/mnt/jenkins/workspace/linaro-android_toolchain-4.7-2013.03/build/objdir/temp-src/gcc-linaro-4.7-2013.03/gcc/doc/install.texi.

Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, the Front-Cover texts being (a) (see below), and
with the Back-Cover Texts being (b) (see below).  A copy of the license
is included in the section entitled "GNU Free Documentation License".

   (a) The FSF's Front-Cover Text is:

   A GNU Manual

   (b) The FSF's Back-Cover Text is:

   You have freedom to copy and modify this GNU Manual, like GNU
software.  Copies published by the Free Software Foundation raise
funds for GNU development.

   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, the Front-Cover texts being (a) (see below), and
with the Back-Cover Texts being (b) (see below).  A copy of the license
is included in the section entitled "GNU Free Documentation License".

   (a) The FSF's Front-Cover Text is:

   A GNU Manual

   (b) The FSF's Back-Cover Text is:

   You have freedom to copy and modify this GNU Manual, like GNU
software.  Copies published by the Free Software Foundation raise
funds for GNU development.

INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* gccinstall: (gccinstall).    Installing the GNU Compiler Collection.
END-INFO-DIR-ENTRY


File: gccinstall.info,  Node: Top,  Up: (dir)

* Menu:

* Installing GCC::  This document describes the generic installation
                    procedure for GCC as well as detailing some target
                    specific installation instructions.

* Specific::        Host/target specific installation notes for GCC.
* Binaries::        Where to get pre-compiled binaries.

* Old::             Old installation documentation.

* GNU Free Documentation License:: How you can copy and share this manual.
* Concept Index::   This index has two entries.


File: gccinstall.info,  Node: Installing GCC,  Next: Binaries,  Up: Top

1 Installing GCC
****************

   The latest version of this document is always available at
http://gcc.gnu.org/install/.

   This document describes the generic installation procedure for GCC
as well as detailing some target specific installation instructions.

   GCC includes several components that previously were separate
distributions with their own installation instructions.  This document
supersedes all package specific installation instructions.

   _Before_ starting the build/install procedure please check the *note
host/target specific installation notes: Specific.  We recommend you
browse the entire generic installation instructions before you proceed.

   Lists of successful builds for released versions of GCC are
available at `http://gcc.gnu.org/buildstat.html'.  These lists are
updated as new information becomes available.

   The installation procedure itself is broken into five steps.

* Menu:

* Prerequisites::
* Downloading the source::
* Configuration::
* Building::
* Testing:: (optional)
* Final install::

   Please note that GCC does not support `make uninstall' and probably
won't do so in the near future as this would open a can of worms.
Instead, we suggest that you install GCC into a directory of its own
and simply remove that directory when you do not need that specific
version of GCC any longer, and, if shared libraries are installed there
as well, no more binaries exist that use them.


File: gccinstall.info,  Node: Prerequisites,  Next: Downloading the source,  Up: Installing GCC

2 Prerequisites
***************

   GCC requires that various tools and packages be available for use in
the build procedure.  Modifying GCC sources requires additional tools
described below.

Tools/packages necessary for building GCC
=========================================

ISO C90 compiler
     Necessary to bootstrap GCC, although versions of GCC prior to 3.4
     also allow bootstrapping with a traditional (K&R) C compiler.

     To build all languages in a cross-compiler or other configuration
     where 3-stage bootstrap is not performed, you need to start with
     an existing GCC binary (version 2.95 or later) because source code
     for language frontends other than C might use GCC extensions.

GNAT
     In order to build the Ada compiler (GNAT) you must already have
     GNAT installed because portions of the Ada frontend are written in
     Ada (with GNAT extensions.)  Refer to the Ada installation
     instructions for more specific information.

A "working" POSIX compatible shell, or GNU bash
     Necessary when running `configure' because some `/bin/sh' shells
     have bugs and may crash when configuring the target libraries.  In
     other cases, `/bin/sh' or `ksh' have disastrous corner-case
     performance problems.  This can cause target `configure' runs to
     literally take days to complete in some cases.

     So on some platforms `/bin/ksh' is sufficient, on others it isn't.
     See the host/target specific instructions for your platform, or
     use `bash' to be sure.  Then set `CONFIG_SHELL' in your
     environment to your "good" shell prior to running
     `configure'/`make'.

     `zsh' is not a fully compliant POSIX shell and will not work when
     configuring GCC.

A POSIX or SVR4 awk
     Necessary for creating some of the generated source files for GCC.
     If in doubt, use a recent GNU awk version, as some of the older
     ones are broken.  GNU awk version 3.1.5 is known to work.

GNU binutils
     Necessary in some circumstances, optional in others.  See the
     host/target specific instructions for your platform for the exact
     requirements.

gzip version 1.2.4 (or later) or
bzip2 version 1.0.2 (or later)
     Necessary to uncompress GCC `tar' files when source code is
     obtained via FTP mirror sites.

GNU make version 3.80 (or later)
     You must have GNU make installed to build GCC.

GNU tar version 1.14 (or later)
     Necessary (only on some platforms) to untar the source code.  Many
     systems' `tar' programs will also work, only try GNU `tar' if you
     have problems.

Perl version 5.6.1 (or later)
     Necessary when targetting Darwin, building `libstdc++', and not
     using `--disable-symvers'.  Necessary when targetting Solaris 2
     with Sun `ld' and not using `--disable-symvers'.  The bundled
     `perl' in Solaris 8 and up works.

     Necessary when regenerating `Makefile' dependencies in libiberty.
     Necessary when regenerating `libiberty/functions.texi'.  Necessary
     when generating manpages from Texinfo manuals.  Used by various
     scripts to generate some files included in SVN (mainly
     Unicode-related and rarely changing) from source tables.

`jar', or InfoZIP (`zip' and `unzip')
     Necessary to build libgcj, the GCJ runtime.


   Several support libraries are necessary to build GCC, some are
required, others optional.  While any sufficiently new version of
required tools usually work, library requirements are generally
stricter.  Newer versions may work in some cases, but it's safer to use
the exact versions documented.  We appreciate bug reports about
problems with newer versions, though.  If your OS vendor provides
packages for the support libraries then using those packages may be the
simplest way to install the libraries.

GNU Multiple Precision Library (GMP) version 4.3.2 (or later)
     Necessary to build GCC.  If a GMP source distribution is found in a
     subdirectory of your GCC sources named `gmp', it will be built
     together with GCC.  Alternatively, if GMP is already installed but
     it is not in your library search path, you will have to configure
     with the `--with-gmp' configure option.  See also `--with-gmp-lib'
     and `--with-gmp-include'.

MPFR Library version 2.4.2 (or later)
     Necessary to build GCC.  It can be downloaded from
     `http://www.mpfr.org/'.  If an MPFR source distribution is found
     in a subdirectory of your GCC sources named `mpfr', it will be
     built together with GCC.  Alternatively, if MPFR is already
     installed but it is not in your default library search path, the
     `--with-mpfr' configure option should be used.  See also
     `--with-mpfr-lib' and `--with-mpfr-include'.

MPC Library version 0.8.1 (or later)
     Necessary to build GCC.  It can be downloaded from
     `http://www.multiprecision.org/'.  If an MPC source distribution
     is found in a subdirectory of your GCC sources named `mpc', it
     will be built together with GCC.  Alternatively, if MPC is already
     installed but it is not in your default library search path, the
     `--with-mpc' configure option should be used.  See also
     `--with-mpc-lib' and `--with-mpc-include'.

Parma Polyhedra Library (PPL) version 0.11
     Necessary to build GCC with the Graphite loop optimizations.  It
     can be downloaded from `http://www.cs.unipr.it/ppl/Download/'.

     The `--with-ppl' configure option should be used if PPL is not
     installed in your default library search path.

CLooG-PPL version 0.15 or CLooG 0.16
     Necessary to build GCC with the Graphite loop optimizations.  There
     are two versions available.  CLooG-PPL 0.15 as well as CLooG 0.16.
     The former is the default right now.  It can be downloaded from
     `ftp://gcc.gnu.org/pub/gcc/infrastructure/' as
     `cloog-ppl-0.15.tar.gz'.

     CLooG 0.16 support is still in testing stage, but will be the
     default in future GCC releases.  It is also available at
     `ftp://gcc.gnu.org/pub/gcc/infrastructure/' as
     `cloog-0.16.1.tar.gz'.  To use it add the additional configure
     option `--enable-cloog-backend=isl'.  Even if CLooG 0.16 does not
     use PPL, PPL is still required for Graphite.

     In both cases `--with-cloog' configure option should be used if
     CLooG is not installed in your default library search path.


Tools/packages necessary for modifying GCC
==========================================

autoconf version 2.64
GNU m4 version 1.4.6 (or later)
     Necessary when modifying `configure.ac', `aclocal.m4', etc.  to
     regenerate `configure' and `config.in' files.

automake version 1.11.1
     Necessary when modifying a `Makefile.am' file to regenerate its
     associated `Makefile.in'.

     Much of GCC does not use automake, so directly edit the
     `Makefile.in' file.  Specifically this applies to the `gcc',
     `intl', `libcpp', `libiberty', `libobjc' directories as well as
     any of their subdirectories.

     For directories that use automake, GCC requires the latest release
     in the 1.11 series, which is currently 1.11.1.  When regenerating
     a directory to a newer version, please update all the directories
     using an older 1.11 to the latest released version.

gettext version 0.14.5 (or later)
     Needed to regenerate `gcc.pot'.

gperf version 2.7.2 (or later)
     Necessary when modifying `gperf' input files, e.g.
     `gcc/cp/cfns.gperf' to regenerate its associated header file, e.g.
     `gcc/cp/cfns.h'.

DejaGnu 1.4.4
Expect
Tcl
     Necessary to run the GCC testsuite; see the section on testing for
     details.

autogen version 5.5.4 (or later) and
guile version 1.4.1 (or later)
     Necessary to regenerate `fixinc/fixincl.x' from
     `fixinc/inclhack.def' and `fixinc/*.tpl'.

     Necessary to run `make check' for `fixinc'.

     Necessary to regenerate the top level `Makefile.in' file from
     `Makefile.tpl' and `Makefile.def'.

Flex version 2.5.4 (or later)
     Necessary when modifying `*.l' files.

     Necessary to build GCC during development because the generated
     output files are not included in the SVN repository.  They are
     included in releases.

Texinfo version 4.7 (or later)
     Necessary for running `makeinfo' when modifying `*.texi' files to
     test your changes.

     Necessary for running `make dvi' or `make pdf' to create printable
     documentation in DVI or PDF format.  Texinfo version 4.8 or later
     is required for `make pdf'.

     Necessary to build GCC documentation during development because the
     generated output files are not included in the SVN repository.
     They are included in releases.

TeX (any working version)
     Necessary for running `texi2dvi' and `texi2pdf', which are used
     when running `make dvi' or `make pdf' to create DVI or PDF files,
     respectively.

SVN (any version)
SSH (any version)
     Necessary to access the SVN repository.  Public releases and weekly
     snapshots of the development sources are also available via FTP.

GNU diffutils version 2.7 (or later)
     Useful when submitting patches for the GCC source code.

patch version 2.5.4 (or later)
     Necessary when applying patches, created with `diff', to one's own
     sources.

ecj1
gjavah
     If you wish to modify `.java' files in libjava, you will need to
     configure with `--enable-java-maintainer-mode', and you will need
     to have executables named `ecj1' and `gjavah' in your path.  The
     `ecj1' executable should run the Eclipse Java compiler via the
     GCC-specific entry point.  You can download a suitable jar from
     `ftp://sourceware.org/pub/java/', or by running the script
     `contrib/download_ecj'.

antlr.jar version 2.7.1 (or later)
antlr binary
     If you wish to build the `gjdoc' binary in libjava, you will need
     to have an `antlr.jar' library available. The library is searched
     for in system locations but can be specified with
     `--with-antlr-jar=' instead.  When configuring with
     `--enable-java-maintainer-mode', you will need to have one of the
     executables named `cantlr', `runantlr' or `antlr' in your path.



File: gccinstall.info,  Node: Downloading the source,  Next: Configuration,  Prev: Prerequisites,  Up: Installing GCC

3 Downloading GCC
*****************

   GCC is distributed via SVN and FTP tarballs compressed with `gzip' or
`bzip2'.  It is possible to download a full distribution or specific
components.

   Please refer to the releases web page for information on how to
obtain GCC.

   The full distribution includes the C, C++, Objective-C, Fortran,
Java, and Ada (in the case of GCC 3.1 and later) compilers.  The full
distribution also includes runtime libraries for C++, Objective-C,
Fortran, and Java.  In GCC 3.0 and later versions, the GNU compiler
testsuites are also included in the full distribution.

   If you choose to download specific components, you must download the
core GCC distribution plus any language specific distributions you wish
to use.  The core distribution includes the C language front end as
well as the shared components.  Each language has a tarball which
includes the language front end as well as the language runtime (when
appropriate).

   Unpack the core distribution as well as any language specific
distributions in the same directory.

   If you also intend to build binutils (either to upgrade an existing
installation or for use in place of the corresponding tools of your
OS), unpack the binutils distribution either in the same directory or a
separate one.  In the latter case, add symbolic links to any components
of the binutils you intend to build alongside the compiler (`bfd',
`binutils', `gas', `gprof', `ld', `opcodes', ...) to the directory
containing the GCC sources.

   Likewise the GMP, MPFR and MPC libraries can be automatically built
together with GCC.  Unpack the GMP, MPFR and/or MPC source
distributions in the directory containing the GCC sources and rename
their directories to `gmp', `mpfr' and `mpc', respectively (or use
symbolic links with the same name).


File: gccinstall.info,  Node: Configuration,  Next: Building,  Prev: Downloading the source,  Up: Installing GCC

4 Installing GCC: Configuration
*******************************

   Like most GNU software, GCC must be configured before it can be
built.  This document describes the recommended configuration procedure
for both native and cross targets.

   We use SRCDIR to refer to the toplevel source directory for GCC; we
use OBJDIR to refer to the toplevel build/object directory.

   If you obtained the sources via SVN, SRCDIR must refer to the top
`gcc' directory, the one where the `MAINTAINERS' file can be found, and
not its `gcc' subdirectory, otherwise the build will fail.

   If either SRCDIR or OBJDIR is located on an automounted NFS file
system, the shell's built-in `pwd' command will return temporary
pathnames.  Using these can lead to various sorts of build problems.
To avoid this issue, set the `PWDCMD' environment variable to an
automounter-aware `pwd' command, e.g., `pawd' or `amq -w', during the
configuration and build phases.

   First, we *highly* recommend that GCC be built into a separate
directory from the sources which does *not* reside within the source
tree.  This is how we generally build GCC; building where SRCDIR ==
OBJDIR should still work, but doesn't get extensive testing; building
where OBJDIR is a subdirectory of SRCDIR is unsupported.

   If you have previously built GCC in the same directory for a
different target machine, do `make distclean' to delete all files that
might be invalid.  One of the files this deletes is `Makefile'; if
`make distclean' complains that `Makefile' does not exist or issues a
message like "don't know how to make distclean" it probably means that
the directory is already suitably clean.  However, with the recommended
method of building in a separate OBJDIR, you should simply use a
different OBJDIR for each target.

   Second, when configuring a native system, either `cc' or `gcc' must
be in your path or you must set `CC' in your environment before running
configure.  Otherwise the configuration scripts may fail.

   To configure GCC:

     % mkdir OBJDIR
     % cd OBJDIR
     % SRCDIR/configure [OPTIONS] [TARGET]

Distributor options
===================

If you will be distributing binary versions of GCC, with modifications
to the source code, you should use the options described in this
section to make clear that your version contains modifications.

`--with-pkgversion=VERSION'
     Specify a string that identifies your package.  You may wish to
     include a build number or build date.  This version string will be
     included in the output of `gcc --version'.  This suffix does not
     replace the default version string, only the `GCC' part.

     The default value is `GCC'.

`--with-bugurl=URL'
     Specify the URL that users should visit if they wish to report a
     bug.  You are of course welcome to forward bugs reported to you to
     the FSF, if you determine that they are not bugs in your
     modifications.

     The default value refers to the FSF's GCC bug tracker.


Target specification
====================

   * GCC has code to correctly determine the correct value for TARGET
     for nearly all native systems.  Therefore, we highly recommend you
     do not provide a configure target when configuring a native
     compiler.

   * TARGET must be specified as `--target=TARGET' when configuring a
     cross compiler; examples of valid targets would be m68k-elf,
     sh-elf, etc.

   * Specifying just TARGET instead of `--target=TARGET' implies that
     the host defaults to TARGET.

Options specification
=====================

Use OPTIONS to override several configure time options for GCC.  A list
of supported OPTIONS follows; `configure --help' may list other
options, but those not listed below may not work and should not
normally be used.

   Note that each `--enable' option has a corresponding `--disable'
option and that each `--with' option has a corresponding `--without'
option.

`--prefix=DIRNAME'
     Specify the toplevel installation directory.  This is the
     recommended way to install the tools into a directory other than
     the default.  The toplevel installation directory defaults to
     `/usr/local'.

     We *highly* recommend against DIRNAME being the same or a
     subdirectory of OBJDIR or vice versa.  If specifying a directory
     beneath a user's home directory tree, some shells will not expand
     DIRNAME correctly if it contains the `~' metacharacter; use
     `$HOME' instead.

     The following standard `autoconf' options are supported.  Normally
     you should not need to use these options.
    `--exec-prefix=DIRNAME'
          Specify the toplevel installation directory for
          architecture-dependent files.  The default is `PREFIX'.

    `--bindir=DIRNAME'
          Specify the installation directory for the executables called
          by users (such as `gcc' and `g++').  The default is
          `EXEC-PREFIX/bin'.

    `--libdir=DIRNAME'
          Specify the installation directory for object code libraries
          and internal data files of GCC.  The default is
          `EXEC-PREFIX/lib'.

    `--libexecdir=DIRNAME'
          Specify the installation directory for internal executables
          of GCC.  The default is `EXEC-PREFIX/libexec'.

    `--with-slibdir=DIRNAME'
          Specify the installation directory for the shared libgcc
          library.  The default is `LIBDIR'.

    `--datarootdir=DIRNAME'
          Specify the root of the directory tree for read-only
          architecture-independent data files referenced by GCC.  The
          default is `PREFIX/share'.

    `--infodir=DIRNAME'
          Specify the installation directory for documentation in info
          format.  The default is `DATAROOTDIR/info'.

    `--datadir=DIRNAME'
          Specify the installation directory for some
          architecture-independent data files referenced by GCC.  The
          default is `DATAROOTDIR'.

    `--docdir=DIRNAME'
          Specify the installation directory for documentation files
          (other than Info) for GCC.  The default is `DATAROOTDIR/doc'.

    `--htmldir=DIRNAME'
          Specify the installation directory for HTML documentation
          files.  The default is `DOCDIR'.

    `--pdfdir=DIRNAME'
          Specify the installation directory for PDF documentation
          files.  The default is `DOCDIR'.

    `--mandir=DIRNAME'
          Specify the installation directory for manual pages.  The
          default is `DATAROOTDIR/man'.  (Note that the manual pages
          are only extracts from the full GCC manuals, which are
          provided in Texinfo format.  The manpages are derived by an
          automatic conversion process from parts of the full manual.)

    `--with-gxx-include-dir=DIRNAME'
          Specify the installation directory for G++ header files.  The
          default depends on other configuration options, and differs
          between cross and native configurations.

    `--with-specs=SPECS'
          Specify additional command line driver SPECS.  This can be
          useful if you need to turn on a non-standard feature by
          default without modifying the compiler's source code, for
          instance
          `--with-specs=%{!fcommon:%{!fno-common:-fno-common}}'.  *Note
          Specifying subprocesses and the switches to pass to them:
          (gcc)Spec Files,


`--program-prefix=PREFIX'
     GCC supports some transformations of the names of its programs when
     installing them.  This option prepends PREFIX to the names of
     programs to install in BINDIR (see above).  For example, specifying
     `--program-prefix=foo-' would result in `gcc' being installed as
     `/usr/local/bin/foo-gcc'.

`--program-suffix=SUFFIX'
     Appends SUFFIX to the names of programs to install in BINDIR (see
     above).  For example, specifying `--program-suffix=-3.1' would
     result in `gcc' being installed as `/usr/local/bin/gcc-3.1'.

`--program-transform-name=PATTERN'
     Applies the `sed' script PATTERN to be applied to the names of
     programs to install in BINDIR (see above).  PATTERN has to consist
     of one or more basic `sed' editing commands, separated by
     semicolons.  For example, if you want the `gcc' program name to be
     transformed to the installed program `/usr/local/bin/myowngcc' and
     the `g++' program name to be transformed to
     `/usr/local/bin/gspecial++' without changing other program names,
     you could use the pattern
     `--program-transform-name='s/^gcc$/myowngcc/; s/^g++$/gspecial++/''
     to achieve this effect.

     All three options can be combined and used together, resulting in
     more complex conversion patterns.  As a basic rule, PREFIX (and
     SUFFIX) are prepended (appended) before further transformations
     can happen with a special transformation script PATTERN.

     As currently implemented, this option only takes effect for native
     builds; cross compiler binaries' names are not transformed even
     when a transformation is explicitly asked for by one of these
     options.

     For native builds, some of the installed programs are also
     installed with the target alias in front of their name, as in
     `i686-pc-linux-gnu-gcc'.  All of the above transformations happen
     before the target alias is prepended to the name--so, specifying
     `--program-prefix=foo-' and `program-suffix=-3.1', the resulting
     binary would be installed as
     `/usr/local/bin/i686-pc-linux-gnu-foo-gcc-3.1'.

     As a last shortcoming, none of the installed Ada programs are
     transformed yet, which will be fixed in some time.

`--with-local-prefix=DIRNAME'
     Specify the installation directory for local include files.  The
     default is `/usr/local'.  Specify this option if you want the
     compiler to search directory `DIRNAME/include' for locally
     installed header files _instead_ of `/usr/local/include'.

     You should specify `--with-local-prefix' *only* if your site has a
     different convention (not `/usr/local') for where to put
     site-specific files.

     The default value for `--with-local-prefix' is `/usr/local'
     regardless of the value of `--prefix'.  Specifying `--prefix' has
     no effect on which directory GCC searches for local header files.
     This may seem counterintuitive, but actually it is logical.

     The purpose of `--prefix' is to specify where to _install GCC_.
     The local header files in `/usr/local/include'--if you put any in
     that directory--are not part of GCC.  They are part of other
     programs--perhaps many others.  (GCC installs its own header files
     in another directory which is based on the `--prefix' value.)

     Both the local-prefix include directory and the GCC-prefix include
     directory are part of GCC's "system include" directories.
     Although these two directories are not fixed, they need to be
     searched in the proper order for the correct processing of the
     include_next directive.  The local-prefix include directory is
     searched before the GCC-prefix include directory.  Another
     characteristic of system include directories is that pedantic
     warnings are turned off for headers in these directories.

     Some autoconf macros add `-I DIRECTORY' options to the compiler
     command line, to ensure that directories containing installed
     packages' headers are searched.  When DIRECTORY is one of GCC's
     system include directories, GCC will ignore the option so that
     system directories continue to be processed in the correct order.
     This may result in a search order different from what was
     specified but the directory will still be searched.

     GCC automatically searches for ordinary libraries using
     `GCC_EXEC_PREFIX'.  Thus, when the same installation prefix is
     used for both GCC and packages, GCC will automatically search for
     both headers and libraries.  This provides a configuration that is
     easy to use.  GCC behaves in a manner similar to that when it is
     installed as a system compiler in `/usr'.

     Sites that need to install multiple versions of GCC may not want to
     use the above simple configuration.  It is possible to use the
     `--program-prefix', `--program-suffix' and
     `--program-transform-name' options to install multiple versions
     into a single directory, but it may be simpler to use different
     prefixes and the `--with-local-prefix' option to specify the
     location of the site-specific files for each version.  It will
     then be necessary for users to specify explicitly the location of
     local site libraries (e.g., with `LIBRARY_PATH').

     The same value can be used for both `--with-local-prefix' and
     `--prefix' provided it is not `/usr'.  This can be used to avoid
     the default search of `/usr/local/include'.

     *Do not* specify `/usr' as the `--with-local-prefix'!  The
     directory you use for `--with-local-prefix' *must not* contain any
     of the system's standard header files.  If it did contain them,
     certain programs would be miscompiled (including GNU Emacs, on
     certain targets), because this would override and nullify the
     header file corrections made by the `fixincludes' script.

     Indications are that people who use this option use it based on
     mistaken ideas of what it is for.  People use it as if it
     specified where to install part of GCC.  Perhaps they make this
     assumption because installing GCC creates the directory.

`--with-native-system-header-dir=DIRNAME'
     Specifies that DIRNAME is the directory that contains native system
     header files, rather than `/usr/include'.  This option is most
     useful if you are creating a compiler that should be isolated from
     the system as much as possible.  It is most commonly used with the
     `--with-sysroot' option and will cause GCC to search DIRNAME
     inside the system root specified by that option.

`--enable-shared[=PACKAGE[,...]]'
     Build shared versions of libraries, if shared libraries are
     supported on the target platform.  Unlike GCC 2.95.x and earlier,
     shared libraries are enabled by default on all platforms that
     support shared libraries.

     If a list of packages is given as an argument, build shared
     libraries only for the listed packages.  For other packages, only
     static libraries will be built.  Package names currently
     recognized in the GCC tree are `libgcc' (also known as `gcc'),
     `libstdc++' (not `libstdc++-v3'), `libffi', `zlib', `boehm-gc',
     `ada', `libada', `libjava', `libgo', and `libobjc'.  Note
     `libiberty' does not support shared libraries at all.

     Use `--disable-shared' to build only static libraries.  Note that
     `--disable-shared' does not accept a list of package names as
     argument, only `--enable-shared' does.

`--with-gnu-as'
     Specify that the compiler should assume that the assembler it
     finds is the GNU assembler.  However, this does not modify the
     rules to find an assembler and will result in confusion if the
     assembler found is not actually the GNU assembler.  (Confusion may
     also result if the compiler finds the GNU assembler but has not
     been configured with `--with-gnu-as'.)  If you have more than one
     assembler installed on your system, you may want to use this
     option in connection with `--with-as=PATHNAME' or
     `--with-build-time-tools=PATHNAME'.

     The following systems are the only ones where it makes a difference
     whether you use the GNU assembler.  On any other system,
     `--with-gnu-as' has no effect.

        * `hppa1.0-ANY-ANY'

        * `hppa1.1-ANY-ANY'

        * `sparc-sun-solaris2.ANY'

        * `sparc64-ANY-solaris2.ANY'

`--with-as=PATHNAME'
     Specify that the compiler should use the assembler pointed to by
     PATHNAME, rather than the one found by the standard rules to find
     an assembler, which are:
        * Unless GCC is being built with a cross compiler, check the
          `LIBEXEC/gcc/TARGET/VERSION' directory.  LIBEXEC defaults to
          `EXEC-PREFIX/libexec'; EXEC-PREFIX defaults to PREFIX, which
          defaults to `/usr/local' unless overridden by the
          `--prefix=PATHNAME' switch described above.  TARGET is the
          target system triple, such as `sparc-sun-solaris2.7', and
          VERSION denotes the GCC version, such as 3.0.

        * If the target system is the same that you are building on,
          check operating system specific directories (e.g.
          `/usr/ccs/bin' on Sun Solaris 2).

        * Check in the `PATH' for a tool whose name is prefixed by the
          target system triple.

        * Check in the `PATH' for a tool whose name is not prefixed by
          the target system triple, if the host and target system
          triple are the same (in other words, we use a host tool if it
          can be used for the target as well).

     You may want to use `--with-as' if no assembler is installed in
     the directories listed above, or if you have multiple assemblers
     installed and want to choose one that is not found by the above
     rules.

`--with-gnu-ld'
     Same as `--with-gnu-as' but for the linker.

`--with-ld=PATHNAME'
     Same as `--with-as' but for the linker.

`--with-stabs'
     Specify that stabs debugging information should be used instead of
     whatever format the host normally uses.  Normally GCC uses the
     same debug format as the host system.

     On MIPS based systems and on Alphas, you must specify whether you
     want GCC to create the normal ECOFF debugging format, or to use
     BSD-style stabs passed through the ECOFF symbol table.  The normal
     ECOFF debug format cannot fully handle languages other than C.
     BSD stabs format can handle other languages, but it only works
     with the GNU debugger GDB.

     Normally, GCC uses the ECOFF debugging format by default; if you
     prefer BSD stabs, specify `--with-stabs' when you configure GCC.

     No matter which default you choose when you configure GCC, the user
     can use the `-gcoff' and `-gstabs+' options to specify explicitly
     the debug format for a particular compilation.

     `--with-stabs' is meaningful on the ISC system on the 386, also, if
     `--with-gas' is used.  It selects use of stabs debugging
     information embedded in COFF output.  This kind of debugging
     information supports C++ well; ordinary COFF debugging information
     does not.

     `--with-stabs' is also meaningful on 386 systems running SVR4.  It
     selects use of stabs debugging information embedded in ELF output.
     The C++ compiler currently (2.6.0) does not support the DWARF
     debugging information normally used on 386 SVR4 platforms; stabs
     provide a workable alternative.  This requires gas and gdb, as the
     normal SVR4 tools can not generate or interpret stabs.

`--with-tls=DIALECT'
     Specify the default TLS dialect, for systems were there is a
     choice.  For ARM targets, possible values for DIALECT are `gnu' or
     `gnu2', which select between the original GNU dialect and the GNU
     TLS descriptor-based dialect.

`--enable-multiarch'
     Specify whether to enable or disable multiarch support.  The
     default is to check for glibc start files in a multiarch location,
     and enable it if the files are found.  The auto detection is
     enabled for native builds, and for cross builds configured with
     `--with-sysroot', and without `--with-native-system-header-dir'.
     More documentation about multiarch can be found at
     `http://wiki.debian.org/Multiarch'.

`--disable-multilib'
     Specify that multiple target libraries to support different target
     variants, calling conventions, etc. should not be built.  The
     default is to build a predefined set of them.

`--enable-multiarch'
     Specify whether to enable or disable multiarch support.  The
     default is to check for glibc start files in a multiarch location,
     and enable it if the files are found.  The auto detection is
     enabled for native builds, and for cross builds configured with
     `--with-sysroot', and without `--with-native-system-header-dir'.
     More documentation about multiarch can be found at
     `http://wiki.debian.org/Multiarch'.

     Some targets provide finer-grained control over which multilibs
     are built (e.g., `--disable-softfloat'):
    `arm-*-*'
          fpu, 26bit, underscore, interwork, biendian, nofmult.

    `m68*-*-*'
          softfloat, m68881, m68000, m68020.

    `mips*-*-*'
          single-float, biendian, softfloat.

    `powerpc*-*-*, rs6000*-*-*'
          aix64, pthread, softfloat, powercpu, powerpccpu, powerpcos,
          biendian, sysv, aix.


`--with-multilib-list=LIST'
`--without-multilib-list'
     Specify what multilibs to build.  Currently only implemented for
     sh*-*-* and x86-64-*-linux*.

    `sh*-*-*'
          LIST is a comma separated list of CPU names.  These must be
          of the form `sh*' or `m*' (in which case they match the
          compiler option for that processor).  The list should not
          contain any endian options - these are handled by
          `--with-endian'.

          If LIST is empty, then there will be no multilibs for extra
          processors.  The multilib for the secondary endian remains
          enabled.

          As a special case, if an entry in the list starts with a `!'
          (exclamation point), then it is added to the list of excluded
          multilibs.  Entries of this sort should be compatible with
          `MULTILIB_EXCLUDES' (once the leading `!' has been stripped).

          If `--with-multilib-list' is not given, then a default set of
          multilibs is selected based on the value of `--target'.  This
          is usually the complete set of libraries, but some targets
          imply a more specialized subset.

          Example 1: to configure a compiler for SH4A only, but
          supporting both endians, with little endian being the default:
               --with-cpu=sh4a --with-endian=little,big --with-multilib-list=

          Example 2: to configure a compiler for both SH4A and
          SH4AL-DSP, but with only little endian SH4AL:
               --with-cpu=sh4a --with-endian=little,big \
               --with-multilib-list=sh4al,!mb/m4al

    `x86-64-*-linux*'
          LIST is a comma separated list of `m32', `m64' and `mx32' to
          enable 32-bit, 64-bit and x32 run-time libraries,
          respectively.  If LIST is empty, then there will be no
          multilibs and only the default run-time library will be
          enabled.

          If `--with-multilib-list' is not given, then only 32-bit and
          64-bit run-time libraries will be enabled.

`--with-endian=ENDIANS'
     Specify what endians to use.  Currently only implemented for
     sh*-*-*.

     ENDIANS may be one of the following:
    `big'
          Use big endian exclusively.

    `little'
          Use little endian exclusively.

    `big,little'
          Use big endian by default.  Provide a multilib for little
          endian.

    `little,big'
          Use little endian by default.  Provide a multilib for big
          endian.

`--enable-threads'
     Specify that the target supports threads.  This affects the
     Objective-C compiler and runtime library, and exception handling
     for other languages like C++ and Java.  On some systems, this is
     the default.

     In general, the best (and, in many cases, the only known) threading
     model available will be configured for use.  Beware that on some
     systems, GCC has not been taught what threading models are
     generally available for the system.  In this case,
     `--enable-threads' is an alias for `--enable-threads=single'.

`--disable-threads'
     Specify that threading support should be disabled for the system.
     This is an alias for `--enable-threads=single'.

`--enable-threads=LIB'
     Specify that LIB is the thread support library.  This affects the
     Objective-C compiler and runtime library, and exception handling
     for other languages like C++ and Java.  The possibilities for LIB
     are:

    `aix'
          AIX thread support.

    `dce'
          DCE thread support.

    `lynx'
          LynxOS thread support.

    `mipssde'
          MIPS SDE thread support.

    `no'
          This is an alias for `single'.

    `posix'
          Generic POSIX/Unix98 thread support.

    `rtems'
          RTEMS thread support.

    `single'
          Disable thread support, should work for all platforms.

    `tpf'
          TPF thread support.

    `vxworks'
          VxWorks thread support.

    `win32'
          Microsoft Win32 API thread support.

`--enable-tls'
     Specify that the target supports TLS (Thread Local Storage).
     Usually configure can correctly determine if TLS is supported.  In
     cases where it guesses incorrectly, TLS can be explicitly enabled
     or disabled with `--enable-tls' or `--disable-tls'.  This can
     happen if the assembler supports TLS but the C library does not,
     or if the assumptions made by the configure test are incorrect.

`--disable-tls'
     Specify that the target does not support TLS.  This is an alias
     for `--enable-tls=no'.

`--with-cpu=CPU'
`--with-cpu-32=CPU'
`--with-cpu-64=CPU'
     Specify which cpu variant the compiler should generate code for by
     default.  CPU will be used as the default value of the `-mcpu='
     switch.  This option is only supported on some targets, including
     ARM, i386, M68k, PowerPC, and SPARC.  The `--with-cpu-32' and
     `--with-cpu-64' options specify separate default CPUs for 32-bit
     and 64-bit modes; these options are only supported for i386,
     x86-64 and PowerPC.

`--with-schedule=CPU'
`--with-arch=CPU'
`--with-arch-32=CPU'
`--with-arch-64=CPU'
`--with-tune=CPU'
`--with-tune-32=CPU'
`--with-tune-64=CPU'
`--with-abi=ABI'
`--with-fpu=TYPE'
`--with-float=TYPE'
     These configure options provide default values for the
     `-mschedule=', `-march=', `-mtune=', `-mabi=', and `-mfpu='
     options and for `-mhard-float' or `-msoft-float'.  As with
     `--with-cpu', which switches will be accepted and acceptable values
     of the arguments depend on the target.

`--with-mode=MODE'
     Specify if the compiler should default to `-marm' or `-mthumb'.
     This option is only supported on ARM targets.

`--with-stack-offset=NUM'
     This option sets the default for the -mstack-offset=NUM option,
     and will thus generally also control the setting of this option for
     libraries.  This option is only supported on Epiphany targets.

`--with-fpmath=ISA'
     This options sets `-mfpmath=sse' by default and specifies the
     default ISA for floating-point arithmetics.  You can select either
     `sse' which enables `-msse2' or `avx' which enables `-mavx' by
     default.  This option is only supported on i386 and x86-64 targets.

`--with-divide=TYPE'
     Specify how the compiler should generate code for checking for
     division by zero.  This option is only supported on the MIPS
     target.  The possibilities for TYPE are:
    `traps'
          Division by zero checks use conditional traps (this is the
          default on systems that support conditional traps).

    `breaks'
          Division by zero checks use the break instruction.

`--with-llsc'
     On MIPS targets, make `-mllsc' the default when no `-mno-llsc'
     option is passed.  This is the default for Linux-based targets, as
     the kernel will emulate them if the ISA does not provide them.

`--without-llsc'
     On MIPS targets, make `-mno-llsc' the default when no `-mllsc'
     option is passed.

`--with-synci'
     On MIPS targets, make `-msynci' the default when no `-mno-synci'
     option is passed.

`--without-synci'
     On MIPS targets, make `-mno-synci' the default when no `-msynci'
     option is passed.  This is the default.

`--with-mips-plt'
     On MIPS targets, make use of copy relocations and PLTs.  These
     features are extensions to the traditional SVR4-based MIPS ABIs
     and require support from GNU binutils and the runtime C library.

`--enable-__cxa_atexit'
     Define if you want to use __cxa_atexit, rather than atexit, to
     register C++ destructors for local statics and global objects.
     This is essential for fully standards-compliant handling of
     destructors, but requires __cxa_atexit in libc.  This option is
     currently only available on systems with GNU libc.  When enabled,
     this will cause `-fuse-cxa-atexit' to be passed by default.

`--enable-gnu-indirect-function'
     Define if you want to enable the `ifunc' attribute.  This option is
     currently only available on systems with GNU libc on certain
     targets.

`--enable-target-optspace'
     Specify that target libraries should be optimized for code space
     instead of code speed.  This is the default for the m32r platform.

`--with-cpp-install-dir=DIRNAME'
     Specify that the user visible `cpp' program should be installed in
     `PREFIX/DIRNAME/cpp', in addition to BINDIR.

`--enable-comdat'
     Enable COMDAT group support.  This is primarily used to override
     the automatically detected value.

`--enable-initfini-array'
     Force the use of sections `.init_array' and `.fini_array' (instead
     of `.init' and `.fini') for constructors and destructors.  Option
     `--disable-initfini-array' has the opposite effect.  If neither
     option is specified, the configure script will try to guess
     whether the `.init_array' and `.fini_array' sections are supported
     and, if they are, use them.

`--enable-build-with-cxx'
     Build GCC using a C++ compiler rather than a C compiler.  This is
     an experimental option which may become the default in a later
     release.

`--enable-build-poststage1-with-cxx'
     When bootstrapping, build stages 2 and 3 of GCC using a C++
     compiler rather than a C compiler.  Stage 1 is still built with a
     C compiler.  This is enabled by default and may be disabled using
     `--disable-build-poststage1-with-cxx'.

`--enable-maintainer-mode'
     The build rules that regenerate the Autoconf and Automake output
     files as well as the GCC master message catalog `gcc.pot' are
     normally disabled.  This is because it can only be rebuilt if the
     complete source tree is present.  If you have changed the sources
     and want to rebuild the catalog, configuring with
     `--enable-maintainer-mode' will enable this.  Note that you need a
     recent version of the `gettext' tools to do so.

`--disable-bootstrap'
     For a native build, the default configuration is to perform a
     3-stage bootstrap of the compiler when `make' is invoked, testing
     that GCC can compile itself correctly.  If you want to disable
     this process, you can configure with `--disable-bootstrap'.

`--enable-bootstrap'
     In special cases, you may want to perform a 3-stage build even if
     the target and host triplets are different.  This is possible when
     the host can run code compiled for the target (e.g. host is
     i686-linux, target is i486-linux).  Starting from GCC 4.2, to do
     this you have to configure explicitly with `--enable-bootstrap'.

`--enable-generated-files-in-srcdir'
     Neither the .c and .h files that are generated from Bison and flex
     nor the info manuals and man pages that are built from the .texi
     files are present in the SVN development tree.  When building GCC
     from that development tree, or from one of our snapshots, those
     generated files are placed in your build directory, which allows
     for the source to be in a readonly directory.

     If you configure with `--enable-generated-files-in-srcdir' then
     those generated files will go into the source directory.  This is
     mainly intended for generating release or prerelease tarballs of
     the GCC sources, since it is not a requirement that the users of
     source releases to have flex, Bison, or makeinfo.

`--enable-version-specific-runtime-libs'
     Specify that runtime libraries should be installed in the compiler
     specific subdirectory (`LIBDIR/gcc') rather than the usual places.
     In addition, `libstdc++''s include files will be installed into
     `LIBDIR' unless you overruled it by using
     `--with-gxx-include-dir=DIRNAME'.  Using this option is
     particularly useful if you intend to use several versions of GCC in
     parallel.  This is currently supported by `libgfortran',
     `libjava', `libmudflap', `libstdc++', and `libobjc'.

`--enable-languages=LANG1,LANG2,...'
     Specify that only a particular subset of compilers and their
     runtime libraries should be built.  For a list of valid values for
     LANGN you can issue the following command in the `gcc' directory
     of your GCC source tree:
          grep language= */config-lang.in
     Currently, you can use any of the following: `all', `ada', `c',
     `c++', `fortran', `go', `java', `objc', `obj-c++'.  Building the
     Ada compiler has special requirements, see below.  If you do not
     pass this flag, or specify the option `all', then all default
     languages available in the `gcc' sub-tree will be configured.
     Ada, Go and Objective-C++ are not default languages; the rest are.

`--enable-stage1-languages=LANG1,LANG2,...'
     Specify that a particular subset of compilers and their runtime
     libraries should be built with the system C compiler during stage
     1 of the bootstrap process, rather than only in later stages with
     the bootstrapped C compiler.  The list of valid values is the same
     as for `--enable-languages', and the option `all' will select all
     of the languages enabled by `--enable-languages'.  This option is
     primarily useful for GCC development; for instance, when a
     development version of the compiler cannot bootstrap due to
     compiler bugs, or when one is debugging front ends other than the
     C front end.  When this option is used, one can then build the
     target libraries for the specified languages with the stage-1
     compiler by using `make stage1-bubble all-target', or run the
     testsuite on the stage-1 compiler for the specified languages
     using `make stage1-start check-gcc'.

`--disable-libada'
     Specify that the run-time libraries and tools used by GNAT should
     not be built.  This can be useful for debugging, or for
     compatibility with previous Ada build procedures, when it was
     required to explicitly do a `make -C gcc gnatlib_and_tools'.

`--disable-libssp'
     Specify that the run-time libraries for stack smashing protection
     should not be built.

`--disable-libquadmath'
     Specify that the GCC quad-precision math library should not be
     built.  On some systems, the library is required to be linkable
     when building the Fortran front end, unless
     `--disable-libquadmath-support' is used.

`--disable-libquadmath-support'
     Specify that the Fortran front end and `libgfortran' do not add
     support for `libquadmath' on systems supporting it.

`--disable-libgomp'
     Specify that the run-time libraries used by GOMP should not be
     built.

`--with-dwarf2'
     Specify that the compiler should use DWARF 2 debugging information
     as the default.

`--enable-targets=all'
`--enable-targets=TARGET_LIST'
     Some GCC targets, e.g. powerpc64-linux, build bi-arch compilers.
     These are compilers that are able to generate either 64-bit or
     32-bit code.  Typically, the corresponding 32-bit target, e.g.
     powerpc-linux for powerpc64-linux, only generates 32-bit code.
     This option enables the 32-bit target to be a bi-arch compiler,
     which is useful when you want a bi-arch compiler that defaults to
     32-bit, and you are building a bi-arch or multi-arch binutils in a
     combined tree.  On mips-linux, this will build a tri-arch compiler
     (ABI o32/n32/64), defaulted to o32.  Currently, this option only
     affects sparc-linux, powerpc-linux, x86-linux, mips-linux and
     s390-linux.

`--enable-secureplt'
     This option enables `-msecure-plt' by default for powerpc-linux.
     *Note RS/6000 and PowerPC Options: (gcc)RS/6000 and PowerPC
     Options,

`--enable-cld'
     This option enables `-mcld' by default for 32-bit x86 targets.
     *Note i386 and x86-64 Options: (gcc)i386 and x86-64 Options,

`--enable-win32-registry'
`--enable-win32-registry=KEY'
`--disable-win32-registry'
     The `--enable-win32-registry' option enables Microsoft
     Windows-hosted GCC to look up installations paths in the registry
     using the following key:

          `HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\KEY'

     KEY defaults to GCC version number, and can be overridden by the
     `--enable-win32-registry=KEY' option.  Vendors and distributors
     who use custom installers are encouraged to provide a different
     key, perhaps one comprised of vendor name and GCC version number,
     to avoid conflict with existing installations.  This feature is
     enabled by default, and can be disabled by
     `--disable-win32-registry' option.  This option has no effect on
     the other hosts.

`--nfp'
     Specify that the machine does not have a floating point unit.  This
     option only applies to `m68k-sun-sunosN'.  On any other system,
     `--nfp' has no effect.

`--enable-werror'
`--disable-werror'
`--enable-werror=yes'
`--enable-werror=no'
     When you specify this option, it controls whether certain files in
     the compiler are built with `-Werror' in bootstrap stage2 and
     later.  If you don't specify it, `-Werror' is turned on for the
     main development trunk.  However it defaults to off for release
     branches and final releases.  The specific files which get
     `-Werror' are controlled by the Makefiles.

`--enable-checking'
`--enable-checking=LIST'
     When you specify this option, the compiler is built to perform
     internal consistency checks of the requested complexity.  This
     does not change the generated code, but adds error checking within
     the compiler.  This will slow down the compiler and may only work
     properly if you are building the compiler with GCC.  This is `yes'
     by default when building from SVN or snapshots, but `release' for
     releases.  The default for building the stage1 compiler is `yes'.
     More control over the checks may be had by specifying LIST.  The
     categories of checks available are `yes' (most common checks
     `assert,misc,tree,gc,rtlflag,runtime'), `no' (no checks at all),
     `all' (all but `valgrind'), `release' (cheapest checks
     `assert,runtime') or `none' (same as `no').  Individual checks can
     be enabled with these flags `assert', `df', `fold', `gc', `gcac'
     `misc', `rtl', `rtlflag', `runtime', `tree', and `valgrind'.

     The `valgrind' check requires the external `valgrind' simulator,
     available from `http://valgrind.org/'.  The `df', `rtl', `gcac'
     and `valgrind' checks are very expensive.  To disable all
     checking, `--disable-checking' or `--enable-checking=none' must be
     explicitly requested.  Disabling assertions will make the compiler
     and runtime slightly faster but increase the risk of undetected
     internal errors causing wrong code to be generated.

`--disable-stage1-checking'
`--enable-stage1-checking'
`--enable-stage1-checking=LIST'
     If no `--enable-checking' option is specified the stage1 compiler
     will be built with `yes' checking enabled, otherwise the stage1
     checking flags are the same as specified by `--enable-checking'.
     To build the stage1 compiler with different checking options use
     `--enable-stage1-checking'.  The list of checking options is the
     same as for `--enable-checking'.  If your system is too slow or
     too small to bootstrap a released compiler with checking for
     stage1 enabled, you can use `--disable-stage1-checking' to disable
     checking for the stage1 compiler.

`--enable-coverage'
`--enable-coverage=LEVEL'
     With this option, the compiler is built to collect self coverage
     information, every time it is run.  This is for internal
     development purposes, and only works when the compiler is being
     built with gcc.  The LEVEL argument controls whether the compiler
     is built optimized or not, values are `opt' and `noopt'.  For
     coverage analysis you want to disable optimization, for
     performance analysis you want to enable optimization.  When
     coverage is enabled, the default level is without optimization.

`--enable-gather-detailed-mem-stats'
     When this option is specified more detailed information on memory
     allocation is gathered.  This information is printed when using
     `-fmem-report'.

`--with-gc'
`--with-gc=CHOICE'
     With this option you can specify the garbage collector
     implementation used during the compilation process.  CHOICE can be
     one of `page' and `zone', where `page' is the default.

`--enable-nls'
`--disable-nls'
     The `--enable-nls' option enables Native Language Support (NLS),
     which lets GCC output diagnostics in languages other than American
     English.  Native Language Support is enabled by default if not
     doing a canadian cross build.  The `--disable-nls' option disables
     NLS.

`--with-included-gettext'
     If NLS is enabled, the `--with-included-gettext' option causes the
     build procedure to prefer its copy of GNU `gettext'.

`--with-catgets'
     If NLS is enabled, and if the host lacks `gettext' but has the
     inferior `catgets' interface, the GCC build procedure normally
     ignores `catgets' and instead uses GCC's copy of the GNU `gettext'
     library.  The `--with-catgets' option causes the build procedure
     to use the host's `catgets' in this situation.

`--with-libiconv-prefix=DIR'
     Search for libiconv header files in `DIR/include' and libiconv
     library files in `DIR/lib'.

`--enable-obsolete'
     Enable configuration for an obsoleted system.  If you attempt to
     configure GCC for a system (build, host, or target) which has been
     obsoleted, and you do not specify this flag, configure will halt
     with an error message.

     All support for systems which have been obsoleted in one release
     of GCC is removed entirely in the next major release, unless
     someone steps forward to maintain the port.

`--enable-decimal-float'
`--enable-decimal-float=yes'
`--enable-decimal-float=no'
`--enable-decimal-float=bid'
`--enable-decimal-float=dpd'
`--disable-decimal-float'
     Enable (or disable) support for the C decimal floating point
     extension that is in the IEEE 754-2008 standard.  This is enabled
     by default only on PowerPC, i386, and x86_64 GNU/Linux systems.
     Other systems may also support it, but require the user to
     specifically enable it.  You can optionally control which decimal
     floating point format is used (either `bid' or `dpd').  The `bid'
     (binary integer decimal) format is default on i386 and x86_64
     systems, and the `dpd' (densely packed decimal) format is default
     on PowerPC systems.

`--enable-fixed-point'
`--disable-fixed-point'
     Enable (or disable) support for C fixed-point arithmetic.  This
     option is enabled by default for some targets (such as MIPS) which
     have hardware-support for fixed-point operations.  On other
     targets, you may enable this option manually.

`--with-long-double-128'
     Specify if `long double' type should be 128-bit by default on
     selected GNU/Linux architectures.  If using
     `--without-long-double-128', `long double' will be by default
     64-bit, the same as `double' type.  When neither of these
     configure options are used, the default will be 128-bit `long
     double' when built against GNU C Library 2.4 and later, 64-bit
     `long double' otherwise.

`--with-gmp=PATHNAME'
`--with-gmp-include=PATHNAME'
`--with-gmp-lib=PATHNAME'
`--with-mpfr=PATHNAME'
`--with-mpfr-include=PATHNAME'
`--with-mpfr-lib=PATHNAME'
`--with-mpc=PATHNAME'
`--with-mpc-include=PATHNAME'
`--with-mpc-lib=PATHNAME'
     If you want to build GCC but do not have the GMP library, the MPFR
     library and/or the MPC library installed in a standard location and
     do not have their sources present in the GCC source tree then you
     can explicitly specify the directory where they are installed
     (`--with-gmp=GMPINSTALLDIR', `--with-mpfr=MPFRINSTALLDIR',
     `--with-mpc=MPCINSTALLDIR').  The `--with-gmp=GMPINSTALLDIR'
     option is shorthand for `--with-gmp-lib=GMPINSTALLDIR/lib' and
     `--with-gmp-include=GMPINSTALLDIR/include'.  Likewise the
     `--with-mpfr=MPFRINSTALLDIR' option is shorthand for
     `--with-mpfr-lib=MPFRINSTALLDIR/lib' and
     `--with-mpfr-include=MPFRINSTALLDIR/include', also the
     `--with-mpc=MPCINSTALLDIR' option is shorthand for
     `--with-mpc-lib=MPCINSTALLDIR/lib' and
     `--with-mpc-include=MPCINSTALLDIR/include'.  If these shorthand
     assumptions are not correct, you can use the explicit include and
     lib options directly.  You might also need to ensure the shared
     libraries can be found by the dynamic linker when building and
     using GCC, for example by setting the runtime shared library path
     variable (`LD_LIBRARY_PATH' on GNU/Linux and Solaris systems).

     These flags are applicable to the host platform only.  When
     building a cross compiler, they will not be used to configure
     target libraries.

`--with-ppl=PATHNAME'
`--with-ppl-include=PATHNAME'
`--with-ppl-lib=PATHNAME'
`--with-cloog=PATHNAME'
`--with-cloog-include=PATHNAME'
`--with-cloog-lib=PATHNAME'
     If you do not have PPL (the Parma Polyhedra Library) and the CLooG
     libraries installed in a standard location and you want to build
     GCC, you can explicitly specify the directory where they are
     installed (`--with-ppl=PPLINSTALLDIR',
     `--with-cloog=CLOOGINSTALLDIR'). The `--with-ppl=PPLINSTALLDIR'
     option is shorthand for `--with-ppl-lib=PPLINSTALLDIR/lib' and
     `--with-ppl-include=PPLINSTALLDIR/include'.  Likewise the
     `--with-cloog=CLOOGINSTALLDIR' option is shorthand for
     `--with-cloog-lib=CLOOGINSTALLDIR/lib' and
     `--with-cloog-include=CLOOGINSTALLDIR/include'.  If these
     shorthand assumptions are not correct, you can use the explicit
     include and lib options directly.

     These flags are applicable to the host platform only.  When
     building a cross compiler, they will not be used to configure
     target libraries.

`--with-host-libstdcxx=LINKER-ARGS'
     If you are linking with a static copy of PPL, you can use this
     option to specify how the linker should find the standard C++
     library used internally by PPL.  Typical values of LINKER-ARGS
     might be `-lstdc++' or `-Wl,-Bstatic,-lstdc++,-Bdynamic -lm'.  If
     you are linking with a shared copy of PPL, you probably do not
     need this option; shared library dependencies will cause the
     linker to search for the standard C++ library automatically.

`--with-stage1-ldflags=FLAGS'
     This option may be used to set linker flags to be used when linking
     stage 1 of GCC.  These are also used when linking GCC if
     configured with `--disable-bootstrap'.  By default no special
     flags are used.

`--with-stage1-libs=LIBS'
     This option may be used to set libraries to be used when linking
     stage 1 of GCC.  These are also used when linking GCC if
     configured with `--disable-bootstrap'.  The default is the
     argument to `--with-host-libstdcxx', if specified.

`--with-boot-ldflags=FLAGS'
     This option may be used to set linker flags to be used when linking
     stage 2 and later when bootstrapping GCC.  If neither
     -with-boot-libs nor -with-host-libstdcxx is set to a value, then
     the default is `-static-libstdc++ -static-libgcc'.

`--with-boot-libs=LIBS'
     This option may be used to set libraries to be used when linking
     stage 2 and later when bootstrapping GCC.  The default is the
     argument to `--with-host-libstdcxx', if specified.

`--with-debug-prefix-map=MAP'
     Convert source directory names using `-fdebug-prefix-map' when
     building runtime libraries.  `MAP' is a space-separated list of
     maps of the form `OLD=NEW'.

`--enable-linker-build-id'
     Tells GCC to pass `--build-id' option to the linker for all final
     links (links performed without the `-r' or `--relocatable'
     option), if the linker supports it.  If you specify
     `--enable-linker-build-id', but your linker does not support
     `--build-id' option, a warning is issued and the
     `--enable-linker-build-id' option is ignored.  The default is off.

`--with-linker-hash-style=CHOICE'
     Tells GCC to pass `--hash-style=CHOICE' option to the linker for
     all final links. CHOICE can be one of `sysv', `gnu', and `both'
     where `sysv' is the default.

`--enable-gnu-unique-object'
`--disable-gnu-unique-object'
     Tells GCC to use the gnu_unique_object relocation for C++ template
     static data members and inline function local statics.  Enabled by
     default for a native toolchain with an assembler that accepts it
     and GLIBC 2.11 or above, otherwise disabled.

`--enable-lto'
`--disable-lto'
     Enable support for link-time optimization (LTO).  This is enabled
     by default, and may be disabled using `--disable-lto'.

`--with-plugin-ld=PATHNAME'
     Enable an alternate linker to be used at link-time optimization
     (LTO) link time when `-fuse-linker-plugin' is enabled.  This
     linker should have plugin support such as gold starting with
     version 2.20 or GNU ld starting with version 2.21.  See
     `-fuse-linker-plugin' for details.

Cross-Compiler-Specific Options
-------------------------------

The following options only apply to building cross compilers.

`--with-sysroot'
`--with-sysroot=DIR'
     Tells GCC to consider DIR as the root of a tree that contains (a
     subset of) the root filesystem of the target operating system.
     Target system headers, libraries and run-time object files will be
     searched for in there.  More specifically, this acts as if
     `--sysroot=DIR' was added to the default options of the built
     compiler.  The specified directory is not copied into the install
     tree, unlike the options `--with-headers' and `--with-libs' that
     this option obsoletes.  The default value, in case
     `--with-sysroot' is not given an argument, is
     `${gcc_tooldir}/sys-root'.  If the specified directory is a
     subdirectory of `${exec_prefix}', then it will be found relative to
     the GCC binaries if the installation tree is moved.

     This option affects the system root for the compiler used to build
     target libraries (which runs on the build system) and the compiler
     newly installed with `make install'; it does not affect the
     compiler which is used to build GCC itself.

     If you specify the `--with-native-system-header-dir=DIRNAME'
     option then the compiler will search that directory within DIRNAME
     for native system headers rather than the default `/usr/include'.

`--with-build-sysroot'
`--with-build-sysroot=DIR'
     Tells GCC to consider DIR as the system root (see
     `--with-sysroot') while building target libraries, instead of the
     directory specified with `--with-sysroot'.  This option is only
     useful when you are already using `--with-sysroot'.  You can use
     `--with-build-sysroot' when you are configuring with `--prefix'
     set to a directory that is different from the one in which you are
     installing GCC and your target libraries.

     This option affects the system root for the compiler used to build
     target libraries (which runs on the build system); it does not
     affect the compiler which is used to build GCC itself.

     If you specify the `--with-native-system-header-dir=DIRNAME'
     option then the compiler will search that directory within DIRNAME
     for native system headers rather than the default `/usr/include'.

`--with-headers'
`--with-headers=DIR'
     Deprecated in favor of `--with-sysroot'.  Specifies that target
     headers are available when building a cross compiler.  The DIR
     argument specifies a directory which has the target include files.
     These include files will be copied into the `gcc' install
     directory.  _This option with the DIR argument is required_ when
     building a cross compiler, if `PREFIX/TARGET/sys-include' doesn't
     pre-exist.  If `PREFIX/TARGET/sys-include' does pre-exist, the DIR
     argument may be omitted.  `fixincludes' will be run on these files
     to make them compatible with GCC.

`--without-headers'
     Tells GCC not use any target headers from a libc when building a
     cross compiler.  When crossing to GNU/Linux, you need the headers
     so GCC can build the exception handling for libgcc.

`--with-libs'
`--with-libs="DIR1 DIR2 ... DIRN"'
     Deprecated in favor of `--with-sysroot'.  Specifies a list of
     directories which contain the target runtime libraries.  These
     libraries will be copied into the `gcc' install directory.  If the
     directory list is omitted, this option has no effect.

`--with-newlib'
     Specifies that `newlib' is being used as the target C library.
     This causes `__eprintf' to be omitted from `libgcc.a' on the
     assumption that it will be provided by `newlib'.

`--with-avrlibc'
     Specifies that `AVR-Libc' is being used as the target C library.
     This causes float support functions like `__addsf3' to be omitted
     from `libgcc.a' on the assumption that it will be provided by
     `libm.a'.  For more technical details, cf. PR54461.  This option
     is only supported for the AVR target.  It is not supported for
     RTEMS configurations, which currently use newlib.  The option is
     supported since version 4.7.2 and is the default in 4.8.0 and
     newer.

`--with-build-time-tools=DIR'
     Specifies where to find the set of target tools (assembler,
     linker, etc.)  that will be used while building GCC itself.  This
     option can be useful if the directory layouts are different
     between the system you are building GCC on, and the system where
     you will deploy it.

     For example, on an `ia64-hp-hpux' system, you may have the GNU
     assembler and linker in `/usr/bin', and the native tools in a
     different path, and build a toolchain that expects to find the
     native tools in `/usr/bin'.

     When you use this option, you should ensure that DIR includes
     `ar', `as', `ld', `nm', `ranlib' and `strip' if necessary, and
     possibly `objdump'.  Otherwise, GCC may use an inconsistent set of
     tools.

Java-Specific Options
---------------------

The following option applies to the build of the Java front end.

`--disable-libgcj'
     Specify that the run-time libraries used by GCJ should not be
     built.  This is useful in case you intend to use GCJ with some
     other run-time, or you're going to install it separately, or it
     just happens not to build on your particular machine.  In general,
     if the Java front end is enabled, the GCJ libraries will be
     enabled too, unless they're known to not work on the target
     platform.  If GCJ is enabled but `libgcj' isn't built, you may
     need to port it; in this case, before modifying the top-level
     `configure.in' so that `libgcj' is enabled by default on this
     platform, you may use `--enable-libgcj' to override the default.


   The following options apply to building `libgcj'.

General Options
...............

`--enable-java-maintainer-mode'
     By default the `libjava' build will not attempt to compile the
     `.java' source files to `.class'.  Instead, it will use the
     `.class' files from the source tree.  If you use this option you
     must have executables named `ecj1' and `gjavah' in your path for
     use by the build.  You must use this option if you intend to
     modify any `.java' files in `libjava'.

`--with-java-home=DIRNAME'
     This `libjava' option overrides the default value of the
     `java.home' system property.  It is also used to set
     `sun.boot.class.path' to `DIRNAME/lib/rt.jar'.  By default
     `java.home' is set to `PREFIX' and `sun.boot.class.path' to
     `DATADIR/java/libgcj-VERSION.jar'.

`--with-ecj-jar=FILENAME'
     This option can be used to specify the location of an external jar
     file containing the Eclipse Java compiler.  A specially modified
     version of this compiler is used by `gcj' to parse `.java' source
     files.  If this option is given, the `libjava' build will create
     and install an `ecj1' executable which uses this jar file at
     runtime.

     If this option is not given, but an `ecj.jar' file is found in the
     topmost source tree at configure time, then the `libgcj' build
     will create and install `ecj1', and will also install the
     discovered `ecj.jar' into a suitable place in the install tree.

     If `ecj1' is not installed, then the user will have to supply one
     on his path in order for `gcj' to properly parse `.java' source
     files.  A suitable jar is available from
     `ftp://sourceware.org/pub/java/'.

`--disable-getenv-properties'
     Don't set system properties from `GCJ_PROPERTIES'.

`--enable-hash-synchronization'
     Use a global hash table for monitor locks.  Ordinarily, `libgcj''s
     `configure' script automatically makes the correct choice for this
     option for your platform.  Only use this if you know you need the
     library to be configured differently.

`--enable-interpreter'
     Enable the Java interpreter.  The interpreter is automatically
     enabled by default on all platforms that support it.  This option
     is really only useful if you want to disable the interpreter
     (using `--disable-interpreter').

`--disable-java-net'
     Disable java.net.  This disables the native part of java.net only,
     using non-functional stubs for native method implementations.

`--disable-jvmpi'
     Disable JVMPI support.

`--disable-libgcj-bc'
     Disable BC ABI compilation of certain parts of libgcj.  By default,
     some portions of libgcj are compiled with `-findirect-dispatch'
     and `-fno-indirect-classes', allowing them to be overridden at
     run-time.

     If `--disable-libgcj-bc' is specified, libgcj is built without
     these options.  This allows the compile-time linker to resolve
     dependencies when statically linking to libgcj.  However it makes
     it impossible to override the affected portions of libgcj at
     run-time.

`--enable-reduced-reflection'
     Build most of libgcj with `-freduced-reflection'.  This reduces
     the size of libgcj at the expense of not being able to do accurate
     reflection on the classes it contains.  This option is safe if you
     know that code using libgcj will never use reflection on the
     standard runtime classes in libgcj (including using serialization,
     RMI or CORBA).

`--with-ecos'
     Enable runtime eCos target support.

`--without-libffi'
     Don't use `libffi'.  This will disable the interpreter and JNI
     support as well, as these require `libffi' to work.

`--enable-libgcj-debug'
     Enable runtime debugging code.

`--enable-libgcj-multifile'
     If specified, causes all `.java' source files to be compiled into
     `.class' files in one invocation of `gcj'.  This can speed up
     build time, but is more resource-intensive.  If this option is
     unspecified or disabled, `gcj' is invoked once for each `.java'
     file to compile into a `.class' file.

`--with-libiconv-prefix=DIR'
     Search for libiconv in `DIR/include' and `DIR/lib'.

`--enable-sjlj-exceptions'
     Force use of the `setjmp'/`longjmp'-based scheme for exceptions.
     `configure' ordinarily picks the correct value based on the
     platform.  Only use this option if you are sure you need a
     different setting.

`--with-system-zlib'
     Use installed `zlib' rather than that included with GCC.

`--with-win32-nlsapi=ansi, unicows or unicode'
     Indicates how MinGW `libgcj' translates between UNICODE characters
     and the Win32 API.

`--enable-java-home'
     If enabled, this creates a JPackage compatible SDK environment
     during install.  Note that if -enable-java-home is used,
     -with-arch-directory=ARCH must also be specified.

`--with-arch-directory=ARCH'
     Specifies the name to use for the `jre/lib/ARCH' directory in the
     SDK environment created when -enable-java-home is passed. Typical
     names for this directory include i386, amd64, ia64, etc.

`--with-os-directory=DIR'
     Specifies the OS directory for the SDK include directory. This is
     set to auto detect, and is typically 'linux'.

`--with-origin-name=NAME'
     Specifies the JPackage origin name. This defaults to the 'gcj' in
     java-1.5.0-gcj.

`--with-arch-suffix=SUFFIX'
     Specifies the suffix for the sdk directory. Defaults to the empty
     string.  Examples include '.x86_64' in
     'java-1.5.0-gcj-1.5.0.0.x86_64'.

`--with-jvm-root-dir=DIR'
     Specifies where to install the SDK. Default is $(prefix)/lib/jvm.

`--with-jvm-jar-dir=DIR'
     Specifies where to install jars. Default is
     $(prefix)/lib/jvm-exports.

`--with-python-dir=DIR'
     Specifies where to install the Python modules used for
     aot-compile. DIR should not include the prefix used in
     installation. For example, if the Python modules are to be
     installed in /usr/lib/python2.5/site-packages, then
     -with-python-dir=/lib/python2.5/site-packages should be passed. If
     this is not specified, then the Python modules are installed in
     $(prefix)/share/python.

`--enable-aot-compile-rpm'
     Adds aot-compile-rpm to the list of installed scripts.

`--enable-browser-plugin'
     Build the gcjwebplugin web browser plugin.

`--enable-static-libjava'
     Build static libraries in libjava. The default is to only build
     shared libraries.

    `ansi'
          Use the single-byte `char' and the Win32 A functions natively,
          translating to and from UNICODE when using these functions.
          If unspecified, this is the default.

    `unicows'
          Use the `WCHAR' and Win32 W functions natively.  Adds
          `-lunicows' to `libgcj.spec' to link with `libunicows'.
          `unicows.dll' needs to be deployed on Microsoft Windows 9X
          machines running built executables.  `libunicows.a', an
          open-source import library around Microsoft's `unicows.dll',
          is obtained from `http://libunicows.sourceforge.net/', which
          also gives details on getting `unicows.dll' from Microsoft.

    `unicode'
          Use the `WCHAR' and Win32 W functions natively.  Does _not_
          add `-lunicows' to `libgcj.spec'.  The built executables will
          only run on Microsoft Windows NT and above.

AWT-Specific Options
....................

`--with-x'
     Use the X Window System.

`--enable-java-awt=PEER(S)'
     Specifies the AWT peer library or libraries to build alongside
     `libgcj'.  If this option is unspecified or disabled, AWT will be
     non-functional.  Current valid values are `gtk' and `xlib'.
     Multiple libraries should be separated by a comma (i.e.
     `--enable-java-awt=gtk,xlib').

`--enable-gtk-cairo'
     Build the cairo Graphics2D implementation on GTK.

`--enable-java-gc=TYPE'
     Choose garbage collector.  Defaults to `boehm' if unspecified.

`--disable-gtktest'
     Do not try to compile and run a test GTK+ program.

`--disable-glibtest'
     Do not try to compile and run a test GLIB program.

`--with-libart-prefix=PFX'
     Prefix where libart is installed (optional).

`--with-libart-exec-prefix=PFX'
     Exec prefix where libart is installed (optional).

`--disable-libarttest'
     Do not try to compile and run a test libart program.


Overriding `configure' test results
...................................

Sometimes, it might be necessary to override the result of some
`configure' test, for example in order to ease porting to a new system
or work around a bug in a test.  The toplevel `configure' script
provides three variables for this:

`build_configargs'
     The contents of this variable is passed to all build `configure'
     scripts.

`host_configargs'
     The contents of this variable is passed to all host `configure'
     scripts.

`target_configargs'
     The contents of this variable is passed to all target `configure'
     scripts.


   In order to avoid shell and `make' quoting issues for complex
overrides, you can pass a setting for `CONFIG_SITE' and set variables
in the site file.


File: gccinstall.info,  Node: Building,  Next: Testing,  Prev: Configuration,  Up: Installing GCC

5 Building
**********

   Now that GCC is configured, you are ready to build the compiler and
runtime libraries.

   Some commands executed when making the compiler may fail (return a
nonzero status) and be ignored by `make'.  These failures, which are
often due to files that were not found, are expected, and can safely be
ignored.

   It is normal to have compiler warnings when compiling certain files.
Unless you are a GCC developer, you can generally ignore these warnings
unless they cause compilation to fail.  Developers should attempt to fix
any warnings encountered, however they can temporarily continue past
warnings-as-errors by specifying the configure flag `--disable-werror'.

   On certain old systems, defining certain environment variables such
as `CC' can interfere with the functioning of `make'.

   If you encounter seemingly strange errors when trying to build the
compiler in a directory other than the source directory, it could be
because you have previously configured the compiler in the source
directory.  Make sure you have done all the necessary preparations.

   If you build GCC on a BSD system using a directory stored in an old
System V file system, problems may occur in running `fixincludes' if the
System V file system doesn't support symbolic links.  These problems
result in a failure to fix the declaration of `size_t' in
`sys/types.h'.  If you find that `size_t' is a signed type and that
type mismatches occur, this could be the cause.

   The solution is not to use such a directory for building GCC.

   Similarly, when building from SVN or snapshots, or if you modify
`*.l' files, you need the Flex lexical analyzer generator installed.
If you do not modify `*.l' files, releases contain the Flex-generated
files and you do not need Flex installed to build them.  There is still
one Flex-based lexical analyzer (part of the build machinery, not of
GCC itself) that is used even if you only build the C front end.

   When building from SVN or snapshots, or if you modify Texinfo
documentation, you need version 4.7 or later of Texinfo installed if you
want Info documentation to be regenerated.  Releases contain Info
documentation pre-built for the unmodified documentation in the release.

5.1 Building a native compiler
==============================

For a native build, the default configuration is to perform a 3-stage
bootstrap of the compiler when `make' is invoked.  This will build the
entire GCC system and ensure that it compiles itself correctly.  It can
be disabled with the `--disable-bootstrap' parameter to `configure',
but bootstrapping is suggested because the compiler will be tested more
completely and could also have better performance.

   The bootstrapping process will complete the following steps:

   * Build tools necessary to build the compiler.

   * Perform a 3-stage bootstrap of the compiler.  This includes
     building three times the target tools for use by the compiler such
     as binutils (bfd, binutils, gas, gprof, ld, and opcodes) if they
     have been individually linked or moved into the top level GCC
     source tree before configuring.

   * Perform a comparison test of the stage2 and stage3 compilers.

   * Build runtime libraries using the stage3 compiler from the
     previous step.


   If you are short on disk space you might consider `make
bootstrap-lean' instead.  The sequence of compilation is the same
described above, but object files from the stage1 and stage2 of the
3-stage bootstrap of the compiler are deleted as soon as they are no
longer needed.

   If you wish to use non-default GCC flags when compiling the stage2
and stage3 compilers, set `BOOT_CFLAGS' on the command line when doing
`make'.  For example, if you want to save additional space during the
bootstrap and in the final installation as well, you can build the
compiler binaries without debugging information as in the following
example.  This will save roughly 40% of disk space both for the
bootstrap and the final installation.  (Libraries will still contain
debugging information.)

     make BOOT_CFLAGS='-O' bootstrap

   You can place non-default optimization flags into `BOOT_CFLAGS'; they
are less well tested here than the default of `-g -O2', but should
still work.  In a few cases, you may find that you need to specify
special flags such as `-msoft-float' here to complete the bootstrap; or,
if the native compiler miscompiles the stage1 compiler, you may need to
work around this, by choosing `BOOT_CFLAGS' to avoid the parts of the
stage1 compiler that were miscompiled, or by using `make bootstrap4' to
increase the number of stages of bootstrap.

   `BOOT_CFLAGS' does not apply to bootstrapped target libraries.
Since these are always compiled with the compiler currently being
bootstrapped, you can use `CFLAGS_FOR_TARGET' to modify their
compilation flags, as for non-bootstrapped target libraries.  Again, if
the native compiler miscompiles the stage1 compiler, you may need to
work around this by avoiding non-working parts of the stage1 compiler.
Use `STAGE1_TFLAGS' to this end.

   If you used the flag `--enable-languages=...' to restrict the
compilers to be built, only those you've actually enabled will be
built.  This will of course only build those runtime libraries, for
which the particular compiler has been built.  Please note, that
re-defining `LANGUAGES' when calling `make' *does not* work anymore!

   If the comparison of stage2 and stage3 fails, this normally indicates
that the stage2 compiler has compiled GCC incorrectly, and is therefore
a potentially serious bug which you should investigate and report.  (On
a few systems, meaningful comparison of object files is impossible; they
always appear "different".  If you encounter this problem, you will
need to disable comparison in the `Makefile'.)

   If you do not want to bootstrap your compiler, you can configure with
`--disable-bootstrap'.  In particular cases, you may want to bootstrap
your compiler even if the target system is not the same as the one you
are building on: for example, you could build a
`powerpc-unknown-linux-gnu' toolchain on a
`powerpc64-unknown-linux-gnu' host.  In this case, pass
`--enable-bootstrap' to the configure script.

   `BUILD_CONFIG' can be used to bring in additional customization to
the build.  It can be set to a whitespace-separated list of names.  For
each such `NAME', top-level `config/`NAME'.mk' will be included by the
top-level `Makefile', bringing in any settings it contains.  The
default `BUILD_CONFIG' can be set using the configure option
`--with-build-config=`NAME'...'.  Some examples of supported build
configurations are:

`bootstrap-O1'
     Removes any `-O'-started option from `BOOT_CFLAGS', and adds `-O1'
     to it.  `BUILD_CONFIG=bootstrap-O1' is equivalent to
     `BOOT_CFLAGS='-g -O1''.

`bootstrap-O3'
     Analogous to `bootstrap-O1'.

`bootstrap-lto'
     Enables Link-Time Optimization for host tools during bootstrapping.
     `BUILD_CONFIG=bootstrap-lto' is equivalent to adding `-flto' to
     `BOOT_CFLAGS'.

`bootstrap-debug'
     Verifies that the compiler generates the same executable code,
     whether or not it is asked to emit debug information.  To this
     end, this option builds stage2 host programs without debug
     information, and uses `contrib/compare-debug' to compare them with
     the stripped stage3 object files.  If `BOOT_CFLAGS' is overridden
     so as to not enable debug information, stage2 will have it, and
     stage3 won't.  This option is enabled by default when GCC
     bootstrapping is enabled, if `strip' can turn object files
     compiled with and without debug info into identical object files.
     In addition to better test coverage, this option makes default
     bootstraps faster and leaner.

`bootstrap-debug-big'
     Rather than comparing stripped object files, as in
     `bootstrap-debug', this option saves internal compiler dumps
     during stage2 and stage3 and compares them as well, which helps
     catch additional potential problems, but at a great cost in terms
     of disk space.  It can be specified in addition to
     `bootstrap-debug'.

`bootstrap-debug-lean'
     This option saves disk space compared with `bootstrap-debug-big',
     but at the expense of some recompilation.  Instead of saving the
     dumps of stage2 and stage3 until the final compare, it uses
     `-fcompare-debug' to generate, compare and remove the dumps during
     stage3, repeating the compilation that already took place in
     stage2, whose dumps were not saved.

`bootstrap-debug-lib'
     This option tests executable code invariance over debug information
     generation on target libraries, just like `bootstrap-debug-lean'
     tests it on host programs.  It builds stage3 libraries with
     `-fcompare-debug', and it can be used along with any of the
     `bootstrap-debug' options above.

     There aren't `-lean' or `-big' counterparts to this option because
     most libraries are only build in stage3, so bootstrap compares
     would not get significant coverage.  Moreover, the few libraries
     built in stage2 are used in stage3 host programs, so we wouldn't
     want to compile stage2 libraries with different options for
     comparison purposes.

`bootstrap-debug-ckovw'
     Arranges for error messages to be issued if the compiler built on
     any stage is run without the option `-fcompare-debug'.  This is
     useful to verify the full `-fcompare-debug' testing coverage.  It
     must be used along with `bootstrap-debug-lean' and
     `bootstrap-debug-lib'.

`bootstrap-time'
     Arranges for the run time of each program started by the GCC
     driver, built in any stage, to be logged to `time.log', in the top
     level of the build tree.


5.2 Building a cross compiler
=============================

When building a cross compiler, it is not generally possible to do a
3-stage bootstrap of the compiler.  This makes for an interesting
problem as parts of GCC can only be built with GCC.

   To build a cross compiler, we recommend first building and
installing a native compiler.  You can then use the native GCC compiler
to build the cross compiler.  The installed native compiler needs to be
GCC version 2.95 or later.

   If the cross compiler is to be built with support for the Java
programming language and the ability to compile .java source files is
desired, the installed native compiler used to build the cross compiler
needs to be the same GCC version as the cross compiler.  In addition
the cross compiler needs to be configured with `--with-ecj-jar=...'.

   Assuming you have already installed a native copy of GCC and
configured your cross compiler, issue the command `make', which
performs the following steps:

   * Build host tools necessary to build the compiler.

   * Build target tools for use by the compiler such as binutils (bfd,
     binutils, gas, gprof, ld, and opcodes) if they have been
     individually linked or moved into the top level GCC source tree
     before configuring.

   * Build the compiler (single stage only).

   * Build runtime libraries using the compiler from the previous step.

   Note that if an error occurs in any step the make process will exit.

   If you are not building GNU binutils in the same source tree as GCC,
you will need a cross-assembler and cross-linker installed before
configuring GCC.  Put them in the directory `PREFIX/TARGET/bin'.  Here
is a table of the tools you should put in this directory:

`as'
     This should be the cross-assembler.

`ld'
     This should be the cross-linker.

`ar'
     This should be the cross-archiver: a program which can manipulate
     archive files (linker libraries) in the target machine's format.

`ranlib'
     This should be a program to construct a symbol table in an archive
     file.

   The installation of GCC will find these programs in that directory,
and copy or link them to the proper place to for the cross-compiler to
find them when run later.

   The easiest way to provide these files is to build the Binutils
package.  Configure it with the same `--host' and `--target' options
that you use for configuring GCC, then build and install them.  They
install their executables automatically into the proper directory.
Alas, they do not support all the targets that GCC supports.

   If you are not building a C library in the same source tree as GCC,
you should also provide the target libraries and headers before
configuring GCC, specifying the directories with `--with-sysroot' or
`--with-headers' and `--with-libs'.  Many targets also require "start
files" such as `crt0.o' and `crtn.o' which are linked into each
executable.  There may be several alternatives for `crt0.o', for use
with profiling or other compilation options.  Check your target's
definition of `STARTFILE_SPEC' to find out what start files it uses.

5.3 Building in parallel
========================

GNU Make 3.80 and above, which is necessary to build GCC, support
building in parallel.  To activate this, you can use `make -j 2'
instead of `make'.  You can also specify a bigger number, and in most
cases using a value greater than the number of processors in your
machine will result in fewer and shorter I/O latency hits, thus
improving overall throughput; this is especially true for slow drives
and network filesystems.

5.4 Building the Ada compiler
=============================

In order to build GNAT, the Ada compiler, you need a working GNAT
compiler (GCC version 4.0 or later).  This includes GNAT tools such as
`gnatmake' and `gnatlink', since the Ada front end is written in Ada and
uses some GNAT-specific extensions.

   In order to build a cross compiler, it is suggested to install the
new compiler as native first, and then use it to build the cross
compiler.

   `configure' does not test whether the GNAT installation works and
has a sufficiently recent version; if too old a GNAT version is
installed, the build will fail unless `--enable-languages' is used to
disable building the Ada front end.

   `ADA_INCLUDE_PATH' and `ADA_OBJECT_PATH' environment variables must
not be set when building the Ada compiler, the Ada tools, or the Ada
runtime libraries. You can check that your build environment is clean
by verifying that `gnatls -v' lists only one explicit path in each
section.

5.5 Building with profile feedback
==================================

It is possible to use profile feedback to optimize the compiler itself.
This should result in a faster compiler binary.  Experiments done on
x86 using gcc 3.3 showed approximately 7 percent speedup on compiling C
programs.  To bootstrap the compiler with profile feedback, use `make
profiledbootstrap'.

   When `make profiledbootstrap' is run, it will first build a `stage1'
compiler.  This compiler is used to build a `stageprofile' compiler
instrumented to collect execution counts of instruction and branch
probabilities.  Then runtime libraries are compiled with profile
collected.  Finally a `stagefeedback' compiler is built using the
information collected.

   Unlike standard bootstrap, several additional restrictions apply.
The compiler used to build `stage1' needs to support a 64-bit integral
type.  It is recommended to only use GCC for this.  Also parallel make
is currently not supported since collisions in profile collecting may
occur.


File: gccinstall.info,  Node: Testing,  Next: Final install,  Prev: Building,  Up: Installing GCC

6 Installing GCC: Testing
*************************

   Before you install GCC, we encourage you to run the testsuites and to
compare your results with results from a similar configuration that have
been submitted to the gcc-testresults mailing list.  Some of these
archived results are linked from the build status lists at
`http://gcc.gnu.org/buildstat.html', although not everyone who reports
a successful build runs the testsuites and submits the results.  This
step is optional and may require you to download additional software,
but it can give you confidence in your new GCC installation or point out
problems before you install and start using your new GCC.

   First, you must have downloaded the testsuites.  These are part of
the full distribution, but if you downloaded the "core" compiler plus
any front ends, you must download the testsuites separately.

   Second, you must have the testing tools installed.  This includes
DejaGnu, Tcl, and Expect; the DejaGnu site has links to these.

   If the directories where `runtest' and `expect' were installed are
not in the `PATH', you may need to set the following environment
variables appropriately, as in the following example (which assumes
that DejaGnu has been installed under `/usr/local'):

     TCL_LIBRARY = /usr/local/share/tcl8.0
     DEJAGNULIBS = /usr/local/share/dejagnu

   (On systems such as Cygwin, these paths are required to be actual
paths, not mounts or links; presumably this is due to some lack of
portability in the DejaGnu code.)

   Finally, you can run the testsuite (which may take a long time):
     cd OBJDIR; make -k check

   This will test various components of GCC, such as compiler front
ends and runtime libraries.  While running the testsuite, DejaGnu might
emit some harmless messages resembling `WARNING: Couldn't find the
global config file.' or `WARNING: Couldn't find tool init file' that
can be ignored.

   If you are testing a cross-compiler, you may want to run the
testsuite on a simulator as described at
`http://gcc.gnu.org/simtest-howto.html'.

6.1 How can you run the testsuite on selected tests?
====================================================

In order to run sets of tests selectively, there are targets `make
check-gcc' and language specific `make check-c', `make check-c++',
`make check-fortran', `make check-java', `make check-ada', `make
check-objc', `make check-obj-c++', `make check-lto' in the `gcc'
subdirectory of the object directory.  You can also just run `make
check' in a subdirectory of the object directory.

   A more selective way to just run all `gcc' execute tests in the
testsuite is to use

     make check-gcc RUNTESTFLAGS="execute.exp OTHER-OPTIONS"

   Likewise, in order to run only the `g++' "old-deja" tests in the
testsuite with filenames matching `9805*', you would use

     make check-g++ RUNTESTFLAGS="old-deja.exp=9805* OTHER-OPTIONS"

   The `*.exp' files are located in the testsuite directories of the GCC
source, the most important ones being `compile.exp', `execute.exp',
`dg.exp' and `old-deja.exp'.  To get a list of the possible `*.exp'
files, pipe the output of `make check' into a file and look at the
`Running ...  .exp' lines.

6.2 Passing options and running multiple testsuites
===================================================

You can pass multiple options to the testsuite using the
`--target_board' option of DejaGNU, either passed as part of
`RUNTESTFLAGS', or directly to `runtest' if you prefer to work outside
the makefiles.  For example,

     make check-g++ RUNTESTFLAGS="--target_board=unix/-O3/-fmerge-constants"

   will run the standard `g++' testsuites ("unix" is the target name
for a standard native testsuite situation), passing `-O3
-fmerge-constants' to the compiler on every test, i.e., slashes
separate options.

   You can run the testsuites multiple times using combinations of
options with a syntax similar to the brace expansion of popular shells:

     ..."--target_board=arm-sim\{-mhard-float,-msoft-float\}\{-O1,-O2,-O3,\}"

   (Note the empty option caused by the trailing comma in the final
group.)  The following will run each testsuite eight times using the
`arm-sim' target, as if you had specified all possible combinations
yourself:

     --target_board=arm-sim/-mhard-float/-O1
     --target_board=arm-sim/-mhard-float/-O2
     --target_board=arm-sim/-mhard-float/-O3
     --target_board=arm-sim/-mhard-float
     --target_board=arm-sim/-msoft-float/-O1
     --target_board=arm-sim/-msoft-float/-O2
     --target_board=arm-sim/-msoft-float/-O3
     --target_board=arm-sim/-msoft-float

   They can be combined as many times as you wish, in arbitrary ways.
This list:

     ..."--target_board=unix/-Wextra\{-O3,-fno-strength\}\{-fomit-frame,\}"

   will generate four combinations, all involving `-Wextra'.

   The disadvantage to this method is that the testsuites are run in
serial, which is a waste on multiprocessor systems.  For users with GNU
Make and a shell which performs brace expansion, you can run the
testsuites in parallel by having the shell perform the combinations and
`make' do the parallel runs.  Instead of using `--target_board', use a
special makefile target:

     make -jN check-TESTSUITE//TEST-TARGET/OPTION1/OPTION2/...

   For example,

     make -j3 check-gcc//sh-hms-sim/{-m1,-m2,-m3,-m3e,-m4}/{,-nofpu}

   will run three concurrent "make-gcc" testsuites, eventually testing
all ten combinations as described above.  Note that this is currently
only supported in the `gcc' subdirectory.  (To see how this works, try
typing `echo' before the example given here.)

6.3 Additional testing for Java Class Libraries
===============================================

The Java runtime tests can be executed via `make check' in the
`TARGET/libjava/testsuite' directory in the build tree.

   The Mauve Project provides a suite of tests for the Java Class
Libraries.  This suite can be run as part of libgcj testing by placing
the Mauve tree within the libjava testsuite at
`libjava/testsuite/libjava.mauve/mauve', or by specifying the location
of that tree when invoking `make', as in `make MAUVEDIR=~/mauve check'.

6.4 How to interpret test results
=================================

The result of running the testsuite are various `*.sum' and `*.log'
files in the testsuite subdirectories.  The `*.log' files contain a
detailed log of the compiler invocations and the corresponding results,
the `*.sum' files summarize the results.  These summaries contain
status codes for all tests:

   * PASS: the test passed as expected

   * XPASS: the test unexpectedly passed

   * FAIL: the test unexpectedly failed

   * XFAIL: the test failed as expected

   * UNSUPPORTED: the test is not supported on this platform

   * ERROR: the testsuite detected an error

   * WARNING: the testsuite detected a possible problem

   It is normal for some tests to report unexpected failures.  At the
current time the testing harness does not allow fine grained control
over whether or not a test is expected to fail.  This problem should be
fixed in future releases.

6.5 Submitting test results
===========================

If you want to report the results to the GCC project, use the
`contrib/test_summary' shell script.  Start it in the OBJDIR with

     SRCDIR/contrib/test_summary -p your_commentary.txt \
         -m gcc-testresults@gcc.gnu.org |sh

   This script uses the `Mail' program to send the results, so make
sure it is in your `PATH'.  The file `your_commentary.txt' is prepended
to the testsuite summary and should contain any special remarks you
have on your results or your build environment.  Please do not edit the
testsuite result block or the subject line, as these messages may be
automatically processed.


File: gccinstall.info,  Node: Final install,  Prev: Testing,  Up: Installing GCC

7 Installing GCC: Final installation
************************************

   Now that GCC has been built (and optionally tested), you can install
it with
     cd OBJDIR && make install

   We strongly recommend to install into a target directory where there
is no previous version of GCC present.  Also, the GNAT runtime should
not be stripped, as this would break certain features of the debugger
that depend on this debugging information (catching Ada exceptions for
instance).

   That step completes the installation of GCC; user level binaries can
be found in `PREFIX/bin' where PREFIX is the value you specified with
the `--prefix' to configure (or `/usr/local' by default).  (If you
specified `--bindir', that directory will be used instead; otherwise,
if you specified `--exec-prefix', `EXEC-PREFIX/bin' will be used.)
Headers for the C++ and Java libraries are installed in
`PREFIX/include'; libraries in `LIBDIR' (normally `PREFIX/lib');
internal parts of the compiler in `LIBDIR/gcc' and `LIBEXECDIR/gcc';
documentation in info format in `INFODIR' (normally `PREFIX/info').

   When installing cross-compilers, GCC's executables are not only
installed into `BINDIR', that is, `EXEC-PREFIX/bin', but additionally
into `EXEC-PREFIX/TARGET-ALIAS/bin', if that directory exists.
Typically, such "tooldirs" hold target-specific binutils, including
assembler and linker.

   Installation into a temporary staging area or into a `chroot' jail
can be achieved with the command

     make DESTDIR=PATH-TO-ROOTDIR install

where PATH-TO-ROOTDIR is the absolute path of a directory relative to
which all installation paths will be interpreted.  Note that the
directory specified by `DESTDIR' need not exist yet; it will be created
if necessary.

   There is a subtle point with tooldirs and `DESTDIR': If you relocate
a cross-compiler installation with e.g. `DESTDIR=ROOTDIR', then the
directory `ROOTDIR/EXEC-PREFIX/TARGET-ALIAS/bin' will be filled with
duplicated GCC executables only if it already exists, it will not be
created otherwise.  This is regarded as a feature, not as a bug,
because it gives slightly more control to the packagers using the
`DESTDIR' feature.

   You can install stripped programs and libraries with

     make install-strip

   If you are bootstrapping a released version of GCC then please
quickly review the build status page for your release, available from
`http://gcc.gnu.org/buildstat.html'.  If your system is not listed for
the version of GCC that you built, send a note to <gcc@gcc.gnu.org>
indicating that you successfully built and installed GCC.  Include the
following information:

   * Output from running `SRCDIR/config.guess'.  Do not send that file
     itself, just the one-line output from running it.

   * The output of `gcc -v' for your newly installed `gcc'.  This tells
     us which version of GCC you built and the options you passed to
     configure.

   * Whether you enabled all languages or a subset of them.  If you
     used a full distribution then this information is part of the
     configure options in the output of `gcc -v', but if you downloaded
     the "core" compiler plus additional front ends then it isn't
     apparent which ones you built unless you tell us about it.

   * If the build was for GNU/Linux, also include:
        * The distribution name and version (e.g., Red Hat 7.1 or
          Debian 2.2.3); this information should be available from
          `/etc/issue'.

        * The version of the Linux kernel, available from `uname
          --version' or `uname -a'.

        * The version of glibc you used; for RPM-based systems like Red
          Hat, Mandrake, and SuSE type `rpm -q glibc' to get the glibc
          version, and on systems like Debian and Progeny use `dpkg -l
          libc6'.
     For other systems, you can include similar information if you
     think it is relevant.

   * Any other information that you think would be useful to people
     building GCC on the same configuration.  The new entry in the
     build status list will include a link to the archived copy of your
     message.

   We'd also like to know if the *note host/target specific
installation notes: Specific.  didn't include your host/target
information or if that information is incomplete or out of date.  Send
a note to <gcc@gcc.gnu.org> detailing how the information should be
changed.

   If you find a bug, please report it following the bug reporting
guidelines.

   If you want to print the GCC manuals, do `cd OBJDIR; make dvi'.  You
will need to have `texi2dvi' (version at least 4.7) and TeX installed.
This creates a number of `.dvi' files in subdirectories of `OBJDIR';
these may be converted for printing with programs such as `dvips'.
Alternately, by using `make pdf' in place of `make dvi', you can create
documentation in the form of `.pdf' files; this requires `texi2pdf',
which is included with Texinfo version 4.8 and later.  You can also buy
printed manuals from the Free Software Foundation, though such manuals
may not be for the most recent version of GCC.

   If you would like to generate online HTML documentation, do `cd
OBJDIR; make html' and HTML will be generated for the gcc manuals in
`OBJDIR/gcc/HTML'.


File: gccinstall.info,  Node: Binaries,  Next: Specific,  Prev: Installing GCC,  Up: Top

8 Installing GCC: Binaries
**************************

   We are often asked about pre-compiled versions of GCC.  While we
cannot provide these for all platforms, below you'll find links to
binaries for various platforms where creating them by yourself is not
easy due to various reasons.

   Please note that we did not create these binaries, nor do we support
them.  If you have any problems installing them, please contact their
makers.

   * AIX:
        * Bull's Freeware and Shareware Archive for AIX;

        * Hudson Valley Community College Open Source Software for IBM
          System p;

        * AIX 5L and 6 Open Source Packages.

   * DOS--DJGPP.

   * Renesas H8/300[HS]--GNU Development Tools for the Renesas
     H8/300[HS] Series.

   * HP-UX:
        * HP-UX Porting Center;

        * Binaries for HP-UX 11.00 at Aachen University of Technology.

   * SCO OpenServer/Unixware.

   * Solaris 2 (SPARC, Intel):
        * Sunfreeware

        * Blastwave

        * OpenCSW

        * TGCware

   * SGI IRIX:
        * Nekoware

        * TGCware

   * Microsoft Windows:
        * The Cygwin project;

        * The MinGW project.

   * The Written Word offers binaries for AIX 4.3.3, 5.1 and 5.2, IRIX
     6.5, Tru64 UNIX 4.0D and 5.1, GNU/Linux (i386), HP-UX 10.20,
     11.00, and 11.11, and Solaris/SPARC 2.5.1, 2.6, 7, 8, 9 and 10.

   * OpenPKG offers binaries for quite a number of platforms.

   * The GFortran Wiki has links to GNU Fortran binaries for several
     platforms.


File: gccinstall.info,  Node: Specific,  Next: Old,  Prev: Binaries,  Up: Top

9 Host/target specific installation notes for GCC
*************************************************

   Please read this document carefully _before_ installing the GNU
Compiler Collection on your machine.

   Note that this list of install notes is _not_ a list of supported
hosts or targets.  Not all supported hosts and targets are listed here,
only the ones that require host-specific or target-specific information
are.

alpha*-*-*
==========

This section contains general configuration information for all
alpha-based platforms using ELF (in particular, ignore this section for
DEC OSF/1, Digital UNIX and Tru64 UNIX).  In addition to reading this
section, please read all other sections that match your target.

   We require binutils 2.11.2 or newer.  Previous binutils releases had
a number of problems with DWARF 2 debugging information, not the least
of which is incorrect linking of shared libraries.

alpha*-dec-osf5.1
=================

Systems using processors that implement the DEC Alpha architecture and
are running the DEC/Compaq/HP Unix (DEC OSF/1, Digital UNIX, or
Compaq/HP Tru64 UNIX) operating system, for example the DEC Alpha AXP
systems.

   Support for Tru64 UNIX V5.1 has been obsoleted in GCC 4.7, but can
still be enabled by configuring with `--enable-obsolete'.  Support will
be removed in GCC 4.8.  As of GCC 4.6, support for Tru64 UNIX V4.0 and
V5.0 has been removed.  As of GCC 3.2, versions before
`alpha*-dec-osf4' are no longer supported.  (These are the versions
which identify themselves as DEC OSF/1.)

   On Tru64 UNIX, virtual memory exhausted bootstrap failures may be
fixed by reconfiguring Kernel Virtual Memory and Swap parameters per
the `/usr/sbin/sys_check' Tuning Suggestions, or applying the patch in
`http://gcc.gnu.org/ml/gcc/2002-08/msg00822.html'.  Depending on the OS
version used, you need a data segment size between 512 MB and 1 GB, so
simply use `ulimit -Sd unlimited'.

   As of GNU binutils 2.22, neither GNU `as' nor GNU `ld' are supported
on Tru64 UNIX, so you must not configure GCC with `--with-gnu-as' or
`--with-gnu-ld'.

   Cross-compilers for the Tru64 UNIX target currently do not work
because the auxiliary programs `mips-tdump' and `mips-tfile' can't be
compiled on anything but Tru64 UNIX.

   GCC writes a `.verstamp' directive to the assembler output file
unless it is built as a cross-compiler.  It gets the version to use from
the system header file `/usr/include/stamp.h'.  If you install a new
version of Tru64 UNIX, you should rebuild GCC to pick up the new version
stamp.

   GCC now supports both the native (ECOFF) debugging format used by DBX
and GDB and an encapsulated STABS format for use only with GDB.  See the
discussion of the `--with-stabs' option of `configure' above for more
information on these formats and how to select them.

   There is a bug in DEC's assembler that produces incorrect line
numbers for ECOFF format when the `.align' directive is used.  To work
around this problem, GCC will not emit such alignment directives while
writing ECOFF format debugging information even if optimization is
being performed.  Unfortunately, this has the very undesirable
side-effect that code addresses when `-O' is specified are different
depending on whether or not `-g' is also specified.

   To avoid this behavior, specify `-gstabs+' and use GDB instead of
DBX.  DEC is now aware of this problem with the assembler and hopes to
provide a fix shortly.

amd64-*-solaris2.1[0-9]*
========================

This is a synonym for `x86_64-*-solaris2.1[0-9]*'.

arm-*-eabi
==========

ARM-family processors.  Subtargets that use the ELF object format
require GNU binutils 2.13 or newer.  Such subtargets include:
`arm-*-netbsdelf', `arm-*-*linux-gnueabi*' and `arm-*-rtemseabi'.

avr
===

ATMEL AVR-family micro controllers.  These are used in embedded
applications.  There are no standard Unix configurations.  *Note AVR
Options: (gcc)AVR Options, for the list of supported MCU types.

   Use `configure --target=avr --enable-languages="c"' to configure GCC.

   Further installation notes and other useful information about AVR
tools can also be obtained from:

   * http://www.nongnu.org/avr/

   * http://www.amelek.gda.pl/avr/

   We _strongly_ recommend using binutils 2.13 or newer.

   The following error:
     Error: register required

   indicates that you should upgrade to a newer version of the binutils.

Blackfin
========

The Blackfin processor, an Analog Devices DSP.  *Note Blackfin Options:
(gcc)Blackfin Options,

   More information, and a version of binutils with support for this
processor, is available at `http://blackfin.uclinux.org'

CR16
====

The CR16 CompactRISC architecture is a 16-bit architecture. This
architecture is used in embedded applications.

   *Note CR16 Options: (gcc)CR16 Options,

   Use `configure --target=cr16-elf --enable-languages=c,c++' to
configure GCC for building a CR16 elf cross-compiler.

   Use `configure --target=cr16-uclinux --enable-languages=c,c++' to
configure GCC for building a CR16 uclinux cross-compiler.

CRIS
====

CRIS is the CPU architecture in Axis Communications ETRAX
system-on-a-chip series.  These are used in embedded applications.

   *Note CRIS Options: (gcc)CRIS Options, for a list of CRIS-specific
options.

   There are a few different CRIS targets:
`cris-axis-elf'
     Mainly for monolithic embedded systems.  Includes a multilib for
     the `v10' core used in `ETRAX 100 LX'.

`cris-axis-linux-gnu'
     A GNU/Linux port for the CRIS architecture, currently targeting
     `ETRAX 100 LX' by default.

   For `cris-axis-elf' you need binutils 2.11 or newer.  For
`cris-axis-linux-gnu' you need binutils 2.12 or newer.

   Pre-packaged tools can be obtained from
`ftp://ftp.axis.com/pub/axis/tools/cris/compiler-kit/'.  More
information about this platform is available at
`http://developer.axis.com/'.

DOS
===

Please have a look at the binaries page.

   You cannot install GCC by itself on MSDOS; it will not compile under
any MSDOS compiler except itself.  You need to get the complete
compilation package DJGPP, which includes binaries as well as sources,
and includes all the necessary compilation tools and libraries.

epiphany-*-elf
==============

Adapteva Epiphany.  This configuration is intended for embedded systems.

*-*-freebsd*
============

Support for FreeBSD 1 was discontinued in GCC 3.2.  Support for FreeBSD
2 (and any mutant a.out variants of FreeBSD 3) was discontinued in GCC
4.0.

   In order to better utilize FreeBSD base system functionality and
match the configuration of the system compiler, GCC 4.5 and above as
well as GCC 4.4 past 2010-06-20 leverage SSP support in libc (which is
present on FreeBSD 7 or later) and the use of `__cxa_atexit' by default
(on FreeBSD 6 or later).  The use of `dl_iterate_phdr' inside
`libgcc_s.so.1' and boehm-gc (on FreeBSD 7 or later) is enabled by GCC
4.5 and above.

   We support FreeBSD using the ELF file format with DWARF 2 debugging
for all CPU architectures.  You may use `-gstabs' instead of `-g', if
you really want the old debugging format.  There are no known issues
with mixing object files and libraries with different debugging
formats.  Otherwise, this release of GCC should now match more of the
configuration used in the stock FreeBSD configuration of GCC.  In
particular, `--enable-threads' is now configured by default.  However,
as a general user, do not attempt to replace the system compiler with
this release.  Known to bootstrap and check with good results on
FreeBSD 7.2-STABLE.  In the past, known to bootstrap and check with
good results on FreeBSD 3.0, 3.4, 4.0, 4.2, 4.3, 4.4, 4.5, 4.8, 4.9 and
5-CURRENT.

   The version of binutils installed in `/usr/bin' probably works with
this release of GCC.  Bootstrapping against the latest GNU binutils
and/or the version found in `/usr/ports/devel/binutils' has been known
to enable additional features and improve overall testsuite results.
However, it is currently known that boehm-gc (which itself is required
for java) may not configure properly on FreeBSD prior to the FreeBSD
7.0 release with GNU binutils after 2.16.1.

h8300-hms
=========

Renesas H8/300 series of processors.

   Please have a look at the binaries page.

   The calling convention and structure layout has changed in release
2.6.  All code must be recompiled.  The calling convention now passes
the first three arguments in function calls in registers.  Structures
are no longer a multiple of 2 bytes.

hppa*-hp-hpux*
==============

Support for HP-UX version 9 and older was discontinued in GCC 3.4.

   We require using gas/binutils on all hppa platforms.  Version 2.19 or
later is recommended.

   It may be helpful to configure GCC with the `--with-gnu-as' and
`--with-as=...' options to ensure that GCC can find GAS.

   The HP assembler should not be used with GCC.  It is rarely tested
and may not work.  It shouldn't be used with any languages other than C
due to its many limitations.

   Specifically, `-g' does not work (HP-UX uses a peculiar debugging
format which GCC does not know about).  It also inserts timestamps into
each object file it creates, causing the 3-stage comparison test to
fail during a bootstrap.  You should be able to continue by saying
`make all-host all-target' after getting the failure from `make'.

   Various GCC features are not supported.  For example, it does not
support weak symbols or alias definitions.  As a result, explicit
template instantiations are required when using C++.  This makes it
difficult if not impossible to build many C++ applications.

   There are two default scheduling models for instructions.  These are
PROCESSOR_7100LC and PROCESSOR_8000.  They are selected from the pa-risc
architecture specified for the target machine when configuring.
PROCESSOR_8000 is the default.  PROCESSOR_7100LC is selected when the
target is a `hppa1*' machine.

   The PROCESSOR_8000 model is not well suited to older processors.
Thus, it is important to completely specify the machine architecture
when configuring if you want a model other than PROCESSOR_8000.  The
macro TARGET_SCHED_DEFAULT can be defined in BOOT_CFLAGS if a different
default scheduling model is desired.

   As of GCC 4.0, GCC uses the UNIX 95 namespace for HP-UX 10.10
through 11.00, and the UNIX 98 namespace for HP-UX 11.11 and later.
This namespace change might cause problems when bootstrapping with an
earlier version of GCC or the HP compiler as essentially the same
namespace is required for an entire build.  This problem can be avoided
in a number of ways.  With HP cc, `UNIX_STD' can be set to `95' or
`98'.  Another way is to add an appropriate set of predefines to `CC'.
The description for the `munix=' option contains a list of the
predefines used with each standard.

   More specific information to `hppa*-hp-hpux*' targets follows.

hppa*-hp-hpux10
===============

For hpux10.20, we _highly_ recommend you pick up the latest sed patch
`PHCO_19798' from HP.

   The C++ ABI has changed incompatibly in GCC 4.0.  COMDAT subspaces
are used for one-only code and data.  This resolves many of the previous
problems in using C++ on this target.  However, the ABI is not
compatible with the one implemented under HP-UX 11 using secondary
definitions.

hppa*-hp-hpux11
===============

GCC 3.0 and up support HP-UX 11.  GCC 2.95.x is not supported and cannot
be used to compile GCC 3.0 and up.

   The libffi and libjava libraries haven't been ported to 64-bit HP-UX
and don't build.

   Refer to binaries for information about obtaining precompiled GCC
binaries for HP-UX.  Precompiled binaries must be obtained to build the
Ada language as it can't be bootstrapped using C.  Ada is only
available for the 32-bit PA-RISC runtime.

   Starting with GCC 3.4 an ISO C compiler is required to bootstrap.
The bundled compiler supports only traditional C; you will need either
HP's unbundled compiler, or a binary distribution of GCC.

   It is possible to build GCC 3.3 starting with the bundled HP
compiler, but the process requires several steps.  GCC 3.3 can then be
used to build later versions.  The fastjar program contains ISO C code
and can't be built with the HP bundled compiler.  This problem can be
avoided by not building the Java language.  For example, use the
`--enable-languages="c,c++,f77,objc"' option in your configure command.

   There are several possible approaches to building the distribution.
Binutils can be built first using the HP tools.  Then, the GCC
distribution can be built.  The second approach is to build GCC first
using the HP tools, then build binutils, then rebuild GCC.  There have
been problems with various binary distributions, so it is best not to
start from a binary distribution.

   On 64-bit capable systems, there are two distinct targets.  Different
installation prefixes must be used if both are to be installed on the
same system.  The `hppa[1-2]*-hp-hpux11*' target generates code for the
32-bit PA-RISC runtime architecture and uses the HP linker.  The
`hppa64-hp-hpux11*' target generates 64-bit code for the PA-RISC 2.0
architecture.

   The script config.guess now selects the target type based on the
compiler detected during configuration.  You must define `PATH' or `CC'
so that configure finds an appropriate compiler for the initial
bootstrap.  When `CC' is used, the definition should contain the
options that are needed whenever `CC' is used.

   Specifically, options that determine the runtime architecture must be
in `CC' to correctly select the target for the build.  It is also
convenient to place many other compiler options in `CC'.  For example,
`CC="cc -Ac +DA2.0W -Wp,-H16376 -D_CLASSIC_TYPES -D_HPUX_SOURCE"' can
be used to bootstrap the GCC 3.3 branch with the HP compiler in 64-bit
K&R/bundled mode.  The `+DA2.0W' option will result in the automatic
selection of the `hppa64-hp-hpux11*' target.  The macro definition
table of cpp needs to be increased for a successful build with the HP
compiler.  _CLASSIC_TYPES and _HPUX_SOURCE need to be defined when
building with the bundled compiler, or when using the `-Ac' option.
These defines aren't necessary with `-Ae'.

   It is best to explicitly configure the `hppa64-hp-hpux11*' target
with the `--with-ld=...' option.  This overrides the standard search
for ld.  The two linkers supported on this target require different
commands.  The default linker is determined during configuration.  As a
result, it's not possible to switch linkers in the middle of a GCC
build.  This has been reported to sometimes occur in unified builds of
binutils and GCC.

   A recent linker patch must be installed for the correct operation of
GCC 3.3 and later.  `PHSS_26559' and `PHSS_24304' are the oldest linker
patches that are known to work.  They are for HP-UX 11.00 and 11.11,
respectively.  `PHSS_24303', the companion to `PHSS_24304', might be
usable but it hasn't been tested.  These patches have been superseded.
Consult the HP patch database to obtain the currently recommended
linker patch for your system.

   The patches are necessary for the support of weak symbols on the
32-bit port, and for the running of initializers and finalizers.  Weak
symbols are implemented using SOM secondary definition symbols.  Prior
to HP-UX 11, there are bugs in the linker support for secondary symbols.
The patches correct a problem of linker core dumps creating shared
libraries containing secondary symbols, as well as various other
linking issues involving secondary symbols.

   GCC 3.3 uses the ELF DT_INIT_ARRAY and DT_FINI_ARRAY capabilities to
run initializers and finalizers on the 64-bit port.  The 32-bit port
uses the linker `+init' and `+fini' options for the same purpose.  The
patches correct various problems with the +init/+fini options,
including program core dumps.  Binutils 2.14 corrects a problem on the
64-bit port resulting from HP's non-standard use of the .init and .fini
sections for array initializers and finalizers.

   Although the HP and GNU linkers are both supported for the
`hppa64-hp-hpux11*' target, it is strongly recommended that the HP
linker be used for link editing on this target.

   At this time, the GNU linker does not support the creation of long
branch stubs.  As a result, it can't successfully link binaries
containing branch offsets larger than 8 megabytes.  In addition, there
are problems linking shared libraries, linking executables with
`-static', and with dwarf2 unwind and exception support.  It also
doesn't provide stubs for internal calls to global functions in shared
libraries, so these calls can't be overloaded.

   The HP dynamic loader does not support GNU symbol versioning, so
symbol versioning is not supported.  It may be necessary to disable
symbol versioning with `--disable-symvers' when using GNU ld.

   POSIX threads are the default.  The optional DCE thread library is
not supported, so `--enable-threads=dce' does not work.

*-*-linux-gnu
=============

Versions of libstdc++-v3 starting with 3.2.1 require bug fixes present
in glibc 2.2.5 and later.  More information is available in the
libstdc++-v3 documentation.

i?86-*-linux*
=============

As of GCC 3.3, binutils 2.13.1 or later is required for this platform.
See bug 10877 for more information.

   If you receive Signal 11 errors when building on GNU/Linux, then it
is possible you have a hardware problem.  Further information on this
can be found on www.bitwizard.nl.

i?86-*-solaris2.[89]
====================

The Sun assembler in Solaris 8 and 9 has several bugs and limitations.
While GCC works around them, several features are missing, so it is
recommended to use the GNU assembler instead.  There is no bundled
version, but the current version, from GNU binutils 2.22, is known to
work.

   Solaris 2/x86 doesn't support the execution of SSE/SSE2 instructions
before Solaris 9 4/04, even if the CPU supports them.  Programs will
receive `SIGILL' if they try.  The fix is available both in Solaris 9
Update 6 and kernel patch 112234-12 or newer.  There is no
corresponding patch for Solaris 8.  To avoid this problem, `-march'
defaults to `pentiumpro' on Solaris 8 and 9.  If you have the patch
installed, you can configure GCC with an appropriate `--with-arch'
option, but need GNU `as' for SSE2 support.

i?86-*-solaris2.10
==================

Use this for Solaris 10 or later on x86 and x86-64 systems.  Starting
with GCC 4.7, there is also a 64-bit `amd64-*-solaris2.1[0-9]*' or
`x86_64-*-solaris2.1[0-9]*' configuration that corresponds to
`sparcv9-sun-solaris2*'.

   It is recommended that you configure GCC to use the GNU assembler, in
`/usr/sfw/bin/gas'.  The versions included in Solaris 10, from GNU
binutils 2.15, and Solaris 11, from GNU binutils 2.19, work fine,
although the current version, from GNU binutils 2.22, is known to work,
too.  Recent versions of the Sun assembler in `/usr/ccs/bin/as' work
almost as well, though.

   For linking, the Sun linker, is preferred.  If you want to use the
GNU linker instead, which is available in `/usr/sfw/bin/gld', note that
due to a packaging bug the version in Solaris 10, from GNU binutils
2.15, cannot be used, while the version in Solaris 11, from GNU binutils
2.19, works, as does the latest version, from GNU binutils 2.22.

   To use GNU `as', configure with the options `--with-gnu-as
--with-as=/usr/sfw/bin/gas'.  It may be necessary to configure with
`--without-gnu-ld --with-ld=/usr/ccs/bin/ld' to guarantee use of Sun
`ld'.

ia64-*-linux
============

IA-64 processor (also known as IPF, or Itanium Processor Family)
running GNU/Linux.

   If you are using the installed system libunwind library with
`--with-system-libunwind', then you must use libunwind 0.98 or later.

   None of the following versions of GCC has an ABI that is compatible
with any of the other versions in this list, with the exception that
Red Hat 2.96 and Trillian 000171 are compatible with each other: 3.1,
3.0.2, 3.0.1, 3.0, Red Hat 2.96, and Trillian 000717.  This primarily
affects C++ programs and programs that create shared libraries.  GCC
3.1 or later is recommended for compiling linux, the kernel.  As of
version 3.1 GCC is believed to be fully ABI compliant, and hence no
more major ABI changes are expected.

ia64-*-hpux*
============

Building GCC on this target requires the GNU Assembler.  The bundled HP
assembler will not work.  To prevent GCC from using the wrong assembler,
the option `--with-gnu-as' may be necessary.

   The GCC libunwind library has not been ported to HPUX.  This means
that for GCC versions 3.2.3 and earlier, `--enable-libunwind-exceptions'
is required to build GCC.  For GCC 3.3 and later, this is the default.
For gcc 3.4.3 and later, `--enable-libunwind-exceptions' is removed and
the system libunwind library will always be used.

*-ibm-aix*
==========

Support for AIX version 3 and older was discontinued in GCC 3.4.
Support for AIX version 4.2 and older was discontinued in GCC 4.5.

   "out of memory" bootstrap failures may indicate a problem with
process resource limits (ulimit).  Hard limits are configured in the
`/etc/security/limits' system configuration file.

   GCC can bootstrap with recent versions of IBM XLC, but bootstrapping
with an earlier release of GCC is recommended.  Bootstrapping with XLC
requires a larger data segment, which can be enabled through the
LDR_CNTRL environment variable, e.g.,

     % LDR_CNTRL=MAXDATA=0x50000000
     % export LDR_CNTRL

   One can start with a pre-compiled version of GCC to build from
sources.  One may delete GCC's "fixed" header files when starting with
a version of GCC built for an earlier release of AIX.

   To speed up the configuration phases of bootstrapping and installing
GCC, one may use GNU Bash instead of AIX `/bin/sh', e.g.,

     % CONFIG_SHELL=/opt/freeware/bin/bash
     % export CONFIG_SHELL

   and then proceed as described in the build instructions, where we
strongly recommend specifying an absolute path to invoke
SRCDIR/configure.

   Because GCC on AIX is built as a 32-bit executable by default,
(although it can generate 64-bit programs) the GMP and MPFR libraries
required by gfortran must be 32-bit libraries.  Building GMP and MPFR
as static archive libraries works better than shared libraries.

   Errors involving `alloca' when building GCC generally are due to an
incorrect definition of `CC' in the Makefile or mixing files compiled
with the native C compiler and GCC.  During the stage1 phase of the
build, the native AIX compiler *must* be invoked as `cc' (not `xlc').
Once `configure' has been informed of `xlc', one needs to use `make
distclean' to remove the configure cache files and ensure that `CC'
environment variable does not provide a definition that will confuse
`configure'.  If this error occurs during stage2 or later, then the
problem most likely is the version of Make (see above).

   The native `as' and `ld' are recommended for bootstrapping on AIX.
The GNU Assembler, GNU Linker, and GNU Binutils version 2.20 is
required to bootstrap on AIX 5.  The native AIX tools do interoperate
with GCC.

   AIX 5.3 TL10, AIX 6.1 TL05 and AIX 7.1 TL00 introduced an AIX
assembler change that sometimes produces corrupt assembly files causing
AIX linker errors.  The bug breaks GCC bootstrap on AIX and can cause
compilation failures with existing GCC installations.  An AIX iFix for
AIX 5.3 is available (APAR IZ98385 for AIX 5.3 TL10, APAR IZ98477 for
AIX 5.3 TL11 and IZ98134 for AIX 5.3 TL12).  Fixes for AIX 6.1 (APAR
IZ98732 for AIX 6.1 TL05 and APAR IZ98861 for AIX 6.1 TL06) and AIX 7.1
are in verification and packaging phases.

   Building `libstdc++.a' requires a fix for an AIX Assembler bug APAR
IY26685 (AIX 4.3) or APAR IY25528 (AIX 5.1).  It also requires a fix
for another AIX Assembler bug and a co-dependent AIX Archiver fix
referenced as APAR IY53606 (AIX 5.2) or as APAR IY54774 (AIX 5.1)

   `libstdc++' in GCC 3.4 increments the major version number of the
shared object and GCC installation places the `libstdc++.a' shared
library in a common location which will overwrite the and GCC 3.3
version of the shared library.  Applications either need to be
re-linked against the new shared library or the GCC 3.1 and GCC 3.3
versions of the `libstdc++' shared object needs to be available to the
AIX runtime loader.  The GCC 3.1 `libstdc++.so.4', if present, and GCC
3.3 `libstdc++.so.5' shared objects can be installed for runtime
dynamic loading using the following steps to set the `F_LOADONLY' flag
in the shared object for _each_ multilib `libstdc++.a' installed:

   Extract the shared objects from the currently installed
`libstdc++.a' archive:
     % ar -x libstdc++.a libstdc++.so.4 libstdc++.so.5

   Enable the `F_LOADONLY' flag so that the shared object will be
available for runtime dynamic loading, but not linking:
     % strip -e libstdc++.so.4 libstdc++.so.5

   Archive the runtime-only shared object in the GCC 3.4 `libstdc++.a'
archive:
     % ar -q libstdc++.a libstdc++.so.4 libstdc++.so.5

   Linking executables and shared libraries may produce warnings of
duplicate symbols.  The assembly files generated by GCC for AIX always
have included multiple symbol definitions for certain global variable
and function declarations in the original program.  The warnings should
not prevent the linker from producing a correct library or runnable
executable.

   AIX 4.3 utilizes a "large format" archive to support both 32-bit and
64-bit object modules.  The routines provided in AIX 4.3.0 and AIX 4.3.1
to parse archive libraries did not handle the new format correctly.
These routines are used by GCC and result in error messages during
linking such as "not a COFF file".  The version of the routines shipped
with AIX 4.3.1 should work for a 32-bit environment.  The `-g' option
of the archive command may be used to create archives of 32-bit objects
using the original "small format".  A correct version of the routines
is shipped with AIX 4.3.2 and above.

   Some versions of the AIX binder (linker) can fail with a relocation
overflow severe error when the `-bbigtoc' option is used to link
GCC-produced object files into an executable that overflows the TOC.  A
fix for APAR IX75823 (OVERFLOW DURING LINK WHEN USING GCC AND -BBIGTOC)
is available from IBM Customer Support and from its
techsupport.services.ibm.com website as PTF U455193.

   The AIX 4.3.2.1 linker (bos.rte.bind_cmds Level 4.3.2.1) will dump
core with a segmentation fault when invoked by any version of GCC.  A
fix for APAR IX87327 is available from IBM Customer Support and from its
techsupport.services.ibm.com website as PTF U461879.  This fix is
incorporated in AIX 4.3.3 and above.

   The initial assembler shipped with AIX 4.3.0 generates incorrect
object files.  A fix for APAR IX74254 (64BIT DISASSEMBLED OUTPUT FROM
COMPILER FAILS TO ASSEMBLE/BIND) is available from IBM Customer Support
and from its techsupport.services.ibm.com website as PTF U453956.  This
fix is incorporated in AIX 4.3.1 and above.

   AIX provides National Language Support (NLS).  Compilers and
assemblers use NLS to support locale-specific representations of
various data formats including floating-point numbers (e.g., `.'  vs
`,' for separating decimal fractions).  There have been problems
reported where GCC does not produce the same floating-point formats
that the assembler expects.  If one encounters this problem, set the
`LANG' environment variable to `C' or `En_US'.

   A default can be specified with the `-mcpu=CPU_TYPE' switch and
using the configure option `--with-cpu-CPU_TYPE'.

iq2000-*-elf
============

Vitesse IQ2000 processors.  These are used in embedded applications.
There are no standard Unix configurations.

lm32-*-elf
==========

Lattice Mico32 processor.  This configuration is intended for embedded
systems.

lm32-*-uclinux
==============

Lattice Mico32 processor.  This configuration is intended for embedded
systems running uClinux.

m32c-*-elf
==========

Renesas M32C processor.  This configuration is intended for embedded
systems.

m32r-*-elf
==========

Renesas M32R processor.  This configuration is intended for embedded
systems.

m68k-*-*
========

By default, `m68k-*-elf*', `m68k-*-rtems',  `m68k-*-uclinux' and
`m68k-*-linux' build libraries for both M680x0 and ColdFire processors.
If you only need the M680x0 libraries, you can omit the ColdFire ones
by passing `--with-arch=m68k' to `configure'.  Alternatively, you can
omit the M680x0 libraries by passing `--with-arch=cf' to `configure'.
These targets default to 5206 or 5475 code as appropriate for the
target system when configured with `--with-arch=cf' and 68020 code
otherwise.

   The `m68k-*-netbsd' and `m68k-*-openbsd' targets also support the
`--with-arch' option.  They will generate ColdFire CFV4e code when
configured with `--with-arch=cf' and 68020 code otherwise.

   You can override the default processors listed above by configuring
with `--with-cpu=TARGET'.  This TARGET can either be a `-mcpu' argument
or one of the following values: `m68000', `m68010', `m68020', `m68030',
`m68040', `m68060', `m68020-40' and `m68020-60'.

   GCC requires at least binutils version 2.17 on these targets.

m68k-*-uclinux
==============

GCC 4.3 changed the uClinux configuration so that it uses the
`m68k-linux-gnu' ABI rather than the `m68k-elf' ABI.  It also added
improved support for C++ and flat shared libraries, both of which were
ABI changes.

mep-*-elf
=========

Toshiba Media embedded Processor.  This configuration is intended for
embedded systems.

microblaze-*-elf
================

Xilinx MicroBlaze processor.  This configuration is intended for
embedded systems.

mips-*-*
========

If on a MIPS system you get an error message saying "does not have gp
sections for all it's [sic] sectons [sic]", don't worry about it.  This
happens whenever you use GAS with the MIPS linker, but there is not
really anything wrong, and it is okay to use the output file.  You can
stop such warnings by installing the GNU linker.

   It would be nice to extend GAS to produce the gp tables, but they are
optional, and there should not be a warning about their absence.

   The libstdc++ atomic locking routines for MIPS targets requires MIPS
II and later.  A patch went in just after the GCC 3.3 release to make
`mips*-*-*' use the generic implementation instead.  You can also
configure for `mipsel-elf' as a workaround.  The `mips*-*-linux*'
target continues to use the MIPS II routines.  More work on this is
expected in future releases.

   The built-in `__sync_*' functions are available on MIPS II and later
systems and others that support the `ll', `sc' and `sync' instructions.
This can be overridden by passing `--with-llsc' or `--without-llsc'
when configuring GCC.  Since the Linux kernel emulates these
instructions if they are missing, the default for `mips*-*-linux*'
targets is `--with-llsc'.  The `--with-llsc' and `--without-llsc'
configure options may be overridden at compile time by passing the
`-mllsc' or `-mno-llsc' options to the compiler.

   MIPS systems check for division by zero (unless
`-mno-check-zero-division' is passed to the compiler) by generating
either a conditional trap or a break instruction.  Using trap results
in smaller code, but is only supported on MIPS II and later.  Also,
some versions of the Linux kernel have a bug that prevents trap from
generating the proper signal (`SIGFPE').  To enable the use of break,
use the `--with-divide=breaks' `configure' option when configuring GCC.
The default is to use traps on systems that support them.

   The assembler from GNU binutils 2.17 and earlier has a bug in the way
it sorts relocations for REL targets (o32, o64, EABI).  This can cause
bad code to be generated for simple C++ programs.  Also the linker from
GNU binutils versions prior to 2.17 has a bug which causes the runtime
linker stubs in very large programs, like `libgcj.so', to be
incorrectly generated.  GNU Binutils 2.18 and later (and snapshots made
after Nov. 9, 2006) should be free from both of these problems.

mips-sgi-irix5
==============

Support for IRIX 5 has been removed in GCC 4.6.

mips-sgi-irix6
==============

Support for IRIX 6.5 has been obsoleted in GCC 4.7, but can still be
enabled by configuring with `--enable-obsolete'.  Support will be
removed in GCC 4.8.  Support for IRIX 6 releases before 6.5 has been
removed in GCC 4.6, as well as support for the O32 ABI.  It is
_strongly_ recommended to upgrade to at least IRIX 6.5.18.  This
release introduced full ISO C99 support, though for the N32 and N64 ABIs
only.

   To build and use GCC on IRIX 6.5, you need the IRIX Development
Foundation (IDF) and IRIX Development Libraries (IDL).  They are
included with the IRIX 6.5 media.

   If you are using SGI's MIPSpro `cc' as your bootstrap compiler, you
must ensure that the N32 ABI is in use.  To test this, compile a simple
C file with `cc' and then run `file' on the resulting object file.  The
output should look like:

     test.o: ELF N32 MSB ...

If you see:

     test.o: ELF 32-bit MSB ...

or

     test.o: ELF 64-bit MSB ...

then your version of `cc' uses the O32 or N64 ABI by default.  You
should set the environment variable `CC' to `cc -n32' before
configuring GCC.

   If you want the resulting `gcc' to run on old 32-bit systems with
the MIPS R4400 CPU, you need to ensure that only code for the `mips3'
instruction set architecture (ISA) is generated.  While GCC 3.x does
this correctly, both GCC 2.95 and SGI's MIPSpro `cc' may change the ISA
depending on the machine where GCC is built.  Using one of them as the
bootstrap compiler may result in `mips4' code, which won't run at all
on `mips3'-only systems.  For the test program above, you should see:

     test.o: ELF N32 MSB mips-3 ...

If you get:

     test.o: ELF N32 MSB mips-4 ...

instead, you should set the environment variable `CC' to `cc -n32
-mips3' or `gcc -mips3' respectively before configuring GCC.

   MIPSpro C 7.4 may cause bootstrap failures, due to a bug when
inlining `memcmp'.  Either add `-U__INLINE_INTRINSICS' to the `CC'
environment variable as a workaround or upgrade to MIPSpro C 7.4.1m.

   GCC on IRIX 6.5 is usually built to support the N32 and N64 ABIs.  If
you build GCC on a system that doesn't have the N64 libraries installed
or cannot run 64-bit binaries, you need to configure with
`--disable-multilib' so GCC doesn't try to use them.  Look for
`/usr/lib64/libc.so.1' to see if you have the 64-bit libraries
installed.

   GCC must be configured with GNU `as'.  The latest version, from GNU
binutils 2.22, is known to work.  On the other hand, bootstrap fails
with GNU `ld' at least since GNU binutils 2.17.

   The `--enable-libgcj' option is disabled by default: IRIX 6 uses a
very low default limit (20480) for the command line length.  Although
`libtool' contains a workaround for this problem, at least the N64
`libgcj' is known not to build despite this, running into an internal
error of the native `ld'.  A sure fix is to increase this limit
(`ncargs') to its maximum of 262144 bytes.  If you have root access,
you can use the `systune' command to do this.

   `wchar_t' support in `libstdc++' is not available for old IRIX 6.5.x
releases, x < 19.  The problem cannot be autodetected and in order to
build GCC for such targets you need to configure with
`--disable-wchar_t'.

moxie-*-elf
===========

The moxie processor.  See `http://moxielogic.org/' for more information
about this processor.

powerpc-*-*
===========

You can specify a default version for the `-mcpu=CPU_TYPE' switch by
using the configure option `--with-cpu-CPU_TYPE'.

   You will need binutils 2.15 or newer for a working GCC.

powerpc-*-darwin*
=================

PowerPC running Darwin (Mac OS X kernel).

   Pre-installed versions of Mac OS X may not include any developer
tools, meaning that you will not be able to build GCC from source.  Tool
binaries are available at `http://opensource.apple.com/'.

   This version of GCC requires at least cctools-590.36.  The
cctools-590.36 package referenced from
`http://gcc.gnu.org/ml/gcc/2006-03/msg00507.html' will not work on
systems older than 10.3.9 (aka darwin7.9.0).

powerpc-*-elf
=============

PowerPC system in big endian mode, running System V.4.

powerpc*-*-linux-gnu*
=====================

PowerPC system in big endian mode running Linux.

powerpc-*-netbsd*
=================

PowerPC system in big endian mode running NetBSD.

powerpc-*-eabisim
=================

Embedded PowerPC system in big endian mode for use in running under the
PSIM simulator.

powerpc-*-eabi
==============

Embedded PowerPC system in big endian mode.

powerpcle-*-elf
===============

PowerPC system in little endian mode, running System V.4.

powerpcle-*-eabisim
===================

Embedded PowerPC system in little endian mode for use in running under
the PSIM simulator.

powerpcle-*-eabi
================

Embedded PowerPC system in little endian mode.

rl78-*-elf
==========

The Renesas RL78 processor.  This configuration is intended for
embedded systems.

rx-*-elf
========

The Renesas RX processor.  See
`http://eu.renesas.com/fmwk.jsp?cnt=rx600_series_landing.jsp&fp=/products/mpumcu/rx_family/rx600_series'
for more information about this processor.

s390-*-linux*
=============

S/390 system running GNU/Linux for S/390.

s390x-*-linux*
==============

zSeries system (64-bit) running GNU/Linux for zSeries.

s390x-ibm-tpf*
==============

zSeries system (64-bit) running TPF.  This platform is supported as
cross-compilation target only.

*-*-solaris2*
=============

Support for Solaris 8 has been obsoleted in GCC 4.7, but can still be
enabled by configuring with `--enable-obsolete'.  Support will be
removed in GCC 4.8.  Support for Solaris 7 has been removed in GCC 4.6.

   Sun does not ship a C compiler with Solaris 2 before Solaris 10,
though you can download the Sun Studio compilers for free.  In Solaris
10 and 11, GCC 3.4.3 is available as `/usr/sfw/bin/gcc'.  Solaris 11
also provides GCC 4.5.2 as `/usr/gcc/4.5/bin/gcc'.  Alternatively, you
can install a pre-built GCC to bootstrap and install GCC.  See the
binaries page for details.

   The Solaris 2 `/bin/sh' will often fail to configure `libstdc++-v3',
`boehm-gc' or `libjava'.  We therefore recommend using the following
initial sequence of commands

     % CONFIG_SHELL=/bin/ksh
     % export CONFIG_SHELL

and proceed as described in the configure instructions.  In addition we
strongly recommend specifying an absolute path to invoke
`SRCDIR/configure'.

   Solaris 2 comes with a number of optional OS packages.  Some of these
are needed to use GCC fully, namely `SUNWarc', `SUNWbtool', `SUNWesu',
`SUNWhea', `SUNWlibm', `SUNWsprot', and `SUNWtoo'.  If you did not
install all optional packages when installing Solaris 2, you will need
to verify that the packages that GCC needs are installed.

   To check whether an optional package is installed, use the `pkginfo'
command.  To add an optional package, use the `pkgadd' command.  For
further details, see the Solaris 2 documentation.

   Trying to use the linker and other tools in `/usr/ucb' to install
GCC has been observed to cause trouble.  For example, the linker may
hang indefinitely.  The fix is to remove `/usr/ucb' from your `PATH'.

   The build process works more smoothly with the legacy Sun tools so,
if you have `/usr/xpg4/bin' in your `PATH', we recommend that you place
`/usr/bin' before `/usr/xpg4/bin' for the duration of the build.

   We recommend the use of the Sun assembler or the GNU assembler, in
conjunction with the Sun linker.  The GNU `as' versions included in
Solaris 10, from GNU binutils 2.15, and Solaris 11, from GNU binutils
2.19, are known to work.  They can be found in `/usr/sfw/bin/gas'.
Current versions of GNU binutils (2.22) are known to work as well.
Note that your mileage may vary if you use a combination of the GNU
tools and the Sun tools: while the combination GNU `as' + Sun `ld'
should reasonably work, the reverse combination Sun `as' + GNU `ld' may
fail to build or cause memory corruption at runtime in some cases for
C++ programs.  GNU `ld' usually works as well, although the version
included in Solaris 10 cannot be used due to several bugs.  Again, the
current version (2.22) is known to work, but generally lacks platform
specific features, so better stay with Sun `ld'.  To use the LTO linker
plugin (`-fuse-linker-plugin') with GNU `ld', GNU binutils _must_ be
configured with `--enable-largefile'.

   To enable symbol versioning in `libstdc++' with Sun `ld', you need
to have any version of GNU `c++filt', which is part of GNU binutils.
`libstdc++' symbol versioning will be disabled if no appropriate
version is found.  Sun `c++filt' from the Sun Studio compilers does
_not_ work.

   Sun bug 4296832 turns up when compiling X11 headers with GCC 2.95 or
newer: `g++' will complain that types are missing.  These headers
assume that omitting the type means `int'; this assumption worked for
C90 but is wrong for C++, and is now wrong for C99 also.

   `g++' accepts such (invalid) constructs with the option
`-fpermissive'; it will assume that any missing type is `int' (as
defined by C90).

   There are patches for Solaris 8 (108652-24 or newer for SPARC,
108653-22 for Intel) that fix this bug.

   Sun bug 4927647 sometimes causes random spurious testsuite failures
related to missing diagnostic output.  This bug doesn't affect GCC
itself, rather it is a kernel bug triggered by the `expect' program
which is used only by the GCC testsuite driver.  When the bug causes
the `expect' program to miss anticipated output, extra testsuite
failures appear.

   There are patches for Solaris 8 (117350-12 or newer for SPARC,
117351-12 or newer for Intel) and Solaris 9 (117171-11 or newer for
SPARC, 117172-11 or newer for Intel) that address this problem.

   Solaris 8 provides an alternate implementation of the thread library
`libthread'.  It is required for TLS support and has been made the
default in Solaris 9, so it is always used on Solaris 8.

   Thread-local storage (TLS) is supported in Solaris 8 and 9, but
requires some patches.  The `libthread' patches provide the
`__tls_get_addr' (SPARC, 64-bit x86) resp. `___tls_get_addr' (32-bit
x86) functions.  On Solaris 8, you need 108993-26 or newer on SPARC,
108994-26 or newer on Intel.  On Solaris 9, the necessary support on
SPARC is present since FCS, while 114432-05 or newer is required on
Intel.  Additionally, on Solaris 8, patch 109147-14 or newer on SPARC or
109148-22 or newer on Intel are required for the Sun `ld' and runtime
linker (`ld.so.1') support.  Again, Solaris 9/SPARC works since FCS,
while 113986-02 is required on Intel.  The linker patches must be
installed even if GNU `ld' is used. Sun `as' in Solaris 8 and 9 doesn't
support the necessary relocations, so GNU `as' must be used.  The
`configure' script checks for those prerequisites and automatically
enables TLS support if they are met.  Although those minimal patch
versions should work, it is recommended to use the latest patch
versions which include additional bug fixes.

sparc*-*-*
==========

This section contains general configuration information for all
SPARC-based platforms.  In addition to reading this section, please
read all other sections that match your target.

   Newer versions of the GNU Multiple Precision Library (GMP), the MPFR
library and the MPC library are known to be miscompiled by earlier
versions of GCC on these platforms.  We therefore recommend the use of
the exact versions of these libraries listed as minimal versions in the
prerequisites.

sparc-sun-solaris2*
===================

When GCC is configured to use GNU binutils 2.14 or later, the binaries
produced are smaller than the ones produced using Sun's native tools;
this difference is quite significant for binaries containing debugging
information.

   Starting with Solaris 7, the operating system is capable of executing
64-bit SPARC V9 binaries.  GCC 3.1 and later properly supports this;
the `-m64' option enables 64-bit code generation.  However, if all you
want is code tuned for the UltraSPARC CPU, you should try the
`-mtune=ultrasparc' option instead, which produces code that, unlike
full 64-bit code, can still run on non-UltraSPARC machines.

   When configuring on a Solaris 7 or later system that is running a
kernel that supports only 32-bit binaries, one must configure with
`--disable-multilib', since we will not be able to build the 64-bit
target libraries.

   GCC 3.3 and GCC 3.4 trigger code generation bugs in earlier versions
of the GNU compiler (especially GCC 3.0.x versions), which lead to the
miscompilation of the stage1 compiler and the subsequent failure of the
bootstrap process.  A workaround is to use GCC 3.2.3 as an intermediary
stage, i.e. to bootstrap that compiler with the base compiler and then
use it to bootstrap the final compiler.

   GCC 3.4 triggers a code generation bug in versions 5.4 (Sun ONE
Studio 7) and 5.5 (Sun ONE Studio 8) of the Sun compiler, which causes
a bootstrap failure in form of a miscompilation of the stage1 compiler
by the Sun compiler.  This is Sun bug 4974440.  This is fixed with
patch 112760-07.

   GCC 3.4 changed the default debugging format from Stabs to DWARF-2
for 32-bit code on Solaris 7 and later.  If you use the Sun assembler,
this change apparently runs afoul of Sun bug 4910101 (which is
referenced as an x86-only problem by Sun, probably because they do not
use DWARF-2).  A symptom of the problem is that you cannot compile C++
programs like `groff' 1.19.1 without getting messages similar to the
following:

     ld: warning: relocation error: R_SPARC_UA32: ...
       external symbolic relocation against non-allocatable section
       .debug_info cannot be processed at runtime: relocation ignored.

To work around this problem, compile with `-gstabs+' instead of plain
`-g'.

   When configuring the GNU Multiple Precision Library (GMP), the MPFR
library or the MPC library on a Solaris 7 or later system, the canonical
target triplet must be specified as the `build' parameter on the
configure line.  This target triplet can be obtained by invoking
`./config.guess' in the toplevel source directory of GCC (and not that
of GMP or MPFR or MPC).  For example on a Solaris 9 system:

     % ./configure --build=sparc-sun-solaris2.9 --prefix=xxx

sparc-sun-solaris2.10
=====================

There is a bug in older versions of the Sun assembler which breaks
thread-local storage (TLS).  A typical error message is

     ld: fatal: relocation error: R_SPARC_TLS_LE_HIX22: file /var/tmp//ccamPA1v.o:
       symbol <unknown>: bad symbol type SECT: symbol type must be TLS

This bug is fixed in Sun patch 118683-03 or later.

sparc-*-linux*
==============

GCC versions 3.0 and higher require binutils 2.11.2 and glibc 2.2.4 or
newer on this platform.  All earlier binutils and glibc releases
mishandled unaligned relocations on `sparc-*-*' targets.

sparc64-*-solaris2*
===================

When configuring the GNU Multiple Precision Library (GMP), the MPFR
library or the MPC library, the canonical target triplet must be
specified as the `build' parameter on the configure line.  For example
on a Solaris 9 system:

     % ./configure --build=sparc64-sun-solaris2.9 --prefix=xxx

   The following compiler flags must be specified in the configure step
in order to bootstrap this target with the Sun compiler:

     % CC="cc -xarch=v9 -xildoff" SRCDIR/configure [OPTIONS] [TARGET]

`-xarch=v9' specifies the SPARC-V9 architecture to the Sun toolchain
and `-xildoff' turns off the incremental linker.

sparcv9-*-solaris2*
===================

This is a synonym for `sparc64-*-solaris2*'.

c6x-*-*
=======

The C6X family of processors. This port requires binutils-2.22 or newer.

tilegx-*-linux*
===============

The TILE-Gx processor running GNU/Linux.  This port requires
binutils-2.22 or newer.

tilepro-*-linux*
================

The TILEPro processor running GNU/Linux.  This port requires
binutils-2.22 or newer.

*-*-vxworks*
============

Support for VxWorks is in flux.  At present GCC supports _only_ the
very recent VxWorks 5.5 (aka Tornado 2.2) release, and only on PowerPC.
We welcome patches for other architectures supported by VxWorks 5.5.
Support for VxWorks AE would also be welcome; we believe this is merely
a matter of writing an appropriate "configlette" (see below).  We are
not interested in supporting older, a.out or COFF-based, versions of
VxWorks in GCC 3.

   VxWorks comes with an older version of GCC installed in
`$WIND_BASE/host'; we recommend you do not overwrite it.  Choose an
installation PREFIX entirely outside $WIND_BASE.  Before running
`configure', create the directories `PREFIX' and `PREFIX/bin'.  Link or
copy the appropriate assembler, linker, etc. into `PREFIX/bin', and set
your PATH to include that directory while running both `configure' and
`make'.

   You must give `configure' the `--with-headers=$WIND_BASE/target/h'
switch so that it can find the VxWorks system headers.  Since VxWorks
is a cross compilation target only, you must also specify
`--target=TARGET'.  `configure' will attempt to create the directory
`PREFIX/TARGET/sys-include' and copy files into it; make sure the user
running `configure' has sufficient privilege to do so.

   GCC's exception handling runtime requires a special "configlette"
module, `contrib/gthr_supp_vxw_5x.c'.  Follow the instructions in that
file to add the module to your kernel build.  (Future versions of
VxWorks will incorporate this module.)

x86_64-*-*, amd64-*-*
=====================

GCC supports the x86-64 architecture implemented by the AMD64 processor
(amd64-*-* is an alias for x86_64-*-*) on GNU/Linux, FreeBSD and NetBSD.
On GNU/Linux the default is a bi-arch compiler which is able to generate
both 64-bit x86-64 and 32-bit x86 code (via the `-m32' switch).

x86_64-*-solaris2.1[0-9]*
=========================

GCC also supports the x86-64 architecture implemented by the AMD64
processor (`amd64-*-*' is an alias for `x86_64-*-*') on Solaris 10 or
later.  Unlike other systems, without special options a bi-arch
compiler is built which generates 32-bit code by default, but can
generate 64-bit x86-64 code with the `-m64' switch.  Since GCC 4.7,
there is also configuration that defaults to 64-bit code, but can
generate 32-bit code with `-m32'.  To configure and build this way, you
have to provide all support libraries like `libgmp' as 64-bit code,
configure with `--target=x86_64-pc-solaris2.1x' and `CC=gcc -m64'.

xtensa*-*-elf
=============

This target is intended for embedded Xtensa systems using the `newlib'
C library.  It uses ELF but does not support shared objects.
Designed-defined instructions specified via the Tensilica Instruction
Extension (TIE) language are only supported through inline assembly.

   The Xtensa configuration information must be specified prior to
building GCC.  The `include/xtensa-config.h' header file contains the
configuration information.  If you created your own Xtensa
configuration with the Xtensa Processor Generator, the downloaded files
include a customized copy of this header file, which you can use to
replace the default header file.

xtensa*-*-linux*
================

This target is for Xtensa systems running GNU/Linux.  It supports ELF
shared objects and the GNU C library (glibc).  It also generates
position-independent code (PIC) regardless of whether the `-fpic' or
`-fPIC' options are used.  In other respects, this target is the same
as the `xtensa*-*-elf' target.

Microsoft Windows
=================

Intel 16-bit versions
---------------------

The 16-bit versions of Microsoft Windows, such as Windows 3.1, are not
supported.

   However, the 32-bit port has limited support for Microsoft Windows
3.11 in the Win32s environment, as a target only.  See below.

Intel 32-bit versions
---------------------

The 32-bit versions of Windows, including Windows 95, Windows NT,
Windows XP, and Windows Vista, are supported by several different target
platforms.  These targets differ in which Windows subsystem they target
and which C libraries are used.

   * Cygwin *-*-cygwin: Cygwin provides a user-space Linux API
     emulation layer in the Win32 subsystem.

   * Interix *-*-interix: The Interix subsystem provides native support
     for POSIX.

   * MinGW *-*-mingw32: MinGW is a native GCC port for the Win32
     subsystem that provides a subset of POSIX.

   * MKS i386-pc-mks: NuTCracker from MKS.  See
     `http://www.mkssoftware.com/' for more information.

Intel 64-bit versions
---------------------

GCC contains support for x86-64 using the mingw-w64 runtime library,
available from `http://mingw-w64.sourceforge.net/'.  This library
should be used with the target triple x86_64-pc-mingw32.

   Presently Windows for Itanium is not supported.

Windows CE
----------

Windows CE is supported as a target only on Hitachi SuperH
(sh-wince-pe), and MIPS (mips-wince-pe).

Other Windows Platforms
-----------------------

GCC no longer supports Windows NT on the Alpha or PowerPC.

   GCC no longer supports the Windows POSIX subsystem.  However, it does
support the Interix subsystem.  See above.

   Old target names including *-*-winnt and *-*-windowsnt are no longer
used.

   PW32 (i386-pc-pw32) support was never completed, and the project
seems to be inactive.  See `http://pw32.sourceforge.net/' for more
information.

   UWIN support has been removed due to a lack of maintenance.

*-*-cygwin
==========

Ports of GCC are included with the Cygwin environment.

   GCC will build under Cygwin without modification; it does not build
with Microsoft's C++ compiler and there are no plans to make it do so.

   The Cygwin native compiler can be configured to target any 32-bit x86
cpu architecture desired; the default is i686-pc-cygwin.  It should be
used with as up-to-date a version of binutils as possible; use either
the latest official GNU binutils release in the Cygwin distribution, or
version 2.20 or above if building your own.

*-*-interix
===========

The Interix target is used by OpenNT, Interix, Services For UNIX (SFU),
and Subsystem for UNIX-based Applications (SUA).  Applications compiled
with this target run in the Interix subsystem, which is separate from
the Win32 subsystem.  This target was last known to work in GCC 3.3.

*-*-mingw32
===========

GCC will build with and support only MinGW runtime 3.12 and later.
Earlier versions of headers are incompatible with the new default
semantics of `extern inline' in `-std=c99' and `-std=gnu99' modes.

Older systems
=============

GCC contains support files for many older (1980s and early 1990s) Unix
variants.  For the most part, support for these systems has not been
deliberately removed, but it has not been maintained for several years
and may suffer from bitrot.

   Starting with GCC 3.1, each release has a list of "obsoleted"
systems.  Support for these systems is still present in that release,
but `configure' will fail unless the `--enable-obsolete' option is
given.  Unless a maintainer steps forward, support for these systems
will be removed from the next release of GCC.

   Support for old systems as hosts for GCC can cause problems if the
workarounds for compiler, library and operating system bugs affect the
cleanliness or maintainability of the rest of GCC.  In some cases, to
bring GCC up on such a system, if still possible with current GCC, may
require first installing an old version of GCC which did work on that
system, and using it to compile a more recent GCC, to avoid bugs in the
vendor compiler.  Old releases of GCC 1 and GCC 2 are available in the
`old-releases' directory on the GCC mirror sites.  Header bugs may
generally be avoided using `fixincludes', but bugs or deficiencies in
libraries and the operating system may still cause problems.

   Support for older systems as targets for cross-compilation is less
problematic than support for them as hosts for GCC; if an enthusiast
wishes to make such a target work again (including resurrecting any of
the targets that never worked with GCC 2, starting from the last
version before they were removed), patches following the usual
requirements would be likely to be accepted, since they should not
affect the support for more modern targets.

   For some systems, old versions of GNU binutils may also be useful,
and are available from `pub/binutils/old-releases' on sourceware.org
mirror sites.

   Some of the information on specific systems above relates to such
older systems, but much of the information about GCC on such systems
(which may no longer be applicable to current GCC) is to be found in
the GCC texinfo manual.

all ELF targets (SVR4, Solaris 2, etc.)
=======================================

C++ support is significantly better on ELF targets if you use the GNU
linker; duplicate copies of inlines, vtables and template
instantiations will be discarded automatically.


File: gccinstall.info,  Node: Old,  Next: GNU Free Documentation License,  Prev: Specific,  Up: Top

10 Old installation documentation
*********************************

   Note most of this information is out of date and superseded by the
previous chapters of this manual.  It is provided for historical
reference only, because of a lack of volunteers to merge it into the
main manual.

* Menu:

* Configurations::    Configurations Supported by GCC.

   Here is the procedure for installing GCC on a GNU or Unix system.

  1. If you have chosen a configuration for GCC which requires other GNU
     tools (such as GAS or the GNU linker) instead of the standard
     system tools, install the required tools in the build directory
     under the names `as', `ld' or whatever is appropriate.

     Alternatively, you can do subsequent compilation using a value of
     the `PATH' environment variable such that the necessary GNU tools
     come before the standard system tools.

  2. Specify the host, build and target machine configurations.  You do
     this when you run the `configure' script.

     The "build" machine is the system which you are using, the "host"
     machine is the system where you want to run the resulting compiler
     (normally the build machine), and the "target" machine is the
     system for which you want the compiler to generate code.

     If you are building a compiler to produce code for the machine it
     runs on (a native compiler), you normally do not need to specify
     any operands to `configure'; it will try to guess the type of
     machine you are on and use that as the build, host and target
     machines.  So you don't need to specify a configuration when
     building a native compiler unless `configure' cannot figure out
     what your configuration is or guesses wrong.

     In those cases, specify the build machine's "configuration name"
     with the `--host' option; the host and target will default to be
     the same as the host machine.

     Here is an example:

          ./configure --host=sparc-sun-sunos4.1

     A configuration name may be canonical or it may be more or less
     abbreviated.

     A canonical configuration name has three parts, separated by
     dashes.  It looks like this: `CPU-COMPANY-SYSTEM'.  (The three
     parts may themselves contain dashes; `configure' can figure out
     which dashes serve which purpose.)  For example,
     `m68k-sun-sunos4.1' specifies a Sun 3.

     You can also replace parts of the configuration by nicknames or
     aliases.  For example, `sun3' stands for `m68k-sun', so
     `sun3-sunos4.1' is another way to specify a Sun 3.

     You can specify a version number after any of the system types,
     and some of the CPU types.  In most cases, the version is
     irrelevant, and will be ignored.  So you might as well specify the
     version if you know it.

     See *note Configurations::, for a list of supported configuration
     names and notes on many of the configurations.  You should check
     the notes in that section before proceeding any further with the
     installation of GCC.



File: gccinstall.info,  Node: Configurations,  Up: Old

10.1 Configurations Supported by GCC
====================================

   Here are the possible CPU types:

     1750a, a29k, alpha, arm, avr, cN, clipper, dsp16xx, elxsi, fr30,
     h8300, hppa1.0, hppa1.1, i370, i386, i486, i586, i686, i786, i860,
     i960, ip2k, m32r, m68000, m68k, m88k, mcore, mips, mipsel, mips64,
     mips64el, mn10200, mn10300, ns32k, pdp11, powerpc, powerpcle,
     romp, rs6000, sh, sparc, sparclite, sparc64, v850, vax, we32k.

   Here are the recognized company names.  As you can see, customary
abbreviations are used rather than the longer official names.

     acorn, alliant, altos, apollo, apple, att, bull, cbm, convergent,
     convex, crds, dec, dg, dolphin, elxsi, encore, harris, hitachi,
     hp, ibm, intergraph, isi, mips, motorola, ncr, next, ns, omron,
     plexus, sequent, sgi, sony, sun, tti, unicom, wrs.

   The company name is meaningful only to disambiguate when the rest of
the information supplied is insufficient.  You can omit it, writing
just `CPU-SYSTEM', if it is not needed.  For example, `vax-ultrix4.2'
is equivalent to `vax-dec-ultrix4.2'.

   Here is a list of system types:

     386bsd, aix, acis, amigaos, aos, aout, aux, bosx, bsd, clix, coff,
     ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms,
     genix, gnu, linux, linux-gnu, hiux, hpux, iris, irix, isc, luna,
     lynxos, mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf,
     osfrose, ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym,
     sysv, udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks,
     winnt, xenix.

You can omit the system type; then `configure' guesses the operating
system from the CPU and company.

   You can add a version number to the system type; this may or may not
make a difference.  For example, you can write `bsd4.3' or `bsd4.4' to
distinguish versions of BSD.  In practice, the version number is most
needed for `sysv3' and `sysv4', which are often treated differently.

   `linux-gnu' is the canonical name for the GNU/Linux target; however
GCC will also accept `linux'.  The version of the kernel in use is not
relevant on these systems.  A suffix such as `libc1' or `aout'
distinguishes major versions of the C library; all of the suffixed
versions are obsolete.

   If you specify an impossible combination such as `i860-dg-vms', then
you may get an error message from `configure', or it may ignore part of
the information and do the best it can with the rest.  `configure'
always prints the canonical name for the alternative that it used.  GCC
does not support all possible alternatives.

   Often a particular model of machine has a name.  Many machine names
are recognized as aliases for CPU/company combinations.  Thus, the
machine name `sun3', mentioned above, is an alias for `m68k-sun'.
Sometimes we accept a company name as a machine name, when the name is
popularly used for a particular machine.  Here is a table of the known
machine names:

     3300, 3b1, 3bN, 7300, altos3068, altos, apollo68, att-7300,
     balance, convex-cN, crds, decstation-3100, decstation, delta,
     encore, fx2800, gmicro, hp7NN, hp8NN, hp9k2NN, hp9k3NN, hp9k7NN,
     hp9k8NN, iris4d, iris, isi68, m3230, magnum, merlin, miniframe,
     mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc,
     powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3,
     sun4, symmetry, tower-32, tower.

Remember that a machine name specifies both the cpu type and the company
name.


File: gccinstall.info,  Node: GNU Free Documentation License,  Next: Concept Index,  Prev: Old,  Up: Top

GNU Free Documentation License
******************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it
     can be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You
     accept the license if you copy, modify or distribute the work in a
     way requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.  If a section does not fit the above definition of
     Secondary then it is not allowed to be designated as Invariant.
     The Document may contain zero Invariant Sections.  If the Document
     does not identify any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup, or absence of
     markup, has been arranged to thwart or discourage subsequent
     modification by readers is not Transparent.  An image format is
     not Transparent if used for any substantial amount of text.  A
     copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML, PostScript or PDF designed for
     human modification.  Examples of transparent image formats include
     PNG, XCF and JPG.  Opaque formats include proprietary formats that
     can be read and edited only by proprietary word processors, SGML or
     XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML, PostScript or PDF
     produced by some word processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a computer-network location from
     which the general network-using public has access to download
     using public-standard network protocols a complete Transparent
     copy of the Document, free of added material.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of
          previous versions (which should, if there were any, be listed
          in the History section of the Document).  You may use the
          same title as a previous version if the original publisher of
          that version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on
          the Title Page.  If there is no section Entitled "History" in
          the Document, create one stating the title, year, authors,
          and publisher of the Document as given on its Title Page,
          then add an item describing the Modified Version as stated in
          the previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in
          the "History" section.  You may omit a network location for a
          work that was published at least four years before the
          Document itself, or if the original publisher of the version
          it refers to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the
          section all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document,
          unaltered in their text and in their titles.  Section numbers
          or the equivalent are not considered part of the section
          titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, receipt of a copy of some or all of
     the same material does not give you any rights to use it.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     `http://www.gnu.org/copyleft/'.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.  If the Document specifies that a proxy
     can decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

 11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.


ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.3
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.


File: gccinstall.info,  Node: Concept Index,  Prev: GNU Free Documentation License,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* Binaries:                              Binaries.           (line    6)
* build_configargs:                      Configuration.      (line 1467)
* Configuration:                         Configuration.      (line    6)
* configurations supported by GCC:       Configurations.     (line    6)
* Downloading GCC:                       Downloading the source.
                                                             (line    6)
* Downloading the Source:                Downloading the source.
                                                             (line    6)
* FDL, GNU Free Documentation License:   GNU Free Documentation License.
                                                             (line    6)
* Host specific installation:            Specific.           (line    6)
* host_configargs:                       Configuration.      (line 1471)
* Installing GCC: Binaries:              Binaries.           (line    6)
* Installing GCC: Building:              Building.           (line    6)
* Installing GCC: Configuration:         Configuration.      (line    6)
* Installing GCC: Testing:               Testing.            (line    6)
* Prerequisites:                         Prerequisites.      (line    6)
* Specific:                              Specific.           (line    6)
* Specific installation notes:           Specific.           (line    6)
* Target specific installation:          Specific.           (line    6)
* Target specific installation notes:    Specific.           (line    6)
* target_configargs:                     Configuration.      (line 1475)
* Testing:                               Testing.            (line    6)
* Testsuite:                             Testing.            (line    6)



Tag Table:
Node: Top2045
Node: Installing GCC2603
Node: Prerequisites4118
Node: Downloading the source14342
Node: Configuration16279
Ref: with-gnu-as31285
Ref: with-as32183
Ref: with-gnu-ld33596
Node: Building81290
Node: Testing96775
Node: Final install104624
Node: Binaries109938
Node: Specific111539
Ref: alpha-x-x112045
Ref: alpha-dec-osf51112534
Ref: amd64-x-solaris210115070
Ref: arm-x-eabi115173
Ref: avr115391
Ref: bfin116031
Ref: cr16116273
Ref: cris116688
Ref: dos117504
Ref: epiphany-x-elf117827
Ref: x-x-freebsd117932
Ref: h8300-hms119769
Ref: hppa-hp-hpux120121
Ref: hppa-hp-hpux10122492
Ref: hppa-hp-hpux11122905
Ref: x-x-linux-gnu128564
Ref: ix86-x-linux128757
Ref: ix86-x-solaris289129070
Ref: ix86-x-solaris210129914
Ref: ia64-x-linux131105
Ref: ia64-x-hpux131875
Ref: x-ibm-aix132430
Ref: iq2000-x-elf139200
Ref: lm32-x-elf139340
Ref: lm32-x-uclinux139444
Ref: m32c-x-elf139572
Ref: m32r-x-elf139674
Ref: m68k-x-x139776
Ref: m68k-x-uclinux140814
Ref: mep-x-elf141060
Ref: microblaze-x-elf141170
Ref: mips-x-x141289
Ref: mips-sgi-irix5143685
Ref: mips-sgi-irix6143765
Ref: moxie-x-elf146989
Ref: powerpc-x-x147109
Ref: powerpc-x-darwin147314
Ref: powerpc-x-elf147808
Ref: powerpc-x-linux-gnu147893
Ref: powerpc-x-netbsd147988
Ref: powerpc-x-eabisim148076
Ref: powerpc-x-eabi148202
Ref: powerpcle-x-elf148278
Ref: powerpcle-x-eabisim148370
Ref: powerpcle-x-eabi148503
Ref: rl78-x-elf148586
Ref: rx-x-elf148692
Ref: s390-x-linux148891
Ref: s390x-x-linux148963
Ref: s390x-ibm-tpf149050
Ref: x-x-solaris2149181
Ref: sparc-x-x154748
Ref: sparc-sun-solaris2155250
Ref: sparc-sun-solaris210158004
Ref: sparc-x-linux158380
Ref: sparc64-x-solaris2158605
Ref: sparcv9-x-solaris2159258
Ref: c6x-x-x159345
Ref: tilegx-*-linux159436
Ref: tilepro-*-linux159555
Ref: x-x-vxworks159676
Ref: x86-64-x-x161198
Ref: x86-64-x-solaris210161526
Ref: xtensa-x-elf162188
Ref: xtensa-x-linux162859
Ref: windows163200
Ref: x-x-cygwin165137
Ref: x-x-interix165690
Ref: x-x-mingw32165999
Ref: older166225
Ref: elf168342
Node: Old168600
Node: Configurations171737
Node: GNU Free Documentation License175278
Node: Concept Index200425

End Tag Table
