13216 lines
502 KiB
Plaintext
13216 lines
502 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
||
@c %**start of header
|
||
@setfilename automake.info
|
||
@settitle automake
|
||
@documentencoding UTF-8
|
||
@documentlanguage en
|
||
@setchapternewpage off
|
||
@c %**end of header
|
||
|
||
@include version.texi
|
||
|
||
@c @ovar(ARG, DEFAULT)
|
||
@c -------------------
|
||
@c The ARG is an optional argument. To be used for macro arguments in
|
||
@c their documentation (@defmac).
|
||
@macro ovar{varname}
|
||
@r{[}@var{\varname\}@r{]}
|
||
@end macro
|
||
|
||
@set PACKAGE_BUGREPORT bug-automake@@gnu.org
|
||
|
||
@copying
|
||
|
||
This manual is for GNU Automake (version @value{VERSION},
|
||
@value{UPDATED}), a program that creates GNU standards-compliant
|
||
Makefiles from template files.
|
||
|
||
Copyright @copyright{} 1995-2017 Free Software Foundation, Inc.
|
||
|
||
@quotation
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License,
|
||
Version 1.3 or any later version published by the Free Software
|
||
Foundation; with no Invariant Sections, with no Front-Cover texts,
|
||
and with no Back-Cover Texts. A copy of the license is included in the
|
||
section entitled ``GNU Free Documentation License.''
|
||
|
||
@end quotation
|
||
@end copying
|
||
|
||
@dircategory Software development
|
||
@direntry
|
||
* Automake: (automake). Making GNU standards-compliant Makefiles.
|
||
@end direntry
|
||
|
||
@dircategory Individual utilities
|
||
@direntry
|
||
* aclocal-invocation: (automake)aclocal Invocation. Generating aclocal.m4.
|
||
* automake-invocation: (automake)automake Invocation. Generating Makefile.in.
|
||
@end direntry
|
||
|
||
@titlepage
|
||
@title GNU Automake
|
||
@subtitle For version @value{VERSION}, @value{UPDATED}
|
||
@author David MacKenzie
|
||
@author Tom Tromey
|
||
@author Alexandre Duret-Lutz
|
||
@author Ralf Wildenhues
|
||
@author Stefano Lattarini
|
||
@page
|
||
@vskip 0pt plus 1filll
|
||
@insertcopying
|
||
@end titlepage
|
||
|
||
@contents
|
||
|
||
@c We use the following macros to define indices:
|
||
@c @cindex concepts, and anything that does not fit elsewhere
|
||
@c @vindex Makefile variables
|
||
@c @trindex targets
|
||
@c @acindex Autoconf/Automake/Libtool/M4/... macros
|
||
@c @opindex tool options
|
||
|
||
@c Define an index of configure macros.
|
||
@defcodeindex ac
|
||
@c Define an index of options.
|
||
@defcodeindex op
|
||
@c Define an index of targets.
|
||
@defcodeindex tr
|
||
@c Define an index of commands.
|
||
@defcodeindex cm
|
||
|
||
@c Put the macros in the function index.
|
||
@syncodeindex ac fn
|
||
|
||
@c Put everything else into one index (arbitrarily chosen to be the
|
||
@c concept index).
|
||
@syncodeindex op cp
|
||
@syncodeindex tr cp
|
||
@syncodeindex cm cp
|
||
|
||
@ifnottex
|
||
@node Top
|
||
@comment node-name, next, previous, up
|
||
@top GNU Automake
|
||
|
||
@insertcopying
|
||
|
||
@menu
|
||
* Introduction:: Automake's purpose
|
||
* Autotools Introduction:: An Introduction to the Autotools
|
||
* Generalities:: General ideas
|
||
* Examples:: Some example packages
|
||
* automake Invocation:: Creating a Makefile.in
|
||
* configure:: Scanning configure.ac, using aclocal
|
||
* Directories:: Declaring subdirectories
|
||
* Programs:: Building programs and libraries
|
||
* Other Objects:: Other derived objects
|
||
* Other GNU Tools:: Other GNU Tools
|
||
* Documentation:: Building documentation
|
||
* Install:: What gets installed
|
||
* Clean:: What gets cleaned
|
||
* Dist:: What goes in a distribution
|
||
* Tests:: Support for test suites
|
||
* Rebuilding:: Automatic rebuilding of Makefile
|
||
* Options:: Changing Automake's behavior
|
||
* Miscellaneous:: Miscellaneous rules
|
||
* Include:: Including extra files in an Automake template
|
||
* Conditionals:: Conditionals
|
||
* Silencing Make:: Obtain less verbose output from @command{make}
|
||
* Gnits:: The effect of @option{--gnu} and @option{--gnits}
|
||
* Not Enough:: When Automake is not Enough
|
||
* Distributing:: Distributing the Makefile.in
|
||
* API Versioning:: About compatibility between Automake versions
|
||
* Upgrading:: Upgrading to a Newer Automake Version
|
||
* FAQ:: Frequently Asked Questions
|
||
* Copying This Manual:: How to make copies of this manual
|
||
* Indices:: Indices of variables, macros, and concepts
|
||
|
||
@detailmenu
|
||
--- The Detailed Node Listing ---
|
||
|
||
An Introduction to the Autotools
|
||
|
||
* GNU Build System:: Introducing the GNU Build System
|
||
* Use Cases:: Use Cases for the GNU Build System
|
||
* Why Autotools:: How Autotools Help
|
||
* Hello World:: A Small Hello World Package
|
||
|
||
Use Cases for the GNU Build System
|
||
|
||
* Basic Installation:: Common installation procedure
|
||
* Standard Targets:: A list of standard Makefile targets
|
||
* Standard Directory Variables:: A list of standard directory variables
|
||
* Standard Configuration Variables:: Using configuration variables
|
||
* config.site:: Using a config.site file
|
||
* VPATH Builds:: Parallel build trees
|
||
* Two-Part Install:: Installing data and programs separately
|
||
* Cross-Compilation:: Building for other architectures
|
||
* Renaming:: Renaming programs at install time
|
||
* DESTDIR:: Building binary packages with DESTDIR
|
||
* Preparing Distributions:: Rolling out tarballs
|
||
* Dependency Tracking:: Automatic dependency tracking
|
||
* Nested Packages:: The GNU Build Systems can be nested
|
||
|
||
A Small Hello World
|
||
|
||
* Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch
|
||
* amhello's configure.ac Setup Explained::
|
||
* amhello's Makefile.am Setup Explained::
|
||
|
||
General ideas
|
||
|
||
* General Operation:: General operation of Automake
|
||
* Strictness:: Standards conformance checking
|
||
* Uniform:: The Uniform Naming Scheme
|
||
* Length Limitations:: Staying below the command line length limit
|
||
* Canonicalization:: How derived variables are named
|
||
* User Variables:: Variables reserved for the user
|
||
* Auxiliary Programs:: Programs automake might require
|
||
|
||
Some example packages
|
||
|
||
* Complete:: A simple example, start to finish
|
||
* true:: Building true and false
|
||
|
||
Scanning @file{configure.ac}, using @command{aclocal}
|
||
|
||
* Requirements:: Configuration requirements
|
||
* Optional:: Other things Automake recognizes
|
||
* aclocal Invocation:: Auto-generating aclocal.m4
|
||
* Macros:: Autoconf macros supplied with Automake
|
||
|
||
Auto-generating aclocal.m4
|
||
|
||
* aclocal Options:: Options supported by aclocal
|
||
* Macro Search Path:: How aclocal finds .m4 files
|
||
* Extending aclocal:: Writing your own aclocal macros
|
||
* Local Macros:: Organizing local macros
|
||
* Serials:: Serial lines in Autoconf macros
|
||
* Future of aclocal:: aclocal's scheduled death
|
||
|
||
Autoconf macros supplied with Automake
|
||
|
||
* Public Macros:: Macros that you can use.
|
||
* Private Macros:: Macros that you should not use.
|
||
|
||
Directories
|
||
|
||
* Subdirectories:: Building subdirectories recursively
|
||
* Conditional Subdirectories:: Conditionally not building directories
|
||
* Alternative:: Subdirectories without recursion
|
||
* Subpackages:: Nesting packages
|
||
|
||
Conditional Subdirectories
|
||
|
||
* SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
|
||
* Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
|
||
* Subdirectories with AC_SUBST:: Another way for conditional recursion
|
||
* Unconfigured Subdirectories:: Not even creating a @samp{Makefile}
|
||
|
||
Building Programs and Libraries
|
||
|
||
* A Program:: Building a program
|
||
* A Library:: Building a library
|
||
* A Shared Library:: Building a Libtool library
|
||
* Program and Library Variables:: Variables controlling program and
|
||
library builds
|
||
* Default _SOURCES:: Default source files
|
||
* LIBOBJS:: Special handling for LIBOBJS and ALLOCA
|
||
* Program Variables:: Variables used when building a program
|
||
* Yacc and Lex:: Yacc and Lex support
|
||
* C++ Support:: Compiling C++ sources
|
||
* Objective C Support:: Compiling Objective C sources
|
||
* Objective C++ Support:: Compiling Objective C++ sources
|
||
* Unified Parallel C Support:: Compiling Unified Parallel C sources
|
||
* Assembly Support:: Compiling assembly sources
|
||
* Fortran 77 Support:: Compiling Fortran 77 sources
|
||
* Fortran 9x Support:: Compiling Fortran 9x sources
|
||
* Java Support with gcj:: Compiling Java sources using gcj
|
||
* Vala Support:: Compiling Vala sources
|
||
* Support for Other Languages:: Compiling other languages
|
||
* Dependencies:: Automatic dependency tracking
|
||
* EXEEXT:: Support for executable extensions
|
||
|
||
Building a program
|
||
|
||
* Program Sources:: Defining program sources
|
||
* Linking:: Linking with libraries or extra objects
|
||
* Conditional Sources:: Handling conditional sources
|
||
* Conditional Programs:: Building a program conditionally
|
||
|
||
Building a Shared Library
|
||
|
||
* Libtool Concept:: Introducing Libtool
|
||
* Libtool Libraries:: Declaring Libtool Libraries
|
||
* Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
|
||
* Conditional Libtool Sources:: Choosing Library Sources Conditionally
|
||
* Libtool Convenience Libraries:: Building Convenience Libtool Libraries
|
||
* Libtool Modules:: Building Libtool Modules
|
||
* Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
|
||
* LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
|
||
* Libtool Issues:: Common Issues Related to Libtool's Use
|
||
|
||
Common Issues Related to Libtool's Use
|
||
|
||
* Error required file ltmain.sh not found:: The need to run libtoolize
|
||
* Objects created both with libtool and without:: Avoid a specific build race
|
||
|
||
Fortran 77 Support
|
||
|
||
* Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
|
||
* Compiling Fortran 77 Files:: Compiling Fortran 77 sources
|
||
* Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
|
||
|
||
Mixing Fortran 77 With C and C++
|
||
|
||
* How the Linker is Chosen:: Automatic linker selection
|
||
|
||
Fortran 9x Support
|
||
|
||
* Compiling Fortran 9x Files:: Compiling Fortran 9x sources
|
||
|
||
Other Derived Objects
|
||
|
||
* Scripts:: Executable scripts
|
||
* Headers:: Header files
|
||
* Data:: Architecture-independent data files
|
||
* Sources:: Derived sources
|
||
|
||
Built Sources
|
||
|
||
* Built Sources Example:: Several ways to handle built sources.
|
||
|
||
Other GNU Tools
|
||
|
||
* Emacs Lisp:: Emacs Lisp
|
||
* gettext:: Gettext
|
||
* Libtool:: Libtool
|
||
* Java:: Java bytecode compilation (deprecated)
|
||
* Python:: Python
|
||
|
||
Building documentation
|
||
|
||
* Texinfo:: Texinfo
|
||
* Man Pages:: Man pages
|
||
|
||
What Gets Installed
|
||
|
||
* Basics of Installation:: What gets installed where
|
||
* The Two Parts of Install:: Installing data and programs separately
|
||
* Extending Installation:: Adding your own rules for installation
|
||
* Staged Installs:: Installation in a temporary location
|
||
* Install Rules for the User:: Useful additional rules
|
||
|
||
What Goes in a Distribution
|
||
|
||
* Basics of Distribution:: Files distributed by default
|
||
* Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes
|
||
* The dist Hook:: A target for last-minute distribution changes
|
||
* Checking the Distribution:: @samp{make distcheck} explained
|
||
* The Types of Distributions:: A variety of formats and compression methods
|
||
|
||
Support for test suites
|
||
|
||
* Generalities about Testing:: Generic concepts and terminology about testing
|
||
* Simple Tests:: Listing test scripts in @code{TESTS}
|
||
* Custom Test Drivers:: Writing and using custom test drivers
|
||
* Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
|
||
* DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework
|
||
* Install Tests:: Running tests on installed packages
|
||
|
||
Simple Tests
|
||
|
||
* Scripts-based Testsuites:: Automake-specific concepts and terminology
|
||
* Serial Test Harness:: Older (and discouraged) serial test harness
|
||
* Parallel Test Harness:: Generic concurrent test harness
|
||
|
||
Using the TAP test protocol
|
||
|
||
* Introduction to TAP::
|
||
* Use TAP with the Automake test harness::
|
||
* Incompatibilities with other TAP parsers and drivers::
|
||
* Links and external resources on TAP::
|
||
|
||
Custom Test Drivers
|
||
|
||
* Overview of Custom Test Drivers Support::
|
||
* Declaring Custom Test Drivers::
|
||
* API for Custom Test Drivers::
|
||
|
||
API for Custom Test Drivers
|
||
|
||
* Command-line arguments for test drivers::
|
||
* Log files generation and test results recording::
|
||
* Testsuite progress output::
|
||
|
||
Changing Automake's Behavior
|
||
|
||
* Options generalities:: Semantics of Automake option
|
||
* List of Automake options:: A comprehensive list of Automake options
|
||
|
||
Miscellaneous Rules
|
||
|
||
* Tags:: Interfacing to cscope, etags and mkid
|
||
* Suffixes:: Handling new file extensions
|
||
|
||
Conditionals
|
||
|
||
* Usage of Conditionals:: Declaring conditional content
|
||
* Limits of Conditionals:: Enclosing complete statements
|
||
|
||
Silencing Make
|
||
|
||
* Make verbosity:: Make is verbose by default
|
||
* Tricks For Silencing Make:: Standard and generic ways to silence make
|
||
* Automake Silent Rules:: How Automake can help in silencing make
|
||
|
||
When Automake Isn't Enough
|
||
|
||
* Extending:: Adding new rules or overriding existing ones.
|
||
* Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s.
|
||
|
||
Frequently Asked Questions about Automake
|
||
|
||
* CVS:: CVS and generated files
|
||
* maintainer-mode:: missing and AM_MAINTAINER_MODE
|
||
* Wildcards:: Why doesn't Automake support wildcards?
|
||
* Limitations on File Names:: Limitations on source and installed file names
|
||
* Errors with distclean:: Files left in build directory after distclean
|
||
* Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
|
||
* Renamed Objects:: Why are object files sometimes renamed?
|
||
* Per-Object Flags:: How to simulate per-object flags?
|
||
* Multiple Outputs:: Writing rules for tools with many output files
|
||
* Hard-Coded Install Paths:: Installing to hard-coded locations
|
||
* Debugging Make Rules:: Strategies when things don't work as expected
|
||
* Reporting Bugs:: Feedback on bugs and feature requests
|
||
|
||
Copying This Manual
|
||
|
||
* GNU Free Documentation License:: License for copying this manual
|
||
|
||
Indices
|
||
|
||
* Macro Index:: Index of Autoconf macros
|
||
* Variable Index:: Index of Makefile variables
|
||
* General Index:: General index
|
||
|
||
@end detailmenu
|
||
@end menu
|
||
|
||
@end ifnottex
|
||
|
||
|
||
@node Introduction
|
||
@chapter Introduction
|
||
|
||
Automake is a tool for automatically generating @file{Makefile.in}s
|
||
from files called @file{Makefile.am}. Each @file{Makefile.am} is
|
||
basically a series of @command{make} variable
|
||
definitions@footnote{These variables are also called @dfn{make macros}
|
||
in Make terminology, however in this manual we reserve the term
|
||
@dfn{macro} for Autoconf's macros.}, with rules being thrown in
|
||
occasionally. The generated @file{Makefile.in}s are compliant with
|
||
the GNU Makefile standards.
|
||
|
||
@cindex GNU Makefile standards
|
||
|
||
The GNU Makefile Standards Document
|
||
(@pxref{Makefile Conventions, , , standards, The GNU Coding Standards})
|
||
is long, complicated, and subject to change. The goal of Automake is to
|
||
remove the burden of Makefile maintenance from the back of the
|
||
individual GNU maintainer (and put it on the back of the Automake
|
||
maintainers).
|
||
|
||
The typical Automake input file is simply a series of variable definitions.
|
||
Each such file is processed to create a @file{Makefile.in}.
|
||
|
||
@cindex Constraints of Automake
|
||
@cindex Automake constraints
|
||
|
||
Automake does constrain a project in certain ways; for instance, it
|
||
assumes that the project uses Autoconf (@pxref{Top, , Introduction,
|
||
autoconf, The Autoconf Manual}), and enforces certain restrictions on
|
||
the @file{configure.ac} contents.
|
||
|
||
@cindex Automake requirements
|
||
@cindex Requirements, Automake
|
||
|
||
Automake requires @command{perl} in order to generate the
|
||
@file{Makefile.in}s. However, the distributions created by Automake are
|
||
fully GNU standards-compliant, and do not require @command{perl} in order
|
||
to be built.
|
||
|
||
@cindex Bugs, reporting
|
||
@cindex Reporting bugs
|
||
@cindex E-mail, bug reports
|
||
|
||
For more information on bug reports, @xref{Reporting Bugs}.
|
||
|
||
@node Autotools Introduction
|
||
@chapter An Introduction to the Autotools
|
||
|
||
If you are new to Automake, maybe you know that it is part of a set of
|
||
tools called @emph{The Autotools}. Maybe you've already delved into a
|
||
package full of files named @file{configure}, @file{configure.ac},
|
||
@file{Makefile.in}, @file{Makefile.am}, @file{aclocal.m4}, @dots{},
|
||
some of them claiming to be @emph{generated by} Autoconf or Automake.
|
||
But the exact purpose of these files and their relations is probably
|
||
fuzzy. The goal of this chapter is to introduce you to this machinery,
|
||
to show you how it works and how powerful it is. If you've never
|
||
installed or seen such a package, do not worry: this chapter will walk
|
||
you through it.
|
||
|
||
If you need some teaching material, more illustrations, or a less
|
||
@command{automake}-centered continuation, some slides for this
|
||
introduction are available in Alexandre Duret-Lutz's
|
||
@uref{http://www.lrde.epita.fr/@/~adl/@/autotools.html,
|
||
Autotools Tutorial}.
|
||
This chapter is the written version of the first part of his tutorial.
|
||
|
||
@menu
|
||
* GNU Build System:: Introducing the GNU Build System
|
||
* Use Cases:: Use Cases for the GNU Build System
|
||
* Why Autotools:: How Autotools Help
|
||
* Hello World:: A Small Hello World Package
|
||
@end menu
|
||
|
||
@node GNU Build System
|
||
@section Introducing the GNU Build System
|
||
@cindex GNU Build System, introduction
|
||
|
||
It is a truth universally acknowledged, that as a developer in
|
||
possession of a new package, you must be in want of a build system.
|
||
|
||
In the Unix world, such a build system is traditionally achieved using
|
||
the command @command{make} (@pxref{Top, , Overview, make, The GNU Make
|
||
Manual}). You express the recipe to build your package in a
|
||
@file{Makefile}. This file is a set of rules to build the files in
|
||
the package. For instance the program @file{prog} may be built by
|
||
running the linker on the files @file{main.o}, @file{foo.o}, and
|
||
@file{bar.o}; the file @file{main.o} may be built by running the
|
||
compiler on @file{main.c}; etc. Each time @command{make} is run, it
|
||
reads @file{Makefile}, checks the existence and modification time of
|
||
the files mentioned, decides what files need to be built (or rebuilt),
|
||
and runs the associated commands.
|
||
|
||
When a package needs to be built on a different platform than the one
|
||
it was developed on, its @file{Makefile} usually needs to be adjusted.
|
||
For instance the compiler may have another name or require more
|
||
options. In 1991, David J. MacKenzie got tired of customizing
|
||
@file{Makefile} for the 20 platforms he had to deal with. Instead, he
|
||
handcrafted a little shell script called @file{configure} to
|
||
automatically adjust the @file{Makefile} (@pxref{Genesis, , Genesis,
|
||
autoconf, The Autoconf Manual}). Compiling his package was now
|
||
as simple as running @code{./configure && make}.
|
||
|
||
@cindex GNU Coding Standards
|
||
|
||
Today this process has been standardized in the GNU project. The GNU
|
||
Coding Standards (@pxref{Managing Releases, The Release Process, ,
|
||
standards, The GNU Coding Standards}) explains how each package of the
|
||
GNU project should have a @file{configure} script, and the minimal
|
||
interface it should have. The @file{Makefile} too should follow some
|
||
established conventions. The result? A unified build system that
|
||
makes all packages almost indistinguishable by the installer. In its
|
||
simplest scenario, all the installer has to do is to unpack the
|
||
package, run @code{./configure && make && make install}, and repeat
|
||
with the next package to install.
|
||
|
||
We call this build system the @dfn{GNU Build System}, since it was
|
||
grown out of the GNU project. However it is used by a vast number of
|
||
other packages: following any existing convention has its advantages.
|
||
|
||
@cindex Autotools, introduction
|
||
|
||
The Autotools are tools that will create a GNU Build System for your
|
||
package. Autoconf mostly focuses on @file{configure} and Automake on
|
||
@file{Makefile}s. It is entirely possible to create a GNU Build
|
||
System without the help of these tools. However it is rather
|
||
burdensome and error-prone. We will discuss this again after some
|
||
illustration of the GNU Build System in action.
|
||
|
||
@node Use Cases
|
||
@section Use Cases for the GNU Build System
|
||
@cindex GNU Build System, use cases
|
||
@cindex GNU Build System, features
|
||
@cindex Features of the GNU Build System
|
||
@cindex Use Cases for the GNU Build System
|
||
@cindex @file{amhello-1.0.tar.gz}, location
|
||
@cindex @file{amhello-1.0.tar.gz}, use cases
|
||
|
||
In this section we explore several use cases for the GNU Build System.
|
||
You can replay all of these examples on the @file{amhello-1.0.tar.gz}
|
||
package distributed with Automake. If Automake is installed on your
|
||
system, you should find a copy of this file in
|
||
@file{@var{prefix}/share/doc/automake/amhello-1.0.tar.gz}, where
|
||
@var{prefix} is the installation prefix specified during configuration
|
||
(@var{prefix} defaults to @file{/usr/local}, however if Automake was
|
||
installed by some GNU/Linux distribution it most likely has been set
|
||
to @file{/usr}). If you do not have a copy of Automake installed,
|
||
you can find a copy of this file inside the @file{doc/} directory of
|
||
the Automake package.
|
||
|
||
Some of the following use cases present features that are in fact
|
||
extensions to the GNU Build System. Read: they are not specified by
|
||
the GNU Coding Standards, but they are nonetheless part of the build
|
||
system created by the Autotools. To keep things simple, we do not
|
||
point out the difference. Our objective is to show you many of the
|
||
features that the build system created by the Autotools will offer to
|
||
you.
|
||
|
||
@menu
|
||
* Basic Installation:: Common installation procedure
|
||
* Standard Targets:: A list of standard Makefile targets
|
||
* Standard Directory Variables:: A list of standard directory variables
|
||
* Standard Configuration Variables:: Using configuration variables
|
||
* config.site:: Using a config.site file
|
||
* VPATH Builds:: Parallel build trees
|
||
* Two-Part Install:: Installing data and programs separately
|
||
* Cross-Compilation:: Building for other architectures
|
||
* Renaming:: Renaming programs at install time
|
||
* DESTDIR:: Building binary packages with DESTDIR
|
||
* Preparing Distributions:: Rolling out tarballs
|
||
* Dependency Tracking:: Automatic dependency tracking
|
||
* Nested Packages:: The GNU Build Systems can be nested
|
||
@end menu
|
||
|
||
@node Basic Installation
|
||
@subsection Basic Installation
|
||
@cindex Configuration, basics
|
||
@cindex Installation, basics
|
||
@cindex GNU Build System, basics
|
||
|
||
The most common installation procedure looks as follows.
|
||
|
||
@example
|
||
~ % @kbd{tar zxf amhello-1.0.tar.gz}
|
||
~ % @kbd{cd amhello-1.0}
|
||
~/amhello-1.0 % @kbd{./configure}
|
||
@dots{}
|
||
config.status: creating Makefile
|
||
config.status: creating src/Makefile
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make check}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{su}
|
||
Password:
|
||
/home/adl/amhello-1.0 # @kbd{make install}
|
||
@dots{}
|
||
/home/adl/amhello-1.0 # @kbd{exit}
|
||
~/amhello-1.0 % @kbd{make installcheck}
|
||
@dots{}
|
||
@end example
|
||
|
||
@cindex Unpacking
|
||
|
||
The user first unpacks the package. Here, and in the following
|
||
examples, we will use the non-portable @code{tar zxf} command for
|
||
simplicity. On a system without GNU @command{tar} installed, this
|
||
command should read @code{gunzip -c amhello-1.0.tar.gz | tar xf -}.
|
||
|
||
The user then enters the newly created directory to run the
|
||
@file{configure} script. This script probes the system for various
|
||
features, and finally creates the @file{Makefile}s. In this toy
|
||
example there are only two @file{Makefile}s, but in real-world projects,
|
||
there may be many more, usually one @file{Makefile} per directory.
|
||
|
||
It is now possible to run @code{make}. This will construct all the
|
||
programs, libraries, and scripts that need to be constructed for the
|
||
package. In our example, this compiles the @file{hello} program.
|
||
All files are constructed in place, in the source tree; we will see
|
||
later how this can be changed.
|
||
|
||
@code{make check} causes the package's tests to be run. This step is
|
||
not mandatory, but it is often good to make sure the programs that
|
||
have been built behave as they should, before you decide to install
|
||
them. Our example does not contain any tests, so running @code{make
|
||
check} is a no-op.
|
||
|
||
@cindex su, before @code{make install}
|
||
After everything has been built, and maybe tested, it is time to
|
||
install it on the system. That means copying the programs,
|
||
libraries, header files, scripts, and other data files from the
|
||
source directory to their final destination on the system. The
|
||
command @code{make install} will do that. However, by default
|
||
everything will be installed in subdirectories of @file{/usr/local}:
|
||
binaries will go into @file{/usr/local/bin}, libraries will end up in
|
||
@file{/usr/local/lib}, etc. This destination is usually not writable
|
||
by any user, so we assume that we have to become root before we can
|
||
run @code{make install}. In our example, running @code{make install}
|
||
will copy the program @file{hello} into @file{/usr/local/bin}
|
||
and @file{README} into @file{/usr/local/share/doc/amhello}.
|
||
|
||
A last and optional step is to run @code{make installcheck}. This
|
||
command may run tests on the installed files. @code{make check} tests
|
||
the files in the source tree, while @code{make installcheck} tests
|
||
their installed copies. The tests run by the latter can be different
|
||
from those run by the former. For instance, there are tests that
|
||
cannot be run in the source tree. Conversely, some packages are set
|
||
up so that @code{make installcheck} will run the very same tests as
|
||
@code{make check}, only on different files (non-installed
|
||
vs.@: installed). It can make a difference, for instance when the
|
||
source tree's layout is different from that of the installation.
|
||
Furthermore it may help to diagnose an incomplete installation.
|
||
|
||
Presently most packages do not have any @code{installcheck} tests
|
||
because the existence of @code{installcheck} is little known, and its
|
||
usefulness is neglected. Our little toy package is no better: @code{make
|
||
installcheck} does nothing.
|
||
|
||
@node Standard Targets
|
||
@subsection Standard @file{Makefile} Targets
|
||
|
||
So far we have come across four ways to run @command{make} in the GNU
|
||
Build System: @code{make}, @code{make check}, @code{make install}, and
|
||
@code{make installcheck}. The words @code{check}, @code{install}, and
|
||
@code{installcheck}, passed as arguments to @command{make}, are called
|
||
@dfn{targets}. @code{make} is a shorthand for @code{make all},
|
||
@code{all} being the default target in the GNU Build System.
|
||
|
||
Here is a list of the most useful targets that the GNU Coding Standards
|
||
specify.
|
||
|
||
@table @code
|
||
@item make all
|
||
@trindex all
|
||
Build programs, libraries, documentation, etc.@: (same as @code{make}).
|
||
@item make install
|
||
@trindex install
|
||
Install what needs to be installed, copying the files from the
|
||
package's tree to system-wide directories.
|
||
@item make install-strip
|
||
@trindex install-strip
|
||
Same as @code{make install}, then strip debugging symbols. Some
|
||
users like to trade space for useful bug reports@enddots{}
|
||
@item make uninstall
|
||
@trindex uninstall
|
||
The opposite of @code{make install}: erase the installed files.
|
||
(This needs to be run from the same build tree that was installed.)
|
||
@item make clean
|
||
@trindex clean
|
||
Erase from the build tree the files built by @code{make all}.
|
||
@item make distclean
|
||
@trindex distclean
|
||
Additionally erase anything @code{./configure} created.
|
||
@item make check
|
||
@trindex check
|
||
Run the test suite, if any.
|
||
@item make installcheck
|
||
@trindex installcheck
|
||
Check the installed programs or libraries, if supported.
|
||
@item make dist
|
||
@trindex dist
|
||
Recreate @file{@var{package}-@var{version}.tar.gz} from all the source
|
||
files.
|
||
@end table
|
||
|
||
@node Standard Directory Variables
|
||
@subsection Standard Directory Variables
|
||
@cindex directory variables
|
||
|
||
The GNU Coding Standards also specify a hierarchy of variables to
|
||
denote installation directories. Some of these are:
|
||
|
||
@multitable {Directory variable} {@code{$@{datarootdir@}/doc/$@{PACKAGE@}}}
|
||
@headitem Directory variable @tab Default value
|
||
@item @code{prefix} @tab @code{/usr/local}
|
||
@item @w{@ @ @code{exec_prefix}} @tab @code{$@{prefix@}}
|
||
@item @w{@ @ @ @ @code{bindir}} @tab @code{$@{exec_prefix@}/bin}
|
||
@item @w{@ @ @ @ @code{libdir}} @tab @code{$@{exec_prefix@}/lib}
|
||
@item @w{@ @ @ @ @dots{}}
|
||
@item @w{@ @ @code{includedir}} @tab @code{$@{prefix@}/include}
|
||
@item @w{@ @ @code{datarootdir}} @tab @code{$@{prefix@}/share}
|
||
@item @w{@ @ @ @ @code{datadir}} @tab @code{$@{datarootdir@}}
|
||
@item @w{@ @ @ @ @code{mandir}} @tab @code{$@{datarootdir@}/man}
|
||
@item @w{@ @ @ @ @code{infodir}} @tab @code{$@{datarootdir@}/info}
|
||
@item @w{@ @ @ @ @code{docdir}} @tab @code{$@{datarootdir@}/doc/$@{PACKAGE@}}
|
||
@item @w{@ @ @dots{}}
|
||
@end multitable
|
||
|
||
@c We should provide a complete table somewhere, but not here. The
|
||
@c complete list of directory variables it too confusing as-is. It
|
||
@c requires some explanations that are too complicated for this
|
||
@c introduction. Besides listing directories like localstatedir
|
||
@c would make the explanations in ``Two-Part Install'' harder.
|
||
|
||
Each of these directories has a role which is often obvious from its
|
||
name. In a package, any installable file will be installed in one of
|
||
these directories. For instance in @code{amhello-1.0}, the program
|
||
@file{hello} is to be installed in @var{bindir}, the directory for
|
||
binaries. The default value for this directory is
|
||
@file{/usr/local/bin}, but the user can supply a different value when
|
||
calling @command{configure}. Also the file @file{README} will be
|
||
installed into @var{docdir}, which defaults to
|
||
@file{/usr/local/share/doc/amhello}.
|
||
|
||
@opindex --prefix
|
||
|
||
As a user, if you wish to install a package on your own account, you
|
||
could proceed as follows:
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make install}
|
||
@dots{}
|
||
@end example
|
||
|
||
This would install @file{~/usr/bin/hello} and
|
||
@file{~/usr/share/doc/amhello/README}.
|
||
|
||
The list of all such directory options is shown by
|
||
@code{./configure --help}.
|
||
|
||
@node Standard Configuration Variables
|
||
@subsection Standard Configuration Variables
|
||
@cindex configuration variables, overriding
|
||
|
||
The GNU Coding Standards also define a set of standard configuration
|
||
variables used during the build. Here are some:
|
||
|
||
@table @asis
|
||
@item @code{CC}
|
||
C compiler command
|
||
@item @code{CFLAGS}
|
||
C compiler flags
|
||
@item @code{CXX}
|
||
C++ compiler command
|
||
@item @code{CXXFLAGS}
|
||
C++ compiler flags
|
||
@item @code{LDFLAGS}
|
||
linker flags
|
||
@item @code{CPPFLAGS}
|
||
C/C++ preprocessor flags
|
||
@item @dots{}
|
||
@end table
|
||
|
||
@command{configure} usually does a good job at setting appropriate
|
||
values for these variables, but there are cases where you may want to
|
||
override them. For instance you may have several versions of a
|
||
compiler installed and would like to use another one, you may have
|
||
header files installed outside the default search path of the
|
||
compiler, or even libraries out of the way of the linker.
|
||
|
||
Here is how one would call @command{configure} to force it to use
|
||
@command{gcc-3} as C compiler, use header files from
|
||
@file{~/usr/include} when compiling, and libraries from
|
||
@file{~/usr/lib} when linking.
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
|
||
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
|
||
@end example
|
||
|
||
Again, a full list of these variables appears in the output of
|
||
@code{./configure --help}.
|
||
|
||
@node config.site
|
||
@subsection Overriding Default Configuration Setting with @file{config.site}
|
||
@cindex @file{config.site} example
|
||
|
||
When installing several packages using the same setup, it can be
|
||
convenient to create a file to capture common settings.
|
||
If a file named @file{@var{prefix}/share/config.site} exists,
|
||
@command{configure} will source it at the beginning of its execution.
|
||
|
||
Recall the command from the previous section:
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \
|
||
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib}
|
||
@end example
|
||
|
||
Assuming we are installing many package in @file{~/usr}, and will
|
||
always want to use these definitions of @code{CC}, @code{CPPFLAGS}, and
|
||
@code{LDFLAGS}, we can automate this by creating the following
|
||
@file{~/usr/share/config.site} file:
|
||
|
||
@example
|
||
test -z "$CC" && CC=gcc-3
|
||
test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include
|
||
test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib
|
||
@end example
|
||
|
||
Now, any time a @file{configure} script is using the @file{~/usr}
|
||
prefix, it will execute the above @file{config.site} and define
|
||
these three variables.
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix ~/usr}
|
||
configure: loading site script /home/adl/usr/share/config.site
|
||
@dots{}
|
||
@end example
|
||
|
||
@xref{Site Defaults, , Setting Site Defaults, autoconf, The Autoconf
|
||
Manual}, for more information about this feature.
|
||
|
||
|
||
@node VPATH Builds
|
||
@subsection Parallel Build Trees (a.k.a.@: VPATH Builds)
|
||
@cindex Parallel build trees
|
||
@cindex VPATH builds
|
||
@cindex source tree and build tree
|
||
@cindex build tree and source tree
|
||
@cindex trees, source vs.@: build
|
||
|
||
The GNU Build System distinguishes two trees: the source tree, and
|
||
the build tree.
|
||
|
||
The source tree is rooted in the directory containing
|
||
@file{configure}. It contains all the sources files (those that are
|
||
distributed), and may be arranged using several subdirectories.
|
||
|
||
The build tree is rooted in the directory in which @file{configure}
|
||
was run, and is populated with all object files, programs, libraries,
|
||
and other derived files built from the sources (and hence not
|
||
distributed). The build tree usually has the same subdirectory layout
|
||
as the source tree; its subdirectories are created automatically by
|
||
the build system.
|
||
|
||
If @file{configure} is executed in its own directory, the source and
|
||
build trees are combined: derived files are constructed in the same
|
||
directories as their sources. This was the case in our first
|
||
installation example (@pxref{Basic Installation}).
|
||
|
||
A common request from users is that they want to confine all derived
|
||
files to a single directory, to keep their source directories
|
||
uncluttered. Here is how we could run @file{configure} to build
|
||
everything in a subdirectory called @file{build/}.
|
||
|
||
@example
|
||
~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
|
||
~ % @kbd{cd amhello-1.0}
|
||
~/amhello-1.0 % @kbd{mkdir build && cd build}
|
||
~/amhello-1.0/build % @kbd{../configure}
|
||
@dots{}
|
||
~/amhello-1.0/build % @kbd{make}
|
||
@dots{}
|
||
@end example
|
||
|
||
These setups, where source and build trees are different, are often
|
||
called @dfn{parallel builds} or @dfn{VPATH builds}. The expression
|
||
@emph{parallel build} is misleading: the word @emph{parallel} is a
|
||
reference to the way the build tree shadows the source tree, it is not
|
||
about some concurrency in the way build commands are run. For this
|
||
reason we refer to such setups using the name @emph{VPATH builds} in
|
||
the following. @emph{VPATH} is the name of the @command{make} feature
|
||
used by the @file{Makefile}s to allow these builds (@pxref{General
|
||
Search, , @code{VPATH} Search Path for All Prerequisites, make, The
|
||
GNU Make Manual}).
|
||
|
||
@cindex multiple configurations, example
|
||
@cindex debug build, example
|
||
@cindex optimized build, example
|
||
|
||
VPATH builds have other interesting uses. One is to build the same
|
||
sources with multiple configurations. For instance:
|
||
|
||
@c Keep in sync with amhello-cflags.sh
|
||
@example
|
||
~ % @kbd{tar zxf ~/amhello-1.0.tar.gz}
|
||
~ % @kbd{cd amhello-1.0}
|
||
~/amhello-1.0 % @kbd{mkdir debug optim && cd debug}
|
||
~/amhello-1.0/debug % @kbd{../configure CFLAGS='-g -O0'}
|
||
@dots{}
|
||
~/amhello-1.0/debug % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0/debug % cd ../optim
|
||
~/amhello-1.0/optim % @kbd{../configure CFLAGS='-O3 -fomit-frame-pointer'}
|
||
@dots{}
|
||
~/amhello-1.0/optim % @kbd{make}
|
||
@dots{}
|
||
@end example
|
||
|
||
With network file systems, a similar approach can be used to build the
|
||
same sources on different machines. For instance, suppose that the
|
||
sources are installed on a directory shared by two hosts: @code{HOST1}
|
||
and @code{HOST2}, which may be different platforms.
|
||
|
||
@example
|
||
~ % @kbd{cd /nfs/src}
|
||
/nfs/src % @kbd{tar zxf ~/amhello-1.0.tar.gz}
|
||
@end example
|
||
|
||
On the first host, you could create a local build directory:
|
||
@example
|
||
[HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
|
||
[HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
|
||
...
|
||
[HOST1] /tmp/amh % @kbd{make && sudo make install}
|
||
...
|
||
@end example
|
||
|
||
@noindent
|
||
(Here we assume that the installer has configured @command{sudo} so it
|
||
can execute @code{make install} with root privileges; it is more convenient
|
||
than using @command{su} like in @ref{Basic Installation}).
|
||
|
||
On the second host, you would do exactly the same, possibly at
|
||
the same time:
|
||
@example
|
||
[HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
|
||
[HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure}
|
||
...
|
||
[HOST2] /tmp/amh % @kbd{make && sudo make install}
|
||
...
|
||
@end example
|
||
|
||
@cindex read-only source tree
|
||
@cindex source tree, read-only
|
||
|
||
In this scenario, nothing forbids the @file{/nfs/src/amhello-1.0}
|
||
directory from being read-only. In fact VPATH builds are also a means
|
||
of building packages from a read-only medium such as a CD-ROM. (The
|
||
FSF used to sell CD-ROM with unpacked source code, before the GNU
|
||
project grew so big.)
|
||
|
||
@node Two-Part Install
|
||
@subsection Two-Part Installation
|
||
|
||
In our last example (@pxref{VPATH Builds}), a source tree was shared
|
||
by two hosts, but compilation and installation were done separately on
|
||
each host.
|
||
|
||
The GNU Build System also supports networked setups where part of the
|
||
installed files should be shared amongst multiple hosts. It does so
|
||
by distinguishing architecture-dependent files from
|
||
architecture-independent files, and providing two @file{Makefile}
|
||
targets to install each of these classes of files.
|
||
|
||
@trindex install-exec
|
||
@trindex install-data
|
||
|
||
These targets are @code{install-exec} for architecture-dependent files
|
||
and @code{install-data} for architecture-independent files.
|
||
The command we used up to now, @code{make install}, can be thought of
|
||
as a shorthand for @code{make install-exec install-data}.
|
||
|
||
From the GNU Build System point of view, the distinction between
|
||
architecture-dependent files and architecture-independent files is
|
||
based exclusively on the directory variable used to specify their
|
||
installation destination. In the list of directory variables we
|
||
provided earlier (@pxref{Standard Directory Variables}), all the
|
||
variables based on @var{exec-prefix} designate architecture-dependent
|
||
directories whose files will be installed by @code{make install-exec}.
|
||
The others designate architecture-independent directories and will
|
||
serve files installed by @code{make install-data}. @xref{The Two Parts
|
||
of Install}, for more details.
|
||
|
||
Here is how we could revisit our two-host installation example,
|
||
assuming that (1) we want to install the package directly in
|
||
@file{/usr}, and (2) the directory @file{/usr/share} is shared by the
|
||
two hosts.
|
||
|
||
On the first host we would run
|
||
@example
|
||
[HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
|
||
[HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
|
||
...
|
||
[HOST1] /tmp/amh % @kbd{make && sudo make install}
|
||
...
|
||
@end example
|
||
|
||
On the second host, however, we need only install the
|
||
architecture-specific files.
|
||
@example
|
||
[HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh}
|
||
[HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr}
|
||
...
|
||
[HOST2] /tmp/amh % @kbd{make && sudo make install-exec}
|
||
...
|
||
@end example
|
||
|
||
In packages that have installation checks, it would make sense to run
|
||
@code{make installcheck} (@pxref{Basic Installation}) to verify that
|
||
the package works correctly despite the apparent partial installation.
|
||
|
||
@node Cross-Compilation
|
||
@subsection Cross-Compilation
|
||
@cindex cross-compilation
|
||
|
||
To @dfn{cross-compile} is to build on one platform a binary that will
|
||
run on another platform. When speaking of cross-compilation, it is
|
||
important to distinguish between the @dfn{build platform} on which
|
||
the compilation is performed, and the @dfn{host platform} on which the
|
||
resulting executable is expected to run. The following
|
||
@command{configure} options are used to specify each of them:
|
||
|
||
@table @option
|
||
@item --build=@var{build}
|
||
@opindex --build=@var{build}
|
||
The system on which the package is built.
|
||
@item --host=@var{host}
|
||
@opindex --host=@var{host}
|
||
The system where built programs and libraries will run.
|
||
@end table
|
||
|
||
When the @option{--host} is used, @command{configure} will search for
|
||
the cross-compiling suite for this platform. Cross-compilation tools
|
||
commonly have their target architecture as prefix of their name. For
|
||
instance my cross-compiler for MinGW32 has its binaries called
|
||
@code{i586-mingw32msvc-gcc}, @code{i586-mingw32msvc-ld},
|
||
@code{i586-mingw32msvc-as}, etc.
|
||
|
||
@cindex MinGW cross-compilation example
|
||
@cindex cross-compilation example
|
||
|
||
Here is how we could build @code{amhello-1.0} for
|
||
@code{i586-mingw32msvc} on a GNU/Linux PC.
|
||
|
||
@c Keep in sync with amhello-cross-compile.sh
|
||
@smallexample
|
||
~/amhello-1.0 % @kbd{./configure --build i686-pc-linux-gnu --host i586-mingw32msvc}
|
||
checking for a BSD-compatible install... /usr/bin/install -c
|
||
checking whether build environment is sane... yes
|
||
checking for gawk... gawk
|
||
checking whether make sets $(MAKE)... yes
|
||
checking for i586-mingw32msvc-strip... i586-mingw32msvc-strip
|
||
checking for i586-mingw32msvc-gcc... i586-mingw32msvc-gcc
|
||
checking for C compiler default output file name... a.exe
|
||
checking whether the C compiler works... yes
|
||
checking whether we are cross compiling... yes
|
||
checking for suffix of executables... .exe
|
||
checking for suffix of object files... o
|
||
checking whether we are using the GNU C compiler... yes
|
||
checking whether i586-mingw32msvc-gcc accepts -g... yes
|
||
checking for i586-mingw32msvc-gcc option to accept ANSI C...
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{cd src; file hello.exe}
|
||
hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable
|
||
@end smallexample
|
||
|
||
The @option{--host} and @option{--build} options are usually all we
|
||
need for cross-compiling. The only exception is if the package being
|
||
built is itself a cross-compiler: we need a third option to specify
|
||
its target architecture.
|
||
|
||
@table @option
|
||
@item --target=@var{target}
|
||
@opindex --target=@var{target}
|
||
When building compiler tools: the system for which the tools will
|
||
create output.
|
||
@end table
|
||
|
||
For instance when installing GCC, the GNU Compiler Collection, we can
|
||
use @option{--target=@/@var{target}} to specify that we want to build
|
||
GCC as a cross-compiler for @var{target}. Mixing @option{--build} and
|
||
@option{--target}, we can actually cross-compile a cross-compiler;
|
||
such a three-way cross-compilation is known as a @dfn{Canadian cross}.
|
||
|
||
@xref{Specifying Names, , Specifying the System Type, autoconf, The
|
||
Autoconf Manual}, for more information about these @command{configure}
|
||
options.
|
||
|
||
@node Renaming
|
||
@subsection Renaming Programs at Install Time
|
||
@cindex Renaming programs
|
||
@cindex Transforming program names
|
||
@cindex Programs, renaming during installation
|
||
|
||
The GNU Build System provides means to automatically rename
|
||
executables and manpages before they are installed (@pxref{Man Pages}).
|
||
This is especially convenient
|
||
when installing a GNU package on a system that already has a
|
||
proprietary implementation you do not want to overwrite. For instance,
|
||
you may want to install GNU @command{tar} as @command{gtar} so you can
|
||
distinguish it from your vendor's @command{tar}.
|
||
|
||
This can be done using one of these three @command{configure} options.
|
||
|
||
@table @option
|
||
@item --program-prefix=@var{prefix}
|
||
@opindex --program-prefix=@var{prefix}
|
||
Prepend @var{prefix} to installed program names.
|
||
@item --program-suffix=@var{suffix}
|
||
@opindex --program-suffix=@var{suffix}
|
||
Append @var{suffix} to installed program names.
|
||
@item --program-transform-name=@var{program}
|
||
@opindex --program-transform-name=@var{program}
|
||
Run @code{sed @var{program}} on installed program names.
|
||
@end table
|
||
|
||
The following commands would install @file{hello}
|
||
as @file{/usr/local/bin/test-hello}, for instance.
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --program-prefix test-}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{sudo make install}
|
||
@dots{}
|
||
@end example
|
||
|
||
@node DESTDIR
|
||
@subsection Building Binary Packages Using DESTDIR
|
||
@vindex DESTDIR
|
||
|
||
The GNU Build System's @code{make install} and @code{make uninstall}
|
||
interface does not exactly fit the needs of a system administrator
|
||
who has to deploy and upgrade packages on lots of hosts. In other
|
||
words, the GNU Build System does not replace a package manager.
|
||
|
||
Such package managers usually need to know which files have been
|
||
installed by a package, so a mere @code{make install} is
|
||
inappropriate.
|
||
|
||
@cindex Staged installation
|
||
|
||
The @code{DESTDIR} variable can be used to perform a staged
|
||
installation. The package should be configured as if it was going to
|
||
be installed in its final location (e.g., @code{--prefix /usr}), but
|
||
when running @code{make install}, the @code{DESTDIR} should be set to
|
||
the absolute name of a directory into which the installation will be
|
||
diverted. From this directory it is easy to review which files are
|
||
being installed where, and finally copy them to their final location
|
||
by some means.
|
||
|
||
@cindex Binary package
|
||
|
||
For instance here is how we could create a binary package containing a
|
||
snapshot of all the files to be installed.
|
||
|
||
@c Keep in sync with amhello-binpkg.sh
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix /usr}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{make DESTDIR=$HOME/inst install}
|
||
@dots{}
|
||
~/amhello-1.0 % @kbd{cd ~/inst}
|
||
~/inst % @kbd{find . -type f -print > ../files.lst}
|
||
~/inst % @kbd{tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`}
|
||
./usr/bin/hello
|
||
./usr/share/doc/amhello/README
|
||
@end example
|
||
|
||
After this example, @code{amhello-1.0-i686.tar.gz} is ready to be
|
||
uncompressed in @file{/} on many hosts. (Using @code{`cat ../files.lst`}
|
||
instead of @samp{.} as argument for @command{tar} avoids entries for
|
||
each subdirectory in the archive: we would not like @command{tar} to
|
||
restore the modification time of @file{/}, @file{/usr/}, etc.)
|
||
|
||
Note that when building packages for several architectures, it might
|
||
be convenient to use @code{make install-data} and @code{make
|
||
install-exec} (@pxref{Two-Part Install}) to gather
|
||
architecture-independent files in a single package.
|
||
|
||
@xref{Install}, for more information.
|
||
|
||
@c We should document PRE_INSTALL/POST_INSTALL/NORMAL_INSTALL and their
|
||
@c UNINSTALL counterparts.
|
||
|
||
@node Preparing Distributions
|
||
@subsection Preparing Distributions
|
||
@cindex Preparing distributions
|
||
@cindex Packages, preparation
|
||
@cindex Distributions, preparation
|
||
|
||
We have already mentioned @code{make dist}. This target collects all
|
||
your source files and the necessary parts of the build system to
|
||
create a tarball named @file{@var{package}-@var{version}.tar.gz}.
|
||
|
||
@cindex @code{distcheck} better than @code{dist}
|
||
|
||
Another, more useful command is @code{make distcheck}. The
|
||
@code{distcheck} target constructs
|
||
@file{@var{package}-@var{version}.tar.gz} just as well as @code{dist},
|
||
but it additionally ensures most of the use cases presented so far
|
||
work:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
It attempts a full compilation of the package (@pxref{Basic
|
||
Installation}), unpacking the newly constructed tarball, running
|
||
@code{make}, @code{make check}, @code{make install}, as well as
|
||
@code{make installcheck}, and even @code{make dist},
|
||
@item
|
||
it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}),
|
||
@item
|
||
it makes sure @code{make clean}, @code{make distclean}, and @code{make
|
||
uninstall} do not omit any file (@pxref{Standard Targets}),
|
||
@item
|
||
and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}).
|
||
@end itemize
|
||
|
||
All of these actions are performed in a temporary directory, so that no
|
||
root privileges are required. Please note that the exact location and the
|
||
exact structure of such a subdirectory (where the extracted sources are
|
||
placed, how the temporary build and install directories are named and how
|
||
deeply they are nested, etc.) is to be considered an implementation detail,
|
||
which can change at any time; so do not rely on it.
|
||
|
||
Releasing a package that fails @code{make distcheck} means that one of
|
||
the scenarios we presented will not work and some users will be
|
||
disappointed. Therefore it is a good practice to release a package
|
||
only after a successful @code{make distcheck}. This of course does
|
||
not imply that the package will be flawless, but at least it will
|
||
prevent some of the embarrassing errors you may find in packages
|
||
released by people who have never heard about @code{distcheck} (like
|
||
@code{DESTDIR} not working because of a typo, or a distributed file
|
||
being erased by @code{make clean}, or even @code{VPATH} builds not
|
||
working).
|
||
|
||
@xref{Creating amhello}, to recreate @file{amhello-1.0.tar.gz} using
|
||
@code{make distcheck}. @xref{Checking the Distribution}, for more
|
||
information about @code{distcheck}.
|
||
|
||
@node Dependency Tracking
|
||
@subsection Automatic Dependency Tracking
|
||
@cindex Dependency tracking
|
||
|
||
Dependency tracking is performed as a side-effect of compilation.
|
||
Each time the build system compiles a source file, it computes its
|
||
list of dependencies (in C these are the header files included by the
|
||
source being compiled). Later, any time @command{make} is run and a
|
||
dependency appears to have changed, the dependent files will be
|
||
rebuilt.
|
||
|
||
Automake generates code for automatic dependency tracking by default,
|
||
unless the developer chooses to override it; for more information,
|
||
@pxref{Dependencies}.
|
||
|
||
When @command{configure} is executed, you can see it probing each
|
||
compiler for the dependency mechanism it supports (several mechanisms
|
||
can be used):
|
||
|
||
@example
|
||
~/amhello-1.0 % @kbd{./configure --prefix /usr}
|
||
@dots{}
|
||
checking dependency style of gcc... gcc3
|
||
@dots{}
|
||
@end example
|
||
|
||
Because dependencies are only computed as a side-effect of the
|
||
compilation, no dependency information exists the first time a package
|
||
is built. This is OK because all the files need to be built anyway:
|
||
@code{make} does not have to decide which files need to be rebuilt.
|
||
In fact, dependency tracking is completely useless for one-time builds
|
||
and there is a @command{configure} option to disable this:
|
||
|
||
@table @option
|
||
@item --disable-dependency-tracking
|
||
@opindex --disable-dependency-tracking
|
||
Speed up one-time builds.
|
||
@end table
|
||
|
||
Some compilers do not offer any practical way to derive the list of
|
||
dependencies as a side-effect of the compilation, requiring a separate
|
||
run (maybe of another tool) to compute these dependencies. The
|
||
performance penalty implied by these methods is important enough to
|
||
disable them by default. The option @option{--enable-dependency-tracking}
|
||
must be passed to @command{configure} to activate them.
|
||
|
||
@table @option
|
||
@item --enable-dependency-tracking
|
||
@opindex --enable-dependency-tracking
|
||
Do not reject slow dependency extractors.
|
||
@end table
|
||
|
||
@xref{Dependency Tracking Evolution, , Dependency Tracking Evolution,
|
||
automake-history, Brief History of Automake}, for some discussion about
|
||
the different dependency tracking schemes used by Automake over the years.
|
||
|
||
@node Nested Packages
|
||
@subsection Nested Packages
|
||
@cindex Nested packages
|
||
@cindex Packages, nested
|
||
@cindex Subpackages
|
||
|
||
Although nesting packages isn't something we would recommend to
|
||
someone who is discovering the Autotools, it is a nice feature worthy
|
||
of mention in this small advertising tour.
|
||
|
||
Autoconfiscated packages (that means packages whose build system have
|
||
been created by Autoconf and friends) can be nested to arbitrary
|
||
depth.
|
||
|
||
A typical setup is that package A will distribute one of the libraries
|
||
it needs in a subdirectory. This library B is a complete package with
|
||
its own GNU Build System. The @command{configure} script of A will
|
||
run the @command{configure} script of B as part of its execution,
|
||
building and installing A will also build and install B. Generating a
|
||
distribution for A will also include B.
|
||
|
||
It is possible to gather several packages like this. GCC is a heavy
|
||
user of this feature. This gives installers a single package to
|
||
configure, build and install, while it allows developers to work on
|
||
subpackages independently.
|
||
|
||
When configuring nested packages, the @command{configure} options
|
||
given to the top-level @command{configure} are passed recursively to
|
||
nested @command{configure}s. A package that does not understand an
|
||
option will ignore it, assuming it is meaningful to some other
|
||
package.
|
||
|
||
@opindex --help=recursive
|
||
|
||
The command @code{configure --help=recursive} can be used to display
|
||
the options supported by all the included packages.
|
||
|
||
@xref{Subpackages}, for an example setup.
|
||
|
||
@node Why Autotools
|
||
@section How Autotools Help
|
||
@cindex Autotools, purpose
|
||
|
||
There are several reasons why you may not want to implement the GNU
|
||
Build System yourself (read: write a @file{configure} script and
|
||
@file{Makefile}s yourself).
|
||
|
||
@itemize @bullet
|
||
@item
|
||
As we have seen, the GNU Build System has a lot of
|
||
features (@pxref{Use Cases}).
|
||
Some users may expect features you have not implemented because
|
||
you did not need them.
|
||
@item
|
||
Implementing these features portably is difficult and exhausting.
|
||
Think of writing portable shell scripts, and portable
|
||
@file{Makefile}s, for systems you may not have handy. @xref{Portable
|
||
Shell, , Portable Shell Programming, autoconf, The Autoconf Manual}, to
|
||
convince yourself.
|
||
@item
|
||
You will have to upgrade your setup to follow changes to the GNU
|
||
Coding Standards.
|
||
@end itemize
|
||
|
||
The GNU Autotools take all this burden off your back and provide:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Tools to create a portable, complete, and self-contained GNU Build
|
||
System, from simple instructions.
|
||
@emph{Self-contained} meaning the resulting build system does not
|
||
require the GNU Autotools.
|
||
@item
|
||
A central place where fixes and improvements are made:
|
||
a bug-fix for a portability issue will benefit every package.
|
||
@end itemize
|
||
|
||
Yet there also exist reasons why you may want NOT to use the
|
||
Autotools@enddots{} For instance you may be already using (or used to)
|
||
another incompatible build system. Autotools will only be useful if
|
||
you do accept the concepts of the GNU Build System. People who have their
|
||
own idea of how a build system should work will feel frustrated by the
|
||
Autotools.
|
||
|
||
@node Hello World
|
||
@section A Small Hello World
|
||
@cindex Example Hello World
|
||
@cindex Hello World example
|
||
@cindex @file{amhello-1.0.tar.gz}, creation
|
||
|
||
In this section we recreate the @file{amhello-1.0} package from
|
||
scratch. The first subsection shows how to call the Autotools to
|
||
instantiate the GNU Build System, while the second explains the
|
||
meaning of the @file{configure.ac} and @file{Makefile.am} files read
|
||
by the Autotools.
|
||
|
||
@anchor{amhello Explained}
|
||
@menu
|
||
* Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch
|
||
* amhello's configure.ac Setup Explained::
|
||
* amhello's Makefile.am Setup Explained::
|
||
@end menu
|
||
|
||
@node Creating amhello
|
||
@subsection Creating @file{amhello-1.0.tar.gz}
|
||
|
||
Here is how we can recreate @file{amhello-1.0.tar.gz} from scratch.
|
||
The package is simple enough so that we will only need to write 5
|
||
files. (You may copy them from the final @file{amhello-1.0.tar.gz}
|
||
that is distributed with Automake if you do not want to write them.)
|
||
|
||
Create the following files in an empty directory.
|
||
|
||
@itemize @bullet
|
||
|
||
@item
|
||
@file{src/main.c} is the source file for the @file{hello} program. We
|
||
store it in the @file{src/} subdirectory, because later, when the package
|
||
evolves, it will ease the addition of a @file{man/} directory for man
|
||
pages, a @file{data/} directory for data files, etc.
|
||
@example
|
||
~/amhello % @kbd{cat src/main.c}
|
||
#include <config.h>
|
||
#include <stdio.h>
|
||
|
||
int
|
||
main (void)
|
||
@{
|
||
puts ("Hello World!");
|
||
puts ("This is " PACKAGE_STRING ".");
|
||
return 0;
|
||
@}
|
||
@end example
|
||
|
||
@item
|
||
@file{README} contains some very limited documentation for our little
|
||
package.
|
||
@example
|
||
~/amhello % @kbd{cat README}
|
||
This is a demonstration package for GNU Automake.
|
||
Type 'info Automake' to read the Automake manual.
|
||
@end example
|
||
|
||
@item
|
||
@file{Makefile.am} and @file{src/Makefile.am} contain Automake
|
||
instructions for these two directories.
|
||
|
||
@example
|
||
~/amhello % @kbd{cat src/Makefile.am}
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = main.c
|
||
~/amhello % @kbd{cat Makefile.am}
|
||
SUBDIRS = src
|
||
dist_doc_DATA = README
|
||
@end example
|
||
|
||
@item
|
||
Finally, @file{configure.ac} contains Autoconf instructions to
|
||
create the @command{configure} script.
|
||
|
||
@example
|
||
~/amhello % @kbd{cat configure.ac}
|
||
AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
|
||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||
AC_PROG_CC
|
||
AC_CONFIG_HEADERS([config.h])
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
@end example
|
||
@end itemize
|
||
|
||
@cindex @command{autoreconf}, example
|
||
|
||
Once you have these five files, it is time to run the Autotools to
|
||
instantiate the build system. Do this using the @command{autoreconf}
|
||
command as follows:
|
||
|
||
@example
|
||
~/amhello % @kbd{autoreconf --install}
|
||
configure.ac: installing './install-sh'
|
||
configure.ac: installing './missing'
|
||
configure.ac: installing './compile'
|
||
src/Makefile.am: installing './depcomp'
|
||
@end example
|
||
|
||
At this point the build system is complete.
|
||
|
||
In addition to the three scripts mentioned in its output, you can see
|
||
that @command{autoreconf} created four other files: @file{configure},
|
||
@file{config.h.in}, @file{Makefile.in}, and @file{src/Makefile.in}.
|
||
The latter three files are templates that will be adapted to the
|
||
system by @command{configure} under the names @file{config.h},
|
||
@file{Makefile}, and @file{src/Makefile}. Let's do this:
|
||
|
||
@example
|
||
~/amhello % @kbd{./configure}
|
||
checking for a BSD-compatible install... /usr/bin/install -c
|
||
checking whether build environment is sane... yes
|
||
checking for gawk... no
|
||
checking for mawk... mawk
|
||
checking whether make sets $(MAKE)... yes
|
||
checking for gcc... gcc
|
||
checking for C compiler default output file name... a.out
|
||
checking whether the C compiler works... yes
|
||
checking whether we are cross compiling... no
|
||
checking for suffix of executables...
|
||
checking for suffix of object files... o
|
||
checking whether we are using the GNU C compiler... yes
|
||
checking whether gcc accepts -g... yes
|
||
checking for gcc option to accept ISO C89... none needed
|
||
checking for style of include used by make... GNU
|
||
checking dependency style of gcc... gcc3
|
||
configure: creating ./config.status
|
||
config.status: creating Makefile
|
||
config.status: creating src/Makefile
|
||
config.status: creating config.h
|
||
config.status: executing depfiles commands
|
||
@end example
|
||
|
||
@trindex distcheck
|
||
@cindex @code{distcheck} example
|
||
|
||
You can see @file{Makefile}, @file{src/Makefile}, and @file{config.h}
|
||
being created at the end after @command{configure} has probed the
|
||
system. It is now possible to run all the targets we wish
|
||
(@pxref{Standard Targets}). For instance:
|
||
|
||
@example
|
||
~/amhello % @kbd{make}
|
||
@dots{}
|
||
~/amhello % @kbd{src/hello}
|
||
Hello World!
|
||
This is amhello 1.0.
|
||
~/amhello % @kbd{make distcheck}
|
||
@dots{}
|
||
=============================================
|
||
amhello-1.0 archives ready for distribution:
|
||
amhello-1.0.tar.gz
|
||
=============================================
|
||
@end example
|
||
|
||
Note that running @command{autoreconf} is only needed initially when
|
||
the GNU Build System does not exist. When you later change some
|
||
instructions in a @file{Makefile.am} or @file{configure.ac}, the
|
||
relevant part of the build system will be regenerated automatically
|
||
when you execute @command{make}.
|
||
|
||
@command{autoreconf} is a script that calls @command{autoconf},
|
||
@command{automake}, and a bunch of other commands in the right order.
|
||
If you are beginning with these tools, it is not important to figure
|
||
out in which order all of these tools should be invoked and why. However,
|
||
because Autoconf and Automake have separate manuals, the important
|
||
point to understand is that @command{autoconf} is in charge of
|
||
creating @file{configure} from @file{configure.ac}, while
|
||
@command{automake} is in charge of creating @file{Makefile.in}s from
|
||
@file{Makefile.am}s and @file{configure.ac}. This should at least
|
||
direct you to the right manual when seeking answers.
|
||
|
||
|
||
@node amhello's configure.ac Setup Explained
|
||
@subsection @code{amhello}'s @file{configure.ac} Setup Explained
|
||
|
||
@cindex @file{configure.ac}, Hello World
|
||
|
||
Let us begin with the contents of @file{configure.ac}.
|
||
|
||
@example
|
||
AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}])
|
||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||
AC_PROG_CC
|
||
AC_CONFIG_HEADERS([config.h])
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
@end example
|
||
|
||
This file is read by both @command{autoconf} (to create
|
||
@file{configure}) and @command{automake} (to create the various
|
||
@file{Makefile.in}s). It contains a series of M4 macros that will be
|
||
expanded as shell code to finally form the @file{configure} script.
|
||
We will not elaborate on the syntax of this file, because the Autoconf
|
||
manual has a whole section about it (@pxref{Writing Autoconf Input, ,
|
||
Writing @file{configure.ac}, autoconf, The Autoconf Manual}).
|
||
|
||
The macros prefixed with @code{AC_} are Autoconf macros, documented
|
||
in the Autoconf manual (@pxref{Autoconf Macro Index, , Autoconf Macro
|
||
Index, autoconf, The Autoconf Manual}). The macros that start with
|
||
@code{AM_} are Automake macros, documented later in this manual
|
||
(@pxref{Macro Index}).
|
||
|
||
The first two lines of @file{configure.ac} initialize Autoconf and
|
||
Automake. @code{AC_INIT} takes in as parameters the name of the package,
|
||
its version number, and a contact address for bug-reports about the
|
||
package (this address is output at the end of @code{./configure
|
||
--help}, for instance). When adapting this setup to your own package,
|
||
by all means please do not blindly copy Automake's address: use the
|
||
mailing list of your package, or your own mail address.
|
||
|
||
@opindex -Wall
|
||
@opindex -Werror
|
||
@opindex foreign
|
||
|
||
The argument to @code{AM_INIT_AUTOMAKE} is a list of options for
|
||
@command{automake} (@pxref{Options}). @option{-Wall} and
|
||
@option{-Werror} ask @command{automake} to turn on all warnings and
|
||
report them as errors. We are speaking of @strong{Automake} warnings
|
||
here, such as dubious instructions in @file{Makefile.am}. This has
|
||
absolutely nothing to do with how the compiler will be called, even
|
||
though it may support options with similar names. Using @option{-Wall
|
||
-Werror} is a safe setting when starting to work on a package: you do
|
||
not want to miss any issues. Later you may decide to relax things a
|
||
bit. The @option{foreign} option tells Automake that this package
|
||
will not follow the GNU Standards. GNU packages should always
|
||
distribute additional files such as @file{ChangeLog}, @file{AUTHORS},
|
||
etc. We do not want @command{automake} to complain about these
|
||
missing files in our small example.
|
||
|
||
The @code{AC_PROG_CC} line causes the @command{configure} script to
|
||
search for a C compiler and define the variable @code{CC} with its
|
||
name. The @file{src/Makefile.in} file generated by Automake uses the
|
||
variable @code{CC} to build @file{hello}, so when @command{configure}
|
||
creates @file{src/Makefile} from @file{src/Makefile.in}, it will define
|
||
@code{CC} with the value it has found. If Automake is asked to create
|
||
a @file{Makefile.in} that uses @code{CC} but @file{configure.ac} does
|
||
not define it, it will suggest you add a call to @code{AC_PROG_CC}.
|
||
|
||
The @code{AC_CONFIG_HEADERS([config.h])} invocation causes the
|
||
@command{configure} script to create a @file{config.h} file gathering
|
||
@samp{#define}s defined by other macros in @file{configure.ac}. In our
|
||
case, the @code{AC_INIT} macro already defined a few of them. Here
|
||
is an excerpt of @file{config.h} after @command{configure} has run:
|
||
|
||
@smallexample
|
||
@dots{}
|
||
/* Define to the address where bug reports for this package should be sent. */
|
||
#define PACKAGE_BUGREPORT "@value{PACKAGE_BUGREPORT}"
|
||
|
||
/* Define to the full name and version of this package. */
|
||
#define PACKAGE_STRING "amhello 1.0"
|
||
@dots{}
|
||
@end smallexample
|
||
|
||
As you probably noticed, @file{src/main.c} includes @file{config.h} so
|
||
it can use @code{PACKAGE_STRING}. In a real-world project,
|
||
@file{config.h} can grow really big, with one @samp{#define} per
|
||
feature probed on the system.
|
||
|
||
The @code{AC_CONFIG_FILES} macro declares the list of files that
|
||
@command{configure} should create from their @file{*.in} templates.
|
||
Automake also scans this list to find the @file{Makefile.am} files it must
|
||
process. (This is important to remember: when adding a new directory
|
||
to your project, you should add its @file{Makefile} to this list,
|
||
otherwise Automake will never process the new @file{Makefile.am} you
|
||
wrote in that directory.)
|
||
|
||
Finally, the @code{AC_OUTPUT} line is a closing command that actually
|
||
produces the part of the script in charge of creating the files
|
||
registered with @code{AC_CONFIG_HEADERS} and @code{AC_CONFIG_FILES}.
|
||
|
||
@cindex @command{autoscan}
|
||
|
||
When starting a new project, we suggest you start with such a simple
|
||
@file{configure.ac}, and gradually add the other tests it requires.
|
||
The command @command{autoscan} can also suggest a few of the tests
|
||
your package may need (@pxref{autoscan Invocation, , Using
|
||
@command{autoscan} to Create @file{configure.ac}, autoconf, The
|
||
Autoconf Manual}).
|
||
|
||
|
||
@node amhello's Makefile.am Setup Explained
|
||
@subsection @code{amhello}'s @file{Makefile.am} Setup Explained
|
||
|
||
@cindex @file{Makefile.am}, Hello World
|
||
|
||
We now turn to @file{src/Makefile.am}. This file contains
|
||
Automake instructions to build and install @file{hello}.
|
||
|
||
@example
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = main.c
|
||
@end example
|
||
|
||
A @file{Makefile.am} has the same syntax as an ordinary
|
||
@file{Makefile}. When @command{automake} processes a
|
||
@file{Makefile.am} it copies the entire file into the output
|
||
@file{Makefile.in} (that will be later turned into @file{Makefile} by
|
||
@command{configure}) but will react to certain variable definitions
|
||
by generating some build rules and other variables.
|
||
Often @file{Makefile.am}s contain only a list of variable definitions as
|
||
above, but they can also contain other variable and rule definitions that
|
||
@command{automake} will pass along without interpretation.
|
||
|
||
Variables that end with @code{_PROGRAMS} are special variables
|
||
that list programs that the resulting @file{Makefile} should build.
|
||
In Automake speak, this @code{_PROGRAMS} suffix is called a
|
||
@dfn{primary}; Automake recognizes other primaries such as
|
||
@code{_SCRIPTS}, @code{_DATA}, @code{_LIBRARIES}, etc.@: corresponding
|
||
to different types of files.
|
||
|
||
The @samp{bin} part of the @code{bin_PROGRAMS} tells
|
||
@command{automake} that the resulting programs should be installed in
|
||
@var{bindir}. Recall that the GNU Build System uses a set of variables
|
||
to denote destination directories and allow users to customize these
|
||
locations (@pxref{Standard Directory Variables}). Any such directory
|
||
variable can be put in front of a primary (omitting the @code{dir}
|
||
suffix) to tell @command{automake} where to install the listed files.
|
||
|
||
Programs need to be built from source files, so for each program
|
||
@code{@var{prog}} listed in a @code{@w{_PROGRAMS}} variable,
|
||
@command{automake} will look for another variable named
|
||
@code{@var{prog}_SOURCES} listing its source files. There may be more
|
||
than one source file: they will all be compiled and linked together.
|
||
|
||
Automake also knows that source files need to be distributed when
|
||
creating a tarball (unlike built programs). So a side-effect of this
|
||
@code{hello_SOURCES} declaration is that @file{main.c} will be
|
||
part of the tarball created by @code{make dist}.
|
||
|
||
Finally here are some explanations regarding the top-level
|
||
@file{Makefile.am}.
|
||
|
||
@example
|
||
SUBDIRS = src
|
||
dist_doc_DATA = README
|
||
@end example
|
||
|
||
@code{SUBDIRS} is a special variable listing all directories that
|
||
@command{make} should recurse into before processing the current
|
||
directory. So this line is responsible for @command{make} building
|
||
@file{src/hello} even though we run it from the top-level. This line
|
||
also causes @code{make install} to install @file{src/hello} before
|
||
installing @file{README} (not that this order matters).
|
||
|
||
The line @code{dist_doc_DATA = README} causes @file{README} to be
|
||
distributed and installed in @var{docdir}. Files listed with the
|
||
@code{_DATA} primary are not automatically part of the tarball built
|
||
with @code{make dist}, so we add the @code{dist_} prefix so they get
|
||
distributed. However, for @file{README} it would not have been
|
||
necessary: @command{automake} automatically distributes any
|
||
@file{README} file it encounters (the list of other files
|
||
automatically distributed is presented by @code{automake --help}).
|
||
The only important effect of this second line is therefore to install
|
||
@file{README} during @code{make install}.
|
||
|
||
One thing not covered in this example is accessing the installation
|
||
directory values (@pxref{Standard Directory Variables}) from your
|
||
program code, that is, converting them into defined macros. For this,
|
||
@pxref{Defining Directories,,, autoconf, The Autoconf Manual}.
|
||
|
||
|
||
@node Generalities
|
||
@chapter General ideas
|
||
|
||
The following sections cover a few basic ideas that will help you
|
||
understand how Automake works.
|
||
|
||
@menu
|
||
* General Operation:: General operation of Automake
|
||
* Strictness:: Standards conformance checking
|
||
* Uniform:: The Uniform Naming Scheme
|
||
* Length Limitations:: Staying below the command line length limit
|
||
* Canonicalization:: How derived variables are named
|
||
* User Variables:: Variables reserved for the user
|
||
* Auxiliary Programs:: Programs automake might require
|
||
@end menu
|
||
|
||
|
||
@node General Operation
|
||
@section General Operation
|
||
|
||
Automake works by reading a @file{Makefile.am} and generating a
|
||
@file{Makefile.in}. Certain variables and rules defined in the
|
||
@file{Makefile.am} instruct Automake to generate more specialized code;
|
||
for instance, a @code{bin_PROGRAMS} variable definition will cause rules
|
||
for compiling and linking programs to be generated.
|
||
|
||
@cindex Non-standard targets
|
||
@cindex @code{git-dist}, non-standard example
|
||
@trindex git-dist
|
||
|
||
The variable definitions and rules in the @file{Makefile.am} are
|
||
copied mostly verbatim into the generated file, with all variable
|
||
definitions preceding all rules. This allows you to add almost
|
||
arbitrary code into the generated @file{Makefile.in}. For instance,
|
||
the Automake distribution includes a non-standard rule for the
|
||
@code{git-dist} target, which the Automake maintainer uses to make
|
||
distributions from the source control system.
|
||
|
||
@cindex GNU make extensions
|
||
|
||
Note that most GNU make extensions are not recognized by Automake. Using
|
||
such extensions in a @file{Makefile.am} will lead to errors or confusing
|
||
behavior.
|
||
|
||
@cindex Append operator
|
||
@cmindex +=
|
||
A special exception is that the GNU make append operator, @samp{+=}, is
|
||
supported. This operator appends its right hand argument to the variable
|
||
specified on the left. Automake will translate the operator into
|
||
an ordinary @samp{=} operator; @samp{+=} will thus work with any make program.
|
||
|
||
Automake tries to keep comments grouped with any adjoining rules or
|
||
variable definitions.
|
||
|
||
@cindex Limitations of automake parser
|
||
@cindex Automake parser, limitations of
|
||
@cindex indentation in Makefile.am
|
||
Generally, Automake is not particularly smart in the parsing of unusual
|
||
Makefile constructs, so you're advised to avoid fancy constructs or
|
||
``creative'' use of whitespace.
|
||
@c Keep this in sync with doc-parsing-buglets-tabs.sh
|
||
For example, @key{TAB} characters cannot be used between a target name
|
||
and the following ``@code{:}'' character, and variable assignments
|
||
shouldn't be indented with @key{TAB} characters.
|
||
@c Keep this in sync with doc-parsing-buglets-colneq-subst.sh
|
||
Also, using more complex macro in target names can cause trouble:
|
||
|
||
@example
|
||
% @kbd{cat Makefile.am}
|
||
$(FOO:=x): bar
|
||
% @kbd{automake}
|
||
Makefile.am:1: bad characters in variable name '$(FOO'
|
||
Makefile.am:1: ':='-style assignments are not portable
|
||
@end example
|
||
|
||
@cindex Make targets, overriding
|
||
@cindex Make rules, overriding
|
||
@cindex Overriding make rules
|
||
@cindex Overriding make targets
|
||
|
||
A rule defined in @file{Makefile.am} generally overrides any such
|
||
rule of a similar name that would be automatically generated by
|
||
@command{automake}. Although this is a supported feature, it is generally
|
||
best to avoid making use of it, as sometimes the generated rules are
|
||
very particular.
|
||
|
||
@cindex Variables, overriding
|
||
@cindex Overriding make variables
|
||
|
||
Similarly, a variable defined in @file{Makefile.am} or
|
||
@code{AC_SUBST}ed from @file{configure.ac} will override any
|
||
definition of the variable that @command{automake} would ordinarily
|
||
create. This feature is more often useful than the ability to
|
||
override a rule. Be warned that many of the variables generated by
|
||
@command{automake} are considered to be for internal use only, and their
|
||
names might change in future releases.
|
||
|
||
@cindex Recursive operation of Automake
|
||
@cindex Automake, recursive operation
|
||
@cindex Example of recursive operation
|
||
|
||
When examining a variable definition, Automake will recursively examine
|
||
variables referenced in the definition. For example, if Automake is
|
||
looking at the content of @code{foo_SOURCES} in this snippet
|
||
|
||
@c Keep in sync with interp.sh
|
||
@example
|
||
xs = a.c b.c
|
||
foo_SOURCES = c.c $(xs)
|
||
@end example
|
||
|
||
it would use the files @file{a.c}, @file{b.c}, and @file{c.c} as the
|
||
contents of @code{foo_SOURCES}.
|
||
|
||
@cindex @code{##} (special Automake comment)
|
||
@cindex Special Automake comment
|
||
@cindex Comment, special to Automake
|
||
|
||
Automake also allows a form of comment that is @emph{not} copied into
|
||
the output; all lines beginning with @samp{##} (leading spaces allowed)
|
||
are completely ignored by Automake.
|
||
|
||
It is customary to make the first line of @file{Makefile.am} read:
|
||
|
||
@cindex Makefile.am, first line
|
||
@cindex First line of Makefile.am
|
||
|
||
@example
|
||
## Process this file with automake to produce Makefile.in
|
||
@end example
|
||
|
||
@c FIXME document customary ordering of Makefile.am here!
|
||
|
||
|
||
@node Strictness
|
||
@section Strictness
|
||
|
||
@cindex Non-GNU packages
|
||
|
||
While Automake is intended to be used by maintainers of GNU packages, it
|
||
does make some effort to accommodate those who wish to use it, but do
|
||
not want to use all the GNU conventions.
|
||
|
||
@cindex Strictness, defined
|
||
@cindex Strictness, @option{foreign}
|
||
@cindex @option{foreign} strictness
|
||
@cindex Strictness, @option{gnu}
|
||
@cindex @option{gnu} strictness
|
||
@cindex Strictness, @option{gnits}
|
||
@cindex @option{gnits} strictness
|
||
|
||
To this end, Automake supports three levels of @dfn{strictness}---the
|
||
strictness indicating how stringently Automake should check standards
|
||
conformance.
|
||
|
||
The valid strictness levels are:
|
||
|
||
@table @option
|
||
@item foreign
|
||
Automake will check for only those things that are absolutely
|
||
required for proper operations. For instance, whereas GNU standards
|
||
dictate the existence of a @file{NEWS} file, it will not be required in
|
||
this mode. This strictness will also turn off some warnings by default
|
||
(among them, portability warnings).
|
||
The name comes from the fact that Automake is intended to be
|
||
used for GNU programs; these relaxed rules are not the standard mode of
|
||
operation.
|
||
|
||
@item gnu
|
||
Automake will check---as much as possible---for compliance to the GNU
|
||
standards for packages. This is the default.
|
||
|
||
@item gnits
|
||
Automake will check for compliance to the as-yet-unwritten @dfn{Gnits
|
||
standards}. These are based on the GNU standards, but are even more
|
||
detailed. Unless you are a Gnits standards contributor, it is
|
||
recommended that you avoid this option until such time as the Gnits
|
||
standard is actually published (which may never happen).
|
||
@end table
|
||
|
||
@xref{Gnits}, for more information on the precise implications of the
|
||
strictness level.
|
||
|
||
|
||
@node Uniform
|
||
@section The Uniform Naming Scheme
|
||
|
||
@cindex Uniform naming scheme
|
||
|
||
Automake variables generally follow a @dfn{uniform naming scheme} that
|
||
makes it easy to decide how programs (and other derived objects) are
|
||
built, and how they are installed. This scheme also supports
|
||
@command{configure} time determination of what should be built.
|
||
|
||
@cindex @code{_PROGRAMS} primary variable
|
||
@cindex @code{PROGRAMS} primary variable
|
||
@cindex Primary variable, @code{PROGRAMS}
|
||
@cindex Primary variable, defined
|
||
@vindex _PROGRAMS
|
||
|
||
At @command{make} time, certain variables are used to determine which
|
||
objects are to be built. The variable names are made of several pieces
|
||
that are concatenated together.
|
||
|
||
The piece that tells @command{automake} what is being built is commonly called
|
||
the @dfn{primary}. For instance, the primary @code{PROGRAMS} holds a
|
||
list of programs that are to be compiled and linked.
|
||
@vindex PROGRAMS
|
||
|
||
@cindex @code{pkgdatadir}, defined
|
||
@cindex @code{pkgincludedir}, defined
|
||
@cindex @code{pkglibdir}, defined
|
||
@cindex @code{pkglibexecdir}, defined
|
||
|
||
@vindex pkgdatadir
|
||
@vindex pkgincludedir
|
||
@vindex pkglibdir
|
||
@vindex pkglibexecdir
|
||
|
||
@cindex @code{PACKAGE}, directory
|
||
A different set of names is used to decide where the built objects
|
||
should be installed. These names are prefixes to the primary, and they
|
||
indicate which standard directory should be used as the installation
|
||
directory. The standard directory names are given in the GNU standards
|
||
(@pxref{Directory Variables, , , standards, The GNU Coding Standards}).
|
||
Automake extends this list with @code{pkgdatadir}, @code{pkgincludedir},
|
||
@code{pkglibdir}, and @code{pkglibexecdir}; these are the same as the
|
||
non-@samp{pkg} versions, but with @samp{$(PACKAGE)} appended. For instance,
|
||
@code{pkglibdir} is defined as @samp{$(libdir)/$(PACKAGE)}.
|
||
|
||
@cindex @code{EXTRA_}, prepending
|
||
For each primary, there is one additional variable named by prepending
|
||
@samp{EXTRA_} to the primary name. This variable is used to list
|
||
objects that may or may not be built, depending on what
|
||
@command{configure} decides. This variable is required because Automake
|
||
must statically know the entire list of objects that may be built in
|
||
order to generate a @file{Makefile.in} that will work in all cases.
|
||
|
||
@cindex @code{EXTRA_PROGRAMS}, defined
|
||
@cindex Example, @code{EXTRA_PROGRAMS}
|
||
@cindex @command{cpio} example
|
||
|
||
For instance, @command{cpio} decides at configure time which programs
|
||
should be built. Some of the programs are installed in @code{bindir},
|
||
and some are installed in @code{sbindir}:
|
||
|
||
@example
|
||
EXTRA_PROGRAMS = mt rmt
|
||
bin_PROGRAMS = cpio pax
|
||
sbin_PROGRAMS = $(MORE_PROGRAMS)
|
||
@end example
|
||
|
||
Defining a primary without a prefix as a variable, e.g.,
|
||
@samp{PROGRAMS}, is an error.
|
||
|
||
Note that the common @samp{dir} suffix is left off when constructing the
|
||
variable names; thus one writes @samp{bin_PROGRAMS} and not
|
||
@samp{bindir_PROGRAMS}.
|
||
|
||
Not every sort of object can be installed in every directory. Automake
|
||
will flag those attempts it finds in error (but see below how to override
|
||
the check if you really need to).
|
||
Automake will also diagnose obvious misspellings in directory names.
|
||
|
||
@cindex Extending list of installation directories
|
||
@cindex Installation directories, extending list
|
||
|
||
Sometimes the standard directories---even as augmented by
|
||
Automake---are not enough. In particular it is sometimes useful, for
|
||
clarity, to install objects in a subdirectory of some predefined
|
||
directory. To this end, Automake allows you to extend the list of
|
||
possible installation directories. A given prefix (e.g., @samp{zar})
|
||
is valid if a variable of the same name with @samp{dir} appended is
|
||
defined (e.g., @samp{zardir}).
|
||
|
||
For instance, the following snippet will install @file{file.xml} into
|
||
@samp{$(datadir)/xml}.
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
xmldir = $(datadir)/xml
|
||
xml_DATA = file.xml
|
||
@end example
|
||
|
||
This feature can also be used to override the sanity checks Automake
|
||
performs to diagnose suspicious directory/primary couples (in the
|
||
unlikely case these checks are undesirable, and you really know what
|
||
you're doing). For example, Automake would error out on this input:
|
||
|
||
@c Should be tested in primary-prefix-invalid-couples.sh
|
||
@example
|
||
# Forbidden directory combinations, automake will error out on this.
|
||
pkglib_PROGRAMS = foo
|
||
doc_LIBRARIES = libquux.a
|
||
@end example
|
||
|
||
@noindent
|
||
but it will succeed with this:
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
# Work around forbidden directory combinations. Do not use this
|
||
# without a very good reason!
|
||
my_execbindir = $(pkglibdir)
|
||
my_doclibdir = $(docdir)
|
||
my_execbin_PROGRAMS = foo
|
||
my_doclib_LIBRARIES = libquux.a
|
||
@end example
|
||
|
||
The @samp{exec} substring of the @samp{my_execbindir} variable lets
|
||
the files be installed at the right time (@pxref{The Two Parts of
|
||
Install}).
|
||
|
||
@cindex @samp{noinst_} primary prefix, definition
|
||
@vindex noinst_
|
||
|
||
The special prefix @samp{noinst_} indicates that the objects in question
|
||
should be built but not installed at all. This is usually used for
|
||
objects required to build the rest of your package, for instance static
|
||
libraries (@pxref{A Library}), or helper scripts.
|
||
|
||
@cindex @samp{check_} primary prefix, definition
|
||
@vindex check_
|
||
|
||
The special prefix @samp{check_} indicates that the objects in question
|
||
should not be built until the @samp{make check} command is run. Those
|
||
objects are not installed either.
|
||
|
||
The current primary names are @samp{PROGRAMS}, @samp{LIBRARIES},
|
||
@samp{LTLIBRARIES}, @samp{LISP}, @samp{PYTHON}, @samp{JAVA},
|
||
@samp{SCRIPTS}, @samp{DATA}, @samp{HEADERS}, @samp{MANS}, and
|
||
@samp{TEXINFOS}.
|
||
@vindex PROGRAMS
|
||
@vindex LIBRARIES
|
||
@vindex LTLIBRARIES
|
||
@vindex LISP
|
||
@vindex PYTHON
|
||
@vindex JAVA
|
||
@vindex SCRIPTS
|
||
@vindex DATA
|
||
@vindex HEADERS
|
||
@vindex MANS
|
||
@vindex TEXINFOS
|
||
|
||
Some primaries also allow additional prefixes that control other
|
||
aspects of @command{automake}'s behavior. The currently defined prefixes
|
||
are @samp{dist_}, @samp{nodist_}, @samp{nobase_}, and @samp{notrans_}.
|
||
These prefixes are explained later (@pxref{Program and Library Variables})
|
||
(@pxref{Man Pages}).
|
||
|
||
|
||
@node Length Limitations
|
||
@section Staying below the command line length limit
|
||
|
||
@cindex command line length limit
|
||
@cindex ARG_MAX
|
||
|
||
Traditionally, most unix-like systems have a length limitation for the
|
||
command line arguments and environment contents when creating new
|
||
processes (see for example
|
||
@uref{http://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an
|
||
overview on this issue),
|
||
which of course also applies to commands spawned by @command{make}.
|
||
POSIX requires this limit to be at least 4096 bytes, and most modern
|
||
systems have quite high limits (or are unlimited).
|
||
|
||
In order to create portable Makefiles that do not trip over these
|
||
limits, it is necessary to keep the length of file lists bounded.
|
||
Unfortunately, it is not possible to do so fully transparently within
|
||
Automake, so your help may be needed. Typically, you can split long
|
||
file lists manually and use different installation directory names for
|
||
each list. For example,
|
||
|
||
@example
|
||
data_DATA = file1 @dots{} file@var{N} file@var{N+1} @dots{} file@var{2N}
|
||
@end example
|
||
|
||
@noindent
|
||
may also be written as
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
data_DATA = file1 @dots{} file@var{N}
|
||
data2dir = $(datadir)
|
||
data2_DATA = file@var{N+1} @dots{} file@var{2N}
|
||
@end example
|
||
|
||
@noindent
|
||
and will cause Automake to treat the two lists separately during
|
||
@code{make install}. See @ref{The Two Parts of Install} for choosing
|
||
directory names that will keep the ordering of the two parts of
|
||
installation Note that @code{make dist} may still only work on a host
|
||
with a higher length limit in this example.
|
||
|
||
Automake itself employs a couple of strategies to avoid long command
|
||
lines. For example, when @samp{$@{srcdir@}/} is prepended to file
|
||
names, as can happen with above @code{$(data_DATA)} lists, it limits
|
||
the amount of arguments passed to external commands.
|
||
|
||
Unfortunately, some system's @command{make} commands may prepend
|
||
@code{VPATH} prefixes like @samp{$@{srcdir@}/} to file names from the
|
||
source tree automatically (@pxref{Automatic Rule Rewriting, , Automatic
|
||
Rule Rewriting, autoconf, The Autoconf Manual}). In this case, the user
|
||
may have to switch to use GNU Make, or refrain from using VPATH builds,
|
||
in order to stay below the length limit.
|
||
|
||
For libraries and programs built from many sources, convenience archives
|
||
may be used as intermediates in order to limit the object list length
|
||
(@pxref{Libtool Convenience Libraries}).
|
||
|
||
|
||
@node Canonicalization
|
||
@section How derived variables are named
|
||
|
||
@cindex canonicalizing Automake variables
|
||
|
||
Sometimes a Makefile variable name is derived from some text the
|
||
maintainer supplies. For instance, a program name listed in
|
||
@samp{_PROGRAMS} is rewritten into the name of a @samp{_SOURCES}
|
||
variable. In cases like this, Automake canonicalizes the text, so that
|
||
program names and the like do not have to follow Makefile variable naming
|
||
rules. All characters in the name except for letters, numbers, the
|
||
strudel (@@), and the underscore are turned into underscores when making
|
||
variable references.
|
||
|
||
For example, if your program is named @file{sniff-glue}, the derived
|
||
variable name would be @samp{sniff_glue_SOURCES}, not
|
||
@samp{sniff-glue_SOURCES}. Similarly the sources for a library named
|
||
@file{libmumble++.a} should be listed in the
|
||
@samp{libmumble___a_SOURCES} variable.
|
||
|
||
The strudel is an addition, to make the use of Autoconf substitutions in
|
||
variable names less obfuscating.
|
||
|
||
|
||
@node User Variables
|
||
@section Variables reserved for the user
|
||
|
||
@cindex variables, reserved for the user
|
||
@cindex user variables
|
||
|
||
Some @file{Makefile} variables are reserved by the GNU Coding Standards
|
||
for the use of the ``user''---the person building the package. For
|
||
instance, @code{CFLAGS} is one such variable.
|
||
|
||
Sometimes package developers are tempted to set user variables such as
|
||
@code{CFLAGS} because it appears to make their job easier. However,
|
||
the package itself should never set a user variable, particularly not
|
||
to include switches that are required for proper compilation of the
|
||
package. Since these variables are documented as being for the
|
||
package builder, that person rightfully expects to be able to override
|
||
any of these variables at build time.
|
||
|
||
To get around this problem, Automake introduces an automake-specific
|
||
shadow variable for each user flag variable. (Shadow variables are
|
||
not introduced for variables like @code{CC}, where they would make no
|
||
sense.) The shadow variable is named by prepending @samp{AM_} to the
|
||
user variable's name. For instance, the shadow variable for
|
||
@code{YFLAGS} is @code{AM_YFLAGS}. The package maintainer---that is,
|
||
the author(s) of the @file{Makefile.am} and @file{configure.ac}
|
||
files---may adjust these shadow variables however necessary.
|
||
|
||
@xref{Flag Variables Ordering}, for more discussion about these
|
||
variables and how they interact with per-target variables.
|
||
|
||
@node Auxiliary Programs
|
||
@section Programs automake might require
|
||
|
||
@cindex Programs, auxiliary
|
||
@cindex Auxiliary programs
|
||
|
||
Automake sometimes requires helper programs so that the generated
|
||
@file{Makefile} can do its work properly. There are a fairly large
|
||
number of them, and we list them here.
|
||
|
||
Although all of these files are distributed and installed with
|
||
Automake, a couple of them are maintained separately. The Automake
|
||
copies are updated before each release, but we mention the original
|
||
source in case you need more recent versions.
|
||
|
||
@table @code
|
||
@item ar-lib
|
||
This is a wrapper primarily for the Microsoft lib archiver, to make
|
||
it more POSIX-like.
|
||
|
||
@item compile
|
||
This is a wrapper for compilers that do not accept options @option{-c}
|
||
and @option{-o} at the same time. It is only used when absolutely
|
||
required. Such compilers are rare, with the Microsoft C/C++ Compiler
|
||
as the most notable exception. This wrapper also makes the following
|
||
common options available for that compiler, while performing file name
|
||
translation where needed: @option{-I}, @option{-L}, @option{-l},
|
||
@option{-Wl,} and @option{-Xlinker}.
|
||
|
||
@item config.guess
|
||
@itemx config.sub
|
||
These two programs compute the canonical triplets for the given build,
|
||
host, or target architecture. These programs are updated regularly to
|
||
support new architectures and fix probes broken by changes in new
|
||
kernel versions. Each new release of Automake comes with up-to-date
|
||
copies of these programs. If your copy of Automake is getting old,
|
||
you are encouraged to fetch the latest versions of these files from
|
||
@url{http://savannah.gnu.org/git/?group=config} before making a
|
||
release.
|
||
|
||
@item depcomp
|
||
This program understands how to run a compiler so that it will
|
||
generate not only the desired output but also dependency information
|
||
that is then used by the automatic dependency tracking feature
|
||
(@pxref{Dependencies}).
|
||
|
||
@item install-sh
|
||
This is a replacement for the @command{install} program that works on
|
||
platforms where @command{install} is unavailable or unusable.
|
||
|
||
@item mdate-sh
|
||
This script is used to generate a @file{version.texi} file. It examines
|
||
a file and prints some date information about it.
|
||
|
||
@item missing
|
||
This wraps a number of programs that are typically only required by
|
||
maintainers. If the program in question doesn't exist, or seems to old,
|
||
@command{missing} will print an informative warning before failing out,
|
||
to provide the user with more context and information.
|
||
|
||
@item mkinstalldirs
|
||
This script used to be a wrapper around @samp{mkdir -p}, which is not
|
||
portable. Now we prefer to use @samp{install-sh -d} when @command{configure}
|
||
finds that @samp{mkdir -p} does not work, this makes one less script to
|
||
distribute.
|
||
|
||
For backward compatibility @file{mkinstalldirs} is still used and
|
||
distributed when @command{automake} finds it in a package. But it is no
|
||
longer installed automatically, and it should be safe to remove it.
|
||
|
||
@item py-compile
|
||
This is used to byte-compile Python scripts.
|
||
|
||
@item test-driver
|
||
This implements the default test driver offered by the parallel
|
||
testsuite harness.
|
||
|
||
@item texinfo.tex
|
||
Not a program, this file is required for @samp{make dvi}, @samp{make
|
||
ps} and @samp{make pdf} to work when Texinfo sources are in the
|
||
package. The latest version can be downloaded from
|
||
@url{http://www.gnu.org/software/texinfo/}.
|
||
|
||
@item ylwrap
|
||
This program wraps @command{lex} and @command{yacc} to rename their
|
||
output files. It also ensures that, for instance, multiple
|
||
@command{yacc} instances can be invoked in a single directory in
|
||
parallel.
|
||
|
||
@end table
|
||
|
||
|
||
@node Examples
|
||
@chapter Some example packages
|
||
|
||
This section contains two small examples.
|
||
|
||
The first example (@pxref{Complete}) assumes you have an existing
|
||
project already using Autoconf, with handcrafted @file{Makefile}s, and
|
||
that you want to convert it to using Automake. If you are discovering
|
||
both tools, it is probably better that you look at the Hello World
|
||
example presented earlier (@pxref{Hello World}).
|
||
|
||
The second example (@pxref{true}) shows how two programs can be built
|
||
from the same file, using different compilation parameters. It
|
||
contains some technical digressions that are probably best skipped on
|
||
first read.
|
||
|
||
@menu
|
||
* Complete:: A simple example, start to finish
|
||
* true:: Building true and false
|
||
@end menu
|
||
|
||
|
||
@node Complete
|
||
@section A simple example, start to finish
|
||
|
||
@cindex Complete example
|
||
|
||
Let's suppose you just finished writing @code{zardoz}, a program to make
|
||
your head float from vortex to vortex. You've been using Autoconf to
|
||
provide a portability framework, but your @file{Makefile.in}s have been
|
||
ad-hoc. You want to make them bulletproof, so you turn to Automake.
|
||
|
||
@cindex @code{AM_INIT_AUTOMAKE}, example use
|
||
|
||
The first step is to update your @file{configure.ac} to include the
|
||
commands that @command{automake} needs. The way to do this is to add an
|
||
@code{AM_INIT_AUTOMAKE} call just after @code{AC_INIT}:
|
||
|
||
@example
|
||
AC_INIT([zardoz], [1.0])
|
||
AM_INIT_AUTOMAKE
|
||
@dots{}
|
||
@end example
|
||
|
||
Since your program doesn't have any complicating factors (e.g., it
|
||
doesn't use @code{gettext}, it doesn't want to build a shared library),
|
||
you're done with this part. That was easy!
|
||
|
||
@cindex @command{aclocal} program, introduction
|
||
@cindex @file{aclocal.m4}, preexisting
|
||
@cindex @file{acinclude.m4}, defined
|
||
|
||
Now you must regenerate @file{configure}. But to do that, you'll need
|
||
to tell @command{autoconf} how to find the new macro you've used. The
|
||
easiest way to do this is to use the @command{aclocal} program to
|
||
generate your @file{aclocal.m4} for you. But wait@dots{} maybe you
|
||
already have an @file{aclocal.m4}, because you had to write some hairy
|
||
macros for your program. The @command{aclocal} program lets you put
|
||
your own macros into @file{acinclude.m4}, so simply rename and then
|
||
run:
|
||
|
||
@example
|
||
mv aclocal.m4 acinclude.m4
|
||
aclocal
|
||
autoconf
|
||
@end example
|
||
|
||
@cindex @command{zardoz} example
|
||
|
||
Now it is time to write your @file{Makefile.am} for @code{zardoz}.
|
||
Since @code{zardoz} is a user program, you want to install it where the
|
||
rest of the user programs go: @code{bindir}. Additionally,
|
||
@code{zardoz} has some Texinfo documentation. Your @file{configure.ac}
|
||
script uses @code{AC_REPLACE_FUNCS}, so you need to link against
|
||
@samp{$(LIBOBJS)}. So here's what you'd write:
|
||
|
||
@example
|
||
bin_PROGRAMS = zardoz
|
||
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
|
||
zardoz_LDADD = $(LIBOBJS)
|
||
|
||
info_TEXINFOS = zardoz.texi
|
||
@end example
|
||
|
||
Now you can run @samp{automake --add-missing} to generate your
|
||
@file{Makefile.in} and grab any auxiliary files you might need, and
|
||
you're done!
|
||
|
||
|
||
@node true
|
||
@section Building true and false
|
||
|
||
@cindex Example, @command{false} and @command{true}
|
||
@cindex @command{false} Example
|
||
@cindex @command{true} Example
|
||
|
||
Here is another, trickier example. It shows how to generate two
|
||
programs (@code{true} and @code{false}) from the same source file
|
||
(@file{true.c}). The difficult part is that each compilation of
|
||
@file{true.c} requires different @code{cpp} flags.
|
||
|
||
@example
|
||
bin_PROGRAMS = true false
|
||
false_SOURCES =
|
||
false_LDADD = false.o
|
||
|
||
true.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=0 -c true.c
|
||
|
||
false.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c
|
||
@end example
|
||
|
||
Note that there is no @code{true_SOURCES} definition. Automake will
|
||
implicitly assume that there is a source file named @file{true.c}
|
||
(@pxref{Default _SOURCES}), and
|
||
define rules to compile @file{true.o} and link @file{true}. The
|
||
@samp{true.o: true.c} rule supplied by the above @file{Makefile.am},
|
||
will override the Automake generated rule to build @file{true.o}.
|
||
|
||
@code{false_SOURCES} is defined to be empty---that way no implicit value
|
||
is substituted. Because we have not listed the source of
|
||
@file{false}, we have to tell Automake how to link the program. This is
|
||
the purpose of the @code{false_LDADD} line. A @code{false_DEPENDENCIES}
|
||
variable, holding the dependencies of the @file{false} target will be
|
||
automatically generated by Automake from the content of
|
||
@code{false_LDADD}.
|
||
|
||
The above rules won't work if your compiler doesn't accept both
|
||
@option{-c} and @option{-o}. The simplest fix for this is to introduce a
|
||
bogus dependency (to avoid problems with a parallel @command{make}):
|
||
|
||
@example
|
||
true.o: true.c false.o
|
||
$(COMPILE) -DEXIT_CODE=0 -c true.c
|
||
|
||
false.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o
|
||
@end example
|
||
|
||
As it turns out, there is also a much easier way to do this same task.
|
||
Some of the above technique is useful enough that we've kept the
|
||
example in the manual. However if you were to build @code{true} and
|
||
@code{false} in real life, you would probably use per-program
|
||
compilation flags, like so:
|
||
|
||
@c Keep in sync with specflg7.sh and specflg8.sh
|
||
@example
|
||
bin_PROGRAMS = false true
|
||
|
||
false_SOURCES = true.c
|
||
false_CPPFLAGS = -DEXIT_CODE=1
|
||
|
||
true_SOURCES = true.c
|
||
true_CPPFLAGS = -DEXIT_CODE=0
|
||
@end example
|
||
|
||
In this case Automake will cause @file{true.c} to be compiled twice,
|
||
with different flags. In this instance, the names of the object files
|
||
would be chosen by automake; they would be @file{false-true.o} and
|
||
@file{true-true.o}. (The name of the object files rarely matters.)
|
||
|
||
@node automake Invocation
|
||
@chapter Creating a @file{Makefile.in}
|
||
@c This node used to be named "Invoking automake". This @anchor
|
||
@c allows old links to still work.
|
||
@anchor{Invoking automake}
|
||
|
||
@cindex Multiple @file{configure.ac} files
|
||
@cindex Invoking @command{automake}
|
||
@cindex @command{automake}, invoking
|
||
@cindex Invocation of @command{automake}
|
||
@cindex @command{automake}, invocation
|
||
|
||
To create all the @file{Makefile.in}s for a package, run the
|
||
@command{automake} program in the top level directory, with no
|
||
arguments. @command{automake} will automatically find each
|
||
appropriate @file{Makefile.am} (by scanning @file{configure.ac};
|
||
@pxref{configure}) and generate the corresponding @file{Makefile.in}.
|
||
Note that @command{automake} has a rather simplistic view of what
|
||
constitutes a package; it assumes that a package has only one
|
||
@file{configure.ac}, at the top. If your package has multiple
|
||
@file{configure.ac}s, then you must run @command{automake} in each
|
||
directory holding a @file{configure.ac}. (Alternatively, you may rely
|
||
on Autoconf's @command{autoreconf}, which is able to recurse your
|
||
package tree and run @command{automake} where appropriate.)
|
||
|
||
You can optionally give @command{automake} an argument; @file{.am} is
|
||
appended to the argument and the result is used as the name of the
|
||
input file. This feature is generally only used to automatically
|
||
rebuild an out-of-date @file{Makefile.in}. Note that
|
||
@command{automake} must always be run from the topmost directory of a
|
||
project, even if being used to regenerate the @file{Makefile.in} in
|
||
some subdirectory. This is necessary because @command{automake} must
|
||
scan @file{configure.ac}, and because @command{automake} uses the
|
||
knowledge that a @file{Makefile.in} is in a subdirectory to change its
|
||
behavior in some cases.
|
||
|
||
@vindex AUTOCONF
|
||
Automake will run @command{autoconf} to scan @file{configure.ac} and
|
||
its dependencies (i.e., @file{aclocal.m4} and any included file),
|
||
therefore @command{autoconf} must be in your @env{PATH}. If there is
|
||
an @env{AUTOCONF} variable in your environment it will be used
|
||
instead of @command{autoconf}, this allows you to select a particular
|
||
version of Autoconf. By the way, don't misunderstand this paragraph:
|
||
@command{automake} runs @command{autoconf} to @strong{scan} your
|
||
@file{configure.ac}, this won't build @file{configure} and you still
|
||
have to run @command{autoconf} yourself for this purpose.
|
||
|
||
@cindex @command{automake} options
|
||
@cindex Options, @command{automake}
|
||
@cindex Strictness, command line
|
||
|
||
@command{automake} accepts the following options:
|
||
|
||
@cindex Extra files distributed with Automake
|
||
@cindex Files distributed with Automake
|
||
@cindex @file{config.guess}
|
||
|
||
@table @code
|
||
@item -a
|
||
@itemx --add-missing
|
||
@opindex -a
|
||
@opindex --add-missing
|
||
Automake requires certain common files to exist in certain situations;
|
||
for instance, @file{config.guess} is required if @file{configure.ac} invokes
|
||
@code{AC_CANONICAL_HOST}. Automake is distributed with several of these
|
||
files (@pxref{Auxiliary Programs}); this option will cause the missing
|
||
ones to be automatically added to the package, whenever possible. In
|
||
general if Automake tells you a file is missing, try using this option.
|
||
By default Automake tries to make a symbolic link pointing to its own
|
||
copy of the missing file; this can be changed with @option{--copy}.
|
||
|
||
Many of the potentially-missing files are common scripts whose
|
||
location may be specified via the @code{AC_CONFIG_AUX_DIR} macro.
|
||
Therefore, @code{AC_CONFIG_AUX_DIR}'s setting affects whether a
|
||
file is considered missing, and where the missing file is added
|
||
(@pxref{Optional}).
|
||
|
||
In some strictness modes, additional files are installed, see @ref{Gnits}
|
||
for more information.
|
||
|
||
@item --libdir=@var{dir}
|
||
@opindex --libdir
|
||
Look for Automake data files in directory @var{dir} instead of in the
|
||
installation directory. This is typically used for debugging.
|
||
|
||
@item --print-libdir
|
||
@opindex --print-libdir
|
||
Print the path of the installation directory containing Automake-provided
|
||
scripts and data files (like e.g., @file{texinfo.texi} and
|
||
@file{install-sh}).
|
||
|
||
@item -c
|
||
@opindex -c
|
||
@itemx --copy
|
||
@opindex --copy
|
||
When used with @option{--add-missing}, causes installed files to be
|
||
copied. The default is to make a symbolic link.
|
||
|
||
@item -f
|
||
@opindex -f
|
||
@itemx --force-missing
|
||
@opindex --force-missing
|
||
When used with @option{--add-missing}, causes standard files to be reinstalled
|
||
even if they already exist in the source tree. This involves removing
|
||
the file from the source tree before creating the new symlink (or, with
|
||
@option{--copy}, copying the new file).
|
||
|
||
@item --foreign
|
||
@opindex --foreign
|
||
Set the global strictness to @option{foreign}. For more information, see
|
||
@ref{Strictness}.
|
||
|
||
@item --gnits
|
||
@opindex --gnits
|
||
Set the global strictness to @option{gnits}. For more information, see
|
||
@ref{Gnits}.
|
||
|
||
@item --gnu
|
||
@opindex --gnu
|
||
Set the global strictness to @option{gnu}. For more information, see
|
||
@ref{Gnits}. This is the default strictness.
|
||
|
||
@item --help
|
||
@opindex --help
|
||
Print a summary of the command line options and exit.
|
||
|
||
@item -i
|
||
@itemx --ignore-deps
|
||
@opindex -i
|
||
This disables the dependency tracking feature in generated
|
||
@file{Makefile}s; see @ref{Dependencies}.
|
||
|
||
@item --include-deps
|
||
@opindex --include-deps
|
||
This enables the dependency tracking feature. This feature is enabled
|
||
by default. This option is provided for historical reasons only and
|
||
probably should not be used.
|
||
|
||
@item --no-force
|
||
@opindex --no-force
|
||
Ordinarily @command{automake} creates all @file{Makefile.in}s mentioned in
|
||
@file{configure.ac}. This option causes it to only update those
|
||
@file{Makefile.in}s that are out of date with respect to one of their
|
||
dependents.
|
||
|
||
@item -o @var{dir}
|
||
@itemx --output-dir=@var{dir}
|
||
@opindex -o
|
||
@opindex --output-dir
|
||
Put the generated @file{Makefile.in} in the directory @var{dir}.
|
||
Ordinarily each @file{Makefile.in} is created in the directory of the
|
||
corresponding @file{Makefile.am}. This option is deprecated and will be
|
||
removed in a future release.
|
||
|
||
@item -v
|
||
@itemx --verbose
|
||
@opindex -v
|
||
@opindex --verbose
|
||
Cause Automake to print information about which files are being read or
|
||
created.
|
||
|
||
@item --version
|
||
@opindex --version
|
||
Print the version number of Automake and exit.
|
||
|
||
@item -W CATEGORY
|
||
@itemx --warnings=@var{category}
|
||
@opindex -W
|
||
@opindex --warnings
|
||
Output warnings falling in @var{category}. @var{category} can be
|
||
one of:
|
||
@table @code
|
||
@item gnu
|
||
warnings related to the GNU Coding Standards
|
||
(@pxref{Top, , , standards, The GNU Coding Standards}).
|
||
@item obsolete
|
||
obsolete features or constructions
|
||
@item override
|
||
user redefinitions of Automake rules or variables
|
||
@item portability
|
||
portability issues (e.g., use of @command{make} features that are
|
||
known to be not portable)
|
||
@item extra-portability
|
||
extra portability issues related to obscure tools. One example of such
|
||
a tool is the Microsoft @command{lib} archiver.
|
||
@item syntax
|
||
weird syntax, unused variables, typos
|
||
@item unsupported
|
||
unsupported or incomplete features
|
||
@item all
|
||
all the warnings
|
||
@item none
|
||
turn off all the warnings
|
||
@item error
|
||
treat warnings as errors
|
||
@end table
|
||
|
||
A category can be turned off by prefixing its name with @samp{no-}. For
|
||
instance, @option{-Wno-syntax} will hide the warnings about unused
|
||
variables.
|
||
|
||
The categories output by default are @samp{obsolete}, @samp{syntax} and
|
||
@samp{unsupported}. Additionally, @samp{gnu} and @samp{portability}
|
||
are enabled in @option{--gnu} and @option{--gnits} strictness.
|
||
|
||
@c Checked by extra-portability.sh
|
||
Turning off @samp{portability} will also turn off @samp{extra-portability},
|
||
and similarly turning on @samp{extra-portability} will also turn on
|
||
@samp{portability}. However, turning on @samp{portability} or turning
|
||
off @samp{extra-portability} will not affect the other category.
|
||
|
||
@vindex WARNINGS
|
||
The environment variable @env{WARNINGS} can contain a comma separated
|
||
list of categories to enable. It will be taken into account before the
|
||
command-line switches, this way @option{-Wnone} will also ignore any
|
||
warning category enabled by @env{WARNINGS}. This variable is also used
|
||
by other tools like @command{autoconf}; unknown categories are ignored
|
||
for this reason.
|
||
|
||
@end table
|
||
|
||
@vindex AUTOMAKE_JOBS
|
||
If the environment variable @env{AUTOMAKE_JOBS} contains a positive
|
||
number, it is taken as the maximum number of Perl threads to use in
|
||
@command{automake} for generating multiple @file{Makefile.in} files
|
||
concurrently. This is an experimental feature.
|
||
|
||
|
||
@node configure
|
||
@chapter Scanning @file{configure.ac}, using @command{aclocal}
|
||
|
||
@cindex @file{configure.ac}, scanning
|
||
@cindex Scanning @file{configure.ac}
|
||
@cindex Using @command{aclocal}
|
||
@cindex @command{aclocal}, using
|
||
|
||
Automake scans the package's @file{configure.ac} to determine certain
|
||
information about the package. Some @command{autoconf} macros are required
|
||
and some variables must be defined in @file{configure.ac}. Automake
|
||
will also use information from @file{configure.ac} to further tailor its
|
||
output.
|
||
|
||
Automake also supplies some Autoconf macros to make the maintenance
|
||
easier. These macros can automatically be put into your
|
||
@file{aclocal.m4} using the @command{aclocal} program.
|
||
|
||
@menu
|
||
* Requirements:: Configuration requirements
|
||
* Optional:: Other things Automake recognizes
|
||
* aclocal Invocation:: Auto-generating aclocal.m4
|
||
* Macros:: Autoconf macros supplied with Automake
|
||
@end menu
|
||
|
||
|
||
@node Requirements
|
||
@section Configuration requirements
|
||
|
||
@cindex Automake requirements
|
||
@cindex Requirements of Automake
|
||
|
||
@acindex AM_INIT_AUTOMAKE
|
||
The one real requirement of Automake is that your @file{configure.ac}
|
||
call @code{AM_INIT_AUTOMAKE}. This macro does several things that are
|
||
required for proper Automake operation (@pxref{Macros}).
|
||
|
||
Here are the other macros that Automake requires but which are not run
|
||
by @code{AM_INIT_AUTOMAKE}:
|
||
|
||
@table @code
|
||
@item AC_CONFIG_FILES
|
||
@itemx AC_OUTPUT
|
||
@acindex AC_CONFIG_FILES
|
||
@acindex AC_OUTPUT
|
||
These two macros are usually invoked as follows near the end of
|
||
@file{configure.ac}.
|
||
|
||
@example
|
||
@dots{}
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
doc/Makefile
|
||
src/Makefile
|
||
src/lib/Makefile
|
||
@dots{}
|
||
])
|
||
AC_OUTPUT
|
||
@end example
|
||
|
||
Automake uses these to determine which files to create (@pxref{Output, ,
|
||
Creating Output Files, autoconf, The Autoconf Manual}). A listed file
|
||
is considered to be an Automake generated @file{Makefile} if there
|
||
exists a file with the same name and the @file{.am} extension appended.
|
||
Typically, @samp{AC_CONFIG_FILES([foo/Makefile])} will cause Automake to
|
||
generate @file{foo/Makefile.in} if @file{foo/Makefile.am} exists.
|
||
|
||
When using @code{AC_CONFIG_FILES} with multiple input files, as in
|
||
|
||
@example
|
||
AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])
|
||
@end example
|
||
|
||
@noindent
|
||
@command{automake} will generate the first @file{.in} input file for
|
||
which a @file{.am} file exists. If no such file exists the output
|
||
file is not considered to be generated by Automake.
|
||
|
||
Files created by @code{AC_CONFIG_FILES}, be they Automake
|
||
@file{Makefile}s or not, are all removed by @samp{make distclean}.
|
||
Their inputs are automatically distributed, unless they
|
||
are the output of prior @code{AC_CONFIG_FILES} commands.
|
||
Finally, rebuild rules are generated in the Automake @file{Makefile}
|
||
existing in the subdirectory of the output file, if there is one, or
|
||
in the top-level @file{Makefile} otherwise.
|
||
|
||
The above machinery (cleaning, distributing, and rebuilding) works
|
||
fine if the @code{AC_CONFIG_FILES} specifications contain only
|
||
literals. If part of the specification uses shell variables,
|
||
@command{automake} will not be able to fulfill this setup, and you will
|
||
have to complete the missing bits by hand. For instance, on
|
||
|
||
@c Keep in sync with output11.sh
|
||
@example
|
||
file=input
|
||
@dots{}
|
||
AC_CONFIG_FILES([output:$file],, [file=$file])
|
||
@end example
|
||
|
||
@noindent
|
||
@command{automake} will output rules to clean @file{output}, and
|
||
rebuild it. However the rebuild rule will not depend on @file{input},
|
||
and this file will not be distributed either. (You must add
|
||
@samp{EXTRA_DIST = input} to your @file{Makefile.am} if @file{input} is a
|
||
source file.)
|
||
|
||
Similarly
|
||
|
||
@c Keep in sync with output11.sh
|
||
@example
|
||
file=output
|
||
file2=out:in
|
||
@dots{}
|
||
AC_CONFIG_FILES([$file:input],, [file=$file])
|
||
AC_CONFIG_FILES([$file2],, [file2=$file2])
|
||
@end example
|
||
|
||
@noindent
|
||
will only cause @file{input} to be distributed. No file will be
|
||
cleaned automatically (add @samp{DISTCLEANFILES = output out}
|
||
yourself), and no rebuild rule will be output.
|
||
|
||
Obviously @command{automake} cannot guess what value @samp{$file} is
|
||
going to hold later when @file{configure} is run, and it cannot use
|
||
the shell variable @samp{$file} in a @file{Makefile}. However, if you
|
||
make reference to @samp{$file} as @samp{$@{file@}} (i.e., in a way
|
||
that is compatible with @command{make}'s syntax) and furthermore use
|
||
@code{AC_SUBST} to ensure that @samp{$@{file@}} is meaningful in a
|
||
@file{Makefile}, then @command{automake} will be able to use
|
||
@samp{$@{file@}} to generate all of these rules. For instance, here is
|
||
how the Automake package itself generates versioned scripts for its
|
||
test suite:
|
||
|
||
@example
|
||
AC_SUBST([APIVERSION], @dots{})
|
||
@dots{}
|
||
AC_CONFIG_FILES(
|
||
[tests/aclocal-$@{APIVERSION@}:tests/aclocal.in],
|
||
[chmod +x tests/aclocal-$@{APIVERSION@}],
|
||
[APIVERSION=$APIVERSION])
|
||
AC_CONFIG_FILES(
|
||
[tests/automake-$@{APIVERSION@}:tests/automake.in],
|
||
[chmod +x tests/automake-$@{APIVERSION@}])
|
||
@end example
|
||
|
||
@noindent
|
||
Here cleaning, distributing, and rebuilding are done automatically,
|
||
because @samp{$@{APIVERSION@}} is known at @command{make}-time.
|
||
|
||
Note that you should not use shell variables to declare
|
||
@file{Makefile} files for which @command{automake} must create
|
||
@file{Makefile.in}. Even @code{AC_SUBST} does not help here, because
|
||
@command{automake} needs to know the file name when it runs in order
|
||
to check whether @file{Makefile.am} exists. (In the very hairy case
|
||
that your setup requires such use of variables, you will have to tell
|
||
Automake which @file{Makefile.in}s to generate on the command-line.)
|
||
|
||
It is possible to let @command{automake} emit conditional rules for
|
||
@code{AC_CONFIG_FILES} with the help of @code{AM_COND_IF}
|
||
(@pxref{Optional}).
|
||
|
||
To summarize:
|
||
@itemize @bullet
|
||
@item
|
||
Use literals for @file{Makefile}s, and for other files whenever possible.
|
||
@item
|
||
Use @samp{$file} (or @samp{$@{file@}} without @samp{AC_SUBST([file])})
|
||
for files that @command{automake} should ignore.
|
||
@item
|
||
Use @samp{$@{file@}} and @samp{AC_SUBST([file])} for files
|
||
that @command{automake} should not ignore.
|
||
@end itemize
|
||
|
||
@end table
|
||
|
||
|
||
@node Optional
|
||
@section Other things Automake recognizes
|
||
|
||
@cindex Macros Automake recognizes
|
||
@cindex Recognized macros by Automake
|
||
|
||
Every time Automake is run it calls Autoconf to trace
|
||
@file{configure.ac}. This way it can recognize the use of certain
|
||
macros and tailor the generated @file{Makefile.in} appropriately.
|
||
Currently recognized macros and their effects are:
|
||
|
||
@ftable @code
|
||
@item AC_CANONICAL_BUILD
|
||
@itemx AC_CANONICAL_HOST
|
||
@itemx AC_CANONICAL_TARGET
|
||
@vindex build_triplet
|
||
@vindex host_triplet
|
||
@vindex target_triplet
|
||
Automake will ensure that @file{config.guess} and @file{config.sub}
|
||
exist. Also, the @file{Makefile} variables @code{build_triplet},
|
||
@code{host_triplet} and @code{target_triplet} are introduced. See
|
||
@ref{Canonicalizing, , Getting the Canonical System Type, autoconf,
|
||
The Autoconf Manual}.
|
||
|
||
@item AC_CONFIG_AUX_DIR
|
||
Automake will look for various helper scripts, such as
|
||
@file{install-sh}, in the directory named in this macro invocation.
|
||
@c This list is accurate relative to version 1.11
|
||
(The full list of scripts is:
|
||
@file{ar-lib},
|
||
@file{config.guess},
|
||
@file{config.sub},
|
||
@file{depcomp},
|
||
@file{compile},
|
||
@file{install-sh},
|
||
@file{ltmain.sh},
|
||
@file{mdate-sh},
|
||
@file{missing},
|
||
@file{mkinstalldirs},
|
||
@file{py-compile},
|
||
@file{test-driver},
|
||
@file{texinfo.tex},
|
||
@file{ylwrap}.)
|
||
Not all scripts are always searched for; some scripts
|
||
will only be sought if the generated @file{Makefile.in} requires them.
|
||
|
||
If @code{AC_CONFIG_AUX_DIR} is not given, the scripts are looked for in
|
||
their standard locations. For @file{mdate-sh},
|
||
@file{texinfo.tex}, and @file{ylwrap}, the standard location is the
|
||
source directory corresponding to the current @file{Makefile.am}. For
|
||
the rest, the standard location is the first one of @file{.}, @file{..},
|
||
or @file{../..} (relative to the top source directory) that provides any
|
||
one of the helper scripts. @xref{Input, , Finding `configure' Input,
|
||
autoconf, The Autoconf Manual}.
|
||
|
||
Required files from @code{AC_CONFIG_AUX_DIR} are automatically
|
||
distributed, even if there is no @file{Makefile.am} in this directory.
|
||
|
||
@item AC_CONFIG_LIBOBJ_DIR
|
||
Automake will require the sources file declared with
|
||
@code{AC_LIBSOURCE} (see below) in the directory specified by this
|
||
macro.
|
||
|
||
@item AC_CONFIG_HEADERS
|
||
Automake will generate rules to rebuild these headers from the
|
||
corresponding templates (usually, the template for a @file{foo.h}
|
||
header being @file{foo.h.in}). Older versions of Automake
|
||
required the use of @code{AM_CONFIG_HEADER}; this is no longer
|
||
the case, and that macro has indeed been removed.
|
||
|
||
As with @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
|
||
specification using shell variables will be ignored as far as
|
||
cleaning, distributing, and rebuilding is concerned.
|
||
|
||
@item AC_CONFIG_LINKS
|
||
Automake will generate rules to remove @file{configure} generated
|
||
links on @samp{make distclean} and to distribute named source files as
|
||
part of @samp{make dist}.
|
||
|
||
As for @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the
|
||
specification using shell variables will be ignored as far as cleaning
|
||
and distributing is concerned. (There are no rebuild rules for links.)
|
||
|
||
@item AC_LIBOBJ
|
||
@itemx AC_LIBSOURCE
|
||
@itemx AC_LIBSOURCES
|
||
@vindex LIBOBJS
|
||
Automake will automatically distribute any file listed in
|
||
@code{AC_LIBSOURCE} or @code{AC_LIBSOURCES}.
|
||
|
||
Note that the @code{AC_LIBOBJ} macro calls @code{AC_LIBSOURCE}. So if
|
||
an Autoconf macro is documented to call @samp{AC_LIBOBJ([file])}, then
|
||
@file{file.c} will be distributed automatically by Automake. This
|
||
encompasses many macros like @code{AC_FUNC_ALLOCA},
|
||
@code{AC_FUNC_MEMCMP}, @code{AC_REPLACE_FUNCS}, and others.
|
||
|
||
By the way, direct assignments to @code{LIBOBJS} are no longer
|
||
supported. You should always use @code{AC_LIBOBJ} for this purpose.
|
||
@xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
|
||
autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_PROG_RANLIB
|
||
This is required if any libraries are built in the package.
|
||
@xref{Particular Programs, , Particular Program Checks, autoconf, The
|
||
Autoconf Manual}.
|
||
|
||
@item AC_PROG_CXX
|
||
This is required if any C++ source is included. @xref{Particular
|
||
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_PROG_OBJC
|
||
This is required if any Objective C source is included. @xref{Particular
|
||
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_PROG_OBJCXX
|
||
This is required if any Objective C++ source is included. @xref{Particular
|
||
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_PROG_F77
|
||
This is required if any Fortran 77 source is included. @xref{Particular
|
||
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_F77_LIBRARY_LDFLAGS
|
||
This is required for programs and shared libraries that are a mixture of
|
||
languages that include Fortran 77 (@pxref{Mixing Fortran 77 With C and
|
||
C++}). @xref{Macros, , Autoconf macros supplied with Automake}.
|
||
|
||
@item AC_FC_SRCEXT
|
||
Automake will add the flags computed by @code{AC_FC_SRCEXT} to compilation
|
||
of files with the respective source extension (@pxref{Fortran Compiler, ,
|
||
Fortran Compiler Characteristics, autoconf, The Autoconf Manual}).
|
||
|
||
@item AC_PROG_FC
|
||
This is required if any Fortran 90/95 source is included. This macro is
|
||
distributed with Autoconf version 2.58 and later. @xref{Particular
|
||
Programs, , Particular Program Checks, autoconf, The Autoconf Manual}.
|
||
|
||
@item AC_PROG_LIBTOOL
|
||
Automake will turn on processing for @command{libtool} (@pxref{Top, ,
|
||
Introduction, libtool, The Libtool Manual}).
|
||
|
||
@item AC_PROG_YACC
|
||
@vindex YACC
|
||
If a Yacc source file is seen, then you must either use this macro or
|
||
define the variable @code{YACC} in @file{configure.ac}. The former is
|
||
preferred (@pxref{Particular Programs, , Particular Program Checks,
|
||
autoconf, The Autoconf Manual}).
|
||
|
||
@item AC_PROG_LEX
|
||
If a Lex source file is seen, then this macro must be used.
|
||
@xref{Particular Programs, , Particular Program Checks, autoconf, The
|
||
Autoconf Manual}.
|
||
|
||
@item AC_REQUIRE_AUX_FILE
|
||
For each @code{AC_REQUIRE_AUX_FILE([@var{file}])},
|
||
@command{automake} will ensure that @file{@var{file}} exists in the
|
||
aux directory, and will complain otherwise. It
|
||
will also automatically distribute the file. This macro should be
|
||
used by third-party Autoconf macros that require some supporting
|
||
files in the aux directory specified with @code{AC_CONFIG_AUX_DIR}
|
||
above. @xref{Input, , Finding @command{configure} Input, autoconf,
|
||
The Autoconf Manual}.
|
||
|
||
@item AC_SUBST
|
||
The first argument is automatically defined as a variable in each
|
||
generated @file{Makefile.in}, unless @code{AM_SUBST_NOTMAKE} is also
|
||
used for this variable. @xref{Setting Output Variables, , Setting
|
||
Output Variables, autoconf, The Autoconf Manual}.
|
||
|
||
For every substituted variable @var{var}, @command{automake} will add
|
||
a line @code{@var{var} = @var{value}} to each @file{Makefile.in} file.
|
||
Many Autoconf macros invoke @code{AC_SUBST} to set output variables
|
||
this way, e.g., @code{AC_PATH_XTRA} defines @code{X_CFLAGS} and
|
||
@code{X_LIBS}. Thus, you can access these variables as
|
||
@code{$(X_CFLAGS)} and @code{$(X_LIBS)} in any @file{Makefile.am}
|
||
if @code{AC_PATH_XTRA} is called.
|
||
|
||
@item AM_CONDITIONAL
|
||
This introduces an Automake conditional (@pxref{Conditionals}).
|
||
|
||
@item AM_COND_IF
|
||
This macro allows @code{automake} to detect subsequent access within
|
||
@file{configure.ac} to a conditional previously introduced with
|
||
@code{AM_CONDITIONAL}, thus enabling conditional @code{AC_CONFIG_FILES}
|
||
(@pxref{Usage of Conditionals}).
|
||
|
||
@item AM_GNU_GETTEXT
|
||
This macro is required for packages that use GNU gettext
|
||
(@pxref{gettext}). It is distributed with gettext. If Automake sees
|
||
this macro it ensures that the package meets some of gettext's
|
||
requirements.
|
||
|
||
@item AM_GNU_GETTEXT_INTL_SUBDIR
|
||
This macro specifies that the @file{intl/} subdirectory is to be built,
|
||
even if the @code{AM_GNU_GETTEXT} macro was invoked with a first argument
|
||
of @samp{external}.
|
||
|
||
@item AM_MAINTAINER_MODE(@ovar{default-mode})
|
||
@opindex --enable-maintainer-mode
|
||
@opindex --disable-maintainer-mode
|
||
This macro adds an @option{--enable-maintainer-mode} option to
|
||
@command{configure}. If this is used, @command{automake} will cause
|
||
``maintainer-only'' rules to be turned off by default in the
|
||
generated @file{Makefile.in}s, unless @var{default-mode} is
|
||
@samp{enable}. This macro defines the @code{MAINTAINER_MODE}
|
||
conditional, which you can use in your own @file{Makefile.am}.
|
||
@xref{maintainer-mode}.
|
||
|
||
@item AM_SUBST_NOTMAKE(@var{var})
|
||
Prevent Automake from defining a variable @var{var}, even if it is
|
||
substituted by @command{config.status}. Normally, Automake defines a
|
||
@command{make} variable for each @command{configure} substitution,
|
||
i.e., for each @code{AC_SUBST([@var{var}])}. This macro prevents that
|
||
definition from Automake. If @code{AC_SUBST} has not been called
|
||
for this variable, then @code{AM_SUBST_NOTMAKE} has no effects.
|
||
Preventing variable definitions may be useful for substitution of
|
||
multi-line values, where @code{@var{var} = @@@var{value}@@} might yield
|
||
unintended results.
|
||
|
||
@item m4_include
|
||
Files included by @file{configure.ac} using this macro will be
|
||
detected by Automake and automatically distributed. They will also
|
||
appear as dependencies in @file{Makefile} rules.
|
||
|
||
@code{m4_include} is seldom used by @file{configure.ac} authors, but
|
||
can appear in @file{aclocal.m4} when @command{aclocal} detects that
|
||
some required macros come from files local to your package (as opposed to
|
||
macros installed in a system-wide directory, @pxref{aclocal Invocation}).
|
||
|
||
@end ftable
|
||
|
||
@node aclocal Invocation
|
||
@section Auto-generating aclocal.m4
|
||
@c This node used to be named "Invoking automake". This @anchor
|
||
@c allows old links to still work.
|
||
@anchor{Invoking aclocal}
|
||
|
||
@cindex Invocation of @command{aclocal}
|
||
@cindex @command{aclocal}, Invocation
|
||
@cindex Invoking @command{aclocal}
|
||
@cindex @command{aclocal}, Invoking
|
||
|
||
Automake includes a number of Autoconf macros that can be used in
|
||
your package (@pxref{Macros}); some of them are actually required by
|
||
Automake in certain situations. These macros must be defined in your
|
||
@file{aclocal.m4}; otherwise they will not be seen by
|
||
@command{autoconf}.
|
||
|
||
The @command{aclocal} program will automatically generate
|
||
@file{aclocal.m4} files based on the contents of @file{configure.ac}.
|
||
This provides a convenient way to get Automake-provided macros,
|
||
without having to search around. The @command{aclocal} mechanism
|
||
allows other packages to supply their own macros (@pxref{Extending
|
||
aclocal}). You can also use it to maintain your own set of custom
|
||
macros (@pxref{Local Macros}).
|
||
|
||
At startup, @command{aclocal} scans all the @file{.m4} files it can
|
||
find, looking for macro definitions (@pxref{Macro Search Path}). Then
|
||
it scans @file{configure.ac}. Any mention of one of the macros found
|
||
in the first step causes that macro, and any macros it in turn
|
||
requires, to be put into @file{aclocal.m4}.
|
||
|
||
@emph{Putting} the file that contains the macro definition into
|
||
@file{aclocal.m4} is usually done by copying the entire text of this
|
||
file, including unused macro definitions as well as both @samp{#} and
|
||
@samp{dnl} comments. If you want to make a comment that will be
|
||
completely ignored by @command{aclocal}, use @samp{##} as the comment
|
||
leader.
|
||
|
||
When a file selected by @command{aclocal} is located in a subdirectory
|
||
specified as a relative search path with @command{aclocal}'s @option{-I}
|
||
argument, @command{aclocal} assumes the file belongs to the package
|
||
and uses @code{m4_include} instead of copying it into
|
||
@file{aclocal.m4}. This makes the package smaller, eases dependency
|
||
tracking, and cause the file to be distributed automatically.
|
||
(@xref{Local Macros}, for an example.) Any macro that is found in a
|
||
system-wide directory, or via an absolute search path will be copied.
|
||
So use @samp{-I `pwd`/reldir} instead of @samp{-I reldir} whenever
|
||
some relative directory should be considered outside the package.
|
||
|
||
The contents of @file{acinclude.m4}, if this file exists, are also
|
||
automatically included in @file{aclocal.m4}. We recommend against
|
||
using @file{acinclude.m4} in new packages (@pxref{Local Macros}).
|
||
|
||
@vindex AUTOM4TE
|
||
@cindex autom4te
|
||
While computing @file{aclocal.m4}, @command{aclocal} runs
|
||
@command{autom4te} (@pxref{Using autom4te, , Using @command{Autom4te},
|
||
autoconf, The Autoconf Manual}) in order to trace the macros that are
|
||
really used, and omit from @file{aclocal.m4} all macros that are
|
||
mentioned but otherwise unexpanded (this can happen when a macro is
|
||
called conditionally). @command{autom4te} is expected to be in the
|
||
@env{PATH}, just as @command{autoconf}. Its location can be
|
||
overridden using the @env{AUTOM4TE} environment variable.
|
||
|
||
@menu
|
||
* aclocal Options:: Options supported by aclocal
|
||
* Macro Search Path:: How aclocal finds .m4 files
|
||
* Extending aclocal:: Writing your own aclocal macros
|
||
* Local Macros:: Organizing local macros
|
||
* Serials:: Serial lines in Autoconf macros
|
||
* Future of aclocal:: aclocal's scheduled death
|
||
@end menu
|
||
|
||
@node aclocal Options
|
||
@subsection aclocal Options
|
||
|
||
@cindex @command{aclocal}, Options
|
||
@cindex Options, @command{aclocal}
|
||
|
||
@command{aclocal} accepts the following options:
|
||
|
||
@table @code
|
||
@item --automake-acdir=@var{dir}
|
||
@opindex --automake-acdir
|
||
Look for the automake-provided macro files in @var{dir} instead of
|
||
in the installation directory. This is typically used for debugging.
|
||
|
||
@item --system-acdir=@var{dir}
|
||
@opindex --system-acdir
|
||
Look for the system-wide third-party macro files (and the special
|
||
@file{dirlist} file) in @var{dir} instead of in the installation
|
||
directory. This is typically used for debugging.
|
||
|
||
@item --diff[=@var{command}]
|
||
@opindex --diff
|
||
Run @var{command} on M4 file that would be installed or overwritten
|
||
by @option{--install}. The default @var{command} is @samp{diff -u}.
|
||
This option implies @option{--install} and @option{--dry-run}.
|
||
|
||
@item --dry-run
|
||
@opindex --dry-run
|
||
Do not actually overwrite (or create) @file{aclocal.m4} and M4
|
||
files installed by @option{--install}.
|
||
|
||
@item --help
|
||
@opindex --help
|
||
Print a summary of the command line options and exit.
|
||
|
||
@item -I @var{dir}
|
||
@opindex -I
|
||
Add the directory @var{dir} to the list of directories searched for
|
||
@file{.m4} files.
|
||
|
||
@item --install
|
||
@opindex --install
|
||
Install system-wide third-party macros into the first directory
|
||
specified with @samp{-I @var{dir}} instead of copying them in the
|
||
output file.
|
||
@c Keep in sync with aclocal-install-absdir.sh
|
||
Note that this will happen also if @var{dir} is an absolute path.
|
||
|
||
@cindex serial number and @option{--install}
|
||
When this option is used, and only when this option is used,
|
||
@command{aclocal} will also honor @samp{#serial @var{number}} lines
|
||
that appear in macros: an M4 file is ignored if there exists another
|
||
M4 file with the same basename and a greater serial number in the
|
||
search path (@pxref{Serials}).
|
||
|
||
@item --force
|
||
@opindex --force
|
||
Always overwrite the output file. The default is to overwrite the output
|
||
file only when really needed, i.e., when its contents changes or if one
|
||
of its dependencies is younger.
|
||
|
||
This option forces the update of @file{aclocal.m4} (or the file
|
||
specified with @file{--output} below) and only this file, it has
|
||
absolutely no influence on files that may need to be installed by
|
||
@option{--install}.
|
||
|
||
@item --output=@var{file}
|
||
@opindex --output
|
||
Cause the output to be put into @var{file} instead of @file{aclocal.m4}.
|
||
|
||
@item --print-ac-dir
|
||
@opindex --print-ac-dir
|
||
Prints the name of the directory that @command{aclocal} will search to
|
||
find third-party @file{.m4} files. When this option is given, normal
|
||
processing is suppressed. This option was used @emph{in the past} by
|
||
third-party packages to determine where to install @file{.m4} macro
|
||
files, but @emph{this usage is today discouraged}, since it causes
|
||
@samp{$(prefix)} not to be thoroughly honored (which violates the
|
||
GNU Coding Standards), and a similar semantics can be better obtained
|
||
with the @env{ACLOCAL_PATH} environment variable; @pxref{Extending aclocal}.
|
||
|
||
@item --verbose
|
||
@opindex --verbose
|
||
Print the names of the files it examines.
|
||
|
||
@item --version
|
||
@opindex --version
|
||
Print the version number of Automake and exit.
|
||
|
||
@item -W CATEGORY
|
||
@item --warnings=@var{category}
|
||
@opindex -W
|
||
@opindex --warnings
|
||
Output warnings falling in @var{category}. @var{category} can be
|
||
one of:
|
||
@table @code
|
||
@item syntax
|
||
dubious syntactic constructs, underquoted macros, unused macros, etc.
|
||
@item unsupported
|
||
unknown macros
|
||
@item all
|
||
all the warnings, this is the default
|
||
@item none
|
||
turn off all the warnings
|
||
@item error
|
||
treat warnings as errors
|
||
@end table
|
||
|
||
All warnings are output by default.
|
||
|
||
@vindex WARNINGS
|
||
The environment variable @env{WARNINGS} is honored in the same
|
||
way as it is for @command{automake} (@pxref{automake Invocation}).
|
||
|
||
@end table
|
||
|
||
@node Macro Search Path
|
||
@subsection Macro Search Path
|
||
|
||
@cindex Macro search path
|
||
@cindex @command{aclocal} search path
|
||
|
||
By default, @command{aclocal} searches for @file{.m4} files in the following
|
||
directories, in this order:
|
||
|
||
@table @code
|
||
@item @var{acdir-APIVERSION}
|
||
This is where the @file{.m4} macros distributed with Automake itself
|
||
are stored. @var{APIVERSION} depends on the Automake release used;
|
||
for example, for Automake 1.11.x, @var{APIVERSION} = @code{1.11}.
|
||
|
||
@item @var{acdir}
|
||
This directory is intended for third party @file{.m4} files, and is
|
||
configured when @command{automake} itself is built. This is
|
||
@file{@@datadir@@/aclocal/}, which typically
|
||
expands to @file{$@{prefix@}/share/aclocal/}. To find the compiled-in
|
||
value of @var{acdir}, use the @option{--print-ac-dir} option
|
||
(@pxref{aclocal Options}).
|
||
@end table
|
||
|
||
As an example, suppose that @command{automake-1.11.2} was configured with
|
||
@option{--prefix=@-/usr/local}. Then, the search path would be:
|
||
|
||
@enumerate
|
||
@item @file{/usr/local/share/aclocal-1.11.2/}
|
||
@item @file{/usr/local/share/aclocal/}
|
||
@end enumerate
|
||
|
||
The paths for the @var{acdir} and @var{acdir-APIVERSION} directories can
|
||
be changed respectively through aclocal options @option{--system-acdir}
|
||
and @option{--automake-acdir} (@pxref{aclocal Options}). Note however
|
||
that these options are only intended for use by the internal Automake
|
||
test suite, or for debugging under highly unusual situations; they are
|
||
not ordinarily needed by end-users.
|
||
|
||
As explained in (@pxref{aclocal Options}), there are several options that
|
||
can be used to change or extend this search path.
|
||
|
||
@subsubheading Modifying the Macro Search Path: @samp{-I @var{dir}}
|
||
|
||
Any extra directories specified using @option{-I} options
|
||
(@pxref{aclocal Options}) are @emph{prepended} to this search list. Thus,
|
||
@samp{aclocal -I /foo -I /bar} results in the following search path:
|
||
|
||
@enumerate
|
||
@item @file{/foo}
|
||
@item @file{/bar}
|
||
@item @var{acdir}-@var{APIVERSION}
|
||
@item @var{acdir}
|
||
@end enumerate
|
||
|
||
@subsubheading Modifying the Macro Search Path: @file{dirlist}
|
||
@cindex @file{dirlist}
|
||
|
||
There is a third mechanism for customizing the search path. If a
|
||
@file{dirlist} file exists in @var{acdir}, then that file is assumed to
|
||
contain a list of directory patterns, one per line. @command{aclocal}
|
||
expands these patterns to directory names, and adds them to the search
|
||
list @emph{after} all other directories. @file{dirlist} entries may
|
||
use shell wildcards such as @samp{*}, @samp{?}, or @code{[...]}.
|
||
|
||
For example, suppose
|
||
@file{@var{acdir}/dirlist} contains the following:
|
||
|
||
@example
|
||
/test1
|
||
/test2
|
||
/test3*
|
||
@end example
|
||
|
||
@noindent
|
||
and that @command{aclocal} was called with the @samp{-I /foo -I /bar} options.
|
||
Then, the search path would be
|
||
|
||
@c @code looks better than @file here
|
||
@enumerate
|
||
@item @code{/foo}
|
||
@item @code{/bar}
|
||
@item @var{acdir}-@var{APIVERSION}
|
||
@item @var{acdir}
|
||
@item @code{/test1}
|
||
@item @code{/test2}
|
||
@end enumerate
|
||
|
||
@noindent
|
||
and all directories with path names starting with @code{/test3}.
|
||
|
||
If the @option{--system-acdir=@var{dir}} option is used, then
|
||
@command{aclocal} will search for the @file{dirlist} file in
|
||
@var{dir}; but remember the warnings above against the use of
|
||
@option{--system-acdir}.
|
||
|
||
@file{dirlist} is useful in the following situation: suppose that
|
||
@command{automake} version @code{1.11.2} is installed with
|
||
@samp{--prefix=/usr} by the system vendor. Thus, the default search
|
||
directories are
|
||
|
||
@c @code looks better than @file here
|
||
@enumerate
|
||
@item @code{/usr/share/aclocal-1.11/}
|
||
@item @code{/usr/share/aclocal/}
|
||
@end enumerate
|
||
|
||
However, suppose further that many packages have been manually
|
||
installed on the system, with $prefix=/usr/local, as is typical. In
|
||
that case, many of these ``extra'' @file{.m4} files are in
|
||
@file{/usr/local/share/aclocal}. The only way to force
|
||
@file{/usr/bin/aclocal} to find these ``extra'' @file{.m4} files is to
|
||
always call @samp{aclocal -I /usr/local/share/aclocal}. This is
|
||
inconvenient. With @file{dirlist}, one may create a file
|
||
@file{/usr/share/aclocal/dirlist} containing only the single line
|
||
|
||
@example
|
||
/usr/local/share/aclocal
|
||
@end example
|
||
|
||
Now, the ``default'' search path on the affected system is
|
||
|
||
@c @code looks better than @file here
|
||
@enumerate
|
||
@item @code{/usr/share/aclocal-1.11/}
|
||
@item @code{/usr/share/aclocal/}
|
||
@item @code{/usr/local/share/aclocal/}
|
||
@end enumerate
|
||
|
||
without the need for @option{-I} options; @option{-I} options can be reserved
|
||
for project-specific needs (@file{my-source-dir/m4/}), rather than
|
||
using it to work around local system-dependent tool installation
|
||
directories.
|
||
|
||
Similarly, @file{dirlist} can be handy if you have installed a local
|
||
copy of Automake in your account and want @command{aclocal} to look for
|
||
macros installed at other places on the system.
|
||
|
||
@anchor{ACLOCAL_PATH}
|
||
@subsubheading Modifying the Macro Search Path: @file{ACLOCAL_PATH}
|
||
@cindex @env{ACLOCAL_PATH}
|
||
|
||
The fourth and last mechanism to customize the macro search path is
|
||
also the simplest. Any directory included in the colon-separated
|
||
environment variable @env{ACLOCAL_PATH} is added to the search path
|
||
@c Keep in sync with aclocal-path-precedence.sh
|
||
and takes precedence over system directories (including those found via
|
||
@file{dirlist}), with the exception of the versioned directory
|
||
@var{acdir-APIVERSION} (@pxref{Macro Search Path}). However, directories
|
||
passed via @option{-I} will take precedence over directories in
|
||
@env{ACLOCAL_PATH}.
|
||
|
||
@c Keep in sync with aclocal-path-installed.sh
|
||
Also note that, if the @option{--install} option is used, any @file{.m4}
|
||
file containing a required macro that is found in a directory listed in
|
||
@env{ACLOCAL_PATH} will be installed locally.
|
||
@c Keep in sync with aclocal-path-installed-serial.sh
|
||
In this case, serial numbers in @file{.m4} are honored too,
|
||
@pxref{Serials}.
|
||
|
||
Conversely to @file{dirlist}, @env{ACLOCAL_PATH} is useful if you are
|
||
using a global copy of Automake and want @command{aclocal} to look for
|
||
macros somewhere under your home directory.
|
||
|
||
@subsubheading Planned future incompatibilities
|
||
|
||
The order in which the directories in the macro search path are currently
|
||
looked up is confusing and/or suboptimal in various aspects, and is
|
||
probably going to be changed in the future Automake release. In
|
||
particular, directories in @env{ACLOCAL_PATH} and @file{@var{acdir}}
|
||
might end up taking precedence over @file{@var{acdir-APIVERSION}}, and
|
||
directories in @file{@var{acdir}/dirlist} might end up taking precedence
|
||
over @file{@var{acdir}}. @emph{This is a possible future incompatibility!}
|
||
|
||
@node Extending aclocal
|
||
@subsection Writing your own aclocal macros
|
||
|
||
@cindex @command{aclocal}, extending
|
||
@cindex Extending @command{aclocal}
|
||
|
||
The @command{aclocal} program doesn't have any built-in knowledge of any
|
||
macros, so it is easy to extend it with your own macros.
|
||
|
||
This can be used by libraries that want to supply their own Autoconf
|
||
macros for use by other programs. For instance, the @command{gettext}
|
||
library supplies a macro @code{AM_GNU_GETTEXT} that should be used by
|
||
any package using @command{gettext}. When the library is installed, it
|
||
installs this macro so that @command{aclocal} will find it.
|
||
|
||
A macro file's name should end in @file{.m4}. Such files should be
|
||
installed in @file{$(datadir)/aclocal}. This is as simple as writing:
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
aclocaldir = $(datadir)/aclocal
|
||
aclocal_DATA = mymacro.m4 myothermacro.m4
|
||
@end example
|
||
|
||
@noindent
|
||
Please do use @file{$(datadir)/aclocal}, and not something based on
|
||
the result of @samp{aclocal --print-ac-dir} (@pxref{Hard-Coded Install
|
||
Paths}, for arguments). It might also be helpful to suggest to
|
||
the user to add the @file{$(datadir)/aclocal} directory to his
|
||
@env{ACLOCAL_PATH} variable (@pxref{ACLOCAL_PATH}) so that
|
||
@command{aclocal} will find the @file{.m4} files installed by your
|
||
package automatically.
|
||
|
||
A file of macros should be a series of properly quoted
|
||
@code{AC_DEFUN}'s (@pxref{Macro Definitions, , , autoconf, The
|
||
Autoconf Manual}). The @command{aclocal} programs also understands
|
||
@code{AC_REQUIRE} (@pxref{Prerequisite Macros, , , autoconf, The
|
||
Autoconf Manual}), so it is safe to put each macro in a separate file.
|
||
Each file should have no side effects but macro definitions.
|
||
Especially, any call to @code{AC_PREREQ} should be done inside the
|
||
defined macro, not at the beginning of the file.
|
||
|
||
@cindex underquoted @code{AC_DEFUN}
|
||
@acindex AC_DEFUN
|
||
@acindex AC_PREREQ
|
||
|
||
Starting with Automake 1.8, @command{aclocal} will warn about all
|
||
underquoted calls to @code{AC_DEFUN}. We realize this will annoy a
|
||
lot of people, because @command{aclocal} was not so strict in the past
|
||
and many third party macros are underquoted; and we have to apologize
|
||
for this temporary inconvenience. The reason we have to be stricter
|
||
is that a future implementation of @command{aclocal} (@pxref{Future of
|
||
aclocal}) will have to temporarily include all of these third party
|
||
@file{.m4} files, maybe several times, including even files that are
|
||
not actually needed. Doing so should alleviate many problems of the
|
||
current implementation, however it requires a stricter style from the
|
||
macro authors. Hopefully it is easy to revise the existing macros.
|
||
For instance,
|
||
|
||
@example
|
||
# bad style
|
||
AC_PREREQ(2.68)
|
||
AC_DEFUN(AX_FOOBAR,
|
||
[AC_REQUIRE([AX_SOMETHING])dnl
|
||
AX_FOO
|
||
AX_BAR
|
||
])
|
||
@end example
|
||
|
||
@noindent
|
||
should be rewritten as
|
||
|
||
@example
|
||
AC_DEFUN([AX_FOOBAR],
|
||
[AC_PREREQ([2.68])dnl
|
||
AC_REQUIRE([AX_SOMETHING])dnl
|
||
AX_FOO
|
||
AX_BAR
|
||
])
|
||
@end example
|
||
|
||
Wrapping the @code{AC_PREREQ} call inside the macro ensures that
|
||
Autoconf 2.68 will not be required if @code{AX_FOOBAR} is not actually
|
||
used. Most importantly, quoting the first argument of @code{AC_DEFUN}
|
||
allows the macro to be redefined or included twice (otherwise this
|
||
first argument would be expanded during the second definition). For
|
||
consistency we like to quote even arguments such as @code{2.68} that
|
||
do not require it.
|
||
|
||
If you have been directed here by the @command{aclocal} diagnostic but
|
||
are not the maintainer of the implicated macro, you will want to
|
||
contact the maintainer of that macro. Please make sure you have the
|
||
latest version of the macro and that the problem hasn't already been
|
||
reported before doing so: people tend to work faster when they aren't
|
||
flooded by mails.
|
||
|
||
Another situation where @command{aclocal} is commonly used is to
|
||
manage macros that are used locally by the package, @ref{Local
|
||
Macros}.
|
||
|
||
@node Local Macros
|
||
@subsection Handling Local Macros
|
||
|
||
Feature tests offered by Autoconf do not cover all needs. People
|
||
often have to supplement existing tests with their own macros, or
|
||
with third-party macros.
|
||
|
||
There are two ways to organize custom macros in a package.
|
||
|
||
The first possibility (the historical practice) is to list all your
|
||
macros in @file{acinclude.m4}. This file will be included in
|
||
@file{aclocal.m4} when you run @command{aclocal}, and its macro(s) will
|
||
henceforth be visible to @command{autoconf}. However if it contains
|
||
numerous macros, it will rapidly become difficult to maintain, and it
|
||
will be almost impossible to share macros between packages.
|
||
|
||
The second possibility, which we do recommend, is to write each macro
|
||
in its own file and gather all these files in a directory. This
|
||
directory is usually called @file{m4/}. Then it's enough to update
|
||
@file{configure.ac} by adding a proper call to @code{AC_CONFIG_MACRO_DIRS}:
|
||
|
||
@example
|
||
AC_CONFIG_MACRO_DIRS([m4])
|
||
@end example
|
||
|
||
@command{aclocal} will then take care of automatically adding @file{m4/}
|
||
to its search path for m4 files.
|
||
|
||
When @samp{aclocal} is run, it will build an @file{aclocal.m4}
|
||
that @code{m4_include}s any file from @file{m4/} that defines a
|
||
required macro. Macros not found locally will still be searched in
|
||
system-wide directories, as explained in @ref{Macro Search Path}.
|
||
|
||
Custom macros should be distributed for the same reason that
|
||
@file{configure.ac} is: so that other people have all the sources of
|
||
your package if they want to work on it. Actually, this distribution
|
||
happens automatically because all @code{m4_include}d files are
|
||
distributed.
|
||
|
||
However there is no consensus on the distribution of third-party
|
||
macros that your package may use. Many libraries install their own
|
||
macro in the system-wide @command{aclocal} directory (@pxref{Extending
|
||
aclocal}). For instance, Guile ships with a file called
|
||
@file{guile.m4} that contains the macro @code{GUILE_FLAGS} that can
|
||
be used to define setup compiler and linker flags appropriate for
|
||
using Guile. Using @code{GUILE_FLAGS} in @file{configure.ac} will
|
||
cause @command{aclocal} to copy @file{guile.m4} into
|
||
@file{aclocal.m4}, but as @file{guile.m4} is not part of the project,
|
||
it will not be distributed. Technically, that means a user who
|
||
needs to rebuild @file{aclocal.m4} will have to install Guile first.
|
||
This is probably OK, if Guile already is a requirement to build the
|
||
package. However, if Guile is only an optional feature, or if your
|
||
package might run on architectures where Guile cannot be installed,
|
||
this requirement will hinder development. An easy solution is to copy
|
||
such third-party macros in your local @file{m4/} directory so they get
|
||
distributed.
|
||
|
||
Since Automake 1.10, @command{aclocal} offers the option @code{--install}
|
||
to copy these system-wide third-party macros in your local macro directory,
|
||
helping to solve the above problem.
|
||
|
||
With this setup, system-wide macros will be copied to @file{m4/}
|
||
the first time you run @command{aclocal}. Then the locally installed
|
||
macros will have precedence over the system-wide installed macros
|
||
each time @command{aclocal} is run again.
|
||
|
||
One reason why you should keep @option{--install} in the flags even
|
||
after the first run is that when you later edit @file{configure.ac}
|
||
and depend on a new macro, this macro will be installed in your
|
||
@file{m4/} automatically. Another one is that serial numbers
|
||
(@pxref{Serials}) can be used to update the macros in your source tree
|
||
automatically when new system-wide versions are installed. A serial
|
||
number should be a single line of the form
|
||
|
||
@example
|
||
#serial @var{nnn}
|
||
@end example
|
||
|
||
@noindent
|
||
where @var{nnn} contains only digits and dots. It should appear in
|
||
the M4 file before any macro definition. It is a good practice to
|
||
maintain a serial number for each macro you distribute, even if you do
|
||
not use the @option{--install} option of @command{aclocal}: this allows
|
||
other people to use it.
|
||
|
||
|
||
@node Serials
|
||
@subsection Serial Numbers
|
||
@cindex serial numbers in macros
|
||
@cindex macro serial numbers
|
||
@cindex @code{#serial} syntax
|
||
@cindex @command{aclocal} and serial numbers
|
||
|
||
Because third-party macros defined in @file{*.m4} files are naturally
|
||
shared between multiple projects, some people like to version them.
|
||
This makes it easier to tell which of two M4 files is newer. Since at
|
||
least 1996, the tradition is to use a @samp{#serial} line for this.
|
||
|
||
A serial number should be a single line of the form
|
||
|
||
@example
|
||
# serial @var{version}
|
||
@end example
|
||
|
||
@noindent
|
||
where @var{version} is a version number containing only digits and
|
||
dots. Usually people use a single integer, and they increment it each
|
||
time they change the macro (hence the name of ``serial''). Such a
|
||
line should appear in the M4 file before any macro definition.
|
||
|
||
The @samp{#} must be the first character on the line,
|
||
and it is OK to have extra words after the version, as in
|
||
|
||
@example
|
||
#serial @var{version} @var{garbage}
|
||
@end example
|
||
|
||
Normally these serial numbers are completely ignored by
|
||
@command{aclocal} and @command{autoconf}, like any genuine comment.
|
||
However when using @command{aclocal}'s @option{--install} feature, these
|
||
serial numbers will modify the way @command{aclocal} selects the
|
||
macros to install in the package: if two files with the same basename
|
||
exist in your search path, and if at least one of them uses a
|
||
@samp{#serial} line, @command{aclocal} will ignore the file that has
|
||
the older @samp{#serial} line (or the file that has none).
|
||
|
||
Note that a serial number applies to a whole M4 file, not to any macro
|
||
it contains. A file can contains multiple macros, but only one
|
||
serial.
|
||
|
||
Here is a use case that illustrates the use of @option{--install} and
|
||
its interaction with serial numbers. Let's assume we maintain a
|
||
package called MyPackage, the @file{configure.ac} of which requires a
|
||
third-party macro @code{AX_THIRD_PARTY} defined in
|
||
@file{/usr/share/aclocal/thirdparty.m4} as follows:
|
||
|
||
@example
|
||
# serial 1
|
||
AC_DEFUN([AX_THIRD_PARTY], [...])
|
||
@end example
|
||
|
||
MyPackage uses an @file{m4/} directory to store local macros as
|
||
explained in @ref{Local Macros}, and has
|
||
|
||
@example
|
||
AC_CONFIG_MACRO_DIRS([m4])
|
||
@end example
|
||
|
||
@noindent
|
||
in its @file{configure.ac}.
|
||
|
||
Initially the @file{m4/} directory is empty. The first time we run
|
||
@command{aclocal --install}, it will notice that
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@file{configure.ac} uses @code{AX_THIRD_PARTY}
|
||
@item
|
||
No local macros define @code{AX_THIRD_PARTY}
|
||
@item
|
||
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
|
||
with serial 1.
|
||
@end itemize
|
||
|
||
@noindent
|
||
Because @file{/usr/share/aclocal/thirdparty.m4} is a system-wide macro
|
||
and @command{aclocal} was given the @option{--install} option, it will
|
||
copy this file in @file{m4/thirdparty.m4}, and output an
|
||
@file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.
|
||
|
||
The next time @samp{aclocal --install} is run, something different
|
||
happens. @command{aclocal} notices that
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@file{configure.ac} uses @code{AX_THIRD_PARTY}
|
||
@item
|
||
@file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
|
||
with serial 1.
|
||
@item
|
||
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
|
||
with serial 1.
|
||
@end itemize
|
||
|
||
@noindent
|
||
Because both files have the same serial number, @command{aclocal} uses
|
||
the first it found in its search path order (@pxref{Macro Search
|
||
Path}). @command{aclocal} therefore ignores
|
||
@file{/usr/share/aclocal/thirdparty.m4} and outputs an
|
||
@file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}.
|
||
|
||
Local directories specified with @option{-I} are always searched before
|
||
system-wide directories, so a local file will always be preferred to
|
||
the system-wide file in case of equal serial numbers.
|
||
|
||
Now suppose the system-wide third-party macro is changed. This can
|
||
happen if the package installing this macro is updated. Let's suppose
|
||
the new macro has serial number 2. The next time @samp{aclocal --install}
|
||
is run the situation is the following:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@file{configure.ac} uses @code{AX_THIRD_PARTY}
|
||
@item
|
||
@file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY}
|
||
with serial 1.
|
||
@item
|
||
@file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY}
|
||
with serial 2.
|
||
@end itemize
|
||
|
||
@noindent
|
||
When @command{aclocal} sees a greater serial number, it immediately
|
||
forgets anything it knows from files that have the same basename and a
|
||
smaller serial number. So after it has found
|
||
@file{/usr/share/aclocal/thirdparty.m4} with serial 2,
|
||
@command{aclocal} will proceed as if it had never seen
|
||
@file{m4/thirdparty.m4}. This brings us back to a situation similar
|
||
to that at the beginning of our example, where no local file defined
|
||
the macro. @command{aclocal} will install the new version of the
|
||
macro in @file{m4/thirdparty.m4}, in this case overriding the old
|
||
version. MyPackage just had its macro updated as a side effect of
|
||
running @command{aclocal}.
|
||
|
||
If you are leery of letting @command{aclocal} update your local
|
||
macro, you can run @samp{aclocal --diff} to review the changes
|
||
@samp{aclocal --install} would perform on these macros.
|
||
|
||
Finally, note that the @option{--force} option of @command{aclocal} has
|
||
absolutely no effect on the files installed by @option{--install}. For
|
||
instance, if you have modified your local macros, do not expect
|
||
@option{--install --force} to replace the local macros by their
|
||
system-wide versions. If you want to do so, simply erase the local
|
||
macros you want to revert, and run @samp{aclocal --install}.
|
||
|
||
|
||
@node Future of aclocal
|
||
@subsection The Future of @command{aclocal}
|
||
@cindex @command{aclocal}'s scheduled death
|
||
|
||
@command{aclocal} is expected to disappear. This feature really
|
||
should not be offered by Automake. Automake should focus on
|
||
generating @file{Makefile}s; dealing with M4 macros really is
|
||
Autoconf's job. The fact that some people install Automake just to use
|
||
@command{aclocal}, but do not use @command{automake} otherwise is an
|
||
indication of how that feature is misplaced.
|
||
|
||
The new implementation will probably be done slightly differently.
|
||
For instance, it could enforce the @file{m4/}-style layout discussed in
|
||
@ref{Local Macros}.
|
||
|
||
We have no idea when and how this will happen. This has been
|
||
discussed several times in the past, but someone still has to commit
|
||
to that non-trivial task.
|
||
|
||
From the user point of view, @command{aclocal}'s removal might turn
|
||
out to be painful. There is a simple precaution that you may take to
|
||
make that switch more seamless: never call @command{aclocal} yourself.
|
||
Keep this guy under the exclusive control of @command{autoreconf} and
|
||
Automake's rebuild rules. Hopefully you won't need to worry about
|
||
things breaking, when @command{aclocal} disappears, because everything
|
||
will have been taken care of. If otherwise you used to call
|
||
@command{aclocal} directly yourself or from some script, you will
|
||
quickly notice the change.
|
||
|
||
Many packages come with a script called @file{bootstrap} or
|
||
@file{autogen.sh}, that will just call @command{aclocal},
|
||
@command{libtoolize}, @command{gettextize} or @command{autopoint},
|
||
@command{autoconf}, @command{autoheader}, and @command{automake} in
|
||
the right order. Actually this is precisely what @command{autoreconf}
|
||
can do for you. If your package has such a @file{bootstrap} or
|
||
@file{autogen.sh} script, consider using @command{autoreconf}. That
|
||
should simplify its logic a lot (less things to maintain, yum!), it's
|
||
even likely you will not need the script anymore, and more to the point
|
||
you will not call @command{aclocal} directly anymore.
|
||
|
||
For the time being, third-party packages should continue to install
|
||
public macros into @file{/usr/share/aclocal/}. If @command{aclocal}
|
||
is replaced by another tool it might make sense to rename the
|
||
directory, but supporting @file{/usr/share/aclocal/} for backward
|
||
compatibility should be really easy provided all macros are properly
|
||
written (@pxref{Extending aclocal}).
|
||
|
||
|
||
|
||
@node Macros
|
||
@section Autoconf macros supplied with Automake
|
||
|
||
Automake ships with several Autoconf macros that you can use from your
|
||
@file{configure.ac}. When you use one of them it will be included by
|
||
@command{aclocal} in @file{aclocal.m4}.
|
||
|
||
@menu
|
||
* Public Macros:: Macros that you can use.
|
||
* Obsolete Macros:: Macros that will soon be removed.
|
||
* Private Macros:: Macros that you should not use.
|
||
@end menu
|
||
|
||
@c consider generating the following subsections automatically from m4 files.
|
||
|
||
@node Public Macros
|
||
@subsection Public Macros
|
||
|
||
@table @code
|
||
|
||
@item AM_INIT_AUTOMAKE([OPTIONS])
|
||
@acindex AM_INIT_AUTOMAKE
|
||
Runs many macros required for proper operation of the generated Makefiles.
|
||
|
||
@vindex AUTOMAKE_OPTIONS
|
||
Today, @code{AM_INIT_AUTOMAKE} is called with a single argument: a
|
||
space-separated list of Automake options that should be applied to
|
||
every @file{Makefile.am} in the tree. The effect is as if
|
||
each option were listed in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).
|
||
|
||
@acindex AC_INIT
|
||
This macro can also be called in another, @emph{deprecated} form:
|
||
@code{AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])}. In this form,
|
||
there are two required arguments: the package and the version number.
|
||
This usage is mostly obsolete because the @var{package} and @var{version}
|
||
can be obtained from Autoconf's @code{AC_INIT} macro. However,
|
||
differently from what happens for @code{AC_INIT} invocations, this
|
||
@code{AM_INIT_AUTOMAKE} invocation supports shell variables' expansions
|
||
in the @code{PACKAGE} and @code{VERSION} arguments (which otherwise
|
||
defaults, respectively, to the @code{PACKAGE_TARNAME} and
|
||
@code{PACKAGE_VERSION} defined via the @code{AC_INIT} invocation;
|
||
@pxref{AC_INIT, , The @code{AC_INIT} macro, autoconf, The Autoconf Manual});
|
||
and this can be still be useful in some selected situations.
|
||
Our hope is that future Autoconf versions will improve their support
|
||
for package versions defined dynamically at configure runtime; when
|
||
(and if) this happens, support for the two-args @code{AM_INIT_AUTOMAKE}
|
||
invocation will likely be removed from Automake.
|
||
|
||
@anchor{Modernize AM_INIT_AUTOMAKE invocation}
|
||
If your @file{configure.ac} has:
|
||
|
||
@example
|
||
AC_INIT([src/foo.c])
|
||
AM_INIT_AUTOMAKE([mumble], [1.5])
|
||
@end example
|
||
|
||
@noindent
|
||
you should modernize it as follows:
|
||
|
||
@example
|
||
AC_INIT([mumble], [1.5])
|
||
AC_CONFIG_SRCDIR([src/foo.c])
|
||
AM_INIT_AUTOMAKE
|
||
@end example
|
||
|
||
Note that if you're upgrading your @file{configure.ac} from an earlier
|
||
version of Automake, it is not always correct to simply move the
|
||
package and version arguments from @code{AM_INIT_AUTOMAKE} directly to
|
||
@code{AC_INIT}, as in the example above. The first argument to
|
||
@code{AC_INIT} should be the name of your package (e.g., @samp{GNU
|
||
Automake}), not the tarball name (e.g., @samp{automake}) that you used
|
||
to pass to @code{AM_INIT_AUTOMAKE}. Autoconf tries to derive a
|
||
tarball name from the package name, which should work for most but not
|
||
all package names. (If it doesn't work for yours, you can use the
|
||
four-argument form of @code{AC_INIT} to provide the tarball name
|
||
explicitly).
|
||
|
||
@cindex @code{PACKAGE}, prevent definition
|
||
@cindex @code{VERSION}, prevent definition
|
||
@opindex no-define
|
||
By default this macro @code{AC_DEFINE}'s @code{PACKAGE} and
|
||
@code{VERSION}. This can be avoided by passing the @option{no-define}
|
||
option (@pxref{List of Automake options}):
|
||
@example
|
||
AM_INIT_AUTOMAKE([no-define ...])
|
||
@end example
|
||
|
||
@item AM_PATH_LISPDIR
|
||
@acindex AM_PATH_LISPDIR
|
||
@vindex EMACS
|
||
@vindex lispdir
|
||
Searches for the program @command{emacs}, and, if found, sets the
|
||
output variable @code{lispdir} to the full path to Emacs' site-lisp
|
||
directory.
|
||
|
||
Note that this test assumes the @command{emacs} found to be a version
|
||
that supports Emacs Lisp (such as GNU Emacs or XEmacs). Other
|
||
emacsen can cause this test to hang (some, like old versions of
|
||
MicroEmacs, start up in interactive mode, requiring @kbd{C-x C-c} to
|
||
exit, which is hardly obvious for a non-emacs user). In most cases,
|
||
however, you should be able to use @kbd{C-c} to kill the test. In
|
||
order to avoid problems, you can set @env{EMACS} to ``no'' in the
|
||
environment, or use the @option{--with-lispdir} option to
|
||
@command{configure} to explicitly set the correct path (if you're sure
|
||
you have an @command{emacs} that supports Emacs Lisp).
|
||
|
||
@item AM_PROG_AR(@ovar{act-if-fail})
|
||
@acindex AM_PROG_AR
|
||
@vindex AR
|
||
You must use this macro when you use the archiver in your project, if
|
||
you want support for unusual archivers such as Microsoft @command{lib}.
|
||
The content of the optional argument is executed if the archiver
|
||
interface is not recognized; the default action is to abort configure
|
||
with an error message.
|
||
|
||
@item AM_PROG_AS
|
||
@acindex AM_PROG_AS
|
||
@vindex CCAS
|
||
@vindex CCASFLAGS
|
||
Use this macro when you have assembly code in your project. This will
|
||
choose the assembler for you (by default the C compiler) and set
|
||
@code{CCAS}, and will also set @code{CCASFLAGS} if required.
|
||
|
||
@item AM_PROG_CC_C_O
|
||
@acindex AM_PROG_CC_C_O
|
||
This is an obsolescent macro that checks that the C compiler supports
|
||
the @option{-c} and @option{-o} options together. Note that, since
|
||
Automake 1.14, the @code{AC_PROG_CC} is rewritten to implement such
|
||
checks itself, and thus the explicit use of @code{AM_PROG_CC_C_O}
|
||
should no longer be required.
|
||
|
||
@item AM_PROG_LEX
|
||
@acindex AM_PROG_LEX
|
||
@acindex AC_PROG_LEX
|
||
@cindex HP-UX 10, @command{lex} problems
|
||
@cindex @command{lex} problems with HP-UX 10
|
||
Like @code{AC_PROG_LEX} (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}), but uses the
|
||
@command{missing} script on systems that do not have @command{lex}.
|
||
HP-UX 10 is one such system.
|
||
|
||
@item AM_PROG_GCJ
|
||
@acindex AM_PROG_GCJ
|
||
@vindex GCJ
|
||
@vindex GCJFLAGS
|
||
This macro finds the @command{gcj} program or causes an error. It sets
|
||
@code{GCJ} and @code{GCJFLAGS}. @command{gcj} is the Java front-end to the
|
||
GNU Compiler Collection.
|
||
|
||
@item AM_PROG_UPC([@var{compiler-search-list}])
|
||
@acindex AM_PROG_UPC
|
||
@vindex UPC
|
||
Find a compiler for Unified Parallel C and define the @code{UPC}
|
||
variable. The default @var{compiler-search-list} is @samp{upcc upc}.
|
||
This macro will abort @command{configure} if no Unified Parallel C
|
||
compiler is found.
|
||
|
||
@item AM_MISSING_PROG(@var{name}, @var{program})
|
||
@acindex AM_MISSING_PROG
|
||
@vindex MISSING
|
||
Find a maintainer tool @var{program} and define the @var{name}
|
||
environment variable with its location. If @var{program} is not
|
||
detected, then @var{name} will instead invoke the @command{missing}
|
||
script, in order to give useful advice to the user about the missing
|
||
maintainer tool. @xref{maintainer-mode}, for more information on when
|
||
the @command{missing} script is appropriate.
|
||
|
||
@item AM_SILENT_RULES
|
||
@acindex AM_SILENT_RULES
|
||
Control the machinery for less verbose build output
|
||
(@pxref{Automake Silent Rules}).
|
||
|
||
@item AM_WITH_DMALLOC
|
||
@acindex AM_WITH_DMALLOC
|
||
@cindex @command{dmalloc}, support for
|
||
@vindex WITH_DMALLOC
|
||
@opindex --with-dmalloc
|
||
Add support for the @uref{http://dmalloc.com/, Dmalloc package}. If
|
||
the user runs @command{configure} with @option{--with-dmalloc}, then
|
||
define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}.
|
||
|
||
@end table
|
||
|
||
|
||
@node Obsolete Macros
|
||
@subsection Obsolete Macros
|
||
@cindex obsolete macros
|
||
@cindex autoupdate
|
||
|
||
Although using some of the following macros was required in past
|
||
releases, you should not use any of them in new code. @emph{All
|
||
these macros will be removed in the next major Automake version};
|
||
if you are still using them, running @command{autoupdate} should
|
||
adjust your @file{configure.ac} automatically (@pxref{autoupdate
|
||
Invocation, , Using @command{autoupdate} to Modernize
|
||
@file{configure.ac}, autoconf, The Autoconf Manual}).
|
||
@emph{Do it NOW!}
|
||
|
||
@table @code
|
||
|
||
@item AM_PROG_MKDIR_P
|
||
@acindex AM_PROG_MKDIR_P
|
||
@cindex @code{mkdir -p}, macro check
|
||
@vindex MKDIR_P
|
||
@vindex mkdir_p
|
||
|
||
From Automake 1.8 to 1.9.6 this macro used to define the output
|
||
variable @code{mkdir_p} to one of @code{mkdir -p}, @code{install-sh
|
||
-d}, or @code{mkinstalldirs}.
|
||
|
||
Nowadays Autoconf provides a similar functionality with
|
||
@code{AC_PROG_MKDIR_P} (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}), however this defines
|
||
the output variable @code{MKDIR_P} instead. In case you are still
|
||
using the @code{AM_PROG_MKDIR_P} macro in your @file{configure.ac},
|
||
or its provided variable @code{$(mkdir_p)} in your @file{Makefile.am},
|
||
you are advised to switch ASAP to the more modern Autoconf-provided
|
||
interface instead; both the macro and the variable might be removed
|
||
in a future major Automake release.
|
||
|
||
@end table
|
||
|
||
|
||
@node Private Macros
|
||
@subsection Private Macros
|
||
|
||
The following macros are private macros you should not call directly.
|
||
They are called by the other public macros when appropriate. Do not
|
||
rely on them, as they might be changed in a future version. Consider
|
||
them as implementation details; or better, do not consider them at all:
|
||
skip this section!
|
||
|
||
@ftable @code
|
||
@item _AM_DEPENDENCIES
|
||
@itemx AM_SET_DEPDIR
|
||
@itemx AM_DEP_TRACK
|
||
@itemx AM_OUTPUT_DEPENDENCY_COMMANDS
|
||
These macros are used to implement Automake's automatic dependency
|
||
tracking scheme. They are called automatically by Automake when
|
||
required, and there should be no need to invoke them manually.
|
||
|
||
@item AM_MAKE_INCLUDE
|
||
This macro is used to discover how the user's @command{make} handles
|
||
@code{include} statements. This macro is automatically invoked when
|
||
needed; there should be no need to invoke it manually.
|
||
|
||
@item AM_PROG_INSTALL_STRIP
|
||
This is used to find a version of @code{install} that can be used to
|
||
strip a program at installation time. This macro is automatically
|
||
included when required.
|
||
|
||
@item AM_SANITY_CHECK
|
||
This checks to make sure that a file created in the build directory is
|
||
newer than a file in the source directory. This can fail on systems
|
||
where the clock is set incorrectly. This macro is automatically run
|
||
from @code{AM_INIT_AUTOMAKE}.
|
||
|
||
@end ftable
|
||
|
||
|
||
@node Directories
|
||
@chapter Directories
|
||
|
||
For simple projects that distribute all files in the same directory
|
||
it is enough to have a single @file{Makefile.am} that builds
|
||
everything in place.
|
||
|
||
In larger projects, it is common to organize files in different
|
||
directories, in a tree. For example, there could be a directory
|
||
for the program's source, one for the testsuite, and one for the
|
||
documentation; or, for very large projects, there could be one
|
||
directory per program, per library or per module.
|
||
|
||
The traditional approach is to build these subdirectories recursively,
|
||
employing @emph{make recursion}: each directory contains its
|
||
own @file{Makefile}, and when @command{make} is run from the top-level
|
||
directory, it enters each subdirectory in turn, and invokes there a
|
||
new @command{make} instance to build the directory's contents.
|
||
|
||
Because this approach is very widespread, Automake offers built-in
|
||
support for it. However, it is worth nothing that the use of make
|
||
recursion has its own serious issues and drawbacks, and that it's
|
||
well possible to have packages with a multi directory layout that
|
||
make little or no use of such recursion (examples of such packages
|
||
are GNU Bison and GNU Automake itself); see also the @ref{Alternative}
|
||
section below.
|
||
|
||
@menu
|
||
* Subdirectories:: Building subdirectories recursively
|
||
* Conditional Subdirectories:: Conditionally not building directories
|
||
* Alternative:: Subdirectories without recursion
|
||
* Subpackages:: Nesting packages
|
||
@end menu
|
||
|
||
@node Subdirectories
|
||
@section Recursing subdirectories
|
||
|
||
@cindex @code{SUBDIRS}, explained
|
||
|
||
In packages using make recursion, the top level @file{Makefile.am} must
|
||
tell Automake which subdirectories are to be built. This is done via
|
||
the @code{SUBDIRS} variable.
|
||
@vindex SUBDIRS
|
||
|
||
The @code{SUBDIRS} variable holds a list of subdirectories in which
|
||
building of various sorts can occur. The rules for many targets
|
||
(e.g., @code{all}) in the generated @file{Makefile} will run commands
|
||
both locally and in all specified subdirectories. Note that the
|
||
directories listed in @code{SUBDIRS} are not required to contain
|
||
@file{Makefile.am}s; only @file{Makefile}s (after configuration).
|
||
This allows inclusion of libraries from packages that do not use
|
||
Automake (such as @code{gettext}; see also @ref{Third-Party
|
||
Makefiles}).
|
||
|
||
In packages that use subdirectories, the top-level @file{Makefile.am} is
|
||
often very short. For instance, here is the @file{Makefile.am} from the
|
||
GNU Hello distribution:
|
||
|
||
@example
|
||
EXTRA_DIST = BUGS ChangeLog.O README-alpha
|
||
SUBDIRS = doc intl po src tests
|
||
@end example
|
||
|
||
When Automake invokes @command{make} in a subdirectory, it uses the value
|
||
of the @code{MAKE} variable. It passes the value of the variable
|
||
@code{AM_MAKEFLAGS} to the @command{make} invocation; this can be set in
|
||
@file{Makefile.am} if there are flags you must always pass to
|
||
@command{make}.
|
||
@vindex MAKE
|
||
@vindex AM_MAKEFLAGS
|
||
|
||
The directories mentioned in @code{SUBDIRS} are usually direct
|
||
children of the current directory, each subdirectory containing its
|
||
own @file{Makefile.am} with a @code{SUBDIRS} pointing to deeper
|
||
subdirectories. Automake can be used to construct packages of
|
||
arbitrary depth this way.
|
||
|
||
By default, Automake generates @file{Makefiles} that work depth-first
|
||
in postfix order: the subdirectories are built before the current
|
||
directory. However, it is possible to change this ordering. You can
|
||
do this by putting @samp{.} into @code{SUBDIRS}. For instance,
|
||
putting @samp{.} first will cause a prefix ordering of
|
||
directories.
|
||
|
||
Using
|
||
|
||
@example
|
||
SUBDIRS = lib src . test
|
||
@end example
|
||
|
||
@noindent
|
||
will cause @file{lib/} to be built before @file{src/}, then the
|
||
current directory will be built, finally the @file{test/} directory
|
||
will be built. It is customary to arrange test directories to be
|
||
built after everything else since they are meant to test what has
|
||
been constructed.
|
||
|
||
In addition to the built-in recursive targets defined by Automake
|
||
(@code{all}, @code{check}, etc.), the developer can also define his
|
||
own recursive targets. That is done by passing the names of such
|
||
targets as arguments to the m4 macro @code{AM_EXTRA_RECURSIVE_TARGETS}
|
||
in @file{configure.ac}. Automake generates rules to handle the
|
||
recursion for such targets; and the developer can define real actions
|
||
for them by defining corresponding @code{-local} targets.
|
||
|
||
@example
|
||
% @kbd{cat configure.ac}
|
||
AC_INIT([pkg-name], [1.0]
|
||
AM_INIT_AUTOMAKE
|
||
AM_EXTRA_RECURSIVE_TARGETS([foo])
|
||
AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile])
|
||
AC_OUTPUT
|
||
% @kbd{cat Makefile.am}
|
||
SUBDIRS = sub
|
||
foo-local:
|
||
@@echo This will be run by "make foo".
|
||
% @kbd{cat sub/Makefile.am}
|
||
SUBDIRS = src
|
||
% @kbd{cat sub/src/Makefile.am}
|
||
foo-local:
|
||
@@echo This too will be run by a "make foo" issued either in
|
||
@@echo the 'sub/src/' directory, the 'sub/' directory, or the
|
||
@@echo top-level directory.
|
||
@end example
|
||
|
||
@node Conditional Subdirectories
|
||
@section Conditional Subdirectories
|
||
@cindex Subdirectories, building conditionally
|
||
@cindex Conditional subdirectories
|
||
@cindex @code{SUBDIRS}, conditional
|
||
@cindex Conditional @code{SUBDIRS}
|
||
|
||
It is possible to define the @code{SUBDIRS} variable conditionally if,
|
||
like in the case of GNU Inetutils, you want to only build a subset of
|
||
the entire package.
|
||
|
||
To illustrate how this works, let's assume we have two directories
|
||
@file{src/} and @file{opt/}. @file{src/} should always be built, but we
|
||
want to decide in @command{configure} whether @file{opt/} will be built
|
||
or not. (For this example we will assume that @file{opt/} should be
|
||
built when the variable @samp{$want_opt} was set to @samp{yes}.)
|
||
|
||
Running @command{make} should thus recurse into @file{src/} always, and
|
||
then maybe in @file{opt/}.
|
||
|
||
However @samp{make dist} should always recurse into both @file{src/}
|
||
and @file{opt/}. Because @file{opt/} should be distributed even if it
|
||
is not needed in the current configuration. This means
|
||
@file{opt/Makefile} should be created @emph{unconditionally}.
|
||
|
||
There are two ways to setup a project like this. You can use Automake
|
||
conditionals (@pxref{Conditionals}) or use Autoconf @code{AC_SUBST}
|
||
variables (@pxref{Setting Output Variables, , Setting Output
|
||
Variables, autoconf, The Autoconf Manual}). Using Automake
|
||
conditionals is the preferred solution. Before we illustrate these
|
||
two possibilities, let's introduce @code{DIST_SUBDIRS}.
|
||
|
||
@menu
|
||
* SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
|
||
* Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
|
||
* Subdirectories with AC_SUBST:: Another way for conditional recursion
|
||
* Unconfigured Subdirectories:: Not even creating a @samp{Makefile}
|
||
@end menu
|
||
|
||
@node SUBDIRS vs DIST_SUBDIRS
|
||
@subsection @code{SUBDIRS} vs.@: @code{DIST_SUBDIRS}
|
||
@cindex @code{DIST_SUBDIRS}, explained
|
||
|
||
Automake considers two sets of directories, defined by the variables
|
||
@code{SUBDIRS} and @code{DIST_SUBDIRS}.
|
||
|
||
@code{SUBDIRS} contains the subdirectories of the current directory
|
||
that must be built (@pxref{Subdirectories}). It must be defined
|
||
manually; Automake will never guess a directory is to be built. As we
|
||
will see in the next two sections, it is possible to define it
|
||
conditionally so that some directory will be omitted from the build.
|
||
|
||
@code{DIST_SUBDIRS} is used in rules that need to recurse in all
|
||
directories, even those that have been conditionally left out of the
|
||
build. Recall our example where we may not want to build subdirectory
|
||
@file{opt/}, but yet we want to distribute it? This is where
|
||
@code{DIST_SUBDIRS} comes into play: @samp{opt} may not appear in
|
||
@code{SUBDIRS}, but it must appear in @code{DIST_SUBDIRS}.
|
||
|
||
Precisely, @code{DIST_SUBDIRS} is used by @samp{make
|
||
maintainer-clean}, @samp{make distclean} and @samp{make dist}. All
|
||
other recursive rules use @code{SUBDIRS}.
|
||
|
||
If @code{SUBDIRS} is defined conditionally using Automake
|
||
conditionals, Automake will define @code{DIST_SUBDIRS} automatically
|
||
from the possible values of @code{SUBDIRS} in all conditions.
|
||
|
||
If @code{SUBDIRS} contains @code{AC_SUBST} variables,
|
||
@code{DIST_SUBDIRS} will not be defined correctly because Automake
|
||
does not know the possible values of these variables. In this case
|
||
@code{DIST_SUBDIRS} needs to be defined manually.
|
||
|
||
@node Subdirectories with AM_CONDITIONAL
|
||
@subsection Subdirectories with @code{AM_CONDITIONAL}
|
||
@cindex @code{SUBDIRS} and @code{AM_CONDITIONAL}
|
||
@cindex @code{AM_CONDITIONAL} and @code{SUBDIRS}
|
||
|
||
@c Keep in sync with subdir-am-cond.sh
|
||
|
||
@file{configure} should output the @file{Makefile} for each directory
|
||
and define a condition into which @file{opt/} should be built.
|
||
|
||
@example
|
||
@dots{}
|
||
AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
|
||
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
|
||
@dots{}
|
||
@end example
|
||
|
||
Then @code{SUBDIRS} can be defined in the top-level @file{Makefile.am}
|
||
as follows.
|
||
|
||
@example
|
||
if COND_OPT
|
||
MAYBE_OPT = opt
|
||
endif
|
||
SUBDIRS = src $(MAYBE_OPT)
|
||
@end example
|
||
|
||
As you can see, running @command{make} will rightly recurse into
|
||
@file{src/} and maybe @file{opt/}.
|
||
|
||
@vindex DIST_SUBDIRS
|
||
As you can't see, running @samp{make dist} will recurse into both
|
||
@file{src/} and @file{opt/} directories because @samp{make dist}, unlike
|
||
@samp{make all}, doesn't use the @code{SUBDIRS} variable. It uses the
|
||
@code{DIST_SUBDIRS} variable.
|
||
|
||
In this case Automake will define @samp{DIST_SUBDIRS = src opt}
|
||
automatically because it knows that @code{MAYBE_OPT} can contain
|
||
@samp{opt} in some condition.
|
||
|
||
@node Subdirectories with AC_SUBST
|
||
@subsection Subdirectories with @code{AC_SUBST}
|
||
@cindex @code{SUBDIRS} and @code{AC_SUBST}
|
||
@cindex @code{AC_SUBST} and @code{SUBDIRS}
|
||
|
||
@c Keep in sync with subdir-ac-subst.sh
|
||
|
||
Another possibility is to define @code{MAYBE_OPT} from
|
||
@file{./configure} using @code{AC_SUBST}:
|
||
|
||
@example
|
||
@dots{}
|
||
if test "$want_opt" = yes; then
|
||
MAYBE_OPT=opt
|
||
else
|
||
MAYBE_OPT=
|
||
fi
|
||
AC_SUBST([MAYBE_OPT])
|
||
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
|
||
@dots{}
|
||
@end example
|
||
|
||
In this case the top-level @file{Makefile.am} should look as follows.
|
||
|
||
@example
|
||
SUBDIRS = src $(MAYBE_OPT)
|
||
DIST_SUBDIRS = src opt
|
||
@end example
|
||
|
||
The drawback is that since Automake cannot guess what the possible
|
||
values of @code{MAYBE_OPT} are, it is necessary to define
|
||
@code{DIST_SUBDIRS}.
|
||
|
||
@node Unconfigured Subdirectories
|
||
@subsection Unconfigured Subdirectories
|
||
@cindex Subdirectories, configured conditionally
|
||
|
||
The semantics of @code{DIST_SUBDIRS} are often misunderstood by some
|
||
users that try to @emph{configure and build} subdirectories
|
||
conditionally. Here by configuring we mean creating the
|
||
@file{Makefile} (it might also involve running a nested
|
||
@command{configure} script: this is a costly operation that explains
|
||
why people want to do it conditionally, but only the @file{Makefile}
|
||
is relevant to the discussion).
|
||
|
||
The above examples all assume that every @file{Makefile} is created,
|
||
even in directories that are not going to be built. The simple reason
|
||
is that we want @samp{make dist} to distribute even the directories
|
||
that are not being built (e.g., platform-dependent code), hence
|
||
@file{make dist} must recurse into the subdirectory, hence this
|
||
directory must be configured and appear in @code{DIST_SUBDIRS}.
|
||
|
||
Building packages that do not configure every subdirectory is a tricky
|
||
business, and we do not recommend it to the novice as it is easy to
|
||
produce an incomplete tarball by mistake. We will not discuss this
|
||
topic in depth here, yet for the adventurous here are a few rules to
|
||
remember.
|
||
|
||
@cartouche
|
||
@itemize
|
||
@item @code{SUBDIRS} should always be a subset of @code{DIST_SUBDIRS}.
|
||
|
||
It makes little sense to have a directory in @code{SUBDIRS} that
|
||
is not in @code{DIST_SUBDIRS}. Think of the former as a way to tell
|
||
which directories listed in the latter should be built.
|
||
@item Any directory listed in @code{DIST_SUBDIRS} and @code{SUBDIRS}
|
||
must be configured.
|
||
|
||
I.e., the @file{Makefile} must exists or the recursive @command{make}
|
||
rules will not be able to process the directory.
|
||
@item Any configured directory must be listed in @code{DIST_SUBDIRS}.
|
||
|
||
So that the cleaning rules remove the generated @file{Makefile}s.
|
||
It would be correct to see @code{DIST_SUBDIRS} as a variable that
|
||
lists all the directories that have been configured.
|
||
@end itemize
|
||
@end cartouche
|
||
|
||
In order to prevent recursion in some unconfigured directory you
|
||
must therefore ensure that this directory does not appear in
|
||
@code{DIST_SUBDIRS} (and @code{SUBDIRS}). For instance, if you define
|
||
@code{SUBDIRS} conditionally using @code{AC_SUBST} and do not define
|
||
@code{DIST_SUBDIRS} explicitly, it will be default to
|
||
@samp{$(SUBDIRS)}; another possibility is to force @code{DIST_SUBDIRS
|
||
= $(SUBDIRS)}.
|
||
|
||
Of course, directories that are omitted from @code{DIST_SUBDIRS} will
|
||
not be distributed unless you make other arrangements for this to
|
||
happen (for instance, always running @samp{make dist} in a
|
||
configuration where all directories are known to appear in
|
||
@code{DIST_SUBDIRS}; or writing a @code{dist-hook} target to
|
||
distribute these directories).
|
||
|
||
@cindex Subdirectories, not distributed
|
||
In few packages, unconfigured directories are not even expected to
|
||
be distributed. Although these packages do not require the
|
||
aforementioned extra arrangements, there is another pitfall. If the
|
||
name of a directory appears in @code{SUBDIRS} or @code{DIST_SUBDIRS},
|
||
@command{automake} will make sure the directory exists. Consequently
|
||
@command{automake} cannot be run on such a distribution when one
|
||
directory has been omitted. One way to avoid this check is to use the
|
||
@code{AC_SUBST} method to declare conditional directories; since
|
||
@command{automake} does not know the values of @code{AC_SUBST}
|
||
variables it cannot ensure the corresponding directory exists.
|
||
|
||
@node Alternative
|
||
@section An Alternative Approach to Subdirectories
|
||
|
||
If you've ever read Peter Miller's excellent paper,
|
||
@uref{http://miller.emu.id.au/pmiller/books/rmch/,
|
||
Recursive Make Considered Harmful}, the preceding sections on the use of
|
||
make recursion will probably come as unwelcome advice. For those who
|
||
haven't read the paper, Miller's main thesis is that recursive
|
||
@command{make} invocations are both slow and error-prone.
|
||
|
||
Automake provides sufficient cross-directory support @footnote{We
|
||
believe. This work is new and there are probably warts.
|
||
@xref{Introduction}, for information on reporting bugs.} to enable you
|
||
to write a single @file{Makefile.am} for a complex multi-directory
|
||
package.
|
||
|
||
By default an installable file specified in a subdirectory will have its
|
||
directory name stripped before installation. For instance, in this
|
||
example, the header file will be installed as
|
||
@file{$(includedir)/stdio.h}:
|
||
|
||
@example
|
||
include_HEADERS = inc/stdio.h
|
||
@end example
|
||
|
||
@vindex nobase_
|
||
@cindex @code{nobase_} prefix
|
||
@cindex Path stripping, avoiding
|
||
@cindex Avoiding path stripping
|
||
|
||
However, the @samp{nobase_} prefix can be used to circumvent this path
|
||
stripping. In this example, the header file will be installed as
|
||
@file{$(includedir)/sys/types.h}:
|
||
|
||
@example
|
||
nobase_include_HEADERS = sys/types.h
|
||
@end example
|
||
|
||
@cindex @code{nobase_} and @code{dist_} or @code{nodist_}
|
||
@cindex @code{dist_} and @code{nobase_}
|
||
@cindex @code{nodist_} and @code{nobase_}
|
||
@vindex dist_
|
||
@vindex nodist_
|
||
|
||
@samp{nobase_} should be specified first when used in conjunction with
|
||
either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
|
||
Control}). For instance:
|
||
|
||
@example
|
||
nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg
|
||
@end example
|
||
|
||
Finally, note that a variable using the @samp{nobase_} prefix can
|
||
often be replaced by several variables, one for each destination
|
||
directory (@pxref{Uniform}). For instance, the last example could be
|
||
rewritten as follows:
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
imagesdir = $(pkgdatadir)/images
|
||
soundsdir = $(pkgdatadir)/sounds
|
||
dist_images_DATA = images/vortex.pgm
|
||
dist_sounds_DATA = sounds/whirl.ogg
|
||
@end example
|
||
|
||
@noindent
|
||
This latter syntax makes it possible to change one destination
|
||
directory without changing the layout of the source tree.
|
||
|
||
Currently, @samp{nobase_*_LTLIBRARIES} are the only exception to this
|
||
rule, in that there is no particular installation order guarantee for
|
||
an otherwise equivalent set of variables without @samp{nobase_} prefix.
|
||
|
||
@node Subpackages
|
||
@section Nesting Packages
|
||
@cindex Nesting packages
|
||
@cindex Subpackages
|
||
@acindex AC_CONFIG_SUBDIRS
|
||
@acindex AC_CONFIG_AUX_DIR
|
||
|
||
|
||
In the GNU Build System, packages can be nested to arbitrary depth.
|
||
This means that a package can embed other packages with their own
|
||
@file{configure}, @file{Makefile}s, etc.
|
||
|
||
These other packages should just appear as subdirectories of their
|
||
parent package. They must be listed in @code{SUBDIRS} like other
|
||
ordinary directories. However the subpackage's @file{Makefile}s
|
||
should be output by its own @file{configure} script, not by the
|
||
parent's @file{configure}. This is achieved using the
|
||
@code{AC_CONFIG_SUBDIRS} Autoconf macro (@pxref{Subdirectories,
|
||
AC_CONFIG_SUBDIRS, Configuring Other Packages in Subdirectories,
|
||
autoconf, The Autoconf Manual}).
|
||
|
||
Here is an example package for an @code{arm} program that links with
|
||
a @code{hand} library that is a nested package in subdirectory
|
||
@file{hand/}.
|
||
|
||
@code{arm}'s @file{configure.ac}:
|
||
|
||
@example
|
||
AC_INIT([arm], [1.0])
|
||
AC_CONFIG_AUX_DIR([.])
|
||
AM_INIT_AUTOMAKE
|
||
AC_PROG_CC
|
||
AC_CONFIG_FILES([Makefile])
|
||
# Call hand's ./configure script recursively.
|
||
AC_CONFIG_SUBDIRS([hand])
|
||
AC_OUTPUT
|
||
@end example
|
||
|
||
@code{arm}'s @file{Makefile.am}:
|
||
|
||
@example
|
||
# Build the library in the hand subdirectory first.
|
||
SUBDIRS = hand
|
||
|
||
# Include hand's header when compiling this directory.
|
||
AM_CPPFLAGS = -I$(srcdir)/hand
|
||
|
||
bin_PROGRAMS = arm
|
||
arm_SOURCES = arm.c
|
||
# link with the hand library.
|
||
arm_LDADD = hand/libhand.a
|
||
@end example
|
||
|
||
Now here is @code{hand}'s @file{hand/configure.ac}:
|
||
|
||
@example
|
||
AC_INIT([hand], [1.2])
|
||
AC_CONFIG_AUX_DIR([.])
|
||
AM_INIT_AUTOMAKE
|
||
AC_PROG_CC
|
||
AM_PROG_AR
|
||
AC_PROG_RANLIB
|
||
AC_CONFIG_FILES([Makefile])
|
||
AC_OUTPUT
|
||
@end example
|
||
|
||
@noindent
|
||
and its @file{hand/Makefile.am}:
|
||
|
||
@example
|
||
lib_LIBRARIES = libhand.a
|
||
libhand_a_SOURCES = hand.c
|
||
@end example
|
||
|
||
When @samp{make dist} is run from the top-level directory it will
|
||
create an archive @file{arm-1.0.tar.gz} that contains the @code{arm}
|
||
code as well as the @file{hand} subdirectory. This package can be
|
||
built and installed like any ordinary package, with the usual
|
||
@samp{./configure && make && make install} sequence (the @code{hand}
|
||
subpackage will be built and installed by the process).
|
||
|
||
When @samp{make dist} is run from the hand directory, it will create a
|
||
self-contained @file{hand-1.2.tar.gz} archive. So although it appears
|
||
to be embedded in another package, it can still be used separately.
|
||
|
||
The purpose of the @samp{AC_CONFIG_AUX_DIR([.])} instruction is to
|
||
force Automake and Autoconf to search for auxiliary scripts in the
|
||
current directory. For instance, this means that there will be two
|
||
copies of @file{install-sh}: one in the top-level of the @code{arm}
|
||
package, and another one in the @file{hand/} subdirectory for the
|
||
@code{hand} package.
|
||
|
||
The historical default is to search for these auxiliary scripts in
|
||
the parent directory and the grandparent directory. So if the
|
||
@samp{AC_CONFIG_AUX_DIR([.])} line was removed from
|
||
@file{hand/configure.ac}, that subpackage would share the auxiliary
|
||
script of the @code{arm} package. This may looks like a gain in size
|
||
(a few kilobytes), but it is actually a loss of modularity as the
|
||
@code{hand} subpackage is no longer self-contained (@samp{make dist}
|
||
in the subdirectory will not work anymore).
|
||
|
||
Packages that do not use Automake need more work to be integrated this
|
||
way. @xref{Third-Party Makefiles}.
|
||
|
||
@node Programs
|
||
@chapter Building Programs and Libraries
|
||
|
||
A large part of Automake's functionality is dedicated to making it easy
|
||
to build programs and libraries.
|
||
|
||
@menu
|
||
* A Program:: Building a program
|
||
* A Library:: Building a library
|
||
* A Shared Library:: Building a Libtool library
|
||
* Program and Library Variables:: Variables controlling program and
|
||
library builds
|
||
* Default _SOURCES:: Default source files
|
||
* LIBOBJS:: Special handling for LIBOBJS and ALLOCA
|
||
* Program Variables:: Variables used when building a program
|
||
* Yacc and Lex:: Yacc and Lex support
|
||
* C++ Support:: Compiling C++ sources
|
||
* Objective C Support:: Compiling Objective C sources
|
||
* Objective C++ Support:: Compiling Objective C++ sources
|
||
* Unified Parallel C Support:: Compiling Unified Parallel C sources
|
||
* Assembly Support:: Compiling assembly sources
|
||
* Fortran 77 Support:: Compiling Fortran 77 sources
|
||
* Fortran 9x Support:: Compiling Fortran 9x sources
|
||
* Java Support with gcj:: Compiling Java sources using gcj
|
||
* Vala Support:: Compiling Vala sources
|
||
* Support for Other Languages:: Compiling other languages
|
||
* Dependencies:: Automatic dependency tracking
|
||
* EXEEXT:: Support for executable extensions
|
||
@end menu
|
||
|
||
|
||
@node A Program
|
||
@section Building a program
|
||
|
||
In order to build a program, you need to tell Automake which sources
|
||
are part of it, and which libraries it should be linked with.
|
||
|
||
This section also covers conditional compilation of sources or
|
||
programs. Most of the comments about these also apply to libraries
|
||
(@pxref{A Library}) and libtool libraries (@pxref{A Shared Library}).
|
||
|
||
@menu
|
||
* Program Sources:: Defining program sources
|
||
* Linking:: Linking with libraries or extra objects
|
||
* Conditional Sources:: Handling conditional sources
|
||
* Conditional Programs:: Building a program conditionally
|
||
@end menu
|
||
|
||
@node Program Sources
|
||
@subsection Defining program sources
|
||
|
||
@cindex @code{PROGRAMS}, @code{bindir}
|
||
@vindex _PROGRAMS
|
||
@vindex bin_PROGRAMS
|
||
@vindex sbin_PROGRAMS
|
||
@vindex libexec_PROGRAMS
|
||
@vindex pkglibexec_PROGRAMS
|
||
@vindex noinst_PROGRAMS
|
||
@vindex check_PROGRAMS
|
||
|
||
In a directory containing source that gets built into a program (as
|
||
opposed to a library or a script), the @code{PROGRAMS} primary is used.
|
||
Programs can be installed in @code{bindir}, @code{sbindir},
|
||
@code{libexecdir}, @code{pkglibexecdir}, or not at all
|
||
(@code{noinst_}). They can also be built only for @samp{make check}, in
|
||
which case the prefix is @samp{check_}.
|
||
|
||
For instance:
|
||
|
||
@example
|
||
bin_PROGRAMS = hello
|
||
@end example
|
||
|
||
In this simple case, the resulting @file{Makefile.in} will contain code
|
||
to generate a program named @code{hello}.
|
||
|
||
Associated with each program are several assisting variables that are
|
||
named after the program. These variables are all optional, and have
|
||
reasonable defaults. Each variable, its use, and default is spelled out
|
||
below; we use the ``hello'' example throughout.
|
||
|
||
The variable @code{hello_SOURCES} is used to specify which source files
|
||
get built into an executable:
|
||
|
||
@example
|
||
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
|
||
@end example
|
||
|
||
This causes each mentioned @file{.c} file to be compiled into the
|
||
corresponding @file{.o}. Then all are linked to produce @file{hello}.
|
||
|
||
@cindex @code{_SOURCES} primary, defined
|
||
@cindex @code{SOURCES} primary, defined
|
||
@cindex Primary variable, @code{SOURCES}
|
||
@vindex _SOURCES
|
||
|
||
If @code{hello_SOURCES} is not specified, then it defaults to the single
|
||
file @file{hello.c} (@pxref{Default _SOURCES}).
|
||
@vindex _SOURCES
|
||
@vindex SOURCES
|
||
|
||
Multiple programs can be built in a single directory. Multiple programs
|
||
can share a single source file, which must be listed in each
|
||
@code{_SOURCES} definition.
|
||
|
||
@cindex Header files in @code{_SOURCES}
|
||
@cindex @code{_SOURCES} and header files
|
||
|
||
Header files listed in a @code{_SOURCES} definition will be included in
|
||
the distribution but otherwise ignored. In case it isn't obvious, you
|
||
should not include the header file generated by @file{configure} in a
|
||
@code{_SOURCES} variable; this file should not be distributed. Lex
|
||
(@file{.l}) and Yacc (@file{.y}) files can also be listed; see @ref{Yacc
|
||
and Lex}.
|
||
|
||
|
||
@node Linking
|
||
@subsection Linking the program
|
||
|
||
If you need to link against libraries that are not found by
|
||
@command{configure}, you can use @code{LDADD} to do so. This variable is
|
||
used to specify additional objects or libraries to link with; it is
|
||
inappropriate for specifying specific linker flags, you should use
|
||
@code{AM_LDFLAGS} for this purpose.
|
||
@vindex LDADD
|
||
@vindex AM_LDFLAGS
|
||
|
||
@cindex @code{prog_LDADD}, defined
|
||
|
||
Sometimes, multiple programs are built in one directory but do not share
|
||
the same link-time requirements. In this case, you can use the
|
||
@code{@var{prog}_LDADD} variable (where @var{prog} is the name of the
|
||
program as it appears in some @code{_PROGRAMS} variable, and usually
|
||
written in lowercase) to override @code{LDADD}. If this variable exists
|
||
for a given program, then that program is not linked using @code{LDADD}.
|
||
@vindex maude_LDADD
|
||
|
||
For instance, in GNU cpio, @code{pax}, @code{cpio} and @code{mt} are
|
||
linked against the library @file{libcpio.a}. However, @code{rmt} is
|
||
built in the same directory, and has no such link requirement. Also,
|
||
@code{mt} and @code{rmt} are only built on certain architectures. Here
|
||
is what cpio's @file{src/Makefile.am} looks like (abridged):
|
||
|
||
@example
|
||
bin_PROGRAMS = cpio pax $(MT)
|
||
libexec_PROGRAMS = $(RMT)
|
||
EXTRA_PROGRAMS = mt rmt
|
||
|
||
LDADD = ../lib/libcpio.a $(INTLLIBS)
|
||
rmt_LDADD =
|
||
|
||
cpio_SOURCES = @dots{}
|
||
pax_SOURCES = @dots{}
|
||
mt_SOURCES = @dots{}
|
||
rmt_SOURCES = @dots{}
|
||
@end example
|
||
|
||
@cindex @code{_LDFLAGS}, defined
|
||
@vindex maude_LDFLAGS
|
||
@code{@var{prog}_LDADD} is inappropriate for passing program-specific
|
||
linker flags (except for @option{-l}, @option{-L}, @option{-dlopen} and
|
||
@option{-dlpreopen}). So, use the @code{@var{prog}_LDFLAGS} variable for
|
||
this purpose.
|
||
|
||
@cindex @code{_DEPENDENCIES}, defined
|
||
@vindex maude_DEPENDENCIES
|
||
@vindex EXTRA_maude_DEPENDENCIES
|
||
It is also occasionally useful to have a program depend on some other
|
||
target that is not actually part of that program. This can be done
|
||
using either the @code{@var{prog}_DEPENDENCIES} or the
|
||
@code{EXTRA_@var{prog}_DEPENDENCIES} variable. Each program depends on
|
||
the contents both variables, but no further interpretation is done.
|
||
|
||
Since these dependencies are associated to the link rule used to
|
||
create the programs they should normally list files used by the link
|
||
command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la}
|
||
files. In rare cases you may need to add other kinds of files such as
|
||
linker scripts, but @emph{listing a source file in
|
||
@code{_DEPENDENCIES} is wrong}. If some source file needs to be built
|
||
before all the components of a program are built, consider using the
|
||
@code{BUILT_SOURCES} variable instead (@pxref{Sources}).
|
||
|
||
If @code{@var{prog}_DEPENDENCIES} is not supplied, it is computed by
|
||
Automake. The automatically-assigned value is the contents of
|
||
@code{@var{prog}_LDADD}, with most configure substitutions, @option{-l},
|
||
@option{-L}, @option{-dlopen} and @option{-dlpreopen} options removed. The
|
||
configure substitutions that are left in are only @samp{$(LIBOBJS)} and
|
||
@samp{$(ALLOCA)}; these are left because it is known that they will not
|
||
cause an invalid value for @code{@var{prog}_DEPENDENCIES} to be
|
||
generated.
|
||
|
||
@ref{Conditional Sources} shows a situation where @code{_DEPENDENCIES}
|
||
may be used.
|
||
|
||
The @code{EXTRA_@var{prog}_DEPENDENCIES} may be useful for cases where
|
||
you merely want to augment the @command{automake}-generated
|
||
@code{@var{prog}_DEPENDENCIES} rather than replacing it.
|
||
|
||
@cindex @code{LDADD} and @option{-l}
|
||
@cindex @option{-l} and @code{LDADD}
|
||
We recommend that you avoid using @option{-l} options in @code{LDADD}
|
||
or @code{@var{prog}_LDADD} when referring to libraries built by your
|
||
package. Instead, write the file name of the library explicitly as in
|
||
the above @code{cpio} example. Use @option{-l} only to list
|
||
third-party libraries. If you follow this rule, the default value of
|
||
@code{@var{prog}_DEPENDENCIES} will list all your local libraries and
|
||
omit the other ones.
|
||
|
||
|
||
@node Conditional Sources
|
||
@subsection Conditional compilation of sources
|
||
|
||
You can't put a configure substitution (e.g., @samp{@@FOO@@} or
|
||
@samp{$(FOO)} where @code{FOO} is defined via @code{AC_SUBST}) into a
|
||
@code{_SOURCES} variable. The reason for this is a bit hard to
|
||
explain, but suffice to say that it simply won't work. Automake will
|
||
give an error if you try to do this.
|
||
|
||
Fortunately there are two other ways to achieve the same result. One is
|
||
to use configure substitutions in @code{_LDADD} variables, the other is
|
||
to use an Automake conditional.
|
||
|
||
@subsubheading Conditional Compilation using @code{_LDADD} Substitutions
|
||
|
||
@cindex @code{EXTRA_prog_SOURCES}, defined
|
||
|
||
Automake must know all the source files that could possibly go into a
|
||
program, even if not all the files are built in every circumstance. Any
|
||
files that are only conditionally built should be listed in the
|
||
appropriate @code{EXTRA_} variable. For instance, if
|
||
@file{hello-linux.c} or @file{hello-generic.c} were conditionally included
|
||
in @code{hello}, the @file{Makefile.am} would contain:
|
||
|
||
@example
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello-common.c
|
||
EXTRA_hello_SOURCES = hello-linux.c hello-generic.c
|
||
hello_LDADD = $(HELLO_SYSTEM)
|
||
hello_DEPENDENCIES = $(HELLO_SYSTEM)
|
||
@end example
|
||
|
||
@noindent
|
||
You can then setup the @samp{$(HELLO_SYSTEM)} substitution from
|
||
@file{configure.ac}:
|
||
|
||
@example
|
||
@dots{}
|
||
case $host in
|
||
*linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
|
||
*) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
|
||
esac
|
||
AC_SUBST([HELLO_SYSTEM])
|
||
@dots{}
|
||
@end example
|
||
|
||
In this case, the variable @code{HELLO_SYSTEM} should be replaced by
|
||
either @file{hello-linux.o} or @file{hello-generic.o}, and added to
|
||
both @code{hello_DEPENDENCIES} and @code{hello_LDADD} in order to be
|
||
built and linked in.
|
||
|
||
@subsubheading Conditional Compilation using Automake Conditionals
|
||
|
||
An often simpler way to compile source files conditionally is to use
|
||
Automake conditionals. For instance, you could use this
|
||
@file{Makefile.am} construct to build the same @file{hello} example:
|
||
|
||
@example
|
||
bin_PROGRAMS = hello
|
||
if LINUX
|
||
hello_SOURCES = hello-linux.c hello-common.c
|
||
else
|
||
hello_SOURCES = hello-generic.c hello-common.c
|
||
endif
|
||
@end example
|
||
|
||
In this case, @file{configure.ac} should setup the @code{LINUX}
|
||
conditional using @code{AM_CONDITIONAL} (@pxref{Conditionals}).
|
||
|
||
When using conditionals like this you don't need to use the
|
||
@code{EXTRA_} variable, because Automake will examine the contents of
|
||
each variable to construct the complete list of source files.
|
||
|
||
If your program uses a lot of files, you will probably prefer a
|
||
conditional @samp{+=}.
|
||
|
||
@example
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello-common.c
|
||
if LINUX
|
||
hello_SOURCES += hello-linux.c
|
||
else
|
||
hello_SOURCES += hello-generic.c
|
||
endif
|
||
@end example
|
||
|
||
@node Conditional Programs
|
||
@subsection Conditional compilation of programs
|
||
@cindex Conditional programs
|
||
@cindex Programs, conditional
|
||
|
||
Sometimes it is useful to determine the programs that are to be built
|
||
at configure time. For instance, GNU @code{cpio} only builds
|
||
@code{mt} and @code{rmt} under special circumstances. The means to
|
||
achieve conditional compilation of programs are the same you can use
|
||
to compile source files conditionally: substitutions or conditionals.
|
||
|
||
@subsubheading Conditional Programs using @command{configure} Substitutions
|
||
|
||
@vindex EXTRA_PROGRAMS
|
||
@cindex @code{EXTRA_PROGRAMS}, defined
|
||
In this case, you must notify Automake of all the programs that can
|
||
possibly be built, but at the same time cause the generated
|
||
@file{Makefile.in} to use the programs specified by @command{configure}.
|
||
This is done by having @command{configure} substitute values into each
|
||
@code{_PROGRAMS} definition, while listing all optionally built programs
|
||
in @code{EXTRA_PROGRAMS}.
|
||
|
||
@example
|
||
bin_PROGRAMS = cpio pax $(MT)
|
||
libexec_PROGRAMS = $(RMT)
|
||
EXTRA_PROGRAMS = mt rmt
|
||
@end example
|
||
|
||
As explained in @ref{EXEEXT}, Automake will rewrite
|
||
@code{bin_PROGRAMS}, @code{libexec_PROGRAMS}, and
|
||
@code{EXTRA_PROGRAMS}, appending @samp{$(EXEEXT)} to each binary.
|
||
Obviously it cannot rewrite values obtained at run-time through
|
||
@command{configure} substitutions, therefore you should take care of
|
||
appending @samp{$(EXEEXT)} yourself, as in @samp{AC_SUBST([MT],
|
||
['mt$@{EXEEXT@}'])}.
|
||
|
||
@subsubheading Conditional Programs using Automake Conditionals
|
||
|
||
You can also use Automake conditionals (@pxref{Conditionals}) to
|
||
select programs to be built. In this case you don't have to worry
|
||
about @samp{$(EXEEXT)} or @code{EXTRA_PROGRAMS}.
|
||
|
||
@c Keep in sync with exeext.sh
|
||
@example
|
||
bin_PROGRAMS = cpio pax
|
||
if WANT_MT
|
||
bin_PROGRAMS += mt
|
||
endif
|
||
if WANT_RMT
|
||
libexec_PROGRAMS = rmt
|
||
endif
|
||
@end example
|
||
|
||
|
||
@node A Library
|
||
@section Building a library
|
||
|
||
@cindex @code{_LIBRARIES} primary, defined
|
||
@cindex @code{LIBRARIES} primary, defined
|
||
@cindex Primary variable, @code{LIBRARIES}
|
||
@vindex _LIBRARIES
|
||
|
||
@vindex lib_LIBRARIES
|
||
@vindex pkglib_LIBRARIES
|
||
@vindex noinst_LIBRARIES
|
||
|
||
Building a library is much like building a program. In this case, the
|
||
name of the primary is @code{LIBRARIES}. Libraries can be installed in
|
||
@code{libdir} or @code{pkglibdir}.
|
||
|
||
@xref{A Shared Library}, for information on how to build shared
|
||
libraries using libtool and the @code{LTLIBRARIES} primary.
|
||
|
||
Each @code{_LIBRARIES} variable is a list of the libraries to be built.
|
||
For instance, to create a library named @file{libcpio.a}, but not install
|
||
it, you would write:
|
||
|
||
@example
|
||
noinst_LIBRARIES = libcpio.a
|
||
libcpio_a_SOURCES = @dots{}
|
||
@end example
|
||
|
||
The sources that go into a library are determined exactly as they are
|
||
for programs, via the @code{_SOURCES} variables. Note that the library
|
||
name is canonicalized (@pxref{Canonicalization}), so the @code{_SOURCES}
|
||
variable corresponding to @file{libcpio.a} is @samp{libcpio_a_SOURCES},
|
||
not @samp{libcpio.a_SOURCES}.
|
||
|
||
@vindex maude_LIBADD
|
||
Extra objects can be added to a library using the
|
||
@code{@var{library}_LIBADD} variable. This should be used for objects
|
||
determined by @command{configure}. Again from @code{cpio}:
|
||
|
||
@c Keep in sync with pr401c.sh
|
||
@example
|
||
libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA)
|
||
@end example
|
||
|
||
In addition, sources for extra objects that will not exist until
|
||
configure-time must be added to the @code{BUILT_SOURCES} variable
|
||
(@pxref{Sources}).
|
||
|
||
Building a static library is done by compiling all object files, then
|
||
by invoking @samp{$(AR) $(ARFLAGS)} followed by the name of the
|
||
library and the list of objects, and finally by calling
|
||
@samp{$(RANLIB)} on that library. You should call
|
||
@code{AC_PROG_RANLIB} from your @file{configure.ac} to define
|
||
@code{RANLIB} (Automake will complain otherwise). You should also
|
||
call @code{AM_PROG_AR} to define @code{AR}, in order to support unusual
|
||
archivers such as Microsoft lib. @code{ARFLAGS} will default to
|
||
@code{cru}; you can override this variable by setting it in your
|
||
@file{Makefile.am} or by @code{AC_SUBST}ing it from your
|
||
@file{configure.ac}. You can override the @code{AR} variable by
|
||
defining a per-library @code{maude_AR} variable (@pxref{Program and
|
||
Library Variables}).
|
||
|
||
@cindex Empty libraries
|
||
Be careful when selecting library components conditionally. Because
|
||
building an empty library is not portable, you should ensure that any
|
||
library always contains at least one object.
|
||
|
||
To use a static library when building a program, add it to
|
||
@code{LDADD} for this program. In the following example, the program
|
||
@file{cpio} is statically linked with the library @file{libcpio.a}.
|
||
|
||
@example
|
||
noinst_LIBRARIES = libcpio.a
|
||
libcpio_a_SOURCES = @dots{}
|
||
|
||
bin_PROGRAMS = cpio
|
||
cpio_SOURCES = cpio.c @dots{}
|
||
cpio_LDADD = libcpio.a
|
||
@end example
|
||
|
||
|
||
@node A Shared Library
|
||
@section Building a Shared Library
|
||
|
||
@cindex Shared libraries, support for
|
||
|
||
Building shared libraries portably is a relatively complex matter.
|
||
For this reason, GNU Libtool (@pxref{Top, , Introduction, libtool, The
|
||
Libtool Manual}) was created to help build shared libraries in a
|
||
platform-independent way.
|
||
|
||
@menu
|
||
* Libtool Concept:: Introducing Libtool
|
||
* Libtool Libraries:: Declaring Libtool Libraries
|
||
* Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
|
||
* Conditional Libtool Sources:: Choosing Library Sources Conditionally
|
||
* Libtool Convenience Libraries:: Building Convenience Libtool Libraries
|
||
* Libtool Modules:: Building Libtool Modules
|
||
* Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
|
||
* LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
|
||
* Libtool Issues:: Common Issues Related to Libtool's Use
|
||
@end menu
|
||
|
||
@node Libtool Concept
|
||
@subsection The Libtool Concept
|
||
|
||
@cindex @command{libtool}, introduction
|
||
@cindex libtool library, definition
|
||
@cindex suffix @file{.la}, defined
|
||
@cindex @file{.la} suffix, defined
|
||
|
||
Libtool abstracts shared and static libraries into a unified concept
|
||
henceforth called @dfn{libtool libraries}. Libtool libraries are
|
||
files using the @file{.la} suffix, and can designate a static library,
|
||
a shared library, or maybe both. Their exact nature cannot be
|
||
determined until @file{./configure} is run: not all platforms support
|
||
all kinds of libraries, and users can explicitly select which
|
||
libraries should be built. (However the package's maintainers can
|
||
tune the default, @pxref{AC_PROG_LIBTOOL, , The @code{AC_PROG_LIBTOOL}
|
||
macro, libtool, The Libtool Manual}.)
|
||
|
||
@cindex suffix @file{.lo}, defined
|
||
Because object files for shared and static libraries must be compiled
|
||
differently, libtool is also used during compilation. Object files
|
||
built by libtool are called @dfn{libtool objects}: these are files
|
||
using the @file{.lo} suffix. Libtool libraries are built from these
|
||
libtool objects.
|
||
|
||
You should not assume anything about the structure of @file{.la} or
|
||
@file{.lo} files and how libtool constructs them: this is libtool's
|
||
concern, and the last thing one wants is to learn about libtool's
|
||
guts. However the existence of these files matters, because they are
|
||
used as targets and dependencies in @file{Makefile}s rules when
|
||
building libtool libraries. There are situations where you may have
|
||
to refer to these, for instance when expressing dependencies for
|
||
building source files conditionally (@pxref{Conditional Libtool
|
||
Sources}).
|
||
|
||
@cindex @file{libltdl}, introduction
|
||
|
||
People considering writing a plug-in system, with dynamically loaded
|
||
modules, should look into @file{libltdl}: libtool's dlopening library
|
||
(@pxref{Using libltdl, , Using libltdl, libtool, The Libtool Manual}).
|
||
This offers a portable dlopening facility to load libtool libraries
|
||
dynamically, and can also achieve static linking where unavoidable.
|
||
|
||
Before we discuss how to use libtool with Automake in details, it
|
||
should be noted that the libtool manual also has a section about how
|
||
to use Automake with libtool (@pxref{Using Automake, , Using Automake
|
||
with Libtool, libtool, The Libtool Manual}).
|
||
|
||
@node Libtool Libraries
|
||
@subsection Building Libtool Libraries
|
||
|
||
@cindex @code{_LTLIBRARIES} primary, defined
|
||
@cindex @code{LTLIBRARIES} primary, defined
|
||
@cindex Primary variable, @code{LTLIBRARIES}
|
||
@cindex Example of shared libraries
|
||
@vindex lib_LTLIBRARIES
|
||
@vindex pkglib_LTLIBRARIES
|
||
@vindex _LTLIBRARIES
|
||
|
||
Automake uses libtool to build libraries declared with the
|
||
@code{LTLIBRARIES} primary. Each @code{_LTLIBRARIES} variable is a
|
||
list of libtool libraries to build. For instance, to create a libtool
|
||
library named @file{libgettext.la}, and install it in @code{libdir},
|
||
write:
|
||
|
||
@example
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c gettext.h @dots{}
|
||
@end example
|
||
|
||
Automake predefines the variable @code{pkglibdir}, so you can use
|
||
@code{pkglib_LTLIBRARIES} to install libraries in
|
||
@samp{$(libdir)/@@PACKAGE@@/}.
|
||
|
||
If @file{gettext.h} is a public header file that needs to be installed
|
||
in order for people to use the library, it should be declared using a
|
||
@code{_HEADERS} variable, not in @code{libgettext_la_SOURCES}.
|
||
Headers listed in the latter should be internal headers that are not
|
||
part of the public interface.
|
||
|
||
@example
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c @dots{}
|
||
include_HEADERS = gettext.h @dots{}
|
||
@end example
|
||
|
||
A package can build and install such a library along with other
|
||
programs that use it. This dependency should be specified using
|
||
@code{LDADD}. The following example builds a program named
|
||
@file{hello} that is linked with @file{libgettext.la}.
|
||
|
||
@example
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c @dots{}
|
||
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello.c @dots{}
|
||
hello_LDADD = libgettext.la
|
||
@end example
|
||
|
||
@noindent
|
||
Whether @file{hello} is statically or dynamically linked with
|
||
@file{libgettext.la} is not yet known: this will depend on the
|
||
configuration of libtool and the capabilities of the host.
|
||
|
||
|
||
@node Conditional Libtool Libraries
|
||
@subsection Building Libtool Libraries Conditionally
|
||
@cindex libtool libraries, conditional
|
||
@cindex conditional libtool libraries
|
||
|
||
Like conditional programs (@pxref{Conditional Programs}), there are
|
||
two main ways to build conditional libraries: using Automake
|
||
conditionals or using Autoconf @code{AC_SUBST}itutions.
|
||
|
||
The important implementation detail you have to be aware of is that
|
||
the place where a library will be installed matters to libtool: it
|
||
needs to be indicated @emph{at link-time} using the @option{-rpath}
|
||
option.
|
||
|
||
For libraries whose destination directory is known when Automake runs,
|
||
Automake will automatically supply the appropriate @option{-rpath}
|
||
option to libtool. This is the case for libraries listed explicitly in
|
||
some installable @code{_LTLIBRARIES} variables such as
|
||
@code{lib_LTLIBRARIES}.
|
||
|
||
However, for libraries determined at configure time (and thus
|
||
mentioned in @code{EXTRA_LTLIBRARIES}), Automake does not know the
|
||
final installation directory. For such libraries you must add the
|
||
@option{-rpath} option to the appropriate @code{_LDFLAGS} variable by
|
||
hand.
|
||
|
||
The examples below illustrate the differences between these two methods.
|
||
|
||
Here is an example where @code{WANTEDLIBS} is an @code{AC_SUBST}ed
|
||
variable set at @file{./configure}-time to either @file{libfoo.la},
|
||
@file{libbar.la}, both, or none. Although @samp{$(WANTEDLIBS)}
|
||
appears in the @code{lib_LTLIBRARIES}, Automake cannot guess it
|
||
relates to @file{libfoo.la} or @file{libbar.la} at the time it creates
|
||
the link rule for these two libraries. Therefore the @option{-rpath}
|
||
argument must be explicitly supplied.
|
||
|
||
@c Keep in sync with ltcond.sh
|
||
@example
|
||
EXTRA_LTLIBRARIES = libfoo.la libbar.la
|
||
lib_LTLIBRARIES = $(WANTEDLIBS)
|
||
libfoo_la_SOURCES = foo.c @dots{}
|
||
libfoo_la_LDFLAGS = -rpath '$(libdir)'
|
||
libbar_la_SOURCES = bar.c @dots{}
|
||
libbar_la_LDFLAGS = -rpath '$(libdir)'
|
||
@end example
|
||
|
||
Here is how the same @file{Makefile.am} would look using Automake
|
||
conditionals named @code{WANT_LIBFOO} and @code{WANT_LIBBAR}. Now
|
||
Automake is able to compute the @option{-rpath} setting itself, because
|
||
it's clear that both libraries will end up in @samp{$(libdir)} if they
|
||
are installed.
|
||
|
||
@c Keep in sync with ltcond.sh
|
||
@example
|
||
lib_LTLIBRARIES =
|
||
if WANT_LIBFOO
|
||
lib_LTLIBRARIES += libfoo.la
|
||
endif
|
||
if WANT_LIBBAR
|
||
lib_LTLIBRARIES += libbar.la
|
||
endif
|
||
libfoo_la_SOURCES = foo.c @dots{}
|
||
libbar_la_SOURCES = bar.c @dots{}
|
||
@end example
|
||
|
||
@node Conditional Libtool Sources
|
||
@subsection Libtool Libraries with Conditional Sources
|
||
|
||
Conditional compilation of sources in a library can be achieved in the
|
||
same way as conditional compilation of sources in a program
|
||
(@pxref{Conditional Sources}). The only difference is that
|
||
@code{_LIBADD} should be used instead of @code{_LDADD} and that it
|
||
should mention libtool objects (@file{.lo} files).
|
||
|
||
So, to mimic the @file{hello} example from @ref{Conditional Sources},
|
||
we could build a @file{libhello.la} library using either
|
||
@file{hello-linux.c} or @file{hello-generic.c} with the following
|
||
@file{Makefile.am}.
|
||
|
||
@c Keep in sync with ltcond2.sh
|
||
@example
|
||
lib_LTLIBRARIES = libhello.la
|
||
libhello_la_SOURCES = hello-common.c
|
||
EXTRA_libhello_la_SOURCES = hello-linux.c hello-generic.c
|
||
libhello_la_LIBADD = $(HELLO_SYSTEM)
|
||
libhello_la_DEPENDENCIES = $(HELLO_SYSTEM)
|
||
@end example
|
||
|
||
@noindent
|
||
And make sure @command{configure} defines @code{HELLO_SYSTEM} as
|
||
either @file{hello-linux.lo} or @file{hello-@-generic.lo}.
|
||
|
||
Or we could simply use an Automake conditional as follows.
|
||
|
||
@c Keep in sync with ltcond2.sh
|
||
@example
|
||
lib_LTLIBRARIES = libhello.la
|
||
libhello_la_SOURCES = hello-common.c
|
||
if LINUX
|
||
libhello_la_SOURCES += hello-linux.c
|
||
else
|
||
libhello_la_SOURCES += hello-generic.c
|
||
endif
|
||
@end example
|
||
|
||
@node Libtool Convenience Libraries
|
||
@subsection Libtool Convenience Libraries
|
||
@cindex convenience libraries, libtool
|
||
@cindex libtool convenience libraries
|
||
@vindex noinst_LTLIBRARIES
|
||
@vindex check_LTLIBRARIES
|
||
|
||
Sometimes you want to build libtool libraries that should not be
|
||
installed. These are called @dfn{libtool convenience libraries} and
|
||
are typically used to encapsulate many sublibraries, later gathered
|
||
into one big installed library.
|
||
|
||
Libtool convenience libraries are declared by directory-less variables
|
||
such as @code{noinst_LTLIBRARIES}, @code{check_LTLIBRARIES}, or even
|
||
@code{EXTRA_LTLIBRARIES}. Unlike installed libtool libraries they do
|
||
not need an @option{-rpath} flag at link time (actually this is the only
|
||
difference).
|
||
|
||
Convenience libraries listed in @code{noinst_LTLIBRARIES} are always
|
||
built. Those listed in @code{check_LTLIBRARIES} are built only upon
|
||
@samp{make check}. Finally, libraries listed in
|
||
@code{EXTRA_LTLIBRARIES} are never built explicitly: Automake outputs
|
||
rules to build them, but if the library does not appear as a Makefile
|
||
dependency anywhere it won't be built (this is why
|
||
@code{EXTRA_LTLIBRARIES} is used for conditional compilation).
|
||
|
||
Here is a sample setup merging libtool convenience libraries from
|
||
subdirectories into one main @file{libtop.la} library.
|
||
|
||
@c Keep in sync with ltconv.sh
|
||
@example
|
||
# -- Top-level Makefile.am --
|
||
SUBDIRS = sub1 sub2 @dots{}
|
||
lib_LTLIBRARIES = libtop.la
|
||
libtop_la_SOURCES =
|
||
libtop_la_LIBADD = \
|
||
sub1/libsub1.la \
|
||
sub2/libsub2.la \
|
||
@dots{}
|
||
|
||
# -- sub1/Makefile.am --
|
||
noinst_LTLIBRARIES = libsub1.la
|
||
libsub1_la_SOURCES = @dots{}
|
||
|
||
# -- sub2/Makefile.am --
|
||
# showing nested convenience libraries
|
||
SUBDIRS = sub2.1 sub2.2 @dots{}
|
||
noinst_LTLIBRARIES = libsub2.la
|
||
libsub2_la_SOURCES =
|
||
libsub2_la_LIBADD = \
|
||
sub21/libsub21.la \
|
||
sub22/libsub22.la \
|
||
@dots{}
|
||
@end example
|
||
|
||
When using such setup, beware that @command{automake} will assume
|
||
@file{libtop.la} is to be linked with the C linker. This is because
|
||
@code{libtop_la_SOURCES} is empty, so @command{automake} picks C as
|
||
default language. If @code{libtop_la_SOURCES} was not empty,
|
||
@command{automake} would select the linker as explained in @ref{How
|
||
the Linker is Chosen}.
|
||
|
||
If one of the sublibraries contains non-C source, it is important that
|
||
the appropriate linker be chosen. One way to achieve this is to
|
||
pretend that there is such a non-C file among the sources of the
|
||
library, thus forcing @command{automake} to select the appropriate
|
||
linker. Here is the top-level @file{Makefile} of our example updated
|
||
to force C++ linking.
|
||
|
||
@example
|
||
SUBDIRS = sub1 sub2 @dots{}
|
||
lib_LTLIBRARIES = libtop.la
|
||
libtop_la_SOURCES =
|
||
# Dummy C++ source to cause C++ linking.
|
||
nodist_EXTRA_libtop_la_SOURCES = dummy.cxx
|
||
libtop_la_LIBADD = \
|
||
sub1/libsub1.la \
|
||
sub2/libsub2.la \
|
||
@dots{}
|
||
@end example
|
||
|
||
@samp{EXTRA_*_SOURCES} variables are used to keep track of source
|
||
files that might be compiled (this is mostly useful when doing
|
||
conditional compilation using @code{AC_SUBST}, @pxref{Conditional
|
||
Libtool Sources}), and the @code{nodist_} prefix means the listed
|
||
sources are not to be distributed (@pxref{Program and Library
|
||
Variables}). In effect the file @file{dummy.cxx} does not need to
|
||
exist in the source tree. Of course if you have some real source file
|
||
to list in @code{libtop_la_SOURCES} there is no point in cheating with
|
||
@code{nodist_EXTRA_libtop_la_SOURCES}.
|
||
|
||
|
||
@node Libtool Modules
|
||
@subsection Libtool Modules
|
||
@cindex modules, libtool
|
||
@cindex libtool modules
|
||
@cindex @option{-module}, libtool
|
||
|
||
These are libtool libraries meant to be dlopened. They are
|
||
indicated to libtool by passing @option{-module} at link-time.
|
||
|
||
@example
|
||
pkglib_LTLIBRARIES = mymodule.la
|
||
mymodule_la_SOURCES = doit.c
|
||
mymodule_la_LDFLAGS = -module
|
||
@end example
|
||
|
||
Ordinarily, Automake requires that a library's name start with
|
||
@code{lib}. However, when building a dynamically loadable module you
|
||
might wish to use a "nonstandard" name. Automake will not complain
|
||
about such nonstandard names if it knows the library being built is a
|
||
libtool module, i.e., if @option{-module} explicitly appears in the
|
||
library's @code{_LDFLAGS} variable (or in the common @code{AM_LDFLAGS}
|
||
variable when no per-library @code{_LDFLAGS} variable is defined).
|
||
|
||
As always, @code{AC_SUBST} variables are black boxes to Automake since
|
||
their values are not yet known when @command{automake} is run.
|
||
Therefore if @option{-module} is set via such a variable, Automake
|
||
cannot notice it and will proceed as if the library was an ordinary
|
||
libtool library, with strict naming.
|
||
|
||
If @code{mymodule_la_SOURCES} is not specified, then it defaults to
|
||
the single file @file{mymodule.c} (@pxref{Default _SOURCES}).
|
||
|
||
@node Libtool Flags
|
||
@subsection @code{_LIBADD}, @code{_LDFLAGS}, and @code{_LIBTOOLFLAGS}
|
||
@cindex @code{_LIBADD}, libtool
|
||
@cindex @code{_LDFLAGS}, libtool
|
||
@cindex @code{_LIBTOOLFLAGS}, libtool
|
||
@vindex AM_LIBTOOLFLAGS
|
||
@vindex LIBTOOLFLAGS
|
||
@vindex maude_LIBTOOLFLAGS
|
||
|
||
As shown in previous sections, the @samp{@var{library}_LIBADD}
|
||
variable should be used to list extra libtool objects (@file{.lo}
|
||
files) or libtool libraries (@file{.la}) to add to @var{library}.
|
||
|
||
The @samp{@var{library}_LDFLAGS} variable is the place to list
|
||
additional libtool linking flags, such as @option{-version-info},
|
||
@option{-static}, and a lot more. @xref{Link mode, , Link mode,
|
||
libtool, The Libtool Manual}.
|
||
|
||
The @command{libtool} command has two kinds of options: mode-specific
|
||
options and generic options. Mode-specific options such as the
|
||
aforementioned linking flags should be lumped with the other flags
|
||
passed to the tool invoked by @command{libtool} (hence the use of
|
||
@samp{@var{library}_LDFLAGS} for libtool linking flags). Generic
|
||
options include @option{--tag=@var{tag}} and @option{--silent}
|
||
(@pxref{Invoking libtool, , Invoking @command{libtool}, libtool, The
|
||
Libtool Manual} for more options) should appear before the mode
|
||
selection on the command line; in @file{Makefile.am}s they should
|
||
be listed in the @samp{@var{library}_LIBTOOLFLAGS} variable.
|
||
|
||
If @samp{@var{library}_LIBTOOLFLAGS} is not defined, then the variable
|
||
@code{AM_LIBTOOLFLAGS} is used instead.
|
||
|
||
These flags are passed to libtool after the @option{--tag=@var{tag}}
|
||
option computed by Automake (if any), so
|
||
@samp{@var{library}_LIBTOOLFLAGS} (or @code{AM_LIBTOOLFLAGS}) is a
|
||
good place to override or supplement the @option{--tag=@var{tag}}
|
||
setting.
|
||
|
||
The libtool rules also use a @code{LIBTOOLFLAGS} variable that should
|
||
not be set in @file{Makefile.am}: this is a user variable (@pxref{Flag
|
||
Variables Ordering}. It allows users to run @samp{make
|
||
LIBTOOLFLAGS=--silent}, for instance. Note that the verbosity of
|
||
@command{libtool} can also be influenced by the Automake support
|
||
for silent rules (@pxref{Automake Silent Rules}).
|
||
|
||
@node LTLIBOBJS, Libtool Issues, Libtool Flags, A Shared Library
|
||
@subsection @code{LTLIBOBJS} and @code{LTALLOCA}
|
||
@cindex @code{LTLIBOBJS}, special handling
|
||
@cindex @code{LIBOBJS}, and Libtool
|
||
@cindex @code{LTALLOCA}, special handling
|
||
@cindex @code{ALLOCA}, and Libtool
|
||
@vindex LTLIBOBJS
|
||
@vindex LIBOBJS
|
||
@vindex LTALLOCA
|
||
@vindex ALLOCA
|
||
@acindex AC_LIBOBJ
|
||
|
||
Where an ordinary library might include @samp{$(LIBOBJS)} or
|
||
@samp{$(ALLOCA)} (@pxref{LIBOBJS}), a libtool library must use
|
||
@samp{$(LTLIBOBJS)} or @samp{$(LTALLOCA)}. This is required because
|
||
the object files that libtool operates on do not necessarily end in
|
||
@file{.o}.
|
||
|
||
Nowadays, the computation of @code{LTLIBOBJS} from @code{LIBOBJS} is
|
||
performed automatically by Autoconf (@pxref{AC_LIBOBJ vs LIBOBJS, ,
|
||
@code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, autoconf, The Autoconf Manual}).
|
||
|
||
@node Libtool Issues
|
||
@subsection Common Issues Related to Libtool's Use
|
||
|
||
@menu
|
||
* Error required file ltmain.sh not found:: The need to run libtoolize
|
||
* Objects created both with libtool and without:: Avoid a specific build race
|
||
@end menu
|
||
|
||
@node Error required file ltmain.sh not found
|
||
@subsubsection Error: @samp{required file `./ltmain.sh' not found}
|
||
@cindex @file{ltmain.sh} not found
|
||
@cindex @command{libtoolize}, no longer run by @command{automake}
|
||
@cindex @command{libtoolize} and @command{autoreconf}
|
||
@cindex @command{autoreconf} and @command{libtoolize}
|
||
@cindex @file{bootstrap} and @command{autoreconf}
|
||
@cindex @file{autogen.sh} and @command{autoreconf}
|
||
|
||
Libtool comes with a tool called @command{libtoolize} that will
|
||
install libtool's supporting files into a package. Running this
|
||
command will install @file{ltmain.sh}. You should execute it before
|
||
@command{aclocal} and @command{automake}.
|
||
|
||
People upgrading old packages to newer autotools are likely to face
|
||
this issue because older Automake versions used to call
|
||
@command{libtoolize}. Therefore old build scripts do not call
|
||
@command{libtoolize}.
|
||
|
||
Since Automake 1.6, it has been decided that running
|
||
@command{libtoolize} was none of Automake's business. Instead, that
|
||
functionality has been moved into the @command{autoreconf} command
|
||
(@pxref{autoreconf Invocation, , Using @command{autoreconf}, autoconf,
|
||
The Autoconf Manual}). If you do not want to remember what to run and
|
||
when, just learn the @command{autoreconf} command. Hopefully,
|
||
replacing existing @file{bootstrap} or @file{autogen.sh} scripts by
|
||
a call to @command{autoreconf} should also free you from any similar
|
||
incompatible change in the future.
|
||
|
||
@node Objects created both with libtool and without
|
||
@subsubsection Objects @samp{created with both libtool and without}
|
||
|
||
Sometimes, the same source file is used both to build a libtool
|
||
library and to build another non-libtool target (be it a program or
|
||
another library).
|
||
|
||
Let's consider the following @file{Makefile.am}.
|
||
|
||
@example
|
||
bin_PROGRAMS = prog
|
||
prog_SOURCES = prog.c foo.c @dots{}
|
||
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.c @dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
(In this trivial case the issue could be avoided by linking
|
||
@file{libfoo.la} with @file{prog} instead of listing @file{foo.c} in
|
||
@code{prog_SOURCES}. But let's assume we really want to keep
|
||
@file{prog} and @file{libfoo.la} separate.)
|
||
|
||
Technically, it means that we should build @file{foo.$(OBJEXT)} for
|
||
@file{prog}, and @file{foo.lo} for @file{libfoo.la}. The problem is
|
||
that in the course of creating @file{foo.lo}, libtool may erase (or
|
||
replace) @file{foo.$(OBJEXT)}, and this cannot be avoided.
|
||
|
||
Therefore, when Automake detects this situation it will complain
|
||
with a message such as
|
||
@example
|
||
object 'foo.$(OBJEXT)' created both with libtool and without
|
||
@end example
|
||
|
||
A workaround for this issue is to ensure that these two objects get
|
||
different basenames. As explained in @ref{Renamed Objects}, this
|
||
happens automatically when per-targets flags are used.
|
||
|
||
@example
|
||
bin_PROGRAMS = prog
|
||
prog_SOURCES = prog.c foo.c @dots{}
|
||
prog_CFLAGS = $(AM_CFLAGS)
|
||
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.c @dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
Adding @samp{prog_CFLAGS = $(AM_CFLAGS)} is almost a no-op, because
|
||
when the @code{prog_CFLAGS} is defined, it is used instead of
|
||
@code{AM_CFLAGS}. However as a side effect it will cause
|
||
@file{prog.c} and @file{foo.c} to be compiled as
|
||
@file{prog-prog.$(OBJEXT)} and @file{prog-foo.$(OBJEXT)}, which solves
|
||
the issue.
|
||
|
||
@node Program and Library Variables
|
||
@section Program and Library Variables
|
||
|
||
Associated with each program is a collection of variables that can be
|
||
used to modify how that program is built. There is a similar list of
|
||
such variables for each library. The canonical name of the program (or
|
||
library) is used as a base for naming these variables.
|
||
|
||
In the list below, we use the name ``maude'' to refer to the program or
|
||
library. In your @file{Makefile.am} you would replace this with the
|
||
canonical name of your program. This list also refers to ``maude'' as a
|
||
program, but in general the same rules apply for both static and dynamic
|
||
libraries; the documentation below notes situations where programs and
|
||
libraries differ.
|
||
|
||
@vtable @code
|
||
@item maude_SOURCES
|
||
This variable, if it exists, lists all the source files that are
|
||
compiled to build the program. These files are added to the
|
||
distribution by default. When building the program, Automake will cause
|
||
each source file to be compiled to a single @file{.o} file (or
|
||
@file{.lo} when using libtool). Normally these object files are named
|
||
after the source file, but other factors can change this. If a file in
|
||
the @code{_SOURCES} variable has an unrecognized extension, Automake
|
||
will do one of two things with it. If a suffix rule exists for turning
|
||
files with the unrecognized extension into @file{.o} files, then
|
||
@command{automake} will treat this file as it will any other source file
|
||
(@pxref{Support for Other Languages}). Otherwise, the file will be
|
||
ignored as though it were a header file.
|
||
|
||
The prefixes @code{dist_} and @code{nodist_} can be used to control
|
||
whether files listed in a @code{_SOURCES} variable are distributed.
|
||
@code{dist_} is redundant, as sources are distributed by default, but it
|
||
can be specified for clarity if desired.
|
||
|
||
It is possible to have both @code{dist_} and @code{nodist_} variants of
|
||
a given @code{_SOURCES} variable at once; this lets you easily
|
||
distribute some files and not others, for instance:
|
||
|
||
@example
|
||
nodist_maude_SOURCES = nodist.c
|
||
dist_maude_SOURCES = dist-me.c
|
||
@end example
|
||
|
||
By default the output file (on Unix systems, the @file{.o} file) will
|
||
be put into the current build directory. However, if the option
|
||
@option{subdir-objects} is in effect in the current directory then the
|
||
@file{.o} file will be put into the subdirectory named after the
|
||
source file. For instance, with @option{subdir-objects} enabled,
|
||
@file{sub/dir/file.c} will be compiled to @file{sub/dir/file.o}. Some
|
||
people prefer this mode of operation. You can specify
|
||
@option{subdir-objects} in @code{AUTOMAKE_OPTIONS} (@pxref{Options}).
|
||
@cindex Subdirectory, objects in
|
||
@cindex Objects in subdirectory
|
||
|
||
|
||
@item EXTRA_maude_SOURCES
|
||
Automake needs to know the list of files you intend to compile
|
||
@emph{statically}. For one thing, this is the only way Automake has of
|
||
knowing what sort of language support a given @file{Makefile.in}
|
||
requires. @footnote{There are other, more obscure reasons for
|
||
this limitation as well.} This means that, for example, you can't put a
|
||
configure substitution like @samp{@@my_sources@@} into a @samp{_SOURCES}
|
||
variable. If you intend to conditionally compile source files and use
|
||
@file{configure} to substitute the appropriate object names into, e.g.,
|
||
@code{_LDADD} (see below), then you should list the corresponding source
|
||
files in the @code{EXTRA_} variable.
|
||
|
||
This variable also supports @code{dist_} and @code{nodist_} prefixes.
|
||
For instance, @code{nodist_EXTRA_maude_SOURCES} would list extra
|
||
sources that may need to be built, but should not be distributed.
|
||
|
||
@item maude_AR
|
||
A static library is created by default by invoking @samp{$(AR)
|
||
$(ARFLAGS)} followed by the name of the library and then the objects
|
||
being put into the library. You can override this by setting the
|
||
@code{_AR} variable. This is usually used with C++; some C++
|
||
compilers require a special invocation in order to instantiate all the
|
||
templates that should go into a library. For instance, the SGI C++
|
||
compiler likes this variable set like so:
|
||
@example
|
||
libmaude_a_AR = $(CXX) -ar -o
|
||
@end example
|
||
|
||
@item maude_LIBADD
|
||
Extra objects can be added to a @emph{library} using the @code{_LIBADD}
|
||
variable. For instance, this should be used for objects determined by
|
||
@command{configure} (@pxref{A Library}).
|
||
|
||
In the case of libtool libraries, @code{maude_LIBADD} can also refer
|
||
to other libtool libraries.
|
||
|
||
@item maude_LDADD
|
||
Extra objects (@file{*.$(OBJEXT)}) and libraries (@file{*.a},
|
||
@file{*.la}) can be added to a @emph{program} by listing them in the
|
||
@code{_LDADD} variable. For instance, this should be used for objects
|
||
determined by @command{configure} (@pxref{Linking}).
|
||
|
||
@code{_LDADD} and @code{_LIBADD} are inappropriate for passing
|
||
program-specific linker flags (except for @option{-l}, @option{-L},
|
||
@option{-dlopen} and @option{-dlpreopen}). Use the @code{_LDFLAGS} variable
|
||
for this purpose.
|
||
|
||
For instance, if your @file{configure.ac} uses @code{AC_PATH_XTRA}, you
|
||
could link your program against the X libraries like so:
|
||
|
||
@example
|
||
maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)
|
||
@end example
|
||
|
||
We recommend that you use @option{-l} and @option{-L} only when
|
||
referring to third-party libraries, and give the explicit file names
|
||
of any library built by your package. Doing so will ensure that
|
||
@code{maude_DEPENDENCIES} (see below) is correctly defined by default.
|
||
|
||
@item maude_LDFLAGS
|
||
This variable is used to pass extra flags to the link step of a program
|
||
or a shared library. It overrides the @code{AM_LDFLAGS} variable.
|
||
|
||
@item maude_LIBTOOLFLAGS
|
||
This variable is used to pass extra options to @command{libtool}.
|
||
It overrides the @code{AM_LIBTOOLFLAGS} variable.
|
||
These options are output before @command{libtool}'s @option{--mode=@var{mode}}
|
||
option, so they should not be mode-specific options (those belong to
|
||
the compiler or linker flags). @xref{Libtool Flags}.
|
||
|
||
@item maude_DEPENDENCIES
|
||
@itemx EXTRA_maude_DEPENDENCIES
|
||
It is also occasionally useful to have a target (program or library)
|
||
depend on some other file that is not actually part of that target.
|
||
This can be done using the @code{_DEPENDENCIES} variable. Each
|
||
target depends on the contents of such a variable, but no further
|
||
interpretation is done.
|
||
|
||
Since these dependencies are associated to the link rule used to
|
||
create the programs they should normally list files used by the link
|
||
command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la} files
|
||
for programs; @file{*.lo} and @file{*.la} files for Libtool libraries;
|
||
and @file{*.$(OBJEXT)} files for static libraries. In rare cases you
|
||
may need to add other kinds of files such as linker scripts, but
|
||
@emph{listing a source file in @code{_DEPENDENCIES} is wrong}. If
|
||
some source file needs to be built before all the components of a
|
||
program are built, consider using the @code{BUILT_SOURCES} variable
|
||
(@pxref{Sources}).
|
||
|
||
If @code{_DEPENDENCIES} is not supplied, it is computed by Automake.
|
||
The automatically-assigned value is the contents of @code{_LDADD} or
|
||
@code{_LIBADD}, with most configure substitutions, @option{-l}, @option{-L},
|
||
@option{-dlopen} and @option{-dlpreopen} options removed. The configure
|
||
substitutions that are left in are only @samp{$(LIBOBJS)} and
|
||
@samp{$(ALLOCA)}; these are left because it is known that they will not
|
||
cause an invalid value for @code{_DEPENDENCIES} to be generated.
|
||
|
||
@code{_DEPENDENCIES} is more likely used to perform conditional
|
||
compilation using an @code{AC_SUBST} variable that contains a list of
|
||
objects. @xref{Conditional Sources}, and @ref{Conditional Libtool
|
||
Sources}.
|
||
|
||
The @code{EXTRA_*_DEPENDENCIES} variable may be useful for cases where
|
||
you merely want to augment the @command{automake}-generated
|
||
@code{_DEPENDENCIES} variable rather than replacing it.
|
||
|
||
@item maude_LINK
|
||
You can override the linker on a per-program basis. By default the
|
||
linker is chosen according to the languages used by the program. For
|
||
instance, a program that includes C++ source code would use the C++
|
||
compiler to link. The @code{_LINK} variable must hold the name of a
|
||
command that can be passed all the @file{.o} file names and libraries
|
||
to link against as arguments. Note that the name of the underlying
|
||
program is @emph{not} passed to @code{_LINK}; typically one uses
|
||
@samp{$@@}:
|
||
|
||
@example
|
||
maude_LINK = $(CCLD) -magic -o $@@
|
||
@end example
|
||
|
||
If a @code{_LINK} variable is not supplied, it may still be generated
|
||
and used by Automake due to the use of per-target link flags such as
|
||
@code{_CFLAGS}, @code{_LDFLAGS} or @code{_LIBTOOLFLAGS}, in cases where
|
||
they apply.
|
||
|
||
@item maude_CCASFLAGS
|
||
@itemx maude_CFLAGS
|
||
@itemx maude_CPPFLAGS
|
||
@itemx maude_CXXFLAGS
|
||
@itemx maude_FFLAGS
|
||
@itemx maude_GCJFLAGS
|
||
@itemx maude_LFLAGS
|
||
@itemx maude_OBJCFLAGS
|
||
@itemx maude_OBJCXXFLAGS
|
||
@itemx maude_RFLAGS
|
||
@itemx maude_UPCFLAGS
|
||
@itemx maude_YFLAGS
|
||
@cindex per-target compilation flags, defined
|
||
Automake allows you to set compilation flags on a per-program (or
|
||
per-library) basis. A single source file can be included in several
|
||
programs, and it will potentially be compiled with different flags for
|
||
each program. This works for any language directly supported by
|
||
Automake. These @dfn{per-target compilation flags} are
|
||
@samp{_CCASFLAGS},
|
||
@samp{_CFLAGS},
|
||
@samp{_CPPFLAGS},
|
||
@samp{_CXXFLAGS},
|
||
@samp{_FFLAGS},
|
||
@samp{_GCJFLAGS},
|
||
@samp{_LFLAGS},
|
||
@samp{_OBJCFLAGS},
|
||
@samp{_OBJCXXFLAGS},
|
||
@samp{_RFLAGS},
|
||
@samp{_UPCFLAGS}, and
|
||
@samp{_YFLAGS}.
|
||
|
||
When using a per-target compilation flag, Automake will choose a
|
||
different name for the intermediate object files. Ordinarily a file
|
||
like @file{sample.c} will be compiled to produce @file{sample.o}.
|
||
However, if the program's @code{_CFLAGS} variable is set, then the
|
||
object file will be named, for instance, @file{maude-sample.o}. (See
|
||
also @ref{Renamed Objects}).
|
||
|
||
In compilations with per-target flags, the ordinary @samp{AM_} form of
|
||
the flags variable is @emph{not} automatically included in the
|
||
compilation (however, the user form of the variable @emph{is} included).
|
||
So for instance, if you want the hypothetical @file{maude} compilations
|
||
to also use the value of @code{AM_CFLAGS}, you would need to write:
|
||
|
||
@example
|
||
maude_CFLAGS = @dots{} your flags @dots{} $(AM_CFLAGS)
|
||
@end example
|
||
|
||
@xref{Flag Variables Ordering}, for more discussion about the
|
||
interaction between user variables, @samp{AM_} shadow variables, and
|
||
per-target variables.
|
||
|
||
@item maude_SHORTNAME
|
||
On some platforms the allowable file names are very short. In order to
|
||
support these systems and per-target compilation flags at the same
|
||
time, Automake allows you to set a ``short name'' that will influence
|
||
how intermediate object files are named. For instance, in the following
|
||
example,
|
||
|
||
@example
|
||
bin_PROGRAMS = maude
|
||
maude_CPPFLAGS = -DSOMEFLAG
|
||
maude_SHORTNAME = m
|
||
maude_SOURCES = sample.c @dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
the object file would be named @file{m-sample.o} rather than
|
||
@file{maude-sample.o}.
|
||
|
||
This facility is rarely needed in practice,
|
||
and we recommend avoiding it until you find it is required.
|
||
@end vtable
|
||
|
||
@node Default _SOURCES
|
||
@section Default @code{_SOURCES}
|
||
|
||
@vindex _SOURCES
|
||
@vindex SOURCES
|
||
@cindex @code{_SOURCES}, default
|
||
@cindex default @code{_SOURCES}
|
||
@vindex AM_DEFAULT_SOURCE_EXT
|
||
|
||
@code{_SOURCES} variables are used to specify source files of programs
|
||
(@pxref{A Program}), libraries (@pxref{A Library}), and Libtool
|
||
libraries (@pxref{A Shared Library}).
|
||
|
||
When no such variable is specified for a target, Automake will define
|
||
one itself. The default is to compile a single C file whose base name
|
||
is the name of the target itself, with any extension replaced by
|
||
@code{AM_DEFAULT_SOURCE_EXT}, which defaults to @file{.c}.
|
||
|
||
For example if you have the following somewhere in your
|
||
@file{Makefile.am} with no corresponding @code{libfoo_a_SOURCES}:
|
||
|
||
@example
|
||
lib_LIBRARIES = libfoo.a sub/libc++.a
|
||
@end example
|
||
|
||
@noindent
|
||
@file{libfoo.a} will be built using a default source file named
|
||
@file{libfoo.c}, and @file{sub/libc++.a} will be built from
|
||
@file{sub/libc++.c}. (In older versions @file{sub/libc++.a}
|
||
would be built from @file{sub_libc___a.c}, i.e., the default source
|
||
was the canonized name of the target, with @file{.c} appended.
|
||
We believe the new behavior is more sensible, but for backward
|
||
compatibility @command{automake} will use the old name if a file or a rule
|
||
with that name exists and @code{AM_DEFAULT_SOURCE_EXT} is not used.)
|
||
|
||
@cindex @code{check_PROGRAMS} example
|
||
@vindex check_PROGRAMS
|
||
Default sources are mainly useful in test suites, when building many
|
||
test programs each from a single source. For instance, in
|
||
|
||
@example
|
||
check_PROGRAMS = test1 test2 test3
|
||
AM_DEFAULT_SOURCE_EXT = .cpp
|
||
@end example
|
||
|
||
@noindent
|
||
@file{test1}, @file{test2}, and @file{test3} will be built
|
||
from @file{test1.cpp}, @file{test2.cpp}, and @file{test3.cpp}.
|
||
Without the last line, they will be built from @file{test1.c},
|
||
@file{test2.c}, and @file{test3.c}.
|
||
|
||
@cindex Libtool modules, default source example
|
||
@cindex default source, Libtool modules example
|
||
Another case where this is convenient is building many Libtool modules
|
||
(@file{module@var{n}.la}), each defined in its own file
|
||
(@file{module@var{n}.c}).
|
||
|
||
@example
|
||
AM_LDFLAGS = -module
|
||
lib_LTLIBRARIES = module1.la module2.la module3.la
|
||
@end example
|
||
|
||
@cindex empty @code{_SOURCES}
|
||
@cindex @code{_SOURCES}, empty
|
||
Finally, there is one situation where this default source computation
|
||
needs to be avoided: when a target should not be built from sources.
|
||
We already saw such an example in @ref{true}; this happens when all
|
||
the constituents of a target have already been compiled and just need
|
||
to be combined using a @code{_LDADD} variable. Then it is necessary
|
||
to define an empty @code{_SOURCES} variable, so that @command{automake}
|
||
does not compute a default.
|
||
|
||
@example
|
||
bin_PROGRAMS = target
|
||
target_SOURCES =
|
||
target_LDADD = libmain.a libmisc.a
|
||
@end example
|
||
|
||
@node LIBOBJS
|
||
@section Special handling for @code{LIBOBJS} and @code{ALLOCA}
|
||
|
||
@cindex @code{LIBOBJS}, example
|
||
@cindex @code{ALLOCA}, example
|
||
@cindex @code{LIBOBJS}, special handling
|
||
@cindex @code{ALLOCA}, special handling
|
||
@vindex LTLIBOBJS
|
||
@vindex LIBOBJS
|
||
@vindex LTALLOCA
|
||
@vindex ALLOCA
|
||
|
||
The @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} variables list object
|
||
files that should be compiled into the project to provide an
|
||
implementation for functions that are missing or broken on the host
|
||
system. They are substituted by @file{configure}.
|
||
|
||
@acindex AC_LIBOBJ
|
||
|
||
These variables are defined by Autoconf macros such as
|
||
@code{AC_LIBOBJ}, @code{AC_REPLACE_FUNCS} (@pxref{Generic Functions, ,
|
||
Generic Function Checks, autoconf, The Autoconf Manual}), or
|
||
@code{AC_FUNC_ALLOCA} (@pxref{Particular Functions, , Particular
|
||
Function Checks, autoconf, The Autoconf Manual}). Many other Autoconf
|
||
macros call @code{AC_LIBOBJ} or @code{AC_REPLACE_FUNCS} to
|
||
populate @samp{$(LIBOBJS)}.
|
||
|
||
@acindex AC_LIBSOURCE
|
||
|
||
Using these variables is very similar to doing conditional compilation
|
||
using @code{AC_SUBST} variables, as described in @ref{Conditional
|
||
Sources}. That is, when building a program, @samp{$(LIBOBJS)} and
|
||
@samp{$(ALLOCA)} should be added to the associated @samp{*_LDADD}
|
||
variable, or to the @samp{*_LIBADD} variable when building a library.
|
||
However there is no need to list the corresponding sources in
|
||
@samp{EXTRA_*_SOURCES} nor to define @samp{*_DEPENDENCIES}. Automake
|
||
automatically adds @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} to the
|
||
dependencies, and it will discover the list of corresponding source
|
||
files automatically (by tracing the invocations of the
|
||
@code{AC_LIBSOURCE} Autoconf macros). If you have already defined
|
||
@samp{*_DEPENDENCIES} explicitly for an unrelated reason, then you
|
||
either need to add these variables manually, or use
|
||
@samp{EXTRA_*_DEPENDENCIES} instead of @samp{*_DEPENDENCIES}.
|
||
|
||
These variables are usually used to build a portability library that
|
||
is linked with all the programs of the project. We now review a
|
||
sample setup. First, @file{configure.ac} contains some checks that
|
||
affect either @code{LIBOBJS} or @code{ALLOCA}.
|
||
|
||
@example
|
||
# configure.ac
|
||
@dots{}
|
||
AC_CONFIG_LIBOBJ_DIR([lib])
|
||
@dots{}
|
||
AC_FUNC_MALLOC dnl May add malloc.$(OBJEXT) to LIBOBJS
|
||
AC_FUNC_MEMCMP dnl May add memcmp.$(OBJEXT) to LIBOBJS
|
||
AC_REPLACE_FUNCS([strdup]) dnl May add strdup.$(OBJEXT) to LIBOBJS
|
||
AC_FUNC_ALLOCA dnl May add alloca.$(OBJEXT) to ALLOCA
|
||
@dots{}
|
||
AC_CONFIG_FILES([
|
||
lib/Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
@end example
|
||
|
||
@acindex AC_CONFIG_LIBOBJ_DIR
|
||
|
||
The @code{AC_CONFIG_LIBOBJ_DIR} tells Autoconf that the source files
|
||
of these object files are to be found in the @file{lib/} directory.
|
||
Automake can also use this information, otherwise it expects the
|
||
source files are to be in the directory where the @samp{$(LIBOBJS)}
|
||
and @samp{$(ALLOCA)} variables are used.
|
||
|
||
The @file{lib/} directory should therefore contain @file{malloc.c},
|
||
@file{memcmp.c}, @file{strdup.c}, @file{alloca.c}. Here is its
|
||
@file{Makefile.am}:
|
||
|
||
@example
|
||
# lib/Makefile.am
|
||
|
||
noinst_LIBRARIES = libcompat.a
|
||
libcompat_a_SOURCES =
|
||
libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
|
||
@end example
|
||
|
||
The library can have any name, of course, and anyway it is not going
|
||
to be installed: it just holds the replacement versions of the missing
|
||
or broken functions so we can later link them in. Many projects
|
||
also include extra functions, specific to the project, in that
|
||
library: they are simply added on the @code{_SOURCES} line.
|
||
|
||
@cindex Empty libraries and @samp{$(LIBOBJS)}
|
||
@cindex @samp{$(LIBOBJS)} and empty libraries
|
||
There is a small trap here, though: @samp{$(LIBOBJS)} and
|
||
@samp{$(ALLOCA)} might be empty, and building an empty library is not
|
||
portable. You should ensure that there is always something to put in
|
||
@file{libcompat.a}. Most projects will also add some utility
|
||
functions in that directory, and list them in
|
||
@code{libcompat_a_SOURCES}, so in practice @file{libcompat.a} cannot
|
||
be empty.
|
||
|
||
Finally here is how this library could be used from the @file{src/}
|
||
directory.
|
||
|
||
@example
|
||
# src/Makefile.am
|
||
|
||
# Link all programs in this directory with libcompat.a
|
||
LDADD = ../lib/libcompat.a
|
||
|
||
bin_PROGRAMS = tool1 tool2 @dots{}
|
||
tool1_SOURCES = @dots{}
|
||
tool2_SOURCES = @dots{}
|
||
@end example
|
||
|
||
When option @option{subdir-objects} is not used, as in the above
|
||
example, the variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} can only
|
||
be used in the directory where their sources lie. E.g., here it would
|
||
be wrong to use @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} in
|
||
@file{src/Makefile.am}. However if both @option{subdir-objects} and
|
||
@code{AC_CONFIG_LIBOBJ_DIR} are used, it is OK to use these variables
|
||
in other directories. For instance @file{src/Makefile.am} could be
|
||
changed as follows.
|
||
|
||
@example
|
||
# src/Makefile.am
|
||
|
||
AUTOMAKE_OPTIONS = subdir-objects
|
||
LDADD = $(LIBOBJS) $(ALLOCA)
|
||
|
||
bin_PROGRAMS = tool1 tool2 @dots{}
|
||
tool1_SOURCES = @dots{}
|
||
tool2_SOURCES = @dots{}
|
||
@end example
|
||
|
||
Because @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} contain object
|
||
file names that end with @samp{.$(OBJEXT)}, they are not suitable for
|
||
Libtool libraries (where the expected object extension is @file{.lo}):
|
||
@code{LTLIBOBJS} and @code{LTALLOCA} should be used instead.
|
||
|
||
@code{LTLIBOBJS} is defined automatically by Autoconf and should not
|
||
be defined by hand (as in the past), however at the time of writing
|
||
@code{LTALLOCA} still needs to be defined from @code{ALLOCA} manually.
|
||
@xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS},
|
||
autoconf, The Autoconf Manual}.
|
||
|
||
|
||
@node Program Variables
|
||
@section Variables used when building a program
|
||
|
||
Occasionally it is useful to know which @file{Makefile} variables
|
||
Automake uses for compilations, and in which order (@pxref{Flag
|
||
Variables Ordering}); for instance, you might need to do your own
|
||
compilation in some special cases.
|
||
|
||
Some variables are inherited from Autoconf; these are @code{CC},
|
||
@code{CFLAGS}, @code{CPPFLAGS}, @code{DEFS}, @code{LDFLAGS}, and
|
||
@code{LIBS}.
|
||
@vindex CC
|
||
@vindex CFLAGS
|
||
@vindex CPPFLAGS
|
||
@vindex DEFS
|
||
@vindex LDFLAGS
|
||
@vindex LIBS
|
||
|
||
There are some additional variables that Automake defines on its own:
|
||
|
||
@vtable @code
|
||
@item AM_CPPFLAGS
|
||
The contents of this variable are passed to every compilation that invokes
|
||
the C preprocessor; it is a list of arguments to the preprocessor. For
|
||
instance, @option{-I} and @option{-D} options should be listed here.
|
||
|
||
Automake already provides some @option{-I} options automatically, in a
|
||
separate variable that is also passed to every compilation that invokes
|
||
the C preprocessor. In particular it generates @samp{-I.},
|
||
@samp{-I$(srcdir)}, and a @option{-I} pointing to the directory holding
|
||
@file{config.h} (if you've used @code{AC_CONFIG_HEADERS}). You can
|
||
disable the default @option{-I} options using the @option{nostdinc}
|
||
option.
|
||
|
||
When a file to be included is generated during the build and not part
|
||
of a distribution tarball, its location is under @code{$(builddir)},
|
||
not under @code{$(srcdir)}. This matters especially for packages that
|
||
use header files placed in sub-directories and want to allow builds
|
||
outside the source tree (@pxref{VPATH Builds}). In that case we
|
||
recommend to use a pair of @option{-I} options, such as, e.g.,
|
||
@samp{-Isome/subdir -I$(srcdir)/some/subdir} or
|
||
@samp{-I$(top_builddir)/some/subdir -I$(top_srcdir)/some/subdir}.
|
||
Note that the reference to the build tree should come before the
|
||
reference to the source tree, so that accidentally leftover generated
|
||
files in the source directory are ignored.
|
||
|
||
@code{AM_CPPFLAGS} is ignored in preference to a per-executable (or
|
||
per-library) @code{_CPPFLAGS} variable if it is defined.
|
||
|
||
@item INCLUDES
|
||
This does the same job as @code{AM_CPPFLAGS} (or any per-target
|
||
@code{_CPPFLAGS} variable if it is used). It is an older name for the
|
||
same functionality. This variable is deprecated; we suggest using
|
||
@code{AM_CPPFLAGS} and per-target @code{_CPPFLAGS} instead.
|
||
|
||
@item AM_CFLAGS
|
||
This is the variable the @file{Makefile.am} author can use to pass
|
||
in additional C compiler flags. In some situations, this is
|
||
not used, in preference to the per-executable (or per-library)
|
||
@code{_CFLAGS}.
|
||
|
||
@item COMPILE
|
||
This is the command used to actually compile a C source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
@item AM_LDFLAGS
|
||
This is the variable the @file{Makefile.am} author can use to pass
|
||
in additional linker flags. In some situations, this is not used, in
|
||
preference to the per-executable (or per-library) @code{_LDFLAGS}.
|
||
|
||
@item LINK
|
||
This is the command used to actually link a C program. It already
|
||
includes @samp{-o $@@} and the usual variable references (for instance,
|
||
@code{CFLAGS}); it takes as ``arguments'' the names of the object files
|
||
and libraries to link in. This variable is not used when the linker is
|
||
overridden with a per-target @code{_LINK} variable or per-target flags
|
||
cause Automake to define such a @code{_LINK} variable.
|
||
@end vtable
|
||
|
||
|
||
@node Yacc and Lex
|
||
@section Yacc and Lex support
|
||
|
||
Automake has somewhat idiosyncratic support for Yacc and Lex.
|
||
|
||
Automake assumes that the @file{.c} file generated by @command{yacc}
|
||
(or @command{lex}) should be named using the basename of the input
|
||
file. That is, for a yacc source file @file{foo.y}, Automake will
|
||
cause the intermediate file to be named @file{foo.c} (as opposed to
|
||
@file{y.tab.c}, which is more traditional).
|
||
|
||
The extension of a yacc source file is used to determine the extension
|
||
of the resulting C or C++ source and header files. Note that header
|
||
files are generated only when the @option{-d} Yacc option is used; see
|
||
below for more information about this flag, and how to specify it.
|
||
Files with the extension @file{.y} will thus be turned into @file{.c}
|
||
sources and @file{.h} headers; likewise, @file{.yy} will become
|
||
@file{.cc} and @file{.hh}, @file{.y++} will become @file{c++} and
|
||
@file{h++}, @file{.yxx} will become @file{.cxx} and @file{.hxx},
|
||
and @file{.ypp} will become @file{.cpp} and @file{.hpp}.
|
||
|
||
Similarly, lex source files can be used to generate C or C++; the
|
||
extensions @file{.l}, @file{.ll}, @file{.l++}, @file{.lxx}, and
|
||
@file{.lpp} are recognized.
|
||
|
||
You should never explicitly mention the intermediate (C or C++) file
|
||
in any @code{SOURCES} variable; only list the source file.
|
||
|
||
The intermediate files generated by @command{yacc} (or @command{lex})
|
||
will be included in any distribution that is made. That way the user
|
||
doesn't need to have @command{yacc} or @command{lex}.
|
||
|
||
If a @command{yacc} source file is seen, then your @file{configure.ac} must
|
||
define the variable @code{YACC}. This is most easily done by invoking
|
||
the macro @code{AC_PROG_YACC} (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
@vindex YFLAGS
|
||
@vindex AM_YFLAGS
|
||
When @code{yacc} is invoked, it is passed @code{AM_YFLAGS} and
|
||
@code{YFLAGS}. The latter is a user variable and the former is
|
||
intended for the @file{Makefile.am} author.
|
||
|
||
@code{AM_YFLAGS} is usually used to pass the @option{-d} option to
|
||
@command{yacc}. Automake knows what this means and will automatically
|
||
adjust its rules to update and distribute the header file built by
|
||
@samp{yacc -d}@footnote{Please note that @command{automake} recognizes
|
||
@option{-d} in @code{AM_YFLAGS} only if it is not clustered with other
|
||
options; for example, it won't be recognized if @code{AM_YFLAGS} is
|
||
@option{-dt}, but it will be if @code{AM_YFLAGS} is @option{-d -t} or
|
||
@option{-t -d}.}.
|
||
What Automake cannot guess, though, is where this
|
||
header will be used: it is up to you to ensure the header gets built
|
||
before it is first used. Typically this is necessary in order for
|
||
dependency tracking to work when the header is included by another
|
||
file. The common solution is listing the header file in
|
||
@code{BUILT_SOURCES} (@pxref{Sources}) as follows.
|
||
|
||
@example
|
||
BUILT_SOURCES = parser.h
|
||
AM_YFLAGS = -d
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = @dots{} parser.y @dots{}
|
||
@end example
|
||
|
||
If a @command{lex} source file is seen, then your @file{configure.ac}
|
||
must define the variable @code{LEX}. You can use @code{AC_PROG_LEX}
|
||
to do this (@pxref{Particular Programs, , Particular Program Checks,
|
||
autoconf, The Autoconf Manual}), but using @code{AM_PROG_LEX} macro
|
||
(@pxref{Macros}) is recommended.
|
||
|
||
@vindex LFLAGS
|
||
@vindex AM_LFLAGS
|
||
When @command{lex} is invoked, it is passed @code{AM_LFLAGS} and
|
||
@code{LFLAGS}. The latter is a user variable and the former is
|
||
intended for the @file{Makefile.am} author.
|
||
|
||
When @code{AM_MAINTAINER_MODE} (@pxref{maintainer-mode}) is used, the
|
||
rebuild rule for distributed Yacc and Lex sources are only used when
|
||
@code{maintainer-mode} is enabled, or when the files have been erased.
|
||
|
||
@cindex @command{ylwrap}
|
||
@cindex @command{yacc}, multiple parsers
|
||
@cindex Multiple @command{yacc} parsers
|
||
@cindex Multiple @command{lex} lexers
|
||
@cindex @command{lex}, multiple lexers
|
||
|
||
When @command{lex} or @command{yacc} sources are used, @code{automake -a}
|
||
automatically installs an auxiliary program called @command{ylwrap} in
|
||
your package (@pxref{Auxiliary Programs}).
|
||
This program is used by the build rules to rename the output of these
|
||
tools, and makes it possible to include multiple @command{yacc} (or
|
||
@command{lex}) source files in a single directory. (This is necessary
|
||
because yacc's output file name is fixed, and a parallel make could
|
||
conceivably invoke more than one instance of @command{yacc}
|
||
simultaneously.)
|
||
|
||
For @command{yacc}, simply managing locking is insufficient. The output of
|
||
@command{yacc} always uses the same symbol names internally, so it isn't
|
||
possible to link two @command{yacc} parsers into the same executable.
|
||
|
||
We recommend using the following renaming hack used in @command{gdb}:
|
||
@example
|
||
#define yymaxdepth c_maxdepth
|
||
#define yyparse c_parse
|
||
#define yylex c_lex
|
||
#define yyerror c_error
|
||
#define yylval c_lval
|
||
#define yychar c_char
|
||
#define yydebug c_debug
|
||
#define yypact c_pact
|
||
#define yyr1 c_r1
|
||
#define yyr2 c_r2
|
||
#define yydef c_def
|
||
#define yychk c_chk
|
||
#define yypgo c_pgo
|
||
#define yyact c_act
|
||
#define yyexca c_exca
|
||
#define yyerrflag c_errflag
|
||
#define yynerrs c_nerrs
|
||
#define yyps c_ps
|
||
#define yypv c_pv
|
||
#define yys c_s
|
||
#define yy_yys c_yys
|
||
#define yystate c_state
|
||
#define yytmp c_tmp
|
||
#define yyv c_v
|
||
#define yy_yyv c_yyv
|
||
#define yyval c_val
|
||
#define yylloc c_lloc
|
||
#define yyreds c_reds
|
||
#define yytoks c_toks
|
||
#define yylhs c_yylhs
|
||
#define yylen c_yylen
|
||
#define yydefred c_yydefred
|
||
#define yydgoto c_yydgoto
|
||
#define yysindex c_yysindex
|
||
#define yyrindex c_yyrindex
|
||
#define yygindex c_yygindex
|
||
#define yytable c_yytable
|
||
#define yycheck c_yycheck
|
||
#define yyname c_yyname
|
||
#define yyrule c_yyrule
|
||
@end example
|
||
|
||
For each define, replace the @samp{c_} prefix with whatever you like.
|
||
These defines work for @command{bison}, @command{byacc}, and
|
||
traditional @code{yacc}s. If you find a parser generator that uses a
|
||
symbol not covered here, please report the new name so it can be added
|
||
to the list.
|
||
|
||
|
||
@node C++ Support
|
||
@section C++ Support
|
||
|
||
@cindex C++ support
|
||
@cindex Support for C++
|
||
|
||
Automake includes full support for C++.
|
||
|
||
Any package including C++ code must define the output variable
|
||
@code{CXX} in @file{configure.ac}; the simplest way to do this is to use
|
||
the @code{AC_PROG_CXX} macro (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
A few additional variables are defined when a C++ source file is seen:
|
||
|
||
@vtable @code
|
||
@item CXX
|
||
The name of the C++ compiler.
|
||
|
||
@item CXXFLAGS
|
||
Any flags to pass to the C++ compiler.
|
||
|
||
@item AM_CXXFLAGS
|
||
The maintainer's variant of @code{CXXFLAGS}.
|
||
|
||
@item CXXCOMPILE
|
||
The command used to actually compile a C++ source file. The file name
|
||
is appended to form the complete command line.
|
||
|
||
@item CXXLINK
|
||
The command used to actually link a C++ program.
|
||
@end vtable
|
||
|
||
|
||
@node Objective C Support
|
||
@section Objective C Support
|
||
|
||
@cindex Objective C support
|
||
@cindex Support for Objective C
|
||
|
||
Automake includes some support for Objective C.
|
||
|
||
Any package including Objective C code must define the output variable
|
||
@code{OBJC} in @file{configure.ac}; the simplest way to do this is to use
|
||
the @code{AC_PROG_OBJC} macro (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
A few additional variables are defined when an Objective C source file
|
||
is seen:
|
||
|
||
@vtable @code
|
||
@item OBJC
|
||
The name of the Objective C compiler.
|
||
|
||
@item OBJCFLAGS
|
||
Any flags to pass to the Objective C compiler.
|
||
|
||
@item AM_OBJCFLAGS
|
||
The maintainer's variant of @code{OBJCFLAGS}.
|
||
|
||
@item OBJCCOMPILE
|
||
The command used to actually compile an Objective C source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
@item OBJCLINK
|
||
The command used to actually link an Objective C program.
|
||
@end vtable
|
||
|
||
|
||
@node Objective C++ Support
|
||
@section Objective C++ Support
|
||
|
||
@cindex Objective C++ support
|
||
@cindex Support for Objective C++
|
||
|
||
Automake includes some support for Objective C++.
|
||
|
||
Any package including Objective C++ code must define the output variable
|
||
@code{OBJCXX} in @file{configure.ac}; the simplest way to do this is to use
|
||
the @code{AC_PROG_OBJCXX} macro (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
A few additional variables are defined when an Objective C++ source file
|
||
is seen:
|
||
|
||
@vtable @code
|
||
@item OBJCXX
|
||
The name of the Objective C++ compiler.
|
||
|
||
@item OBJCXXFLAGS
|
||
Any flags to pass to the Objective C++ compiler.
|
||
|
||
@item AM_OBJCXXFLAGS
|
||
The maintainer's variant of @code{OBJCXXFLAGS}.
|
||
|
||
@item OBJCXXCOMPILE
|
||
The command used to actually compile an Objective C++ source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
@item OBJCXXLINK
|
||
The command used to actually link an Objective C++ program.
|
||
@end vtable
|
||
|
||
|
||
@node Unified Parallel C Support
|
||
@section Unified Parallel C Support
|
||
|
||
@cindex Unified Parallel C support
|
||
@cindex Support for Unified Parallel C
|
||
|
||
Automake includes some support for Unified Parallel C.
|
||
|
||
Any package including Unified Parallel C code must define the output
|
||
variable @code{UPC} in @file{configure.ac}; the simplest way to do
|
||
this is to use the @code{AM_PROG_UPC} macro (@pxref{Public Macros}).
|
||
|
||
A few additional variables are defined when a Unified Parallel C
|
||
source file is seen:
|
||
|
||
@vtable @code
|
||
@item UPC
|
||
The name of the Unified Parallel C compiler.
|
||
|
||
@item UPCFLAGS
|
||
Any flags to pass to the Unified Parallel C compiler.
|
||
|
||
@item AM_UPCFLAGS
|
||
The maintainer's variant of @code{UPCFLAGS}.
|
||
|
||
@item UPCCOMPILE
|
||
The command used to actually compile a Unified Parallel C source file.
|
||
The file name is appended to form the complete command line.
|
||
|
||
@item UPCLINK
|
||
The command used to actually link a Unified Parallel C program.
|
||
@end vtable
|
||
|
||
|
||
@node Assembly Support
|
||
@section Assembly Support
|
||
|
||
Automake includes some support for assembly code. There are two forms
|
||
of assembler files: normal (@file{*.s}) and preprocessed by @code{CPP}
|
||
(@file{*.S} or @file{*.sx}).
|
||
|
||
@vindex CCAS
|
||
@vindex CCASFLAGS
|
||
@vindex CPPFLAGS
|
||
@vindex AM_CCASFLAGS
|
||
@vindex AM_CPPFLAGS
|
||
The variable @code{CCAS} holds the name of the compiler used to build
|
||
assembly code. This compiler must work a bit like a C compiler; in
|
||
particular it must accept @option{-c} and @option{-o}. The values of
|
||
@code{CCASFLAGS} and @code{AM_CCASFLAGS} (or its per-target
|
||
definition) is passed to the compilation. For preprocessed files,
|
||
@code{DEFS}, @code{DEFAULT_INCLUDES}, @code{INCLUDES}, @code{CPPFLAGS}
|
||
and @code{AM_CPPFLAGS} are also used.
|
||
|
||
The autoconf macro @code{AM_PROG_AS} will define @code{CCAS} and
|
||
@code{CCASFLAGS} for you (unless they are already set, it simply sets
|
||
@code{CCAS} to the C compiler and @code{CCASFLAGS} to the C compiler
|
||
flags), but you are free to define these variables by other means.
|
||
|
||
Only the suffixes @file{.s}, @file{.S}, and @file{.sx} are recognized by
|
||
@command{automake} as being files containing assembly code.
|
||
|
||
|
||
@node Fortran 77 Support
|
||
@comment node-name, next, previous, up
|
||
@section Fortran 77 Support
|
||
|
||
@cindex Fortran 77 support
|
||
@cindex Support for Fortran 77
|
||
|
||
Automake includes full support for Fortran 77.
|
||
|
||
Any package including Fortran 77 code must define the output variable
|
||
@code{F77} in @file{configure.ac}; the simplest way to do this is to use
|
||
the @code{AC_PROG_F77} macro (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
A few additional variables are defined when a Fortran 77 source file is
|
||
seen:
|
||
|
||
@vtable @code
|
||
|
||
@item F77
|
||
The name of the Fortran 77 compiler.
|
||
|
||
@item FFLAGS
|
||
Any flags to pass to the Fortran 77 compiler.
|
||
|
||
@item AM_FFLAGS
|
||
The maintainer's variant of @code{FFLAGS}.
|
||
|
||
@item RFLAGS
|
||
Any flags to pass to the Ratfor compiler.
|
||
|
||
@item AM_RFLAGS
|
||
The maintainer's variant of @code{RFLAGS}.
|
||
|
||
@item F77COMPILE
|
||
The command used to actually compile a Fortran 77 source file. The file
|
||
name is appended to form the complete command line.
|
||
|
||
@item FLINK
|
||
The command used to actually link a pure Fortran 77 program or shared
|
||
library.
|
||
|
||
@end vtable
|
||
|
||
Automake can handle preprocessing Fortran 77 and Ratfor source files in
|
||
addition to compiling them@footnote{Much, if not most, of the
|
||
information in the following sections pertaining to preprocessing
|
||
Fortran 77 programs was taken almost verbatim from @ref{Catalogue of
|
||
Rules, , Catalogue of Rules, make, The GNU Make Manual}.}. Automake
|
||
also contains some support for creating programs and shared libraries
|
||
that are a mixture of Fortran 77 and other languages (@pxref{Mixing
|
||
Fortran 77 With C and C++}).
|
||
|
||
These issues are covered in the following sections.
|
||
|
||
@menu
|
||
* Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
|
||
* Compiling Fortran 77 Files:: Compiling Fortran 77 sources
|
||
* Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
|
||
@end menu
|
||
|
||
|
||
@node Preprocessing Fortran 77
|
||
@comment node-name, next, previous, up
|
||
@subsection Preprocessing Fortran 77
|
||
|
||
@cindex Preprocessing Fortran 77
|
||
@cindex Fortran 77, Preprocessing
|
||
@cindex Ratfor programs
|
||
|
||
@file{N.f} is made automatically from @file{N.F} or @file{N.r}. This
|
||
rule runs just the preprocessor to convert a preprocessable Fortran 77
|
||
or Ratfor source file into a strict Fortran 77 source file. The precise
|
||
command used is as follows:
|
||
|
||
@table @file
|
||
|
||
@item .F
|
||
@code{$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
|
||
$(AM_FFLAGS) $(FFLAGS)}
|
||
|
||
@item .r
|
||
@code{$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}
|
||
|
||
@end table
|
||
|
||
|
||
@node Compiling Fortran 77 Files
|
||
@comment node-name, next, previous, up
|
||
@subsection Compiling Fortran 77 Files
|
||
|
||
@file{N.o} is made automatically from @file{N.f}, @file{N.F} or
|
||
@file{N.r} by running the Fortran 77 compiler. The precise command used
|
||
is as follows:
|
||
|
||
@table @file
|
||
|
||
@item .f
|
||
@code{$(F77) -c $(AM_FFLAGS) $(FFLAGS)}
|
||
|
||
@item .F
|
||
@code{$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@*
|
||
$(AM_FFLAGS) $(FFLAGS)}
|
||
|
||
@item .r
|
||
@code{$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)}
|
||
|
||
@end table
|
||
|
||
|
||
@node Mixing Fortran 77 With C and C++
|
||
@comment node-name, next, previous, up
|
||
@subsection Mixing Fortran 77 With C and C++
|
||
|
||
@cindex Fortran 77, mixing with C and C++
|
||
@cindex Mixing Fortran 77 with C and C++
|
||
@cindex Linking Fortran 77 with C and C++
|
||
@cindex cfortran
|
||
@cindex Mixing Fortran 77 with C and/or C++
|
||
|
||
Automake currently provides @emph{limited} support for creating programs
|
||
and shared libraries that are a mixture of Fortran 77 and C and/or C++.
|
||
However, there are many other issues related to mixing Fortran 77 with
|
||
other languages that are @emph{not} (currently) handled by Automake, but
|
||
that are handled by other packages@footnote{For example,
|
||
@uref{http://www-zeus.desy.de/~burow/cfortran/, the cfortran package}
|
||
addresses all of these inter-language issues, and runs under nearly all
|
||
Fortran 77, C and C++ compilers on nearly all platforms. However,
|
||
@command{cfortran} is not yet Free Software, but it will be in the next
|
||
major release.}.
|
||
|
||
Automake can help in two ways:
|
||
|
||
@enumerate
|
||
@item
|
||
Automatic selection of the linker depending on which combinations of
|
||
source code.
|
||
|
||
@item
|
||
Automatic selection of the appropriate linker flags (e.g., @option{-L} and
|
||
@option{-l}) to pass to the automatically selected linker in order to link
|
||
in the appropriate Fortran 77 intrinsic and run-time libraries.
|
||
|
||
@cindex @code{FLIBS}, defined
|
||
@vindex FLIBS
|
||
These extra Fortran 77 linker flags are supplied in the output variable
|
||
@code{FLIBS} by the @code{AC_F77_LIBRARY_LDFLAGS} Autoconf macro.
|
||
@xref{Fortran Compiler, , Fortran Compiler Characteristics, autoconf,
|
||
The Autoconf Manual}.
|
||
@end enumerate
|
||
|
||
If Automake detects that a program or shared library (as mentioned in
|
||
some @code{_PROGRAMS} or @code{_LTLIBRARIES} primary) contains source
|
||
code that is a mixture of Fortran 77 and C and/or C++, then it requires
|
||
that the macro @code{AC_F77_LIBRARY_LDFLAGS} be called in
|
||
@file{configure.ac}, and that either @code{$(FLIBS)}
|
||
appear in the appropriate @code{_LDADD} (for programs) or @code{_LIBADD}
|
||
(for shared libraries) variables. It is the responsibility of the
|
||
person writing the @file{Makefile.am} to make sure that @samp{$(FLIBS)}
|
||
appears in the appropriate @code{_LDADD} or
|
||
@code{_LIBADD} variable.
|
||
|
||
@cindex Mixed language example
|
||
@cindex Example, mixed language
|
||
|
||
For example, consider the following @file{Makefile.am}:
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = main.cc foo.f
|
||
foo_LDADD = libfoo.la $(FLIBS)
|
||
|
||
pkglib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = bar.f baz.c zardoz.cc
|
||
libfoo_la_LIBADD = $(FLIBS)
|
||
@end example
|
||
|
||
In this case, Automake will insist that @code{AC_F77_LIBRARY_LDFLAGS}
|
||
is mentioned in @file{configure.ac}. Also, if @samp{$(FLIBS)} hadn't
|
||
been mentioned in @code{foo_LDADD} and @code{libfoo_la_LIBADD}, then
|
||
Automake would have issued a warning.
|
||
|
||
@menu
|
||
* How the Linker is Chosen:: Automatic linker selection
|
||
@end menu
|
||
|
||
@node How the Linker is Chosen
|
||
@comment node-name, next, previous, up
|
||
@subsubsection How the Linker is Chosen
|
||
|
||
@cindex Automatic linker selection
|
||
@cindex Selecting the linker automatically
|
||
|
||
When a program or library mixes several languages, Automake choose the
|
||
linker according to the following priorities. (The names in
|
||
parentheses are the variables containing the link command.)
|
||
|
||
@enumerate
|
||
@item
|
||
@vindex GCJLINK
|
||
Native Java (@code{GCJLINK})
|
||
@item
|
||
@vindex OBJCXXLINK
|
||
Objective C++ (@code{OBJCXXLINK})
|
||
@item
|
||
@vindex CXXLINK
|
||
C++ (@code{CXXLINK})
|
||
@item
|
||
@vindex F77LINK
|
||
Fortran 77 (@code{F77LINK})
|
||
@item
|
||
@vindex FCLINK
|
||
Fortran (@code{FCLINK})
|
||
@item
|
||
@vindex OBJCLINK
|
||
Objective C (@code{OBJCLINK})
|
||
@item
|
||
@vindex UPCLINK
|
||
Unified Parallel C (@code{UPCLINK})
|
||
@item
|
||
@vindex LINK
|
||
C (@code{LINK})
|
||
@end enumerate
|
||
|
||
For example, if Fortran 77, C and C++ source code is compiled
|
||
into a program, then the C++ linker will be used. In this case, if the
|
||
C or Fortran 77 linkers required any special libraries that weren't
|
||
included by the C++ linker, then they must be manually added to an
|
||
@code{_LDADD} or @code{_LIBADD} variable by the user writing the
|
||
@file{Makefile.am}.
|
||
|
||
Automake only looks at the file names listed in @file{_SOURCES}
|
||
variables to choose the linker, and defaults to the C linker.
|
||
Sometimes this is inconvenient because you are linking against a
|
||
library written in another language and would like to set the linker
|
||
more appropriately. @xref{Libtool Convenience Libraries}, for a
|
||
trick with @code{nodist_EXTRA_@dots{}_SOURCES}.
|
||
|
||
A per-target @code{_LINK} variable will override the above selection.
|
||
Per-target link flags will cause Automake to write a per-target
|
||
@code{_LINK} variable according to the language chosen as above.
|
||
|
||
|
||
@node Fortran 9x Support
|
||
@comment node-name, next, previous, up
|
||
@section Fortran 9x Support
|
||
|
||
@cindex Fortran 9x support
|
||
@cindex Support for Fortran 9x
|
||
|
||
Automake includes support for Fortran 9x.
|
||
|
||
Any package including Fortran 9x code must define the output variable
|
||
@code{FC} in @file{configure.ac}; the simplest way to do this is to use
|
||
the @code{AC_PROG_FC} macro (@pxref{Particular Programs, , Particular
|
||
Program Checks, autoconf, The Autoconf Manual}).
|
||
|
||
A few additional variables are defined when a Fortran 9x source file is
|
||
seen:
|
||
|
||
@vtable @code
|
||
|
||
@item FC
|
||
The name of the Fortran 9x compiler.
|
||
|
||
@item FCFLAGS
|
||
Any flags to pass to the Fortran 9x compiler.
|
||
|
||
@item AM_FCFLAGS
|
||
The maintainer's variant of @code{FCFLAGS}.
|
||
|
||
@item FCCOMPILE
|
||
The command used to actually compile a Fortran 9x source file. The file
|
||
name is appended to form the complete command line.
|
||
|
||
@item FCLINK
|
||
The command used to actually link a pure Fortran 9x program or shared
|
||
library.
|
||
|
||
@end vtable
|
||
|
||
@menu
|
||
* Compiling Fortran 9x Files:: Compiling Fortran 9x sources
|
||
@end menu
|
||
|
||
@node Compiling Fortran 9x Files
|
||
@comment node-name, next, previous, up
|
||
@subsection Compiling Fortran 9x Files
|
||
|
||
@file{@var{file}.o} is made automatically from @file{@var{file}.f90},
|
||
@file{@var{file}.f95}, @file{@var{file}.f03}, or @file{@var{file}.f08}
|
||
by running the Fortran 9x compiler. The precise command used
|
||
is as follows:
|
||
|
||
@table @file
|
||
|
||
@item .f90
|
||
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<}
|
||
|
||
@item .f95
|
||
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<}
|
||
|
||
@item .f03
|
||
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<}
|
||
|
||
@item .f08
|
||
@code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<}
|
||
|
||
@end table
|
||
|
||
@node Java Support with gcj
|
||
@comment node-name, next, previous, up
|
||
@section Compiling Java sources using gcj
|
||
|
||
@cindex Java support with gcj
|
||
@cindex Support for Java with gcj
|
||
@cindex Java to native code, compilation
|
||
@cindex Compilation of Java to native code
|
||
|
||
Automake includes support for natively compiled Java, using @command{gcj},
|
||
the Java front end to the GNU Compiler Collection (rudimentary support
|
||
for compiling Java to bytecode using the @command{javac} compiler is
|
||
also present, @emph{albeit deprecated}; @pxref{Java}).
|
||
|
||
Any package including Java code to be compiled must define the output
|
||
variable @code{GCJ} in @file{configure.ac}; the variable @code{GCJFLAGS}
|
||
must also be defined somehow (either in @file{configure.ac} or
|
||
@file{Makefile.am}). The simplest way to do this is to use the
|
||
@code{AM_PROG_GCJ} macro.
|
||
|
||
@vindex GCJFLAGS
|
||
|
||
By default, programs including Java source files are linked with
|
||
@command{gcj}.
|
||
|
||
As always, the contents of @code{AM_GCJFLAGS} are passed to every
|
||
compilation invoking @command{gcj} (in its role as an ahead-of-time
|
||
compiler, when invoking it to create @file{.class} files,
|
||
@code{AM_JAVACFLAGS} is used instead). If it is necessary to pass
|
||
options to @command{gcj} from @file{Makefile.am}, this variable, and not
|
||
the user variable @code{GCJFLAGS}, should be used.
|
||
|
||
@vindex AM_GCJFLAGS
|
||
|
||
@command{gcj} can be used to compile @file{.java}, @file{.class},
|
||
@file{.zip}, or @file{.jar} files.
|
||
|
||
When linking, @command{gcj} requires that the main class be specified
|
||
using the @option{--main=} option. The easiest way to do this is to use
|
||
the @code{_LDFLAGS} variable for the program.
|
||
|
||
|
||
@node Vala Support
|
||
@comment node-name, next, previous, up
|
||
@section Vala Support
|
||
|
||
@cindex Vala Support
|
||
@cindex Support for Vala
|
||
|
||
Automake provides initial support for Vala
|
||
(@uref{http://www.vala-project.org/}).
|
||
This requires valac version 0.7.0 or later, and currently requires
|
||
the user to use GNU @command{make}.
|
||
|
||
@example
|
||
foo_SOURCES = foo.vala bar.vala zardoc.c
|
||
@end example
|
||
|
||
Any @file{.vala} file listed in a @code{_SOURCES} variable will be
|
||
compiled into C code by the Vala compiler. The generated @file{.c} files
|
||
are distributed. The end user does not need to have a Vala compiler installed.
|
||
|
||
Automake ships with an Autoconf macro called @code{AM_PROG_VALAC}
|
||
that will locate the Vala compiler and optionally check its version
|
||
number.
|
||
|
||
@defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found},
|
||
@ovar{action-if-not-found})
|
||
Search for a Vala compiler in @env{PATH}. If it is found, the variable
|
||
@code{VALAC} is set to point to it (see below for more details). This
|
||
macro takes three optional arguments. The first argument, if present,
|
||
is the minimum version of the Vala compiler required to compile this
|
||
package. If a compiler is found and satisfies @var{minimum-version},
|
||
then @var{action-if-found} is run (this defaults to do nothing).
|
||
Otherwise, @var{action-if-not-found} is run. If @var{action-if-not-found}
|
||
is not specified, the default value is to print a warning in case no
|
||
compiler is found, or if a too-old version of the compiler is found.
|
||
@end defmac
|
||
|
||
There are a few variables that are used when compiling Vala sources:
|
||
|
||
@vtable @code
|
||
@item VALAC
|
||
Absolute path to the Vala compiler, or simply @samp{valac} if no
|
||
suitable compiler Vala could be found at configure runtime.
|
||
|
||
@item VALAFLAGS
|
||
Additional arguments for the Vala compiler.
|
||
|
||
@item AM_VALAFLAGS
|
||
The maintainer's variant of @code{VALAFLAGS}.
|
||
|
||
@example
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.vala
|
||
@end example
|
||
@end vtable
|
||
|
||
Note that currently, you cannot use per-target @code{*_VALAFLAGS}
|
||
(@pxref{Renamed Objects}) to produce different C files from one Vala
|
||
source file.
|
||
|
||
|
||
@node Support for Other Languages
|
||
@comment node-name, next, previous, up
|
||
@section Support for Other Languages
|
||
|
||
Automake currently only includes full support for C, C++ (@pxref{C++
|
||
Support}), Objective C (@pxref{Objective C Support}),
|
||
Objective C++ (@pxref{Objective C++ Support}),
|
||
Fortran 77
|
||
(@pxref{Fortran 77 Support}), Fortran 9x (@pxref{Fortran 9x Support}),
|
||
and Java (@pxref{Java Support with gcj}). There is only rudimentary
|
||
support for other languages, support for which will be improved based
|
||
on user demand.
|
||
|
||
Some limited support for adding your own languages is available via the
|
||
suffix rule handling (@pxref{Suffixes}).
|
||
|
||
@node Dependencies
|
||
@section Automatic dependency tracking
|
||
|
||
As a developer it is often painful to continually update the
|
||
@file{Makefile.am} whenever the include-file dependencies change in a
|
||
project. Automake supplies a way to automatically track dependency
|
||
changes (@pxref{Dependency Tracking}).
|
||
|
||
@cindex Dependency tracking
|
||
@cindex Automatic dependency tracking
|
||
|
||
Automake always uses complete dependencies for a compilation,
|
||
including system headers. Automake's model is that dependency
|
||
computation should be a side effect of the build. To this end,
|
||
dependencies are computed by running all compilations through a
|
||
special wrapper program called @command{depcomp}. @command{depcomp}
|
||
understands how to coax many different C and C++ compilers into
|
||
generating dependency information in the format it requires.
|
||
@samp{automake -a} will install @command{depcomp} into your source
|
||
tree for you. If @command{depcomp} can't figure out how to properly
|
||
invoke your compiler, dependency tracking will simply be disabled for
|
||
your build.
|
||
|
||
@cindex @command{depcomp}
|
||
|
||
Experience with earlier versions of Automake (@pxref{Dependency Tracking
|
||
Evolution, , Dependency Tracking Evolution, automake-history, Brief History
|
||
of Automake}) taught us that it is not reliable to generate dependencies
|
||
only on the maintainer's system, as configurations vary too much. So
|
||
instead Automake implements dependency tracking at build time.
|
||
|
||
Automatic dependency tracking can be suppressed by putting
|
||
@option{no-dependencies} in the variable @code{AUTOMAKE_OPTIONS}, or
|
||
passing @option{no-dependencies} as an argument to @code{AM_INIT_AUTOMAKE}
|
||
(this should be the preferred way). Or, you can invoke @command{automake}
|
||
with the @option{-i} option. Dependency tracking is enabled by default.
|
||
|
||
@vindex AUTOMAKE_OPTIONS
|
||
@opindex no-dependencies
|
||
|
||
The person building your package also can choose to disable dependency
|
||
tracking by configuring with @option{--disable-dependency-tracking}.
|
||
|
||
@cindex Disabling dependency tracking
|
||
@cindex Dependency tracking, disabling
|
||
|
||
|
||
@node EXEEXT
|
||
@section Support for executable extensions
|
||
|
||
@cindex Executable extension
|
||
@cindex Extension, executable
|
||
@cindex Windows
|
||
|
||
On some platforms, such as Windows, executables are expected to have an
|
||
extension such as @file{.exe}. On these platforms, some compilers (GCC
|
||
among them) will automatically generate @file{foo.exe} when asked to
|
||
generate @file{foo}.
|
||
|
||
Automake provides mostly-transparent support for this. Unfortunately
|
||
@emph{mostly} doesn't yet mean @emph{fully}. Until the English
|
||
dictionary is revised, you will have to assist Automake if your package
|
||
must support those platforms.
|
||
|
||
One thing you must be aware of is that, internally, Automake rewrites
|
||
something like this:
|
||
|
||
@example
|
||
bin_PROGRAMS = liver
|
||
@end example
|
||
|
||
to this:
|
||
|
||
@example
|
||
bin_PROGRAMS = liver$(EXEEXT)
|
||
@end example
|
||
|
||
The targets Automake generates are likewise given the @samp{$(EXEEXT)}
|
||
extension.
|
||
|
||
The variables @code{TESTS} and @code{XFAIL_TESTS} (@pxref{Simple Tests})
|
||
are also rewritten if they contain filenames that have been declared as
|
||
programs in the same @file{Makefile}. (This is mostly useful when some
|
||
programs from @code{check_PROGRAMS} are listed in @code{TESTS}.)
|
||
|
||
However, Automake cannot apply this rewriting to @command{configure}
|
||
substitutions. This means that if you are conditionally building a
|
||
program using such a substitution, then your @file{configure.ac} must
|
||
take care to add @samp{$(EXEEXT)} when constructing the output variable.
|
||
|
||
Sometimes maintainers like to write an explicit link rule for their
|
||
program. Without executable extension support, this is easy---you
|
||
simply write a rule whose target is the name of the program. However,
|
||
when executable extension support is enabled, you must instead add the
|
||
@samp{$(EXEEXT)} suffix.
|
||
|
||
This might be a nuisance for maintainers who know their package will
|
||
never run on a platform that has
|
||
executable extensions. For those maintainers, the @option{no-exeext}
|
||
option (@pxref{Options}) will disable this feature. This works in a
|
||
fairly ugly way; if @option{no-exeext} is seen, then the presence of a
|
||
rule for a target named @code{foo} in @file{Makefile.am} will override
|
||
an @command{automake}-generated rule for @samp{foo$(EXEEXT)}. Without
|
||
the @option{no-exeext} option, this use will give a diagnostic.
|
||
|
||
|
||
@node Other Objects
|
||
@chapter Other Derived Objects
|
||
|
||
Automake can handle derived objects that are not C programs. Sometimes
|
||
the support for actually building such objects must be explicitly
|
||
supplied, but Automake will still automatically handle installation and
|
||
distribution.
|
||
|
||
@menu
|
||
* Scripts:: Executable scripts
|
||
* Headers:: Header files
|
||
* Data:: Architecture-independent data files
|
||
* Sources:: Derived sources
|
||
@end menu
|
||
|
||
|
||
@node Scripts
|
||
@section Executable Scripts
|
||
|
||
@cindex @code{_SCRIPTS} primary, defined
|
||
@cindex @code{SCRIPTS} primary, defined
|
||
@cindex Primary variable, @code{SCRIPTS}
|
||
@vindex _SCRIPTS
|
||
@cindex Installing scripts
|
||
|
||
It is possible to define and install programs that are scripts. Such
|
||
programs are listed using the @code{SCRIPTS} primary name. When the
|
||
script is distributed in its final, installable form, the
|
||
@file{Makefile} usually looks as follows:
|
||
@vindex SCRIPTS
|
||
|
||
@example
|
||
# Install my_script in $(bindir) and distribute it.
|
||
dist_bin_SCRIPTS = my_script
|
||
@end example
|
||
|
||
Scripts are not distributed by default; as we have just seen, those
|
||
that should be distributed can be specified using a @code{dist_}
|
||
prefix as with other primaries.
|
||
|
||
@cindex @code{SCRIPTS}, installation directories
|
||
@vindex bin_SCRIPTS
|
||
@vindex sbin_SCRIPTS
|
||
@vindex libexec_SCRIPTS
|
||
@vindex pkgdata_SCRIPTS
|
||
@vindex pkglibexec_SCRIPTS
|
||
@vindex noinst_SCRIPTS
|
||
@vindex check_SCRIPTS
|
||
|
||
Scripts can be installed in @code{bindir}, @code{sbindir},
|
||
@code{libexecdir}, @code{pkglibexecdir}, or @code{pkgdatadir}.
|
||
|
||
Scripts that need not be installed can be listed in
|
||
@code{noinst_SCRIPTS}, and among them, those which are needed only by
|
||
@samp{make check} should go in @code{check_SCRIPTS}.
|
||
|
||
When a script needs to be built, the @file{Makefile.am} should include
|
||
the appropriate rules. For instance the @command{automake} program
|
||
itself is a Perl script that is generated from @file{automake.in}.
|
||
Here is how this is handled:
|
||
|
||
@example
|
||
bin_SCRIPTS = automake
|
||
CLEANFILES = $(bin_SCRIPTS)
|
||
EXTRA_DIST = automake.in
|
||
|
||
do_subst = sed -e 's,[@@]datadir[@@],$(datadir),g' \
|
||
-e 's,[@@]PERL[@@],$(PERL),g' \
|
||
-e 's,[@@]PACKAGE[@@],$(PACKAGE),g' \
|
||
-e 's,[@@]VERSION[@@],$(VERSION),g' \
|
||
@dots{}
|
||
|
||
automake: automake.in Makefile
|
||
$(do_subst) < $(srcdir)/automake.in > automake
|
||
chmod +x automake
|
||
@end example
|
||
|
||
Such scripts for which a build rule has been supplied need to be
|
||
deleted explicitly using @code{CLEANFILES} (@pxref{Clean}), and their
|
||
sources have to be distributed, usually with @code{EXTRA_DIST}
|
||
(@pxref{Basics of Distribution}).
|
||
|
||
Another common way to build scripts is to process them from
|
||
@file{configure} with @code{AC_CONFIG_FILES}. In this situation
|
||
Automake knows which files should be cleaned and distributed, and what
|
||
the rebuild rules should look like.
|
||
|
||
For instance if @file{configure.ac} contains
|
||
|
||
@example
|
||
AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])
|
||
@end example
|
||
|
||
@noindent
|
||
to build @file{src/my_script} from @file{src/my_script.in}, then a
|
||
@file{src/Makefile.am} to install this script in @code{$(bindir)} can
|
||
be as simple as
|
||
|
||
@example
|
||
bin_SCRIPTS = my_script
|
||
CLEANFILES = $(bin_SCRIPTS)
|
||
@end example
|
||
|
||
@noindent
|
||
There is no need for @code{EXTRA_DIST} or any build rule: Automake
|
||
infers them from @code{AC_CONFIG_FILES} (@pxref{Requirements}).
|
||
@code{CLEANFILES} is still useful, because by default Automake will
|
||
clean targets of @code{AC_CONFIG_FILES} in @code{distclean}, not
|
||
@code{clean}.
|
||
|
||
Although this looks simpler, building scripts this way has one
|
||
drawback: directory variables such as @code{$(datadir)} are not fully
|
||
expanded and may refer to other directory variables.
|
||
|
||
@node Headers
|
||
@section Header files
|
||
|
||
@cindex @code{_HEADERS} primary, defined
|
||
@cindex @code{HEADERS} primary, defined
|
||
@cindex Primary variable, @code{HEADERS}
|
||
@vindex _HEADERS
|
||
@vindex noinst_HEADERS
|
||
@cindex @code{HEADERS}, installation directories
|
||
@cindex Installing headers
|
||
@vindex include_HEADERS
|
||
@vindex oldinclude_HEADERS
|
||
@vindex pkginclude_HEADERS
|
||
|
||
|
||
Header files that must be installed are specified by the
|
||
@code{HEADERS} family of variables. Headers can be installed in
|
||
@code{includedir}, @code{oldincludedir}, @code{pkgincludedir} or any
|
||
other directory you may have defined (@pxref{Uniform}). For instance,
|
||
|
||
@example
|
||
include_HEADERS = foo.h bar/bar.h
|
||
@end example
|
||
|
||
@noindent
|
||
will install the two files as @file{$(includedir)/foo.h} and
|
||
@file{$(includedir)/bar.h}.
|
||
|
||
The @code{nobase_} prefix is also supported,
|
||
|
||
@example
|
||
nobase_include_HEADERS = foo.h bar/bar.h
|
||
@end example
|
||
|
||
@noindent
|
||
will install the two files as @file{$(includedir)/foo.h} and
|
||
@file{$(includedir)/bar/bar.h} (@pxref{Alternative}).
|
||
|
||
@vindex noinst_HEADERS
|
||
Usually, only header files that accompany installed libraries need to
|
||
be installed. Headers used by programs or convenience libraries are
|
||
not installed. The @code{noinst_HEADERS} variable can be used for
|
||
such headers. However when the header actually belongs to a single
|
||
convenience library or program, we recommend listing it in the
|
||
program's or library's @code{_SOURCES} variable (@pxref{Program
|
||
Sources}) instead of in @code{noinst_HEADERS}. This is clearer for
|
||
the @file{Makefile.am} reader. @code{noinst_HEADERS} would be the
|
||
right variable to use in a directory containing only headers and no
|
||
associated library or program.
|
||
|
||
All header files must be listed somewhere; in a @code{_SOURCES}
|
||
variable or in a @code{_HEADERS} variable. Missing ones will not
|
||
appear in the distribution.
|
||
|
||
For header files that are built and must not be distributed, use the
|
||
@code{nodist_} prefix as in @code{nodist_include_HEADERS} or
|
||
@code{nodist_prog_SOURCES}. If these generated headers are needed
|
||
during the build, you must also ensure they exist before they are
|
||
used (@pxref{Sources}).
|
||
|
||
|
||
@node Data
|
||
@section Architecture-independent data files
|
||
|
||
@cindex @code{_DATA} primary, defined
|
||
@cindex @code{DATA} primary, defined
|
||
@cindex Primary variable, @code{DATA}
|
||
@vindex _DATA
|
||
|
||
Automake supports the installation of miscellaneous data files using the
|
||
@code{DATA} family of variables.
|
||
@vindex DATA
|
||
|
||
@vindex data_DATA
|
||
@vindex sysconf_DATA
|
||
@vindex sharedstate_DATA
|
||
@vindex localstate_DATA
|
||
@vindex pkgdata_DATA
|
||
|
||
Such data can be installed in the directories @code{datadir},
|
||
@code{sysconfdir}, @code{sharedstatedir}, @code{localstatedir}, or
|
||
@code{pkgdatadir}.
|
||
|
||
By default, data files are @emph{not} included in a distribution. Of
|
||
course, you can use the @code{dist_} prefix to change this on a
|
||
per-variable basis.
|
||
|
||
Here is how Automake declares its auxiliary data files:
|
||
|
||
@example
|
||
dist_pkgdata_DATA = clean-kr.am clean.am @dots{}
|
||
@end example
|
||
|
||
|
||
@node Sources
|
||
@section Built Sources
|
||
|
||
Because Automake's automatic dependency tracking works as a side-effect
|
||
of compilation (@pxref{Dependencies}) there is a bootstrap issue: a
|
||
target should not be compiled before its dependencies are made, but
|
||
these dependencies are unknown until the target is first compiled.
|
||
|
||
Ordinarily this is not a problem, because dependencies are distributed
|
||
sources: they preexist and do not need to be built. Suppose that
|
||
@file{foo.c} includes @file{foo.h}. When it first compiles
|
||
@file{foo.o}, @command{make} only knows that @file{foo.o} depends on
|
||
@file{foo.c}. As a side-effect of this compilation @command{depcomp}
|
||
records the @file{foo.h} dependency so that following invocations of
|
||
@command{make} will honor it. In these conditions, it's clear there is
|
||
no problem: either @file{foo.o} doesn't exist and has to be built
|
||
(regardless of the dependencies), or accurate dependencies exist and
|
||
they can be used to decide whether @file{foo.o} should be rebuilt.
|
||
|
||
It's a different story if @file{foo.h} doesn't exist by the first
|
||
@command{make} run. For instance, there might be a rule to build
|
||
@file{foo.h}. This time @file{file.o}'s build will fail because the
|
||
compiler can't find @file{foo.h}. @command{make} failed to trigger the
|
||
rule to build @file{foo.h} first by lack of dependency information.
|
||
|
||
@vindex BUILT_SOURCES
|
||
@cindex @code{BUILT_SOURCES}, defined
|
||
|
||
The @code{BUILT_SOURCES} variable is a workaround for this problem. A
|
||
source file listed in @code{BUILT_SOURCES} is made on @samp{make all}
|
||
or @samp{make check} (or even @samp{make install}) before other
|
||
targets are processed. However, such a source file is not
|
||
@emph{compiled} unless explicitly requested by mentioning it in some
|
||
other @code{_SOURCES} variable.
|
||
|
||
So, to conclude our introductory example, we could use
|
||
@samp{BUILT_SOURCES = foo.h} to ensure @file{foo.h} gets built before
|
||
any other target (including @file{foo.o}) during @samp{make all} or
|
||
@samp{make check}.
|
||
|
||
@code{BUILT_SOURCES} is actually a bit of a misnomer, as any file which
|
||
must be created early in the build process can be listed in this
|
||
variable. Moreover, all built sources do not necessarily have to be
|
||
listed in @code{BUILT_SOURCES}. For instance, a generated @file{.c} file
|
||
doesn't need to appear in @code{BUILT_SOURCES} (unless it is included by
|
||
another source), because it's a known dependency of the associated
|
||
object.
|
||
|
||
It might be important to emphasize that @code{BUILT_SOURCES} is
|
||
honored only by @samp{make all}, @samp{make check} and @samp{make
|
||
install}. This means you cannot build a specific target (e.g.,
|
||
@samp{make foo}) in a clean tree if it depends on a built source.
|
||
However it will succeed if you have run @samp{make all} earlier,
|
||
because accurate dependencies are already available.
|
||
|
||
The next section illustrates and discusses the handling of built sources
|
||
on a toy example.
|
||
|
||
@menu
|
||
* Built Sources Example:: Several ways to handle built sources.
|
||
@end menu
|
||
|
||
@node Built Sources Example
|
||
@subsection Built Sources Example
|
||
|
||
Suppose that @file{foo.c} includes @file{bindir.h}, which is
|
||
installation-dependent and not distributed: it needs to be built. Here
|
||
@file{bindir.h} defines the preprocessor macro @code{bindir} to the
|
||
value of the @command{make} variable @code{bindir} (inherited from
|
||
@file{configure}).
|
||
|
||
We suggest several implementations below. It's not meant to be an
|
||
exhaustive listing of all ways to handle built sources, but it will give
|
||
you a few ideas if you encounter this issue.
|
||
|
||
@subsubheading First Try
|
||
|
||
This first implementation will illustrate the bootstrap issue mentioned
|
||
in the previous section (@pxref{Sources}).
|
||
|
||
Here is a tentative @file{Makefile.am}.
|
||
|
||
@example
|
||
# This won't work.
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@@
|
||
@end example
|
||
|
||
This setup doesn't work, because Automake doesn't know that @file{foo.c}
|
||
includes @file{bindir.h}. Remember, automatic dependency tracking works
|
||
as a side-effect of compilation, so the dependencies of @file{foo.o} will
|
||
be known only after @file{foo.o} has been compiled (@pxref{Dependencies}).
|
||
The symptom is as follows.
|
||
|
||
@example
|
||
% make
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
foo.c:2: bindir.h: No such file or directory
|
||
make: *** [foo.o] Error 1
|
||
@end example
|
||
|
||
In this example @file{bindir.h} is not distributed nor installed, and
|
||
it is not even being built on-time. One may wonder if the
|
||
@samp{nodist_foo_SOURCES = bindir.h} line has any use at all. This
|
||
line simply states that @file{bindir.h} is a source of @code{foo}, so
|
||
for instance, it should be inspected while generating tags
|
||
(@pxref{Tags}). In other words, it does not help our present problem,
|
||
and the build would fail identically without it.
|
||
|
||
@subsubheading Using @code{BUILT_SOURCES}
|
||
|
||
A solution is to require @file{bindir.h} to be built before anything
|
||
else. This is what @code{BUILT_SOURCES} is meant for (@pxref{Sources}).
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
BUILT_SOURCES = bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@@
|
||
@end example
|
||
|
||
See how @file{bindir.h} gets built first:
|
||
|
||
@example
|
||
% make
|
||
echo '#define bindir "/usr/local/bin"' >bindir.h
|
||
make all-am
|
||
make[1]: Entering directory `/home/adl/tmp'
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
gcc -g -O2 -o foo foo.o
|
||
make[1]: Leaving directory `/home/adl/tmp'
|
||
@end example
|
||
|
||
However, as said earlier, @code{BUILT_SOURCES} applies only to the
|
||
@code{all}, @code{check}, and @code{install} targets. It still fails
|
||
if you try to run @samp{make foo} explicitly:
|
||
|
||
@example
|
||
% make clean
|
||
test -z "bindir.h" || rm -f bindir.h
|
||
test -z "foo" || rm -f foo
|
||
rm -f *.o
|
||
% : > .deps/foo.Po # Suppress previously recorded dependencies
|
||
% make foo
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
foo.c:2: bindir.h: No such file or directory
|
||
make: *** [foo.o] Error 1
|
||
@end example
|
||
|
||
@subsubheading Recording Dependencies manually
|
||
|
||
Usually people are happy enough with @code{BUILT_SOURCES} because they
|
||
never build targets such as @samp{make foo} before @samp{make all}, as
|
||
in the previous example. However if this matters to you, you can
|
||
avoid @code{BUILT_SOURCES} and record such dependencies explicitly in
|
||
the @file{Makefile.am}.
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
foo.$(OBJEXT): bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@@
|
||
@end example
|
||
|
||
You don't have to list @emph{all} the dependencies of @file{foo.o}
|
||
explicitly, only those that might need to be built. If a dependency
|
||
already exists, it will not hinder the first compilation and will be
|
||
recorded by the normal dependency tracking code. (Note that after
|
||
this first compilation the dependency tracking code will also have
|
||
recorded the dependency between @file{foo.o} and
|
||
@file{bindir.h}; so our explicit dependency is really useful to
|
||
the first build only.)
|
||
|
||
Adding explicit dependencies like this can be a bit dangerous if you are
|
||
not careful enough. This is due to the way Automake tries not to
|
||
overwrite your rules (it assumes you know better than it).
|
||
@samp{foo.$(OBJEXT): bindir.h} supersedes any rule Automake may want to
|
||
output to build @samp{foo.$(OBJEXT)}. It happens to work in this case
|
||
because Automake doesn't have to output any @samp{foo.$(OBJEXT):}
|
||
target: it relies on a suffix rule instead (i.e., @samp{.c.$(OBJEXT):}).
|
||
Always check the generated @file{Makefile.in} if you do this.
|
||
|
||
@subsubheading Build @file{bindir.h} from @file{configure}
|
||
|
||
It's possible to define this preprocessor macro from @file{configure},
|
||
either in @file{config.h} (@pxref{Defining Directories, , Defining
|
||
Directories, autoconf, The Autoconf Manual}), or by processing a
|
||
@file{bindir.h.in} file using @code{AC_CONFIG_FILES}
|
||
(@pxref{Configuration Actions, ,Configuration Actions, autoconf, The
|
||
Autoconf Manual}).
|
||
|
||
At this point it should be clear that building @file{bindir.h} from
|
||
@file{configure} works well for this example. @file{bindir.h} will exist
|
||
before you build any target, hence will not cause any dependency issue.
|
||
|
||
The Makefile can be shrunk as follows. We do not even have to mention
|
||
@file{bindir.h}.
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
@end example
|
||
|
||
However, it's not always possible to build sources from
|
||
@file{configure}, especially when these sources are generated by a tool
|
||
that needs to be built first.
|
||
|
||
@subsubheading Build @file{bindir.c}, not @file{bindir.h}.
|
||
|
||
Another attractive idea is to define @code{bindir} as a variable or
|
||
function exported from @file{bindir.o}, and build @file{bindir.c}
|
||
instead of @file{bindir.h}.
|
||
|
||
@example
|
||
noinst_PROGRAMS = foo
|
||
foo_SOURCES = foo.c bindir.h
|
||
nodist_foo_SOURCES = bindir.c
|
||
CLEANFILES = bindir.c
|
||
bindir.c: Makefile
|
||
echo 'const char bindir[] = "$(bindir)";' >$@@
|
||
@end example
|
||
|
||
@file{bindir.h} contains just the variable's declaration and doesn't
|
||
need to be built, so it won't cause any trouble. @file{bindir.o} is
|
||
always dependent on @file{bindir.c}, so @file{bindir.c} will get built
|
||
first.
|
||
|
||
@subsubheading Which is best?
|
||
|
||
There is no panacea, of course. Each solution has its merits and
|
||
drawbacks.
|
||
|
||
You cannot use @code{BUILT_SOURCES} if the ability to run @samp{make
|
||
foo} on a clean tree is important to you.
|
||
|
||
You won't add explicit dependencies if you are leery of overriding
|
||
an Automake rule by mistake.
|
||
|
||
Building files from @file{./configure} is not always possible, neither
|
||
is converting @file{.h} files into @file{.c} files.
|
||
|
||
|
||
@node Other GNU Tools
|
||
@chapter Other GNU Tools
|
||
|
||
Since Automake is primarily intended to generate @file{Makefile.in}s for
|
||
use in GNU programs, it tries hard to interoperate with other GNU tools.
|
||
|
||
@menu
|
||
* Emacs Lisp:: Emacs Lisp
|
||
* gettext:: Gettext
|
||
* Libtool:: Libtool
|
||
* Java:: Java bytecode compilation (deprecated)
|
||
* Python:: Python
|
||
@end menu
|
||
|
||
|
||
@node Emacs Lisp
|
||
@section Emacs Lisp
|
||
|
||
@cindex @code{_LISP} primary, defined
|
||
@cindex @code{LISP} primary, defined
|
||
@cindex Primary variable, @code{LISP}
|
||
|
||
@vindex _LISP
|
||
@vindex lisp_LISP
|
||
@vindex noinst_LISP
|
||
|
||
Automake provides some support for Emacs Lisp. The @code{LISP} primary
|
||
is used to hold a list of @file{.el} files. Possible prefixes for this
|
||
primary are @code{lisp_} and @code{noinst_}. Note that if
|
||
@code{lisp_LISP} is defined, then @file{configure.ac} must run
|
||
@code{AM_PATH_LISPDIR} (@pxref{Macros}).
|
||
|
||
@vindex dist_lisp_LISP
|
||
@vindex dist_noinst_LISP
|
||
Lisp sources are not distributed by default. You can prefix the
|
||
@code{LISP} primary with @code{dist_}, as in @code{dist_lisp_LISP} or
|
||
@code{dist_noinst_LISP}, to indicate that these files should be
|
||
distributed.
|
||
|
||
Automake will byte-compile all Emacs Lisp source files using the Emacs
|
||
found by @code{AM_PATH_LISPDIR}, if any was found. When performing such
|
||
byte-compilation, the flags specified in the (developer-reserved)
|
||
@code{AM_ELCFLAGS} and (user-reserved) @code{ELCFLAGS} make variables
|
||
will be passed to the Emacs invocation.
|
||
|
||
Byte-compiled Emacs Lisp files are not portable among all versions of
|
||
Emacs, so it makes sense to turn this off if you expect sites to have
|
||
more than one version of Emacs installed. Furthermore, many packages
|
||
don't actually benefit from byte-compilation. Still, we recommend
|
||
that you byte-compile your Emacs Lisp sources. It is probably better
|
||
for sites with strange setups to cope for themselves than to make the
|
||
installation less nice for everybody else.
|
||
|
||
There are two ways to avoid byte-compiling. Historically, we have
|
||
recommended the following construct.
|
||
|
||
@example
|
||
lisp_LISP = file1.el file2.el
|
||
ELCFILES =
|
||
@end example
|
||
|
||
@noindent
|
||
@code{ELCFILES} is an internal Automake variable that normally lists
|
||
all @file{.elc} files that must be byte-compiled. Automake defines
|
||
@code{ELCFILES} automatically from @code{lisp_LISP}. Emptying this
|
||
variable explicitly prevents byte-compilation.
|
||
|
||
Since Automake 1.8, we now recommend using @code{lisp_DATA} instead:
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
lisp_DATA = file1.el file2.el
|
||
@end example
|
||
|
||
Note that these two constructs are not equivalent. @code{_LISP} will
|
||
not install a file if Emacs is not installed, while @code{_DATA} will
|
||
always install its files.
|
||
|
||
@node gettext
|
||
@section Gettext
|
||
|
||
@cindex GNU Gettext support
|
||
@cindex Gettext support
|
||
@cindex Support for GNU Gettext
|
||
|
||
If @code{AM_GNU_GETTEXT} is seen in @file{configure.ac}, then Automake
|
||
turns on support for GNU gettext, a message catalog system for
|
||
internationalization
|
||
(@pxref{Top, , Introduction, gettext, GNU gettext utilities}).
|
||
|
||
The @code{gettext} support in Automake requires the addition of one or
|
||
two subdirectories to the package: @file{po} and possibly also @file{intl}.
|
||
The latter is needed if @code{AM_GNU_GETTEXT} is not invoked with the
|
||
@samp{external} argument, or if @code{AM_GNU_GETTEXT_INTL_SUBDIR} is used.
|
||
Automake ensures that these directories exist and are mentioned in
|
||
@code{SUBDIRS}.
|
||
|
||
@node Libtool
|
||
@section Libtool
|
||
|
||
Automake provides support for GNU Libtool (@pxref{Top, , Introduction,
|
||
libtool, The Libtool Manual}) with the @code{LTLIBRARIES} primary.
|
||
@xref{A Shared Library}.
|
||
|
||
|
||
@node Java
|
||
@section Java bytecode compilation (deprecated)
|
||
|
||
@cindex @code{_JAVA} primary, defined
|
||
@cindex @code{JAVA} primary, defined
|
||
@cindex Primary variable, @code{JAVA}
|
||
@cindex Java to bytecode, compilation
|
||
@cindex Compilation of Java to bytecode
|
||
|
||
Automake provides some minimal support for Java bytecode compilation with
|
||
the @code{JAVA} primary (in addition to the support for compiling Java to
|
||
native machine code; @pxref{Java Support with gcj}). Note however that
|
||
@emph{the interface and most features described here are deprecated}.
|
||
Future Automake releases will strive to provide a better and cleaner
|
||
interface, which however @emph{won't be backward-compatible}; the present
|
||
interface will probably be removed altogether some time after the
|
||
introduction of the new interface (if that ever materializes). In any
|
||
case, the current @code{JAVA} primary features are frozen and will no
|
||
longer be developed, not even to take bug fixes.
|
||
|
||
Any @file{.java} files listed in a @code{_JAVA} variable will be
|
||
compiled with @code{JAVAC} at build time. By default, @file{.java}
|
||
files are not included in the distribution, you should use the
|
||
@code{dist_} prefix to distribute them.
|
||
|
||
Here is a typical setup for distributing @file{.java} files and
|
||
installing the @file{.class} files resulting from their compilation.
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
javadir = $(datadir)/java
|
||
dist_java_JAVA = a.java b.java @dots{}
|
||
@end example
|
||
|
||
@cindex @code{JAVA} restrictions
|
||
@cindex Restrictions for @code{JAVA}
|
||
|
||
Currently Automake enforces the restriction that only one @code{_JAVA}
|
||
primary can be used in a given @file{Makefile.am}. The reason for this
|
||
restriction is that, in general, it isn't possible to know which
|
||
@file{.class} files were generated from which @file{.java} files, so
|
||
it would be impossible to know which files to install where. For
|
||
instance, a @file{.java} file can define multiple classes; the resulting
|
||
@file{.class} file names cannot be predicted without parsing the
|
||
@file{.java} file.
|
||
|
||
There are a few variables that are used when compiling Java sources:
|
||
|
||
@vtable @code
|
||
@item JAVAC
|
||
The name of the Java compiler. This defaults to @samp{javac}.
|
||
|
||
@item JAVACFLAGS
|
||
The flags to pass to the compiler. This is considered to be a user
|
||
variable (@pxref{User Variables}).
|
||
|
||
@item AM_JAVACFLAGS
|
||
More flags to pass to the Java compiler. This, and not
|
||
@code{JAVACFLAGS}, should be used when it is necessary to put Java
|
||
compiler flags into @file{Makefile.am}.
|
||
|
||
@item JAVAROOT
|
||
The value of this variable is passed to the @option{-d} option to
|
||
@code{javac}. It defaults to @samp{$(top_builddir)}.
|
||
|
||
@item CLASSPATH_ENV
|
||
This variable is a shell expression that is used to set the
|
||
@env{CLASSPATH} environment variable on the @code{javac} command line.
|
||
(In the future we will probably handle class path setting differently.)
|
||
@end vtable
|
||
|
||
|
||
@node Python
|
||
@section Python
|
||
|
||
@cindex @code{_PYTHON} primary, defined
|
||
@cindex @code{PYTHON} primary, defined
|
||
@cindex Primary variable, @code{PYTHON}
|
||
@vindex _PYTHON
|
||
|
||
Automake provides support for Python compilation with the
|
||
@code{PYTHON} primary. A typical setup is to call
|
||
@code{AM_PATH_PYTHON} in @file{configure.ac} and use a line like the
|
||
following in @file{Makefile.am}:
|
||
|
||
@example
|
||
python_PYTHON = tree.py leave.py
|
||
@end example
|
||
|
||
Any files listed in a @code{_PYTHON} variable will be byte-compiled
|
||
with @command{py-compile} at install time. @command{py-compile}
|
||
actually creates both standard (@file{.pyc}) and optimized
|
||
(@file{.pyo}) byte-compiled versions of the source files. Note that
|
||
because byte-compilation occurs at install time, any files listed in
|
||
@code{noinst_PYTHON} will not be compiled. Python source files are
|
||
included in the distribution by default, prepend @code{nodist_} (as in
|
||
@code{nodist_python_PYTHON}) to omit them.
|
||
|
||
Automake ships with an Autoconf macro called @code{AM_PATH_PYTHON}
|
||
that will determine some Python-related directory variables (see
|
||
below). If you have called @code{AM_PATH_PYTHON} from
|
||
@file{configure.ac}, then you may use the variables
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@code{python_PYTHON} or @code{pkgpython_PYTHON} to list Python source
|
||
files in your @file{Makefile.am}, depending on where you want your files
|
||
installed (see the definitions of @code{pythondir} and
|
||
@code{pkgpythondir} below).
|
||
|
||
@defmac AM_PATH_PYTHON (@ovar{version}, @ovar{action-if-found},
|
||
@ovar{action-if-not-found})
|
||
|
||
Search for a Python interpreter on the system. This macro takes three
|
||
optional arguments. The first argument, if present, is the minimum
|
||
version of Python required for this package: @code{AM_PATH_PYTHON}
|
||
will skip any Python interpreter that is older than @var{version}.
|
||
If an interpreter is found and satisfies @var{version}, then
|
||
@var{action-if-found} is run. Otherwise, @var{action-if-not-found} is
|
||
run.
|
||
|
||
If @var{action-if-not-found} is not specified, as in the following
|
||
example, the default is to abort @command{configure}.
|
||
|
||
@example
|
||
AM_PATH_PYTHON([2.2])
|
||
@end example
|
||
|
||
@noindent
|
||
This is fine when Python is an absolute requirement for the package.
|
||
If Python >= 2.5 was only @emph{optional} to the package,
|
||
@code{AM_PATH_PYTHON} could be called as follows.
|
||
|
||
@example
|
||
AM_PATH_PYTHON([2.5],, [:])
|
||
@end example
|
||
|
||
If the @env{PYTHON} variable is set when @code{AM_PATH_PYTHON} is
|
||
called, then that will be the only Python interpreter that is tried.
|
||
|
||
@code{AM_PATH_PYTHON} creates the following output variables based on
|
||
the Python installation found during configuration.
|
||
@end defmac
|
||
|
||
@vtable @code
|
||
@item PYTHON
|
||
The name of the Python executable, or @samp{:} if no suitable
|
||
interpreter could be found.
|
||
|
||
Assuming @var{action-if-not-found} is used (otherwise @file{./configure}
|
||
will abort if Python is absent), the value of @code{PYTHON} can be used
|
||
to setup a conditional in order to disable the relevant part of a build
|
||
as follows.
|
||
|
||
@example
|
||
AM_PATH_PYTHON(,, [:])
|
||
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
|
||
@end example
|
||
|
||
@item PYTHON_VERSION
|
||
The Python version number, in the form @var{major}.@var{minor}
|
||
(e.g., @samp{2.5}). This is currently the value of
|
||
@samp{sys.version[:3]}.
|
||
|
||
@item PYTHON_PREFIX
|
||
The string @samp{$@{prefix@}}. This term may be used in future work
|
||
that needs the contents of Python's @samp{sys.prefix}, but general
|
||
consensus is to always use the value from @command{configure}.
|
||
|
||
@item PYTHON_EXEC_PREFIX
|
||
The string @samp{$@{exec_prefix@}}. This term may be used in future work
|
||
that needs the contents of Python's @samp{sys.exec_prefix}, but general
|
||
consensus is to always use the value from @command{configure}.
|
||
|
||
@item PYTHON_PLATFORM
|
||
The canonical name used by Python to describe the operating system, as
|
||
given by @samp{sys.platform}. This value is sometimes needed when
|
||
building Python extensions.
|
||
|
||
@item pythondir
|
||
The directory name for the @file{site-packages} subdirectory of the
|
||
standard Python install tree.
|
||
|
||
@item pkgpythondir
|
||
This is the directory under @code{pythondir} that is named after the
|
||
package. That is, it is @samp{$(pythondir)/$(PACKAGE)}. It is provided
|
||
as a convenience.
|
||
|
||
@item pyexecdir
|
||
This is the directory where Python extension modules (shared libraries)
|
||
should be installed. An extension module written in C could be declared
|
||
as follows to Automake:
|
||
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@example
|
||
pyexec_LTLIBRARIES = quaternion.la
|
||
quaternion_la_SOURCES = quaternion.c support.c support.h
|
||
quaternion_la_LDFLAGS = -avoid-version -module
|
||
@end example
|
||
|
||
@item pkgpyexecdir
|
||
This is a convenience variable that is defined as
|
||
@samp{$(pyexecdir)/$(PACKAGE)}.
|
||
@end vtable
|
||
|
||
All of these directory variables have values that start with either
|
||
@samp{$@{prefix@}} or @samp{$@{exec_prefix@}} unexpanded. This works
|
||
fine in @file{Makefiles}, but it makes these variables hard to use in
|
||
@file{configure}. This is mandated by the GNU coding standards, so
|
||
that the user can run @samp{make prefix=/foo install}. The Autoconf
|
||
manual has a section with more details on this topic
|
||
(@pxref{Installation Directory Variables, , Installation Directory
|
||
Variables, autoconf, The Autoconf Manual}). See also @ref{Hard-Coded
|
||
Install Paths}.
|
||
|
||
|
||
@node Documentation
|
||
@chapter Building documentation
|
||
|
||
Currently Automake provides support for Texinfo and man pages.
|
||
|
||
@menu
|
||
* Texinfo:: Texinfo
|
||
* Man Pages:: Man pages
|
||
@end menu
|
||
|
||
|
||
@node Texinfo
|
||
@section Texinfo
|
||
|
||
@cindex @code{_TEXINFOS} primary, defined
|
||
@cindex @code{TEXINFOS} primary, defined
|
||
@cindex Primary variable, @code{TEXINFOS}
|
||
@cindex HTML output using Texinfo
|
||
@cindex PDF output using Texinfo
|
||
@cindex PS output using Texinfo
|
||
@cindex DVI output using Texinfo
|
||
@vindex _TEXINFOS
|
||
@vindex info_TEXINFOS
|
||
|
||
If the current directory contains Texinfo source, you must declare it
|
||
with the @code{TEXINFOS} primary. Generally Texinfo files are converted
|
||
into info, and thus the @code{info_TEXINFOS} variable is most commonly used
|
||
here. Any Texinfo source file should have the @file{.texi} extension.
|
||
Automake also accepts @file{.txi} or @file{.texinfo} extensions, but their
|
||
use is discouraged now, and will elicit runtime warnings.
|
||
|
||
Automake generates rules to build @file{.info}, @file{.dvi},
|
||
@file{.ps}, @file{.pdf} and @file{.html} files from your Texinfo
|
||
sources. Following the GNU Coding Standards, only the @file{.info}
|
||
files are built by @samp{make all} and installed by @samp{make
|
||
install} (unless you use @option{no-installinfo}, see below).
|
||
Furthermore, @file{.info} files are automatically distributed so that
|
||
Texinfo is not a prerequisite for installing your package.
|
||
|
||
It is worth noting that, contrary to what happens with the other formats,
|
||
the generated @file{.info} files are by default placed in @code{srcdir}
|
||
rather than in the @code{builddir}. This can be changed with the
|
||
@option{info-in-builddir} option.
|
||
|
||
@trindex dvi
|
||
@trindex html
|
||
@trindex pdf
|
||
@trindex ps
|
||
@trindex install-dvi
|
||
@trindex install-html
|
||
@trindex install-pdf
|
||
@trindex install-ps
|
||
Other documentation formats can be built on request by @samp{make
|
||
dvi}, @samp{make ps}, @samp{make pdf} and @samp{make html}, and they
|
||
can be installed with @samp{make install-dvi}, @samp{make install-ps},
|
||
@samp{make install-pdf} and @samp{make install-html} explicitly.
|
||
@samp{make uninstall} will remove everything: the Texinfo
|
||
documentation installed by default as well as all the above optional
|
||
formats.
|
||
|
||
All of these targets can be extended using @samp{-local} rules
|
||
(@pxref{Extending}).
|
||
|
||
@cindex Texinfo flag, @code{VERSION}
|
||
@cindex Texinfo flag, @code{UPDATED}
|
||
@cindex Texinfo flag, @code{EDITION}
|
||
@cindex Texinfo flag, @code{UPDATED-MONTH}
|
||
|
||
@cindex @code{VERSION} Texinfo flag
|
||
@cindex @code{UPDATED} Texinfo flag
|
||
@cindex @code{EDITION} Texinfo flag
|
||
@cindex @code{UPDATED-MONTH} Texinfo flag
|
||
|
||
@cindex @file{mdate-sh}
|
||
|
||
If the @file{.texi} file @code{@@include}s @file{version.texi}, then
|
||
that file will be automatically generated. The file @file{version.texi}
|
||
defines four Texinfo flags you can reference using
|
||
@code{@@value@{EDITION@}}, @code{@@value@{VERSION@}},
|
||
@code{@@value@{UPDATED@}}, and @code{@@value@{UPDATED-MONTH@}}.
|
||
|
||
@table @code
|
||
@item EDITION
|
||
@itemx VERSION
|
||
Both of these flags hold the version number of your program. They are
|
||
kept separate for clarity.
|
||
|
||
@item UPDATED
|
||
This holds the date the primary @file{.texi} file was last modified.
|
||
|
||
@item UPDATED-MONTH
|
||
This holds the name of the month in which the primary @file{.texi} file
|
||
was last modified.
|
||
@end table
|
||
|
||
The @file{version.texi} support requires the @command{mdate-sh}
|
||
script; this script is supplied with Automake and automatically
|
||
included when @command{automake} is invoked with the
|
||
@option{--add-missing} option.
|
||
|
||
If you have multiple Texinfo files, and you want to use the
|
||
@file{version.texi} feature, then you have to have a separate version
|
||
file for each Texinfo file. Automake will treat any include in a
|
||
Texinfo file that matches @file{vers*.texi} just as an automatically
|
||
generated version file.
|
||
|
||
Sometimes an info file actually depends on more than one @file{.texi}
|
||
file. For instance, in GNU Hello, @file{hello.texi} includes the file
|
||
@file{fdl.texi}. You can tell Automake about these dependencies using
|
||
the @code{@var{texi}_TEXINFOS} variable. Here is how GNU Hello does it:
|
||
@vindex TEXINFOS
|
||
@vindex _TEXINFOS
|
||
|
||
@example
|
||
info_TEXINFOS = hello.texi
|
||
hello_TEXINFOS = fdl.texi
|
||
@end example
|
||
|
||
@cindex @file{texinfo.tex}
|
||
|
||
By default, Automake requires the file @file{texinfo.tex} to appear in
|
||
the same directory as the @file{Makefile.am} file that lists the
|
||
@file{.texi} files. If you used @code{AC_CONFIG_AUX_DIR} in
|
||
@file{configure.ac} (@pxref{Input, , Finding `configure' Input,
|
||
autoconf, The Autoconf Manual}), then @file{texinfo.tex} is looked for
|
||
there. In both cases, @command{automake} then supplies @file{texinfo.tex} if
|
||
@option{--add-missing} is given, and takes care of its distribution.
|
||
However, if you set the @code{TEXINFO_TEX} variable (see below),
|
||
it overrides the location of the file and turns off its installation
|
||
into the source as well as its distribution.
|
||
|
||
The option @option{no-texinfo.tex} can be used to eliminate the
|
||
requirement for the file @file{texinfo.tex}. Use of the variable
|
||
@code{TEXINFO_TEX} is preferable, however, because that allows the
|
||
@code{dvi}, @code{ps}, and @code{pdf} targets to still work.
|
||
|
||
@cindex Option, @code{no-installinfo}
|
||
@cindex Target, @code{install-info}
|
||
@cindex @code{install-info} target
|
||
@cindex @code{no-installinfo} option
|
||
|
||
@opindex no-installinfo
|
||
@trindex install-info
|
||
|
||
Automake generates an @code{install-info} rule; some people apparently
|
||
use this. By default, info pages are installed by @samp{make
|
||
install}, so running @code{make install-info} is pointless. This can
|
||
be prevented via the @code{no-installinfo} option. In this case,
|
||
@file{.info} files are not installed by default, and user must
|
||
request this explicitly using @samp{make install-info}.
|
||
|
||
@vindex AM_UPDATE_INFO_DIR
|
||
By default, @code{make install-info} and @code{make uninstall-info}
|
||
will try to run the @command{install-info} program (if available) to
|
||
update (or create/remove) the @file{@code{$@{infodir@}}/dir} index.
|
||
If this is undesired, it can be prevented by exporting the
|
||
@code{AM_UPDATE_INFO_DIR} variable to "@code{no}".
|
||
|
||
The following variables are used by the Texinfo build rules.
|
||
|
||
@vtable @code
|
||
@item MAKEINFO
|
||
The name of the program invoked to build @file{.info} files. This
|
||
variable is defined by Automake. If the @command{makeinfo} program is
|
||
found on the system then it will be used by default; otherwise
|
||
@command{missing} will be used instead.
|
||
|
||
@item MAKEINFOHTML
|
||
The command invoked to build @file{.html} files. Automake
|
||
defines this to @samp{$(MAKEINFO) --html}.
|
||
|
||
@item MAKEINFOFLAGS
|
||
User flags passed to each invocation of @samp{$(MAKEINFO)} and
|
||
@samp{$(MAKEINFOHTML)}. This user variable (@pxref{User Variables}) is
|
||
not expected to be defined in any @file{Makefile}; it can be used by
|
||
users to pass extra flags to suit their needs.
|
||
|
||
@item AM_MAKEINFOFLAGS
|
||
@itemx AM_MAKEINFOHTMLFLAGS
|
||
Maintainer flags passed to each @command{makeinfo} invocation. Unlike
|
||
@code{MAKEINFOFLAGS}, these variables are meant to be defined by
|
||
maintainers in @file{Makefile.am}. @samp{$(AM_MAKEINFOFLAGS)} is
|
||
passed to @code{makeinfo} when building @file{.info} files; and
|
||
@samp{$(AM_MAKEINFOHTMLFLAGS)} is used when building @file{.html}
|
||
files.
|
||
|
||
@c Keep in sync with txinfo-many-output-formats.sh
|
||
For instance, the following setting can be used to obtain one single
|
||
@file{.html} file per manual, without node separators.
|
||
@example
|
||
AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
|
||
@end example
|
||
|
||
@code{AM_MAKEINFOHTMLFLAGS} defaults to @samp{$(AM_MAKEINFOFLAGS)}.
|
||
This means that defining @code{AM_MAKEINFOFLAGS} without defining
|
||
@code{AM_MAKEINFOHTMLFLAGS} will impact builds of both @file{.info}
|
||
and @file{.html} files.
|
||
|
||
@item TEXI2DVI
|
||
The name of the command that converts a @file{.texi} file into a
|
||
@file{.dvi} file. This defaults to @samp{texi2dvi}, a script that ships
|
||
with the Texinfo package.
|
||
|
||
@item TEXI2PDF
|
||
The name of the command that translates a @file{.texi} file into a
|
||
@file{.pdf} file. This defaults to @samp{$(TEXI2DVI) --pdf --batch}.
|
||
|
||
@item DVIPS
|
||
The name of the command that builds a @file{.ps} file out of a
|
||
@file{.dvi} file. This defaults to @samp{dvips}.
|
||
|
||
@item TEXINFO_TEX
|
||
|
||
If your package has Texinfo files in many directories, you can use the
|
||
variable @code{TEXINFO_TEX} to tell Automake where to find the canonical
|
||
@file{texinfo.tex} for your package. The value of this variable should
|
||
be the relative path from the current @file{Makefile.am} to
|
||
@file{texinfo.tex}:
|
||
|
||
@example
|
||
TEXINFO_TEX = ../doc/texinfo.tex
|
||
@end example
|
||
@end vtable
|
||
|
||
|
||
@node Man Pages
|
||
@section Man Pages
|
||
|
||
@cindex @code{_MANS} primary, defined
|
||
@cindex @code{MANS} primary, defined
|
||
@cindex Primary variable, @code{MANS}
|
||
|
||
@vindex _MANS
|
||
@vindex man_MANS
|
||
A package can also include man pages (but see the GNU standards on this
|
||
matter, @ref{Man Pages, , , standards, The GNU Coding Standards}.) Man
|
||
pages are declared using the @code{MANS} primary. Generally the
|
||
@code{man_MANS} variable is used. Man pages are automatically installed in
|
||
the correct subdirectory of @code{mandir}, based on the file extension.
|
||
|
||
File extensions such as @file{.1c} are handled by looking for the valid
|
||
part of the extension and using that to determine the correct
|
||
subdirectory of @code{mandir}. Valid section names are the digits
|
||
@samp{0} through @samp{9}, and the letters @samp{l} and @samp{n}.
|
||
|
||
Sometimes developers prefer to name a man page something like
|
||
@file{foo.man} in the source, and then rename it to have the correct
|
||
suffix, for example @file{foo.1}, when installing the file. Automake
|
||
also supports this mode. For a valid section named @var{section},
|
||
there is a corresponding directory named @samp{man@var{section}dir},
|
||
and a corresponding @code{_MANS} variable. Files listed in such a
|
||
variable are installed in the indicated section. If the file already
|
||
has a valid suffix, then it is installed as-is; otherwise the file
|
||
suffix is changed to match the section.
|
||
|
||
For instance, consider this example:
|
||
@example
|
||
man1_MANS = rename.man thesame.1 alsothesame.1c
|
||
@end example
|
||
|
||
@noindent
|
||
In this case, @file{rename.man} will be renamed to @file{rename.1} when
|
||
installed, but the other files will keep their names.
|
||
|
||
@cindex Target, @code{install-man}
|
||
@cindex Option, @option{no-installman}
|
||
@cindex @code{install-man} target
|
||
@cindex @option{no-installman} option
|
||
@opindex no-installman
|
||
@trindex install-man
|
||
|
||
By default, man pages are installed by @samp{make install}. However,
|
||
since the GNU project does not require man pages, many maintainers do
|
||
not expend effort to keep the man pages up to date. In these cases, the
|
||
@option{no-installman} option will prevent the man pages from being
|
||
installed by default. The user can still explicitly install them via
|
||
@samp{make install-man}.
|
||
|
||
For fast installation, with many files it is preferable to use
|
||
@samp{man@var{section}_MANS} over @samp{man_MANS} as well as files that
|
||
do not need to be renamed.
|
||
|
||
Man pages are not currently considered to be source, because it is not
|
||
uncommon for man pages to be automatically generated. Therefore they
|
||
are not automatically included in the distribution. However, this can
|
||
be changed by use of the @code{dist_} prefix. For instance here is
|
||
how to distribute and install the two man pages of GNU @command{cpio}
|
||
(which includes both Texinfo documentation and man pages):
|
||
|
||
@example
|
||
dist_man_MANS = cpio.1 mt.1
|
||
@end example
|
||
|
||
The @code{nobase_} prefix is meaningless for man pages and is
|
||
disallowed.
|
||
|
||
@vindex notrans_
|
||
@cindex @code{notrans_} prefix
|
||
@cindex Man page renaming, avoiding
|
||
@cindex Avoiding man page renaming
|
||
|
||
Executables and manpages may be renamed upon installation
|
||
(@pxref{Renaming}). For manpages this can be avoided by use of the
|
||
@code{notrans_} prefix. For instance, suppose an executable @samp{foo}
|
||
allowing to access a library function @samp{foo} from the command line.
|
||
The way to avoid renaming of the @file{foo.3} manpage is:
|
||
|
||
@example
|
||
man_MANS = foo.1
|
||
notrans_man_MANS = foo.3
|
||
@end example
|
||
|
||
@cindex @code{notrans_} and @code{dist_} or @code{nodist_}
|
||
@cindex @code{dist_} and @code{notrans_}
|
||
@cindex @code{nodist_} and @code{notrans_}
|
||
|
||
@samp{notrans_} must be specified first when used in conjunction with
|
||
either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution
|
||
Control}). For instance:
|
||
|
||
@example
|
||
notrans_dist_man3_MANS = bar.3
|
||
@end example
|
||
|
||
@node Install
|
||
@chapter What Gets Installed
|
||
|
||
@cindex Installation support
|
||
@cindex @samp{make install} support
|
||
|
||
Naturally, Automake handles the details of actually installing your
|
||
program once it has been built. All files named by the various
|
||
primaries are automatically installed in the appropriate places when the
|
||
user runs @samp{make install}.
|
||
|
||
@menu
|
||
* Basics of Installation:: What gets installed where
|
||
* The Two Parts of Install:: Installing data and programs separately
|
||
* Extending Installation:: Adding your own rules for installation
|
||
* Staged Installs:: Installation in a temporary location
|
||
* Install Rules for the User:: Useful additional rules
|
||
@end menu
|
||
|
||
@node Basics of Installation
|
||
@section Basics of Installation
|
||
|
||
A file named in a primary is installed by copying the built file into
|
||
the appropriate directory. The base name of the file is used when
|
||
installing.
|
||
|
||
@example
|
||
bin_PROGRAMS = hello subdir/goodbye
|
||
@end example
|
||
|
||
In this example, both @samp{hello} and @samp{goodbye} will be installed
|
||
in @samp{$(bindir)}.
|
||
|
||
Sometimes it is useful to avoid the basename step at install time. For
|
||
instance, you might have a number of header files in subdirectories of
|
||
the source tree that are laid out precisely how you want to install
|
||
them. In this situation you can use the @code{nobase_} prefix to
|
||
suppress the base name step. For example:
|
||
|
||
@example
|
||
nobase_include_HEADERS = stdio.h sys/types.h
|
||
@end example
|
||
|
||
@noindent
|
||
will install @file{stdio.h} in @samp{$(includedir)} and @file{types.h}
|
||
in @samp{$(includedir)/sys}.
|
||
|
||
For most file types, Automake will install multiple files at once, while
|
||
avoiding command line length issues (@pxref{Length Limitations}). Since
|
||
some @command{install} programs will not install the same file twice in
|
||
one invocation, you may need to ensure that file lists are unique within
|
||
one variable such as @samp{nobase_include_HEADERS} above.
|
||
|
||
You should not rely on the order in which files listed in one variable
|
||
are installed. Likewise, to cater for parallel make, you should not
|
||
rely on any particular file installation order even among different
|
||
file types (library dependencies are an exception here).
|
||
|
||
|
||
@node The Two Parts of Install
|
||
@section The Two Parts of Install
|
||
|
||
Automake generates separate @code{install-data} and @code{install-exec}
|
||
rules, in case the installer is installing on multiple machines that
|
||
share directory structure---these targets allow the machine-independent
|
||
parts to be installed only once. @code{install-exec} installs
|
||
platform-dependent files, and @code{install-data} installs
|
||
platform-independent files. The @code{install} target depends on both
|
||
of these targets. While Automake tries to automatically segregate
|
||
objects into the correct category, the @file{Makefile.am} author is, in
|
||
the end, responsible for making sure this is done correctly.
|
||
@trindex install-data
|
||
@trindex install-exec
|
||
@trindex install
|
||
@cindex Install, two parts of
|
||
|
||
Variables using the standard directory prefixes @samp{data},
|
||
@samp{info}, @samp{man}, @samp{include}, @samp{oldinclude},
|
||
@samp{pkgdata}, or @samp{pkginclude} are installed by
|
||
@code{install-data}.
|
||
|
||
Variables using the standard directory prefixes @samp{bin},
|
||
@samp{sbin}, @samp{libexec}, @samp{sysconf}, @samp{localstate},
|
||
@samp{lib}, or @samp{pkglib} are installed by @code{install-exec}.
|
||
|
||
For instance, @code{data_DATA} files are installed by @code{install-data},
|
||
while @code{bin_PROGRAMS} files are installed by @code{install-exec}.
|
||
|
||
Any variable using a user-defined directory prefix with
|
||
@samp{exec} in the name (e.g.,
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
@code{myexecbin_PROGRAMS}) is installed by @code{install-exec}. All
|
||
other user-defined prefixes are installed by @code{install-data}.
|
||
|
||
@node Extending Installation
|
||
@section Extending Installation
|
||
|
||
It is possible to extend this mechanism by defining an
|
||
@code{install-exec-local} or @code{install-data-local} rule. If these
|
||
rules exist, they will be run at @samp{make install} time. These
|
||
rules can do almost anything; care is required.
|
||
@trindex install-exec-local
|
||
@trindex install-data-local
|
||
|
||
Automake also supports two install hooks, @code{install-exec-hook} and
|
||
@code{install-data-hook}. These hooks are run after all other install
|
||
rules of the appropriate type, exec or data, have completed. So, for
|
||
instance, it is possible to perform post-installation modifications
|
||
using an install hook. @xref{Extending}, for some examples.
|
||
@cindex Install hook
|
||
|
||
@node Staged Installs
|
||
@section Staged Installs
|
||
|
||
@vindex DESTDIR
|
||
Automake generates support for the @code{DESTDIR} variable in all
|
||
install rules. @code{DESTDIR} is used during the @samp{make install}
|
||
step to relocate install objects into a staging area. Each object and
|
||
path is prefixed with the value of @code{DESTDIR} before being copied
|
||
into the install area. Here is an example of typical DESTDIR usage:
|
||
|
||
@example
|
||
mkdir /tmp/staging &&
|
||
make DESTDIR=/tmp/staging install
|
||
@end example
|
||
|
||
The @command{mkdir} command avoids a security problem if the attacker
|
||
creates a symbolic link from @file{/tmp/staging} to a victim area;
|
||
then @command{make} places install objects in a directory tree built under
|
||
@file{/tmp/staging}. If @file{/gnu/bin/foo} and
|
||
@file{/gnu/share/aclocal/foo.m4} are to be installed, the above command
|
||
would install @file{/tmp/staging/gnu/bin/foo} and
|
||
@file{/tmp/staging/gnu/share/aclocal/foo.m4}.
|
||
|
||
This feature is commonly used to build install images and packages
|
||
(@pxref{DESTDIR}).
|
||
|
||
Support for @code{DESTDIR} is implemented by coding it directly into
|
||
the install rules. If your @file{Makefile.am} uses a local install
|
||
rule (e.g., @code{install-exec-local}) or an install hook, then you
|
||
must write that code to respect @code{DESTDIR}.
|
||
|
||
@xref{Makefile Conventions, , , standards, The GNU Coding Standards},
|
||
for another usage example.
|
||
|
||
@node Install Rules for the User
|
||
@section Install Rules for the User
|
||
|
||
Automake also generates rules for targets @code{uninstall},
|
||
@code{installdirs}, and @code{install-strip}.
|
||
@trindex uninstall
|
||
@trindex installdirs
|
||
@trindex install-strip
|
||
|
||
Automake supports @code{uninstall-local} and @code{uninstall-hook}.
|
||
There is no notion of separate uninstalls for ``exec'' and ``data'', as
|
||
these features would not provide additional functionality.
|
||
|
||
Note that @code{uninstall} is not meant as a replacement for a real
|
||
packaging tool.
|
||
|
||
|
||
@node Clean
|
||
@chapter What Gets Cleaned
|
||
|
||
@cindex @samp{make clean} support
|
||
|
||
The GNU Makefile Standards specify a number of different clean rules.
|
||
@xref{Standard Targets, , Standard Targets for Users, standards,
|
||
The GNU Coding Standards}.
|
||
|
||
Generally the files that can be cleaned are determined automatically by
|
||
Automake. Of course, Automake also recognizes some variables that can
|
||
be defined to specify additional files to clean. These variables are
|
||
@code{MOSTLYCLEANFILES}, @code{CLEANFILES}, @code{DISTCLEANFILES}, and
|
||
@code{MAINTAINERCLEANFILES}.
|
||
@vindex MOSTLYCLEANFILES
|
||
@vindex CLEANFILES
|
||
@vindex DISTCLEANFILES
|
||
@vindex MAINTAINERCLEANFILES
|
||
|
||
@trindex mostlyclean-local
|
||
@trindex clean-local
|
||
@trindex distclean-local
|
||
@trindex maintainer-clean-local
|
||
When cleaning involves more than deleting some hard-coded list of
|
||
files, it is also possible to supplement the cleaning rules with your
|
||
own commands. Simply define a rule for any of the
|
||
@code{mostlyclean-local}, @code{clean-local}, @code{distclean-local},
|
||
or @code{maintainer-clean-local} targets (@pxref{Extending}). A common
|
||
case is deleting a directory, for instance, a directory created by the
|
||
test suite:
|
||
|
||
@example
|
||
clean-local:
|
||
-rm -rf testSubDir
|
||
@end example
|
||
|
||
Since @command{make} allows only one set of rules for a given target,
|
||
a more extensible way of writing this is to use a separate target
|
||
listed as a dependency:
|
||
|
||
@example
|
||
clean-local: clean-local-check
|
||
.PHONY: clean-local-check
|
||
clean-local-check:
|
||
-rm -rf testSubDir
|
||
@end example
|
||
|
||
As the GNU Standards aren't always explicit as to which files should
|
||
be removed by which rule, we've adopted a heuristic that we believe
|
||
was first formulated by Fran@,{c}ois Pinard:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
If @command{make} built it, and it is commonly something that one would
|
||
want to rebuild (for instance, a @file{.o} file), then
|
||
@code{mostlyclean} should delete it.
|
||
|
||
@item
|
||
Otherwise, if @command{make} built it, then @code{clean} should delete it.
|
||
|
||
@item
|
||
If @command{configure} built it, then @code{distclean} should delete it.
|
||
|
||
@item
|
||
If the maintainer built it (for instance, a @file{.info} file), then
|
||
@code{maintainer-clean} should delete it. However
|
||
@code{maintainer-clean} should not delete anything that needs to exist
|
||
in order to run @samp{./configure && make}.
|
||
@end itemize
|
||
|
||
We recommend that you follow this same set of heuristics in your
|
||
@file{Makefile.am}.
|
||
|
||
|
||
@node Dist
|
||
@chapter What Goes in a Distribution
|
||
|
||
@menu
|
||
* Basics of Distribution:: Files distributed by default
|
||
* Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes
|
||
* The dist Hook:: A target for last-minute distribution changes
|
||
* Checking the Distribution:: @samp{make distcheck} explained
|
||
* The Types of Distributions:: A variety of formats and compression methods
|
||
@end menu
|
||
|
||
@node Basics of Distribution
|
||
@section Basics of Distribution
|
||
|
||
@cindex @samp{make dist}
|
||
|
||
@vindex PACKAGE
|
||
@vindex VERSION
|
||
@trindex dist
|
||
The @code{dist} rule in the generated @file{Makefile.in} can be used
|
||
to generate a gzipped @code{tar} file and other flavors of archive for
|
||
distribution. The file is named based on the @code{PACKAGE} and
|
||
@code{VERSION} variables automatically defined by either the
|
||
@code{AC_INIT} invocation or by a @emph{deprecated} two-arguments
|
||
invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros}
|
||
for how these variables get their values, from either defaults or explicit
|
||
values -- it's slightly trickier than one would expect).
|
||
More precisely the gzipped @code{tar} file is named
|
||
@samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}.
|
||
@vindex GZIP_ENV
|
||
You can use the @command{make} variable @code{GZIP_ENV} to control how gzip
|
||
is run. The default setting is @option{--best}.
|
||
|
||
@cindex @code{m4_include}, distribution
|
||
@cindex @code{include}, distribution
|
||
@acindex m4_include
|
||
@cmindex include
|
||
For the most part, the files to distribute are automatically found by
|
||
Automake: all source files are automatically included in a distribution,
|
||
as are all @file{Makefile.am} and @file{Makefile.in} files. Automake also
|
||
has a built-in list of commonly used files that are automatically
|
||
included if they are found in the current directory (either physically,
|
||
or as the target of a @file{Makefile.am} rule); this list is printed by
|
||
@samp{automake --help}. Note that some files in this list are actually
|
||
distributed only if other certain conditions hold (for example,
|
||
@c Keep in sync with autodist-config-headers.sh
|
||
the @file{config.h.top} and @file{config.h.bot} files are automatically
|
||
distributed only if, e.g., @samp{AC_CONFIG_HEADERS([config.h])} is used
|
||
in @file{configure.ac}). Also, files that are read by @command{configure}
|
||
(i.e.@: the source files corresponding to the files specified in various
|
||
Autoconf macros such as @code{AC_CONFIG_FILES} and siblings) are
|
||
automatically distributed. Files included in a @file{Makefile.am} (using
|
||
@code{include}) or in @file{configure.ac} (using @code{m4_include}), and
|
||
helper scripts installed with @samp{automake --add-missing} are also
|
||
distributed.
|
||
|
||
@vindex EXTRA_DIST
|
||
Still, sometimes there are files that must be distributed, but which
|
||
are not covered in the automatic rules. These files should be listed in
|
||
the @code{EXTRA_DIST} variable. You can mention files from
|
||
subdirectories in @code{EXTRA_DIST}.
|
||
|
||
You can also mention a directory in @code{EXTRA_DIST}; in this case the
|
||
entire directory will be recursively copied into the distribution.
|
||
Please note that this will also copy @emph{everything} in the directory,
|
||
including, e.g., Subversion's @file{.svn} private directories or CVS/RCS
|
||
version control files; thus we recommend against using this feature
|
||
as-is. However, you can use the @code{dist-hook} feature to
|
||
ameliorate the problem; @pxref{The dist Hook}.
|
||
|
||
@vindex SUBDIRS
|
||
@vindex DIST_SUBDIRS
|
||
If you define @code{SUBDIRS}, Automake will recursively include the
|
||
subdirectories in the distribution. If @code{SUBDIRS} is defined
|
||
conditionally (@pxref{Conditionals}), Automake will normally include
|
||
all directories that could possibly appear in @code{SUBDIRS} in the
|
||
distribution. If you need to specify the set of directories
|
||
conditionally, you can set the variable @code{DIST_SUBDIRS} to the
|
||
exact list of subdirectories to include in the distribution
|
||
(@pxref{Conditional Subdirectories}).
|
||
|
||
|
||
@node Fine-grained Distribution Control
|
||
@section Fine-grained Distribution Control
|
||
|
||
@vindex dist_
|
||
@vindex nodist_
|
||
Sometimes you need tighter control over what does @emph{not} go into the
|
||
distribution; for instance, you might have source files that are
|
||
generated and that you do not want to distribute. In this case
|
||
Automake gives fine-grained control using the @code{dist} and
|
||
@code{nodist} prefixes. Any primary or @code{_SOURCES} variable can be
|
||
prefixed with @code{dist_} to add the listed files to the distribution.
|
||
Similarly, @code{nodist_} can be used to omit the files from the
|
||
distribution.
|
||
|
||
As an example, here is how you would cause some data to be distributed
|
||
while leaving some source code out of the distribution:
|
||
|
||
@example
|
||
dist_data_DATA = distribute-this
|
||
bin_PROGRAMS = foo
|
||
nodist_foo_SOURCES = do-not-distribute.c
|
||
@end example
|
||
|
||
@node The dist Hook
|
||
@section The dist Hook
|
||
|
||
@trindex dist-hook
|
||
|
||
Occasionally it is useful to be able to change the distribution before
|
||
it is packaged up. If the @code{dist-hook} rule exists, it is run
|
||
after the distribution directory is filled, but before the actual
|
||
distribution archives are created. One way to use this is for
|
||
removing unnecessary files that get recursively included by specifying
|
||
a directory in @code{EXTRA_DIST}:
|
||
|
||
@example
|
||
EXTRA_DIST = doc
|
||
dist-hook:
|
||
rm -rf `find $(distdir)/doc -type d -name .svn`
|
||
@end example
|
||
|
||
@c The caveats described here should be documented in 'disthook.sh'.
|
||
@noindent
|
||
Note that the @code{dist-hook} recipe shouldn't assume that the regular
|
||
files in the distribution directory are writable; this might not be the
|
||
case if one is packaging from a read-only source tree, or when a
|
||
@code{make distcheck} is being done. For similar reasons, the recipe
|
||
shouldn't assume that the subdirectories put into the distribution
|
||
directory as effect of having them listed in @code{EXTRA_DIST} are
|
||
writable. So, if the @code{dist-hook} recipe wants to modify the
|
||
content of an existing file (or @code{EXTRA_DIST} subdirectory) in the
|
||
distribution directory, it should explicitly to make it writable first:
|
||
|
||
@example
|
||
EXTRA_DIST = README doc
|
||
dist-hook:
|
||
chmod u+w $(distdir)/README $(distdir)/doc
|
||
echo "Distribution date: `date`" >> README
|
||
rm -f $(distdir)/doc/HACKING
|
||
@end example
|
||
|
||
@vindex distdir
|
||
@vindex top_distdir
|
||
Two variables that come handy when writing @code{dist-hook} rules are
|
||
@samp{$(distdir)} and @samp{$(top_distdir)}.
|
||
|
||
@samp{$(distdir)} points to the directory where the @code{dist} rule
|
||
will copy files from the current directory before creating the
|
||
tarball. If you are at the top-level directory, then @samp{distdir =
|
||
$(PACKAGE)-$(VERSION)}. When used from subdirectory named
|
||
@file{foo/}, then @samp{distdir = ../$(PACKAGE)-$(VERSION)/foo}.
|
||
@samp{$(distdir)} can be a relative or absolute path, do not assume
|
||
any form.
|
||
|
||
@samp{$(top_distdir)} always points to the root directory of the
|
||
distributed tree. At the top-level it's equal to @samp{$(distdir)}.
|
||
In the @file{foo/} subdirectory
|
||
@samp{top_distdir = ../$(PACKAGE)-$(VERSION)}.
|
||
@samp{$(top_distdir)} too can be a relative or absolute path.
|
||
|
||
Note that when packages are nested using @code{AC_CONFIG_SUBDIRS}
|
||
(@pxref{Subpackages}), then @samp{$(distdir)} and
|
||
@samp{$(top_distdir)} are relative to the package where @samp{make
|
||
dist} was run, not to any sub-packages involved.
|
||
|
||
@node Checking the Distribution
|
||
@section Checking the Distribution
|
||
|
||
@cindex @samp{make distcheck}
|
||
@trindex distcheck
|
||
Automake also generates a @code{distcheck} rule that can be of help
|
||
to ensure that a given distribution will actually work. Simplifying
|
||
a bit, we can say this rule first makes a distribution, and then,
|
||
@emph{operating from it}, takes the following steps:
|
||
@itemize
|
||
@item
|
||
tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the
|
||
@code{srcdir} and all its content made @emph{read-only};
|
||
@item
|
||
runs the test suite (with @command{make check}) on this fresh build;
|
||
@item
|
||
installs the package in a temporary directory (with @command{make
|
||
install}), and tries runs the test suite on the resulting installation
|
||
(with @command{make installcheck});
|
||
@item
|
||
checks that the package can be correctly uninstalled (by @command{make
|
||
uninstall}) and cleaned (by @code{make distclean});
|
||
@item
|
||
finally, makes another tarball to ensure the distribution is
|
||
self-contained.
|
||
@end itemize
|
||
|
||
All of these actions are performed in a temporary directory. Please
|
||
note that the exact location and the exact structure of such a directory
|
||
(where the read-only sources are placed, how the temporary build and
|
||
install directories are named and how deeply they are nested, etc.) is
|
||
to be considered an implementation detail, which can change at any time;
|
||
so do not reply on it.
|
||
|
||
@vindex AM_DISTCHECK_CONFIGURE_FLAGS
|
||
@vindex DISTCHECK_CONFIGURE_FLAGS
|
||
@subheading DISTCHECK_CONFIGURE_FLAGS
|
||
Building the package involves running @samp{./configure}. If you need
|
||
to supply additional flags to @command{configure}, define them in the
|
||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level
|
||
@file{Makefile.am}. The user can still extend or override the flags
|
||
provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable,
|
||
on the command line when invoking @command{make}.
|
||
@c See automake bug#14991 for more details about how the following holds.
|
||
It's worth nothing that @command{make distcheck} needs complete control
|
||
over the @command{configure} options @option{--srcdir} and
|
||
@option{--prefix}, so those options cannot be overridden by
|
||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} nor by
|
||
@code{DISTCHECK_CONFIGURE_FLAGS}.
|
||
|
||
Also note that developers are encouraged to strive to make their code
|
||
buildable without requiring any special configure option; thus, in
|
||
general, you shouldn't define @code{AM_DISTCHECK_CONFIGURE_FLAGS}.
|
||
However, there might be few scenarios in which the use of this variable
|
||
is justified.
|
||
GNU @command{m4} offers an example. GNU @command{m4} configures by
|
||
default with its experimental and seldom used "changeword" feature
|
||
disabled; so in its case it is useful to have @command{make distcheck}
|
||
run configure with the @option{--with-changeword} option, to ensure that
|
||
the code for changeword support still compiles correctly.
|
||
GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS}
|
||
variable to stress-test the use of @option{--program-prefix=g}, since at
|
||
one point the @command{m4} build system had a bug where @command{make
|
||
installcheck} was wrongly assuming it could blindly test "@command{m4}",
|
||
rather than the just-installed "@command{gm4}".
|
||
|
||
@trindex distcheck-hook
|
||
@subheading distcheck-hook
|
||
If the @code{distcheck-hook} rule is defined in your top-level
|
||
@file{Makefile.am}, then it will be invoked by @code{distcheck} after
|
||
the new distribution has been unpacked, but before the unpacked copy
|
||
is configured and built. Your @code{distcheck-hook} can do almost
|
||
anything, though as always caution is advised. Generally this hook is
|
||
used to check for potential distribution errors not caught by the
|
||
standard mechanism. Note that @code{distcheck-hook} as well as
|
||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
|
||
are not honored in a subpackage @file{Makefile.am}, but the flags from
|
||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS}
|
||
are passed down to the @command{configure} script of the subpackage.
|
||
|
||
@cindex @samp{make distcleancheck}
|
||
@trindex distcleancheck
|
||
@vindex DISTCLEANFILES
|
||
@vindex distcleancheck_listfiles
|
||
|
||
@subheading distcleancheck
|
||
Speaking of potential distribution errors, @code{distcheck} also
|
||
ensures that the @code{distclean} rule actually removes all built
|
||
files. This is done by running @samp{make distcleancheck} at the end of
|
||
the @code{VPATH} build. By default, @code{distcleancheck} will run
|
||
@code{distclean} and then make sure the build tree has been emptied by
|
||
running @samp{$(distcleancheck_listfiles)}. Usually this check will
|
||
find generated files that you forgot to add to the @code{DISTCLEANFILES}
|
||
variable (@pxref{Clean}).
|
||
|
||
The @code{distcleancheck} behavior should be OK for most packages,
|
||
otherwise you have the possibility to override the definition of
|
||
either the @code{distcleancheck} rule, or the
|
||
@samp{$(distcleancheck_listfiles)} variable. For instance, to disable
|
||
@code{distcleancheck} completely, add the following rule to your
|
||
top-level @file{Makefile.am}:
|
||
|
||
@example
|
||
distcleancheck:
|
||
@@:
|
||
@end example
|
||
|
||
If you want @code{distcleancheck} to ignore built files that have not
|
||
been cleaned because they are also part of the distribution, add the
|
||
following definition instead:
|
||
|
||
@c Keep in sync with distcleancheck.sh
|
||
@example
|
||
distcleancheck_listfiles = \
|
||
find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
|
||
sh '@{@}' ';'
|
||
@end example
|
||
|
||
The above definition is not the default because it's usually an error if
|
||
your Makefiles cause some distributed files to be rebuilt when the user
|
||
build the package. (Think about the user missing the tool required to
|
||
build the file; or if the required tool is built by your package,
|
||
consider the cross-compilation case where it can't be run.) There is
|
||
an entry in the FAQ about this (@pxref{Errors with distclean}), make
|
||
sure you read it before playing with @code{distcleancheck_listfiles}.
|
||
|
||
@cindex @samp{make distuninstallcheck}
|
||
@trindex distuninstallcheck
|
||
@vindex distuninstallcheck_listfiles
|
||
|
||
@subheading distuninstallcheck
|
||
@code{distcheck} also checks that the @code{uninstall} rule works
|
||
properly, both for ordinary and @code{DESTDIR} builds. It does this
|
||
by invoking @samp{make uninstall}, and then it checks the install tree
|
||
to see if any files are left over. This check will make sure that you
|
||
correctly coded your @code{uninstall}-related rules.
|
||
|
||
By default, the checking is done by the @code{distuninstallcheck} rule,
|
||
and the list of files in the install tree is generated by
|
||
@samp{$(distuninstallcheck_listfiles)} (this is a variable whose value is
|
||
a shell command to run that prints the list of files to stdout).
|
||
|
||
Either of these can be overridden to modify the behavior of
|
||
@code{distcheck}. For instance, to disable this check completely, you
|
||
would write:
|
||
|
||
@example
|
||
distuninstallcheck:
|
||
@@:
|
||
@end example
|
||
|
||
@node The Types of Distributions
|
||
@section The Types of Distributions
|
||
|
||
Automake generates rules to provide archives of the project for
|
||
distributions in various formats. Their targets are:
|
||
|
||
@table @asis
|
||
@item @code{dist-gzip}
|
||
Generate a @samp{gzip} tar archive of the distribution. This is the
|
||
only format enabled by default.
|
||
@trindex dist-gzip
|
||
|
||
@vindex BZIP2
|
||
@item @code{dist-bzip2}
|
||
Generate a @samp{bzip2} tar archive of the distribution. bzip2 archives
|
||
are frequently smaller than gzipped archives.
|
||
By default, this rule makes @samp{bzip2} use a compression option of @option{-9}.
|
||
To make it use a different one, set the @env{BZIP2} environment variable.
|
||
For example, @samp{make dist-bzip2 BZIP2=-7}.
|
||
@trindex dist-bzip2
|
||
|
||
@item @code{dist-lzip}
|
||
Generate an @samp{lzip} tar archive of the distribution. @command{lzip}
|
||
archives are frequently smaller than @command{bzip2}-compressed archives.
|
||
@trindex dist-lzip
|
||
|
||
@vindex XZ_OPT
|
||
@item @code{dist-xz}
|
||
Generate an @samp{xz} tar archive of the distribution. @command{xz}
|
||
archives are frequently smaller than @command{bzip2}-compressed archives.
|
||
By default, this rule makes @samp{xz} use a compression option of
|
||
@option{-e}. To make it use a different one, set the @env{XZ_OPT}
|
||
environment variable. For example, run this command to use the
|
||
default compression ratio, but with a progress indicator:
|
||
@samp{make dist-xz XZ_OPT=-ve}.
|
||
@trindex dist-xz
|
||
|
||
@item @code{dist-zip}
|
||
Generate a @samp{zip} archive of the distribution.
|
||
@trindex dist-zip
|
||
|
||
@item @code{dist-tarZ}
|
||
Generate a tar archive of the distribution, compressed with the
|
||
historical (and obsolescent) program @command{compress}. This
|
||
option is deprecated, and it and the corresponding functionality
|
||
will be removed altogether in Automake 2.0.
|
||
@trindex dist-tarZ
|
||
|
||
@item @code{dist-shar}
|
||
Generate a @samp{shar} archive of the distribution. This format
|
||
archive is obsolescent, and use of this option is deprecated.
|
||
It and the corresponding functionality will be removed altogether
|
||
in Automake 2.0.
|
||
@trindex dist-shar
|
||
|
||
@end table
|
||
|
||
The rule @code{dist} (and its historical synonym @code{dist-all})
|
||
will create archives in all the enabled formats (@pxref{List of
|
||
Automake options} for how to change this list). By default, only
|
||
the @code{dist-gzip} target is hooked to @code{dist}.
|
||
|
||
|
||
@node Tests
|
||
@chapter Support for test suites
|
||
|
||
@cindex Test suites
|
||
@cindex @code{make check}
|
||
@trindex check
|
||
|
||
Automake can generate code to handle two kinds of test suites. One is
|
||
based on integration with the @command{dejagnu} framework. The other
|
||
(and most used) form is based on the use of generic test scripts, and
|
||
its activation is triggered by the definition of the special @code{TESTS}
|
||
variable. This second form allows for various degrees of sophistication
|
||
and customization; in particular, it allows for concurrent execution
|
||
of test scripts, use of established test protocols such as TAP, and
|
||
definition of custom test drivers and test runners.
|
||
|
||
@noindent
|
||
In either case, the testsuite is invoked via @samp{make check}.
|
||
|
||
@menu
|
||
* Generalities about Testing:: Concepts and terminology about testing
|
||
* Simple Tests:: Listing test scripts in @code{TESTS}
|
||
* Custom Test Drivers:: Writing and using custom test drivers
|
||
* Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
|
||
* DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework
|
||
* Install Tests:: Running tests on installed packages
|
||
@end menu
|
||
|
||
@node Generalities about Testing
|
||
@section Generalities about Testing
|
||
|
||
The purpose of testing is to determine whether a program or system behaves
|
||
as expected (e.g., known inputs produce the expected outputs, error
|
||
conditions are correctly handled or reported, and older bugs do not
|
||
resurface).
|
||
|
||
@cindex test case
|
||
The minimal unit of testing is usually called @emph{test case}, or simply
|
||
@emph{test}. How a test case is defined or delimited, and even what
|
||
exactly @emph{constitutes} a test case, depends heavily on the testing
|
||
paradigm and/or framework in use, so we won't attempt any more precise
|
||
definition. The set of the test cases for a given program or system
|
||
constitutes its @emph{testsuite}.
|
||
|
||
@cindex test harness
|
||
@cindex testsuite harness
|
||
A @emph{test harness} (also @emph{testsuite harness}) is a program or
|
||
software component that executes all (or part of) the defined test cases,
|
||
analyzes their outcomes, and report or register these outcomes
|
||
appropriately. Again, the details of how this is accomplished (and how
|
||
the developer and user can influence it or interface with it) varies
|
||
wildly, and we'll attempt no precise definition.
|
||
|
||
@cindex test pass
|
||
@cindex test failure
|
||
A test is said to @emph{pass} when it can determine that the condition or
|
||
behaviour it means to verify holds, and is said to @emph{fail} when it can
|
||
determine that such condition of behaviour does @emph{not} hold.
|
||
|
||
@cindex test skip
|
||
Sometimes, tests can rely on non-portable tools or prerequisites, or
|
||
simply make no sense on a given system (for example, a test checking a
|
||
Windows-specific feature makes no sense on a GNU/Linux system). In this
|
||
case, accordingly to the definition above, the tests can neither be
|
||
considered passed nor failed; instead, they are @emph{skipped} -- i.e.,
|
||
they are not run, or their result is anyway ignored for what concerns
|
||
the count of failures an successes. Skips are usually explicitly
|
||
reported though, so that the user will be aware that not all of the
|
||
testsuite has really run.
|
||
|
||
@cindex xfail
|
||
@cindex expected failure
|
||
@cindex expected test failure
|
||
@cindex xpass
|
||
@cindex unexpected pass
|
||
@cindex unexpected test pass
|
||
It's not uncommon, especially during early development stages, that some
|
||
tests fail for known reasons, and that the developer doesn't want to
|
||
tackle these failures immediately (this is especially true when the
|
||
failing tests deal with corner cases). In this situation, the better
|
||
policy is to declare that each of those failures is an @emph{expected
|
||
failure} (or @emph{xfail}). In case a test that is expected to fail ends
|
||
up passing instead, many testing environments will flag the result as a
|
||
special kind of failure called @emph{unexpected pass} (or @emph{xpass}).
|
||
|
||
@cindex hard error
|
||
@cindex Distinction between errors and failures in testsuites
|
||
Many testing environments and frameworks distinguish between test failures
|
||
and hard errors. As we've seen, a test failure happens when some invariant
|
||
or expected behaviour of the software under test is not met. An @emph{hard
|
||
error} happens when e.g., the set-up of a test case scenario fails, or when
|
||
some other unexpected or highly undesirable condition is encountered (for
|
||
example, the program under test experiences a segmentation fault).
|
||
|
||
@node Simple Tests
|
||
@section Simple Tests
|
||
|
||
@menu
|
||
* Scripts-based Testsuites:: Automake-specific concepts and terminology
|
||
* Serial Test Harness:: Older (and discouraged) serial test harness
|
||
* Parallel Test Harness:: Generic concurrent test harness
|
||
@end menu
|
||
|
||
@node Scripts-based Testsuites
|
||
@subsection Scripts-based Testsuites
|
||
|
||
If the special variable @code{TESTS} is defined, its value is taken to be
|
||
a list of programs or scripts to run in order to do the testing. Under
|
||
the appropriate circumstances, it's possible for @code{TESTS} to list
|
||
also data files to be passed to one or more test scripts defined by
|
||
different means (the so-called ``log compilers'', @pxref{Parallel Test
|
||
Harness}).
|
||
|
||
Test scripts can be executed serially or concurrently. Automake supports
|
||
both these kinds of test execution, with the parallel test harness being
|
||
the default. The concurrent test harness relies on the concurrence
|
||
capabilities (if any) offered by the underlying @command{make}
|
||
implementation, and can thus only be as good as those are.
|
||
|
||
By default, only the exit statuses of the test scripts are considered when
|
||
determining the testsuite outcome. But Automake allows also the use of
|
||
more complex test protocols, either standard (@pxref{Using the TAP test
|
||
protocol}) or custom (@pxref{Custom Test Drivers}). Note that you can't
|
||
enable such protocols when the serial harness is used, though.
|
||
In the rest of this section we are going to concentrate mostly on
|
||
protocol-less tests, since we cover test protocols in a later section
|
||
(again, @pxref{Custom Test Drivers}).
|
||
|
||
@cindex Exit status 77, special interpretation
|
||
@cindex Exit status 99, special interpretation
|
||
When no test protocol is in use, an exit status of 0 from a test script will
|
||
denote a success, an exit status of 77 a skipped test, an exit status of 99
|
||
an hard error, and any other exit status will denote a failure.
|
||
|
||
@cindex Tests, expected failure
|
||
@cindex Expected test failure
|
||
@vindex XFAIL_TESTS
|
||
@vindex DISABLE_HARD_ERRORS
|
||
@cindex Disabling hard errors
|
||
You may define the variable @code{XFAIL_TESTS} to a list of tests
|
||
(usually a subset of @code{TESTS}) that are expected to fail; this will
|
||
effectively reverse the result of those tests (with the provision that
|
||
skips and hard errors remain untouched). You may also instruct the
|
||
testsuite harness to treat hard errors like simple failures, by defining
|
||
the @code{DISABLE_HARD_ERRORS} make variable to a nonempty value.
|
||
|
||
Note however that, for tests based on more complex test protocols,
|
||
the exact effects of @code{XFAIL_TESTS} and @code{DISABLE_HARD_ERRORS}
|
||
might change, or they might even have no effect at all (for example,
|
||
@c Keep this in sync with tap-no-disable-hard-errors.sh
|
||
in tests using TAP, there is not way to disable hard errors, and the
|
||
@code{DISABLE_HARD_ERRORS} variable has no effect on them).
|
||
|
||
@anchor{Testsuite progress on console}
|
||
@cindex Testsuite progress on console
|
||
The result of each test case run by the scripts in @code{TESTS} will be
|
||
printed on standard output, along with the test name. For test protocols
|
||
that allow more test cases per test script (such as TAP), a number,
|
||
identifier and/or brief description specific for the single test case is
|
||
expected to be printed in addition to the name of the test script. The
|
||
possible results (whose meanings should be clear from the previous
|
||
@ref{Generalities about Testing}) are @code{PASS}, @code{FAIL},
|
||
@code{SKIP}, @code{XFAIL}, @code{XPASS} and @code{ERROR}. Here is an
|
||
example of output from an hypothetical testsuite that uses both plain
|
||
and TAP tests:
|
||
@c Keep in sync with tap-doc.sh
|
||
@example
|
||
PASS: foo.sh
|
||
PASS: zardoz.tap 1 - Daemon started
|
||
PASS: zardoz.tap 2 - Daemon responding
|
||
SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted
|
||
PASS: zardoz.tap 4 - Daemon stopped
|
||
SKIP: bar.sh
|
||
PASS: mu.tap 1
|
||
XFAIL: mu.tap 2 # TODO frobnication not yet implemented
|
||
@end example
|
||
|
||
@noindent
|
||
A testsuite summary (expected to report at least the number of run,
|
||
skipped and failed tests) will be printed at the end of the testsuite
|
||
run.
|
||
|
||
@anchor{Simple tests and color-tests}
|
||
@vindex AM_COLOR_TESTS
|
||
@cindex Colorized testsuite output
|
||
If the standard output is connected to a capable terminal, then the test
|
||
results and the summary are colored appropriately. The developer and the
|
||
user can disable colored output by setting the @command{make} variable
|
||
@samp{AM_COLOR_TESTS=no}; the user can in addition force colored output
|
||
even without a connecting terminal with @samp{AM_COLOR_TESTS=always}.
|
||
It's also worth noting that some @command{make} implementations,
|
||
when used in parallel mode, have slightly different semantics
|
||
(@pxref{Parallel make,,, autoconf, The Autoconf Manual}), which can
|
||
break the automatic detection of a connection to a capable terminal.
|
||
If this is the case, the user will have to resort to the use of
|
||
@samp{AM_COLOR_TESTS=always} in order to have the testsuite output
|
||
colorized.
|
||
|
||
Test programs that need data files should look for them in @code{srcdir}
|
||
(which is both a make variable and an environment variable made available
|
||
to the tests), so that they work when building in a separate directory
|
||
(@pxref{Build Directories, , Build Directories , autoconf,
|
||
The Autoconf Manual}), and in particular for the @code{distcheck} rule
|
||
(@pxref{Checking the Distribution}).
|
||
|
||
@vindex TESTS
|
||
@vindex TESTS_ENVIRONMENT
|
||
@vindex AM_TESTS_ENVIRONMENT
|
||
The @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables can
|
||
be used to run initialization code and set environment variables for the
|
||
test scripts. The former variable is developer-reserved, and can be
|
||
defined in the @file{Makefile.am}, while the latter is reserved for the
|
||
user, which can employ it to extend or override the settings in the
|
||
former; for this to work portably, however, the contents of a non-empty
|
||
@code{AM_TESTS_ENVIRONMENT} @emph{must} be terminated by a semicolon.
|
||
|
||
@vindex AM_TESTS_FD_REDIRECT
|
||
The @code{AM_TESTS_FD_REDIRECT} variable can be used to define file
|
||
descriptor redirections for the test scripts. One might think that
|
||
@code{AM_TESTS_ENVIRONMENT} could be used for this purpose, but experience
|
||
has shown that doing so portably is practically impossible. The main
|
||
hurdle is constituted by Korn shells, which usually set the close-on-exec
|
||
flag on file descriptors opened with the @command{exec} builtin, thus
|
||
rendering an idiom like @code{AM_TESTS_ENVIRONMENT = exec 9>&2;}
|
||
ineffectual. This issue also affects some Bourne shells, such as the
|
||
HP-UX's @command{/bin/sh},
|
||
|
||
@c Keep in sync with tests-environment-backcompat.sh
|
||
@example
|
||
AM_TESTS_ENVIRONMENT = \
|
||
## Some environment initializations are kept in a separate shell
|
||
## file 'tests-env.sh', which can make it easier to also run tests
|
||
## from the command line.
|
||
. $(srcdir)/tests-env.sh; \
|
||
## On Solaris, prefer more POSIX-compliant versions of the standard
|
||
## tools by default.
|
||
if test -d /usr/xpg4/bin; then \
|
||
PATH=/usr/xpg4/bin:$$PATH; export PATH; \
|
||
fi;
|
||
@c $$ restore font-lock
|
||
## With this, the test scripts will be able to print diagnostic
|
||
## messages to the original standard error stream, even if the test
|
||
## driver redirects the stderr of the test scripts to a log file
|
||
## before executing them.
|
||
AM_TESTS_FD_REDIRECT = 9>&2
|
||
@end example
|
||
|
||
@noindent
|
||
Note however that @code{AM_TESTS_ENVIRONMENT} is, for historical and
|
||
implementation reasons, @emph{not} supported by the serial harness
|
||
(@pxref{Serial Test Harness}).
|
||
|
||
Automake ensures that each file listed in @code{TESTS} is built before
|
||
it is run; you can list both source and derived programs (or scripts)
|
||
in @code{TESTS}; the generated rule will look both in @code{srcdir} and
|
||
@file{.}. For instance, you might want to run a C program as a test.
|
||
To do this you would list its name in @code{TESTS} and also in
|
||
@code{check_PROGRAMS}, and then specify it as you would any other
|
||
program.
|
||
|
||
Programs listed in @code{check_PROGRAMS} (and @code{check_LIBRARIES},
|
||
@code{check_LTLIBRARIES}...) are only built during @code{make check},
|
||
not during @code{make all}. You should list there any program needed
|
||
by your tests that does not need to be built by @code{make all}. Note
|
||
that @code{check_PROGRAMS} are @emph{not} automatically added to
|
||
@code{TESTS} because @code{check_PROGRAMS} usually lists programs used
|
||
by the tests, not the tests themselves. Of course you can set
|
||
@code{TESTS = $(check_PROGRAMS)} if all your programs are test cases.
|
||
|
||
@node Serial Test Harness
|
||
@subsection Older (and discouraged) serial test harness
|
||
@cindex @option{serial-tests}, Using
|
||
|
||
First, note that today the use of this harness is strongly discouraged in
|
||
favour of the parallel test harness (@pxref{Parallel Test Harness}).
|
||
Still, there are @emph{few} situations when the advantages offered by
|
||
the parallel harness are irrelevant, and when test concurrency can
|
||
even cause tricky problems. In those cases, it might make sense to
|
||
still use the serial harness, for simplicity and reliability (we still
|
||
suggest trying to give the parallel harness a shot though).
|
||
|
||
The serial test harness is enabled by the Automake option
|
||
@option{serial-tests}. It operates by simply running the tests serially,
|
||
one at the time, without any I/O redirection. It's up to the user to
|
||
implement logging of tests' output, if that's required or desired.
|
||
|
||
For historical and implementation reasons, the @code{AM_TESTS_ENVIRONMENT}
|
||
variable is @emph{not} supported by this harness (it will be silently
|
||
ignored if defined); only @code{TESTS_ENVIRONMENT} is, and it is to be
|
||
considered a developer-reserved variable. This is done so that, when
|
||
using the serial harness, @code{TESTS_ENVIRONMENT} can be defined to an
|
||
invocation of an interpreter through which the tests are to be run.
|
||
For instance, the following setup may be used to run tests with Perl:
|
||
|
||
@example
|
||
TESTS_ENVIRONMENT = $(PERL) -Mstrict -w
|
||
TESTS = foo.pl bar.pl baz.pl
|
||
@end example
|
||
|
||
@noindent
|
||
It's important to note that the use of @code{TESTS_ENVIRONMENT} endorsed
|
||
here would be @emph{invalid} with the parallel harness. That harness
|
||
provides a more elegant way to achieve the same effect, with the further
|
||
benefit of freeing the @code{TESTS_ENVIRONMENT} variable for the user
|
||
(@pxref{Parallel Test Harness}).
|
||
|
||
Another, less serious limit of the serial harness is that it doesn't
|
||
really distinguish between simple failures and hard errors; this is
|
||
due to historical reasons only, and might be fixed in future Automake
|
||
versions.
|
||
|
||
@node Parallel Test Harness
|
||
@subsection Parallel Test Harness
|
||
|
||
By default, Automake generated a parallel (concurrent) test harness. It
|
||
features automatic collection of the test scripts output in @file{.log}
|
||
files, concurrent execution of tests with @code{make -j}, specification
|
||
of inter-test dependencies, lazy reruns of tests that have not completed
|
||
in a prior run, and hard errors for exceptional failures.
|
||
|
||
@anchor{Basics of test metadata}
|
||
@vindex TEST_SUITE_LOG
|
||
@vindex TESTS
|
||
@cindex @file{.log} files
|
||
@cindex @file{.trs} files
|
||
@cindex test metadata
|
||
The parallel test harness operates by defining a set of @command{make}
|
||
rules that run the test scripts listed in @code{TESTS}, and, for each
|
||
such script, save its output in a corresponding @file{.log} file and
|
||
its results (and other ``metadata'', @pxref{API for Custom Test Drivers})
|
||
in a corresponding @file{.trs} (as in @b{T}est @b{R}e@b{S}ults) file.
|
||
@c We choose the '.trs' extension also because, at the time of writing,
|
||
@c it isn't already used for other significant purposes; see e.g.:
|
||
@c - http://filext.com/file-extension/trs
|
||
@c - http://www.file-extensions.org/search/?searchstring=trs
|
||
The @file{.log} file will contain all the output emitted by the test on
|
||
its standard output and its standard error. The @file{.trs} file will
|
||
contain, among the other things, the results of the test cases run by
|
||
the script.
|
||
|
||
The parallel test harness will also create a summary log file,
|
||
@code{TEST_SUITE_LOG}, which defaults to @file{test-suite.log} and requires
|
||
a @file{.log} suffix. This file depends upon all the @file{.log} and
|
||
@file{.trs} files created for the test scripts listed in @code{TESTS}.
|
||
|
||
@vindex VERBOSE
|
||
As with the serial harness above, by default one status line is printed
|
||
per completed test, and a short summary after the suite has completed.
|
||
However, standard output and standard error of the test are redirected
|
||
to a per-test log file, so that parallel execution does not produce
|
||
intermingled output. The output from failed tests is collected in the
|
||
@file{test-suite.log} file. If the variable @samp{VERBOSE} is set, this
|
||
file is output after the summary.
|
||
|
||
@vindex TEST_EXTENSIONS
|
||
@vindex TEST_LOGS
|
||
Each couple of @file{.log} and @file{.trs} files is created when the
|
||
corresponding test has completed. The set of log files is listed in
|
||
the read-only variable @code{TEST_LOGS}, and defaults to @code{TESTS},
|
||
with the executable extension if any (@pxref{EXEEXT}), as well as any
|
||
suffix listed in @code{TEST_EXTENSIONS} removed, and @file{.log} appended.
|
||
Results are undefined if a test file name ends in several concatenated
|
||
suffixes. @code{TEST_EXTENSIONS} defaults to @file{.test}; it can be
|
||
overridden by the user, in which case any extension listed in it must be
|
||
constituted by a dot, followed by a non-digit alphabetic character,
|
||
followed by any number of alphabetic characters.
|
||
@c Keep in sync with test-extensions.sh
|
||
For example, @samp{.sh}, @samp{.T} and @samp{.t1} are valid extensions,
|
||
while @samp{.x-y}, @samp{.6c} and @samp{.t.1} are not.
|
||
|
||
@cindex Configure substitutions in @code{TESTS}
|
||
It is important to note that, due to current limitations (unlikely to be
|
||
lifted), configure substitutions in the definition of @code{TESTS} can
|
||
only work if they will expand to a list of tests that have a suffix listed
|
||
in @code{TEST_EXTENSIONS}.
|
||
|
||
@vindex _LOG_COMPILE
|
||
@vindex _LOG_COMPILER
|
||
@vindex _LOG_FLAGS
|
||
@vindex LOG_COMPILE
|
||
@vindex LOG_COMPILER
|
||
@vindex LOG_FLAGS
|
||
@vindex @var{ext}_LOG_COMPILE
|
||
@vindex @var{ext}_LOG_COMPILER
|
||
@vindex @var{ext}_LOG_FLAGS
|
||
@vindex AM_@var{ext}_LOG_FLAGS
|
||
@vindex AM_LOG_FLAGS
|
||
For tests that match an extension @code{.@var{ext}} listed in
|
||
@code{TEST_EXTENSIONS}, you can provide a custom ``test runner'' using
|
||
the variable @code{@var{ext}_LOG_COMPILER} (note the upper-case
|
||
extension) and pass options in @code{AM_@var{ext}_LOG_FLAGS} and allow
|
||
the user to pass options in @code{@var{ext}_LOG_FLAGS}. It will cause
|
||
all tests with this extension to be called with this runner. For all
|
||
tests without a registered extension, the variables @code{LOG_COMPILER},
|
||
@code{AM_LOG_FLAGS}, and @code{LOG_FLAGS} may be used. For example,
|
||
|
||
@c Keep in sync with parallel-tests-log-compiler-example.sh
|
||
@example
|
||
TESTS = foo.pl bar.py baz
|
||
TEST_EXTENSIONS = .pl .py
|
||
PL_LOG_COMPILER = $(PERL)
|
||
AM_PL_LOG_FLAGS = -w
|
||
PY_LOG_COMPILER = $(PYTHON)
|
||
AM_PY_LOG_FLAGS = -v
|
||
LOG_COMPILER = ./wrapper-script
|
||
AM_LOG_FLAGS = -d
|
||
@end example
|
||
|
||
@noindent
|
||
will invoke @samp{$(PERL) -w foo.pl}, @samp{$(PYTHON) -v bar.py},
|
||
and @samp{./wrapper-script -d baz} to produce @file{foo.log},
|
||
@file{bar.log}, and @file{baz.log}, respectively. The @file{foo.trs},
|
||
@file{bar.trs} and @file{baz.trs} files will be automatically produced
|
||
as a side-effect.
|
||
|
||
It's important to note that, differently from what we've seen for the
|
||
serial test harness (@pxref{Serial Test Harness}), the
|
||
@code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables
|
||
@emph{cannot} be use to define a custom test runner; the
|
||
@code{LOG_COMPILER} and @code{LOG_FLAGS} (or their extension-specific
|
||
counterparts) should be used instead:
|
||
|
||
@example
|
||
## This is WRONG!
|
||
AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib' $(PERL) -Mstrict -w
|
||
@end example
|
||
|
||
@example
|
||
## Do this instead.
|
||
AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib'; export PERL5LIB;
|
||
LOG_COMPILER = $(PERL)
|
||
AM_LOG_FLAGS = -Mstrict -w
|
||
@end example
|
||
|
||
By default, the test suite harness will run all tests, but there are
|
||
several ways to limit the set of tests that are run:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
You can set the @code{TESTS} variable. For example, you can use a
|
||
command like this to run only a subset of the tests:
|
||
|
||
@example
|
||
env TESTS="foo.test bar.test" make -e check
|
||
@end example
|
||
|
||
Note however that the command above will unconditionally overwrite the
|
||
@file{test-suite.log} file, thus clobbering the recorded results
|
||
of any previous testsuite run. This might be undesirable for packages
|
||
whose testsuite takes long time to execute. Luckily, this problem can
|
||
easily be avoided by overriding also @code{TEST_SUITE_LOG} at runtime;
|
||
for example,
|
||
|
||
@c Keep in sync with parallel-tests-log-override-2.sh
|
||
@example
|
||
env TEST_SUITE_LOG=partial.log TESTS="..." make -e check
|
||
@end example
|
||
|
||
will write the result of the partial testsuite runs to the
|
||
@file{partial.log}, without touching @file{test-suite.log}.
|
||
|
||
@item
|
||
You can set the @code{TEST_LOGS} variable. By default, this variable is
|
||
computed at @command{make} run time from the value of @code{TESTS} as
|
||
described above. For example, you can use the following:
|
||
|
||
@example
|
||
set x subset*.log; shift
|
||
env TEST_LOGS="foo.log $*" make -e check
|
||
@end example
|
||
|
||
The comments made above about @code{TEST_SUITE_LOG} overriding applies
|
||
here too.
|
||
|
||
@item
|
||
@vindex RECHECK_LOGS
|
||
@cindex lazy test execution
|
||
By default, the test harness removes all old per-test @file{.log} and
|
||
@file{.trs} files before it starts running tests to regenerate them. The
|
||
variable @code{RECHECK_LOGS} contains the set of @file{.log} (and, by
|
||
implication, @file{.trs}) files which are removed. @code{RECHECK_LOGS}
|
||
defaults to @code{TEST_LOGS}, which means all tests need to be rechecked.
|
||
By overriding this variable, you can choose which tests need to be
|
||
reconsidered. For example, you can lazily rerun only those tests which
|
||
are outdated, i.e., older than their prerequisite test files, by setting
|
||
this variable to the empty value:
|
||
|
||
@example
|
||
env RECHECK_LOGS= make -e check
|
||
@end example
|
||
|
||
@item
|
||
@trindex recheck
|
||
You can ensure that all tests are rerun which have failed or passed
|
||
unexpectedly, by running @code{make recheck} in the test directory.
|
||
This convenience target will set @code{RECHECK_LOGS} appropriately
|
||
before invoking the main test harness.
|
||
@end itemize
|
||
|
||
@noindent
|
||
In order to guarantee an ordering between tests even with @code{make
|
||
-j@var{N}}, dependencies between the corresponding @file{.log} files
|
||
may be specified through usual @command{make} dependencies. For example,
|
||
the following snippet lets the test named @file{foo-execute.test} depend
|
||
upon completion of the test @file{foo-compile.test}:
|
||
|
||
@example
|
||
TESTS = foo-compile.test foo-execute.test
|
||
foo-execute.log: foo-compile.log
|
||
@end example
|
||
|
||
@noindent
|
||
Please note that this ordering ignores the @emph{results} of required
|
||
tests, thus the test @file{foo-execute.test} is run even if the test
|
||
@file{foo-compile.test} failed or was skipped beforehand. Further,
|
||
please note that specifying such dependencies currently works only for
|
||
tests that end in one of the suffixes listed in @code{TEST_EXTENSIONS}.
|
||
|
||
Tests without such specified dependencies may be run concurrently with
|
||
parallel @command{make -j@var{N}}, so be sure they are prepared for
|
||
concurrent execution.
|
||
|
||
@cindex Unit tests
|
||
@c Keep in sync with 'parallel-tests-extra-programs.sh'.
|
||
The combination of lazy test execution and correct dependencies between
|
||
tests and their sources may be exploited for efficient unit testing
|
||
during development. To further speed up the edit-compile-test cycle, it
|
||
may even be useful to specify compiled programs in @code{EXTRA_PROGRAMS}
|
||
instead of with @code{check_PROGRAMS}, as the former allows intertwined
|
||
compilation and test execution (but note that @code{EXTRA_PROGRAMS} are
|
||
not cleaned automatically, @pxref{Uniform}).
|
||
|
||
The variables @code{TESTS} and @code{XFAIL_TESTS} may contain
|
||
conditional parts as well as configure substitutions. In the latter
|
||
case, however, certain restrictions apply: substituted test names
|
||
must end with a nonempty test suffix like @file{.test}, so that one of
|
||
the inference rules generated by @command{automake} can apply. For
|
||
literal test names, @command{automake} can generate per-target rules
|
||
to avoid this limitation.
|
||
|
||
Please note that it is currently not possible to use @code{$(srcdir)/}
|
||
or @code{$(top_srcdir)/} in the @code{TESTS} variable. This technical
|
||
limitation is necessary to avoid generating test logs in the source tree
|
||
and has the unfortunate consequence that it is not possible to specify
|
||
distributed tests that are themselves generated by means of explicit
|
||
rules, in a way that is portable to all @command{make} implementations
|
||
(@pxref{Make Target Lookup,,, autoconf, The Autoconf Manual}, the
|
||
semantics of FreeBSD and OpenBSD @command{make} conflict with this).
|
||
In case of doubt you may want to require to use GNU @command{make},
|
||
or work around the issue with inference rules to generate the tests.
|
||
|
||
@node Custom Test Drivers
|
||
@section Custom Test Drivers
|
||
|
||
@menu
|
||
* Overview of Custom Test Drivers Support::
|
||
* Declaring Custom Test Drivers::
|
||
* API for Custom Test Drivers::
|
||
@end menu
|
||
|
||
@node Overview of Custom Test Drivers Support
|
||
@subsection Overview of Custom Test Drivers Support
|
||
|
||
Starting from Automake version 1.12, the parallel test harness allows
|
||
the package authors to use third-party custom test drivers, in case the
|
||
default ones are inadequate for their purposes, or do not support their
|
||
testing protocol of choice.
|
||
|
||
A custom test driver is expected to properly run the test programs passed
|
||
to it (including the command-line arguments passed to those programs, if
|
||
any), to analyze their execution and outcome, to create the @file{.log}
|
||
and @file{.trs} files associated to these test runs, and to display the test
|
||
results on the console. It is responsibility of the author of the test
|
||
driver to ensure that it implements all the above steps meaningfully and
|
||
correctly; Automake isn't and can't be of any help here. On the other
|
||
hand, the Automake-provided code for testsuite summary generation offers
|
||
support for test drivers allowing several test results per test script,
|
||
if they take care to register such results properly (@pxref{Log files
|
||
generation and test results recording}).
|
||
|
||
The exact details of how test scripts' results are to be determined and
|
||
analyzed is left to the individual drivers. Some drivers might only
|
||
consider the test script exit status (this is done for example by the
|
||
default test driver used by the parallel test harness, described
|
||
in the previous section). Other drivers might implement more complex and
|
||
advanced test protocols, which might require them to parse and interpreter
|
||
the output emitted by the test script they're running (examples of such
|
||
protocols are TAP and SubUnit).
|
||
|
||
It's very important to note that, even when using custom test drivers,
|
||
most of the infrastructure described in the previous section about the
|
||
parallel harness remains in place; this includes:
|
||
|
||
@itemize
|
||
@item
|
||
list of test scripts defined in @code{TESTS}, and overridable at
|
||
runtime through the redefinition of @code{TESTS} or @code{TEST_LOGS};
|
||
@item
|
||
concurrency through the use of @command{make}'s option @option{-j};
|
||
@item
|
||
per-test @file{.log} and @file{.trs} files, and generation of a summary
|
||
@file{.log} file from them;
|
||
@item
|
||
@code{recheck} target, @code{RECHECK_LOGS} variable, and lazy reruns
|
||
of tests;
|
||
@item
|
||
inter-test dependencies;
|
||
@item
|
||
support for @code{check_*} variables (@code{check_PROGRAMS},
|
||
@code{check_LIBRARIES}, ...);
|
||
@item
|
||
use of @code{VERBOSE} environment variable to get verbose output on
|
||
testsuite failures;
|
||
@item
|
||
definition and honoring of @code{TESTS_ENVIRONMENT},
|
||
@code{AM_TESTS_ENVIRONMENT} and @code{AM_TESTS_FD_REDIRECT}
|
||
variables;
|
||
@item
|
||
definition of generic and extension-specific @code{LOG_COMPILER} and
|
||
@code{LOG_FLAGS} variables.
|
||
@end itemize
|
||
|
||
@noindent
|
||
On the other hand, the exact semantics of how (and if) testsuite output
|
||
colorization, @code{XFAIL_TESTS}, and hard errors are supported and
|
||
handled is left to the individual test drivers.
|
||
|
||
@c TODO: We should really add a working example in the doc/ directory,
|
||
@c TODO: and reference if from here.
|
||
|
||
@node Declaring Custom Test Drivers
|
||
@subsection Declaring Custom Test Drivers
|
||
|
||
@vindex _LOG_DRIVER
|
||
@vindex _LOG_DRIVER_FLAGS
|
||
@vindex LOG_DRIVER
|
||
@vindex LOG_DRIVER_FLAGS
|
||
@vindex @var{ext}_LOG_DRIVER
|
||
@vindex @var{ext}_LOG_DRIVER_FLAGS
|
||
@vindex AM_@var{ext}_LOG_DRIVER_FLAGS
|
||
@vindex AM_LOG_DRIVER_FLAGS
|
||
Custom testsuite drivers are declared by defining the make variables
|
||
@code{LOG_DRIVER} or @code{@var{ext}_LOG_DRIVER} (where @var{ext} must
|
||
be declared in @code{TEST_EXTENSIONS}). They must be defined to
|
||
programs or scripts that will be used to drive the execution, logging,
|
||
and outcome report of the tests with corresponding extensions (or of
|
||
those with no registered extension in the case of @code{LOG_DRIVER}).
|
||
Clearly, multiple distinct test drivers can be declared in the same
|
||
@file{Makefile.am}. Note moreover that the @code{LOG_DRIVER} variables
|
||
are @emph{not} a substitute for the @code{LOG_COMPILER} variables: the
|
||
two sets of variables can, and often do, usefully and legitimately
|
||
coexist.
|
||
|
||
@c TODO: We should really be able to point to a clarifying example here!
|
||
|
||
The developer-reserved variable @code{AM_LOG_DRIVER_FLAGS} and the
|
||
user-reserved variable @code{LOG_DRIVER_FLAGS} can be used to define
|
||
flags that will be passed to each invocation of @code{LOG_DRIVER},
|
||
with the user-defined flags obviously taking precedence over the
|
||
developer-reserved ones. Similarly, for each extension @var{ext}
|
||
declared in @code{TEST_EXTENSIONS}, flags listed in
|
||
@code{AM_@var{ext}_LOG_DRIVER_FLAGS} and
|
||
@code{@var{ext}_LOG_DRIVER_FLAGS} will be passed to
|
||
invocations of @code{@var{ext}_LOG_DRIVER}.
|
||
|
||
@node API for Custom Test Drivers
|
||
@subsection API for Custom Test Drivers
|
||
|
||
Note that @emph{the APIs described here are still highly experimental},
|
||
and will very likely undergo tightenings and likely also extensive changes
|
||
in the future, to accommodate for new features or to satisfy additional
|
||
portability requirements.
|
||
|
||
The main characteristic of these APIs is that they are designed to share
|
||
as much infrastructure, semantics, and implementation details as possible
|
||
with the parallel test harness and its default driver.
|
||
|
||
@menu
|
||
* Command-line arguments for test drivers::
|
||
* Log files generation and test results recording::
|
||
* Testsuite progress output::
|
||
@end menu
|
||
|
||
@node Command-line arguments for test drivers
|
||
@subsubsection Command-line arguments for test drivers
|
||
|
||
A custom driver can rely on various command-line options and arguments
|
||
being passed to it automatically by the Automake-generated test harness.
|
||
It is @emph{mandatory} that it understands all of them (even if the exact
|
||
interpretation of the associated semantics can legitimately change
|
||
between a test driver and another, and even be a no-op in some drivers).
|
||
|
||
@noindent
|
||
Here is the list of options:
|
||
|
||
@table @option
|
||
@item --test-name=@var{NAME}
|
||
The name of the test, with VPATH prefix (if any) removed. This can have a
|
||
suffix and a directory component (as in e.g., @file{sub/foo.test}), and is
|
||
mostly meant to be used in console reports about testsuite advancements and
|
||
results (@pxref{Testsuite progress output}).
|
||
@item --log-file=@file{@var{PATH}.log}
|
||
The @file{.log} file the test driver must create (@pxref{Basics of
|
||
test metadata}). If it has a directory component (as in e.g.,
|
||
@file{sub/foo.log}), the test harness will ensure that such directory
|
||
exists @emph{before} the test driver is called.
|
||
@item --trs-file=@file{@var{PATH}.trs}
|
||
The @file{.trs} file the test driver must create (@pxref{Basics of
|
||
test metadata}). If it has a directory component (as in e.g.,
|
||
@file{sub/foo.trs}), the test harness will ensure that such directory
|
||
exists @emph{before} the test driver is called.
|
||
@item --color-tests=@{yes|no@}
|
||
Whether the console output should be colorized or not (@pxref{Simple
|
||
tests and color-tests}, to learn when this option gets activated and
|
||
when it doesn't).
|
||
@item --expect-failure=@{yes|no@}
|
||
Whether the tested program is expected to fail.
|
||
@item --enable-hard-errors=@{yes|no@}
|
||
Whether ``hard errors'' in the tested program should be treated differently
|
||
from normal failures or not (the default should be @code{yes}). The exact
|
||
meaning of ``hard error'' is highly dependent from the test protocols or
|
||
conventions in use.
|
||
@item --
|
||
Explicitly terminate the list of options.
|
||
@end table
|
||
|
||
@noindent
|
||
The first non-option argument passed to the test driver is the program to
|
||
be run, and all the following ones are command-line options and arguments
|
||
for this program.
|
||
|
||
Note that the exact semantics attached to the @option{--color-tests},
|
||
@option{--expect-failure} and @option{--enable-hard-errors} options are
|
||
left up to the individual test drivers. Still, having a behaviour
|
||
compatible or at least similar to that provided by the default driver
|
||
is advised, as that would offer a better consistency and a more pleasant
|
||
user experience.
|
||
|
||
@node Log files generation and test results recording
|
||
@subsubsection Log files generation and test results recording
|
||
|
||
The test driver must correctly generate the files specified by the
|
||
@option{--log-file} and @option{--trs-file} option (even when the tested
|
||
program fails or crashes).
|
||
|
||
The @file{.log} file should ideally contain all the output produced by the
|
||
tested program, plus optionally other information that might facilitate
|
||
debugging or analysis of bug reports. Apart from that, its format is
|
||
basically free.
|
||
|
||
The @file{.trs} file is used to register some metadata through the use
|
||
of custom reStructuredText fields. This metadata is expected to be
|
||
employed in various ways by the parallel test harness; for example, to
|
||
count the test results when printing the testsuite summary, or to decide
|
||
which tests to re-run upon @command{make recheck}. Unrecognized metadata
|
||
in a @file{.trs} file is currently ignored by the harness, but this might
|
||
change in the future. The list of currently recognized metadata follows.
|
||
|
||
@table @code
|
||
|
||
@item :test-result:
|
||
@cindex Register test result
|
||
@cindex Register test case result
|
||
@cindex Test result, registering
|
||
@cindex Test case result, registering
|
||
@cindex @code{:test-result:}
|
||
@cindex reStructuredText field, @code{:test-result:}
|
||
The test driver must use this field to register the results of @emph{each}
|
||
test case run by a test script file. Several @code{:test-result:} fields
|
||
can be present in the same @file{.trs} file; this is done in order to
|
||
support test protocols that allow a single test script to run more test
|
||
cases.
|
||
|
||
@c Keep this in sync with lib/am/check-am:$(TEST_SUITE_LOG).
|
||
The only recognized test results are currently @code{PASS}, @code{XFAIL},
|
||
@code{SKIP}, @code{FAIL}, @code{XPASS} and @code{ERROR}. These results,
|
||
when declared with @code{:test-result:}, can be optionally followed by
|
||
text holding the name and/or a brief description of the corresponding
|
||
test; the harness will ignore such extra text when generating
|
||
@file{test-suite.log} and preparing the testsuite summary.
|
||
|
||
@c Keep in sync with 'test-metadata-recheck.sh'.
|
||
@item @code{:recheck:}
|
||
@cindex :recheck:
|
||
@cindex reStructuredText field, @code{:recheck:}
|
||
If this field is present and defined to @code{no}, then the corresponding
|
||
test script will @emph{not} be run upon a @command{make recheck}. What
|
||
happens when two or more @code{:recheck:} fields are present in the same
|
||
@file{.trs} file is undefined behaviour.
|
||
|
||
@c Keep in sync with 'test-metadata-global-log.sh'.
|
||
@item @code{:copy-in-global-log:}
|
||
@cindex :copy-in-global-log:
|
||
@cindex reStructuredText field, @code{:copy-in-global-log:}
|
||
If this field is present and defined to @code{no}, then the content
|
||
of the @file{.log} file will @emph{not} be copied into the global
|
||
@file{test-suite.log}. We allow to forsake such copying because, while
|
||
it can be useful in debugging and analysis of bug report, it can also be
|
||
just a waste of space in normal situations, e.g., when a test script is
|
||
successful. What happens when two or more @code{:copy-in-global-log:}
|
||
fields are present in the same @file{.trs} file is undefined behaviour.
|
||
|
||
@c Keep in sync with 'test-metadata-global-result.sh'.
|
||
@item @code{:test-global-result:}
|
||
@cindex :test-global-result:
|
||
@cindex reStructuredText field, @code{:test-global-result:}
|
||
This is used to declare the "global result" of the script. Currently,
|
||
the value of this field is needed only to be reported (more or less
|
||
verbatim) in the generated global log file @code{$(TEST_SUITE_LOG)},
|
||
so it's quite free-form. For example, a test script which run 10 test
|
||
cases, 6 of which pass and 4 of which are skipped, could reasonably have
|
||
a @code{PASS/SKIP} value for this field, while a test script which run
|
||
19 successful tests and one failed test could have an @code{ALMOST
|
||
PASSED} value. What happens when two or more @code{:test-global-result:}
|
||
fields are present in the same @file{.trs} file is undefined behaviour.
|
||
@end table
|
||
|
||
@noindent
|
||
Let's see a small example. Assume a @file{.trs} file contains the
|
||
following lines:
|
||
|
||
@example
|
||
:test-result: PASS server starts
|
||
:global-log-copy: no
|
||
:test-result: PASS HTTP/1.1 request
|
||
:test-result: FAIL HTTP/1.0 request
|
||
:recheck: yes
|
||
:test-result: SKIP HTTPS request (TLS library wasn't available)
|
||
:test-result: PASS server stops
|
||
@end example
|
||
|
||
@noindent
|
||
Then the corresponding test script will be re-run by @command{make check},
|
||
will contribute with @emph{five} test results to the testsuite summary
|
||
(three of these tests being successful, one failed, and one skipped), and
|
||
the content of the corresponding @file{.log} file will @emph{not} be
|
||
copied in the global log file @file{test-suite.log}.
|
||
|
||
@node Testsuite progress output
|
||
@subsubsection Testsuite progress output
|
||
|
||
A custom test driver also has the task of displaying, on the standard
|
||
output, the test results as soon as they become available. Depending on
|
||
the protocol in use, it can also display the reasons for failures and
|
||
skips, and, more generally, any useful diagnostic output (but remember
|
||
that each line on the screen is precious, so that cluttering the screen
|
||
with overly verbose information is bad idea). The exact format of this
|
||
progress output is left up to the test driver; in fact, a custom test
|
||
driver might @emph{theoretically} even decide not to do any such report,
|
||
leaving it all to the testsuite summary (that would be a very lousy idea,
|
||
of course, and serves only to illustrate the flexibility that is
|
||
granted here).
|
||
|
||
Remember that consistency is good; so, if possible, try to be consistent
|
||
with the output of the built-in Automake test drivers, providing a similar
|
||
``look & feel''. In particular, the testsuite progress output should be
|
||
colorized when the @option{--color-tests} is passed to the driver. On the
|
||
other end, if you are using a known and widespread test protocol with
|
||
well-established implementations, being consistent with those
|
||
implementations' output might be a good idea too.
|
||
|
||
@node Using the TAP test protocol
|
||
@section Using the TAP test protocol
|
||
|
||
@menu
|
||
* Introduction to TAP::
|
||
* Use TAP with the Automake test harness::
|
||
* Incompatibilities with other TAP parsers and drivers::
|
||
* Links and external resources on TAP::
|
||
@end menu
|
||
|
||
@node Introduction to TAP
|
||
@subsection Introduction to TAP
|
||
|
||
TAP, the Test Anything Protocol, is a simple text-based interface between
|
||
testing modules or programs and a test harness. The tests (also called
|
||
``TAP producers'' in this context) write test results in a simple format
|
||
on standard output; a test harness (also called ``TAP consumer'') will
|
||
parse and interpret these results, and properly present them to the user,
|
||
and/or register them for later analysis. The exact details of how this
|
||
is accomplished can vary among different test harnesses. The Automake
|
||
harness will present the results on the console in the usual
|
||
fashion (@pxref{Testsuite progress on console}), and will use the
|
||
@file{.trs} files (@pxref{Basics of test metadata}) to store the test
|
||
results and related metadata. Apart from that, it will try to remain
|
||
as much compatible as possible with pre-existing and widespread utilities,
|
||
such as the @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
|
||
@command{prove} utility}, at least for the simpler usages.
|
||
|
||
TAP started its life as part of the test harness for Perl, but today
|
||
it has been (mostly) standardized, and has various independent
|
||
implementations in different languages; among them, C, C++, Perl,
|
||
Python, PHP, and Java. For a semi-official specification of the
|
||
TAP protocol, please refer to the documentation of
|
||
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
|
||
@samp{Test::Harness::TAP}}.
|
||
|
||
The most relevant real-world usages of TAP are obviously in the testsuites
|
||
of @command{perl} and of many perl modules. Still, also other important
|
||
third-party packages, such as @uref{http://git-scm.com/, @command{git}},
|
||
use TAP in their testsuite.
|
||
|
||
@node Use TAP with the Automake test harness
|
||
@subsection Use TAP with the Automake test harness
|
||
|
||
Currently, the TAP driver that comes with Automake requires some by-hand
|
||
steps on the developer's part (this situation should hopefully be improved
|
||
in future Automake versions). You'll have to grab the @file{tap-driver.sh}
|
||
script from the Automake distribution by hand, copy it in your source tree,
|
||
and use the Automake support for third-party test drivers to instruct the
|
||
harness to use the @file{tap-driver.sh} script and the awk program found
|
||
by @code{AM_INIT_AUTOMAKE} to run your TAP-producing tests. See the example
|
||
below for clarification.
|
||
|
||
Apart from the options common to all the Automake test drivers
|
||
(@pxref{Command-line arguments for test drivers}), the @file{tap-driver.sh}
|
||
supports the following options, whose names are chosen for enhanced
|
||
compatibility with the @command{prove} utility.
|
||
|
||
@table @option
|
||
@c Keep in sync with 'tap-exit.sh' and 'tap-signal.tap'.
|
||
@item --ignore-exit
|
||
Causes the test driver to ignore the exit status of the test scripts;
|
||
by default, the driver will report an error if the script exits with a
|
||
non-zero status. This option has effect also on non-zero exit statuses
|
||
due to termination by a signal.
|
||
@item --comments
|
||
Instruct the test driver to display TAP diagnostic (i.e., lines beginning
|
||
with the @samp{#} character) in the testsuite progress output too; by
|
||
default, TAP diagnostic is only copied to the @file{.log} file.
|
||
@item --no-comments
|
||
Revert the effects of @option{--comments}.
|
||
@item --merge
|
||
Instruct the test driver to merge the test scripts' standard error into
|
||
their standard output. This is necessary if you want to ensure that
|
||
diagnostics from the test scripts are displayed in the correct order
|
||
relative to test results; this can be of great help in debugging
|
||
(especially if your test scripts are shell scripts run with shell
|
||
tracing active). As a downside, this option might cause the test
|
||
harness to get confused if anything that appears on standard error
|
||
looks like a test result.
|
||
@item --no-merge
|
||
Revert the effects of @option{--merge}.
|
||
@item --diagnostic-string=@var{STRING}
|
||
Change the string that introduces TAP diagnostic from the default value
|
||
of ``@code{#}'' to @code{@var{STRING}}. This can be useful if your
|
||
TAP-based test scripts produce verbose output on which they have limited
|
||
control (because, say, the output comes from other tools invoked in the
|
||
scripts), and it might contain text that gets spuriously interpreted as
|
||
TAP diagnostic: such an issue can be solved by redefining the string that
|
||
activates TAP diagnostic to a value you know won't appear by chance in
|
||
the tests' output. Note however that this feature is non-standard, as
|
||
the ``official'' TAP protocol does not allow for such a customization; so
|
||
don't use it if you can avoid it.
|
||
@end table
|
||
|
||
@noindent
|
||
Here is an example of how the TAP driver can be set up and used.
|
||
|
||
@c Keep in sync with tap-doc2.sh
|
||
@example
|
||
% @kbd{cat configure.ac}
|
||
AC_INIT([GNU Try Tap], [1.0], [bug-automake@@gnu.org])
|
||
AC_CONFIG_AUX_DIR([build-aux])
|
||
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
|
||
AC_CONFIG_FILES([Makefile])
|
||
AC_REQUIRE_AUX_FILE([tap-driver.sh])
|
||
AC_OUTPUT
|
||
|
||
% @kbd{cat Makefile.am}
|
||
TEST_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
|
||
$(top_srcdir)/build-aux/tap-driver.sh
|
||
TESTS = foo.test bar.test baz.test
|
||
EXTRA_DIST = $(TESTS)
|
||
|
||
% @kbd{cat foo.test}
|
||
#!/bin/sh
|
||
echo 1..4 # Number of tests to be executed.
|
||
echo 'ok 1 - Swallows fly'
|
||
echo 'not ok 2 - Caterpillars fly # TODO metamorphosis in progress'
|
||
echo 'ok 3 - Pigs fly # SKIP not enough acid'
|
||
echo '# I just love word plays ...'
|
||
echo 'ok 4 - Flies fly too :-)'
|
||
|
||
% @kbd{cat bar.test}
|
||
#!/bin/sh
|
||
echo 1..3
|
||
echo 'not ok 1 - Bummer, this test has failed.'
|
||
echo 'ok 2 - This passed though.'
|
||
echo 'Bail out! Ennui kicking in, sorry...'
|
||
echo 'ok 3 - This will not be seen.'
|
||
|
||
% @kbd{cat baz.test}
|
||
#!/bin/sh
|
||
echo 1..1
|
||
echo ok 1
|
||
# Exit with error, even if all the tests have been successful.
|
||
exit 7
|
||
|
||
% @kbd{cp @var{PREFIX}/share/automake-@var{APIVERSION}/tap-driver.sh .}
|
||
% @kbd{autoreconf -vi && ./configure && make check}
|
||
...
|
||
PASS: foo.test 1 - Swallows fly
|
||
XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
|
||
SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
|
||
PASS: foo.test 4 - Flies fly too :-)
|
||
FAIL: bar.test 1 - Bummer, this test has failed.
|
||
PASS: bar.test 2 - This passed though.
|
||
ERROR: bar.test - Bail out! Ennui kicking in, sorry...
|
||
PASS: baz.test 1
|
||
ERROR: baz.test - exited with status 7
|
||
...
|
||
Please report to bug-automake@@gnu.org
|
||
...
|
||
% @kbd{echo exit status: $?}
|
||
exit status: 1
|
||
|
||
@c Keep the "skewed" indentation below, it produces pretty PDF output.
|
||
% @kbd{env TEST_LOG_DRIVER_FLAGS='--comments --ignore-exit' \
|
||
TESTS='foo.test baz.test' make -e check}
|
||
...
|
||
PASS: foo.test 1 - Swallows fly
|
||
XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress
|
||
SKIP: foo.test 3 - Pigs fly # SKIP not enough acid
|
||
# foo.test: I just love word plays...
|
||
PASS: foo.test 4 - Flies fly too :-)
|
||
PASS: baz.test 1
|
||
...
|
||
% @kbd{echo exit status: $?}
|
||
exit status: 0
|
||
@end example
|
||
|
||
@node Incompatibilities with other TAP parsers and drivers
|
||
@subsection Incompatibilities with other TAP parsers and drivers
|
||
|
||
For implementation or historical reasons, the TAP driver and harness as
|
||
implemented by Automake have some minors incompatibilities with the
|
||
mainstream versions, which you should be aware of.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
A @code{Bail out!} directive doesn't stop the whole testsuite, but only
|
||
the test script it occurs in. This doesn't follow TAP specifications,
|
||
but on the other hand it maximizes compatibility (and code sharing) with
|
||
the ``hard error'' concept of the default testsuite driver.
|
||
@item
|
||
The @code{version} and @code{pragma} directives are not supported.
|
||
@item
|
||
The @option{--diagnostic-string} option of our driver allows to modify
|
||
the string that introduces TAP diagnostic from the default value
|
||
of ``@code{#}''. The standard TAP protocol has currently no way to
|
||
allow this, so if you use it your diagnostic will be lost to more
|
||
compliant tools like @command{prove} and @code{Test::Harness}
|
||
@item
|
||
And there are probably some other small and yet undiscovered
|
||
incompatibilities, especially in corner cases or with rare usages.
|
||
@end itemize
|
||
|
||
@node Links and external resources on TAP
|
||
@subsection Links and external resources on TAP
|
||
|
||
@noindent
|
||
Here are some links to more extensive official or third-party
|
||
documentation and resources about the TAP protocol and related
|
||
tools and libraries.
|
||
@itemize @bullet
|
||
@item
|
||
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod,
|
||
@samp{Test::Harness::TAP}},
|
||
the (mostly) official documentation about the TAP format and protocol.
|
||
@item
|
||
@uref{http://search.cpan.org/~andya/Test-Harness/bin/prove,
|
||
@command{prove}},
|
||
the most famous command-line TAP test driver, included in the distribution
|
||
of @command{perl} and
|
||
@uref{http://search.cpan.org/~andya/Test-Harness/lib/Test/Harness.pm,
|
||
@samp{Test::Harness}}.
|
||
@item
|
||
The @uref{http://testanything.org/wiki/index.php/Main_Page,TAP wiki}.
|
||
@item
|
||
A ``gentle introduction'' to testing for perl coders:
|
||
@uref{http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod,
|
||
@samp{Test::Tutorial}}.
|
||
@item
|
||
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/Simple.pm,
|
||
@samp{Test::Simple}}
|
||
and
|
||
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/More.pm,
|
||
@samp{Test::More}},
|
||
the standard perl testing libraries, which are based on TAP.
|
||
@item
|
||
@uref{http://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness},
|
||
a C-based project implementing both a TAP producer and a TAP consumer.
|
||
@item
|
||
@uref{http://www.tap4j.org/,tap4j},
|
||
a Java-based project implementing both a TAP producer and a TAP consumer.
|
||
@end itemize
|
||
|
||
@node DejaGnu Tests
|
||
@section DejaGnu Tests
|
||
|
||
If @uref{ftp://ftp.gnu.org/gnu/dejagnu/, @command{dejagnu}} appears in
|
||
@code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based test suite is
|
||
assumed. The variable @code{DEJATOOL} is a list of names that are
|
||
passed, one at a time, as the @option{--tool} argument to
|
||
@command{runtest} invocations; it defaults to the name of the package.
|
||
|
||
The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and
|
||
@option{--srcdir} flags that are passed to dejagnu by default; this can be
|
||
overridden if necessary.
|
||
@vindex RUNTESTDEFAULTFLAGS
|
||
|
||
The variables @code{EXPECT} and @code{RUNTEST} can
|
||
also be overridden to provide project-specific values. For instance,
|
||
you will need to do this if you are testing a compiler toolchain,
|
||
because the default values do not take into account host and target
|
||
names.
|
||
@opindex dejagnu
|
||
@vindex DEJATOOL
|
||
@vindex EXPECT
|
||
@vindex RUNTEST
|
||
|
||
The contents of the variable @code{RUNTESTFLAGS} are passed to the
|
||
@code{runtest} invocation. This is considered a ``user variable''
|
||
(@pxref{User Variables}). If you need to set @command{runtest} flags in
|
||
@file{Makefile.am}, you can use @code{AM_RUNTESTFLAGS} instead.
|
||
@vindex RUNTESTFLAGS
|
||
@vindex AM_RUNTESTFLAGS
|
||
|
||
@cindex @file{site.exp}
|
||
Automake will generate rules to create a local @file{site.exp} file,
|
||
defining various variables detected by @command{configure}. This file
|
||
is automatically read by DejaGnu. It is OK for the user of a package
|
||
to edit this file in order to tune the test suite. However this is
|
||
not the place where the test suite author should define new variables:
|
||
this should be done elsewhere in the real test suite code.
|
||
Especially, @file{site.exp} should not be distributed.
|
||
|
||
Still, if the package author has legitimate reasons to extend
|
||
@file{site.exp} at @command{make} time, he can do so by defining
|
||
the variable @code{EXTRA_DEJAGNU_SITE_CONFIG}; the files listed
|
||
there will be considered @file{site.exp} prerequisites, and their
|
||
content will be appended to it (in the same order in which they
|
||
appear in @code{EXTRA_DEJAGNU_SITE_CONFIG}). Note that files are
|
||
@emph{not} distributed by default.
|
||
|
||
For more information regarding DejaGnu test suites, see @ref{Top, , ,
|
||
dejagnu, The DejaGnu Manual}.
|
||
|
||
@node Install Tests
|
||
@section Install Tests
|
||
|
||
The @code{installcheck} target is available to the user as a way to
|
||
run any tests after the package has been installed. You can add tests
|
||
to this by writing an @code{installcheck-local} rule.
|
||
|
||
|
||
@node Rebuilding
|
||
@chapter Rebuilding Makefiles
|
||
@cindex rebuild rules
|
||
|
||
Automake generates rules to automatically rebuild @file{Makefile}s,
|
||
@file{configure}, and other derived files like @file{Makefile.in}.
|
||
|
||
@acindex AM_MAINTAINER_MODE
|
||
If you are using @code{AM_MAINTAINER_MODE} in @file{configure.ac}, then
|
||
these automatic rebuilding rules are only enabled in maintainer mode.
|
||
|
||
@vindex CONFIG_STATUS_DEPENDENCIES
|
||
@vindex CONFIGURE_DEPENDENCIES
|
||
@cindex @file{version.sh}, example
|
||
@cindex @file{version.m4}, example
|
||
|
||
Sometimes it is convenient to supplement the rebuild rules for
|
||
@file{configure} or @file{config.status} with additional dependencies.
|
||
The variables @code{CONFIGURE_DEPENDENCIES} and
|
||
@code{CONFIG_STATUS_DEPENDENCIES} can be used to list these extra
|
||
dependencies. These variables should be defined in all
|
||
@file{Makefile}s of the tree (because these two rebuild rules are
|
||
output in all them), so it is safer and easier to @code{AC_SUBST} them
|
||
from @file{configure.ac}. For instance, the following statement will
|
||
cause @file{configure} to be rerun each time @file{version.sh} is
|
||
changed.
|
||
|
||
@c Keep in sync with remake-config-status-dependencies.sh
|
||
@example
|
||
AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/version.sh'])
|
||
@end example
|
||
|
||
@noindent
|
||
Note the @samp{$(top_srcdir)/} in the file name. Since this variable
|
||
is to be used in all @file{Makefile}s, its value must be sensible at
|
||
any level in the build hierarchy.
|
||
|
||
Beware not to mistake @code{CONFIGURE_DEPENDENCIES} for
|
||
@code{CONFIG_STATUS_DEPENDENCIES}.
|
||
|
||
@c Keep in sync with remake-configure-dependencies.sh
|
||
@code{CONFIGURE_DEPENDENCIES} adds dependencies to the
|
||
@file{configure} rule, whose effect is to run @command{autoconf}. This
|
||
variable should be seldom used, because @command{automake} already tracks
|
||
@code{m4_include}d files. However it can be useful when playing
|
||
tricky games with @code{m4_esyscmd} or similar non-recommendable
|
||
macros with side effects. Be also aware that interactions of this
|
||
variable with the @ref{Autom4te Cache, , autom4te cache, autoconf,
|
||
The Autoconf Manual} are quite problematic and can cause subtle
|
||
breakage, so you might want to disable the cache if you want to use
|
||
@code{CONFIGURE_DEPENDENCIES}.
|
||
|
||
@code{CONFIG_STATUS_DEPENDENCIES} adds dependencies to the
|
||
@file{config.status} rule, whose effect is to run @file{configure}.
|
||
This variable should therefore carry any non-standard source that may
|
||
be read as a side effect of running @command{configure}, like @file{version.sh}
|
||
in the example above.
|
||
|
||
Speaking of @file{version.sh} scripts, we recommend against them
|
||
today. They are mainly used when the version of a package is updated
|
||
automatically by a script (e.g., in daily builds). Here is what some
|
||
old-style @file{configure.ac}s may look like:
|
||
|
||
@example
|
||
AC_INIT
|
||
. $srcdir/version.sh
|
||
AM_INIT_AUTOMAKE([name], $VERSION_NUMBER)
|
||
@dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
Here, @file{version.sh} is a shell fragment that sets
|
||
@code{VERSION_NUMBER}. The problem with this example is that
|
||
@command{automake} cannot track dependencies (listing @file{version.sh}
|
||
in @command{CONFIG_STATUS_DEPENDENCIES}, and distributing this file is up
|
||
to the user), and that it uses the obsolete form of @code{AC_INIT} and
|
||
@code{AM_INIT_AUTOMAKE}. Upgrading to the new syntax is not
|
||
straightforward, because shell variables are not allowed in
|
||
@code{AC_INIT}'s arguments. We recommend that @file{version.sh} be
|
||
replaced by an M4 file that is included by @file{configure.ac}:
|
||
|
||
@example
|
||
m4_include([version.m4])
|
||
AC_INIT([name], VERSION_NUMBER)
|
||
AM_INIT_AUTOMAKE
|
||
@dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
Here @file{version.m4} could contain something like
|
||
@samp{m4_define([VERSION_NUMBER], [1.2])}. The advantage of this
|
||
second form is that @command{automake} will take care of the
|
||
dependencies when defining the rebuild rule, and will also distribute
|
||
the file automatically. An inconvenience is that @command{autoconf}
|
||
will now be rerun each time the version number is bumped, when only
|
||
@file{configure} had to be rerun in the previous setup.
|
||
|
||
|
||
@node Options
|
||
@chapter Changing Automake's Behavior
|
||
|
||
@menu
|
||
* Options generalities:: Semantics of Automake option
|
||
* List of Automake options:: A comprehensive list of Automake options
|
||
@end menu
|
||
|
||
@node Options generalities
|
||
@section Options generalities
|
||
|
||
Various features of Automake can be controlled by options. Except where
|
||
noted otherwise, options can be specified in one of several ways. Most
|
||
options can be applied on a per-@file{Makefile} basis when listed in a
|
||
special @file{Makefile} variable named @code{AUTOMAKE_OPTIONS}. Some
|
||
of these options only make sense when specified in the toplevel
|
||
@file{Makefile.am} file. Options are applied globally to all processed
|
||
@file{Makefile} files when listed in the first argument of
|
||
@code{AM_INIT_AUTOMAKE} in @file{configure.ac}, and some options which
|
||
require changes to the @command{configure} script can only be specified
|
||
there. These are annotated below.
|
||
|
||
As a general rule, options specified in @code{AUTOMAKE_OPTIONS} take
|
||
precedence over those specified in @code{AM_INIT_AUTOMAKE}, which in
|
||
turn take precedence over those specified on the command line.
|
||
|
||
Also, some care must be taken about the interactions among strictness
|
||
level and warning categories. As a general rule, strictness-implied
|
||
warnings are overridden by those specified by explicit options. For
|
||
example, even if @samp{portability} warnings are disabled by default
|
||
in @option{foreign} strictness, an usage like this will end up enabling
|
||
them:
|
||
|
||
@example
|
||
AUTOMAKE_OPTIONS = -Wportability foreign
|
||
@end example
|
||
|
||
However, a strictness level specified in a higher-priority context
|
||
will override all the explicit warnings specified in a lower-priority
|
||
context. For example, if @file{configure.ac} contains:
|
||
|
||
@example
|
||
AM_INIT_AUTOMAKE([-Wportability])
|
||
@end example
|
||
|
||
@noindent
|
||
and @file{Makefile.am} contains:
|
||
|
||
@example
|
||
AUTOMAKE_OPTIONS = foreign
|
||
@end example
|
||
|
||
@noindent
|
||
then @samp{portability} warnings will be @emph{disabled} in
|
||
@file{Makefile.am}.
|
||
|
||
@node List of Automake options
|
||
@section List of Automake options
|
||
|
||
@vindex AUTOMAKE_OPTIONS
|
||
|
||
@table @asis
|
||
@item @option{gnits}
|
||
@itemx @option{gnu}
|
||
@itemx @option{foreign}
|
||
@cindex Option, @option{gnits}
|
||
@cindex Option, @option{gnu}
|
||
@cindex Option, @option{foreign}
|
||
@opindex gnits
|
||
@opindex gnu
|
||
@opindex foreign
|
||
|
||
Set the strictness as appropriate. The @option{gnits} option also
|
||
implies options @option{readme-alpha} and @option{check-news}.
|
||
|
||
@item @option{check-news}
|
||
@cindex Option, @option{check-news}
|
||
@opindex check-news
|
||
Cause @samp{make dist} to fail unless the current version number appears
|
||
in the first few lines of the @file{NEWS} file.
|
||
|
||
@item @option{dejagnu}
|
||
@cindex Option, @option{dejagnu}
|
||
@opindex dejagnu
|
||
Cause @command{dejagnu}-specific rules to be generated. @xref{DejaGnu Tests}.
|
||
|
||
@item @option{dist-bzip2}
|
||
@cindex Option, @option{dist-bzip2}
|
||
@opindex dist-bzip2
|
||
Hook @code{dist-bzip2} to @code{dist}.
|
||
@trindex dist-bzip2
|
||
|
||
@item @option{dist-lzip}
|
||
@cindex Option, @option{dist-lzip}
|
||
@opindex dist-lzip
|
||
Hook @code{dist-lzip} to @code{dist}.
|
||
@trindex dist-lzip
|
||
|
||
@item @option{dist-xz}
|
||
@cindex Option, @option{dist-xz}
|
||
@opindex dist-xz
|
||
Hook @code{dist-xz} to @code{dist}.
|
||
@trindex dist-xz
|
||
|
||
@item @option{dist-zip}
|
||
@cindex Option, @option{dist-zip}
|
||
@opindex dist-zip
|
||
Hook @code{dist-zip} to @code{dist}.
|
||
@trindex dist-zip
|
||
|
||
@item @option{dist-shar}
|
||
@cindex Option, @option{dist-shar}
|
||
@opindex dist-shar
|
||
Hook @code{dist-shar} to @code{dist}. Use of this option
|
||
is deprecated, as the @samp{shar} format is obsolescent and
|
||
problematic. Support for it will be removed altogether in
|
||
Automake 2.0.
|
||
@trindex dist-shar
|
||
|
||
@item @option{dist-tarZ}
|
||
@cindex Option, @option{dist-tarZ}
|
||
@opindex dist-tarZ
|
||
Hook @code{dist-tarZ} to @code{dist}. Use of this option
|
||
is deprecated, as the @samp{compress} program is obsolete.
|
||
Support for it will be removed altogether in Automake 2.0.
|
||
@trindex dist-tarZ
|
||
|
||
@item @option{filename-length-max=99}
|
||
@cindex Option, @option{filename-length-max=99}
|
||
@opindex filename-length-max=99
|
||
Abort if file names longer than 99 characters are found during
|
||
@samp{make dist}. Such long file names are generally considered not to
|
||
be portable in tarballs. See the @option{tar-v7} and @option{tar-ustar}
|
||
options below. This option should be used in the top-level
|
||
@file{Makefile.am} or as an argument of @code{AM_INIT_AUTOMAKE} in
|
||
@file{configure.ac}, it will be ignored otherwise. It will also be
|
||
ignored in sub-packages of nested packages (@pxref{Subpackages}).
|
||
|
||
@item @option{info-in-builddir}
|
||
@cindex Option, @option{info-in-builddir}
|
||
@opindex info-in-builddir
|
||
Instruct Automake to place the generated @file{.info} files in the
|
||
@code{builddir} rather than in the @code{srcdir}. Note that this
|
||
might make VPATH builds with some non-GNU make implementations more
|
||
brittle.
|
||
|
||
@item @option{no-define}
|
||
@cindex Option, @option{no-define}
|
||
@opindex no-define
|
||
This option is meaningful only when passed as an argument to
|
||
@code{AM_INIT_AUTOMAKE}. It will prevent the @code{PACKAGE} and
|
||
@code{VERSION} variables from being @code{AC_DEFINE}d. But notice
|
||
that they will remain defined as shell variables in the generated
|
||
@code{configure}, and as make variables in the generated
|
||
@code{Makefile}; this is deliberate, and required for backward
|
||
compatibility.
|
||
|
||
@item @option{no-dependencies}
|
||
@cindex Option, @option{no-dependencies}
|
||
@opindex no-dependencies
|
||
This is similar to using @option{--ignore-deps} on the command line,
|
||
but is useful for those situations where you don't have the necessary
|
||
bits to make automatic dependency tracking work
|
||
(@pxref{Dependencies}). In this case the effect is to effectively
|
||
disable automatic dependency tracking.
|
||
|
||
@item @option{no-dist}
|
||
@cindex Option, @option{no-dist}
|
||
@opindex no-dist
|
||
Don't emit any code related to @code{dist} target. This is useful
|
||
when a package has its own method for making distributions.
|
||
|
||
@item @option{no-dist-gzip}
|
||
@cindex Option, @option{no-dist-gzip}
|
||
@opindex no-dist-gzip
|
||
Do not hook @code{dist-gzip} to @code{dist}.
|
||
@trindex no-dist-gzip
|
||
|
||
@item @option{no-exeext}
|
||
@cindex Option, @option{no-exeext}
|
||
@opindex no-exeext
|
||
If your @file{Makefile.am} defines a rule for target @code{foo}, it
|
||
will override a rule for a target named @samp{foo$(EXEEXT)}. This is
|
||
necessary when @code{EXEEXT} is found to be empty. However, by
|
||
default @command{automake} will generate an error for this use. The
|
||
@option{no-exeext} option will disable this error. This is intended for
|
||
use only where it is known in advance that the package will not be
|
||
ported to Windows, or any other operating system using extensions on
|
||
executables.
|
||
|
||
@item @option{no-installinfo}
|
||
@cindex Option, @option{no-installinfo}
|
||
@opindex no-installinfo
|
||
The generated @file{Makefile.in} will not cause info pages to be built
|
||
or installed by default. However, @code{info} and @code{install-info}
|
||
targets will still be available. This option is disallowed at
|
||
@option{gnu} strictness and above.
|
||
@trindex info
|
||
@trindex install-info
|
||
|
||
@item @option{no-installman}
|
||
@cindex Option, @option{no-installman}
|
||
@opindex no-installman
|
||
The generated @file{Makefile.in} will not cause man pages to be
|
||
installed by default. However, an @code{install-man} target will still
|
||
be available for optional installation. This option is disallowed at
|
||
@option{gnu} strictness and above.
|
||
@trindex install-man
|
||
|
||
@item @option{nostdinc}
|
||
@cindex Option, @option{nostdinc}
|
||
@opindex nostdinc
|
||
This option can be used to disable the standard @option{-I} options that
|
||
are ordinarily automatically provided by Automake.
|
||
|
||
@item @option{no-texinfo.tex}
|
||
@cindex Option, @option{no-texinfo.tex}
|
||
@opindex no-texinfo.tex
|
||
Don't require @file{texinfo.tex}, even if there are texinfo files in
|
||
this directory.
|
||
|
||
@item @option{serial-tests}
|
||
@cindex Option, @option{serial-tests}
|
||
@opindex serial-tests
|
||
Enable the older serial test suite harness for @code{TESTS} (@pxref{Serial
|
||
Test Harness}, for more information).
|
||
|
||
@item @option{parallel-tests}
|
||
@cindex Option, @option{parallel-tests}
|
||
@opindex parallel-tests
|
||
Enable test suite harness for @code{TESTS} that can run tests in parallel
|
||
(@pxref{Parallel Test Harness}, for more information). This option is
|
||
only kept for backward-compatibility, since the parallel test harness is
|
||
the default now.
|
||
|
||
@item @option{readme-alpha}
|
||
@cindex Option, @option{readme-alpha}
|
||
@opindex readme-alpha
|
||
If this release is an alpha release, and the file @file{README-alpha}
|
||
exists, then it will be added to the distribution. If this option is
|
||
given, version numbers are expected to follow one of two forms. The
|
||
first form is @samp{@var{major}.@var{minor}.@var{alpha}}, where each
|
||
element is a number; the final period and number should be left off for
|
||
non-alpha releases. The second form is
|
||
@samp{@var{major}.@var{minor}@var{alpha}}, where @var{alpha} is a
|
||
letter; it should be omitted for non-alpha releases.
|
||
|
||
@item @option{std-options}
|
||
@cindex Options, @option{std-options}
|
||
@cindex @samp{make installcheck}, testing @option{--help} and @option{--version}
|
||
@cindex @option{--help} check
|
||
@cindex @option{--version} check
|
||
@opindex std-options
|
||
|
||
Make the @code{installcheck} rule check that installed scripts and
|
||
programs support the @option{--help} and @option{--version} options.
|
||
This also provides a basic check that the program's
|
||
run-time dependencies are satisfied after installation.
|
||
|
||
@vindex AM_INSTALLCHECK_STD_OPTIONS_EXEMPT
|
||
In a few situations, programs (or scripts) have to be exempted from this
|
||
test. For instance, @command{false} (from GNU coreutils) is never
|
||
successful, even for @option{--help} or @option{--version}. You can list
|
||
such programs in the variable @code{AM_INSTALLCHECK_STD_OPTIONS_EXEMPT}.
|
||
Programs (not scripts) listed in this variable should be suffixed by
|
||
@samp{$(EXEEXT)} for the sake of Windows or OS/2. For instance, suppose we
|
||
build @file{false} as a program but @file{true.sh} as a script, and that
|
||
neither of them support @option{--help} or @option{--version}:
|
||
|
||
@example
|
||
AUTOMAKE_OPTIONS = std-options
|
||
bin_PROGRAMS = false ...
|
||
bin_SCRIPTS = true.sh ...
|
||
AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT) true.sh
|
||
@end example
|
||
|
||
@item @option{subdir-objects}
|
||
@cindex Options, @option{subdir-objects}
|
||
@opindex subdir-objects
|
||
If this option is specified, then objects are placed into the
|
||
subdirectory of the build directory corresponding to the subdirectory of
|
||
the source file. For instance, if the source file is
|
||
@file{subdir/file.cxx}, then the output file would be
|
||
@file{subdir/file.o}.
|
||
|
||
@anchor{tar-formats}
|
||
@item @option{tar-v7}
|
||
@itemx @option{tar-ustar}
|
||
@itemx @option{tar-pax}
|
||
@cindex Option, @option{tar-v7}
|
||
@cindex Option, @option{tar-ustar}
|
||
@cindex Option, @option{tar-pax}
|
||
@cindex @command{tar} formats
|
||
@cindex v7 @command{tar} format
|
||
@cindex ustar format
|
||
@cindex pax format
|
||
@opindex tar-v7
|
||
@opindex tar-ustar
|
||
@opindex tar-pax
|
||
|
||
These three mutually exclusive options select the tar format to use
|
||
when generating tarballs with @samp{make dist}. (The tar file created
|
||
is then compressed according to the set of @option{no-dist-gzip},
|
||
@option{dist-bzip2}, @option{dist-lzip}, @option{dist-xz} and
|
||
@option{dist-tarZ} options in use.)
|
||
|
||
These options must be passed as arguments to @code{AM_INIT_AUTOMAKE}
|
||
(@pxref{Macros}) because they can require additional configure checks.
|
||
Automake will complain if it sees such options in an
|
||
@code{AUTOMAKE_OPTIONS} variable.
|
||
|
||
@option{tar-v7} selects the old V7 tar format. This is the historical
|
||
default. This antiquated format is understood by all tar
|
||
implementations and supports file names with up to 99 characters. When
|
||
given longer file names some tar implementations will diagnose the
|
||
problem while other will generate broken tarballs or use non-portable
|
||
extensions. Furthermore, the V7 format cannot store empty
|
||
directories. When using this format, consider using the
|
||
@option{filename-length-max=99} option to catch file names too long.
|
||
|
||
@option{tar-ustar} selects the ustar format defined by POSIX
|
||
1003.1-1988. This format is believed to be old enough to be portable.
|
||
It fully supports empty directories. It can store file names with up
|
||
to 256 characters, provided that the file name can be split at
|
||
directory separator in two parts, first of them being at most 155
|
||
bytes long. So, in most cases the maximum file name length will be
|
||
shorter than 256 characters. However you may run against broken tar
|
||
implementations that incorrectly handle file names longer than 99
|
||
characters (please report them to @email{@value{PACKAGE_BUGREPORT}} so we
|
||
can document this accurately).
|
||
|
||
@option{tar-pax} selects the new pax interchange format defined by POSIX
|
||
1003.1-2001. It does not limit the length of file names. However,
|
||
this format is very young and should probably be restricted to
|
||
packages that target only very modern platforms. There are moves to
|
||
change the pax format in an upward-compatible way, so this option may
|
||
refer to a more recent version in the future.
|
||
|
||
@xref{Formats, , Controlling the Archive Format, tar, GNU Tar}, for
|
||
further discussion about tar formats.
|
||
|
||
@command{configure} knows several ways to construct these formats. It
|
||
will not abort if it cannot find a tool up to the task (so that the
|
||
package can still be built), but @samp{make dist} will fail.
|
||
|
||
@item @var{version}
|
||
@cindex Option, @var{version}
|
||
A version number (e.g., @samp{0.30}) can be specified. If Automake is not
|
||
newer than the version specified, creation of the @file{Makefile.in}
|
||
will be suppressed.
|
||
|
||
@item @option{-W@var{category}} or @option{--warnings=@var{category}}
|
||
@cindex Option, warnings
|
||
@cindex Option, @option{-W@var{category}}
|
||
@cindex Option, @option{--warnings=@var{category}}
|
||
These options behave exactly like their command-line counterpart
|
||
(@pxref{automake Invocation}). This allows you to enable or disable some
|
||
warning categories on a per-file basis. You can also setup some warnings
|
||
for your entire project; for instance, try @samp{AM_INIT_AUTOMAKE([-Wall])}
|
||
in your @file{configure.ac}.
|
||
|
||
@end table
|
||
|
||
Unrecognized options are diagnosed by @command{automake}.
|
||
|
||
If you want an option to apply to all the files in the tree, you can use
|
||
the @code{AM_INIT_AUTOMAKE} macro in @file{configure.ac}.
|
||
@xref{Macros}.
|
||
|
||
|
||
@node Miscellaneous
|
||
@chapter Miscellaneous Rules
|
||
|
||
There are a few rules and variables that didn't fit anywhere else.
|
||
|
||
@menu
|
||
* Tags:: Interfacing to cscope, etags and mkid
|
||
* Suffixes:: Handling new file extensions
|
||
@end menu
|
||
|
||
|
||
@node Tags
|
||
@section Interfacing to @command{etags}
|
||
|
||
@cindex @file{TAGS} support
|
||
|
||
Automake will generate rules to generate @file{TAGS} files for use with
|
||
GNU Emacs under some circumstances.
|
||
|
||
@trindex tags
|
||
If any C, C++ or Fortran 77 source code or headers are present, then
|
||
@code{tags} and @code{TAGS} rules will be generated for the directory.
|
||
All files listed using the @code{_SOURCES}, @code{_HEADERS}, and
|
||
@code{_LISP} primaries will be used to generate tags. Note that
|
||
generated source files that are not distributed must be declared in
|
||
variables like @code{nodist_noinst_HEADERS} or
|
||
@code{nodist_@var{prog}_SOURCES} or they will be ignored.
|
||
|
||
A @code{tags} rule will be output at the topmost directory of a
|
||
multi-directory package. When run from this topmost directory,
|
||
@samp{make tags} will generate a @file{TAGS} file that includes by
|
||
reference all @file{TAGS} files from subdirectories.
|
||
|
||
The @code{tags} rule will also be generated if the variable
|
||
@code{ETAGS_ARGS} is defined. This variable is intended for use in
|
||
directories that contain taggable source that @command{etags} does
|
||
not understand. The user can use the @code{ETAGSFLAGS} to pass
|
||
additional flags to @command{etags}; @code{AM_ETAGSFLAGS} is also
|
||
available for use in @file{Makefile.am}.
|
||
@vindex ETAGS_ARGS
|
||
@vindex ETAGSFLAGS
|
||
@vindex AM_ETAGSFLAGS
|
||
|
||
Here is how Automake generates tags for its source, and for nodes in its
|
||
Texinfo file:
|
||
|
||
@example
|
||
ETAGS_ARGS = automake.in --lang=none \
|
||
--regex='/^@@node[ \t]+\([^,]+\)/\1/' automake.texi
|
||
@end example
|
||
|
||
If you add file names to @code{ETAGS_ARGS}, you will probably also
|
||
want to define @code{TAGS_DEPENDENCIES}. The contents of this variable
|
||
are added directly to the dependencies for the @code{tags} rule.
|
||
@vindex TAGS_DEPENDENCIES
|
||
|
||
Automake also generates a @code{ctags} rule that can be used to
|
||
build @command{vi}-style @file{tags} files. The variable @code{CTAGS}
|
||
is the name of the program to invoke (by default @command{ctags});
|
||
@code{CTAGSFLAGS} can be used by the user to pass additional flags,
|
||
and @code{AM_CTAGSFLAGS} can be used by the @file{Makefile.am}.
|
||
|
||
@trindex id
|
||
Automake will also generate an @code{ID} rule that will run
|
||
@command{mkid} on the source. This is only supported on a
|
||
directory-by-directory basis.
|
||
|
||
Similarly, the @code{cscope} rule will create a list of all the source
|
||
files in the tree and run @command{cscope} to build an inverted index
|
||
database. The variable @code{CSCOPE} is the name of the program to invoke
|
||
(by default @command{cscope}); @code{CSCOPEFLAGS} and
|
||
@code{CSCOPE_ARGS} can be used by the user to pass additional flags and
|
||
file names respectively, while @code{AM_CSCOPEFLAGS} can be used by the
|
||
@file{Makefile.am}. Note that, currently, the Automake-provided
|
||
@code{cscope} support, when used in a VPATH build, might not work well
|
||
with non-GNU make implementations (especially with make implementations
|
||
performing @ref{Automatic Rule Rewriting, , VPATH rewrites, autoconf,
|
||
The Autoconf Manual}).
|
||
|
||
Finally, Automake also emits rules to support the
|
||
@uref{http://www.gnu.org/software/global/, GNU Global Tags program}.
|
||
The @code{GTAGS} rule runs Global Tags and puts the
|
||
result in the top build directory. The variable @code{GTAGS_ARGS}
|
||
holds arguments that are passed to @command{gtags}.
|
||
@vindex GTAGS_ARGS
|
||
|
||
|
||
@node Suffixes
|
||
@section Handling new file extensions
|
||
|
||
@cindex Adding new @code{SUFFIXES}
|
||
@cindex @code{SUFFIXES}, adding
|
||
@vindex SUFFIXES
|
||
|
||
It is sometimes useful to introduce a new implicit rule to handle a file
|
||
type that Automake does not know about.
|
||
|
||
For instance, suppose you had a compiler that could compile @file{.foo}
|
||
files to @file{.o} files. You would simply define a suffix rule for
|
||
your language:
|
||
|
||
@example
|
||
.foo.o:
|
||
foocc -c -o $@@ $<
|
||
@end example
|
||
|
||
Then you could directly use a @file{.foo} file in a @code{_SOURCES}
|
||
variable and expect the correct results:
|
||
|
||
@example
|
||
bin_PROGRAMS = doit
|
||
doit_SOURCES = doit.foo
|
||
@end example
|
||
|
||
This was the simpler and more common case. In other cases, you will
|
||
have to help Automake to figure out which extensions you are defining your
|
||
suffix rule for. This usually happens when your extension does not
|
||
start with a dot. Then, all you have to do is to put a list of new
|
||
suffixes in the @code{SUFFIXES} variable @strong{before} you define your
|
||
implicit rule.
|
||
|
||
For instance, the following definition prevents Automake from misinterpreting
|
||
the @samp{.idlC.cpp:} rule as an attempt to transform @file{.idlC} files into
|
||
@file{.cpp} files.
|
||
|
||
@c Keep in sync with suffix7.sh
|
||
@example
|
||
SUFFIXES = .idl C.cpp
|
||
.idlC.cpp:
|
||
# whatever
|
||
@end example
|
||
|
||
As you may have noted, the @code{SUFFIXES} variable behaves like the
|
||
@code{.SUFFIXES} special target of @command{make}. You should not touch
|
||
@code{.SUFFIXES} yourself, but use @code{SUFFIXES} instead and let
|
||
Automake generate the suffix list for @code{.SUFFIXES}. Any given
|
||
@code{SUFFIXES} go at the start of the generated suffixes list, followed
|
||
by Automake generated suffixes not already in the list.
|
||
|
||
@node Include
|
||
@chapter Include
|
||
|
||
@cmindex include
|
||
@cindex Including @file{Makefile} fragment
|
||
@cindex @file{Makefile} fragment, including
|
||
|
||
Automake supports an @code{include} directive that can be used to
|
||
include other @file{Makefile} fragments when @command{automake} is run.
|
||
Note that these fragments are read and interpreted by @command{automake},
|
||
not by @command{make}. As with conditionals, @command{make} has no idea that
|
||
@code{include} is in use.
|
||
|
||
There are two forms of @code{include}:
|
||
|
||
@table @code
|
||
@item include $(srcdir)/file
|
||
Include a fragment that is found relative to the current source
|
||
directory.
|
||
|
||
@item include $(top_srcdir)/file
|
||
Include a fragment that is found relative to the top source directory.
|
||
@end table
|
||
|
||
Note that if a fragment is included inside a conditional, then the
|
||
condition applies to the entire contents of that fragment.
|
||
|
||
Makefile fragments included this way are always distributed because
|
||
they are needed to rebuild @file{Makefile.in}.
|
||
|
||
Inside a fragment, the construct @code{%reldir%} is replaced with the
|
||
directory of the fragment relative to the base @file{Makefile.am}.
|
||
Similarly, @code{%canon_reldir%} is replaced with the canonicalized
|
||
(@pxref{Canonicalization}) form of @code{%reldir%}. As a convenience,
|
||
@code{%D%} is a synonym for @code{%reldir%}, and @code{%C%}
|
||
is a synonym for @code{%canon_reldir%}.
|
||
|
||
A special feature is that if the fragment is in the same directory as
|
||
the base @file{Makefile.am} (i.e., @code{%reldir%} is @code{.}), then
|
||
@code{%reldir%} and @code{%canon_reldir%} will expand to the empty
|
||
string as well as eat, if present, a following slash or underscore
|
||
respectively.
|
||
|
||
Thus, a makefile fragment might look like this:
|
||
|
||
@example
|
||
bin_PROGRAMS += %reldir%/mumble
|
||
%canon_reldir%_mumble_SOURCES = %reldir%/one.c
|
||
@end example
|
||
|
||
@node Conditionals
|
||
@chapter Conditionals
|
||
|
||
@cindex Conditionals
|
||
|
||
Automake supports a simple type of conditionals.
|
||
|
||
These conditionals are not the same as conditionals in
|
||
GNU Make. Automake conditionals are checked at configure time by the
|
||
@file{configure} script, and affect the translation from
|
||
@file{Makefile.in} to @file{Makefile}. They are based on options passed
|
||
to @file{configure} and on results that @file{configure} has discovered
|
||
about the host system. GNU Make conditionals are checked at @command{make}
|
||
time, and are based on variables passed to the make program or defined
|
||
in the @file{Makefile}.
|
||
|
||
Automake conditionals will work with any make program.
|
||
|
||
@menu
|
||
* Usage of Conditionals:: Declaring conditional content
|
||
* Limits of Conditionals:: Enclosing complete statements
|
||
@end menu
|
||
|
||
@node Usage of Conditionals
|
||
@section Usage of Conditionals
|
||
|
||
@acindex AM_CONDITIONAL
|
||
Before using a conditional, you must define it by using
|
||
@code{AM_CONDITIONAL} in the @file{configure.ac} file (@pxref{Macros}).
|
||
|
||
@defmac AM_CONDITIONAL (@var{conditional}, @var{condition})
|
||
The conditional name, @var{conditional}, should be a simple string
|
||
starting with a letter and containing only letters, digits, and
|
||
underscores. It must be different from @samp{TRUE} and @samp{FALSE}
|
||
that are reserved by Automake.
|
||
|
||
The shell @var{condition} (suitable for use in a shell @code{if}
|
||
statement) is evaluated when @command{configure} is run. Note that you
|
||
must arrange for @emph{every} @code{AM_CONDITIONAL} to be invoked every
|
||
time @command{configure} is run. If @code{AM_CONDITIONAL} is run
|
||
conditionally (e.g., in a shell @code{if} statement), then the result
|
||
will confuse @command{automake}.
|
||
@end defmac
|
||
|
||
@cindex @option{--enable-debug}, example
|
||
@cindex Example conditional @option{--enable-debug}
|
||
@cindex Conditional example, @option{--enable-debug}
|
||
|
||
Conditionals typically depend upon options that the user provides to
|
||
the @command{configure} script. Here is an example of how to write a
|
||
conditional that is true if the user uses the @option{--enable-debug}
|
||
option.
|
||
|
||
@example
|
||
AC_ARG_ENABLE([debug],
|
||
[ --enable-debug Turn on debugging],
|
||
[case "$@{enableval@}" in
|
||
yes) debug=true ;;
|
||
no) debug=false ;;
|
||
*) AC_MSG_ERROR([bad value $@{enableval@} for --enable-debug]) ;;
|
||
esac],[debug=false])
|
||
AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
|
||
@end example
|
||
|
||
Here is an example of how to use that conditional in @file{Makefile.am}:
|
||
|
||
@cmindex if
|
||
@cmindex endif
|
||
@cmindex else
|
||
|
||
@example
|
||
if DEBUG
|
||
DBG = debug
|
||
else
|
||
DBG =
|
||
endif
|
||
noinst_PROGRAMS = $(DBG)
|
||
@end example
|
||
|
||
This trivial example could also be handled using @code{EXTRA_PROGRAMS}
|
||
(@pxref{Conditional Programs}).
|
||
|
||
You may only test a single variable in an @code{if} statement, possibly
|
||
negated using @samp{!}. The @code{else} statement may be omitted.
|
||
Conditionals may be nested to any depth. You may specify an argument to
|
||
@code{else} in which case it must be the negation of the condition used
|
||
for the current @code{if}. Similarly you may specify the condition
|
||
that is closed on the @code{endif} line:
|
||
|
||
@example
|
||
if DEBUG
|
||
DBG = debug
|
||
else !DEBUG
|
||
DBG =
|
||
endif !DEBUG
|
||
@end example
|
||
|
||
@noindent
|
||
Unbalanced conditions are errors. The @code{if}, @code{else}, and
|
||
@code{endif} statements should not be indented, i.e., start on column
|
||
one.
|
||
|
||
The @code{else} branch of the above two examples could be omitted,
|
||
since assigning the empty string to an otherwise undefined variable
|
||
makes no difference.
|
||
|
||
@acindex AM_COND_IF
|
||
In order to allow access to the condition registered by
|
||
@code{AM_CONDITIONAL} inside @file{configure.ac}, and to allow
|
||
conditional @code{AC_CONFIG_FILES}, @code{AM_COND_IF} may be used:
|
||
|
||
@defmac AM_COND_IF (@var{conditional}, @ovar{if-true}, @ovar{if-false})
|
||
If @var{conditional} is fulfilled, execute @var{if-true}, otherwise
|
||
execute @var{if-false}. If either branch contains @code{AC_CONFIG_FILES},
|
||
it will cause @command{automake} to output the rules for the respective
|
||
files only for the given condition.
|
||
@end defmac
|
||
|
||
@code{AM_COND_IF} macros may be nested when m4 quotation is used
|
||
properly (@pxref{M4 Quotation, ,, autoconf, The Autoconf Manual}).
|
||
|
||
@cindex Example conditional @code{AC_CONFIG_FILES}
|
||
@cindex @code{AC_CONFIG_FILES}, conditional
|
||
|
||
Here is an example of how to define a conditional config file:
|
||
|
||
@example
|
||
AM_CONDITIONAL([SHELL_WRAPPER], [test "x$with_wrapper" = xtrue])
|
||
AM_COND_IF([SHELL_WRAPPER],
|
||
[AC_CONFIG_FILES([wrapper:wrapper.in])])
|
||
@end example
|
||
|
||
@node Limits of Conditionals
|
||
@section Limits of Conditionals
|
||
|
||
Conditionals should enclose complete statements like variables or
|
||
rules definitions. Automake cannot deal with conditionals used inside
|
||
a variable definition, for instance, and is not even able to diagnose
|
||
this situation. The following example would not work:
|
||
|
||
@example
|
||
# This syntax is not understood by Automake
|
||
AM_CPPFLAGS = \
|
||
-DFEATURE_A \
|
||
if WANT_DEBUG
|
||
-DDEBUG \
|
||
endif
|
||
-DFEATURE_B
|
||
@end example
|
||
|
||
However the intended definition of @code{AM_CPPFLAGS} can be achieved
|
||
with
|
||
|
||
@example
|
||
if WANT_DEBUG
|
||
DEBUGFLAGS = -DDEBUG
|
||
endif
|
||
AM_CPPFLAGS = -DFEATURE_A $(DEBUGFLAGS) -DFEATURE_B
|
||
@end example
|
||
|
||
@noindent
|
||
or
|
||
|
||
@example
|
||
AM_CPPFLAGS = -DFEATURE_A
|
||
if WANT_DEBUG
|
||
AM_CPPFLAGS += -DDEBUG
|
||
endif
|
||
AM_CPPFLAGS += -DFEATURE_B
|
||
@end example
|
||
|
||
More details and examples of conditionals are described alongside
|
||
various Automake features in this manual (@pxref{Conditional
|
||
Subdirectories}, @pxref{Conditional Sources}, @pxref{Conditional
|
||
Programs}, @pxref{Conditional Libtool Libraries}, @pxref{Conditional
|
||
Libtool Sources}).
|
||
|
||
@node Silencing Make
|
||
@chapter Silencing @command{make}
|
||
|
||
@cindex Silent @command{make}
|
||
@cindex Silencing @command{make}
|
||
@cindex Silent rules
|
||
@cindex Silent @command{make} rules
|
||
|
||
@menu
|
||
* Make verbosity:: Make is verbose by default
|
||
* Tricks For Silencing Make:: Standard and generic ways to silence make
|
||
* Automake Silent Rules:: How Automake can help in silencing make
|
||
@end menu
|
||
|
||
@node Make verbosity
|
||
@section Make is verbose by default
|
||
|
||
Normally, when executing the set of rules associated with a target,
|
||
@command{make} prints each rule before it is executed. This behaviour,
|
||
while having been in place for a long time, and being even mandated by
|
||
the POSIX standard, starkly violates the ``silence is golden'' UNIX
|
||
principle@footnote{See also
|
||
@uref{http://catb.org/~esr/writings/taoup/html/ch11s09.html}.}:
|
||
|
||
@quotation
|
||
When a program has nothing interesting or surprising to say, it should
|
||
say nothing. Well-behaved Unix programs do their jobs unobtrusively,
|
||
with a minimum of fuss and bother. Silence is golden.
|
||
@end quotation
|
||
|
||
In fact, while such verbosity of @command{make} can theoretically be
|
||
useful to track bugs and understand reasons of failures right away, it
|
||
can also hide warning and error messages from @command{make}-invoked
|
||
tools, drowning them in a flood of uninteresting and seldom useful
|
||
messages, and thus allowing them to go easily undetected.
|
||
|
||
This problem can be very annoying, especially for developers, who usually
|
||
know quite well what's going on behind the scenes, and for whom the
|
||
verbose output from @command{make} ends up being mostly noise that hampers
|
||
the easy detection of potentially important warning messages.
|
||
|
||
@node Tricks For Silencing Make
|
||
@section Standard and generic ways to silence make
|
||
|
||
Here we describe some common idioms/tricks to obtain a quieter make
|
||
output, with their relative advantages and drawbacks. In the next
|
||
section (@ref{Automake Silent Rules}) we'll see how Automake can help
|
||
in this respect, providing more elaborate and flexible idioms.
|
||
|
||
@itemize @bullet
|
||
|
||
@item @command{make -s}
|
||
|
||
This simply causes @command{make} not to print @emph{any} rule before
|
||
executing it.
|
||
|
||
The @option{-s} flag is mandated by POSIX, universally supported, and
|
||
its purpose and function are easy to understand.
|
||
|
||
But it also has its serious limitations too. First of all, it embodies
|
||
an ``all or nothing'' strategy, i.e., either everything is silenced, or
|
||
nothing is; this lack of granularity can sometimes be a fatal flaw.
|
||
Moreover, when the @option{-s} flag is used, the @command{make} output
|
||
might turn out to be too much terse; in case of errors, the user won't
|
||
be able to easily see what rule or command have caused them, or even,
|
||
in case of tools with poor error reporting, what the errors were!
|
||
|
||
@item @command{make >/dev/null || make}
|
||
|
||
Apparently, this perfectly obeys the ``silence is golden'' rule: warnings
|
||
from stderr are passed through, output reporting is done only in case of
|
||
error, and in that case it should provide a verbose-enough report to allow
|
||
an easy determination of the error location and causes.
|
||
|
||
However, calling @command{make} two times in a row might hide errors
|
||
(especially intermittent ones), or subtly change the expected semantic
|
||
of the @command{make} calls --- things these which can clearly make
|
||
debugging and error assessment very difficult.
|
||
|
||
@item @command{make --no-print-directory}
|
||
|
||
This is GNU @command{make} specific. When called with the
|
||
@option{--no-print-directory} option, GNU @command{make} will disable
|
||
printing of the working directory by invoked sub-@command{make}s (the
|
||
well-known ``@i{Entering/Leaving directory ...}'' messages). This helps
|
||
to decrease the verbosity of the output, but experience has shown that
|
||
it can also often render debugging considerably harder in projects using
|
||
deeply-nested @command{make} recursion.
|
||
|
||
As an aside, notice that the @option{--no-print-directory} option is
|
||
automatically activated if the @option{-s} flag is used.
|
||
|
||
@c TODO: Other tricks?
|
||
@c TODO: Maybe speak about the @code{.SILENT} target?
|
||
@c TODO: - Pros: More granularity on what to silence.
|
||
@c TODO: - Cons: No easy way to temporarily override.
|
||
|
||
@end itemize
|
||
|
||
@node Automake Silent Rules
|
||
@section How Automake can help in silencing make
|
||
|
||
The tricks and idioms for silencing @command{make} described in the
|
||
previous section can be useful from time to time, but we've seen that
|
||
they all have their serious drawbacks and limitations. That's why
|
||
automake provides support for a more advanced and flexible way of
|
||
obtaining quieter output from @command{make} (for most rules at least).
|
||
|
||
To give the gist of what Automake can do in this respect, here is a simple
|
||
comparison between a typical @command{make} output (where silent rules
|
||
are disabled) and one with silent rules enabled:
|
||
|
||
@example
|
||
% @kbd{cat Makefile.am}
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = main.c func.c
|
||
% @kbd{cat main.c}
|
||
int main (void) @{ return func (); @} /* func used undeclared */
|
||
% @kbd{cat func.c}
|
||
int func (void) @{ int i; return i; @} /* i used uninitialized */
|
||
|
||
@i{The make output is by default very verbose. This causes warnings
|
||
from the compiler to be somewhat hidden, and not immediate to spot.}
|
||
% @kbd{make CFLAGS=-Wall}
|
||
gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
|
||
-DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
|
||
-DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT main.o
|
||
-MD -MP -MF .deps/main.Tpo -c -o main.o main.c
|
||
main.c: In function ‘main’:
|
||
main.c:3:3: warning: implicit declaration of function ‘func’
|
||
mv -f .deps/main.Tpo .deps/main.Po
|
||
gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ...
|
||
-DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ...
|
||
-DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT func.o
|
||
-MD -MP -MF .deps/func.Tpo -c -o func.o func.c
|
||
func.c: In function ‘func’:
|
||
func.c:4:3: warning: ‘i’ used uninitialized in this function
|
||
mv -f .deps/func.Tpo .deps/func.Po
|
||
gcc -Wall -o foo main.o func.o
|
||
|
||
@i{Clean up, so that we we can rebuild everything from scratch.}
|
||
% @kbd{make clean}
|
||
test -z "foo" || rm -f foo
|
||
rm -f *.o
|
||
|
||
@i{Silent rules enabled: the output is minimal but informative. In
|
||
particular, the warnings from the compiler stick out very clearly.}
|
||
% @kbd{make V=0 CFLAGS=-Wall}
|
||
CC main.o
|
||
main.c: In function ‘main’:
|
||
main.c:3:3: warning: implicit declaration of function ‘func’
|
||
CC func.o
|
||
func.c: In function ‘func’:
|
||
func.c:4:3: warning: ‘i’ used uninitialized in this function
|
||
CCLD foo
|
||
@end example
|
||
|
||
@cindex silent rules and libtool
|
||
Also, in projects using @command{libtool}, the use of silent rules can
|
||
automatically enable the @command{libtool}'s @option{--silent} option:
|
||
|
||
@example
|
||
% @kbd{cat Makefile.am}
|
||
lib_LTLIBRARIES = libx.la
|
||
|
||
% @kbd{make # Both make and libtool are verbose by default.}
|
||
...
|
||
libtool: compile: gcc -DPACKAGE_NAME=\"foo\" ... -DLT_OBJDIR=\".libs/\"
|
||
-I. -g -O2 -MT libx.lo -MD -MP -MF .deps/libx.Tpo -c libx.c -fPIC
|
||
-DPIC -o .libs/libx.o
|
||
mv -f .deps/libx.Tpo .deps/libx.Plo
|
||
/bin/sh ./libtool --tag=CC --mode=link gcc -g -O2 -o libx.la -rpath
|
||
/usr/local/lib libx.lo
|
||
libtool: link: gcc -shared .libs/libx.o -Wl,-soname -Wl,libx.so.0
|
||
-o .libs/libx.so.0.0.0
|
||
libtool: link: cd .libs && rm -f libx.so && ln -s libx.so.0.0.0 libx.so
|
||
...
|
||
|
||
% @kbd{make V=0}
|
||
CC libx.lo
|
||
CCLD libx.la
|
||
@end example
|
||
|
||
For Automake-generated @file{Makefile}s, the user may influence the
|
||
verbosity at @command{configure} run time as well as at @command{make}
|
||
run time:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@opindex --enable-silent-rules
|
||
@opindex --disable-silent-rules
|
||
Passing @option{--enable-silent-rules} to @command{configure} will cause
|
||
build rules to be less verbose; the option @option{--disable-silent-rules}
|
||
will cause normal verbose output.
|
||
@item
|
||
@vindex @code{V}
|
||
At @command{make} run time, the default chosen at @command{configure}
|
||
time may be overridden: @code{make V=1} will produce verbose output,
|
||
@code{make V=0} less verbose output.
|
||
@end itemize
|
||
|
||
@cindex default verbosity for silent rules
|
||
Note that silent rules are @emph{disabled} by default; the user must
|
||
enable them explicitly at either @command{configure} run time or at
|
||
@command{make} run time. We think that this is a good policy, since
|
||
it provides the casual user with enough information to prepare a good
|
||
bug report in case anything breaks.
|
||
|
||
Still, notwithstanding the rationales above, a developer who really
|
||
wants to make silent rules enabled by default in his own package can
|
||
do so by calling @code{AM_SILENT_RULES([yes])} in @file{configure.ac}.
|
||
|
||
@c Keep in sync with silent-configsite.sh
|
||
Users who prefer to have silent rules enabled by default can edit their
|
||
@file{config.site} file to make the variable @code{enable_silent_rules}
|
||
default to @samp{yes}. This should still allow disabling silent rules
|
||
at @command{configure} time and at @command{make} time.
|
||
|
||
@c FIXME: there's really a need to specify this explicitly?
|
||
For portability to different @command{make} implementations, package authors
|
||
are advised to not set the variable @code{V} inside the @file{Makefile.am}
|
||
file, to allow the user to override the value for subdirectories as well.
|
||
|
||
To work at its best, the current implementation of this feature normally
|
||
uses nested variable expansion @samp{$(@var{var1}$(V))}, a @file{Makefile}
|
||
feature that is not required by POSIX 2008 but is widely supported in
|
||
practice. On the rare @command{make} implementations that do not support
|
||
nested variable expansion, whether rules are silent is always determined at
|
||
configure time, and cannot be overridden at make time. Future versions of
|
||
POSIX are likely to require nested variable expansion, so this minor
|
||
limitation should go away with time.
|
||
|
||
@vindex @code{AM_V_GEN}
|
||
@vindex @code{AM_V_at}
|
||
@vindex @code{AM_DEFAULT_VERBOSITY}
|
||
@vindex @code{AM_V}
|
||
@vindex @code{AM_DEFAULT_V}
|
||
To extend the silent mode to your own rules, you have few choices:
|
||
|
||
@itemize @bullet
|
||
|
||
@item
|
||
You can use the predefined variable @code{AM_V_GEN} as a prefix to
|
||
commands that should output a status line in silent mode, and
|
||
@code{AM_V_at} as a prefix to commands that should not output anything
|
||
in silent mode. When output is to be verbose, both of these variables
|
||
will expand to the empty string.
|
||
|
||
@item
|
||
You can silence a recipe unconditionally with @code{@@}, and then use
|
||
the predefined variable @code{AM_V_P} to know whether make is being run
|
||
in silent or verbose mode, adjust the verbose information your recipe
|
||
displays accordingly:
|
||
|
||
@example
|
||
generate-headers:
|
||
@set -e; \
|
||
... [commands defining a shell variable '$headers'] ...; \
|
||
if $(AM_V_P); then set -x; else echo " GEN [headers]"; fi; \
|
||
rm -f $$headers && generate-header --flags $$headers
|
||
@end example
|
||
|
||
@item
|
||
You can add your own variables, so strings of your own choice are shown.
|
||
The following snippet shows how you would define your own equivalent of
|
||
@code{AM_V_GEN}:
|
||
|
||
@example
|
||
pkg_verbose = $(pkg_verbose_@@AM_V@@)
|
||
pkg_verbose_ = $(pkg_verbose_@@AM_DEFAULT_V@@)
|
||
pkg_verbose_0 = @@echo PKG-GEN $@@;
|
||
|
||
foo: foo.in
|
||
$(pkg_verbose)cp $(srcdir)/foo.in $@@
|
||
@end example
|
||
|
||
@end itemize
|
||
|
||
As a final note, observe that, even when silent rules are enabled,
|
||
the @option{--no-print-directory} option is still required with GNU
|
||
@command{make} if the ``@i{Entering/Leaving directory ...}'' messages
|
||
are to be disabled.
|
||
|
||
@node Gnits
|
||
@chapter The effect of @option{--gnu} and @option{--gnits}
|
||
|
||
@cindex @option{--gnu}, required files
|
||
@cindex @option{--gnu}, complete description
|
||
|
||
The @option{--gnu} option (or @option{gnu} in the
|
||
@code{AUTOMAKE_OPTIONS} variable) causes @command{automake} to check
|
||
the following:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The files @file{INSTALL}, @file{NEWS}, @file{README}, @file{AUTHORS},
|
||
and @file{ChangeLog}, plus one of @file{COPYING.LIB}, @file{COPYING.LESSER}
|
||
or @file{COPYING}, are required at the topmost directory of the package.
|
||
|
||
If the @option{--add-missing} option is given, @command{automake} will
|
||
add a generic version of the @file{INSTALL} file as well as the
|
||
@file{COPYING} file containing the text of the current version of the
|
||
GNU General Public License existing at the time of this Automake release
|
||
(version 3 as this is written, @uref{http://www.gnu.org/@/copyleft/@/gpl.html}).
|
||
However, an existing @file{COPYING} file will never be overwritten by
|
||
@command{automake}.
|
||
|
||
@item
|
||
The options @option{no-installman} and @option{no-installinfo} are
|
||
prohibited.
|
||
@end itemize
|
||
|
||
Note that this option will be extended in the future to do even more
|
||
checking; it is advisable to be familiar with the precise requirements
|
||
of the GNU standards. Also, @option{--gnu} can require certain
|
||
non-standard GNU programs to exist for use by various maintainer-only
|
||
rules; for instance, in the future @command{pathchk} might be required for
|
||
@samp{make dist}.
|
||
|
||
@cindex @option{--gnits}, complete description
|
||
|
||
The @option{--gnits} option does everything that @option{--gnu} does, and
|
||
checks the following as well:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@samp{make installcheck} will check to make sure that the @option{--help}
|
||
and @option{--version} really print a usage message and a version string,
|
||
respectively. This is the @option{std-options} option (@pxref{Options}).
|
||
|
||
@item
|
||
@samp{make dist} will check to make sure the @file{NEWS} file has been
|
||
updated to the current version.
|
||
|
||
@item
|
||
@code{VERSION} is checked to make sure its format complies with Gnits
|
||
standards.
|
||
@c FIXME xref when standards are finished
|
||
|
||
@item
|
||
@cindex @file{README-alpha}
|
||
If @code{VERSION} indicates that this is an alpha release, and the file
|
||
@file{README-alpha} appears in the topmost directory of a package, then
|
||
it is included in the distribution. This is done in @option{--gnits}
|
||
mode, and no other, because this mode is the only one where version
|
||
number formats are constrained, and hence the only mode where Automake
|
||
can automatically determine whether @file{README-alpha} should be
|
||
included.
|
||
|
||
@item
|
||
The file @file{THANKS} is required.
|
||
@end itemize
|
||
|
||
|
||
@node Not Enough
|
||
@chapter When Automake Isn't Enough
|
||
|
||
In some situations, where Automake is not up to one task, one has to
|
||
resort to handwritten rules or even handwritten @file{Makefile}s.
|
||
|
||
@menu
|
||
* Extending:: Adding new rules or overriding existing ones.
|
||
* Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s.
|
||
@end menu
|
||
|
||
@node Extending
|
||
@section Extending Automake Rules
|
||
|
||
With some minor exceptions (for example @code{_PROGRAMS} variables,
|
||
@code{TESTS}, or @code{XFAIL_TESTS}) being rewritten to append
|
||
@samp{$(EXEEXT)}), the contents of a @file{Makefile.am} is copied to
|
||
@file{Makefile.in} verbatim.
|
||
|
||
@cindex copying semantics
|
||
|
||
These copying semantics mean that many problems can be worked around
|
||
by simply adding some @command{make} variables and rules to
|
||
@file{Makefile.am}. Automake will ignore these additions.
|
||
|
||
@cindex conflicting definitions
|
||
@cindex rules, conflicting
|
||
@cindex variables, conflicting
|
||
@cindex definitions, conflicts
|
||
|
||
Since a @file{Makefile.in} is built from data gathered from three
|
||
different places (@file{Makefile.am}, @file{configure.ac}, and
|
||
@command{automake} itself), it is possible to have conflicting
|
||
definitions of rules or variables. When building @file{Makefile.in}
|
||
the following priorities are respected by @command{automake} to ensure
|
||
the user always has the last word:
|
||
|
||
@itemize
|
||
@item
|
||
User defined variables in @file{Makefile.am} have priority over
|
||
variables @code{AC_SUBST}ed from @file{configure.ac}, and
|
||
@code{AC_SUBST}ed variables have priority over
|
||
@command{automake}-defined variables.
|
||
@item
|
||
As far as rules are concerned, a user-defined rule overrides any
|
||
@command{automake}-defined rule for the same target.
|
||
@end itemize
|
||
|
||
@cindex overriding rules
|
||
@cindex overriding semantics
|
||
@cindex rules, overriding
|
||
|
||
These overriding semantics make it possible to fine tune some default
|
||
settings of Automake, or replace some of its rules. Overriding
|
||
Automake rules is often inadvisable, particularly in the topmost
|
||
directory of a package with subdirectories. The @option{-Woverride}
|
||
option (@pxref{automake Invocation}) comes in handy to catch overridden
|
||
definitions.
|
||
|
||
Note that Automake does not make any distinction between rules with
|
||
commands and rules that only specify dependencies. So it is not
|
||
possible to append new dependencies to an @command{automake}-defined
|
||
target without redefining the entire rule.
|
||
|
||
@cindex @option{-local} targets
|
||
@cindex local targets
|
||
|
||
However, various useful targets have a @samp{-local} version you can
|
||
specify in your @file{Makefile.am}. Automake will supplement the
|
||
standard target with these user-supplied targets.
|
||
|
||
@trindex all
|
||
@trindex all-local
|
||
@trindex info
|
||
@trindex info-local
|
||
@trindex dvi
|
||
@trindex dvi-local
|
||
@trindex ps
|
||
@trindex ps-local
|
||
@trindex pdf
|
||
@trindex pdf-local
|
||
@trindex html
|
||
@trindex html-local
|
||
@trindex check
|
||
@trindex check-local
|
||
@trindex install
|
||
@trindex install-data
|
||
@trindex install-data-local
|
||
@trindex install-dvi
|
||
@trindex install-dvi-local
|
||
@trindex install-exec
|
||
@trindex install-exec-local
|
||
@trindex install-html
|
||
@trindex install-html-local
|
||
@trindex install-info
|
||
@trindex install-info-local
|
||
@trindex install-pdf
|
||
@trindex install-pdf-local
|
||
@trindex install-ps
|
||
@trindex install-ps-local
|
||
@trindex uninstall
|
||
@trindex uninstall-local
|
||
@trindex mostlyclean
|
||
@trindex mostlyclean-local
|
||
@trindex clean
|
||
@trindex clean-local
|
||
@trindex distclean
|
||
@trindex distclean-local
|
||
@trindex installdirs
|
||
@trindex installdirs-local
|
||
@trindex installcheck
|
||
@trindex installcheck-local
|
||
|
||
The targets that support a local version are @code{all}, @code{info},
|
||
@code{dvi}, @code{ps}, @code{pdf}, @code{html}, @code{check},
|
||
@code{install-data}, @code{install-dvi}, @code{install-exec},
|
||
@code{install-html}, @code{install-info}, @code{install-pdf},
|
||
@code{install-ps}, @code{uninstall}, @code{installdirs},
|
||
@code{installcheck} and the various @code{clean} targets
|
||
(@code{mostlyclean}, @code{clean}, @code{distclean}, and
|
||
@code{maintainer-clean}).
|
||
|
||
Note that there are no @code{uninstall-exec-local} or
|
||
@code{uninstall-data-local} targets; just use @code{uninstall-local}.
|
||
It doesn't make sense to uninstall just data or just executables.
|
||
|
||
For instance, here is one way to erase a subdirectory during
|
||
@samp{make clean} (@pxref{Clean}).
|
||
|
||
@example
|
||
clean-local:
|
||
-rm -rf testSubDir
|
||
@end example
|
||
|
||
You may be tempted to use @code{install-data-local} to install a file
|
||
to some hard-coded location, but you should avoid this
|
||
(@pxref{Hard-Coded Install Paths}).
|
||
|
||
With the @code{-local} targets, there is no particular guarantee of
|
||
execution order; typically, they are run early, but with parallel
|
||
make, there is no way to be sure of that.
|
||
|
||
@cindex @option{-hook} targets
|
||
@cindex hook targets
|
||
@trindex install-data-hook
|
||
@trindex install-exec-hook
|
||
@trindex uninstall-hook
|
||
@trindex dist-hook
|
||
|
||
In contrast, some rules also have a way to run another rule, called a
|
||
@dfn{hook}; hooks are always executed after the main rule's work is done.
|
||
The hook is named after the principal target, with @samp{-hook} appended.
|
||
The targets allowing hooks are @code{install-data},
|
||
@code{install-exec}, @code{uninstall}, @code{dist}, and
|
||
@code{distcheck}.
|
||
|
||
For instance, here is how to create a hard link to an installed program:
|
||
|
||
@example
|
||
install-exec-hook:
|
||
ln $(DESTDIR)$(bindir)/program$(EXEEXT) \
|
||
$(DESTDIR)$(bindir)/proglink$(EXEEXT)
|
||
@end example
|
||
|
||
Although cheaper and more portable than symbolic links, hard links
|
||
will not work everywhere (for instance, OS/2 does not have
|
||
@command{ln}). Ideally you should fall back to @samp{cp -p} when
|
||
@command{ln} does not work. An easy way, if symbolic links are
|
||
acceptable to you, is to add @code{AC_PROG_LN_S} to
|
||
@file{configure.ac} (@pxref{Particular Programs, , Particular Program
|
||
Checks, autoconf, The Autoconf Manual}) and use @samp{$(LN_S)} in
|
||
@file{Makefile.am}.
|
||
|
||
@cindex versioned binaries, installing
|
||
@cindex installing versioned binaries
|
||
@cindex @code{LN_S} example
|
||
For instance, here is how you could install a versioned copy of a
|
||
program using @samp{$(LN_S)}:
|
||
|
||
@c Keep in sync with insthook.sh
|
||
@example
|
||
install-exec-hook:
|
||
cd $(DESTDIR)$(bindir) && \
|
||
mv -f prog$(EXEEXT) prog-$(VERSION)$(EXEEXT) && \
|
||
$(LN_S) prog-$(VERSION)$(EXEEXT) prog$(EXEEXT)
|
||
@end example
|
||
|
||
Note that we rename the program so that a new version will erase the
|
||
symbolic link, not the real binary. Also we @command{cd} into the
|
||
destination directory in order to create relative links.
|
||
|
||
When writing @code{install-exec-hook} or @code{install-data-hook},
|
||
please bear in mind that the exec/data distinction is based on the
|
||
installation directory, not on the primary used (@pxref{The Two Parts of
|
||
Install}).
|
||
@c Keep in sync with primary-prefix-couples-documented-valid.sh
|
||
So a @code{foo_SCRIPTS} will be installed by
|
||
@code{install-data}, and a @code{barexec_SCRIPTS} will be installed by
|
||
@code{install-exec}. You should define your hooks consequently.
|
||
|
||
@c FIXME should include discussion of variables you can use in these
|
||
@c rules
|
||
|
||
@node Third-Party Makefiles
|
||
@section Third-Party @file{Makefile}s
|
||
|
||
@cindex Third-party packages, interfacing with
|
||
@cindex Interfacing with third-party packages
|
||
|
||
In most projects all @file{Makefile}s are generated by Automake. In
|
||
some cases, however, projects need to embed subdirectories with
|
||
handwritten @file{Makefile}s. For instance, one subdirectory could be
|
||
a third-party project with its own build system, not using Automake.
|
||
|
||
It is possible to list arbitrary directories in @code{SUBDIRS} or
|
||
@code{DIST_SUBDIRS} provided each of these directories has a
|
||
@file{Makefile} that recognizes all the following recursive targets.
|
||
|
||
@cindex recursive targets and third-party @file{Makefile}s
|
||
When a user runs one of these targets, that target is run recursively
|
||
in all subdirectories. This is why it is important that even
|
||
third-party @file{Makefile}s support them.
|
||
|
||
@table @code
|
||
@item all
|
||
Compile the entire package. This is the default target in
|
||
Automake-generated @file{Makefile}s, but it does not need to be the
|
||
default in third-party @file{Makefile}s.
|
||
|
||
@item distdir
|
||
@trindex distdir
|
||
@vindex distdir
|
||
@vindex top_distdir
|
||
Copy files to distribute into @samp{$(distdir)}, before a tarball is
|
||
constructed. Of course this target is not required if the
|
||
@option{no-dist} option (@pxref{Options}) is used.
|
||
|
||
The variables @samp{$(top_distdir)} and @samp{$(distdir)}
|
||
(@pxref{The dist Hook}) will be passed from the outer package to the subpackage
|
||
when the @code{distdir} target is invoked. These two variables have
|
||
been adjusted for the directory that is being recursed into, so they
|
||
are ready to use.
|
||
|
||
@item install
|
||
@itemx install-data
|
||
@itemx install-exec
|
||
@itemx uninstall
|
||
Install or uninstall files (@pxref{Install}).
|
||
|
||
@item install-dvi
|
||
@itemx install-html
|
||
@itemx install-info
|
||
@itemx install-ps
|
||
@itemx install-pdf
|
||
Install only some specific documentation format (@pxref{Texinfo}).
|
||
|
||
@item installdirs
|
||
Create install directories, but do not install any files.
|
||
|
||
@item check
|
||
@itemx installcheck
|
||
Check the package (@pxref{Tests}).
|
||
|
||
@item mostlyclean
|
||
@itemx clean
|
||
@itemx distclean
|
||
@itemx maintainer-clean
|
||
Cleaning rules (@pxref{Clean}).
|
||
|
||
@item dvi
|
||
@itemx pdf
|
||
@itemx ps
|
||
@itemx info
|
||
@itemx html
|
||
Build the documentation in various formats (@pxref{Texinfo}).
|
||
|
||
@item tags
|
||
@itemx ctags
|
||
Build @file{TAGS} and @file{CTAGS} (@pxref{Tags}).
|
||
@end table
|
||
|
||
If you have ever used Gettext in a project, this is a good example of
|
||
how third-party @file{Makefile}s can be used with Automake. The
|
||
@file{Makefile}s @command{gettextize} puts in the @file{po/} and
|
||
@file{intl/} directories are handwritten @file{Makefile}s that
|
||
implement all of these targets. That way they can be added to
|
||
@code{SUBDIRS} in Automake packages.
|
||
|
||
Directories that are only listed in @code{DIST_SUBDIRS} but not in
|
||
@code{SUBDIRS} need only the @code{distclean},
|
||
@code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional
|
||
Subdirectories}).
|
||
|
||
Usually, many of these rules are irrelevant to the third-party
|
||
subproject, but they are required for the whole package to work. It's
|
||
OK to have a rule that does nothing, so if you are integrating a
|
||
third-party project with no documentation or tag support, you could
|
||
simply augment its @file{Makefile} as follows:
|
||
|
||
@example
|
||
EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags
|
||
.PHONY: $(EMPTY_AUTOMAKE_TARGETS)
|
||
$(EMPTY_AUTOMAKE_TARGETS):
|
||
@end example
|
||
|
||
Another aspect of integrating third-party build systems is whether
|
||
they support VPATH builds (@pxref{VPATH Builds}). Obviously if the
|
||
subpackage does not support VPATH builds the whole package will not
|
||
support VPATH builds. This in turns means that @samp{make distcheck}
|
||
will not work, because it relies on VPATH builds. Some people can
|
||
live without this (actually, many Automake users have never heard of
|
||
@samp{make distcheck}). Other people may prefer to revamp the
|
||
existing @file{Makefile}s to support VPATH@. Doing so does not
|
||
necessarily require Automake, only Autoconf is needed (@pxref{Build
|
||
Directories, , Build Directories, autoconf, The Autoconf Manual}).
|
||
The necessary substitutions: @samp{@@srcdir@@}, @samp{@@top_srcdir@@},
|
||
and @samp{@@top_builddir@@} are defined by @file{configure} when it
|
||
processes a @file{Makefile} (@pxref{Preset Output Variables, , Preset
|
||
Output Variables, autoconf, The Autoconf Manual}), they are not
|
||
computed by the Makefile like the aforementioned @samp{$(distdir)} and
|
||
@samp{$(top_distdir)} variables.
|
||
|
||
It is sometimes inconvenient to modify a third-party @file{Makefile}
|
||
to introduce the above required targets. For instance, one may want to
|
||
keep the third-party sources untouched to ease upgrades to new
|
||
versions.
|
||
|
||
@cindex @file{GNUmakefile} including @file{Makefile}
|
||
Here are two other ideas. If GNU make is assumed, one possibility is
|
||
to add to that subdirectory a @file{GNUmakefile} that defines the
|
||
required targets and includes the third-party @file{Makefile}. For
|
||
this to work in VPATH builds, @file{GNUmakefile} must lie in the build
|
||
directory; the easiest way to do this is to write a
|
||
@file{GNUmakefile.in} instead, and have it processed with
|
||
@code{AC_CONFIG_FILES} from the outer package. For example if we
|
||
assume @file{Makefile} defines all targets except the documentation
|
||
targets, and that the @code{check} target is actually called
|
||
@code{test}, we could write @file{GNUmakefile} (or
|
||
@file{GNUmakefile.in}) like this:
|
||
|
||
@example
|
||
# First, include the real Makefile
|
||
include Makefile
|
||
# Then, define the other targets needed by Automake Makefiles.
|
||
.PHONY: dvi pdf ps info html check
|
||
dvi pdf ps info html:
|
||
check: test
|
||
@end example
|
||
|
||
@cindex Proxy @file{Makefile} for third-party packages
|
||
A similar idea that does not use @code{include} is to write a proxy
|
||
@file{Makefile} that dispatches rules to the real @file{Makefile},
|
||
either with @samp{$(MAKE) -f Makefile.real $(AM_MAKEFLAGS) target} (if
|
||
it's OK to rename the original @file{Makefile}) or with @samp{cd
|
||
subdir && $(MAKE) $(AM_MAKEFLAGS) target} (if it's OK to store the
|
||
subdirectory project one directory deeper). The good news is that
|
||
this proxy @file{Makefile} can be generated with Automake. All we
|
||
need are @option{-local} targets (@pxref{Extending}) that perform the
|
||
dispatch. Of course the other Automake features are available, so you
|
||
could decide to let Automake perform distribution or installation.
|
||
Here is a possible @file{Makefile.am}:
|
||
|
||
@example
|
||
all-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) all
|
||
check-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) test
|
||
clean-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) clean
|
||
|
||
# Assuming the package knows how to install itself
|
||
install-data-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-data
|
||
install-exec-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-exec
|
||
uninstall-local:
|
||
cd subdir && $(MAKE) $(AM_MAKEFLAGS) uninstall
|
||
|
||
# Distribute files from here.
|
||
EXTRA_DIST = subdir/Makefile subdir/program.c ...
|
||
@end example
|
||
|
||
Pushing this idea to the extreme, it is also possible to ignore the
|
||
subproject build system and build everything from this proxy
|
||
@file{Makefile.am}. This might sound very sensible if you need VPATH
|
||
builds but the subproject does not support them.
|
||
|
||
@node Distributing
|
||
@chapter Distributing @file{Makefile.in}s
|
||
|
||
Automake places no restrictions on the distribution of the resulting
|
||
@file{Makefile.in}s. We still encourage software authors to
|
||
distribute their work under terms like those of the GPL, but doing so
|
||
is not required to use Automake.
|
||
|
||
Some of the files that can be automatically installed via the
|
||
@option{--add-missing} switch do fall under the GPL@. However, these also
|
||
have a special exception allowing you to distribute them with your
|
||
package, regardless of the licensing you choose.
|
||
|
||
|
||
@node API Versioning
|
||
@chapter Automake API Versioning
|
||
|
||
New Automake releases usually include bug fixes and new features.
|
||
Unfortunately they may also introduce new bugs and incompatibilities.
|
||
This makes four reasons why a package may require a particular Automake
|
||
version.
|
||
|
||
Things get worse when maintaining a large tree of packages, each one
|
||
requiring a different version of Automake. In the past, this meant that
|
||
any developer (and sometimes users) had to install several versions of
|
||
Automake in different places, and switch @samp{$PATH} appropriately for
|
||
each package.
|
||
|
||
Starting with version 1.6, Automake installs versioned binaries. This
|
||
means you can install several versions of Automake in the same
|
||
@samp{$prefix}, and can select an arbitrary Automake version by running
|
||
@command{automake-1.6} or @command{automake-1.7} without juggling with
|
||
@samp{$PATH}. Furthermore, @file{Makefile}'s generated by Automake 1.6
|
||
will use @command{automake-1.6} explicitly in their rebuild rules.
|
||
|
||
The number @samp{1.6} in @command{automake-1.6} is Automake's API version,
|
||
not Automake's version. If a bug fix release is made, for instance
|
||
Automake 1.6.1, the API version will remain 1.6. This means that a
|
||
package that works with Automake 1.6 should also work with 1.6.1; after
|
||
all, this is what people expect from bug fix releases.
|
||
|
||
If your package relies on a feature or a bug fix introduced in
|
||
a release, you can pass this version as an option to Automake to ensure
|
||
older releases will not be used. For instance, use this in your
|
||
@file{configure.ac}:
|
||
|
||
@example
|
||
AM_INIT_AUTOMAKE([1.6.1]) dnl Require Automake 1.6.1 or better.
|
||
@end example
|
||
|
||
@noindent
|
||
or, in a particular @file{Makefile.am}:
|
||
|
||
@example
|
||
AUTOMAKE_OPTIONS = 1.6.1 # Require Automake 1.6.1 or better.
|
||
@end example
|
||
|
||
@noindent
|
||
Automake will print an error message if its version is
|
||
older than the requested version.
|
||
|
||
|
||
@heading What is in the API
|
||
|
||
Automake's programming interface is not easy to define. Basically it
|
||
should include at least all @strong{documented} variables and targets
|
||
that a @file{Makefile.am} author can use, any behavior associated with
|
||
them (e.g., the places where @samp{-hook}'s are run), the command line
|
||
interface of @command{automake} and @command{aclocal}, @dots{}
|
||
|
||
@heading What is not in the API
|
||
|
||
Every undocumented variable, target, or command line option, is not part
|
||
of the API@. You should avoid using them, as they could change from one
|
||
version to the other (even in bug fix releases, if this helps to fix a
|
||
bug).
|
||
|
||
If it turns out you need to use such an undocumented feature, contact
|
||
@email{automake@@gnu.org} and try to get it documented and exercised by
|
||
the test-suite.
|
||
|
||
@node Upgrading
|
||
@chapter Upgrading a Package to a Newer Automake Version
|
||
|
||
Automake maintains three kind of files in a package.
|
||
|
||
@itemize
|
||
@item @file{aclocal.m4}
|
||
@item @file{Makefile.in}s
|
||
@item auxiliary tools like @file{install-sh} or @file{py-compile}
|
||
@end itemize
|
||
|
||
@file{aclocal.m4} is generated by @command{aclocal} and contains some
|
||
Automake-supplied M4 macros. Auxiliary tools are installed by
|
||
@samp{automake --add-missing} when needed. @file{Makefile.in}s are
|
||
built from @file{Makefile.am} by @command{automake}, and rely on the
|
||
definitions of the M4 macros put in @file{aclocal.m4} as well as the
|
||
behavior of the auxiliary tools installed.
|
||
|
||
Because all of these files are closely related, it is important to
|
||
regenerate all of them when upgrading to a newer Automake release.
|
||
The usual way to do that is
|
||
|
||
@example
|
||
aclocal # with any option needed (such a -I m4)
|
||
autoconf
|
||
automake --add-missing --force-missing
|
||
@end example
|
||
|
||
@noindent
|
||
or more conveniently:
|
||
|
||
@example
|
||
autoreconf -vfi
|
||
@end example
|
||
|
||
The use of @option{--force-missing} ensures that auxiliary tools will be
|
||
overridden by new versions (@pxref{automake Invocation}).
|
||
|
||
It is important to regenerate all of these files each time Automake is
|
||
upgraded, even between bug fixes releases. For instance, it is not
|
||
unusual for a bug fix to involve changes to both the rules generated
|
||
in @file{Makefile.in} and the supporting M4 macros copied to
|
||
@file{aclocal.m4}.
|
||
|
||
Presently @command{automake} is able to diagnose situations where
|
||
@file{aclocal.m4} has been generated with another version of
|
||
@command{aclocal}. However it never checks whether auxiliary scripts
|
||
are up-to-date. In other words, @command{automake} will tell you when
|
||
@command{aclocal} needs to be rerun, but it will never diagnose a
|
||
missing @option{--force-missing}.
|
||
|
||
Before upgrading to a new major release, it is a good idea to read the
|
||
file @file{NEWS}. This file lists all changes between releases: new
|
||
features, obsolete constructs, known incompatibilities, and
|
||
workarounds.
|
||
|
||
@node FAQ
|
||
@chapter Frequently Asked Questions about Automake
|
||
|
||
This chapter covers some questions that often come up on the mailing
|
||
lists.
|
||
|
||
@menu
|
||
* CVS:: CVS and generated files
|
||
* maintainer-mode:: missing and AM_MAINTAINER_MODE
|
||
* Wildcards:: Why doesn't Automake support wildcards?
|
||
* Limitations on File Names:: Limitations on source and installed file names
|
||
* Errors with distclean:: Files left in build directory after distclean
|
||
* Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS
|
||
* Renamed Objects:: Why are object files sometimes renamed?
|
||
* Per-Object Flags:: How to simulate per-object flags?
|
||
* Multiple Outputs:: Writing rules for tools with many output files
|
||
* Hard-Coded Install Paths:: Installing to hard-coded locations
|
||
* Debugging Make Rules:: Strategies when things don't work as expected
|
||
* Reporting Bugs:: Feedback on bugs and feature requests
|
||
@end menu
|
||
|
||
@node CVS
|
||
@section CVS and generated files
|
||
|
||
@subheading Background: distributed generated Files
|
||
@cindex generated files, distributed
|
||
@cindex rebuild rules
|
||
|
||
Packages made with Autoconf and Automake ship with some generated
|
||
files like @file{configure} or @file{Makefile.in}. These files were
|
||
generated on the developer's machine and are distributed so that
|
||
end-users do not have to install the maintainer tools required to
|
||
rebuild them. Other generated files like Lex scanners, Yacc parsers,
|
||
or Info documentation, are usually distributed on similar grounds.
|
||
|
||
Automake output rules in @file{Makefile}s to rebuild these files. For
|
||
instance, @command{make} will run @command{autoconf} to rebuild
|
||
@file{configure} whenever @file{configure.ac} is changed. This makes
|
||
development safer by ensuring a @file{configure} is never out-of-date
|
||
with respect to @file{configure.ac}.
|
||
|
||
As generated files shipped in packages are up-to-date, and because
|
||
@command{tar} preserves times-tamps, these rebuild rules are not
|
||
triggered when a user unpacks and builds a package.
|
||
|
||
@subheading Background: CVS and Timestamps
|
||
@cindex timestamps and CVS
|
||
@cindex CVS and timestamps
|
||
|
||
Unless you use CVS keywords (in which case files must be updated at
|
||
commit time), CVS preserves timestamp during @samp{cvs commit} and
|
||
@samp{cvs import -d} operations.
|
||
|
||
When you check out a file using @samp{cvs checkout} its timestamp is
|
||
set to that of the revision that is being checked out.
|
||
|
||
However, during @command{cvs update}, files will have the date of the
|
||
update, not the original timestamp of this revision. This is meant to
|
||
make sure that @command{make} notices sources files have been updated.
|
||
|
||
This timestamp shift is troublesome when both sources and generated
|
||
files are kept under CVS@. Because CVS processes files in lexical
|
||
order, @file{configure.ac} will appear newer than @file{configure}
|
||
after a @command{cvs update} that updates both files, even if
|
||
@file{configure} was newer than @file{configure.ac} when it was
|
||
checked in. Calling @command{make} will then trigger a spurious rebuild
|
||
of @file{configure}.
|
||
|
||
@subheading Living with CVS in Autoconfiscated Projects
|
||
@cindex CVS and generated files
|
||
@cindex generated files and CVS
|
||
|
||
There are basically two clans amongst maintainers: those who keep all
|
||
distributed files under CVS, including generated files, and those who
|
||
keep generated files @emph{out} of CVS.
|
||
|
||
@subsubheading All Files in CVS
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The CVS repository contains all distributed files so you know exactly
|
||
what is distributed, and you can checkout any prior version entirely.
|
||
|
||
@item
|
||
Maintainers can see how generated files evolve (for instance, you can
|
||
see what happens to your @file{Makefile.in}s when you upgrade Automake
|
||
and make sure they look OK).
|
||
|
||
@item
|
||
Users do not need the autotools to build a checkout of the project, it
|
||
works just like a released tarball.
|
||
|
||
@item
|
||
If users use @command{cvs update} to update their copy, instead of
|
||
@command{cvs checkout} to fetch a fresh one, timestamps will be
|
||
inaccurate. Some rebuild rules will be triggered and attempt to
|
||
run developer tools such as @command{autoconf} or @command{automake}.
|
||
|
||
Calls to such tools are all wrapped into a call to the @command{missing}
|
||
script discussed later (@pxref{maintainer-mode}), so that the user will
|
||
see more descriptive warnings about missing or out-of-date tools, and
|
||
possible suggestions about how to obtain them, rather than just some
|
||
``command not found'' error, or (worse) some obscure message from some
|
||
older version of the required tool they happen to have installed.
|
||
|
||
Maintainers interested in keeping their package buildable from a CVS
|
||
checkout even for those users that lack maintainer-specific tools might
|
||
want to provide an helper script (or to enhance their existing bootstrap
|
||
script) to fix the timestamps after a
|
||
@command{cvs update} or a @command{git checkout}, to prevent spurious
|
||
rebuilds. In case of a project committing the Autotools-generated
|
||
files, as well as the generated @file{.info} files, such script might
|
||
look something like this:
|
||
|
||
@smallexample
|
||
#!/bin/sh
|
||
# fix-timestamp.sh: prevents useless rebuilds after "cvs update"
|
||
sleep 1
|
||
# aclocal-generated aclocal.m4 depends on locally-installed
|
||
# '.m4' macro files, as well as on 'configure.ac'
|
||
touch aclocal.m4
|
||
sleep 1
|
||
# autoconf-generated configure depends on aclocal.m4 and on
|
||
# configure.ac
|
||
touch configure
|
||
# so does autoheader-generated config.h.in
|
||
touch config.h.in
|
||
# and all the automake-generated Makefile.in files
|
||
touch `find . -name Makefile.in -print`
|
||
# finally, the makeinfo-generated '.info' files depend on the
|
||
# corresponding '.texi' files
|
||
touch doc/*.info
|
||
@end smallexample
|
||
|
||
@item
|
||
In distributed development, developers are likely to have different
|
||
version of the maintainer tools installed. In this case rebuilds
|
||
triggered by timestamp lossage will lead to spurious changes
|
||
to generated files. There are several solutions to this:
|
||
|
||
@itemize
|
||
@item
|
||
All developers should use the same versions, so that the rebuilt files
|
||
are identical to files in CVS@. (This starts to be difficult when each
|
||
project you work on uses different versions.)
|
||
@item
|
||
Or people use a script to fix the timestamp after a checkout (the GCC
|
||
folks have such a script).
|
||
@item
|
||
Or @file{configure.ac} uses @code{AM_MAINTAINER_MODE}, which will
|
||
disable all of these rebuild rules by default. This is further discussed
|
||
in @ref{maintainer-mode}.
|
||
@end itemize
|
||
|
||
@item
|
||
Although we focused on spurious rebuilds, the converse can also
|
||
happen. CVS's timestamp handling can also let you think an
|
||
out-of-date file is up-to-date.
|
||
|
||
For instance, suppose a developer has modified @file{Makefile.am} and
|
||
has rebuilt @file{Makefile.in}, and then decides to do a last-minute
|
||
change to @file{Makefile.am} right before checking in both files
|
||
(without rebuilding @file{Makefile.in} to account for the change).
|
||
|
||
This last change to @file{Makefile.am} makes the copy of
|
||
@file{Makefile.in} out-of-date. Since CVS processes files
|
||
alphabetically, when another developer @samp{cvs update}s his or her
|
||
tree, @file{Makefile.in} will happen to be newer than
|
||
@file{Makefile.am}. This other developer will not see that
|
||
@file{Makefile.in} is out-of-date.
|
||
|
||
@end itemize
|
||
|
||
@subsubheading Generated Files out of CVS
|
||
|
||
One way to get CVS and @command{make} working peacefully is to never
|
||
store generated files in CVS, i.e., do not CVS-control files that
|
||
are @file{Makefile} targets (also called @emph{derived} files).
|
||
|
||
This way developers are not annoyed by changes to generated files. It
|
||
does not matter if they all have different versions (assuming they are
|
||
compatible, of course). And finally, timestamps are not lost, changes
|
||
to sources files can't be missed as in the
|
||
@file{Makefile.am}/@file{Makefile.in} example discussed earlier.
|
||
|
||
The drawback is that the CVS repository is not an exact copy of what
|
||
is distributed and that users now need to install various development
|
||
tools (maybe even specific versions) before they can build a checkout.
|
||
But, after all, CVS's job is versioning, not distribution.
|
||
|
||
Allowing developers to use different versions of their tools can also
|
||
hide bugs during distributed development. Indeed, developers will be
|
||
using (hence testing) their own generated files, instead of the
|
||
generated files that will be released actually. The developer who
|
||
prepares the tarball might be using a version of the tool that
|
||
produces bogus output (for instance a non-portable C file), something
|
||
other developers could have noticed if they weren't using their own
|
||
versions of this tool.
|
||
|
||
@subheading Third-party Files
|
||
@cindex CVS and third-party files
|
||
@cindex third-party files and CVS
|
||
|
||
Another class of files not discussed here (because they do not cause
|
||
timestamp issues) are files that are shipped with a package, but
|
||
maintained elsewhere. For instance, tools like @command{gettextize}
|
||
and @command{autopoint} (from Gettext) or @command{libtoolize} (from
|
||
Libtool), will install or update files in your package.
|
||
|
||
These files, whether they are kept under CVS or not, raise similar
|
||
concerns about version mismatch between developers' tools. The
|
||
Gettext manual has a section about this, see @ref{CVS Issues, CVS
|
||
Issues, Integrating with CVS, gettext, GNU gettext tools}.
|
||
|
||
@node maintainer-mode
|
||
@section @command{missing} and @code{AM_MAINTAINER_MODE}
|
||
|
||
@subheading @command{missing}
|
||
@cindex @command{missing}, purpose
|
||
|
||
The @command{missing} script is a wrapper around several maintainer
|
||
tools, designed to warn users if a maintainer tool is required but
|
||
missing. Typical maintainer tools are @command{autoconf},
|
||
@command{automake}, @command{bison}, etc. Because file generated by
|
||
these tools are shipped with the other sources of a package, these
|
||
tools shouldn't be required during a user build and they are not
|
||
checked for in @file{configure}.
|
||
|
||
However, if for some reason a rebuild rule is triggered and involves a
|
||
missing tool, @command{missing} will notice it and warn the user, even
|
||
suggesting how to obtain such a tool (at least in case it is a well-known
|
||
one, like @command{makeinfo} or @command{bison}). This is more helpful
|
||
and user-friendly than just having the rebuild rules spewing out a terse
|
||
error message like @samp{sh: @var{tool}: command not found}. Similarly,
|
||
@command{missing} will warn the user if it detects that a maintainer
|
||
tool it attempted to use seems too old (be warned that diagnosing this
|
||
correctly is typically more difficult that detecting missing tools, and
|
||
requires cooperation from the tool itself, so it won't always work).
|
||
|
||
If the required tool is installed, @command{missing} will run it and
|
||
won't attempt to continue after failures. This is correct during
|
||
development: developers love fixing failures. However, users with
|
||
missing or too old maintainer tools may get an error when the rebuild
|
||
rule is spuriously triggered, halting the build. This failure to let
|
||
the build continue is one of the arguments of the
|
||
@code{AM_MAINTAINER_MODE} advocates.
|
||
|
||
@subheading @code{AM_MAINTAINER_MODE}
|
||
@cindex @code{AM_MAINTAINER_MODE}, purpose
|
||
@acindex AM_MAINTAINER_MODE
|
||
|
||
@code{AM_MAINTAINER_MODE} allows you to choose whether the so called
|
||
"rebuild rules" should be enabled or disabled. With
|
||
@code{AM_MAINTAINER_MODE([enable])}, they are enabled by default,
|
||
otherwise they are disabled by default. In the latter case, if
|
||
you have @code{AM_MAINTAINER_MODE} in @file{configure.ac}, and run
|
||
@samp{./configure && make}, then @command{make} will *never* attempt to
|
||
rebuild @file{configure}, @file{Makefile.in}s, Lex or Yacc outputs, etc.
|
||
I.e., this disables build rules for files that are usually distributed
|
||
and that users should normally not have to update.
|
||
|
||
The user can override the default setting by passing either
|
||
@samp{--enable-maintainer-mode} or @samp{--disable-maintainer-mode}
|
||
to @command{configure}.
|
||
|
||
People use @code{AM_MAINTAINER_MODE} either because they do not want their
|
||
users (or themselves) annoyed by timestamps lossage (@pxref{CVS}), or
|
||
because they simply can't stand the rebuild rules and prefer running
|
||
maintainer tools explicitly.
|
||
|
||
@code{AM_MAINTAINER_MODE} also allows you to disable some custom build
|
||
rules conditionally. Some developers use this feature to disable
|
||
rules that need exotic tools that users may not have available.
|
||
|
||
Several years ago Fran@,{c}ois Pinard pointed out several arguments
|
||
against this @code{AM_MAINTAINER_MODE} macro. Most of them relate to
|
||
insecurity. By removing dependencies you get non-dependable builds:
|
||
changes to sources files can have no effect on generated files and this
|
||
can be very confusing when unnoticed. He adds that security shouldn't
|
||
be reserved to maintainers (what @option{--enable-maintainer-mode}
|
||
suggests), on the contrary. If one user has to modify a
|
||
@file{Makefile.am}, then either @file{Makefile.in} should be updated
|
||
or a warning should be output (this is what Automake uses
|
||
@command{missing} for) but the last thing you want is that nothing
|
||
happens and the user doesn't notice it (this is what happens when
|
||
rebuild rules are disabled by @code{AM_MAINTAINER_MODE}).
|
||
|
||
Jim Meyering, the inventor of the @code{AM_MAINTAINER_MODE} macro was
|
||
swayed by Fran@,{c}ois's arguments, and got rid of
|
||
@code{AM_MAINTAINER_MODE} in all of his packages.
|
||
|
||
Still many people continue to use @code{AM_MAINTAINER_MODE}, because
|
||
it helps them working on projects where all files are kept under version
|
||
control, and because @command{missing} isn't enough if you have the
|
||
wrong version of the tools.
|
||
|
||
|
||
@node Wildcards
|
||
@section Why doesn't Automake support wildcards?
|
||
@cindex wildcards
|
||
|
||
Developers are lazy. They would often like to use wildcards in
|
||
@file{Makefile.am}s, so that they would not need to remember to
|
||
update @file{Makefile.am}s every time they add, delete, or rename
|
||
a file.
|
||
|
||
There are several objections to this:
|
||
@itemize
|
||
@item
|
||
When using CVS (or similar) developers need to remember they have to
|
||
run @samp{cvs add} or @samp{cvs rm} anyway. Updating
|
||
@file{Makefile.am} accordingly quickly becomes a reflex.
|
||
|
||
Conversely, if your application doesn't compile
|
||
because you forgot to add a file in @file{Makefile.am}, it will help
|
||
you remember to @samp{cvs add} it.
|
||
|
||
@item
|
||
Using wildcards makes it easy to distribute files by mistake. For
|
||
instance, some code a developer is experimenting with (a test case,
|
||
say) that should not be part of the distribution.
|
||
|
||
@item
|
||
Using wildcards it's easy to omit some files by mistake. For
|
||
instance, one developer creates a new file, uses it in many places,
|
||
but forgets to commit it. Another developer then checks out the
|
||
incomplete project and is able to run @samp{make dist} successfully,
|
||
even though a file is missing. By listing files, @samp{make dist}
|
||
@emph{will} complain.
|
||
|
||
@item
|
||
Wildcards are not portable to some non-GNU @command{make} implementations,
|
||
e.g., NetBSD @command{make} will not expand globs such as @samp{*} in
|
||
prerequisites of a target.
|
||
|
||
@item
|
||
Finally, it's really hard to @emph{forget} to add a file to
|
||
@file{Makefile.am}: files that are not listed in @file{Makefile.am} are
|
||
not compiled or installed, so you can't even test them.
|
||
@end itemize
|
||
|
||
Still, these are philosophical objections, and as such you may disagree,
|
||
or find enough value in wildcards to dismiss all of them. Before you
|
||
start writing a patch against Automake to teach it about wildcards,
|
||
let's see the main technical issue: portability.
|
||
|
||
Although @samp{$(wildcard ...)} works with GNU @command{make}, it is
|
||
not portable to other @command{make} implementations.
|
||
|
||
The only way Automake could support @command{$(wildcard ...)} is by
|
||
expanding @command{$(wildcard ...)} when @command{automake} is run.
|
||
The resulting @file{Makefile.in}s would be portable since they would
|
||
list all files and not use @samp{$(wildcard ...)}. However that
|
||
means developers would need to remember to run @command{automake} each
|
||
time they add, delete, or rename files.
|
||
|
||
Compared to editing @file{Makefile.am}, this is a very small gain. Sure,
|
||
it's easier and faster to type @samp{automake; make} than to type
|
||
@samp{emacs Makefile.am; make}. But nobody bothered enough to write a
|
||
patch to add support for this syntax. Some people use scripts to
|
||
generate file lists in @file{Makefile.am} or in separate
|
||
@file{Makefile} fragments.
|
||
|
||
Even if you don't care about portability, and are tempted to use
|
||
@samp{$(wildcard ...)} anyway because you target only GNU Make, you
|
||
should know there are many places where Automake needs to know exactly
|
||
which files should be processed. As Automake doesn't know how to
|
||
expand @samp{$(wildcard ...)}, you cannot use it in these places.
|
||
@samp{$(wildcard ...)} is a black box comparable to @code{AC_SUBST}ed
|
||
variables as far Automake is concerned.
|
||
|
||
You can get warnings about @samp{$(wildcard ...}) constructs using the
|
||
@option{-Wportability} flag.
|
||
|
||
@node Limitations on File Names
|
||
@section Limitations on File Names
|
||
@cindex file names, limitations on
|
||
|
||
Automake attempts to support all kinds of file names, even those that
|
||
contain unusual characters or are unusually long. However, some
|
||
limitations are imposed by the underlying operating system and tools.
|
||
|
||
Most operating systems prohibit the use of the null byte in file
|
||
names, and reserve @samp{/} as a directory separator. Also, they
|
||
require that file names are properly encoded for the user's locale.
|
||
Automake is subject to these limits.
|
||
|
||
Portable packages should limit themselves to POSIX file
|
||
names. These can contain ASCII letters and digits,
|
||
@samp{_}, @samp{.}, and @samp{-}. File names consist of components
|
||
separated by @samp{/}. File name components cannot begin with
|
||
@samp{-}.
|
||
|
||
Portable POSIX file names cannot contain components that exceed a
|
||
14-byte limit, but nowadays it's normally safe to assume the
|
||
more-generous XOPEN limit of 255 bytes. POSIX
|
||
limits file names to 255 bytes (XOPEN allows 1023 bytes),
|
||
but you may want to limit a source tarball to file names of 99 bytes
|
||
to avoid interoperability problems with old versions of @command{tar}.
|
||
|
||
If you depart from these rules (e.g., by using non-ASCII
|
||
characters in file names, or by using lengthy file names), your
|
||
installers may have problems for reasons unrelated to Automake.
|
||
However, if this does not concern you, you should know about the
|
||
limitations imposed by Automake itself. These limitations are
|
||
undesirable, but some of them seem to be inherent to underlying tools
|
||
like Autoconf, Make, M4, and the shell. They fall into three
|
||
categories: install directories, build directories, and file names.
|
||
|
||
The following characters:
|
||
|
||
@example
|
||
@r{newline} " # $ ' `
|
||
@end example
|
||
|
||
should not appear in the names of install directories. For example,
|
||
the operand of @command{configure}'s @option{--prefix} option should
|
||
not contain these characters.
|
||
|
||
Build directories suffer the same limitations as install directories,
|
||
and in addition should not contain the following characters:
|
||
|
||
@example
|
||
& @@ \
|
||
@end example
|
||
|
||
For example, the full name of the directory containing the source
|
||
files should not contain these characters.
|
||
|
||
Source and installation file names like @file{main.c} are limited even
|
||
further: they should conform to the POSIX/XOPEN
|
||
rules described above. In addition, if you plan to port to
|
||
non-POSIX environments, you should avoid file names that
|
||
differ only in case (e.g., @file{makefile} and @file{Makefile}).
|
||
Nowadays it is no longer worth worrying about the 8.3 limits of
|
||
DOS file systems.
|
||
|
||
@c FIXME This should probably be moved in the "Checking the Distribution"
|
||
@c FIXME section...
|
||
@node Errors with distclean
|
||
@section Errors with distclean
|
||
@cindex @code{distclean}, diagnostic
|
||
@cindex @samp{make distclean}, diagnostic
|
||
@cindex dependencies and distributed files
|
||
@trindex distclean
|
||
|
||
This is a diagnostic you might encounter while running @samp{make
|
||
distcheck}.
|
||
|
||
As explained in @ref{Checking the Distribution}, @samp{make distcheck}
|
||
attempts to build and check your package for errors like this one.
|
||
|
||
@samp{make distcheck} will perform a @code{VPATH} build of your
|
||
package (@pxref{VPATH Builds}), and then call @samp{make distclean}.
|
||
Files left in the build directory after @samp{make distclean} has run
|
||
are listed after this error.
|
||
|
||
This diagnostic really covers two kinds of errors:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
files that are forgotten by distclean;
|
||
@item
|
||
distributed files that are erroneously rebuilt.
|
||
@end itemize
|
||
|
||
The former left-over files are not distributed, so the fix is to mark
|
||
them for cleaning (@pxref{Clean}), this is obvious and doesn't deserve
|
||
more explanations.
|
||
|
||
The latter bug is not always easy to understand and fix, so let's
|
||
proceed with an example. Suppose our package contains a program for
|
||
which we want to build a man page using @command{help2man}. GNU
|
||
@command{help2man} produces simple manual pages from the @option{--help}
|
||
and @option{--version} output of other commands (@pxref{Top, , Overview,
|
||
help2man, The Help2man Manual}). Because we don't want to force our
|
||
users to install @command{help2man}, we decide to distribute the
|
||
generated man page using the following setup.
|
||
|
||
@example
|
||
# This Makefile.am is bogus.
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
dist_man_MANS = foo.1
|
||
|
||
foo.1: foo$(EXEEXT)
|
||
help2man --output=foo.1 ./foo$(EXEEXT)
|
||
@end example
|
||
|
||
This will effectively distribute the man page. However,
|
||
@samp{make distcheck} will fail with:
|
||
|
||
@example
|
||
ERROR: files left in build directory after distclean:
|
||
./foo.1
|
||
@end example
|
||
|
||
Why was @file{foo.1} rebuilt? Because although distributed,
|
||
@file{foo.1} depends on a non-distributed built file:
|
||
@file{foo$(EXEEXT)}. @file{foo$(EXEEXT)} is built by the user, so it
|
||
will always appear to be newer than the distributed @file{foo.1}.
|
||
|
||
@samp{make distcheck} caught an inconsistency in our package. Our
|
||
intent was to distribute @file{foo.1} so users do not need to install
|
||
@command{help2man}, however since this rule causes this file to be
|
||
always rebuilt, users @emph{do} need @command{help2man}. Either we
|
||
should ensure that @file{foo.1} is not rebuilt by users, or there is
|
||
no point in distributing @file{foo.1}.
|
||
|
||
More generally, the rule is that distributed files should never depend
|
||
on non-distributed built files. If you distribute something
|
||
generated, distribute its sources.
|
||
|
||
One way to fix the above example, while still distributing
|
||
@file{foo.1} is to not depend on @file{foo$(EXEEXT)}. For instance,
|
||
assuming @command{foo --version} and @command{foo --help} do not
|
||
change unless @file{foo.c} or @file{configure.ac} change, we could
|
||
write the following @file{Makefile.am}:
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
dist_man_MANS = foo.1
|
||
|
||
foo.1: foo.c $(top_srcdir)/configure.ac
|
||
$(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
|
||
help2man --output=foo.1 ./foo$(EXEEXT)
|
||
@end example
|
||
|
||
This way, @file{foo.1} will not get rebuilt every time
|
||
@file{foo$(EXEEXT)} changes. The @command{make} call makes sure
|
||
@file{foo$(EXEEXT)} is up-to-date before @command{help2man}. Another
|
||
way to ensure this would be to use separate directories for binaries
|
||
and man pages, and set @code{SUBDIRS} so that binaries are built
|
||
before man pages.
|
||
|
||
We could also decide not to distribute @file{foo.1}. In
|
||
this case it's fine to have @file{foo.1} dependent upon
|
||
@file{foo$(EXEEXT)}, since both will have to be rebuilt.
|
||
However it would be impossible to build the package in a
|
||
cross-compilation, because building @file{foo.1} involves
|
||
an @emph{execution} of @file{foo$(EXEEXT)}.
|
||
|
||
Another context where such errors are common is when distributed files
|
||
are built by tools that are built by the package. The pattern is
|
||
similar:
|
||
|
||
@example
|
||
distributed-file: built-tools distributed-sources
|
||
build-command
|
||
@end example
|
||
|
||
@noindent
|
||
should be changed to
|
||
|
||
@example
|
||
distributed-file: distributed-sources
|
||
$(MAKE) $(AM_MAKEFLAGS) built-tools
|
||
build-command
|
||
@end example
|
||
|
||
@noindent
|
||
or you could choose not to distribute @file{distributed-file}, if
|
||
cross-compilation does not matter.
|
||
|
||
The points made through these examples are worth a summary:
|
||
|
||
@cartouche
|
||
@itemize
|
||
@item
|
||
Distributed files should never depend upon non-distributed built
|
||
files.
|
||
@item
|
||
Distributed files should be distributed with all their dependencies.
|
||
@item
|
||
If a file is @emph{intended} to be rebuilt by users, then there is no point
|
||
in distributing it.
|
||
@end itemize
|
||
@end cartouche
|
||
|
||
@vrindex distcleancheck_listfiles
|
||
For desperate cases, it's always possible to disable this check by
|
||
setting @code{distcleancheck_listfiles} as documented in @ref{Checking
|
||
the Distribution}.
|
||
Make sure you do understand the reason why @samp{make distcheck}
|
||
complains before you do this. @code{distcleancheck_listfiles} is a
|
||
way to @emph{hide} errors, not to fix them. You can always do better.
|
||
|
||
@node Flag Variables Ordering
|
||
@section Flag Variables Ordering
|
||
@cindex Ordering flag variables
|
||
@cindex Flag variables, ordering
|
||
|
||
@display
|
||
What is the difference between @code{AM_CFLAGS}, @code{CFLAGS}, and
|
||
@code{mumble_CFLAGS}?
|
||
@end display
|
||
|
||
@display
|
||
Why does @command{automake} output @code{CPPFLAGS} after
|
||
@code{AM_CPPFLAGS} on compile lines? Shouldn't it be the converse?
|
||
@end display
|
||
|
||
@display
|
||
My @file{configure} adds some warning flags into @code{CXXFLAGS}. In
|
||
one @file{Makefile.am} I would like to append a new flag, however if I
|
||
put the flag into @code{AM_CXXFLAGS} it is prepended to the other
|
||
flags, not appended.
|
||
@end display
|
||
|
||
@subheading Compile Flag Variables
|
||
@cindex Flag Variables, Ordering
|
||
@cindex Compile Flag Variables
|
||
@cindex @code{AM_CCASFLAGS} and @code{CCASFLAGS}
|
||
@cindex @code{AM_CFLAGS} and @code{CFLAGS}
|
||
@cindex @code{AM_CPPFLAGS} and @code{CPPFLAGS}
|
||
@cindex @code{AM_CXXFLAGS} and @code{CXXFLAGS}
|
||
@cindex @code{AM_FCFLAGS} and @code{FCFLAGS}
|
||
@cindex @code{AM_FFLAGS} and @code{FFLAGS}
|
||
@cindex @code{AM_GCJFLAGS} and @code{GCJFLAGS}
|
||
@cindex @code{AM_LDFLAGS} and @code{LDFLAGS}
|
||
@cindex @code{AM_LFLAGS} and @code{LFLAGS}
|
||
@cindex @code{AM_LIBTOOLFLAGS} and @code{LIBTOOLFLAGS}
|
||
@cindex @code{AM_OBJCFLAGS} and @code{OBJCFLAGS}
|
||
@cindex @code{AM_OBJCXXFLAGS} and @code{OBJXXCFLAGS}
|
||
@cindex @code{AM_RFLAGS} and @code{RFLAGS}
|
||
@cindex @code{AM_UPCFLAGS} and @code{UPCFLAGS}
|
||
@cindex @code{AM_YFLAGS} and @code{YFLAGS}
|
||
@cindex @code{CCASFLAGS} and @code{AM_CCASFLAGS}
|
||
@cindex @code{CFLAGS} and @code{AM_CFLAGS}
|
||
@cindex @code{CPPFLAGS} and @code{AM_CPPFLAGS}
|
||
@cindex @code{CXXFLAGS} and @code{AM_CXXFLAGS}
|
||
@cindex @code{FCFLAGS} and @code{AM_FCFLAGS}
|
||
@cindex @code{FFLAGS} and @code{AM_FFLAGS}
|
||
@cindex @code{GCJFLAGS} and @code{AM_GCJFLAGS}
|
||
@cindex @code{LDFLAGS} and @code{AM_LDFLAGS}
|
||
@cindex @code{LFLAGS} and @code{AM_LFLAGS}
|
||
@cindex @code{LIBTOOLFLAGS} and @code{AM_LIBTOOLFLAGS}
|
||
@cindex @code{OBJCFLAGS} and @code{AM_OBJCFLAGS}
|
||
@cindex @code{OBJCXXFLAGS} and @code{AM_OBJCXXFLAGS}
|
||
@cindex @code{RFLAGS} and @code{AM_RFLAGS}
|
||
@cindex @code{UPCFLAGS} and @code{AM_UPCFLAGS}
|
||
@cindex @code{YFLAGS} and @code{AM_YFLAGS}
|
||
|
||
This section attempts to answer all the above questions. We will
|
||
mostly discuss @code{CPPFLAGS} in our examples, but actually the
|
||
answer holds for all the compile flags used in Automake:
|
||
@code{CCASFLAGS}, @code{CFLAGS}, @code{CPPFLAGS}, @code{CXXFLAGS},
|
||
@code{FCFLAGS}, @code{FFLAGS}, @code{GCJFLAGS}, @code{LDFLAGS},
|
||
@code{LFLAGS}, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, @code{OBJCXXFLAGS},
|
||
@code{RFLAGS}, @code{UPCFLAGS}, and @code{YFLAGS}.
|
||
|
||
@code{CPPFLAGS}, @code{AM_CPPFLAGS}, and @code{mumble_CPPFLAGS} are
|
||
three variables that can be used to pass flags to the C preprocessor
|
||
(actually these variables are also used for other languages like C++
|
||
or preprocessed Fortran). @code{CPPFLAGS} is the user variable
|
||
(@pxref{User Variables}), @code{AM_CPPFLAGS} is the Automake variable,
|
||
and @code{mumble_CPPFLAGS} is the variable specific to the
|
||
@code{mumble} target (we call this a per-target variable,
|
||
@pxref{Program and Library Variables}).
|
||
|
||
Automake always uses two of these variables when compiling C sources
|
||
files. When compiling an object file for the @code{mumble} target,
|
||
the first variable will be @code{mumble_CPPFLAGS} if it is defined, or
|
||
@code{AM_CPPFLAGS} otherwise. The second variable is always
|
||
@code{CPPFLAGS}.
|
||
|
||
In the following example,
|
||
|
||
@example
|
||
bin_PROGRAMS = foo bar
|
||
foo_SOURCES = xyz.c
|
||
bar_SOURCES = main.c
|
||
foo_CPPFLAGS = -DFOO
|
||
AM_CPPFLAGS = -DBAZ
|
||
@end example
|
||
|
||
@noindent
|
||
@file{xyz.o} will be compiled with @samp{$(foo_CPPFLAGS) $(CPPFLAGS)},
|
||
(because @file{xyz.o} is part of the @code{foo} target), while
|
||
@file{main.o} will be compiled with @samp{$(AM_CPPFLAGS) $(CPPFLAGS)}
|
||
(because there is no per-target variable for target @code{bar}).
|
||
|
||
The difference between @code{mumble_CPPFLAGS} and @code{AM_CPPFLAGS}
|
||
being clear enough, let's focus on @code{CPPFLAGS}. @code{CPPFLAGS}
|
||
is a user variable, i.e., a variable that users are entitled to modify
|
||
in order to compile the package. This variable, like many others,
|
||
is documented at the end of the output of @samp{configure --help}.
|
||
|
||
For instance, someone who needs to add @file{/home/my/usr/include} to
|
||
the C compiler's search path would configure a package with
|
||
|
||
@example
|
||
./configure CPPFLAGS='-I /home/my/usr/include'
|
||
@end example
|
||
|
||
@noindent
|
||
and this flag would be propagated to the compile rules of all
|
||
@file{Makefile}s.
|
||
|
||
It is also not uncommon to override a user variable at
|
||
@command{make}-time. Many installers do this with @code{prefix}, but
|
||
this can be useful with compiler flags too. For instance, if, while
|
||
debugging a C++ project, you need to disable optimization in one
|
||
specific object file, you can run something like
|
||
|
||
@example
|
||
rm file.o
|
||
make CXXFLAGS=-O0 file.o
|
||
make
|
||
@end example
|
||
|
||
The reason @samp{$(CPPFLAGS)} appears after @samp{$(AM_CPPFLAGS)} or
|
||
@samp{$(mumble_CPPFLAGS)} in the compile command is that users
|
||
should always have the last say. It probably makes more sense if you
|
||
think about it while looking at the @samp{CXXFLAGS=-O0} above, which
|
||
should supersede any other switch from @code{AM_CXXFLAGS} or
|
||
@code{mumble_CXXFLAGS} (and this of course replaces the previous value
|
||
of @code{CXXFLAGS}).
|
||
|
||
You should never redefine a user variable such as @code{CPPFLAGS} in
|
||
@file{Makefile.am}. Use @samp{automake -Woverride} to diagnose such
|
||
mistakes. Even something like
|
||
|
||
@example
|
||
CPPFLAGS = -DDATADIR=\"$(datadir)\" @@CPPFLAGS@@
|
||
@end example
|
||
|
||
@noindent
|
||
is erroneous. Although this preserves @file{configure}'s value of
|
||
@code{CPPFLAGS}, the definition of @code{DATADIR} will disappear if a
|
||
user attempts to override @code{CPPFLAGS} from the @command{make}
|
||
command line.
|
||
|
||
@example
|
||
AM_CPPFLAGS = -DDATADIR=\"$(datadir)\"
|
||
@end example
|
||
|
||
@noindent
|
||
is all that is needed here if no per-target flags are used.
|
||
|
||
You should not add options to these user variables within
|
||
@file{configure} either, for the same reason. Occasionally you need
|
||
to modify these variables to perform a test, but you should reset
|
||
their values afterwards. In contrast, it is OK to modify the
|
||
@samp{AM_} variables within @file{configure} if you @code{AC_SUBST}
|
||
them, but it is rather rare that you need to do this, unless you
|
||
really want to change the default definitions of the @samp{AM_}
|
||
variables in all @file{Makefile}s.
|
||
|
||
What we recommend is that you define extra flags in separate
|
||
variables. For instance, you may write an Autoconf macro that computes
|
||
a set of warning options for the C compiler, and @code{AC_SUBST} them
|
||
in @code{WARNINGCFLAGS}; you may also have an Autoconf macro that
|
||
determines which compiler and which linker flags should be used to
|
||
link with library @file{libfoo}, and @code{AC_SUBST} these in
|
||
@code{LIBFOOCFLAGS} and @code{LIBFOOLDFLAGS}. Then, a
|
||
@file{Makefile.am} could use these variables as follows:
|
||
|
||
@example
|
||
AM_CFLAGS = $(WARNINGCFLAGS)
|
||
bin_PROGRAMS = prog1 prog2
|
||
prog1_SOURCES = @dots{}
|
||
prog2_SOURCES = @dots{}
|
||
prog2_CFLAGS = $(LIBFOOCFLAGS) $(AM_CFLAGS)
|
||
prog2_LDFLAGS = $(LIBFOOLDFLAGS)
|
||
@end example
|
||
|
||
In this example both programs will be compiled with the flags
|
||
substituted into @samp{$(WARNINGCFLAGS)}, and @code{prog2} will
|
||
additionally be compiled with the flags required to link with
|
||
@file{libfoo}.
|
||
|
||
Note that listing @code{AM_CFLAGS} in a per-target @code{CFLAGS}
|
||
variable is a common idiom to ensure that @code{AM_CFLAGS} applies to
|
||
every target in a @file{Makefile.in}.
|
||
|
||
Using variables like this gives you full control over the ordering of
|
||
the flags. For instance, if there is a flag in $(WARNINGCFLAGS) that
|
||
you want to negate for a particular target, you can use something like
|
||
@samp{prog1_CFLAGS = $(AM_CFLAGS) -no-flag}. If all of these flags had
|
||
been forcefully appended to @code{CFLAGS}, there would be no way to
|
||
disable one flag. Yet another reason to leave user variables to
|
||
users.
|
||
|
||
Finally, we have avoided naming the variable of the example
|
||
@code{LIBFOO_LDFLAGS} (with an underscore) because that would cause
|
||
Automake to think that this is actually a per-target variable (like
|
||
@code{mumble_LDFLAGS}) for some non-declared @code{LIBFOO} target.
|
||
|
||
@subheading Other Variables
|
||
|
||
There are other variables in Automake that follow similar principles
|
||
to allow user options. For instance, Texinfo rules (@pxref{Texinfo})
|
||
use @code{MAKEINFOFLAGS} and @code{AM_MAKEINFOFLAGS}. Similarly,
|
||
DejaGnu tests (@pxref{DejaGnu Tests}) use @code{RUNTESTDEFAULTFLAGS} and
|
||
@code{AM_RUNTESTDEFAULTFLAGS}. The tags and ctags rules
|
||
(@pxref{Tags}) use @code{ETAGSFLAGS}, @code{AM_ETAGSFLAGS},
|
||
@code{CTAGSFLAGS}, and @code{AM_CTAGSFLAGS}. Java rules
|
||
(@pxref{Java}) use @code{JAVACFLAGS} and @code{AM_JAVACFLAGS}. None
|
||
of these rules support per-target flags (yet).
|
||
|
||
To some extent, even @code{AM_MAKEFLAGS} (@pxref{Subdirectories})
|
||
obeys this naming scheme. The slight difference is that
|
||
@code{MAKEFLAGS} is passed to sub-@command{make}s implicitly by
|
||
@command{make} itself.
|
||
|
||
@code{ARFLAGS} (@pxref{A Library}) is usually defined by Automake and
|
||
has neither @code{AM_} nor per-target cousin.
|
||
|
||
Finally you should not think that the existence of a per-target
|
||
variable implies the existence of an @code{AM_} variable or of a user
|
||
variable. For instance, the @code{mumble_LDADD} per-target variable
|
||
overrides the makefile-wide @code{LDADD} variable (which is not a user
|
||
variable), and @code{mumble_LIBADD} exists only as a per-target
|
||
variable. @xref{Program and Library Variables}.
|
||
|
||
|
||
@node Renamed Objects
|
||
@section Why are object files sometimes renamed?
|
||
|
||
This happens when per-target compilation flags are used. Object
|
||
files need to be renamed just in case they would clash with object
|
||
files compiled from the same sources, but with different flags.
|
||
Consider the following example.
|
||
|
||
@example
|
||
bin_PROGRAMS = true false
|
||
true_SOURCES = generic.c
|
||
true_CPPFLAGS = -DEXIT_CODE=0
|
||
false_SOURCES = generic.c
|
||
false_CPPFLAGS = -DEXIT_CODE=1
|
||
@end example
|
||
|
||
@noindent
|
||
Obviously the two programs are built from the same source, but it
|
||
would be bad if they shared the same object, because @file{generic.o}
|
||
cannot be built with both @samp{-DEXIT_CODE=0} @emph{and}
|
||
@samp{-DEXIT_CODE=1}. Therefore @command{automake} outputs rules to
|
||
build two different objects: @file{true-generic.o} and
|
||
@file{false-generic.o}.
|
||
|
||
@command{automake} doesn't actually look whether source files are
|
||
shared to decide if it must rename objects. It will just rename all
|
||
objects of a target as soon as it sees per-target compilation flags
|
||
used.
|
||
|
||
It's OK to share object files when per-target compilation flags are not
|
||
used. For instance, @file{true} and @file{false} will both use
|
||
@file{version.o} in the following example.
|
||
|
||
@example
|
||
AM_CPPFLAGS = -DVERSION=1.0
|
||
bin_PROGRAMS = true false
|
||
true_SOURCES = true.c version.c
|
||
false_SOURCES = false.c version.c
|
||
@end example
|
||
|
||
Note that the renaming of objects is also affected by the
|
||
@code{_SHORTNAME} variable (@pxref{Program and Library Variables}).
|
||
|
||
|
||
@node Per-Object Flags
|
||
@section Per-Object Flags Emulation
|
||
@cindex Per-object flags, emulated
|
||
|
||
@display
|
||
One of my source files needs to be compiled with different flags. How
|
||
do I do?
|
||
@end display
|
||
|
||
Automake supports per-program and per-library compilation flags (see
|
||
@ref{Program and Library Variables} and @ref{Flag Variables
|
||
Ordering}). With this you can define compilation flags that apply to
|
||
all files compiled for a target. For instance, in
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c foo.h bar.c bar.h main.c
|
||
foo_CFLAGS = -some -flags
|
||
@end example
|
||
|
||
@noindent
|
||
@file{foo-foo.o}, @file{foo-bar.o}, and @file{foo-main.o} will all be
|
||
compiled with @samp{-some -flags}. (If you wonder about the names of
|
||
these object files, see @ref{Renamed Objects}.) Note that
|
||
@code{foo_CFLAGS} gives the flags to use when compiling all the C
|
||
sources of the @emph{program} @code{foo}, it has nothing to do with
|
||
@file{foo.c} or @file{foo-foo.o} specifically.
|
||
|
||
What if @file{foo.c} needs to be compiled into @file{foo.o} using some
|
||
specific flags, that none of the other files requires? Obviously
|
||
per-program flags are not directly applicable here. Something like
|
||
per-object flags are expected, i.e., flags that would be used only
|
||
when creating @file{foo-foo.o}. Automake does not support that,
|
||
however this is easy to simulate using a library that contains only
|
||
that object, and compiling this library with per-library flags.
|
||
|
||
@example
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = bar.c bar.h main.c
|
||
foo_CFLAGS = -some -flags
|
||
foo_LDADD = libfoo.a
|
||
noinst_LIBRARIES = libfoo.a
|
||
libfoo_a_SOURCES = foo.c foo.h
|
||
libfoo_a_CFLAGS = -some -other -flags
|
||
@end example
|
||
|
||
Here @file{foo-bar.o} and @file{foo-main.o} will all be
|
||
compiled with @samp{-some -flags}, while @file{libfoo_a-foo.o} will
|
||
be compiled using @samp{-some -other -flags}. Eventually, all
|
||
three objects will be linked to form @file{foo}.
|
||
|
||
This trick can also be achieved using Libtool convenience libraries,
|
||
for instance @samp{noinst_LTLIBRARIES = libfoo.la} (@pxref{Libtool
|
||
Convenience Libraries}).
|
||
|
||
Another tempting idea to implement per-object flags is to override the
|
||
compile rules @command{automake} would output for these files.
|
||
Automake will not define a rule for a target you have defined, so you
|
||
could think about defining the @samp{foo-foo.o: foo.c} rule yourself.
|
||
We recommend against this, because this is error prone. For instance,
|
||
if you add such a rule to the first example, it will break the day you
|
||
decide to remove @code{foo_CFLAGS} (because @file{foo.c} will then be
|
||
compiled as @file{foo.o} instead of @file{foo-foo.o}, @pxref{Renamed
|
||
Objects}). Also in order to support dependency tracking, the two
|
||
@file{.o}/@file{.obj} extensions, and all the other flags variables
|
||
involved in a compilation, you will end up modifying a copy of the
|
||
rule previously output by @command{automake} for this file. If a new
|
||
release of Automake generates a different rule, your copy will need to
|
||
be updated by hand.
|
||
|
||
@node Multiple Outputs
|
||
@section Handling Tools that Produce Many Outputs
|
||
@cindex multiple outputs, rules with
|
||
@cindex many outputs, rules with
|
||
@cindex rules with multiple outputs
|
||
|
||
This section describes a @command{make} idiom that can be used when a
|
||
tool produces multiple output files. It is not specific to Automake
|
||
and can be used in ordinary @file{Makefile}s.
|
||
|
||
Suppose we have a program called @command{foo} that will read one file
|
||
called @file{data.foo} and produce two files named @file{data.c} and
|
||
@file{data.h}. We want to write a @file{Makefile} rule that captures
|
||
this one-to-two dependency.
|
||
|
||
The naive rule is incorrect:
|
||
|
||
@example
|
||
# This is incorrect.
|
||
data.c data.h: data.foo
|
||
foo data.foo
|
||
@end example
|
||
|
||
@noindent
|
||
What the above rule really says is that @file{data.c} and
|
||
@file{data.h} each depend on @file{data.foo}, and can each be built by
|
||
running @samp{foo data.foo}. In other words it is equivalent to:
|
||
|
||
@example
|
||
# We do not want this.
|
||
data.c: data.foo
|
||
foo data.foo
|
||
data.h: data.foo
|
||
foo data.foo
|
||
@end example
|
||
|
||
@noindent
|
||
which means that @command{foo} can be run twice. Usually it will not
|
||
be run twice, because @command{make} implementations are smart enough
|
||
to check for the existence of the second file after the first one has
|
||
been built; they will therefore detect that it already exists.
|
||
However there are a few situations where it can run twice anyway:
|
||
|
||
@itemize
|
||
@item
|
||
The most worrying case is when running a parallel @command{make}. If
|
||
@file{data.c} and @file{data.h} are built in parallel, two @samp{foo
|
||
data.foo} commands will run concurrently. This is harmful.
|
||
@item
|
||
Another case is when the dependency (here @file{data.foo}) is
|
||
(or depends upon) a phony target.
|
||
@end itemize
|
||
|
||
A solution that works with parallel @command{make} but not with
|
||
phony dependencies is the following:
|
||
|
||
@example
|
||
data.c data.h: data.foo
|
||
foo data.foo
|
||
data.h: data.c
|
||
@end example
|
||
|
||
@noindent
|
||
The above rules are equivalent to
|
||
|
||
@example
|
||
data.c: data.foo
|
||
foo data.foo
|
||
data.h: data.foo data.c
|
||
foo data.foo
|
||
@end example
|
||
|
||
@noindent
|
||
therefore a parallel @command{make} will have to serialize the builds
|
||
of @file{data.c} and @file{data.h}, and will detect that the second is
|
||
no longer needed once the first is over.
|
||
|
||
Using this pattern is probably enough for most cases. However it does
|
||
not scale easily to more output files (in this scheme all output files
|
||
must be totally ordered by the dependency relation), so we will
|
||
explore a more complicated solution.
|
||
|
||
Another idea is to write the following:
|
||
|
||
@example
|
||
# There is still a problem with this one.
|
||
data.c: data.foo
|
||
foo data.foo
|
||
data.h: data.c
|
||
@end example
|
||
|
||
@noindent
|
||
The idea is that @samp{foo data.foo} is run only when @file{data.c}
|
||
needs to be updated, but we further state that @file{data.h} depends
|
||
upon @file{data.c}. That way, if @file{data.h} is required and
|
||
@file{data.foo} is out of date, the dependency on @file{data.c} will
|
||
trigger the build.
|
||
|
||
This is almost perfect, but suppose we have built @file{data.h} and
|
||
@file{data.c}, and then we erase @file{data.h}. Then, running
|
||
@samp{make data.h} will not rebuild @file{data.h}. The above rules
|
||
just state that @file{data.c} must be up-to-date with respect to
|
||
@file{data.foo}, and this is already the case.
|
||
|
||
What we need is a rule that forces a rebuild when @file{data.h} is
|
||
missing. Here it is:
|
||
|
||
@example
|
||
data.c: data.foo
|
||
foo data.foo
|
||
data.h: data.c
|
||
## Recover from the removal of $@@
|
||
@@if test -f $@@; then :; else \
|
||
rm -f data.c; \
|
||
$(MAKE) $(AM_MAKEFLAGS) data.c; \
|
||
fi
|
||
@end example
|
||
|
||
The above scheme can be extended to handle more outputs and more
|
||
inputs. One of the outputs is selected to serve as a witness to the
|
||
successful completion of the command, it depends upon all inputs, and
|
||
all other outputs depend upon it. For instance, if @command{foo}
|
||
should additionally read @file{data.bar} and also produce
|
||
@file{data.w} and @file{data.x}, we would write:
|
||
|
||
@example
|
||
data.c: data.foo data.bar
|
||
foo data.foo data.bar
|
||
data.h data.w data.x: data.c
|
||
## Recover from the removal of $@@
|
||
@@if test -f $@@; then :; else \
|
||
rm -f data.c; \
|
||
$(MAKE) $(AM_MAKEFLAGS) data.c; \
|
||
fi
|
||
@end example
|
||
|
||
However there are now three minor problems in this setup. One is related
|
||
to the timestamp ordering of @file{data.h}, @file{data.w},
|
||
@file{data.x}, and @file{data.c}. Another one is a race condition
|
||
if a parallel @command{make} attempts to run multiple instances of the
|
||
recover block at once. Finally, the recursive rule breaks @samp{make -n}
|
||
when run with GNU @command{make} (as well as some other @command{make}
|
||
implementations), as it may remove @file{data.h} even when it should not
|
||
(@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make,
|
||
The GNU Make Manual}).
|
||
|
||
Let us deal with the first problem. @command{foo} outputs four files,
|
||
but we do not know in which order these files are created. Suppose
|
||
that @file{data.h} is created before @file{data.c}. Then we have a
|
||
weird situation. The next time @command{make} is run, @file{data.h}
|
||
will appear older than @file{data.c}, the second rule will be
|
||
triggered, a shell will be started to execute the @samp{if@dots{}fi}
|
||
command, but actually it will just execute the @code{then} branch,
|
||
that is: nothing. In other words, because the witness we selected is
|
||
not the first file created by @command{foo}, @command{make} will start
|
||
a shell to do nothing each time it is run.
|
||
|
||
A simple riposte is to fix the timestamps when this happens.
|
||
|
||
@example
|
||
data.c: data.foo data.bar
|
||
foo data.foo data.bar
|
||
data.h data.w data.x: data.c
|
||
@@if test -f $@@; then \
|
||
touch $@@; \
|
||
else \
|
||
## Recover from the removal of $@@
|
||
rm -f data.c; \
|
||
$(MAKE) $(AM_MAKEFLAGS) data.c; \
|
||
fi
|
||
@end example
|
||
|
||
Another solution is to use a different and dedicated file as witness,
|
||
rather than using any of @command{foo}'s outputs.
|
||
|
||
@example
|
||
data.stamp: data.foo data.bar
|
||
@@rm -f data.tmp
|
||
@@touch data.tmp
|
||
foo data.foo data.bar
|
||
@@mv -f data.tmp $@@
|
||
data.c data.h data.w data.x: data.stamp
|
||
## Recover from the removal of $@@
|
||
@@if test -f $@@; then :; else \
|
||
rm -f data.stamp; \
|
||
$(MAKE) $(AM_MAKEFLAGS) data.stamp; \
|
||
fi
|
||
@end example
|
||
|
||
@file{data.tmp} is created before @command{foo} is run, so it has a
|
||
timestamp older than output files output by @command{foo}. It is then
|
||
renamed to @file{data.stamp} after @command{foo} has run, because we
|
||
do not want to update @file{data.stamp} if @command{foo} fails.
|
||
|
||
This solution still suffers from the second problem: the race
|
||
condition in the recover rule. If, after a successful build, a user
|
||
erases @file{data.c} and @file{data.h}, and runs @samp{make -j}, then
|
||
@command{make} may start both recover rules in parallel. If the two
|
||
instances of the rule execute @samp{$(MAKE) $(AM_MAKEFLAGS)
|
||
data.stamp} concurrently the build is likely to fail (for instance, the
|
||
two rules will create @file{data.tmp}, but only one can rename it).
|
||
|
||
Admittedly, such a weird situation does not arise during ordinary
|
||
builds. It occurs only when the build tree is mutilated. Here
|
||
@file{data.c} and @file{data.h} have been explicitly removed without
|
||
also removing @file{data.stamp} and the other output files.
|
||
@code{make clean; make} will always recover from these situations even
|
||
with parallel makes, so you may decide that the recover rule is solely
|
||
to help non-parallel make users and leave things as-is. Fixing this
|
||
requires some locking mechanism to ensure only one instance of the
|
||
recover rule rebuilds @file{data.stamp}. One could imagine something
|
||
along the following lines.
|
||
|
||
@example
|
||
data.c data.h data.w data.x: data.stamp
|
||
## Recover from the removal of $@@
|
||
@@if test -f $@@; then :; else \
|
||
trap 'rm -rf data.lock data.stamp' 1 2 13 15; \
|
||
## mkdir is a portable test-and-set
|
||
if mkdir data.lock 2>/dev/null; then \
|
||
## This code is being executed by the first process.
|
||
rm -f data.stamp; \
|
||
$(MAKE) $(AM_MAKEFLAGS) data.stamp; \
|
||
result=$$?; rm -rf data.lock; exit $$result; \
|
||
else \
|
||
## This code is being executed by the follower processes.
|
||
## Wait until the first process is done.
|
||
while test -d data.lock; do sleep 1; done; \
|
||
## Succeed if and only if the first process succeeded.
|
||
test -f data.stamp; \
|
||
fi; \
|
||
fi
|
||
@end example
|
||
|
||
Using a dedicated witness, like @file{data.stamp}, is very handy when
|
||
the list of output files is not known beforehand. As an illustration,
|
||
consider the following rules to compile many @file{*.el} files into
|
||
@file{*.elc} files in a single command. It does not matter how
|
||
@code{ELFILES} is defined (as long as it is not empty: empty targets
|
||
are not accepted by POSIX).
|
||
|
||
@example
|
||
ELFILES = one.el two.el three.el @dots{}
|
||
ELCFILES = $(ELFILES:=c)
|
||
|
||
elc-stamp: $(ELFILES)
|
||
@@rm -f elc-temp
|
||
@@touch elc-temp
|
||
$(elisp_comp) $(ELFILES)
|
||
@@mv -f elc-temp $@@
|
||
|
||
$(ELCFILES): elc-stamp
|
||
@@if test -f $@@; then :; else \
|
||
## Recover from the removal of $@@
|
||
trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
|
||
if mkdir elc-lock 2>/dev/null; then \
|
||
## This code is being executed by the first process.
|
||
rm -f elc-stamp; \
|
||
$(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
|
||
rmdir elc-lock; \
|
||
else \
|
||
## This code is being executed by the follower processes.
|
||
## Wait until the first process is done.
|
||
while test -d elc-lock; do sleep 1; done; \
|
||
## Succeed if and only if the first process succeeded.
|
||
test -f elc-stamp; exit $$?; \
|
||
@c $$
|
||
fi; \
|
||
fi
|
||
@end example
|
||
|
||
These solutions all still suffer from the third problem, namely that
|
||
they break the promise that @samp{make -n} should not cause any actual
|
||
changes to the tree. For those solutions that do not create lock files,
|
||
it is possible to split the recover rules into two separate recipe
|
||
commands, one of which does all work but the recursion, and the
|
||
other invokes the recursive @samp{$(MAKE)}. The solutions involving
|
||
locking could act upon the contents of the @samp{MAKEFLAGS} variable,
|
||
but parsing that portably is not easy (@pxref{The Make Macro MAKEFLAGS,,,
|
||
autoconf, The Autoconf Manual}). Here is an example:
|
||
|
||
@example
|
||
ELFILES = one.el two.el three.el @dots{}
|
||
ELCFILES = $(ELFILES:=c)
|
||
|
||
elc-stamp: $(ELFILES)
|
||
@@rm -f elc-temp
|
||
@@touch elc-temp
|
||
$(elisp_comp) $(ELFILES)
|
||
@@mv -f elc-temp $@@
|
||
|
||
$(ELCFILES): elc-stamp
|
||
## Recover from the removal of $@@
|
||
@@dry=; for f in x $$MAKEFLAGS; do \
|
||
case $$f in \
|
||
*=*|--*);; \
|
||
*n*) dry=:;; \
|
||
esac; \
|
||
done; \
|
||
if test -f $@@; then :; else \
|
||
$$dry trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
|
||
if $$dry mkdir elc-lock 2>/dev/null; then \
|
||
## This code is being executed by the first process.
|
||
$$dry rm -f elc-stamp; \
|
||
$(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
|
||
$$dry rmdir elc-lock; \
|
||
else \
|
||
## This code is being executed by the follower processes.
|
||
## Wait until the first process is done.
|
||
while test -d elc-lock && test -z "$$dry"; do \
|
||
@c $$
|
||
sleep 1; \
|
||
done; \
|
||
## Succeed if and only if the first process succeeded.
|
||
$$dry test -f elc-stamp; exit $$?; \
|
||
fi; \
|
||
fi
|
||
@end example
|
||
|
||
For completeness it should be noted that GNU @command{make} is able to
|
||
express rules with multiple output files using pattern rules
|
||
(@pxref{Pattern Examples, , Pattern Rule Examples, make, The GNU Make
|
||
Manual}). We do not discuss pattern rules here because they are not
|
||
portable, but they can be convenient in packages that assume GNU
|
||
@command{make}.
|
||
|
||
|
||
@node Hard-Coded Install Paths
|
||
@section Installing to Hard-Coded Locations
|
||
|
||
@display
|
||
My package needs to install some configuration file. I tried to use
|
||
the following rule, but @samp{make distcheck} fails. Why?
|
||
|
||
@example
|
||
# Do not do this.
|
||
install-data-local:
|
||
$(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile
|
||
@end example
|
||
@end display
|
||
|
||
@display
|
||
My package needs to populate the installation directory of another
|
||
package at install-time. I can easily compute that installation
|
||
directory in @file{configure}, but if I install files therein,
|
||
@samp{make distcheck} fails. How else should I do?
|
||
@end display
|
||
|
||
These two setups share their symptoms: @samp{make distcheck} fails
|
||
because they are installing files to hard-coded paths. In the later
|
||
case the path is not really hard-coded in the package, but we can
|
||
consider it to be hard-coded in the system (or in whichever tool that
|
||
supplies the path). As long as the path does not use any of the
|
||
standard directory variables (@samp{$(prefix)}, @samp{$(bindir)},
|
||
@samp{$(datadir)}, etc.), the effect will be the same:
|
||
user-installations are impossible.
|
||
|
||
As a (non-root) user who wants to install a package, you usually have no
|
||
right to install anything in @file{/usr} or @file{/usr/local}. So you
|
||
do something like @samp{./configure --prefix ~/usr} to install a
|
||
package in your own @file{~/usr} tree.
|
||
|
||
If a package attempts to install something to some hard-coded path
|
||
(e.g., @file{/etc/afile}), regardless of this @option{--prefix} setting,
|
||
then the installation will fail. @samp{make distcheck} performs such
|
||
a @option{--prefix} installation, hence it will fail too.
|
||
|
||
Now, there are some easy solutions.
|
||
|
||
The above @code{install-data-local} example for installing
|
||
@file{/etc/afile} would be better replaced by
|
||
|
||
@example
|
||
sysconf_DATA = afile
|
||
@end example
|
||
|
||
@noindent
|
||
by default @code{sysconfdir} will be @samp{$(prefix)/etc}, because
|
||
this is what the GNU Standards require. When such a package is
|
||
installed on an FHS compliant system, the installer will have to set
|
||
@samp{--sysconfdir=/etc}. As the maintainer of the package you
|
||
should not be concerned by such site policies: use the appropriate
|
||
standard directory variable to install your files so that the installer
|
||
can easily redefine these variables to match their site conventions.
|
||
|
||
Installing files that should be used by another package is slightly
|
||
more involved. Let's take an example and assume you want to install
|
||
a shared library that is a Python extension module. If you ask Python
|
||
where to install the library, it will answer something like this:
|
||
|
||
@example
|
||
% @kbd{python -c 'from distutils import sysconfig;
|
||
print sysconfig.get_python_lib(1,0)'}
|
||
/usr/lib/python2.5/site-packages
|
||
@end example
|
||
|
||
If you indeed use this absolute path to install your shared library,
|
||
non-root users will not be able to install the package, hence
|
||
distcheck fails.
|
||
|
||
Let's do better. The @samp{sysconfig.get_python_lib()} function
|
||
actually accepts a third argument that will replace Python's
|
||
installation prefix.
|
||
|
||
@example
|
||
% @kbd{python -c 'from distutils import sysconfig;
|
||
print sysconfig.get_python_lib(1,0,"$@{exec_prefix@}")'}
|
||
$@{exec_prefix@}/lib/python2.5/site-packages
|
||
@end example
|
||
|
||
You can also use this new path. If you do
|
||
@itemize @bullet
|
||
@item
|
||
root users can install your package with the same @option{--prefix}
|
||
as Python (you get the behavior of the previous attempt)
|
||
|
||
@item
|
||
non-root users can install your package too, they will have the
|
||
extension module in a place that is not searched by Python but they
|
||
can work around this using environment variables (and if you installed
|
||
scripts that use this shared library, it's easy to tell Python were to
|
||
look in the beginning of your script, so the script works in both
|
||
cases).
|
||
@end itemize
|
||
|
||
The @code{AM_PATH_PYTHON} macro uses similar commands to define
|
||
@samp{$(pythondir)} and @samp{$(pyexecdir)} (@pxref{Python}).
|
||
|
||
Of course not all tools are as advanced as Python regarding that
|
||
substitution of @var{prefix}. So another strategy is to figure the
|
||
part of the installation directory that must be preserved. For
|
||
instance, here is how @code{AM_PATH_LISPDIR} (@pxref{Emacs Lisp})
|
||
computes @samp{$(lispdir)}:
|
||
|
||
@example
|
||
$EMACS -batch -Q -eval '(while load-path
|
||
(princ (concat (car load-path) "\n"))
|
||
(setq load-path (cdr load-path)))' >conftest.out
|
||
lispdir=`sed -n
|
||
-e 's,/$,,'
|
||
-e '/.*\/lib\/x*emacs\/site-lisp$/@{
|
||
s,.*/lib/\(x*emacs/site-lisp\)$,$@{libdir@}/\1,;p;q;
|
||
@}'
|
||
-e '/.*\/share\/x*emacs\/site-lisp$/@{
|
||
s,.*/share/\(x*emacs/site-lisp\),$@{datarootdir@}/\1,;p;q;
|
||
@}'
|
||
conftest.out`
|
||
@end example
|
||
|
||
I.e., it just picks the first directory that looks like
|
||
@file{*/lib/*emacs/site-lisp} or @file{*/share/*emacs/site-lisp} in
|
||
the search path of emacs, and then substitutes @samp{$@{libdir@}} or
|
||
@samp{$@{datadir@}} appropriately.
|
||
|
||
The emacs case looks complicated because it processes a list and
|
||
expects two possible layouts, otherwise it's easy, and the benefits for
|
||
non-root users are really worth the extra @command{sed} invocation.
|
||
|
||
|
||
@node Debugging Make Rules
|
||
@section Debugging Make Rules
|
||
@cindex debugging rules
|
||
@cindex rules, debugging
|
||
|
||
The rules and dependency trees generated by @command{automake} can get
|
||
rather complex, and leave the developer head-scratching when things
|
||
don't work as expected. Besides the debug options provided by the
|
||
@command{make} command (@pxref{Options Summary,,, make, The GNU Make
|
||
Manual}), here's a couple of further hints for debugging makefiles
|
||
generated by @command{automake} effectively:
|
||
|
||
@itemize
|
||
@item
|
||
If less verbose output has been enabled in the package with the use
|
||
of silent rules (@pxref{Automake Silent Rules}), you can use
|
||
@code{make V=1} to see the commands being executed.
|
||
@item
|
||
@code{make -n} can help show what would be done without actually doing
|
||
it. Note however, that this will @emph{still execute} commands prefixed
|
||
with @samp{+}, and, when using GNU @command{make}, commands that contain
|
||
the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} (@pxref{Instead of
|
||
Execution,,, make, The GNU Make Manual}).
|
||
Typically, this is helpful to show what recursive rules would do, but it
|
||
means that, in your own rules, you should not mix such recursion with
|
||
actions that change any files.@footnote{Automake's @samp{dist} and
|
||
@samp{distcheck} rules had a bug in this regard in that they created
|
||
directories even with @option{-n}, but this has been fixed in Automake
|
||
1.11.} Furthermore, note that GNU @command{make} will update
|
||
prerequisites for the @file{Makefile} file itself even with @option{-n}
|
||
(@pxref{Remaking Makefiles,,, make, The GNU Make Manual}).
|
||
@item
|
||
@code{make SHELL="/bin/bash -vx"} can help debug complex rules.
|
||
@xref{The Make Macro SHELL,,, autoconf, The Autoconf Manual}, for some
|
||
portability quirks associated with this construct.
|
||
@item
|
||
@code{echo 'print: ; @@echo "$(VAR)"' | make -f Makefile -f - print}
|
||
can be handy to examine the expanded value of variables. You may need
|
||
to use a target other than @samp{print} if that is already used or a
|
||
file with that name exists.
|
||
@item
|
||
@url{http://bashdb.sourceforge.net/@/remake/} provides a modified
|
||
GNU @command{make} command called @command{remake} that copes with
|
||
complex GNU @command{make}-specific Makefiles and allows to trace
|
||
execution, examine variables, and call rules interactively, much like
|
||
a debugger.
|
||
@end itemize
|
||
|
||
|
||
@node Reporting Bugs
|
||
@section Reporting Bugs
|
||
|
||
Most nontrivial software has bugs. Automake is no exception. Although
|
||
we cannot promise we can or will fix a bug, and we might not even agree
|
||
that it is a bug, we want to hear about problems you encounter. Often we
|
||
agree they are bugs and want to fix them.
|
||
|
||
To make it possible for us to fix a bug, please report it. In order to
|
||
do so effectively, it helps to know when and how to do it.
|
||
|
||
Before reporting a bug, it is a good idea to see if it is already known.
|
||
You can look at the @uref{http://debbugs.gnu.org/, GNU Bug Tracker}
|
||
and the @uref{http://lists.gnu.org/@/archive/@/html/@/bug-automake/,
|
||
bug-automake mailing list archives} for previous bug reports. We
|
||
previously used a
|
||
@uref{http://sourceware.org/@/cgi-bin/@/gnatsweb.pl?database=automake,
|
||
Gnats database} for bug tracking, so some bugs might have been reported
|
||
there already. Please do not use it for new bug reports, however.
|
||
|
||
If the bug is not already known, it should be reported. It is very
|
||
important to report bugs in a way that is useful and efficient. For
|
||
this, please familiarize yourself with
|
||
@uref{http://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to
|
||
Report Bugs Effectively} and
|
||
@uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask
|
||
Questions the Smart Way}. This helps you and developers to save time
|
||
which can then be spent on fixing more bugs and implementing more
|
||
features.
|
||
|
||
For a bug report, a feature request or other suggestions, please send
|
||
email to @email{@value{PACKAGE_BUGREPORT}}. This will then open a new
|
||
bug in the @uref{http://debbugs.gnu.org/@/automake, bug tracker}. Be
|
||
sure to include the versions of Autoconf and Automake that you use.
|
||
Ideally, post a minimal @file{Makefile.am} and @file{configure.ac} that
|
||
reproduces the problem you encounter. If you have encountered test
|
||
suite failures, please attach the @file{test-suite.log} file.
|
||
|
||
@c ========================================================== Appendices
|
||
|
||
@page
|
||
@node Copying This Manual
|
||
@appendix Copying This Manual
|
||
|
||
@menu
|
||
* GNU Free Documentation License:: License for copying this manual
|
||
@end menu
|
||
|
||
@node GNU Free Documentation License
|
||
@appendixsec GNU Free Documentation License
|
||
@include fdl.texi
|
||
|
||
@page
|
||
@node Indices
|
||
@appendix Indices
|
||
|
||
@menu
|
||
* Macro Index:: Index of Autoconf macros
|
||
* Variable Index:: Index of Makefile variables
|
||
* General Index:: General index
|
||
@end menu
|
||
|
||
@node Macro Index
|
||
@appendixsec Macro Index
|
||
|
||
@printindex fn
|
||
|
||
@node Variable Index
|
||
@appendixsec Variable Index
|
||
|
||
@printindex vr
|
||
|
||
@node General Index
|
||
@appendixsec General Index
|
||
|
||
@printindex cp
|
||
|
||
|
||
@bye
|
||
|
||
@c LocalWords: texinfo setfilename settitle setchapternewpage texi direntry
|
||
@c LocalWords: dircategory in's aclocal ifinfo titlepage Tromey vskip pt sp
|
||
@c LocalWords: filll defcodeindex ov cv op tr syncodeindex fn cp vr ifnottex
|
||
@c LocalWords: dir Automake's ac Dist Gnits gnits dfn Autoconf's pxref
|
||
@c LocalWords: cindex Autoconf autoconf perl samp cvs dist trindex SUBST foo
|
||
@c LocalWords: xs emph FIXME ref vindex pkglibdir pkgincludedir pkgdatadir mt
|
||
@c LocalWords: pkg libdir cpio bindir sbindir rmt pax sbin zar zardir acindex
|
||
@c LocalWords: HTML htmldir html noinst TEXINFOS nodist nobase strudel CFLAGS
|
||
@c LocalWords: libmumble CC YFLAGS itemx de fication config url comp
|
||
@c LocalWords: depcomp elisp sh mdate mkinstalldirs mkdir py tex dvi ps pdf
|
||
@c LocalWords: ylwrap zardoz INIT gettext acinclude mv FUNCS LIBOBJS LDADD fr
|
||
@c LocalWords: uref featureful dnl src LINGUAS es ko nl pl sl sv PROG ISC doc
|
||
@c LocalWords: POSIX STDC fcntl FUNC ALLOCA blksize struct stat intl po chmod
|
||
@c LocalWords: ChangeLog SUBDIRS gettextize gpl testdata getopt INTLLIBS cpp
|
||
@c LocalWords: localedir datadir DLOCALEDIR DEXIT CPPFLAGS autoreconf opindex
|
||
@c LocalWords: AUX var symlink deps Wno Wnone package's aclocal's distclean
|
||
@c LocalWords: ltmain xref LIBSOURCE LIBSOURCES LIBOBJ MEMCMP vs RANLIB CXX
|
||
@c LocalWords: LDFLAGS LIBTOOL libtool XTRA LIBS gettext's acdir APIVERSION
|
||
@c LocalWords: dirlist noindent usr TIOCGWINSZ sc
|
||
@c LocalWords: GWINSZ termios SRCDIR tarball bzip LISPDIR lispdir XEmacs CCAS
|
||
@c LocalWords: emacsen MicroEmacs CCASFLAGS UX GCJ gcj GCJFLAGS posix DMALLOC
|
||
@c LocalWords: dmalloc ldmalloc REGEX regex DEPDIR DEP DEFUN aclocaldir fi
|
||
@c LocalWords: mymacro myothermacro AMFLAGS autopoint autogen libtoolize yum
|
||
@c LocalWords: autoheader README MAKEFLAGS subdir Inetutils sync COND endif
|
||
@c LocalWords: Miller's installable includedir inc pkgdata EXEEXT libexec bsd
|
||
@c LocalWords: pkglib libexecdir prog libcpio cpio's dlopen dlpreopen linux
|
||
@c LocalWords: subsubsection OBJEXT esac lib LTLIBRARIES liblob LIBADD AR ar
|
||
@c LocalWords: ARFLAGS cru ing maude libgettext lo LTLIBOBJS rpath SGI PRE yy
|
||
@c LocalWords: libmaude CCLD CXXFLAGS FFLAGS LFLAGS OBJCFLAGS RFLAGS DEFS cc
|
||
@c LocalWords: OBJCXXFLAGS
|
||
@c LocalWords: SHORTNAME vtable srcdir nostdinc basename yxx cxx ll lxx gdb
|
||
@c LocalWords: lexers yymaxdepth maxdepth yyparse yylex yyerror yylval lval
|
||
@c LocalWords: yychar yydebug yypact yyr yydef def yychk chk yypgo pgo yyact
|
||
@c LocalWords: yyexca exca yyerrflag errflag yynerrs nerrs yyps yypv pv yys
|
||
@c LocalWords: yystate yytmp tmp yyv yyval val yylloc lloc yyreds yytoks toks
|
||
@c LocalWords: yylhs yylen yydefred yydgoto yysindex yyrindex yygindex yyname
|
||
@c LocalWords: yytable yycheck yyrule byacc CXXCOMPILE CXXLINK FLINK cfortran
|
||
@c LocalWords: Catalogue preprocessable FLIBS libfoo baz JAVACFLAGS java exe
|
||
@c LocalWords: SunOS fying basenames exeext uninstalled oldinclude kr FSF's
|
||
@c LocalWords: pkginclude oldincludedir sysconf sharedstate localstate gcc rm
|
||
@c LocalWords: sysconfdir sharedstatedir localstatedir preexist CLEANFILES gz
|
||
@c LocalWords: depfile tmpdepfile depmode const interoperate
|
||
@c LocalWords: JAVAC javac JAVAROOT builddir CLASSPATH ENV pyc pyo pkgpython
|
||
@c LocalWords: pyexecdir pkgpyexecdir Python's pythondir pkgpythondir txi ois
|
||
@c LocalWords: installinfo vers MAKEINFO makeinfo MAKEINFOFLAGS noinstall rf
|
||
@c LocalWords: mandir thesame alsothesame installman myexecbin DESTDIR Pinard
|
||
@c LocalWords: uninstall installdirs uninstalls MOSTLYCLEANFILES mostlyclean
|
||
@c LocalWords: DISTCLEANFILES MAINTAINERCLEANFILES GZIP gzip shar exp
|
||
@c LocalWords: distdir distcheck distcleancheck listfiles distuninstallcheck
|
||
@c LocalWords: VPATH tarfile stdout XFAIL DejaGnu dejagnu DEJATOOL runtest ln
|
||
@c LocalWords: RUNTESTDEFAULTFLAGS toolchain RUNTESTFLAGS asis readme DVIPS
|
||
@c LocalWords: installcheck gzipped tarZ std utils etags mkid cd
|
||
@c LocalWords: ARGS taggable ETAGSFLAGS lang ctags CTAGSFLAGS GTAGS gtags idl
|
||
@c LocalWords: foocc doit idlC multilibs ABIs cmindex defmac ARG enableval FC
|
||
@c LocalWords: MSG xtrue DBG pathchk CYGWIN afile proglink versioned CVS's TE
|
||
@c LocalWords: wildcards Autoconfiscated subsubheading autotools Meyering API
|
||
@c LocalWords: ois's wildcard Wportability cartouche vrindex printindex Duret
|
||
@c LocalWords: DSOMEFLAG DVERSION automake Lutz insertcopying versioning FAQ
|
||
@c LocalWords: LTLIBOBJ Libtool's libtool's libltdl dlopening itutions libbar
|
||
@c LocalWords: WANTEDLIBS libhello sublibraries libtop libsub dlopened Ratfor
|
||
@c LocalWords: mymodule timestamps timestamp underquoted MAKEINFOHTMLFLAGS te
|
||
@c LocalWords: GNUmakefile Subpackages subpackage's subpackages aux
|
||
@c LocalWords: detailmenu Timeline pwd reldir AUTOM autom PREREQ FOOBAR libc
|
||
@c LocalWords: libhand subpackage moduleN libmain libmisc FCFLAGS FCCOMPILE
|
||
@c LocalWords: FCLINK subst sed ELCFILES elc MAKEINFOHTML dvips esyscmd ustar
|
||
@c LocalWords: tarballs Woverride vfi ELFILES djm AutoMake honkin FSF
|
||
@c LocalWords: fileutils precanned MacKenzie's reimplement termutils Tromey's
|
||
@c LocalWords: cois gnitsians LIBPROGRAMS progs LIBLIBRARIES Textutils Ulrich
|
||
@c LocalWords: Matzigkeit Drepper's Gord Matzigkeit's jm Dalley Debian org
|
||
@c LocalWords: Administrivia ILU CORBA Sourceware Molenda sourceware Elliston
|
||
@c LocalWords: dep Oliva Akim Demaille Aiieeee Demaillator Akim's sourcequake
|
||
@c LocalWords: grep backported screenshots libgcj KB unnumberedsubsubsec pre
|
||
@c LocalWords: precomputing hacky makedepend inline clearmake LD PRELOAD Rel
|
||
@c LocalWords: syscalls perlhist acl pm multitable headitem fdl appendixsec
|
||
@c LocalWords: LTALLOCA MALLOC malloc memcmp strdup alloca libcompat xyz DFOO
|
||
@c LocalWords: unprefixed buildable preprocessed DBAZ DDATADIR WARNINGCFLAGS
|
||
@c LocalWords: LIBFOOCFLAGS LIBFOOLDFLAGS ftable testSubDir obj LIBTOOLFLAGS
|
||
@c LocalWords: barexec Pinard's automatize initialize lzip xz cscope
|