\input texinfo
@c %**start of header
@setfilename configure.info
@settitle The GNU configure and build system
@setchapternewpage off
@c %**end of header

@dircategory GNU admin
@direntry
* configure: (configure).	The GNU configure and build system
@end direntry

@ifnottex
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.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries copying permission
notice identical to this one except for the removal of this paragraph


@end ignore
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.
@end ifnottex

@titlepage
@title The GNU configure and build system
@author Ian Lance Taylor

@page
@vskip 0pt plus 1filll
Copyright @copyright{} 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 Free Software Foundation.
@end titlepage

@ifnottex
@node Top
@top GNU configure and build system

The GNU configure and build system.

@menu
* Introduction::		Introduction.
* Getting Started::		Getting Started.
* Files::			Files.
* Configuration Names::		Configuration Names.
* Cross Compilation Tools::	Cross Compilation Tools.
* Canadian Cross::		Canadian Cross.
* Cygnus Configure::		Cygnus Configure.
* Multilibs::			Multilibs.
* FAQ::				Frequently Asked Questions.
* Index::			Index.
@end menu

@end ifnottex

@node Introduction
@chapter Introduction

This document describes the GNU configure and build systems.  It
describes how autoconf, automake, libtool, and make fit together.  It
also includes a discussion of the older Cygnus configure system.

This document does not describe in detail how to use each of the tools;
see the respective manuals for that.  Instead, it describes which files
the developer must write, which files are machine generated and how they
are generated, and where certain common problems should be addressed.

@ifnothtml
This document draws on several sources, including the autoconf manual by
David MacKenzie (@pxref{Top, , autoconf overview, autoconf, Autoconf}),
the automake manual by David MacKenzie and Tom Tromey (@pxref{Top, ,
automake overview, automake, GNU Automake}), the libtool manual by
Gordon Matzigkeit (@pxref{Top, , libtool overview, libtool, GNU
libtool}), and the Cygnus configure manual by K. Richard Pixley.
@end ifnothtml
@ifhtml
This document draws on several sources, including
@uref{http://www.delorie.com/gnu/docs/autoconf/autoconf_toc.html, the
autoconf manual} by David MacKenzie,
@uref{http://www.delorie.com/gnu/docs/automake/automake_toc.html, the
automake manual} by David MacKenzie and Tom Tromey,
@uref{http://www.delorie.com/gnu/docs/libtool/libtool_toc.html, the
libtool manual} by Gordon Matzigkeit, and the Cygnus configure manual by
K. Richard Pixley.
@end ifhtml

@menu
* Goals::			Goals.
* Tools::			The tools.
* History::			History.
* Building::			Building.
@end menu

@node Goals
@section Goals
@cindex goals

The GNU configure and build system has two main goals.

The first is to simplify the development of portable programs.  The
system permits the developer to concentrate on writing the program,
simplifying many details of portability across Unix and even Windows
systems, and permitting the developer to describe how to build the
program using simple rules rather than complex Makefiles.

The second is to simplify the building of programs distributed as source
code.  All programs are built using a simple, standardized, two step
process.  The program builder need not install any special tools in
order to build the program.

@node Tools
@section Tools

The GNU configure and build system is comprised of several different
tools.  Program developers must build and install all of these tools.

People who just want to build programs from distributed sources normally
do not need any special tools beyond a Unix shell, a make program, and a
C compiler.

@table @asis
@item autoconf
provides a general portability framework, based on testing the features
of the host system at build time.
@item automake
a system for describing how to build a program, permitting the developer
to write a simplified @file{Makefile}.
@item libtool
a standardized approach to building shared libraries.
@item gettext
provides a framework for translation of text messages into other
languages; not really discussed in this document.
@item m4
autoconf requires the GNU version of m4; the standard Unix m4 does not
suffice.
@item perl
automake requires perl.
@end table

@node History
@section History
@cindex history

This is a very brief and probably inaccurate history.

As the number of Unix variants increased during the 1980s, it became
harder to write programs which could run on all variants.  While it was
often possible to use @code{#ifdef} to identify particular systems,
developers frequently did not have access to every system, and the
characteristics of some systems changed from version to version.

By 1992, at least three different approaches had been developed:
@itemize @bullet
@item
The Metaconfig program, by Larry Wall, Harlan Stenn, and Raphael
Manfredi.
@item
The Cygnus configure script, by K. Richard Pixley, and the gcc configure
script, by Richard Stallman.  These use essentially the same approach,
and the developers communicated regularly.
@item
The autoconf program, by David MacKenzie.
@end itemize

The Metaconfig program is still used for Perl and a few other programs.
It is part of the Dist package.  I do not know if it is being developed.

In 1994, David MacKenzie and others modified autoconf to incorporate all
the features of Cygnus configure.  Since then, there has been a slow but
steady conversion of GNU programs from Cygnus configure to autoconf. gcc
has been converted, eliminating the gcc configure script.

GNU autoconf was regularly maintained until late 1996.  As of this
writing in June, 1998, it has no public maintainer.

Most programs are built using the make program, which requires the
developer to write Makefiles describing how to build the programs.
Since most programs are built in pretty much the same way, this led to a
lot of duplication.

The X Window system is built using the imake tool, which uses a database
of rules to eliminate the duplication.  However, building a tool which
was developed using imake requires that the builder have imake
installed, violating one of the goals of the GNU system.

The new BSD make provides a standard library of Makefile fragments,
which permits developers to write very simple Makefiles.  However, this
requires that the builder install the new BSD make program.

In 1994, David MacKenzie wrote the first version of automake, which
permitted writing a simple build description which was converted into a
Makefile which could be used by the standard make program.  In 1995, Tom
Tromey completely rewrote automake in Perl, and he continues to enhance
it.

Various free packages built libraries, and by around 1995 several
included support to build shared libraries on various platforms.
However, there was no consistent approach.  In early 1996, Gordon
Matzigkeit began working on libtool, which provided a standardized
approach to building shared libraries.  This was integrated into
automake from the start.

The development of automake and libtool was driven by the GNITS project,
a group of GNU maintainers who designed standardized tools to help meet
the GNU coding standards.

@node Building
@section Building

Most readers of this document should already know how to build a tool by
running @samp{configure} and @samp{make}.  This section may serve as a
quick introduction or reminder.

Building a tool is normally as simple as running @samp{configure}
followed by @samp{make}.  You should normally run @samp{configure} from
an empty directory, using some path to refer to the @samp{configure}
script in the source directory.  The directory in which you run
@samp{configure} is called the @dfn{object directory}.

In order to use a object directory which is different from the source
directory, you must be using the GNU version of @samp{make}, which has
the required @samp{VPATH} support.  Despite this restriction, using a
different object directory is highly recommended:
@itemize @bullet
@item
It keeps the files generated during the build from cluttering up your
sources.
@item 
It permits you to remove the built files by simply removing the entire
build directory.
@item
It permits you to build from the same sources with several sets of
configure options simultaneously.
@end itemize

If you don't have GNU @samp{make}, you will have to run @samp{configure}
in the source directory.  All GNU packages should support this; in
particular, GNU packages should not assume the presence of GNU
@samp{make}.

After running @samp{configure}, you can build the tools by running
@samp{make}.

To install the tools, run @samp{make install}.  Installing the tools
will copy the programs and any required support files to the
@dfn{installation directory}.  The location of the installation
directory is controlled by @samp{configure} options, as described below.

In the Cygnus tree at present, the info files are built and installed as
a separate step.  To build them, run @samp{make info}.  To install them,
run @samp{make install-info}.

All @samp{configure} scripts support a wide variety of options.  The
most interesting ones are @samp{--with} and @samp{--enable} options
which are generally specific to particular tools.  You can usually use
the @samp{--help} option to get a list of interesting options for a
particular configure script.

The only generic options you are likely to use are the @samp{--prefix}
and @samp{--exec-prefix} options.  These options are used to specify the
installation directory.

The directory named by the @samp{--prefix} option will hold machine
independent files such as info files.

The directory named by the @samp{--exec-prefix} option, which is
normally a subdirectory of the @samp{--prefix} directory, will hold
machine dependent files such as executables.

The default for @samp{--prefix} is @file{/usr/local}.  The default for
@samp{--exec-prefix} is the value used for @samp{--prefix}.

The convention used in Cygnus releases is to use a @samp{--prefix}
option of @file{/usr/cygnus/@var{release}}, where @var{release} is the
name of the release, and to use a @samp{--exec-prefix} option of
@file{/usr/cygnus/@var{release}/H-@var{host}}, where @var{host} is the
configuration name of the host system (@pxref{Configuration Names}).

Do not use either the source or the object directory as the installation
directory.  That will just lead to confusion.

@node Getting Started
@chapter Getting Started

To start using the GNU configure and build system with your software
package, you must write three files, and you must run some tools to
manually generate additional files.

@menu
* Write configure.in::		Write configure.in.
* Write Makefile.am::		Write Makefile.am.
* Write acconfig.h::		Write acconfig.h.
* Generate files::		Generate files.
* Getting Started Example::	Example.
@end menu

@node Write configure.in
@section Write configure.in
@cindex @file{configure.in}, writing

You must first write the file @file{configure.in}.  This is an autoconf
input file, and the autoconf manual describes in detail what this file
should look like.

You will write tests in your @file{configure.in} file to check for
conditions that may change from one system to another, such as the
presence of particular header files or functions.

For example, not all systems support the @samp{gettimeofday} function.
If you want to use the @samp{gettimeofday} function when it is
available, and to use some other function when it is not, you would
check for this by putting @samp{AC_CHECK_FUNCS(gettimeofday)} in
@file{configure.in}.

When the configure script is run at build time, this will arrange to
define the preprocessor macro @samp{HAVE_GETTIMEOFDAY} to the value 1 if
the @samp{gettimeofday} function is available, and to not define the
macro at all if the function is not available.  Your code can then use
@samp{#ifdef} to test whether it is safe to call @samp{gettimeofday}.

If you have an existing body of code, the @samp{autoscan} program may
help identify potential portability problems, and hence configure tests
that you will want to use.
@ifnothtml
@xref{Invoking autoscan, , , autoconf, the autoconf manual}.
@end ifnothtml
@ifhtml
See @uref{http://www.delorie.com/gnu/docs/autoconf/autoconf_4.html, the
autoscan documentation}.
@end ifhtml

Another handy tool for an existing body of code is @samp{ifnames}.  This
will show you all the preprocessor conditionals that the code already
uses.
@ifnothtml
@xref{Invoking ifnames, , , autoconf, the autoconf manual}.
@end ifnothtml
@ifhtml
See @uref{http://www.delorie.com/gnu/docs/autoconf/autoconf_5.html, the
ifnames documentation}.
@end ifhtml

Besides the portability tests which are specific to your particular
package, every @file{configure.in} file should contain the following
macros.

@table @samp
@item AC_INIT
@cindex @samp{AC_INIT}
This macro takes a single argument, which is the name of a file in your
package.  For example, @samp{AC_INIT(foo.c)}.

@item AC_PREREQ(@var{VERSION})
@cindex @samp{AC_PREREQ}
This macro is optional.  It may be used to indicate the version of
@samp{autoconf} that you are using.  This will prevent users from
running an earlier version of @samp{autoconf} and perhaps getting an
invalid @file{configure} script.  For example, @samp{AC_PREREQ(2.12)}.

@item AM_INIT_AUTOMAKE
@cindex @samp{AM_INIT_AUTOMAKE}
This macro takes two arguments: the name of the package, and a version
number.  For example, @samp{AM_INIT_AUTOMAKE(foo, 1.0)}.  (This macro is
not needed if you are not using automake).

@item AM_CONFIG_HEADER
@cindex @samp{AM_CONFIG_HEADER}
This macro names the header file which will hold the preprocessor macro
definitions at run time.  Normally this should be @file{config.h}.  Your
sources would then use @samp{#include "config.h"} to include it.

This macro may optionally name the input file for that header file; by
default, this is @file{config.h.in}, but that file name works poorly on
DOS filesystems.  Therefore, it is often better to name it explicitly as
@file{config.in}.

This is what you should normally put in @file{configure.in}:
@example
AM_CONFIG_HEADER(config.h:config.in)
@end example

@cindex @samp{AC_CONFIG_HEADER}
(If you are not using automake, use @samp{AC_CONFIG_HEADER} rather than
@samp{AM_CONFIG_HEADER}).

@item AM_MAINTAINER_MODE
@cindex @samp{AM_MAINTAINER_MODE}
This macro always appears in Cygnus configure scripts.  Other programs
may or may not use it.

If this macro is used, the @samp{--enable-maintainer-mode} option is
required to enable automatic rebuilding of generated files used by the
configure system.  This of course requires that developers be aware of,
and use, that option.

If this macro is not used, then the generated files will always be
rebuilt automatically.  This will cause problems if the wrong versions
of autoconf, automake, or others are in the builder's @samp{PATH}.

(If you are not using automake, you do not need to use this macro).

@item AC_EXEEXT
@cindex @samp{AC_EXEEXT}
@cindex @samp{AM_EXEEXT}
Either this macro or @samp{AM_EXEEXT} always appears in Cygnus configure
files.  Other programs may or may not use one of them.

This macro looks for the executable suffix used on the host system.  On
Unix systems, this is the empty string.  On Windows systems, this is
@samp{.exe}.  This macro directs automake to use the executable suffix
as appropriate when creating programs.  This macro does not take any
arguments.

The @samp{AC_EXEEXT} form is new, and is part of a Cygnus patch to
autoconf to support compiling with Visual C++.  Older programs use
@samp{AM_EXEEXT} instead.

(Programs which do not use automake use neither @samp{AC_EXEEXT} nor
@samp{AM_EXEEXT}).

@item AC_PROG_CC
@cindex @samp{AC_PROG_CC}
If you are writing C code, you will normally want to use this macro.  It
locates the C compiler to use.  It does not take any arguments.

However, if this @file{configure.in} file is for a library which is to
be compiled by a cross compiler which may not fully work, then you will
not want to use @samp{AC_PROG_CC}.  Instead, you will want to use a
variant which does not call the macro @samp{AC_PROG_CC_WORKS}.  Examples
can be found in various @file{configure.in} files for libraries that are
compiled with cross compilers, such as libiberty or libgloss.  This is
essentially a bug in autoconf, and there will probably be a better
workaround at some point.

@item AC_PROG_CXX
@cindex @samp{AC_PROG_CXX}
If you are writing C++ code, you will want to use this macro.  It
locates the C++ compiler to use.  It does not take any arguments.  The
same cross compiler comments apply as for @samp{AC_PROG_CC}.

@item AM_PROG_LIBTOOL
@cindex @samp{AM_PROG_LIBTOOL}
If you want to build libraries, and you want to permit them to be
shared, or you want to link against libraries which were built using
libtool, then you will need this macro.  This macro is required in order
to use libtool.

@cindex @samp{AM_DISABLE_SHARED}
By default, this will cause all libraries to be built as shared
libraries.  To prevent this--to change the default--use
@samp{AM_DISABLE_SHARED} before @samp{AM_PROG_LIBTOOL}.  The configure
options @samp{--enable-shared} and @samp{--disable-shared} may be used
to override the default at build time.

@item AC_DEFINE(_GNU_SOURCE)
@cindex @samp{_GNU_SOURCE}
GNU packages should normally include this line before any other feature
tests.  This defines the macro @samp{_GNU_SOURCE} when compiling, which
directs the libc header files to provide the standard GNU system
interfaces including all GNU extensions.  If this macro is not defined,
certain GNU extensions may not be available.

@item AC_OUTPUT
@cindex @samp{AC_OUTPUT}
This macro takes a list of file names which the configure process should
produce.  This is normally a list of one or more @file{Makefile} files
in different directories.  If your package lives entirely in a single
directory, you would use simply @samp{AC_OUTPUT(Makefile)}.  If you also
have, for example, a @file{lib} subdirectory, you would use
@samp{AC_OUTPUT(Makefile lib/Makefile)}.
@end table

If you want to use locally defined macros in your @file{configure.in}
file, then you will need to write a @file{acinclude.m4} file which
defines them (if not using automake, this file is called
@file{aclocal.m4}).  Alternatively, you can put separate macros in an
@file{m4} subdirectory, and put @samp{ACLOCAL_AMFLAGS = -I m4} in your
@file{Makefile.am} file so that the @samp{aclocal} program will be able
to find them.

The different macro prefixes indicate which tool defines the macro.
Macros which start with @samp{AC_} are part of autoconf.  Macros which
start with @samp{AM_} are provided by automake or libtool.

@node Write Makefile.am
@section Write Makefile.am
@cindex @file{Makefile.am}, writing

You must write the file @file{Makefile.am}.  This is an automake input
file, and the automake manual describes in detail what this file should
look like.

The automake commands in @file{Makefile.am} mostly look like variable
assignments in a @file{Makefile}.  automake recognizes special variable
names, and automatically add make rules to the output as needed.

There will be one @file{Makefile.am} file for each directory in your
package.  For each directory with subdirectories, the @file{Makefile.am}
file should contain the line
@smallexample
SUBDIRS = @var{dir} @var{dir} @dots{}
@end smallexample
@noindent
where each @var{dir} is the name of a subdirectory.

For each @file{Makefile.am}, there should be a corresponding
@file{Makefile} in the @samp{AC_OUTPUT} macro in @file{configure.in}.

Every @file{Makefile.am} written at Cygnus should contain the line
@smallexample
AUTOMAKE_OPTIONS = cygnus
@end smallexample
@noindent
This puts automake into Cygnus mode.  See the automake manual for
details.

You may to include the version number of @samp{automake} that you are
using on the @samp{AUTOMAKE_OPTIONS} line.  For example,
@smallexample
AUTOMAKE_OPTIONS = cygnus 1.3
@end smallexample
@noindent
This will prevent users from running an earlier version of
@samp{automake} and perhaps getting an invalid @file{Makefile.in}.

If your package builds a program, then in the directory where that
program is built you will normally want a line like
@smallexample
bin_PROGRAMS = @var{program}
@end smallexample
@noindent
where @var{program} is the name of the program.  You will then want a
line like
@smallexample
@var{program}_SOURCES = @var{file} @var{file} @dots{}
@end smallexample
@noindent
where each @var{file} is the name of a source file to link into the
program (e.g., @samp{foo.c}).

If your package builds a library, and you do not want the library to
ever be built as a shared library, then in the directory where that
library is built you will normally want a line like
@smallexample
lib_LIBRARIES = lib@var{name}.a
@end smallexample
@noindent
where @samp{lib@var{name}.a} is the name of the library.  You will then
want a line like
@smallexample
lib@var{name}_a_SOURCES = @var{file} @var{file} @dots{}
@end smallexample
@noindent
where each @var{file} is the name of a source file to add to the
library.

If your package builds a library, and you want to permit building the
library as a shared library, then in the directory where that library is
built you will normally want a line like
@smallexample
lib_LTLIBRARIES = lib@var{name}.la
@end smallexample
The use of @samp{LTLIBRARIES}, and the @samp{.la} extension, indicate a
library to be built using libtool.  As usual, you will then want a line
like
@smallexample
lib@var{name}_la_SOURCES = @var{file} @var{file} @dots{}
@end smallexample

The strings @samp{bin} and @samp{lib} that appear above in
@samp{bin_PROGRAMS} and @samp{lib_LIBRARIES} are not arbitrary.  They
refer to particular directories, which may be set by the @samp{--bindir}
and @samp{--libdir} options to @file{configure}.  If those options are
not used, the default values are based on the @samp{--prefix} or
@samp{--exec-prefix} options to @file{configure}.  It is possible to use
other names if the program or library should be installed in some other
directory.

The @file{Makefile.am} file may also contain almost anything that may
appear in a normal @file{Makefile}.  automake also supports many other
special variables, as well as conditionals.

See the automake manual for more information.

@node Write acconfig.h
@section Write acconfig.h
@cindex @file{acconfig.h}, writing

If you are generating a portability header file, (i.e., you are using
@samp{AM_CONFIG_HEADER} in @file{configure.in}), then you will have to
write a @file{acconfig.h} file.  It will have to contain the following
lines.

@smallexample
/* Name of package.  */
#undef PACKAGE

/* Version of package.  */
#undef VERSION
@end smallexample

This requirement is really a bug in the system, and the requirement may
be eliminated at some later date.

The @file{acconfig.h} file will also similar comment and @samp{#undef}
lines for any unusual macros in the @file{configure.in} file, including
any macro which appears in a @samp{AC_DEFINE} macro.

In particular, if you are writing a GNU package and therefore include
@samp{AC_DEFINE(_GNU_SOURCE)} in @file{configure.in} as suggested above,
you will need lines like this in @file{acconfig.h}:
@smallexample
/* Enable GNU extensions.  */
#undef _GNU_SOURCE
@end smallexample

Normally the @samp{autoheader} program will inform you of any such
requirements by printing an error message when it is run.  However, if
you do anything particular odd in your @file{configure.in} file, you
will have to make sure that the right entries appear in
@file{acconfig.h}, since otherwise the results of the tests may not be
available in the @file{config.h} file which your code will use.

(Thee @samp{PACKAGE} and @samp{VERSION} lines are not required if you
are not using automake, and in that case you may not need a
@file{acconfig.h} file at all).

@node Generate files
@section Generate files

Once you have written @file{configure.in}, @file{Makefile.am},
@file{acconfig.h}, and possibly @file{acinclude.m4}, you must use
autoconf and automake programs to produce the first versions of the
generated files.  This is done by executing the following sequence of
commands.

@smallexample
aclocal
autoconf
autoheader
automake
@end smallexample

The @samp{aclocal} and @samp{automake} commands are part of the automake
package, and the @samp{autoconf} and @samp{autoheader} commands are part
of the autoconf package.

If you are using a @file{m4} subdirectory for your macros, you will need
to use the @samp{-I m4} option when you run @samp{aclocal}.

If you are not using the Cygnus tree, use the @samp{-a} option when
running @samp{automake} command in order to copy the required support
files into your source directory.

If you are using libtool, you must build and install the libtool package
with the same @samp{--prefix} and @samp{--exec-prefix} options as you
used with the autoconf and automake packages.  You must do this before
running any of the above commands.  If you are not using the Cygnus
tree, you will need to run the @samp{libtoolize} program to copy the
libtool support files into your directory.

Once you have managed to run these commands without getting any errors,
you should create a new empty directory, and run the @samp{configure}
script which will have been created by @samp{autoconf} with the
@samp{--enable-maintainer-mode} option.  This will give you a set of
Makefiles which will include rules to automatically rebuild all the
generated files.

After doing that, whenever you have changed some of the input files and
want to regenerated the other files, go to your object directory and run
@samp{make}.  Doing this is more reliable than trying to rebuild the
files manually, because there are complex order dependencies and it is
easy to forget something.

@node Getting Started Example
@section Example

Let's consider a trivial example.

Suppose we want to write a simple version of @samp{touch}.  Our program,
which we will call @samp{poke}, will take a single file name argument,
and use the @samp{utime} system call to set the modification and access
times of the file to the current time.  We want this program to be
highly portable.

We'll first see what this looks like without using autoconf and
automake, and then see what it looks like with them.

@menu
* Getting Started Example 1::		First Try.
* Getting Started Example 2::		Second Try.
* Getting Started Example 3::		Third Try.
* Generate Files in Example::		Generate Files.
@end menu

@node Getting Started Example 1
@subsection First Try

Here is our first try at @samp{poke.c}.  Note that we've written it
without ANSI/ISO C prototypes, since we want it to be highly portable.

@example
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <utime.h>

int
main (argc, argv)
     int argc;
     char **argv;
@{
  if (argc != 2)
    @{
      fprintf (stderr, "Usage: poke file\n");
      exit (1);
    @}

  if (utime (argv[1], NULL) < 0)
    @{
      perror ("utime");
      exit (1);
    @}

  exit (0);
@}
@end example

We also write a simple @file{Makefile}.

@example
CC = gcc
CFLAGS = -g -O2

all: poke

poke: poke.o
	$(CC) -o poke $(CFLAGS) $(LDFLAGS) poke.o
@end example

So far, so good.

Unfortunately, there are a few problems.

On older Unix systems derived from BSD 4.3, the @samp{utime} system call
does not accept a second argument of @samp{NULL}.  On those systems, we
need to pass a pointer to @samp{struct utimbuf} structure.
Unfortunately, even older systems don't define that structure; on those
systems, we need to pass an array of two @samp{long} values.

The header file @file{stdlib.h} was invented by ANSI C, and older
systems don't have a copy.  We included it above to get a declaration of
@samp{exit}.

We can find some of these portability problems by running
@samp{autoscan}, which will create a @file{configure.scan} file which we
can use as a prototype for our @file{configure.in} file.  I won't show
the output, but it will notice the potential problems with @samp{utime}
and @file{stdlib.h}.

In our @file{Makefile}, we don't provide any way to install the program.
This doesn't matter much for such a simple example, but a real program
will need an @samp{install} target.  For that matter, we will also want
a @samp{clean} target.

@node Getting Started Example 2
@subsection Second Try

Here is our second try at this program.

We modify @file{poke.c} to use preprocessor macros to control what
features are available.  (I've cheated a bit by using the same macro
names which autoconf will use).

@example
#include <stdio.h>

#ifdef STDC_HEADERS
#include <stdlib.h>
#endif

#include <sys/types.h>

#ifdef HAVE_UTIME_H
#include <utime.h>
#endif

#ifndef HAVE_UTIME_NULL

#include <time.h>

#ifndef HAVE_STRUCT_UTIMBUF

struct utimbuf
@{
  long actime;
  long modtime;
@};

#endif

static int
utime_now (file)
     char *file;
@{
  struct utimbuf now;

  now.actime = now.modtime = time (NULL);
  return utime (file, &now);
@}

#define utime(f, p) utime_now (f)

#endif /* HAVE_UTIME_NULL  */

int
main (argc, argv)
     int argc;
     char **argv;
@{
  if (argc != 2)
    @{
      fprintf (stderr, "Usage: poke file\n");
      exit (1);
    @}

  if (utime (argv[1], NULL) < 0)
    @{
      perror ("utime");
      exit (1);
    @}

  exit (0);
@}
@end example

Here is the associated @file{Makefile}.  We've added support for the
preprocessor flags we use.  We've also added @samp{install} and
@samp{clean} targets.

@example
# Set this to your installation directory.
bindir = /usr/local/bin

# Uncomment this if you have the standard ANSI/ISO C header files.
# STDC_HDRS = -DSTDC_HEADERS

# Uncomment this if you have utime.h.
# UTIME_H = -DHAVE_UTIME_H

# Uncomment this if utime (FILE, NULL) works on your system.
# UTIME_NULL = -DHAVE_UTIME_NULL

# Uncomment this if struct utimbuf is defined in utime.h.
# UTIMBUF = -DHAVE_STRUCT_UTIMBUF

CC = gcc
CFLAGS = -g -O2

ALL_CFLAGS = $(STDC_HDRS) $(UTIME_H) $(UTIME_NULL) $(UTIMBUF) $(CFLAGS)

all: poke

poke: poke.o
	$(CC) -o poke $(ALL_CFLAGS) $(LDFLAGS) poke.o

.c.o:
	$(CC) -c $(ALL_CFLAGS) poke.c

install: poke
	cp poke $(bindir)/poke

clean:
	rm poke poke.o
@end example

Some problems with this approach should be clear.

Users who want to compile poke will have to know how @samp{utime} works
on their systems, so that they can uncomment the @file{Makefile}
correctly.

The installation is done using @samp{cp}, but many systems have an
@samp{install} program which may be used, and which supports optional
features such as stripping debugging information out of the installed
binary.

The use of @file{Makefile} variables like @samp{CC}, @samp{CFLAGS} and
@samp{LDFLAGS} follows the requirements of the GNU standards.  This is
convenient for all packages, since it reduces surprises for users.
However, it is easy to get the details wrong, and wind up with a
slightly nonstandard distribution.

@node Getting Started Example 3
@subsection Third Try

For our third try at this program, we will write a @file{configure.in}
script to discover the configuration features on the host system, rather
than requiring the user to edit the @file{Makefile}.  We will also write
a @file{Makefile.am} rather than a @file{Makefile}.

The only change to @file{poke.c} is to add a line at the start of the
file:
@smallexample
#include "config.h"
@end smallexample

The new @file{configure.in} file is as follows.

@example
AC_INIT(poke.c)
AM_INIT_AUTOMAKE(poke, 1.0)
AM_CONFIG_HEADER(config.h:config.in)
AC_PROG_CC
AC_HEADER_STDC
AC_CHECK_HEADERS(utime.h)
AC_EGREP_HEADER(utimbuf, utime.h, AC_DEFINE(HAVE_STRUCT_UTIMBUF))
AC_FUNC_UTIME_NULL
AC_OUTPUT(Makefile)
@end example

The first four macros in this file, and the last one, were described
above; see @ref{Write configure.in}.  If we omit these macros, then when
we run @samp{automake} we will get a reminder that we need them.

The other macros are standard autoconf macros.

@table @samp
@item AC_HEADER_STDC
Check for standard C headers.
@item AC_CHECK_HEADERS
Check whether a particular header file exists.
@item AC_EGREP_HEADER
Check for a particular string in a particular header file, in this case
checking for @samp{utimbuf} in @file{utime.h}.
@item AC_FUNC_UTIME_NULL
Check whether @samp{utime} accepts a NULL second argument to set the
file change time to the current time.
@end table

See the autoconf manual for a more complete description.

The new @file{Makefile.am} file is as follows.  Note how simple this is
compared to our earlier @file{Makefile}.

@example
bin_PROGRAMS = poke

poke_SOURCES = poke.c
@end example

This means that we should build a single program name @samp{poke}.  It
should be installed in the binary directory, which we called
@samp{bindir} earlier.  The program @samp{poke} is built from the source
file @file{poke.c}.

We must also write a @file{acconfig.h} file.  Besides @samp{PACKAGE} and
@samp{VERSION}, which must be mentioned for all packages which use
automake, we must include @samp{HAVE_STRUCT_UTIMBUF}, since we mentioned
it in an @samp{AC_DEFINE}.

@example
/* Name of package.  */
#undef PACKAGE

/* Version of package.  */
#undef VERSION

/* Whether utime.h defines struct utimbuf.  */
#undef HAVE_STRUCT_UTIMBUF
@end example

@node Generate Files in Example
@subsection Generate Files

We must now generate the other files, using the following commands.

@smallexample
aclocal
autoconf
autoheader
automake
@end smallexample

When we run @samp{autoheader}, it will remind us of any macros we forgot
to add to @file{acconfig.h}.

When we run @samp{automake}, it will want to add some files to our
distribution.  It will add them automatically if we use the
@samp{--add-missing} option.

By default, @samp{automake} will run in GNU mode, which means that it
will want us to create certain additional files; as of this writing, it
will want @file{NEWS}, @file{README}, @file{AUTHORS}, and
@file{ChangeLog}, all of which are files which should appear in a
standard GNU distribution.  We can either add those files, or run
@samp{automake} with the @samp{--foreign} option.

Running these tools will generate the following files, all of which are
described in the next chapter.

@itemize @bullet
@item
@file{aclocal.m4}
@item
@file{configure}
@item
@file{config.in}
@item
@file{Makefile.in}
@item
@file{stamp-h.in}
@end itemize

@node Files
@chapter Files

As was seen in the previous chapter, the GNU configure and build system
uses a number of different files.  The developer must write a few files.
The others are generated by various tools.

The system is rather flexible, and can be used in many different ways.
In describing the files that it uses, I will describe the common case,
and mention some other cases that may arise.

@menu
* Developer Files::		Developer Files.
* Build Files::			Build Files.
* Support Files::		Support Files.
@end menu

@node Developer Files
@section Developer Files

This section describes the files written or generated by the developer
of a package.

@menu
* Developer Files Picture::	Developer Files Picture.
* Written Developer Files::	Written Developer Files.
* Generated Developer Files::	Generated Developer Files.
@end menu

@node Developer Files Picture
@subsection Developer Files Picture

Here is a picture of the files which are written by the developer, the
generated files which would be included with a complete source
distribution, and the tools which create those files.
@ifinfo
The file names are plain text and the tool names are enclosed by
@samp{*} characters
@end ifinfo
@ifnotinfo
The file names are in rectangles with square corners and the tool names
are in rectangles with rounded corners
@end ifnotinfo
(e.g., @samp{autoheader} is the name of a tool, not the name of a file).

@image{configdev,,,,jpg}

@node Written Developer Files
@subsection Written Developer Files

The following files would be written by the developer.

@table @file
@item configure.in
@cindex @file{configure.in}
This is the configuration script.  This script contains invocations of
autoconf macros.  It may also contain ordinary shell script code.  This
file will contain feature tests for portability issues.  The last thing
in the file will normally be an @samp{AC_OUTPUT} macro listing which
files to create when the builder runs the configure script.  This file
is always required when using the GNU configure system.  @xref{Write
configure.in}.

@item Makefile.am
@cindex @file{Makefile.am}
This is the automake input file.  It describes how the code should be
built.  It consists of definitions of automake variables.  It may also
contain ordinary Makefile targets.  This file is only needed when using
automake (newer tools normally use automake, but there are still older
tools which have not been converted, in which the developer writes
@file{Makefile.in} directly).  @xref{Write Makefile.am}.

@item acconfig.h
@cindex @file{acconfig.h}
When the configure script creates a portability header file, by using
@samp{AM_CONFIG_HEADER} (or, if not using automake,
@samp{AC_CONFIG_HEADER}), this file is used to describe macros which are
not recognized by the @samp{autoheader} command.  This is normally a
fairly uninteresting file, consisting of a collection of @samp{#undef}
lines with comments.  Normally any call to @samp{AC_DEFINE} in
@file{configure.in} will require a line in this file. @xref{Write
acconfig.h}.

@item acinclude.m4
@cindex @file{acinclude.m4}
This file is not always required.  It defines local autoconf macros.
These macros may then be used in @file{configure.in}.  If you don't need
any local autoconf macros, then you don't need this file at all.  In
fact, in general, you never need local autoconf macros, since you can
put everything in @file{configure.in}, but sometimes a local macro is
convenient.

Newer tools may omit @file{acinclude.m4}, and instead use a
subdirectory, typically named @file{m4}, and define
@samp{ACLOCAL_AMFLAGS = -I m4} in @file{Makefile.am} to force
@samp{aclocal} to look there for macro definitions.  The macro
definitions are then placed in separate files in that directory.

The @file{acinclude.m4} file is only used when using automake; in older
tools, the developer writes @file{aclocal.m4} directly, if it is needed.
@end table

@node Generated Developer Files
@subsection Generated Developer Files

The following files would be generated by the developer.

When using automake, these files are normally not generated manually
after the first time.  Instead, the generated @file{Makefile} contains
rules to automatically rebuild the files as required.  When
@samp{AM_MAINTAINER_MODE} is used in @file{configure.in} (the normal
case in Cygnus code), the automatic rebuilding rules will only be
defined if you configure using the @samp{--enable-maintainer-mode}
option.

When using automatic rebuilding, it is important to ensure that all the
various tools have been built and installed on your @samp{PATH}.  Using
automatic rebuilding is highly recommended, so much so that I'm not
going to explain what you have to do if you don't use it.

@table @file
@item configure
@cindex @file{configure}
This is the configure script which will be run when building the
package.  This is generated by @samp{autoconf} from @file{configure.in}
and @file{aclocal.m4}.  This is a shell script.

@item Makefile.in
@cindex @file{Makefile.in}
This is the file which the configure script will turn into the
@file{Makefile} at build time.  This file is generated by
@samp{automake} from @file{Makefile.am}.  If you aren't using automake,
you must write this file yourself.  This file is pretty much a normal
@file{Makefile}, with some configure substitutions for certain
variables.

@item aclocal.m4
@cindex @file{aclocal.m4}
This file is created by the @samp{aclocal} program, based on the
contents of @file{configure.in} and @file{acinclude.m4} (or, as noted in
the description of @file{acinclude.m4} above, on the contents of an
@file{m4} subdirectory).  This file contains definitions of autoconf
macros which @samp{autoconf} will use when generating the file
@file{configure}.  These autoconf macros may be defined by you in
@file{acinclude.m4} or they may be defined by other packages such as
automake, libtool or gettext.  If you aren't using automake, you will
normally write this file yourself; in that case, if @file{configure.in}
uses only standard autoconf macros, this file will not be needed at all.

@item config.in
@cindex @file{config.in}
@cindex @file{config.h.in}
This file is created by @samp{autoheader} based on @file{acconfig.h} and
@file{configure.in}.  At build time, the configure script will define
some of the macros in it to create @file{config.h}, which may then be
included by your program.  This permits your C code to use preprocessor
conditionals to change its behaviour based on the characteristics of the
host system.  This file may also be called @file{config.h.in}.

@item stamp.h-in
@cindex @file{stamp-h.in}
This rather uninteresting file, which I omitted from the picture, is
generated by @samp{automake}.  It always contains the string
@samp{timestamp}.  It is used as a timestamp file indicating whether
@file{config.in} is up to date.  Using a timestamp file means that
@file{config.in} can be marked as up to date without actually changing
its modification time.  This is useful since @file{config.in} depends
upon @file{configure.in}, but it is easy to change @file{configure.in}
in a way which does not affect @file{config.in}.
@end table

@node Build Files
@section Build Files

This section describes the files which are created at configure and
build time.  These are the files which somebody who builds the package
will see.

Of course, the developer will also build the package.  The distinction
between developer files and build files is not that the developer does
not see the build files, but that somebody who only builds the package
does not have to worry about the developer files.

@menu
* Build Files Picture::		Build Files Picture.
* Build Files Description::	Build Files Description.
@end menu

@node Build Files Picture
@subsection Build Files Picture

Here is a picture of the files which will be created at build time.
@file{config.status} is both a created file and a shell script which is
run to create other files, and the picture attempts to show that.

@image{configbuild,,,,jpg}

@node Build Files Description
@subsection Build Files Description

This is a description of the files which are created at build time.

@table @file
@item config.status
@cindex @file{config.status}
The first step in building a package is to run the @file{configure}
script.  The @file{configure} script will create the file
@file{config.status}, which is itself a shell script.  When you first
run @file{configure}, it will automatically run @file{config.status}.
An @file{Makefile} derived from an automake generated @file{Makefile.in}
will contain rules to automatically run @file{config.status} again when
necessary to recreate certain files if their inputs change.

@item Makefile
@cindex @file{Makefile}
This is the file which make will read to build the program.  The
@file{config.status} script will transform @file{Makefile.in} into
@file{Makefile}.

@item config.h
@cindex @file{config.h}
This file defines C preprocessor macros which C code can use to adjust
its behaviour on different systems.  The @file{config.status} script
will transform @file{config.in} into @file{config.h}.

@item config.cache
@cindex @file{config.cache}
This file did not fit neatly into the picture, and I omitted it.  It is
used by the @file{configure} script to cache results between runs.  This
can be an important speedup.  If you modify @file{configure.in} in such
a way that the results of old tests should change (perhaps you have
added a new library to @samp{LDFLAGS}), then you will have to remove
@file{config.cache} to force the tests to be rerun.

The autoconf manual explains how to set up a site specific cache file.
This can speed up running @file{configure} scripts on your system.

@item stamp.h
@cindex @file{stamp-h}
This file, which I omitted from the picture, is similar to
@file{stamp-h.in}.  It is used as a timestamp file indicating whether
@file{config.h} is up to date.  This is useful since @file{config.h}
depends upon @file{config.status}, but it is easy for
@file{config.status} to change in a way which does not affect
@file{config.h}.
@end table

@node Support Files
@section Support Files

The GNU configure and build system requires several support files to be
included with your distribution.  You do not normally need to concern
yourself with these.  If you are using the Cygnus tree, most are already
present.  Otherwise, they will be installed with your source by
@samp{automake} (with the @samp{--add-missing} option) and
@samp{libtoolize}.

You don't have to put the support files in the top level directory.  You
can put them in a subdirectory, and use the @samp{AC_CONFIG_AUX_DIR}
macro in @file{configure.in} to tell @samp{automake} and the
@file{configure} script where they are.

In this section, I describe the support files, so that you can know what
they are and why they are there.

@table @file
@item ABOUT-NLS
Added by automake if you are using gettext.  This is a documentation
file about the gettext project.
@item ansi2knr.c
Used by an automake generated @file{Makefile} if you put @samp{ansi2knr}
in @samp{AUTOMAKE_OPTIONS} in @file{Makefile.am}.  This permits
compiling ANSI C code with a K&R C compiler.
@item ansi2knr.1
The man page which goes with @file{ansi2knr.c}.
@item config.guess
A shell script which determines the configuration name for the system on
which it is run.
@item config.sub
A shell script which canonicalizes a configuration name entered by a
user.
@item elisp-comp
Used to compile Emacs LISP files.
@item install-sh
A shell script which installs a program.  This is used if the configure
script can not find an install binary.
@item ltconfig
Used by libtool.  This is a shell script which configures libtool for
the particular system on which it is used.
@item ltmain.sh
Used by libtool.  This is the actual libtool script which is used, after
it is configured by @file{ltconfig} to build a library.
@item mdate-sh
A shell script used by an automake generated @file{Makefile} to pretty
print the modification time of a file.  This is used to maintain version
numbers for texinfo files.
@item missing
A shell script used if some tool is missing entirely.  This is used by
an automake generated @file{Makefile} to avoid certain sorts of
timestamp problems.
@item mkinstalldirs
A shell script which creates a directory, including all parent
directories.  This is used by an automake generated @file{Makefile}
during installation.
@item texinfo.tex
Required if you have any texinfo files.  This is used when converting
Texinfo files into DVI using @samp{texi2dvi} and @TeX{}.
@item ylwrap
A shell script used by an automake generated @file{Makefile} to run
programs like @samp{bison}, @samp{yacc}, @samp{flex}, and @samp{lex}.
These programs default to producing output files with a fixed name, and
the @file{ylwrap} script runs them in a subdirectory to avoid file name
conflicts when using a parallel make program.
@end table

@node Configuration Names
@chapter Configuration Names
@cindex configuration names
@cindex configuration triplets
@cindex triplets
@cindex host names
@cindex host triplets
@cindex canonical system names
@cindex system names
@cindex system types

The GNU configure system names all systems using a @dfn{configuration
name}.  All such names used to be triplets (they may now contain four
parts in certain cases), and the term @dfn{configuration triplet} is
still seen.

@menu
* Configuration Name Definition::	Configuration Name Definition.
* Using Configuration Names::		Using Configuration Names.
@end menu

@node Configuration Name Definition
@section Configuration Name Definition

This is a string of the form
@var{cpu}-@var{manufacturer}-@var{operating_system}.  In some cases,
this is extended to a four part form:
@var{cpu}-@var{manufacturer}-@var{kernel}-@var{operating_system}.

When using a configuration name in a configure option, it is normally
not necessary to specify an entire name.  In particular, the
@var{manufacturer} field is often omitted, leading to strings such as
@samp{i386-linux} or @samp{sparc-sunos}.  The shell script
@file{config.sub} will translate these shortened strings into the
canonical form.  autoconf will arrange for @file{config.sub} to be run
automatically when it is needed.

The fields of a configuration name are as follows:

@table @var
@item cpu
The type of processor.  This is typically something like @samp{i386} or
@samp{sparc}.  More specific variants are used as well, such as
@samp{mipsel} to indicate a little endian MIPS processor.
@item manufacturer
A somewhat freeform field which indicates the manufacturer of the
system.  This is often simply @samp{unknown}.  Other common strings are
@samp{pc} for an IBM PC compatible system, or the name of a workstation
vendor, such as @samp{sun}.
@item operating_system
The name of the operating system which is run on the system.  This will
be something like @samp{solaris2.5} or @samp{irix6.3}.  There is no
particular restriction on the version number, and strings like
@samp{aix4.1.4.0} are seen.  For an embedded system, which has no
operating system, this field normally indicates the type of object file
format, such as @samp{elf} or @samp{coff}.
@item kernel
This is used mainly for GNU/Linux.  A typical GNU/Linux configuration
name is @samp{i586-pc-linux-gnulibc1}.  In this case the kernel,
@samp{linux}, is separated from the operating system, @samp{gnulibc1}.
@end table

The shell script @file{config.guess} will normally print the correct
configuration name for the system on which it is run.  It does by
running @samp{uname} and by examining other characteristics of the
system.

Because @file{config.guess} can normally determine the configuration
name for a machine, it is normally only necessary to specify a
configuration name when building a cross-compiler or when building using
a cross-compiler.

@node Using Configuration Names
@section Using Configuration Names

A configure script will sometimes have to make a decision based on a
configuration name.  You will need to do this if you have to compile
code differently based on something which can not be tested using a
standard autoconf feature test.

It is normally better to test for particular features, rather than to
test for a particular system.  This is because as Unix evolves,
different systems copy features from one another.  Even if you need to
determine whether the feature is supported based on a configuration
name, you should define a macro which describes the feature, rather than
defining a macro which describes the particular system you are on.

Testing for a particular system is normally done using a case statement
in @file{configure.in}.  The case statement might look something like
the following, assuming that @samp{host} is a shell variable holding a
canonical configuration name (which will be the case if
@file{configure.in} uses the @samp{AC_CANONICAL_HOST} or
@samp{AC_CANONICAL_SYSTEM} macro).

@smallexample
case "$@{host@}" in
i[3-7]86-*-linux-gnu*) do something ;;
sparc*-sun-solaris2.[56789]*) do something ;;
sparc*-sun-solaris*) do something ;;
mips*-*-elf*) do something ;;
esac
@end smallexample

It is particularly important to use @samp{*} after the operating system
field, in order to match the version number which will be generated by
@file{config.guess}.

In most cases you must be careful to match a range of processor types.
For most processor families, a trailing @samp{*} suffices, as in
@samp{mips*} above.  For the i386 family, something along the lines of
@samp{i[3-7]86} suffices at present.  For the m68k family, you will
need something like @samp{m68*}.  Of course, if you do not need to match
on the processor, it is simpler to just replace the entire field by a
@samp{*}, as in @samp{*-*-irix*}.

@node Cross Compilation Tools
@chapter Cross Compilation Tools
@cindex cross tools

The GNU configure and build system can be used to build @dfn{cross
compilation} tools.  A cross compilation tool is a tool which runs on
one system and produces code which runs on another system.

@menu
* Cross Compilation Concepts::		Cross Compilation Concepts.
* Host and Target::			Host and Target.
* Using the Host Type::			Using the Host Type.
* Specifying the Target::       	Specifying the Target.
* Using the Target Type::		Using the Target Type.
* Cross Tools in the Cygnus Tree::	Cross Tools in the Cygnus Tree
@end menu

@node Cross Compilation Concepts
@section Cross Compilation Concepts

@cindex cross compiler
A compiler which produces programs which run on a different system is a
cross compilation compiler, or simply a @dfn{cross compiler}.
Similarly, we speak of cross assemblers, cross linkers, etc.

In the normal case, a compiler produces code which runs on the same
system as the one on which the compiler runs.  When it is necessary to
distinguish this case from the cross compilation case, such a compiler
is called a @dfn{native compiler}.  Similarly, we speak of native
assemblers, etc.

Although the debugger is not strictly speaking a compilation tool, it is
nevertheless meaningful to speak of a cross debugger: a debugger which
is used to debug code which runs on another system.  Everything that is
said below about configuring cross compilation tools applies to the
debugger as well.

@node Host and Target
@section Host and Target
@cindex host system
@cindex target system

When building cross compilation tools, there are two different systems
involved: the system on which the tools will run, and the system for
which the tools generate code.

The system on which the tools will run is called the @dfn{host} system.

The system for which the tools generate code is called the @dfn{target}
system.

For example, suppose you have a compiler which runs on a GNU/Linux
system and generates ELF programs for a MIPS embedded system.  In this
case the GNU/Linux system is the host, and the MIPS ELF system is the
target.  Such a compiler could be called a GNU/Linux cross MIPS ELF
compiler, or, equivalently, a @samp{i386-linux-gnu} cross
@samp{mips-elf} compiler.

Naturally, most programs are not cross compilation tools.  For those
programs, it does not make sense to speak of a target.  It only makes
sense to speak of a target for tools like @samp{gcc} or the
@samp{binutils} which actually produce running code.  For example, it
does not make sense to speak of the target of a tool like @samp{bison}
or @samp{make}.

Most cross compilation tools can also serve as native tools.  For a
native compilation tool, it is still meaningful to speak of a target.
For a native tool, the target is the same as the host.  For example, for
a GNU/Linux native compiler, the host is GNU/Linux, and the target is
also GNU/Linux.

@node Using the Host Type
@section Using the Host Type

In almost all cases the host system is the system on which you run the
@samp{configure} script, and on which you build the tools (for the case
when they differ, @pxref{Canadian Cross}).

@cindex @samp{AC_CANONICAL_HOST}
If your configure script needs to know the configuration name of the
host system, and the package is not a cross compilation tool and
therefore does not have a target, put @samp{AC_CANONICAL_HOST} in
@file{configure.in}.  This macro will arrange to define a few shell
variables when the @samp{configure} script is run.

@table @samp
@item host
The canonical configuration name of the host.  This will normally be
determined by running the @file{config.guess} shell script, although the
user is permitted to override this by using an explicit @samp{--host}
option.
@item host_alias
In the unusual case that the user used an explicit @samp{--host} option,
this will be the argument to @samp{--host}.  In the normal case, this
will be the same as the @samp{host} variable.
@item host_cpu
@itemx host_vendor
@itemx host_os
The first three parts of the canonical configuration name.
@end table

The shell variables may be used by putting shell code in
@file{configure.in}.  For an example, see @ref{Using Configuration
Names}.

@node Specifying the Target
@section Specifying the Target

By default, the @samp{configure} script will assume that the target is
the same as the host.  This is the more common case; for example, it
leads to a native compiler rather than a cross compiler.

@cindex @samp{--target} option
@cindex target option
@cindex configure target
If you want to build a cross compilation tool, you must specify the
target explicitly by using the @samp{--target} option when you run
@samp{configure}.  The argument to @samp{--target} is the configuration
name of the system for which you wish to generate code.
@xref{Configuration Names}.

For example, to build tools which generate code for a MIPS ELF embedded
system, you would use @samp{--target mips-elf}.

@node Using the Target Type
@section Using the Target Type

@cindex @samp{AC_CANONICAL_SYSTEM}
When writing @file{configure.in} for a cross compilation tool, you will
need to use information about the target.  To do this, put
@samp{AC_CANONICAL_SYSTEM} in @file{configure.in}.

@samp{AC_CANONICAL_SYSTEM} will look for a @samp{--target} option and
canonicalize it using the @file{config.sub} shell script.  It will also
run @samp{AC_CANONICAL_HOST} (@pxref{Using the Host Type}).

The target type will be recorded in the following shell variables.  Note
that the host versions of these variables will also be defined by
@samp{AC_CANONICAL_HOST}.

@table @samp
@item target
The canonical configuration name of the target.
@item target_alias
The argument to the @samp{--target} option.  If the user did not specify
a @samp{--target} option, this will be the same as @samp{host_alias}.
@item target_cpu
@itemx target_vendor
@itemx target_os
The first three parts of the canonical target configuration name.
@end table

Note that if @samp{host} and @samp{target} are the same string, you can
assume a native configuration.  If they are different, you can assume a
cross configuration.

It is arguably possible for @samp{host} and @samp{target} to represent
the same system, but for the strings to not be identical.  For example,
if @samp{config.guess} returns @samp{sparc-sun-sunos4.1.4}, and somebody
configures with @samp{--target sparc-sun-sunos4.1}, then the slight
differences between the two versions of SunOS may be unimportant for
your tool.  However, in the general case it can be quite difficult to
determine whether the differences between two configuration names are
significant or not.  Therefore, by convention, if the user specifies a
@samp{--target} option without specifying a @samp{--host} option, it is
assumed that the user wants to configure a cross compilation tool.

The variables @samp{target} and @samp{target_alias} should be handled
differently.

In general, whenever the user may actually see a string,
@samp{target_alias} should be used.  This includes anything which may
appear in the file system, such as a directory name or part of a tool
name.  It also includes any tool output, unless it is clearly labelled
as the canonical target configuration name.  This permits the user to
use the @samp{--target} option to specify how the tool will appear to
the outside world.

On the other hand, when checking for characteristics of the target
system, @samp{target} should be used.  This is because a wide variety of
@samp{--target} options may map into the same canonical configuration
name.  You should not attempt to duplicate the canonicalization done by
@samp{config.sub} in your own code.

By convention, cross tools are installed with a prefix of the argument
used with the @samp{--target} option, also known as @samp{target_alias}
(@pxref{Using the Target Type}).  If the user does not use the
@samp{--target} option, and thus is building a native tool, no prefix is
used.

For example, if gcc is configured with @samp{--target mips-elf}, then
the installed binary will be named @samp{mips-elf-gcc}.  If gcc is
configured without a @samp{--target} option, then the installed binary
will be named @samp{gcc}.

The autoconf macro @samp{AC_ARG_PROGRAM} will handle this for you.  If
you are using automake, no more need be done; the programs will
automatically be installed with the correct prefixes.  Otherwise, see
the autoconf documentation for @samp{AC_ARG_PROGRAM}.

@node Cross Tools in the Cygnus Tree
@section Cross Tools in 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.

In the Cygnus tree, the top level @file{configure} script uses the old
Cygnus configure system, not autoconf.  The top level @file{Makefile.in}
is written to build packages based on what is in the source tree, and
supports building a large number of tools in a single
@samp{configure}/@samp{make} step.

The Cygnus tree may be configured with a @samp{--target} option.  The
@samp{--target} option applies recursively to every subdirectory, and
permits building an entire set of cross tools at once.

@menu
* Host and Target Libraries::		Host and Target Libraries.
* Target Library Configure Scripts::	Target Library Configure Scripts.
* Make Targets in Cygnus Tree::         Make Targets in Cygnus Tree.
* Target libiberty::			Target libiberty
@end menu

@node Host and Target Libraries
@subsection Host and Target Libraries

The Cygnus tree distinguishes host libraries from target libraries.

Host libraries are built with the compiler used to build the programs
which run on the host, which is called the host compiler.  This includes
libraries such as @samp{bfd} and @samp{tcl}.  These libraries are built
with the host compiler, and are linked into programs like the binutils
or gcc which run on the host.

Target libraries are built with the target compiler.  If gcc is present
in the source tree, then the target compiler is the gcc that is built
using the host compiler.  Target libraries are libraries such as
@samp{newlib} and @samp{libstdc++}.  These libraries are not linked into
the host programs, but are instead made available for use with programs
built with the target compiler.

For the rest of this section, assume that gcc is present in the source
tree, so that it will be used to build the target libraries.

There is a complication here.  The configure process needs to know which
compiler you are going to use to build a tool; otherwise, the feature
tests will not work correctly.  The Cygnus tree handles this by not
configuring the target libraries until the target compiler is built.  In
order to permit everything to build using a single
@samp{configure}/@samp{make}, the configuration of the target libraries
is actually triggered during the make step.

When the target libraries are configured, the @samp{--target} option is
not used.  Instead, the @samp{--host} option is used with the argument
of the @samp{--target} option for the overall configuration.  If no
@samp{--target} option was used for the overall configuration, the
@samp{--host} option will be passed with the output of the
@file{config.guess} shell script.  Any @samp{--build} option is passed
down unchanged.

This translation of configuration options is done because since the
target libraries are compiled with the target compiler, they are being
built in order to run on the target of the overall configuration.  By
the definition of host, this means that their host system is the same as
the target system of the overall configuration.

The same process is used for both a native configuration and a cross
configuration.  Even when using a native configuration, the target
libraries will be configured and built using the newly built compiler.
This is particularly important for the C++ libraries, since there is no
reason to assume that the C++ compiler used to build the host tools (if
there even is one) uses the same ABI as the g++ compiler which will be
used to build the target libraries.

There is one difference between a native configuration and a cross
configuration.  In a native configuration, the target libraries are
normally configured and built as siblings of the host tools.  In a cross
configuration, the target libraries are normally built in a subdirectory
whose name is the argument to @samp{--target}.  This is mainly for
historical reasons.

To summarize, running @samp{configure} in the Cygnus tree configures all
the host libraries and tools, but does not configure any of the target
libraries.  Running @samp{make} then does the following steps:

@itemize @bullet
@item
Build the host libraries.
@item
Build the host programs, including gcc.  Note that we call gcc both a
host program (since it runs on the host) and a target compiler (since it
generates code for the target).
@item
Using the newly built target compiler, configure the target libraries.
@item
Build the target libraries.
@end itemize

The steps need not be done in precisely this order, since they are
actually controlled by @file{Makefile} targets.

@node Target Library Configure Scripts
@subsection Target Library Configure Scripts

There are a few things you must know in order to write a configure
script for a target library.  This is just a quick sketch, and beginners
shouldn't worry if they don't follow everything here.

The target libraries are configured and built using a newly built target
compiler.  There may not be any startup files or libraries for this
target compiler.  In fact, those files will probably be built as part of
some target library, which naturally means that they will not exist when
your target library is configured.

This means that the configure script for a target library may not use
any test which requires doing a link.  This unfortunately includes many
useful autoconf macros, such as @samp{AC_CHECK_FUNCS}.  autoconf macros
which do a compile but not a link, such as @samp{AC_CHECK_HEADERS}, may
be used.

This is a severe restriction, but normally not a fatal one, as target
libraries can often assume the presence of other target libraries, and
thus know which functions will be available.

As of this writing, the autoconf macro @samp{AC_PROG_CC} does a link to
make sure that the compiler works.  This may fail in a target library,
so target libraries must use a different set of macros to locate the
compiler.  See the @file{configure.in} file in a directory like
@file{libiberty} or @file{libgloss} for an example.

As noted in the previous section, target libraries are sometimes built
in directories which are siblings to the host tools, and are sometimes
built in a subdirectory.  The @samp{--with-target-subdir} configure
option will be passed when the library is configured.  Its value will be
an empty string if the target library is a sibling.  Its value will be
the name of the subdirectory if the target library is in a subdirectory.

If the overall build is not a native build (i.e., the overall configure
used the @samp{--target} option), then the library will be configured
with the @samp{--with-cross-host} option.  The value of this option will
be the host system of the overall build.  Recall that the host system of
the library will be the target of the overall build.  If the overall
build is a native build, the @samp{--with-cross-host} option will not be
used.

A library which can be built both standalone and as a target library may
want to install itself into different directories depending upon the
case.  When built standalone, or when built native, the library should
be installed in @samp{$(libdir)}.  When built as a target library which
is not native, the library should be installed in @samp{$(tooldir)/lib}.
The @samp{--with-cross-host} option may be used to distinguish these
cases.

This same test of @samp{--with-cross-host} may be used to see whether it
is OK to use link tests in the configure script.  If the
@samp{--with-cross-host} option is not used, then the library is being
built either standalone or native, and a link should work.

@node Make Targets in Cygnus Tree
@subsection Make Targets in Cygnus Tree

The top level @file{Makefile} in the Cygnus tree defines targets for
every known subdirectory.

For every subdirectory @var{dir} which holds a host library or program,
the @file{Makefile} target @samp{all-@var{dir}} will build that library
or program.

There are dependencies among host tools.  For example, building gcc
requires first building gas, because the gcc build process invokes the
target assembler.  These dependencies are reflected in the top level
@file{Makefile}.

For every subdirectory @var{dir} which holds a target library, the
@file{Makefile} target @samp{configure-target-@var{dir}} will configure
that library.  The @file{Makefile} target @samp{all-target-@var{dir}}
will build that library.

Every @samp{configure-target-@var{dir}} target depends upon
@samp{all-gcc}, since gcc, the target compiler, is required to configure
the tool.  Every @samp{all-target-@var{dir}} target depends upon the
corresponding @samp{configure-target-@var{dir}} target.

There are several other targets which may be of interest for each
directory: @samp{install-@var{dir}}, @samp{clean-@var{dir}}, and
@samp{check-@var{dir}}.  There are also corresponding @samp{target}
versions of these for the target libraries , such as
@samp{install-target-@var{dir}}.

@node Target libiberty
@subsection Target libiberty

The @file{libiberty} subdirectory is currently a special case, in that
it is the only directory which is built both using the host compiler and
using the target compiler.

This is because the files in @file{libiberty} are used when building the
host tools, and they are also incorporated into the @file{libstdc++}
target library as support code.

This duality does not pose any particular difficulties.  It means that
there are targets for both @samp{all-libiberty} and
@samp{all-target-libiberty}.

In a native configuration, when target libraries are not built in a
subdirectory, the same objects are normally used as both the host build
and the target build.  This is normally OK, since libiberty contains
only C code, and in a native configuration the results of the host
compiler and the target compiler are normally interoperable.

Irix 6 is again an exception here, since the SGI native compiler
defaults to using the @samp{O32} ABI, and gcc defaults to using the
@samp{N32} ABI.  On Irix 6, the target libraries are built in a
subdirectory even for a native configuration, avoiding this problem.

There are currently no other libraries built for both the host and the
target, but there is no conceptual problem with adding more.

@node Canadian Cross
@chapter Canadian Cross
@cindex canadian cross
@cindex building with a cross compiler
@cindex cross compiler, building with

It is possible to use the GNU configure and build system to build a
program which will run on a system which is different from the system on
which the tools are built.  In other words, it is possible to build
programs using a cross compiler.

This is referred to as a @dfn{Canadian Cross}.

@menu
* Canadian Cross Example::		Canadian Cross Example.
* Canadian Cross Concepts::		Canadian Cross Concepts.
* Build Cross Host Tools::		Build Cross Host Tools.
* Build and Host Options::		Build and Host Options.
* CCross not in Cygnus Tree::		Canadian Cross not in Cygnus Tree.
* CCross in Cygnus Tree::		Canadian Cross in Cygnus Tree.
* Supporting Canadian Cross::		Supporting Canadian Cross.
@end menu

@node Canadian Cross Example
@section Canadian Cross Example

Here is an example of a Canadian Cross.

While running on a GNU/Linux, you can build a program which will run on
a Solaris system.  You would use a GNU/Linux cross Solaris compiler to
build the program.

Of course, you could not run the resulting program on your GNU/Linux
system.  You would have to copy it over to a Solaris system before you
would run it.

Of course, you could also simply build the programs on the Solaris
system in the first place.  However, perhaps the Solaris system is not
available for some reason; perhaps you actually don't have one, but you
want to build the tools for somebody else to use.  Or perhaps your
GNU/Linux system is much faster than your Solaris system.

A Canadian Cross build is most frequently used when building programs to
run on a non-Unix system, such as DOS or Windows.  It may be simpler to
configure and build on a Unix system than to support the configuration
machinery on a non-Unix system.

@node Canadian Cross Concepts
@section Canadian Cross Concepts

When building a Canadian Cross, there are at least two different systems
involved: the system on which the tools are being built, and the system
on which the tools will run.

The system on which the tools are being built is called the @dfn{build}
system.

The system on which the tools will run is called the host system.

For example, if you are building a Solaris program on a GNU/Linux
system, as in the previous section, the build system would be GNU/Linux,
and the host system would be Solaris.

It is, of course, possible to build a cross compiler using a Canadian
Cross (i.e., build a cross compiler using a cross compiler).  In this
case, the system for which the resulting cross compiler generates code
is called the target system.  (For a more complete discussion of host
and target systems, @pxref{Host and Target}).

An example of building a cross compiler using a Canadian Cross would be
building a Windows cross MIPS ELF compiler on a GNU/Linux system.  In
this case the build system would be GNU/Linux, the host system would be
Windows, and the target system would be MIPS ELF.

The name Canadian Cross comes from the case when the build, host, and
target systems are all different.  At the time that these issues were
all being hashed out, Canada had three national political parties.

@node Build Cross Host Tools
@section Build Cross Host Tools

In order to configure a program for a Canadian Cross build, you must
first build and install the set of cross tools you will use to build the
program.

These tools will be build cross host tools.  That is, they will run on
the build system, and will produce code that runs on the host system.

It is easy to confuse the meaning of build and host here.  Always
remember that the build system is where you are doing the build, and the
host system is where the resulting program will run.  Therefore, you
need a build cross host compiler.

In general, you must have a complete cross environment in order to do
the build.  This normally means a cross compiler, cross assembler, and
so forth, as well as libraries and include files for the host system.

@node Build and Host Options
@section Build and Host Options
@cindex configuring a canadian cross
@cindex canadian cross, configuring

When you run @file{configure}, you must use both the @samp{--build} and
@samp{--host} options.

@cindex @samp{--build} option
@cindex build option
@cindex configure build system
The @samp{--build} option is used to specify the configuration name of
the build system.  This can normally be the result of running the
@file{config.guess} shell script, and it is reasonable to use
@samp{--build=`config.guess`}.

@cindex @samp{--host} option
@cindex host option
@cindex configure host
The @samp{--host} option is used to specify the configuration name of
the host system.

As we explained earlier, @file{config.guess} is used to set the default
value for the @samp{--host} option (@pxref{Using the Host Type}).  We
can now see that since @file{config.guess} returns the type of system on
which it is run, it really identifies the build system.  Since the host
system is normally the same as the build system (i.e., people do not
normally build using a cross compiler), it is reasonable to use the
result of @file{config.guess} as the default for the host system when
the @samp{--host} option is not used.

It might seem that if the @samp{--host} option were used without the
@samp{--build} option that the configure script could run
@file{config.guess} to determine the build system, and presume a
Canadian Cross if the result of @file{config.guess} differed from the
@samp{--host} option.  However, for historical reasons, some configure
scripts are routinely run using an explicit @samp{--host} option, rather
than using the default from @file{config.guess}.  As noted earlier, it
is difficult or impossible to reliably compare configuration names
(@pxref{Using the Target Type}).  Therefore, by convention, if the
@samp{--host} option is used, but the @samp{--build} option is not used,
then the build system defaults to the host system.

@node CCross not in Cygnus Tree
@section Canadian Cross not in Cygnus Tree.

If you are not using the Cygnus tree, you must explicitly specify the
cross tools which you want to use to build the program.  This is done by
setting environment variables before running the @file{configure}
script.

You must normally set at least the environment variables @samp{CC},
@samp{AR}, and @samp{RANLIB} to the cross tools which you want to use to
build.

For some programs, you must set additional cross tools as well, such as
@samp{AS}, @samp{LD}, or @samp{NM}.

You would set these environment variables to the build cross tools which
you are going to use.

For example, if you are building a Solaris program on a GNU/Linux
system, and your GNU/Linux cross Solaris compiler were named
@samp{solaris-gcc}, then you would set the environment variable
@samp{CC} to @samp{solaris-gcc}.

@node CCross in Cygnus Tree
@section Canadian Cross in Cygnus Tree
@cindex canadian cross in cygnus tree

This section describes configuring and building a Canadian Cross when
using the Cygnus tree.

@menu
* Standard Cygnus CCross::	Building a Normal Program.
* Cross Cygnus CCross::		Building a Cross Program.
@end menu

@node Standard Cygnus CCross
@subsection Building a Normal Program

When configuring a Canadian Cross in the Cygnus tree, all the
appropriate environment variables are automatically set to
@samp{@var{host}-@var{tool}}, where @var{host} is the value used for the
@samp{--host} option, and @var{tool} is the name of the tool (e.g.,
@samp{gcc}, @samp{as}, etc.).  These tools must be on your @samp{PATH}.

Adding a prefix of @var{host} will give the usual name for the build
cross host tools.  To see this, consider that when these cross tools
were built, they were configured to run on the build system and to
produce code for the host system.  That is, they were configured with a
@samp{--target} option that is the same as the system which we are now
calling the host.  Recall that the default name for installed cross
tools uses the target system as a prefix (@pxref{Using the Target
Type}).  Since that is the system which we are now calling the host,
@var{host} is the right prefix to use.

For example, if you configure with @samp{--build=i386-linux-gnu} and
@samp{--host=solaris}, then the Cygnus tree will automatically default
to using the compiler @samp{solaris-gcc}.  You must have previously
built and installed this compiler, probably by doing a build with no
@samp{--host} option and with a @samp{--target} option of
@samp{solaris}.

@node Cross Cygnus CCross
@subsection Building a Cross Program

There are additional considerations if you want to build a cross
compiler, rather than a native compiler, in the Cygnus tree using a
Canadian Cross.

When you build a cross compiler using the Cygnus tree, then the target
libraries will normally be built with the newly built target compiler
(@pxref{Host and Target Libraries}).  However, this will not work when
building with a Canadian Cross.  This is because the newly built target
compiler will be a program which runs on the host system, and therefore
will not be able to run on the build system.

Therefore, when building a cross compiler with the Cygnus tree, you must
first install a set of build cross target tools.  These tools will be
used when building the target libraries.

Note that this is not a requirement of a Canadian Cross in general.  For
example, it would be possible to build just the host cross target tools
on the build system, to copy the tools to the host system, and to build
the target libraries on the host system.  The requirement for build
cross target tools is imposed by the Cygnus tree, which expects to be
able to build both host programs and target libraries in a single
@samp{configure}/@samp{make} step.  Because it builds these in a single
step, it expects to be able to build the target libraries on the build
system, which means that it must use a build cross target toolchain.

For example, suppose you want to build a Windows cross MIPS ELF compiler
on a GNU/Linux system.  You must have previously installed both a
GNU/Linux cross Windows compiler and a GNU/Linux cross MIPS ELF
compiler.

In order to build the Windows (configuration name @samp{i386-cygwin32})
cross MIPS ELF (configure name @samp{mips-elf}) compiler, you might
execute the following commands (long command lines are broken across
lines with a trailing backslash as a continuation character).

@example
mkdir linux-x-cygwin32
cd linux-x-cygwin32
@var{srcdir}/configure --target i386-cygwin32 --prefix=@var{installdir} \
  --exec-prefix=@var{installdir}/H-i386-linux
make
make install
cd ..
mkdir linux-x-mips-elf
cd linux-x-mips-elf
@var{srcdir}/configure --target mips-elf --prefix=@var{installdir} \
  --exec-prefix=@var{installdir}/H-i386-linux
make
make install
cd ..
mkdir cygwin32-x-mips-elf
cd cygwin32-x-mips-elf
@var{srcdir}/configure --build=i386-linux-gnu --host=i386-cygwin32 \
  --target=mips-elf --prefix=@var{wininstalldir} \
  --exec-prefix=@var{wininstalldir}/H-i386-cygwin32
make
make install
@end example

You would then copy the contents of @var{wininstalldir} over to the
Windows machine, and run the resulting programs.

@node Supporting Canadian Cross
@section Supporting Canadian Cross

If you want to make it possible to build a program you are developing
using a Canadian Cross, you must take some care when writing your
configure and make rules.  Simple cases will normally work correctly.
However, it is not hard to write configure and make tests which will
fail in a Canadian Cross.

@menu
* CCross in Configure::		Supporting Canadian Cross in Configure Scripts.
* CCross in Make::		Supporting Canadian Cross in Makefiles.
@end menu

@node CCross in Configure
@subsection Supporting Canadian Cross in Configure Scripts
@cindex canadian cross in configure

In a @file{configure.in} file, after calling @samp{AC_PROG_CC}, you can
find out whether this is a Canadian Cross configure by examining the
shell variable @samp{cross_compiling}.  In a Canadian Cross, which means
that the compiler is a cross compiler, @samp{cross_compiling} will be
@samp{yes}.  In a normal configuration, @samp{cross_compiling} will be
@samp{no}.

You ordinarily do not need to know the type of the build system in a
configure script.  However, if you do need that information, you can get
it by using the macro @samp{AC_CANONICAL_SYSTEM}, the same macro that is
used to determine the target system.  This macro will set the variables
@samp{build}, @samp{build_alias}, @samp{build_cpu}, @samp{build_vendor},
and @samp{build_os}, which correspond to the similar @samp{target} and
@samp{host} variables, except that they describe the build system.

When writing tests in @file{configure.in}, you must remember that you
want to test the host environment, not the build environment.

Macros like @samp{AC_CHECK_FUNCS} which use the compiler will test the
host environment.  That is because the tests will be done by running the
compiler, which is actually a build cross host compiler.  If the
compiler can find the function, that means that the function is present
in the host environment.

Tests like @samp{test -f /dev/ptyp0}, on the other hand, will test the
build environment.  Remember that the configure script is running on the
build system, not the host system.  If your configure scripts examines
files, those files will be on the build system.  Whatever you determine
based on those files may or may not be the case on the host system.

Most autoconf macros will work correctly for a Canadian Cross.  The main
exception is @samp{AC_TRY_RUN}.  This macro tries to compile and run a
test program.  This will fail in a Canadian Cross, because the program
will be compiled for the host system, which means that it will not run
on the build system.

The @samp{AC_TRY_RUN} macro provides an optional argument to tell the
configure script what to do in a Canadian Cross.  If that argument is
not present, you will get a warning when you run @samp{autoconf}:
@smallexample
warning: AC_TRY_RUN called without default to allow cross compiling
@end smallexample
@noindent
This tells you that the resulting @file{configure} script will not work
with a Canadian Cross.

In some cases while it may better to perform a test at configure time,
it is also possible to perform the test at run time.  In such a case you
can use the cross compiling argument to @samp{AC_TRY_RUN} to tell your
program that the test could not be performed at configure time.

There are a few other autoconf macros which will not work correctly with
a Canadian Cross: a partial list is @samp{AC_FUNC_GETPGRP},
@samp{AC_FUNC_SETPGRP}, @samp{AC_FUNC_SETVBUF_REVERSED}, and
@samp{AC_SYS_RESTARTABLE_SYSCALLS}.  The @samp{AC_CHECK_SIZEOF} macro is
generally not very useful with a Canadian Cross; it permits an optional
argument indicating the default size, but there is no way to know what
the correct default should be.

@node CCross in Make
@subsection Supporting Canadian Cross in Makefiles.
@cindex canadian cross in makefile

The main Canadian Cross issue in a @file{Makefile} arises when you want
to use a subsidiary program to generate code or data which you will then
include in your real program.

If you compile this subsidiary program using @samp{$(CC)} in the usual
way, you will not be able to run it.  This is because @samp{$(CC)} will
build a program for the host system, but the program is being built on
the build system.

You must instead use a compiler for the build system, rather than the
host system.  In the Cygnus tree, this make variable
@samp{$(CC_FOR_BUILD)} will hold a compiler for the build system.

Note that you should not include @file{config.h} in a file you are
compiling with @samp{$(CC_FOR_BUILD)}.  The @file{configure} script will
build @file{config.h} with information for the host system.  However,
you are compiling the file using a compiler for the build system (a
native compiler).  Subsidiary programs are normally simple filters which
do no user interaction, and it is normally possible to write them in a
highly portable fashion so that the absence of @file{config.h} is not
crucial.

@cindex @samp{HOST_CC}
The gcc @file{Makefile.in} shows a complex situation in which certain
files, such as @file{rtl.c}, must be compiled into both subsidiary
programs run on the build system and into the final program.  This
approach may be of interest for advanced build system hackers.  Note
that the build system compiler is rather confusingly called
@samp{HOST_CC}.

@node Cygnus Configure
@chapter Cygnus Configure
@cindex cygnus configure

The Cygnus configure script predates autoconf.  All of its interesting
features have been incorporated into autoconf.  No new programs should
be written to use the Cygnus configure script.

However, the Cygnus configure script is still used in a few places: at
the top of the Cygnus tree and in a few target libraries in the Cygnus
tree.  Until those uses have been replaced with autoconf, some brief
notes are appropriate here.  This is not complete documentation, but it
should be possible to use this as a guide while examining the scripts
themselves.

@menu
* Cygnus Configure Basics::		Cygnus Configure Basics.
* Cygnus Configure in C++ Libraries::	Cygnus Configure in C++ Libraries.
@end menu

@node Cygnus Configure Basics
@section Cygnus Configure Basics

Cygnus configure does not use any generated files; there is no program
corresponding to @samp{autoconf}.  Instead, there is a single shell
script named @samp{configure} which may be found at the top of the
Cygnus tree.  This shell script was written by hand; it was not
generated by autoconf, and it is incorrect, and indeed harmful, to run
@samp{autoconf} in the top level of a Cygnus tree.

Cygnus configure works in a particular directory by examining the file
@file{configure.in} in that directory.  That file is broken into four
separate shell scripts.

The first is the contents of @file{configure.in} up to a line that
starts with @samp{# per-host:}.  This is the common part.

The second is the rest of @file{configure.in} up to a line that starts
with @samp{# per-target:}.  This is the per host part.

The third is the rest of @file{configure.in} up to a line that starts
with @samp{# post-target:}.  This is the per target part.

The fourth is the remainder of @file{configure.in}.  This is the post
target part.

If any of these comment lines are missing, the corresponding shell
script is empty.

Cygnus configure will first execute the common part.  This must set the
shell variable @samp{srctrigger} to the name of a source file, to
confirm that Cygnus configure is looking at the right directory.  This
may set the shell variables @samp{package_makefile_frag} and
@samp{package_makefile_rules_frag}.

Cygnus configure will next set the @samp{build} and @samp{host} shell
variables, and execute the per host part.  This may set the shell
variable @samp{host_makefile_frag}.

Cygnus configure will next set the @samp{target} variable, and execute
the per target part.  This may set the shell variable
@samp{target_makefile_frag}.

Any of these scripts may set the @samp{subdirs} shell variable.  This
variable is a list of subdirectories where a @file{Makefile.in} file may
be found.  Cygnus configure will automatically look for a
@file{Makefile.in} file in the current directory.  The @samp{subdirs}
shell variable is not normally used, and I believe that the only
directory which uses it at present is @file{newlib}.

For each @file{Makefile.in}, Cygnus configure will automatically create
a @file{Makefile} by adding definitions for @samp{make} variables such
as @samp{host} and @samp{target}, and automatically editing the values
of @samp{make} variables such as @samp{prefix} if they are present.

Also, if any of the @samp{makefile_frag} shell variables are set, Cygnus
configure will interpret them as file names relative to either the
working directory or the source directory, and will read the contents of
the file into the generated @file{Makefile}.  The file contents will be
read in after the first line in @file{Makefile.in} which starts with
@samp{####}.

These @file{Makefile} fragments are used to customize behaviour for a
particular host or target.  They serve to select particular files to
compile, and to define particular preprocessor macros by providing
values for @samp{make} variables which are then used during compilation.
Cygnus configure, unlike autoconf, normally does not do feature tests,
and normally requires support to be added manually for each new host.

The @file{Makefile} fragment support is similar to the autoconf
@samp{AC_SUBST_FILE} macro.

After creating each @file{Makefile}, the post target script will be run
(i.e., it may be run several times).  This script may further customize
the @file{Makefile}.  When it is run, the shell variable @samp{Makefile}
will hold the name of the @file{Makefile}, including the appropriate
directory component.

Like an autoconf generated @file{configure} script, Cygnus configure
will create a file named @file{config.status} which, when run, will
automatically recreate the configuration.  The @file{config.status} file
will simply execute the Cygnus configure script again with the
appropriate arguments.

Any of the parts of @file{configure.in} may set the shell variables
@samp{files} and @samp{links}.  Cygnus configure will set up symlinks
from the names in @samp{links} to the files named in @samp{files}.  This
is similar to the autoconf @samp{AC_LINK_FILES} macro.

Finally, any of the parts of @file{configure.in} may set the shell
variable @samp{configdirs} to a set of subdirectories.  If it is set,
Cygnus configure will recursively run the configure process in each
subdirectory.  If the subdirectory uses Cygnus configure, it will
contain a @file{configure.in} file but no @file{configure} file, in
which case Cygnus configure will invoke itself recursively.  If the
subdirectory has a @file{configure} file, Cygnus configure assumes that
it is an autoconf generated @file{configure} script, and simply invokes
it directly.

@node Cygnus Configure in C++ Libraries
@section Cygnus Configure in C++ Libraries
@cindex @file{libstdc++} configure
@cindex @file{libio} configure
@cindex @file{libg++} configure

The C++ library configure system, written by Per Bothner, deserves
special mention.  It uses Cygnus configure, but it does feature testing
like that done by autoconf generated @file{configure} scripts.  This
approach is used in the libraries @file{libio}, @file{libstdc++}, and
@file{libg++}.

Most of the @file{Makefile} information is written out by the shell
script @file{libio/config.shared}.  Each @file{configure.in} file sets
certain shell variables, and then invokes @file{config.shared} to create
two package @file{Makefile} fragments.  These fragments are then
incorporated into the resulting @file{Makefile} by the Cygnus configure
script.

The file @file{_G_config.h} is created in the @file{libio} object
directory by running the shell script @file{libio/gen-params}.  This
shell script uses feature tests to define macros and typedefs in
@file{_G_config.h}.

@node Multilibs
@chapter Multilibs
@cindex multilibs

For some targets gcc may have different processor requirements depending
upon command line options.  An obvious example is the
@samp{-msoft-float} option supported on several processors.  This option
means that the floating point registers are not available, which means
that floating point operations must be done by calling an emulation
subroutine rather than by using machine instructions.

For such options, gcc is often configured to compile target libraries
twice: once with @samp{-msoft-float} and once without.  When gcc
compiles target libraries more than once, the resulting libraries are
called @dfn{multilibs}.

Multilibs are not really part of the GNU configure and build system, but
we discuss them here since they require support in the @file{configure}
scripts and @file{Makefile}s used for target libraries.

@menu
* Multilibs in gcc::		        Multilibs in gcc.
* Multilibs in Target Libraries::	Multilibs in Target Libraries.
@end menu

@node Multilibs in gcc
@section Multilibs in gcc

In gcc, multilibs are defined by setting the variable
@samp{MULTILIB_OPTIONS} in the target @file{Makefile} fragment.  Several
other @samp{MULTILIB} variables may also be defined there.  @xref{Target
Fragment, , The Target Makefile Fragment, gcc, Using and Porting GNU
CC}.

If you have built gcc, you can see what multilibs it uses by running it
with the @samp{-print-multi-lib} option.  The output @samp{.;} means
that no multilibs are used.  In general, the output is a sequence of
lines, one per multilib.  The first part of each line, up to the
@samp{;}, is the name of the multilib directory.  The second part is a
list of compiler options separated by @samp{@@} characters.

Multilibs are built in a tree of directories.  The top of the tree,
represented by @samp{.} in the list of multilib directories, is the
default library to use when no special compiler options are used.  The
subdirectories of the tree hold versions of the library to use when
particular compiler options are used.

@node Multilibs in Target Libraries
@section 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 @file{configure.in} file, by adding
@samp{--enable-multilib} to the list of arguments passed to configure
when it is run for the target libraries (@pxref{Host and Target
Libraries}).

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

The @file{config-ml.in} script makes one copy of the @file{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 @file{config-ml.in} script sets several variables in the various
@file{Makefile}s.  The @file{Makefile.in} must have definitions for
these variables already; @file{config-ml.in} simply changes the existing
values.  The @file{Makefile} should use default values for these
variables which will do the right thing in the subdirectories.

@table @samp
@item MULTISRCTOP
@file{config-ml.in} will set this to a sequence of @samp{../} strings,
where the number of strings is the number of multilib levels in the
source tree.  The default value should be the empty string.
@item MULTIBUILDTOP
@file{config-ml.in} will set this to a sequence of @samp{../} 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 @samp{MULTISRCTOP} when configuring in the source tree
(which is not recommended).
@item MULTIDIRS
In the top level @file{Makefile} only, @file{config-ml.in} will set this
to the list of multilib subdirectories.  The default value should be the
empty string.
@item MULTISUBDIR
@file{config-ml.in} will set this to the installed subdirectory name to
use for this subdirectory, with a leading @samp{/}.  The default value
shold be the empty string.
@item MULTIDO
@itemx MULTICLEAN
In the top level @file{Makefile} only, @file{config-ml.in} will set
these variables to commands to use when doing a recursive make.  These
variables should both default to the string @samp{true}, so that by
default nothing happens.
@end table

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

Similarly, references to the parent of the object directory should use
the variable @samp{MULTIBUILDTOP}.

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

The @file{config-ml.in} script also modifies the top level
@file{Makefile} to add @samp{multi-do} and @samp{multi-clean} targets
which are used when building multilibs.

The default target of the @file{Makefile} should include the following
command:
@smallexample
@@$(MULTIDO) $(FLAGS_TO_PASS) DO=all multi-do
@end smallexample
@noindent
This assumes that @samp{$(FLAGS_TO_PASS)} is defined as a set of
variables to pass to a recursive invocation of @samp{make}.  This will
build all the multilibs.  Note that the default value of @samp{MULTIDO}
is @samp{true}, so by default this command will do nothing.  It will
only do something in the top level @file{Makefile} if multilibs were
enabled.

The @samp{install} target of the @file{Makefile} should include the
following command:
@smallexample
@@$(MULTIDO) $(FLAGS_TO_PASS) DO=install multi-do
@end smallexample

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

The @samp{clean} targets (@samp{clean}, @samp{mostlyclean}, etc.) should
use @samp{$(MULTICLEAN)}.  For example, the @samp{clean} target should
do this:
@smallexample
@@$(MULTICLEAN) DO=clean multi-clean
@end smallexample

@node FAQ
@chapter Frequently Asked Questions

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

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

@cindex @samp{CY_GNU_GETTEXT} in @file{configure}
@cindex @samp{AM_PROG_LIBTOOL} in @file{configure}
@item My @file{configure} script has stuff like @samp{CY_GNU_GETTEXT} in it.
This means that you have macros in your @file{configure.in} which should
be defined in your @file{aclocal.m4} file, but aren't.  This usually
means that @samp{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
@samp{AM_PROG_LIBTOOL} is defined) and gettext (this is where
@samp{CY_GNU_GETTEXT} is defined, at least in the Cygnus version of
gettext).

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

@cindex @samp{config.status --recheck}
@item Why do I have to run both @samp{config.status --recheck} and @samp{config.status}?
Normally, you don't; they will be run automatically by @file{Makefile}
targets.  If you do need to run them, use @samp{config.status --recheck}
to run the @file{configure} script again with the same arguments as the
first time you ran it.  Use @samp{config.status} (with no arguments) to
regenerate all files (@file{Makefile}, @file{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
@samp{config.status --recheck}.  The @file{Makefile} targets generated
by automake will use the environment variables @samp{CONFIG_FILES} and
@samp{CONFIG_HEADERS} to only regenerate files as they are needed.

@item 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.

@item 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.

@item Why not just have a Cygnus tree @samp{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.
@end table

@node Index
@unnumbered Index

@printindex cp

@contents
@bye
