This is Info file INSTALL, produced by Makeinfo version 1.68 from the
input file install1.texi.

   This file documents the installation of the GNU compiler.  Copyright
(C) 1988, 1989, 1992, 1994, 1995 Free Software Foundation, Inc.  You
may copy, distribute, and modify it freely as long as you preserve this
copyright notice and permission notice.


File: INSTALL,  Node: Installation,  Up: (dir)

Installing GNU CC
*****************

   Note most of this information is out of date and superceded by the
EGCS install procedures.  It is provided for historical reference only.

* Menu:

* Configurations::    Configurations Supported by GNU CC.
* Other Dir::     Compiling in a separate directory (not where the source is).
* Cross-Compiler::   Building and installing a cross-compiler.
* Sun Install::   See below for installation on the Sun.
* VMS Install::   See below for installation on VMS.
* Collect2::	  How `collect2' works; how it finds `ld'.
* Header Dirs::   Understanding the standard header file directories.

   Here is the procedure for installing GNU CC on a Unix system.  See
*Note VMS Install::, for VMS systems.  In this section we assume you
compile in the same directory that contains the source files; see *Note
Other Dir::, to find out how to compile in a separate directory on Unix
systems.

   You cannot install GNU C 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.

  1. If you have built GNU CC previously 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, it probably means that the directory is already suitably
     clean.

  2. On a System V release 4 system, make sure `/usr/bin' precedes
     `/usr/ucb' in `PATH'.  The `cc' command in `/usr/ucb' uses
     libraries which have bugs.

  3. Specify the host, build and target machine configurations.  You do
     this by running the file `configure'.

     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.  (If you are building a
     cross-compiler, see *Note Cross-Compiler::.)

     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 also
     use simply `sun3-sunos', since the version of SunOS is assumed by
     default to be version 4.

     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 GNU CC.

     There are four additional options you can specify independently to
     describe variant hardware and software configurations.  These are
     `--with-gnu-as', `--with-gnu-ld', `--with-stabs' and `--nfp'.

    `--with-gnu-as'
          If you will use GNU CC with the GNU assembler (GAS), you
          should declare this by using the `--with-gnu-as' option when
          you run `configure'.

          Using this option does not install GAS.  It only modifies the
          output of GNU CC to work with GAS.  Building and installing
          GAS is up to you.

          Conversely, if you *do not* wish to use GAS and do not specify
          `--with-gnu-as' when building GNU CC, it is up to you to make
          sure that GAS is not installed.  GNU CC searches for a
          program named `as' in various directories; if the program it
          finds is GAS, then it runs GAS.  If you are not sure where
          GNU CC finds the assembler it is using, try specifying `-v'
          when you run it.

          The systems where it makes a difference whether you use GAS
          are
          `hppa1.0-ANY-ANY', `hppa1.1-ANY-ANY', `i386-ANY-sysv',
          `i386-ANY-isc',
          `i860-ANY-bsd', `m68k-bull-sysv',
          `m68k-hp-hpux', `m68k-sony-bsd',
          `m68k-altos-sysv', `m68000-hp-hpux',
          `m68000-att-sysv', `ANY-lynx-lynxos', and `mips-ANY').  On
          any other system, `--with-gnu-as' has no effect.

          On the systems listed above (except for the HP-PA, for ISC on
          the 386, and for `mips-sgi-irix5.*'), if you use GAS, you
          should also use the GNU linker (and specify `--with-gnu-ld').

    `--with-gnu-ld'
          Specify the option `--with-gnu-ld' if you plan to use the GNU
          linker with GNU CC.

          This option does not cause the GNU linker to be installed; it
          just modifies the behavior of GNU CC to work with the GNU
          linker.

    `--with-stabs'
          On MIPS based systems and on Alphas, you must specify whether
          you want GNU CC 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, GNU CC uses the ECOFF debugging format by default;
          if you prefer BSD stabs, specify `--with-stabs' when you
          configure GNU CC.

          No matter which default you choose when you configure GNU CC,
          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.

    `--nfp'
          On certain systems, you must specify whether the machine has
          a floating point unit.  These systems include
          `m68k-sun-sunosN' and `m68k-isi-bsd'.  On any other system,
          `--nfp' currently has no effect, though perhaps there are
          other systems where it could usefully make a difference.

    `--enable-haifa'
    `--disable-haifa'
          Use `--enable-haifa' to enable use of an experimental
          instruction scheduler (from IBM Haifa).  This may or may not
          produce better code.  Some targets on which it is known to be
          a win enable it by default; use `--disable-haifa' to disable
          it in these cases.  `configure' will print out whether the
          Haifa scheduler is enabled when it is run.

    `--enable-threads=TYPE'
          Certain systems, notably Linux-based GNU systems, can't be
          relied on to supply a threads facility for the Objective C
          runtime and so will default to single-threaded runtime.  They
          may, however, have a library threads implementation
          available, in which case threads can be enabled with this
          option by supplying a suitable TYPE, probably `posix'.  The
          possibilities for TYPE are `single', `posix', `win32',
          `solaris', `irix' and `mach'.

    `--enable-checking'
          When you specify this option, the compiler is built to
          perform checking of tree node types when referencing fields
          of that node.  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 GNU C.

     The `configure' script searches subdirectories of the source
     directory for other compilers that are to be integrated into GNU
     CC.  The GNU compiler for C++, called G++ is in a subdirectory
     named `cp'.  `configure' inserts rules into `Makefile' to build
     all of those compilers.

     Here we spell out what files will be set up by `configure'.
     Normally you need not be concerned with these files.

        * A file named `config.h' is created that contains a `#include'
          of the top-level config file for the machine you will run the
          compiler on (*note The Configuration File:
          (gcc.info)Config.).  This file is responsible for defining
          information about the host machine.  It includes `tm.h'.

          The top-level config file is located in the subdirectory
          `config'.  Its name is always `xm-SOMETHING.h'; usually
          `xm-MACHINE.h', but there are some exceptions.

          If your system does not support symbolic links, you might
          want to set up `config.h' to contain a `#include' command
          which refers to the appropriate file.

        * A file named `tconfig.h' is created which includes the
          top-level config file for your target machine.  This is used
          for compiling certain programs to run on that machine.

        * A file named `tm.h' is created which includes the
          machine-description macro file for your target machine.  It
          should be in the subdirectory `config' and its name is often
          `MACHINE.h'.

        * The command file `configure' also constructs the file
          `Makefile' by adding some text to the template file
          `Makefile.in'.  The additional text comes from files in the
          `config' directory, named `t-TARGET' and `x-HOST'.  If these
          files do not exist, it means nothing needs to be added for a
          given target or host.

  4. The standard directory for installing GNU CC is `/usr/local/lib'.
     If you want to install its files somewhere else, specify
     `--prefix=DIR' when you run `configure'.  Here DIR is a directory
     name to use instead of `/usr/local' for all purposes with one
     exception: the directory `/usr/local/include' is searched for
     header files no matter where you install the compiler.  To override
     this name, use the `--with-local-prefix' option below.  The
     directory you specify need not exist, but its parent directory
     must exist.

  5. Specify `--with-local-prefix=DIR' if you want the compiler to
     search directory `DIR/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 GNU CC searches for local header
     files.  This may seem counterintuitive, but actually it is logical.

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

     *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 GNU CC.  Perhaps they make this assumption
     because installing GNU CC creates the directory.

  6. Make sure the Bison parser generator is installed.  (This is
     unnecessary if the Bison output files `c-parse.c' and `cexp.c' are
     more recent than `c-parse.y' and `cexp.y' and you do not plan to
     change the `.y' files.)

     Bison versions older than Sept 8, 1988 will produce incorrect
     output for `c-parse.c'.

  7. If you have chosen a configuration for GNU CC 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.  This will
     enable the compiler to find the proper tools for compilation of
     the program `enquire'.

     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.

  8. Build the compiler.  Just type `make LANGUAGES=c' in the compiler
     directory.

     `LANGUAGES=c' specifies that only the C compiler should be
     compiled.  The makefile normally builds compilers for all the
     supported languages; currently, C, C++ and Objective C.  However,
     C is the only language that is sure to work when you build with
     other non-GNU C compilers.  In addition, building anything but C
     at this stage is a waste of time.

     In general, you can specify the languages to build by typing the
     argument `LANGUAGES="LIST"', where LIST is one or more words from
     the list `c', `c++', and `objective-c'.  If you have any
     additional GNU compilers as subdirectories of the GNU CC source
     directory, you may also specify their names in this list.

     Ignore any warnings you may see about "statement not reached" in
     `insn-emit.c'; they are normal.  Also, warnings about "unknown
     escape sequence" are normal in `genopinit.c' and perhaps some
     other files.  Likewise, you should ignore warnings about "constant
     is so large that it is unsigned" in `insn-emit.c' and
     `insn-recog.c', a warning about a comparison always being zero in
     `enquire.o', and warnings about shift counts exceeding type widths
     in `cexp.y'.  Any other compilation errors may represent bugs in
     the port to your machine or operating system, and should be
     investigated and reported.

     Some commercial compilers fail to compile GNU CC because they have
     bugs or limitations.  For example, the Microsoft compiler is said
     to run out of macro space.  Some Ultrix compilers run out of
     expression space; then you need to break up the statement where
     the problem happens.

  9. If you are building a cross-compiler, stop here.  *Note
     Cross-Compiler::.

 10. Move the first-stage object files and executables into a
     subdirectory with this command:

          make stage1

     The files are moved into a subdirectory named `stage1'.  Once
     installation is complete, you may wish to delete these files with
     `rm -r stage1'.

 11. If you have chosen a configuration for GNU CC which requires other
     GNU tools (such as GAS or the GNU linker) instead of the standard
     system tools, install the required tools in the `stage1'
     subdirectory under the names `as', `ld' or whatever is
     appropriate.  This will enable the stage 1 compiler to find the
     proper tools in the following stage.

     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.

 12. Recompile the compiler with itself, with this command:

          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2"

     This is called making the stage 2 compiler.

     The command shown above builds compilers for all the supported
     languages.  If you don't want them all, you can specify the
     languages to build by typing the argument `LANGUAGES="LIST"'.  LIST
     should contain one or more words from the list `c', `c++',
     `objective-c', and `proto'.  Separate the words with spaces.
     `proto' stands for the programs `protoize' and `unprotoize'; they
     are not a separate language, but you use `LANGUAGES' to enable or
     disable their installation.

     If you are going to build the stage 3 compiler, then you might
     want to build only the C language in stage 2.

     Once you have built the stage 2 compiler, if you are short of disk
     space, you can delete the subdirectory `stage1'.

     On a 68000 or 68020 system lacking floating point hardware, unless
     you have selected a `tm.h' file that expects by default that there
     is no such hardware, do this instead:

          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float"

 13. If you wish to test the compiler by compiling it with itself one
     more time, install any other necessary GNU tools (such as GAS or
     the GNU linker) in the `stage2' subdirectory as you did in the
     `stage1' subdirectory, then do this:

          make stage2
          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2"

     This is called making the stage 3 compiler.  Aside from the `-B'
     option, the compiler options should be the same as when you made
     the stage 2 compiler.  But the `LANGUAGES' option need not be the
     same.  The command shown above builds compilers for all the
     supported languages; if you don't want them all, you can specify
     the languages to build by typing the argument `LANGUAGES="LIST"',
     as described above.

     If you do not have to install any additional GNU tools, you may
     use the command

          make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST

     instead of making `stage1', `stage2', and performing the two
     compiler builds.

 14. Then compare the latest object files with the stage 2 object
     files--they ought to be identical, aside from time stamps (if any).

     On some systems, meaningful comparison of object files is
     impossible; they always appear "different."  This is currently
     true on Solaris and some systems that use ELF object file format.
     On some versions of Irix on SGI machines and DEC Unix (OSF/1) on
     Alpha systems, you will not be able to compare the files without
     specifying `-save-temps'; see the description of individual
     systems above to see if you get comparison failures.  You may have
     similar problems on other systems.

     Use this command to compare the files:

          make compare

     This will mention any object files that differ between stage 2 and
     stage 3.  Any difference, no matter how innocuous, indicates that
     the stage 2 compiler has compiled GNU CC incorrectly, and is
     therefore a potentially serious bug which you should investigate
     and report.

     If your system does not put time stamps in the object files, then
     this is a faster way to compare them (using the Bourne shell):

          for file in *.o; do
          cmp $file stage2/$file
          done

     If you have built the compiler with the `-mno-mips-tfile' option on
     MIPS machines, you will not be able to compare the files.

 15. Install the compiler driver, the compiler's passes and run-time
     support with `make install'.  Use the same value for `CC',
     `CFLAGS' and `LANGUAGES' that you used when compiling the files
     that are being installed.  One reason this is necessary is that
     some versions of Make have bugs and recompile files gratuitously
     when you do this step.  If you use the same variable values, those
     files will be recompiled properly.

     For example, if you have built the stage 2 compiler, you can use
     the following command:

          make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="LIST"

     This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
     `cpp' and `libgcc.a' in the directory
     `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the
     compiler driver program looks for them.  Here TARGET is the
     canonicalized form of target machine type specified when you ran
     `configure', and VERSION is the version number of GNU CC.  This
     naming scheme permits various versions and/or cross-compilers to
     coexist.  It also copies the executables for compilers for other
     languages (e.g., `cc1plus' for C++) to the same directory.

     This also copies the driver program `xgcc' into
     `/usr/local/bin/gcc', so that it appears in typical execution
     search paths.  It also copies `gcc.1' into `/usr/local/man/man1'
     and info pages into `/usr/local/info'.

     On some systems, this command causes recompilation of some files.
     This is usually due to bugs in `make'.  You should either ignore
     this problem, or use GNU Make.

     *Warning: there is a bug in `alloca' in the Sun library.  To avoid
     this bug, be sure to install the executables of GNU CC that were
     compiled by GNU CC.  (That is, the executables from stage 2 or 3,
     not stage 1.)  They use `alloca' as a built-in function and never
     the one in the library.*

     (It is usually better to install GNU CC executables from stage 2
     or 3, since they usually run faster than the ones compiled with
     some other compiler.)

 16. If you're going to use C++, it's likely that you need to also
     install a C++ runtime library.  Just as GNU C does not distribute
     a C runtime library, it also does not include a C++ runtime
     library.  All I/O functionality, special class libraries, etc., are
     provided by the C++ runtime library.

     The standard C++ runtime library for GNU CC is called `libstdc++'.
     An obsolescent library `libg++' may also be available, but it's
     necessary only for older software that hasn't been converted yet;
     if you don't know whether you need `libg++' then you probably don't
     need it.

     Here's one way to build and install `libstdc++' for GNU CC:

        * Build and install GNU CC, so that invoking `gcc' obtains the
          GNU CC that was just built.

        * Obtain a copy of a compatible `libstdc++' distribution.  For
          example, the `libstdc++-2.8.0.tar.gz' distribution should be
          compatible with GCC 2.8.0.  GCC distributors normally
          distribute `libstdc++' as well.

        * Set the `CXX' environment variable to `gcc' while running the
          `libstdc++' distribution's `configure' command.  Use the same
          `configure' options that you used when you invoked GCC's
          `configure' command.

        * Invoke `make' to build the C++ runtime.

        * Invoke `make install' to install the C++ runtime.

     To summarize, after building and installing GNU CC, invoke the
     following shell commands in the topmost directory of the C++
     library distribution.  For CONFIGURE-OPTIONS, use the same options
     that you used to configure GNU CC.

          $ CXX=gcc ./configure CONFIGURE-OPTIONS
          $ make
          $ make install

 17. GNU CC includes a runtime library for Objective-C because it is an
     integral part of the language.  You can find the files associated
     with the library in the subdirectory `objc'.  The GNU Objective-C
     Runtime Library requires header files for the target's C library in
     order to be compiled,and also requires the header files for the
     target's thread library if you want thread support.  *Note
     Cross-Compilers and Header Files: Cross Headers, for discussion
     about header files issues for cross-compilation.

     When you run `configure', it picks the appropriate Objective-C
     thread implementation file for the target platform.  In some
     situations, you may wish to choose a different back-end as some
     platforms support multiple thread implementations or you may wish
     to disable thread support completely.  You do this by specifying a
     value for the OBJC_THREAD_FILE makefile variable on the command
     line when you run make, for example:

          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single

     Below is a list of the currently available back-ends.

        * thr-single Disable thread support, should work for all
          platforms.

        * thr-decosf1 DEC OSF/1 thread support.

        * thr-irix SGI IRIX thread support.

        * thr-mach Generic MACH thread support, known to work on
          NEXTSTEP.

        * thr-os2 IBM OS/2 thread support.

        * thr-posix Generix POSIX thread support.

        * thr-pthreads PCThreads on Linux-based GNU systems.

        * thr-solaris SUN Solaris thread support.

        * thr-win32 Microsoft Win32 API thread support.


File: INSTALL,  Node: Configurations,  Next: Other Dir,  Up: Installation

Configurations Supported by GNU CC
==================================

   Here are the possible CPU types:

     1750a, a29k, alpha, arm, cN, clipper, dsp16xx, elxsi, h8300,
     hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m32r,
     m68000, m68k, m88k, mips, mipsel, mips64, mips64el, ns32k,
     powerpc, powerpcle, pyramid, romp, rs6000, sh, sparc, sparclite,
     sparc64, 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-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.

   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.  GNU
CC 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.  If you want to install your own homemade configuration files,
you can use `local' as the company name to access them.  If you use
configuration `CPU-local', the configuration name without the cpu prefix
is used to form the configuration file names.

   Thus, if you specify `m68k-local', configuration uses files
`m68k.md', `local.h', `m68k.c', `xm-local.h', `t-local', and `x-local',
all in the directory `config/m68k'.

   Here is a list of configurations that have special treatment or
special things you must know:

`1750a-*-*'
     MIL-STD-1750A processors.

     The MIL-STD-1750A cross configuration produces output for
     `as1750', an assembler/linker available under the GNU Public
     License for the 1750A. `as1750' can be obtained at
     *ftp://ftp.fta-berlin.de/pub/crossgcc/1750gals/*.  A similarly
     licensed simulator for the 1750A is available from same address.

     You should ignore a fatal error during the building of libgcc
     (libgcc is not yet implemented for the 1750A.)

     The `as1750' assembler requires the file `ms1750.inc', which is
     found in the directory `config/1750a'.

     GNU CC produced the same sections as the Fairchild F9450 C
     Compiler, namely:

    `Normal'
          The program code section.

    `Static'
          The read/write (RAM) data section.

    `Konst'
          The read-only (ROM) constants section.

    `Init'
          Initialization section (code to copy KREL to SREL).

     The smallest addressable unit is 16 bits (BITS_PER_UNIT is 16).
     This means that type `char' is represented with a 16-bit word per
     character.  The 1750A's "Load/Store Upper/Lower Byte" instructions
     are not used by GNU CC.

`alpha-*-osf1'
     Systems using processors that implement the DEC Alpha architecture
     and are running the DEC Unix (OSF/1) operating system, for example
     the DEC Alpha AXP systems.CC.)

     GNU CC 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 DEC Unix, you should rebuild GCC to pick
     up the new version stamp.

     Note that since the Alpha is a 64-bit architecture,
     cross-compilers from 32-bit machines will not generate code as
     efficient as that generated when the compiler is running on a
     64-bit machine because many optimizations that depend on being
     able to represent a word on the target in an integral value on the
     host cannot be performed.  Building cross-compilers on the Alpha
     for 32-bit machines has only been tested in a few cases and may
     not work properly.

     `make compare' may fail on old versions of DEC Unix unless you add
     `-save-temps' to `CFLAGS'.  On these systems, the name of the
     assembler input file is stored in the object file, and that makes
     comparison fail if it differs between the `stage1' and `stage2'
     compilations.  The option `-save-temps' forces a fixed name to be
     used for the assembler input file, instead of a randomly chosen
     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
     fail without that option.  If you add `-save-temps', you will have
     to manually delete the `.i' and `.s' files after each series of
     compilations.

     GNU CC 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, GNU CC 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.

`arc-*-elf'
     Argonaut ARC processor.  This configuration is intended for
     embedded systems.

`arm-*-aout'
     Advanced RISC Machines ARM-family processors.  These are often
     used in embedded applications.  There are no standard Unix
     configurations.  This configuration corresponds to the basic
     instruction sequences and will produce `a.out' format object
     modules.

     You may need to make a variant of the file `arm.h' for your
     particular configuration.

`arm-*-linuxaout'
     Any of the ARM family processors running the Linux-based GNU
     system with the `a.out' binary format (ELF is not yet supported).
     You must use version 2.8.1.0.7 or later of the GNU/Linux binutils,
     which you can download from `sunsite.unc.edu:/pub/Linux/GCC' and
     other mirror sites for Linux-based GNU systems.

`arm-*-riscix'
     The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD
     Unix.  If you are running a version of RISC iX prior to 1.2 then
     you must specify the version number during configuration.  Note
     that the assembler shipped with RISC iX does not support stabs
     debugging information; a new version of the assembler, with stabs
     support included, is now available from Acorn and via ftp
     `ftp.acorn.com:/pub/riscix/as+xterm.tar.Z'.  To enable stabs
     debugging, pass `--with-gnu-as' to configure.

     You will need to install GNU `sed' before you can run configure.

`a29k'
     AMD Am29k-family processors.  These are normally used in embedded
     applications.  There are no standard Unix configurations.  This
     configuration corresponds to AMD's standard calling sequence and
     binary interface and is compatible with other 29k tools.

     You may need to make a variant of the file `a29k.h' for your
     particular configuration.

`a29k-*-bsd'
     AMD Am29050 used in a system running a variant of BSD Unix.

`decstation-*'
     MIPS-based DECstations can support three different personalities:
     Ultrix, DEC OSF/1, and OSF/rose.  (Alpha-based DECstation products
     have a configuration name beginning with `alpha-dec'.)  To
     configure GCC for these platforms use the following configurations:

    `decstation-ultrix'
          Ultrix configuration.

    `decstation-osf1'
          Dec's version of OSF/1.

    `decstation-osfrose'
          Open Software Foundation reference port of OSF/1 which uses
          the OSF/rose object file format instead of ECOFF.  Normally,
          you would not select this configuration.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

`elxsi-elxsi-bsd'
     The Elxsi's C compiler has known limitations that prevent it from
     compiling GNU C.  Please contact `mrs@cygnus.com' for more details.

`dsp16xx'
     A port to the AT&T DSP1610 family of processors.

`h8300-*-*'
     Hitachi H8/300 series of processors.

     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*-*-*'
     There are several variants of the HP-PA processor which run a
     variety of operating systems.  GNU CC must be configured to use
     the correct processor type and operating system, or GNU CC will
     not function correctly.  The easiest way to handle this problem is
     to *not* specify a target when configuring GNU CC, the `configure'
     script will try to automatically determine the right processor
     type and operating system.

     `-g' does not work on HP-UX, since that system uses a peculiar
     debugging format which GNU CC does not know about.  However, `-g'
     will work if you also use GAS and GDB in conjunction with GCC.  We
     highly recommend using GAS for all HP-PA configurations.

     You should be using GAS-2.6 (or later) along with GDB-4.16 (or
     later).  These can be retrieved from all the traditional GNU ftp
     archive sites.

     On some versions of HP-UX, you will need to install GNU `sed'.

     You will need to be install GAS into a directory before `/bin',
     `/usr/bin', and `/usr/ccs/bin' in your search path.  You should
     install GAS before you build GNU CC.

     To enable debugging, you must configure GNU CC with the
     `--with-gnu-as' option before building.

`i370-*-*'
     This port is very preliminary and has many known bugs.  We hope to
     have a higher-quality port for this machine soon.

`i386-*-linux-gnuoldld'
     Use this configuration to generate `a.out' binaries on Linux-based
     GNU systems if you do not have gas/binutils version 2.5.2 or later
     installed. This is an obsolete configuration.

`i386-*-linux-gnuaout'
     Use this configuration to generate `a.out' binaries on Linux-based
     GNU systems. This configuration is being superseded. You must use
     gas/binutils version 2.5.2 or later.

`i386-*-linux-gnu'
     Use this configuration to generate ELF binaries on Linux-based GNU
     systems.  You must use gas/binutils version 2.5.2 or later.

`i386-*-sco'
     Compilation with RCC is recommended.  Also, it may be a good idea
     to link with GNU malloc instead of the malloc that comes with the
     system.

`i386-*-sco3.2v4'
     Use this configuration for SCO release 3.2 version 4.

`i386-*-sco3.2v5*'
     Use this for the SCO OpenServer Release family including 5.0.0,
     5.0.2, 5.0.4, 5.0.5, Internet FastStart 1.0, and Internet
     FastStart 1.1.

     GNU CC can generate COFF binaries if you specify `-mcoff' or ELF
     binaries, the default.    A full `make bootstrap' is recommended
     so that an ELF compiler that builds ELF is generated.

     You must have TLS597 from `ftp://ftp.sco.com/TLS' installed for ELF
     C++ binaries to work correctly on releases before 5.0.4.

     The native SCO assembler that is provided with the OS at no charge
     is normally required.  If, however, you must be able to use the GNU
     assembler (perhaps you have complex asms) you must configure this
     package `--with-gnu-as'.  To do this, install (cp or symlink)
     gcc/as to your copy of the GNU assembler.  You must use a recent
     version of GNU binutils; version 2.9.1 seems to work well.  If you
     select this option, you will be unable to build COFF images.
     Trying to do so will result in non-obvious failures.  In general,
     the "-with-gnu-as" option isn't as well tested as the native
     assembler.

     *NOTE:* If you are building C++, you must follow the instructions
     about invoking `make bootstrap' because the native OpenServer
     compiler may build a `cc1plus' that will not correctly parse many
     valid C++ programs.  You must do a `make bootstrap' if you are
     building with the native compiler.

`i386-*-isc'
     It may be a good idea to link with GNU malloc instead of the
     malloc that comes with the system.

     In ISC version 4.1, `sed' core dumps when building `deduced.h'.
     Use the version of `sed' from version 4.0.

`i386-*-esix'
     It may be good idea to link with GNU malloc instead of the malloc
     that comes with the system.

`i386-ibm-aix'
     You need to use GAS version 2.1 or later, and LD from GNU binutils
     version 2.2 or later.

`i386-sequent-bsd'
     Go to the Berkeley universe before compiling.

`i386-sequent-ptx1*'
`i386-sequent-ptx2*'
     You must install GNU `sed' before running `configure'.

`i386-sun-sunos4'
     You may find that you need another version of GNU CC to begin
     bootstrapping with, since the current version when built with the
     system's own compiler seems to get an infinite loop compiling part
     of `libgcc2.c'.  GNU CC version 2 compiled with GNU CC (any
     version) seems not to have this problem.

     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`i[345]86-*-winnt3.5'
     This version requires a GAS that has not yet been released.  Until
     it is, you can get a prebuilt binary version via anonymous ftp from
     `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must
     also use the Microsoft header files from the Windows NT 3.5 SDK.
     Find these on the CDROM in the `/mstools/h' directory dated
     9/4/94.  You must use a fixed version of Microsoft linker made
     especially for NT 3.5, which is also is available on the NT 3.5
     SDK CDROM.  If you do not have this linker, can you also use the
     linker from Visual C/C++ 1.0 or 2.0.

     Installing GNU CC for NT builds a wrapper linker, called `ld.exe',
     which mimics the behaviour of Unix `ld' in the specification of
     libraries (`-L' and `-l').  `ld.exe' looks for both Unix and
     Microsoft named libraries.  For example, if you specify `-lfoo',
     `ld.exe' will look first for `libfoo.a' and then for `foo.lib'.

     You may install GNU CC for Windows NT in one of two ways,
     depending on whether or not you have a Unix-like shell and various
     Unix-like utilities.

       1. If you do not have a Unix-like shell and few Unix-like
          utilities, you will use a DOS style batch script called
          `configure.bat'.  Invoke it as `configure winnt' from an
          MSDOS console window or from the program manager dialog box.
          `configure.bat' assumes you have already installed and have
          in your path a Unix-like `sed' program which is used to
          create a working `Makefile' from `Makefile.in'.

          `Makefile' uses the Microsoft Nmake program maintenance
          utility and the Visual C/C++ V8.00 compiler to build GNU CC.
          You need only have the utilities `sed' and `touch' to use
          this installation method, which only automatically builds the
          compiler itself.  You must then examine what `fixinc.winnt'
          does, edit the header files by hand and build `libgcc.a'
          manually.

       2. The second type of installation assumes you are running a
          Unix-like shell, have a complete suite of Unix-like utilities
          in your path, and have a previous version of GNU CC already
          installed, either through building it via the above
          installation method or acquiring a pre-built binary.  In this
          case, use the `configure' script in the normal fashion.

`i860-intel-osf1'
     This is the Paragon.  If you have version 1.0 of the operating
     system, you need to take special steps to build GNU CC due to
     peculiarities of the system.  Newer system versions have no
     problem.  See the section `Installation Problems' in the GNU CC
     Manual.

`*-lynx-lynxos'
     LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as
     `/bin/gcc'.  You should compile with this instead of `/bin/cc'.
     You can tell GNU CC to use the GNU assembler and linker, by
     specifying `--with-gnu-as --with-gnu-ld' when configuring.  These
     will produce COFF format object files and executables;  otherwise
     GNU CC will use the installed tools, which produce `a.out' format
     executables.

`m32r-*-elf'
     Mitsubishi M32R processor.  This configuration is intended for
     embedded systems.

`m68000-hp-bsd'
     HP 9000 series 200 running BSD.  Note that the C compiler that
     comes with this system cannot compile GNU CC; contact
     `law@cygnus.com' to get binaries of GNU CC for bootstrapping.

`m68k-altos'
     Altos 3068.  You must use the GNU assembler, linker and debugger.
     Also, you must fix a kernel bug.  Details in the file
     `README.ALTOS'.

`m68k-apple-aux'
     Apple Macintosh running A/UX.  You may configure GCC  to use
     either the system assembler and linker or the GNU assembler and
     linker.  You should use the GNU configuration if you can,
     especially if you also want to use GNU C++.  You enabled that
     configuration with + the `--with-gnu-as' and `--with-gnu-ld'
     options to `configure'.

     Note the C compiler that comes with this system cannot compile GNU
     CC.  You can find binaries of GNU CC for bootstrapping on
     `jagubox.gsfc.nasa.gov'.  You will also a patched version of
     `/bin/ld' there that raises some of the arbitrary limits found in
     the original.

`m68k-att-sysv'
     AT&T 3b1, a.k.a. 7300 PC.  Special procedures are needed to
     compile GNU CC with this machine's standard C compiler, due to
     bugs in that compiler.  You can bootstrap it more easily with
     previous versions of GNU CC if you have them.

     Installing GNU CC on the 3b1 is difficult if you do not already
     have GNU CC running, due to bugs in the installed C compiler.
     However, the following procedure might work.  We are unable to
     test it.

       1. Comment out the `#include "config.h"' line near the start of
          `cccp.c' and do `make cpp'.  This makes a preliminary version
          of GNU cpp.

       2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to
          that file name.

       3. Undo your change in `cccp.c', or reinstall the original
          version, and do `make cpp' again.

       4. Copy this final version of GNU cpp into `/lib/cpp'.

       5. Replace every occurrence of `obstack_free' in the file
          `tree.c' with `_obstack_free'.

       6. Run `make' to get the first-stage GNU CC.

       7. Reinstall the original version of `/lib/cpp'.

       8. Now you can compile GNU CC with itself and install it in the
          normal fashion.

`m68k-bull-sysv'
     Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GNU
     CC works either with native assembler or GNU assembler. You can use
     GNU assembler with native coff generation by providing
     `--with-gnu-as' to the configure script or use GNU assembler with
     dbx-in-coff encapsulation by providing `--with-gnu-as --stabs'.
     For any problem with native assembler or for availability of the
     DPX/2 port of GAS, contact `F.Pierresteguy@frcl.bull.fr'.

`m68k-crds-unox'
     Use `configure unos' for building on Unos.

     The Unos assembler is named `casm' instead of `as'.  For some
     strange reason linking `/bin/as' to `/bin/casm' changes the
     behavior, and does not work.  So, when installing GNU CC, you
     should install the following script as `as' in the subdirectory
     where the passes of GCC are installed:

          #!/bin/sh
          casm $*

     The default Unos library is named `libunos.a' instead of `libc.a'.
     To allow GNU CC to function, either change all references to
     `-lc' in `gcc.c' to `-lunos' or link `/lib/libc.a' to
     `/lib/libunos.a'.

     When compiling GNU CC with the standard compiler, to overcome bugs
     in the support of `alloca', do not use `-O' when making stage 2.
     Then use the stage 2 compiler with `-O' to make the stage 3
     compiler.  This compiler will have the same characteristics as the
     usual stage 2 compiler on other systems.  Use it to make a stage 4
     compiler and compare that with stage 3 to verify proper
     compilation.

     (Perhaps simply defining `ALLOCA' in `x-crds' as described in the
     comments there will make the above paragraph superfluous.  Please
     inform us of whether this works.)

     Unos uses memory segmentation instead of demand paging, so you
     will need a lot of memory.  5 Mb is barely enough if no other
     tasks are running.  If linking `cc1' fails, try putting the object
     files into a library and linking from that library.

`m68k-hp-hpux'
     HP 9000 series 300 or 400 running HP-UX.  HP-UX version 8.0 has a
     bug in the assembler that prevents compilation of GNU CC.  To fix
     it, get patch PHCO_4484 from HP.

     In addition, if you wish to use gas `--with-gnu-as' you must use
     gas version 2.1 or later, and you must use the GNU linker version
     2.1 or later.  Earlier versions of gas relied upon a program which
     converted the gas output into the native HP-UX format, but that
     program has not been kept up to date.  gdb does not understand
     that native HP-UX format, so you must use gas if you wish to use
     gdb.

`m68k-sun'
     Sun 3.  We do not provide a configuration file to use the Sun FPA
     by default, because programs that establish signal handlers for
     floating point traps inherently cannot work with the FPA.

     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`m88k-*-svr3'
     Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port.
     These systems tend to use the Green Hills C, revision 1.8.5, as the
     standard C compiler.  There are apparently bugs in this compiler
     that result in object files differences between stage 2 and stage
     3.  If this happens, make the stage 4 compiler and compare it to
     the stage 3 compiler.  If the stage 3 and stage 4 object files are
     identical, this suggests you encountered a problem with the
     standard C compiler; the stage 3 and 4 compilers may be usable.

     It is best, however, to use an older version of GNU CC for
     bootstrapping if you have one.

`m88k-*-dgux'
     Motorola m88k running DG/UX.  To build 88open BCS native or cross
     compilers on DG/UX, specify the configuration name as
     `m88k-*-dguxbcs' and build in the 88open BCS software development
     environment.  To build ELF native or cross compilers on DG/UX,
     specify `m88k-*-dgux' and build in the DG/UX ELF development
     environment.  You set the software development environment by
     issuing `sde-target' command and specifying either `m88kbcs' or
     `m88kdguxelf' as the operand.

     If you do not specify a configuration name, `configure' guesses the
     configuration based on the current software development
     environment.

`m88k-tektronix-sysv3'
     Tektronix XD88 running UTekV 3.2e.  Do not turn on optimization
     while building stage1 if you bootstrap with the buggy Green Hills
     compiler.  Also, The bundled LAI System V NFS is buggy so if you
     build in an NFS mounted directory, start from a fresh reboot, or
     avoid NFS all together.  Otherwise you may have trouble getting
     clean comparisons between stages.

`mips-mips-bsd'
     MIPS machines running the MIPS operating system in BSD mode.  It's
     possible that some old versions of the system lack the functions
     `memcpy', `memcmp', and `memset'.  If your system lacks these, you
     must remove or undo the definition of `TARGET_MEM_FUNCTIONS' in
     `mips-bsd.h'.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

`mips-mips-riscos*'
     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

     MIPS computers running RISC-OS can support four different
     personalities: default, BSD 4.3, System V.3, and System V.4 (older
     versions of RISC-OS don't support V.4).  To configure GCC for
     these platforms use the following configurations:

    `mips-mips-riscos`rev''
          Default configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'bsd'
          BSD 4.3 configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'sysv4'
          System V.4 configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'sysv'
          System V.3 configuration for RISC-OS, revision `rev'.

     The revision `rev' mentioned above is the revision of RISC-OS to
     use.  You must reconfigure GCC when going from a RISC-OS revision
     4 to RISC-OS revision 5.  This has the effect of avoiding a linker
     bug.

`mips-sgi-*'
     In order to compile GCC on an SGI running IRIX 4, the "c.hdr.lib"
     option must be installed from the CD-ROM supplied from Silicon
     Graphics.  This is found on the 2nd CD in release 4.0.1.

     In order to compile GCC on an SGI running IRIX 5, the
     "compiler_dev.hdr" subsystem must be installed from the IDO CD-ROM
     supplied by Silicon Graphics.

     `make compare' may fail on version 5 of IRIX unless you add
     `-save-temps' to `CFLAGS'.  On these systems, the name of the
     assembler input file is stored in the object file, and that makes
     comparison fail if it differs between the `stage1' and `stage2'
     compilations.  The option `-save-temps' forces a fixed name to be
     used for the assembler input file, instead of a randomly chosen
     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
     fail without that option.  If you do you `-save-temps', you will
     have to manually delete the `.i' and `.s' files after each series
     of compilations.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

     On Irix version 4.0.5F, and perhaps on some other versions as well,
     there is an assembler bug that reorders instructions incorrectly.
     To work around it, specify the target configuration
     `mips-sgi-irix4loser'.  This configuration inhibits assembler
     optimization.

     In a compiler configured with target `mips-sgi-irix4', you can turn
     off assembler optimization by using the `-noasmopt' option.  This
     compiler option passes the option `-O0' to the assembler, to
     inhibit reordering.

     The `-noasmopt' option can be useful for testing whether a problem
     is due to erroneous assembler reordering.  Even if a problem does
     not go away with `-noasmopt', it may still be due to assembler
     reordering--perhaps GNU CC itself was miscompiled as a result.

     To enable debugging under Irix 5, you must use GNU as 2.5 or later,
     and use the `--with-gnu-as' configure option when configuring gcc.
     GNU as is distributed as part of the binutils package.

`mips-sony-sysv'
     Sony MIPS NEWS.  This works in NEWSOS 5.0.1, but not in 5.0.2
     (which uses ELF instead of COFF).  Support for 5.0.2 will probably
     be provided soon by volunteers.  In particular, the linker does
     not like the code generated by GCC when shared libraries are
     linked in.

`ns32k-encore'
     Encore ns32000 system.  Encore systems are supported only under
     BSD.

`ns32k-*-genix'
     National Semiconductor ns32000 system.  Genix has bugs in `alloca'
     and `malloc'; you must get the compiled versions of these from GNU
     Emacs.

`ns32k-sequent'
     Go to the Berkeley universe before compiling.

`ns32k-utek'
     UTEK ns32000 system ("merlin").  The C compiler that comes with
     this system cannot compile GNU CC; contact `tektronix!reed!mason'
     to get binaries of GNU CC for bootstrapping.

`romp-*-aos'
`romp-*-mach'
     The only operating systems supported for the IBM RT PC are AOS and
     MACH.  GNU CC does not support AIX running on the RT.  We
     recommend you compile GNU CC with an earlier version of itself; if
     you compile GNU CC with `hc', the Metaware compiler, it will work,
     but you will get mismatches between the stage 2 and stage 3
     compilers in various files.  These errors are minor differences in
     some floating-point constants and can be safely ignored; the stage
     3 compiler is correct.

`rs6000-*-aix'
`powerpc-*-aix'
     Various early versions of each release of the IBM XLC compiler
     will not bootstrap GNU CC.  Symptoms include differences between
     the stage2 and stage3 object files, and errors when compiling
     `libgcc.a' or `enquire'.  Known problematic releases include:
     xlc-1.2.1.8, xlc-1.3.0.0 (distributed with AIX 3.2.5), and
     xlc-1.3.0.19.  Both xlc-1.2.1.28 and xlc-1.3.0.24 (PTF 432238) are
     known to produce working versions of GNU CC, but most other recent
     releases correctly bootstrap GNU CC.

     Release 4.3.0 of AIX and ones prior to AIX 3.2.4 include a version
     of the IBM assembler which does not accept debugging directives:
     assembler updates are available as PTFs.  Also, if you are using
     AIX 3.2.5 or greater and the GNU assembler, you must have a
     version modified after October 16th, 1995 in order for the GNU C
     compiler to build.  See the file `README.RS6000' for more details
     on any of these problems.

     GNU CC does not yet support the 64-bit PowerPC instructions.

     Objective C does not work on this architecture because it makes
     assumptions that are incompatible with the calling conventions.

     AIX on the RS/6000 provides support (NLS) for environments outside
     of the United States.  Compilers and assemblers use NLS to support
     locale-specific representations of various objects including
     floating-point numbers ("." vs "," for separating decimal
     fractions).  There have been problems reported where the library
     linked with GNU CC does not produce the same floating-point
     formats that the assembler accepts.  If you have this problem, set
     the LANG environment variable to "C" or "En_US".

     Due to changes in the way that GNU CC invokes the binder (linker)
     for AIX 4.1, you may now receive warnings of duplicate symbols
     from the link step that were not reported before.  The assembly
     files generated by GNU CC for AIX have always 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.

     By default, AIX 4.1 produces code that can be used on either Power
     or PowerPC processors.

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

`powerpc-*-elf'
`powerpc-*-sysv4'
     PowerPC system in big endian mode, running System V.4.

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

`powerpc-*-linux-gnu'
     PowerPC system in big endian mode, running the Linux-based GNU
     system.

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

`powerpc-*-eabiaix'
     Embedded PowerPC system in big endian mode with -mcall-aix
     selected as the default.

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

`powerpc-*-eabisim'
     Embedded PowerPC system in big endian mode for use in running
     under the PSIM simulator.

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

`powerpc-*-eabi'
     Embedded PowerPC system in big endian mode.

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

`powerpcle-*-elf'
`powerpcle-*-sysv4'
     PowerPC system in little endian mode, running System V.4.

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

`powerpcle-*-solaris2*'
     PowerPC system in little endian mode, running Solaris 2.5.1 or
     higher.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.  Beta
     versions of the Sun 4.0 compiler do not seem to be able to build
     GNU CC correctly.  There are also problems with the host assembler
     and linker that are fixed by using the GNU versions of these tools.

`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.

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

`powerpcle-*-winnt'
`powerpcle-*-pe'
     PowerPC system in little endian mode running Windows NT.

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

`vax-dec-ultrix'
     Don't try compiling with Vax C (`vcc').  It produces incorrect code
     in some cases (for example, when `alloca' is used).

     Meanwhile, compiling `cp/parse.c' with pcc does not work because of
     an internal table size limitation in that compiler.  To avoid this
     problem, compile just the GNU C compiler first, and use it to
     recompile building all the languages that you want to run.

`sparc-sun-*'
     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`vax-dec-vms'
     See *Note VMS Install::, for details on how to install GNU CC on
     VMS.

`we32k-*-*'
     These computers are also known as the 3b2, 3b5, 3b20 and other
     similar names.  (However, the 3b1 is actually a 68000; see *Note
     Configurations::.)

     Don't use `-g' when compiling with the system's compiler.  The
     system's linker seems to be unable to handle such a large program
     with debugging information.

     The system's compiler runs out of capacity when compiling `stmt.c'
     in GNU CC.  You can work around this by building `cpp' in GNU CC
     first, then use that instead of the system's preprocessor with the
     system's C compiler to compile `stmt.c'.  Here is how:

          mv /lib/cpp /lib/cpp.att
          cp cpp /lib/cpp.gnu
          echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp
          chmod +x /lib/cpp

     The system's compiler produces bad code for some of the GNU CC
     optimization files.  So you must build the stage 2 compiler without
     optimization.  Then build a stage 3 compiler with optimization.
     That executable should work.  Here are the necessary commands:

          make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g"
          make stage2
          make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O"

     You may need to raise the ULIMIT setting to build a C++ compiler,
     as the file `cc1plus' is larger than one megabyte.


File: INSTALL,  Node: Other Dir,  Next: Cross-Compiler,  Prev: Configurations,  Up: Installation

Compilation in a Separate Directory
===================================

   If you wish to build the object files and executables in a directory
other than the one containing the source files, here is what you must
do differently:

  1. Make sure you have a version of Make that supports the `VPATH'
     feature.  (GNU Make supports it, as do Make versions on most BSD
     systems.)

  2. If you have ever run `configure' in the source directory, you must
     undo the configuration.  Do this by running:

          make distclean

  3. Go to the directory in which you want to build the compiler before
     running `configure':

          mkdir gcc-sun3
          cd gcc-sun3

     On systems that do not support symbolic links, this directory must
     be on the same file system as the source code directory.

  4. Specify where to find `configure' when you run it:

          ../gcc/configure ...

     This also tells `configure' where to find the compiler sources;
     `configure' takes the directory from the file name that was used to
     invoke it.  But if you want to be sure, you can specify the source
     directory with the `--srcdir' option, like this:

          ../gcc/configure --srcdir=../gcc OTHER OPTIONS

     The directory you specify with `--srcdir' need not be the same as
     the one that `configure' is found in.

   Now, you can run `make' in that directory.  You need not repeat the
configuration steps shown above, when ordinary source files change.  You
must, however, run `configure' again when the configuration files
change, if your system does not support symbolic links.


File: INSTALL,  Node: Cross-Compiler,  Next: Sun Install,  Prev: Other Dir,  Up: Installation

Building and Installing a Cross-Compiler
========================================

   GNU CC can function as a cross-compiler for many machines, but not
all.

   * Cross-compilers for the Mips as target using the Mips assembler
     currently do not work, because the auxiliary programs
     `mips-tdump.c' and `mips-tfile.c' can't be compiled on anything
     but a Mips.  It does work to cross compile for a Mips if you use
     the GNU assembler and linker.

   * Cross-compilers between machines with different floating point
     formats have not all been made to work.  GNU CC now has a floating
     point emulator with which these can work, but each target machine
     description needs to be updated to take advantage of it.

   * Cross-compilation between machines of different word sizes is
     somewhat problematic and sometimes does not work.

   Since GNU CC generates assembler code, you probably need a
cross-assembler that GNU CC can run, in order to produce object files.
If you want to link on other than the target machine, you need a
cross-linker as well.  You also need header files and libraries suitable
for the target machine that you can install on the host machine.

* Menu:

* Steps of Cross::      Using a cross-compiler involves several steps
                          that may be carried out on different machines.
* Configure Cross::     Configuring a cross-compiler.
* Tools and Libraries:: Where to put the linker and assembler, and the C library.
* Cross Headers::       Finding and installing header files
                          for a cross-compiler.
* Cross Runtime::       Supplying arithmetic runtime routines (`libgcc1.a').
* Build Cross::         Actually compiling the cross-compiler.


File: INSTALL,  Node: Steps of Cross,  Next: Configure Cross,  Up: Cross-Compiler

Steps of Cross-Compilation
--------------------------

   To compile and run a program using a cross-compiler involves several
steps:

   * Run the cross-compiler on the host machine to produce assembler
     files for the target machine.  This requires header files for the
     target machine.

   * Assemble the files produced by the cross-compiler.  You can do this
     either with an assembler on the target machine, or with a
     cross-assembler on the host machine.

   * Link those files to make an executable.  You can do this either
     with a linker on the target machine, or with a cross-linker on the
     host machine.  Whichever machine you use, you need libraries and
     certain startup files (typically `crt....o') for the target
     machine.

   It is most convenient to do all of these steps on the same host
machine, since then you can do it all with a single invocation of GNU
CC.  This requires a suitable cross-assembler and cross-linker.  For
some targets, the GNU assembler and linker are available.


File: INSTALL,  Node: Configure Cross,  Next: Tools and Libraries,  Prev: Steps of Cross,  Up: Cross-Compiler

Configuring a Cross-Compiler
----------------------------

   To build GNU CC as a cross-compiler, you start out by running
`configure'.  Use the `--target=TARGET' to specify the target type.  If
`configure' was unable to correctly identify the system you are running
on, also specify the `--build=BUILD' option.  For example, here is how
to configure for a cross-compiler that produces code for an HP 68030
system running BSD on a system that `configure' can correctly identify:

     ./configure --target=m68k-hp-bsd4.3


File: INSTALL,  Node: Tools and Libraries,  Next: Cross Headers,  Prev: Configure Cross,  Up: Cross-Compiler

Tools and Libraries for a Cross-Compiler
----------------------------------------

   If you have a cross-assembler and cross-linker available, you should
install them now.  Put them in the directory `/usr/local/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 GNU CC 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 and GAS.  Configure them with the same `--host' and `--target'
options that you use for configuring GNU CC, then build and install
them.  They install their executables automatically into the proper
directory.  Alas, they do not support all the targets that GNU CC
supports.

   If you want to install libraries to use with the cross-compiler,
such as a standard C library, put them in the directory
`/usr/local/TARGET/lib'; installation of GNU CC copies all the files in
that subdirectory into the proper place for GNU CC to find them and
link with them.  Here's an example of copying some libraries from a
target machine:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/lib
     cd /lib
     get libc.a
     cd /usr/lib
     get libg.a
     get libm.a
     quit

The precise set of libraries you'll need, and their locations on the
target machine, vary depending on its operating system.

   Many targets require "start files" such as `crt0.o' and `crtn.o'
which are linked into each executable; these too should be placed in
`/usr/local/TARGET/lib'.  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.  Here's an example of copying these files from a target
machine:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/lib
     prompt
     cd /lib
     mget *crt*.o
     cd /usr/lib
     mget *crt*.o
     quit


File: INSTALL,  Node: Cross Runtime,  Next: Build Cross,  Prev: Cross Headers,  Up: Cross-Compiler

`libgcc.a' and Cross-Compilers
------------------------------

   Code compiled by GNU CC uses certain runtime support functions
implicitly.  Some of these functions can be compiled successfully with
GNU CC itself, but a few cannot be.  These problem functions are in the
source file `libgcc1.c'; the library made from them is called
`libgcc1.a'.

   When you build a native compiler, these functions are compiled with
some other compiler-the one that you use for bootstrapping GNU CC.
Presumably it knows how to open code these operations, or else knows how
to call the run-time emulation facilities that the machine comes with.
But this approach doesn't work for building a cross-compiler.  The
compiler that you use for building knows about the host system, not the
target system.

   So, when you build a cross-compiler you have to supply a suitable
library `libgcc1.a' that does the job it is expected to do.

   To compile `libgcc1.c' with the cross-compiler itself does not work.
The functions in this file are supposed to implement arithmetic
operations that GNU CC does not know how to open code for your target
machine.  If these functions are compiled with GNU CC itself, they will
compile into infinite recursion.

   On any given target, most of these functions are not needed.  If GNU
CC can open code an arithmetic operation, it will not call these
functions to perform the operation.  It is possible that on your target
machine, none of these functions is needed.  If so, you can supply an
empty library as `libgcc1.a'.

   Many targets need library support only for multiplication and
division.  If you are linking with a library that contains functions for
multiplication and division, you can tell GNU CC to call them directly
by defining the macros `MULSI3_LIBCALL', and the like.  These macros
need to be defined in the target description macro file.  For some
targets, they are defined already.  This may be sufficient to avoid the
need for libgcc1.a; if so, you can supply an empty library.

   Some targets do not have floating point instructions; they need other
functions in `libgcc1.a', which do floating arithmetic.  Recent
versions of GNU CC have a file which emulates floating point.  With a
certain amount of work, you should be able to construct a floating
point emulator that can be used as `libgcc1.a'.  Perhaps future
versions will contain code to do this automatically and conveniently.
That depends on whether someone wants to implement it.

   Some embedded targets come with all the necessary `libgcc1.a'
routines written in C or assembler.  These targets build `libgcc1.a'
automatically and you do not need to do anything special for them.
Other embedded targets do not need any `libgcc1.a' routines since all
the necessary operations are supported by the hardware.

   If your target system has another C compiler, you can configure GNU
CC as a native compiler on that machine, build just `libgcc1.a' with
`make libgcc1.a' on that machine, and use the resulting file with the
cross-compiler.  To do this, execute the following on the target
machine:

     cd TARGET-BUILD-DIR
     ./configure --host=sparc --target=sun3
     make libgcc1.a

And then this on the host machine:

     ftp TARGET-MACHINE
     binary
     cd TARGET-BUILD-DIR
     get libgcc1.a
     quit

   Another way to provide the functions you need in `libgcc1.a' is to
define the appropriate `perform_...' macros for those functions.  If
these definitions do not use the C arithmetic operators that they are
meant to implement, you should be able to compile them with the
cross-compiler you are building.  (If these definitions already exist
for your target file, then you are all set.)

   To build `libgcc1.a' using the perform macros, use
`LIBGCC1=libgcc1.a OLDCC=./xgcc' when building the compiler.
Otherwise, you should place your replacement library under the name
`libgcc1.a' in the directory in which you will build the
cross-compiler, before you run `make'.


File: INSTALL,  Node: Cross Headers,  Next: Cross Runtime,  Prev: Tools and Libraries,  Up: Cross-Compiler

Cross-Compilers and Header Files
--------------------------------

   If you are cross-compiling a standalone program or a program for an
embedded system, then you may not need any header files except the few
that are part of GNU CC (and those of your program).  However, if you
intend to link your program with a standard C library such as `libc.a',
then you probably need to compile with the header files that go with
the library you use.

   The GNU C compiler does not come with these files, because (1) they
are system-specific, and (2) they belong in a C library, not in a
compiler.

   If the GNU C library supports your target machine, then you can get
the header files from there (assuming you actually use the GNU library
when you link your program).

   If your target machine comes with a C compiler, it probably comes
with suitable header files also.  If you make these files accessible
from the host machine, the cross-compiler can use them also.

   Otherwise, you're on your own in finding header files to use when
cross-compiling.

   When you have found suitable header files, put them in the directory
`/usr/local/TARGET/include', before building the cross compiler.  Then
installation will run fixincludes properly and install the corrected
versions of the header files where the compiler will use them.

   Provide the header files before you build the cross-compiler, because
the build stage actually runs the cross-compiler to produce parts of
`libgcc.a'.  (These are the parts that *can* be compiled with GNU CC.)
Some of them need suitable header files.

   Here's an example showing how to copy the header files from a target
machine.  On the target machine, do this:

     (cd /usr/include; tar cf - .) > tarfile

   Then, on the host machine, do this:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/include
     get tarfile
     quit
     tar xf tarfile


File: INSTALL,  Node: Build Cross,  Prev: Cross Runtime,  Up: Cross-Compiler

Actually Building the Cross-Compiler
------------------------------------

   Now you can proceed just as for compiling a single-machine compiler
through the step of building stage 1.  If you have not provided some
sort of `libgcc1.a', then compilation will give up at the point where
it needs that file, printing a suitable error message.  If you do
provide `libgcc1.a', then building the compiler will automatically
compile and link a test program called `libgcc1-test'; if you get
errors in the linking, it means that not all of the necessary routines
in `libgcc1.a' are available.

   You must provide the header file `float.h'.  One way to do this is
to compile `enquire' and run it on your target machine.  The job of
`enquire' is to run on the target machine and figure out by experiment
the nature of its floating point representation.  `enquire' records its
findings in the header file `float.h'.  If you can't produce this file
by running `enquire' on the target machine, then you will need to come
up with a suitable `float.h' in some other way (or else, avoid using it
in your programs).

   Do not try to build stage 2 for a cross-compiler.  It doesn't work to
rebuild GNU CC as a cross-compiler using the cross-compiler, because
that would produce a program that runs on the target machine, not on the
host.  For example, if you compile a 386-to-68030 cross-compiler with
itself, the result will not be right either for the 386 (because it was
compiled into 68030 code) or for the 68030 (because it was configured
for a 386 as the host).  If you want to compile GNU CC into 68030 code,
whether you compile it on a 68030 or with a cross-compiler on a 386, you
must specify a 68030 as the host when you configure it.

   To install the cross-compiler, use `make install', as usual.


File: INSTALL,  Node: Sun Install,  Next: VMS Install,  Prev: Cross-Compiler,  Up: Installation

Installing GNU CC on the Sun
============================

   On Solaris, do not use the linker or other tools in `/usr/ucb' to
build GNU CC.  Use `/usr/ccs/bin'.

   If the assembler reports `Error: misaligned data' when bootstrapping,
you are probably using an obsolete version of the GNU assembler.
Upgrade to the latest version of GNU `binutils', or use the Solaris
assembler.

   Make sure the environment variable `FLOAT_OPTION' is not set when
you compile `libgcc.a'.  If this option were set to `f68881' when
`libgcc.a' is compiled, the resulting code would demand to be linked
with a special startup file and would not link properly without special
pains.

   There is a bug in `alloca' in certain versions of the Sun library.
To avoid this bug, install the binaries of GNU CC that were compiled by
GNU CC.  They use `alloca' as a built-in function and never the one in
the library.

   Some versions of the Sun compiler crash when compiling GNU CC.  The
problem is a segmentation fault in cpp.  This problem seems to be due to
the bulk of data in the environment variables.  You may be able to avoid
it by using the following command to compile GNU CC with Sun CC:

     make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc"

   SunOS 4.1.3 and 4.1.3_U1 have bugs that can cause intermittent core
dumps when compiling GNU CC.  A common symptom is an internal compiler
error which does not recur if you run it again.  To fix the problem,
install Sun recommended patch 100726 (for SunOS 4.1.3) or 101508 (for
SunOS 4.1.3_U1), or upgrade to a later SunOS release.


File: INSTALL,  Node: VMS Install,  Next: Collect2,  Prev: Sun Install,  Up: Installation

Installing GNU CC on VMS
========================

   The VMS version of GNU CC is distributed in a backup saveset
containing both source code and precompiled binaries.

   To install the `gcc' command so you can use the compiler easily, in
the same manner as you use the VMS C compiler, you must install the VMS
CLD file for GNU CC as follows:

  1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to
     point to the directories where the GNU CC executables
     (`gcc-cpp.exe', `gcc-cc1.exe', etc.) and the C include files are
     kept respectively.  This should be done with the commands:

          $ assign /system /translation=concealed -
            disk:[gcc.] gnu_cc
          $ assign /system /translation=concealed -
            disk:[gcc.include.] gnu_cc_include

     with the appropriate disk and directory names.  These commands can
     be placed in your system startup file so they will be executed
     whenever the machine is rebooted.  You may, if you choose, do this
     via the `GCC_INSTALL.COM' script in the `[GCC]' directory.

  2. Install the `GCC' command with the command line:

          $ set command /table=sys$common:[syslib]dcltables -
            /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc
          $ install replace sys$common:[syslib]dcltables

  3. To install the help file, do the following:

          $ library/help sys$library:helplib.hlb gcc.hlp

     Now you can invoke the compiler with a command like `gcc /verbose
     file.c', which is equivalent to the command `gcc -v -c file.c' in
     Unix.

   If you wish to use GNU C++ you must first install GNU CC, and then
perform the following steps:

  1. Define the VMS logical name `GNU_GXX_INCLUDE' to point to the
     directory where the preprocessor will search for the C++ header
     files.  This can be done with the command:

          $ assign /system /translation=concealed -
            disk:[gcc.gxx_include.] gnu_gxx_include

     with the appropriate disk and directory name.  If you are going to
     be using a C++ runtime library, this is where its install
     procedure will install its header files.

  2. Obtain the file `gcc-cc1plus.exe', and place this in the same
     directory that `gcc-cc1.exe' is kept.

     The GNU C++ compiler can be invoked with a command like `gcc /plus
     /verbose file.cc', which is equivalent to the command `g++ -v -c
     file.cc' in Unix.

   We try to put corresponding binaries and sources on the VMS
distribution tape.  But sometimes the binaries will be from an older
version than the sources, because we don't always have time to update
them.  (Use the `/version' option to determine the version number of
the binaries and compare it with the source file `version.c' to tell
whether this is so.)  In this case, you should use the binaries you get
to recompile the sources.  If you must recompile, here is how:

  1. Execute the command procedure `vmsconfig.com' to set up the files
     `tm.h', `config.h', `aux-output.c', and `md.', and to create files
     `tconfig.h' and `hconfig.h'.  This procedure also creates several
     linker option files used by `make-cc1.com' and a data file used by
     `make-l2.com'.

          $ @vmsconfig.com

  2. Setup the logical names and command tables as defined above.  In
     addition, define the VMS logical name `GNU_BISON' to point at the
     to the directories where the Bison executable is kept.  This
     should be done with the command:

          $ assign /system /translation=concealed -
            disk:[bison.] gnu_bison

     You may, if you choose, use the `INSTALL_BISON.COM' script in the
     `[BISON]' directory.

  3. Install the `BISON' command with the command line:

          $ set command /table=sys$common:[syslib]dcltables -
            /output=sys$common:[syslib]dcltables -
            gnu_bison:[000000]bison
          $ install replace sys$common:[syslib]dcltables

  4. Type `@make-gcc' to recompile everything (alternatively, submit
     the file `make-gcc.com' to a batch queue).  If you wish to build
     the GNU C++ compiler as well as the GNU CC compiler, you must
     first edit `make-gcc.com' and follow the instructions that appear
     in the comments.

  5. In order to use GCC, you need a library of functions which GCC
     compiled code will call to perform certain tasks, and these
     functions are defined in the file `libgcc2.c'.  To compile this
     you should use the command procedure `make-l2.com', which will
     generate the library `libgcc2.olb'.  `libgcc2.olb' should be built
     using the compiler built from the same distribution that
     `libgcc2.c' came from, and `make-gcc.com' will automatically do
     all of this for you.

     To install the library, use the following commands:

          $ library gnu_cc:[000000]gcclib/delete=(new,eprintf)
          $ library gnu_cc:[000000]gcclib/delete=L_*
          $ library libgcc2/extract=*/output=libgcc2.obj
          $ library gnu_cc:[000000]gcclib libgcc2.obj

     The first command simply removes old modules that will be replaced
     with modules from `libgcc2' under different module names.  The
     modules `new' and `eprintf' may not actually be present in your
     `gcclib.olb'--if the VMS librarian complains about those modules
     not being present, simply ignore the message and continue on with
     the next command.  The second command removes the modules that
     came from the previous version of the library `libgcc2.c'.

     Whenever you update the compiler on your system, you should also
     update the library with the above procedure.

  6. You may wish to build GCC in such a way that no files are written
     to the directory where the source files reside.  An example would
     be the when the source files are on a read-only disk.  In these
     cases, execute the following DCL commands (substituting your
     actual path names):

          $ assign dua0:[gcc.build_dir.]/translation=concealed, -
                   dua1:[gcc.source_dir.]/translation=concealed  gcc_build
          $ set default gcc_build:[000000]

     where the directory `dua1:[gcc.source_dir]' contains the source
     code, and the directory `dua0:[gcc.build_dir]' is meant to contain
     all of the generated object files and executables.  Once you have
     done this, you can proceed building GCC as described above.  (Keep
     in mind that `gcc_build' is a rooted logical name, and thus the
     device names in each element of the search list must be an actual
     physical device name rather than another rooted logical name).

  7. *If you are building GNU CC with a previous version of GNU CC, you
     also should check to see that you have the newest version of the
     assembler*.  In particular, GNU CC version 2 treats global constant
     variables slightly differently from GNU CC version 1, and GAS
     version 1.38.1 does not have the patches required to work with GCC
     version 2.  If you use GAS 1.38.1, then `extern const' variables
     will not have the read-only bit set, and the linker will generate
     warning messages about mismatched psect attributes for these
     variables.  These warning messages are merely a nuisance, and can
     safely be ignored.

     If you are compiling with a version of GNU CC older than 1.33,
     specify `/DEFINE=("inline=")' as an option in all the
     compilations.  This requires editing all the `gcc' commands in
     `make-cc1.com'.  (The older versions had problems supporting
     `inline'.)  Once you have a working 1.33 or newer GNU CC, you can
     change this file back.

  8. If you want to build GNU CC with the VAX C compiler, you will need
     to make minor changes in `make-cccp.com' and `make-cc1.com' to
     choose alternate definitions of `CC', `CFLAGS', and `LIBS'.  See
     comments in those files.  However, you must also have a working
     version of the GNU assembler (GNU as, aka GAS) as it is used as
     the back-end for GNU CC to produce binary object modules and is
     not included in the GNU CC sources.  GAS is also needed to compile
     `libgcc2' in order to build `gcclib' (see above); `make-l2.com'
     expects to be able to find it operational in
     `gnu_cc:[000000]gnu-as.exe'.

     To use GNU CC on VMS, you need the VMS driver programs `gcc.exe',
     `gcc.com', and `gcc.cld'.  They are distributed with the VMS
     binaries (`gcc-vms') rather than the GNU CC sources.  GAS is also
     included in `gcc-vms', as is Bison.

     Once you have successfully built GNU CC with VAX C, you should use
     the resulting compiler to rebuild itself.  Before doing this, be
     sure to restore the `CC', `CFLAGS', and `LIBS' definitions in
     `make-cccp.com' and `make-cc1.com'.  The second generation
     compiler will be able to take advantage of many optimizations that
     must be suppressed when building with other compilers.

   Under previous versions of GNU CC, the generated code would
occasionally give strange results when linked with the sharable
`VAXCRTL' library.  Now this should work.

   Even with this version, however, GNU CC itself should not be linked
with the sharable `VAXCRTL'.  The version of `qsort' in `VAXCRTL' has a
bug (known to be present in VMS versions V4.6 through V5.5) which
causes the compiler to fail.

   The executables are generated by `make-cc1.com' and `make-cccp.com'
use the object library version of `VAXCRTL' in order to make use of the
`qsort' routine in `gcclib.olb'.  If you wish to link the compiler
executables with the shareable image version of `VAXCRTL', you should
edit the file `tm.h' (created by `vmsconfig.com') to define the macro
`QSORT_WORKAROUND'.

   `QSORT_WORKAROUND' is always defined when GNU CC is compiled with
VAX C, to avoid a problem in case `gcclib.olb' is not yet available.


File: INSTALL,  Node: Collect2,  Next: Header Dirs,  Prev: VMS Install,  Up: Installation

`collect2'
==========

   GNU CC uses a utility called `collect2' on nearly all systems to
arrange to call various initialization functions at start time.

   The program `collect2' works by linking the program once and looking
through the linker output file for symbols with particular names
indicating they are constructor functions.  If it finds any, it creates
a new temporary `.c' file containing a table of them, compiles it, and
links the program a second time including that file.

   The actual calls to the constructors are carried out by a subroutine
called `__main', which is called (automatically) at the beginning of
the body of `main' (provided `main' was compiled with GNU CC).  Calling
`__main' is necessary, even when compiling C code, to allow linking C
and C++ object code together.  (If you use `-nostdlib', you get an
unresolved reference to `__main', since it's defined in the standard
GCC library.  Include `-lgcc' at the end of your compiler command line
to resolve this reference.)

   The program `collect2' is installed as `ld' in the directory where
the passes of the compiler are installed.  When `collect2' needs to
find the *real* `ld', it tries the following file names:

   * `real-ld' in the directories listed in the compiler's search
     directories.

   * `real-ld' in the directories listed in the environment variable
     `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories, except that `collect2'
     will not execute itself recursively.

   * `ld' in `PATH'.

   "The compiler's search directories" means all the directories where
`gcc' searches for passes of the compiler.  This includes directories
that you specify with `-B'.

   Cross-compilers search a little differently:

   * `real-ld' in the compiler's search directories.

   * `TARGET-real-ld' in `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories.

   * `TARGET-ld' in `PATH'.

   `collect2' explicitly avoids running `ld' using the file name under
which `collect2' itself was invoked.  In fact, it remembers up a list
of such names--in case one copy of `collect2' finds another copy (or
version) of `collect2' installed as `ld' in a second place in the
search path.

   `collect2' searches for the utilities `nm' and `strip' using the
same algorithm as above for `ld'.


File: INSTALL,  Node: Header Dirs,  Prev: Collect2,  Up: Installation

Standard Header File Directories
================================

   `GCC_INCLUDE_DIR' means the same thing for native and cross.  It is
where GNU CC stores its private include files, and also where GNU CC
stores the fixed include files.  A cross compiled GNU CC runs
`fixincludes' on the header files in `$(tooldir)/include'.  (If the
cross compilation header files need to be fixed, they must be installed
before GNU CC is built.  If the cross compilation header files are
already suitable for ANSI C and GNU CC, nothing special need be done).

   `GPLUS_INCLUDE_DIR' means the same thing for native and cross.  It
is where `g++' looks first for header files.  The C++ library installs
only target independent header files in that directory.

   `LOCAL_INCLUDE_DIR' is used only for a native compiler.  It is
normally `/usr/local/include'.  GNU CC searches this directory so that
users can install header files in `/usr/local/include'.

   `CROSS_INCLUDE_DIR' is used only for a cross compiler.  GNU CC
doesn't install anything there.

   `TOOL_INCLUDE_DIR' is used for both native and cross compilers.  It
is the place for other packages to install header files that GNU CC will
use.  For a cross-compiler, this is the equivalent of `/usr/include'.
When you build a cross-compiler, `fixincludes' processes any header
files in this directory.



Tag Table:
Node: Installation351
Node: Configurations26618
Node: Other Dir65739
Node: Cross-Compiler67454
Node: Steps of Cross69284
Node: Configure Cross70401
Node: Tools and Libraries71037
Node: Cross Runtime73475
Node: Cross Headers77555
Node: Build Cross79553
Node: Sun Install81428
Node: VMS Install83099
Node: Collect293028
Node: Header Dirs95592

End Tag Table
