This is configure.info, produced by makeinfo version 4.0 from
./configure.texi.

INFO-DIR-SECTION GNU admin
START-INFO-DIR-ENTRY
* configure: (configure).	The GNU configure and build system
END-INFO-DIR-ENTRY

   This file documents the GNU configure and build system.

   Copyright (C) 1998 Cygnus Solutions.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Foundation.


File: configure.info,  Node: Multilibs in Target Libraries,  Prev: Multilibs in gcc,  Up: Multilibs

Multilibs in Target Libraries
=============================

   The target libraries in the Cygnus tree are automatically built with
multilibs.  That means that each library is built multiple times.

   This default is set in the top level `configure.in' file, by adding
`--enable-multilib' to the list of arguments passed to configure when
it is run for the target libraries (*note Host and Target Libraries::).

   Each target library uses the shell script `config-ml.in', written by
Doug Evans, to prepare to build target libraries.  This shell script is
invoked after the `Makefile' has been created by the `configure'
script.  If multilibs are not enabled, it does nothing, otherwise it
modifies the `Makefile' to support multilibs.

   The `config-ml.in' script makes one copy of the `Makefile' for each
multilib in the appropriate subdirectory.  When configuring in the
source directory (which is not recommended), it will build a symlink
tree of the sources in each subdirectory.

   The `config-ml.in' script sets several variables in the various
`Makefile's.  The `Makefile.in' must have definitions for these
variables already; `config-ml.in' simply changes the existing values.
The `Makefile' should use default values for these variables which will
do the right thing in the subdirectories.

`MULTISRCTOP'
     `config-ml.in' will set this to a sequence of `../' strings, where
     the number of strings is the number of multilib levels in the
     source tree.  The default value should be the empty string.

`MULTIBUILDTOP'
     `config-ml.in' will set this to a sequence of `../' strings, where
     the number of strings is number of multilib levels in the object
     directory.  The default value should be the empty string.  This
     will differ from `MULTISRCTOP' when configuring in the source tree
     (which is not recommended).

`MULTIDIRS'
     In the top level `Makefile' only, `config-ml.in' will set this to
     the list of multilib subdirectories.  The default value should be
     the empty string.

`MULTISUBDIR'
     `config-ml.in' will set this to the installed subdirectory name to
     use for this subdirectory, with a leading `/'.  The default value
     shold be the empty string.

`MULTIDO'
`MULTICLEAN'
     In the top level `Makefile' only, `config-ml.in' will set these
     variables to commands to use when doing a recursive make.  These
     variables should both default to the string `true', so that by
     default nothing happens.

   All references to the parent of the source directory should use the
variable `MULTISRCTOP'.  Instead of writing `$(srcdir)/..', you must
write `$(srcdir)/$(MULTISRCTOP)..'.

   Similarly, references to the parent of the object directory should
use the variable `MULTIBUILDTOP'.

   In the installation target, the libraries should be installed in the
subdirectory `MULTISUBDIR'.  Instead of installing
`$(libdir)/libfoo.a', install `$(libdir)$(MULTISUBDIR)/libfoo.a'.

   The `config-ml.in' script also modifies the top level `Makefile' to
add `multi-do' and `multi-clean' targets which are used when building
multilibs.

   The default target of the `Makefile' should include the following
command:
     @$(MULTIDO) $(FLAGS_TO_PASS) DO=all multi-do

This assumes that `$(FLAGS_TO_PASS)' is defined as a set of variables
to pass to a recursive invocation of `make'.  This will build all the
multilibs.  Note that the default value of `MULTIDO' is `true', so by
default this command will do nothing.  It will only do something in the
top level `Makefile' if multilibs were enabled.

   The `install' target of the `Makefile' should include the following
command:
     @$(MULTIDO) $(FLAGS_TO_PASS) DO=install multi-do

   In general, any operation, other than clean, which should be
performed on all the multilibs should use a `$(MULTIDO)' line, setting
the variable `DO' to the target of each recursive call to `make'.

   The `clean' targets (`clean', `mostlyclean', etc.) should use
`$(MULTICLEAN)'.  For example, the `clean' target should do this:
     @$(MULTICLEAN) DO=clean multi-clean


File: configure.info,  Node: FAQ,  Next: Index,  Prev: Multilibs,  Up: Top

Frequently Asked Questions
**************************

Which do I run first, `autoconf' or `automake'?
     Except when you first add autoconf or automake support to a
     package, you shouldn't run either by hand.  Instead, configure
     with the `--enable-maintainer-mode' option, and let `make' take
     care of it.

`autoconf' says something about undefined macros.
     This means that you have macros in your `configure.in' which are
     not defined by `autoconf'.  You may be using an old version of
     `autoconf'; try building and installing a newer one.  Make sure the
     newly installled `autoconf' is first on your `PATH'.  Also, see
     the next question.

My `configure' script has stuff like `CY_GNU_GETTEXT' in it.
     This means that you have macros in your `configure.in' which should
     be defined in your `aclocal.m4' file, but aren't.  This usually
     means that `aclocal' was not able to appropriate definitions of the
     macros.  Make sure that you have installed all the packages you
     need.  In particular, make sure that you have installed libtool
     (this is where `AM_PROG_LIBTOOL' is defined) and gettext (this is
     where `CY_GNU_GETTEXT' is defined, at least in the Cygnus version
     of gettext).

My `Makefile' has `@' characters in it.
     This may mean that you tried to use an autoconf substitution in
     your `Makefile.in' without adding the appropriate `AC_SUBST' call
     to your `configure' script.  Or it may just mean that you need to
     rebuild `Makefile' in your build directory.  To rebuild `Makefile'
     from `Makefile.in', run the shell script `config.status' with no
     arguments.  If you need to force `configure' to run again, first
     run `config.status --recheck'.  These runs are normally done
     automatically by `Makefile' targets, but if your `Makefile' has
     gotten messed up you'll need to help them along.

Why do I have to run both `config.status --recheck' and `config.status'?
     Normally, you don't; they will be run automatically by `Makefile'
     targets.  If you do need to run them, use `config.status --recheck'
     to run the `configure' script again with the same arguments as the
     first time you ran it.  Use `config.status' (with no arguments) to
     regenerate all files (`Makefile', `config.h', etc.) based on the
     results of the configure script.  The two cases are separate
     because it isn't always necessary to regenerate all the files
     after running `config.status --recheck'.  The `Makefile' targets
     generated by automake will use the environment variables
     `CONFIG_FILES' and `CONFIG_HEADERS' to only regenerate files as
     they are needed.

What is the Cygnus tree?
     The Cygnus tree is used for various packages including gdb, the GNU
     binutils, and egcs.  It is also, of course, used for Cygnus
     releases.  It is the build system which was developed at Cygnus,
     using the Cygnus configure script.  It permits building many
     different packages with a single configure and make.  The
     configure scripts in the tree are being converted to autoconf, but
     the general build structure remains intact.

Why do I have to keep rebuilding and reinstalling the tools?
     I know, it's a pain.  Unfortunately, there are bugs in the tools
     themselves which need to be fixed, and each time that happens
     everybody who uses the tools need to reinstall new versions of
     them.  I don't know if there is going to be a clever fix until the
     tools stabilize.

Why not just have a Cygnus tree `make' target to update the tools?
     The tools unfortunately need to be installed before they can be
     used.  That means that they must be built using an appropriate
     prefix, and it seems unwise to assume that every configuration
     uses an appropriate prefix.  It might be possible to make them
     work in place, or it might be possible to install them in some
     subdirectory; so far these approaches have not been implemented.


File: configure.info,  Node: Index,  Prev: FAQ,  Up: Top

Index
*****

* Menu:

* --build option:                        Build and Host Options.
* --host option:                         Build and Host Options.
* --target option:                       Specifying the Target.
* _GNU_SOURCE:                           Write configure.in.
* AC_CANONICAL_HOST:                     Using the Host Type.
* AC_CANONICAL_SYSTEM:                   Using the Target Type.
* AC_CONFIG_HEADER:                      Write configure.in.
* AC_EXEEXT:                             Write configure.in.
* AC_INIT:                               Write configure.in.
* AC_OUTPUT:                             Write configure.in.
* AC_PREREQ:                             Write configure.in.
* AC_PROG_CC:                            Write configure.in.
* AC_PROG_CXX:                           Write configure.in.
* acconfig.h:                            Written Developer Files.
* acconfig.h, writing:                   Write acconfig.h.
* acinclude.m4:                          Written Developer Files.
* aclocal.m4:                            Generated Developer Files.
* AM_CONFIG_HEADER:                      Write configure.in.
* AM_DISABLE_SHARED:                     Write configure.in.
* AM_EXEEXT:                             Write configure.in.
* AM_INIT_AUTOMAKE:                      Write configure.in.
* AM_MAINTAINER_MODE:                    Write configure.in.
* AM_PROG_LIBTOOL:                       Write configure.in.
* AM_PROG_LIBTOOL in configure:          FAQ.
* build option:                          Build and Host Options.
* building with a cross compiler:        Canadian Cross.
* canadian cross:                        Canadian Cross.
* canadian cross in configure:           CCross in Configure.
* canadian cross in cygnus tree:         CCross in Cygnus Tree.
* canadian cross in makefile:            CCross in Make.
* canadian cross, configuring:           Build and Host Options.
* canonical system names:                Configuration Names.
* config.cache:                          Build Files Description.
* config.h:                              Build Files Description.
* config.h.in:                           Generated Developer Files.
* config.in:                             Generated Developer Files.
* config.status:                         Build Files Description.
* config.status --recheck:               FAQ.
* configuration names:                   Configuration Names.
* configuration triplets:                Configuration Names.
* configure:                             Generated Developer Files.
* configure build system:                Build and Host Options.
* configure host:                        Build and Host Options.
* configure target:                      Specifying the Target.
* configure.in:                          Written Developer Files.
* configure.in, writing:                 Write configure.in.
* configuring a canadian cross:          Build and Host Options.
* cross compiler:                        Cross Compilation Concepts.
* cross compiler, building with:         Canadian Cross.
* cross tools:                           Cross Compilation Tools.
* CY_GNU_GETTEXT in configure:           FAQ.
* cygnus configure:                      Cygnus Configure.
* goals:                                 Goals.
* history:                               History.
* host names:                            Configuration Names.
* host option:                           Build and Host Options.
* host system:                           Host and Target.
* host triplets:                         Configuration Names.
* HOST_CC:                               CCross in Make.
* libg++ configure:                      Cygnus Configure in C++ Libraries.
* libio configure:                       Cygnus Configure in C++ Libraries.
* libstdc++ configure:                   Cygnus Configure in C++ Libraries.
* Makefile:                              Build Files Description.
* Makefile, garbage characters:          FAQ.
* Makefile.am:                           Written Developer Files.
* Makefile.am, writing:                  Write Makefile.am.
* Makefile.in:                           Generated Developer Files.
* multilibs:                             Multilibs.
* stamp-h:                               Build Files Description.
* stamp-h.in:                            Generated Developer Files.
* system names:                          Configuration Names.
* system types:                          Configuration Names.
* target option:                         Specifying the Target.
* target system:                         Host and Target.
* triplets:                              Configuration Names.
* undefined macros:                      FAQ.


