This is automake.info, produced by makeinfo version 5.2 from
automake.texi.

This manual is for GNU Automake (version 1.14.1, 6 November 2013), a
program that creates GNU standards-compliant Makefiles from template
files.

   Copyright (C) 1995-2013 Free Software Foundation, Inc.

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

INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* Automake: (automake).         Making GNU standards-compliant Makefiles.
END-INFO-DIR-ENTRY

INFO-DIR-SECTION Individual utilities
START-INFO-DIR-ENTRY
* aclocal-invocation: (automake)aclocal Invocation.   Generating aclocal.m4.
* automake-invocation: (automake)automake Invocation. Generating Makefile.in.
END-INFO-DIR-ENTRY


File: automake.info,  Node: Top,  Next: Introduction,  Up: (dir)

GNU Automake
************

This manual is for GNU Automake (version 1.14.1, 6 November 2013), a
program that creates GNU standards-compliant Makefiles from template
files.

   Copyright (C) 1995-2013 Free Software Foundation, Inc.

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

* 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 'make'
* Gnits::                       The effect of '--gnu' and '--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

 -- 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 '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 'configure.ac', using '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 '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::  'dist_' and 'nodist_' prefixes
* The dist Hook::               A target for last-minute distribution changes
* Checking the Distribution::   '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 '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 '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 '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



File: automake.info,  Node: Introduction,  Next: Autotools Introduction,  Prev: Top,  Up: Top

1 Introduction
**************

Automake is a tool for automatically generating 'Makefile.in's from
files called 'Makefile.am'.  Each 'Makefile.am' is basically a series of
'make' variable definitions(1), with rules being thrown in occasionally.
The generated 'Makefile.in's are compliant with the GNU Makefile
standards.

   The GNU Makefile Standards Document (*note (standards)Makefile
Conventions::) 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 'Makefile.in'.

   Automake does constrain a project in certain ways; for instance, it
assumes that the project uses Autoconf (*note Introduction:
(autoconf)Top.), and enforces certain restrictions on the 'configure.ac'
contents.

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

   For more information on bug reports, *Note Reporting Bugs::.

   ---------- Footnotes ----------

   (1) These variables are also called "make macros" in Make
terminology, however in this manual we reserve the term "macro" for
Autoconf's macros.


File: automake.info,  Node: Autotools Introduction,  Next: Generalities,  Prev: Introduction,  Up: Top

2 An Introduction to the Autotools
**********************************

If you are new to Automake, maybe you know that it is part of a set of
tools called _The Autotools_.  Maybe you've already delved into a
package full of files named 'configure', 'configure.ac', 'Makefile.in',
'Makefile.am', 'aclocal.m4', ..., some of them claiming to be _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
'automake'-centered continuation, some slides for this introduction are
available in Alexandre Duret-Lutz's Autotools Tutorial
(http://www.lrde.epita.fr/~adl/autotools.html).  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


File: automake.info,  Node: GNU Build System,  Next: Use Cases,  Up: Autotools Introduction

2.1 Introducing the GNU Build System
====================================

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 'make' (*note Overview: (make)Top.).  You express the
recipe to build your package in a 'Makefile'.  This file is a set of
rules to build the files in the package.  For instance the program
'prog' may be built by running the linker on the files 'main.o',
'foo.o', and 'bar.o'; the file 'main.o' may be built by running the
compiler on 'main.c'; etc.  Each time 'make' is run, it reads
'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 '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 'Makefile' for the 20
platforms he had to deal with.  Instead, he handcrafted a little shell
script called 'configure' to automatically adjust the 'Makefile' (*note
Genesis: (autoconf)Genesis.).  Compiling his package was now as simple
as running './configure && make'.

   Today this process has been standardized in the GNU project.  The GNU
Coding Standards (*note The Release Process: (standards)Managing
Releases.) explains how each package of the GNU project should have a
'configure' script, and the minimal interface it should have.  The
'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 './configure && make && make install', and
repeat with the next package to install.

   We call this build system the "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.

   The Autotools are tools that will create a GNU Build System for your
package.  Autoconf mostly focuses on 'configure' and Automake on
'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.


File: automake.info,  Node: Use Cases,  Next: Why Autotools,  Prev: GNU Build System,  Up: Autotools Introduction

2.2 Use Cases for the GNU Build System
======================================

In this section we explore several use cases for the GNU Build System.
You can replay all of these examples on the '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
'PREFIX/share/doc/automake/amhello-1.0.tar.gz', where PREFIX is the
installation prefix specified during configuration (PREFIX defaults to
'/usr/local', however if Automake was installed by some GNU/Linux
distribution it most likely has been set to '/usr').  If you do not have
a copy of Automake installed, you can find a copy of this file inside
the '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


File: automake.info,  Node: Basic Installation,  Next: Standard Targets,  Up: Use Cases

2.2.1 Basic Installation
------------------------

The most common installation procedure looks as follows.

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

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

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

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

   '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 'make check' is a no-op.

   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 'make install' will
do that.  However, by default everything will be installed in
subdirectories of '/usr/local': binaries will go into '/usr/local/bin',
libraries will end up in '/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 'make install'.  In our example, running 'make
install' will copy the program 'hello' into '/usr/local/bin' and
'README' into '/usr/local/share/doc/amhello'.

   A last and optional step is to run 'make installcheck'.  This command
may run tests on the installed files.  'make check' tests the files in
the source tree, while '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 'make installcheck'
will run the very same tests as '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 'installcheck' tests because
the existence of 'installcheck' is little known, and its usefulness is
neglected.  Our little toy package is no better: 'make installcheck'
does nothing.


File: automake.info,  Node: Standard Targets,  Next: Standard Directory Variables,  Prev: Basic Installation,  Up: Use Cases

2.2.2 Standard 'Makefile' Targets
---------------------------------

So far we have come across four ways to run 'make' in the GNU Build
System: 'make', 'make check', 'make install', and 'make installcheck'.
The words 'check', 'install', and 'installcheck', passed as arguments to
'make', are called "targets".  'make' is a shorthand for 'make all',
'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.

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


File: automake.info,  Node: Standard Directory Variables,  Next: Standard Configuration Variables,  Prev: Standard Targets,  Up: Use Cases

2.2.3 Standard Directory Variables
----------------------------------

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

Directory variable   Default value
-------------------------------------------------------
'prefix'             '/usr/local'
  'exec_prefix'      '${prefix}'
    'bindir'         '${exec_prefix}/bin'
    'libdir'         '${exec_prefix}/lib'
    ...
  'includedir'       '${prefix}/include'
  'datarootdir'      '${prefix}/share'
    'datadir'        '${datarootdir}'
    'mandir'         '${datarootdir}/man'
    'infodir'        '${datarootdir}/info'
    'docdir'         '${datarootdir}/doc/${PACKAGE}'
  ...

   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 'amhello-1.0', the program 'hello'
is to be installed in BINDIR, the directory for binaries.  The default
value for this directory is '/usr/local/bin', but the user can supply a
different value when calling 'configure'.  Also the file 'README' will
be installed into DOCDIR, which defaults to
'/usr/local/share/doc/amhello'.

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

     ~/amhello-1.0 % ./configure --prefix ~/usr
     ...
     ~/amhello-1.0 % make
     ...
     ~/amhello-1.0 % make install
     ...

   This would install '~/usr/bin/hello' and
'~/usr/share/doc/amhello/README'.

   The list of all such directory options is shown by './configure
--help'.


File: automake.info,  Node: Standard Configuration Variables,  Next: config.site,  Prev: Standard Directory Variables,  Up: Use Cases

2.2.4 Standard Configuration Variables
--------------------------------------

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

'CC'
     C compiler command
'CFLAGS'
     C compiler flags
'CXX'
     C++ compiler command
'CXXFLAGS'
     C++ compiler flags
'LDFLAGS'
     linker flags
'CPPFLAGS'
     C/C++ preprocessor flags
...

   '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 'configure' to force it to use 'gcc-3' as
C compiler, use header files from '~/usr/include' when compiling, and
libraries from '~/usr/lib' when linking.

     ~/amhello-1.0 % ./configure --prefix ~/usr CC=gcc-3 \
     CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib

   Again, a full list of these variables appears in the output of
'./configure --help'.


File: automake.info,  Node: config.site,  Next: VPATH Builds,  Prev: Standard Configuration Variables,  Up: Use Cases

2.2.5 Overriding Default Configuration Setting with 'config.site'
-----------------------------------------------------------------

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

   Recall the command from the previous section:

     ~/amhello-1.0 % ./configure --prefix ~/usr CC=gcc-3 \
     CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib

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

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

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

     ~/amhello-1.0 % ./configure --prefix ~/usr
     configure: loading site script /home/adl/usr/share/config.site
     ...

   *Note Setting Site Defaults: (autoconf)Site Defaults, for more
information about this feature.


File: automake.info,  Node: VPATH Builds,  Next: Two-Part Install,  Prev: config.site,  Up: Use Cases

2.2.6 Parallel Build Trees (a.k.a. VPATH Builds)
------------------------------------------------

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

   The source tree is rooted in the directory containing '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 '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 '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 (*note 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 'configure' to build everything
in a subdirectory called 'build/'.

     ~ % tar zxf ~/amhello-1.0.tar.gz
     ~ % cd amhello-1.0
     ~/amhello-1.0 % mkdir build && cd build
     ~/amhello-1.0/build % ../configure
     ...
     ~/amhello-1.0/build % make
     ...

   These setups, where source and build trees are different, are often
called "parallel builds" or "VPATH builds".  The expression _parallel
build_ is misleading: the word _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 _VPATH builds_ in the following.  _VPATH_ is the name of
the 'make' feature used by the 'Makefile's to allow these builds (*note
'VPATH' Search Path for All Prerequisites: (make)General Search.).

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

     ~ % tar zxf ~/amhello-1.0.tar.gz
     ~ % cd amhello-1.0
     ~/amhello-1.0 % mkdir debug optim && cd debug
     ~/amhello-1.0/debug % ../configure CFLAGS='-g -O0'
     ...
     ~/amhello-1.0/debug % make
     ...
     ~/amhello-1.0/debug % cd ../optim
     ~/amhello-1.0/optim % ../configure CFLAGS='-O3 -fomit-frame-pointer'
     ...
     ~/amhello-1.0/optim % make
     ...

   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: 'HOST1' and
'HOST2', which may be different platforms.

     ~ % cd /nfs/src
     /nfs/src % tar zxf ~/amhello-1.0.tar.gz

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

(Here we assume that the installer has configured 'sudo' so it can
execute 'make install' with root privileges; it is more convenient than
using 'su' like in *note Basic Installation::).

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

   In this scenario, nothing forbids the '/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.)


File: automake.info,  Node: Two-Part Install,  Next: Cross-Compilation,  Prev: VPATH Builds,  Up: Use Cases

2.2.7 Two-Part Installation
---------------------------

In our last example (*note 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 'Makefile' targets to
install each of these classes of files.

   These targets are 'install-exec' for architecture-dependent files and
'install-data' for architecture-independent files.  The command we used
up to now, 'make install', can be thought of as a shorthand for '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
(*note Standard Directory Variables::), all the variables based on
EXEC-PREFIX designate architecture-dependent directories whose files
will be installed by 'make install-exec'.  The others designate
architecture-independent directories and will serve files installed by
'make install-data'.  *Note 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 '/usr', and
(2) the directory '/usr/share' is shared by the two hosts.

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

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

   In packages that have installation checks, it would make sense to run
'make installcheck' (*note Basic Installation::) to verify that the
package works correctly despite the apparent partial installation.


File: automake.info,  Node: Cross-Compilation,  Next: Renaming,  Prev: Two-Part Install,  Up: Use Cases

2.2.8 Cross-Compilation
-----------------------

To "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 "build platform" on which the compilation is
performed, and the "host platform" on which the resulting executable is
expected to run.  The following 'configure' options are used to specify
each of them:

'--build=BUILD'
     The system on which the package is built.
'--host=HOST'
     The system where built programs and libraries will run.

   When the '--host' is used, '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
'i586-mingw32msvc-gcc', 'i586-mingw32msvc-ld', 'i586-mingw32msvc-as',
etc.

   Here is how we could build 'amhello-1.0' for 'i586-mingw32msvc' on a
GNU/Linux PC.

     ~/amhello-1.0 % ./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...
     ...
     ~/amhello-1.0 % make
     ...
     ~/amhello-1.0 % cd src; file hello.exe
     hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable

   The '--host' and '--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.

'--target=TARGET'
     When building compiler tools: the system for which the tools will
     create output.

   For instance when installing GCC, the GNU Compiler Collection, we can
use '--target=TARGET' to specify that we want to build GCC as a
cross-compiler for TARGET.  Mixing '--build' and '--target', we can
actually cross-compile a cross-compiler; such a three-way
cross-compilation is known as a "Canadian cross".

   *Note Specifying the System Type: (autoconf)Specifying Names, for
more information about these 'configure' options.


File: automake.info,  Node: Renaming,  Next: DESTDIR,  Prev: Cross-Compilation,  Up: Use Cases

2.2.9 Renaming Programs at Install Time
---------------------------------------

The GNU Build System provides means to automatically rename executables
and manpages before they are installed (*note 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 'tar' as 'gtar' so you can
distinguish it from your vendor's 'tar'.

   This can be done using one of these three 'configure' options.

'--program-prefix=PREFIX'
     Prepend PREFIX to installed program names.
'--program-suffix=SUFFIX'
     Append SUFFIX to installed program names.
'--program-transform-name=PROGRAM'
     Run 'sed PROGRAM' on installed program names.

   The following commands would install 'hello' as
'/usr/local/bin/test-hello', for instance.

     ~/amhello-1.0 % ./configure --program-prefix test-
     ...
     ~/amhello-1.0 % make
     ...
     ~/amhello-1.0 % sudo make install
     ...


File: automake.info,  Node: DESTDIR,  Next: Preparing Distributions,  Prev: Renaming,  Up: Use Cases

2.2.10 Building Binary Packages Using DESTDIR
---------------------------------------------

The GNU Build System's 'make install' and '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 'make install' is inappropriate.

   The '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., '--prefix /usr'), but when running 'make
install', the '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.

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

     ~/amhello-1.0 % ./configure --prefix /usr
     ...
     ~/amhello-1.0 % make
     ...
     ~/amhello-1.0 % make DESTDIR=$HOME/inst install
     ...
     ~/amhello-1.0 % cd ~/inst
     ~/inst % find . -type f -print > ../files.lst
     ~/inst % tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`
     ./usr/bin/hello
     ./usr/share/doc/amhello/README

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

   Note that when building packages for several architectures, it might
be convenient to use 'make install-data' and 'make install-exec' (*note
Two-Part Install::) to gather architecture-independent files in a single
package.

   *Note Install::, for more information.


File: automake.info,  Node: Preparing Distributions,  Next: Dependency Tracking,  Prev: DESTDIR,  Up: Use Cases

2.2.11 Preparing Distributions
------------------------------

We have already mentioned 'make dist'.  This target collects all your
source files and the necessary parts of the build system to create a
tarball named 'PACKAGE-VERSION.tar.gz'.

   Another, more useful command is 'make distcheck'.  The 'distcheck'
target constructs 'PACKAGE-VERSION.tar.gz' just as well as 'dist', but
it additionally ensures most of the use cases presented so far work:

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

   All of these actions are performed in a temporary subdirectory, so
that no root privileges are required.

   Releasing a package that fails '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 '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 'distcheck' (like 'DESTDIR' not working because of a
typo, or a distributed file being erased by 'make clean', or even
'VPATH' builds not working).

   *Note Creating amhello::, to recreate 'amhello-1.0.tar.gz' using
'make distcheck'.  *Note Checking the Distribution::, for more
information about 'distcheck'.


File: automake.info,  Node: Dependency Tracking,  Next: Nested Packages,  Prev: Preparing Distributions,  Up: Use Cases

2.2.12 Automatic 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 '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, *note
Dependencies::.

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

     ~/amhello-1.0 % ./configure --prefix /usr
     ...
     checking dependency style of gcc... gcc3
     ...

   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:
'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 'configure' option to disable this:

'--disable-dependency-tracking'
     Speed up one-time builds.

   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 '--enable-dependency-tracking' must
be passed to 'configure' to activate them.

'--enable-dependency-tracking'
     Do not reject slow dependency extractors.

   *Note Dependency Tracking Evolution: (automake-history)Dependency
Tracking Evolution, for some discussion about the different dependency
tracking schemes used by Automake over the years.


File: automake.info,  Node: Nested Packages,  Prev: Dependency Tracking,  Up: Use Cases

2.2.13 Nested Packages
----------------------

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 'configure' script of A will
run the '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 'configure' options given to
the top-level 'configure' are passed recursively to nested 'configure's.
A package that does not understand an option will ignore it, assuming it
is meaningful to some other package.

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

   *Note Subpackages::, for an example setup.


File: automake.info,  Node: Why Autotools,  Next: Hello World,  Prev: Use Cases,  Up: Autotools Introduction

2.3 How Autotools Help
======================

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

   * As we have seen, the GNU Build System has a lot of features (*note
     Use Cases::).  Some users may expect features you have not
     implemented because you did not need them.
   * Implementing these features portably is difficult and exhausting.
     Think of writing portable shell scripts, and portable 'Makefile's,
     for systems you may not have handy.  *Note Portable Shell
     Programming: (autoconf)Portable Shell, to convince yourself.
   * You will have to upgrade your setup to follow changes to the GNU
     Coding Standards.

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

   * Tools to create a portable, complete, and self-contained GNU Build
     System, from simple instructions.  _Self-contained_ meaning the
     resulting build system does not require the GNU Autotools.
   * A central place where fixes and improvements are made: a bug-fix
     for a portability issue will benefit every package.

   Yet there also exist reasons why you may want NOT to use the
Autotools...  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.


File: automake.info,  Node: Hello World,  Prev: Why Autotools,  Up: Autotools Introduction

2.4 A Small Hello World
=======================

In this section we recreate the '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
'configure.ac' and 'Makefile.am' files read by the Autotools.

* Menu:

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


File: automake.info,  Node: Creating amhello,  Next: amhello's configure.ac Setup Explained,  Up: Hello World

2.4.1 Creating 'amhello-1.0.tar.gz'
-----------------------------------

Here is how we can recreate '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 '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.

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

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

   * 'README' contains some very limited documentation for our little
     package.
          ~/amhello % cat README
          This is a demonstration package for GNU Automake.
          Type 'info Automake' to read the Automake manual.

   * 'Makefile.am' and 'src/Makefile.am' contain Automake instructions
     for these two directories.

          ~/amhello % cat src/Makefile.am
          bin_PROGRAMS = hello
          hello_SOURCES = main.c
          ~/amhello % cat Makefile.am
          SUBDIRS = src
          dist_doc_DATA = README

   * Finally, 'configure.ac' contains Autoconf instructions to create
     the 'configure' script.

          ~/amhello % cat configure.ac
          AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
          AM_INIT_AUTOMAKE([-Wall -Werror foreign])
          AC_PROG_CC
          AC_CONFIG_HEADERS([config.h])
          AC_CONFIG_FILES([
           Makefile
           src/Makefile
          ])
          AC_OUTPUT

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

     ~/amhello % autoreconf --install
     configure.ac: installing './install-sh'
     configure.ac: installing './missing'
     configure.ac: installing './compile'
     src/Makefile.am: installing './depcomp'

   At this point the build system is complete.

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

     ~/amhello % ./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

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

     ~/amhello % make
     ...
     ~/amhello % src/hello
     Hello World!
     This is amhello 1.0.
     ~/amhello % make distcheck
     ...
     =============================================
     amhello-1.0 archives ready for distribution:
     amhello-1.0.tar.gz
     =============================================

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

   'autoreconf' is a script that calls 'autoconf', '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 'autoconf' is in charge of creating 'configure' from
'configure.ac', while 'automake' is in charge of creating 'Makefile.in's
from 'Makefile.am's and 'configure.ac'.  This should at least direct you
to the right manual when seeking answers.


File: automake.info,  Node: amhello's configure.ac Setup Explained,  Next: amhello's Makefile.am Setup Explained,  Prev: Creating amhello,  Up: Hello World

2.4.2 'amhello''s 'configure.ac' Setup Explained
------------------------------------------------

Let us begin with the contents of 'configure.ac'.

     AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
     AM_INIT_AUTOMAKE([-Wall -Werror foreign])
     AC_PROG_CC
     AC_CONFIG_HEADERS([config.h])
     AC_CONFIG_FILES([
      Makefile
      src/Makefile
     ])
     AC_OUTPUT

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

   The macros prefixed with 'AC_' are Autoconf macros, documented in the
Autoconf manual (*note Autoconf Macro Index: (autoconf)Autoconf Macro
Index.).  The macros that start with 'AM_' are Automake macros,
documented later in this manual (*note Macro Index::).

   The first two lines of 'configure.ac' initialize Autoconf and
Automake.  '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 './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.

   The argument to 'AM_INIT_AUTOMAKE' is a list of options for
'automake' (*note Options::).  '-Wall' and '-Werror' ask 'automake' to
turn on all warnings and report them as errors.  We are speaking of
*Automake* warnings here, such as dubious instructions in '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 '-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 'foreign' option tells Automake that this package will not
follow the GNU Standards.  GNU packages should always distribute
additional files such as 'ChangeLog', 'AUTHORS', etc.  We do not want
'automake' to complain about these missing files in our small example.

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

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

     ...
     /* Define to the address where bug reports for this package should be sent. */
     #define PACKAGE_BUGREPORT "bug-automake@gnu.org"

     /* Define to the full name and version of this package. */
     #define PACKAGE_STRING "amhello 1.0"
     ...

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

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

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

   When starting a new project, we suggest you start with such a simple
'configure.ac', and gradually add the other tests it requires.  The
command 'autoscan' can also suggest a few of the tests your package may
need (*note Using 'autoscan' to Create 'configure.ac':
(autoconf)autoscan Invocation.).


File: automake.info,  Node: amhello's Makefile.am Setup Explained,  Prev: amhello's configure.ac Setup Explained,  Up: Hello World

2.4.3 'amhello''s 'Makefile.am' Setup Explained
-----------------------------------------------

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

     bin_PROGRAMS = hello
     hello_SOURCES = main.c

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

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

   The 'bin' part of the 'bin_PROGRAMS' tells 'automake' that the
resulting programs should be installed in BINDIR.  Recall that the GNU
Build System uses a set of variables to denote destination directories
and allow users to customize these locations (*note Standard Directory
Variables::).  Any such directory variable can be put in front of a
primary (omitting the 'dir' suffix) to tell 'automake' where to install
the listed files.

   Programs need to be built from source files, so for each program
'PROG' listed in a '_PROGRAMS' variable, 'automake' will look for
another variable named '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
'hello_SOURCES' declaration is that 'main.c' will be part of the tarball
created by 'make dist'.

   Finally here are some explanations regarding the top-level
'Makefile.am'.

     SUBDIRS = src
     dist_doc_DATA = README

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

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

   One thing not covered in this example is accessing the installation
directory values (*note Standard Directory Variables::) from your
program code, that is, converting them into defined macros.  For this,
*note (autoconf)Defining Directories::.


File: automake.info,  Node: Generalities,  Next: Examples,  Prev: Autotools Introduction,  Up: Top

3 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


File: automake.info,  Node: General Operation,  Next: Strictness,  Up: Generalities

3.1 General Operation
=====================

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

   The variable definitions and rules in the '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 'Makefile.in'.  For instance, the Automake distribution
includes a non-standard rule for the 'git-dist' target, which the
Automake maintainer uses to make distributions from the source control
system.

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

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

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

   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 whitespaces.  For example, <TAB> characters cannot
be used between a target name and the following "':'" character, and
variable assignments shouldn't be indented with <TAB> characters.  Also,
using more complex macro in target names can cause trouble:

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

   A rule defined in 'Makefile.am' generally overrides any such rule of
a similar name that would be automatically generated by '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.

   Similarly, a variable defined in 'Makefile.am' or 'AC_SUBST'ed from
'configure.ac' will override any definition of the variable that
'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 'automake' are considered to be for internal use
only, and their names might change in future releases.

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

     xs = a.c b.c
     foo_SOURCES = c.c $(xs)

   it would use the files 'a.c', 'b.c', and 'c.c' as the contents of
'foo_SOURCES'.

   Automake also allows a form of comment that is _not_ copied into the
output; all lines beginning with '##' (leading spaces allowed) are
completely ignored by Automake.

   It is customary to make the first line of 'Makefile.am' read:

     ## Process this file with automake to produce Makefile.in


File: automake.info,  Node: Strictness,  Next: Uniform,  Prev: General Operation,  Up: Generalities

3.2 Strictness
==============

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.

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

   The valid strictness levels are:

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

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

'gnits'
     Automake will check for compliance to the as-yet-unwritten "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).

   *Note Gnits::, for more information on the precise implications of
the strictness level.


File: automake.info,  Node: Uniform,  Next: Length Limitations,  Prev: Strictness,  Up: Generalities

3.3 The Uniform Naming Scheme
=============================

Automake variables generally follow a "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 'configure' time
determination of what should be built.

   At '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 'automake' what is being built is commonly
called the "primary".  For instance, the primary 'PROGRAMS' holds a list
of programs that are to be compiled and linked.

   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
(*note (standards)Directory Variables::).  Automake extends this list
with 'pkgdatadir', 'pkgincludedir', 'pkglibdir', and 'pkglibexecdir';
these are the same as the non-'pkg' versions, but with '$(PACKAGE)'
appended.  For instance, 'pkglibdir' is defined as
'$(libdir)/$(PACKAGE)'.

   For each primary, there is one additional variable named by
prepending 'EXTRA_' to the primary name.  This variable is used to list
objects that may or may not be built, depending on what '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
'Makefile.in' that will work in all cases.

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

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

   Defining a primary without a prefix as a variable, e.g., 'PROGRAMS',
is an error.

   Note that the common 'dir' suffix is left off when constructing the
variable names; thus one writes 'bin_PROGRAMS' and not
'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.

   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., 'zar') is
valid if a variable of the same name with 'dir' appended is defined
(e.g., 'zardir').

   For instance, the following snippet will install 'file.xml' into
'$(datadir)/xml'.

     xmldir = $(datadir)/xml
     xml_DATA = file.xml

   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:

     # Forbidden directory combinations, automake will error out on this.
     pkglib_PROGRAMS = foo
     doc_LIBRARIES = libquux.a

but it will succeed with this:

     # 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

   The 'exec' substring of the 'my_execbindir' variable lets the files
be installed at the right time (*note The Two Parts of Install::).

   The special prefix '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 (*note A Library::), or helper scripts.

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

   The current primary names are 'PROGRAMS', 'LIBRARIES', 'LTLIBRARIES',
'LISP', 'PYTHON', 'JAVA', 'SCRIPTS', 'DATA', 'HEADERS', 'MANS', and
'TEXINFOS'.

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


File: automake.info,  Node: Length Limitations,  Next: Canonicalization,  Prev: Uniform,  Up: Generalities

3.4 Staying below the command line length limit
===============================================

Traditionally, most unix-like systems have a length limitation for the
command line arguments and environment contents when creating new
processes (see for example
<http://www.in-ulm.de/~mascheck/various/argmax/> for an overview on this
issue), which of course also applies to commands spawned by '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,

     data_DATA = file1 ... fileN fileN+1 ... file2N

may also be written as

     data_DATA = file1 ... fileN
     data2dir = $(datadir)
     data2_DATA = fileN+1 ... file2N

and will cause Automake to treat the two lists separately during 'make
install'.  See *note The Two Parts of Install:: for choosing directory
names that will keep the ordering of the two parts of installation Note
that '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 '${srcdir}/' is prepended to file names, as
can happen with above '$(data_DATA)' lists, it limits the amount of
arguments passed to external commands.

   Unfortunately, some system's 'make' commands may prepend 'VPATH'
prefixes like '${srcdir}/' to file names from the source tree
automatically (*note Automatic Rule Rewriting: (autoconf)Automatic Rule
Rewriting.).  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 (*note Libtool Convenience Libraries::).


File: automake.info,  Node: Canonicalization,  Next: User Variables,  Prev: Length Limitations,  Up: Generalities

3.5 How derived variables are named
===================================

Sometimes a Makefile variable name is derived from some text the
maintainer supplies.  For instance, a program name listed in '_PROGRAMS'
is rewritten into the name of a '_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 'sniff-glue', the derived
variable name would be 'sniff_glue_SOURCES', not 'sniff-glue_SOURCES'.
Similarly the sources for a library named 'libmumble++.a' should be
listed in the 'libmumble___a_SOURCES' variable.

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


File: automake.info,  Node: User Variables,  Next: Auxiliary Programs,  Prev: Canonicalization,  Up: Generalities

3.6 Variables reserved for the user
===================================

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

   Sometimes package developers are tempted to set user variables such
as '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 'CC', where they would make no sense.)
The shadow variable is named by prepending 'AM_' to the user variable's
name.  For instance, the shadow variable for 'YFLAGS' is 'AM_YFLAGS'.
The package maintainer--that is, the author(s) of the 'Makefile.am' and
'configure.ac' files--may adjust these shadow variables however
necessary.

   *Note Flag Variables Ordering::, for more discussion about these
variables and how they interact with per-target variables.


File: automake.info,  Node: Auxiliary Programs,  Prev: User Variables,  Up: Generalities

3.7 Programs automake might require
===================================

Automake sometimes requires helper programs so that the generated
'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.

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

'compile'
     This is a wrapper for compilers that do not accept options '-c' and
     '-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: '-I', '-L', '-l', '-Wl,' and
     '-Xlinker'.

'config.guess'
'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 <http://savannah.gnu.org/git/?group=config> before
     making a release.

'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 (*note Dependencies::).

'install-sh'
     This is a replacement for the 'install' program that works on
     platforms where 'install' is unavailable or unusable.

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

'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, 'missing' will print an informative warning before failing
     out, to provide the user with more context and information.

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

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

'py-compile'
     This is used to byte-compile Python scripts.

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

'texinfo.tex'
     Not a program, this file is required for 'make dvi', 'make ps' and
     'make pdf' to work when Texinfo sources are in the package.  The
     latest version can be downloaded from
     <http://www.gnu.org/software/texinfo/>.

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


File: automake.info,  Node: Examples,  Next: automake Invocation,  Prev: Generalities,  Up: Top

4 Some example packages
***********************

This section contains two small examples.

   The first example (*note Complete::) assumes you have an existing
project already using Autoconf, with handcrafted '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 (*note Hello World::).

   The second example (*note 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


File: automake.info,  Node: Complete,  Next: true,  Up: Examples

4.1 A simple example, start to finish
=====================================

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

   The first step is to update your 'configure.ac' to include the
commands that 'automake' needs.  The way to do this is to add an
'AM_INIT_AUTOMAKE' call just after 'AC_INIT':

     AC_INIT([zardoz], [1.0])
     AM_INIT_AUTOMAKE
     ...

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

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

     mv aclocal.m4 acinclude.m4
     aclocal
     autoconf

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

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

     info_TEXINFOS = zardoz.texi

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


File: automake.info,  Node: true,  Prev: Complete,  Up: Examples

4.2 Building true and false
===========================

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

     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

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

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

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

     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

   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 'true' and 'false'
in real life, you would probably use per-program compilation flags, like
so:

     bin_PROGRAMS = false true

     false_SOURCES = true.c
     false_CPPFLAGS = -DEXIT_CODE=1

     true_SOURCES = true.c
     true_CPPFLAGS = -DEXIT_CODE=0

   In this case Automake will cause '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 'false-true.o' and 'true-true.o'.
(The name of the object files rarely matters.)


File: automake.info,  Node: automake Invocation,  Next: configure,  Prev: Examples,  Up: Top

5 Creating a 'Makefile.in'
**************************

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

   You can optionally give 'automake' an argument; '.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
'Makefile.in'.  Note that 'automake' must always be run from the topmost
directory of a project, even if being used to regenerate the
'Makefile.in' in some subdirectory.  This is necessary because
'automake' must scan 'configure.ac', and because 'automake' uses the
knowledge that a 'Makefile.in' is in a subdirectory to change its
behavior in some cases.

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

   'automake' accepts the following options:

'-a'
'--add-missing'
     Automake requires certain common files to exist in certain
     situations; for instance, 'config.guess' is required if
     'configure.ac' invokes 'AC_CANONICAL_HOST'.  Automake is
     distributed with several of these files (*note 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 '--copy'.

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

     In some strictness modes, additional files are installed, see *note
     Gnits:: for more information.

'--libdir=DIR'
     Look for Automake data files in directory DIR instead of in the
     installation directory.  This is typically used for debugging.

'--print-libdir'
     Print the path of the installation directory containing
     Automake-provided scripts and data files (like e.g., 'texinfo.texi'
     and 'install-sh').

'-c'
'--copy'
     When used with '--add-missing', causes installed files to be
     copied.  The default is to make a symbolic link.

'-f'
'--force-missing'
     When used with '--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 '--copy', copying the new file).

'--foreign'
     Set the global strictness to 'foreign'.  For more information, see
     *note Strictness::.

'--gnits'
     Set the global strictness to 'gnits'.  For more information, see
     *note Gnits::.

'--gnu'
     Set the global strictness to 'gnu'.  For more information, see
     *note Gnits::.  This is the default strictness.

'--help'
     Print a summary of the command line options and exit.

'-i'
'--ignore-deps'
     This disables the dependency tracking feature in generated
     'Makefile's; see *note Dependencies::.

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

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

'-o DIR'
'--output-dir=DIR'
     Put the generated 'Makefile.in' in the directory DIR.  Ordinarily
     each 'Makefile.in' is created in the directory of the corresponding
     'Makefile.am'.  This option is deprecated and will be removed in a
     future release.

'-v'
'--verbose'
     Cause Automake to print information about which files are being
     read or created.

'--version'
     Print the version number of Automake and exit.

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

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

     The categories output by default are 'obsolete', 'syntax' and
     'unsupported'.  Additionally, 'gnu' and 'portability' are enabled
     in '--gnu' and '--gnits' strictness.

     Turning off 'portability' will also turn off 'extra-portability',
     and similarly turning on 'extra-portability' will also turn on
     'portability'.  However, turning on 'portability' or turning off
     'extra-portability' will not affect the other category.

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

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


File: automake.info,  Node: configure,  Next: Directories,  Prev: automake Invocation,  Up: Top

6 Scanning 'configure.ac', using 'aclocal'
******************************************

Automake scans the package's 'configure.ac' to determine certain
information about the package.  Some 'autoconf' macros are required and
some variables must be defined in 'configure.ac'.  Automake will also
use information from '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 'aclocal.m4'
using the 'aclocal' program.

* Menu:

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


File: automake.info,  Node: Requirements,  Next: Optional,  Up: configure

6.1 Configuration requirements
==============================

The one real requirement of Automake is that your 'configure.ac' call
'AM_INIT_AUTOMAKE'.  This macro does several things that are required
for proper Automake operation (*note Macros::).

   Here are the other macros that Automake requires but which are not
run by 'AM_INIT_AUTOMAKE':

'AC_CONFIG_FILES'
'AC_OUTPUT'
     These two macros are usually invoked as follows near the end of
     'configure.ac'.

          ...
          AC_CONFIG_FILES([
            Makefile
            doc/Makefile
            src/Makefile
            src/lib/Makefile
            ...
          ])
          AC_OUTPUT

     Automake uses these to determine which files to create (*note
     Creating Output Files: (autoconf)Output.).  A listed file is
     considered to be an Automake generated 'Makefile' if there exists a
     file with the same name and the '.am' extension appended.
     Typically, 'AC_CONFIG_FILES([foo/Makefile])' will cause Automake to
     generate 'foo/Makefile.in' if 'foo/Makefile.am' exists.

     When using 'AC_CONFIG_FILES' with multiple input files, as in

          AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])

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

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

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

          file=input
          ...
          AC_CONFIG_FILES([output:$file],, [file=$file])

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

     Similarly

          file=output
          file2=out:in
          ...
          AC_CONFIG_FILES([$file:input],, [file=$file])
          AC_CONFIG_FILES([$file2],, [file2=$file2])

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

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

          AC_SUBST([APIVERSION], ...)
          ...
          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}])

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

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

     It is possible to let 'automake' emit conditional rules for
     'AC_CONFIG_FILES' with the help of 'AM_COND_IF' (*note Optional::).

     To summarize:
        * Use literals for 'Makefile's, and for other files whenever
          possible.
        * Use '$file' (or '${file}' without 'AC_SUBST([file])') for
          files that 'automake' should ignore.
        * Use '${file}' and 'AC_SUBST([file])' for files that 'automake'
          should not ignore.


File: automake.info,  Node: Optional,  Next: aclocal Invocation,  Prev: Requirements,  Up: configure

6.2 Other things Automake recognizes
====================================

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

'AC_CANONICAL_BUILD'
'AC_CANONICAL_HOST'
'AC_CANONICAL_TARGET'
     Automake will ensure that 'config.guess' and 'config.sub' exist.
     Also, the 'Makefile' variables 'build_triplet', 'host_triplet' and
     'target_triplet' are introduced.  See *note Getting the Canonical
     System Type: (autoconf)Canonicalizing.

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

     If 'AC_CONFIG_AUX_DIR' is not given, the scripts are looked for in
     their standard locations.  For 'mdate-sh', 'texinfo.tex', and
     'ylwrap', the standard location is the source directory
     corresponding to the current 'Makefile.am'.  For the rest, the
     standard location is the first one of '.', '..', or '../..'
     (relative to the top source directory) that provides any one of the
     helper scripts.  *Note Finding 'configure' Input: (autoconf)Input.

     Required files from 'AC_CONFIG_AUX_DIR' are automatically
     distributed, even if there is no 'Makefile.am' in this directory.

'AC_CONFIG_LIBOBJ_DIR'
     Automake will require the sources file declared with 'AC_LIBSOURCE'
     (see below) in the directory specified by this macro.

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

     As with 'AC_CONFIG_FILES' (*note Requirements::), parts of the
     specification using shell variables will be ignored as far as
     cleaning, distributing, and rebuilding is concerned.

'AC_CONFIG_LINKS'
     Automake will generate rules to remove 'configure' generated links
     on 'make distclean' and to distribute named source files as part of
     'make dist'.

     As for 'AC_CONFIG_FILES' (*note 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.)

'AC_LIBOBJ'
'AC_LIBSOURCE'
'AC_LIBSOURCES'
     Automake will automatically distribute any file listed in
     'AC_LIBSOURCE' or 'AC_LIBSOURCES'.

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

     By the way, direct assignments to 'LIBOBJS' are no longer
     supported.  You should always use 'AC_LIBOBJ' for this purpose.
     *Note 'AC_LIBOBJ' vs. 'LIBOBJS': (autoconf)AC_LIBOBJ vs LIBOBJS.

'AC_PROG_RANLIB'
     This is required if any libraries are built in the package.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_PROG_CXX'
     This is required if any C++ source is included.  *Note Particular
     Program Checks: (autoconf)Particular Programs.

'AC_PROG_OBJC'
     This is required if any Objective C source is included.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_PROG_OBJCXX'
     This is required if any Objective C++ source is included.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_PROG_F77'
     This is required if any Fortran 77 source is included.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_F77_LIBRARY_LDFLAGS'
     This is required for programs and shared libraries that are a
     mixture of languages that include Fortran 77 (*note Mixing Fortran
     77 With C and C++::).  *Note Autoconf macros supplied with
     Automake: Macros.

'AC_FC_SRCEXT'
     Automake will add the flags computed by 'AC_FC_SRCEXT' to
     compilation of files with the respective source extension (*note
     Fortran Compiler Characteristics: (autoconf)Fortran Compiler.).

'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.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_PROG_LIBTOOL'
     Automake will turn on processing for 'libtool' (*note Introduction:
     (libtool)Top.).

'AC_PROG_YACC'
     If a Yacc source file is seen, then you must either use this macro
     or define the variable 'YACC' in 'configure.ac'.  The former is
     preferred (*note Particular Program Checks: (autoconf)Particular
     Programs.).

'AC_PROG_LEX'
     If a Lex source file is seen, then this macro must be used.  *Note
     Particular Program Checks: (autoconf)Particular Programs.

'AC_REQUIRE_AUX_FILE'
     For each 'AC_REQUIRE_AUX_FILE([FILE])', 'automake' will ensure that
     '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 'AC_CONFIG_AUX_DIR'
     above.  *Note Finding 'configure' Input: (autoconf)Input.

'AC_SUBST'
     The first argument is automatically defined as a variable in each
     generated 'Makefile.in', unless 'AM_SUBST_NOTMAKE' is also used for
     this variable.  *Note Setting Output Variables: (autoconf)Setting
     Output Variables.

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

'AM_CONDITIONAL'
     This introduces an Automake conditional (*note Conditionals::).

'AM_COND_IF'
     This macro allows 'automake' to detect subsequent access within
     'configure.ac' to a conditional previously introduced with
     'AM_CONDITIONAL', thus enabling conditional 'AC_CONFIG_FILES'
     (*note Usage of Conditionals::).

'AM_GNU_GETTEXT'
     This macro is required for packages that use GNU gettext (*note
     gettext::).  It is distributed with gettext.  If Automake sees this
     macro it ensures that the package meets some of gettext's
     requirements.

'AM_GNU_GETTEXT_INTL_SUBDIR'
     This macro specifies that the 'intl/' subdirectory is to be built,
     even if the 'AM_GNU_GETTEXT' macro was invoked with a first
     argument of 'external'.

'AM_MAINTAINER_MODE([DEFAULT-MODE])'
     This macro adds an '--enable-maintainer-mode' option to
     'configure'.  If this is used, 'automake' will cause
     "maintainer-only" rules to be turned off by default in the
     generated 'Makefile.in's, unless DEFAULT-MODE is 'enable'.  This
     macro defines the 'MAINTAINER_MODE' conditional, which you can use
     in your own 'Makefile.am'.  *Note maintainer-mode::.

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

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

     'm4_include' is seldom used by 'configure.ac' authors, but can
     appear in 'aclocal.m4' when 'aclocal' detects that some required
     macros come from files local to your package (as opposed to macros
     installed in a system-wide directory, *note aclocal Invocation::).


File: automake.info,  Node: aclocal Invocation,  Next: Macros,  Prev: Optional,  Up: configure

6.3 Auto-generating aclocal.m4
==============================

Automake includes a number of Autoconf macros that can be used in your
package (*note Macros::); some of them are actually required by Automake
in certain situations.  These macros must be defined in your
'aclocal.m4'; otherwise they will not be seen by 'autoconf'.

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

   At startup, 'aclocal' scans all the '.m4' files it can find, looking
for macro definitions (*note Macro Search Path::).  Then it scans
'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 'aclocal.m4'.

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

   When a file selected by 'aclocal' is located in a subdirectory
specified as a relative search path with 'aclocal''s '-I' argument,
'aclocal' assumes the file belongs to the package and uses 'm4_include'
instead of copying it into 'aclocal.m4'.  This makes the package
smaller, eases dependency tracking, and cause the file to be distributed
automatically.  (*Note 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 '-I `pwd`/reldir' instead of '-I reldir' whenever
some relative directory should be considered outside the package.

   The contents of 'acinclude.m4', if this file exists, are also
automatically included in 'aclocal.m4'.  We recommend against using
'acinclude.m4' in new packages (*note Local Macros::).

   While computing 'aclocal.m4', 'aclocal' runs 'autom4te' (*note Using
'Autom4te': (autoconf)Using autom4te.) in order to trace the macros that
are really used, and omit from 'aclocal.m4' all macros that are
mentioned but otherwise unexpanded (this can happen when a macro is
called conditionally).  'autom4te' is expected to be in the 'PATH', just
as 'autoconf'.  Its location can be overridden using the '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


File: automake.info,  Node: aclocal Options,  Next: Macro Search Path,  Up: aclocal Invocation

6.3.1 aclocal Options
---------------------

'aclocal' accepts the following options:

'--automake-acdir=DIR'
     Look for the automake-provided macro files in DIR instead of in the
     installation directory.  This is typically used for debugging.

'--system-acdir=DIR'
     Look for the system-wide third-party macro files (and the special
     'dirlist' file) in DIR instead of in the installation directory.
     This is typically used for debugging.

'--diff[=COMMAND]'
     Run COMMAND on M4 file that would be installed or overwritten by
     '--install'.  The default COMMAND is 'diff -u'.  This option
     implies '--install' and '--dry-run'.

'--dry-run'
     Do not actually overwrite (or create) 'aclocal.m4' and M4 files
     installed by '--install'.

'--help'
     Print a summary of the command line options and exit.

'-I DIR'
     Add the directory DIR to the list of directories searched for '.m4'
     files.

'--install'
     Install system-wide third-party macros into the first directory
     specified with '-I DIR' instead of copying them in the output file.
     Note that this will happen also if DIR is an absolute path.

     When this option is used, and only when this option is used,
     'aclocal' will also honor '#serial 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
     (*note Serials::).

'--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 'aclocal.m4' (or the file
     specified with '--output' below) and only this file, it has
     absolutely no influence on files that may need to be installed by
     '--install'.

'--output=FILE'
     Cause the output to be put into FILE instead of 'aclocal.m4'.

'--print-ac-dir'
     Prints the name of the directory that 'aclocal' will search to find
     third-party '.m4' files.  When this option is given, normal
     processing is suppressed.  This option was used _in the past_ by
     third-party packages to determine where to install '.m4' macro
     files, but _this usage is today discouraged_, since it causes
     '$(prefix)' not to be thoroughly honoured (which violates the GNU
     Coding Standards), and a similar semantics can be better obtained
     with the 'ACLOCAL_PATH' environment variable; *note Extending
     aclocal::.

'--verbose'
     Print the names of the files it examines.

'--version'
     Print the version number of Automake and exit.

'-W CATEGORY'
'--warnings=CATEGORY'
     Output warnings falling in CATEGORY.  CATEGORY can be one of:
     'syntax'
          dubious syntactic constructs, underquoted macros, unused
          macros, etc.
     'unsupported'
          unknown macros
     'all'
          all the warnings, this is the default
     'none'
          turn off all the warnings
     'error'
          treat warnings as errors

     All warnings are output by default.

     The environment variable 'WARNINGS' is honored in the same way as
     it is for 'automake' (*note automake Invocation::).


File: automake.info,  Node: Macro Search Path,  Next: Extending aclocal,  Prev: aclocal Options,  Up: aclocal Invocation

6.3.2 Macro Search Path
-----------------------

By default, 'aclocal' searches for '.m4' files in the following
directories, in this order:

'ACDIR-APIVERSION'
     This is where the '.m4' macros distributed with Automake itself are
     stored.  APIVERSION depends on the Automake release used; for
     example, for Automake 1.11.x, APIVERSION = '1.11'.

'ACDIR'
     This directory is intended for third party '.m4' files, and is
     configured when 'automake' itself is built.  This is
     '@datadir@/aclocal/', which typically expands to
     '${prefix}/share/aclocal/'.  To find the compiled-in value of
     ACDIR, use the '--print-ac-dir' option (*note aclocal Options::).

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

  1. '/usr/local/share/aclocal-1.11.2/'
  2. '/usr/local/share/aclocal/'

   The paths for the ACDIR and ACDIR-APIVERSION directories can be
changed respectively through aclocal options '--system-acdir' and
'--automake-acdir' (*note 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 (*note aclocal Options::), there are several options
that can be used to change or extend this search path.

Modifying the Macro Search Path: '-I DIR'
.........................................

Any extra directories specified using '-I' options (*note aclocal
Options::) are _prepended_ to this search list.  Thus, 'aclocal -I /foo
-I /bar' results in the following search path:

  1. '/foo'
  2. '/bar'
  3. ACDIR-APIVERSION
  4. ACDIR

Modifying the Macro Search Path: 'dirlist'
..........................................

There is a third mechanism for customizing the search path.  If a
'dirlist' file exists in ACDIR, then that file is assumed to contain a
list of directory patterns, one per line.  'aclocal' expands these
patterns to directory names, and adds them to the search list _after_
all other directories.  'dirlist' entries may use shell wildcards such
as '*', '?', or '[...]'.

   For example, suppose 'ACDIR/dirlist' contains the following:

     /test1
     /test2
     /test3*

and that 'aclocal' was called with the '-I /foo -I /bar' options.  Then,
the search path would be

  1. '/foo'
  2. '/bar'
  3. ACDIR-APIVERSION
  4. ACDIR
  5. '/test1'
  6. '/test2'

and all directories with path names starting with '/test3'.

   If the '--system-acdir=DIR' option is used, then 'aclocal' will
search for the 'dirlist' file in DIR; but remember the warnings above
against the use of '--system-acdir'.

   'dirlist' is useful in the following situation: suppose that
'automake' version '1.11.2' is installed with '--prefix=/usr' by the
system vendor.  Thus, the default search directories are

  1. '/usr/share/aclocal-1.11/'
  2. '/usr/share/aclocal/'

   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" '.m4' files are in
'/usr/local/share/aclocal'.  The only way to force '/usr/bin/aclocal' to
find these "extra" '.m4' files is to always call 'aclocal -I
/usr/local/share/aclocal'.  This is inconvenient.  With 'dirlist', one
may create a file '/usr/share/aclocal/dirlist' containing only the
single line

     /usr/local/share/aclocal

   Now, the "default" search path on the affected system is

  1. '/usr/share/aclocal-1.11/'
  2. '/usr/share/aclocal/'
  3. '/usr/local/share/aclocal/'

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

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

Modifying the Macro Search Path: '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 'ACLOCAL_PATH' is added to the search path and takes precedence
over system directories (including those found via 'dirlist'), with the
exception of the versioned directory ACDIR-APIVERSION (*note Macro
Search Path::).  However, directories passed via '-I' will take
precedence over directories in 'ACLOCAL_PATH'.

   Also note that, if the '--install' option is used, any '.m4' file
containing a required macro that is found in a directory listed in
'ACLOCAL_PATH' will be installed locally.  In this case, serial numbers
in '.m4' are honoured too, *note Serials::.

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

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 'ACLOCAL_PATH' and 'ACDIR' might end up
taking precedence over 'ACDIR-APIVERSION', and directories in
'ACDIR/dirlist' might end up taking precedence over 'ACDIR'.  _This is a
possible future incompatibility!_


File: automake.info,  Node: Extending aclocal,  Next: Local Macros,  Prev: Macro Search Path,  Up: aclocal Invocation

6.3.3 Writing your own aclocal macros
-------------------------------------

The '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 'gettext' library
supplies a macro 'AM_GNU_GETTEXT' that should be used by any package
using 'gettext'.  When the library is installed, it installs this macro
so that 'aclocal' will find it.

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

     aclocaldir = $(datadir)/aclocal
     aclocal_DATA = mymacro.m4 myothermacro.m4

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

   A file of macros should be a series of properly quoted 'AC_DEFUN''s
(*note (autoconf)Macro Definitions::).  The 'aclocal' programs also
understands 'AC_REQUIRE' (*note (autoconf)Prerequisite Macros::), 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 'AC_PREREQ'
should be done inside the defined macro, not at the beginning of the
file.

   Starting with Automake 1.8, 'aclocal' will warn about all underquoted
calls to 'AC_DEFUN'.  We realize this will annoy a lot of people,
because '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 'aclocal' (*note Future of aclocal::) will have to
temporarily include all of these third party '.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,

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

should be rewritten as

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

   Wrapping the 'AC_PREREQ' call inside the macro ensures that Autoconf
2.68 will not be required if 'AX_FOOBAR' is not actually used.  Most
importantly, quoting the first argument of '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 '2.68' that do not require it.

   If you have been directed here by the '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 'aclocal' is commonly used is to manage
macros that are used locally by the package, *note Local Macros::.


File: automake.info,  Node: Local Macros,  Next: Serials,  Prev: Extending aclocal,  Up: aclocal Invocation

6.3.4 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 'acinclude.m4'.  This file will be included in 'aclocal.m4'
when you run 'aclocal', and its macro(s) will henceforth be visible to
'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 'm4/'.  Then it's enough to update
'configure.ac' by adding a proper call to 'AC_CONFIG_MACRO_DIRS':

     AC_CONFIG_MACRO_DIRS([m4])

   'aclocal' will then take care of automatically adding 'm4/' to its
search path for m4 files.

   When 'aclocal' is run, it will build an 'aclocal.m4' that
'm4_include's any file from 'm4/' that defines a required macro.  Macros
not found locally will still be searched in system-wide directories, as
explained in *note Macro Search Path::.

   Custom macros should be distributed for the same reason that
'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 '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 'aclocal' directory (*note Extending
aclocal::).  For instance, Guile ships with a file called 'guile.m4'
that contains the macro 'GUILE_FLAGS' that can be used to define setup
compiler and linker flags appropriate for using Guile.  Using
'GUILE_FLAGS' in 'configure.ac' will cause 'aclocal' to copy 'guile.m4'
into 'aclocal.m4', but as 'guile.m4' is not part of the project, it will
not be distributed.  Technically, that means a user who needs to rebuild
'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 'm4/' directory so they get distributed.

   Since Automake 1.10, 'aclocal' offers the option '--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 'm4/' the first
time you run 'aclocal'.  Then the locally installed macros will have
precedence over the system-wide installed macros each time 'aclocal' is
run again.

   One reason why you should keep '--install' in the flags even after
the first run is that when you later edit 'configure.ac' and depend on a
new macro, this macro will be installed in your 'm4/' automatically.
Another one is that serial numbers (*note 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

     #serial NNN

where 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
'--install' option of 'aclocal': this allows other people to use it.


File: automake.info,  Node: Serials,  Next: Future of aclocal,  Prev: Local Macros,  Up: aclocal Invocation

6.3.5 Serial Numbers
--------------------

Because third-party macros defined in '*.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 '#serial' line for this.

   A serial number should be a single line of the form

     # serial VERSION

where 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 '#' must be the first character on the line, and it is OK to have
extra words after the version, as in

     #serial VERSION GARBAGE

   Normally these serial numbers are completely ignored by 'aclocal' and
'autoconf', like any genuine comment.  However when using 'aclocal''s
'--install' feature, these serial numbers will modify the way '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
'#serial' line, 'aclocal' will ignore the file that has the older
'#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 '--install' and its
interaction with serial numbers.  Let's assume we maintain a package
called MyPackage, the 'configure.ac' of which requires a third-party
macro 'AX_THIRD_PARTY' defined in '/usr/share/aclocal/thirdparty.m4' as
follows:

     # serial 1
     AC_DEFUN([AX_THIRD_PARTY], [...])

   MyPackage uses an 'm4/' directory to store local macros as explained
in *note Local Macros::, and has

     AC_CONFIG_MACRO_DIRS([m4])

in its 'configure.ac'.

   Initially the 'm4/' directory is empty.  The first time we run
'aclocal --install', it will notice that

   * 'configure.ac' uses 'AX_THIRD_PARTY'
   * No local macros define 'AX_THIRD_PARTY'
   * '/usr/share/aclocal/thirdparty.m4' defines 'AX_THIRD_PARTY' with
     serial 1.

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

   The next time 'aclocal --install' is run, something different
happens.  'aclocal' notices that

   * 'configure.ac' uses 'AX_THIRD_PARTY'
   * 'm4/thirdparty.m4' defines 'AX_THIRD_PARTY' with serial 1.
   * '/usr/share/aclocal/thirdparty.m4' defines 'AX_THIRD_PARTY' with
     serial 1.

Because both files have the same serial number, 'aclocal' uses the first
it found in its search path order (*note Macro Search Path::).
'aclocal' therefore ignores '/usr/share/aclocal/thirdparty.m4' and
outputs an 'aclocal.m4' that contains 'm4_include([m4/thirdparty.m4])'.

   Local directories specified with '-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 'aclocal --install' is
run the situation is the following:

   * 'configure.ac' uses 'AX_THIRD_PARTY'
   * 'm4/thirdparty.m4' defines 'AX_THIRD_PARTY' with serial 1.
   * '/usr/share/aclocal/thirdparty.m4' defines 'AX_THIRD_PARTY' with
     serial 2.

When '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 '/usr/share/aclocal/thirdparty.m4'
with serial 2, 'aclocal' will proceed as if it had never seen
'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.
'aclocal' will install the new version of the macro in
'm4/thirdparty.m4', in this case overriding the old version.  MyPackage
just had its macro updated as a side effect of running 'aclocal'.

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

   Finally, note that the '--force' option of 'aclocal' has absolutely
no effect on the files installed by '--install'.  For instance, if you
have modified your local macros, do not expect '--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
'aclocal --install'.


File: automake.info,  Node: Future of aclocal,  Prev: Serials,  Up: aclocal Invocation

6.3.6 The Future of 'aclocal'
-----------------------------

'aclocal' is expected to disappear.  This feature really should not be
offered by Automake.  Automake should focus on generating 'Makefile's;
dealing with M4 macros really is Autoconf's job.  The fact that some
people install Automake just to use 'aclocal', but do not use '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 'm4/'-style layout discussed in *note
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, '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 'aclocal' yourself.  Keep this guy
under the exclusive control of 'autoreconf' and Automake's rebuild
rules.  Hopefully you won't need to worry about things breaking, when
'aclocal' disappears, because everything will have been taken care of.
If otherwise you used to call 'aclocal' directly yourself or from some
script, you will quickly notice the change.

   Many packages come with a script called 'bootstrap.sh' or
'autogen.sh', that will just call 'aclocal', 'libtoolize', 'gettextize'
or 'autopoint', 'autoconf', 'autoheader', and 'automake' in the right
order.  Actually this is precisely what 'autoreconf' can do for you.  If
your package has such a 'bootstrap.sh' or 'autogen.sh' script, consider
using '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 'aclocal' directly
anymore.

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


File: automake.info,  Node: Macros,  Prev: aclocal Invocation,  Up: configure

6.4 Autoconf macros supplied with Automake
==========================================

Automake ships with several Autoconf macros that you can use from your
'configure.ac'.  When you use one of them it will be included by
'aclocal' in '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.


File: automake.info,  Node: Public Macros,  Next: Obsolete Macros,  Up: Macros

6.4.1 Public Macros
-------------------

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

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

     This macro can also be called in another, _deprecated_ form:
     '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 PACKAGE and
     VERSION can be obtained from Autoconf's 'AC_INIT' macro.  However,
     differently from what happens for 'AC_INIT' invocations, this
     'AM_INIT_AUTOMAKE' invocation supports shell variables' expansions
     in the 'PACKAGE' and 'VERSION' arguments, 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 'AM_INIT_AUTOMAKE' invocation
     will likely be removed from Automake.

     If your 'configure.ac' has:

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

     you should modernize it as follows:

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

     Note that if you're upgrading your 'configure.ac' from an earlier
     version of Automake, it is not always correct to simply move the
     package and version arguments from 'AM_INIT_AUTOMAKE' directly to
     'AC_INIT', as in the example above.  The first argument to
     'AC_INIT' should be the name of your package (e.g., 'GNU
     Automake'), not the tarball name (e.g., 'automake') that you used
     to pass to '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 'AC_INIT' to provide the tarball name
     explicitly).

     By default this macro 'AC_DEFINE''s 'PACKAGE' and 'VERSION'.  This
     can be avoided by passing the 'no-define' option (*note List of
     Automake options::):
          AM_INIT_AUTOMAKE([no-define ...])

'AM_PATH_LISPDIR'
     Searches for the program 'emacs', and, if found, sets the output
     variable 'lispdir' to the full path to Emacs' site-lisp directory.

     Note that this test assumes the '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 '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 'C-c' to kill the test.  In order to avoid
     problems, you can set 'EMACS' to "no" in the environment, or use
     the '--with-lispdir' option to 'configure' to explicitly set the
     correct path (if you're sure you have an 'emacs' that supports
     Emacs Lisp).

'AM_PROG_AR([ACT-IF-FAIL])'
     You must use this macro when you use the archiver in your project,
     if you want support for unusual archivers such as Microsoft '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.

'AM_PROG_AS'
     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 'CCAS', and will also set 'CCASFLAGS' if required.

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

'AM_PROG_LEX'
     Like 'AC_PROG_LEX' (*note Particular Program Checks:
     (autoconf)Particular Programs.), but uses the 'missing' script on
     systems that do not have 'lex'.  HP-UX 10 is one such system.

'AM_PROG_GCJ'
     This macro finds the 'gcj' program or causes an error.  It sets
     'GCJ' and 'GCJFLAGS'.  'gcj' is the Java front-end to the GNU
     Compiler Collection.

'AM_PROG_UPC([COMPILER-SEARCH-LIST])'
     Find a compiler for Unified Parallel C and define the 'UPC'
     variable.  The default COMPILER-SEARCH-LIST is 'upcc upc'.  This
     macro will abort 'configure' if no Unified Parallel C compiler is
     found.

'AM_MISSING_PROG(NAME, PROGRAM)'
     Find a maintainer tool PROGRAM and define the NAME environment
     variable with its location.  If PROGRAM is not detected, then NAME
     will instead invoke the 'missing' script, in order to give useful
     advice to the user about the missing maintainer tool.  *Note
     maintainer-mode::, for more information on when the 'missing'
     script is appropriate.

'AM_SILENT_RULES'
     Control the machinery for less verbose build output (*note Automake
     Silent Rules::).

'AM_WITH_DMALLOC'
     Add support for the Dmalloc package (http://dmalloc.com/).  If the
     user runs 'configure' with '--with-dmalloc', then define
     'WITH_DMALLOC' and add '-ldmalloc' to 'LIBS'.


File: automake.info,  Node: Obsolete Macros,  Next: Private Macros,  Prev: Public Macros,  Up: Macros

6.4.2 Obsolete Macros
---------------------

Although using some of the following macros was required in past
releases, you should not use any of them in new code.  _All these macros
will be removed in the next major Automake version_; if you are still
using them, running 'autoupdate' should adjust your 'configure.ac'
automatically (*note Using 'autoupdate' to Modernize 'configure.ac':
(autoconf)autoupdate Invocation.).  _Do it NOW!_

'AM_PROG_MKDIR_P'

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

     Nowadays Autoconf provides a similar functionality with
     'AC_PROG_MKDIR_P' (*note Particular Program Checks:
     (autoconf)Particular Programs.), however this defines the output
     variable 'MKDIR_P' instead.  In case you are still using the
     'AM_PROG_MKDIR_P' macro in your 'configure.ac', or its provided
     variable '$(mkdir_p)' in your '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.


File: automake.info,  Node: Private Macros,  Prev: Obsolete Macros,  Up: Macros

6.4.3 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!

'_AM_DEPENDENCIES'
'AM_SET_DEPDIR'
'AM_DEP_TRACK'
'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.

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

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

'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 'AM_INIT_AUTOMAKE'.


File: automake.info,  Node: Directories,  Next: Programs,  Prev: configure,  Up: Top

7 Directories
*************

For simple projects that distribute all files in the same directory it
is enough to have a single '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 _make recursion_: each directory contains its own
'Makefile', and when 'make' is run from the top-level directory, it
enters each subdirectory in turn, and invokes there a new '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 *note Alternative:: section below.

* Menu:

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


File: automake.info,  Node: Subdirectories,  Next: Conditional Subdirectories,  Up: Directories

7.1 Recursing subdirectories
============================

In packages using make recursion, the top level 'Makefile.am' must tell
Automake which subdirectories are to be built.  This is done via the
'SUBDIRS' variable.

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

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

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

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

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

   By default, Automake generates '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 '.' into 'SUBDIRS'.  For instance, putting '.' first
will cause a prefix ordering of directories.

   Using

     SUBDIRS = lib src . test

will cause 'lib/' to be built before 'src/', then the current directory
will be built, finally the '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
('all', '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 'AM_EXTRA_RECURSIVE_TARGETS' in 'configure.ac'.
Automake generates rules to handle the recursion for such targets; and
the developer can define real actions for them by defining corresponding
'-local' targets.

     % 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
     % cat Makefile.am
     SUBDIRS = sub
     foo-local:
             @echo This will be run by "make foo".
     % cat sub/Makefile.am
     SUBDIRS = src
     % 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.


File: automake.info,  Node: Conditional Subdirectories,  Next: Alternative,  Prev: Subdirectories,  Up: Directories

7.2 Conditional Subdirectories
==============================

It is possible to define the '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
'src/' and 'opt/'.  'src/' should always be built, but we want to decide
in 'configure' whether 'opt/' will be built or not.  (For this example
we will assume that 'opt/' should be built when the variable '$want_opt'
was set to 'yes'.)

   Running 'make' should thus recurse into 'src/' always, and then maybe
in 'opt/'.

   However 'make dist' should always recurse into both 'src/' and
'opt/'.  Because 'opt/' should be distributed even if it is not needed
in the current configuration.  This means 'opt/Makefile' should be
created _unconditionally_.

   There are two ways to setup a project like this.  You can use
Automake conditionals (*note Conditionals::) or use Autoconf 'AC_SUBST'
variables (*note Setting Output Variables: (autoconf)Setting Output
Variables.).  Using Automake conditionals is the preferred solution.
Before we illustrate these two possibilities, let's introduce
'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 'Makefile'


File: automake.info,  Node: SUBDIRS vs DIST_SUBDIRS,  Next: Subdirectories with AM_CONDITIONAL,  Up: Conditional Subdirectories

7.2.1 'SUBDIRS' vs. 'DIST_SUBDIRS'
----------------------------------

Automake considers two sets of directories, defined by the variables
'SUBDIRS' and 'DIST_SUBDIRS'.

   'SUBDIRS' contains the subdirectories of the current directory that
must be built (*note 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.

   '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
'opt/', but yet we want to distribute it?  This is where 'DIST_SUBDIRS'
comes into play: 'opt' may not appear in 'SUBDIRS', but it must appear
in 'DIST_SUBDIRS'.

   Precisely, 'DIST_SUBDIRS' is used by 'make maintainer-clean', 'make
distclean' and 'make dist'.  All other recursive rules use 'SUBDIRS'.

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

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


File: automake.info,  Node: Subdirectories with AM_CONDITIONAL,  Next: Subdirectories with AC_SUBST,  Prev: SUBDIRS vs DIST_SUBDIRS,  Up: Conditional Subdirectories

7.2.2 Subdirectories with 'AM_CONDITIONAL'
------------------------------------------

'configure' should output the 'Makefile' for each directory and define a
condition into which 'opt/' should be built.

     ...
     AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
     AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
     ...

   Then 'SUBDIRS' can be defined in the top-level 'Makefile.am' as
follows.

     if COND_OPT
       MAYBE_OPT = opt
     endif
     SUBDIRS = src $(MAYBE_OPT)

   As you can see, running 'make' will rightly recurse into 'src/' and
maybe 'opt/'.

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

   In this case Automake will define 'DIST_SUBDIRS = src opt'
automatically because it knows that 'MAYBE_OPT' can contain 'opt' in
some condition.


File: automake.info,  Node: Subdirectories with AC_SUBST,  Next: Unconfigured Subdirectories,  Prev: Subdirectories with AM_CONDITIONAL,  Up: Conditional Subdirectories

7.2.3 Subdirectories with 'AC_SUBST'
------------------------------------

Another possibility is to define 'MAYBE_OPT' from './configure' using
'AC_SUBST':

     ...
     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])
     ...

   In this case the top-level 'Makefile.am' should look as follows.

     SUBDIRS = src $(MAYBE_OPT)
     DIST_SUBDIRS = src opt

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


File: automake.info,  Node: Unconfigured Subdirectories,  Prev: Subdirectories with AC_SUBST,  Up: Conditional Subdirectories

7.2.4 Unconfigured Subdirectories
---------------------------------

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

   The above examples all assume that every 'Makefile' is created, even
in directories that are not going to be built.  The simple reason is
that we want 'make dist' to distribute even the directories that are not
being built (e.g., platform-dependent code), hence 'make dist' must
recurse into the subdirectory, hence this directory must be configured
and appear in '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.

   * 'SUBDIRS' should always be a subset of 'DIST_SUBDIRS'.

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

     I.e., the 'Makefile' must exists or the recursive 'make' rules will
     not be able to process the directory.
   * Any configured directory must be listed in 'DIST_SUBDIRS'.

     So that the cleaning rules remove the generated 'Makefile's.  It
     would be correct to see 'DIST_SUBDIRS' as a variable that lists all
     the directories that have been configured.

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

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

   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 'SUBDIRS' or 'DIST_SUBDIRS', 'automake' will make
sure the directory exists.  Consequently 'automake' cannot be run on
such a distribution when one directory has been omitted.  One way to
avoid this check is to use the 'AC_SUBST' method to declare conditional
directories; since 'automake' does not know the values of 'AC_SUBST'
variables it cannot ensure the corresponding directory exists.


File: automake.info,  Node: Alternative,  Next: Subpackages,  Prev: Conditional Subdirectories,  Up: Directories

7.3 An Alternative Approach to Subdirectories
=============================================

If you've ever read Peter Miller's excellent paper, Recursive Make
Considered Harmful (http://miller.emu.id.au/pmiller/books/rmch/), 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 'make' invocations are both slow and
error-prone.

   Automake provides sufficient cross-directory support (1) to enable
you to write a single '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 '$(includedir)/stdio.h':

     include_HEADERS = inc/stdio.h

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

     nobase_include_HEADERS = sys/types.h

   'nobase_' should be specified first when used in conjunction with
either 'dist_' or 'nodist_' (*note Fine-grained Distribution Control::).
For instance:

     nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg

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

     imagesdir = $(pkgdatadir)/images
     soundsdir = $(pkgdatadir)/sounds
     dist_images_DATA = images/vortex.pgm
     dist_sounds_DATA = sounds/whirl.ogg

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

   Currently, '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 'nobase_' prefix.

   ---------- Footnotes ----------

   (1) We believe.  This work is new and there are probably warts.
*Note Introduction::, for information on reporting bugs.


File: automake.info,  Node: Subpackages,  Prev: Alternative,  Up: Directories

7.4 Nesting Packages
====================

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

   These other packages should just appear as subdirectories of their
parent package.  They must be listed in 'SUBDIRS' like other ordinary
directories.  However the subpackage's 'Makefile's should be output by
its own 'configure' script, not by the parent's 'configure'.  This is
achieved using the 'AC_CONFIG_SUBDIRS' Autoconf macro (*note
AC_CONFIG_SUBDIRS: (autoconf)Subdirectories.).

   Here is an example package for an 'arm' program that links with a
'hand' library that is a nested package in subdirectory 'hand/'.

   'arm''s 'configure.ac':

     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

   'arm''s 'Makefile.am':

     # 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

   Now here is 'hand''s 'hand/configure.ac':

     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

and its 'hand/Makefile.am':

     lib_LIBRARIES = libhand.a
     libhand_a_SOURCES = hand.c

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

   When 'make dist' is run from the hand directory, it will create a
self-contained '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 '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
'install-sh': one in the top-level of the 'arm' package, and another one
in the 'hand/' subdirectory for the 'hand' package.

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

   Packages that do not use Automake need more work to be integrated
this way.  *Note Third-Party Makefiles::.


File: automake.info,  Node: Programs,  Next: Other Objects,  Prev: Directories,  Up: Top

8 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


File: automake.info,  Node: A Program,  Next: A Library,  Up: Programs

8.1 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
(*note A Library::) and libtool libraries (*note 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


File: automake.info,  Node: Program Sources,  Next: Linking,  Up: A Program

8.1.1 Defining program sources
------------------------------

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

   For instance:

     bin_PROGRAMS = hello

   In this simple case, the resulting 'Makefile.in' will contain code to
generate a program named '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 'hello_SOURCES' is used to specify which source files
get built into an executable:

     hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h

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

   If 'hello_SOURCES' is not specified, then it defaults to the single
file 'hello.c' (*note Default _SOURCES::).

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

   Header files listed in a '_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 'configure' in a
'_SOURCES' variable; this file should not be distributed.  Lex ('.l')
and Yacc ('.y') files can also be listed; see *note Yacc and Lex::.


File: automake.info,  Node: Linking,  Next: Conditional Sources,  Prev: Program Sources,  Up: A Program

8.1.2 Linking the program
-------------------------

If you need to link against libraries that are not found by 'configure',
you can use '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 'AM_LDFLAGS' for this
purpose.

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

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

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

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

     cpio_SOURCES = ...
     pax_SOURCES = ...
     mt_SOURCES = ...
     rmt_SOURCES = ...

   'PROG_LDADD' is inappropriate for passing program-specific linker
flags (except for '-l', '-L', '-dlopen' and '-dlpreopen').  So, use the
'PROG_LDFLAGS' variable for this purpose.

   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 'PROG_DEPENDENCIES' or the 'EXTRA_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 '*.$(OBJEXT)', '*.a', or '*.la' files.  In rare cases
you may need to add other kinds of files such as linker scripts, but
_listing a source file in '_DEPENDENCIES' is wrong_.  If some source
file needs to be built before all the components of a program are built,
consider using the 'BUILT_SOURCES' variable instead (*note Sources::).

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

   *note Conditional Sources:: shows a situation where '_DEPENDENCIES'
may be used.

   The 'EXTRA_PROG_DEPENDENCIES' may be useful for cases where you
merely want to augment the 'automake'-generated 'PROG_DEPENDENCIES'
rather than replacing it.

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


File: automake.info,  Node: Conditional Sources,  Next: Conditional Programs,  Prev: Linking,  Up: A Program

8.1.3 Conditional compilation of sources
----------------------------------------

You can't put a configure substitution (e.g., '@FOO@' or '$(FOO)' where
'FOO' is defined via 'AC_SUBST') into a '_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 '_LDADD' variables, the other is to
use an Automake conditional.

Conditional Compilation using '_LDADD' Substitutions
....................................................

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 'EXTRA_' variable.  For instance, if 'hello-linux.c' or
'hello-generic.c' were conditionally included in 'hello', the
'Makefile.am' would contain:

     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)

You can then setup the '$(HELLO_SYSTEM)' substitution from
'configure.ac':

     ...
     case $host in
       *linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
       *)       HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
     esac
     AC_SUBST([HELLO_SYSTEM])
     ...

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

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 'Makefile.am'
construct to build the same 'hello' example:

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

   In this case, 'configure.ac' should setup the 'LINUX' conditional
using 'AM_CONDITIONAL' (*note Conditionals::).

   When using conditionals like this you don't need to use the '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 '+='.

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


File: automake.info,  Node: Conditional Programs,  Prev: Conditional Sources,  Up: A Program

8.1.4 Conditional compilation of programs
-----------------------------------------

Sometimes it is useful to determine the programs that are to be built at
configure time.  For instance, GNU 'cpio' only builds 'mt' and '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.

Conditional Programs using 'configure' Substitutions
....................................................

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

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

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

Conditional Programs using Automake Conditionals
................................................

You can also use Automake conditionals (*note Conditionals::) to select
programs to be built.  In this case you don't have to worry about
'$(EXEEXT)' or 'EXTRA_PROGRAMS'.

     bin_PROGRAMS = cpio pax
     if WANT_MT
       bin_PROGRAMS += mt
     endif
     if WANT_RMT
       libexec_PROGRAMS = rmt
     endif


File: automake.info,  Node: A Library,  Next: A Shared Library,  Prev: A Program,  Up: Programs

8.2 Building a library
======================

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

   *Note A Shared Library::, for information on how to build shared
libraries using libtool and the 'LTLIBRARIES' primary.

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

     noinst_LIBRARIES = libcpio.a
     libcpio_a_SOURCES = ...

   The sources that go into a library are determined exactly as they are
for programs, via the '_SOURCES' variables.  Note that the library name
is canonicalized (*note Canonicalization::), so the '_SOURCES' variable
corresponding to 'libcpio.a' is 'libcpio_a_SOURCES', not
'libcpio.a_SOURCES'.

   Extra objects can be added to a library using the 'LIBRARY_LIBADD'
variable.  This should be used for objects determined by 'configure'.
Again from 'cpio':

     libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA)

   In addition, sources for extra objects that will not exist until
configure-time must be added to the 'BUILT_SOURCES' variable (*note
Sources::).

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

   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 'LDADD'
for this program.  In the following example, the program 'cpio' is
statically linked with the library 'libcpio.a'.

     noinst_LIBRARIES = libcpio.a
     libcpio_a_SOURCES = ...

     bin_PROGRAMS = cpio
     cpio_SOURCES = cpio.c ...
     cpio_LDADD = libcpio.a


File: automake.info,  Node: A Shared Library,  Next: Program and Library Variables,  Prev: A Library,  Up: Programs

8.3 Building a Shared Library
=============================

Building shared libraries portably is a relatively complex matter.  For
this reason, GNU Libtool (*note Introduction: (libtool)Top.) 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


File: automake.info,  Node: Libtool Concept,  Next: Libtool Libraries,  Up: A Shared Library

8.3.1 The Libtool Concept
-------------------------

Libtool abstracts shared and static libraries into a unified concept
henceforth called "libtool libraries".  Libtool libraries are files
using the '.la' suffix, and can designate a static library, a shared
library, or maybe both.  Their exact nature cannot be determined until
'./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, *note The
'AC_PROG_LIBTOOL' macro: (libtool)AC_PROG_LIBTOOL.)

   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 "libtool objects": these are files using the
'.lo' suffix.  Libtool libraries are built from these libtool objects.

   You should not assume anything about the structure of '.la' or '.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 '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
(*note Conditional Libtool Sources::).

   People considering writing a plug-in system, with dynamically loaded
modules, should look into 'libltdl': libtool's dlopening library (*note
Using libltdl: (libtool)Using libltdl.).  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 (*note Using Automake with Libtool:
(libtool)Using Automake.).


File: automake.info,  Node: Libtool Libraries,  Next: Conditional Libtool Libraries,  Prev: Libtool Concept,  Up: A Shared Library

8.3.2 Building Libtool Libraries
--------------------------------

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

     lib_LTLIBRARIES = libgettext.la
     libgettext_la_SOURCES = gettext.c gettext.h ...

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

   If '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
'_HEADERS' variable, not in 'libgettext_la_SOURCES'.  Headers listed in
the latter should be internal headers that are not part of the public
interface.

     lib_LTLIBRARIES = libgettext.la
     libgettext_la_SOURCES = gettext.c ...
     include_HEADERS = gettext.h ...

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

     lib_LTLIBRARIES = libgettext.la
     libgettext_la_SOURCES = gettext.c ...

     bin_PROGRAMS = hello
     hello_SOURCES = hello.c ...
     hello_LDADD = libgettext.la

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


File: automake.info,  Node: Conditional Libtool Libraries,  Next: Conditional Libtool Sources,  Prev: Libtool Libraries,  Up: A Shared Library

8.3.3 Building Libtool Libraries Conditionally
----------------------------------------------

Like conditional programs (*note Conditional Programs::), there are two
main ways to build conditional libraries: using Automake conditionals or
using Autoconf '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 _at link-time_ using the '-rpath' option.

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

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

   The examples below illustrate the differences between these two
methods.

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

     EXTRA_LTLIBRARIES = libfoo.la libbar.la
     lib_LTLIBRARIES = $(WANTEDLIBS)
     libfoo_la_SOURCES = foo.c ...
     libfoo_la_LDFLAGS = -rpath '$(libdir)'
     libbar_la_SOURCES = bar.c ...
     libbar_la_LDFLAGS = -rpath '$(libdir)'

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

     lib_LTLIBRARIES =
     if WANT_LIBFOO
     lib_LTLIBRARIES += libfoo.la
     endif
     if WANT_LIBBAR
     lib_LTLIBRARIES += libbar.la
     endif
     libfoo_la_SOURCES = foo.c ...
     libbar_la_SOURCES = bar.c ...


File: automake.info,  Node: Conditional Libtool Sources,  Next: Libtool Convenience Libraries,  Prev: Conditional Libtool Libraries,  Up: A Shared Library

8.3.4 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 (*note
Conditional Sources::).  The only difference is that '_LIBADD' should be
used instead of '_LDADD' and that it should mention libtool objects
('.lo' files).

   So, to mimic the 'hello' example from *note Conditional Sources::, we
could build a 'libhello.la' library using either 'hello-linux.c' or
'hello-generic.c' with the following 'Makefile.am'.

     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)

And make sure 'configure' defines 'HELLO_SYSTEM' as either
'hello-linux.lo' or 'hello-generic.lo'.

   Or we could simply use an Automake conditional as follows.

     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


File: automake.info,  Node: Libtool Convenience Libraries,  Next: Libtool Modules,  Prev: Conditional Libtool Sources,  Up: A Shared Library

8.3.5 Libtool Convenience Libraries
-----------------------------------

Sometimes you want to build libtool libraries that should not be
installed.  These are called "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 'noinst_LTLIBRARIES', 'check_LTLIBRARIES', or even
'EXTRA_LTLIBRARIES'.  Unlike installed libtool libraries they do not
need an '-rpath' flag at link time (actually this is the only
difference).

   Convenience libraries listed in 'noinst_LTLIBRARIES' are always
built.  Those listed in 'check_LTLIBRARIES' are built only upon 'make
check'.  Finally, libraries listed in '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 'EXTRA_LTLIBRARIES' is used for conditional
compilation).

   Here is a sample setup merging libtool convenience libraries from
subdirectories into one main 'libtop.la' library.

     # -- Top-level Makefile.am --
     SUBDIRS = sub1 sub2 ...
     lib_LTLIBRARIES = libtop.la
     libtop_la_SOURCES =
     libtop_la_LIBADD = \
       sub1/libsub1.la \
       sub2/libsub2.la \
       ...

     # -- sub1/Makefile.am --
     noinst_LTLIBRARIES = libsub1.la
     libsub1_la_SOURCES = ...

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

   When using such setup, beware that 'automake' will assume 'libtop.la'
is to be linked with the C linker.  This is because 'libtop_la_SOURCES'
is empty, so 'automake' picks C as default language.  If
'libtop_la_SOURCES' was not empty, 'automake' would select the linker as
explained in *note 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 'automake' to select the appropriate linker.  Here
is the top-level 'Makefile' of our example updated to force C++ linking.

     SUBDIRS = sub1 sub2 ...
     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 \
       ...

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


File: automake.info,  Node: Libtool Modules,  Next: Libtool Flags,  Prev: Libtool Convenience Libraries,  Up: A Shared Library

8.3.6 Libtool Modules
---------------------

These are libtool libraries meant to be dlopened.  They are indicated to
libtool by passing '-module' at link-time.

     pkglib_LTLIBRARIES = mymodule.la
     mymodule_la_SOURCES = doit.c
     mymodule_la_LDFLAGS = -module

   Ordinarily, Automake requires that a library's name start with '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 '-module' explicitly appears in the library's
'_LDFLAGS' variable (or in the common 'AM_LDFLAGS' variable when no
per-library '_LDFLAGS' variable is defined).

   As always, 'AC_SUBST' variables are black boxes to Automake since
their values are not yet known when 'automake' is run.  Therefore if
'-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 'mymodule_la_SOURCES' is not specified, then it defaults to the
single file 'mymodule.c' (*note Default _SOURCES::).


File: automake.info,  Node: Libtool Flags,  Next: LTLIBOBJS,  Prev: Libtool Modules,  Up: A Shared Library

8.3.7 '_LIBADD', '_LDFLAGS', and '_LIBTOOLFLAGS'
------------------------------------------------

As shown in previous sections, the 'LIBRARY_LIBADD' variable should be
used to list extra libtool objects ('.lo' files) or libtool libraries
('.la') to add to LIBRARY.

   The 'LIBRARY_LDFLAGS' variable is the place to list additional
libtool linking flags, such as '-version-info', '-static', and a lot
more.  *Note Link mode: (libtool)Link mode.

   The '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 'libtool' (hence the use of 'LIBRARY_LDFLAGS' for libtool
linking flags).  Generic options include '--tag=TAG' and '--silent'
(*note Invoking 'libtool': (libtool)Invoking libtool. for more options)
should appear before the mode selection on the command line; in
'Makefile.am's they should be listed in the 'LIBRARY_LIBTOOLFLAGS'
variable.

   If 'LIBRARY_LIBTOOLFLAGS' is not defined, then the variable
'AM_LIBTOOLFLAGS' is used instead.

   These flags are passed to libtool after the '--tag=TAG' option
computed by Automake (if any), so 'LIBRARY_LIBTOOLFLAGS' (or
'AM_LIBTOOLFLAGS') is a good place to override or supplement the
'--tag=TAG' setting.

   The libtool rules also use a 'LIBTOOLFLAGS' variable that should not
be set in 'Makefile.am': this is a user variable (*note Flag Variables
Ordering::.  It allows users to run 'make LIBTOOLFLAGS=--silent', for
instance.  Note that the verbosity of 'libtool' can also be influenced
by the Automake support for silent rules (*note Automake Silent
Rules::).


File: automake.info,  Node: LTLIBOBJS,  Next: Libtool Issues,  Prev: Libtool Flags,  Up: A Shared Library

8.3.8 'LTLIBOBJS' and 'LTALLOCA'
--------------------------------

Where an ordinary library might include '$(LIBOBJS)' or '$(ALLOCA)'
(*note LIBOBJS::), a libtool library must use '$(LTLIBOBJS)' or
'$(LTALLOCA)'.  This is required because the object files that libtool
operates on do not necessarily end in '.o'.

   Nowadays, the computation of 'LTLIBOBJS' from 'LIBOBJS' is performed
automatically by Autoconf (*note 'AC_LIBOBJ' vs. 'LIBOBJS':
(autoconf)AC_LIBOBJ vs LIBOBJS.).


File: automake.info,  Node: Libtool Issues,  Prev: LTLIBOBJS,  Up: A Shared Library

8.3.9 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


File: automake.info,  Node: Error required file ltmain.sh not found,  Next: Objects created both with libtool and without,  Up: Libtool Issues

8.3.9.1 Error: 'required file `./ltmain.sh' not found'
......................................................

Libtool comes with a tool called 'libtoolize' that will install
libtool's supporting files into a package.  Running this command will
install 'ltmain.sh'.  You should execute it before 'aclocal' and
'automake'.

   People upgrading old packages to newer autotools are likely to face
this issue because older Automake versions used to call 'libtoolize'.
Therefore old build scripts do not call 'libtoolize'.

   Since Automake 1.6, it has been decided that running 'libtoolize' was
none of Automake's business.  Instead, that functionality has been moved
into the 'autoreconf' command (*note Using 'autoreconf':
(autoconf)autoreconf Invocation.).  If you do not want to remember what
to run and when, just learn the 'autoreconf' command.  Hopefully,
replacing existing 'bootstrap.sh' or 'autogen.sh' scripts by a call to
'autoreconf' should also free you from any similar incompatible change
in the future.


File: automake.info,  Node: Objects created both with libtool and without,  Prev: Error required file ltmain.sh not found,  Up: Libtool Issues

8.3.9.2 Objects '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 'Makefile.am'.

     bin_PROGRAMS = prog
     prog_SOURCES = prog.c foo.c ...

     lib_LTLIBRARIES = libfoo.la
     libfoo_la_SOURCES = foo.c ...

(In this trivial case the issue could be avoided by linking 'libfoo.la'
with 'prog' instead of listing 'foo.c' in 'prog_SOURCES'.  But let's
assume we really want to keep 'prog' and 'libfoo.la' separate.)

   Technically, it means that we should build 'foo.$(OBJEXT)' for
'prog', and 'foo.lo' for 'libfoo.la'.  The problem is that in the course
of creating 'foo.lo', libtool may erase (or replace) 'foo.$(OBJEXT)',
and this cannot be avoided.

   Therefore, when Automake detects this situation it will complain with
a message such as
     object 'foo.$(OBJEXT)' created both with libtool and without

   A workaround for this issue is to ensure that these two objects get
different basenames.  As explained in *note Renamed Objects::, this
happens automatically when per-targets flags are used.

     bin_PROGRAMS = prog
     prog_SOURCES = prog.c foo.c ...
     prog_CFLAGS = $(AM_CFLAGS)

     lib_LTLIBRARIES = libfoo.la
     libfoo_la_SOURCES = foo.c ...

Adding 'prog_CFLAGS = $(AM_CFLAGS)' is almost a no-op, because when the
'prog_CFLAGS' is defined, it is used instead of 'AM_CFLAGS'.  However as
a side effect it will cause 'prog.c' and 'foo.c' to be compiled as
'prog-prog.$(OBJEXT)' and 'prog-foo.$(OBJEXT)', which solves the issue.


File: automake.info,  Node: Program and Library Variables,  Next: Default _SOURCES,  Prev: A Shared Library,  Up: Programs

8.4 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 '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.

'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 '.o' file (or
     '.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 '_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 '.o'
     files, then 'automake' will treat this file as it will any other
     source file (*note Support for Other Languages::).  Otherwise, the
     file will be ignored as though it were a header file.

     The prefixes 'dist_' and 'nodist_' can be used to control whether
     files listed in a '_SOURCES' variable are distributed.  'dist_' is
     redundant, as sources are distributed by default, but it can be
     specified for clarity if desired.

     It is possible to have both 'dist_' and 'nodist_' variants of a
     given '_SOURCES' variable at once; this lets you easily distribute
     some files and not others, for instance:

          nodist_maude_SOURCES = nodist.c
          dist_maude_SOURCES = dist-me.c

     By default the output file (on Unix systems, the '.o' file) will be
     put into the current build directory.  However, if the option
     'subdir-objects' is in effect in the current directory then the
     '.o' file will be put into the subdirectory named after the source
     file.  For instance, with 'subdir-objects' enabled,
     'sub/dir/file.c' will be compiled to 'sub/dir/file.o'.  Some people
     prefer this mode of operation.  You can specify 'subdir-objects' in
     'AUTOMAKE_OPTIONS' (*note Options::).

'EXTRA_maude_SOURCES'
     Automake needs to know the list of files you intend to compile
     _statically_.  For one thing, this is the only way Automake has of
     knowing what sort of language support a given 'Makefile.in'
     requires.  (1) This means that, for example, you can't put a
     configure substitution like '@my_sources@' into a '_SOURCES'
     variable.  If you intend to conditionally compile source files and
     use 'configure' to substitute the appropriate object names into,
     e.g., '_LDADD' (see below), then you should list the corresponding
     source files in the 'EXTRA_' variable.

     This variable also supports 'dist_' and 'nodist_' prefixes.  For
     instance, 'nodist_EXTRA_maude_SOURCES' would list extra sources
     that may need to be built, but should not be distributed.

'maude_AR'
     A static library is created by default by invoking '$(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 '_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:
          libmaude_a_AR = $(CXX) -ar -o

'maude_LIBADD'
     Extra objects can be added to a _library_ using the '_LIBADD'
     variable.  For instance, this should be used for objects determined
     by 'configure' (*note A Library::).

     In the case of libtool libraries, 'maude_LIBADD' can also refer to
     other libtool libraries.

'maude_LDADD'
     Extra objects ('*.$(OBJEXT)') and libraries ('*.a', '*.la') can be
     added to a _program_ by listing them in the '_LDADD' variable.  For
     instance, this should be used for objects determined by 'configure'
     (*note Linking::).

     '_LDADD' and '_LIBADD' are inappropriate for passing
     program-specific linker flags (except for '-l', '-L', '-dlopen' and
     '-dlpreopen').  Use the '_LDFLAGS' variable for this purpose.

     For instance, if your 'configure.ac' uses 'AC_PATH_XTRA', you could
     link your program against the X libraries like so:

          maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)

     We recommend that you use '-l' and '-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
     'maude_DEPENDENCIES' (see below) is correctly defined by default.

'maude_LDFLAGS'
     This variable is used to pass extra flags to the link step of a
     program or a shared library.  It overrides the 'AM_LDFLAGS'
     variable.

'maude_LIBTOOLFLAGS'
     This variable is used to pass extra options to 'libtool'.  It
     overrides the 'AM_LIBTOOLFLAGS' variable.  These options are output
     before 'libtool''s '--mode=MODE' option, so they should not be
     mode-specific options (those belong to the compiler or linker
     flags).  *Note Libtool Flags::.

'maude_DEPENDENCIES'
'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 '_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 '*.$(OBJEXT)', '*.a', or '*.la' files for
     programs; '*.lo' and '*.la' files for Libtool libraries; and
     '*.$(OBJEXT)' files for static libraries.  In rare cases you may
     need to add other kinds of files such as linker scripts, but
     _listing a source file in '_DEPENDENCIES' is wrong_.  If some
     source file needs to be built before all the components of a
     program are built, consider using the 'BUILT_SOURCES' variable
     (*note Sources::).

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

     '_DEPENDENCIES' is more likely used to perform conditional
     compilation using an 'AC_SUBST' variable that contains a list of
     objects.  *Note Conditional Sources::, and *note Conditional
     Libtool Sources::.

     The 'EXTRA_*_DEPENDENCIES' variable may be useful for cases where
     you merely want to augment the 'automake'-generated '_DEPENDENCIES'
     variable rather than replacing it.

'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 '_LINK' variable must hold the name of a
     command that can be passed all the '.o' file names and libraries to
     link against as arguments.  Note that the name of the underlying
     program is _not_ passed to '_LINK'; typically one uses '$@':

          maude_LINK = $(CCLD) -magic -o $@

     If a '_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 '_CFLAGS', '_LDFLAGS' or '_LIBTOOLFLAGS', in cases where they
     apply.

'maude_CCASFLAGS'
'maude_CFLAGS'
'maude_CPPFLAGS'
'maude_CXXFLAGS'
'maude_FFLAGS'
'maude_GCJFLAGS'
'maude_LFLAGS'
'maude_OBJCFLAGS'
'maude_OBJCXXFLAGS'
'maude_RFLAGS'
'maude_UPCFLAGS'
'maude_YFLAGS'
     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 "per-target compilation
     flags" are '_CCASFLAGS', '_CFLAGS', '_CPPFLAGS', '_CXXFLAGS',
     '_FFLAGS', '_GCJFLAGS', '_LFLAGS', '_OBJCFLAGS', '_OBJCXXFLAGS',
     '_RFLAGS', '_UPCFLAGS', and '_YFLAGS'.

     When using a per-target compilation flag, Automake will choose a
     different name for the intermediate object files.  Ordinarily a
     file like 'sample.c' will be compiled to produce 'sample.o'.
     However, if the program's '_CFLAGS' variable is set, then the
     object file will be named, for instance, 'maude-sample.o'.  (See
     also *note Renamed Objects::).

     In compilations with per-target flags, the ordinary 'AM_' form of
     the flags variable is _not_ automatically included in the
     compilation (however, the user form of the variable _is_ included).
     So for instance, if you want the hypothetical 'maude' compilations
     to also use the value of 'AM_CFLAGS', you would need to write:

          maude_CFLAGS = ... your flags ... $(AM_CFLAGS)

     *Note Flag Variables Ordering::, for more discussion about the
     interaction between user variables, 'AM_' shadow variables, and
     per-target variables.

'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,

          bin_PROGRAMS = maude
          maude_CPPFLAGS = -DSOMEFLAG
          maude_SHORTNAME = m
          maude_SOURCES = sample.c ...

     the object file would be named 'm-sample.o' rather than
     'maude-sample.o'.

     This facility is rarely needed in practice, and we recommend
     avoiding it until you find it is required.

   ---------- Footnotes ----------

   (1) There are other, more obscure reasons for this limitation as
well.


File: automake.info,  Node: Default _SOURCES,  Next: LIBOBJS,  Prev: Program and Library Variables,  Up: Programs

8.5 Default '_SOURCES'
======================

'_SOURCES' variables are used to specify source files of programs (*note
A Program::), libraries (*note A Library::), and Libtool libraries
(*note 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
'AM_DEFAULT_SOURCE_EXT', which defaults to '.c'.

   For example if you have the following somewhere in your 'Makefile.am'
with no corresponding 'libfoo_a_SOURCES':

     lib_LIBRARIES = libfoo.a sub/libc++.a

'libfoo.a' will be built using a default source file named 'libfoo.c',
and 'sub/libc++.a' will be built from 'sub/libc++.c'.  (In older
versions 'sub/libc++.a' would be built from 'sub_libc___a.c', i.e., the
default source was the canonized name of the target, with '.c' appended.
We believe the new behavior is more sensible, but for backward
compatibility 'automake' will use the old name if a file or a rule with
that name exists and 'AM_DEFAULT_SOURCE_EXT' is not used.)

   Default sources are mainly useful in test suites, when building many
test programs each from a single source.  For instance, in

     check_PROGRAMS = test1 test2 test3
     AM_DEFAULT_SOURCE_EXT = .cpp

'test1', 'test2', and 'test3' will be built from 'test1.cpp',
'test2.cpp', and 'test3.cpp'.  Without the last line, they will be built
from 'test1.c', 'test2.c', and 'test3.c'.

   Another case where this is convenient is building many Libtool
modules ('moduleN.la'), each defined in its own file ('moduleN.c').

     AM_LDFLAGS = -module
     lib_LTLIBRARIES = module1.la module2.la module3.la

   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 *note true::; this happens when all the
constituents of a target have already been compiled and just need to be
combined using a '_LDADD' variable.  Then it is necessary to define an
empty '_SOURCES' variable, so that 'automake' does not compute a
default.

     bin_PROGRAMS = target
     target_SOURCES =
     target_LDADD = libmain.a libmisc.a


File: automake.info,  Node: LIBOBJS,  Next: Program Variables,  Prev: Default _SOURCES,  Up: Programs

8.6 Special handling for 'LIBOBJS' and 'ALLOCA'
===============================================

The '$(LIBOBJS)' and '$(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
'configure'.

   These variables are defined by Autoconf macros such as 'AC_LIBOBJ',
'AC_REPLACE_FUNCS' (*note Generic Function Checks: (autoconf)Generic
Functions.), or 'AC_FUNC_ALLOCA' (*note Particular Function Checks:
(autoconf)Particular Functions.).  Many other Autoconf macros call
'AC_LIBOBJ' or 'AC_REPLACE_FUNCS' to populate '$(LIBOBJS)'.

   Using these variables is very similar to doing conditional
compilation using 'AC_SUBST' variables, as described in *note
Conditional Sources::.  That is, when building a program, '$(LIBOBJS)'
and '$(ALLOCA)' should be added to the associated '*_LDADD' variable, or
to the '*_LIBADD' variable when building a library.  However there is no
need to list the corresponding sources in 'EXTRA_*_SOURCES' nor to
define '*_DEPENDENCIES'.  Automake automatically adds '$(LIBOBJS)' and
'$(ALLOCA)' to the dependencies, and it will discover the list of
corresponding source files automatically (by tracing the invocations of
the 'AC_LIBSOURCE' Autoconf macros).  If you have already defined
'*_DEPENDENCIES' explicitly for an unrelated reason, then you either
need to add these variables manually, or use 'EXTRA_*_DEPENDENCIES'
instead of '*_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, 'configure.ac' contains some checks that affect either
'LIBOBJS' or 'ALLOCA'.

     # configure.ac
     ...
     AC_CONFIG_LIBOBJ_DIR([lib])
     ...
     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
     ...
     AC_CONFIG_FILES([
       lib/Makefile
       src/Makefile
     ])
     AC_OUTPUT

   The 'AC_CONFIG_LIBOBJ_DIR' tells Autoconf that the source files of
these object files are to be found in the 'lib/' directory.  Automake
can also use this information, otherwise it expects the source files are
to be in the directory where the '$(LIBOBJS)' and '$(ALLOCA)' variables
are used.

   The 'lib/' directory should therefore contain 'malloc.c', 'memcmp.c',
'strdup.c', 'alloca.c'.  Here is its 'Makefile.am':

     # lib/Makefile.am

     noinst_LIBRARIES = libcompat.a
     libcompat_a_SOURCES =
     libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)

   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 '_SOURCES' line.

   There is a small trap here, though: '$(LIBOBJS)' and '$(ALLOCA)'
might be empty, and building an empty library is not portable.  You
should ensure that there is always something to put in 'libcompat.a'.
Most projects will also add some utility functions in that directory,
and list them in 'libcompat_a_SOURCES', so in practice 'libcompat.a'
cannot be empty.

   Finally here is how this library could be used from the 'src/'
directory.

     # src/Makefile.am

     # Link all programs in this directory with libcompat.a
     LDADD = ../lib/libcompat.a

     bin_PROGRAMS = tool1 tool2 ...
     tool1_SOURCES = ...
     tool2_SOURCES = ...

   When option 'subdir-objects' is not used, as in the above example,
the variables '$(LIBOBJS)' or '$(ALLOCA)' can only be used in the
directory where their sources lie.  E.g., here it would be wrong to use
'$(LIBOBJS)' or '$(ALLOCA)' in 'src/Makefile.am'.  However if both
'subdir-objects' and 'AC_CONFIG_LIBOBJ_DIR' are used, it is OK to use
these variables in other directories.  For instance 'src/Makefile.am'
could be changed as follows.

     # src/Makefile.am

     AUTOMAKE_OPTIONS = subdir-objects
     LDADD = $(LIBOBJS) $(ALLOCA)

     bin_PROGRAMS = tool1 tool2 ...
     tool1_SOURCES = ...
     tool2_SOURCES = ...

   Because '$(LIBOBJS)' and '$(ALLOCA)' contain object file names that
end with '.$(OBJEXT)', they are not suitable for Libtool libraries
(where the expected object extension is '.lo'): 'LTLIBOBJS' and
'LTALLOCA' should be used instead.

   'LTLIBOBJS' is defined automatically by Autoconf and should not be
defined by hand (as in the past), however at the time of writing
'LTALLOCA' still needs to be defined from 'ALLOCA' manually.  *Note
'AC_LIBOBJ' vs. 'LIBOBJS': (autoconf)AC_LIBOBJ vs LIBOBJS.


File: automake.info,  Node: Program Variables,  Next: Yacc and Lex,  Prev: LIBOBJS,  Up: Programs

8.7 Variables used when building a program
==========================================

Occasionally it is useful to know which 'Makefile' variables Automake
uses for compilations, and in which order (*note 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 'CC', 'CFLAGS',
'CPPFLAGS', 'DEFS', 'LDFLAGS', and 'LIBS'.

   There are some additional variables that Automake defines on its own:

'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, '-I' and '-D' options should be listed
     here.

     Automake already provides some '-I' options automatically, in a
     separate variable that is also passed to every compilation that
     invokes the C preprocessor.  In particular it generates '-I.',
     '-I$(srcdir)', and a '-I' pointing to the directory holding
     'config.h' (if you've used 'AC_CONFIG_HEADERS').  You can disable
     the default '-I' options using the 'nostdinc' option.

     When a file to be included is generated during the build and not
     part of a distribution tarball, its location is under
     '$(builddir)', not under '$(srcdir)'.  This matters especially for
     packages that use header files placed in sub-directories and want
     to allow builds outside the source tree (*note VPATH Builds::).  In
     that case we recommend to use a pair of '-I' options, such as,
     e.g., '-Isome/subdir -I$(srcdir)/some/subdir' or
     '-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.

     'AM_CPPFLAGS' is ignored in preference to a per-executable (or
     per-library) '_CPPFLAGS' variable if it is defined.

'INCLUDES'
     This does the same job as 'AM_CPPFLAGS' (or any per-target
     '_CPPFLAGS' variable if it is used).  It is an older name for the
     same functionality.  This variable is deprecated; we suggest using
     'AM_CPPFLAGS' and per-target '_CPPFLAGS' instead.

'AM_CFLAGS'
     This is the variable the '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) '_CFLAGS'.

'COMPILE'
     This is the command used to actually compile a C source file.  The
     file name is appended to form the complete command line.

'AM_LDFLAGS'
     This is the variable the '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) '_LDFLAGS'.

'LINK'
     This is the command used to actually link a C program.  It already
     includes '-o $@' and the usual variable references (for instance,
     '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 '_LINK' variable or
     per-target flags cause Automake to define such a '_LINK' variable.


File: automake.info,  Node: Yacc and Lex,  Next: C++ Support,  Prev: Program Variables,  Up: Programs

8.8 Yacc and Lex support
========================

Automake has somewhat idiosyncratic support for Yacc and Lex.

   Automake assumes that the '.c' file generated by 'yacc' (or 'lex')
should be named using the basename of the input file.  That is, for a
yacc source file 'foo.y', Automake will cause the intermediate file to
be named 'foo.c' (as opposed to '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 '-d' Yacc option is used; see
below for more information about this flag, and how to specify it.
Files with the extension '.y' will thus be turned into '.c' sources and
'.h' headers; likewise, '.yy' will become '.cc' and '.hh', '.y++' will
become 'c++' and 'h++', '.yxx' will become '.cxx' and '.hxx', and '.ypp'
will become '.cpp' and '.hpp'.

   Similarly, lex source files can be used to generate C or C++; the
extensions '.l', '.ll', '.l++', '.lxx', and '.lpp' are recognized.

   You should never explicitly mention the intermediate (C or C++) file
in any 'SOURCES' variable; only list the source file.

   The intermediate files generated by 'yacc' (or 'lex') will be
included in any distribution that is made.  That way the user doesn't
need to have 'yacc' or 'lex'.

   If a 'yacc' source file is seen, then your 'configure.ac' must define
the variable 'YACC'.  This is most easily done by invoking the macro
'AC_PROG_YACC' (*note Particular Program Checks: (autoconf)Particular
Programs.).

   When 'yacc' is invoked, it is passed 'AM_YFLAGS' and 'YFLAGS'.  The
latter is a user variable and the former is intended for the
'Makefile.am' author.

   'AM_YFLAGS' is usually used to pass the '-d' option to 'yacc'.
Automake knows what this means and will automatically adjust its rules
to update and distribute the header file built by 'yacc -d'(1).  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 'BUILT_SOURCES' (*note Sources::) as follows.

     BUILT_SOURCES = parser.h
     AM_YFLAGS = -d
     bin_PROGRAMS = foo
     foo_SOURCES = ... parser.y ...

   If a 'lex' source file is seen, then your 'configure.ac' must define
the variable 'LEX'.  You can use 'AC_PROG_LEX' to do this (*note
Particular Program Checks: (autoconf)Particular Programs.), but using
'AM_PROG_LEX' macro (*note Macros::) is recommended.

   When 'lex' is invoked, it is passed 'AM_LFLAGS' and 'LFLAGS'.  The
latter is a user variable and the former is intended for the
'Makefile.am' author.

   When 'AM_MAINTAINER_MODE' (*note maintainer-mode::) is used, the
rebuild rule for distributed Yacc and Lex sources are only used when
'maintainer-mode' is enabled, or when the files have been erased.

   When 'lex' or 'yacc' sources are used, 'automake -a' automatically
installs an auxiliary program called 'ylwrap' in your package (*note
Auxiliary Programs::).  This program is used by the build rules to
rename the output of these tools, and makes it possible to include
multiple 'yacc' (or '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 'yacc'
simultaneously.)

   For 'yacc', simply managing locking is insufficient.  The output of
'yacc' always uses the same symbol names internally, so it isn't
possible to link two 'yacc' parsers into the same executable.

   We recommend using the following renaming hack used in 'gdb':
     #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

   For each define, replace the 'c_' prefix with whatever you like.
These defines work for 'bison', 'byacc', and traditional '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.

   ---------- Footnotes ----------

   (1) Please note that 'automake' recognizes '-d' in 'AM_YFLAGS' only
if it is not clustered with other options; for example, it won't be
recognized if 'AM_YFLAGS' is '-dt', but it will be if 'AM_YFLAGS' is '-d
-t' or '-t -d'.


File: automake.info,  Node: C++ Support,  Next: Objective C Support,  Prev: Yacc and Lex,  Up: Programs

8.9 C++ Support
===============

Automake includes full support for C++.

   Any package including C++ code must define the output variable 'CXX'
in 'configure.ac'; the simplest way to do this is to use the
'AC_PROG_CXX' macro (*note Particular Program Checks:
(autoconf)Particular Programs.).

   A few additional variables are defined when a C++ source file is
seen:

'CXX'
     The name of the C++ compiler.

'CXXFLAGS'
     Any flags to pass to the C++ compiler.

'AM_CXXFLAGS'
     The maintainer's variant of 'CXXFLAGS'.

'CXXCOMPILE'
     The command used to actually compile a C++ source file.  The file
     name is appended to form the complete command line.

'CXXLINK'
     The command used to actually link a C++ program.


File: automake.info,  Node: Objective C Support,  Next: Objective C++ Support,  Prev: C++ Support,  Up: Programs

8.10 Objective C Support
========================

Automake includes some support for Objective C.

   Any package including Objective C code must define the output
variable 'OBJC' in 'configure.ac'; the simplest way to do this is to use
the 'AC_PROG_OBJC' macro (*note Particular Program Checks:
(autoconf)Particular Programs.).

   A few additional variables are defined when an Objective C source
file is seen:

'OBJC'
     The name of the Objective C compiler.

'OBJCFLAGS'
     Any flags to pass to the Objective C compiler.

'AM_OBJCFLAGS'
     The maintainer's variant of 'OBJCFLAGS'.

'OBJCCOMPILE'
     The command used to actually compile an Objective C source file.
     The file name is appended to form the complete command line.

'OBJCLINK'
     The command used to actually link an Objective C program.


File: automake.info,  Node: Objective C++ Support,  Next: Unified Parallel C Support,  Prev: Objective C Support,  Up: Programs

8.11 Objective C++ Support
==========================

Automake includes some support for Objective C++.

   Any package including Objective C++ code must define the output
variable 'OBJCXX' in 'configure.ac'; the simplest way to do this is to
use the 'AC_PROG_OBJCXX' macro (*note Particular Program Checks:
(autoconf)Particular Programs.).

   A few additional variables are defined when an Objective C++ source
file is seen:

'OBJCXX'
     The name of the Objective C++ compiler.

'OBJCXXFLAGS'
     Any flags to pass to the Objective C++ compiler.

'AM_OBJCXXFLAGS'
     The maintainer's variant of 'OBJCXXFLAGS'.

'OBJCXXCOMPILE'
     The command used to actually compile an Objective C++ source file.
     The file name is appended to form the complete command line.

'OBJCXXLINK'
     The command used to actually link an Objective C++ program.


File: automake.info,  Node: Unified Parallel C Support,  Next: Assembly Support,  Prev: Objective C++ Support,  Up: Programs

8.12 Unified Parallel C Support
===============================

Automake includes some support for Unified Parallel C.

   Any package including Unified Parallel C code must define the output
variable 'UPC' in 'configure.ac'; the simplest way to do this is to use
the 'AM_PROG_UPC' macro (*note Public Macros::).

   A few additional variables are defined when a Unified Parallel C
source file is seen:

'UPC'
     The name of the Unified Parallel C compiler.

'UPCFLAGS'
     Any flags to pass to the Unified Parallel C compiler.

'AM_UPCFLAGS'
     The maintainer's variant of 'UPCFLAGS'.

'UPCCOMPILE'
     The command used to actually compile a Unified Parallel C source
     file.  The file name is appended to form the complete command line.

'UPCLINK'
     The command used to actually link a Unified Parallel C program.


File: automake.info,  Node: Assembly Support,  Next: Fortran 77 Support,  Prev: Unified Parallel C Support,  Up: Programs

8.13 Assembly Support
=====================

Automake includes some support for assembly code.  There are two forms
of assembler files: normal ('*.s') and preprocessed by 'CPP' ('*.S' or
'*.sx').

   The variable '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 '-c' and '-o'.  The values of 'CCASFLAGS' and
'AM_CCASFLAGS' (or its per-target definition) is passed to the
compilation.  For preprocessed files, 'DEFS', 'DEFAULT_INCLUDES',
'INCLUDES', 'CPPFLAGS' and 'AM_CPPFLAGS' are also used.

   The autoconf macro 'AM_PROG_AS' will define 'CCAS' and 'CCASFLAGS'
for you (unless they are already set, it simply sets 'CCAS' to the C
compiler and 'CCASFLAGS' to the C compiler flags), but you are free to
define these variables by other means.

   Only the suffixes '.s', '.S', and '.sx' are recognized by 'automake'
as being files containing assembly code.


File: automake.info,  Node: Fortran 77 Support,  Next: Fortran 9x Support,  Prev: Assembly Support,  Up: Programs

8.14 Fortran 77 Support
=======================

Automake includes full support for Fortran 77.

   Any package including Fortran 77 code must define the output variable
'F77' in 'configure.ac'; the simplest way to do this is to use the
'AC_PROG_F77' macro (*note Particular Program Checks:
(autoconf)Particular Programs.).

   A few additional variables are defined when a Fortran 77 source file
is seen:

'F77'
     The name of the Fortran 77 compiler.

'FFLAGS'
     Any flags to pass to the Fortran 77 compiler.

'AM_FFLAGS'
     The maintainer's variant of 'FFLAGS'.

'RFLAGS'
     Any flags to pass to the Ratfor compiler.

'AM_RFLAGS'
     The maintainer's variant of 'RFLAGS'.

'F77COMPILE'
     The command used to actually compile a Fortran 77 source file.  The
     file name is appended to form the complete command line.

'FLINK'
     The command used to actually link a pure Fortran 77 program or
     shared library.

   Automake can handle preprocessing Fortran 77 and Ratfor source files
in addition to compiling them(1).  Automake also contains some support
for creating programs and shared libraries that are a mixture of Fortran
77 and other languages (*note 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++

   ---------- Footnotes ----------

   (1) Much, if not most, of the information in the following sections
pertaining to preprocessing Fortran 77 programs was taken almost
verbatim from *note Catalogue of Rules: (make)Catalogue of Rules.


File: automake.info,  Node: Preprocessing Fortran 77,  Next: Compiling Fortran 77 Files,  Up: Fortran 77 Support

8.14.1 Preprocessing Fortran 77
-------------------------------

'N.f' is made automatically from 'N.F' or '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:

'.F'
     '$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
     $(AM_FFLAGS) $(FFLAGS)'

'.r'
     '$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)'


File: automake.info,  Node: Compiling Fortran 77 Files,  Next: Mixing Fortran 77 With C and C++,  Prev: Preprocessing Fortran 77,  Up: Fortran 77 Support

8.14.2 Compiling Fortran 77 Files
---------------------------------

'N.o' is made automatically from 'N.f', 'N.F' or 'N.r' by running the
Fortran 77 compiler.  The precise command used is as follows:

'.f'
     '$(F77) -c $(AM_FFLAGS) $(FFLAGS)'

'.F'
     '$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
     $(AM_FFLAGS) $(FFLAGS)'

'.r'
     '$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)'


File: automake.info,  Node: Mixing Fortran 77 With C and C++,  Prev: Compiling Fortran 77 Files,  Up: Fortran 77 Support

8.14.3 Mixing Fortran 77 With C and C++
---------------------------------------

Automake currently provides _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 _not_ (currently) handled by Automake, but that
are handled by other packages(1).

   Automake can help in two ways:

  1. Automatic selection of the linker depending on which combinations
     of source code.

  2. Automatic selection of the appropriate linker flags (e.g., '-L' and
     '-l') to pass to the automatically selected linker in order to link
     in the appropriate Fortran 77 intrinsic and run-time libraries.

     These extra Fortran 77 linker flags are supplied in the output
     variable 'FLIBS' by the 'AC_F77_LIBRARY_LDFLAGS' Autoconf macro.
     *Note Fortran Compiler Characteristics: (autoconf)Fortran Compiler.

   If Automake detects that a program or shared library (as mentioned in
some '_PROGRAMS' or '_LTLIBRARIES' primary) contains source code that is
a mixture of Fortran 77 and C and/or C++, then it requires that the
macro 'AC_F77_LIBRARY_LDFLAGS' be called in 'configure.ac', and that
either '$(FLIBS)' appear in the appropriate '_LDADD' (for programs) or
'_LIBADD' (for shared libraries) variables.  It is the responsibility of
the person writing the 'Makefile.am' to make sure that '$(FLIBS)'
appears in the appropriate '_LDADD' or '_LIBADD' variable.

   For example, consider the following 'Makefile.am':

     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)

   In this case, Automake will insist that 'AC_F77_LIBRARY_LDFLAGS' is
mentioned in 'configure.ac'.  Also, if '$(FLIBS)' hadn't been mentioned
in 'foo_LDADD' and 'libfoo_la_LIBADD', then Automake would have issued a
warning.

* Menu:

* How the Linker is Chosen::    Automatic linker selection

   ---------- Footnotes ----------

   (1) For example, the cfortran package
(http://www-zeus.desy.de/~burow/cfortran/) addresses all of these
inter-language issues, and runs under nearly all Fortran 77, C and C++
compilers on nearly all platforms.  However, 'cfortran' is not yet Free
Software, but it will be in the next major release.


File: automake.info,  Node: How the Linker is Chosen,  Up: Mixing Fortran 77 With C and C++

8.14.3.1 How the Linker is Chosen
.................................

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

  1. Native Java ('GCJLINK')
  2. Objective C++ ('OBJCXXLINK')
  3. C++ ('CXXLINK')
  4. Fortran 77 ('F77LINK')
  5. Fortran ('FCLINK')
  6. Objective C ('OBJCLINK')
  7. Unified Parallel C ('UPCLINK')
  8. C ('LINK')

   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 '_LDADD' or
'_LIBADD' variable by the user writing the 'Makefile.am'.

   Automake only looks at the file names listed in '_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.
*Note Libtool Convenience Libraries::, for a trick with
'nodist_EXTRA_..._SOURCES'.

   A per-target '_LINK' variable will override the above selection.
Per-target link flags will cause Automake to write a per-target '_LINK'
variable according to the language chosen as above.


File: automake.info,  Node: Fortran 9x Support,  Next: Java Support with gcj,  Prev: Fortran 77 Support,  Up: Programs

8.15 Fortran 9x Support
=======================

Automake includes support for Fortran 9x.

   Any package including Fortran 9x code must define the output variable
'FC' in 'configure.ac'; the simplest way to do this is to use the
'AC_PROG_FC' macro (*note Particular Program Checks:
(autoconf)Particular Programs.).

   A few additional variables are defined when a Fortran 9x source file
is seen:

'FC'
     The name of the Fortran 9x compiler.

'FCFLAGS'
     Any flags to pass to the Fortran 9x compiler.

'AM_FCFLAGS'
     The maintainer's variant of 'FCFLAGS'.

'FCCOMPILE'
     The command used to actually compile a Fortran 9x source file.  The
     file name is appended to form the complete command line.

'FCLINK'
     The command used to actually link a pure Fortran 9x program or
     shared library.

* Menu:

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


File: automake.info,  Node: Compiling Fortran 9x Files,  Up: Fortran 9x Support

8.15.1 Compiling Fortran 9x Files
---------------------------------

'FILE.o' is made automatically from 'FILE.f90', 'FILE.f95', 'FILE.f03',
or 'FILE.f08' by running the Fortran 9x compiler.  The precise command
used is as follows:

'.f90'
     '$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<'

'.f95'
     '$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<'

'.f03'
     '$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<'

'.f08'
     '$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<'


File: automake.info,  Node: Java Support with gcj,  Next: Vala Support,  Prev: Fortran 9x Support,  Up: Programs

8.16 Compiling Java sources using gcj
=====================================

Automake includes support for natively compiled Java, using 'gcj', the
Java front end to the GNU Compiler Collection (rudimentary support for
compiling Java to bytecode using the 'javac' compiler is also present,
_albeit deprecated_; *note Java::).

   Any package including Java code to be compiled must define the output
variable 'GCJ' in 'configure.ac'; the variable 'GCJFLAGS' must also be
defined somehow (either in 'configure.ac' or 'Makefile.am').  The
simplest way to do this is to use the 'AM_PROG_GCJ' macro.

   By default, programs including Java source files are linked with
'gcj'.

   As always, the contents of 'AM_GCJFLAGS' are passed to every
compilation invoking 'gcj' (in its role as an ahead-of-time compiler,
when invoking it to create '.class' files, 'AM_JAVACFLAGS' is used
instead).  If it is necessary to pass options to 'gcj' from
'Makefile.am', this variable, and not the user variable 'GCJFLAGS',
should be used.

   'gcj' can be used to compile '.java', '.class', '.zip', or '.jar'
files.

   When linking, 'gcj' requires that the main class be specified using
the '--main=' option.  The easiest way to do this is to use the
'_LDFLAGS' variable for the program.


File: automake.info,  Node: Vala Support,  Next: Support for Other Languages,  Prev: Java Support with gcj,  Up: Programs

8.17 Vala Support
=================

Automake provides initial support for Vala
(<http://www.vala-project.org/>).  This requires valac version 0.7.0 or
later, and currently requires the user to use GNU 'make'.

     foo_SOURCES = foo.vala bar.vala zardoc.c

   Any '.vala' file listed in a '_SOURCES' variable will be compiled
into C code by the Vala compiler.  The generated '.c' files are
distributed.  The end user does not need to have a Vala compiler
installed.

   Automake ships with an Autoconf macro called 'AM_PROG_VALAC' that
will locate the Vala compiler and optionally check its version number.

 -- Macro: AM_PROG_VALAC ([MINIMUM-VERSION], [ACTION-IF-FOUND],
     [ACTION-IF-NOT-FOUND]) Search for a Vala compiler in 'PATH'.  If it
     is found, the variable '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 MINIMUM-VERSION, then ACTION-IF-FOUND is run (this
     defaults to do nothing).  Otherwise, ACTION-IF-NOT-FOUND is run.
     If 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.

   There are a few variables that are used when compiling Vala sources:

'VALAC'
     Absolute path to the Vala compiler, or simply 'valac' if no
     suitable compiler Vala could be found at configure runtime.

'VALAFLAGS'
     Additional arguments for the Vala compiler.

'AM_VALAFLAGS'
     The maintainer's variant of 'VALAFLAGS'.

          lib_LTLIBRARIES = libfoo.la
          libfoo_la_SOURCES = foo.vala

   Note that currently, you cannot use per-target '*_VALAFLAGS' (*note
Renamed Objects::) to produce different C files from one Vala source
file.


File: automake.info,  Node: Support for Other Languages,  Next: Dependencies,  Prev: Vala Support,  Up: Programs

8.18 Support for Other Languages
================================

Automake currently only includes full support for C, C++ (*note C++
Support::), Objective C (*note Objective C Support::), Objective C++
(*note Objective C++ Support::), Fortran 77 (*note Fortran 77
Support::), Fortran 9x (*note Fortran 9x Support::), and Java (*note
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 (*note Suffixes::).


File: automake.info,  Node: Dependencies,  Next: EXEEXT,  Prev: Support for Other Languages,  Up: Programs

8.19 Automatic dependency tracking
==================================

As a developer it is often painful to continually update the
'Makefile.am' whenever the include-file dependencies change in a
project.  Automake supplies a way to automatically track dependency
changes (*note 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 'depcomp'.  'depcomp' understands how to coax
many different C and C++ compilers into generating dependency
information in the format it requires.  'automake -a' will install
'depcomp' into your source tree for you.  If 'depcomp' can't figure out
how to properly invoke your compiler, dependency tracking will simply be
disabled for your build.

   Experience with earlier versions of Automake (*note Dependency
Tracking Evolution: (automake-history)Dependency Tracking Evolution.)
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
'no-dependencies' in the variable 'AUTOMAKE_OPTIONS', or passing
'no-dependencies' as an argument to 'AM_INIT_AUTOMAKE' (this should be
the preferred way).  Or, you can invoke 'automake' with the '-i' option.
Dependency tracking is enabled by default.

   The person building your package also can choose to disable
dependency tracking by configuring with '--disable-dependency-tracking'.


File: automake.info,  Node: EXEEXT,  Prev: Dependencies,  Up: Programs

8.20 Support for executable extensions
======================================

On some platforms, such as Windows, executables are expected to have an
extension such as '.exe'.  On these platforms, some compilers (GCC among
them) will automatically generate 'foo.exe' when asked to generate
'foo'.

   Automake provides mostly-transparent support for this.  Unfortunately
_mostly_ doesn't yet mean _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:

     bin_PROGRAMS = liver

   to this:

     bin_PROGRAMS = liver$(EXEEXT)

   The targets Automake generates are likewise given the '$(EXEEXT)'
extension.

   The variables 'TESTS' and 'XFAIL_TESTS' (*note Simple Tests::) are
also rewritten if they contain filenames that have been declared as
programs in the same 'Makefile'.  (This is mostly useful when some
programs from 'check_PROGRAMS' are listed in 'TESTS'.)

   However, Automake cannot apply this rewriting to 'configure'
substitutions.  This means that if you are conditionally building a
program using such a substitution, then your 'configure.ac' must take
care to add '$(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
'$(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 'no-exeext' option (*note Options::) will disable this
feature.  This works in a fairly ugly way; if 'no-exeext' is seen, then
the presence of a rule for a target named 'foo' in 'Makefile.am' will
override an 'automake'-generated rule for 'foo$(EXEEXT)'.  Without the
'no-exeext' option, this use will give a diagnostic.


File: automake.info,  Node: Other Objects,  Next: Other GNU Tools,  Prev: Programs,  Up: Top

9 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


File: automake.info,  Node: Scripts,  Next: Headers,  Up: Other Objects

9.1 Executable Scripts
======================

It is possible to define and install programs that are scripts.  Such
programs are listed using the 'SCRIPTS' primary name.  When the script
is distributed in its final, installable form, the 'Makefile' usually
looks as follows:

     # Install my_script in $(bindir) and distribute it.
     dist_bin_SCRIPTS = my_script

   Scripts are not distributed by default; as we have just seen, those
that should be distributed can be specified using a 'dist_' prefix as
with other primaries.

   Scripts can be installed in 'bindir', 'sbindir', 'libexecdir',
'pkglibexecdir', or 'pkgdatadir'.

   Scripts that need not be installed can be listed in 'noinst_SCRIPTS',
and among them, those which are needed only by 'make check' should go in
'check_SCRIPTS'.

   When a script needs to be built, the 'Makefile.am' should include the
appropriate rules.  For instance the 'automake' program itself is a Perl
script that is generated from 'automake.in'.  Here is how this is
handled:

     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' \
                 ...

     automake: automake.in Makefile
             $(do_subst) < $(srcdir)/automake.in > automake
             chmod +x automake

   Such scripts for which a build rule has been supplied need to be
deleted explicitly using 'CLEANFILES' (*note Clean::), and their sources
have to be distributed, usually with 'EXTRA_DIST' (*note Basics of
Distribution::).

   Another common way to build scripts is to process them from
'configure' with '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 'configure.ac' contains

     AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])

to build 'src/my_script' from 'src/my_script.in', then a
'src/Makefile.am' to install this script in '$(bindir)' can be as simple
as

     bin_SCRIPTS = my_script
     CLEANFILES = $(bin_SCRIPTS)

There is no need for 'EXTRA_DIST' or any build rule: Automake infers
them from 'AC_CONFIG_FILES' (*note Requirements::).  'CLEANFILES' is
still useful, because by default Automake will clean targets of
'AC_CONFIG_FILES' in 'distclean', not 'clean'.

   Although this looks simpler, building scripts this way has one
drawback: directory variables such as '$(datadir)' are not fully
expanded and may refer to other directory variables.


File: automake.info,  Node: Headers,  Next: Data,  Prev: Scripts,  Up: Other Objects

9.2 Header files
================

Header files that must be installed are specified by the 'HEADERS'
family of variables.  Headers can be installed in 'includedir',
'oldincludedir', 'pkgincludedir' or any other directory you may have
defined (*note Uniform::).  For instance,

     include_HEADERS = foo.h bar/bar.h

will install the two files as '$(includedir)/foo.h' and
'$(includedir)/bar.h'.

   The 'nobase_' prefix is also supported,

     nobase_include_HEADERS = foo.h bar/bar.h

will install the two files as '$(includedir)/foo.h' and
'$(includedir)/bar/bar.h' (*note Alternative::).

   Usually, only header files that accompany installed libraries need to
be installed.  Headers used by programs or convenience libraries are not
installed.  The '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
'_SOURCES' variable (*note Program Sources::) instead of in
'noinst_HEADERS'.  This is clearer for the 'Makefile.am' reader.
'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 '_SOURCES' variable
or in a '_HEADERS' variable.  Missing ones will not appear in the
distribution.

   For header files that are built and must not be distributed, use the
'nodist_' prefix as in 'nodist_include_HEADERS' or
'nodist_prog_SOURCES'.  If these generated headers are needed during the
build, you must also ensure they exist before they are used (*note
Sources::).


File: automake.info,  Node: Data,  Next: Sources,  Prev: Headers,  Up: Other Objects

9.3 Architecture-independent data files
=======================================

Automake supports the installation of miscellaneous data files using the
'DATA' family of variables.

   Such data can be installed in the directories 'datadir',
'sysconfdir', 'sharedstatedir', 'localstatedir', or 'pkgdatadir'.

   By default, data files are _not_ included in a distribution.  Of
course, you can use the 'dist_' prefix to change this on a per-variable
basis.

   Here is how Automake declares its auxiliary data files:

     dist_pkgdata_DATA = clean-kr.am clean.am ...


File: automake.info,  Node: Sources,  Prev: Data,  Up: Other Objects

9.4 Built Sources
=================

Because Automake's automatic dependency tracking works as a side-effect
of compilation (*note 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 'foo.c' includes 'foo.h'.  When it first compiles 'foo.o', 'make'
only knows that 'foo.o' depends on 'foo.c'.  As a side-effect of this
compilation 'depcomp' records the 'foo.h' dependency so that following
invocations of 'make' will honor it.  In these conditions, it's clear
there is no problem: either '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 'foo.o' should be rebuilt.

   It's a different story if 'foo.h' doesn't exist by the first 'make'
run.  For instance, there might be a rule to build 'foo.h'.  This time
'file.o''s build will fail because the compiler can't find 'foo.h'.
'make' failed to trigger the rule to build 'foo.h' first by lack of
dependency information.

   The 'BUILT_SOURCES' variable is a workaround for this problem.  A
source file listed in 'BUILT_SOURCES' is made on 'make all' or 'make
check' (or even 'make install') before other targets are processed.
However, such a source file is not _compiled_ unless explicitly
requested by mentioning it in some other '_SOURCES' variable.

   So, to conclude our introductory example, we could use 'BUILT_SOURCES
= foo.h' to ensure 'foo.h' gets built before any other target (including
'foo.o') during 'make all' or 'make check'.

   '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 'BUILT_SOURCES'.  For instance, a generated '.c' file doesn't
need to appear in '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 'BUILT_SOURCES' is honored
only by 'make all', 'make check' and 'make install'.  This means you
cannot build a specific target (e.g., 'make foo') in a clean tree if it
depends on a built source.  However it will succeed if you have run
'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.


File: automake.info,  Node: Built Sources Example,  Up: Sources

9.4.1 Built Sources Example
---------------------------

Suppose that 'foo.c' includes 'bindir.h', which is
installation-dependent and not distributed: it needs to be built.  Here
'bindir.h' defines the preprocessor macro 'bindir' to the value of the
'make' variable 'bindir' (inherited from '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.

First Try
.........

This first implementation will illustrate the bootstrap issue mentioned
in the previous section (*note Sources::).

   Here is a tentative 'Makefile.am'.

     # 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)"' >$@

   This setup doesn't work, because Automake doesn't know that 'foo.c'
includes 'bindir.h'.  Remember, automatic dependency tracking works as a
side-effect of compilation, so the dependencies of 'foo.o' will be known
only after 'foo.o' has been compiled (*note Dependencies::).  The
symptom is as follows.

     % 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

   In this example 'bindir.h' is not distributed nor installed, and it
is not even being built on-time.  One may wonder if the
'nodist_foo_SOURCES = bindir.h' line has any use at all.  This line
simply states that 'bindir.h' is a source of 'foo', so for instance, it
should be inspected while generating tags (*note Tags::).  In other
words, it does not help our present problem, and the build would fail
identically without it.

Using 'BUILT_SOURCES'
.....................

A solution is to require 'bindir.h' to be built before anything else.
This is what 'BUILT_SOURCES' is meant for (*note Sources::).

     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)"' >$@

   See how 'bindir.h' gets built first:

     % 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'

   However, as said earlier, 'BUILT_SOURCES' applies only to the 'all',
'check', and 'install' targets.  It still fails if you try to run 'make
foo' explicitly:

     % 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

Recording Dependencies manually
...............................

Usually people are happy enough with 'BUILT_SOURCES' because they never
build targets such as 'make foo' before 'make all', as in the previous
example.  However if this matters to you, you can avoid 'BUILT_SOURCES'
and record such dependencies explicitly in the 'Makefile.am'.

     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)"' >$@

   You don't have to list _all_ the dependencies of '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 'foo.o' and '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).
'foo.$(OBJEXT): bindir.h' supersedes any rule Automake may want to
output to build 'foo.$(OBJEXT)'.  It happens to work in this case
because Automake doesn't have to output any 'foo.$(OBJEXT):' target: it
relies on a suffix rule instead (i.e., '.c.$(OBJEXT):').  Always check
the generated 'Makefile.in' if you do this.

Build 'bindir.h' from 'configure'
.................................

It's possible to define this preprocessor macro from 'configure', either
in 'config.h' (*note Defining Directories: (autoconf)Defining
Directories.), or by processing a 'bindir.h.in' file using
'AC_CONFIG_FILES' (*note Configuration Actions: (autoconf)Configuration
Actions.).

   At this point it should be clear that building 'bindir.h' from
'configure' works well for this example.  '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 'bindir.h'.

     bin_PROGRAMS = foo
     foo_SOURCES = foo.c

   However, it's not always possible to build sources from 'configure',
especially when these sources are generated by a tool that needs to be
built first.

Build 'bindir.c', not 'bindir.h'.
.................................

Another attractive idea is to define 'bindir' as a variable or function
exported from 'bindir.o', and build 'bindir.c' instead of 'bindir.h'.

     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)";' >$@

   'bindir.h' contains just the variable's declaration and doesn't need
to be built, so it won't cause any trouble.  'bindir.o' is always
dependent on 'bindir.c', so 'bindir.c' will get built first.

Which is best?
..............

There is no panacea, of course.  Each solution has its merits and
drawbacks.

   You cannot use 'BUILT_SOURCES' if the ability to run '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 './configure' is not always possible, neither is
converting '.h' files into '.c' files.


File: automake.info,  Node: Other GNU Tools,  Next: Documentation,  Prev: Other Objects,  Up: Top

10 Other GNU Tools
******************

Since Automake is primarily intended to generate '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


File: automake.info,  Node: Emacs Lisp,  Next: gettext,  Up: Other GNU Tools

10.1 Emacs Lisp
===============

Automake provides some support for Emacs Lisp.  The 'LISP' primary is
used to hold a list of '.el' files.  Possible prefixes for this primary
are 'lisp_' and 'noinst_'.  Note that if 'lisp_LISP' is defined, then
'configure.ac' must run 'AM_PATH_LISPDIR' (*note Macros::).

   Lisp sources are not distributed by default.  You can prefix the
'LISP' primary with 'dist_', as in 'dist_lisp_LISP' or
'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 'AM_PATH_LISPDIR', if any was found.  When performing
such byte-compilation, the flags specified in the (developer-reserved)
'AM_ELCFLAGS' and (user-reserved) '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.

     lisp_LISP = file1.el file2.el
     ELCFILES =

'ELCFILES' is an internal Automake variable that normally lists all
'.elc' files that must be byte-compiled.  Automake defines 'ELCFILES'
automatically from 'lisp_LISP'.  Emptying this variable explicitly
prevents byte-compilation.

   Since Automake 1.8, we now recommend using 'lisp_DATA' instead:

     lisp_DATA = file1.el file2.el

   Note that these two constructs are not equivalent.  '_LISP' will not
install a file if Emacs is not installed, while '_DATA' will always
install its files.


File: automake.info,  Node: gettext,  Next: Libtool,  Prev: Emacs Lisp,  Up: Other GNU Tools

10.2 Gettext
============

If 'AM_GNU_GETTEXT' is seen in 'configure.ac', then Automake turns on
support for GNU gettext, a message catalog system for
internationalization (*note Introduction: (gettext)Top.).

   The 'gettext' support in Automake requires the addition of one or two
subdirectories to the package: 'po' and possibly also 'intl'.  The
latter is needed if 'AM_GNU_GETTEXT' is not invoked with the 'external'
argument, or if 'AM_GNU_GETTEXT_INTL_SUBDIR' is used.  Automake ensures
that these directories exist and are mentioned in 'SUBDIRS'.


File: automake.info,  Node: Libtool,  Next: Java,  Prev: gettext,  Up: Other GNU Tools

10.3 Libtool
============

Automake provides support for GNU Libtool (*note Introduction:
(libtool)Top.) with the 'LTLIBRARIES' primary.  *Note A Shared
Library::.


File: automake.info,  Node: Java,  Next: Python,  Prev: Libtool,  Up: Other GNU Tools

10.4 Java bytecode compilation (deprecated)
===========================================

Automake provides some minimal support for Java bytecode compilation
with the 'JAVA' primary (in addition to the support for compiling Java
to native machine code; *note Java Support with gcj::).  Note however
that _the interface and most features described here are deprecated_.
Future Automake releases will strive to provide a better and cleaner
interface, which however _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).

   Any '.java' files listed in a '_JAVA' variable will be compiled with
'JAVAC' at build time.  By default, '.java' files are not included in
the distribution, you should use the 'dist_' prefix to distribute them.

   Here is a typical setup for distributing '.java' files and installing
the '.class' files resulting from their compilation.

     javadir = $(datadir)/java
     dist_java_JAVA = a.java b.java ...

   Currently Automake enforces the restriction that only one '_JAVA'
primary can be used in a given 'Makefile.am'.  The reason for this
restriction is that, in general, it isn't possible to know which
'.class' files were generated from which '.java' files, so it would be
impossible to know which files to install where.  For instance, a
'.java' file can define multiple classes; the resulting '.class' file
names cannot be predicted without parsing the '.java' file.

   There are a few variables that are used when compiling Java sources:

'JAVAC'
     The name of the Java compiler.  This defaults to 'javac'.

'JAVACFLAGS'
     The flags to pass to the compiler.  This is considered to be a user
     variable (*note User Variables::).

'AM_JAVACFLAGS'
     More flags to pass to the Java compiler.  This, and not
     'JAVACFLAGS', should be used when it is necessary to put Java
     compiler flags into 'Makefile.am'.

'JAVAROOT'
     The value of this variable is passed to the '-d' option to 'javac'.
     It defaults to '$(top_builddir)'.

'CLASSPATH_ENV'
     This variable is a shell expression that is used to set the
     'CLASSPATH' environment variable on the 'javac' command line.  (In
     the future we will probably handle class path setting differently.)


File: automake.info,  Node: Python,  Prev: Java,  Up: Other GNU Tools

10.5 Python
===========

Automake provides support for Python compilation with the 'PYTHON'
primary.  A typical setup is to call 'AM_PATH_PYTHON' in 'configure.ac'
and use a line like the following in 'Makefile.am':

     python_PYTHON = tree.py leave.py

   Any files listed in a '_PYTHON' variable will be byte-compiled with
'py-compile' at install time.  'py-compile' actually creates both
standard ('.pyc') and optimized ('.pyo') byte-compiled versions of the
source files.  Note that because byte-compilation occurs at install
time, any files listed in 'noinst_PYTHON' will not be compiled.  Python
source files are included in the distribution by default, prepend
'nodist_' (as in 'nodist_python_PYTHON') to omit them.

   Automake ships with an Autoconf macro called 'AM_PATH_PYTHON' that
will determine some Python-related directory variables (see below).  If
you have called 'AM_PATH_PYTHON' from 'configure.ac', then you may use
the variables 'python_PYTHON' or 'pkgpython_PYTHON' to list Python
source files in your 'Makefile.am', depending on where you want your
files installed (see the definitions of 'pythondir' and 'pkgpythondir'
below).

 -- Macro: AM_PATH_PYTHON ([VERSION], [ACTION-IF-FOUND],
     [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:
     'AM_PATH_PYTHON' will skip any Python interpreter that is older
     than VERSION.  If an interpreter is found and satisfies VERSION,
     then ACTION-IF-FOUND is run.  Otherwise, ACTION-IF-NOT-FOUND is
     run.

     If ACTION-IF-NOT-FOUND is not specified, as in the following
     example, the default is to abort 'configure'.

          AM_PATH_PYTHON([2.2])

     This is fine when Python is an absolute requirement for the
     package.  If Python >= 2.5 was only _optional_ to the package,
     'AM_PATH_PYTHON' could be called as follows.

          AM_PATH_PYTHON([2.5],, [:])

     If the 'PYTHON' variable is set when 'AM_PATH_PYTHON' is called,
     then that will be the only Python interpreter that is tried.

     'AM_PATH_PYTHON' creates the following output variables based on
     the Python installation found during configuration.

'PYTHON'
     The name of the Python executable, or ':' if no suitable
     interpreter could be found.

     Assuming ACTION-IF-NOT-FOUND is used (otherwise './configure' will
     abort if Python is absent), the value of 'PYTHON' can be used to
     setup a conditional in order to disable the relevant part of a
     build as follows.

          AM_PATH_PYTHON(,, [:])
          AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])

'PYTHON_VERSION'
     The Python version number, in the form MAJOR.MINOR (e.g., '2.5').
     This is currently the value of 'sys.version[:3]'.

'PYTHON_PREFIX'
     The string '${prefix}'.  This term may be used in future work that
     needs the contents of Python's 'sys.prefix', but general consensus
     is to always use the value from 'configure'.

'PYTHON_EXEC_PREFIX'
     The string '${exec_prefix}'.  This term may be used in future work
     that needs the contents of Python's 'sys.exec_prefix', but general
     consensus is to always use the value from 'configure'.

'PYTHON_PLATFORM'
     The canonical name used by Python to describe the operating system,
     as given by 'sys.platform'.  This value is sometimes needed when
     building Python extensions.

'pythondir'
     The directory name for the 'site-packages' subdirectory of the
     standard Python install tree.

'pkgpythondir'
     This is the directory under 'pythondir' that is named after the
     package.  That is, it is '$(pythondir)/$(PACKAGE)'.  It is provided
     as a convenience.

'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:

          pyexec_LTLIBRARIES = quaternion.la
          quaternion_la_SOURCES = quaternion.c support.c support.h
          quaternion_la_LDFLAGS = -avoid-version -module

'pkgpyexecdir'
     This is a convenience variable that is defined as
     '$(pyexecdir)/$(PACKAGE)'.

   All of these directory variables have values that start with either
'${prefix}' or '${exec_prefix}' unexpanded.  This works fine in
'Makefiles', but it makes these variables hard to use in 'configure'.
This is mandated by the GNU coding standards, so that the user can run
'make prefix=/foo install'.  The Autoconf manual has a section with more
details on this topic (*note Installation Directory Variables:
(autoconf)Installation Directory Variables.).  See also *note Hard-Coded
Install Paths::.


File: automake.info,  Node: Documentation,  Next: Install,  Prev: Other GNU Tools,  Up: Top

11 Building documentation
*************************

Currently Automake provides support for Texinfo and man pages.

* Menu:

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


File: automake.info,  Node: Texinfo,  Next: Man Pages,  Up: Documentation

11.1 Texinfo
============

If the current directory contains Texinfo source, you must declare it
with the 'TEXINFOS' primary.  Generally Texinfo files are converted into
info, and thus the 'info_TEXINFOS' variable is most commonly used here.
Any Texinfo source file should have the '.texi' extension.  Automake
also accepts '.txi' or '.texinfo' extensions, but their use is
discouraged now, and will elicit runtime warnings.

   Automake generates rules to build '.info', '.dvi', '.ps', '.pdf' and
'.html' files from your Texinfo sources.  Following the GNU Coding
Standards, only the '.info' files are built by 'make all' and installed
by 'make install' (unless you use 'no-installinfo', see below).
Furthermore, '.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 '.info' files are by default placed in 'srcdir'
rather than in the 'builddir'.  This can be changed with the
'info-in-builddir' option.

   Other documentation formats can be built on request by 'make dvi',
'make ps', 'make pdf' and 'make html', and they can be installed with
'make install-dvi', 'make install-ps', 'make install-pdf' and 'make
install-html' explicitly.  '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 '-local' rules (*note
Extending::).

   If the '.texi' file '@include's 'version.texi', then that file will
be automatically generated.  The file 'version.texi' defines four
Texinfo flag you can reference using '@value{EDITION}',
'@value{VERSION}', '@value{UPDATED}', and '@value{UPDATED-MONTH}'.

'EDITION'
'VERSION'
     Both of these flags hold the version number of your program.  They
     are kept separate for clarity.

'UPDATED'
     This holds the date the primary '.texi' file was last modified.

'UPDATED-MONTH'
     This holds the name of the month in which the primary '.texi' file
     was last modified.

   The 'version.texi' support requires the 'mdate-sh' script; this
script is supplied with Automake and automatically included when
'automake' is invoked with the '--add-missing' option.

   If you have multiple Texinfo files, and you want to use the
'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 'vers*.texi' just as an automatically generated
version file.

   Sometimes an info file actually depends on more than one '.texi'
file.  For instance, in GNU Hello, 'hello.texi' includes the file
'fdl.texi'.  You can tell Automake about these dependencies using the
'TEXI_TEXINFOS' variable.  Here is how GNU Hello does it:

     info_TEXINFOS = hello.texi
     hello_TEXINFOS = fdl.texi

   By default, Automake requires the file 'texinfo.tex' to appear in the
same directory as the 'Makefile.am' file that lists the '.texi' files.
If you used 'AC_CONFIG_AUX_DIR' in 'configure.ac' (*note Finding
'configure' Input: (autoconf)Input.), then 'texinfo.tex' is looked for
there.  In both cases, 'automake' then supplies 'texinfo.tex' if
'--add-missing' is given, and takes care of its distribution.  However,
if you set the '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 'no-texinfo.tex' can be used to eliminate the requirement
for the file 'texinfo.tex'.  Use of the variable 'TEXINFO_TEX' is
preferable, however, because that allows the 'dvi', 'ps', and 'pdf'
targets to still work.

   Automake generates an 'install-info' rule; some people apparently use
this.  By default, info pages are installed by 'make install', so
running 'make install-info' is pointless.  This can be prevented via the
'no-installinfo' option.  In this case, '.info' files are not installed
by default, and user must request this explicitly using 'make
install-info'.

   By default, 'make install-info' and 'make uninstall-info' will try to
run the 'install-info' program (if available) to update (or
create/remove) the '${infodir}/dir' index.  If this is undesired, it can
be prevented by exporting the 'AM_UPDATE_INFO_DIR' variable to "'no'".

   The following variables are used by the Texinfo build rules.

'MAKEINFO'
     The name of the program invoked to build '.info' files.  This
     variable is defined by Automake.  If the 'makeinfo' program is
     found on the system then it will be used by default; otherwise
     'missing' will be used instead.

'MAKEINFOHTML'
     The command invoked to build '.html' files.  Automake defines this
     to '$(MAKEINFO) --html'.

'MAKEINFOFLAGS'
     User flags passed to each invocation of '$(MAKEINFO)' and
     '$(MAKEINFOHTML)'.  This user variable (*note User Variables::) is
     not expected to be defined in any 'Makefile'; it can be used by
     users to pass extra flags to suit their needs.

'AM_MAKEINFOFLAGS'
'AM_MAKEINFOHTMLFLAGS'
     Maintainer flags passed to each 'makeinfo' invocation.  Unlike
     'MAKEINFOFLAGS', these variables are meant to be defined by
     maintainers in 'Makefile.am'.  '$(AM_MAKEINFOFLAGS)' is passed to
     'makeinfo' when building '.info' files; and
     '$(AM_MAKEINFOHTMLFLAGS)' is used when building '.html' files.

     For instance, the following setting can be used to obtain one
     single '.html' file per manual, without node separators.
          AM_MAKEINFOHTMLFLAGS = --no-headers --no-split

     'AM_MAKEINFOHTMLFLAGS' defaults to '$(AM_MAKEINFOFLAGS)'.  This
     means that defining 'AM_MAKEINFOFLAGS' without defining
     'AM_MAKEINFOHTMLFLAGS' will impact builds of both '.info' and
     '.html' files.

'TEXI2DVI'
     The name of the command that converts a '.texi' file into a '.dvi'
     file.  This defaults to 'texi2dvi', a script that ships with the
     Texinfo package.

'TEXI2PDF'
     The name of the command that translates a '.texi' file into a
     '.pdf' file.  This defaults to '$(TEXI2DVI) --pdf --batch'.

'DVIPS'
     The name of the command that builds a '.ps' file out of a '.dvi'
     file.  This defaults to 'dvips'.

'TEXINFO_TEX'

     If your package has Texinfo files in many directories, you can use
     the variable 'TEXINFO_TEX' to tell Automake where to find the
     canonical 'texinfo.tex' for your package.  The value of this
     variable should be the relative path from the current 'Makefile.am'
     to 'texinfo.tex':

          TEXINFO_TEX = ../doc/texinfo.tex


File: automake.info,  Node: Man Pages,  Prev: Texinfo,  Up: Documentation

11.2 Man Pages
==============

A package can also include man pages (but see the GNU standards on this
matter, *note (standards)Man Pages::.)  Man pages are declared using the
'MANS' primary.  Generally the 'man_MANS' variable is used.  Man pages
are automatically installed in the correct subdirectory of 'mandir',
based on the file extension.

   File extensions such as '.1c' are handled by looking for the valid
part of the extension and using that to determine the correct
subdirectory of 'mandir'.  Valid section names are the digits '0'
through '9', and the letters 'l' and 'n'.

   Sometimes developers prefer to name a man page something like
'foo.man' in the source, and then rename it to have the correct suffix,
for example 'foo.1', when installing the file.  Automake also supports
this mode.  For a valid section named SECTION, there is a corresponding
directory named 'manSECTIONdir', and a corresponding '_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:
     man1_MANS = rename.man thesame.1 alsothesame.1c

In this case, 'rename.man' will be renamed to 'rename.1' when installed,
but the other files will keep their names.

   By default, man pages are installed by '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
'no-installman' option will prevent the man pages from being installed
by default.  The user can still explicitly install them via 'make
install-man'.

   For fast installation, with many files it is preferable to use
'manSECTION_MANS' over '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 'dist_' prefix.  For instance here is how
to distribute and install the two man pages of GNU 'cpio' (which
includes both Texinfo documentation and man pages):

     dist_man_MANS = cpio.1 mt.1

   The 'nobase_' prefix is meaningless for man pages and is disallowed.

   Executables and manpages may be renamed upon installation (*note
Renaming::).  For manpages this can be avoided by use of the 'notrans_'
prefix.  For instance, suppose an executable 'foo' allowing to access a
library function 'foo' from the command line.  The way to avoid renaming
of the 'foo.3' manpage is:

     man_MANS = foo.1
     notrans_man_MANS = foo.3

   'notrans_' must be specified first when used in conjunction with
either 'dist_' or 'nodist_' (*note Fine-grained Distribution Control::).
For instance:

     notrans_dist_man3_MANS = bar.3


File: automake.info,  Node: Install,  Next: Clean,  Prev: Documentation,  Up: Top

12 What Gets Installed
**********************

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 '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


File: automake.info,  Node: Basics of Installation,  Next: The Two Parts of Install,  Up: Install

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

     bin_PROGRAMS = hello subdir/goodbye

   In this example, both 'hello' and 'goodbye' will be installed in
'$(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 'nobase_' prefix to suppress
the base name step.  For example:

     nobase_include_HEADERS = stdio.h sys/types.h

will install 'stdio.h' in '$(includedir)' and 'types.h' in
'$(includedir)/sys'.

   For most file types, Automake will install multiple files at once,
while avoiding command line length issues (*note Length Limitations::).
Since some '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 '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).


File: automake.info,  Node: The Two Parts of Install,  Next: Extending Installation,  Prev: Basics of Installation,  Up: Install

12.2 The Two Parts of Install
=============================

Automake generates separate 'install-data' and '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.  'install-exec' installs platform-dependent
files, and 'install-data' installs platform-independent files.  The
'install' target depends on both of these targets.  While Automake tries
to automatically segregate objects into the correct category, the
'Makefile.am' author is, in the end, responsible for making sure this is
done correctly.

   Variables using the standard directory prefixes 'data', 'info',
'man', 'include', 'oldinclude', 'pkgdata', or 'pkginclude' are installed
by 'install-data'.

   Variables using the standard directory prefixes 'bin', 'sbin',
'libexec', 'sysconf', 'localstate', 'lib', or 'pkglib' are installed by
'install-exec'.

   For instance, 'data_DATA' files are installed by 'install-data',
while 'bin_PROGRAMS' files are installed by 'install-exec'.

   Any variable using a user-defined directory prefix with 'exec' in the
name (e.g., 'myexecbin_PROGRAMS') is installed by 'install-exec'.  All
other user-defined prefixes are installed by 'install-data'.


File: automake.info,  Node: Extending Installation,  Next: Staged Installs,  Prev: The Two Parts of Install,  Up: Install

12.3 Extending Installation
===========================

It is possible to extend this mechanism by defining an
'install-exec-local' or 'install-data-local' rule.  If these rules
exist, they will be run at 'make install' time.  These rules can do
almost anything; care is required.

   Automake also supports two install hooks, 'install-exec-hook' and
'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.  *Note Extending::, for some examples.


File: automake.info,  Node: Staged Installs,  Next: Install Rules for the User,  Prev: Extending Installation,  Up: Install

12.4 Staged Installs
====================

Automake generates support for the 'DESTDIR' variable in all install
rules.  'DESTDIR' is used during the 'make install' step to relocate
install objects into a staging area.  Each object and path is prefixed
with the value of 'DESTDIR' before being copied into the install area.
Here is an example of typical DESTDIR usage:

     mkdir /tmp/staging &&
     make DESTDIR=/tmp/staging install

   The 'mkdir' command avoids a security problem if the attacker creates
a symbolic link from '/tmp/staging' to a victim area; then 'make' places
install objects in a directory tree built under '/tmp/staging'.  If
'/gnu/bin/foo' and '/gnu/share/aclocal/foo.m4' are to be installed, the
above command would install '/tmp/staging/gnu/bin/foo' and
'/tmp/staging/gnu/share/aclocal/foo.m4'.

   This feature is commonly used to build install images and packages
(*note DESTDIR::).

   Support for 'DESTDIR' is implemented by coding it directly into the
install rules.  If your 'Makefile.am' uses a local install rule (e.g.,
'install-exec-local') or an install hook, then you must write that code
to respect 'DESTDIR'.

   *Note (standards)Makefile Conventions::, for another usage example.


File: automake.info,  Node: Install Rules for the User,  Prev: Staged Installs,  Up: Install

12.5 Install Rules for the User
===============================

Automake also generates rules for targets 'uninstall', 'installdirs',
and 'install-strip'.

   Automake supports 'uninstall-local' and 'uninstall-hook'.  There is
no notion of separate uninstalls for "exec" and "data", as these
features would not provide additional functionality.

   Note that 'uninstall' is not meant as a replacement for a real
packaging tool.


File: automake.info,  Node: Clean,  Next: Dist,  Prev: Install,  Up: Top

13 What Gets Cleaned
********************

The GNU Makefile Standards specify a number of different clean rules.
*Note Standard Targets for Users: (standards)Standard Targets.

   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 'MOSTLYCLEANFILES', 'CLEANFILES', 'DISTCLEANFILES', and
'MAINTAINERCLEANFILES'.

   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 'mostlyclean-local',
'clean-local', 'distclean-local', or 'maintainer-clean-local' targets
(*note Extending::).  A common case is deleting a directory, for
instance, a directory created by the test suite:

     clean-local:
             -rm -rf testSubDir

   Since '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:

     clean-local: clean-local-check
     .PHONY: clean-local-check
     clean-local-check:
             -rm -rf testSubDir

   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 Franc,ois Pinard:

   * If 'make' built it, and it is commonly something that one would
     want to rebuild (for instance, a '.o' file), then 'mostlyclean'
     should delete it.

   * Otherwise, if 'make' built it, then 'clean' should delete it.

   * If 'configure' built it, then 'distclean' should delete it.

   * If the maintainer built it (for instance, a '.info' file), then
     'maintainer-clean' should delete it.  However 'maintainer-clean'
     should not delete anything that needs to exist in order to run
     './configure && make'.

   We recommend that you follow this same set of heuristics in your
'Makefile.am'.


File: automake.info,  Node: Dist,  Next: Tests,  Prev: Clean,  Up: Top

14 What Goes in a Distribution
******************************

* Menu:

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


File: automake.info,  Node: Basics of Distribution,  Next: Fine-grained Distribution Control,  Up: Dist

14.1 Basics of Distribution
===========================

The 'dist' rule in the generated 'Makefile.in' can be used to generate a
gzipped 'tar' file and other flavors of archive for distribution.  The
file is named based on the 'PACKAGE' and 'VERSION' variables defined by
'AM_INIT_AUTOMAKE' (*note Macros::); more precisely the gzipped 'tar'
file is named 'PACKAGE-VERSION.tar.gz'.  You can use the 'make' variable
'GZIP_ENV' to control how gzip is run.  The default setting is '--best'.

   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 'Makefile.am' and '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 'Makefile.am' rule); this list is printed by 'automake
--help'.  Note that some files in this list are actually distributed
only if other certain conditions hold (for example, the 'config.h.top'
and 'config.h.bot' files are automatically distributed only if, e.g.,
'AC_CONFIG_HEADERS([config.h])' is used in 'configure.ac').  Also, files
that are read by 'configure' (i.e. the source files corresponding to the
files specified in various Autoconf macros such as 'AC_CONFIG_FILES' and
siblings) are automatically distributed.  Files included in a
'Makefile.am' (using 'include') or in 'configure.ac' (using
'm4_include'), and helper scripts installed with 'automake
--add-missing' are also distributed.

   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 'EXTRA_DIST' variable.  You can mention files from subdirectories in
'EXTRA_DIST'.

   You can also mention a directory in 'EXTRA_DIST'; in this case the
entire directory will be recursively copied into the distribution.
Please note that this will also copy _everything_ in the directory,
including, e.g., Subversion's '.svn' private directories or CVS/RCS
version control files; thus we recommend against using this feature
as-is.  However, you can use the 'dist-hook' feature to ameliorate the
problem; *note The dist Hook::.

   If you define 'SUBDIRS', Automake will recursively include the
subdirectories in the distribution.  If 'SUBDIRS' is defined
conditionally (*note Conditionals::), Automake will normally include all
directories that could possibly appear in 'SUBDIRS' in the distribution.
If you need to specify the set of directories conditionally, you can set
the variable 'DIST_SUBDIRS' to the exact list of subdirectories to
include in the distribution (*note Conditional Subdirectories::).


File: automake.info,  Node: Fine-grained Distribution Control,  Next: The dist Hook,  Prev: Basics of Distribution,  Up: Dist

14.2 Fine-grained Distribution Control
======================================

Sometimes you need tighter control over what does _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 'dist' and 'nodist' prefixes.  Any
primary or '_SOURCES' variable can be prefixed with 'dist_' to add the
listed files to the distribution.  Similarly, '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:

     dist_data_DATA = distribute-this
     bin_PROGRAMS = foo
     nodist_foo_SOURCES = do-not-distribute.c


File: automake.info,  Node: The dist Hook,  Next: Checking the Distribution,  Prev: Fine-grained Distribution Control,  Up: Dist

14.3 The dist Hook
==================

Occasionally it is useful to be able to change the distribution before
it is packaged up.  If the '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
'EXTRA_DIST':

     EXTRA_DIST = doc
     dist-hook:
             rm -rf `find $(distdir)/doc -type d -name .svn`

Note that the '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 '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 'EXTRA_DIST' are writable.  So, if the
'dist-hook' recipe wants to modify the content of an existing file (or
'EXTRA_DIST' subdirectory) in the distribution directory, it should
explicitly to make it writable first:

     EXTRA_DIST = README doc
     dist-hook:
             chmod u+w $(distdir)/README $(distdir)/doc
             echo "Distribution date: `date`" >> README
             rm -f $(distdir)/doc/HACKING

   Two variables that come handy when writing 'dist-hook' rules are
'$(distdir)' and '$(top_distdir)'.

   '$(distdir)' points to the directory where the 'dist' rule will copy
files from the current directory before creating the tarball.  If you
are at the top-level directory, then 'distdir = $(PACKAGE)-$(VERSION)'.
When used from subdirectory named 'foo/', then 'distdir =
../$(PACKAGE)-$(VERSION)/foo'.  '$(distdir)' can be a relative or
absolute path, do not assume any form.

   '$(top_distdir)' always points to the root directory of the
distributed tree.  At the top-level it's equal to '$(distdir)'.  In the
'foo/' subdirectory 'top_distdir = ../$(PACKAGE)-$(VERSION)'.
'$(top_distdir)' too can be a relative or absolute path.

   Note that when packages are nested using 'AC_CONFIG_SUBDIRS' (*note
Subpackages::), then '$(distdir)' and '$(top_distdir)' are relative to
the package where 'make dist' was run, not to any sub-packages involved.


File: automake.info,  Node: Checking the Distribution,  Next: The Types of Distributions,  Prev: The dist Hook,  Up: Dist

14.4 Checking the Distribution
==============================

Automake also generates a '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, _operating from it_,
takes the following steps:
   * tries to do a 'VPATH' build (*note VPATH Builds::), with the
     'srcdir' and all its content made _read-only_;
   * runs the test suite (with 'make check') on this fresh build;
   * installs the package in a temporary directory (with 'make
     install'), and tries runs the test suite on the resulting
     installation (with 'make installcheck');
   * checks that the package can be correctly uninstalled (by 'make
     uninstall') and cleaned (by 'make distclean');
   * finally, makes another tarball to ensure the distribution is
     self-contained.

DISTCHECK_CONFIGURE_FLAGS
-------------------------

Building the package involves running './configure'.  If you need to
supply additional flags to 'configure', define them in the
'AM_DISTCHECK_CONFIGURE_FLAGS' variable in your top-level 'Makefile.am'.
The user can still extend or override the flags provided there by
defining the 'DISTCHECK_CONFIGURE_FLAGS' variable, on the command line
when invoking 'make'.  It's worth nothing that 'make distcheck' needs
complete control over the 'configure' options '--srcdir' and '--prefix',
so those options cannot be overridden by 'AM_DISTCHECK_CONFIGURE_FLAGS'
nor by '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 'AM_DISTCHECK_CONFIGURE_FLAGS'.  However,
there might be few scenarios in which the use of this variable is
justified.  GNU 'm4' offers an example.  GNU 'm4' configures by default
with its experimental and seldom used "changeword" feature disabled; so
in its case it is useful to have 'make distcheck' run configure with the
'--with-changeword' option, to ensure that the code for changeword
support still compiles correctly.  GNU 'm4' also employs the
'AM_DISTCHECK_CONFIGURE_FLAGS' variable to stress-test the use of
'--program-prefix=g', since at one point the 'm4' build system had a bug
where 'make installcheck' was wrongly assuming it could blindly test
"'m4'", rather than the just-installed "'gm4'".

distcheck-hook
--------------

If the 'distcheck-hook' rule is defined in your top-level 'Makefile.am',
then it will be invoked by 'distcheck' after the new distribution has
been unpacked, but before the unpacked copy is configured and built.
Your '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
'distcheck-hook' as well as 'AM_DISTCHECK_CONFIGURE_FLAGS' and
'DISTCHECK_CONFIGURE_FLAGS' are not honored in a subpackage
'Makefile.am', but the flags from 'AM_DISTCHECK_CONFIGURE_FLAGS' and
'DISTCHECK_CONFIGURE_FLAGS' are passed down to the 'configure' script of
the subpackage.

distcleancheck
--------------

Speaking of potential distribution errors, 'distcheck' also ensures that
the 'distclean' rule actually removes all built files.  This is done by
running 'make distcleancheck' at the end of the 'VPATH' build.  By
default, 'distcleancheck' will run 'distclean' and then make sure the
build tree has been emptied by running '$(distcleancheck_listfiles)'.
Usually this check will find generated files that you forgot to add to
the 'DISTCLEANFILES' variable (*note Clean::).

   The 'distcleancheck' behavior should be OK for most packages,
otherwise you have the possibility to override the definition of either
the 'distcleancheck' rule, or the '$(distcleancheck_listfiles)'
variable.  For instance, to disable 'distcleancheck' completely, add the
following rule to your top-level 'Makefile.am':

     distcleancheck:
             @:

   If you want 'distcleancheck' to ignore built files that have not been
cleaned because they are also part of the distribution, add the
following definition instead:

     distcleancheck_listfiles = \
       find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
            sh '{}' ';'

   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 (*note Errors with distclean::), make sure
you read it before playing with 'distcleancheck_listfiles'.

distuninstallcheck
------------------

'distcheck' also checks that the 'uninstall' rule works properly, both
for ordinary and 'DESTDIR' builds.  It does this by invoking '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
'uninstall'-related rules.

   By default, the checking is done by the 'distuninstallcheck' rule,
and the list of files in the install tree is generated by
'$(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
'distcheck'.  For instance, to disable this check completely, you would
write:

     distuninstallcheck:
             @:

