@c Copyright (C) 1988-2013 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.

@node Configuration Files
@subsubsection Files Created by @code{configure}

Here we spell out what files will be set up by @file{configure} in the
@file{gcc} directory.  Some other files are created as temporary files
in the configuration process, and are not used in the subsequent
build; these are not documented.

@itemize @bullet
@item
@file{Makefile} is constructed from @file{Makefile.in}, together with
the host and target fragments (@pxref{Fragments, , Makefile
Fragments}) @file{t-@var{target}} and @file{x-@var{host}} from
@file{config}, if any, and language Makefile fragments
@file{@var{language}/Make-lang.in}.
@item
@file{auto-host.h} contains information about the host machine
determined by @file{configure}.  If the host machine is different from
the build machine, then @file{auto-build.h} is also created,
containing such information about the build machine.
@item
@file{config.status} is a script that may be run to recreate the
current configuration.
@item
@file{configargs.h} is a header containing details of the arguments
passed to @file{configure} to configure GCC, and of the thread model
used.
@item
@file{cstamp-h} is used as a timestamp.
@item
If a language @file{config-lang.in} file (@pxref{Front End Config, ,
The Front End @file{config-lang.in} File}) sets @code{outputs}, then
the files listed in @code{outputs} there are also generated.
@end itemize

The following configuration headers are created from the Makefile,
using @file{mkconfig.sh}, rather than directly by @file{configure}.
@file{config.h}, @file{bconfig.h} and @file{tconfig.h} all contain the
@file{xm-@var{machine}.h} header, if any, appropriate to the host,
build and target machines respectively, the configuration headers for
the target, and some definitions; for the host and build machines,
these include the autoconfigured headers generated by
@file{configure}.  The other configuration headers are determined by
@file{config.gcc}.  They also contain the typedefs for @code{rtx},
@code{rtvec} and @code{tree}.

@itemize @bullet
@item
@file{config.h}, for use in programs that run on the host machine.
@item
@file{bconfig.h}, for use in programs that run on the build machine.
@item
@file{tconfig.h}, for use in programs and libraries for the target
machine.
@item
@file{tm_p.h}, which includes the header @file{@var{machine}-protos.h}
that contains prototypes for functions in the target
@file{@var{machine}.c} file.  The header @file{@var{machine}-protos.h}
can include prototypes of functions that use rtl and tree data
structures inside appropriate @code{#ifdef RTX_CODE} and @code{#ifdef
TREE_CODE} conditional code segements.  The
@file{@var{machine}-protos.h} is included after the @file{rtl.h}
and/or @file{tree.h} would have been included.  The @file{tm_p.h} also
includes the header @file{tm-preds.h} which is generated by
@file{genpreds} program during the build to define the declarations
and inline functions for the predicate functions.
@end itemize
