\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename automake.info
@settitle automake
@documentencoding UTF-8
@documentlanguage en
@setchapternewpage off
@c %**end of header

@include version.texi

@c @ovar(ARG, DEFAULT)
@c -------------------
@c The ARG is an optional argument.  To be used for macro arguments in
@c their documentation (@defmac).
@macro ovar{varname}
@r{[}@var{\varname\}@r{]}
@end macro

@set PACKAGE_BUGREPORT bug-automake@@gnu.org

@copying

This manual is for GNU Automake (version @value{VERSION},
@value{UPDATED}), a program that creates GNU standards-compliant
Makefiles from template files.

Copyright @copyright{} 1995-2018 Free Software Foundation, Inc.

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

@end quotation
@end copying

@dircategory Software development
@direntry
* Automake: (automake).         Making GNU standards-compliant Makefiles.
@end direntry

@dircategory Individual utilities
@direntry
* aclocal-invocation: (automake)aclocal Invocation.   Generating aclocal.m4.
* automake-invocation: (automake)automake Invocation. Generating Makefile.in.
@end direntry

@titlepage
@title GNU Automake
@subtitle For version @value{VERSION}, @value{UPDATED}
@author David MacKenzie
@author Tom Tromey
@author Alexandre Duret-Lutz
@author Ralf Wildenhues
@author Stefano Lattarini
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@contents

@c We use the following macros to define indices:
@c   @cindex   concepts, and anything that does not fit elsewhere
@c   @vindex   Makefile variables
@c   @trindex  targets
@c   @acindex  Autoconf/Automake/Libtool/M4/... macros
@c   @opindex  tool options

@c Define an index of configure macros.
@defcodeindex ac
@c Define an index of options.
@defcodeindex op
@c Define an index of targets.
@defcodeindex tr
@c Define an index of commands.
@defcodeindex cm

@c Put the macros in the function index.
@syncodeindex ac fn

@c Put everything else into one index (arbitrarily chosen to be the
@c concept index).
@syncodeindex op cp
@syncodeindex tr cp
@syncodeindex cm cp

@ifnottex
@node Top
@comment  node-name,  next,  previous,  up
@top GNU Automake

@insertcopying

@menu
* Introduction::                Automake's purpose
* Autotools Introduction::      An Introduction to the Autotools
* Generalities::                General ideas
* Examples::                    Some example packages
* automake Invocation::         Creating a Makefile.in
* configure::                   Scanning configure.ac, using aclocal
* Directories::                 Declaring subdirectories
* Programs::                    Building programs and libraries
* Other Objects::               Other derived objects
* Other GNU Tools::             Other GNU Tools
* Documentation::               Building documentation
* Install::                     What gets installed
* Clean::                       What gets cleaned
* Dist::                        What goes in a distribution
* Tests::                       Support for test suites
* Rebuilding::                  Automatic rebuilding of Makefile
* Options::                     Changing Automake's behavior
* Miscellaneous::               Miscellaneous rules
* Include::                     Including extra files in an Automake template
* Conditionals::                Conditionals
* Silencing Make::              Obtain less verbose output from @command{make}
* Gnits::                       The effect of @option{--gnu} and @option{--gnits}
* Not Enough::                  When Automake is not Enough
* Distributing::                Distributing the Makefile.in
* API Versioning::              About compatibility between Automake versions
* Upgrading::                   Upgrading to a Newer Automake Version
* FAQ::                         Frequently Asked Questions
* Copying This Manual::         How to make copies of this manual
* Indices::                     Indices of variables, macros, and concepts

@detailmenu
 --- The Detailed Node Listing ---

An Introduction to the Autotools

* GNU Build System::            Introducing the GNU Build System
* Use Cases::                   Use Cases for the GNU Build System
* Why Autotools::               How Autotools Help
* Hello World::                 A Small Hello World Package

Use Cases for the GNU Build System

* Basic Installation::          Common installation procedure
* Standard Targets::            A list of standard Makefile targets
* Standard Directory Variables::  A list of standard directory variables
* Standard Configuration Variables::  Using configuration variables
* config.site::                 Using a config.site file
* VPATH Builds::                Parallel build trees
* Two-Part Install::            Installing data and programs separately
* Cross-Compilation::           Building for other architectures
* Renaming::                    Renaming programs at install time
* DESTDIR::                     Building binary packages with DESTDIR
* Preparing Distributions::     Rolling out tarballs
* Dependency Tracking::         Automatic dependency tracking
* Nested Packages::             The GNU Build Systems can be nested

A Small Hello World

* Creating amhello::            Create @file{amhello-1.0.tar.gz} from scratch
* amhello's configure.ac Setup Explained::
* amhello's Makefile.am Setup Explained::

General ideas

* General Operation::           General operation of Automake
* Strictness::                  Standards conformance checking
* Uniform::                     The Uniform Naming Scheme
* Length Limitations::          Staying below the command line length limit
* Canonicalization::            How derived variables are named
* User Variables::              Variables reserved for the user
* Auxiliary Programs::          Programs automake might require

Some example packages

* Complete::                    A simple example, start to finish
* true::                        Building true and false

Scanning @file{configure.ac}, using @command{aclocal}

* Requirements::                Configuration requirements
* Optional::                    Other things Automake recognizes
* aclocal Invocation::          Auto-generating aclocal.m4
* Macros::                      Autoconf macros supplied with Automake

Auto-generating aclocal.m4

* aclocal Options::             Options supported by aclocal
* Macro Search Path::           How aclocal finds .m4 files
* Extending aclocal::           Writing your own aclocal macros
* Local Macros::                Organizing local macros
* Serials::                     Serial lines in Autoconf macros
* Future of aclocal::           aclocal's scheduled death

Autoconf macros supplied with Automake

* Public Macros::               Macros that you can use.
* Private Macros::              Macros that you should not use.

Directories

* Subdirectories::              Building subdirectories recursively
* Conditional Subdirectories::  Conditionally not building directories
* Alternative::                 Subdirectories without recursion
* Subpackages::                 Nesting packages

Conditional Subdirectories

* SUBDIRS vs DIST_SUBDIRS::     Two sets of directories
* Subdirectories with AM_CONDITIONAL::  Specifying conditional subdirectories
* Subdirectories with AC_SUBST::  Another way for conditional recursion
* Unconfigured Subdirectories::  Not even creating a @samp{Makefile}

Building Programs and Libraries

* A Program::                   Building a program
* A Library::                   Building a library
* A Shared Library::            Building a Libtool library
* Program and Library Variables::  Variables controlling program and
                                library builds
* Default _SOURCES::            Default source files
* LIBOBJS::                     Special handling for LIBOBJS and ALLOCA
* Program Variables::           Variables used when building a program
* Yacc and Lex::                Yacc and Lex support
* C++ Support::                 Compiling C++ sources
* Objective C Support::         Compiling Objective C sources
* Objective C++ Support::       Compiling Objective C++ sources
* Unified Parallel C Support::  Compiling Unified Parallel C sources
* Assembly Support::            Compiling assembly sources
* Fortran 77 Support::          Compiling Fortran 77 sources
* Fortran 9x Support::          Compiling Fortran 9x sources
* Java Support with gcj::       Compiling Java sources using gcj
* Vala Support::                Compiling Vala sources
* Support for Other Languages::  Compiling other languages
* Dependencies::                Automatic dependency tracking
* EXEEXT::                      Support for executable extensions

Building a program

* Program Sources::             Defining program sources
* Linking::                     Linking with libraries or extra objects
* Conditional Sources::         Handling conditional sources
* Conditional Programs::        Building a program conditionally

Building a Shared Library

* Libtool Concept::             Introducing Libtool
* Libtool Libraries::           Declaring Libtool Libraries
* Conditional Libtool Libraries::  Building Libtool Libraries Conditionally
* Conditional Libtool Sources::  Choosing Library Sources Conditionally
* Libtool Convenience Libraries::  Building Convenience Libtool Libraries
* Libtool Modules::             Building Libtool Modules
* Libtool Flags::               Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
* LTLIBOBJS::                   Using $(LTLIBOBJS) and $(LTALLOCA)
* Libtool Issues::              Common Issues Related to Libtool's Use

Common Issues Related to Libtool's Use

* Error required file ltmain.sh not found::  The need to run libtoolize
* Objects created both with libtool and without::  Avoid a specific build race

Fortran 77 Support

* Preprocessing Fortran 77::    Preprocessing Fortran 77 sources
* Compiling Fortran 77 Files::  Compiling Fortran 77 sources
* Mixing Fortran 77 With C and C++::  Mixing Fortran 77 With C and C++

Mixing Fortran 77 With C and C++

* How the Linker is Chosen::    Automatic linker selection

Fortran 9x Support

* Compiling Fortran 9x Files::  Compiling Fortran 9x sources

Other Derived Objects

* Scripts::                     Executable scripts
* Headers::                     Header files
* Data::                        Architecture-independent data files
* Sources::                     Derived sources

Built Sources

* Built Sources Example::       Several ways to handle built sources.

Other GNU Tools

* Emacs Lisp::                  Emacs Lisp
* gettext::                     Gettext
* Libtool::                     Libtool
* Java::                        Java bytecode compilation (deprecated)
* Python::                      Python

Building documentation

* Texinfo::                     Texinfo
* Man Pages::                   Man pages

What Gets Installed

* Basics of Installation::      What gets installed where
* The Two Parts of Install::    Installing data and programs separately
* Extending Installation::      Adding your own rules for installation
* Staged Installs::             Installation in a temporary location
* Install Rules for the User::  Useful additional rules

What Goes in a Distribution

* Basics of Distribution::      Files distributed by default
* Fine-grained Distribution Control::  @code{dist_} and @code{nodist_} prefixes
* The dist Hook::               A target for last-minute distribution changes
* Checking the Distribution::   @samp{make distcheck} explained
* The Types of Distributions::  A variety of formats and compression methods

Support for test suites

* Generalities about Testing::  Generic concepts and terminology about testing
* Simple Tests::                Listing test scripts in @code{TESTS}
* Custom Test Drivers::         Writing and using custom test drivers
* Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
* DejaGnu Tests::               Interfacing with the @command{dejagnu} testing framework
* Install Tests::               Running tests on installed packages

Simple Tests

* Scripts-based Testsuites::    Automake-specific concepts and terminology
* Serial Test Harness::         Older (and discouraged) serial test harness
* Parallel Test Harness::       Generic concurrent test harness

Using the TAP test protocol

* Introduction to TAP::
* Use TAP with the Automake test harness::
* Incompatibilities with other TAP parsers and drivers::
* Links and external resources on TAP::

Custom Test Drivers

* Overview of Custom Test Drivers Support::
* Declaring Custom Test Drivers::
* API for Custom Test Drivers::

API for Custom Test Drivers

* Command-line arguments for test drivers::
* Log files generation and test results recording::
* Testsuite progress output::

Changing Automake's Behavior

* Options generalities::        Semantics of Automake option
* List of Automake options::    A comprehensive list of Automake options

Miscellaneous Rules

* Tags::                        Interfacing to cscope, etags and mkid
* Suffixes::                    Handling new file extensions

Conditionals

* Usage of Conditionals::       Declaring conditional content
* Limits of Conditionals::      Enclosing complete statements

Silencing Make

* Make verbosity::              Make is verbose by default
* Tricks For Silencing Make::   Standard and generic ways to silence make
* Automake Silent Rules::       How Automake can help in silencing make

When Automake Isn't Enough

* Extending::                   Adding new rules or overriding existing ones.
* Third-Party Makefiles::       Integrating Non-Automake @file{Makefile}s.

Frequently Asked Questions about Automake

* CVS::                         CVS and generated files
* maintainer-mode::             missing and AM_MAINTAINER_MODE
* Wildcards::                   Why doesn't Automake support wildcards?
* Limitations on File Names::   Limitations on source and installed file names
* Errors with distclean::       Files left in build directory after distclean
* Flag Variables Ordering::     CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
* Renamed Objects::             Why are object files sometimes renamed?
* Per-Object Flags::            How to simulate per-object flags?
* Multiple Outputs::            Writing rules for tools with many output files
* Hard-Coded Install Paths::    Installing to hard-coded locations
* Debugging Make Rules::        Strategies when things don't work as expected
* Reporting Bugs::              Feedback on bugs and feature requests

Copying This Manual

* GNU Free Documentation License::  License for copying this manual

Indices

* Macro Index::                 Index of Autoconf macros
* Variable Index::              Index of Makefile variables
* General Index::               General index

@end detailmenu
@end menu

@end ifnottex


@node Introduction
@chapter Introduction

Automake is a tool for automatically generating @file{Makefile.in}s
from files called @file{Makefile.am}.  Each @file{Makefile.am} is
basically a series of @command{make} variable
definitions@footnote{These variables are also called @dfn{make macros}
in Make terminology, however in this manual we reserve the term
@dfn{macro} for Autoconf's macros.}, with rules being thrown in
occasionally.  The generated @file{Makefile.in}s are compliant with
the GNU Makefile standards.

@cindex GNU Makefile standards

The GNU Makefile Standards Document
(@pxref{Makefile Conventions, , , standards, The GNU Coding Standards})
is long, complicated, and subject to change.  The goal of Automake is to
remove the burden of Makefile maintenance from the back of the
individual GNU maintainer (and put it on the back of the Automake
maintainers).

The typical Automake input file is simply a series of variable definitions.
Each such file is processed to create a @file{Makefile.in}.

@cindex Constraints of Automake
@cindex Automake constraints

Automake does constrain a project in certain ways; for instance, it
assumes that the project uses Autoconf (@pxref{Top, , Introduction,
autoconf, The Autoconf Manual}), and enforces certain restrictions on
the @file{configure.ac} contents.

@cindex Automake requirements
@cindex Requirements, Automake

Automake requires @command{perl} in order to generate the
@file{Makefile.in}s.  However, the distributions created by Automake are
fully GNU standards-compliant, and do not require @command{perl} in order
to be built.

@cindex Bugs, reporting
@cindex Reporting bugs
@cindex E-mail, bug reports

For more information on bug reports, @xref{Reporting Bugs}.

@node Autotools Introduction
@chapter An Introduction to the Autotools

If you are new to Automake, maybe you know that it is part of a set of
tools called @emph{The Autotools}.  Maybe you've already delved into a
package full of files named @file{configure}, @file{configure.ac},
@file{Makefile.in}, @file{Makefile.am}, @file{aclocal.m4}, @dots{},
some of them claiming to be @emph{generated by} Autoconf or Automake.
But the exact purpose of these files and their relations is probably
fuzzy.  The goal of this chapter is to introduce you to this machinery,
to show you how it works and how powerful it is.  If you've never
installed or seen such a package, do not worry: this chapter will walk
you through it.

If you need some teaching material, more illustrations, or a less
@command{automake}-centered continuation, some slides for this
introduction are available in Alexandre Duret-Lutz's
@uref{http://www.lrde.epita.fr/@/~adl/@/autotools.html,
Autotools Tutorial}.
This chapter is the written version of the first part of his tutorial.

@menu
* GNU Build System::            Introducing the GNU Build System
* Use Cases::                   Use Cases for the GNU Build System
* Why Autotools::               How Autotools Help
* Hello World::                 A Small Hello World Package
@end menu

@node GNU Build System
@section Introducing the GNU Build System
@cindex GNU Build System, introduction

It is a truth universally acknowledged, that as a developer in
possession of a new package, you must be in want of a build system.

In the Unix world, such a build system is traditionally achieved using
the command @command{make} (@pxref{Top, , Overview, make, The GNU Make
Manual}).  You express the recipe to build your package in a
@file{Makefile}.  This file is a set of rules to build the files in
the package.  For instance the program @file{prog} may be built by
running the linker on the files @file{main.o}, @file{foo.o}, and
@file{bar.o}; the file @file{main.o} may be built by running the
compiler on @file{main.c}; etc.  Each time @command{make} is run, it
reads @file{Makefile}, checks the existence and modification time of
the files mentioned, decides what files need to be built (or rebuilt),
and runs the associated commands.

When a package needs to be built on a different platform than the one
it was developed on, its @file{Makefile} usually needs to be adjusted.
For instance the compiler may have another name or require more
options.  In 1991, David J. MacKenzie got tired of customizing
@file{Makefile} for the 20 platforms he had to deal with.  Instead, he
handcrafted a little shell script called @file{configure} to
automatically adjust the @file{Makefile} (@pxref{Genesis, , Genesis,
autoconf, The Autoconf Manual}).  Compiling his package was now
as simple as running @code{./configure && make}.

@cindex GNU Coding Standards

Today this process has been standardized in the GNU project.  The GNU
Coding Standards (@pxref{Managing Releases, The Release Process, ,
standards, The GNU Coding Standards}) explains how each package of the
GNU project should have a @file{configure} script, and the minimal
interface it should have.  The @file{Makefile} too should follow some
established conventions.  The result?  A unified build system that
makes all packages almost indistinguishable by the installer.  In its
simplest scenario, all the installer has to do is to unpack the
package, run @code{./configure && make && make install}, and repeat
with the next package to install.

We call this build system the @dfn{GNU Build System}, since it was
grown out of the GNU project.  However it is used by a vast number of
other packages: following any existing convention has its advantages.

@cindex Autotools, introduction

The Autotools are tools that will create a GNU Build System for your
package.  Autoconf mostly focuses on @file{configure} and Automake on
@file{Makefile}s.  It is entirely possible to create a GNU Build
System without the help of these tools.  However it is rather
burdensome and error-prone.  We will discuss this again after some
illustration of the GNU Build System in action.

@node Use Cases
@section Use Cases for the GNU Build System
@cindex GNU Build System, use cases
@cindex GNU Build System, features
@cindex Features of the GNU Build System
@cindex Use Cases for the GNU Build System
@cindex @file{amhello-1.0.tar.gz}, location
@cindex @file{amhello-1.0.tar.gz}, use cases

In this section we explore several use cases for the GNU Build System.
You can replay all of these examples on the @file{amhello-1.0.tar.gz}
package distributed with Automake.  If Automake is installed on your
system, you should find a copy of this file in
@file{@var{prefix}/share/doc/automake/amhello-1.0.tar.gz}, where
@var{prefix} is the installation prefix specified during configuration
(@var{prefix} defaults to @file{/usr/local}, however if Automake was
installed by some GNU/Linux distribution it most likely has been set
to @file{/usr}).  If you do not have a copy of Automake installed,
you can find a copy of this file inside the @file{doc/} directory of
the Automake package.

Some of the following use cases present features that are in fact
extensions to the GNU Build System.  Read: they are not specified by
the GNU Coding Standards, but they are nonetheless part of the build
system created by the Autotools.  To keep things simple, we do not
point out the difference.  Our objective is to show you many of the
features that the build system created by the Autotools will offer to
you.

@menu
* Basic Installation::          Common installation procedure
* Standard Targets::            A list of standard Makefile targets
* Standard Directory Variables::  A list of standard directory variables
* Standard Configuration Variables::  Using configuration variables
* config.site::                 Using a config.site file
* VPATH Builds::                Parallel build trees
* Two-Part Install::            Installing data and programs separately
* Cross-Compilation::           Building for other architectures
* Renaming::                    Renaming programs at install time
* DESTDIR::                     Building binary packages with DESTDIR
* Preparing Distributions::     Rolling out tarballs
* Dependency Tracking::         Automatic dependency tracking
* Nested Packages::             The GNU Build Systems can be nested
@end menu

@node Basic Installation
@subsection Basic Installation
@cindex Configuration, basics
@cindex Installation, basics
@cindex GNU Build System, basics

The most common installation procedure looks as follows.

@example
~ % @kbd{tar zxf amhello-1.0.tar.gz}
~ % @kbd{cd amhello-1.0}
~/amhello-1.0 % @kbd{./configure}
@dots{}
config.status: creating Makefile
config.status: creating src/Makefile
@dots{}
~/amhello-1.0 % @kbd{make}
@dots{}
~/amhello-1.0 % @kbd{make check}
@dots{}
~/amhello-1.0 % @kbd{su}
Password:
/home/adl/amhello-1.0 # @kbd{make install}
@dots{}
/home/adl/amhello-1.0 # @kbd{exit}
~/amhello-1.0 % @kbd{make installcheck}
@dots{}
@end example

@cindex Unpacking

The user first unpacks the package.  Here, and in the following
examples, we will use the non-portable @code{tar zxf} command for
simplicity.  On a system without GNU @command{tar} installed, this
command should read @code{gunzip -c amhello-1.0.tar.gz | tar xf -}.

The user then enters the newly created directory to run the
@file{configure} script.  This script probes the system for various
features, and finally creates the @file{Makefile}s.  In this toy
example there are only two @file{Makefile}s, but in real-world projects,
there may be many more, usually one @file{Makefile} per directory.

It is now possible to run @code{make}.  This will construct all the
programs, libraries, and scripts that need to be constructed for the
package.  In our example, this compiles the @file{hello} program.
All files are constructed in place, in the source tree; we will see
later how this can be changed.

@code{make check} causes the package's tests to be run.  This step is
not mandatory, but it is often good to make sure the programs that
have been built behave as they should, before you decide to install
them.  Our example does not contain any tests, so running @code{make
check} is a no-op.

@cindex su, before @code{make install}
After everything has been built, and maybe tested, it is time to
install it on the system.  That means copying the programs,
libraries, header files, scripts, and other data files from the
source directory to their final destination on the system.  The
command @code{make install} will do that.  However, by default
everything will be installed in subdirectories of @file{/usr/local}:
binaries will go into @file{/usr/local/bin}, libraries will end up in
@file{/usr/local/lib}, etc.  This destination is usually not writable
by any user, so we assume that we have to become root before we can
run @code{make install}.  In our example, running @code{make install}
will copy the program @file{hello} into @file{/usr/local/bin}
and @file{README} into @file{/usr/local/share/doc/amhello}.

A last and optional step is to run @code{make installcheck}.  This
command may run tests on the installed files.  @code{make check} tests
the files in the source tree, while @code{make installcheck} tests
their installed copies.  The tests run by the latter can be different
from those run by the former.  For instance, there are tests that
cannot be run in the source tree.  Conversely, some packages are set
up so that @code{make installcheck} will run the very same tests as
@code{make check}, only on different files (non-installed
vs.@: installed).  It can make a difference, for instance when the
source tree's layout is different from that of the installation.
Furthermore it may help to diagnose an incomplete installation.

Presently most packages do not have any @code{installcheck} tests
because the existence of @code{installcheck} is little known, and its
usefulness is neglected.  Our little toy package is no better: @code{make
installcheck} does nothing.

@node Standard Targets
@subsection Standard @file{Makefile} Targets

So far we have come across four ways to run @command{make} in the GNU
Build System: @code{make}, @code{make check}, @code{make install}, and
@code{make installcheck}.  The words @code{check}, @code{install}, and
@code{installcheck}, passed as arguments to @command{make}, are called
@dfn{targets}.  @code{make} is a shorthand for @code{make all},
@code{all} being the default target in the GNU Build System.

Here is a list of the most useful targets that the GNU Coding Standards
specify.

@table @code
@item make all
@trindex all
Build programs, libraries, documentation, etc.@: (same as @code{make}).
@item make install
@trindex install
Install what needs to be installed, copying the files from the
package's tree to system-wide directories.
@item make install-strip
@trindex install-strip
Same as @code{make install}, then strip debugging symbols.  Some
users like to trade space for useful bug reports@enddots{}
@item make uninstall
@trindex uninstall
The opposite of @code{make install}: erase the installed files.
(This needs to be run from the same build tree that was installed.)
@item make clean
@trindex clean
Erase from the build tree the files built by @code{make all}.
@item make distclean
@trindex distclean
Additionally erase anything @code{./configure} created.
@item make check
@trindex check
Run the test suite, if any.
@item make installcheck
@trindex installcheck
Check the installed programs or libraries, if supported.
@item make dist
@trindex dist
Recreate @file{@var{package}-@var{version}.tar.gz} from all the source
files.
@end table

@node Standard Directory Variables
@subsection Standard Directory Variables
@cindex directory variables

The GNU Coding Standards also specify a hierarchy of variables to
denote installation directories.  Some of these are:

@multitable {Directory variable} {@code{$@{datarootdir@}/doc/$@{PACKAGE@}}}
@headitem Directory variable    @tab Default value
@item @code{prefix}              @tab @code{/usr/local}
@item @w{@ @ @code{exec_prefix}} @tab @code{$@{prefix@}}
@item @w{@ @ @ @ @code{bindir}}  @tab @code{$@{exec_prefix@}/bin}
@item @w{@ @ @ @ @code{libdir}}  @tab @code{$@{exec_prefix@}/lib}
@item @w{@ @ @ @ @dots{}}
@item @w{@ @ @code{includedir}}  @tab @code{$@{prefix@}/include}
@item @w{@ @ @code{datarootdir}} @tab @code{$@{prefix@}/share}
@item @w{@ @ @ @ @code{datadir}} @tab @code{$@{datarootdir@}}
@item @w{@ @ @ @ @code{mandir}}  @tab @code{$@{datarootdir@}/man}
@item @w{@ @ @ @ @code{infodir}} @tab @code{$@{datarootdir@}/info}
@item @w{@ @ @ @ @code{docdir}}  @tab @code{$@{datarootdir@}/doc/$@{PACKAGE@}}
@item @w{@ @ @dots{}}
@end multitable

@c We should provide a complete table somewhere, but not here.  The
@c complete list of directory variables it too confusing as-is.  It
@c requires some explanations that are too complicated for this
@c introduction.  Besides listing directories like localstatedir
@c would make the explanations in ``Two-Part Install'' harder.

Each of these directories has a role which is often obvious from its
name.  In a package, any installable file will be installed in one of
these directories.  For instance in @code{amhello-1.0}, the program
@file{hello} is to be installed in @var{bindir}, the directory for
binaries.  The default value for this directory is
@file{/usr/local/bin}, but the user can supply a different value when
calling @command{configure}.  Also the file @file{README} will be
installed into @var{docdir}, which defaults to
@file{/usr/local/share/doc/amhello}.

@opindex --prefix

As a user, if you wish to install a package on your own account, you
could proceed as follows:

@example
~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
@dots{}
~/amhello-1.0 % @kbd{make}
@dots{}
~/amhello-1.0 % @kbd{make install}
@dots{}
@end example

This would install @file{~/usr/bin/hello} and
@file{~/usr/share/doc/amhello/README}.

The list of all such directory options is shown by
@code{./configure --help}.

@node Standard Configuration Variables
@subsection Standard Configuration Variables
@cindex configuration variables, overriding

The GNU Coding Standards also define a set of standard configuration
variables used during the build.  Here are some:

@table @asis
@item @code{CC}
C compiler command
@item @code{CFLAGS}
C compiler flags
@item @code{CXX}
C++ compiler command
@item @code{CXXFLAGS}
C++ compiler flags
@item @code{LDFLAGS}
linker flags
@item @code{CPPFLAGS}
C/C++ preprocessor flags
@item @dots{}
@end table

@command{configure} usually does a good job at setting appropriate
values for these variables, but there are cases where you may want to
override them.  For instance you may have several versions of a
compiler installed and would like to use another one, you may have
header files installed outside the default search path of the
compiler, or even libraries out of the way of the linker.

Here is how one would call @command{configure} to force it to use
@command{gcc-3} as C compiler, use header files from
@file{~/usr/include} when compiling, and libraries from
@file{~/usr/lib} when linking.

@example
~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
@end example

Again, a full list of these variables appears in the output of
@code{./configure --help}.

@node config.site
@subsection Overriding Default Configuration Setting with @file{config.site}
@cindex @file{config.site} example

When installing several packages using the same setup, it can be
convenient to create a file to capture common settings.
If a file named @file{@var{prefix}/share/config.site} exists,
@command{configure} will source it at the beginning of its execution.

Recall the command from the previous section:

@example
~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
@end example

Assuming we are installing many package in @file{~/usr}, and will
always want to use these definitions of @code{CC}, @code{CPPFLAGS}, and
@code{LDFLAGS}, we can automate this by creating the following
@file{~/usr/share/config.site} file:

@example
test -z "$CC" && CC=gcc-3
test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include
test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib
@end example

Now, any time a @file{configure} script is using the @file{~/usr}
prefix, it will execute the above @file{config.site} and define
these three variables.

@example
~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
configure: loading site script /home/adl/usr/share/config.site
@dots{}
@end example

@xref{Site Defaults, , Setting Site Defaults, autoconf, The Autoconf
Manual}, for more information about this feature.


@node VPATH Builds
@subsection Parallel Build Trees (a.k.a.@: VPATH Builds)
@cindex Parallel build trees
@cindex VPATH builds
@cindex source tree and build tree
@cindex build tree and source tree
@cindex trees, source vs.@: build

The GNU Build System distinguishes two trees: the source tree, and
the build tree.

The source tree is rooted in the directory containing
@file{configure}.  It contains all the sources files (those that are
distributed), and may be arranged using several subdirectories.

The build tree is rooted in the directory in which @file{configure}
was run, and is populated with all object files, programs, libraries,
and other derived files built from the sources (and hence not
distributed).  The build tree usually has the same subdirectory layout
as the source tree; its subdirectories are created automatically by
the build system.

If @file{configure} is executed in its own directory, the source and
build trees are combined: derived files are constructed in the same
directories as their sources.  This was the case in our first
installation example (@pxref{Basic Installation}).

A common request from users is that they want to confine all derived
files to a single directory, to keep their source directories
uncluttered.  Here is how we could run @file{configure} to build
everything in a subdirectory called @file{build/}.

@example
~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
~ % @kbd{cd amhello-1.0}
~/amhello-1.0 % @kbd{mkdir build && cd build}
~/amhello-1.0/build % @kbd{../configure}
@dots{}
~/amhello-1.0/build % @kbd{make}
@dots{}
@end example

These setups, where source and build trees are different, are often
called @dfn{parallel builds} or @dfn{VPATH builds}.  The expression
@emph{parallel build} is misleading: the word @emph{parallel} is a
reference to the way the build tree shadows the source tree, it is not
about some concurrency in the way build commands are run.  For this
reason we refer to such setups using the name @emph{VPATH builds} in
the following.  @emph{VPATH} is the name of the @command{make} feature
used by the @file{Makefile}s to allow these builds (@pxref{General
Search, , @code{VPATH} Search Path for All Prerequisites, make, The
GNU Make Manual}).

@cindex multiple configurations, example
@cindex debug build, example
@cindex optimized build, example

VPATH builds have other interesting uses.  One is to build the same
sources with multiple configurations.  For instance:

@c Keep in sync with amhello-cflags.sh
@example
~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
~ % @kbd{cd amhello-1.0}
~/amhello-1.0 % @kbd{mkdir debug optim && cd debug}
~/amhello-1.0/debug % @kbd{../configure CFLAGS='-g -O0'}
@dots{}
~/amhello-1.0/debug % @kbd{make}
@dots{}
~/amhello-1.0/debug % cd ../optim
~/amhello-1.0/optim % @kbd{../configure CFLAGS='-O3 -fomit-frame-pointer'}
@dots{}
~/amhello-1.0/optim % @kbd{make}
@dots{}
@end example

With network file systems, a similar approach can be used to build the
same sources on different machines.  For instance, suppose that the
sources are installed on a directory shared by two hosts: @code{HOST1}
and @code{HOST2}, which may be different platforms.

@example
~ % @kbd{cd /nfs/src}
/nfs/src % @kbd{tar zxf ~/amhello-1.0.tar.gz}
@end example

On the first host, you could create a local build directory:
@example
[HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
[HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
...
[HOST1] /tmp/amh % @kbd{make && sudo make install}
...
@end example

@noindent
(Here we assume that the installer has configured @command{sudo} so it
can execute @code{make install} with root privileges; it is more convenient
than using @command{su} like in @ref{Basic Installation}).

On the second host, you would do exactly the same, possibly at
the same time:
@example
[HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
[HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
...
[HOST2] /tmp/amh % @kbd{make && sudo make install}
...
@end example

@cindex read-only source tree
@cindex source tree, read-only

In this scenario, nothing forbids the @file{/nfs/src/amhello-1.0}
directory from being read-only.  In fact VPATH builds are also a means
of building packages from a read-only medium such as a CD-ROM.  (The
FSF used to sell CD-ROM with unpacked source code, before the GNU
project grew so big.)

@node Two-Part Install
@subsection Two-Part Installation

In our last example (@pxref{VPATH Builds}), a source tree was shared
by two hosts, but compilation and installation were done separately on
each host.

The GNU Build System also supports networked setups where part of the
installed files should be shared amongst multiple hosts.  It does so
by distinguishing architecture-dependent files from
architecture-independent files, and providing two @file{Makefile}
targets to install each of these classes of files.

@trindex install-exec
@trindex install-data

These targets are @code{install-exec} for architecture-dependent files
and @code{install-data} for architecture-independent files.
The command we used up to now, @code{make install}, can be thought of
as a shorthand for @code{make install-exec install-data}.

From the GNU Build System point of view, the distinction between
architecture-dependent files and architecture-independent files is
based exclusively on the directory variable used to specify their
installation destination.  In the list of directory variables we
provided earlier (@pxref{Standard Directory Variables}), all the
variables based on @var{exec-prefix} designate architecture-dependent
directories whose files will be installed by @code{make install-exec}.
The others designate architecture-independent directories and will
serve files installed by @code{make install-data}.  @xref{The Two Parts
of Install}, for more details.

Here is how we could revisit our two-host installation example,
assuming that (1) we want to install the package directly in
@file{/usr}, and (2) the directory @file{/usr/share} is shared by the
two hosts.

On the first host we would run
@example
[HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
[HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
...
[HOST1] /tmp/amh % @kbd{make && sudo make install}
...
@end example

On the second host, however, we need only install the
architecture-specific files.
@example
[HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
[HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
...
[HOST2] /tmp/amh % @kbd{make && sudo make install-exec}
...
@end example

In packages that have installation checks, it would make sense to run
@code{make installcheck} (@pxref{Basic Installation}) to verify that
the package works correctly despite the apparent partial installation.

@node Cross-Compilation
@subsection Cross-Compilation
@cindex cross-compilation

To @dfn{cross-compile} is to build on one platform a binary that will
run on another platform.  When speaking of cross-compilation, it is
important to distinguish between the @dfn{build platform} on which
the compilation is performed, and the @dfn{host platform} on which the
resulting executable is expected to run.  The following
@command{configure} options are used to specify each of them:

@table @option
@item --build=@var{build}
@opindex --build=@var{build}
The system on which the package is built.
@item --host=@var{host}
@opindex --host=@var{host}
The system where built programs and libraries will run.
@end table

When the @option{--host} is used, @command{configure} will search for
the cross-compiling suite for this platform.  Cross-compilation tools
commonly have their target architecture as prefix of their name.  For
instance my cross-compiler for MinGW32 has its binaries called
@code{i586-mingw32msvc-gcc}, @code{i586-mingw32msvc-ld},
@code{i586-mingw32msvc-as}, etc.

@cindex MinGW cross-compilation example
@cindex cross-compilation example

Here is how we could build @code{amhello-1.0} for
@code{i586-mingw32msvc} on a GNU/Linux PC.

@c Keep in sync with amhello-cross-compile.sh
@smallexample
~/amhello-1.0 % @kbd{./configure --build i686-pc-linux-gnu --host i586-mingw32msvc}
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for i586-mingw32msvc-strip... i586-mingw32msvc-strip
checking for i586-mingw32msvc-gcc... i586-mingw32msvc-gcc
checking for C compiler default output file name... a.exe
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables... .exe
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether i586-mingw32msvc-gcc accepts -g... yes
checking for i586-mingw32msvc-gcc option to accept ANSI C...
@dots{}
~/amhello-1.0 % @kbd{make}
@dots{}
~/amhello-1.0 % @kbd{cd src; file hello.exe}
hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable
@end smallexample

The @option{--host} and @option{--build} options are usually all we
need for cross-compiling.  The only exception is if the package being
built is itself a cross-compiler: we need a third option to specify
its target architecture.

@table @option
@item --target=@var{target}
@opindex --target=@var{target}
When building compiler tools: the system for which the tools will
create output.
@end table

For instance when installing GCC, the GNU Compiler Collection, we can
use @option{--target=@/@var{target}} to specify that we want to build
GCC as a cross-compiler for @var{target}.  Mixing @option{--build} and
@option{--target}, we can actually cross-compile a cross-compiler;
such a three-way cross-compilation is known as a @dfn{Canadian cross}.

@xref{Specifying Names, , Specifying the System Type, autoconf, The
Autoconf Manual}, for more information about these @command{configure}
options.

@node Renaming
@subsection Renaming Programs at Install Time
@cindex Renaming programs
@cindex Transforming program names
@cindex Programs, renaming during installation

The GNU Build System provides means to automatically rename
executables and manpages before they are installed (@pxref{Man Pages}).
This is especially convenient
when installing a GNU package on a system that already has a
proprietary implementation you do not want to overwrite.  For instance,
you may want to install GNU @command{tar} as @command{gtar} so you can
distinguish it from your vendor's @command{tar}.

This can be done using one of these three @command{configure} options.

@table @option
@item --program-prefix=@var{prefix}
@opindex --program-prefix=@var{prefix}
Prepend @var{prefix} to installed program names.
@item --program-suffix=@var{suffix}
@opindex --program-suffix=@var{suffix}
Append @var{suffix} to installed program names.
@item --program-transform-name=@var{program}
@opindex --program-transform-name=@var{program}
Run @code{sed @var{program}} on installed program names.
@end table

The following commands would install @file{hello}
as @file{/usr/local/bin/test-hello}, for instance.

@example
~/amhello-1.0 % @kbd{./configure --program-prefix test-}
@dots{}
~/amhello-1.0 % @kbd{make}
@dots{}
~/amhello-1.0 % @kbd{sudo make install}
@dots{}
@end example

@node DESTDIR
@subsection Building Binary Packages Using DESTDIR
@vindex DESTDIR

The GNU Build System's @code{make install} and @code{make uninstall}
interface does not exactly fit the needs of a system administrator
who has to deploy and upgrade packages on lots of hosts.  In other
words, the GNU Build System does not replace a package manager.

Such package managers usually need to know which files have been
installed by a package, so a mere @code{make install} is
inappropriate.

@cindex Staged installation

The @code{DESTDIR} variable can be used to perform a staged
installation.  The package should be configured as if it was going to
be installed in its final location (e.g., @code{--prefix /usr}), but
when running @code{make install}, the @code{DESTDIR} should be set to
the absolute name of a directory into which the installation will be
diverted.  From this directory it is easy to review which files are
being installed where, and finally copy them to their final location
by some means.

@cindex Binary package

For instance here is how we could create a binary package containing a
snapshot of all the files to be installed.

@c Keep in sync with amhello-binpkg.sh
@example
~/amhello-1.0 % @kbd{./configure --prefix /usr}
@dots{}
~/amhello-1.0 % @kbd{make}
@dots{}
~/amhello-1.0 % @kbd{make DESTDIR=$HOME/inst install}
@dots{}
~/amhello-1.0 % @kbd{cd ~/inst}
~/inst % @kbd{find . -type f -print > ../files.lst}
~/inst % @kbd{tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`}
./usr/bin/hello
./usr/share/doc/amhello/README
@end example

After this example, @code{amhello-1.0-i686.tar.gz} is ready to be
uncompressed in @file{/} on many hosts.  (Using @code{`cat ../files.lst`}
instead of @samp{.} as argument for @command{tar} avoids entries for
each subdirectory in the archive: we would not like @command{tar} to
restore the modification time of @file{/}, @file{/usr/}, etc.)

Note that when building packages for several architectures, it might
be convenient to use @code{make install-data} and @code{make
install-exec} (@pxref{Two-Part Install}) to gather
architecture-independent files in a single package.

@xref{Install}, for more information.

@c We should document PRE_INSTALL/POST_INSTALL/NORMAL_INSTALL and their
@c UNINSTALL counterparts.

@node Preparing Distributions
@subsection Preparing Distributions
@cindex Preparing distributions
@cindex Packages, preparation
@cindex Distributions, preparation

We have already mentioned @code{make dist}.  This target collects all
your source files and the necessary parts of the build system to
create a tarball named @file{@var{package}-@var{version}.tar.gz}.

@cindex @code{distcheck} better than @code{dist}

Another, more useful command is @code{make distcheck}.  The
@code{distcheck} target constructs
@file{@var{package}-@var{version}.tar.gz} just as well as @code{dist},
but it additionally ensures most of the use cases presented so far
work:

@itemize @bullet
@item
It attempts a full compilation of the package (@pxref{Basic
Installation}), unpacking the newly constructed tarball, running
@code{make}, @code{make check}, @code{make install}, as well as
@code{make installcheck}, and even @code{make dist},
@item
it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}),
@item
it makes sure @code{make clean}, @code{make distclean}, and @code{make
uninstall} do not omit any file (@pxref{Standard Targets}),
@item
and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}).
@end itemize

All of these actions are performed in a temporary directory, so that no
root privileges are required.  Please note that the exact location and the
exact structure of such a subdirectory (where the extracted sources are
placed, how the temporary build and install directories are named and how
deeply they are nested, etc.) is to be considered an implementation detail,
which can change at any time; so do not rely on it.

Releasing a package that fails @code{make distcheck} means that one of
the scenarios we presented will not work and some users will be
disappointed.  Therefore it is a good practice to release a package
only after a successful @code{make distcheck}.  This of course does
not imply that the package will be flawless, but at least it will
prevent some of the embarrassing errors you may find in packages
released by people who have never heard about @code{distcheck} (like
@code{DESTDIR} not working because of a typo, or a distributed file
being erased by @code{make clean}, or even @code{VPATH} builds not
working).

@xref{Creating amhello}, to recreate @file{amhello-1.0.tar.gz} using
@code{make distcheck}.  @xref{Checking the Distribution}, for more
information about @code{distcheck}.

@node Dependency Tracking
@subsection Automatic Dependency Tracking
@cindex Dependency tracking

Dependency tracking is performed as a side-effect of compilation.
Each time the build system compiles a source file, it computes its
list of dependencies (in C these are the header files included by the
source being compiled).  Later, any time @command{make} is run and a
dependency appears to have changed, the dependent files will be
rebuilt.

Automake generates code for automatic dependency tracking by default,
unless the developer chooses to override it; for more information,
@pxref{Dependencies}.

When @command{configure} is executed, you can see it probing each
compiler for the dependency mechanism it supports (several mechanisms
can be used):

@example
~/amhello-1.0 % @kbd{./configure --prefix /usr}
@dots{}
checking dependency style of gcc... gcc3
@dots{}
@end example

Because dependencies are only computed as a side-effect of the
compilation, no dependency information exists the first time a package
is built.  This is OK because all the files need to be built anyway:
@code{make} does not have to decide which files need to be rebuilt.
In fact, dependency tracking is completely useless for one-time builds
and there is a @command{configure} option to disable this:

@table @option
@item --disable-dependency-tracking
@opindex --disable-dependency-tracking
Speed up one-time builds.
@end table

Some compilers do not offer any practical way to derive the list of
dependencies as a side-effect of the compilation, requiring a separate
run (maybe of another tool) to compute these dependencies.  The
performance penalty implied by these methods is important enough to
disable them by default.  The option @option{--enable-dependency-tracking}
must be passed to @command{configure} to activate them.

@table @option
@item --enable-dependency-tracking
@opindex --enable-dependency-tracking
Do not reject slow dependency extractors.
@end table

@xref{Dependency Tracking Evolution, , Dependency Tracking Evolution,
automake-history, Brief History of Automake}, for some discussion about
the different dependency tracking schemes used by Automake over the years.

@node Nested Packages
@subsection Nested Packages
@cindex Nested packages
@cindex Packages, nested
@cindex Subpackages

Although nesting packages isn't something we would recommend to
someone who is discovering the Autotools, it is a nice feature worthy
of mention in this small advertising tour.

Autoconfiscated packages (that means packages whose build system have
been created by Autoconf and friends) can be nested to arbitrary
depth.

A typical setup is that package A will distribute one of the libraries
it needs in a subdirectory.  This library B is a complete package with
its own GNU Build System.  The @command{configure} script of A will
run the @command{configure} script of B as part of its execution,
building and installing A will also build and install B.  Generating a
distribution for A will also include B.

It is possible to gather several packages like this.  GCC is a heavy
user of this feature.  This gives installers a single package to
configure, build and install, while it allows developers to work on
subpackages independently.

When configuring nested packages, the @command{configure} options
given to the top-level @command{configure} are passed recursively to
nested @command{configure}s.  A package that does not understand an
option will ignore it, assuming it is meaningful to some other
package.

@opindex --help=recursive

The command @code{configure --help=recursive} can be used to display
the options supported by all the included packages.

@xref{Subpackages}, for an example setup.

@node Why Autotools
@section How Autotools Help
@cindex Autotools, purpose

There are several reasons why you may not want to implement the GNU
Build System yourself (read: write a @file{configure} script and
@file{Makefile}s yourself).

@itemize @bullet
@item
As we have seen, the GNU Build System has a lot of
features (@pxref{Use Cases}).
Some users may expect features you have not implemented because
you did not need them.
@item
Implementing these features portably is difficult and exhausting.
Think of writing portable shell scripts, and portable
@file{Makefile}s, for systems you may not have handy.  @xref{Portable
Shell, , Portable Shell Programming, autoconf, The Autoconf Manual}, to
convince yourself.
@item
You will have to upgrade your setup to follow changes to the GNU
Coding Standards.
@end itemize

The GNU Autotools take all this burden off your back and provide:

@itemize @bullet
@item
Tools to create a portable, complete, and self-contained GNU Build
System, from simple instructions.
@emph{Self-contained} meaning the resulting build system does not
require the GNU Autotools.
@item
A central place where fixes and improvements are made:
a bug-fix for a portability issue will benefit every package.
@end itemize

Yet there also exist reasons why you may want NOT to use the
Autotools@enddots{} For instance you may be already using (or used to)
another incompatible build system.  Autotools will only be useful if
you do accept the concepts of the GNU Build System.  People who have their
own idea of how a build system should work will feel frustrated by the
Autotools.

@node Hello World
@section A Small Hello World
@cindex Example Hello World
@cindex Hello World example
@cindex @file{amhello-1.0.tar.gz}, creation

In this section we recreate the @file{amhello-1.0} package from
scratch.  The first subsection shows how to call the Autotools to
instantiate the GNU Build System, while the second explains the
meaning of the @file{configure.ac} and @file{Makefile.am} files read
by the Autotools.

@anchor{amhello Explained}
@menu
* Creating amhello::            Create @file{amhello-1.0.tar.gz} from scratch
* amhello's configure.ac Setup Explained::
* amhello's Makefile.am Setup Explained::
@end menu

@node Creating amhello
@subsection Creating @file{amhello-1.0.tar.gz}

Here is how we can recreate @file{amhello-1.0.tar.gz} from scratch.
The package is simple enough so that we will only need to write 5
files.  (You may copy them from the final @file{amhello-1.0.tar.gz}
that is distributed with Automake if you do not want to write them.)

Create the following files in an empty directory.

@itemize @bullet

@item
@file{src/main.c} is the source file for the @file{hello} program.  We
store it in the @file{src/} subdirectory, because later, when the package
evolves, it will ease the addition of a @file{man/} directory for man
pages, a @file{data/} directory for data files, etc.
@example
~/amhello % @kbd{cat src/main.c}
#include <config.h>
#include <stdio.h>

int
main (void)
@{
  puts ("Hello World!");
  puts ("This is " PACKAGE_STRING ".");
  return 0;
@}
@end example

@item
@file{README} contains some very limited documentation for our little
package.
@example
~/amhello % @kbd{cat README}
This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.
@end example

@item
@file{Makefile.am} and @file{src/Makefile.am} contain Automake
instructions for these two directories.

@example
~/amhello % @kbd{cat src/Makefile.am}
bin_PROGRAMS = hello
hello_SOURCES = main.c
~/amhello % @kbd{cat Makefile.am}
SUBDIRS = src
dist_doc_DATA = README
@end example

@item
Finally, @file{configure.ac} contains Autoconf instructions to
create the @command{configure} script.

@example
~/amhello % @kbd{cat configure.ac}
AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT
@end example
@end itemize

@cindex @command{autoreconf}, example

Once you have these five files, it is time to run the Autotools to
instantiate the build system.  Do this using the @command{autoreconf}
command as follows:

@example
~/amhello % @kbd{autoreconf --install}
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'
@end example

At this point the build system is complete.

In addition to the three scripts mentioned in its output, you can see
that @command{autoreconf} created four other files: @file{configure},
@file{config.h.in}, @file{Makefile.in}, and @file{src/Makefile.in}.
The latter three files are templates that will be adapted to the
system by @command{configure} under the names @file{config.h},
@file{Makefile}, and @file{src/Makefile}.  Let's do this:

@example
~/amhello % @kbd{./configure}
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
@end example

@trindex distcheck
@cindex @code{distcheck} example

You can see @file{Makefile}, @file{src/Makefile}, and @file{config.h}
being created at the end after @command{configure} has probed the
system.  It is now possible to run all the targets we wish
(@pxref{Standard Targets}).  For instance:

@example
~/amhello % @kbd{make}
@dots{}
~/amhello % @kbd{src/hello}
Hello World!
This is amhello 1.0.
~/amhello % @kbd{make distcheck}
@dots{}
=============================================
amhello-1.0 archives ready for distribution:
amhello-1.0.tar.gz
=============================================
@end example

Note that running @command{autoreconf} is only needed initially when
the GNU Build System does not exist.  When you later change some
instructions in a @file{Makefile.am} or @file{configure.ac}, the
relevant part of the build system will be regenerated automatically
when you execute @command{make}.

@command{autoreconf} is a script that calls @command{autoconf},
@command{automake}, and a bunch of other commands in the right order.
If you are beginning with these tools, it is not important to figure
out in which order all of these tools should be invoked and why.  However,
because Autoconf and Automake have separate manuals, the important
point to understand is that @command{autoconf} is in charge of
creating @file{configure} from @file{configure.ac}, while
@command{automake} is in charge of creating @file{Makefile.in}s from
@file{Makefile.am}s and @file{configure.ac}.  This should at least
direct you to the right manual when seeking answers.


@node amhello's configure.ac Setup Explained
@subsection @code{amhello}'s @file{configure.ac} Setup Explained

@cindex @file{configure.ac}, Hello World

Let us begin with the contents of @file{configure.ac}.

@example
AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT
@end example

This file is read by both @command{autoconf} (to create
@file{configure}) and @command{automake} (to create the various
@file{Makefile.in}s).  It contains a series of M4 macros that will be
expanded as shell code to finally form the @file{configure} script.
We will not elaborate on the syntax of this file, because the Autoconf
manual has a whole section about it (@pxref{Writing Autoconf Input, ,
Writing @file{configure.ac}, autoconf, The Autoconf Manual}).

The macros prefixed with @code{AC_} are Autoconf macros, documented
in the Autoconf manual (@pxref{Autoconf Macro Index, , Autoconf Macro
Index, autoconf, The Autoconf Manual}).  The macros that start with
@code{AM_} are Automake macros, documented later in this manual
(@pxref{Macro Index}).

The first two lines of @file{configure.ac} initialize Autoconf and
Automake.  @code{AC_INIT} takes in as parameters the name of the package,
its version number, and a contact address for bug-reports about the
package (this address is output at the end of @code{./configure
--help}, for instance).  When adapting this setup to your own package,
by all means please do not blindly copy Automake's address: use the
mailing list of your package, or your own mail address.

@opindex -Wall
@opindex -Werror
@opindex foreign

The argument to @code{AM_INIT_AUTOMAKE} is a list of options for
@command{automake} (@pxref{Options}).  @option{-Wall} and
@option{-Werror} ask @command{automake} to turn on all warnings and
report them as errors.  We are speaking of @strong{Automake} warnings
here, such as dubious instructions in @file{Makefile.am}.  This has
absolutely nothing to do with how the compiler will be called, even
though it may support options with similar names.  Using @option{-Wall
-Werror} is a safe setting when starting to work on a package: you do
not want to miss any issues.  Later you may decide to relax things a
bit.  The @option{foreign} option tells Automake that this package
will not follow the GNU Standards.  GNU packages should always
distribute additional files such as @file{ChangeLog}, @file{AUTHORS},
etc.  We do not want @command{automake} to complain about these
missing files in our small example.

The @code{AC_PROG_CC} line causes the @command{configure} script to
search for a C compiler and define the variable @code{CC} with its
name.  The @file{src/Makefile.in} file generated by Automake uses the
variable @code{CC} to build @file{hello}, so when @command{configure}
creates @file{src/Makefile} from @file{src/Makefile.in}, it will define
@code{CC} with the value it has found.  If Automake is asked to create
a @file{Makefile.in} that uses @code{CC} but @file{configure.ac} does
not define it, it will suggest you add a call to @code{AC_PROG_CC}.

The @code{AC_CONFIG_HEADERS([config.h])} invocation causes the
@command{configure} script to create a @file{config.h} file gathering
@samp{#define}s defined by other macros in @file{configure.ac}.  In our
case, the @code{AC_INIT} macro already defined a few of them.  Here
is an excerpt of @file{config.h} after @command{configure} has run:

@smallexample
@dots{}
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "@value{PACKAGE_BUGREPORT}"

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "amhello 1.0"
@dots{}
@end smallexample

As you probably noticed, @file{src/main.c} includes @file{config.h} so
it can use @code{PACKAGE_STRING}.  In a real-world project,
@file{config.h} can grow really big, with one @samp{#define} per
feature probed on the system.

The @code{AC_CONFIG_FILES} macro declares the list of files that
@command{configure} should create from their @file{*.in} templates.
Automake also scans this list to find the @file{Makefile.am} files it must
process.  (This is important to remember: when adding a new directory
to your project, you should add its @file{Makefile} to this list,
otherwise Automake will never process the new @file{Makefile.am} you
wrote in that directory.)

Finally, the @code{AC_OUTPUT} line is a closing command that actually
produces the part of the script in charge of creating the files
registered with @code{AC_CONFIG_HEADERS} and @code{AC_CONFIG_FILES}.

@cindex @command{autoscan}

When starting a new project, we suggest you start with such a simple
@file{configure.ac}, and gradually add the other tests it requires.
The command @command{autoscan} can also suggest a few of the tests
your package may need (@pxref{autoscan Invocation, , Using
@command{autoscan} to Create @file{configure.ac}, autoconf, The
Autoconf Manual}).


@node amhello's Makefile.am Setup Explained
@subsection @code{amhello}'s @file{Makefile.am} Setup Explained

@cindex @file{Makefile.am}, Hello World

We now turn to @file{src/Makefile.am}.  This file contains
Automake instructions to build and install @file{hello}.

@example
bin_PROGRAMS = hello
hello_SOURCES = main.c
@end example

A @file{Makefile.am} has the same syntax as an ordinary
@file{Makefile}.  When @command{automake} processes a
@file{Makefile.am} it copies the entire file into the output
@file{Makefile.in} (that will be later turned into @file{Makefile} by
@command{configure}) but will react to certain variable definitions
by generating some build rules and other variables.
Often @file{Makefile.am}s contain only a list of variable definitions as
above, but they can also contain other variable and rule definitions that
@command{automake} will pass along without interpretation.

Variables that end with @code{_PROGRAMS} are special variables
that list programs that the resulting @file{Makefile} should build.
In Automake speak, this @code{_PROGRAMS} suffix is called a
@dfn{primary}; Automake recognizes other primaries such as
@code{_SCRIPTS}, @code{_DATA}, @code{_LIBRARIES}, etc.@: corresponding
to different types of files.

The @samp{bin} part of the @code{bin_PROGRAMS} tells
@command{automake} that the resulting programs should be installed in
@var{bindir}.  Recall that the GNU Build System uses a set of variables
to denote destination directories and allow users to customize these
locations (@pxref{Standard Directory Variables}).  Any such directory
variable can be put in front of a primary (omitting the @code{dir}
suffix) to tell @command{automake} where to install the listed files.

Programs need to be built from source files, so for each program
@code{@var{prog}} listed in a @code{@w{_PROGRAMS}} variable,
@command{automake} will look for another variable named
@code{@var{prog}_SOURCES} listing its source files.  There may be more
than one source file: they will all be compiled and linked together.

Automake also knows that source files need to be distributed when
creating a tarball (unlike built programs).  So a side-effect of this
@code{hello_SOURCES} declaration is that @file{main.c} will be
part of the tarball created by @code{make dist}.

Finally here are some explanations regarding the top-level
@file{Makefile.am}.

@example
SUBDIRS = src
dist_doc_DATA = README
@end example

@code{SUBDIRS} is a special variable listing all directories that
@command{make} should recurse into before processing the current
directory.  So this line is responsible for @command{make} building
@file{src/hello} even though we run it from the top-level.  This line
also causes @code{make install} to install @file{src/hello} before
installing @file{README} (not that this order matters).

The line @code{dist_doc_DATA = README} causes @file{README} to be
distributed and installed in @var{docdir}.  Files listed with the
@code{_DATA} primary are not automatically part of the tarball built
with @code{make dist}, so we add the @code{dist_} prefix so they get
distributed.  However, for @file{README} it would not have been
necessary: @command{automake} automatically distributes any
@file{README} file it encounters (the list of other files
automatically distributed is presented by @code{automake --help}).
The only important effect of this second line is therefore to install
@file{README} during @code{make install}.

One thing not covered in this example is accessing the installation
directory values (@pxref{Standard Directory Variables}) from your
program code, that is, converting them into defined macros.  For this,
@pxref{Defining Directories,,, autoconf, The Autoconf Manual}.


@node Generalities
@chapter General ideas

The following sections cover a few basic ideas that will help you
understand how Automake works.

@menu
* General Operation::           General operation of Automake
* Strictness::                  Standards conformance checking
* Uniform::                     The Uniform Naming Scheme
* Length Limitations::          Staying below the command line length limit
* Canonicalization::            How derived variables are named
* User Variables::              Variables reserved for the user
* Auxiliary Programs::          Programs automake might require
@end menu


@node General Operation
@section General Operation

Automake works by reading a @file{Makefile.am} and generating a
@file{Makefile.in}.  Certain variables and rules defined in the
@file{Makefile.am} instruct Automake to generate more specialized code;
for instance, a @code{bin_PROGRAMS} variable definition will cause rules
for compiling and linking programs to be generated.

@cindex Non-standard targets
@cindex @code{git-dist}, non-standard example
@trindex git-dist

The variable definitions and rules in the @file{Makefile.am} are
copied mostly verbatim into the generated file, with all variable
definitions preceding all rules.  This allows you to add almost
arbitrary code into the generated @file{Makefile.in}.  For instance,
the Automake distribution includes a non-standard rule for the
@code{git-dist} target, which the Automake maintainer uses to make
distributions from the source control system.

@cindex GNU make extensions

Note that most GNU make extensions are not recognized by Automake.  Using
such extensions in a @file{Makefile.am} will lead to errors or confusing
behavior.

@cindex Append operator
@cmindex +=
A special exception is that the GNU make append operator, @samp{+=}, is
supported.  This operator appends its right hand argument to the variable
specified on the left.  Automake will translate the operator into
an ordinary @samp{=} operator; @samp{+=} will thus work with any make program.

Automake tries to keep comments grouped with any adjoining rules or
variable definitions.

@cindex Limitations of automake parser
@cindex Automake parser, limitations of
@cindex indentation in Makefile.am
Generally, Automake is not particularly smart in the parsing of unusual
Makefile constructs, so you're advised to avoid fancy constructs or
``creative'' use of whitespace.
@c Keep this in sync with doc-parsing-buglets-tabs.sh
For example, @key{TAB} characters cannot be used between a target name
and the following ``@code{:}'' character, and variable assignments
shouldn't be indented with @key{TAB} characters.
@c Keep this in sync with doc-parsing-buglets-colneq-subst.sh
Also, using more complex macro in target names can cause trouble:

@example
% @kbd{cat Makefile.am}
$(FOO:=x): bar
% @kbd{automake}
Makefile.am:1: bad characters in variable name '$(FOO'
Makefile.am:1: ':='-style assignments are not portable
@end example

@cindex Make targets, overriding
@cindex Make rules, overriding
@cindex Overriding make rules
@cindex Overriding make targets

A rule defined in @file{Makefile.am} generally overrides any such
rule of a similar name that would be automatically generated by
@command{automake}.  Although this is a supported feature, it is generally
best to avoid making use of it, as sometimes the generated rules are
very particular.

@cindex Variables, overriding
@cindex Overriding make variables

Similarly, a variable defined in @file{Makefile.am} or
@code{AC_SUBST}ed from @file{configure.ac} will override any
definition of the variable that @command{automake} would ordinarily
create.  This feature is more often useful than the ability to
override a rule.  Be warned that many of the variables generated by
@command{automake} are considered to be for internal use only, and their
names might change in future releases.

@cindex Recursive operation of Automake
@cindex Automake, recursive operation
@cindex Example of recursive operation

When examining a variable definition, Automake will recursively examine
variables referenced in the definition.  For example, if Automake is
looking at the content of @code{foo_SOURCES} in this snippet

@c Keep in sync with interp.sh
@example
xs = a.c b.c
foo_SOURCES = c.c $(xs)
@end example

it would use the files @file{a.c}, @file{b.c}, and @file{c.c} as the
contents of @code{foo_SOURCES}.

@cindex @code{##} (special Automake comment)
@cindex Special Automake comment
@cindex Comment, special to Automake

Automake also allows a form of comment that is @emph{not} copied into
the output; all lines beginning with @samp{##} (leading spaces allowed)
are completely ignored by Automake.

It is customary to make the first line of @file{Makefile.am} read:

@cindex Makefile.am, first line
@cindex First line of Makefile.am

@example
## Process this file with automake to produce Makefile.in
@end example

@c FIXME document customary ordering of Makefile.am here!


@node Strictness
@section Strictness

@cindex Non-GNU packages

While Automake is intended to be used by maintainers of GNU packages, it
does make some effort to accommodate those who wish to use it, but do
not want to use all the GNU conventions.

@cindex Strictness, defined
@cindex Strictness, @option{foreign}
@cindex @option{foreign} strictness
@cindex Strictness, @option{gnu}
@cindex @option{gnu} strictness
@cindex Strictness, @option{gnits}
@cindex @option{gnits} strictness

To this end, Automake supports three levels of @dfn{strictness}---the
strictness indicating how stringently Automake should check standards
conformance.

The valid strictness levels are:

@table @option
@item foreign
Automake will check for only those things that are absolutely
required for proper operations.  For instance, whereas GNU standards
dictate the existence of a @file{NEWS} file, it will not be required in
this mode.  This strictness will also turn off some warnings by default
(among them, portability warnings).
The name comes from the fact that Automake is intended to be
used for GNU programs; these relaxed rules are not the standard mode of
operation.

@item gnu
Automake will check---as much as possible---for compliance to the GNU
standards for packages.  This is the default.

@item gnits
Automake will check for compliance to the as-yet-unwritten @dfn{Gnits
standards}.  These are based on the GNU standards, but are even more
detailed.  Unless you are a Gnits standards contributor, it is
recommended that you avoid this option until such time as the Gnits
standard is actually published (which may never happen).
@end table

@xref{Gnits}, for more information on the precise implications of the
strictness level.


@node Uniform
@section The Uniform Naming Scheme

@cindex Uniform naming scheme

Automake variables generally follow a @dfn{uniform naming scheme} that
makes it easy to decide how programs (and other derived objects) are
built, and how they are installed.  This scheme also supports
@command{configure} time determination of what should be built.

@cindex @code{_PROGRAMS} primary variable
@cindex @code{PROGRAMS} primary variable
@cindex Primary variable, @code{PROGRAMS}
@cindex Primary variable, defined
@vindex _PROGRAMS

At @command{make} time, certain variables are used to determine which
objects are to be built.  The variable names are made of several pieces
that are concatenated together.

The piece that tells @command{automake} what is being built is commonly called
the @dfn{primary}.  For instance, the primary @code{PROGRAMS} holds a
list of programs that are to be compiled and linked.
@vindex PROGRAMS

@cindex @code{pkgdatadir}, defined
@cindex @code{pkgincludedir}, defined
@cindex @code{pkglibdir}, defined
@cindex @code{pkglibexecdir}, defined

@vindex pkgdatadir
@vindex pkgincludedir
@vindex pkglibdir
@vindex pkglibexecdir

@cindex @code{PACKAGE}, directory
A different set of names is used to decide where the built objects
should be installed.  These names are prefixes to the primary, and they
indicate which standard directory should be used as the installation
directory.  The standard directory names are given in the GNU standards
(@pxref{Directory Variables, , , standards, The GNU Coding Standards}).
Automake extends this list with @code{pkgdatadir}, @code{pkgincludedir},
@code{pkglibdir}, and @code{pkglibexecdir}; these are the same as the
non-@samp{pkg} versions, but with @samp{$(PACKAGE)} appended.  For instance,
@code{pkglibdir} is defined as @samp{$(libdir)/$(PACKAGE)}.

@cindex @code{EXTRA_}, prepending
For each primary, there is one additional variable named by prepending
@samp{EXTRA_} to the primary name.  This variable is used to list
objects that may or may not be built, depending on what
@command{configure} decides.  This variable is required because Automake
must statically know the entire list of objects that may be built in
order to generate a @file{Makefile.in} that will work in all cases.

@cindex @code{EXTRA_PROGRAMS}, defined
@cindex Example, @code{EXTRA_PROGRAMS}
@cindex @command{cpio} example

For instance, @command{cpio} decides at configure time which programs
should be built.  Some of the programs are installed in @code{bindir},
and some are installed in @code{sbindir}:

@example
EXTRA_PROGRAMS = mt rmt
bin_PROGRAMS = cpio pax
sbin_PROGRAMS = $(MORE_PROGRAMS)
@end example

Defining a primary without a prefix as a variable, e.g.,
@samp{PROGRAMS}, is an error.

Note that the common @samp{dir} suffix is left off when constructing the
variable names; thus one writes @samp{bin_PROGRAMS} and not
@samp{bindir_PROGRAMS}.

Not every sort of object can be installed in every directory.  Automake
will flag those attempts it finds in error (but see below how to override
the check if you really need to).
Automake will also diagnose obvious misspellings in directory names.

@cindex Extending list of installation directories
@cindex Installation directories, extending list

Sometimes the standard directories---even as augmented by
Automake---are not enough.  In particular it is sometimes useful, for
clarity, to install objects in a subdirectory of some predefined
directory.  To this end, Automake allows you to extend the list of
possible installation directories.  A given prefix (e.g., @samp{zar})
is valid if a variable of the same name with @samp{dir} appended is
defined (e.g., @samp{zardir}).

For instance, the following snippet will install @file{file.xml} into
@samp{$(datadir)/xml}.

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
xmldir = $(datadir)/xml
xml_DATA = file.xml
@end example

This feature can also be used to override the sanity checks Automake
performs to diagnose suspicious directory/primary couples (in the
unlikely case these checks are undesirable, and you really know what
you're doing).  For example, Automake would error out on this input:

@c Should be tested in primary-prefix-invalid-couples.sh
@example
# Forbidden directory combinations, automake will error out on this.
pkglib_PROGRAMS = foo
doc_LIBRARIES = libquux.a
@end example

@noindent
but it will succeed with this:

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
# Work around forbidden directory combinations.  Do not use this
# without a very good reason!
my_execbindir = $(pkglibdir)
my_doclibdir = $(docdir)
my_execbin_PROGRAMS = foo
my_doclib_LIBRARIES = libquux.a
@end example

The @samp{exec} substring of the @samp{my_execbindir} variable lets
the files be installed at the right time (@pxref{The Two Parts of
Install}).

@cindex @samp{noinst_} primary prefix, definition
@vindex noinst_

The special prefix @samp{noinst_} indicates that the objects in question
should be built but not installed at all.  This is usually used for
objects required to build the rest of your package, for instance static
libraries (@pxref{A Library}), or helper scripts.

@cindex @samp{check_} primary prefix, definition
@vindex check_

The special prefix @samp{check_} indicates that the objects in question
should not be built until the @samp{make check} command is run.  Those
objects are not installed either.

The current primary names are @samp{PROGRAMS}, @samp{LIBRARIES},
@samp{LTLIBRARIES}, @samp{LISP}, @samp{PYTHON}, @samp{JAVA},
@samp{SCRIPTS}, @samp{DATA}, @samp{HEADERS}, @samp{MANS}, and
@samp{TEXINFOS}.
@vindex PROGRAMS
@vindex LIBRARIES
@vindex LTLIBRARIES
@vindex LISP
@vindex PYTHON
@vindex JAVA
@vindex SCRIPTS
@vindex DATA
@vindex HEADERS
@vindex MANS
@vindex TEXINFOS

Some primaries also allow additional prefixes that control other
aspects of @command{automake}'s behavior.  The currently defined prefixes
are @samp{dist_}, @samp{nodist_}, @samp{nobase_}, and @samp{notrans_}.
These prefixes are explained later (@pxref{Program and Library Variables})
(@pxref{Man Pages}).


@node Length Limitations
@section Staying below the command line length limit

@cindex command line length limit
@cindex ARG_MAX

Traditionally, most unix-like systems have a length limitation for the
command line arguments and environment contents when creating new
processes (see for example
@uref{http://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an
overview on this issue),
which of course also applies to commands spawned by @command{make}.
POSIX requires this limit to be at least 4096 bytes, and most modern
systems have quite high limits (or are unlimited).

In order to create portable Makefiles that do not trip over these
limits, it is necessary to keep the length of file lists bounded.
Unfortunately, it is not possible to do so fully transparently within
Automake, so your help may be needed.  Typically, you can split long
file lists manually and use different installation directory names for
each list.  For example,

@example
data_DATA = file1 @dots{} file@var{N} file@var{N+1} @dots{} file@var{2N}
@end example

@noindent
may also be written as

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
data_DATA = file1 @dots{} file@var{N}
data2dir = $(datadir)
data2_DATA = file@var{N+1} @dots{} file@var{2N}
@end example

@noindent
and will cause Automake to treat the two lists separately during
@code{make install}.  See @ref{The Two Parts of Install} for choosing
directory names that will keep the ordering of the two parts of
installation Note that @code{make dist} may still only work on a host
with a higher length limit in this example.

Automake itself employs a couple of strategies to avoid long command
lines.  For example, when @samp{$@{srcdir@}/} is prepended to file
names, as can happen with above @code{$(data_DATA)} lists, it limits
the amount of arguments passed to external commands.

Unfortunately, some system's @command{make} commands may prepend
@code{VPATH} prefixes like @samp{$@{srcdir@}/} to file names from the
source tree automatically (@pxref{Automatic Rule Rewriting, , Automatic
Rule Rewriting, autoconf, The Autoconf Manual}).  In this case, the user
may have to switch to use GNU Make, or refrain from using VPATH builds,
in order to stay below the length limit.

For libraries and programs built from many sources, convenience archives
may be used as intermediates in order to limit the object list length
(@pxref{Libtool Convenience Libraries}).


@node Canonicalization
@section How derived variables are named

@cindex canonicalizing Automake variables

Sometimes a Makefile variable name is derived from some text the
maintainer supplies.  For instance, a program name listed in
@samp{_PROGRAMS} is rewritten into the name of a @samp{_SOURCES}
variable.  In cases like this, Automake canonicalizes the text, so that
program names and the like do not have to follow Makefile variable naming
rules.  All characters in the name except for letters, numbers, the
strudel (@@), and the underscore are turned into underscores when making
variable references.

For example, if your program is named @file{sniff-glue}, the derived
variable name would be @samp{sniff_glue_SOURCES}, not
@samp{sniff-glue_SOURCES}.  Similarly the sources for a library named
@file{libmumble++.a} should be listed in the
@samp{libmumble___a_SOURCES} variable.

The strudel is an addition, to make the use of Autoconf substitutions in
variable names less obfuscating.


@node User Variables
@section Variables reserved for the user

@cindex variables, reserved for the user
@cindex user variables

Some @file{Makefile} variables are reserved by the GNU Coding Standards
for the use of the ``user''---the person building the package.  For
instance, @code{CFLAGS} is one such variable.

Sometimes package developers are tempted to set user variables such as
@code{CFLAGS} because it appears to make their job easier.  However,
the package itself should never set a user variable, particularly not
to include switches that are required for proper compilation of the
package.  Since these variables are documented as being for the
package builder, that person rightfully expects to be able to override
any of these variables at build time.

To get around this problem, Automake introduces an automake-specific
shadow variable for each user flag variable.  (Shadow variables are
not introduced for variables like @code{CC}, where they would make no
sense.)  The shadow variable is named by prepending @samp{AM_} to the
user variable's name.  For instance, the shadow variable for
@code{YFLAGS} is @code{AM_YFLAGS}.  The package maintainer---that is,
the author(s) of the @file{Makefile.am} and @file{configure.ac}
files---may adjust these shadow variables however necessary.

@xref{Flag Variables Ordering}, for more discussion about these
variables and how they interact with per-target variables.

@node Auxiliary Programs
@section Programs automake might require

@cindex Programs, auxiliary
@cindex Auxiliary programs

Automake sometimes requires helper programs so that the generated
@file{Makefile} can do its work properly.  There are a fairly large
number of them, and we list them here.

Although all of these files are distributed and installed with
Automake, a couple of them are maintained separately.  The Automake
copies are updated before each release, but we mention the original
source in case you need more recent versions.

@table @code
@item ar-lib
This is a wrapper primarily for the Microsoft lib archiver, to make
it more POSIX-like.

@item compile
This is a wrapper for compilers that do not accept options @option{-c}
and @option{-o} at the same time.  It is only used when absolutely
required.  Such compilers are rare, with the Microsoft C/C++ Compiler
as the most notable exception. This wrapper also makes the following
common options available for that compiler, while performing file name
translation where needed: @option{-I}, @option{-L}, @option{-l},
@option{-Wl,} and @option{-Xlinker}.

@item config.guess
@itemx config.sub
These two programs compute the canonical triplets for the given build,
host, or target architecture.  These programs are updated regularly to
support new architectures and fix probes broken by changes in new
kernel versions.  Each new release of Automake comes with up-to-date
copies of these programs.  If your copy of Automake is getting old,
you are encouraged to fetch the latest versions of these files from
@url{https://savannah.gnu.org/git/?group=config} before making a
release.

@item depcomp
This program understands how to run a compiler so that it will
generate not only the desired output but also dependency information
that is then used by the automatic dependency tracking feature
(@pxref{Dependencies}).

@item install-sh
This is a replacement for the @command{install} program that works on
platforms where @command{install} is unavailable or unusable.

@item mdate-sh
This script is used to generate a @file{version.texi} file.  It examines
a file and prints some date information about it.

@item missing
This wraps a number of programs that are typically only required by
maintainers.  If the program in question doesn't exist, or seems to old,
@command{missing} will print an informative warning before failing out,
to provide the user with more context and information.

@item mkinstalldirs
This script used to be a wrapper around @samp{mkdir -p}, which is not
portable.  Now we prefer to use @samp{install-sh -d} when @command{configure}
finds that @samp{mkdir -p} does not work, this makes one less script to
distribute.

For backward compatibility @file{mkinstalldirs} is still used and
distributed when @command{automake} finds it in a package.  But it is no
longer installed automatically, and it should be safe to remove it.

@item py-compile
This is used to byte-compile Python scripts.

@item test-driver
This implements the default test driver offered by the parallel
testsuite harness.

@item texinfo.tex
Not a program, this file is required for @samp{make dvi}, @samp{make
ps} and @samp{make pdf} to work when Texinfo sources are in the
package.  The latest version can be downloaded from
@url{https://www.gnu.org/software/texinfo/}.

@item ylwrap
This program wraps @command{lex} and @command{yacc} to rename their
output files.  It also ensures that, for instance, multiple
@command{yacc} instances can be invoked in a single directory in
parallel.

@end table


@node Examples
@chapter Some example packages

This section contains two small examples.

The first example (@pxref{Complete}) assumes you have an existing
project already using Autoconf, with handcrafted @file{Makefile}s, and
that you want to convert it to using Automake.  If you are discovering
both tools, it is probably better that you look at the Hello World
example presented earlier (@pxref{Hello World}).

The second example (@pxref{true}) shows how two programs can be built
from the same file, using different compilation parameters.  It
contains some technical digressions that are probably best skipped on
first read.

@menu
* Complete::                    A simple example, start to finish
* true::                        Building true and false
@end menu


@node Complete
@section A simple example, start to finish

@cindex Complete example

Let's suppose you just finished writing @code{zardoz}, a program to make
your head float from vortex to vortex.  You've been using Autoconf to
provide a portability framework, but your @file{Makefile.in}s have been
ad-hoc.  You want to make them bulletproof, so you turn to Automake.

@cindex @code{AM_INIT_AUTOMAKE}, example use

The first step is to update your @file{configure.ac} to include the
commands that @command{automake} needs.  The way to do this is to add an
@code{AM_INIT_AUTOMAKE} call just after @code{AC_INIT}:

@example
AC_INIT([zardoz], [1.0])
AM_INIT_AUTOMAKE
@dots{}
@end example

Since your program doesn't have any complicating factors (e.g., it
doesn't use @code{gettext}, it doesn't want to build a shared library),
you're done with this part.  That was easy!

@cindex @command{aclocal} program, introduction
@cindex @file{aclocal.m4}, preexisting
@cindex @file{acinclude.m4}, defined

Now you must regenerate @file{configure}.  But to do that, you'll need
to tell @command{autoconf} how to find the new macro you've used.  The
easiest way to do this is to use the @command{aclocal} program to
generate your @file{aclocal.m4} for you.  But wait@dots{} maybe you
already have an @file{aclocal.m4}, because you had to write some hairy
macros for your program.  The @command{aclocal} program lets you put
your own macros into @file{acinclude.m4}, so simply rename and then
run:

@example
mv aclocal.m4 acinclude.m4
aclocal
autoconf
@end example

@cindex @command{zardoz} example

Now it is time to write your @file{Makefile.am} for @code{zardoz}.
Since @code{zardoz} is a user program, you want to install it where the
rest of the user programs go: @code{bindir}.  Additionally,
@code{zardoz} has some Texinfo documentation.  Your @file{configure.ac}
script uses @code{AC_REPLACE_FUNCS}, so you need to link against
@samp{$(LIBOBJS)}.  So here's what you'd write:

@example
bin_PROGRAMS = zardoz
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
zardoz_LDADD = $(LIBOBJS)

info_TEXINFOS = zardoz.texi
@end example

Now you can run @samp{automake --add-missing} to generate your
@file{Makefile.in} and grab any auxiliary files you might need, and
you're done!


@node true
@section Building true and false

@cindex Example, @command{false} and @command{true}
@cindex @command{false} Example
@cindex @command{true} Example

Here is another, trickier example.  It shows how to generate two
programs (@code{true} and @code{false}) from the same source file
(@file{true.c}).  The difficult part is that each compilation of
@file{true.c} requires different @code{cpp} flags.

@example
bin_PROGRAMS = true false
false_SOURCES =
false_LDADD = false.o

true.o: true.c
        $(COMPILE) -DEXIT_CODE=0 -c true.c

false.o: true.c
        $(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c
@end example

Note that there is no @code{true_SOURCES} definition.  Automake will
implicitly assume that there is a source file named @file{true.c}
(@pxref{Default _SOURCES}), and
define rules to compile @file{true.o} and link @file{true}.  The
@samp{true.o: true.c} rule supplied by the above @file{Makefile.am},
will override the Automake generated rule to build @file{true.o}.

@code{false_SOURCES} is defined to be empty---that way no implicit value
is substituted.  Because we have not listed the source of
@file{false}, we have to tell Automake how to link the program.  This is
the purpose of the @code{false_LDADD} line.  A @code{false_DEPENDENCIES}
variable, holding the dependencies of the @file{false} target will be
automatically generated by Automake from the content of
@code{false_LDADD}.

The above rules won't work if your compiler doesn't accept both
@option{-c} and @option{-o}.  The simplest fix for this is to introduce a
bogus dependency (to avoid problems with a parallel @command{make}):

@example
true.o: true.c false.o
        $(COMPILE) -DEXIT_CODE=0 -c true.c

false.o: true.c
        $(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o
@end example

As it turns out, there is also a much easier way to do this same task.
Some of the above technique is useful enough that we've kept the
example in the manual.  However if you were to build @code{true} and
@code{false} in real life, you would probably use per-program
compilation flags, like so:

@c Keep in sync with specflg7.sh and specflg8.sh
@example
bin_PROGRAMS = false true

false_SOURCES = true.c
false_CPPFLAGS = -DEXIT_CODE=1

true_SOURCES = true.c
true_CPPFLAGS = -DEXIT_CODE=0
@end example

In this case Automake will cause @file{true.c} to be compiled twice,
with different flags.  In this instance, the names of the object files
would be chosen by automake; they would be @file{false-true.o} and
@file{true-true.o}. (The name of the object files rarely matters.)

@node automake Invocation
@chapter Creating a @file{Makefile.in}
@c This node used to be named "Invoking automake".  This @anchor
@c allows old links to still work.
@anchor{Invoking automake}

@cindex Multiple @file{configure.ac} files
@cindex Invoking @command{automake}
@cindex @command{automake}, invoking
@cindex Invocation of @command{automake}
@cindex @command{automake}, invocation

To create all the @file{Makefile.in}s for a package, run the
@command{automake} program in the top level directory, with no
arguments.  @command{automake} will automatically find each
appropriate @file{Makefile.am} (by scanning @file{configure.ac};
@pxref{configure}) and generate the corresponding @file{Makefile.in}.
Note that @command{automake} has a rather simplistic view of what
constitutes a package; it assumes that a package has only one
@file{configure.ac}, at the top.  If your package has multiple
@file{configure.ac}s, then you must run @command{automake} in each
directory holding a @file{configure.ac}.  (Alternatively, you may rely
on Autoconf's @command{autoreconf}, which is able to recurse your
package tree and run @command{automake} where appropriate.)

You can optionally give @command{automake} an argument; @file{.am} is
appended to the argument and the result is used as the name of the
input file.  This feature is generally only used to automatically
rebuild an out-of-date @file{Makefile.in}.  Note that
@command{automake} must always be run from the topmost directory of a
project, even if being used to regenerate the @file{Makefile.in} in
some subdirectory.  This is necessary because @command{automake} must
scan @file{configure.ac}, and because @command{automake} uses the
knowledge that a @file{Makefile.in} is in a subdirectory to change its
behavior in some cases.

@vindex AUTOCONF
Automake will run @command{autoconf} to scan @file{configure.ac} and
its dependencies (i.e., @file{aclocal.m4} and any included file),
therefore @command{autoconf} must be in your @env{PATH}.  If there is
an @env{AUTOCONF} variable in your environment it will be used
instead of @command{autoconf}, this allows you to select a particular
version of Autoconf.  By the way, don't misunderstand this paragraph:
@command{automake} runs @command{autoconf} to @strong{scan} your
@file{configure.ac}, this won't build @file{configure} and you still
have to run @command{autoconf} yourself for this purpose.

@cindex @command{automake} options
@cindex Options, @command{automake}
@cindex Strictness, command line

@command{automake} accepts the following options:

@cindex Extra files distributed with Automake
@cindex Files distributed with Automake
@cindex @file{config.guess}

@table @code
@item -a
@itemx --add-missing
@opindex -a
@opindex --add-missing
Automake requires certain common files to exist in certain situations;
for instance, @file{config.guess} is required if @file{configure.ac} invokes
@code{AC_CANONICAL_HOST}.  Automake is distributed with several of these
files (@pxref{Auxiliary Programs}); this option will cause the missing
ones to be automatically added to the package, whenever possible.  In
general if Automake tells you a file is missing, try using this option.
By default Automake tries to make a symbolic link pointing to its own
copy of the missing file; this can be changed with @option{--copy}.

Many of the potentially-missing files are common scripts whose
location may be specified via the @code{AC_CONFIG_AUX_DIR} macro.
Therefore, @code{AC_CONFIG_AUX_DIR}'s setting affects whether a
file is considered missing, and where the missing file is added
(@pxref{Optional}).

In some strictness modes, additional files are installed, see @ref{Gnits}
for more information.

@item --libdir=@var{dir}
@opindex --libdir
Look for Automake data files in directory @var{dir} instead of in the
installation directory.  This is typically used for debugging.

@vindex AUTOMAKE_LIBDIR
The environment variable @env{AUTOMAKE_LIBDIR} provides another way to
set the directory containing Automake data files.  However
@option{--libdir} takes precedence over it.

@item --print-libdir
@opindex --print-libdir
Print the path of the installation directory containing Automake-provided
scripts and data files (like e.g., @file{texinfo.texi} and
@file{install-sh}).

@item -c
@opindex -c
@itemx --copy
@opindex --copy
When used with @option{--add-missing}, causes installed files to be
copied.  The default is to make a symbolic link.

@item -f
@opindex -f
@itemx --force-missing
@opindex --force-missing
When used with @option{--add-missing}, causes standard files to be reinstalled
even if they already exist in the source tree.  This involves removing
the file from the source tree before creating the new symlink (or, with
@option{--copy}, copying the new file).

@item --foreign
@opindex --foreign
Set the global strictness to @option{foreign}.  For more information, see
@ref{Strictness}.

@item --gnits
@opindex --gnits
Set the global strictness to @option{gnits}.  For more information, see
@ref{Gnits}.

@item --gnu
@opindex --gnu
Set the global strictness to @option{gnu}.  For more information, see
@ref{Gnits}.  This is the default strictness.

@item --help
@opindex --help
Print a summary of the command line options and exit.

@item -i
@itemx --ignore-deps
@opindex -i
This disables the dependency tracking feature in generated
@file{Makefile}s; see @ref{Dependencies}.

@item --include-deps
@opindex --include-deps
This enables the dependency tracking feature.  This feature is enabled
by default.  This option is provided for historical reasons only and
probably should not be used.

@item --no-force
@opindex --no-force
Ordinarily @command{automake} creates all @file{Makefile.in}s mentioned in
@file{configure.ac}.  This option causes it to only update those
@file{Makefile.in}s that are out of date with respect to one of their
dependents.

@item -o @var{dir}
@itemx --output-dir=@var{dir}
@opindex -o
@opindex --output-dir
Put the generated @file{Makefile.in} in the directory @var{dir}.
Ordinarily each @file{Makefile.in} is created in the directory of the
corresponding @file{Makefile.am}.  This option is deprecated and will be
removed in a future release.

@item -v
@itemx --verbose
@opindex -v
@opindex --verbose
Cause Automake to print information about which files are being read or
created.

@item --version
@opindex --version
Print the version number of Automake and exit.

@item -W CATEGORY
@itemx --warnings=@var{category}
@opindex -W
@opindex --warnings
Output warnings falling in @var{category}.  @var{category} can be
one of:
@table @code
@item gnu
warnings related to the GNU Coding Standards
(@pxref{Top, , , standards, The GNU Coding Standards}).
@item obsolete
obsolete features or constructions
@item override
user redefinitions of Automake rules or variables
@item portability
portability issues (e.g., use of @command{make} features that are
known to be not portable)
@item extra-portability
extra portability issues related to obscure tools.  One example of such
a tool is the Microsoft @command{lib} archiver.
@item syntax
weird syntax, unused variables, typos
@item unsupported
unsupported or incomplete features
@item all
all the warnings
@item none
turn off all the warnings
@item error
treat warnings as errors
@end table

A category can be turned off by prefixing its name with @samp{no-}.  For
instance, @option{-Wno-syntax} will hide the warnings about unused
variables.

The categories output by default are @samp{obsolete}, @samp{syntax} and
@samp{unsupported}.  Additionally, @samp{gnu} and @samp{portability}
are enabled in @option{--gnu} and @option{--gnits} strictness.

@c Checked by extra-portability.sh
Turning off @samp{portability} will also turn off @samp{extra-portability},
and similarly turning on @samp{extra-portability} will also turn on
@samp{portability}.  However, turning on @samp{portability} or turning
off @samp{extra-portability} will not affect the other category.

@vindex WARNINGS
The environment variable @env{WARNINGS} can contain a comma separated
list of categories to enable.  It will be taken into account before the
command-line switches, this way @option{-Wnone} will also ignore any
warning category enabled by @env{WARNINGS}.  This variable is also used
by other tools like @command{autoconf}; unknown categories are ignored
for this reason.

@end table

@vindex AUTOMAKE_JOBS
If the environment variable @env{AUTOMAKE_JOBS} contains a positive
number, it is taken as the maximum number of Perl threads to use in
@command{automake} for generating multiple @file{Makefile.in} files
concurrently.  This is an experimental feature.


@node configure
@chapter Scanning @file{configure.ac}, using @command{aclocal}

@cindex @file{configure.ac}, scanning
@cindex Scanning @file{configure.ac}
@cindex Using @command{aclocal}
@cindex @command{aclocal}, using

Automake scans the package's @file{configure.ac} to determine certain
information about the package.  Some @command{autoconf} macros are required
and some variables must be defined in @file{configure.ac}.  Automake
will also use information from @file{configure.ac} to further tailor its
output.

Automake also supplies some Autoconf macros to make the maintenance
easier.  These macros can automatically be put into your
@file{aclocal.m4} using the @command{aclocal} program.

@menu
* Requirements::                Configuration requirements
* Optional::                    Other things Automake recognizes
* aclocal Invocation::          Auto-generating aclocal.m4
* Macros::                      Autoconf macros supplied with Automake
@end menu


@node Requirements
@section Configuration requirements

@cindex Automake requirements
@cindex Requirements of Automake

@acindex AM_INIT_AUTOMAKE
The one real requirement of Automake is that your @file{configure.ac}
call @code{AM_INIT_AUTOMAKE}.  This macro does several things that are
required for proper Automake operation (@pxref{Macros}).

Here are the other macros that Automake requires but which are not run
by @code{AM_INIT_AUTOMAKE}:

@table @code
@item AC_CONFIG_FILES
@itemx AC_OUTPUT
@acindex AC_CONFIG_FILES
@acindex AC_OUTPUT
These two macros are usually invoked as follows near the end of
@file{configure.ac}.

@example
@dots{}
AC_CONFIG_FILES([
  Makefile
  doc/Makefile
  src/Makefile
  src/lib/Makefile
  @dots{}
])
AC_OUTPUT
@end example

Automake uses these to determine which files to create (@pxref{Output, ,
Creating Output Files, autoconf, The Autoconf Manual}).  A listed file
is considered to be an Automake generated @file{Makefile} if there
exists a file with the same name and the @file{.am} extension appended.
Typically, @samp{AC_CONFIG_FILES([foo/Makefile])} will cause Automake to
generate @file{foo/Makefile.in} if @file{foo/Makefile.am} exists.

When using @code{AC_CONFIG_FILES} with multiple input files, as in

@example
AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])
@end example

@noindent
@command{automake} will generate the first @file{.in} input file for
which a @file{.am} file exists.  If no such file exists the output
file is not considered to be generated by Automake.

Files created by @code{AC_CONFIG_FILES}, be they Automake
@file{Makefile}s or not, are all removed by @samp{make distclean}.
Their inputs are automatically distributed, unless they
are the output of prior @code{AC_CONFIG_FILES} commands.
Finally, rebuild rules are generated in the Automake @file{Makefile}
existing in the subdirectory of the output file, if there is one, or
in the top-level @file{Makefile} otherwise.

The above machinery (cleaning, distributing, and rebuilding) works
fine if the @code{AC_CONFIG_FILES} specifications contain only
literals.  If part of the specification uses shell variables,
@command{automake} will not be able to fulfill this setup, and you will
have to complete the missing bits by hand.  For instance, on

@c Keep in sync with output11.sh
@example
file=input
@dots{}
AC_CONFIG_FILES([output:$file],, [file=$file])
@end example

@noindent
@command{automake} will output rules to clean @file{output}, and
rebuild it.  However the rebuild rule will not depend on @file{input},
and this file will not be distributed either.  (You must add
@samp{EXTRA_DIST = input} to your @file{Makefile.am} if @file{input} is a
source file.)

Similarly

@c Keep in sync with output11.sh
@example
file=output
file2=out:in
@dots{}
AC_CONFIG_FILES([$file:input],, [file=$file])
AC_CONFIG_FILES([$file2],, [file2=$file2])
@end example

@noindent
will only cause @file{input} to be distributed.  No file will be
cleaned automatically (add @samp{DISTCLEANFILES = output out}
yourself), and no rebuild rule will be output.

Obviously @command{automake} cannot guess what value @samp{$file} is
going to hold later when @file{configure} is run, and it cannot use
the shell variable @samp{$file} in a @file{Makefile}.  However, if you
make reference to @samp{$file} as @samp{$@{file@}} (i.e., in a way
that is compatible with @command{make}'s syntax) and furthermore use
@code{AC_SUBST} to ensure that @samp{$@{file@}} is meaningful in a
@file{Makefile}, then @command{automake} will be able to use
@samp{$@{file@}} to generate all of these rules.  For instance, here is
how the Automake package itself generates versioned scripts for its
test suite:

@example
AC_SUBST([APIVERSION], @dots{})
@dots{}
AC_CONFIG_FILES(
  [tests/aclocal-$@{APIVERSION@}:tests/aclocal.in],
  [chmod +x tests/aclocal-$@{APIVERSION@}],
  [APIVERSION=$APIVERSION])
AC_CONFIG_FILES(
  [tests/automake-$@{APIVERSION@}:tests/automake.in],
  [chmod +x tests/automake-$@{APIVERSION@}])
@end example

@noindent
Here cleaning, distributing, and rebuilding are done automatically,
because @samp{$@{APIVERSION@}} is known at @command{make}-time.

Note that you should not use shell variables to declare
@file{Makefile} files for which @command{automake} must create
@file{Makefile.in}.  Even @code{AC_SUBST} does not help here, because
@command{automake} needs to know the file name when it runs in order
to check whether @file{Makefile.am} exists.  (In the very hairy case
that your setup requires such use of variables, you will have to tell
Automake which @file{Makefile.in}s to generate on the command-line.)

It is possible to let @command{automake} emit conditional rules for
@code{AC_CONFIG_FILES} with the help of @code{AM_COND_IF}
(@pxref{Optional}).

To summarize:
@itemize @bullet
@item
Use literals for @file{Makefile}s, and for other files whenever possible.
@item
Use @samp{$file} (or @samp{$@{file@}} without @samp{AC_SUBST([file])})
for files that @command{automake} should ignore.
@item
Use @samp{$@{file@}} and @samp{AC_SUBST([file])} for files
that @command{automake} should not ignore.
@end itemize

@end table


@node Optional
@section Other things Automake recognizes

@cindex Macros Automake recognizes
@cindex Recognized macros by Automake

Every time Automake is run it calls Autoconf to trace
@file{configure.ac}.  This way it can recognize the use of certain
macros and tailor the generated @file{Makefile.in} appropriately.
Currently recognized macros and their effects are:

@ftable @code
@item AC_CANONICAL_BUILD
@itemx AC_CANONICAL_HOST
@itemx AC_CANONICAL_TARGET
@vindex build_triplet
@vindex host_triplet
@vindex target_triplet
Automake will ensure that @file{config.guess} and @file{config.sub}
exist.  Also, the @file{Makefile} variables @code{build_triplet},
@code{host_triplet} and @code{target_triplet} are introduced.  See
@ref{Canonicalizing, , Getting the Canonical System Type, autoconf,
The Autoconf Manual}.

@item AC_CONFIG_AUX_DIR
Automake will look for various helper scripts, such as
@file{install-sh}, in the directory named in this macro invocation.
@c This list is accurate relative to version 1.11
(The full list of scripts is:
@file{ar-lib},
@file{config.guess},
@file{config.sub},
@file{depcomp},
@file{compile},
@file{install-sh},
@file{ltmain.sh},
@file{mdate-sh},
@file{missing},
@file{mkinstalldirs},
@file{py-compile},
@file{test-driver},
@file{texinfo.tex},
@file{ylwrap}.)
Not all scripts are always searched for; some scripts
will only be sought if the generated @file{Makefile.in} requires them.

If @code{AC_CONFIG_AUX_DIR} is not given, the scripts are looked for in
their standard locations.  For @file{mdate-sh},
@file{texinfo.tex}, and @file{ylwrap}, the standard location is the
source directory corresponding to the current @file{Makefile.am}.  For
the rest, the standard location is the first one of @file{.}, @file{..},
or @file{../..} (relative to the top source directory) that provides any
one of the helper scripts.  @xref{Input, , Finding `configure' Input,
autoconf, The Autoconf Manual}.

Required files from @code{AC_CONFIG_AUX_DIR} are automatically
distributed, even if there is no @file{Makefile.am} in this directory.

@item AC_CONFIG_LIBOBJ_DIR
Automake will require the sources file declared with
@code{AC_LIBSOURCE} (see below) in the directory specified by this
macro.

@item AC_CONFIG_HEADERS
Automake will generate rules to rebuild these headers from the
corresponding templates (usually, the template for a @file{foo.h}
header being @file{foo.h.in}).  Older versions of Automake
required the use of @code{AM_CONFIG_HEADER}; this is no longer
the case, and that macro has indeed been removed.

As with @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
specification using shell variables will be ignored as far as
cleaning, distributing, and rebuilding is concerned.

@item AC_CONFIG_LINKS
Automake will generate rules to remove @file{configure} generated
links on @samp{make distclean} and to distribute named source files as
part of @samp{make dist}.

As for @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
specification using shell variables will be ignored as far as cleaning
and distributing is concerned.  (There are no rebuild rules for links.)

@item AC_LIBOBJ
@itemx AC_LIBSOURCE
@itemx AC_LIBSOURCES
@vindex LIBOBJS
Automake will automatically distribute any file listed in
@code{AC_LIBSOURCE} or @code{AC_LIBSOURCES}.

Note that the @code{AC_LIBOBJ} macro calls @code{AC_LIBSOURCE}.  So if
an Autoconf macro is documented to call @samp{AC_LIBOBJ([file])}, then
@file{file.c} will be distributed automatically by Automake.  This
encompasses many macros like @code{AC_FUNC_ALLOCA},
@code{AC_FUNC_MEMCMP}, @code{AC_REPLACE_FUNCS}, and others.

By the way, direct assignments to @code{LIBOBJS} are no longer
supported.  You should always use @code{AC_LIBOBJ} for this purpose.
@xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
autoconf, The Autoconf Manual}.

@item AC_PROG_RANLIB
This is required if any libraries are built in the package.
@xref{Particular Programs, , Particular Program Checks, autoconf, The
Autoconf Manual}.

@item AC_PROG_CXX
This is required if any C++ source is included.  @xref{Particular
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.

@item AC_PROG_OBJC
This is required if any Objective C source is included.  @xref{Particular
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.

@item AC_PROG_OBJCXX
This is required if any Objective C++ source is included.  @xref{Particular
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.

@item AC_PROG_F77
This is required if any Fortran 77 source is included.  @xref{Particular
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.

@item AC_F77_LIBRARY_LDFLAGS
This is required for programs and shared libraries that are a mixture of
languages that include Fortran 77 (@pxref{Mixing Fortran 77 With C and
C++}).  @xref{Macros, , Autoconf macros supplied with Automake}.

@item AC_FC_SRCEXT
Automake will add the flags computed by @code{AC_FC_SRCEXT} to compilation
of files with the respective source extension (@pxref{Fortran Compiler, ,
Fortran Compiler Characteristics, autoconf, The Autoconf Manual}).

@item AC_PROG_FC
This is required if any Fortran 90/95 source is included.  This macro is
distributed with Autoconf version 2.58 and later.  @xref{Particular
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.

@item AC_PROG_LIBTOOL
Automake will turn on processing for @command{libtool} (@pxref{Top, ,
Introduction, libtool, The Libtool Manual}).

@item AC_PROG_YACC
@vindex YACC
If a Yacc source file is seen, then you must either use this macro or
define the variable @code{YACC} in @file{configure.ac}.  The former is
preferred (@pxref{Particular Programs, , Particular Program Checks,
autoconf, The Autoconf Manual}).

@item AC_PROG_LEX
If a Lex source file is seen, then this macro must be used.
@xref{Particular Programs, , Particular Program Checks, autoconf, The
Autoconf Manual}.

@item AC_REQUIRE_AUX_FILE
For each @code{AC_REQUIRE_AUX_FILE([@var{file}])},
@command{automake} will ensure that @file{@var{file}} exists in the
aux directory, and will complain otherwise.  It
will also automatically distribute the file.  This macro should be
used by third-party Autoconf macros that require some supporting
files in the aux directory specified with @code{AC_CONFIG_AUX_DIR}
above.  @xref{Input, , Finding @command{configure} Input, autoconf,
The Autoconf Manual}.

@item AC_SUBST
The first argument is automatically defined as a variable in each
generated @file{Makefile.in}, unless @code{AM_SUBST_NOTMAKE} is also
used for this variable.  @xref{Setting Output Variables, , Setting
Output Variables, autoconf, The Autoconf Manual}.

For every substituted variable @var{var}, @command{automake} will add
a line @code{@var{var} = @var{value}} to each @file{Makefile.in} file.
Many Autoconf macros invoke @code{AC_SUBST} to set output variables
this way, e.g., @code{AC_PATH_XTRA} defines @code{X_CFLAGS} and
@code{X_LIBS}.  Thus, you can access these variables as
@code{$(X_CFLAGS)} and @code{$(X_LIBS)} in any @file{Makefile.am}
if @code{AC_PATH_XTRA} is called.

@item AM_CONDITIONAL
This introduces an Automake conditional (@pxref{Conditionals}).

@item AM_COND_IF
This macro allows @code{automake} to detect subsequent access within
@file{configure.ac} to a conditional previously introduced with
@code{AM_CONDITIONAL}, thus enabling conditional @code{AC_CONFIG_FILES}
(@pxref{Usage of Conditionals}).

@item AM_GNU_GETTEXT
This macro is required for packages that use GNU gettext
(@pxref{gettext}).  It is distributed with gettext.  If Automake sees
this macro it ensures that the package meets some of gettext's
requirements.

@item AM_GNU_GETTEXT_INTL_SUBDIR
This macro specifies that the @file{intl/} subdirectory is to be built,
even if the @code{AM_GNU_GETTEXT} macro was invoked with a first argument
of @samp{external}.

@item AM_MAINTAINER_MODE(@ovar{default-mode})
@opindex --enable-maintainer-mode
@opindex --disable-maintainer-mode
This macro adds an @option{--enable-maintainer-mode} option to
@command{configure}.  If this is used, @command{automake} will cause
``maintainer-only'' rules to be turned off by default in the
generated @file{Makefile.in}s, unless @var{default-mode} is
@samp{enable}.  This macro defines the @code{MAINTAINER_MODE}
conditional, which you can use in your own @file{Makefile.am}.
@xref{maintainer-mode}.

@item AM_SUBST_NOTMAKE(@var{var})
Prevent Automake from defining a variable @var{var}, even if it is
substituted by @command{config.status}.  Normally, Automake defines a
@command{make} variable for each @command{configure} substitution,
i.e., for each @code{AC_SUBST([@var{var}])}.  This macro prevents that
definition from Automake.  If @code{AC_SUBST} has not been called
for this variable, then @code{AM_SUBST_NOTMAKE} has no effects.
Preventing variable definitions may be useful for substitution of
multi-line values, where @code{@var{var} = @@@var{value}@@} might yield
unintended results.

@item m4_include
Files included by @file{configure.ac} using this macro will be
detected by Automake and automatically distributed.  They will also
appear as dependencies in @file{Makefile} rules.

@code{m4_include} is seldom used by @file{configure.ac} authors, but
can appear in @file{aclocal.m4} when @command{aclocal} detects that
some required macros come from files local to your package (as opposed to
macros installed in a system-wide directory, @pxref{aclocal Invocation}).

@end ftable

@node aclocal Invocation
@section Auto-generating aclocal.m4
@c This node used to be named "Invoking automake".  This @anchor
@c allows old links to still work.
@anchor{Invoking aclocal}

@cindex Invocation of @command{aclocal}
@cindex @command{aclocal}, Invocation
@cindex Invoking @command{aclocal}
@cindex @command{aclocal}, Invoking

Automake includes a number of Autoconf macros that can be used in
your package (@pxref{Macros}); some of them are actually required by
Automake in certain situations.  These macros must be defined in your
@file{aclocal.m4}; otherwise they will not be seen by
@command{autoconf}.

The @command{aclocal} program will automatically generate
@file{aclocal.m4} files based on the contents of @file{configure.ac}.
This provides a convenient way to get Automake-provided macros,
without having to search around.  The @command{aclocal} mechanism
allows other packages to supply their own macros (@pxref{Extending
aclocal}).  You can also use it to maintain your own set of custom
macros (@pxref{Local Macros}).

At startup, @command{aclocal} scans all the @file{.m4} files it can
find, looking for macro definitions (@pxref{Macro Search Path}).  Then
it scans @file{configure.ac}.  Any mention of one of the macros found
in the first step causes that macro, and any macros it in turn
requires, to be put into @file{aclocal.m4}.

@emph{Putting} the file that contains the macro definition into
@file{aclocal.m4} is usually done by copying the entire text of this
file, including unused macro definitions as well as both @samp{#} and
@samp{dnl} comments.  If you want to make a comment that will be
completely ignored by @command{aclocal}, use @samp{##} as the comment
leader.

When a file selected by @command{aclocal} is located in a subdirectory
specified as a relative search path with @command{aclocal}'s @option{-I}
argument, @command{aclocal} assumes the file belongs to the package
and uses @code{m4_include} instead of copying it into
@file{aclocal.m4}.  This makes the package smaller, eases dependency
tracking, and cause the file to be distributed automatically.
(@xref{Local Macros}, for an example.)  Any macro that is found in a
system-wide directory, or via an absolute search path will be copied.
So use @samp{-I `pwd`/reldir} instead of @samp{-I reldir} whenever
some relative directory should be considered outside the package.

The contents of @file{acinclude.m4}, if this file exists, are also
automatically included in @file{aclocal.m4}.  We recommend against
using @file{acinclude.m4} in new packages (@pxref{Local Macros}).

@vindex AUTOM4TE
@cindex autom4te
While computing @file{aclocal.m4}, @command{aclocal} runs
@command{autom4te} (@pxref{Using autom4te, , Using @command{Autom4te},
autoconf, The Autoconf Manual}) in order to trace the macros that are
really used, and omit from @file{aclocal.m4} all macros that are
mentioned but otherwise unexpanded (this can happen when a macro is
called conditionally).  @command{autom4te} is expected to be in the
@env{PATH}, just as @command{autoconf}.  Its location can be
overridden using the @env{AUTOM4TE} environment variable.

@menu
* aclocal Options::             Options supported by aclocal
* Macro Search Path::           How aclocal finds .m4 files
* Extending aclocal::           Writing your own aclocal macros
* Local Macros::                Organizing local macros
* Serials::                     Serial lines in Autoconf macros
* Future of aclocal::           aclocal's scheduled death
@end menu

@node aclocal Options
@subsection aclocal Options

@cindex @command{aclocal}, Options
@cindex Options, @command{aclocal}

@command{aclocal} accepts the following options:

@table @code
@item --automake-acdir=@var{dir}
@opindex --automake-acdir
Look for the automake-provided macro files in @var{dir} instead of
in the installation directory.  This is typically used for debugging.

@vindex ACLOCAL_AUTOMAKE_DIR
The environment variable @env{ACLOCAL_AUTOMAKE_DIR} provides another
way to set the directory containing automake-provided macro files.
However @option{--automake-acdir} takes precedence over it.

@item --system-acdir=@var{dir}
@opindex --system-acdir
Look for the system-wide third-party macro files (and the special
@file{dirlist} file) in @var{dir} instead of in the installation
directory.  This is typically used for debugging.

@item --diff[=@var{command}]
@opindex --diff
Run @var{command} on M4 file that would be installed or overwritten
by @option{--install}.  The default @var{command} is @samp{diff -u}.
This option implies @option{--install} and @option{--dry-run}.

@item --dry-run
@opindex --dry-run
Do not actually overwrite (or create) @file{aclocal.m4} and M4
files installed by @option{--install}.

@item --help
@opindex --help
Print a summary of the command line options and exit.

@item -I @var{dir}
@opindex -I
Add the directory @var{dir} to the list of directories searched for
@file{.m4} files.

@item --install
@opindex --install
Install system-wide third-party macros into the first directory
specified with @samp{-I @var{dir}} instead of copying them in the
output file.
@c Keep in sync with aclocal-install-absdir.sh
Note that this will happen also if @var{dir} is an absolute path.

@cindex serial number and @option{--install}
When this option is used, and only when this option is used,
@command{aclocal} will also honor @samp{#serial @var{number}} lines
that appear in macros: an M4 file is ignored if there exists another
M4 file with the same basename and a greater serial number in the
search path (@pxref{Serials}).

@item --force
@opindex --force
Always overwrite the output file.  The default is to overwrite the output
file only when really needed, i.e., when its contents changes or if one
of its dependencies is younger.

This option forces the update of @file{aclocal.m4} (or the file
specified with @file{--output} below) and only this file, it has
absolutely no influence on files that may need to be installed by
@option{--install}.

@item --output=@var{file}
@opindex --output
Cause the output to be put into @var{file} instead of @file{aclocal.m4}.

@item --print-ac-dir
@opindex --print-ac-dir
Prints the name of the directory that @command{aclocal} will search to
find third-party @file{.m4} files.  When this option is given, normal
processing is suppressed.  This option was used @emph{in the past} by
third-party packages to determine where to install @file{.m4} macro
files, but @emph{this usage is today discouraged}, since it causes
@samp{$(prefix)} not to be thoroughly honored (which violates the
GNU Coding Standards), and a similar semantics can be better obtained
with the @env{ACLOCAL_PATH} environment variable; @pxref{Extending aclocal}.

@item --verbose
@opindex --verbose
Print the names of the files it examines.

@item --version
@opindex --version
Print the version number of Automake and exit.

@item -W CATEGORY
@item --warnings=@var{category}
@opindex -W
@opindex --warnings
Output warnings falling in @var{category}.  @var{category} can be
one of:
@table @code
@item syntax
dubious syntactic constructs, underquoted macros, unused macros, etc.
@item unsupported
unknown macros
@item all
all the warnings, this is the default
@item none
turn off all the warnings
@item error
treat warnings as errors
@end table

All warnings are output by default.

@vindex WARNINGS
The environment variable @env{WARNINGS} is honored in the same
way as it is for @command{automake} (@pxref{automake Invocation}).

@end table

@node Macro Search Path
@subsection Macro Search Path

@cindex Macro search path
@cindex @command{aclocal} search path

By default, @command{aclocal} searches for @file{.m4} files in the following
directories, in this order:

@table @code
@item @var{acdir-APIVERSION}
This is where the @file{.m4} macros distributed with Automake itself
are stored.  @var{APIVERSION} depends on the Automake release used;
for example, for Automake 1.11.x, @var{APIVERSION} = @code{1.11}.

@item @var{acdir}
This directory is intended for third party @file{.m4} files, and is
configured when @command{automake} itself is built.  This is
@file{@@datadir@@/aclocal/}, which typically
expands to @file{$@{prefix@}/share/aclocal/}.  To find the compiled-in
value of @var{acdir}, use the @option{--print-ac-dir} option
(@pxref{aclocal Options}).
@end table

As an example, suppose that @command{automake-1.11.2} was configured with
@option{--prefix=@-/usr/local}.  Then, the search path would be:

@enumerate
@item @file{/usr/local/share/aclocal-1.11.2/}
@item @file{/usr/local/share/aclocal/}
@end enumerate

The paths for the @var{acdir} and @var{acdir-APIVERSION} directories can
be changed respectively through aclocal options @option{--system-acdir}
and @option{--automake-acdir} (@pxref{aclocal Options}).  Note however
that these options are only intended for use by the internal Automake
test suite, or for debugging under highly unusual situations; they are
not ordinarily needed by end-users.

As explained in (@pxref{aclocal Options}), there are several options that
can be used to change or extend this search path.

@subsubheading Modifying the Macro Search Path: @samp{-I @var{dir}}

Any extra directories specified using @option{-I} options
(@pxref{aclocal Options}) are @emph{prepended} to this search list.  Thus,
@samp{aclocal -I /foo -I /bar} results in the following search path:

@enumerate
@item @file{/foo}
@item @file{/bar}
@item @var{acdir}-@var{APIVERSION}
@item @var{acdir}
@end enumerate

@subsubheading Modifying the Macro Search Path: @file{dirlist}
@cindex @file{dirlist}

There is a third mechanism for customizing the search path.  If a
@file{dirlist} file exists in @var{acdir}, then that file is assumed to
contain a list of directory patterns, one per line.  @command{aclocal}
expands these patterns to directory names, and adds them to the search
list @emph{after} all other directories.  @file{dirlist} entries may
use shell wildcards such as @samp{*}, @samp{?}, or @code{[...]}.

For example, suppose
@file{@var{acdir}/dirlist} contains the following:

@example
/test1
/test2
/test3*
@end example

@noindent
and that @command{aclocal} was called with the @samp{-I /foo -I /bar} options.
Then, the search path would be

@c @code looks better than @file here
@enumerate
@item @code{/foo}
@item @code{/bar}
@item @var{acdir}-@var{APIVERSION}
@item @var{acdir}
@item @code{/test1}
@item @code{/test2}
@end enumerate

@noindent
and all directories with path names starting with @code{/test3}.

If the @option{--system-acdir=@var{dir}} option is used, then
@command{aclocal} will search for the @file{dirlist} file in
@var{dir}; but remember the warnings  above against the use of
@option{--system-acdir}.

@file{dirlist} is useful in the following situation: suppose that
@command{automake} version @code{1.11.2} is installed with
@samp{--prefix=/usr} by the system vendor.  Thus, the default search
directories are

@c @code looks better than @file here
@enumerate
@item @code{/usr/share/aclocal-1.11/}
@item @code{/usr/share/aclocal/}
@end enumerate

However, suppose further that many packages have been manually
installed on the system, with $prefix=/usr/local, as is typical.  In
that case, many of these ``extra'' @file{.m4} files are in
@file{/usr/local/share/aclocal}.  The only way to force
@file{/usr/bin/aclocal} to find these ``extra'' @file{.m4} files is to
always call @samp{aclocal -I /usr/local/share/aclocal}.  This is
inconvenient.  With @file{dirlist}, one may create a file
@file{/usr/share/aclocal/dirlist} containing only the single line

@example
/usr/local/share/aclocal
@end example

Now, the ``default'' search path on the affected system is

@c @code looks better than @file here
@enumerate
@item @code{/usr/share/aclocal-1.11/}
@item @code{/usr/share/aclocal/}
@item @code{/usr/local/share/aclocal/}
@end enumerate

without the need for @option{-I} options; @option{-I} options can be reserved
for project-specific needs (@file{my-source-dir/m4/}), rather than
using it to work around local system-dependent tool installation
directories.

Similarly, @file{dirlist} can be handy if you have installed a local
copy of Automake in your account and want @command{aclocal} to look for
macros installed at other places on the system.

@anchor{ACLOCAL_PATH}
@subsubheading Modifying the Macro Search Path: @file{ACLOCAL_PATH}
@cindex @env{ACLOCAL_PATH}

The fourth and last mechanism to customize the macro search path is
also the simplest.  Any directory included in the colon-separated
environment variable @env{ACLOCAL_PATH} is added to the search path
@c Keep in sync with aclocal-path-precedence.sh
and takes precedence over system directories (including those found via
@file{dirlist}), with the exception of the versioned directory
@var{acdir-APIVERSION} (@pxref{Macro Search Path}).  However, directories
passed via @option{-I} will take precedence over directories in
@env{ACLOCAL_PATH}.

@c Keep in sync with aclocal-path-installed.sh
Also note that, if the @option{--install} option is used, any @file{.m4}
file containing a required macro that is found in a directory listed in
@env{ACLOCAL_PATH} will be installed locally.
@c Keep in sync with aclocal-path-installed-serial.sh
In this case, serial numbers in @file{.m4} are honored too,
@pxref{Serials}.

Conversely to @file{dirlist}, @env{ACLOCAL_PATH} is useful if you are
using a global copy of Automake and want @command{aclocal} to look for
macros somewhere under your home directory.

@subsubheading Planned future incompatibilities

The order in which the directories in the macro search path are currently
looked up is confusing and/or suboptimal in various aspects, and is
probably going to be changed in the future Automake release.  In
particular, directories in @env{ACLOCAL_PATH} and @file{@var{acdir}}
might end up taking precedence over @file{@var{acdir-APIVERSION}}, and
directories in @file{@var{acdir}/dirlist} might end up taking precedence
over @file{@var{acdir}}.  @emph{This is a possible future incompatibility!}

@node Extending aclocal
@subsection Writing your own aclocal macros

@cindex @command{aclocal}, extending
@cindex Extending @command{aclocal}

The @command{aclocal} program doesn't have any built-in knowledge of any
macros, so it is easy to extend it with your own macros.

This can be used by libraries that want to supply their own Autoconf
macros for use by other programs.  For instance, the @command{gettext}
library supplies a macro @code{AM_GNU_GETTEXT} that should be used by
any package using @command{gettext}.  When the library is installed, it
installs this macro so that @command{aclocal} will find it.

A macro file's name should end in @file{.m4}.  Such files should be
installed in @file{$(datadir)/aclocal}.  This is as simple as writing:

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
aclocaldir = $(datadir)/aclocal
aclocal_DATA = mymacro.m4 myothermacro.m4
@end example

@noindent
Please do use @file{$(datadir)/aclocal}, and not something based on
the result of @samp{aclocal --print-ac-dir} (@pxref{Hard-Coded Install
Paths}, for arguments).  It might also be helpful to suggest to
the user to add the @file{$(datadir)/aclocal} directory to his
@env{ACLOCAL_PATH} variable (@pxref{ACLOCAL_PATH}) so that
@command{aclocal} will find the @file{.m4} files installed by your
package automatically.

A file of macros should be a series of properly quoted
@code{AC_DEFUN}'s (@pxref{Macro Definitions, , , autoconf, The
Autoconf Manual}).  The @command{aclocal} programs also understands
@code{AC_REQUIRE} (@pxref{Prerequisite Macros, , , autoconf, The
Autoconf Manual}), so it is safe to put each macro in a separate file.
Each file should have no side effects but macro definitions.
Especially, any call to @code{AC_PREREQ} should be done inside the
defined macro, not at the beginning of the file.

@cindex underquoted @code{AC_DEFUN}
@acindex AC_DEFUN
@acindex AC_PREREQ

Starting with Automake 1.8, @command{aclocal} will warn about all
underquoted calls to @code{AC_DEFUN}.  We realize this will annoy a
lot of people, because @command{aclocal} was not so strict in the past
and many third party macros are underquoted; and we have to apologize
for this temporary inconvenience.  The reason we have to be stricter
is that a future implementation of @command{aclocal} (@pxref{Future of
aclocal}) will have to temporarily include all of these third party
@file{.m4} files, maybe several times, including even files that are
not actually needed.  Doing so should alleviate many problems of the
current implementation, however it requires a stricter style from the
macro authors.  Hopefully it is easy to revise the existing macros.
For instance,

@example
# bad style
AC_PREREQ(2.68)
AC_DEFUN(AX_FOOBAR,
[AC_REQUIRE([AX_SOMETHING])dnl
AX_FOO
AX_BAR
])
@end example

@noindent
should be rewritten as

@example
AC_DEFUN([AX_FOOBAR],
[AC_PREREQ([2.68])dnl
AC_REQUIRE([AX_SOMETHING])dnl
AX_FOO
AX_BAR
])
@end example

Wrapping the @code{AC_PREREQ} call inside the macro ensures that
Autoconf 2.68 will not be required if @code{AX_FOOBAR} is not actually
used.  Most importantly, quoting the first argument of @code{AC_DEFUN}
allows the macro to be redefined or included twice (otherwise this
first argument would be expanded during the second definition).  For
consistency we like to quote even arguments such as @code{2.68} that
do not require it.

If you have been directed here by the @command{aclocal} diagnostic but
are not the maintainer of the implicated macro, you will want to
contact the maintainer of that macro.  Please make sure you have the
latest version of the macro and that the problem hasn't already been
reported before doing so: people tend to work faster when they aren't
flooded by mails.

Another situation where @command{aclocal} is commonly used is to
manage macros that are used locally by the package, @ref{Local
Macros}.

@node Local Macros
@subsection Handling Local Macros

Feature tests offered by Autoconf do not cover all needs.  People
often have to supplement existing tests with their own macros, or
with third-party macros.

There are two ways to organize custom macros in a package.

The first possibility (the historical practice) is to list all your
macros in @file{acinclude.m4}.  This file will be included in
@file{aclocal.m4} when you run @command{aclocal}, and its macro(s) will
henceforth be visible to @command{autoconf}.  However if it contains
numerous macros, it will rapidly become difficult to maintain, and it
will be almost impossible to share macros between packages.

The second possibility, which we do recommend, is to write each macro
in its own file and gather all these files in a directory.  This
directory is usually called @file{m4/}.  Then it's enough to update
@file{configure.ac} by adding a proper call to @code{AC_CONFIG_MACRO_DIRS}:

@example
AC_CONFIG_MACRO_DIRS([m4])
@end example

@command{aclocal} will then take care of automatically adding @file{m4/}
to its search path for m4 files.

When @samp{aclocal} is run, it will build an @file{aclocal.m4}
that @code{m4_include}s any file from @file{m4/} that defines a
required macro.  Macros not found locally will still be searched in
system-wide directories, as explained in @ref{Macro Search Path}.

Custom macros should be distributed for the same reason that
@file{configure.ac} is: so that other people have all the sources of
your package if they want to work on it.  Actually, this distribution
happens automatically because all @code{m4_include}d files are
distributed.

However there is no consensus on the distribution of third-party
macros that your package may use.  Many libraries install their own
macro in the system-wide @command{aclocal} directory (@pxref{Extending
aclocal}).  For instance, Guile ships with a file called
@file{guile.m4} that contains the macro @code{GUILE_FLAGS} that can
be used to define setup compiler and linker flags appropriate for
using Guile.  Using @code{GUILE_FLAGS} in @file{configure.ac} will
cause @command{aclocal} to copy @file{guile.m4} into
@file{aclocal.m4}, but as @file{guile.m4} is not part of the project,
it will not be distributed.  Technically, that means a user who
needs to rebuild @file{aclocal.m4} will have to install Guile first.
This is probably OK, if Guile already is a requirement to build the
package.  However, if Guile is only an optional feature, or if your
package might run on architectures where Guile cannot be installed,
this requirement will hinder development.  An easy solution is to copy
such third-party macros in your local @file{m4/} directory so they get
distributed.

Since Automake 1.10, @command{aclocal} offers the option @code{--install}
to copy these system-wide third-party macros in your local macro directory,
helping to solve the above problem.

With this setup, system-wide macros will be copied to @file{m4/}
the first time you run @command{aclocal}.  Then the locally installed
macros will have precedence over the system-wide installed macros
each time @command{aclocal} is run again.

One reason why you should keep @option{--install} in the flags even
after the first run is that when you later edit @file{configure.ac}
and depend on a new macro, this macro will be installed in your
@file{m4/} automatically.  Another one is that serial numbers
(@pxref{Serials}) can be used to update the macros in your source tree
automatically when new system-wide versions are installed.  A serial
number should be a single line of the form

@example
#serial @var{nnn}
@end example

@noindent
where @var{nnn} contains only digits and dots.  It should appear in
the M4 file before any macro definition.  It is a good practice to
maintain a serial number for each macro you distribute, even if you do
not use the @option{--install} option of @command{aclocal}: this allows
other people to use it.


@node Serials
@subsection Serial Numbers
@cindex serial numbers in macros
@cindex macro serial numbers
@cindex @code{#serial} syntax
@cindex @command{aclocal} and serial numbers

Because third-party macros defined in @file{*.m4} files are naturally
shared between multiple projects, some people like to version them.
This makes it easier to tell which of two M4 files is newer.  Since at
least 1996, the tradition is to use a @samp{#serial} line for this.

A serial number should be a single line of the form

@example
# serial @var{version}
@end example

@noindent
where @var{version} is a version number containing only digits and
dots.  Usually people use a single integer, and they increment it each
time they change the macro (hence the name of ``serial'').  Such a
line should appear in the M4 file before any macro definition.

The @samp{#} must be the first character on the line,
and it is OK to have extra words after the version, as in

@example
#serial @var{version} @var{garbage}
@end example

Normally these serial numbers are completely ignored by
@command{aclocal} and @command{autoconf}, like any genuine comment.
However when using @command{aclocal}'s @option{--install} feature, these
serial numbers will modify the way @command{aclocal} selects the
macros to install in the package: if two files with the same basename
exist in your search path, and if at least one of them uses a
@samp{#serial} line, @command{aclocal} will ignore the file that has
the older @samp{#serial} line (or the file that has none).

Note that a serial number applies to a whole M4 file, not to any macro
it contains.  A file can contains multiple macros, but only one
serial.

Here is a use case that illustrates the use of @option{--install} and
its interaction with serial numbers.  Let's assume we maintain a
package called MyPackage, the @file{configure.ac} of which requires a
third-party macro @code{AX_THIRD_PARTY} defined in
@file{/usr/share/aclocal/thirdparty.m4} as follows:

@example
# serial 1
AC_DEFUN([AX_THIRD_PARTY], [...])
@end example

MyPackage uses an @file{m4/} directory to store local macros as
explained in @ref{Local Macros}, and has

@example
AC_CONFIG_MACRO_DIRS([m4])
@end example

@noindent
in its @file{configure.ac}.

Initially the @file{m4/} directory is empty.  The first time we run
@command{aclocal --install}, it will notice that

@itemize @bullet
@item
@file{configure.ac} uses @code{AX_THIRD_PARTY}
@item
No local macros define @code{AX_THIRD_PARTY}
@item
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
with serial 1.
@end itemize

@noindent
Because @file{/usr/share/aclocal/thirdparty.m4} is a system-wide macro
and @command{aclocal} was given the @option{--install} option, it will
copy this file in @file{m4/thirdparty.m4}, and output an
@file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.

The next time @samp{aclocal --install} is run, something different
happens.  @command{aclocal} notices that

@itemize @bullet
@item
@file{configure.ac} uses @code{AX_THIRD_PARTY}
@item
@file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
with serial 1.
@item
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
with serial 1.
@end itemize

@noindent
Because both files have the same serial number, @command{aclocal} uses
the first it found in its search path order (@pxref{Macro Search
Path}).  @command{aclocal} therefore ignores
@file{/usr/share/aclocal/thirdparty.m4} and outputs an
@file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.

Local directories specified with @option{-I} are always searched before
system-wide directories, so a local file will always be preferred to
the system-wide file in case of equal serial numbers.

Now suppose the system-wide third-party macro is changed.  This can
happen if the package installing this macro is updated.  Let's suppose
the new macro has serial number 2.  The next time @samp{aclocal --install}
is run the situation is the following:

@itemize @bullet
@item
@file{configure.ac} uses @code{AX_THIRD_PARTY}
@item
@file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
with serial 1.
@item
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
with serial 2.
@end itemize

@noindent
When @command{aclocal} sees a greater serial number, it immediately
forgets anything it knows from files that have the same basename and a
smaller serial number.  So after it has found
@file{/usr/share/aclocal/thirdparty.m4} with serial 2,
@command{aclocal} will proceed as if it had never seen
@file{m4/thirdparty.m4}.  This brings us back to a situation similar
to that at the beginning of our example, where no local file defined
the macro.  @command{aclocal} will install the new version of the
macro in @file{m4/thirdparty.m4}, in this case overriding the old
version.  MyPackage just had its macro updated as a side effect of
running @command{aclocal}.

If you are leery of letting @command{aclocal} update your local
macro, you can run @samp{aclocal --diff} to review the changes
@samp{aclocal --install} would perform on these macros.

Finally, note that the @option{--force} option of @command{aclocal} has
absolutely no effect on the files installed by @option{--install}.  For
instance, if you have modified your local macros, do not expect
@option{--install --force} to replace the local macros by their
system-wide versions.  If you want to do so, simply erase the local
macros you want to revert, and run @samp{aclocal --install}.


@node Future of aclocal
@subsection The Future of @command{aclocal}
@cindex @command{aclocal}'s scheduled death

@command{aclocal} is expected to disappear.  This feature really
should not be offered by Automake.  Automake should focus on
generating @file{Makefile}s; dealing with M4 macros really is
Autoconf's job.  The fact that some people install Automake just to use
@command{aclocal}, but do not use @command{automake} otherwise is an
indication of how that feature is misplaced.

The new implementation will probably be done slightly differently.
For instance, it could enforce the @file{m4/}-style layout discussed in
@ref{Local Macros}.

We have no idea when and how this will happen.  This has been
discussed several times in the past, but someone still has to commit
to that non-trivial task.

From the user point of view, @command{aclocal}'s removal might turn
out to be painful.  There is a simple precaution that you may take to
make that switch more seamless: never call @command{aclocal} yourself.
Keep this guy under the exclusive control of @command{autoreconf} and
Automake's rebuild rules.  Hopefully you won't need to worry about
things breaking, when @command{aclocal} disappears, because everything
will have been taken care of.  If otherwise you used to call
@command{aclocal} directly yourself or from some script, you will
quickly notice the change.

Many packages come with a script called @file{bootstrap} or
@file{autogen.sh}, that will just call @command{aclocal},
@command{libtoolize}, @command{gettextize} or @command{autopoint},
@command{autoconf}, @command{autoheader}, and @command{automake} in
the right order.  Actually this is precisely what @command{autoreconf}
can do for you.  If your package has such a @file{bootstrap} or
@file{autogen.sh} script, consider using @command{autoreconf}.  That
should simplify its logic a lot (less things to maintain, yum!), it's
even likely you will not need the script anymore, and more to the point
you will not call @command{aclocal} directly anymore.

For the time being, third-party packages should continue to install
public macros into @file{/usr/share/aclocal/}.  If @command{aclocal}
is replaced by another tool it might make sense to rename the
directory, but supporting @file{/usr/share/aclocal/} for backward
compatibility should be really easy provided all macros are properly
written (@pxref{Extending aclocal}).



@node Macros
@section Autoconf macros supplied with Automake

Automake ships with several Autoconf macros that you can use from your
@file{configure.ac}.  When you use one of them it will be included by
@command{aclocal} in @file{aclocal.m4}.

@menu
* Public Macros::               Macros that you can use.
* Obsolete Macros::             Macros that will soon be removed.
* Private Macros::              Macros that you should not use.
@end menu

@c consider generating the following subsections automatically from m4 files.

@node Public Macros
@subsection Public Macros

@table @code

@item AM_INIT_AUTOMAKE([OPTIONS])
@acindex AM_INIT_AUTOMAKE
Runs many macros required for proper operation of the generated Makefiles.

@vindex AUTOMAKE_OPTIONS
Today, @code{AM_INIT_AUTOMAKE} is called with a single argument: a
space-separated list of Automake options that should be applied to
every @file{Makefile.am} in the tree.  The effect is as if
each option were listed in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).

@acindex AC_INIT
This macro can also be called in another, @emph{deprecated} form:
@code{AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])}.  In this form,
there are two required arguments: the package and the version number.
This usage is mostly obsolete because the @var{package} and @var{version}
can be obtained from Autoconf's @code{AC_INIT} macro.  However,
differently from what happens for @code{AC_INIT} invocations, this
@code{AM_INIT_AUTOMAKE} invocation supports shell variables' expansions
in the @code{PACKAGE} and @code{VERSION} arguments (which otherwise
defaults, respectively, to the @code{PACKAGE_TARNAME} and
@code{PACKAGE_VERSION} defined via the @code{AC_INIT} invocation;
@pxref{AC_INIT, , The @code{AC_INIT} macro, autoconf, The Autoconf Manual});
and this can be still be useful in some selected situations.
Our hope is that future Autoconf versions will improve their support
for package versions defined dynamically at configure runtime; when
(and if) this happens, support for the two-args @code{AM_INIT_AUTOMAKE}
invocation will likely be removed from Automake.

@anchor{Modernize AM_INIT_AUTOMAKE invocation}
If your @file{configure.ac} has:

@example
AC_INIT([src/foo.c])
AM_INIT_AUTOMAKE([mumble], [1.5])
@end example

@noindent
you should modernize it as follows:

@example
AC_INIT([mumble], [1.5])
AC_CONFIG_SRCDIR([src/foo.c])
AM_INIT_AUTOMAKE
@end example

Note that if you're upgrading your @file{configure.ac} from an earlier
version of Automake, it is not always correct to simply move the
package and version arguments from @code{AM_INIT_AUTOMAKE} directly to
@code{AC_INIT}, as in the example above.  The first argument to
@code{AC_INIT} should be the name of your package (e.g., @samp{GNU
Automake}), not the tarball name (e.g., @samp{automake}) that you used
to pass to @code{AM_INIT_AUTOMAKE}.  Autoconf tries to derive a
tarball name from the package name, which should work for most but not
all package names.  (If it doesn't work for yours, you can use the
four-argument form of @code{AC_INIT} to provide the tarball name
explicitly).

@cindex @code{PACKAGE}, prevent definition
@cindex @code{VERSION}, prevent definition
@opindex no-define
By default this macro @code{AC_DEFINE}'s @code{PACKAGE} and
@code{VERSION}.  This can be avoided by passing the @option{no-define}
option (@pxref{List of Automake options}):
@example
AM_INIT_AUTOMAKE([no-define ...])
@end example

@item AM_PATH_LISPDIR
@acindex AM_PATH_LISPDIR
@vindex EMACS
@vindex lispdir
Searches for the program @command{emacs}, and, if found, sets the
output variable @code{lispdir} to the full path to Emacs' site-lisp
directory.

Note that this test assumes the @command{emacs} found to be a version
that supports Emacs Lisp (such as GNU Emacs or XEmacs).  Other
emacsen can cause this test to hang (some, like old versions of
MicroEmacs, start up in interactive mode, requiring @kbd{C-x C-c} to
exit, which is hardly obvious for a non-emacs user).  In most cases,
however, you should be able to use @kbd{C-c} to kill the test.  In
order to avoid problems, you can set @env{EMACS} to ``no'' in the
environment, or use the @option{--with-lispdir} option to
@command{configure} to explicitly set the correct path (if you're sure
you have an @command{emacs} that supports Emacs Lisp).

@item AM_PROG_AR(@ovar{act-if-fail})
@acindex AM_PROG_AR
@vindex AR
You must use this macro when you use the archiver in your project, if
you want support for unusual archivers such as Microsoft @command{lib}.
The content of the optional argument is executed if the archiver
interface is not recognized; the default action is to abort configure
with an error message.

@item AM_PROG_AS
@acindex AM_PROG_AS
@vindex CCAS
@vindex CCASFLAGS
Use this macro when you have assembly code in your project.  This will
choose the assembler for you (by default the C compiler) and set
@code{CCAS}, and will also set @code{CCASFLAGS} if required.

@item AM_PROG_CC_C_O
@acindex AM_PROG_CC_C_O
This is an obsolescent macro that checks that the C compiler supports
the @option{-c} and @option{-o} options together.  Note that, since
Automake 1.14, the @code{AC_PROG_CC} is rewritten to implement such
checks itself, and thus the explicit use of @code{AM_PROG_CC_C_O}
should no longer be required.

@item AM_PROG_LEX
@acindex AM_PROG_LEX
@acindex AC_PROG_LEX
@cindex HP-UX 10, @command{lex} problems
@cindex @command{lex} problems with HP-UX 10
Like @code{AC_PROG_LEX} (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}), but uses the
@command{missing} script on systems that do not have @command{lex}.
HP-UX 10 is one such system.

@item AM_PROG_GCJ
@acindex AM_PROG_GCJ
@vindex GCJ
@vindex GCJFLAGS
This macro finds the @command{gcj} program or causes an error.  It sets
@code{GCJ} and @code{GCJFLAGS}.  @command{gcj} is the Java front-end to the
GNU Compiler Collection.

@item AM_PROG_UPC([@var{compiler-search-list}])
@acindex AM_PROG_UPC
@vindex UPC
Find a compiler for Unified Parallel C and define the @code{UPC}
variable.  The default @var{compiler-search-list} is @samp{upcc upc}.
This macro will abort @command{configure} if no Unified Parallel C
compiler is found.

@item AM_MISSING_PROG(@var{name}, @var{program})
@acindex AM_MISSING_PROG
@vindex MISSING
Find a maintainer tool @var{program} and define the @var{name}
environment variable with its location.  If @var{program} is not
detected, then @var{name} will instead invoke the @command{missing}
script, in order to give useful advice to the user about the missing
maintainer tool.  @xref{maintainer-mode}, for more information on when
the @command{missing} script is appropriate.

@item AM_SILENT_RULES
@acindex AM_SILENT_RULES
Control the machinery for less verbose build output
(@pxref{Automake Silent Rules}).

@item AM_WITH_DMALLOC
@acindex AM_WITH_DMALLOC
@cindex @command{dmalloc}, support for
@vindex WITH_DMALLOC
@opindex --with-dmalloc
Add support for the @uref{http://dmalloc.com/, Dmalloc package}.  If
the user runs @command{configure} with @option{--with-dmalloc}, then
define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}.

@end table


@node Obsolete Macros
@subsection Obsolete Macros
@cindex obsolete macros
@cindex autoupdate

Although using some of the following macros was required in past
releases, you should not use any of them in new code.  @emph{All
these macros will be removed in the next major Automake version};
if you are still using them, running @command{autoupdate} should
adjust your @file{configure.ac} automatically (@pxref{autoupdate
Invocation, , Using @command{autoupdate} to Modernize
@file{configure.ac}, autoconf, The Autoconf Manual}).
@emph{Do it NOW!}

@table @code

@item AM_PROG_MKDIR_P
@acindex AM_PROG_MKDIR_P
@cindex @code{mkdir -p}, macro check
@vindex MKDIR_P
@vindex mkdir_p

From Automake 1.8 to 1.9.6 this macro used to define the output
variable @code{mkdir_p} to one of @code{mkdir -p}, @code{install-sh
-d}, or @code{mkinstalldirs}.

Nowadays Autoconf provides a similar functionality with
@code{AC_PROG_MKDIR_P} (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}), however this defines
the output variable @code{MKDIR_P} instead.  In case you are still
using the @code{AM_PROG_MKDIR_P} macro in your @file{configure.ac},
or its provided variable @code{$(mkdir_p)} in your @file{Makefile.am},
you are advised to switch ASAP to the more modern Autoconf-provided
interface instead; both the macro and the variable might be removed
in a future major Automake release.

@end table


@node Private Macros
@subsection Private Macros

The following macros are private macros you should not call directly.
They are called by the other public macros when appropriate.  Do not
rely on them, as they might be changed in a future version.  Consider
them as implementation details; or better, do not consider them at all:
skip this section!

@ftable @code
@item _AM_DEPENDENCIES
@itemx AM_SET_DEPDIR
@itemx AM_DEP_TRACK
@itemx AM_OUTPUT_DEPENDENCY_COMMANDS
These macros are used to implement Automake's automatic dependency
tracking scheme.  They are called automatically by Automake when
required, and there should be no need to invoke them manually.

@item AM_MAKE_INCLUDE
This macro is used to discover how the user's @command{make} handles
@code{include} statements.  This macro is automatically invoked when
needed; there should be no need to invoke it manually.

@item AM_PROG_INSTALL_STRIP
This is used to find a version of @code{install} that can be used to
strip a program at installation time.  This macro is automatically
included when required.

@item AM_SANITY_CHECK
This checks to make sure that a file created in the build directory is
newer than a file in the source directory.  This can fail on systems
where the clock is set incorrectly.  This macro is automatically run
from @code{AM_INIT_AUTOMAKE}.

@end ftable


@node Directories
@chapter Directories

For simple projects that distribute all files in the same directory
it is enough to have a single @file{Makefile.am} that builds
everything in place.

In larger projects, it is common to organize files in different
directories, in a tree.  For example, there could be a directory
for the program's source, one for the testsuite, and one for the
documentation; or, for very large projects, there could be one
directory per program, per library or per module.

The traditional approach is to build these subdirectories recursively,
employing @emph{make recursion}: each directory contains its
own @file{Makefile}, and when @command{make} is run from the top-level
directory, it enters each subdirectory in turn, and invokes there a
new @command{make} instance to build the directory's contents.

Because this approach is very widespread, Automake offers built-in
support for it.  However, it is worth nothing that the use of make
recursion has its own serious issues and drawbacks, and that it's
well possible to have packages with a multi directory layout that
make little or no use of such recursion (examples of such packages
are GNU Bison and GNU Automake itself); see also the @ref{Alternative}
section below.

@menu
* Subdirectories::              Building subdirectories recursively
* Conditional Subdirectories::  Conditionally not building directories
* Alternative::                 Subdirectories without recursion
* Subpackages::                 Nesting packages
@end menu

@node Subdirectories
@section Recursing subdirectories

@cindex @code{SUBDIRS}, explained

In packages using make recursion, the top level @file{Makefile.am} must
tell Automake which subdirectories are to be built.  This is done via
the @code{SUBDIRS} variable.
@vindex SUBDIRS

The @code{SUBDIRS} variable holds a list of subdirectories in which
building of various sorts can occur.  The rules for many targets
(e.g., @code{all}) in the generated @file{Makefile} will run commands
both locally and in all specified subdirectories.  Note that the
directories listed in @code{SUBDIRS} are not required to contain
@file{Makefile.am}s; only @file{Makefile}s (after configuration).
This allows inclusion of libraries from packages that do not use
Automake (such as @code{gettext}; see also @ref{Third-Party
Makefiles}).

In packages that use subdirectories, the top-level @file{Makefile.am} is
often very short.  For instance, here is the @file{Makefile.am} from the
GNU Hello distribution:

@example
EXTRA_DIST = BUGS ChangeLog.O README-alpha
SUBDIRS = doc intl po src tests
@end example

When Automake invokes @command{make} in a subdirectory, it uses the value
of the @code{MAKE} variable.  It passes the value of the variable
@code{AM_MAKEFLAGS} to the @command{make} invocation; this can be set in
@file{Makefile.am} if there are flags you must always pass to
@command{make}.
@vindex MAKE
@vindex AM_MAKEFLAGS

The directories mentioned in @code{SUBDIRS} are usually direct
children of the current directory, each subdirectory containing its
own @file{Makefile.am} with a @code{SUBDIRS} pointing to deeper
subdirectories.  Automake can be used to construct packages of
arbitrary depth this way.

By default, Automake generates @file{Makefiles} that work depth-first
in postfix order: the subdirectories are built before the current
directory.  However, it is possible to change this ordering.  You can
do this by putting @samp{.} into @code{SUBDIRS}.  For instance,
putting @samp{.} first will cause a prefix ordering of
directories.

Using

@example
SUBDIRS = lib src . test
@end example

@noindent
will cause @file{lib/} to be built before @file{src/}, then the
current directory will be built, finally the @file{test/} directory
will be built.  It is customary to arrange test directories to be
built after everything else since they are meant to test what has
been constructed.

In addition to the built-in recursive targets defined by Automake
(@code{all}, @code{check}, etc.), the developer can also define his
own recursive targets.  That is done by passing the names of such
targets as arguments to the m4 macro @code{AM_EXTRA_RECURSIVE_TARGETS}
in @file{configure.ac}.  Automake generates rules to handle the
recursion for such targets; and the developer can define real actions
for them by defining corresponding @code{-local} targets.

@example
% @kbd{cat configure.ac}
AC_INIT([pkg-name], [1.0]
AM_INIT_AUTOMAKE
AM_EXTRA_RECURSIVE_TARGETS([foo])
AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile])
AC_OUTPUT
% @kbd{cat Makefile.am}
SUBDIRS = sub
foo-local:
        @@echo This will be run by "make foo".
% @kbd{cat sub/Makefile.am}
SUBDIRS = src
% @kbd{cat sub/src/Makefile.am}
foo-local:
        @@echo This too will be run by a "make foo" issued either in
        @@echo the 'sub/src/' directory, the 'sub/' directory, or the
        @@echo top-level directory.
@end example

@node Conditional Subdirectories
@section Conditional Subdirectories
@cindex Subdirectories, building conditionally
@cindex Conditional subdirectories
@cindex @code{SUBDIRS}, conditional
@cindex Conditional @code{SUBDIRS}

It is possible to define the @code{SUBDIRS} variable conditionally if,
like in the case of GNU Inetutils, you want to only build a subset of
the entire package.

To illustrate how this works, let's assume we have two directories
@file{src/} and @file{opt/}.  @file{src/} should always be built, but we
want to decide in @command{configure} whether @file{opt/} will be built
or not.  (For this example we will assume that @file{opt/} should be
built when the variable @samp{$want_opt} was set to @samp{yes}.)

Running @command{make} should thus recurse into @file{src/} always, and
then maybe in @file{opt/}.

However @samp{make dist} should always recurse into both @file{src/}
and @file{opt/}.  Because @file{opt/} should be distributed even if it
is not needed in the current configuration.  This means
@file{opt/Makefile} should be created @emph{unconditionally}.

There are two ways to setup a project like this.  You can use Automake
conditionals (@pxref{Conditionals}) or use Autoconf @code{AC_SUBST}
variables (@pxref{Setting Output Variables, , Setting Output
Variables, autoconf, The Autoconf Manual}).  Using Automake
conditionals is the preferred solution.  Before we illustrate these
two possibilities, let's introduce @code{DIST_SUBDIRS}.

@menu
* SUBDIRS vs DIST_SUBDIRS::     Two sets of directories
* Subdirectories with AM_CONDITIONAL::  Specifying conditional subdirectories
* Subdirectories with AC_SUBST::  Another way for conditional recursion
* Unconfigured Subdirectories::  Not even creating a @samp{Makefile}
@end menu

@node SUBDIRS vs DIST_SUBDIRS
@subsection @code{SUBDIRS} vs.@: @code{DIST_SUBDIRS}
@cindex @code{DIST_SUBDIRS}, explained

Automake considers two sets of directories, defined by the variables
@code{SUBDIRS} and @code{DIST_SUBDIRS}.

@code{SUBDIRS} contains the subdirectories of the current directory
that must be built (@pxref{Subdirectories}).  It must be defined
manually; Automake will never guess a directory is to be built.  As we
will see in the next two sections, it is possible to define it
conditionally so that some directory will be omitted from the build.

@code{DIST_SUBDIRS} is used in rules that need to recurse in all
directories, even those that have been conditionally left out of the
build.  Recall our example where we may not want to build subdirectory
@file{opt/}, but yet we want to distribute it?  This is where
@code{DIST_SUBDIRS} comes into play: @samp{opt} may not appear in
@code{SUBDIRS}, but it must appear in @code{DIST_SUBDIRS}.

Precisely, @code{DIST_SUBDIRS} is used by @samp{make
maintainer-clean}, @samp{make distclean} and @samp{make dist}.  All
other recursive rules use @code{SUBDIRS}.

If @code{SUBDIRS} is defined conditionally using Automake
conditionals, Automake will define @code{DIST_SUBDIRS} automatically
from the possible values of @code{SUBDIRS} in all conditions.

If @code{SUBDIRS} contains @code{AC_SUBST} variables,
@code{DIST_SUBDIRS} will not be defined correctly because Automake
does not know the possible values of these variables.  In this case
@code{DIST_SUBDIRS} needs to be defined manually.

@node Subdirectories with AM_CONDITIONAL
@subsection Subdirectories with @code{AM_CONDITIONAL}
@cindex @code{SUBDIRS} and @code{AM_CONDITIONAL}
@cindex @code{AM_CONDITIONAL} and @code{SUBDIRS}

@c Keep in sync with subdir-am-cond.sh

@file{configure} should output the @file{Makefile} for each directory
and define a condition into which @file{opt/} should be built.

@example
@dots{}
AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
@dots{}
@end example

Then @code{SUBDIRS} can be defined in the top-level @file{Makefile.am}
as follows.

@example
if COND_OPT
  MAYBE_OPT = opt
endif
SUBDIRS = src $(MAYBE_OPT)
@end example

As you can see, running @command{make} will rightly recurse into
@file{src/} and maybe @file{opt/}.

@vindex DIST_SUBDIRS
As you can't see, running @samp{make dist} will recurse into both
@file{src/} and @file{opt/} directories because @samp{make dist}, unlike
@samp{make all}, doesn't use the @code{SUBDIRS} variable.  It uses the
@code{DIST_SUBDIRS} variable.

In this case Automake will define @samp{DIST_SUBDIRS = src opt}
automatically because it knows that @code{MAYBE_OPT} can contain
@samp{opt} in some condition.

@node Subdirectories with AC_SUBST
@subsection Subdirectories with @code{AC_SUBST}
@cindex @code{SUBDIRS} and @code{AC_SUBST}
@cindex @code{AC_SUBST} and @code{SUBDIRS}

@c Keep in sync with subdir-ac-subst.sh

Another possibility is to define @code{MAYBE_OPT} from
@file{./configure} using @code{AC_SUBST}:

@example
@dots{}
if test "$want_opt" = yes; then
  MAYBE_OPT=opt
else
  MAYBE_OPT=
fi
AC_SUBST([MAYBE_OPT])
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
@dots{}
@end example

In this case the top-level @file{Makefile.am} should look as follows.

@example
SUBDIRS = src $(MAYBE_OPT)
DIST_SUBDIRS = src opt
@end example

The drawback is that since Automake cannot guess what the possible
values of @code{MAYBE_OPT} are, it is necessary to define
@code{DIST_SUBDIRS}.

@node Unconfigured Subdirectories
@subsection Unconfigured Subdirectories
@cindex Subdirectories, configured conditionally

The semantics of @code{DIST_SUBDIRS} are often misunderstood by some
users that try to @emph{configure and build} subdirectories
conditionally.  Here by configuring we mean creating the
@file{Makefile} (it might also involve running a nested
@command{configure} script: this is a costly operation that explains
why people want to do it conditionally, but only the @file{Makefile}
is relevant to the discussion).

The above examples all assume that every @file{Makefile} is created,
even in directories that are not going to be built.  The simple reason
is that we want @samp{make dist} to distribute even the directories
that are not being built (e.g., platform-dependent code), hence
@file{make dist} must recurse into the subdirectory, hence this
directory must be configured and appear in @code{DIST_SUBDIRS}.

Building packages that do not configure every subdirectory is a tricky
business, and we do not recommend it to the novice as it is easy to
produce an incomplete tarball by mistake.  We will not discuss this
topic in depth here, yet for the adventurous here are a few rules to
remember.

@cartouche
@itemize
@item @code{SUBDIRS} should always be a subset of @code{DIST_SUBDIRS}.

It makes little sense to have a directory in @code{SUBDIRS} that
is not in @code{DIST_SUBDIRS}.  Think of the former as a way to tell
which directories listed in the latter should be built.
@item Any directory listed in @code{DIST_SUBDIRS} and @code{SUBDIRS}
must be configured.

I.e., the @file{Makefile} must exists or the recursive @command{make}
rules will not be able to process the directory.
@item Any configured directory must be listed in @code{DIST_SUBDIRS}.

So that the cleaning rules remove the generated @file{Makefile}s.
It would be correct to see @code{DIST_SUBDIRS} as a variable that
lists all the directories that have been configured.
@end itemize
@end cartouche

In order to prevent recursion in some unconfigured directory you
must therefore ensure that this directory does not appear in
@code{DIST_SUBDIRS} (and @code{SUBDIRS}).  For instance, if you define
@code{SUBDIRS} conditionally using @code{AC_SUBST} and do not define
@code{DIST_SUBDIRS} explicitly, it will be default to
@samp{$(SUBDIRS)}; another possibility is to force @code{DIST_SUBDIRS
= $(SUBDIRS)}.

Of course, directories that are omitted from @code{DIST_SUBDIRS} will
not be distributed unless you make other arrangements for this to
happen (for instance, always running @samp{make dist} in a
configuration where all directories are known to appear in
@code{DIST_SUBDIRS}; or writing a @code{dist-hook} target to
distribute these directories).

@cindex Subdirectories, not distributed
In few packages, unconfigured directories are not even expected to
be distributed.  Although these packages do not require the
aforementioned extra arrangements, there is another pitfall.  If the
name of a directory appears in @code{SUBDIRS} or @code{DIST_SUBDIRS},
@command{automake} will make sure the directory exists.  Consequently
@command{automake} cannot be run on such a distribution when one
directory has been omitted.  One way to avoid this check is to use the
@code{AC_SUBST} method to declare conditional directories; since
@command{automake} does not know the values of @code{AC_SUBST}
variables it cannot ensure the corresponding directory exists.

@node Alternative
@section An Alternative Approach to Subdirectories

If you've ever read Peter Miller's excellent paper,
@uref{http://miller.emu.id.au/pmiller/books/rmch/,
Recursive Make Considered Harmful}, the preceding sections on the use of
make recursion will probably come as unwelcome advice.  For those who
haven't read the paper, Miller's main thesis is that recursive
@command{make} invocations are both slow and error-prone.

Automake provides sufficient cross-directory support @footnote{We
believe.  This work is new and there are probably warts.
@xref{Introduction}, for information on reporting bugs.} to enable you
to write a single @file{Makefile.am} for a complex multi-directory
package.

By default an installable file specified in a subdirectory will have its
directory name stripped before installation.  For instance, in this
example, the header file will be installed as
@file{$(includedir)/stdio.h}:

@example
include_HEADERS = inc/stdio.h
@end example

@vindex nobase_
@cindex @code{nobase_} prefix
@cindex Path stripping, avoiding
@cindex Avoiding path stripping

However, the @samp{nobase_} prefix can be used to circumvent this path
stripping.  In this example, the header file will be installed as
@file{$(includedir)/sys/types.h}:

@example
nobase_include_HEADERS = sys/types.h
@end example

@cindex @code{nobase_} and @code{dist_} or @code{nodist_}
@cindex @code{dist_} and @code{nobase_}
@cindex @code{nodist_} and @code{nobase_}
@vindex dist_
@vindex nodist_

@samp{nobase_} should be specified first when used in conjunction with
either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
Control}).  For instance:

@example
nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg
@end example

Finally, note that a variable using the @samp{nobase_} prefix can
often be replaced by several variables, one for each destination
directory (@pxref{Uniform}).  For instance, the last example could be
rewritten as follows:

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
imagesdir = $(pkgdatadir)/images
soundsdir = $(pkgdatadir)/sounds
dist_images_DATA = images/vortex.pgm
dist_sounds_DATA = sounds/whirl.ogg
@end example

@noindent
This latter syntax makes it possible to change one destination
directory without changing the layout of the source tree.

Currently, @samp{nobase_*_LTLIBRARIES} are the only exception to this
rule, in that there is no particular installation order guarantee for
an otherwise equivalent set of variables without @samp{nobase_} prefix.

@node Subpackages
@section Nesting Packages
@cindex Nesting packages
@cindex Subpackages
@acindex AC_CONFIG_SUBDIRS
@acindex AC_CONFIG_AUX_DIR


In the GNU Build System, packages can be nested to arbitrary depth.
This means that a package can embed other packages with their own
@file{configure}, @file{Makefile}s, etc.

These other packages should just appear as subdirectories of their
parent package.  They must be listed in @code{SUBDIRS} like other
ordinary directories.  However the subpackage's @file{Makefile}s
should be output by its own @file{configure} script, not by the
parent's @file{configure}.  This is achieved using the
@code{AC_CONFIG_SUBDIRS} Autoconf macro (@pxref{Subdirectories,
AC_CONFIG_SUBDIRS, Configuring Other Packages in Subdirectories,
autoconf, The Autoconf Manual}).

Here is an example package for an @code{arm} program that links with
a @code{hand} library that is a nested package in subdirectory
@file{hand/}.

@code{arm}'s @file{configure.ac}:

@example
AC_INIT([arm], [1.0])
AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
# Call hand's ./configure script recursively.
AC_CONFIG_SUBDIRS([hand])
AC_OUTPUT
@end example

@code{arm}'s @file{Makefile.am}:

@example
# Build the library in the hand subdirectory first.
SUBDIRS = hand

# Include hand's header when compiling this directory.
AM_CPPFLAGS = -I$(srcdir)/hand

bin_PROGRAMS = arm
arm_SOURCES = arm.c
# link with the hand library.
arm_LDADD = hand/libhand.a
@end example

Now here is @code{hand}'s @file{hand/configure.ac}:

@example
AC_INIT([hand], [1.2])
AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE
AC_PROG_CC
AM_PROG_AR
AC_PROG_RANLIB
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
@end example

@noindent
and its @file{hand/Makefile.am}:

@example
lib_LIBRARIES = libhand.a
libhand_a_SOURCES = hand.c
@end example

When @samp{make dist} is run from the top-level directory it will
create an archive @file{arm-1.0.tar.gz} that contains the @code{arm}
code as well as the @file{hand} subdirectory.  This package can be
built and installed like any ordinary package, with the usual
@samp{./configure && make && make install} sequence (the @code{hand}
subpackage will be built and installed by the process).

When @samp{make dist} is run from the hand directory, it will create a
self-contained @file{hand-1.2.tar.gz} archive.  So although it appears
to be embedded in another package, it can still be used separately.

The purpose of the @samp{AC_CONFIG_AUX_DIR([.])} instruction is to
force Automake and Autoconf to search for auxiliary scripts in the
current directory.  For instance, this means that there will be two
copies of @file{install-sh}: one in the top-level of the @code{arm}
package, and another one in the @file{hand/} subdirectory for the
@code{hand} package.

The historical default is to search for these auxiliary scripts in
the parent directory and the grandparent directory.  So if the
@samp{AC_CONFIG_AUX_DIR([.])} line was removed from
@file{hand/configure.ac}, that subpackage would share the auxiliary
script of the @code{arm} package.  This may looks like a gain in size
(a few kilobytes), but it is actually a loss of modularity as the
@code{hand} subpackage is no longer self-contained (@samp{make dist}
in the subdirectory will not work anymore).

Packages that do not use Automake need more work to be integrated this
way.  @xref{Third-Party Makefiles}.

@node Programs
@chapter Building Programs and Libraries

A large part of Automake's functionality is dedicated to making it easy
to build programs and libraries.

@menu
* A Program::                   Building a program
* A Library::                   Building a library
* A Shared Library::            Building a Libtool library
* Program and Library Variables::  Variables controlling program and
                                library builds
* Default _SOURCES::            Default source files
* LIBOBJS::                     Special handling for LIBOBJS and ALLOCA
* Program Variables::           Variables used when building a program
* Yacc and Lex::                Yacc and Lex support
* C++ Support::                 Compiling C++ sources
* Objective C Support::         Compiling Objective C sources
* Objective C++ Support::       Compiling Objective C++ sources
* Unified Parallel C Support::  Compiling Unified Parallel C sources
* Assembly Support::            Compiling assembly sources
* Fortran 77 Support::          Compiling Fortran 77 sources
* Fortran 9x Support::          Compiling Fortran 9x sources
* Java Support with gcj::       Compiling Java sources using gcj
* Vala Support::                Compiling Vala sources
* Support for Other Languages::  Compiling other languages
* Dependencies::                Automatic dependency tracking
* EXEEXT::                      Support for executable extensions
@end menu


@node A Program
@section Building a program

In order to build a program, you need to tell Automake which sources
are part of it, and which libraries it should be linked with.

This section also covers conditional compilation of sources or
programs.  Most of the comments about these also apply to libraries
(@pxref{A Library}) and libtool libraries (@pxref{A Shared Library}).

@menu
* Program Sources::             Defining program sources
* Linking::                     Linking with libraries or extra objects
* Conditional Sources::         Handling conditional sources
* Conditional Programs::        Building a program conditionally
@end menu

@node Program Sources
@subsection Defining program sources

@cindex @code{PROGRAMS}, @code{bindir}
@vindex _PROGRAMS
@vindex bin_PROGRAMS
@vindex sbin_PROGRAMS
@vindex libexec_PROGRAMS
@vindex pkglibexec_PROGRAMS
@vindex noinst_PROGRAMS
@vindex check_PROGRAMS

In a directory containing source that gets built into a program (as
opposed to a library or a script), the @code{PROGRAMS} primary is used.
Programs can be installed in @code{bindir}, @code{sbindir},
@code{libexecdir}, @code{pkglibexecdir}, or not at all
(@code{noinst_}).  They can also be built only for @samp{make check}, in
which case the prefix is @samp{check_}.

For instance:

@example
bin_PROGRAMS = hello
@end example

In this simple case, the resulting @file{Makefile.in} will contain code
to generate a program named @code{hello}.

Associated with each program are several assisting variables that are
named after the program.  These variables are all optional, and have
reasonable defaults.  Each variable, its use, and default is spelled out
below; we use the ``hello'' example throughout.

The variable @code{hello_SOURCES} is used to specify which source files
get built into an executable:

@example
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
@end example

This causes each mentioned @file{.c} file to be compiled into the
corresponding @file{.o}.  Then all are linked to produce @file{hello}.

@cindex @code{_SOURCES} primary, defined
@cindex @code{SOURCES} primary, defined
@cindex Primary variable, @code{SOURCES}
@vindex _SOURCES

If @code{hello_SOURCES} is not specified, then it defaults to the single
file @file{hello.c} (@pxref{Default _SOURCES}).
@vindex _SOURCES
@vindex SOURCES

Multiple programs can be built in a single directory.  Multiple programs
can share a single source file, which must be listed in each
@code{_SOURCES} definition.

@cindex Header files in @code{_SOURCES}
@cindex @code{_SOURCES} and header files

Header files listed in a @code{_SOURCES} definition will be included in
the distribution but otherwise ignored.  In case it isn't obvious, you
should not include the header file generated by @file{configure} in a
@code{_SOURCES} variable; this file should not be distributed.  Lex
(@file{.l}) and Yacc (@file{.y}) files can also be listed; see @ref{Yacc
and Lex}.


@node Linking
@subsection Linking the program

If you need to link against libraries that are not found by
@command{configure}, you can use @code{LDADD} to do so.  This variable is
used to specify additional objects or libraries to link with; it is
inappropriate for specifying specific linker flags, you should use
@code{AM_LDFLAGS} for this purpose.
@vindex LDADD
@vindex AM_LDFLAGS

@cindex @code{prog_LDADD}, defined

Sometimes, multiple programs are built in one directory but do not share
the same link-time requirements.  In this case, you can use the
@code{@var{prog}_LDADD} variable (where @var{prog} is the name of the
program as it appears in some @code{_PROGRAMS} variable, and usually
written in lowercase) to override @code{LDADD}.  If this variable exists
for a given program, then that program is not linked using @code{LDADD}.
@vindex maude_LDADD

For instance, in GNU cpio, @code{pax}, @code{cpio} and @code{mt} are
linked against the library @file{libcpio.a}.  However, @code{rmt} is
built in the same directory, and has no such link requirement.  Also,
@code{mt} and @code{rmt} are only built on certain architectures.  Here
is what cpio's @file{src/Makefile.am} looks like (abridged):

@example
bin_PROGRAMS = cpio pax $(MT)
libexec_PROGRAMS = $(RMT)
EXTRA_PROGRAMS = mt rmt

LDADD = ../lib/libcpio.a $(INTLLIBS)
rmt_LDADD =

cpio_SOURCES = @dots{}
pax_SOURCES = @dots{}
mt_SOURCES = @dots{}
rmt_SOURCES = @dots{}
@end example

@cindex @code{_LDFLAGS}, defined
@vindex maude_LDFLAGS
@code{@var{prog}_LDADD} is inappropriate for passing program-specific
linker flags (except for @option{-l}, @option{-L}, @option{-dlopen} and
@option{-dlpreopen}).  So, use the @code{@var{prog}_LDFLAGS} variable for
this purpose.

@cindex @code{_DEPENDENCIES}, defined
@vindex maude_DEPENDENCIES
@vindex EXTRA_maude_DEPENDENCIES
It is also occasionally useful to have a program depend on some other
target that is not actually part of that program.  This can be done
using either the @code{@var{prog}_DEPENDENCIES} or the
@code{EXTRA_@var{prog}_DEPENDENCIES} variable.  Each program depends on
the contents both variables, but no further interpretation is done.

Since these dependencies are associated to the link rule used to
create the programs they should normally list files used by the link
command.  That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la}
files.  In rare cases you may need to add other kinds of files such as
linker scripts, but @emph{listing a source file in
@code{_DEPENDENCIES} is wrong}.  If some source file needs to be built
before all the components of a program are built, consider using the
@code{BUILT_SOURCES} variable instead (@pxref{Sources}).

If @code{@var{prog}_DEPENDENCIES} is not supplied, it is computed by
Automake.  The automatically-assigned value is the contents of
@code{@var{prog}_LDADD}, with most configure substitutions, @option{-l},
@option{-L}, @option{-dlopen} and @option{-dlpreopen} options removed.  The
configure substitutions that are left in are only @samp{$(LIBOBJS)} and
@samp{$(ALLOCA)}; these are left because it is known that they will not
cause an invalid value for @code{@var{prog}_DEPENDENCIES} to be
generated.

@ref{Conditional Sources} shows a situation where @code{_DEPENDENCIES}
may be used.

The @code{EXTRA_@var{prog}_DEPENDENCIES} may be useful for cases where
you merely want to augment the @command{automake}-generated
@code{@var{prog}_DEPENDENCIES} rather than replacing it.

@cindex @code{LDADD} and @option{-l}
@cindex @option{-l} and @code{LDADD}
We recommend that you avoid using @option{-l} options in @code{LDADD}
or @code{@var{prog}_LDADD} when referring to libraries built by your
package.  Instead, write the file name of the library explicitly as in
the above @code{cpio} example.  Use @option{-l} only to list
third-party libraries.  If you follow this rule, the default value of
@code{@var{prog}_DEPENDENCIES} will list all your local libraries and
omit the other ones.


@node Conditional Sources
@subsection Conditional compilation of sources

You can't put a configure substitution (e.g., @samp{@@FOO@@} or
@samp{$(FOO)} where @code{FOO} is defined via @code{AC_SUBST}) into a
@code{_SOURCES} variable.  The reason for this is a bit hard to
explain, but suffice to say that it simply won't work.  Automake will
give an error if you try to do this.

Fortunately there are two other ways to achieve the same result.  One is
to use configure substitutions in @code{_LDADD} variables, the other is
to use an Automake conditional.

@subsubheading Conditional Compilation using @code{_LDADD} Substitutions

@cindex @code{EXTRA_prog_SOURCES}, defined

Automake must know all the source files that could possibly go into a
program, even if not all the files are built in every circumstance.  Any
files that are only conditionally built should be listed in the
appropriate @code{EXTRA_} variable.  For instance, if
@file{hello-linux.c} or @file{hello-generic.c} were conditionally included
in @code{hello}, the @file{Makefile.am} would contain:

@example
bin_PROGRAMS = hello
hello_SOURCES = hello-common.c
EXTRA_hello_SOURCES = hello-linux.c hello-generic.c
hello_LDADD = $(HELLO_SYSTEM)
hello_DEPENDENCIES = $(HELLO_SYSTEM)
@end example

@noindent
You can then setup the @samp{$(HELLO_SYSTEM)} substitution from
@file{configure.ac}:

@example
@dots{}
case $host in
  *linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
  *)       HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
esac
AC_SUBST([HELLO_SYSTEM])
@dots{}
@end example

In this case, the variable @code{HELLO_SYSTEM} should be replaced by
either @file{hello-linux.o} or @file{hello-generic.o}, and added to
both @code{hello_DEPENDENCIES} and @code{hello_LDADD} in order to be
built and linked in.

@subsubheading Conditional Compilation using Automake Conditionals

An often simpler way to compile source files conditionally is to use
Automake conditionals.  For instance, you could use this
@file{Makefile.am} construct to build the same @file{hello} example:

@example
bin_PROGRAMS = hello
if LINUX
hello_SOURCES = hello-linux.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif
@end example

In this case, @file{configure.ac} should setup the @code{LINUX}
conditional using @code{AM_CONDITIONAL} (@pxref{Conditionals}).

When using conditionals like this you don't need to use the
@code{EXTRA_} variable, because Automake will examine the contents of
each variable to construct the complete list of source files.

If your program uses a lot of files, you will probably prefer a
conditional @samp{+=}.

@example
bin_PROGRAMS = hello
hello_SOURCES = hello-common.c
if LINUX
hello_SOURCES += hello-linux.c
else
hello_SOURCES += hello-generic.c
endif
@end example

@node Conditional Programs
@subsection Conditional compilation of programs
@cindex Conditional programs
@cindex Programs, conditional

Sometimes it is useful to determine the programs that are to be built
at configure time.  For instance, GNU @code{cpio} only builds
@code{mt} and @code{rmt} under special circumstances.  The means to
achieve conditional compilation of programs are the same you can use
to compile source files conditionally: substitutions or conditionals.

@subsubheading Conditional Programs using @command{configure} Substitutions

@vindex EXTRA_PROGRAMS
@cindex @code{EXTRA_PROGRAMS}, defined
In this case, you must notify Automake of all the programs that can
possibly be built, but at the same time cause the generated
@file{Makefile.in} to use the programs specified by @command{configure}.
This is done by having @command{configure} substitute values into each
@code{_PROGRAMS} definition, while listing all optionally built programs
in @code{EXTRA_PROGRAMS}.

@example
bin_PROGRAMS = cpio pax $(MT)
libexec_PROGRAMS = $(RMT)
EXTRA_PROGRAMS = mt rmt
@end example

As explained in @ref{EXEEXT}, Automake will rewrite
@code{bin_PROGRAMS}, @code{libexec_PROGRAMS}, and
@code{EXTRA_PROGRAMS}, appending @samp{$(EXEEXT)} to each binary.
Obviously it cannot rewrite values obtained at run-time through
@command{configure} substitutions, therefore you should take care of
appending @samp{$(EXEEXT)} yourself, as in @samp{AC_SUBST([MT],
['mt$@{EXEEXT@}'])}.

@subsubheading Conditional Programs using Automake Conditionals

You can also use Automake conditionals (@pxref{Conditionals}) to
select programs to be built.  In this case you don't have to worry
about @samp{$(EXEEXT)} or @code{EXTRA_PROGRAMS}.

@c Keep in sync with exeext.sh
@example
bin_PROGRAMS = cpio pax
if WANT_MT
  bin_PROGRAMS += mt
endif
if WANT_RMT
  libexec_PROGRAMS = rmt
endif
@end example


@node A Library
@section Building a library

@cindex @code{_LIBRARIES} primary, defined
@cindex @code{LIBRARIES} primary, defined
@cindex Primary variable, @code{LIBRARIES}
@vindex _LIBRARIES

@vindex lib_LIBRARIES
@vindex pkglib_LIBRARIES
@vindex noinst_LIBRARIES

Building a library is much like building a program.  In this case, the
name of the primary is @code{LIBRARIES}.  Libraries can be installed in
@code{libdir} or @code{pkglibdir}.

@xref{A Shared Library}, for information on how to build shared
libraries using libtool and the @code{LTLIBRARIES} primary.

Each @code{_LIBRARIES} variable is a list of the libraries to be built.
For instance, to create a library named @file{libcpio.a}, but not install
it, you would write:

@example
noinst_LIBRARIES = libcpio.a
libcpio_a_SOURCES = @dots{}
@end example

The sources that go into a library are determined exactly as they are
for programs, via the @code{_SOURCES} variables.  Note that the library
name is canonicalized (@pxref{Canonicalization}), so the @code{_SOURCES}
variable corresponding to @file{libcpio.a} is @samp{libcpio_a_SOURCES},
not @samp{libcpio.a_SOURCES}.

@vindex maude_LIBADD
Extra objects can be added to a library using the
@code{@var{library}_LIBADD} variable.  This should be used for objects
determined by @command{configure}.  Again from @code{cpio}:

@c Keep in sync with pr401c.sh
@example
libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA)
@end example

In addition, sources for extra objects that will not exist until
configure-time must be added to the @code{BUILT_SOURCES} variable
(@pxref{Sources}).

Building a static library is done by compiling all object files, then
by invoking @samp{$(AR) $(ARFLAGS)} followed by the name of the
library and the list of objects, and finally by calling
@samp{$(RANLIB)} on that library.  You should call
@code{AC_PROG_RANLIB} from your @file{configure.ac} to define
@code{RANLIB} (Automake will complain otherwise).  You should also
call @code{AM_PROG_AR} to define @code{AR}, in order to support unusual
archivers such as Microsoft lib.  @code{ARFLAGS} will default to
@code{cru}; you can override this variable by setting it in your
@file{Makefile.am} or by @code{AC_SUBST}ing it from your
@file{configure.ac}.  You can override the @code{AR} variable by
defining a per-library @code{maude_AR} variable (@pxref{Program and
Library Variables}).

@cindex Empty libraries
Be careful when selecting library components conditionally.  Because
building an empty library is not portable, you should ensure that any
library always contains at least one object.

To use a static library when building a program, add it to
@code{LDADD} for this program.  In the following example, the program
@file{cpio} is statically linked with the library @file{libcpio.a}.

@example
noinst_LIBRARIES = libcpio.a
libcpio_a_SOURCES = @dots{}

bin_PROGRAMS = cpio
cpio_SOURCES = cpio.c @dots{}
cpio_LDADD = libcpio.a
@end example


@node A Shared Library
@section Building a Shared Library

@cindex Shared libraries, support for

Building shared libraries portably is a relatively complex matter.
For this reason, GNU Libtool (@pxref{Top, , Introduction, libtool, The
Libtool Manual}) was created to help build shared libraries in a
platform-independent way.

@menu
* Libtool Concept::             Introducing Libtool
* Libtool Libraries::           Declaring Libtool Libraries
* Conditional Libtool Libraries::  Building Libtool Libraries Conditionally
* Conditional Libtool Sources::  Choosing Library Sources Conditionally
* Libtool Convenience Libraries::  Building Convenience Libtool Libraries
* Libtool Modules::             Building Libtool Modules
* Libtool Flags::               Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
* LTLIBOBJS::                   Using $(LTLIBOBJS) and $(LTALLOCA)
* Libtool Issues::              Common Issues Related to Libtool's Use
@end menu

@node Libtool Concept
@subsection The Libtool Concept

@cindex @command{libtool}, introduction
@cindex libtool library, definition
@cindex suffix @file{.la}, defined
@cindex @file{.la} suffix, defined

Libtool abstracts shared and static libraries into a unified concept
henceforth called @dfn{libtool libraries}.  Libtool libraries are
files using the @file{.la} suffix, and can designate a static library,
a shared library, or maybe both.  Their exact nature cannot be
determined until @file{./configure} is run: not all platforms support
all kinds of libraries, and users can explicitly select which
libraries should be built.  (However the package's maintainers can
tune the default, @pxref{AC_PROG_LIBTOOL, , The @code{AC_PROG_LIBTOOL}
macro, libtool, The Libtool Manual}.)

@cindex suffix @file{.lo}, defined
Because object files for shared and static libraries must be compiled
differently, libtool is also used during compilation.  Object files
built by libtool are called @dfn{libtool objects}: these are files
using the @file{.lo} suffix.  Libtool libraries are built from these
libtool objects.

You should not assume anything about the structure of @file{.la} or
@file{.lo} files and how libtool constructs them: this is libtool's
concern, and the last thing one wants is to learn about libtool's
guts.  However the existence of these files matters, because they are
used as targets and dependencies in @file{Makefile}s rules when
building libtool libraries.  There are situations where you may have
to refer to these, for instance when expressing dependencies for
building source files conditionally (@pxref{Conditional Libtool
Sources}).

@cindex @file{libltdl}, introduction

People considering writing a plug-in system, with dynamically loaded
modules, should look into @file{libltdl}: libtool's dlopening library
(@pxref{Using libltdl, , Using libltdl, libtool, The Libtool Manual}).
This offers a portable dlopening facility to load libtool libraries
dynamically, and can also achieve static linking where unavoidable.

Before we discuss how to use libtool with Automake in details, it
should be noted that the libtool manual also has a section about how
to use Automake with libtool (@pxref{Using Automake, , Using Automake
with Libtool, libtool, The Libtool Manual}).

@node Libtool Libraries
@subsection Building Libtool Libraries

@cindex @code{_LTLIBRARIES} primary, defined
@cindex @code{LTLIBRARIES} primary, defined
@cindex Primary variable, @code{LTLIBRARIES}
@cindex Example of shared libraries
@vindex lib_LTLIBRARIES
@vindex pkglib_LTLIBRARIES
@vindex _LTLIBRARIES

Automake uses libtool to build libraries declared with the
@code{LTLIBRARIES} primary.  Each @code{_LTLIBRARIES} variable is a
list of libtool libraries to build.  For instance, to create a libtool
library named @file{libgettext.la}, and install it in @code{libdir},
write:

@example
lib_LTLIBRARIES = libgettext.la
libgettext_la_SOURCES = gettext.c gettext.h @dots{}
@end example

Automake predefines the variable @code{pkglibdir}, so you can use
@code{pkglib_LTLIBRARIES} to install libraries in
@samp{$(libdir)/@@PACKAGE@@/}.

If @file{gettext.h} is a public header file that needs to be installed
in order for people to use the library, it should be declared using a
@code{_HEADERS} variable, not in @code{libgettext_la_SOURCES}.
Headers listed in the latter should be internal headers that are not
part of the public interface.

@example
lib_LTLIBRARIES = libgettext.la
libgettext_la_SOURCES = gettext.c @dots{}
include_HEADERS = gettext.h @dots{}
@end example

A package can build and install such a library along with other
programs that use it.  This dependency should be specified using
@code{LDADD}.  The following example builds a program named
@file{hello} that is linked with @file{libgettext.la}.

@example
lib_LTLIBRARIES = libgettext.la
libgettext_la_SOURCES = gettext.c @dots{}

bin_PROGRAMS = hello
hello_SOURCES = hello.c @dots{}
hello_LDADD = libgettext.la
@end example

@noindent
Whether @file{hello} is statically or dynamically linked with
@file{libgettext.la} is not yet known: this will depend on the
configuration of libtool and the capabilities of the host.


@node Conditional Libtool Libraries
@subsection Building Libtool Libraries Conditionally
@cindex libtool libraries, conditional
@cindex conditional libtool libraries

Like conditional programs (@pxref{Conditional Programs}), there are
two main ways to build conditional libraries: using Automake
conditionals or using Autoconf @code{AC_SUBST}itutions.

The important implementation detail you have to be aware of is that
the place where a library will be installed matters to libtool: it
needs to be indicated @emph{at link-time} using the @option{-rpath}
option.

For libraries whose destination directory is known when Automake runs,
Automake will automatically supply the appropriate @option{-rpath}
option to libtool.  This is the case for libraries listed explicitly in
some installable @code{_LTLIBRARIES} variables such as
@code{lib_LTLIBRARIES}.

However, for libraries determined at configure time (and thus
mentioned in @code{EXTRA_LTLIBRARIES}), Automake does not know the
final installation directory.  For such libraries you must add the
@option{-rpath} option to the appropriate @code{_LDFLAGS} variable by
hand.

The examples below illustrate the differences between these two methods.

Here is an example where @code{WANTEDLIBS} is an @code{AC_SUBST}ed
variable set at @file{./configure}-time to either @file{libfoo.la},
@file{libbar.la}, both, or none.  Although @samp{$(WANTEDLIBS)}
appears in the @code{lib_LTLIBRARIES}, Automake cannot guess it
relates to @file{libfoo.la} or @file{libbar.la} at the time it creates
the link rule for these two libraries.  Therefore the @option{-rpath}
argument must be explicitly supplied.

@c Keep in sync with ltcond.sh
@example
EXTRA_LTLIBRARIES = libfoo.la libbar.la
lib_LTLIBRARIES = $(WANTEDLIBS)
libfoo_la_SOURCES = foo.c @dots{}
libfoo_la_LDFLAGS = -rpath '$(libdir)'
libbar_la_SOURCES = bar.c @dots{}
libbar_la_LDFLAGS = -rpath '$(libdir)'
@end example

Here is how the same @file{Makefile.am} would look using Automake
conditionals named @code{WANT_LIBFOO} and @code{WANT_LIBBAR}.  Now
Automake is able to compute the @option{-rpath} setting itself, because
it's clear that both libraries will end up in @samp{$(libdir)} if they
are installed.

@c Keep in sync with ltcond.sh
@example
lib_LTLIBRARIES =
if WANT_LIBFOO
lib_LTLIBRARIES += libfoo.la
endif
if WANT_LIBBAR
lib_LTLIBRARIES += libbar.la
endif
libfoo_la_SOURCES = foo.c @dots{}
libbar_la_SOURCES = bar.c @dots{}
@end example

@node Conditional Libtool Sources
@subsection Libtool Libraries with Conditional Sources

Conditional compilation of sources in a library can be achieved in the
same way as conditional compilation of sources in a program
(@pxref{Conditional Sources}).  The only difference is that
@code{_LIBADD} should be used instead of @code{_LDADD} and that it
should mention libtool objects (@file{.lo} files).

So, to mimic the @file{hello} example from @ref{Conditional Sources},
we could build a @file{libhello.la} library using either
@file{hello-linux.c} or @file{hello-generic.c} with the following
@file{Makefile.am}.

@c Keep in sync with ltcond2.sh
@example
lib_LTLIBRARIES = libhello.la
libhello_la_SOURCES = hello-common.c
EXTRA_libhello_la_SOURCES = hello-linux.c hello-generic.c
libhello_la_LIBADD = $(HELLO_SYSTEM)
libhello_la_DEPENDENCIES = $(HELLO_SYSTEM)
@end example

@noindent
And make sure @command{configure} defines @code{HELLO_SYSTEM} as
either @file{hello-linux.lo} or @file{hello-@-generic.lo}.

Or we could simply use an Automake conditional as follows.

@c Keep in sync with ltcond2.sh
@example
lib_LTLIBRARIES = libhello.la
libhello_la_SOURCES = hello-common.c
if LINUX
libhello_la_SOURCES += hello-linux.c
else
libhello_la_SOURCES += hello-generic.c
endif
@end example

@node Libtool Convenience Libraries
@subsection Libtool Convenience Libraries
@cindex convenience libraries, libtool
@cindex libtool convenience libraries
@vindex noinst_LTLIBRARIES
@vindex check_LTLIBRARIES

Sometimes you want to build libtool libraries that should not be
installed.  These are called @dfn{libtool convenience libraries} and
are typically used to encapsulate many sublibraries, later gathered
into one big installed library.

Libtool convenience libraries are declared by directory-less variables
such as @code{noinst_LTLIBRARIES}, @code{check_LTLIBRARIES}, or even
@code{EXTRA_LTLIBRARIES}.  Unlike installed libtool libraries they do
not need an @option{-rpath} flag at link time (actually this is the only
difference).

Convenience libraries listed in @code{noinst_LTLIBRARIES} are always
built.  Those listed in @code{check_LTLIBRARIES} are built only upon
@samp{make check}.  Finally, libraries listed in
@code{EXTRA_LTLIBRARIES} are never built explicitly: Automake outputs
rules to build them, but if the library does not appear as a Makefile
dependency anywhere it won't be built (this is why
@code{EXTRA_LTLIBRARIES} is used for conditional compilation).

Here is a sample setup merging libtool convenience libraries from
subdirectories into one main @file{libtop.la} library.

@c Keep in sync with ltconv.sh
@example
# -- Top-level Makefile.am --
SUBDIRS = sub1 sub2 @dots{}
lib_LTLIBRARIES = libtop.la
libtop_la_SOURCES =
libtop_la_LIBADD = \
  sub1/libsub1.la \
  sub2/libsub2.la \
  @dots{}

# -- sub1/Makefile.am --
noinst_LTLIBRARIES = libsub1.la
libsub1_la_SOURCES = @dots{}

# -- sub2/Makefile.am --
# showing nested convenience libraries
SUBDIRS = sub2.1 sub2.2 @dots{}
noinst_LTLIBRARIES = libsub2.la
libsub2_la_SOURCES =
libsub2_la_LIBADD = \
  sub21/libsub21.la \
  sub22/libsub22.la \
  @dots{}
@end example

When using such setup, beware that @command{automake} will assume
@file{libtop.la} is to be linked with the C linker.  This is because
@code{libtop_la_SOURCES} is empty, so @command{automake} picks C as
default language.  If @code{libtop_la_SOURCES} was not empty,
@command{automake} would select the linker as explained in @ref{How
the Linker is Chosen}.

If one of the sublibraries contains non-C source, it is important that
the appropriate linker be chosen.  One way to achieve this is to
pretend that there is such a non-C file among the sources of the
library, thus forcing @command{automake} to select the appropriate
linker.  Here is the top-level @file{Makefile} of our example updated
to force C++ linking.

@example
SUBDIRS = sub1 sub2 @dots{}
lib_LTLIBRARIES = libtop.la
libtop_la_SOURCES =
# Dummy C++ source to cause C++ linking.
nodist_EXTRA_libtop_la_SOURCES = dummy.cxx
libtop_la_LIBADD = \
  sub1/libsub1.la \
  sub2/libsub2.la \
  @dots{}
@end example

@samp{EXTRA_*_SOURCES} variables are used to keep track of source
files that might be compiled (this is mostly useful when doing
conditional compilation using @code{AC_SUBST}, @pxref{Conditional
Libtool Sources}), and the @code{nodist_} prefix means the listed
sources are not to be distributed (@pxref{Program and Library
Variables}).  In effect the file @file{dummy.cxx} does not need to
exist in the source tree.  Of course if you have some real source file
to list in @code{libtop_la_SOURCES} there is no point in cheating with
@code{nodist_EXTRA_libtop_la_SOURCES}.


@node Libtool Modules
@subsection Libtool Modules
@cindex modules, libtool
@cindex libtool modules
@cindex @option{-module}, libtool

These are libtool libraries meant to be dlopened.  They are
indicated to libtool by passing @option{-module} at link-time.

@example
pkglib_LTLIBRARIES = mymodule.la
mymodule_la_SOURCES = doit.c
mymodule_la_LDFLAGS = -module
@end example

Ordinarily, Automake requires that a library's name start with
@code{lib}.  However, when building a dynamically loadable module you
might wish to use a "nonstandard" name.  Automake will not complain
about such nonstandard names if it knows the library being built is a
libtool module, i.e., if @option{-module} explicitly appears in the
library's @code{_LDFLAGS} variable (or in the common @code{AM_LDFLAGS}
variable when no per-library @code{_LDFLAGS} variable is defined).

As always, @code{AC_SUBST} variables are black boxes to Automake since
their values are not yet known when @command{automake} is run.
Therefore if @option{-module} is set via such a variable, Automake
cannot notice it and will proceed as if the library was an ordinary
libtool library, with strict naming.

If @code{mymodule_la_SOURCES} is not specified, then it defaults to
the single file @file{mymodule.c} (@pxref{Default _SOURCES}).

@node Libtool Flags
@subsection @code{_LIBADD}, @code{_LDFLAGS}, and @code{_LIBTOOLFLAGS}
@cindex @code{_LIBADD}, libtool
@cindex @code{_LDFLAGS}, libtool
@cindex @code{_LIBTOOLFLAGS}, libtool
@vindex AM_LIBTOOLFLAGS
@vindex LIBTOOLFLAGS
@vindex maude_LIBTOOLFLAGS

As shown in previous sections, the @samp{@var{library}_LIBADD}
variable should be used to list extra libtool objects (@file{.lo}
files) or libtool libraries (@file{.la}) to add to @var{library}.

The @samp{@var{library}_LDFLAGS} variable is the place to list
additional libtool linking flags, such as @option{-version-info},
@option{-static}, and a lot more.  @xref{Link mode, , Link mode,
libtool, The Libtool Manual}.

The @command{libtool} command has two kinds of options: mode-specific
options and generic options.  Mode-specific options such as the
aforementioned linking flags should be lumped with the other flags
passed to the tool invoked by @command{libtool} (hence the use of
@samp{@var{library}_LDFLAGS} for libtool linking flags).  Generic
options include @option{--tag=@var{tag}} and @option{--silent}
(@pxref{Invoking libtool, , Invoking @command{libtool}, libtool, The
Libtool Manual} for more options) should appear before the mode
selection on the command line; in @file{Makefile.am}s they should
be listed in the @samp{@var{library}_LIBTOOLFLAGS} variable.

If @samp{@var{library}_LIBTOOLFLAGS} is not defined, then the variable
@code{AM_LIBTOOLFLAGS} is used instead.

These flags are passed to libtool after the @option{--tag=@var{tag}}
option computed by Automake (if any), so
@samp{@var{library}_LIBTOOLFLAGS} (or @code{AM_LIBTOOLFLAGS}) is a
good place to override or supplement the @option{--tag=@var{tag}}
setting.

The libtool rules also use a @code{LIBTOOLFLAGS} variable that should
not be set in @file{Makefile.am}: this is a user variable (@pxref{Flag
Variables Ordering}.  It allows users to run @samp{make
LIBTOOLFLAGS=--silent}, for instance.  Note that the verbosity of
@command{libtool} can also be influenced by the Automake support
for silent rules (@pxref{Automake Silent Rules}).

@node LTLIBOBJS, Libtool Issues, Libtool Flags, A Shared Library
@subsection @code{LTLIBOBJS} and @code{LTALLOCA}
@cindex @code{LTLIBOBJS}, special handling
@cindex @code{LIBOBJS}, and Libtool
@cindex @code{LTALLOCA}, special handling
@cindex @code{ALLOCA}, and Libtool
@vindex LTLIBOBJS
@vindex LIBOBJS
@vindex LTALLOCA
@vindex ALLOCA
@acindex AC_LIBOBJ

Where an ordinary library might include @samp{$(LIBOBJS)} or
@samp{$(ALLOCA)} (@pxref{LIBOBJS}), a libtool library must use
@samp{$(LTLIBOBJS)} or @samp{$(LTALLOCA)}.  This is required because
the object files that libtool operates on do not necessarily end in
@file{.o}.

Nowadays, the computation of @code{LTLIBOBJS} from @code{LIBOBJS} is
performed automatically by Autoconf (@pxref{AC_LIBOBJ vs LIBOBJS, ,
@code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, autoconf, The Autoconf Manual}).

@node Libtool Issues
@subsection Common Issues Related to Libtool's Use

@menu
* Error required file ltmain.sh not found::  The need to run libtoolize
* Objects created both with libtool and without::  Avoid a specific build race
@end menu

@node Error required file ltmain.sh not found
@subsubsection Error: @samp{required file `./ltmain.sh' not found}
@cindex @file{ltmain.sh} not found
@cindex @command{libtoolize}, no longer run by @command{automake}
@cindex @command{libtoolize} and @command{autoreconf}
@cindex @command{autoreconf} and @command{libtoolize}
@cindex @file{bootstrap} and @command{autoreconf}
@cindex @file{autogen.sh} and @command{autoreconf}

Libtool comes with a tool called @command{libtoolize} that will
install libtool's supporting files into a package.  Running this
command will install @file{ltmain.sh}.  You should execute it before
@command{aclocal} and @command{automake}.

People upgrading old packages to newer autotools are likely to face
this issue because older Automake versions used to call
@command{libtoolize}.  Therefore old build scripts do not call
@command{libtoolize}.

Since Automake 1.6, it has been decided that running
@command{libtoolize} was none of Automake's business.  Instead, that
functionality has been moved into the @command{autoreconf} command
(@pxref{autoreconf Invocation, , Using @command{autoreconf}, autoconf,
The Autoconf Manual}).  If you do not want to remember what to run and
when, just learn the @command{autoreconf} command.  Hopefully,
replacing existing @file{bootstrap} or @file{autogen.sh} scripts by
a call to @command{autoreconf} should also free you from any similar
incompatible change in the future.

@node Objects created both with libtool and without
@subsubsection Objects @samp{created with both libtool and without}

Sometimes, the same source file is used both to build a libtool
library and to build another non-libtool target (be it a program or
another library).

Let's consider the following @file{Makefile.am}.

@example
bin_PROGRAMS = prog
prog_SOURCES = prog.c foo.c @dots{}

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.c @dots{}
@end example

@noindent
(In this trivial case the issue could be avoided by linking
@file{libfoo.la} with @file{prog} instead of listing @file{foo.c} in
@code{prog_SOURCES}.  But let's assume we really want to keep
@file{prog} and @file{libfoo.la} separate.)

Technically, it means that we should build @file{foo.$(OBJEXT)} for
@file{prog}, and @file{foo.lo} for @file{libfoo.la}.  The problem is
that in the course of creating @file{foo.lo}, libtool may erase (or
replace) @file{foo.$(OBJEXT)}, and this cannot be avoided.

Therefore, when Automake detects this situation it will complain
with a message such as
@example
object 'foo.$(OBJEXT)' created both with libtool and without
@end example

A workaround for this issue is to ensure that these two objects get
different basenames.  As explained in @ref{Renamed Objects}, this
happens automatically when per-targets flags are used.

@example
bin_PROGRAMS = prog
prog_SOURCES = prog.c foo.c @dots{}
prog_CFLAGS = $(AM_CFLAGS)

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.c @dots{}
@end example

@noindent
Adding @samp{prog_CFLAGS = $(AM_CFLAGS)} is almost a no-op, because
when the @code{prog_CFLAGS} is defined, it is used instead of
@code{AM_CFLAGS}.  However as a side effect it will cause
@file{prog.c} and @file{foo.c} to be compiled as
@file{prog-prog.$(OBJEXT)} and @file{prog-foo.$(OBJEXT)}, which solves
the issue.

@node Program and Library Variables
@section Program and Library Variables

Associated with each program is a collection of variables that can be
used to modify how that program is built.  There is a similar list of
such variables for each library.  The canonical name of the program (or
library) is used as a base for naming these variables.

In the list below, we use the name ``maude'' to refer to the program or
library.  In your @file{Makefile.am} you would replace this with the
canonical name of your program.  This list also refers to ``maude'' as a
program, but in general the same rules apply for both static and dynamic
libraries; the documentation below notes situations where programs and
libraries differ.

@vtable @code
@item maude_SOURCES
This variable, if it exists, lists all the source files that are
compiled to build the program.  These files are added to the
distribution by default.  When building the program, Automake will cause
each source file to be compiled to a single @file{.o} file (or
@file{.lo} when using libtool).  Normally these object files are named
after the source file, but other factors can change this.  If a file in
the @code{_SOURCES} variable has an unrecognized extension, Automake
will do one of two things with it.  If a suffix rule exists for turning
files with the unrecognized extension into @file{.o} files, then
@command{automake} will treat this file as it will any other source file
(@pxref{Support for Other Languages}).  Otherwise, the file will be
ignored as though it were a header file.

The prefixes @code{dist_} and @code{nodist_} can be used to control
whether files listed in a @code{_SOURCES} variable are distributed.
@code{dist_} is redundant, as sources are distributed by default, but it
can be specified for clarity if desired.

It is possible to have both @code{dist_} and @code{nodist_} variants of
a given @code{_SOURCES} variable at once; this lets you easily
distribute some files and not others, for instance:

@example
nodist_maude_SOURCES = nodist.c
dist_maude_SOURCES = dist-me.c
@end example

By default the output file (on Unix systems, the @file{.o} file) will
be put into the current build directory.  However, if the option
@option{subdir-objects} is in effect in the current directory then the
@file{.o} file will be put into the subdirectory named after the
source file.  For instance, with @option{subdir-objects} enabled,
@file{sub/dir/file.c} will be compiled to @file{sub/dir/file.o}.  Some
people prefer this mode of operation.  You can specify
@option{subdir-objects} in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).
@cindex Subdirectory, objects in
@cindex Objects in subdirectory


@item EXTRA_maude_SOURCES
Automake needs to know the list of files you intend to compile
@emph{statically}.  For one thing, this is the only way Automake has of
knowing what sort of language support a given @file{Makefile.in}
requires.  @footnote{There are other, more obscure reasons for
this limitation as well.}  This means that, for example, you can't put a
configure substitution like @samp{@@my_sources@@} into a @samp{_SOURCES}
variable.  If you intend to conditionally compile source files and use
@file{configure} to substitute the appropriate object names into, e.g.,
@code{_LDADD} (see below), then you should list the corresponding source
files in the @code{EXTRA_} variable.

This variable also supports @code{dist_} and @code{nodist_} prefixes.
For instance, @code{nodist_EXTRA_maude_SOURCES} would list extra
sources that may need to be built, but should not be distributed.

@item maude_AR
A static library is created by default by invoking @samp{$(AR)
$(ARFLAGS)} followed by the name of the library and then the objects
being put into the library.  You can override this by setting the
@code{_AR} variable.  This is usually used with C++; some C++
compilers require a special invocation in order to instantiate all the
templates that should go into a library.  For instance, the SGI C++
compiler likes this variable set like so:
@example
libmaude_a_AR = $(CXX) -ar -o
@end example

@item maude_LIBADD
Extra objects can be added to a @emph{library} using the @code{_LIBADD}
variable.  For instance, this should be used for objects determined by
@command{configure} (@pxref{A Library}).

In the case of libtool libraries, @code{maude_LIBADD} can also refer
to other libtool libraries.

@item maude_LDADD
Extra objects (@file{*.$(OBJEXT)}) and libraries (@file{*.a},
@file{*.la}) can be added to a @emph{program} by listing them in the
@code{_LDADD} variable.  For instance, this should be used for objects
determined by @command{configure} (@pxref{Linking}).

@code{_LDADD} and @code{_LIBADD} are inappropriate for passing
program-specific linker flags (except for @option{-l}, @option{-L},
@option{-dlopen} and @option{-dlpreopen}).  Use the @code{_LDFLAGS} variable
for this purpose.

For instance, if your @file{configure.ac} uses @code{AC_PATH_XTRA}, you
could link your program against the X libraries like so:

@example
maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)
@end example

We recommend that you use @option{-l} and @option{-L} only when
referring to third-party libraries, and give the explicit file names
of any library built by your package.  Doing so will ensure that
@code{maude_DEPENDENCIES} (see below) is correctly defined by default.

@item maude_LDFLAGS
This variable is used to pass extra flags to the link step of a program
or a shared library.  It overrides the @code{AM_LDFLAGS} variable.

@item maude_LIBTOOLFLAGS
This variable is used to pass extra options to @command{libtool}.
It overrides the @code{AM_LIBTOOLFLAGS} variable.
These options are output before @command{libtool}'s @option{--mode=@var{mode}}
option, so they should not be mode-specific options (those belong to
the compiler or linker flags).  @xref{Libtool Flags}.

@item maude_DEPENDENCIES
@itemx EXTRA_maude_DEPENDENCIES
It is also occasionally useful to have a target (program or library)
depend on some other file that is not actually part of that target.
This can be done using the @code{_DEPENDENCIES} variable.  Each
target depends on the contents of such a variable, but no further
interpretation is done.

Since these dependencies are associated to the link rule used to
create the programs they should normally list files used by the link
command.  That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la} files
for programs; @file{*.lo} and @file{*.la} files for Libtool libraries;
and @file{*.$(OBJEXT)} files for static libraries.  In rare cases you
may need to add other kinds of files such as linker scripts, but
@emph{listing a source file in @code{_DEPENDENCIES} is wrong}.  If
some source file needs to be built before all the components of a
program are built, consider using the @code{BUILT_SOURCES} variable
(@pxref{Sources}).

If @code{_DEPENDENCIES} is not supplied, it is computed by Automake.
The automatically-assigned value is the contents of @code{_LDADD} or
@code{_LIBADD}, with most configure substitutions, @option{-l}, @option{-L},
@option{-dlopen} and @option{-dlpreopen} options removed.  The configure
substitutions that are left in are only @samp{$(LIBOBJS)} and
@samp{$(ALLOCA)}; these are left because it is known that they will not
cause an invalid value for @code{_DEPENDENCIES} to be generated.

@code{_DEPENDENCIES} is more likely used to perform conditional
compilation using an @code{AC_SUBST} variable that contains a list of
objects.  @xref{Conditional Sources}, and @ref{Conditional Libtool
Sources}.

The @code{EXTRA_*_DEPENDENCIES} variable may be useful for cases where
you merely want to augment the @command{automake}-generated
@code{_DEPENDENCIES} variable rather than replacing it.

@item maude_LINK
You can override the linker on a per-program basis.  By default the
linker is chosen according to the languages used by the program.  For
instance, a program that includes C++ source code would use the C++
compiler to link.  The @code{_LINK} variable must hold the name of a
command that can be passed all the @file{.o} file names and libraries
to link against as arguments.  Note that the name of the underlying
program is @emph{not} passed to @code{_LINK}; typically one uses
@samp{$@@}:

@example
maude_LINK = $(CCLD) -magic -o $@@
@end example

If a @code{_LINK} variable is not supplied, it may still be generated
and used by Automake due to the use of per-target link flags such as
@code{_CFLAGS}, @code{_LDFLAGS} or @code{_LIBTOOLFLAGS}, in cases where
they apply.

@item maude_CCASFLAGS
@itemx maude_CFLAGS
@itemx maude_CPPFLAGS
@itemx maude_CXXFLAGS
@itemx maude_FFLAGS
@itemx maude_GCJFLAGS
@itemx maude_LFLAGS
@itemx maude_OBJCFLAGS
@itemx maude_OBJCXXFLAGS
@itemx maude_RFLAGS
@itemx maude_UPCFLAGS
@itemx maude_YFLAGS
@cindex per-target compilation flags, defined
Automake allows you to set compilation flags on a per-program (or
per-library) basis.  A single source file can be included in several
programs, and it will potentially be compiled with different flags for
each program.  This works for any language directly supported by
Automake.  These @dfn{per-target compilation flags} are
@samp{_CCASFLAGS},
@samp{_CFLAGS},
@samp{_CPPFLAGS},
@samp{_CXXFLAGS},
@samp{_FFLAGS},
@samp{_GCJFLAGS},
@samp{_LFLAGS},
@samp{_OBJCFLAGS},
@samp{_OBJCXXFLAGS},
@samp{_RFLAGS},
@samp{_UPCFLAGS}, and
@samp{_YFLAGS}.

When using a per-target compilation flag, Automake will choose a
different name for the intermediate object files.  Ordinarily a file
like @file{sample.c} will be compiled to produce @file{sample.o}.
However, if the program's @code{_CFLAGS} variable is set, then the
object file will be named, for instance, @file{maude-sample.o}.  (See
also @ref{Renamed Objects}).

In compilations with per-target flags, the ordinary @samp{AM_} form of
the flags variable is @emph{not} automatically included in the
compilation (however, the user form of the variable @emph{is} included).
So for instance, if you want the hypothetical @file{maude} compilations
to also use the value of @code{AM_CFLAGS}, you would need to write:

@example
maude_CFLAGS = @dots{} your flags @dots{} $(AM_CFLAGS)
@end example

@xref{Flag Variables Ordering}, for more discussion about the
interaction between user variables, @samp{AM_} shadow variables, and
per-target variables.

@item maude_SHORTNAME
On some platforms the allowable file names are very short.  In order to
support these systems and per-target compilation flags at the same
time, Automake allows you to set a ``short name'' that will influence
how intermediate object files are named.  For instance, in the following
example,

@example
bin_PROGRAMS = maude
maude_CPPFLAGS = -DSOMEFLAG
maude_SHORTNAME = m
maude_SOURCES = sample.c @dots{}
@end example

@noindent
the object file would be named @file{m-sample.o} rather than
@file{maude-sample.o}.

This facility is rarely needed in practice,
and we recommend avoiding it until you find it is required.
@end vtable

@node Default _SOURCES
@section Default @code{_SOURCES}

@vindex _SOURCES
@vindex SOURCES
@cindex @code{_SOURCES}, default
@cindex default @code{_SOURCES}
@vindex AM_DEFAULT_SOURCE_EXT

@code{_SOURCES} variables are used to specify source files of programs
(@pxref{A Program}), libraries (@pxref{A Library}), and Libtool
libraries (@pxref{A Shared Library}).

When no such variable is specified for a target, Automake will define
one itself.  The default is to compile a single C file whose base name
is the name of the target itself, with any extension replaced by
@code{AM_DEFAULT_SOURCE_EXT}, which defaults to @file{.c}.

For example if you have the following somewhere in your
@file{Makefile.am} with no corresponding @code{libfoo_a_SOURCES}:

@example
lib_LIBRARIES = libfoo.a sub/libc++.a
@end example

@noindent
@file{libfoo.a} will be built using a default source file named
@file{libfoo.c}, and @file{sub/libc++.a} will be built from
@file{sub/libc++.c}.  (In older versions @file{sub/libc++.a}
would be built from @file{sub_libc___a.c}, i.e., the default source
was the canonized name of the target, with @file{.c} appended.
We believe the new behavior is more sensible, but for backward
compatibility @command{automake} will use the old name if a file or a rule
with that name exists and @code{AM_DEFAULT_SOURCE_EXT} is not used.)

@cindex @code{check_PROGRAMS} example
@vindex check_PROGRAMS
Default sources are mainly useful in test suites, when building many
test programs each from a single source.  For instance, in

@example
check_PROGRAMS = test1 test2 test3
AM_DEFAULT_SOURCE_EXT = .cpp
@end example

@noindent
@file{test1}, @file{test2}, and @file{test3} will be built
from @file{test1.cpp}, @file{test2.cpp}, and @file{test3.cpp}.
Without the last line, they will be built from @file{test1.c},
@file{test2.c}, and @file{test3.c}.

@cindex Libtool modules, default source example
@cindex default source, Libtool modules example
Another case where this is convenient is building many Libtool modules
(@file{module@var{n}.la}), each defined in its own file
(@file{module@var{n}.c}).

@example
AM_LDFLAGS = -module
lib_LTLIBRARIES = module1.la module2.la module3.la
@end example

@cindex empty @code{_SOURCES}
@cindex @code{_SOURCES}, empty
Finally, there is one situation where this default source computation
needs to be avoided: when a target should not be built from sources.
We already saw such an example in @ref{true}; this happens when all
the constituents of a target have already been compiled and just need
to be combined using a @code{_LDADD} variable.  Then it is necessary
to define an empty @code{_SOURCES} variable, so that @command{automake}
does not compute a default.

@example
bin_PROGRAMS = target
target_SOURCES =
target_LDADD = libmain.a libmisc.a
@end example

@node LIBOBJS
@section Special handling for @code{LIBOBJS} and @code{ALLOCA}

@cindex @code{LIBOBJS}, example
@cindex @code{ALLOCA}, example
@cindex @code{LIBOBJS}, special handling
@cindex @code{ALLOCA}, special handling
@vindex LTLIBOBJS
@vindex LIBOBJS
@vindex LTALLOCA
@vindex ALLOCA

The @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} variables list object
files that should be compiled into the project to provide an
implementation for functions that are missing or broken on the host
system.  They are substituted by @file{configure}.

@acindex AC_LIBOBJ

These variables are defined by Autoconf macros such as
@code{AC_LIBOBJ}, @code{AC_REPLACE_FUNCS} (@pxref{Generic Functions, ,
Generic Function Checks, autoconf, The Autoconf Manual}), or
@code{AC_FUNC_ALLOCA} (@pxref{Particular Functions, , Particular
Function Checks, autoconf, The Autoconf Manual}).  Many other Autoconf
macros call @code{AC_LIBOBJ} or @code{AC_REPLACE_FUNCS} to
populate @samp{$(LIBOBJS)}.

@acindex AC_LIBSOURCE

Using these variables is very similar to doing conditional compilation
using @code{AC_SUBST} variables, as described in @ref{Conditional
Sources}.  That is, when building a program, @samp{$(LIBOBJS)} and
@samp{$(ALLOCA)} should be added to the associated @samp{*_LDADD}
variable, or to the @samp{*_LIBADD} variable when building a library.
However there is no need to list the corresponding sources in
@samp{EXTRA_*_SOURCES} nor to define @samp{*_DEPENDENCIES}.  Automake
automatically adds @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} to the
dependencies, and it will discover the list of corresponding source
files automatically (by tracing the invocations of the
@code{AC_LIBSOURCE} Autoconf macros).  If you have already defined
@samp{*_DEPENDENCIES} explicitly for an unrelated reason, then you
either need to add these variables manually, or use
@samp{EXTRA_*_DEPENDENCIES} instead of @samp{*_DEPENDENCIES}.

These variables are usually used to build a portability library that
is linked with all the programs of the project.  We now review a
sample setup.  First, @file{configure.ac} contains some checks that
affect either @code{LIBOBJS} or @code{ALLOCA}.

@example
# configure.ac
@dots{}
AC_CONFIG_LIBOBJ_DIR([lib])
@dots{}
AC_FUNC_MALLOC             dnl May add malloc.$(OBJEXT) to LIBOBJS
AC_FUNC_MEMCMP             dnl May add memcmp.$(OBJEXT) to LIBOBJS
AC_REPLACE_FUNCS([strdup]) dnl May add strdup.$(OBJEXT) to LIBOBJS
AC_FUNC_ALLOCA             dnl May add alloca.$(OBJEXT) to ALLOCA
@dots{}
AC_CONFIG_FILES([
  lib/Makefile
  src/Makefile
])
AC_OUTPUT
@end example

@acindex AC_CONFIG_LIBOBJ_DIR

The @code{AC_CONFIG_LIBOBJ_DIR} tells Autoconf that the source files
of these object files are to be found in the @file{lib/} directory.
Automake can also use this information, otherwise it expects the
source files are to be in the directory where the @samp{$(LIBOBJS)}
and @samp{$(ALLOCA)} variables are used.

The @file{lib/} directory should therefore contain @file{malloc.c},
@file{memcmp.c}, @file{strdup.c}, @file{alloca.c}.  Here is its
@file{Makefile.am}:

@example
# lib/Makefile.am

noinst_LIBRARIES = libcompat.a
libcompat_a_SOURCES =
libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
@end example

The library can have any name, of course, and anyway it is not going
to be installed: it just holds the replacement versions of the missing
or broken functions so we can later link them in.  Many projects
also include extra functions, specific to the project, in that
library: they are simply added on the @code{_SOURCES} line.

@cindex Empty libraries and @samp{$(LIBOBJS)}
@cindex @samp{$(LIBOBJS)} and empty libraries
There is a small trap here, though: @samp{$(LIBOBJS)} and
@samp{$(ALLOCA)} might be empty, and building an empty library is not
portable.  You should ensure that there is always something to put in
@file{libcompat.a}.  Most projects will also add some utility
functions in that directory, and list them in
@code{libcompat_a_SOURCES}, so in practice @file{libcompat.a} cannot
be empty.

Finally here is how this library could be used from the @file{src/}
directory.

@example
# src/Makefile.am

# Link all programs in this directory with libcompat.a
LDADD = ../lib/libcompat.a

bin_PROGRAMS = tool1 tool2 @dots{}
tool1_SOURCES = @dots{}
tool2_SOURCES = @dots{}
@end example

When option @option{subdir-objects} is not used, as in the above
example, the variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} can only
be used in the directory where their sources lie.  E.g., here it would
be wrong to use @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} in
@file{src/Makefile.am}.  However if both @option{subdir-objects} and
@code{AC_CONFIG_LIBOBJ_DIR} are used, it is OK to use these variables
in other directories.  For instance @file{src/Makefile.am} could be
changed as follows.

@example
# src/Makefile.am

AUTOMAKE_OPTIONS = subdir-objects
LDADD = $(LIBOBJS) $(ALLOCA)

bin_PROGRAMS = tool1 tool2 @dots{}
tool1_SOURCES = @dots{}
tool2_SOURCES = @dots{}
@end example

Because @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} contain object
file names that end with @samp{.$(OBJEXT)}, they are not suitable for
Libtool libraries (where the expected object extension is @file{.lo}):
@code{LTLIBOBJS} and @code{LTALLOCA} should be used instead.

@code{LTLIBOBJS} is defined automatically by Autoconf and should not
be defined by hand (as in the past), however at the time of writing
@code{LTALLOCA} still needs to be defined from @code{ALLOCA} manually.
@xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
autoconf, The Autoconf Manual}.


@node Program Variables
@section Variables used when building a program

Occasionally it is useful to know which @file{Makefile} variables
Automake uses for compilations, and in which order (@pxref{Flag
Variables Ordering}); for instance, you might need to do your own
compilation in some special cases.

Some variables are inherited from Autoconf; these are @code{CC},
@code{CFLAGS}, @code{CPPFLAGS}, @code{DEFS}, @code{LDFLAGS}, and
@code{LIBS}.
@vindex CC
@vindex CFLAGS
@vindex CPPFLAGS
@vindex DEFS
@vindex LDFLAGS
@vindex LIBS

There are some additional variables that Automake defines on its own:

@vtable @code
@item AM_CPPFLAGS
The contents of this variable are passed to every compilation that invokes
the C preprocessor; it is a list of arguments to the preprocessor.  For
instance, @option{-I} and @option{-D} options should be listed here.

Automake already provides some @option{-I} options automatically, in a
separate variable that is also passed to every compilation that invokes
the C preprocessor.  In particular it generates @samp{-I.},
@samp{-I$(srcdir)}, and a @option{-I} pointing to the directory holding
@file{config.h} (if you've used @code{AC_CONFIG_HEADERS}).  You can
disable the default @option{-I} options using the @option{nostdinc}
option.

When a file to be included is generated during the build and not part
of a distribution tarball, its location is under @code{$(builddir)},
not under @code{$(srcdir)}.  This matters especially for packages that
use header files placed in sub-directories and want to allow builds
outside the source tree (@pxref{VPATH Builds}). In that case we
recommend to use a pair of @option{-I} options, such as, e.g.,
@samp{-Isome/subdir -I$(srcdir)/some/subdir} or
@samp{-I$(top_builddir)/some/subdir -I$(top_srcdir)/some/subdir}.
Note that the reference to the build tree should come before the
reference to the source tree, so that accidentally leftover generated
files in the source directory are ignored.

@code{AM_CPPFLAGS} is ignored in preference to a per-executable (or
per-library) @code{_CPPFLAGS} variable if it is defined.

@item INCLUDES
This does the same job as @code{AM_CPPFLAGS} (or any per-target
@code{_CPPFLAGS} variable if it is used).  It is an older name for the
same functionality.  This variable is deprecated; we suggest using
@code{AM_CPPFLAGS} and per-target @code{_CPPFLAGS} instead.

@item AM_CFLAGS
This is the variable the @file{Makefile.am} author can use to pass
in additional C compiler flags.  In some situations, this is
not used, in preference to the per-executable (or per-library)
@code{_CFLAGS}.

@item COMPILE
This is the command used to actually compile a C source file.  The
file name is appended to form the complete command line.

@item AM_LDFLAGS
This is the variable the @file{Makefile.am} author can use to pass
in additional linker flags.  In some situations, this is not used, in
preference to the per-executable (or per-library) @code{_LDFLAGS}.

@item LINK
This is the command used to actually link a C program.  It already
includes @samp{-o $@@} and the usual variable references (for instance,
@code{CFLAGS}); it takes as ``arguments'' the names of the object files
and libraries to link in.  This variable is not used when the linker is
overridden with a per-target @code{_LINK} variable or per-target flags
cause Automake to define such a @code{_LINK} variable.
@end vtable


@node Yacc and Lex
@section Yacc and Lex support

Automake has somewhat idiosyncratic support for Yacc and Lex.

Automake assumes that the @file{.c} file generated by @command{yacc}
(or @command{lex}) should be named using the basename of the input
file.  That is, for a yacc source file @file{foo.y}, Automake will
cause the intermediate file to be named @file{foo.c} (as opposed to
@file{y.tab.c}, which is more traditional).

The extension of a yacc source file is used to determine the extension
of the resulting C or C++ source and header files.  Note that header
files are generated only when the @option{-d} Yacc option is used; see
below for more information about this flag, and how to specify it.
Files with the extension @file{.y} will thus be turned into @file{.c}
sources and @file{.h} headers; likewise, @file{.yy} will become
@file{.cc} and @file{.hh}, @file{.y++} will become @file{c++} and
@file{h++}, @file{.yxx} will become @file{.cxx} and @file{.hxx},
and @file{.ypp} will become @file{.cpp} and @file{.hpp}.

Similarly, lex source files can be used to generate C or C++; the
extensions @file{.l}, @file{.ll}, @file{.l++}, @file{.lxx}, and
@file{.lpp} are recognized.

You should never explicitly mention the intermediate (C or C++) file
in any @code{SOURCES} variable; only list the source file.

The intermediate files generated by @command{yacc} (or @command{lex})
will be included in any distribution that is made.  That way the user
doesn't need to have @command{yacc} or @command{lex}.

If a @command{yacc} source file is seen, then your @file{configure.ac} must
define the variable @code{YACC}.  This is most easily done by invoking
the macro @code{AC_PROG_YACC} (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

@vindex YFLAGS
@vindex AM_YFLAGS
When @code{yacc} is invoked, it is passed @code{AM_YFLAGS} and
@code{YFLAGS}.  The latter is a user variable and the former is
intended for the @file{Makefile.am} author.

@code{AM_YFLAGS} is usually used to pass the @option{-d} option to
@command{yacc}.  Automake knows what this means and will automatically
adjust its rules to update and distribute the header file built by
@samp{yacc -d}@footnote{Please note that @command{automake} recognizes
@option{-d} in @code{AM_YFLAGS} only if it is not clustered with other
options; for example, it won't be recognized if @code{AM_YFLAGS} is
@option{-dt}, but it will be if @code{AM_YFLAGS} is @option{-d -t} or
@option{-t -d}.}.
What Automake cannot guess, though, is where this
header will be used: it is up to you to ensure the header gets built
before it is first used.  Typically this is necessary in order for
dependency tracking to work when the header is included by another
file.  The common solution is listing the header file in
@code{BUILT_SOURCES} (@pxref{Sources}) as follows.

@example
BUILT_SOURCES = parser.h
AM_YFLAGS = -d
bin_PROGRAMS = foo
foo_SOURCES = @dots{} parser.y @dots{}
@end example

If a @command{lex} source file is seen, then your @file{configure.ac}
must define the variable @code{LEX}.  You can use @code{AC_PROG_LEX}
to do this (@pxref{Particular Programs, , Particular Program Checks,
autoconf, The Autoconf Manual}), but using @code{AM_PROG_LEX} macro
(@pxref{Macros}) is recommended.

@vindex LFLAGS
@vindex AM_LFLAGS
When @command{lex} is invoked, it is passed @code{AM_LFLAGS} and
@code{LFLAGS}.  The latter is a user variable and the former is
intended for the @file{Makefile.am} author.

When @code{AM_MAINTAINER_MODE} (@pxref{maintainer-mode}) is used, the
rebuild rule for distributed Yacc and Lex sources are only used when
@code{maintainer-mode} is enabled, or when the files have been erased.

@cindex @command{ylwrap}
@cindex @command{yacc}, multiple parsers
@cindex Multiple @command{yacc} parsers
@cindex Multiple @command{lex} lexers
@cindex @command{lex}, multiple lexers

When @command{lex} or @command{yacc} sources are used, @code{automake -a}
automatically installs an auxiliary program called @command{ylwrap} in
your package (@pxref{Auxiliary Programs}).
This program is used by the build rules to rename the output of these
tools, and makes it possible to include multiple @command{yacc} (or
@command{lex}) source files in a single directory.  (This is necessary
because yacc's output file name is fixed, and a parallel make could
conceivably invoke more than one instance of @command{yacc}
simultaneously.)

For @command{yacc}, simply managing locking is insufficient.  The output of
@command{yacc} always uses the same symbol names internally, so it isn't
possible to link two @command{yacc} parsers into the same executable.

We recommend using the following renaming hack used in @command{gdb}:
@example
#define yymaxdepth c_maxdepth
#define yyparse c_parse
#define yylex   c_lex
#define yyerror c_error
#define yylval  c_lval
#define yychar  c_char
#define yydebug c_debug
#define yypact  c_pact
#define yyr1    c_r1
#define yyr2    c_r2
#define yydef   c_def
#define yychk   c_chk
#define yypgo   c_pgo
#define yyact   c_act
#define yyexca  c_exca
#define yyerrflag c_errflag
#define yynerrs c_nerrs
#define yyps    c_ps
#define yypv    c_pv
#define yys     c_s
#define yy_yys  c_yys
#define yystate c_state
#define yytmp   c_tmp
#define yyv     c_v
#define yy_yyv  c_yyv
#define yyval   c_val
#define yylloc  c_lloc
#define yyreds  c_reds
#define yytoks  c_toks
#define yylhs   c_yylhs
#define yylen   c_yylen
#define yydefred c_yydefred
#define yydgoto  c_yydgoto
#define yysindex c_yysindex
#define yyrindex c_yyrindex
#define yygindex c_yygindex
#define yytable  c_yytable
#define yycheck  c_yycheck
#define yyname   c_yyname
#define yyrule   c_yyrule
@end example

For each define, replace the @samp{c_} prefix with whatever you like.
These defines work for @command{bison}, @command{byacc}, and
traditional @code{yacc}s.  If you find a parser generator that uses a
symbol not covered here, please report the new name so it can be added
to the list.


@node C++ Support
@section C++ Support

@cindex C++ support
@cindex Support for C++

Automake includes full support for C++.

Any package including C++ code must define the output variable
@code{CXX} in @file{configure.ac}; the simplest way to do this is to use
the @code{AC_PROG_CXX} macro (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

A few additional variables are defined when a C++ source file is seen:

@vtable @code
@item CXX
The name of the C++ compiler.

@item CXXFLAGS
Any flags to pass to the C++ compiler.

@item AM_CXXFLAGS
The maintainer's variant of @code{CXXFLAGS}.

@item CXXCOMPILE
The command used to actually compile a C++ source file.  The file name
is appended to form the complete command line.

@item CXXLINK
The command used to actually link a C++ program.
@end vtable


@node Objective C Support
@section Objective C Support

@cindex Objective C support
@cindex Support for Objective C

Automake includes some support for Objective C.

Any package including Objective C code must define the output variable
@code{OBJC} in @file{configure.ac}; the simplest way to do this is to use
the @code{AC_PROG_OBJC} macro (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

A few additional variables are defined when an Objective C source file
is seen:

@vtable @code
@item OBJC
The name of the Objective C compiler.

@item OBJCFLAGS
Any flags to pass to the Objective C compiler.

@item AM_OBJCFLAGS
The maintainer's variant of @code{OBJCFLAGS}.

@item OBJCCOMPILE
The command used to actually compile an Objective C source file.  The
file name is appended to form the complete command line.

@item OBJCLINK
The command used to actually link an Objective C program.
@end vtable


@node Objective C++ Support
@section Objective C++ Support

@cindex Objective C++ support
@cindex Support for Objective C++

Automake includes some support for Objective C++.

Any package including Objective C++ code must define the output variable
@code{OBJCXX} in @file{configure.ac}; the simplest way to do this is to use
the @code{AC_PROG_OBJCXX} macro (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

A few additional variables are defined when an Objective C++ source file
is seen:

@vtable @code
@item OBJCXX
The name of the Objective C++ compiler.

@item OBJCXXFLAGS
Any flags to pass to the Objective C++ compiler.

@item AM_OBJCXXFLAGS
The maintainer's variant of @code{OBJCXXFLAGS}.

@item OBJCXXCOMPILE
The command used to actually compile an Objective C++ source file.  The
file name is appended to form the complete command line.

@item OBJCXXLINK
The command used to actually link an Objective C++ program.
@end vtable


@node Unified Parallel C Support
@section Unified Parallel C Support

@cindex Unified Parallel C support
@cindex Support for Unified Parallel C

Automake includes some support for Unified Parallel C.

Any package including Unified Parallel C code must define the output
variable @code{UPC} in @file{configure.ac}; the simplest way to do
this is to use the @code{AM_PROG_UPC} macro (@pxref{Public Macros}).

A few additional variables are defined when a Unified Parallel C
source file is seen:

@vtable @code
@item UPC
The name of the Unified Parallel C compiler.

@item UPCFLAGS
Any flags to pass to the Unified Parallel C compiler.

@item AM_UPCFLAGS
The maintainer's variant of @code{UPCFLAGS}.

@item UPCCOMPILE
The command used to actually compile a Unified Parallel C source file.
The file name is appended to form the complete command line.

@item UPCLINK
The command used to actually link a Unified Parallel C program.
@end vtable


@node Assembly Support
@section Assembly Support

Automake includes some support for assembly code.  There are two forms
of assembler files: normal (@file{*.s}) and preprocessed by @code{CPP}
(@file{*.S} or @file{*.sx}).

@vindex CCAS
@vindex CCASFLAGS
@vindex CPPFLAGS
@vindex AM_CCASFLAGS
@vindex AM_CPPFLAGS
The variable @code{CCAS} holds the name of the compiler used to build
assembly code.  This compiler must work a bit like a C compiler; in
particular it must accept @option{-c} and @option{-o}.  The values of
@code{CCASFLAGS} and @code{AM_CCASFLAGS} (or its per-target
definition) is passed to the compilation.  For preprocessed files,
@code{DEFS}, @code{DEFAULT_INCLUDES}, @code{INCLUDES}, @code{CPPFLAGS}
and @code{AM_CPPFLAGS} are also used.

The autoconf macro @code{AM_PROG_AS} will define @code{CCAS} and
@code{CCASFLAGS} for you (unless they are already set, it simply sets
@code{CCAS} to the C compiler and @code{CCASFLAGS} to the C compiler
flags), but you are free to define these variables by other means.

Only the suffixes @file{.s}, @file{.S}, and @file{.sx} are recognized by
@command{automake} as being files containing assembly code.


@node Fortran 77 Support
@comment  node-name,  next,  previous,  up
@section Fortran 77 Support

@cindex Fortran 77 support
@cindex Support for Fortran 77

Automake includes full support for Fortran 77.

Any package including Fortran 77 code must define the output variable
@code{F77} in @file{configure.ac}; the simplest way to do this is to use
the @code{AC_PROG_F77} macro (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

A few additional variables are defined when a Fortran 77 source file is
seen:

@vtable @code

@item F77
The name of the Fortran 77 compiler.

@item FFLAGS
Any flags to pass to the Fortran 77 compiler.

@item AM_FFLAGS
The maintainer's variant of @code{FFLAGS}.

@item RFLAGS
Any flags to pass to the Ratfor compiler.

@item AM_RFLAGS
The maintainer's variant of @code{RFLAGS}.

@item F77COMPILE
The command used to actually compile a Fortran 77 source file.  The file
name is appended to form the complete command line.

@item FLINK
The command used to actually link a pure Fortran 77 program or shared
library.

@end vtable

Automake can handle preprocessing Fortran 77 and Ratfor source files in
addition to compiling them@footnote{Much, if not most, of the
information in the following sections pertaining to preprocessing
Fortran 77 programs was taken almost verbatim from @ref{Catalogue of
Rules, , Catalogue of Rules, make, The GNU Make Manual}.}.  Automake
also contains some support for creating programs and shared libraries
that are a mixture of Fortran 77 and other languages (@pxref{Mixing
Fortran 77 With C and C++}).

These issues are covered in the following sections.

@menu
* Preprocessing Fortran 77::    Preprocessing Fortran 77 sources
* Compiling Fortran 77 Files::  Compiling Fortran 77 sources
* Mixing Fortran 77 With C and C++::  Mixing Fortran 77 With C and C++
@end menu


@node Preprocessing Fortran 77
@comment  node-name,  next,  previous,  up
@subsection Preprocessing Fortran 77

@cindex Preprocessing Fortran 77
@cindex Fortran 77, Preprocessing
@cindex Ratfor programs

@file{N.f} is made automatically from @file{N.F} or @file{N.r}.  This
rule runs just the preprocessor to convert a preprocessable Fortran 77
or Ratfor source file into a strict Fortran 77 source file.  The precise
command used is as follows:

@table @file

@item .F
@code{$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
$(AM_FFLAGS) $(FFLAGS)}

@item .r
@code{$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}

@end table


@node Compiling Fortran 77 Files
@comment  node-name,  next,  previous,  up
@subsection Compiling Fortran 77 Files

@file{N.o} is made automatically from @file{N.f}, @file{N.F} or
@file{N.r} by running the Fortran 77 compiler.  The precise command used
is as follows:

@table @file

@item .f
@code{$(F77) -c $(AM_FFLAGS) $(FFLAGS)}

@item .F
@code{$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
$(AM_FFLAGS) $(FFLAGS)}

@item .r
@code{$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}

@end table


@node Mixing Fortran 77 With C and C++
@comment  node-name,  next,  previous,  up
@subsection Mixing Fortran 77 With C and C++

@cindex Fortran 77, mixing with C and C++
@cindex Mixing Fortran 77 with C and C++
@cindex Linking Fortran 77 with C and C++
@cindex cfortran
@cindex Mixing Fortran 77 with C and/or C++

Automake currently provides @emph{limited} support for creating programs
and shared libraries that are a mixture of Fortran 77 and C and/or C++.
However, there are many other issues related to mixing Fortran 77 with
other languages that are @emph{not} (currently) handled by Automake, but
that are handled by other packages@footnote{For example,
@uref{http://www-zeus.desy.de/~burow/cfortran/, the cfortran package}
addresses all of these inter-language issues, and runs under nearly all
Fortran 77, C and C++ compilers on nearly all platforms.  However,
@command{cfortran} is not yet Free Software, but it will be in the next
major release.}.

Automake can help in two ways:

@enumerate
@item
Automatic selection of the linker depending on which combinations of
source code.

@item
Automatic selection of the appropriate linker flags (e.g., @option{-L} and
@option{-l}) to pass to the automatically selected linker in order to link
in the appropriate Fortran 77 intrinsic and run-time libraries.

@cindex @code{FLIBS}, defined
@vindex FLIBS
These extra Fortran 77 linker flags are supplied in the output variable
@code{FLIBS} by the @code{AC_F77_LIBRARY_LDFLAGS} Autoconf macro.
@xref{Fortran Compiler, , Fortran Compiler Characteristics, autoconf,
The Autoconf Manual}.
@end enumerate

If Automake detects that a program or shared library (as mentioned in
some @code{_PROGRAMS} or @code{_LTLIBRARIES} primary) contains source
code that is a mixture of Fortran 77 and C and/or C++, then it requires
that the macro @code{AC_F77_LIBRARY_LDFLAGS} be called in
@file{configure.ac}, and that either @code{$(FLIBS)}
appear in the appropriate @code{_LDADD} (for programs) or @code{_LIBADD}
(for shared libraries) variables.  It is the responsibility of the
person writing the @file{Makefile.am} to make sure that @samp{$(FLIBS)}
appears in the appropriate @code{_LDADD} or
@code{_LIBADD} variable.

@cindex Mixed language example
@cindex Example, mixed language

For example, consider the following @file{Makefile.am}:

@example
bin_PROGRAMS = foo
foo_SOURCES  = main.cc foo.f
foo_LDADD    = libfoo.la $(FLIBS)

pkglib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES  = bar.f baz.c zardoz.cc
libfoo_la_LIBADD   = $(FLIBS)
@end example

In this case, Automake will insist that @code{AC_F77_LIBRARY_LDFLAGS}
is mentioned in @file{configure.ac}.  Also, if @samp{$(FLIBS)} hadn't
been mentioned in @code{foo_LDADD} and @code{libfoo_la_LIBADD}, then
Automake would have issued a warning.

@menu
* How the Linker is Chosen::    Automatic linker selection
@end menu

@node How the Linker is Chosen
@comment  node-name,  next,  previous,  up
@subsubsection How the Linker is Chosen

@cindex Automatic linker selection
@cindex Selecting the linker automatically

When a program or library mixes several languages, Automake choose the
linker according to the following priorities.  (The names in
parentheses are the variables containing the link command.)

@enumerate
@item
@vindex GCJLINK
Native Java (@code{GCJLINK})
@item
@vindex OBJCXXLINK
Objective C++ (@code{OBJCXXLINK})
@item
@vindex CXXLINK
C++ (@code{CXXLINK})
@item
@vindex F77LINK
Fortran 77 (@code{F77LINK})
@item
@vindex FCLINK
Fortran (@code{FCLINK})
@item
@vindex OBJCLINK
Objective C (@code{OBJCLINK})
@item
@vindex UPCLINK
Unified Parallel C (@code{UPCLINK})
@item
@vindex LINK
C (@code{LINK})
@end enumerate

For example, if Fortran 77, C and C++ source code is compiled
into a program, then the C++ linker will be used.  In this case, if the
C or Fortran 77 linkers required any special libraries that weren't
included by the C++ linker, then they must be manually added to an
@code{_LDADD} or @code{_LIBADD} variable by the user writing the
@file{Makefile.am}.

Automake only looks at the file names listed in @file{_SOURCES}
variables to choose the linker, and defaults to the C linker.
Sometimes this is inconvenient because you are linking against a
library written in another language and would like to set the linker
more appropriately.  @xref{Libtool Convenience Libraries}, for a
trick with @code{nodist_EXTRA_@dots{}_SOURCES}.

A per-target @code{_LINK} variable will override the above selection.
Per-target link flags will cause Automake to write a per-target
@code{_LINK} variable according to the language chosen as above.


@node Fortran 9x Support
@comment  node-name,  next,  previous,  up
@section Fortran 9x Support

@cindex Fortran 9x support
@cindex Support for Fortran 9x

Automake includes support for Fortran 9x.

Any package including Fortran 9x code must define the output variable
@code{FC} in @file{configure.ac}; the simplest way to do this is to use
the @code{AC_PROG_FC} macro (@pxref{Particular Programs, , Particular
Program Checks, autoconf, The Autoconf Manual}).

A few additional variables are defined when a Fortran 9x source file is
seen:

@vtable @code

@item FC
The name of the Fortran 9x compiler.

@item FCFLAGS
Any flags to pass to the Fortran 9x compiler.

@item AM_FCFLAGS
The maintainer's variant of @code{FCFLAGS}.

@item FCCOMPILE
The command used to actually compile a Fortran 9x source file.  The file
name is appended to form the complete command line.

@item FCLINK
The command used to actually link a pure Fortran 9x program or shared
library.

@end vtable

@menu
* Compiling Fortran 9x Files::  Compiling Fortran 9x sources
@end menu

@node Compiling Fortran 9x Files
@comment  node-name,  next,  previous,  up
@subsection Compiling Fortran 9x Files

@file{@var{file}.o} is made automatically from @file{@var{file}.f90},
@file{@var{file}.f95}, @file{@var{file}.f03}, or @file{@var{file}.f08}
by running the Fortran 9x compiler.  The precise command used
is as follows:

@table @file

@item .f90
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<}

@item .f95
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<}

@item .f03
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<}

@item .f08
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<}

@end table

@node Java Support with gcj
@comment  node-name,  next,  previous,  up
@section Compiling Java sources using gcj

@cindex Java support with gcj
@cindex Support for Java with gcj
@cindex Java to native code, compilation
@cindex Compilation of Java to native code

Automake includes support for natively compiled Java, using @command{gcj},
the Java front end to the GNU Compiler Collection (rudimentary support
for compiling Java to bytecode using the @command{javac} compiler is
also present, @emph{albeit deprecated}; @pxref{Java}).

Any package including Java code to be compiled must define the output
variable @code{GCJ} in @file{configure.ac}; the variable @code{GCJFLAGS}
must also be defined somehow (either in @file{configure.ac} or
@file{Makefile.am}).  The simplest way to do this is to use the
@code{AM_PROG_GCJ} macro.

@vindex GCJFLAGS

By default, programs including Java source files are linked with
@command{gcj}.

As always, the contents of @code{AM_GCJFLAGS} are passed to every
compilation invoking @command{gcj} (in its role as an ahead-of-time
compiler, when invoking it to create @file{.class} files,
@code{AM_JAVACFLAGS} is used instead).  If it is necessary to pass
options to @command{gcj} from @file{Makefile.am}, this variable, and not
the user variable @code{GCJFLAGS}, should be used.

@vindex AM_GCJFLAGS

@command{gcj} can be used to compile @file{.java}, @file{.class},
@file{.zip}, or @file{.jar} files.

When linking, @command{gcj} requires that the main class be specified
using the @option{--main=} option.  The easiest way to do this is to use
the @code{_LDFLAGS} variable for the program.


@node Vala Support
@comment  node-name,  next,  previous,  up
@section Vala Support

@cindex Vala Support
@cindex Support for Vala

Automake provides initial support for Vala
(@uref{http://www.vala-project.org/}).
This requires valac version 0.7.0 or later, and currently requires
the user to use GNU @command{make}.

@example
foo_SOURCES = foo.vala bar.vala zardoc.c
@end example

Any @file{.vala} file listed in a @code{_SOURCES} variable will be
compiled into C code by the Vala compiler. The generated @file{.c} files
are distributed. The end user does not need to have a Vala compiler installed.

Automake ships with an Autoconf macro called @code{AM_PROG_VALAC}
that will locate the Vala compiler and optionally check its version
number.

@defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found},
  @ovar{action-if-not-found})
Search for a Vala compiler in @env{PATH}.  If it is found, the variable
@code{VALAC} is set to point to it (see below for more details).  This
macro takes three optional arguments.  The first argument, if present,
is the minimum version of the Vala compiler required to compile this
package.  If a compiler is found and satisfies @var{minimum-version},
then @var{action-if-found} is run (this defaults to do nothing).
Otherwise, @var{action-if-not-found} is run.  If @var{action-if-not-found}
is not specified, the default value is to print a warning in case no
compiler is found, or if a too-old version of the compiler is found.
@end defmac

There are a few variables that are used when compiling Vala sources:

@vtable @code
@item VALAC
Absolute path to the Vala compiler, or simply @samp{valac} if no
suitable compiler Vala could be found at configure runtime.

@item VALAFLAGS
Additional arguments for the Vala compiler.

@item AM_VALAFLAGS
The maintainer's variant of @code{VALAFLAGS}.

@example
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.vala
@end example
@end vtable

Note that currently, you cannot use per-target @code{*_VALAFLAGS}
(@pxref{Renamed Objects}) to produce different C files from one Vala
source file.


@node Support for Other Languages
@comment  node-name,  next,  previous,  up
@section Support for Other Languages

Automake currently only includes full support for C, C++ (@pxref{C++
Support}), Objective C (@pxref{Objective C Support}),
Objective C++ (@pxref{Objective C++ Support}),
Fortran 77
(@pxref{Fortran 77 Support}), Fortran 9x (@pxref{Fortran 9x Support}),
and Java (@pxref{Java Support with gcj}).  There is only rudimentary
support for other languages, support for which will be improved based
on user demand.

Some limited support for adding your own languages is available via the
suffix rule handling (@pxref{Suffixes}).

@node Dependencies
@section Automatic dependency tracking

As a developer it is often painful to continually update the
@file{Makefile.am} whenever the include-file dependencies change in a
project.  Automake supplies a way to automatically track dependency
changes (@pxref{Dependency Tracking}).

@cindex Dependency tracking
@cindex Automatic dependency tracking

Automake always uses complete dependencies for a compilation,
including system headers.  Automake's model is that dependency
computation should be a side effect of the build.  To this end,
dependencies are computed by running all compilations through a
special wrapper program called @command{depcomp}.  @command{depcomp}
understands how to coax many different C and C++ compilers into
generating dependency information in the format it requires.
@samp{automake -a} will install @command{depcomp} into your source
tree for you.  If @command{depcomp} can't figure out how to properly
invoke your compiler, dependency tracking will simply be disabled for
your build.

@cindex @command{depcomp}

Experience with earlier versions of Automake (@pxref{Dependency Tracking
Evolution, , Dependency Tracking Evolution, automake-history, Brief History
of Automake}) taught us that it is not reliable to generate dependencies
only on the maintainer's system, as configurations vary too much.  So
instead Automake implements dependency tracking at build time.

Automatic dependency tracking can be suppressed by putting
@option{no-dependencies} in the variable @code{AUTOMAKE_OPTIONS}, or
passing @option{no-dependencies} as an argument to @code{AM_INIT_AUTOMAKE}
(this should be the preferred way).  Or, you can invoke @command{automake}
with the @option{-i} option.  Dependency tracking is enabled by default.

@vindex AUTOMAKE_OPTIONS
@opindex no-dependencies

The person building your package also can choose to disable dependency
tracking by configuring with @option{--disable-dependency-tracking}.

@cindex Disabling dependency tracking
@cindex Dependency tracking, disabling


@node EXEEXT
@section Support for executable extensions

@cindex Executable extension
@cindex Extension, executable
@cindex Windows

On some platforms, such as Windows, executables are expected to have an
extension such as @file{.exe}.  On these platforms, some compilers (GCC
among them) will automatically generate @file{foo.exe} when asked to
generate @file{foo}.

Automake provides mostly-transparent support for this.  Unfortunately
@emph{mostly} doesn't yet mean @emph{fully}.  Until the English
dictionary is revised, you will have to assist Automake if your package
must support those platforms.

One thing you must be aware of is that, internally, Automake rewrites
something like this:

@example
bin_PROGRAMS = liver
@end example

to this:

@example
bin_PROGRAMS = liver$(EXEEXT)
@end example

The targets Automake generates are likewise given the @samp{$(EXEEXT)}
extension.

The variables @code{TESTS} and @code{XFAIL_TESTS} (@pxref{Simple Tests})
are also rewritten if they contain filenames that have been declared as
programs in the same @file{Makefile}.  (This is mostly useful when some
programs from @code{check_PROGRAMS} are listed in @code{TESTS}.)

However, Automake cannot apply this rewriting to @command{configure}
substitutions.  This means that if you are conditionally building a
program using such a substitution, then your @file{configure.ac} must
take care to add @samp{$(EXEEXT)} when constructing the output variable.

Sometimes maintainers like to write an explicit link rule for their
program.  Without executable extension support, this is easy---you
simply write a rule whose target is the name of the program.  However,
when executable extension support is enabled, you must instead add the
@samp{$(EXEEXT)} suffix.

This might be a nuisance for maintainers who know their package will
never run on a platform that has
executable extensions.  For those maintainers, the @option{no-exeext}
option (@pxref{Options}) will disable this feature.  This works in a
fairly ugly way; if @option{no-exeext} is seen, then the presence of a
rule for a target named @code{foo} in @file{Makefile.am} will override
an @command{automake}-generated rule for @samp{foo$(EXEEXT)}.  Without
the @option{no-exeext} option, this use will give a diagnostic.


@node Other Objects
@chapter Other Derived Objects

Automake can handle derived objects that are not C programs.  Sometimes
the support for actually building such objects must be explicitly
supplied, but Automake will still automatically handle installation and
distribution.

@menu
* Scripts::                     Executable scripts
* Headers::                     Header files
* Data::                        Architecture-independent data files
* Sources::                     Derived sources
@end menu


@node Scripts
@section Executable Scripts

@cindex @code{_SCRIPTS} primary, defined
@cindex @code{SCRIPTS} primary, defined
@cindex Primary variable, @code{SCRIPTS}
@vindex _SCRIPTS
@cindex Installing scripts

It is possible to define and install programs that are scripts.  Such
programs are listed using the @code{SCRIPTS} primary name.  When the
script is distributed in its final, installable form, the
@file{Makefile} usually looks as follows:
@vindex SCRIPTS

@example
# Install my_script in $(bindir) and distribute it.
dist_bin_SCRIPTS = my_script
@end example

Scripts are not distributed by default; as we have just seen, those
that should be distributed can be specified using a @code{dist_}
prefix as with other primaries.

@cindex @code{SCRIPTS}, installation directories
@vindex bin_SCRIPTS
@vindex sbin_SCRIPTS
@vindex libexec_SCRIPTS
@vindex pkgdata_SCRIPTS
@vindex pkglibexec_SCRIPTS
@vindex noinst_SCRIPTS
@vindex check_SCRIPTS

Scripts can be installed in @code{bindir}, @code{sbindir},
@code{libexecdir}, @code{pkglibexecdir}, or @code{pkgdatadir}.

Scripts that need not be installed can be listed in
@code{noinst_SCRIPTS}, and among them, those which are needed only by
@samp{make check} should go in @code{check_SCRIPTS}.

When a script needs to be built, the @file{Makefile.am} should include
the appropriate rules.  For instance the @command{automake} program
itself is a Perl script that is generated from @file{automake.in}.
Here is how this is handled:

@example
bin_SCRIPTS = automake
CLEANFILES = $(bin_SCRIPTS)
EXTRA_DIST = automake.in

do_subst = sed -e 's,[@@]datadir[@@],$(datadir),g' \
            -e 's,[@@]PERL[@@],$(PERL),g' \
            -e 's,[@@]PACKAGE[@@],$(PACKAGE),g' \
            -e 's,[@@]VERSION[@@],$(VERSION),g' \
            @dots{}

automake: automake.in Makefile
        $(do_subst) < $(srcdir)/automake.in > automake
        chmod +x automake
@end example

Such scripts for which a build rule has been supplied need to be
deleted explicitly using @code{CLEANFILES} (@pxref{Clean}), and their
sources have to be distributed, usually with @code{EXTRA_DIST}
(@pxref{Basics of Distribution}).

Another common way to build scripts is to process them from
@file{configure} with @code{AC_CONFIG_FILES}.  In this situation
Automake knows which files should be cleaned and distributed, and what
the rebuild rules should look like.

For instance if @file{configure.ac} contains

@example
AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])
@end example

@noindent
to build @file{src/my_script} from @file{src/my_script.in}, then a
@file{src/Makefile.am} to install this script in @code{$(bindir)} can
be as simple as

@example
bin_SCRIPTS = my_script
CLEANFILES = $(bin_SCRIPTS)
@end example

@noindent
There is no need for @code{EXTRA_DIST} or any build rule: Automake
infers them from @code{AC_CONFIG_FILES} (@pxref{Requirements}).
@code{CLEANFILES} is still useful, because by default Automake will
clean targets of @code{AC_CONFIG_FILES} in @code{distclean}, not
@code{clean}.

Although this looks simpler, building scripts this way has one
drawback: directory variables such as @code{$(datadir)} are not fully
expanded and may refer to other directory variables.

@node Headers
@section Header files

@cindex @code{_HEADERS} primary, defined
@cindex @code{HEADERS} primary, defined
@cindex Primary variable, @code{HEADERS}
@vindex _HEADERS
@vindex noinst_HEADERS
@cindex @code{HEADERS}, installation directories
@cindex Installing headers
@vindex include_HEADERS
@vindex oldinclude_HEADERS
@vindex pkginclude_HEADERS


Header files that must be installed are specified by the
@code{HEADERS} family of variables.  Headers can be installed in
@code{includedir}, @code{oldincludedir}, @code{pkgincludedir} or any
other directory you may have defined (@pxref{Uniform}).  For instance,

@example
include_HEADERS = foo.h bar/bar.h
@end example

@noindent
will install the two files as @file{$(includedir)/foo.h} and
@file{$(includedir)/bar.h}.

The @code{nobase_} prefix is also supported,

@example
nobase_include_HEADERS = foo.h bar/bar.h
@end example

@noindent
will install the two files as @file{$(includedir)/foo.h} and
@file{$(includedir)/bar/bar.h} (@pxref{Alternative}).

@vindex noinst_HEADERS
Usually, only header files that accompany installed libraries need to
be installed.  Headers used by programs or convenience libraries are
not installed.  The @code{noinst_HEADERS} variable can be used for
such headers.  However when the header actually belongs to a single
convenience library or program, we recommend listing it in the
program's or library's @code{_SOURCES} variable (@pxref{Program
Sources}) instead of in @code{noinst_HEADERS}.  This is clearer for
the @file{Makefile.am} reader.  @code{noinst_HEADERS} would be the
right variable to use in a directory containing only headers and no
associated library or program.

All header files must be listed somewhere; in a @code{_SOURCES}
variable or in a @code{_HEADERS} variable.  Missing ones will not
appear in the distribution.

For header files that are built and must not be distributed, use the
@code{nodist_} prefix as in @code{nodist_include_HEADERS} or
@code{nodist_prog_SOURCES}.  If these generated headers are needed
during the build, you must also ensure they exist before they are
used (@pxref{Sources}).


@node Data
@section Architecture-independent data files

@cindex @code{_DATA} primary, defined
@cindex @code{DATA} primary, defined
@cindex Primary variable, @code{DATA}
@vindex _DATA

Automake supports the installation of miscellaneous data files using the
@code{DATA} family of variables.
@vindex DATA

@vindex data_DATA
@vindex sysconf_DATA
@vindex sharedstate_DATA
@vindex localstate_DATA
@vindex pkgdata_DATA

Such data can be installed in the directories @code{datadir},
@code{sysconfdir}, @code{sharedstatedir}, @code{localstatedir}, or
@code{pkgdatadir}.

By default, data files are @emph{not} included in a distribution.  Of
course, you can use the @code{dist_} prefix to change this on a
per-variable basis.

Here is how Automake declares its auxiliary data files:

@example
dist_pkgdata_DATA = clean-kr.am clean.am @dots{}
@end example


@node Sources
@section Built Sources

Because Automake's automatic dependency tracking works as a side-effect
of compilation (@pxref{Dependencies}) there is a bootstrap issue: a
target should not be compiled before its dependencies are made, but
these dependencies are unknown until the target is first compiled.

Ordinarily this is not a problem, because dependencies are distributed
sources: they preexist and do not need to be built.  Suppose that
@file{foo.c} includes @file{foo.h}.  When it first compiles
@file{foo.o}, @command{make} only knows that @file{foo.o} depends on
@file{foo.c}.  As a side-effect of this compilation @command{depcomp}
records the @file{foo.h} dependency so that following invocations of
@command{make} will honor it.  In these conditions, it's clear there is
no problem: either @file{foo.o} doesn't exist and has to be built
(regardless of the dependencies), or accurate dependencies exist and
they can be used to decide whether @file{foo.o} should be rebuilt.

It's a different story if @file{foo.h} doesn't exist by the first
@command{make} run.  For instance, there might be a rule to build
@file{foo.h}.  This time @file{file.o}'s build will fail because the
compiler can't find @file{foo.h}.  @command{make} failed to trigger the
rule to build @file{foo.h} first by lack of dependency information.

@vindex BUILT_SOURCES
@cindex @code{BUILT_SOURCES}, defined

The @code{BUILT_SOURCES} variable is a workaround for this problem.  A
source file listed in @code{BUILT_SOURCES} is made on @samp{make all}
or @samp{make check} (or even @samp{make install}) before other
targets are processed.  However, such a source file is not
@emph{compiled} unless explicitly requested by mentioning it in some
other @code{_SOURCES} variable.

So, to conclude our introductory example, we could use
@samp{BUILT_SOURCES = foo.h} to ensure @file{foo.h} gets built before
any other target (including @file{foo.o}) during @samp{make all} or
@samp{make check}.

@code{BUILT_SOURCES} is actually a bit of a misnomer, as any file which
must be created early in the build process can be listed in this
variable.  Moreover, all built sources do not necessarily have to be
listed in @code{BUILT_SOURCES}.  For instance, a generated @file{.c} file
doesn't need to appear in @code{BUILT_SOURCES} (unless it is included by
another source), because it's a known dependency of the associated
object.

It might be important to emphasize that @code{BUILT_SOURCES} is
honored only by @samp{make all}, @samp{make check} and @samp{make
install}.  This means you cannot build a specific target (e.g.,
@samp{make foo}) in a clean tree if it depends on a built source.
However it will succeed if you have run @samp{make all} earlier,
because accurate dependencies are already available.

The next section illustrates and discusses the handling of built sources
on a toy example.

@menu
* Built Sources Example::       Several ways to handle built sources.
@end menu

@node Built Sources Example
@subsection Built Sources Example

Suppose that @file{foo.c} includes @file{bindir.h}, which is
installation-dependent and not distributed: it needs to be built.  Here
@file{bindir.h} defines the preprocessor macro @code{bindir} to the
value of the @command{make} variable @code{bindir} (inherited from
@file{configure}).

We suggest several implementations below.  It's not meant to be an
exhaustive listing of all ways to handle built sources, but it will give
you a few ideas if you encounter this issue.

@subsubheading First Try

This first implementation will illustrate the bootstrap issue mentioned
in the previous section (@pxref{Sources}).

Here is a tentative @file{Makefile.am}.

@example
# This won't work.
bin_PROGRAMS = foo
foo_SOURCES = foo.c
nodist_foo_SOURCES = bindir.h
CLEANFILES = bindir.h
bindir.h: Makefile
        echo '#define bindir "$(bindir)"' >$@@
@end example

This setup doesn't work, because Automake doesn't know that @file{foo.c}
includes @file{bindir.h}.  Remember, automatic dependency tracking works
as a side-effect of compilation, so the dependencies of @file{foo.o} will
be known only after @file{foo.o} has been compiled (@pxref{Dependencies}).
The symptom is as follows.

@example
% make
source='foo.c' object='foo.o' libtool=no \
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
depmode=gcc /bin/sh ./depcomp \
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
foo.c:2: bindir.h: No such file or directory
make: *** [foo.o] Error 1
@end example

In this example @file{bindir.h} is not distributed nor installed, and
it is not even being built on-time.  One may wonder if the
@samp{nodist_foo_SOURCES = bindir.h} line has any use at all.  This
line simply states that @file{bindir.h} is a source of @code{foo}, so
for instance, it should be inspected while generating tags
(@pxref{Tags}).  In other words, it does not help our present problem,
and the build would fail identically without it.

@subsubheading Using @code{BUILT_SOURCES}

A solution is to require @file{bindir.h} to be built before anything
else.  This is what @code{BUILT_SOURCES} is meant for (@pxref{Sources}).

@example
bin_PROGRAMS = foo
foo_SOURCES = foo.c
nodist_foo_SOURCES = bindir.h
BUILT_SOURCES = bindir.h
CLEANFILES = bindir.h
bindir.h: Makefile
        echo '#define bindir "$(bindir)"' >$@@
@end example

See how @file{bindir.h} gets built first:

@example
% make
echo '#define bindir "/usr/local/bin"' >bindir.h
make  all-am
make[1]: Entering directory `/home/adl/tmp'
source='foo.c' object='foo.o' libtool=no \
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
depmode=gcc /bin/sh ./depcomp \
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
gcc  -g -O2   -o foo  foo.o
make[1]: Leaving directory `/home/adl/tmp'
@end example

However, as said earlier, @code{BUILT_SOURCES} applies only to the
@code{all}, @code{check}, and @code{install} targets.  It still fails
if you try to run @samp{make foo} explicitly:

@example
% make clean
test -z "bindir.h" || rm -f bindir.h
test -z "foo" || rm -f foo
rm -f *.o
% : > .deps/foo.Po # Suppress previously recorded dependencies
% make foo
source='foo.c' object='foo.o' libtool=no \
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
depmode=gcc /bin/sh ./depcomp \
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
foo.c:2: bindir.h: No such file or directory
make: *** [foo.o] Error 1
@end example

@subsubheading Recording Dependencies manually

Usually people are happy enough with @code{BUILT_SOURCES} because they
never build targets such as @samp{make foo} before @samp{make all}, as
in the previous example.  However if this matters to you, you can
avoid @code{BUILT_SOURCES} and record such dependencies explicitly in
the @file{Makefile.am}.

@example
bin_PROGRAMS = foo
foo_SOURCES = foo.c
nodist_foo_SOURCES = bindir.h
foo.$(OBJEXT): bindir.h
CLEANFILES = bindir.h
bindir.h: Makefile
        echo '#define bindir "$(bindir)"' >$@@
@end example

You don't have to list @emph{all} the dependencies of @file{foo.o}
explicitly, only those that might need to be built.  If a dependency
already exists, it will not hinder the first compilation and will be
recorded by the normal dependency tracking code.  (Note that after
this first compilation the dependency tracking code will also have
recorded the dependency between @file{foo.o} and
@file{bindir.h}; so our explicit dependency is really useful to
the first build only.)

Adding explicit dependencies like this can be a bit dangerous if you are
not careful enough.  This is due to the way Automake tries not to
overwrite your rules (it assumes you know better than it).
@samp{foo.$(OBJEXT): bindir.h} supersedes any rule Automake may want to
output to build @samp{foo.$(OBJEXT)}.  It happens to work in this case
because Automake doesn't have to output any @samp{foo.$(OBJEXT):}
target: it relies on a suffix rule instead (i.e., @samp{.c.$(OBJEXT):}).
Always check the generated @file{Makefile.in} if you do this.

@subsubheading Build @file{bindir.h} from @file{configure}

It's possible to define this preprocessor macro from @file{configure},
either in @file{config.h} (@pxref{Defining Directories, , Defining
Directories, autoconf, The Autoconf Manual}), or by processing a
@file{bindir.h.in} file using @code{AC_CONFIG_FILES}
(@pxref{Configuration Actions, ,Configuration Actions, autoconf, The
Autoconf Manual}).

At this point it should be clear that building @file{bindir.h} from
@file{configure} works well for this example.  @file{bindir.h} will exist
before you build any target, hence will not cause any dependency issue.

The Makefile can be shrunk as follows.  We do not even have to mention
@file{bindir.h}.

@example
bin_PROGRAMS = foo
foo_SOURCES = foo.c
@end example

However, it's not always possible to build sources from
@file{configure}, especially when these sources are generated by a tool
that needs to be built first.

@subsubheading Build @file{bindir.c}, not @file{bindir.h}.

Another attractive idea is to define @code{bindir} as a variable or
function exported from @file{bindir.o}, and build @file{bindir.c}
instead of @file{bindir.h}.

@example
noinst_PROGRAMS = foo
foo_SOURCES = foo.c bindir.h
nodist_foo_SOURCES = bindir.c
CLEANFILES = bindir.c
bindir.c: Makefile
        echo 'const char bindir[] = "$(bindir)";' >$@@
@end example

@file{bindir.h} contains just the variable's declaration and doesn't
need to be built, so it won't cause any trouble.  @file{bindir.o} is
always dependent on @file{bindir.c}, so @file{bindir.c} will get built
first.

@subsubheading Which is best?

There is no panacea, of course.  Each solution has its merits and
drawbacks.

You cannot use @code{BUILT_SOURCES} if the ability to run @samp{make
foo} on a clean tree is important to you.

You won't add explicit dependencies if you are leery of overriding
an Automake rule by mistake.

Building files from @file{./configure} is not always possible, neither
is converting @file{.h} files into @file{.c} files.


@node Other GNU Tools
@chapter Other GNU Tools

Since Automake is primarily intended to generate @file{Makefile.in}s for
use in GNU programs, it tries hard to interoperate with other GNU tools.

@menu
* Emacs Lisp::                  Emacs Lisp
* gettext::                     Gettext
* Libtool::                     Libtool
* Java::                        Java bytecode compilation (deprecated)
* Python::                      Python
@end menu


@node Emacs Lisp
@section Emacs Lisp

@cindex @code{_LISP} primary, defined
@cindex @code{LISP} primary, defined
@cindex Primary variable, @code{LISP}

@vindex _LISP
@vindex lisp_LISP
@vindex noinst_LISP

Automake provides some support for Emacs Lisp.  The @code{LISP} primary
is used to hold a list of @file{.el} files.  Possible prefixes for this
primary are @code{lisp_} and @code{noinst_}.  Note that if
@code{lisp_LISP} is defined, then @file{configure.ac} must run
@code{AM_PATH_LISPDIR} (@pxref{Macros}).

@vindex dist_lisp_LISP
@vindex dist_noinst_LISP
Lisp sources are not distributed by default.  You can prefix the
@code{LISP} primary with @code{dist_}, as in @code{dist_lisp_LISP} or
@code{dist_noinst_LISP}, to indicate that these files should be
distributed.

Automake will byte-compile all Emacs Lisp source files using the Emacs
found by @code{AM_PATH_LISPDIR}, if any was found.  When performing such
byte-compilation, the flags specified in the (developer-reserved)
@code{AM_ELCFLAGS} and (user-reserved) @code{ELCFLAGS} make variables
will be passed to the Emacs invocation.

Byte-compiled Emacs Lisp files are not portable among all versions of
Emacs, so it makes sense to turn this off if you expect sites to have
more than one version of Emacs installed.  Furthermore, many packages
don't actually benefit from byte-compilation.  Still, we recommend
that you byte-compile your Emacs Lisp sources.  It is probably better
for sites with strange setups to cope for themselves than to make the
installation less nice for everybody else.

There are two ways to avoid byte-compiling.  Historically, we have
recommended the following construct.

@example
lisp_LISP = file1.el file2.el
ELCFILES =
@end example

@noindent
@code{ELCFILES} is an internal Automake variable that normally lists
all @file{.elc} files that must be byte-compiled.  Automake defines
@code{ELCFILES} automatically from @code{lisp_LISP}.  Emptying this
variable explicitly prevents byte-compilation.

Since Automake 1.8, we now recommend using @code{lisp_DATA} instead:

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
lisp_DATA = file1.el file2.el
@end example

Note that these two constructs are not equivalent.  @code{_LISP} will
not install a file if Emacs is not installed, while @code{_DATA} will
always install its files.

@node gettext
@section Gettext

@cindex GNU Gettext support
@cindex Gettext support
@cindex Support for GNU Gettext

If @code{AM_GNU_GETTEXT} is seen in @file{configure.ac}, then Automake
turns on support for GNU gettext, a message catalog system for
internationalization
(@pxref{Top, , Introduction, gettext, GNU gettext utilities}).

The @code{gettext} support in Automake requires the addition of one or
two subdirectories to the package: @file{po} and possibly also @file{intl}.
The latter is needed if @code{AM_GNU_GETTEXT} is not invoked with the
@samp{external} argument, or if @code{AM_GNU_GETTEXT_INTL_SUBDIR} is used.
Automake ensures that these directories exist and are mentioned in
@code{SUBDIRS}.

@node Libtool
@section Libtool

Automake provides support for GNU Libtool (@pxref{Top, , Introduction,
libtool, The Libtool Manual}) with the @code{LTLIBRARIES} primary.
@xref{A Shared Library}.


@node Java
@section Java bytecode compilation (deprecated)

@cindex @code{_JAVA} primary, defined
@cindex @code{JAVA} primary, defined
@cindex Primary variable, @code{JAVA}
@cindex Java to bytecode, compilation
@cindex Compilation of Java to bytecode

Automake provides some minimal support for Java bytecode compilation with
the @code{JAVA} primary (in addition to the support for compiling Java to
native machine code; @pxref{Java Support with gcj}).  Note however that
@emph{the interface and most features described here are deprecated}.
Future Automake releases will strive to provide a better and cleaner
interface, which however @emph{won't be backward-compatible}; the present
interface will probably be removed altogether some time after the
introduction of the new interface (if that ever materializes).  In any
case, the current @code{JAVA} primary features are frozen and will no
longer be developed, not even to take bug fixes.

Any @file{.java} files listed in a @code{_JAVA} variable will be
compiled with @code{JAVAC} at build time.  By default, @file{.java}
files are not included in the distribution, you should use the
@code{dist_} prefix to distribute them.

Here is a typical setup for distributing @file{.java} files and
installing the @file{.class} files resulting from their compilation.

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
javadir = $(datadir)/java
dist_java_JAVA = a.java b.java @dots{}
@end example

@cindex @code{JAVA} restrictions
@cindex Restrictions for @code{JAVA}

Currently Automake enforces the restriction that only one @code{_JAVA}
primary can be used in a given @file{Makefile.am}.  The reason for this
restriction is that, in general, it isn't possible to know which
@file{.class} files were generated from which @file{.java} files, so
it would be impossible to know which files to install where.  For
instance, a @file{.java} file can define multiple classes; the resulting
@file{.class} file names cannot be predicted without parsing the
@file{.java} file.

There are a few variables that are used when compiling Java sources:

@vtable @code
@item JAVAC
The name of the Java compiler.  This defaults to @samp{javac}.

@item JAVACFLAGS
The flags to pass to the compiler.  This is considered to be a user
variable (@pxref{User Variables}).

@item AM_JAVACFLAGS
More flags to pass to the Java compiler.  This, and not
@code{JAVACFLAGS}, should be used when it is necessary to put Java
compiler flags into @file{Makefile.am}.

@item JAVAROOT
The value of this variable is passed to the @option{-d} option to
@code{javac}.  It defaults to @samp{$(top_builddir)}.

@item CLASSPATH_ENV
This variable is a shell expression that is used to set the
@env{CLASSPATH} environment variable on the @code{javac} command line.
(In the future we will probably handle class path setting differently.)
@end vtable


@node Python
@section Python

@cindex @code{_PYTHON} primary, defined
@cindex @code{PYTHON} primary, defined
@cindex Primary variable, @code{PYTHON}
@vindex _PYTHON

Automake provides support for Python compilation with the
@code{PYTHON} primary.  A typical setup is to call
@code{AM_PATH_PYTHON} in @file{configure.ac} and use a line like the
following in @file{Makefile.am}:

@example
python_PYTHON = tree.py leave.py
@end example

Any files listed in a @code{_PYTHON} variable will be byte-compiled
with @command{py-compile} at install time.  @command{py-compile}
actually creates both standard (@file{.pyc}) and optimized
(@file{.pyo}) byte-compiled versions of the source files.  Note that
because byte-compilation occurs at install time, any files listed in
@code{noinst_PYTHON} will not be compiled.  Python source files are
included in the distribution by default, prepend @code{nodist_} (as in
@code{nodist_python_PYTHON}) to omit them.

Automake ships with an Autoconf macro called @code{AM_PATH_PYTHON}
that will determine some Python-related directory variables (see
below).  If you have called @code{AM_PATH_PYTHON} from
@file{configure.ac}, then you may use the variables
@c Keep in sync with primary-prefix-couples-documented-valid.sh
@code{python_PYTHON} or @code{pkgpython_PYTHON} to list Python source
files in your @file{Makefile.am}, depending on where you want your files
installed (see the definitions of @code{pythondir} and
@code{pkgpythondir} below).

@defmac AM_PATH_PYTHON (@ovar{version}, @ovar{action-if-found},
  @ovar{action-if-not-found})

Search for a Python interpreter on the system.  This macro takes three
optional arguments.  The first argument, if present, is the minimum
version of Python required for this package: @code{AM_PATH_PYTHON}
will skip any Python interpreter that is older than @var{version}.
If an interpreter is found and satisfies @var{version}, then
@var{action-if-found} is run.  Otherwise, @var{action-if-not-found} is
run.

If @var{action-if-not-found} is not specified, as in the following
example, the default is to abort @command{configure}.

@example
AM_PATH_PYTHON([2.2])
@end example

@noindent
This is fine when Python is an absolute requirement for the package.
If Python >= 2.5 was only @emph{optional} to the package,
@code{AM_PATH_PYTHON} could be called as follows.

@example
AM_PATH_PYTHON([2.5],, [:])
@end example

If the @env{PYTHON} variable is set when @code{AM_PATH_PYTHON} is
called, then that will be the only Python interpreter that is tried.

@code{AM_PATH_PYTHON} creates the following output variables based on
the Python installation found during configuration.
@end defmac

@vtable @code
@item PYTHON
The name of the Python executable, or @samp{:} if no suitable
interpreter could be found.

Assuming @var{action-if-not-found} is used (otherwise @file{./configure}
will abort if Python is absent), the value of @code{PYTHON} can be used
to setup a conditional in order to disable the relevant part of a build
as follows.

@example
AM_PATH_PYTHON(,, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
@end example

@item PYTHON_VERSION
The Python version number, in the form @var{major}.@var{minor}
(e.g., @samp{2.5}).  This is currently the value of
@samp{sys.version[:3]}.

@item PYTHON_PREFIX
The string @samp{$@{prefix@}}.  This term may be used in future work
that needs the contents of Python's @samp{sys.prefix}, but general
consensus is to always use the value from @command{configure}.

@item PYTHON_EXEC_PREFIX
The string @samp{$@{exec_prefix@}}.  This term may be used in future work
that needs the contents of Python's @samp{sys.exec_prefix}, but general
consensus is to always use the value from @command{configure}.

@item PYTHON_PLATFORM
The canonical name used by Python to describe the operating system, as
given by @samp{sys.platform}.  This value is sometimes needed when
building Python extensions.

@item pythondir
The directory name for the @file{site-packages} subdirectory of the
standard Python install tree.

@item pkgpythondir
This is the directory under @code{pythondir} that is named after the
package.  That is, it is @samp{$(pythondir)/$(PACKAGE)}.  It is provided
as a convenience.

@item pyexecdir
This is the directory where Python extension modules (shared libraries)
should be installed.  An extension module written in C could be declared
as follows to Automake:

@c Keep in sync with primary-prefix-couples-documented-valid.sh
@example
pyexec_LTLIBRARIES = quaternion.la
quaternion_la_SOURCES = quaternion.c support.c support.h
quaternion_la_LDFLAGS = -avoid-version -module
@end example

@item pkgpyexecdir
This is a convenience variable that is defined as
@samp{$(pyexecdir)/$(PACKAGE)}.
@end vtable

All of these directory variables have values that start with either
@samp{$@{prefix@}} or @samp{$@{exec_prefix@}} unexpanded.  This works
fine in @file{Makefiles}, but it makes these variables hard to use in
@file{configure}.  This is mandated by the GNU coding standards, so
that the user can run @samp{make prefix=/foo install}.  The Autoconf
manual has a section with more details on this topic
(@pxref{Installation Directory Variables, , Installation Directory
Variables, autoconf, The Autoconf Manual}).  See also @ref{Hard-Coded
Install Paths}.


@node Documentation
@chapter Building documentation

Currently Automake provides support for Texinfo and man pages.

@menu
* Texinfo::                     Texinfo
* Man Pages::                   Man pages
@end menu


@node Texinfo
@section Texinfo

@cindex @code{_TEXINFOS} primary, defined
@cindex @code{TEXINFOS} primary, defined
@cindex Primary variable, @code{TEXINFOS}
@cindex HTML output using Texinfo
@cindex PDF output using Texinfo
@cindex PS output using Texinfo
@cindex DVI output using Texinfo
@vindex _TEXINFOS
@vindex info_TEXINFOS

If the current directory contains Texinfo source, you must declare it
with the @code{TEXINFOS} primary.  Generally Texinfo files are converted
into info, and thus the @code{info_TEXINFOS} variable is most commonly used
here.  Any Texinfo source file should have the @file{.texi} extension.
Automake also accepts @file{.txi} or @file{.texinfo} extensions, but their
use is discouraged now, and will elicit runtime warnings.

Automake generates rules to build @file{.info}, @file{.dvi},
@file{.ps}, @file{.pdf} and @file{.html} files from your Texinfo
sources.  Following the GNU Coding Standards, only the @file{.info}
files are built by @samp{make all} and installed by @samp{make
install} (unless you use @option{no-installinfo}, see below).
Furthermore, @file{.info} files are automatically distributed so that
Texinfo is not a prerequisite for installing your package.

It is worth noting that, contrary to what happens with the other formats,
the generated @file{.info} files are by default placed in @code{srcdir}
rather than in the @code{builddir}.  This can be changed with the
@option{info-in-builddir} option.

@trindex dvi
@trindex html
@trindex pdf
@trindex ps
@trindex install-dvi
@trindex install-html
@trindex install-pdf
@trindex install-ps
Other documentation formats can be built on request by @samp{make
dvi}, @samp{make ps}, @samp{make pdf} and @samp{make html}, and they
can be installed with @samp{make install-dvi}, @samp{make install-ps},
@samp{make install-pdf} and @samp{make install-html} explicitly.
@samp{make uninstall} will remove everything: the Texinfo
documentation installed by default as well as all the above optional
formats.

All of these targets can be extended using @samp{-local} rules
(@pxref{Extending}).

@cindex Texinfo flag, @code{VERSION}
@cindex Texinfo flag, @code{UPDATED}
@cindex Texinfo flag, @code{EDITION}
@cindex Texinfo flag, @code{UPDATED-MONTH}

@cindex @code{VERSION} Texinfo flag
@cindex @code{UPDATED} Texinfo flag
@cindex @code{EDITION} Texinfo flag
@cindex @code{UPDATED-MONTH} Texinfo flag

@cindex @file{mdate-sh}

If the @file{.texi} file @code{@@include}s @file{version.texi}, then
that file will be automatically generated.  The file @file{version.texi}
defines four Texinfo flags you can reference using
@code{@@value@{EDITION@}}, @code{@@value@{VERSION@}},
@code{@@value@{UPDATED@}}, and @code{@@value@{UPDATED-MONTH@}}.

@table @code
@item EDITION
@itemx VERSION
Both of these flags hold the version number of your program.  They are
kept separate for clarity.

@item UPDATED
This holds the date the primary @file{.texi} file was last modified.

@item UPDATED-MONTH
This holds the name of the month in which the primary @file{.texi} file
was last modified.
@end table

The @file{version.texi} support requires the @command{mdate-sh}
script; this script is supplied with Automake and automatically
included when @command{automake} is invoked with the
@option{--add-missing} option.

If you have multiple Texinfo files, and you want to use the
@file{version.texi} feature, then you have to have a separate version
file for each Texinfo file.  Automake will treat any include in a
Texinfo file that matches @file{vers*.texi} just as an automatically
generated version file.

Sometimes an info file actually depends on more than one @file{.texi}
file.  For instance, in GNU Hello, @file{hello.texi} includes the file
@file{fdl.texi}.  You can tell Automake about these dependencies using
the @code{@var{texi}_TEXINFOS} variable.  Here is how GNU Hello does it:
@vindex TEXINFOS
@vindex _TEXINFOS

@example
info_TEXINFOS = hello.texi
hello_TEXINFOS = fdl.texi
@end example

@cindex @file{texinfo.tex}

By default, Automake requires the file @file{texinfo.tex} to appear in
the same directory as the @file{Makefile.am} file that lists the
@file{.texi} files.  If you used @code{AC_CONFIG_AUX_DIR} in
@file{configure.ac} (@pxref{Input, , Finding `configure' Input,
autoconf, The Autoconf Manual}), then @file{texinfo.tex} is looked for
there.  In both cases, @command{automake} then supplies @file{texinfo.tex} if
@option{--add-missing} is given, and takes care of its distribution.
However, if you set the @code{TEXINFO_TEX} variable (see below),
it overrides the location of the file and turns off its installation
into the source as well as its distribution.

The option @option{no-texinfo.tex} can be used to eliminate the
requirement for the file @file{texinfo.tex}.  Use of the variable
@code{TEXINFO_TEX} is preferable, however, because that allows the
@code{dvi}, @code{ps}, and @code{pdf} targets to still work.

@cindex Option, @code{no-installinfo}
@cindex Target, @code{install-info}
@cindex @code{install-info} target
@cindex @code{no-installinfo} option

@opindex no-installinfo
@trindex install-info

Automake generates an @code{install-info} rule; some people apparently
use this.  By default, info pages are installed by @samp{make
install}, so running @code{make install-info} is pointless.  This can
be prevented via the @code{no-installinfo} option.  In this case,
@file{.info} files are not installed by default, and user must
request this explicitly using @samp{make install-info}.

@vindex AM_UPDATE_INFO_DIR
By default, @code{make install-info} and @code{make uninstall-info}
will try to run the @command{install-info} program (if available) to
update (or create/remove) the @file{@code{$@{infodir@}}/dir} index.
If this is undesired, it can be prevented by exporting the
@code{AM_UPDATE_INFO_DIR} variable to "@code{no}".

The following variables are used by the Texinfo build rules.

@vtable @code
@item MAKEINFO
The name of the program invoked to build @file{.info} files.  This
variable is defined by Automake.  If the @command{makeinfo} program is
found on the system then it will be used by default; otherwise
@command{missing} will be used instead.

@item MAKEINFOHTML
The command invoked to build @file{.html} files.  Automake
defines this to @samp{$(MAKEINFO) --html}.

@item MAKEINFOFLAGS
User flags passed to each invocation of @samp{$(MAKEINFO)} and
@samp{$(MAKEINFOHTML)}.  This user variable (@pxref{User Variables}) is
not expected to be defined in any @file{Makefile}; it can be used by
users to pass extra flags to suit their needs.

@item AM_MAKEINFOFLAGS
@itemx AM_MAKEINFOHTMLFLAGS
Maintainer flags passed to each @command{makeinfo} invocation.  Unlike
@code{MAKEINFOFLAGS}, these variables are meant to be defined by
maintainers in @file{Makefile.am}.  @samp{$(AM_MAKEINFOFLAGS)} is
passed to @code{makeinfo} when building @file{.info} files; and
@samp{$(AM_MAKEINFOHTMLFLAGS)} is used when building @file{.html}
files.

@c Keep in sync with txinfo-many-output-formats.sh
For instance, the following setting can be used to obtain one single
@file{.html} file per manual, without node separators.
@example
AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
@end example

@code{AM_MAKEINFOHTMLFLAGS} defaults to @samp{$(AM_MAKEINFOFLAGS)}.
This means that defining @code{AM_MAKEINFOFLAGS} without defining
@code{AM_MAKEINFOHTMLFLAGS} will impact builds of both @file{.info}
and @file{.html} files.

@item TEXI2DVI
The name of the command that converts a @file{.texi} file into a
@file{.dvi} file.  This defaults to @samp{texi2dvi}, a script that ships
with the Texinfo package.

@item TEXI2PDF
The name of the command that translates a @file{.texi} file into a
@file{.pdf} file.  This defaults to @samp{$(TEXI2DVI) --pdf --batch}.

@item DVIPS
The name of the command that builds a @file{.ps} file out of a
@file{.dvi} file.  This defaults to @samp{dvips}.

@item TEXINFO_TEX

If your package has Texinfo files in many directories, you can use the
variable @code{TEXINFO_TEX} to tell Automake where to find the canonical
@file{texinfo.tex} for your package.  The value of this variable should
be the relative path from the current @file{Makefile.am} to
@file{texinfo.tex}:

@example
TEXINFO_TEX = ../doc/texinfo.tex
@end example
@end vtable


@node Man Pages
@section Man Pages

@cindex @code{_MANS} primary, defined
@cindex @code{MANS} primary, defined
@cindex Primary variable, @code{MANS}

@vindex _MANS
@vindex man_MANS
A package can also include man pages (but see the GNU standards on this
matter, @ref{Man Pages, , , standards, The GNU Coding Standards}.)  Man
pages are declared using the @code{MANS} primary.  Generally the
@code{man_MANS} variable is used.  Man pages are automatically installed in
the correct subdirectory of @code{mandir}, based on the file extension.

File extensions such as @file{.1c} are handled by looking for the valid
part of the extension and using that to determine the correct
subdirectory of @code{mandir}.  Valid section names are the digits
@samp{0} through @samp{9}, and the letters @samp{l} and @samp{n}.

Sometimes developers prefer to name a man page something like
@file{foo.man} in the source, and then rename it to have the correct
suffix, for example @file{foo.1}, when installing the file.  Automake
also supports this mode.  For a valid section named @var{section},
there is a corresponding directory named @samp{man@var{section}dir},
and a corresponding @code{_MANS} variable.  Files listed in such a
variable are installed in the indicated section.  If the file already
has a valid suffix, then it is installed as-is; otherwise the file
suffix is changed to match the section.

For instance, consider this example:
@example
man1_MANS = rename.man thesame.1 alsothesame.1c
@end example

@noindent
In this case, @file{rename.man} will be renamed to @file{rename.1} when
installed, but the other files will keep their names.

@cindex Target, @code{install-man}
@cindex Option, @option{no-installman}
@cindex @code{install-man} target
@cindex @option{no-installman} option
@opindex no-installman
@trindex install-man

By default, man pages are installed by @samp{make install}.  However,
since the GNU project does not require man pages, many maintainers do
not expend effort to keep the man pages up to date.  In these cases, the
@option{no-installman} option will prevent the man pages from being
installed by default.  The user can still explicitly install them via
@samp{make install-man}.

For fast installation, with many files it is preferable to use
@samp{man@var{section}_MANS} over @samp{man_MANS} as well as files that
do not need to be renamed.

Man pages are not currently considered to be source, because it is not
uncommon for man pages to be automatically generated.  Therefore they
are not automatically included in the distribution.  However, this can
be changed by use of the @code{dist_} prefix.  For instance here is
how to distribute and install the two man pages of GNU @command{cpio}
(which includes both Texinfo documentation and man pages):

@example
dist_man_MANS = cpio.1 mt.1
@end example

The @code{nobase_} prefix is meaningless for man pages and is
disallowed.

@vindex notrans_
@cindex @code{notrans_} prefix
@cindex Man page renaming, avoiding
@cindex Avoiding man page renaming

Executables and manpages may be renamed upon installation
(@pxref{Renaming}).  For manpages this can be avoided by use of the
@code{notrans_} prefix.  For instance, suppose an executable @samp{foo}
allowing to access a library function @samp{foo} from the command line.
The way to avoid renaming of the @file{foo.3} manpage is:

@example
man_MANS = foo.1
notrans_man_MANS = foo.3
@end example

@cindex @code{notrans_} and @code{dist_} or @code{nodist_}
@cindex @code{dist_} and @code{notrans_}
@cindex @code{nodist_} and @code{notrans_}

@samp{notrans_} must be specified first when used in conjunction with
either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
Control}).  For instance:

@example
notrans_dist_man3_MANS = bar.3
@end example

@node Install
@chapter What Gets Installed

@cindex Installation support
@cindex @samp{make install} support

Naturally, Automake handles the details of actually installing your
program once it has been built.  All files named by the various
primaries are automatically installed in the appropriate places when the
user runs @samp{make install}.

@menu
* Basics of Installation::      What gets installed where
* The Two Parts of Install::    Installing data and programs separately
* Extending Installation::      Adding your own rules for installation
* Staged Installs::             Installation in a temporary location
* Install Rules for the User::  Useful additional rules
@end menu

@node Basics of Installation
@section Basics of Installation

A file named in a primary is installed by copying the built file into
the appropriate directory.  The base name of the file is used when
installing.

@example
bin_PROGRAMS = hello subdir/goodbye
@end example

In this example, both @samp{hello} and @samp{goodbye} will be installed
in @samp{$(bindir)}.

Sometimes it is useful to avoid the basename step at install time.  For
instance, you might have a number of header files in subdirectories of
the source tree that are laid out precisely how you want to install
them.  In this situation you can use the @code{nobase_} prefix to
suppress the base name step.  For example:

@example
nobase_include_HEADERS = stdio.h sys/types.h
@end example

@noindent
will install @file{stdio.h} in @samp{$(includedir)} and @file{types.h}
in @samp{$(includedir)/sys}.

For most file types, Automake will install multiple files at once, while
avoiding command line length issues (@pxref{Length Limitations}).  Since
some @command{install} programs will not install the same file twice in
one invocation, you may need to ensure that file lists are unique within
one variable such as @samp{nobase_include_HEADERS} above.

You should not rely on the order in which files listed in one variable
are installed.  Likewise, to cater for parallel make, you should not
rely on any particular file installation order even among different
file types (library dependencies are an exception here).


@node The Two Parts of Install
@section The Two Parts of Install

Automake generates separate @code{install-data} and @code{install-exec}
rules, in case the installer is installing on multiple machines that
share directory structure---these targets allow the machine-independent
parts to be installed only once.  @code{install-exec} installs
platform-dependent files, and @code{install-data} installs
platform-independent files.  The @code{install} target depends on both
of these targets.  While Automake tries to automatically segregate
objects into the correct category, the @file{Makefile.am} author is, in
the end, responsible for making sure this is done correctly.
@trindex install-data
@trindex install-exec
@trindex install
@cindex Install, two parts of

Variables using the standard directory prefixes @samp{data},
@samp{info}, @samp{man}, @samp{include}, @samp{oldinclude},
@samp{pkgdata}, or @samp{pkginclude} are installed by
@code{install-data}.

Variables using the standard directory prefixes @samp{bin},
@samp{sbin}, @samp{libexec}, @samp{sysconf}, @samp{localstate},
@samp{lib}, or @samp{pkglib} are installed by @code{install-exec}.

For instance, @code{data_DATA} files are installed by @code{install-data},
while @code{bin_PROGRAMS} files are installed by @code{install-exec}.

Any variable using a user-defined directory prefix with
@samp{exec} in the name (e.g.,
@c Keep in sync with primary-prefix-couples-documented-valid.sh
@code{myexecbin_PROGRAMS}) is installed by @code{install-exec}.  All
other user-defined prefixes are installed by @code{install-data}.

@node Extending Installation
@section Extending Installation

It is possible to extend this mechanism by defining an
@code{install-exec-local} or @code{install-data-local} rule.  If these
rules exist, they will be run at @samp{make install} time.  These
rules can do almost anything; care is required.
@trindex install-exec-local
@trindex install-data-local

Automake also supports two install hooks, @code{install-exec-hook} and
@code{install-data-hook}.  These hooks are run after all other install
rules of the appropriate type, exec or data, have completed.  So, for
instance, it is possible to perform post-installation modifications
using an install hook.  @xref{Extending}, for some examples.
@cindex Install hook

@node Staged Installs
@section Staged Installs

@vindex DESTDIR
Automake generates support for the @code{DESTDIR} variable in all
install rules.  @code{DESTDIR} is used during the @samp{make install}
step to relocate install objects into a staging area.  Each object and
path is prefixed with the value of @code{DESTDIR} before being copied
into the install area.  Here is an example of typical DESTDIR usage:

@example
mkdir /tmp/staging &&
make DESTDIR=/tmp/staging install
@end example

The @command{mkdir} command avoids a security problem if the attacker
creates a symbolic link from @file{/tmp/staging} to a victim area;
then @command{make} places install objects in a directory tree built under
@file{/tmp/staging}.  If @file{/gnu/bin/foo} and
@file{/gnu/share/aclocal/foo.m4} are to be installed, the above command
would install @file{/tmp/staging/gnu/bin/foo} and
@file{/tmp/staging/gnu/share/aclocal/foo.m4}.

This feature is commonly used to build install images and packages
(@pxref{DESTDIR}).

Support for @code{DESTDIR} is implemented by coding it directly into
the install rules.  If your @file{Makefile.am} uses a local install
rule (e.g., @code{install-exec-local}) or an install hook, then you
must write that code to respect @code{DESTDIR}.

@xref{Makefile Conventions, , , standards, The GNU Coding Standards},
for another usage example.

@node Install Rules for the User
@section Install Rules for the User

Automake also generates rules for targets @code{uninstall},
@code{installdirs}, and @code{install-strip}.
@trindex uninstall
@trindex installdirs
@trindex install-strip

Automake supports @code{uninstall-local} and @code{uninstall-hook}.
There is no notion of separate uninstalls for ``exec'' and ``data'', as
these features would not provide additional functionality.

Note that @code{uninstall} is not meant as a replacement for a real
packaging tool.


@node Clean
@chapter What Gets Cleaned

@cindex @samp{make clean} support

The GNU Makefile Standards specify a number of different clean rules.
@xref{Standard Targets, , Standard Targets for Users, standards,
The GNU Coding Standards}.

Generally the files that can be cleaned are determined automatically by
Automake.  Of course, Automake also recognizes some variables that can
be defined to specify additional files to clean.  These variables are
@code{MOSTLYCLEANFILES}, @code{CLEANFILES}, @code{DISTCLEANFILES}, and
@code{MAINTAINERCLEANFILES}.
@vindex MOSTLYCLEANFILES
@vindex CLEANFILES
@vindex DISTCLEANFILES
@vindex MAINTAINERCLEANFILES

@trindex mostlyclean-local
@trindex clean-local
@trindex distclean-local
@trindex maintainer-clean-local
When cleaning involves more than deleting some hard-coded list of
files, it is also possible to supplement the cleaning rules with your
own commands.  Simply define a rule for any of the
@code{mostlyclean-local}, @code{clean-local}, @code{distclean-local},
or @code{maintainer-clean-local} targets (@pxref{Extending}).  A common
case is deleting a directory, for instance, a directory created by the
test suite:

@example
clean-local:
        -rm -rf testSubDir
@end example

Since @command{make} allows only one set of rules for a given target,
a more extensible way of writing this is to use a separate target
listed as a dependency:

@example
clean-local: clean-local-check
.PHONY: clean-local-check
clean-local-check:
        -rm -rf testSubDir
@end example

As the GNU Standards aren't always explicit as to which files should
be removed by which rule, we've adopted a heuristic that we believe
was first formulated by Fran@,{c}ois Pinard:

@itemize @bullet
@item
If @command{make} built it, and it is commonly something that one would
want to rebuild (for instance, a @file{.o} file), then
@code{mostlyclean} should delete it.

@item
Otherwise, if @command{make} built it, then @code{clean} should delete it.

@item
If @command{configure} built it, then @code{distclean} should delete it.

@item
If the maintainer built it (for instance, a @file{.info} file), then
@code{maintainer-clean} should delete it.  However
@code{maintainer-clean} should not delete anything that needs to exist
in order to run @samp{./configure && make}.
@end itemize

We recommend that you follow this same set of heuristics in your
@file{Makefile.am}.


@node Dist
@chapter What Goes in a Distribution

@menu
* Basics of Distribution::      Files distributed by default
* Fine-grained Distribution Control::  @code{dist_} and @code{nodist_} prefixes
* The dist Hook::               A target for last-minute distribution changes
* Checking the Distribution::   @samp{make distcheck} explained
* The Types of Distributions::  A variety of formats and compression methods
@end menu

@node Basics of Distribution
@section Basics of Distribution

@cindex @samp{make dist}

@vindex PACKAGE
@vindex VERSION
@trindex dist
The @code{dist} rule in the generated @file{Makefile.in} can be used
to generate a gzipped @code{tar} file and other flavors of archive for
distribution.  The file is named based on the @code{PACKAGE} and
@code{VERSION} variables automatically defined by either the
@code{AC_INIT} invocation or by a @emph{deprecated} two-arguments
invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros}
for how these variables get their values, from either defaults or explicit
values -- it's slightly trickier than one would expect).
More precisely the gzipped @code{tar} file is named
@samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}.
@vindex GZIP_ENV
You can use the @command{make} variable @code{GZIP_ENV} to control how gzip
is run.  The default setting is @option{--best}.

@cindex @code{m4_include}, distribution
@cindex @code{include}, distribution
@acindex m4_include
@cmindex include
For the most part, the files to distribute are automatically found by
Automake: all source files are automatically included in a distribution,
as are all @file{Makefile.am} and @file{Makefile.in} files.  Automake also
has a built-in list of commonly used files that are automatically
included if they are found in the current directory (either physically,
or as the target of a @file{Makefile.am} rule); this list is printed by
@samp{automake --help}.  Note that some files in this list are actually
distributed only if other certain conditions hold (for example,
@c Keep in sync with autodist-config-headers.sh
the @file{config.h.top} and @file{config.h.bot} files are automatically
distributed only if, e.g., @samp{AC_CONFIG_HEADERS([config.h])} is used
in @file{configure.ac}).  Also, files that are read by @command{configure}
(i.e.@: the source files corresponding to the files specified in various
Autoconf macros such as @code{AC_CONFIG_FILES} and siblings) are
automatically distributed.  Files included in a @file{Makefile.am} (using
@code{include}) or in @file{configure.ac} (using @code{m4_include}), and
helper scripts installed with @samp{automake --add-missing} are also
distributed.

@vindex EXTRA_DIST
Still, sometimes there are files that must be distributed, but which
are not covered in the automatic rules.  These files should be listed in
the @code{EXTRA_DIST} variable.  You can mention files from
subdirectories in @code{EXTRA_DIST}.

You can also mention a directory in @code{EXTRA_DIST}; in this case the
entire directory will be recursively copied into the distribution.
Please note that this will also copy @emph{everything} in the directory,
including, e.g., Subversion's @file{.svn} private directories or CVS/RCS
version control files; thus we recommend against using this feature
as-is.  However, you can use the @code{dist-hook} feature to
ameliorate the problem; @pxref{The dist Hook}.

@vindex SUBDIRS
@vindex DIST_SUBDIRS
If you define @code{SUBDIRS}, Automake will recursively include the
subdirectories in the distribution.  If @code{SUBDIRS} is defined
conditionally (@pxref{Conditionals}), Automake will normally include
all directories that could possibly appear in @code{SUBDIRS} in the
distribution.  If you need to specify the set of directories
conditionally, you can set the variable @code{DIST_SUBDIRS} to the
exact list of subdirectories to include in the distribution
(@pxref{Conditional Subdirectories}).


@node Fine-grained Distribution Control
@section Fine-grained Distribution Control

@vindex dist_
@vindex nodist_
Sometimes you need tighter control over what does @emph{not} go into the
distribution; for instance, you might have source files that are
generated and that you do not want to distribute.  In this case
Automake gives fine-grained control using the @code{dist} and
@code{nodist} prefixes.  Any primary or @code{_SOURCES} variable can be
prefixed with @code{dist_} to add the listed files to the distribution.
Similarly, @code{nodist_} can be used to omit the files from the
distribution.

As an example, here is how you would cause some data to be distributed
while leaving some source code out of the distribution:

@example
dist_data_DATA = distribute-this
bin_PROGRAMS = foo
nodist_foo_SOURCES = do-not-distribute.c
@end example

@node The dist Hook
@section The dist Hook

@trindex dist-hook

Occasionally it is useful to be able to change the distribution before
it is packaged up.  If the @code{dist-hook} rule exists, it is run
after the distribution directory is filled, but before the actual
distribution archives are created.  One way to use this is for
removing unnecessary files that get recursively included by specifying
a directory in @code{EXTRA_DIST}:

@example
EXTRA_DIST = doc
dist-hook:
        rm -rf `find $(distdir)/doc -type d -name .svn`
@end example

@c The caveats described here should be documented in 'disthook.sh'.
@noindent
Note that the @code{dist-hook} recipe shouldn't assume that the regular
files in the distribution directory are writable; this might not be the
case if one is packaging from a read-only source tree, or when a
@code{make distcheck} is being done.  For similar reasons, the recipe
shouldn't assume that the subdirectories put into the distribution
directory as effect of having them listed in @code{EXTRA_DIST} are
writable.  So, if the @code{dist-hook} recipe wants to modify the
content of an existing file (or @code{EXTRA_DIST} subdirectory) in the
distribution directory, it should explicitly to make it writable first:

@example
EXTRA_DIST = README doc
dist-hook:
        chmod u+w $(distdir)/README $(distdir)/doc
        echo "Distribution date: `date`" >> README
        rm -f $(distdir)/doc/HACKING
@end example

@vindex distdir
@vindex top_distdir
Two variables that come handy when writing @code{dist-hook} rules are
@samp{$(distdir)} and @samp{$(top_distdir)}.

@samp{$(distdir)} points to the directory where the @code{dist} rule
will copy files from the current directory before creating the
tarball.  If you are at the top-level directory, then @samp{distdir =
$(PACKAGE)-$(VERSION)}.  When used from subdirectory named
@file{foo/}, then @samp{distdir = ../$(PACKAGE)-$(VERSION)/foo}.
@samp{$(distdir)} can be a relative or absolute path, do not assume
any form.

@samp{$(top_distdir)} always points to the root directory of the
distributed tree.  At the top-level it's equal to @samp{$(distdir)}.
In the @file{foo/} subdirectory
@samp{top_distdir = ../$(PACKAGE)-$(VERSION)}.
@samp{$(top_distdir)} too can be a relative or absolute path.

Note that when packages are nested using @code{AC_CONFIG_SUBDIRS}
(@pxref{Subpackages}), then @samp{$(distdir)} and
@samp{$(top_distdir)} are relative to the package where @samp{make
dist} was run, not to any sub-packages involved.

@node Checking the Distribution
@section Checking the Distribution

@cindex @samp{make distcheck}
@trindex distcheck
Automake also generates a @code{distcheck} rule that can be of help
to ensure that a given distribution will actually work.  Simplifying
a bit, we can say this rule first makes a distribution, and then,
@emph{operating from it}, takes the following steps:
@itemize
@item
tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the
@code{srcdir} and all its content made @emph{read-only};
@item
runs the test suite (with @command{make check}) on this fresh build;
@item
installs the package in a temporary directory (with @command{make
install}), and tries runs the test suite on the resulting installation
(with @command{make installcheck});
@item
checks that the package can be correctly uninstalled (by @command{make
uninstall}) and cleaned (by @code{make distclean});
@item
finally, makes another tarball to ensure the distribution is
self-contained.
@end itemize

All of these actions are performed in a temporary directory.  Please
note that the exact location and the exact structure of such a directory
(where the read-only sources are placed, how the temporary build and
install directories are named and how deeply they are nested, etc.) is
to be considered an implementation detail, which can change at any time;
so do not reply on it.

@vindex AM_DISTCHECK_CONFIGURE_FLAGS
@vindex DISTCHECK_CONFIGURE_FLAGS
@subheading DISTCHECK_CONFIGURE_FLAGS
Building the package involves running @samp{./configure}.  If you need
to supply additional flags to @command{configure}, define them in the
@code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level
@file{Makefile.am}.  The user can still extend or override the flags
provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable,
on the command line when invoking @command{make}.
@c See automake bug#14991 for more details about how the following holds.
It's worth noting that @command{make distcheck} needs complete control
over the @command{configure} options @option{--srcdir} and
@option{--prefix}, so those options cannot be overridden by
@code{AM_DISTCHECK_CONFIGURE_FLAGS} nor by
@code{DISTCHECK_CONFIGURE_FLAGS}.

Also note that developers are encouraged to strive to make their code
buildable without requiring any special configure option; thus, in
general, you shouldn't define @code{AM_DISTCHECK_CONFIGURE_FLAGS}.
However, there might be few scenarios in which the use of this variable
is justified.
GNU @command{m4} offers an example.  GNU @command{m4} configures by
default with its experimental and seldom used "changeword" feature
disabled; so in its case it is useful to have @command{make distcheck}
run configure with the @option{--with-changeword} option, to ensure that
the code for changeword support still compiles correctly.
GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS}
variable to stress-test the use of @option{--program-prefix=g}, since at
one point the @command{m4} build system had a bug where @command{make
installcheck} was wrongly assuming it could blindly test "@command{m4}",
rather than the just-installed "@command{gm4}".

@trindex distcheck-hook
@subheading distcheck-hook
If the @code{distcheck-hook} rule is defined in your top-level
@file{Makefile.am}, then it will be invoked by @code{distcheck} after
the new distribution has been unpacked, but before the unpacked copy
is configured and built.  Your @code{distcheck-hook} can do almost
anything, though as always caution is advised.  Generally this hook is
used to check for potential distribution errors not caught by the
standard mechanism.  Note that @code{distcheck-hook} as well as
@code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
are not honored in a subpackage @file{Makefile.am}, but the flags from
@code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
are passed down to the @command{configure} script of the subpackage.

@cindex @samp{make distcleancheck}
@trindex distcleancheck
@vindex DISTCLEANFILES
@vindex distcleancheck_listfiles

@subheading distcleancheck
Speaking of potential distribution errors, @code{distcheck} also
ensures that the @code{distclean} rule actually removes all built
files.  This is done by running @samp{make distcleancheck} at the end of
the @code{VPATH} build.  By default, @code{distcleancheck} will run
@code{distclean} and then make sure the build tree has been emptied by
running @samp{$(distcleancheck_listfiles)}.  Usually this check will
find generated files that you forgot to add to the @code{DISTCLEANFILES}
variable (@pxref{Clean}).

The @code{distcleancheck} behavior should be OK for most packages,
otherwise you have the possibility to override the definition of
either the @code{distcleancheck} rule, or the
@samp{$(distcleancheck_listfiles)} variable.  For instance, to disable
@code{distcleancheck} completely, add the following rule to your
top-level @file{Makefile.am}:

@example
distcleancheck:
        @@:
@end example

If you want @code{distcleancheck} to ignore built files that have not
been cleaned because they are also part of the distribution, add the
following definition instead:

@c Keep in sync with distcleancheck.sh
@example
distcleancheck_listfiles = \
  find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
       sh '@{@}' ';'
@end example

The above definition is not the default because it's usually an error if
your Makefiles cause some distributed files to be rebuilt when the user
build the package.  (Think about the user missing the tool required to
build the file; or if the required tool is built by your package,
consider the cross-compilation case where it can't be run.)  There is
an entry in the FAQ about this (@pxref{Errors with distclean}), make
sure you read it before playing with @code{distcleancheck_listfiles}.

@cindex @samp{make distuninstallcheck}
@trindex distuninstallcheck
@vindex distuninstallcheck_listfiles

@subheading distuninstallcheck
@code{distcheck} also checks that the @code{uninstall} rule works
properly, both for ordinary and @code{DESTDIR} builds.  It does this
by invoking @samp{make uninstall}, and then it checks the install tree
to see if any files are left over.  This check will make sure that you
correctly coded your @code{uninstall}-related rules.

By default, the checking is done by the @code{distuninstallcheck} rule,
and the list of files in the install tree is generated by
@samp{$(distuninstallcheck_listfiles)} (this is a variable whose value is
a shell command to run that prints the list of files to stdout).

Either of these can be overridden to modify the behavior of
@code{distcheck}.  For instance, to disable this check completely, you
would write:

@example
distuninstallcheck:
        @@:
@end example

@node The Types of Distributions
@section The Types of Distributions

Automake generates rules to provide archives of the project for
distributions in various formats.  Their targets are:

@table @asis
@item @code{dist-gzip}
Generate a @samp{gzip} tar archive of the distribution.  This is the
only format enabled by default.
@trindex dist-gzip

@vindex BZIP2
@item @code{dist-bzip2}
Generate a @samp{bzip2} tar archive of the distribution.  bzip2 archives
are frequently smaller than gzipped archives.
By default, this rule makes @samp{bzip2} use a compression option of @option{-9}.
To make it use a different one, set the @env{BZIP2} environment variable.
For example, @samp{make dist-bzip2 BZIP2=-7}.
@trindex dist-bzip2

@item @code{dist-lzip}
Generate an @samp{lzip} tar archive of the distribution.  @command{lzip}
archives are frequently smaller than @command{bzip2}-compressed archives.
@trindex dist-lzip

@vindex XZ_OPT
@item @code{dist-xz}
Generate an @samp{xz} tar archive of the distribution.  @command{xz}
archives are frequently smaller than @command{bzip2}-compressed archives.
By default, this rule makes @samp{xz} use a compression option of
@option{-e}.  To make it use a different one, set the @env{XZ_OPT}
environment variable.  For example, run this command to use the
default compression ratio, but with a progress indicator:
@samp{make dist-xz XZ_OPT=-ve}.
@trindex dist-xz

@item @code{dist-zip}
Generate a @samp{zip} archive of the distribution.
@trindex dist-zip

@item @code{dist-tarZ}
Generate a tar archive of the distribution, compressed with the
historical (and obsolescent) program @command{compress}.  This
option is deprecated, and it and the corresponding functionality
will be removed altogether in Automake 2.0.
@trindex dist-tarZ

@item @code{dist-shar}
Generate a @samp{shar} archive of the distribution.  This format
archive is obsolescent, and use of this option is deprecated.
It and the corresponding functionality will be removed altogether
in Automake 2.0.
@trindex dist-shar

@end table

The rule @code{dist} (and its historical synonym @code{dist-all})
will create archives in all the enabled formats (@pxref{List of
Automake options} for how to change this list).  By default, only
the @code{dist-gzip} target is hooked to @code{dist}.


@node Tests
@chapter Support for test suites

@cindex Test suites
@cindex @code{make check}
@trindex check

Automake can generate code to handle two kinds of test suites.  One is
based on integration with the @command{dejagnu} framework.  The other
(and most used) form is based on the use of generic test scripts, and
its activation is triggered by the definition of the special @code{TESTS}
variable.  This second form allows for various degrees of sophistication
and customization; in particular, it allows for concurrent execution
of test scripts, use of established test protocols such as TAP, and
definition of custom test drivers and test runners.

@noindent
In either case, the testsuite is invoked via @samp{make check}.

@menu
* Generalities about Testing::  Concepts and terminology about testing
* Simple Tests::                Listing test scripts in @code{TESTS}
* Custom Test Drivers::         Writing and using custom test drivers
* Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
* DejaGnu Tests::               Interfacing with the @command{dejagnu} testing framework
* Install Tests::               Running tests on installed packages
@end menu

@node Generalities about Testing
@section Generalities about Testing

The purpose of testing is to determine whether a program or system behaves
as expected (e.g., known inputs produce the expected outputs, error
conditions are correctly handled or reported, and older bugs do not
resurface).

@cindex test case
The minimal unit of testing is usually called @emph{test case}, or simply
@emph{test}.  How a test case is defined or delimited, and even what
exactly @emph{constitutes} a test case, depends heavily on the testing
paradigm and/or framework in use, so we won't attempt any more precise
definition.  The set of the test cases for a given program or system
constitutes its @emph{testsuite}.

@cindex test harness
@cindex testsuite harness
A @emph{test harness} (also @emph{testsuite harness}) is a program or
software component that executes all (or part of) the defined test cases,
analyzes their outcomes, and report or register these outcomes
appropriately.  Again, the details of how this is accomplished (and how
the developer and user can influence it or interface with it) varies
wildly, and we'll attempt no precise definition.

@cindex test pass
@cindex test failure
A test is said to @emph{pass} when it can determine that the condition or
behaviour it means to verify holds, and is said to @emph{fail} when it can
determine that such condition of behaviour does @emph{not} hold.

@cindex test skip
Sometimes, tests can rely on non-portable tools or prerequisites, or
simply make no sense on a given system (for example, a test checking a
Windows-specific feature makes no sense on a GNU/Linux system).  In this
case, accordingly to the definition above, the tests can neither be
considered passed nor failed; instead, they are @emph{skipped} -- i.e.,
they are not run, or their result is anyway ignored for what concerns
the count of failures an successes.  Skips are usually explicitly
reported though, so that the user will be aware that not all of the
testsuite has really run.

@cindex xfail
@cindex expected failure
@cindex expected test failure
@cindex xpass
@cindex unexpected pass
@cindex unexpected test pass
It's not uncommon, especially during early development stages, that some
tests fail for known reasons, and that the developer doesn't want to
tackle these failures immediately (this is especially true when the
failing tests deal with corner cases).  In this situation, the better
policy is to declare that each of those failures is an @emph{expected
failure} (or @emph{xfail}).  In case a test that is expected to fail ends
up passing instead, many testing environments will flag the result as a
special kind of failure called @emph{unexpected pass} (or @emph{xpass}).

@cindex hard error
@cindex Distinction between errors and failures in testsuites
Many testing environments and frameworks distinguish between test failures
and hard errors.  As we've seen, a test failure happens when some invariant
or expected behaviour of the software under test is not met.  An @emph{hard
error} happens when e.g., the set-up of a test case scenario fails, or when
some other unexpected or highly undesirable condition is encountered (for
example, the program under test experiences a segmentation fault).

@node Simple Tests
@section Simple Tests

@menu
* Scripts-based Testsuites::    Automake-specific concepts and terminology
* Serial Test Harness::         Older (and discouraged) serial test harness
* Parallel Test Harness::       Generic concurrent test harness
@end menu

@node Scripts-based Testsuites
@subsection Scripts-based Testsuites

If the special variable @code{TESTS} is defined, its value is taken to be
a list of programs or scripts to run in order to do the testing.  Under
the appropriate circumstances, it's possible for @code{TESTS} to list
also data files to be passed to one or more test scripts defined by
different means (the so-called ``log compilers'', @pxref{Parallel Test
Harness}).

Test scripts can be executed serially or concurrently.  Automake supports
both these kinds of test execution, with the parallel test harness being
the default.  The concurrent test harness relies on the concurrence
capabilities (if any) offered by the underlying @command{make}
implementation, and can thus only be as good as those are.

By default, only the exit statuses of the test scripts are considered when
determining the testsuite outcome.  But Automake allows also the use of
more complex test protocols, either standard (@pxref{Using the TAP test
protocol}) or custom (@pxref{Custom Test Drivers}).  Note that you can't
enable such protocols when the serial harness is used, though.
In the rest of this section we are going to concentrate mostly on
protocol-less tests, since we cover test protocols in a later section
(again, @pxref{Custom Test Drivers}).

@cindex Exit status 77, special interpretation
@cindex Exit status 99, special interpretation
When no test protocol is in use, an exit status of 0 from a test script will
denote a success, an exit status of 77 a skipped test, an exit status of 99
an hard error, and any other exit status will denote a failure.

@cindex Tests, expected failure
@cindex Expected test failure
@vindex XFAIL_TESTS
@vindex DISABLE_HARD_ERRORS
@cindex Disabling hard errors
You may define the variable @code{XFAIL_TESTS} to a list of tests
(usually a subset of @code{TESTS}) that are expected to fail; this will
effectively reverse the result of those tests (with the provision that
skips and hard errors remain untouched).  You may also instruct the
testsuite harness to treat hard errors like simple failures, by defining
the @code{DISABLE_HARD_ERRORS} make variable to a nonempty value.

Note however that, for tests based on more complex test protocols,
the exact effects of @code{XFAIL_TESTS} and @code{DISABLE_HARD_ERRORS}
might change, or they might even have no effect at all (for example,
@c Keep this in sync with tap-no-disable-hard-errors.sh
in tests using TAP, there is no way to disable hard errors, and the
@code{DISABLE_HARD_ERRORS} variable has no effect on them).

@anchor{Testsuite progress on console}
@cindex Testsuite progress on console
The result of each test case run by the scripts in @code{TESTS} will be
printed on standard output, along with the test name.  For test protocols
that allow more test cases per test script (such as TAP), a number,
identifier and/or brief description specific for the single test case is
expected to be printed in addition to the name of the test script.  The
possible results (whose meanings should be clear from the previous
@ref{Generalities about Testing}) are @code{PASS}, @code{FAIL},
@code{SKIP}, @code{XFAIL}, @code{XPASS} and @code{ERROR}.  Here is an
example of output from an hypothetical testsuite that uses both plain
and TAP tests:
@c Keep in sync with tap-doc.sh
@example
PASS: foo.sh
PASS: zardoz.tap 1 - Daemon started
PASS: zardoz.tap 2 - Daemon responding
SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted
PASS: zardoz.tap 4 - Daemon stopped
SKIP: bar.sh
PASS: mu.tap 1
XFAIL: mu.tap 2 # TODO frobnication not yet implemented
@end example

@noindent
A testsuite summary (expected to report at least the number of run,
skipped and failed tests) will be printed at the end of the testsuite
run.

@anchor{Simple tests and color-tests}
@vindex AM_COLOR_TESTS
@cindex Colorized testsuite output
If the standard output is connected to a capable terminal, then the test
results and the summary are colored appropriately.  The developer and the
user can disable colored output by setting the @command{make} variable
@samp{AM_COLOR_TESTS=no}; the user can in addition force colored output
even without a connecting terminal with @samp{AM_COLOR_TESTS=always}.
It's also worth noting that some @command{make} implementations,
when used in parallel mode, have slightly different semantics
(@pxref{Parallel make,,, autoconf, The Autoconf Manual}), which can
break the automatic detection of a connection to a capable terminal.
If this is the case, the user will have to resort to the use of
@samp{AM_COLOR_TESTS=always} in order to have the testsuite output
colorized.

Test programs that need data files should look for them in @code{srcdir}
(which is both a make variable and an environment variable made available
to the tests), so that they work when building in a separate directory
(@pxref{Build Directories, , Build Directories , autoconf,
The Autoconf Manual}), and in particular for the @code{distcheck} rule
(@pxref{Checking the Distribution}).

@vindex TESTS
@vindex TESTS_ENVIRONMENT
@vindex AM_TESTS_ENVIRONMENT
The @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables can
be used to run initialization code and set environment variables for the
test scripts.  The former variable is developer-reserved, and can be
defined in the @file{Makefile.am}, while the latter is reserved for the
user, which can employ it to extend or override the settings in the
former; for this to work portably, however, the contents of a non-empty
@code{AM_TESTS_ENVIRONMENT} @emph{must} be terminated by a semicolon.

@vindex AM_TESTS_FD_REDIRECT
The @code{AM_TESTS_FD_REDIRECT} variable can be used to define file
descriptor redirections for the test scripts.  One might think that
@code{AM_TESTS_ENVIRONMENT} could be used for this purpose, but experience
has shown that doing so portably is practically impossible.  The main
hurdle is constituted by Korn shells, which usually set the close-on-exec
flag on file descriptors opened with the @command{exec} builtin, thus
rendering an idiom like @code{AM_TESTS_ENVIRONMENT = exec 9>&2;}
ineffectual.  This issue also affects some Bourne shells, such as the
HP-UX's @command{/bin/sh},

@c Keep in sync with tests-environment-backcompat.sh
@example
AM_TESTS_ENVIRONMENT = \
## Some environment initializations are kept in a separate shell
## file 'tests-env.sh', which can make it easier to also run tests
## from the command line.
  . $(srcdir)/tests-env.sh; \
## On Solaris, prefer more POSIX-compliant versions of the standard
## tools by default.
  if test -d /usr/xpg4/bin; then \
    PATH=/usr/xpg4/bin:$$PATH; export PATH; \
  fi;
@c $$ restore font-lock
## With this, the test scripts will be able to print diagnostic
## messages to the original standard error stream, even if the test
## driver redirects the stderr of the test scripts to a log file
## before executing them.
AM_TESTS_FD_REDIRECT = 9>&2
@end example

@noindent
Note however that @code{AM_TESTS_ENVIRONMENT} is, for historical and
implementation reasons, @emph{not} supported by the serial harness
(@pxref{Serial Test Harness}).

Automake ensures that each file listed in @code{TESTS} is built before
it is run; you can list both source and derived programs (or scripts)
in @code{TESTS}; the generated rule will look both in @code{srcdir} and
@file{.}.  For instance, you might want to run a C program as a test.
To do this you would list its name in @code{TESTS} and also in
@code{check_PROGRAMS}, and then specify it as you would any other
program.

Programs listed in @code{check_PROGRAMS} (and @code{check_LIBRARIES},
@code{check_LTLIBRARIES}...) are only built during @code{make check},
not during @code{make all}.  You should list there any program needed
by your tests that does not need to be built by @code{make all}.  Note
that @code{check_PROGRAMS} are @emph{not} automatically added to
@code{TESTS} because @code{check_PROGRAMS} usually lists programs used
by the tests, not the tests themselves.  Of course you can set
@code{TESTS = $(check_PROGRAMS)} if all your programs are test cases.

@node Serial Test Harness
@subsection Older (and discouraged) serial test harness
@cindex @option{serial-tests}, Using

First, note that today the use of this harness is strongly discouraged in
favour of the parallel test harness (@pxref{Parallel Test Harness}).
Still, there are @emph{few} situations when the advantages offered by
the parallel harness are irrelevant, and when test concurrency can
even cause tricky problems.  In those cases, it might make sense to
still use the serial harness, for simplicity and reliability (we still
suggest trying to give the parallel harness a shot though).

The serial test harness is enabled by the Automake option
@option{serial-tests}. It operates by simply running the tests serially,
one at the time, without any I/O redirection.  It's up to the user to
implement logging of tests' output, if that's required or desired.

For historical and implementation reasons, the @code{AM_TESTS_ENVIRONMENT}
variable is @emph{not} supported by this harness (it will be silently
ignored if defined); only @code{TESTS_ENVIRONMENT} is, and it is to be
considered a developer-reserved variable.  This is done so that, when
using the serial harness, @code{TESTS_ENVIRONMENT} can be defined to an
invocation of an interpreter through which the tests are to be run.
For instance, the following setup may be used to run tests with Perl:

@example
TESTS_ENVIRONMENT = $(PERL) -Mstrict -w
TESTS = foo.pl bar.pl baz.pl
@end example

@noindent
It's important to note that the use of @code{TESTS_ENVIRONMENT} endorsed
here would be @emph{invalid} with the parallel harness.  That harness
provides a more elegant way to achieve the same effect, with the further
benefit of freeing the @code{TESTS_ENVIRONMENT} variable for the user
(@pxref{Parallel Test Harness}).

Another, less serious limit of the serial harness is that it doesn't
really distinguish between simple failures and hard errors; this is
due to historical reasons only, and might be fixed in future Automake
versions.

@node Parallel Test Harness
@subsection Parallel Test Harness

By default, Automake generated a parallel (concurrent) test harness.  It
features automatic collection of the test scripts output in @file{.log}
files, concurrent execution of tests with @code{make -j}, specification
of inter-test dependencies, lazy reruns of tests that have not completed
in a prior run, and hard errors for exceptional failures.

@anchor{Basics of test metadata}
@vindex TEST_SUITE_LOG
@vindex TESTS
@cindex @file{.log} files
@cindex @file{.trs} files
@cindex test metadata
The parallel test harness operates by defining a set of @command{make}
rules that run the test scripts listed in @code{TESTS}, and, for each
such script, save its output in a corresponding @file{.log} file and
its results (and other ``metadata'', @pxref{API for Custom Test Drivers})
in a corresponding @file{.trs} (as in @b{T}est @b{R}e@b{S}ults) file.
@c We choose the '.trs' extension also because, at the time of writing,
@c it isn't already used for other significant purposes; see e.g.:
@c   - http://filext.com/file-extension/trs
@c   - http://www.file-extensions.org/search/?searchstring=trs
The @file{.log} file will contain all the output emitted by the test on
its standard output and its standard error.  The @file{.trs} file will
contain, among the other things, the results of the test cases run by
the script.

The parallel test harness will also create a summary log file,
@code{TEST_SUITE_LOG}, which defaults to @file{test-suite.log} and requires
a @file{.log} suffix.  This file depends upon all the @file{.log} and
@file{.trs} files created for the test scripts listed in @code{TESTS}.

@vindex VERBOSE
As with the serial harness above, by default one status line is printed
per completed test, and a short summary after the suite has completed.
However, standard output and standard error of the test are redirected
to a per-test log file, so that parallel execution does not produce
intermingled output.  The output from failed tests is collected in the
@file{test-suite.log} file.  If the variable @samp{VERBOSE} is set, this
file is output after the summary.

@vindex TEST_EXTENSIONS
@vindex TEST_LOGS
Each couple of @file{.log} and @file{.trs} files is created when the
corresponding test has completed.  The set of log files is listed in
the read-only variable @code{TEST_LOGS}, and defaults to @code{TESTS},
with the executable extension if any (@pxref{EXEEXT}), as well as any
suffix listed in @code{TEST_EXTENSIONS} removed, and @file{.log} appended.
Results are undefined if a test file name ends in several concatenated
suffixes.  @code{TEST_EXTENSIONS} defaults to @file{.test}; it can be
overridden by the user, in which case any extension listed in it must be
constituted by a dot, followed by a non-digit alphabetic character,
followed by any number of alphabetic characters.
@c Keep in sync with test-extensions.sh
For example, @samp{.sh}, @samp{.T} and @samp{.t1} are valid extensions,
while @samp{.x-y}, @samp{.6c} and @samp{.t.1} are not.

@cindex Configure substitutions in @code{TESTS}
It is important to note that, due to current limitations (unlikely to be
lifted), configure substitutions in the definition of @code{TESTS} can
only work if they will expand to a list of tests that have a suffix listed
in @code{TEST_EXTENSIONS}.

@vindex _LOG_COMPILE
@vindex _LOG_COMPILER
@vindex _LOG_FLAGS
@vindex LOG_COMPILE
@vindex LOG_COMPILER
@vindex LOG_FLAGS
@vindex @var{ext}_LOG_COMPILE
@vindex @var{ext}_LOG_COMPILER
@vindex @var{ext}_LOG_FLAGS
@vindex AM_@var{ext}_LOG_FLAGS
@vindex AM_LOG_FLAGS
For tests that match an extension @code{.@var{ext}} listed in
@code{TEST_EXTENSIONS}, you can provide a custom ``test runner'' using
the variable @code{@var{ext}_LOG_COMPILER} (note the upper-case
extension) and pass options in @code{AM_@var{ext}_LOG_FLAGS} and allow
the user to pass options in @code{@var{ext}_LOG_FLAGS}.  It will cause
all tests with this extension to be called with this runner.  For all
tests without a registered extension, the variables @code{LOG_COMPILER},
@code{AM_LOG_FLAGS}, and @code{LOG_FLAGS} may be used.  For example,

@c Keep in sync with parallel-tests-log-compiler-example.sh
@example
TESTS = foo.pl bar.py baz
TEST_EXTENSIONS = .pl .py
PL_LOG_COMPILER = $(PERL)
AM_PL_LOG_FLAGS = -w
PY_LOG_COMPILER = $(PYTHON)
AM_PY_LOG_FLAGS = -v
LOG_COMPILER = ./wrapper-script
AM_LOG_FLAGS = -d
@end example

@noindent
will invoke @samp{$(PERL) -w foo.pl}, @samp{$(PYTHON) -v bar.py},
and @samp{./wrapper-script -d baz} to produce @file{foo.log},
@file{bar.log}, and @file{baz.log}, respectively.  The @file{foo.trs},
@file{bar.trs} and @file{baz.trs} files will be automatically produced
as a side-effect.

It's important to note that, differently from what we've seen for the
serial test harness (@pxref{Serial Test Harness}), the
@code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables
@emph{cannot} be used to define a custom test runner; the
@code{LOG_COMPILER} and @code{LOG_FLAGS} (or their extension-specific
counterparts) should be used instead:

@example
## This is WRONG!
AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib' $(PERL) -Mstrict -w
@end example

@example
## Do this instead.
AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib'; export PERL5LIB;
LOG_COMPILER = $(PERL)
AM_LOG_FLAGS = -Mstrict -w
@end example

By default, the test suite harness will run all tests, but there are
several ways to limit the set of tests that are run:

@itemize @bullet
@item
You can set the @code{TESTS} variable.  For example, you can use a
command like this to run only a subset of the tests:

@example
env TESTS="foo.test bar.test" make -e check
@end example

Note however that the command above will unconditionally overwrite the
@file{test-suite.log} file, thus clobbering the recorded results
of any previous testsuite run.  This might be undesirable for packages
whose testsuite takes long time to execute.  Luckily, this problem can
easily be avoided by overriding also @code{TEST_SUITE_LOG} at runtime;
for example,

@c Keep in sync with parallel-tests-log-override-2.sh
@example
env TEST_SUITE_LOG=partial.log TESTS="..." make -e check
@end example

will write the result of the partial testsuite runs to the
@file{partial.log}, without touching @file{test-suite.log}.

@item
You can set the @code{TEST_LOGS} variable.  By default, this variable is
computed at @command{make} run time from the value of @code{TESTS} as
described above.  For example, you can use the following:

@example
set x subset*.log; shift
env TEST_LOGS="foo.log $*" make -e check
@end example

The comments made above about @code{TEST_SUITE_LOG} overriding applies
here too.

@item
@vindex RECHECK_LOGS
@cindex lazy test execution
By default, the test harness removes all old per-test @file{.log} and
@file{.trs} files before it starts running tests to regenerate them.  The
variable @code{RECHECK_LOGS} contains the set of @file{.log} (and, by
implication, @file{.trs}) files which are removed.  @code{RECHECK_LOGS}
defaults to @code{TEST_LOGS}, which means all tests need to be rechecked.
By overriding this variable, you can choose which tests need to be
reconsidered.  For example, you can lazily rerun only those tests which
are outdated, i.e., older than their prerequisite test files, by setting
this variable to the empty value:

@example
env RECHECK_LOGS= make -e check
@end example

@item
@trindex recheck
You can ensure that all tests are rerun which have failed or passed
unexpectedly, by running @code{make recheck} in the test directory.
This convenience target will set @code{RECHECK_LOGS} appropriately
before invoking the main test harness.
@end itemize

@noindent
In order to guarantee an ordering between tests even with @code{make
-j@var{N}}, dependencies between the corresponding @file{.log} files
may be specified through usual @command{make} dependencies.  For example,
the following snippet lets the test named @file{foo-execute.test} depend
upon completion of the test @file{foo-compile.test}:

@example
TESTS = foo-compile.test foo-execute.test
foo-execute.log: foo-compile.log
@end example

@noindent
Please note that this ordering ignores the @emph{results} of required
tests, thus the test @file{foo-execute.test} is run even if the test
@file{foo-compile.test} failed or was skipped beforehand.  Further,
please note that specifying such dependencies currently works only for
tests that end in one of the suffixes listed in @code{TEST_EXTENSIONS}.

Tests without such specified dependencies may be run concurrently with
parallel @command{make -j@var{N}}, so be sure they are prepared for
concurrent execution.

@cindex Unit tests
@c Keep in sync with 'parallel-tests-extra-programs.sh'.
The combination of lazy test execution and correct dependencies between
tests and their sources may be exploited for efficient unit testing
during development.  To further speed up the edit-compile-test cycle, it
may even be useful to specify compiled programs in @code{EXTRA_PROGRAMS}
instead of with @code{check_PROGRAMS}, as the former allows intertwined
compilation and test execution (but note that @code{EXTRA_PROGRAMS} are
not cleaned automatically, @pxref{Uniform}).

The variables @code{TESTS} and @code{XFAIL_TESTS} may contain
conditional parts as well as configure substitutions.  In the latter
case, however, certain restrictions apply: substituted test names
must end with a nonempty test suffix like @file{.test}, so that one of
the inference rules generated by @command{automake} can apply.  For
literal test names, @command{automake} can generate per-target rules
to avoid this limitation.

Please note that it is currently not possible to use @code{$(srcdir)/}
or @code{$(top_srcdir)/} in the @code{TESTS} variable.  This technical
limitation is necessary to avoid generating test logs in the source tree
and has the unfortunate consequence that it is not possible to specify
distributed tests that are themselves generated by means of explicit
rules, in a way that is portable to all @command{make} implementations
(@pxref{Make Target Lookup,,, autoconf, The Autoconf Manual}, the
semantics of FreeBSD and OpenBSD @command{make} conflict with this).
In case of doubt you may want to require to use GNU @command{make},
or work around the issue with inference rules to generate the tests.

@node Custom Test Drivers
@section Custom Test Drivers

@menu
* Overview of Custom Test Drivers Support::
* Declaring Custom Test Drivers::
* API for Custom Test Drivers::
@end menu

@node Overview of Custom Test Drivers Support
@subsection Overview of Custom Test Drivers Support

Starting from Automake version 1.12, the parallel test harness allows
the package authors to use third-party custom test drivers, in case the
default ones are inadequate for their purposes, or do not support their
testing protocol of choice.

A custom test driver is expected to properly run the test programs passed
to it (including the command-line arguments passed to those programs, if
any), to analyze their execution and outcome, to create the @file{.log}
and @file{.trs} files associated to these test runs, and to display the test
results on the console. It is responsibility of the author of the test
driver to ensure that it implements all the above steps meaningfully and
correctly; Automake isn't and can't be of any help here.  On the other
hand, the Automake-provided code for testsuite summary generation offers
support for test drivers allowing several test results per test script,
if they take care to register such results properly (@pxref{Log files
generation and test results recording}).

The exact details of how test scripts' results are to be determined and
analyzed is left to the individual drivers.  Some drivers might only
consider the test script exit status (this is done for example by the
default test driver used by the parallel test harness, described
in the previous section).  Other drivers might implement more complex and
advanced test protocols, which might require them to parse and interpreter
the output emitted by the test script they're running (examples of such
protocols are TAP and SubUnit).

It's very important to note that, even when using custom test drivers,
most of the infrastructure described in the previous section about the
parallel harness remains in place; this includes:

@itemize
@item
list of test scripts defined in @code{TESTS}, and overridable at
runtime through the redefinition of @code{TESTS} or @code{TEST_LOGS};
@item
concurrency through the use of @command{make}'s option @option{-j};
@item
per-test @file{.log} and @file{.trs} files, and generation of a summary
@file{.log} file from them;
@item
@code{recheck} target, @code{RECHECK_LOGS} variable, and lazy reruns
of tests;
@item
inter-test dependencies;
@item
support for @code{check_*} variables (@code{check_PROGRAMS},
@code{check_LIBRARIES}, ...);
@item
use of @code{VERBOSE} environment variable to get verbose output on
testsuite failures;
@item
definition and honoring of @code{TESTS_ENVIRONMENT},
@code{AM_TESTS_ENVIRONMENT} and @code{AM_TESTS_FD_REDIRECT}
variables;
@item
definition of generic and extension-specific @code{LOG_COMPILER} and
@code{LOG_FLAGS} variables.
@end itemize

@noindent
On the other hand, the exact semantics of how (and if) testsuite output
colorization, @code{XFAIL_TESTS}, and hard errors are supported and
handled is left to the individual test drivers.

@c TODO: We should really add a working example in the doc/ directory,
@c TODO: and reference if from here.

@node Declaring Custom Test Drivers
@subsection Declaring Custom Test Drivers

@vindex _LOG_DRIVER
@vindex _LOG_DRIVER_FLAGS
@vindex LOG_DRIVER
@vindex LOG_DRIVER_FLAGS
@vindex @var{ext}_LOG_DRIVER
@vindex @var{ext}_LOG_DRIVER_FLAGS
@vindex AM_@var{ext}_LOG_DRIVER_FLAGS
@vindex AM_LOG_DRIVER_FLAGS
Custom testsuite drivers are declared by defining the make variables
@code{LOG_DRIVER} or @code{@var{ext}_LOG_DRIVER} (where @var{ext} must
be declared in @code{TEST_EXTENSIONS}).  They must be defined to
programs or scripts that will be used to drive the execution, logging,
and outcome report of the tests with corresponding extensions (or of
those with no registered extension in the case of @code{LOG_DRIVER}).
Clearly, multiple distinct test drivers can be declared in the same
@file{Makefile.am}.  Note moreover that the @code{LOG_DRIVER} variables
are @emph{not} a substitute for the @code{LOG_COMPILER} variables: the
two sets of variables can, and often do, usefully and legitimately
coexist.

@c TODO: We should really be able to point to a clarifying example here!

The developer-reserved variable @code{AM_LOG_DRIVER_FLAGS} and the
user-reserved variable @code{LOG_DRIVER_FLAGS} can be used to define
flags that will be passed to each invocation of @code{LOG_DRIVER},
with the user-defined flags obviously taking precedence over the
developer-reserved ones.  Similarly, for each extension @var{ext}
declared in @code{TEST_EXTENSIONS}, flags listed in
@code{AM_@var{ext}_LOG_DRIVER_FLAGS} and
@code{@var{ext}_LOG_DRIVER_FLAGS} will be passed to
invocations of @code{@var{ext}_LOG_DRIVER}.

@node API for Custom Test Drivers
@subsection API for Custom Test Drivers

Note that @emph{the APIs described here are still highly experimental},
and will very likely undergo tightenings and likely also extensive changes
in the future, to accommodate for new features or to satisfy additional
portability requirements.

The main characteristic of these APIs is that they are designed to share
as much infrastructure, semantics, and implementation details as possible
with the parallel test harness and its default driver.

@menu
* Command-line arguments for test drivers::
* Log files generation and test results recording::
* Testsuite progress output::
@end menu

@node Command-line arguments for test drivers
@subsubsection Command-line arguments for test drivers

A custom driver can rely on various command-line options and arguments
being passed to it automatically by the Automake-generated test harness.
It is @emph{mandatory} that it understands all of them (even if the exact
interpretation of the associated semantics can legitimately change
between a test driver and another, and even be a no-op in some drivers).

@noindent
Here is the list of options:

@table @option
@item --test-name=@var{NAME}
The name of the test, with VPATH prefix (if any) removed.  This can have a
suffix and a directory component (as in e.g., @file{sub/foo.test}), and is
mostly meant to be used in console reports about testsuite advancements and
results (@pxref{Testsuite progress output}).
@item --log-file=@file{@var{PATH}.log}
The @file{.log} file the test driver must create (@pxref{Basics of
test metadata}).  If it has a directory component (as in e.g.,
@file{sub/foo.log}), the test harness will ensure that such directory
exists @emph{before} the test driver is called.
@item --trs-file=@file{@var{PATH}.trs}
The @file{.trs} file the test driver must create (@pxref{Basics of
test metadata}).  If it has a directory component (as in e.g.,
@file{sub/foo.trs}), the test harness will ensure that such directory
exists @emph{before} the test driver is called.
@item --color-tests=@{yes|no@}
Whether the console output should be colorized or not (@pxref{Simple
tests and color-tests}, to learn when this option gets activated and
when it doesn't).
@item --expect-failure=@{yes|no@}
Whether the tested program is expected to fail.
@item --enable-hard-errors=@{yes|no@}
Whether ``hard errors'' in the tested program should be treated differently
from normal failures or not (the default should be @code{yes}).  The exact
meaning of ``hard error'' is highly dependent from the test protocols or
conventions in use.
@item --
Explicitly terminate the list of options.
@end table

@noindent
The first non-option argument passed to the test driver is the program to
be run, and all the following ones are command-line options and arguments
for this program.

Note that the exact semantics attached to the @option{--color-tests},
@option{--expect-failure} and @option{--enable-hard-errors} options are
left up to the individual test drivers.  Still, having a behaviour
compatible or at least similar to that provided by the default driver
is advised, as that would offer a better consistency and a more pleasant
user experience.

@node Log files generation and test results recording
@subsubsection Log files generation and test results recording

The test driver must correctly generate the files specified by the
@option{--log-file} and @option{--trs-file} option (even when the tested
program fails or crashes).

The @file{.log} file should ideally contain all the output produced by the
tested program, plus optionally other information that might facilitate
debugging or analysis of bug reports.  Apart from that, its format is
basically free.

The @file{.trs} file is used to register some metadata through the use
of custom reStructuredText fields.  This metadata is expected to be
employed in various ways by the parallel test harness; for example, to
count the test results when printing the testsuite summary, or to decide
which tests to re-run upon @command{make recheck}.  Unrecognized metadata
in a @file{.trs} file is currently ignored by the harness, but this might
change in the future. The list of currently recognized metadata follows.

@table @code

@item :test-result:
@cindex Register test result
@cindex Register test case result
@cindex Test result, registering
@cindex Test case result, registering
@cindex @code{:test-result:}
@cindex reStructuredText field, @code{:test-result:}
The test driver must use this field to register the results of @emph{each}
test case run by a test script file.  Several @code{:test-result:} fields
can be present in the same @file{.trs} file; this is done in order to
support test protocols that allow a single test script to run more test
cases.

@c Keep this in sync with lib/am/check-am:$(TEST_SUITE_LOG).
The only recognized test results are currently @code{PASS}, @code{XFAIL},
@code{SKIP}, @code{FAIL}, @code{XPASS} and @code{ERROR}.  These results,
when declared with @code{:test-result:}, can be optionally followed by
text holding the name and/or a brief description of the corresponding
test; the harness will ignore such extra text when generating
@file{test-suite.log} and preparing the testsuite summary.

@c Keep in sync with 'test-metadata-recheck.sh'.
@item @code{:recheck:}
@cindex :recheck:
@cindex reStructuredText field, @code{:recheck:}
If this field is present and defined to @code{no}, then the corresponding
test script will @emph{not} be run upon a @command{make recheck}.  What
happens when two or more @code{:recheck:} fields are present in the same
@file{.trs} file is undefined behaviour.

@c Keep in sync with 'test-metadata-global-log.sh'.
@item @code{:copy-in-global-log:}
@cindex :copy-in-global-log:
@cindex reStructuredText field, @code{:copy-in-global-log:}
If this field is present and defined to @code{no}, then the content
of the @file{.log} file will @emph{not} be copied into the global
@file{test-suite.log}.  We allow to forsake such copying because, while
it can be useful in debugging and analysis of bug report, it can also be
just a waste of space in normal situations, e.g., when a test script is
successful.  What happens when two or more @code{:copy-in-global-log:}
fields are present in the same @file{.trs} file is undefined behaviour.

@c Keep in sync with 'test-metadata-global-result.sh'.
@item @code{:test-global-result:}
@cindex :test-global-result:
@cindex reStructuredText field, @code{:test-global-result:}
This is used to declare the "global result" of the script.  Currently,
the value of this field is needed only to be reported (more or less
verbatim) in the generated global log file @code{$(TEST_SUITE_LOG)},
so it's quite free-form.  For example, a test script which run 10 test
cases, 6 of which pass and 4 of which are skipped, could reasonably have
a @code{PASS/SKIP} value for this field, while a test script which run
19 successful tests and one failed test could have an @code{ALMOST
PASSED} value.  What happens when two or more @code{:test-global-result:}
fields are present in the same @file{.trs} file is undefined behaviour.
@end table

@noindent
Let's see a small example.  Assume a @file{.trs} file contains the
following lines:

@example
:test-result: PASS server starts
:global-log-copy: no
:test-result: PASS HTTP/1.1 request
:test-result: FAIL HTTP/1.0 request
:recheck: yes
:test-result: SKIP HTTPS request (TLS library wasn't available)
:test-result: PASS server stops
@end example

@noindent
Then the corresponding test script will be re-run by @command{make check},
will contribute with @emph{five} test results to the testsuite summary
(three of these tests being successful, one failed, and one skipped), and
the content of the corresponding @file{.log} file will @emph{not} be
copied in the global log file @file{test-suite.log}.

@node Testsuite progress output
@subsubsection Testsuite progress output

A custom test driver also has the task of displaying, on the standard
output, the test results as soon as they become available.  Depending on
the protocol in use, it can also display the reasons for failures and
skips, and, more generally, any useful diagnostic output (but remember
that each line on the screen is precious, so that cluttering the screen
with overly verbose information is bad idea).  The exact format of this
progress output is left up to the test driver; in fact, a custom test
driver might @emph{theoretically} even decide not to do any such report,
leaving it all to the testsuite summary (that would be a very lousy idea,
of course, and serves only to illustrate the flexibility that is
granted here).

Remember that consistency is good; so, if possible, try to be consistent
with the output of the built-in Automake test drivers, providing a similar
``look & feel''.  In particular, the testsuite progress output should be
colorized when the @option{--color-tests} is passed to the driver.  On the
other end, if you are using a known and widespread test protocol with
well-established implementations, being consistent with those
implementations' output might be a good idea too.

@node Using the TAP test protocol
@section Using the TAP test protocol

@menu
* Introduction to TAP::
* Use TAP with the Automake test harness::
* Incompatibilities with other TAP parsers and drivers::
* Links and external resources on TAP::
@end menu

@node Introduction to TAP
@subsection Introduction to TAP

TAP, the Test Anything Protocol, is a simple text-based interface between
testing modules or programs and a test harness.  The tests (also called
``TAP producers'' in this context) write test results in a simple format
on standard output; a test harness (also called ``TAP consumer'') will
parse and interpret these results, and properly present them to the user,
and/or register them for later analysis.  The exact details of how this
is accomplished can vary among different test harnesses.  The Automake
harness will present the results on the console in the usual
fashion (@pxref{Testsuite progress on console}), and will use the
@file{.trs} files (@pxref{Basics of test metadata}) to store the test
results and related metadata.  Apart from that, it will try to remain
as much compatible as possible with pre-existing and widespread utilities,
such as the @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
@command{prove} utility}, at least for the simpler usages.

TAP started its life as part of the test harness for Perl, but today
it has been (mostly) standardized, and has various independent
implementations in different languages; among them, C, C++, Perl,
Python, PHP, and Java.  For a semi-official specification of the
TAP protocol, please refer to the documentation of
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
      @samp{Test::Harness::TAP}}.

The most relevant real-world usages of TAP are obviously in the testsuites
of @command{perl} and of many perl modules.  Still, also other important
third-party packages, such as @uref{http://git-scm.com/, @command{git}},
use TAP in their testsuite.

@node Use TAP with the Automake test harness
@subsection Use TAP with the Automake test harness

Currently, the TAP driver that comes with Automake requires some by-hand
steps on the developer's part (this situation should hopefully be improved
in future Automake versions).  You'll have to grab the @file{tap-driver.sh}
script from the Automake distribution by hand, copy it in your source tree,
and use the Automake support for third-party test drivers to instruct the
harness to use the @file{tap-driver.sh} script and the awk program found
by @code{AM_INIT_AUTOMAKE} to run your TAP-producing tests.  See the example
below for clarification.

Apart from the options common to all the Automake test drivers
(@pxref{Command-line arguments for test drivers}), the @file{tap-driver.sh}
supports the following options, whose names are chosen for enhanced
compatibility with the @command{prove} utility.

@table @option
@c Keep in sync with 'tap-exit.sh' and 'tap-signal.tap'.
@item --ignore-exit
Causes the test driver to ignore the exit status of the test scripts;
by default, the driver will report an error if the script exits with a
non-zero status.  This option has effect also on non-zero exit statuses
due to termination by a signal.
@item --comments
Instruct the test driver to display TAP diagnostic (i.e., lines beginning
with the @samp{#} character) in the testsuite progress output too; by
default, TAP diagnostic is only copied to the @file{.log} file.
@item --no-comments
Revert the effects of @option{--comments}.
@item --merge
Instruct the test driver to merge the test scripts' standard error into
their standard output.  This is necessary if you want to ensure that
diagnostics from the test scripts are displayed in the correct order
relative to test results; this can be of great help in debugging
(especially if your test scripts are shell scripts run with shell
tracing active).  As a downside, this option might cause the test
harness to get confused if anything that appears on standard error
looks like a test result.
@item --no-merge
Revert the effects of @option{--merge}.
@item --diagnostic-string=@var{STRING}
Change the string that introduces TAP diagnostic from the default value
of ``@code{#}'' to @code{@var{STRING}}.  This can be useful if your
TAP-based test scripts produce verbose output on which they have limited
control (because, say, the output comes from other tools invoked in the
scripts), and it might contain text that gets spuriously interpreted as
TAP diagnostic: such an issue can be solved by redefining the string that
activates TAP diagnostic to a value you know won't appear by chance in
the tests' output.  Note however that this feature is non-standard, as
the ``official'' TAP protocol does not allow for such a customization; so
don't use it if you can avoid it.
@end table

@noindent
Here is an example of how the TAP driver can be set up and used.

@c Keep in sync with tap-doc2.sh
@example
% @kbd{cat configure.ac}
AC_INIT([GNU Try Tap], [1.0], [bug-automake@@gnu.org])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_FILES([Makefile])
AC_REQUIRE_AUX_FILE([tap-driver.sh])
AC_OUTPUT

% @kbd{cat Makefile.am}
TEST_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
                  $(top_srcdir)/build-aux/tap-driver.sh
TESTS = foo.test bar.test baz.test
EXTRA_DIST = $(TESTS)

% @kbd{cat foo.test}
#!/bin/sh
echo 1..4 # Number of tests to be executed.
echo 'ok 1 - Swallows fly'
echo 'not ok 2 - Caterpillars fly # TODO metamorphosis in progress'
echo 'ok 3 - Pigs fly # SKIP not enough acid'
echo '# I just love word plays ...'
echo 'ok 4 - Flies fly too :-)'

% @kbd{cat bar.test}
#!/bin/sh
echo 1..3
echo 'not ok 1 - Bummer, this test has failed.'
echo 'ok 2 - This passed though.'
echo 'Bail out! Ennui kicking in, sorry...'
echo 'ok 3 - This will not be seen.'

% @kbd{cat baz.test}
#!/bin/sh
echo 1..1
echo ok 1
# Exit with error, even if all the tests have been successful.
exit 7

% @kbd{cp @var{PREFIX}/share/automake-@var{APIVERSION}/tap-driver.sh .}
% @kbd{autoreconf -vi && ./configure && make check}
...
PASS: foo.test 1 - Swallows fly
XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
PASS: foo.test 4 - Flies fly too :-)
FAIL: bar.test 1 - Bummer, this test has failed.
PASS: bar.test 2 - This passed though.
ERROR: bar.test - Bail out! Ennui kicking in, sorry...
PASS: baz.test 1
ERROR: baz.test - exited with status 7
...
Please report to bug-automake@@gnu.org
...
% @kbd{echo exit status: $?}
exit status: 1

@c Keep the "skewed" indentation below, it produces pretty PDF output.
% @kbd{env TEST_LOG_DRIVER_FLAGS='--comments --ignore-exit' \
      TESTS='foo.test baz.test' make -e check}
...
PASS: foo.test 1 - Swallows fly
XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
# foo.test: I just love word plays...
PASS: foo.test 4 - Flies fly too :-)
PASS: baz.test 1
...
% @kbd{echo exit status: $?}
exit status: 0
@end example

@node Incompatibilities with other TAP parsers and drivers
@subsection Incompatibilities with other TAP parsers and drivers

For implementation or historical reasons, the TAP driver and harness as
implemented by Automake have some minors incompatibilities with the
mainstream versions, which you should be aware of.

@itemize @bullet
@item
A @code{Bail out!} directive doesn't stop the whole testsuite, but only
the test script it occurs in.  This doesn't follow TAP specifications,
but on the other hand it maximizes compatibility (and code sharing) with
the ``hard error'' concept of the default testsuite driver.
@item
The @code{version} and @code{pragma} directives are not supported.
@item
The @option{--diagnostic-string} option of our driver allows to modify
the string that introduces TAP diagnostic from the default value
of ``@code{#}''.  The standard TAP protocol has currently no way to
allow this, so if you use it your diagnostic will be lost to more
compliant tools like @command{prove} and @code{Test::Harness}
@item
And there are probably some other small and yet undiscovered
incompatibilities, especially in corner cases or with rare usages.
@end itemize

@node Links and external resources on TAP
@subsection Links and external resources on TAP

@noindent
Here are some links to more extensive official or third-party
documentation and resources about the TAP protocol and related
tools and libraries.
@itemize @bullet
@item
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
      @samp{Test::Harness::TAP}},
the (mostly) official documentation about the TAP format and protocol.
@item
@uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
      @command{prove}},
the most famous command-line TAP test driver, included in the distribution
of @command{perl} and
@uref{http://search.cpan.org/~andya/Test-Harness/lib/Test/Harness.pm,
      @samp{Test::Harness}}.
@item
The @uref{http://testanything.org/wiki/index.php/Main_Page,TAP wiki}.
@item
A ``gentle introduction'' to testing for perl coders:
@uref{http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod,
      @samp{Test::Tutorial}}.
@item
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/Simple.pm,
      @samp{Test::Simple}}
and
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/More.pm,
      @samp{Test::More}},
the standard perl testing libraries, which are based on TAP.
@item
@uref{http://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness},
a C-based project implementing both a TAP producer and a TAP consumer.
@item
@uref{http://www.tap4j.org/,tap4j},
a Java-based project implementing both a TAP producer and a TAP consumer.
@end itemize

@node DejaGnu Tests
@section DejaGnu Tests

If @uref{https://ftp.gnu.org/gnu/dejagnu/, @command{dejagnu}} appears in
@code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based test suite is
assumed.  The variable @code{DEJATOOL} is a list of names that are
passed, one at a time, as the @option{--tool} argument to
@command{runtest} invocations; it defaults to the name of the package.

The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and
@option{--srcdir} flags that are passed to dejagnu by default; this can be
overridden if necessary.
@vindex RUNTESTDEFAULTFLAGS

The variables @code{EXPECT} and @code{RUNTEST} can
also be overridden to provide project-specific values.  For instance,
you will need to do this if you are testing a compiler toolchain,
because the default values do not take into account host and target
names.
@opindex dejagnu
@vindex DEJATOOL
@vindex EXPECT
@vindex RUNTEST

The contents of the variable @code{RUNTESTFLAGS} are passed to the
@code{runtest} invocation.  This is considered a ``user variable''
(@pxref{User Variables}).  If you need to set @command{runtest} flags in
@file{Makefile.am}, you can use @code{AM_RUNTESTFLAGS} instead.
@vindex RUNTESTFLAGS
@vindex AM_RUNTESTFLAGS

@cindex @file{site.exp}
Automake will generate rules to create a local @file{site.exp} file,
defining various variables detected by @command{configure}.  This file
is automatically read by DejaGnu.  It is OK for the user of a package
to edit this file in order to tune the test suite.  However this is
not the place where the test suite author should define new variables:
this should be done elsewhere in the real test suite code.
Especially, @file{site.exp} should not be distributed.

Still, if the package author has legitimate reasons to extend
@file{site.exp} at @command{make} time, he can do so by defining
the variable @code{EXTRA_DEJAGNU_SITE_CONFIG}; the files listed
there will be considered @file{site.exp} prerequisites, and their
content will be appended to it (in the same order in which they
appear in @code{EXTRA_DEJAGNU_SITE_CONFIG}).  Note that files are
@emph{not} distributed by default.

For more information regarding DejaGnu test suites, see @ref{Top, , ,
dejagnu, The DejaGnu Manual}.

@node Install Tests
@section Install Tests

The @code{installcheck} target is available to the user as a way to
run any tests after the package has been installed.  You can add tests
to this by writing an @code{installcheck-local} rule.


@node Rebuilding
@chapter Rebuilding Makefiles
@cindex rebuild rules

Automake generates rules to automatically rebuild @file{Makefile}s,
@file{configure}, and other derived files like @file{Makefile.in}.

@acindex AM_MAINTAINER_MODE
If you are using @code{AM_MAINTAINER_MODE} in @file{configure.ac}, then
these automatic rebuilding rules are only enabled in maintainer mode.

@vindex CONFIG_STATUS_DEPENDENCIES
@vindex CONFIGURE_DEPENDENCIES
@cindex @file{version.sh}, example
@cindex @file{version.m4}, example

Sometimes it is convenient to supplement the rebuild rules for
@file{configure} or @file{config.status} with additional dependencies.
The variables @code{CONFIGURE_DEPENDENCIES} and
@code{CONFIG_STATUS_DEPENDENCIES} can be used to list these extra
dependencies.  These variables should be defined in all
@file{Makefile}s of the tree (because these two rebuild rules are
output in all them), so it is safer and easier to @code{AC_SUBST} them
from @file{configure.ac}.  For instance, the following statement will
cause @file{configure} to be rerun each time @file{version.sh} is
changed.

@c Keep in sync with remake-config-status-dependencies.sh
@example
AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/version.sh'])
@end example

@noindent
Note the @samp{$(top_srcdir)/} in the file name.  Since this variable
is to be used in all @file{Makefile}s, its value must be sensible at
any level in the build hierarchy.

Beware not to mistake @code{CONFIGURE_DEPENDENCIES} for
@code{CONFIG_STATUS_DEPENDENCIES}.

@c Keep in sync with remake-configure-dependencies.sh
@code{CONFIGURE_DEPENDENCIES} adds dependencies to the
@file{configure} rule, whose effect is to run @command{autoconf}.  This
variable should be seldom used, because @command{automake} already tracks
@code{m4_include}d files.  However it can be useful when playing
tricky games with @code{m4_esyscmd} or similar non-recommendable
macros with side effects.  Be also aware that interactions of this
variable with the @ref{Autom4te Cache, , autom4te cache, autoconf,
The Autoconf Manual} are quite problematic and can cause subtle
breakage, so you might want to disable the cache if you want to use
@code{CONFIGURE_DEPENDENCIES}.

@code{CONFIG_STATUS_DEPENDENCIES} adds dependencies to the
@file{config.status} rule, whose effect is to run @file{configure}.
This variable should therefore carry any non-standard source that may
be read as a side effect of running @command{configure}, like @file{version.sh}
in the example above.

Speaking of @file{version.sh} scripts, we recommend against them
today.  They are mainly used when the version of a package is updated
automatically by a script (e.g., in daily builds).  Here is what some
old-style @file{configure.ac}s may look like:

@example
AC_INIT
. $srcdir/version.sh
AM_INIT_AUTOMAKE([name], $VERSION_NUMBER)
@dots{}
@end example

@noindent
Here, @file{version.sh} is a shell fragment that sets
@code{VERSION_NUMBER}.  The problem with this example is that
@command{automake} cannot track dependencies (listing @file{version.sh}
in @command{CONFIG_STATUS_DEPENDENCIES}, and distributing this file is up
to the user), and that it uses the obsolete form of @code{AC_INIT} and
@code{AM_INIT_AUTOMAKE}.  Upgrading to the new syntax is not
straightforward, because shell variables are not allowed in
@code{AC_INIT}'s arguments.  We recommend that @file{version.sh} be
replaced by an M4 file that is included by @file{configure.ac}:

@example
m4_include([version.m4])
AC_INIT([name], VERSION_NUMBER)
AM_INIT_AUTOMAKE
@dots{}
@end example

@noindent
Here @file{version.m4} could contain something like
@samp{m4_define([VERSION_NUMBER], [1.2])}.  The advantage of this
second form is that @command{automake} will take care of the
dependencies when defining the rebuild rule, and will also distribute
the file automatically.  An inconvenience is that @command{autoconf}
will now be rerun each time the version number is bumped, when only
@file{configure} had to be rerun in the previous setup.


@node Options
@chapter Changing Automake's Behavior

@menu
* Options generalities::        Semantics of Automake option
* List of Automake options::    A comprehensive list of Automake options
@end menu

@node Options generalities
@section Options generalities

Various features of Automake can be controlled by options.  Except where
noted otherwise, options can be specified in one of several ways.  Most
options can be applied on a per-@file{Makefile} basis when listed in a
special @file{Makefile} variable named @code{AUTOMAKE_OPTIONS}.  Some
of these options only make sense when specified in the toplevel
@file{Makefile.am} file.  Options are applied globally to all processed
@file{Makefile} files when listed in the first argument of
@code{AM_INIT_AUTOMAKE} in @file{configure.ac}, and some options which
require changes to the @command{configure} script can only be specified
there.  These are annotated below.

As a general rule, options specified in @code{AUTOMAKE_OPTIONS} take
precedence over those specified in @code{AM_INIT_AUTOMAKE}, which in
turn take precedence over those specified on the command line.

Also, some care must be taken about the interactions among strictness
level and warning categories.  As a general rule, strictness-implied
warnings are overridden by those specified by explicit options.  For
example, even if @samp{portability} warnings are disabled by default
in @option{foreign} strictness, an usage like this will end up enabling
them:

@example
AUTOMAKE_OPTIONS = -Wportability foreign
@end example

However, a strictness level specified in a higher-priority context
will override all the explicit warnings specified in a lower-priority
context.  For example, if @file{configure.ac} contains:

@example
AM_INIT_AUTOMAKE([-Wportability])
@end example

@noindent
and @file{Makefile.am} contains:

@example
AUTOMAKE_OPTIONS = foreign
@end example

@noindent
then @samp{portability} warnings will be @emph{disabled} in
@file{Makefile.am}.

@node List of Automake options
@section List of Automake options

@vindex AUTOMAKE_OPTIONS

@table @asis
@item @option{gnits}
@itemx @option{gnu}
@itemx @option{foreign}
@cindex Option, @option{gnits}
@cindex Option, @option{gnu}
@cindex Option, @option{foreign}
@opindex gnits
@opindex gnu
@opindex foreign

Set the strictness as appropriate.  The @option{gnits} option also
implies options @option{readme-alpha} and @option{check-news}.

@item @option{check-news}
@cindex Option, @option{check-news}
@opindex check-news
Cause @samp{make dist} to fail unless the current version number appears
in the first few lines of the @file{NEWS} file.

@item @option{dejagnu}
@cindex Option, @option{dejagnu}
@opindex dejagnu
Cause @command{dejagnu}-specific rules to be generated.  @xref{DejaGnu Tests}.

@item @option{dist-bzip2}
@cindex Option, @option{dist-bzip2}
@opindex dist-bzip2
Hook @code{dist-bzip2} to @code{dist}.
@trindex dist-bzip2

@item @option{dist-lzip}
@cindex Option, @option{dist-lzip}
@opindex dist-lzip
Hook @code{dist-lzip} to @code{dist}.
@trindex dist-lzip

@item @option{dist-xz}
@cindex Option, @option{dist-xz}
@opindex dist-xz
Hook @code{dist-xz} to @code{dist}.
@trindex dist-xz

@item @option{dist-zip}
@cindex Option, @option{dist-zip}
@opindex dist-zip
Hook @code{dist-zip} to @code{dist}.
@trindex dist-zip

@item @option{dist-shar}
@cindex Option, @option{dist-shar}
@opindex dist-shar
Hook @code{dist-shar} to @code{dist}.  Use of this option
is deprecated, as the @samp{shar} format is obsolescent and
problematic.  Support for it will be removed altogether in
Automake 2.0.
@trindex dist-shar

@item @option{dist-tarZ}
@cindex Option, @option{dist-tarZ}
@opindex dist-tarZ
Hook @code{dist-tarZ} to @code{dist}.  Use of this option
is deprecated, as the @samp{compress} program is obsolete.
Support for it will be removed altogether in Automake 2.0.
@trindex dist-tarZ

@item @option{filename-length-max=99}
@cindex Option, @option{filename-length-max=99}
@opindex filename-length-max=99
Abort if file names longer than 99 characters are found during
@samp{make dist}.  Such long file names are generally considered not to
be portable in tarballs.  See the @option{tar-v7} and @option{tar-ustar}
options below.  This option should be used in the top-level
@file{Makefile.am} or as an argument of @code{AM_INIT_AUTOMAKE} in
@file{configure.ac}, it will be ignored otherwise.  It will also be
ignored in sub-packages of nested packages (@pxref{Subpackages}).

@item @option{info-in-builddir}
@cindex Option, @option{info-in-builddir}
@opindex info-in-builddir
Instruct Automake to place the generated @file{.info} files in the
@code{builddir} rather than in the @code{srcdir}.  Note that this
might make VPATH builds with some non-GNU make implementations more
brittle.

@item @option{no-define}
@cindex Option, @option{no-define}
@opindex no-define
This option is meaningful only when passed as an argument to
@code{AM_INIT_AUTOMAKE}.  It will prevent the @code{PACKAGE} and
@code{VERSION} variables from being @code{AC_DEFINE}d.  But notice
that they will remain defined as shell variables in the generated
@code{configure}, and as make variables in the generated
@code{Makefile}; this is deliberate, and required for backward
compatibility.

@item @option{no-dependencies}
@cindex Option, @option{no-dependencies}
@opindex no-dependencies
This is similar to using @option{--ignore-deps} on the command line,
but is useful for those situations where you don't have the necessary
bits to make automatic dependency tracking work
(@pxref{Dependencies}).  In this case the effect is to effectively
disable automatic dependency tracking.

@item @option{no-dist}
@cindex Option, @option{no-dist}
@opindex no-dist
Don't emit any code related to @code{dist} target.  This is useful
when a package has its own method for making distributions.

@item @option{no-dist-gzip}
@cindex Option, @option{no-dist-gzip}
@opindex no-dist-gzip
Do not hook @code{dist-gzip} to @code{dist}.
@trindex no-dist-gzip

@item @option{no-exeext}
@cindex Option, @option{no-exeext}
@opindex no-exeext
If your @file{Makefile.am} defines a rule for target @code{foo}, it
will override a rule for a target named @samp{foo$(EXEEXT)}.  This is
necessary when @code{EXEEXT} is found to be empty.  However, by
default @command{automake} will generate an error for this use.  The
@option{no-exeext} option will disable this error.  This is intended for
use only where it is known in advance that the package will not be
ported to Windows, or any other operating system using extensions on
executables.

@item @option{no-installinfo}
@cindex Option, @option{no-installinfo}
@opindex no-installinfo
The generated @file{Makefile.in} will not cause info pages to be built
or installed by default.  However, @code{info} and @code{install-info}
targets will still be available.  This option is disallowed at
@option{gnu} strictness and above.
@trindex info
@trindex install-info

@item @option{no-installman}
@cindex Option, @option{no-installman}
@opindex no-installman
The generated @file{Makefile.in} will not cause man pages to be
installed by default.  However, an @code{install-man} target will still
be available for optional installation.  This option is disallowed at
@option{gnu} strictness and above.
@trindex install-man

@item @option{nostdinc}
@cindex Option, @option{nostdinc}
@opindex nostdinc
This option can be used to disable the standard @option{-I} options that
are ordinarily automatically provided by Automake.

@item @option{no-texinfo.tex}
@cindex Option, @option{no-texinfo.tex}
@opindex no-texinfo.tex
Don't require @file{texinfo.tex}, even if there are texinfo files in
this directory.

@item @option{serial-tests}
@cindex Option, @option{serial-tests}
@opindex serial-tests
Enable the older serial test suite harness for @code{TESTS} (@pxref{Serial
Test Harness}, for more information).

@item @option{parallel-tests}
@cindex Option, @option{parallel-tests}
@opindex parallel-tests
Enable test suite harness for @code{TESTS} that can run tests in parallel
(@pxref{Parallel Test Harness}, for more information).  This option is
only kept for backward-compatibility, since the parallel test harness is
the default now.

@item @option{readme-alpha}
@cindex Option, @option{readme-alpha}
@opindex readme-alpha
If this release is an alpha release, and the file @file{README-alpha}
exists, then it will be added to the distribution.  If this option is
given, version numbers are expected to follow one of two forms.  The
first form is @samp{@var{major}.@var{minor}.@var{alpha}}, where each
element is a number; the final period and number should be left off for
non-alpha releases.  The second form is
@samp{@var{major}.@var{minor}@var{alpha}}, where @var{alpha} is a
letter; it should be omitted for non-alpha releases.

@item @option{std-options}
@cindex Options, @option{std-options}
@cindex @samp{make installcheck}, testing @option{--help} and @option{--version}
@cindex @option{--help} check
@cindex @option{--version} check
@opindex std-options

Make the @code{installcheck} rule check that installed scripts and
programs support the @option{--help} and @option{--version} options.
This also provides a basic check that the program's
run-time dependencies are satisfied after installation.

@vindex AM_INSTALLCHECK_STD_OPTIONS_EXEMPT
In a few situations, programs (or scripts) have to be exempted from this
test.  For instance, @command{false} (from GNU coreutils) is never
successful, even for @option{--help} or @option{--version}.  You can list
such programs in the variable @code{AM_INSTALLCHECK_STD_OPTIONS_EXEMPT}.
Programs (not scripts) listed in this variable should be suffixed by
@samp{$(EXEEXT)} for the sake of Windows or OS/2.  For instance, suppose we
build @file{false} as a program but @file{true.sh} as a script, and that
neither of them support @option{--help} or @option{--version}:

@example
AUTOMAKE_OPTIONS = std-options
bin_PROGRAMS = false ...
bin_SCRIPTS = true.sh ...
AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT) true.sh
@end example

@item @option{subdir-objects}
@cindex Options, @option{subdir-objects}
@opindex subdir-objects
If this option is specified, then objects are placed into the
subdirectory of the build directory corresponding to the subdirectory of
the source file.  For instance, if the source file is
@file{subdir/file.cxx}, then the output file would be
@file{subdir/file.o}.

@anchor{tar-formats}
@item @option{tar-v7}
@itemx @option{tar-ustar}
@itemx @option{tar-pax}
@cindex Option, @option{tar-v7}
@cindex Option, @option{tar-ustar}
@cindex Option, @option{tar-pax}
@cindex @command{tar} formats
@cindex v7 @command{tar} format
@cindex ustar format
@cindex pax format
@opindex tar-v7
@opindex tar-ustar
@opindex tar-pax

These three mutually exclusive options select the tar format to use
when generating tarballs with @samp{make dist}.  (The tar file created
is then compressed according to the set of @option{no-dist-gzip},
@option{dist-bzip2}, @option{dist-lzip}, @option{dist-xz} and
@option{dist-tarZ} options in use.)

These options must be passed as arguments to @code{AM_INIT_AUTOMAKE}
(@pxref{Macros}) because they can require additional configure checks.
Automake will complain if it sees such options in an
@code{AUTOMAKE_OPTIONS} variable.

@option{tar-v7} selects the old V7 tar format.  This is the historical
default.  This antiquated format is understood by all tar
implementations and supports file names with up to 99 characters.  When
given longer file names some tar implementations will diagnose the
problem while other will generate broken tarballs or use non-portable
extensions.  Furthermore, the V7 format cannot store empty
directories.  When using this format, consider using the
@option{filename-length-max=99} option to catch file names too long.

@option{tar-ustar} selects the ustar format defined by POSIX
1003.1-1988.  This format is old enough to be portable:
As of 2018, it is supported by the native @code{tar} command on
GNU, FreeBSD, NetBSD, OpenBSD, AIX, HP-UX, Solaris, at least.
It fully supports empty directories.  It can store file names with up
to 256 characters, provided that the file name can be split at
directory separator in two parts, first of them being at most 155
bytes long.  So, in most cases the maximum file name length will be
shorter than 256 characters.

@option{tar-pax} selects the new pax interchange format defined by POSIX
1003.1-2001.  It does not limit the length of file names.  However,
this format is very young and should probably be restricted to
packages that target only very modern platforms.
As of 2018, this format is supported by the native @code{tar} command only
on GNU, FreeBSD, OpenBSD system; it is not supported by the native
@code{tar} command on NetBSD, AIX, HP-UX, Solaris.
There are moves to
change the pax format in an upward-compatible way, so this option may
refer to a more recent version in the future.

@xref{Formats, , Controlling the Archive Format, tar, GNU Tar}, for
further discussion about tar formats.

@command{configure} knows several ways to construct these formats.  It
will not abort if it cannot find a tool up to the task (so that the
package can still be built), but @samp{make dist} will fail.

@item @var{version}
@cindex Option, @var{version}
A version number (e.g., @samp{0.30}) can be specified.  If Automake is not
newer than the version specified, creation of the @file{Makefile.in}
will be suppressed.

@item @option{-W@var{category}} or @option{--warnings=@var{category}}
@cindex Option, warnings
@cindex Option, @option{-W@var{category}}
@cindex Option, @option{--warnings=@var{category}}
These options behave exactly like their command-line counterpart
(@pxref{automake Invocation}).  This allows you to enable or disable some
warning categories on a per-file basis.  You can also setup some warnings
for your entire project; for instance, try @samp{AM_INIT_AUTOMAKE([-Wall])}
in your @file{configure.ac}.

@end table

Unrecognized options are diagnosed by @command{automake}.

If you want an option to apply to all the files in the tree, you can use
the @code{AM_INIT_AUTOMAKE} macro in @file{configure.ac}.
@xref{Macros}.


@node Miscellaneous
@chapter Miscellaneous Rules

There are a few rules and variables that didn't fit anywhere else.

@menu
* Tags::                        Interfacing to cscope, etags and mkid
* Suffixes::                    Handling new file extensions
@end menu


@node Tags
@section Interfacing to @command{etags}

@cindex @file{TAGS} support

Automake will generate rules to generate @file{TAGS} files for use with
GNU Emacs under some circumstances.

@trindex tags
If any C, C++ or Fortran 77 source code or headers are present, then
@code{tags} and @code{TAGS} rules will be generated for the directory.
All files listed using the @code{_SOURCES}, @code{_HEADERS}, and
@code{_LISP} primaries will be used to generate tags.  Note that
generated source files that are not distributed must be declared in
variables like @code{nodist_noinst_HEADERS} or
@code{nodist_@var{prog}_SOURCES} or they will be ignored.

A @code{tags} rule will be output at the topmost directory of a
multi-directory package.  When run from this topmost directory,
@samp{make tags} will generate a @file{TAGS} file that includes by
reference all @file{TAGS} files from subdirectories.

The @code{tags} rule will also be generated if the variable
@code{ETAGS_ARGS} is defined.  This variable is intended for use in
directories that contain taggable source that @command{etags} does
not understand.  The user can use the @code{ETAGSFLAGS} to pass
additional flags to @command{etags}; @code{AM_ETAGSFLAGS} is also
available for use in @file{Makefile.am}.
@vindex ETAGS_ARGS
@vindex ETAGSFLAGS
@vindex AM_ETAGSFLAGS

Here is how Automake generates tags for its source, and for nodes in its
Texinfo file:

@example
ETAGS_ARGS = automake.in --lang=none \
 --regex='/^@@node[ \t]+\([^,]+\)/\1/' automake.texi
@end example

If you add file names to @code{ETAGS_ARGS}, you will probably also
want to define @code{TAGS_DEPENDENCIES}.  The contents of this variable
are added directly to the dependencies for the @code{tags} rule.
@vindex TAGS_DEPENDENCIES

Automake also generates a @code{ctags} rule that can be used to
build @command{vi}-style @file{tags} files.  The variable @code{CTAGS}
is the name of the program to invoke (by default @command{ctags});
@code{CTAGSFLAGS} can be used by the user to pass additional flags,
and @code{AM_CTAGSFLAGS} can be used by the @file{Makefile.am}.

@trindex id
Automake will also generate an @code{ID} rule that will run
@command{mkid} on the source.  This is only supported on a
directory-by-directory basis.

Similarly, the @code{cscope} rule will create a list of all the source
files in the tree and run @command{cscope} to build an inverted index
database.  The variable @code{CSCOPE} is the name of the program to invoke
(by default @command{cscope}); @code{CSCOPEFLAGS} and
@code{CSCOPE_ARGS} can be used by the user to pass additional flags and
file names respectively, while @code{AM_CSCOPEFLAGS} can be used by the
@file{Makefile.am}.  Note that, currently, the Automake-provided
@code{cscope} support, when used in a VPATH build, might not work well
with non-GNU make implementations (especially with make implementations
performing @ref{Automatic Rule Rewriting, , VPATH rewrites, autoconf,
The Autoconf Manual}).

Finally, Automake also emits rules to support the
@uref{https://www.gnu.org/software/global/, GNU Global Tags program}.
The @code{GTAGS} rule runs Global Tags and puts the
result in the top build directory.  The variable @code{GTAGS_ARGS}
holds arguments that are passed to @command{gtags}.
@vindex GTAGS_ARGS


@node Suffixes
@section Handling new file extensions

@cindex Adding new @code{SUFFIXES}
@cindex @code{SUFFIXES}, adding
@vindex SUFFIXES

It is sometimes useful to introduce a new implicit rule to handle a file
type that Automake does not know about.

For instance, suppose you had a compiler that could compile @file{.foo}
files to @file{.o} files.  You would simply define a suffix rule for
your language:

@example
.foo.o:
        foocc -c -o $@@ $<
@end example

Then you could directly use a @file{.foo} file in a @code{_SOURCES}
variable and expect the correct results:

@example
bin_PROGRAMS = doit
doit_SOURCES = doit.foo
@end example

This was the simpler and more common case.  In other cases, you will
have to help Automake to figure out which extensions you are defining your
suffix rule for.  This usually happens when your extension does not
start with a dot.  Then, all you have to do is to put a list of new
suffixes in the @code{SUFFIXES} variable @strong{before} you define your
implicit rule.

For instance, the following definition prevents Automake from misinterpreting
the @samp{.idlC.cpp:} rule as an attempt to transform @file{.idlC} files into
@file{.cpp} files.

@c Keep in sync with suffix7.sh
@example
SUFFIXES = .idl C.cpp
.idlC.cpp:
        # whatever
@end example

As you may have noted, the @code{SUFFIXES} variable behaves like the
@code{.SUFFIXES} special target of @command{make}.  You should not touch
@code{.SUFFIXES} yourself, but use @code{SUFFIXES} instead and let
Automake generate the suffix list for @code{.SUFFIXES}.  Any given
@code{SUFFIXES} go at the start of the generated suffixes list, followed
by Automake generated suffixes not already in the list.

@node Include
@chapter Include

@cmindex include
@cindex Including @file{Makefile} fragment
@cindex @file{Makefile} fragment, including

Automake supports an @code{include} directive that  can be used to
include other @file{Makefile} fragments when @command{automake} is run.
Note that these fragments are read and interpreted by @command{automake},
not by @command{make}.  As with conditionals, @command{make} has no idea that
@code{include} is in use.

There are two forms of @code{include}:

@table @code
@item include $(srcdir)/file
Include a fragment that is found relative to the current source
directory.

@item include $(top_srcdir)/file
Include a fragment that is found relative to the top source directory.
@end table

Note that if a fragment is included inside a conditional, then the
condition applies to the entire contents of that fragment.

Makefile fragments included this way are always distributed because
they are needed to rebuild @file{Makefile.in}.

Inside a fragment, the construct @code{%reldir%} is replaced with the
directory of the fragment relative to the base @file{Makefile.am}.
Similarly, @code{%canon_reldir%} is replaced with the canonicalized
(@pxref{Canonicalization}) form of @code{%reldir%}.  As a convenience,
@code{%D%} is a synonym for @code{%reldir%}, and @code{%C%}
is a synonym for @code{%canon_reldir%}.

A special feature is that if the fragment is in the same directory as
the base @file{Makefile.am} (i.e., @code{%reldir%} is @code{.}), then
@code{%reldir%} and @code{%canon_reldir%} will expand to the empty
string as well as eat, if present, a following slash or underscore
respectively.

Thus, a makefile fragment might look like this:

@example
bin_PROGRAMS += %reldir%/mumble
%canon_reldir%_mumble_SOURCES = %reldir%/one.c
@end example

@node Conditionals
@chapter Conditionals

@cindex Conditionals

Automake supports a simple type of conditionals.

These conditionals are not the same as conditionals in
GNU Make.  Automake conditionals are checked at configure time by the
@file{configure} script, and affect the translation from
@file{Makefile.in} to @file{Makefile}.  They are based on options passed
to @file{configure} and on results that @file{configure} has discovered
about the host system.  GNU Make conditionals are checked at @command{make}
time, and are based on variables passed to the make program or defined
in the @file{Makefile}.

Automake conditionals will work with any make program.

@menu
* Usage of Conditionals::       Declaring conditional content
* Limits of Conditionals::      Enclosing complete statements
@end menu

@node Usage of Conditionals
@section Usage of Conditionals

@acindex AM_CONDITIONAL
Before using a conditional, you must define it by using
@code{AM_CONDITIONAL} in the @file{configure.ac} file (@pxref{Macros}).

@defmac AM_CONDITIONAL (@var{conditional}, @var{condition})
The conditional name, @var{conditional}, should be a simple string
starting with a letter and containing only letters, digits, and
underscores.  It must be different from @samp{TRUE} and @samp{FALSE}
that are reserved by Automake.

The shell @var{condition} (suitable for use in a shell @code{if}
statement) is evaluated when @command{configure} is run.  Note that you
must arrange for @emph{every} @code{AM_CONDITIONAL} to be invoked every
time @command{configure} is run.  If @code{AM_CONDITIONAL} is run
conditionally (e.g., in a shell @code{if} statement), then the result
will confuse @command{automake}.
@end defmac

@cindex @option{--enable-debug}, example
@cindex Example conditional @option{--enable-debug}
@cindex Conditional example, @option{--enable-debug}

Conditionals typically depend upon options that the user provides to
the @command{configure} script.  Here is an example of how to write a
conditional that is true if the user uses the @option{--enable-debug}
option.

@example
AC_ARG_ENABLE([debug],
[  --enable-debug    Turn on debugging],
[case "$@{enableval@}" in
  yes) debug=true ;;
  no)  debug=false ;;
  *) AC_MSG_ERROR([bad value $@{enableval@} for --enable-debug]) ;;
esac],[debug=false])
AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
@end example

Here is an example of how to use that conditional in @file{Makefile.am}:

@cmindex if
@cmindex endif
@cmindex else

@example
if DEBUG
DBG = debug
else
DBG =
endif
noinst_PROGRAMS = $(DBG)
@end example

This trivial example could also be handled using @code{EXTRA_PROGRAMS}
(@pxref{Conditional Programs}).

You may only test a single variable in an @code{if} statement, possibly
negated using @samp{!}.  The @code{else} statement may be omitted.
Conditionals may be nested to any depth.  You may specify an argument to
@code{else} in which case it must be the negation of the condition used
for the current @code{if}.  Similarly you may specify the condition
that is closed on the @code{endif} line:

@example
if DEBUG
DBG = debug
else !DEBUG
DBG =
endif !DEBUG
@end example

@noindent
Unbalanced conditions are errors.  The @code{if}, @code{else}, and
@code{endif} statements should not be indented, i.e., start on column
one.

The @code{else} branch of the above two examples could be omitted,
since assigning the empty string to an otherwise undefined variable
makes no difference.

@acindex AM_COND_IF
In order to allow access to the condition registered by
@code{AM_CONDITIONAL} inside @file{configure.ac}, and to allow
conditional @code{AC_CONFIG_FILES}, @code{AM_COND_IF} may be used:

@defmac AM_COND_IF (@var{conditional}, @ovar{if-true}, @ovar{if-false})
If @var{conditional} is fulfilled, execute @var{if-true}, otherwise
execute @var{if-false}.  If either branch contains @code{AC_CONFIG_FILES},
it will cause @command{automake} to output the rules for the respective
files only for the given condition.
@end defmac

@code{AM_COND_IF} macros may be nested when m4 quotation is used
properly (@pxref{M4 Quotation, ,, autoconf, The Autoconf Manual}).

@cindex Example conditional @code{AC_CONFIG_FILES}
@cindex @code{AC_CONFIG_FILES}, conditional

Here is an example of how to define a conditional config file:

@example
AM_CONDITIONAL([SHELL_WRAPPER], [test "x$with_wrapper" = xtrue])
AM_COND_IF([SHELL_WRAPPER],
           [AC_CONFIG_FILES([wrapper:wrapper.in])])
@end example

@node Limits of Conditionals
@section Limits of Conditionals

Conditionals should enclose complete statements like variables or
rules definitions.  Automake cannot deal with conditionals used inside
a variable definition, for instance, and is not even able to diagnose
this situation.  The following example would not work:

@example
# This syntax is not understood by Automake
AM_CPPFLAGS = \
  -DFEATURE_A \
if WANT_DEBUG
  -DDEBUG \
endif
  -DFEATURE_B
@end example

However the intended definition of @code{AM_CPPFLAGS} can be achieved
with

@example
if WANT_DEBUG
  DEBUGFLAGS = -DDEBUG
endif
AM_CPPFLAGS = -DFEATURE_A $(DEBUGFLAGS) -DFEATURE_B
@end example

@noindent
or

@example
AM_CPPFLAGS = -DFEATURE_A
if WANT_DEBUG
AM_CPPFLAGS += -DDEBUG
endif
AM_CPPFLAGS += -DFEATURE_B
@end example

More details and examples of conditionals are described alongside
various Automake features in this manual (@pxref{Conditional
Subdirectories}, @pxref{Conditional Sources}, @pxref{Conditional
Programs}, @pxref{Conditional Libtool Libraries}, @pxref{Conditional
Libtool Sources}).

@node Silencing Make
@chapter Silencing @command{make}

@cindex Silent @command{make}
@cindex Silencing @command{make}
@cindex Silent rules
@cindex Silent @command{make} rules

@menu
* Make verbosity::              Make is verbose by default
* Tricks For Silencing Make::   Standard and generic ways to silence make
* Automake Silent Rules::       How Automake can help in silencing make
@end menu

@node Make verbosity
@section Make is verbose by default

Normally, when executing the set of rules associated with a target,
@command{make} prints each rule before it is executed.  This behaviour,
while having been in place for a long time, and being even mandated by
the POSIX standard, starkly violates the ``silence is golden'' UNIX
principle@footnote{See also
@uref{http://catb.org/~esr/writings/taoup/html/ch11s09.html}.}:

@quotation
When a program has nothing interesting or surprising to say, it should
say nothing.  Well-behaved Unix programs do their jobs unobtrusively,
with a minimum of fuss and bother.  Silence is golden.
@end quotation

In fact, while such verbosity of @command{make} can theoretically be
useful to track bugs and understand reasons of failures right away, it
can also hide warning and error messages from @command{make}-invoked
tools, drowning them in a flood of uninteresting and seldom useful
messages, and thus allowing them to go easily undetected.

This problem can be very annoying, especially for developers, who usually
know quite well what's going on behind the scenes, and for whom the
verbose output from @command{make} ends up being mostly noise that hampers
the easy detection of potentially important warning messages.

@node Tricks For Silencing Make
@section Standard and generic ways to silence make

Here we describe some common idioms/tricks to obtain a quieter make
output, with their relative advantages and drawbacks.  In the next
section (@ref{Automake Silent Rules}) we'll see how Automake can help
in this respect, providing more elaborate and flexible idioms.

@itemize @bullet

@item @command{make -s}

This simply causes @command{make} not to print @emph{any} rule before
executing it.

The @option{-s} flag is mandated by POSIX, universally supported, and
its purpose and function are easy to understand.

But it also has its serious limitations too.  First of all, it embodies
an ``all or nothing'' strategy, i.e., either everything is silenced, or
nothing is; this lack of granularity can sometimes be a fatal flaw.
Moreover, when the @option{-s} flag is used, the @command{make} output
might turn out to be too much terse; in case of errors, the user won't
be able to easily see what rule or command have caused them, or even,
in case of tools with poor error reporting, what the errors were!

@item @command{make >/dev/null || make}

Apparently, this perfectly obeys the ``silence is golden'' rule: warnings
from stderr are passed through, output reporting is done only in case of
error, and in that case it should provide a verbose-enough report to allow
an easy determination of the error location and causes.

However, calling @command{make} two times in a row might hide errors
(especially intermittent ones), or subtly change the expected semantic
of the @command{make} calls --- things these which can clearly make
debugging and error assessment very difficult.

@item @command{make --no-print-directory}

This is GNU @command{make} specific.  When called with the
@option{--no-print-directory} option, GNU @command{make} will disable
printing of the working directory by invoked sub-@command{make}s (the
well-known ``@i{Entering/Leaving directory ...}'' messages).  This helps
to decrease the verbosity of the output, but experience has shown that
it can also often render debugging considerably harder in projects using
deeply-nested @command{make} recursion.

As an aside, notice that the @option{--no-print-directory} option is
automatically activated if the @option{-s} flag is used.

@c TODO: Other tricks?
@c TODO: Maybe speak about the @code{.SILENT} target?
@c TODO:  - Pros: More granularity on what to silence.
@c TODO:  - Cons: No easy way to temporarily override.

@end itemize

@node Automake Silent Rules
@section How Automake can help in silencing make

The tricks and idioms for silencing @command{make} described in the
previous section can be useful from time to time, but we've seen that
they all have their serious drawbacks and limitations.  That's why
automake provides support for a more advanced and flexible way of
obtaining quieter output from @command{make} (for most rules at least).

To give the gist of what Automake can do in this respect, here is a simple
comparison between a typical @command{make} output (where silent rules
are disabled) and one with silent rules enabled:

@example
% @kbd{cat Makefile.am}
bin_PROGRAMS = foo
foo_SOURCES = main.c func.c
% @kbd{cat main.c}
int main (void) @{ return func (); @}  /* func used undeclared */
% @kbd{cat func.c}
int func (void) @{ int i; return i; @} /* i used uninitialized */

@i{The make output is by default very verbose.  This causes warnings
from the compiler to be somewhat hidden, and not immediate to spot.}
% @kbd{make CFLAGS=-Wall}
gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
-DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
-DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT main.o
-MD -MP -MF .deps/main.Tpo -c -o main.o main.c
main.c: In function ‘main’:
main.c:3:3: warning: implicit declaration of function ‘func’
mv -f .deps/main.Tpo .deps/main.Po
gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
-DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
-DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT func.o
-MD -MP -MF .deps/func.Tpo -c -o func.o func.c
func.c: In function ‘func’:
func.c:4:3: warning: ‘i’ used uninitialized in this function
mv -f .deps/func.Tpo .deps/func.Po
gcc -Wall -o foo main.o func.o

@i{Clean up, so that we we can rebuild everything from scratch.}
% @kbd{make clean}
test -z "foo" || rm -f foo
rm -f *.o

@i{Silent rules enabled: the output is minimal but informative.  In
particular, the warnings from the compiler stick out very clearly.}
% @kbd{make V=0 CFLAGS=-Wall}
  CC     main.o
main.c: In function ‘main’:
main.c:3:3: warning: implicit declaration of function ‘func’
  CC     func.o
func.c: In function ‘func’:
func.c:4:3: warning: ‘i’ used uninitialized in this function
  CCLD   foo
@end example

@cindex silent rules and libtool
Also, in projects using @command{libtool}, the use of silent rules can
automatically enable the @command{libtool}'s @option{--silent} option:

@example
% @kbd{cat Makefile.am}
lib_LTLIBRARIES = libx.la

% @kbd{make # Both make and libtool are verbose by default.}
...
libtool: compile: gcc -DPACKAGE_NAME=\"foo\" ... -DLT_OBJDIR=\".libs/\"
  -I. -g -O2 -MT libx.lo -MD -MP -MF .deps/libx.Tpo -c libx.c -fPIC
  -DPIC -o .libs/libx.o
mv -f .deps/libx.Tpo .deps/libx.Plo
/bin/sh ./libtool --tag=CC --mode=link gcc -g -O2 -o libx.la -rpath
  /usr/local/lib libx.lo
libtool: link: gcc -shared .libs/libx.o -Wl,-soname -Wl,libx.so.0
  -o .libs/libx.so.0.0.0
libtool: link: cd .libs && rm -f libx.so && ln -s libx.so.0.0.0 libx.so
...

% @kbd{make V=0}
  CC     libx.lo
  CCLD   libx.la
@end example

For Automake-generated @file{Makefile}s, the user may influence the
verbosity at @command{configure} run time as well as at @command{make}
run time:

@itemize @bullet
@item
@opindex --enable-silent-rules
@opindex --disable-silent-rules
Passing @option{--enable-silent-rules} to @command{configure} will cause
build rules to be less verbose; the option @option{--disable-silent-rules}
will cause normal verbose output.
@item
@vindex @code{V}
At @command{make} run time, the default chosen at @command{configure}
time may be overridden: @code{make V=1} will produce verbose output,
@code{make V=0} less verbose output.
@end itemize

@cindex default verbosity for silent rules
Note that silent rules are @emph{disabled} by default; the user must
enable them explicitly at either @command{configure} run time or at
@command{make} run time.  We think that this is a good policy, since
it provides the casual user with enough information to prepare a good
bug report in case anything breaks.

Still, notwithstanding the rationales above, a developer who really
wants to make silent rules enabled by default in his own package can
do so by calling @code{AM_SILENT_RULES([yes])} in @file{configure.ac}.

@c Keep in sync with silent-configsite.sh
Users who prefer to have silent rules enabled by default can edit their
@file{config.site} file to make the variable @code{enable_silent_rules}
default to @samp{yes}.  This should still allow disabling silent rules
at @command{configure} time and at @command{make} time.

@c FIXME: there's really a need to specify this explicitly?
For portability to different @command{make} implementations, package authors
are advised to not set the variable @code{V} inside the @file{Makefile.am}
file, to allow the user to override the value for subdirectories as well.

To work at its best, the current implementation of this feature normally
uses nested variable expansion @samp{$(@var{var1}$(V))}, a @file{Makefile}
feature that is not required by POSIX 2008 but is widely supported in
practice.  On the rare @command{make} implementations that do not support
nested variable expansion, whether rules are silent is always determined at
configure time, and cannot be overridden at make time.  Future versions of
POSIX are likely to require nested variable expansion, so this minor
limitation should go away with time.

@vindex @code{AM_V_GEN}
@vindex @code{AM_V_at}
@vindex @code{AM_DEFAULT_VERBOSITY}
@vindex @code{AM_V}
@vindex @code{AM_DEFAULT_V}
To extend the silent mode to your own rules, you have few choices:

@itemize @bullet

@item
You can use the predefined variable @code{AM_V_GEN} as a prefix to
commands that should output a status line in silent mode, and
@code{AM_V_at} as a prefix to commands that should not output anything
in silent mode.  When output is to be verbose, both of these variables
will expand to the empty string.

@item
You can silence a recipe unconditionally with @code{@@}, and then use
the predefined variable @code{AM_V_P} to know whether make is being run
in silent or verbose mode, adjust the verbose information your recipe
displays accordingly:

@example
generate-headers:
        @set -e; \
        ... [commands defining a shell variable '$headers'] ...; \
        if $(AM_V_P); then set -x; else echo " GEN   [headers]"; fi; \
        rm -f $$headers && generate-header --flags $$headers
@end example

@item
You can add your own variables, so strings of your own choice are shown.
The following snippet shows how you would define your own equivalent of
@code{AM_V_GEN}:

@example
pkg_verbose = $(pkg_verbose_@@AM_V@@)
pkg_verbose_ = $(pkg_verbose_@@AM_DEFAULT_V@@)
pkg_verbose_0 = @@echo PKG-GEN $@@;

foo: foo.in
        $(pkg_verbose)cp $(srcdir)/foo.in $@@
@end example

@end itemize

As a final note, observe that, even when silent rules are enabled,
the @option{--no-print-directory} option is still required with GNU
@command{make} if the ``@i{Entering/Leaving directory ...}'' messages
are to be disabled.

@node Gnits
@chapter The effect of @option{--gnu} and @option{--gnits}

@cindex @option{--gnu}, required files
@cindex @option{--gnu}, complete description

The @option{--gnu} option (or @option{gnu} in the
@code{AUTOMAKE_OPTIONS} variable) causes @command{automake} to check
the following:

@itemize @bullet
@item
The files @file{INSTALL}, @file{NEWS}, @file{README}, @file{AUTHORS},
and @file{ChangeLog}, plus one of @file{COPYING.LIB}, @file{COPYING.LESSER}
or @file{COPYING}, are required at the topmost directory of the package.

If the @option{--add-missing} option is given, @command{automake} will
add a generic version of the @file{INSTALL} file as well as the
@file{COPYING} file containing the text of the current version of the
GNU General Public License existing at the time of this Automake release
(version 3 as this is written, @uref{https://www.gnu.org/@/copyleft/@/gpl.html}).
However, an existing @file{COPYING} file will never be overwritten by
@command{automake}.

@item
The options @option{no-installman} and @option{no-installinfo} are
prohibited.
@end itemize

Note that this option will be extended in the future to do even more
checking; it is advisable to be familiar with the precise requirements
of the GNU standards.  Also, @option{--gnu} can require certain
non-standard GNU programs to exist for use by various maintainer-only
rules; for instance, in the future @command{pathchk} might be required for
@samp{make dist}.

@cindex @option{--gnits}, complete description

The @option{--gnits} option does everything that @option{--gnu} does, and
checks the following as well:

@itemize @bullet
@item
@samp{make installcheck} will check to make sure that the @option{--help}
and @option{--version} really print a usage message and a version string,
respectively.  This is the @option{std-options} option (@pxref{Options}).

@item
@samp{make dist} will check to make sure the @file{NEWS} file has been
updated to the current version.

@item
@code{VERSION} is checked to make sure its format complies with Gnits
standards.
@c FIXME xref when standards are finished

@item
@cindex @file{README-alpha}
If @code{VERSION} indicates that this is an alpha release, and the file
@file{README-alpha} appears in the topmost directory of a package, then
it is included in the distribution.  This is done in @option{--gnits}
mode, and no other, because this mode is the only one where version
number formats are constrained, and hence the only mode where Automake
can automatically determine whether @file{README-alpha} should be
included.

@item
The file @file{THANKS} is required.
@end itemize


@node Not Enough
@chapter When Automake Isn't Enough

In some situations, where Automake is not up to one task, one has to
resort to handwritten rules or even handwritten @file{Makefile}s.

@menu
* Extending::                   Adding new rules or overriding existing ones.
* Third-Party Makefiles::       Integrating Non-Automake @file{Makefile}s.
@end menu

@node Extending
@section Extending Automake Rules

With some minor exceptions (for example @code{_PROGRAMS} variables,
@code{TESTS}, or @code{XFAIL_TESTS}) being rewritten to append
@samp{$(EXEEXT)}), the contents of a @file{Makefile.am} is copied to
@file{Makefile.in} verbatim.

@cindex copying semantics

These copying semantics mean that many problems can be worked around
by simply adding some @command{make} variables and rules to
@file{Makefile.am}.  Automake will ignore these additions.

@cindex conflicting definitions
@cindex rules, conflicting
@cindex variables, conflicting
@cindex definitions, conflicts

Since a @file{Makefile.in} is built from data gathered from three
different places (@file{Makefile.am}, @file{configure.ac}, and
@command{automake} itself), it is possible to have conflicting
definitions of rules or variables.  When building @file{Makefile.in}
the following priorities are respected by @command{automake} to ensure
the user always has the last word:

@itemize
@item
User defined variables in @file{Makefile.am} have priority over
variables @code{AC_SUBST}ed from @file{configure.ac}, and
@code{AC_SUBST}ed variables have priority over
@command{automake}-defined variables.
@item
As far as rules are concerned, a user-defined rule overrides any
@command{automake}-defined rule for the same target.
@end itemize

@cindex overriding rules
@cindex overriding semantics
@cindex rules, overriding

These overriding semantics make it possible to fine tune some default
settings of Automake, or replace some of its rules.  Overriding
Automake rules is often inadvisable, particularly in the topmost
directory of a package with subdirectories.  The @option{-Woverride}
option (@pxref{automake Invocation}) comes in handy to catch overridden
definitions.

Note that Automake does not make any distinction between rules with
commands and rules that only specify dependencies.  So it is not
possible to append new dependencies to an @command{automake}-defined
target without redefining the entire rule.

@cindex @option{-local} targets
@cindex local targets

However, various useful targets have a @samp{-local} version you can
specify in your @file{Makefile.am}.  Automake will supplement the
standard target with these user-supplied targets.

@trindex  all
@trindex  all-local
@trindex  info
@trindex  info-local
@trindex  dvi
@trindex  dvi-local
@trindex  ps
@trindex  ps-local
@trindex  pdf
@trindex  pdf-local
@trindex  html
@trindex  html-local
@trindex  check
@trindex  check-local
@trindex  install
@trindex  install-data
@trindex  install-data-local
@trindex  install-dvi
@trindex  install-dvi-local
@trindex  install-exec
@trindex  install-exec-local
@trindex  install-html
@trindex  install-html-local
@trindex  install-info
@trindex  install-info-local
@trindex  install-pdf
@trindex  install-pdf-local
@trindex  install-ps
@trindex  install-ps-local
@trindex  uninstall
@trindex  uninstall-local
@trindex  mostlyclean
@trindex  mostlyclean-local
@trindex  clean
@trindex  clean-local
@trindex  distclean
@trindex  distclean-local
@trindex  installdirs
@trindex  installdirs-local
@trindex  installcheck
@trindex  installcheck-local

The targets that support a local version are @code{all}, @code{info},
@code{dvi}, @code{ps}, @code{pdf}, @code{html}, @code{check},
@code{install-data}, @code{install-dvi}, @code{install-exec},
@code{install-html}, @code{install-info}, @code{install-pdf},
@code{install-ps}, @code{uninstall}, @code{installdirs},
@code{installcheck} and the various @code{clean} targets
(@code{mostlyclean}, @code{clean}, @code{distclean}, and
@code{maintainer-clean}).

Note that there are no @code{uninstall-exec-local} or
@code{uninstall-data-local} targets; just use @code{uninstall-local}.
It doesn't make sense to uninstall just data or just executables.

For instance, here is one way to erase a subdirectory during
@samp{make clean} (@pxref{Clean}).

@example
clean-local:
        -rm -rf testSubDir
@end example

You may be tempted to use @code{install-data-local} to install a file
to some hard-coded location, but you should avoid this
(@pxref{Hard-Coded Install Paths}).

With the @code{-local} targets, there is no particular guarantee of
execution order; typically, they are run early, but with parallel
make, there is no way to be sure of that.

@cindex @option{-hook} targets
@cindex hook targets
@trindex install-data-hook
@trindex install-exec-hook
@trindex uninstall-hook
@trindex dist-hook

In contrast, some rules also have a way to run another rule, called a
@dfn{hook}; hooks are always executed after the main rule's work is done.
The hook is named after the principal target, with @samp{-hook} appended.
The targets allowing hooks are @code{install-data},
@code{install-exec}, @code{uninstall}, @code{dist}, and
@code{distcheck}.

For instance, here is how to create a hard link to an installed program:

@example
install-exec-hook:
        ln $(DESTDIR)$(bindir)/program$(EXEEXT) \
           $(DESTDIR)$(bindir)/proglink$(EXEEXT)
@end example

Although cheaper and more portable than symbolic links, hard links
will not work everywhere (for instance, OS/2 does not have
@command{ln}).  Ideally you should fall back to @samp{cp -p} when
@command{ln} does not work.  An easy way, if symbolic links are
acceptable to you, is to add @code{AC_PROG_LN_S} to
@file{configure.ac} (@pxref{Particular Programs, , Particular Program
Checks, autoconf, The Autoconf Manual}) and use @samp{$(LN_S)} in
@file{Makefile.am}.

@cindex versioned binaries, installing
@cindex installing versioned binaries
@cindex @code{LN_S} example
For instance, here is how you could install a versioned copy of a
program using @samp{$(LN_S)}:

@c Keep in sync with insthook.sh
@example
install-exec-hook:
        cd $(DESTDIR)$(bindir) && \
          mv -f prog$(EXEEXT) prog-$(VERSION)$(EXEEXT) && \
          $(LN_S) prog-$(VERSION)$(EXEEXT) prog$(EXEEXT)
@end example

Note that we rename the program so that a new version will erase the
symbolic link, not the real binary.  Also we @command{cd} into the
destination directory in order to create relative links.

When writing @code{install-exec-hook} or @code{install-data-hook},
please bear in mind that the exec/data distinction is based on the
installation directory, not on the primary used (@pxref{The Two Parts of
Install}).
@c Keep in sync with primary-prefix-couples-documented-valid.sh
So a @code{foo_SCRIPTS} will be installed by
@code{install-data}, and a @code{barexec_SCRIPTS} will be installed by
@code{install-exec}.  You should define your hooks consequently.

@c FIXME should include discussion of variables you can use in these
@c rules

@node Third-Party Makefiles
@section Third-Party @file{Makefile}s

@cindex Third-party packages, interfacing with
@cindex Interfacing with third-party packages

In most projects all @file{Makefile}s are generated by Automake.  In
some cases, however, projects need to embed subdirectories with
handwritten @file{Makefile}s.  For instance, one subdirectory could be
a third-party project with its own build system, not using Automake.

It is possible to list arbitrary directories in @code{SUBDIRS} or
@code{DIST_SUBDIRS} provided each of these directories has a
@file{Makefile} that recognizes all the following recursive targets.

@cindex recursive targets and third-party @file{Makefile}s
When a user runs one of these targets, that target is run recursively
in all subdirectories.  This is why it is important that even
third-party @file{Makefile}s support them.

@table @code
@item all
Compile the entire package.  This is the default target in
Automake-generated @file{Makefile}s, but it does not need to be the
default in third-party @file{Makefile}s.

@item distdir
@trindex distdir
@vindex distdir
@vindex top_distdir
Copy files to distribute into @samp{$(distdir)}, before a tarball is
constructed.  Of course this target is not required if the
@option{no-dist} option (@pxref{Options}) is used.

The variables @samp{$(top_distdir)} and @samp{$(distdir)}
(@pxref{The dist Hook}) will be passed from the outer package to the subpackage
when the @code{distdir} target is invoked.  These two variables have
been adjusted for the directory that is being recursed into, so they
are ready to use.

@item install
@itemx install-data
@itemx install-exec
@itemx uninstall
Install or uninstall files (@pxref{Install}).

@item install-dvi
@itemx install-html
@itemx install-info
@itemx install-ps
@itemx install-pdf
Install only some specific documentation format (@pxref{Texinfo}).

@item installdirs
Create install directories, but do not install any files.

@item check
@itemx installcheck
Check the package (@pxref{Tests}).

@item mostlyclean
@itemx clean
@itemx distclean
@itemx maintainer-clean
Cleaning rules (@pxref{Clean}).

@item dvi
@itemx pdf
@itemx ps
@itemx info
@itemx html
Build the documentation in various formats (@pxref{Texinfo}).

@item tags
@itemx ctags
Build @file{TAGS} and @file{CTAGS} (@pxref{Tags}).
@end table

If you have ever used Gettext in a project, this is a good example of
how third-party @file{Makefile}s can be used with Automake.  The
@file{Makefile}s @command{gettextize} puts in the @file{po/} and
@file{intl/} directories are handwritten @file{Makefile}s that
implement all of these targets.  That way they can be added to
@code{SUBDIRS} in Automake packages.

Directories that are only listed in @code{DIST_SUBDIRS} but not in
@code{SUBDIRS} need only the @code{distclean},
@code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional
Subdirectories}).

Usually, many of these rules are irrelevant to the third-party
subproject, but they are required for the whole package to work.  It's
OK to have a rule that does nothing, so if you are integrating a
third-party project with no documentation or tag support, you could
simply augment its @file{Makefile} as follows:

@example
EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags
.PHONY: $(EMPTY_AUTOMAKE_TARGETS)
$(EMPTY_AUTOMAKE_TARGETS):
@end example

Another aspect of integrating third-party build systems is whether
they support VPATH builds (@pxref{VPATH Builds}).  Obviously if the
subpackage does not support VPATH builds the whole package will not
support VPATH builds.  This in turns means that @samp{make distcheck}
will not work, because it relies on VPATH builds.  Some people can
live without this (actually, many Automake users have never heard of
@samp{make distcheck}).  Other people may prefer to revamp the
existing @file{Makefile}s to support VPATH@.  Doing so does not
necessarily require Automake, only Autoconf is needed (@pxref{Build
Directories, , Build Directories, autoconf, The Autoconf Manual}).
The necessary substitutions: @samp{@@srcdir@@}, @samp{@@top_srcdir@@},
and @samp{@@top_builddir@@} are defined by @file{configure} when it
processes a @file{Makefile} (@pxref{Preset Output Variables, , Preset
Output Variables, autoconf, The Autoconf Manual}), they are not
computed by the Makefile like the aforementioned @samp{$(distdir)} and
@samp{$(top_distdir)} variables.

It is sometimes inconvenient to modify a third-party @file{Makefile}
to introduce the above required targets.  For instance, one may want to
keep the third-party sources untouched to ease upgrades to new
versions.

@cindex @file{GNUmakefile} including @file{Makefile}
Here are two other ideas.  If GNU make is assumed, one possibility is
to add to that subdirectory a @file{GNUmakefile} that defines the
required targets and includes the third-party @file{Makefile}.  For
this to work in VPATH builds, @file{GNUmakefile} must lie in the build
directory; the easiest way to do this is to write a
@file{GNUmakefile.in} instead, and have it processed with
@code{AC_CONFIG_FILES} from the outer package.  For example if we
assume @file{Makefile} defines all targets except the documentation
targets, and that the @code{check} target is actually called
@code{test}, we could write @file{GNUmakefile} (or
@file{GNUmakefile.in}) like this:

@example
# First, include the real Makefile
include Makefile
# Then, define the other targets needed by Automake Makefiles.
.PHONY: dvi pdf ps info html check
dvi pdf ps info html:
check: test
@end example

@cindex Proxy @file{Makefile} for third-party packages
A similar idea that does not use @code{include} is to write a proxy
@file{Makefile} that dispatches rules to the real @file{Makefile},
either with @samp{$(MAKE) -f Makefile.real $(AM_MAKEFLAGS) target} (if
it's OK to rename the original @file{Makefile}) or with @samp{cd
subdir && $(MAKE) $(AM_MAKEFLAGS) target} (if it's OK to store the
subdirectory project one directory deeper).  The good news is that
this proxy @file{Makefile} can be generated with Automake.  All we
need are @option{-local} targets (@pxref{Extending}) that perform the
dispatch.  Of course the other Automake features are available, so you
could decide to let Automake perform distribution or installation.
Here is a possible @file{Makefile.am}:

@example
all-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) all
check-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) test
clean-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) clean

# Assuming the package knows how to install itself
install-data-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-data
install-exec-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-exec
uninstall-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) uninstall

# Distribute files from here.
EXTRA_DIST = subdir/Makefile subdir/program.c ...
@end example

Pushing this idea to the extreme, it is also possible to ignore the
subproject build system and build everything from this proxy
@file{Makefile.am}.  This might sound very sensible if you need VPATH
builds but the subproject does not support them.

@node Distributing
@chapter Distributing @file{Makefile.in}s

Automake places no restrictions on the distribution of the resulting
@file{Makefile.in}s.  We still encourage software authors to
distribute their work under terms like those of the GPL, but doing so
is not required to use Automake.

Some of the files that can be automatically installed via the
@option{--add-missing} switch do fall under the GPL@.  However, these also
have a special exception allowing you to distribute them with your
package, regardless of the licensing you choose.


@node API Versioning
@chapter Automake API Versioning

New Automake releases usually include bug fixes and new features.
Unfortunately they may also introduce new bugs and incompatibilities.
This makes four reasons why a package may require a particular Automake
version.

Things get worse when maintaining a large tree of packages, each one
requiring a different version of Automake.  In the past, this meant that
any developer (and sometimes users) had to install several versions of
Automake in different places, and switch @samp{$PATH} appropriately for
each package.

Starting with version 1.6, Automake installs versioned binaries.  This
means you can install several versions of Automake in the same
@samp{$prefix}, and can select an arbitrary Automake version by running
@command{automake-1.6} or @command{automake-1.7} without juggling with
@samp{$PATH}.  Furthermore, @file{Makefile}'s generated by Automake 1.6
will use @command{automake-1.6} explicitly in their rebuild rules.

The number @samp{1.6} in @command{automake-1.6} is Automake's API version,
not Automake's version.  If a bug fix release is made, for instance
Automake 1.6.1, the API version will remain 1.6.  This means that a
package that works with Automake 1.6 should also work with 1.6.1; after
all, this is what people expect from bug fix releases.

If your package relies on a feature or a bug fix introduced in
a release, you can pass this version as an option to Automake to ensure
older releases will not be used.  For instance, use this in your
@file{configure.ac}:

@example
  AM_INIT_AUTOMAKE([1.6.1])    dnl Require Automake 1.6.1 or better.
@end example

@noindent
or, in a particular @file{Makefile.am}:

@example
  AUTOMAKE_OPTIONS = 1.6.1   # Require Automake 1.6.1 or better.
@end example

@noindent
Automake will print an error message if its version is
older than the requested version.


@heading What is in the API

Automake's programming interface is not easy to define.  Basically it
should include at least all @strong{documented} variables and targets
that a @file{Makefile.am} author can use, any behavior associated with
them (e.g., the places where @samp{-hook}'s are run), the command line
interface of @command{automake} and @command{aclocal}, @dots{}

@heading What is not in the API

Every undocumented variable, target, or command line option, is not part
of the API@.  You should avoid using them, as they could change from one
version to the other (even in bug fix releases, if this helps to fix a
bug).

If it turns out you need to use such an undocumented feature, contact
@email{automake@@gnu.org} and try to get it documented and exercised by
the test-suite.

@node Upgrading
@chapter Upgrading a Package to a Newer Automake Version

Automake maintains three kind of files in a package.

@itemize
@item @file{aclocal.m4}
@item @file{Makefile.in}s
@item auxiliary tools like @file{install-sh} or @file{py-compile}
@end itemize

@file{aclocal.m4} is generated by @command{aclocal} and contains some
Automake-supplied M4 macros.  Auxiliary tools are installed by
@samp{automake --add-missing} when needed.  @file{Makefile.in}s are
built from @file{Makefile.am} by @command{automake}, and rely on the
definitions of the M4 macros put in @file{aclocal.m4} as well as the
behavior of the auxiliary tools installed.

Because all of these files are closely related, it is important to
regenerate all of them when upgrading to a newer Automake release.
The usual way to do that is

@example
aclocal # with any option needed (such a -I m4)
autoconf
automake --add-missing --force-missing
@end example

@noindent
or more conveniently:

@example
autoreconf -vfi
@end example

The use of @option{--force-missing} ensures that auxiliary tools will be
overridden by new versions (@pxref{automake Invocation}).

It is important to regenerate all of these files each time Automake is
upgraded, even between bug fixes releases.  For instance, it is not
unusual for a bug fix to involve changes to both the rules generated
in @file{Makefile.in} and the supporting M4 macros copied to
@file{aclocal.m4}.

Presently @command{automake} is able to diagnose situations where
@file{aclocal.m4} has been generated with another version of
@command{aclocal}.  However it never checks whether auxiliary scripts
are up-to-date.  In other words, @command{automake} will tell you when
@command{aclocal} needs to be rerun, but it will never diagnose a
missing @option{--force-missing}.

Before upgrading to a new major release, it is a good idea to read the
file @file{NEWS}.  This file lists all changes between releases: new
features, obsolete constructs, known incompatibilities, and
workarounds.

@node FAQ
@chapter Frequently Asked Questions about Automake

This chapter covers some questions that often come up on the mailing
lists.

@menu
* CVS::                         CVS and generated files
* maintainer-mode::             missing and AM_MAINTAINER_MODE
* Wildcards::                   Why doesn't Automake support wildcards?
* Limitations on File Names::   Limitations on source and installed file names
* Errors with distclean::       Files left in build directory after distclean
* Flag Variables Ordering::     CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
* Renamed Objects::             Why are object files sometimes renamed?
* Per-Object Flags::            How to simulate per-object flags?
* Multiple Outputs::            Writing rules for tools with many output files
* Hard-Coded Install Paths::    Installing to hard-coded locations
* Debugging Make Rules::        Strategies when things don't work as expected
* Reporting Bugs::              Feedback on bugs and feature requests
@end menu

@node CVS
@section CVS and generated files

@subheading Background: distributed generated Files
@cindex generated files, distributed
@cindex rebuild rules

Packages made with Autoconf and Automake ship with some generated
files like @file{configure} or @file{Makefile.in}.  These files were
generated on the developer's machine and are distributed so that
end-users do not have to install the maintainer tools required to
rebuild them.  Other generated files like Lex scanners, Yacc parsers,
or Info documentation, are usually distributed on similar grounds.

Automake output rules in @file{Makefile}s to rebuild these files.  For
instance, @command{make} will run @command{autoconf} to rebuild
@file{configure} whenever @file{configure.ac} is changed.  This makes
development safer by ensuring a @file{configure} is never out-of-date
with respect to @file{configure.ac}.

As generated files shipped in packages are up-to-date, and because
@command{tar} preserves times-tamps, these rebuild rules are not
triggered when a user unpacks and builds a package.

@subheading Background: CVS and Timestamps
@cindex timestamps and CVS
@cindex CVS and timestamps

Unless you use CVS keywords (in which case files must be updated at
commit time), CVS preserves timestamp during @samp{cvs commit} and
@samp{cvs import -d} operations.

When you check out a file using @samp{cvs checkout} its timestamp is
set to that of the revision that is being checked out.

However, during @command{cvs update}, files will have the date of the
update, not the original timestamp of this revision.  This is meant to
make sure that @command{make} notices sources files have been updated.

This timestamp shift is troublesome when both sources and generated
files are kept under CVS@.  Because CVS processes files in lexical
order, @file{configure.ac} will appear newer than @file{configure}
after a @command{cvs update} that updates both files, even if
@file{configure} was newer than @file{configure.ac} when it was
checked in.  Calling @command{make} will then trigger a spurious rebuild
of @file{configure}.

@subheading Living with CVS in Autoconfiscated Projects
@cindex CVS and generated files
@cindex generated files and CVS

There are basically two clans amongst maintainers: those who keep all
distributed files under CVS, including generated files, and those who
keep generated files @emph{out} of CVS.

@subsubheading All Files in CVS

@itemize @bullet
@item
The CVS repository contains all distributed files so you know exactly
what is distributed, and you can checkout any prior version entirely.

@item
Maintainers can see how generated files evolve (for instance, you can
see what happens to your @file{Makefile.in}s when you upgrade Automake
and make sure they look OK).

@item
Users do not need the autotools to build a checkout of the project, it
works just like a released tarball.

@item
If users use @command{cvs update} to update their copy, instead of
@command{cvs checkout} to fetch a fresh one, timestamps will be
inaccurate.  Some rebuild rules will be triggered and attempt to
run developer tools such as @command{autoconf} or @command{automake}.

Calls to such tools are all wrapped into a call to the @command{missing}
script discussed later (@pxref{maintainer-mode}), so that the user will
see more descriptive warnings about missing or out-of-date tools, and
possible suggestions about how to obtain them, rather than just some
``command not found'' error, or (worse) some obscure message from some
older version of the required tool they happen to have installed.

Maintainers interested in keeping their package buildable from a CVS
checkout even for those users that lack maintainer-specific tools might
want to provide an helper script (or to enhance their existing bootstrap
script) to fix the timestamps after a
@command{cvs update} or a @command{git checkout}, to prevent spurious
rebuilds.  In case of a project committing the Autotools-generated
files, as well as the generated @file{.info} files, such script might
look something like this:

@smallexample
#!/bin/sh
# fix-timestamp.sh: prevents useless rebuilds after "cvs update"
sleep 1
# aclocal-generated aclocal.m4 depends on locally-installed
# '.m4' macro files, as well as on 'configure.ac'
touch aclocal.m4
sleep 1
# autoconf-generated configure depends on aclocal.m4 and on
# configure.ac
touch configure
# so does autoheader-generated config.h.in
touch config.h.in
# and all the automake-generated Makefile.in files
touch `find . -name Makefile.in -print`
# finally, the makeinfo-generated '.info' files depend on the
# corresponding '.texi' files
touch doc/*.info
@end smallexample

@item
In distributed development, developers are likely to have different
version of the maintainer tools installed.  In this case rebuilds
triggered by timestamp lossage will lead to spurious changes
to generated files.  There are several solutions to this:

@itemize
@item
All developers should use the same versions, so that the rebuilt files
are identical to files in CVS@.  (This starts to be difficult when each
project you work on uses different versions.)
@item
Or people use a script to fix the timestamp after a checkout (the GCC
folks have such a script).
@item
Or @file{configure.ac} uses @code{AM_MAINTAINER_MODE}, which will
disable all of these rebuild rules by default.  This is further discussed
in @ref{maintainer-mode}.
@end itemize

@item
Although we focused on spurious rebuilds, the converse can also
happen.  CVS's timestamp handling can also let you think an
out-of-date file is up-to-date.

For instance, suppose a developer has modified @file{Makefile.am} and
has rebuilt @file{Makefile.in}, and then decides to do a last-minute
change to @file{Makefile.am} right before checking in both files
(without rebuilding @file{Makefile.in} to account for the change).

This last change to @file{Makefile.am} makes the copy of
@file{Makefile.in} out-of-date.  Since CVS processes files
alphabetically, when another developer @samp{cvs update}s his or her
tree, @file{Makefile.in} will happen to be newer than
@file{Makefile.am}.  This other developer will not see that
@file{Makefile.in} is out-of-date.

@end itemize

@subsubheading Generated Files out of CVS

One way to get CVS and @command{make} working peacefully is to never
store generated files in CVS, i.e., do not CVS-control files that
are @file{Makefile} targets (also called @emph{derived} files).

This way developers are not annoyed by changes to generated files.  It
does not matter if they all have different versions (assuming they are
compatible, of course).  And finally, timestamps are not lost, changes
to sources files can't be missed as in the
@file{Makefile.am}/@file{Makefile.in} example discussed earlier.

The drawback is that the CVS repository is not an exact copy of what
is distributed and that users now need to install various development
tools (maybe even specific versions) before they can build a checkout.
But, after all, CVS's job is versioning, not distribution.

Allowing developers to use different versions of their tools can also
hide bugs during distributed development.  Indeed, developers will be
using (hence testing) their own generated files, instead of the
generated files that will be released actually.  The developer who
prepares the tarball might be using a version of the tool that
produces bogus output (for instance a non-portable C file), something
other developers could have noticed if they weren't using their own
versions of this tool.

@subheading Third-party Files
@cindex CVS and third-party files
@cindex third-party files and CVS

Another class of files not discussed here (because they do not cause
timestamp issues) are files that are shipped with a package, but
maintained elsewhere.  For instance, tools like @command{gettextize}
and @command{autopoint} (from Gettext) or @command{libtoolize} (from
Libtool), will install or update files in your package.

These files, whether they are kept under CVS or not, raise similar
concerns about version mismatch between developers' tools.  The
Gettext manual has a section about this, see @ref{CVS Issues, CVS
Issues, Integrating with CVS, gettext, GNU gettext tools}.

@node maintainer-mode
@section @command{missing} and @code{AM_MAINTAINER_MODE}

@subheading @command{missing}
@cindex @command{missing}, purpose

The @command{missing} script is a wrapper around several maintainer
tools, designed to warn users if a maintainer tool is required but
missing.  Typical maintainer tools are @command{autoconf},
@command{automake}, @command{bison}, etc.  Because file generated by
these tools are shipped with the other sources of a package, these
tools shouldn't be required during a user build and they are not
checked for in @file{configure}.

However, if for some reason a rebuild rule is triggered and involves a
missing tool, @command{missing} will notice it and warn the user, even
suggesting how to obtain such a tool (at least in case it is a well-known
one, like @command{makeinfo} or @command{bison}).  This is more helpful
and user-friendly than just having the rebuild rules spewing out a terse
error message like @samp{sh: @var{tool}: command not found}.  Similarly,
@command{missing} will warn the user if it detects that a maintainer
tool it attempted to use seems too old (be warned that diagnosing this
correctly is typically more difficult that detecting missing tools, and
requires cooperation from the tool itself, so it won't always work).

If the required tool is installed, @command{missing} will run it and
won't attempt to continue after failures.  This is correct during
development: developers love fixing failures.  However, users with
missing or too old maintainer tools may get an error when the rebuild
rule is spuriously triggered, halting the build.  This failure to let
the build continue is one of the arguments of the
@code{AM_MAINTAINER_MODE} advocates.

@subheading @code{AM_MAINTAINER_MODE}
@cindex @code{AM_MAINTAINER_MODE}, purpose
@acindex AM_MAINTAINER_MODE

@code{AM_MAINTAINER_MODE} allows you to choose whether the so called
"rebuild rules" should be enabled or disabled.  With
@code{AM_MAINTAINER_MODE([enable])}, they are enabled by default,
otherwise they are disabled by default.  In the latter case, if
you have @code{AM_MAINTAINER_MODE} in @file{configure.ac}, and run
@samp{./configure && make}, then @command{make} will *never* attempt to
rebuild @file{configure}, @file{Makefile.in}s, Lex or Yacc outputs, etc.
I.e., this disables build rules for files that are usually distributed
and that users should normally not have to update.

The user can override the default setting by passing either
@samp{--enable-maintainer-mode} or @samp{--disable-maintainer-mode}
to @command{configure}.

People use @code{AM_MAINTAINER_MODE} either because they do not want their
users (or themselves) annoyed by timestamps lossage (@pxref{CVS}), or
because they simply can't stand the rebuild rules and prefer running
maintainer tools explicitly.

@code{AM_MAINTAINER_MODE} also allows you to disable some custom build
rules conditionally.  Some developers use this feature to disable
rules that need exotic tools that users may not have available.

Several years ago Fran@,{c}ois Pinard pointed out several arguments
against this @code{AM_MAINTAINER_MODE} macro.  Most of them relate to
insecurity.  By removing dependencies you get non-dependable builds:
changes to sources files can have no effect on generated files and this
can be very confusing when unnoticed.  He adds that security shouldn't
be reserved to maintainers (what @option{--enable-maintainer-mode}
suggests), on the contrary.  If one user has to modify a
@file{Makefile.am}, then either @file{Makefile.in} should be updated
or a warning should be output (this is what Automake uses
@command{missing} for) but the last thing you want is that nothing
happens and the user doesn't notice it (this is what happens when
rebuild rules are disabled by @code{AM_MAINTAINER_MODE}).

Jim Meyering, the inventor of the @code{AM_MAINTAINER_MODE} macro was
swayed by Fran@,{c}ois's arguments, and got rid of
@code{AM_MAINTAINER_MODE} in all of his packages.

Still many people continue to use @code{AM_MAINTAINER_MODE}, because
it helps them working on projects where all files are kept under version
control, and because @command{missing} isn't enough if you have the
wrong version of the tools.


@node Wildcards
@section Why doesn't Automake support wildcards?
@cindex wildcards

Developers are lazy.  They would often like to use wildcards in
@file{Makefile.am}s, so that they would not need to remember to
update @file{Makefile.am}s every time they add, delete, or rename
a file.

There are several objections to this:
@itemize
@item
When using CVS (or similar) developers need to remember they have to
run @samp{cvs add} or @samp{cvs rm} anyway.  Updating
@file{Makefile.am} accordingly quickly becomes a reflex.

Conversely, if your application doesn't compile
because you forgot to add a file in @file{Makefile.am}, it will help
you remember to @samp{cvs add} it.

@item
Using wildcards makes it easy to distribute files by mistake.  For
instance, some code a developer is experimenting with (a test case,
say) that should not be part of the distribution.

@item
Using wildcards it's easy to omit some files by mistake.  For
instance, one developer creates a new file, uses it in many places,
but forgets to commit it.  Another developer then checks out the
incomplete project and is able to run @samp{make dist} successfully,
even though a file is missing. By listing files, @samp{make dist}
@emph{will} complain.

@item
Wildcards are not portable to some non-GNU @command{make} implementations,
e.g., NetBSD @command{make} will not expand globs such as @samp{*} in
prerequisites of a target.

@item
Finally, it's really hard to @emph{forget} to add a file to
@file{Makefile.am}: files that are not listed in @file{Makefile.am} are
not compiled or installed, so you can't even test them.
@end itemize

Still, these are philosophical objections, and as such you may disagree,
or find enough value in wildcards to dismiss all of them.  Before you
start writing a patch against Automake to teach it about wildcards,
let's see the main technical issue: portability.

Although @samp{$(wildcard ...)} works with GNU @command{make}, it is
not portable to other @command{make} implementations.

The only way Automake could support @command{$(wildcard ...)} is by
expanding @command{$(wildcard ...)} when @command{automake} is run.
The resulting @file{Makefile.in}s would be portable since they would
list all files and not use @samp{$(wildcard ...)}.  However that
means developers would need to remember to run @command{automake} each
time they add, delete, or rename files.

Compared to editing @file{Makefile.am}, this is a very small gain.  Sure,
it's easier and faster to type @samp{automake; make} than to type
@samp{emacs Makefile.am; make}.  But nobody bothered enough to write a
patch to add support for this syntax.  Some people use scripts to
generate file lists in @file{Makefile.am} or in separate
@file{Makefile} fragments.

Even if you don't care about portability, and are tempted to use
@samp{$(wildcard ...)} anyway because you target only GNU Make, you
should know there are many places where Automake needs to know exactly
which files should be processed.  As Automake doesn't know how to
expand @samp{$(wildcard ...)}, you cannot use it in these places.
@samp{$(wildcard ...)} is a black box comparable to @code{AC_SUBST}ed
variables as far Automake is concerned.

You can get warnings about @samp{$(wildcard ...}) constructs using the
@option{-Wportability} flag.

@node Limitations on File Names
@section Limitations on File Names
@cindex file names, limitations on

Automake attempts to support all kinds of file names, even those that
contain unusual characters or are unusually long.  However, some
limitations are imposed by the underlying operating system and tools.

Most operating systems prohibit the use of the null byte in file
names, and reserve @samp{/} as a directory separator.  Also, they
require that file names are properly encoded for the user's locale.
Automake is subject to these limits.

Portable packages should limit themselves to POSIX file
names.  These can contain ASCII letters and digits,
@samp{_}, @samp{.}, and @samp{-}.  File names consist of components
separated by @samp{/}.  File name components cannot begin with
@samp{-}.

Portable POSIX file names cannot contain components that exceed a
14-byte limit, but nowadays it's normally safe to assume the
more-generous XOPEN limit of 255 bytes.  POSIX
limits file names to 255 bytes (XOPEN allows 1023 bytes),
but you may want to limit a source tarball to file names of 99 bytes
to avoid interoperability problems with old versions of @command{tar}.

If you depart from these rules (e.g., by using non-ASCII
characters in file names, or by using lengthy file names), your
installers may have problems for reasons unrelated to Automake.
However, if this does not concern you, you should know about the
limitations imposed by Automake itself.  These limitations are
undesirable, but some of them seem to be inherent to underlying tools
like Autoconf, Make, M4, and the shell.  They fall into three
categories: install directories, build directories, and file names.

The following characters:

@example
@r{newline} " # $ ' `
@end example

should not appear in the names of install directories.  For example,
the operand of @command{configure}'s @option{--prefix} option should
not contain these characters.

Build directories suffer the same limitations as install directories,
and in addition should not contain the following characters:

@example
& @@ \
@end example

For example, the full name of the directory containing the source
files should not contain these characters.

Source and installation file names like @file{main.c} are limited even
further: they should conform to the POSIX/XOPEN
rules described above.  In addition, if you plan to port to
non-POSIX environments, you should avoid file names that
differ only in case (e.g., @file{makefile} and @file{Makefile}).
Nowadays it is no longer worth worrying about the 8.3 limits of
DOS file systems.

@c FIXME This should probably be moved in the "Checking the Distribution"
@c FIXME section...
@node Errors with distclean
@section Errors with distclean
@cindex @code{distclean}, diagnostic
@cindex @samp{make distclean}, diagnostic
@cindex dependencies and distributed files
@trindex distclean

This is a diagnostic you might encounter while running @samp{make
distcheck}.

As explained in @ref{Checking the Distribution}, @samp{make distcheck}
attempts to build and check your package for errors like this one.

@samp{make distcheck} will perform a @code{VPATH} build of your
package (@pxref{VPATH Builds}), and then call @samp{make distclean}.
Files left in the build directory after @samp{make distclean} has run
are listed after this error.

This diagnostic really covers two kinds of errors:

@itemize @bullet
@item
files that are forgotten by distclean;
@item
distributed files that are erroneously rebuilt.
@end itemize

The former left-over files are not distributed, so the fix is to mark
them for cleaning (@pxref{Clean}), this is obvious and doesn't deserve
more explanations.

The latter bug is not always easy to understand and fix, so let's
proceed with an example.  Suppose our package contains a program for
which we want to build a man page using @command{help2man}.  GNU
@command{help2man} produces simple manual pages from the @option{--help}
and @option{--version} output of other commands (@pxref{Top, , Overview,
help2man, The Help2man Manual}).  Because we don't want to force our
users to install @command{help2man}, we decide to distribute the
generated man page using the following setup.

@example
# This Makefile.am is bogus.
bin_PROGRAMS = foo
foo_SOURCES = foo.c
dist_man_MANS = foo.1

foo.1: foo$(EXEEXT)
        help2man --output=foo.1 ./foo$(EXEEXT)
@end example

This will effectively distribute the man page.  However,
@samp{make distcheck} will fail with:

@example
ERROR: files left in build directory after distclean:
./foo.1
@end example

Why was @file{foo.1} rebuilt?  Because although distributed,
@file{foo.1} depends on a non-distributed built file:
@file{foo$(EXEEXT)}.  @file{foo$(EXEEXT)} is built by the user, so it
will always appear to be newer than the distributed @file{foo.1}.

@samp{make distcheck} caught an inconsistency in our package.  Our
intent was to distribute @file{foo.1} so users do not need to install
@command{help2man}, however since this rule causes this file to be
always rebuilt, users @emph{do} need @command{help2man}.  Either we
should ensure that @file{foo.1} is not rebuilt by users, or there is
no point in distributing @file{foo.1}.

More generally, the rule is that distributed files should never depend
on non-distributed built files.  If you distribute something
generated, distribute its sources.

One way to fix the above example, while still distributing
@file{foo.1} is to not depend on @file{foo$(EXEEXT)}.  For instance,
assuming @command{foo --version} and @command{foo --help} do not
change unless @file{foo.c} or @file{configure.ac} change, we could
write the following @file{Makefile.am}:

@example
bin_PROGRAMS = foo
foo_SOURCES = foo.c
dist_man_MANS = foo.1

foo.1: foo.c $(top_srcdir)/configure.ac
        $(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
        help2man --output=foo.1 ./foo$(EXEEXT)
@end example

This way, @file{foo.1} will not get rebuilt every time
@file{foo$(EXEEXT)} changes.  The @command{make} call makes sure
@file{foo$(EXEEXT)} is up-to-date before @command{help2man}.  Another
way to ensure this would be to use separate directories for binaries
and man pages, and set @code{SUBDIRS} so that binaries are built
before man pages.

We could also decide not to distribute @file{foo.1}.  In
this case it's fine to have @file{foo.1} dependent upon
@file{foo$(EXEEXT)}, since both will have to be rebuilt.
However it would be impossible to build the package in a
cross-compilation, because building @file{foo.1} involves
an @emph{execution} of @file{foo$(EXEEXT)}.

Another context where such errors are common is when distributed files
are built by tools that are built by the package.  The pattern is
similar:

@example
distributed-file: built-tools distributed-sources
        build-command
@end example

@noindent
should be changed to

@example
distributed-file: distributed-sources
        $(MAKE) $(AM_MAKEFLAGS) built-tools
        build-command
@end example

@noindent
or you could choose not to distribute @file{distributed-file}, if
cross-compilation does not matter.

The points made through these examples are worth a summary:

@cartouche
@itemize
@item
Distributed files should never depend upon non-distributed built
files.
@item
Distributed files should be distributed with all their dependencies.
@item
If a file is @emph{intended} to be rebuilt by users, then there is no point
in distributing it.
@end itemize
@end cartouche

@vrindex distcleancheck_listfiles
For desperate cases, it's always possible to disable this check by
setting @code{distcleancheck_listfiles} as documented in @ref{Checking
the Distribution}.
Make sure you do understand the reason why @samp{make distcheck}
complains before you do this.  @code{distcleancheck_listfiles} is a
way to @emph{hide} errors, not to fix them.  You can always do better.

@node Flag Variables Ordering
@section Flag Variables Ordering
@cindex Ordering flag variables
@cindex Flag variables, ordering

@display
What is the difference between @code{AM_CFLAGS}, @code{CFLAGS}, and
@code{mumble_CFLAGS}?
@end display

@display
Why does @command{automake} output @code{CPPFLAGS} after
@code{AM_CPPFLAGS} on compile lines?  Shouldn't it be the converse?
@end display

@display
My @file{configure} adds some warning flags into @code{CXXFLAGS}.  In
one @file{Makefile.am} I would like to append a new flag, however if I
put the flag into @code{AM_CXXFLAGS} it is prepended to the other
flags, not appended.
@end display

@subheading Compile Flag Variables
@cindex Flag Variables, Ordering
@cindex Compile Flag Variables
@cindex @code{AM_CCASFLAGS} and @code{CCASFLAGS}
@cindex @code{AM_CFLAGS} and @code{CFLAGS}
@cindex @code{AM_CPPFLAGS} and @code{CPPFLAGS}
@cindex @code{AM_CXXFLAGS} and @code{CXXFLAGS}
@cindex @code{AM_FCFLAGS} and @code{FCFLAGS}
@cindex @code{AM_FFLAGS} and @code{FFLAGS}
@cindex @code{AM_GCJFLAGS} and @code{GCJFLAGS}
@cindex @code{AM_LDFLAGS} and @code{LDFLAGS}
@cindex @code{AM_LFLAGS} and @code{LFLAGS}
@cindex @code{AM_LIBTOOLFLAGS} and @code{LIBTOOLFLAGS}
@cindex @code{AM_OBJCFLAGS} and @code{OBJCFLAGS}
@cindex @code{AM_OBJCXXFLAGS} and @code{OBJXXCFLAGS}
@cindex @code{AM_RFLAGS} and @code{RFLAGS}
@cindex @code{AM_UPCFLAGS} and @code{UPCFLAGS}
@cindex @code{AM_YFLAGS} and @code{YFLAGS}
@cindex @code{CCASFLAGS} and @code{AM_CCASFLAGS}
@cindex @code{CFLAGS} and @code{AM_CFLAGS}
@cindex @code{CPPFLAGS} and @code{AM_CPPFLAGS}
@cindex @code{CXXFLAGS} and @code{AM_CXXFLAGS}
@cindex @code{FCFLAGS} and @code{AM_FCFLAGS}
@cindex @code{FFLAGS} and @code{AM_FFLAGS}
@cindex @code{GCJFLAGS} and @code{AM_GCJFLAGS}
@cindex @code{LDFLAGS} and @code{AM_LDFLAGS}
@cindex @code{LFLAGS} and @code{AM_LFLAGS}
@cindex @code{LIBTOOLFLAGS} and @code{AM_LIBTOOLFLAGS}
@cindex @code{OBJCFLAGS} and @code{AM_OBJCFLAGS}
@cindex @code{OBJCXXFLAGS} and @code{AM_OBJCXXFLAGS}
@cindex @code{RFLAGS} and @code{AM_RFLAGS}
@cindex @code{UPCFLAGS} and @code{AM_UPCFLAGS}
@cindex @code{YFLAGS} and @code{AM_YFLAGS}

This section attempts to answer all the above questions.  We will
mostly discuss @code{CPPFLAGS} in our examples, but actually the
answer holds for all the compile flags used in Automake:
@code{CCASFLAGS}, @code{CFLAGS}, @code{CPPFLAGS}, @code{CXXFLAGS},
@code{FCFLAGS}, @code{FFLAGS}, @code{GCJFLAGS}, @code{LDFLAGS},
@code{LFLAGS}, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, @code{OBJCXXFLAGS},
@code{RFLAGS}, @code{UPCFLAGS}, and @code{YFLAGS}.

@code{CPPFLAGS}, @code{AM_CPPFLAGS}, and @code{mumble_CPPFLAGS} are
three variables that can be used to pass flags to the C preprocessor
(actually these variables are also used for other languages like C++
or preprocessed Fortran).  @code{CPPFLAGS} is the user variable
(@pxref{User Variables}), @code{AM_CPPFLAGS} is the Automake variable,
and @code{mumble_CPPFLAGS} is the variable specific to the
@code{mumble} target (we call this a per-target variable,
@pxref{Program and Library Variables}).

Automake always uses two of these variables when compiling C sources
files.  When compiling an object file for the @code{mumble} target,
the first variable will be @code{mumble_CPPFLAGS} if it is defined, or
@code{AM_CPPFLAGS} otherwise.  The second variable is always
@code{CPPFLAGS}.

In the following example,

@example
bin_PROGRAMS = foo bar
foo_SOURCES = xyz.c
bar_SOURCES = main.c
foo_CPPFLAGS = -DFOO
AM_CPPFLAGS = -DBAZ
@end example

@noindent
@file{xyz.o} will be compiled with @samp{$(foo_CPPFLAGS) $(CPPFLAGS)},
(because @file{xyz.o} is part of the @code{foo} target), while
@file{main.o} will be compiled with @samp{$(AM_CPPFLAGS) $(CPPFLAGS)}
(because there is no per-target variable for target @code{bar}).

The difference between @code{mumble_CPPFLAGS} and @code{AM_CPPFLAGS}
being clear enough, let's focus on @code{CPPFLAGS}.  @code{CPPFLAGS}
is a user variable, i.e., a variable that users are entitled to modify
in order to compile the package.  This variable, like many others,
is documented at the end of the output of @samp{configure --help}.

For instance, someone who needs to add @file{/home/my/usr/include} to
the C compiler's search path would configure a package with

@example
./configure CPPFLAGS='-I /home/my/usr/include'
@end example

@noindent
and this flag would be propagated to the compile rules of all
@file{Makefile}s.

It is also not uncommon to override a user variable at
@command{make}-time.  Many installers do this with @code{prefix}, but
this can be useful with compiler flags too.  For instance, if, while
debugging a C++ project, you need to disable optimization in one
specific object file, you can run something like

@example
rm file.o
make CXXFLAGS=-O0 file.o
make
@end example

The reason @samp{$(CPPFLAGS)} appears after @samp{$(AM_CPPFLAGS)} or
@samp{$(mumble_CPPFLAGS)} in the compile command is that users
should always have the last say.  It probably makes more sense if you
think about it while looking at the @samp{CXXFLAGS=-O0} above, which
should supersede any other switch from @code{AM_CXXFLAGS} or
@code{mumble_CXXFLAGS} (and this of course replaces the previous value
of @code{CXXFLAGS}).

You should never redefine a user variable such as @code{CPPFLAGS} in
@file{Makefile.am}.  Use @samp{automake -Woverride} to diagnose such
mistakes.  Even something like

@example
CPPFLAGS = -DDATADIR=\"$(datadir)\" @@CPPFLAGS@@
@end example

@noindent
is erroneous.  Although this preserves @file{configure}'s value of
@code{CPPFLAGS}, the definition of @code{DATADIR} will disappear if a
user attempts to override @code{CPPFLAGS} from the @command{make}
command line.

@example
AM_CPPFLAGS = -DDATADIR=\"$(datadir)\"
@end example

@noindent
is all that is needed here if no per-target flags are used.

You should not add options to these user variables within
@file{configure} either, for the same reason.  Occasionally you need
to modify these variables to perform a test, but you should reset
their values afterwards.  In contrast, it is OK to modify the
@samp{AM_} variables within @file{configure} if you @code{AC_SUBST}
them, but it is rather rare that you need to do this, unless you
really want to change the default definitions of the @samp{AM_}
variables in all @file{Makefile}s.

What we recommend is that you define extra flags in separate
variables.  For instance, you may write an Autoconf macro that computes
a set of warning options for the C compiler, and @code{AC_SUBST} them
in @code{WARNINGCFLAGS}; you may also have an Autoconf macro that
determines which compiler and which linker flags should be used to
link with library @file{libfoo}, and @code{AC_SUBST} these in
@code{LIBFOOCFLAGS} and @code{LIBFOOLDFLAGS}.  Then, a
@file{Makefile.am} could use these variables as follows:

@example
AM_CFLAGS = $(WARNINGCFLAGS)
bin_PROGRAMS = prog1 prog2
prog1_SOURCES = @dots{}
prog2_SOURCES = @dots{}
prog2_CFLAGS = $(LIBFOOCFLAGS) $(AM_CFLAGS)
prog2_LDFLAGS = $(LIBFOOLDFLAGS)
@end example

In this example both programs will be compiled with the flags
substituted into @samp{$(WARNINGCFLAGS)}, and @code{prog2} will
additionally be compiled with the flags required to link with
@file{libfoo}.

Note that listing @code{AM_CFLAGS} in a per-target @code{CFLAGS}
variable is a common idiom to ensure that @code{AM_CFLAGS} applies to
every target in a @file{Makefile.in}.

Using variables like this gives you full control over the ordering of
the flags.  For instance, if there is a flag in $(WARNINGCFLAGS) that
you want to negate for a particular target, you can use something like
@samp{prog1_CFLAGS = $(AM_CFLAGS) -no-flag}.  If all of these flags had
been forcefully appended to @code{CFLAGS}, there would be no way to
disable one flag.  Yet another reason to leave user variables to
users.

Finally, we have avoided naming the variable of the example
@code{LIBFOO_LDFLAGS} (with an underscore) because that would cause
Automake to think that this is actually a per-target variable (like
@code{mumble_LDFLAGS}) for some non-declared @code{LIBFOO} target.

@subheading Other Variables

There are other variables in Automake that follow similar principles
to allow user options.  For instance, Texinfo rules (@pxref{Texinfo})
use @code{MAKEINFOFLAGS} and @code{AM_MAKEINFOFLAGS}.  Similarly,
DejaGnu tests (@pxref{DejaGnu Tests}) use @code{RUNTESTDEFAULTFLAGS} and
@code{AM_RUNTESTDEFAULTFLAGS}.  The tags and ctags rules
(@pxref{Tags}) use @code{ETAGSFLAGS}, @code{AM_ETAGSFLAGS},
@code{CTAGSFLAGS}, and @code{AM_CTAGSFLAGS}.  Java rules
(@pxref{Java}) use @code{JAVACFLAGS} and @code{AM_JAVACFLAGS}.  None
of these rules support per-target flags (yet).

To some extent, even @code{AM_MAKEFLAGS} (@pxref{Subdirectories})
obeys this naming scheme.  The slight difference is that
@code{MAKEFLAGS} is passed to sub-@command{make}s implicitly by
@command{make} itself.

@code{ARFLAGS} (@pxref{A Library}) is usually defined by Automake and
has neither @code{AM_} nor per-target cousin.

Finally you should not think that the existence of a per-target
variable implies the existence of an @code{AM_} variable or of a user
variable.  For instance, the @code{mumble_LDADD} per-target variable
overrides the makefile-wide @code{LDADD} variable (which is not a user
variable), and @code{mumble_LIBADD} exists only as a per-target
variable.  @xref{Program and Library Variables}.


@node Renamed Objects
@section Why are object files sometimes renamed?

This happens when per-target compilation flags are used.  Object
files need to be renamed just in case they would clash with object
files compiled from the same sources, but with different flags.
Consider the following example.

@example
bin_PROGRAMS = true false
true_SOURCES = generic.c
true_CPPFLAGS = -DEXIT_CODE=0
false_SOURCES = generic.c
false_CPPFLAGS = -DEXIT_CODE=1
@end example

@noindent
Obviously the two programs are built from the same source, but it
would be bad if they shared the same object, because @file{generic.o}
cannot be built with both @samp{-DEXIT_CODE=0} @emph{and}
@samp{-DEXIT_CODE=1}.  Therefore @command{automake} outputs rules to
build two different objects: @file{true-generic.o} and
@file{false-generic.o}.

@command{automake} doesn't actually look whether source files are
shared to decide if it must rename objects.  It will just rename all
objects of a target as soon as it sees per-target compilation flags
used.

It's OK to share object files when per-target compilation flags are not
used.  For instance, @file{true} and @file{false} will both use
@file{version.o} in the following example.

@example
AM_CPPFLAGS = -DVERSION=1.0
bin_PROGRAMS = true false
true_SOURCES = true.c version.c
false_SOURCES = false.c version.c
@end example

Note that the renaming of objects is also affected by the
@code{_SHORTNAME} variable (@pxref{Program and Library Variables}).


@node Per-Object Flags
@section Per-Object Flags Emulation
@cindex Per-object flags, emulated

@display
One of my source files needs to be compiled with different flags.  How
do I do?
@end display

Automake supports per-program and per-library compilation flags (see
@ref{Program and Library Variables} and @ref{Flag Variables
Ordering}).  With this you can define compilation flags that apply to
all files compiled for a target.  For instance, in

@example
bin_PROGRAMS = foo
foo_SOURCES = foo.c foo.h bar.c bar.h main.c
foo_CFLAGS = -some -flags
@end example

@noindent
@file{foo-foo.o}, @file{foo-bar.o}, and @file{foo-main.o} will all be
compiled with @samp{-some -flags}.  (If you wonder about the names of
these object files, see @ref{Renamed Objects}.)  Note that
@code{foo_CFLAGS} gives the flags to use when compiling all the C
sources of the @emph{program} @code{foo}, it has nothing to do with
@file{foo.c} or @file{foo-foo.o} specifically.

What if @file{foo.c} needs to be compiled into @file{foo.o} using some
specific flags, that none of the other files requires?  Obviously
per-program flags are not directly applicable here.  Something like
per-object flags are expected, i.e., flags that would be used only
when creating @file{foo-foo.o}.  Automake does not support that,
however this is easy to simulate using a library that contains only
that object, and compiling this library with per-library flags.

@example
bin_PROGRAMS = foo
foo_SOURCES = bar.c bar.h main.c
foo_CFLAGS = -some -flags
foo_LDADD = libfoo.a
noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = foo.c foo.h
libfoo_a_CFLAGS = -some -other -flags
@end example

Here @file{foo-bar.o} and @file{foo-main.o} will all be
compiled with @samp{-some -flags}, while @file{libfoo_a-foo.o} will
be compiled using @samp{-some -other -flags}.  Eventually, all
three objects will be linked to form @file{foo}.

This trick can also be achieved using Libtool convenience libraries,
for instance @samp{noinst_LTLIBRARIES = libfoo.la} (@pxref{Libtool
Convenience Libraries}).

Another tempting idea to implement per-object flags is to override the
compile rules @command{automake} would output for these files.
Automake will not define a rule for a target you have defined, so you
could think about defining the @samp{foo-foo.o: foo.c} rule yourself.
We recommend against this, because this is error prone.  For instance,
if you add such a rule to the first example, it will break the day you
decide to remove @code{foo_CFLAGS} (because @file{foo.c} will then be
compiled as @file{foo.o} instead of @file{foo-foo.o}, @pxref{Renamed
Objects}).  Also in order to support dependency tracking, the two
@file{.o}/@file{.obj} extensions, and all the other flags variables
involved in a compilation, you will end up modifying a copy of the
rule previously output by @command{automake} for this file.  If a new
release of Automake generates a different rule, your copy will need to
be updated by hand.

@node Multiple Outputs
@section Handling Tools that Produce Many Outputs
@cindex multiple outputs, rules with
@cindex many outputs, rules with
@cindex rules with multiple outputs

This section describes a @command{make} idiom that can be used when a
tool produces multiple output files.  It is not specific to Automake
and can be used in ordinary @file{Makefile}s.

Suppose we have a program called @command{foo} that will read one file
called @file{data.foo} and produce two files named @file{data.c} and
@file{data.h}.  We want to write a @file{Makefile} rule that captures
this one-to-two dependency.

The naive rule is incorrect:

@example
# This is incorrect.
data.c data.h: data.foo
        foo data.foo
@end example

@noindent
What the above rule really says is that @file{data.c} and
@file{data.h} each depend on @file{data.foo}, and can each be built by
running @samp{foo data.foo}.  In other words it is equivalent to:

@example
# We do not want this.
data.c: data.foo
        foo data.foo
data.h: data.foo
        foo data.foo
@end example

@noindent
which means that @command{foo} can be run twice.  Usually it will not
be run twice, because @command{make} implementations are smart enough
to check for the existence of the second file after the first one has
been built; they will therefore detect that it already exists.
However there are a few situations where it can run twice anyway:

@itemize
@item
The most worrying case is when running a parallel @command{make}.  If
@file{data.c} and @file{data.h} are built in parallel, two @samp{foo
data.foo} commands will run concurrently.  This is harmful.
@item
Another case is when the dependency (here @file{data.foo}) is
(or depends upon) a phony target.
@end itemize

A solution that works with parallel @command{make} but not with
phony dependencies is the following:

@example
data.c data.h: data.foo
        foo data.foo
data.h: data.c
@end example

@noindent
The above rules are equivalent to

@example
data.c: data.foo
        foo data.foo
data.h: data.foo data.c
        foo data.foo
@end example

@noindent
therefore a parallel @command{make} will have to serialize the builds
of @file{data.c} and @file{data.h}, and will detect that the second is
no longer needed once the first is over.

Using this pattern is probably enough for most cases.  However it does
not scale easily to more output files (in this scheme all output files
must be totally ordered by the dependency relation), so we will
explore a more complicated solution.

Another idea is to write the following:

@example
# There is still a problem with this one.
data.c: data.foo
        foo data.foo
data.h: data.c
@end example

@noindent
The idea is that @samp{foo data.foo} is run only when @file{data.c}
needs to be updated, but we further state that @file{data.h} depends
upon @file{data.c}.  That way, if @file{data.h} is required and
@file{data.foo} is out of date, the dependency on @file{data.c} will
trigger the build.

This is almost perfect, but suppose we have built @file{data.h} and
@file{data.c}, and then we erase @file{data.h}.  Then, running
@samp{make data.h} will not rebuild @file{data.h}.  The above rules
just state that @file{data.c} must be up-to-date with respect to
@file{data.foo}, and this is already the case.

What we need is a rule that forces a rebuild when @file{data.h} is
missing.  Here it is:

@example
data.c: data.foo
        foo data.foo
data.h: data.c
## Recover from the removal of $@@
        @@if test -f $@@; then :; else \
          rm -f data.c; \
          $(MAKE) $(AM_MAKEFLAGS) data.c; \
        fi
@end example

The above scheme can be extended to handle more outputs and more
inputs.  One of the outputs is selected to serve as a witness to the
successful completion of the command, it depends upon all inputs, and
all other outputs depend upon it.  For instance, if @command{foo}
should additionally read @file{data.bar} and also produce
@file{data.w} and @file{data.x}, we would write:

@example
data.c: data.foo data.bar
        foo data.foo data.bar
data.h data.w data.x: data.c
## Recover from the removal of $@@
        @@if test -f $@@; then :; else \
          rm -f data.c; \
          $(MAKE) $(AM_MAKEFLAGS) data.c; \
        fi
@end example

However there are now three minor problems in this setup.  One is related
to the timestamp ordering of @file{data.h}, @file{data.w},
@file{data.x}, and @file{data.c}.  Another one is a race condition
if a parallel @command{make} attempts to run multiple instances of the
recover block at once.  Finally, the recursive rule breaks @samp{make -n}
when run with GNU @command{make} (as well as some other @command{make}
implementations), as it may remove @file{data.h} even when it should not
(@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make,
The GNU Make Manual}).

Let us deal with the first problem.  @command{foo} outputs four files,
but we do not know in which order these files are created.  Suppose
that @file{data.h} is created before @file{data.c}.  Then we have a
weird situation.  The next time @command{make} is run, @file{data.h}
will appear older than @file{data.c}, the second rule will be
triggered, a shell will be started to execute the @samp{if@dots{}fi}
command, but actually it will just execute the @code{then} branch,
that is: nothing.  In other words, because the witness we selected is
not the first file created by @command{foo}, @command{make} will start
a shell to do nothing each time it is run.

A simple riposte is to fix the timestamps when this happens.

@example
data.c: data.foo data.bar
        foo data.foo data.bar
data.h data.w data.x: data.c
        @@if test -f $@@; then \
          touch $@@; \
        else \
## Recover from the removal of $@@
          rm -f data.c; \
          $(MAKE) $(AM_MAKEFLAGS) data.c; \
        fi
@end example

Another solution is to use a different and dedicated file as witness,
rather than using any of @command{foo}'s outputs.

@example
data.stamp: data.foo data.bar
        @@rm -f data.tmp
        @@touch data.tmp
        foo data.foo data.bar
        @@mv -f data.tmp $@@
data.c data.h data.w data.x: data.stamp
## Recover from the removal of $@@
        @@if test -f $@@; then :; else \
          rm -f data.stamp; \
          $(MAKE) $(AM_MAKEFLAGS) data.stamp; \
        fi
@end example

@file{data.tmp} is created before @command{foo} is run, so it has a
timestamp older than output files output by @command{foo}.  It is then
renamed to @file{data.stamp} after @command{foo} has run, because we
do not want to update @file{data.stamp} if @command{foo} fails.

This solution still suffers from the second problem: the race
condition in the recover rule.  If, after a successful build, a user
erases @file{data.c} and @file{data.h}, and runs @samp{make -j}, then
@command{make} may start both recover rules in parallel.  If the two
instances of the rule execute @samp{$(MAKE) $(AM_MAKEFLAGS)
data.stamp} concurrently the build is likely to fail (for instance, the
two rules will create @file{data.tmp}, but only one can rename it).

Admittedly, such a weird situation does not arise during ordinary
builds.  It occurs only when the build tree is mutilated.  Here
@file{data.c} and @file{data.h} have been explicitly removed without
also removing @file{data.stamp} and the other output files.
@code{make clean; make} will always recover from these situations even
with parallel makes, so you may decide that the recover rule is solely
to help non-parallel make users and leave things as-is.  Fixing this
requires some locking mechanism to ensure only one instance of the
recover rule rebuilds @file{data.stamp}.  One could imagine something
along the following lines.

@example
data.c data.h data.w data.x: data.stamp
## Recover from the removal of $@@
        @@if test -f $@@; then :; else \
          trap 'rm -rf data.lock data.stamp' 1 2 13 15; \
## mkdir is a portable test-and-set
          if mkdir data.lock 2>/dev/null; then \
## This code is being executed by the first process.
            rm -f data.stamp; \
            $(MAKE) $(AM_MAKEFLAGS) data.stamp; \
            result=$$?; rm -rf data.lock; exit $$result; \
          else \
## This code is being executed by the follower processes.
## Wait until the first process is done.
            while test -d data.lock; do sleep 1; done; \
## Succeed if and only if the first process succeeded.
            test -f data.stamp; \
          fi; \
        fi
@end example

Using a dedicated witness, like @file{data.stamp}, is very handy when
the list of output files is not known beforehand.  As an illustration,
consider the following rules to compile many @file{*.el} files into
@file{*.elc} files in a single command.  It does not matter how
@code{ELFILES} is defined (as long as it is not empty: empty targets
are not accepted by POSIX).

@example
ELFILES = one.el two.el three.el @dots{}
ELCFILES = $(ELFILES:=c)

elc-stamp: $(ELFILES)
        @@rm -f elc-temp
        @@touch elc-temp
        $(elisp_comp) $(ELFILES)
        @@mv -f elc-temp $@@

$(ELCFILES): elc-stamp
        @@if test -f $@@; then :; else \
## Recover from the removal of $@@
          trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
          if mkdir elc-lock 2>/dev/null; then \
## This code is being executed by the first process.
            rm -f elc-stamp; \
            $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
            rmdir elc-lock; \
          else \
## This code is being executed by the follower processes.
## Wait until the first process is done.
            while test -d elc-lock; do sleep 1; done; \
## Succeed if and only if the first process succeeded.
            test -f elc-stamp; exit $$?; \
@c $$
          fi; \
        fi
@end example

These solutions all still suffer from the third problem, namely that
they break the promise that @samp{make -n} should not cause any actual
changes to the tree.  For those solutions that do not create lock files,
it is possible to split the recover rules into two separate recipe
commands, one of which does all work but the recursion, and the
other invokes the recursive @samp{$(MAKE)}.  The solutions involving
locking could act upon the contents of the @samp{MAKEFLAGS} variable,
but parsing that portably is not easy (@pxref{The Make Macro MAKEFLAGS,,,
autoconf, The Autoconf Manual}).  Here is an example:

@example
ELFILES = one.el two.el three.el @dots{}
ELCFILES = $(ELFILES:=c)

elc-stamp: $(ELFILES)
        @@rm -f elc-temp
        @@touch elc-temp
        $(elisp_comp) $(ELFILES)
        @@mv -f elc-temp $@@

$(ELCFILES): elc-stamp
## Recover from the removal of $@@
        @@dry=; for f in x $$MAKEFLAGS; do \
          case $$f in \
            *=*|--*);; \
            *n*) dry=:;; \
          esac; \
        done; \
        if test -f $@@; then :; else \
          $$dry trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
          if $$dry mkdir elc-lock 2>/dev/null; then \
## This code is being executed by the first process.
            $$dry rm -f elc-stamp; \
            $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
            $$dry rmdir elc-lock; \
          else \
## This code is being executed by the follower processes.
## Wait until the first process is done.
            while test -d elc-lock && test -z "$$dry"; do \
@c $$
              sleep 1; \
            done; \
## Succeed if and only if the first process succeeded.
            $$dry test -f elc-stamp; exit $$?; \
          fi; \
        fi
@end example

For completeness it should be noted that GNU @command{make} is able to
express rules with multiple output files using pattern rules
(@pxref{Pattern Examples, , Pattern Rule Examples, make, The GNU Make
Manual}).  We do not discuss pattern rules here because they are not
portable, but they can be convenient in packages that assume GNU
@command{make}.


@node Hard-Coded Install Paths
@section Installing to Hard-Coded Locations

@display
My package needs to install some configuration file.  I tried to use
the following rule, but @samp{make distcheck} fails.  Why?

@example
# Do not do this.
install-data-local:
        $(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile
@end example
@end display

@display
My package needs to populate the installation directory of another
package at install-time.  I can easily compute that installation
directory in @file{configure}, but if I install files therein,
@samp{make distcheck} fails.  How else should I do?
@end display

These two setups share their symptoms: @samp{make distcheck} fails
because they are installing files to hard-coded paths.  In the later
case the path is not really hard-coded in the package, but we can
consider it to be hard-coded in the system (or in whichever tool that
supplies the path).  As long as the path does not use any of the
standard directory variables (@samp{$(prefix)}, @samp{$(bindir)},
@samp{$(datadir)}, etc.), the effect will be the same:
user-installations are impossible.

As a (non-root) user who wants to install a package, you usually have no
right to install anything in @file{/usr} or @file{/usr/local}.  So you
do something like @samp{./configure --prefix ~/usr} to install a
package in your own @file{~/usr} tree.

If a package attempts to install something to some hard-coded path
(e.g., @file{/etc/afile}), regardless of this @option{--prefix} setting,
then the installation will fail.  @samp{make distcheck} performs such
a @option{--prefix} installation, hence it will fail too.

Now, there are some easy solutions.

The above @code{install-data-local} example for installing
@file{/etc/afile} would be better replaced by

@example
sysconf_DATA = afile
@end example

@noindent
by default @code{sysconfdir} will be @samp{$(prefix)/etc}, because
this is what the GNU Standards require.  When such a package is
installed on an FHS compliant system, the installer will have to set
@samp{--sysconfdir=/etc}.  As the maintainer of the package you
should not be concerned by such site policies: use the appropriate
standard directory variable to install your files so that the installer
can easily redefine these variables to match their site conventions.

Installing files that should be used by another package is slightly
more involved.  Let's take an example and assume you want to install
a shared library that is a Python extension module.  If you ask Python
where to install the library, it will answer something like this:

@example
% @kbd{python -c 'from distutils import sysconfig;
             print sysconfig.get_python_lib(1,0)'}
/usr/lib/python2.5/site-packages
@end example

If you indeed use this absolute path to install your shared library,
non-root users will not be able to install the package, hence
distcheck fails.

Let's do better.  The @samp{sysconfig.get_python_lib()} function
actually accepts a third argument that will replace Python's
installation prefix.

@example
% @kbd{python -c 'from distutils import sysconfig;
             print sysconfig.get_python_lib(1,0,"$@{exec_prefix@}")'}
$@{exec_prefix@}/lib/python2.5/site-packages
@end example

You can also use this new path.  If you do
@itemize @bullet
@item
root users can install your package with the same @option{--prefix}
as Python (you get the behavior of the previous attempt)

@item
non-root users can install your package too, they will have the
extension module in a place that is not searched by Python but they
can work around this using environment variables (and if you installed
scripts that use this shared library, it's easy to tell Python were to
look in the beginning of your script, so the script works in both
cases).
@end itemize

The @code{AM_PATH_PYTHON} macro uses similar commands to define
@samp{$(pythondir)} and @samp{$(pyexecdir)} (@pxref{Python}).

Of course not all tools are as advanced as Python regarding that
substitution of @var{prefix}.  So another strategy is to figure the
part of the installation directory that must be preserved.  For
instance, here is how @code{AM_PATH_LISPDIR} (@pxref{Emacs Lisp})
computes @samp{$(lispdir)}:

@example
$EMACS -batch -Q -eval '(while load-path
  (princ (concat (car load-path) "\n"))
  (setq load-path (cdr load-path)))' >conftest.out
lispdir=`sed -n
  -e 's,/$,,'
  -e '/.*\/lib\/x*emacs\/site-lisp$/@{
        s,.*/lib/\(x*emacs/site-lisp\)$,$@{libdir@}/\1,;p;q;
      @}'
  -e '/.*\/share\/x*emacs\/site-lisp$/@{
        s,.*/share/\(x*emacs/site-lisp\),$@{datarootdir@}/\1,;p;q;
      @}'
  conftest.out`
@end example

I.e., it just picks the first directory that looks like
@file{*/lib/*emacs/site-lisp} or @file{*/share/*emacs/site-lisp} in
the search path of emacs, and then substitutes @samp{$@{libdir@}} or
@samp{$@{datadir@}} appropriately.

The emacs case looks complicated because it processes a list and
expects two possible layouts, otherwise it's easy, and the benefits for
non-root users are really worth the extra @command{sed} invocation.


@node Debugging Make Rules
@section Debugging Make Rules
@cindex debugging rules
@cindex rules, debugging

The rules and dependency trees generated by @command{automake} can get
rather complex, and leave the developer head-scratching when things
don't work as expected.  Besides the debug options provided by the
@command{make} command (@pxref{Options Summary,,, make, The GNU Make
Manual}), here's a couple of further hints for debugging makefiles
generated by @command{automake} effectively:

@itemize
@item
If less verbose output has been enabled in the package with the use
of silent rules (@pxref{Automake Silent Rules}), you can use
@code{make V=1} to see the commands being executed.
@item
@code{make -n} can help show what would be done without actually doing
it.  Note however, that this will @emph{still execute} commands prefixed
with @samp{+}, and, when using GNU @command{make}, commands that contain
the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} (@pxref{Instead of
Execution,,, make, The GNU Make Manual}).
Typically, this is helpful to show what recursive rules would do, but it
means that, in your own rules, you should not mix such recursion with
actions that change any files.@footnote{Automake's @samp{dist} and
@samp{distcheck} rules had a bug in this regard in that they created
directories even with @option{-n}, but this has been fixed in Automake
1.11.}  Furthermore, note that GNU @command{make} will update
prerequisites for the @file{Makefile} file itself even with @option{-n}
(@pxref{Remaking Makefiles,,, make, The GNU Make Manual}).
@item
@code{make SHELL="/bin/bash -vx"} can help debug complex rules.
@xref{The Make Macro SHELL,,, autoconf, The Autoconf Manual}, for some
portability quirks associated with this construct.
@item
@code{echo 'print: ; @@echo "$(VAR)"' | make -f Makefile -f - print}
can be handy to examine the expanded value of variables.  You may need
to use a target other than @samp{print} if that is already used or a
file with that name exists.
@item
@url{http://bashdb.sourceforge.net/@/remake/} provides a modified
GNU @command{make} command called @command{remake} that copes with
complex GNU @command{make}-specific Makefiles and allows to trace
execution, examine variables, and call rules interactively, much like
a debugger.
@end itemize


@node Reporting Bugs
@section Reporting Bugs

Most nontrivial software has bugs.  Automake is no exception.  Although
we cannot promise we can or will fix a bug, and we might not even agree
that it is a bug, we want to hear about problems you encounter. Often we
agree they are bugs and want to fix them.

To make it possible for us to fix a bug, please report it. In order to
do so effectively, it helps to know when and how to do it.

Before reporting a bug, it is a good idea to see if it is already known.
You can look at the @uref{https://debbugs.gnu.org/, GNU Bug Tracker}
and the @uref{https://lists.gnu.org/@/archive/@/html/@/bug-automake/,
bug-automake mailing list archives} for previous bug reports.  We
previously used a
@uref{http://sourceware.org/@/cgi-bin/@/gnatsweb.pl?database=automake,
Gnats database} for bug tracking, so some bugs might have been reported
there already.  Please do not use it for new bug reports, however.

If the bug is not already known, it should be reported.  It is very
important to report bugs in a way that is useful and efficient.  For
this, please familiarize yourself with
@uref{http://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to
Report Bugs Effectively} and
@uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask
Questions the Smart Way}.  This helps you and developers to save time
which can then be spent on fixing more bugs and implementing more
features.

For a bug report, a feature request or other suggestions, please send
email to @email{@value{PACKAGE_BUGREPORT}}.  This will then open a new
bug in the @uref{https://debbugs.gnu.org/@/automake, bug tracker}.  Be
sure to include the versions of Autoconf and Automake that you use.
Ideally, post a minimal @file{Makefile.am} and @file{configure.ac} that
reproduces the problem you encounter.  If you have encountered test
suite failures, please attach the @file{test-suite.log} file.

@c ========================================================== Appendices

@page
@node Copying This Manual
@appendix Copying This Manual

@menu
* GNU Free Documentation License::  License for copying this manual
@end menu

@node GNU Free Documentation License
@appendixsec GNU Free Documentation License
@include fdl.texi

@page
@node Indices
@appendix Indices

@menu
* Macro Index::                 Index of Autoconf macros
* Variable Index::              Index of Makefile variables
* General Index::               General index
@end menu

@node Macro Index
@appendixsec Macro Index

@printindex fn

@node Variable Index
@appendixsec Variable Index

@printindex vr

@node General Index
@appendixsec General Index

@printindex cp


@bye

@c  LocalWords:  texinfo setfilename settitle setchapternewpage texi direntry
@c  LocalWords:  dircategory in's aclocal ifinfo titlepage Tromey vskip pt sp
@c  LocalWords:  filll defcodeindex ov cv op tr syncodeindex fn cp vr ifnottex
@c  LocalWords:  dir Automake's ac Dist Gnits gnits dfn Autoconf's pxref
@c  LocalWords:  cindex Autoconf autoconf perl samp cvs dist trindex SUBST foo
@c  LocalWords:  xs emph FIXME ref vindex pkglibdir pkgincludedir pkgdatadir mt
@c  LocalWords:  pkg libdir cpio bindir sbindir rmt pax sbin zar zardir acindex
@c  LocalWords:  HTML htmldir html noinst TEXINFOS nodist nobase strudel CFLAGS
@c  LocalWords:  libmumble CC YFLAGS itemx de fication config url comp
@c  LocalWords:  depcomp elisp sh mdate mkinstalldirs mkdir py tex dvi ps pdf
@c  LocalWords:  ylwrap zardoz INIT gettext acinclude mv FUNCS LIBOBJS LDADD fr
@c  LocalWords:  uref featureful dnl src LINGUAS es ko nl pl sl sv PROG ISC doc
@c  LocalWords:  POSIX STDC fcntl FUNC ALLOCA blksize struct stat intl po chmod
@c  LocalWords:  ChangeLog SUBDIRS gettextize gpl testdata getopt INTLLIBS cpp
@c  LocalWords:  localedir datadir DLOCALEDIR DEXIT CPPFLAGS autoreconf opindex
@c  LocalWords:  AUX var symlink deps Wno Wnone package's aclocal's distclean
@c  LocalWords:  ltmain xref LIBSOURCE LIBSOURCES LIBOBJ MEMCMP vs RANLIB CXX
@c  LocalWords:  LDFLAGS LIBTOOL libtool XTRA LIBS gettext's acdir APIVERSION
@c  LocalWords:  dirlist noindent usr TIOCGWINSZ sc
@c  LocalWords:  GWINSZ termios SRCDIR tarball bzip LISPDIR lispdir XEmacs CCAS
@c  LocalWords:  emacsen MicroEmacs CCASFLAGS UX GCJ gcj GCJFLAGS posix DMALLOC
@c  LocalWords:  dmalloc ldmalloc REGEX regex DEPDIR DEP DEFUN aclocaldir fi
@c  LocalWords:  mymacro myothermacro AMFLAGS autopoint autogen libtoolize yum
@c  LocalWords:  autoheader README MAKEFLAGS subdir Inetutils sync COND endif
@c  LocalWords:  Miller's installable includedir inc pkgdata EXEEXT libexec bsd
@c  LocalWords:  pkglib libexecdir prog libcpio cpio's dlopen dlpreopen linux
@c  LocalWords:  subsubsection OBJEXT esac lib LTLIBRARIES liblob LIBADD AR ar
@c  LocalWords:  ARFLAGS cru ing maude libgettext lo LTLIBOBJS rpath SGI PRE yy
@c  LocalWords:  libmaude CCLD CXXFLAGS FFLAGS LFLAGS OBJCFLAGS RFLAGS DEFS cc
@c  LocalWords:  OBJCXXFLAGS
@c  LocalWords:  SHORTNAME vtable srcdir nostdinc basename yxx cxx ll lxx gdb
@c  LocalWords:  lexers yymaxdepth maxdepth yyparse yylex yyerror yylval lval
@c  LocalWords:  yychar yydebug yypact yyr yydef def yychk chk yypgo pgo yyact
@c  LocalWords:  yyexca exca yyerrflag errflag yynerrs nerrs yyps yypv pv yys
@c  LocalWords:  yystate yytmp tmp yyv yyval val yylloc lloc yyreds yytoks toks
@c  LocalWords:  yylhs yylen yydefred yydgoto yysindex yyrindex yygindex yyname
@c  LocalWords:  yytable yycheck yyrule byacc CXXCOMPILE CXXLINK FLINK cfortran
@c  LocalWords:  Catalogue preprocessable FLIBS libfoo baz JAVACFLAGS java exe
@c  LocalWords:  SunOS fying basenames exeext uninstalled oldinclude kr FSF's
@c  LocalWords:  pkginclude oldincludedir sysconf sharedstate localstate gcc rm
@c  LocalWords:  sysconfdir sharedstatedir localstatedir preexist CLEANFILES gz
@c  LocalWords:  depfile tmpdepfile depmode const interoperate
@c  LocalWords:  JAVAC javac JAVAROOT builddir CLASSPATH ENV pyc pyo pkgpython
@c  LocalWords:  pyexecdir pkgpyexecdir Python's pythondir pkgpythondir txi ois
@c  LocalWords:  installinfo vers MAKEINFO makeinfo MAKEINFOFLAGS noinstall rf
@c  LocalWords:  mandir thesame alsothesame installman myexecbin DESTDIR Pinard
@c  LocalWords:  uninstall installdirs uninstalls MOSTLYCLEANFILES mostlyclean
@c  LocalWords:  DISTCLEANFILES MAINTAINERCLEANFILES GZIP gzip shar exp
@c  LocalWords:  distdir distcheck distcleancheck listfiles distuninstallcheck
@c  LocalWords:  VPATH tarfile stdout XFAIL DejaGnu dejagnu DEJATOOL runtest ln
@c  LocalWords:  RUNTESTDEFAULTFLAGS toolchain RUNTESTFLAGS asis readme DVIPS
@c  LocalWords:  installcheck gzipped tarZ std utils etags mkid cd
@c  LocalWords:  ARGS taggable ETAGSFLAGS lang ctags CTAGSFLAGS GTAGS gtags idl
@c  LocalWords:  foocc doit idlC multilibs ABIs cmindex defmac ARG enableval FC
@c  LocalWords:  MSG xtrue DBG pathchk CYGWIN afile proglink versioned CVS's TE
@c  LocalWords:  wildcards Autoconfiscated subsubheading autotools Meyering API
@c  LocalWords:  ois's wildcard Wportability cartouche vrindex printindex Duret
@c  LocalWords:  DSOMEFLAG DVERSION automake Lutz insertcopying versioning FAQ
@c  LocalWords:  LTLIBOBJ Libtool's libtool's libltdl dlopening itutions libbar
@c  LocalWords:  WANTEDLIBS libhello sublibraries libtop libsub dlopened Ratfor
@c  LocalWords:  mymodule timestamps timestamp underquoted MAKEINFOHTMLFLAGS te
@c  LocalWords:  GNUmakefile Subpackages subpackage's subpackages aux
@c  LocalWords:  detailmenu Timeline pwd reldir AUTOM autom PREREQ FOOBAR libc
@c  LocalWords:  libhand subpackage moduleN libmain libmisc FCFLAGS FCCOMPILE
@c  LocalWords:  FCLINK subst sed ELCFILES elc MAKEINFOHTML dvips esyscmd ustar
@c  LocalWords:  tarballs Woverride vfi ELFILES djm AutoMake honkin FSF
@c  LocalWords:  fileutils precanned MacKenzie's reimplement termutils Tromey's
@c  LocalWords:  cois gnitsians LIBPROGRAMS progs LIBLIBRARIES Textutils Ulrich
@c  LocalWords:  Matzigkeit Drepper's Gord Matzigkeit's jm Dalley Debian org
@c  LocalWords:  Administrivia ILU CORBA Sourceware Molenda sourceware Elliston
@c  LocalWords:  dep Oliva Akim Demaille Aiieeee Demaillator Akim's sourcequake
@c  LocalWords:  grep backported screenshots libgcj KB unnumberedsubsubsec pre
@c  LocalWords:  precomputing hacky makedepend inline clearmake LD PRELOAD Rel
@c  LocalWords:  syscalls perlhist acl pm multitable headitem fdl appendixsec
@c  LocalWords:  LTALLOCA MALLOC malloc memcmp strdup alloca libcompat xyz DFOO
@c  LocalWords:  unprefixed buildable preprocessed DBAZ DDATADIR WARNINGCFLAGS
@c  LocalWords:  LIBFOOCFLAGS LIBFOOLDFLAGS ftable testSubDir obj LIBTOOLFLAGS
@c  LocalWords:  barexec Pinard's automatize initialize lzip xz cscope
