6917 lines
293 KiB
Plaintext
6917 lines
293 KiB
Plaintext
This is automake.info, produced by makeinfo version 6.1 from
|
||
automake.texi.
|
||
|
||
This manual is for GNU Automake (version 1.15.1, 17 June 2017), a
|
||
program that creates GNU standards-compliant Makefiles from template
|
||
files.
|
||
|
||
Copyright © 1995-2017 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this
|
||
document under the terms of the GNU Free Documentation License,
|
||
Version 1.3 or any later version published by the Free Software
|
||
Foundation; with no Invariant Sections, with no Front-Cover texts,
|
||
and with no Back-Cover Texts. A copy of the license is included in
|
||
the section entitled “GNU Free Documentation License.”
|
||
|
||
INFO-DIR-SECTION Software development
|
||
START-INFO-DIR-ENTRY
|
||
* Automake: (automake). Making GNU standards-compliant Makefiles.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
INFO-DIR-SECTION Individual utilities
|
||
START-INFO-DIR-ENTRY
|
||
* aclocal-invocation: (automake)aclocal Invocation. Generating aclocal.m4.
|
||
* automake-invocation: (automake)automake Invocation. Generating Makefile.in.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
|
||
File: automake.info, Node: Top, Next: Introduction, Up: (dir)
|
||
|
||
GNU Automake
|
||
************
|
||
|
||
This manual is for GNU Automake (version 1.15.1, 17 June 2017), a
|
||
program that creates GNU standards-compliant Makefiles from template
|
||
files.
|
||
|
||
Copyright © 1995-2017 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this
|
||
document under the terms of the GNU Free Documentation License,
|
||
Version 1.3 or any later version published by the Free Software
|
||
Foundation; with no Invariant Sections, with no Front-Cover texts,
|
||
and with no Back-Cover Texts. A copy of the license is included in
|
||
the section entitled “GNU Free Documentation License.”
|
||
|
||
* Menu:
|
||
|
||
* Introduction:: Automake’s purpose
|
||
* Autotools Introduction:: An Introduction to the Autotools
|
||
* Generalities:: General ideas
|
||
* Examples:: Some example packages
|
||
* automake Invocation:: Creating a Makefile.in
|
||
* configure:: Scanning configure.ac, using aclocal
|
||
* Directories:: Declaring subdirectories
|
||
* Programs:: Building programs and libraries
|
||
* Other Objects:: Other derived objects
|
||
* Other GNU Tools:: Other GNU Tools
|
||
* Documentation:: Building documentation
|
||
* Install:: What gets installed
|
||
* Clean:: What gets cleaned
|
||
* Dist:: What goes in a distribution
|
||
* Tests:: Support for test suites
|
||
* Rebuilding:: Automatic rebuilding of Makefile
|
||
* Options:: Changing Automake’s behavior
|
||
* Miscellaneous:: Miscellaneous rules
|
||
* Include:: Including extra files in an Automake template
|
||
* Conditionals:: Conditionals
|
||
* Silencing Make:: Obtain less verbose output from ‘make’
|
||
* Gnits:: The effect of ‘--gnu’ and ‘--gnits’
|
||
* Not Enough:: When Automake is not Enough
|
||
* Distributing:: Distributing the Makefile.in
|
||
* API Versioning:: About compatibility between Automake versions
|
||
* Upgrading:: Upgrading to a Newer Automake Version
|
||
* FAQ:: Frequently Asked Questions
|
||
* Copying This Manual:: How to make copies of this manual
|
||
* Indices:: Indices of variables, macros, and concepts
|
||
|
||
— The Detailed Node Listing —
|
||
|
||
An Introduction to the Autotools
|
||
|
||
* GNU Build System:: Introducing the GNU Build System
|
||
* Use Cases:: Use Cases for the GNU Build System
|
||
* Why Autotools:: How Autotools Help
|
||
* Hello World:: A Small Hello World Package
|
||
|
||
Use Cases for the GNU Build System
|
||
|
||
* Basic Installation:: Common installation procedure
|
||
* Standard Targets:: A list of standard Makefile targets
|
||
* Standard Directory Variables:: A list of standard directory variables
|
||
* Standard Configuration Variables:: Using configuration variables
|
||
* config.site:: Using a config.site file
|
||
* VPATH Builds:: Parallel build trees
|
||
* Two-Part Install:: Installing data and programs separately
|
||
* Cross-Compilation:: Building for other architectures
|
||
* Renaming:: Renaming programs at install time
|
||
* DESTDIR:: Building binary packages with DESTDIR
|
||
* Preparing Distributions:: Rolling out tarballs
|
||
* Dependency Tracking:: Automatic dependency tracking
|
||
* Nested Packages:: The GNU Build Systems can be nested
|
||
|
||
A Small Hello World
|
||
|
||
* Creating amhello:: Create ‘amhello-1.0.tar.gz’ from scratch
|
||
* amhello's configure.ac Setup Explained::
|
||
* amhello's Makefile.am Setup Explained::
|
||
|
||
General ideas
|
||
|
||
* General Operation:: General operation of Automake
|
||
* Strictness:: Standards conformance checking
|
||
* Uniform:: The Uniform Naming Scheme
|
||
* Length Limitations:: Staying below the command line length limit
|
||
* Canonicalization:: How derived variables are named
|
||
* User Variables:: Variables reserved for the user
|
||
* Auxiliary Programs:: Programs automake might require
|
||
|
||
Some example packages
|
||
|
||
* Complete:: A simple example, start to finish
|
||
* true:: Building true and false
|
||
|
||
Scanning ‘configure.ac’, using ‘aclocal’
|
||
|
||
* Requirements:: Configuration requirements
|
||
* Optional:: Other things Automake recognizes
|
||
* aclocal Invocation:: Auto-generating aclocal.m4
|
||
* Macros:: Autoconf macros supplied with Automake
|
||
|
||
Auto-generating aclocal.m4
|
||
|
||
* aclocal Options:: Options supported by aclocal
|
||
* Macro Search Path:: How aclocal finds .m4 files
|
||
* Extending aclocal:: Writing your own aclocal macros
|
||
* Local Macros:: Organizing local macros
|
||
* Serials:: Serial lines in Autoconf macros
|
||
* Future of aclocal:: aclocal’s scheduled death
|
||
|
||
Autoconf macros supplied with Automake
|
||
|
||
* Public Macros:: Macros that you can use.
|
||
* Private Macros:: Macros that you should not use.
|
||
|
||
Directories
|
||
|
||
* Subdirectories:: Building subdirectories recursively
|
||
* Conditional Subdirectories:: Conditionally not building directories
|
||
* Alternative:: Subdirectories without recursion
|
||
* Subpackages:: Nesting packages
|
||
|
||
Conditional Subdirectories
|
||
|
||
* SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
|
||
* Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
|
||
* Subdirectories with AC_SUBST:: Another way for conditional recursion
|
||
* Unconfigured Subdirectories:: Not even creating a ‘Makefile’
|
||
|
||
Building Programs and Libraries
|
||
|
||
* A Program:: Building a program
|
||
* A Library:: Building a library
|
||
* A Shared Library:: Building a Libtool library
|
||
* Program and Library Variables:: Variables controlling program and
|
||
library builds
|
||
* Default _SOURCES:: Default source files
|
||
* LIBOBJS:: Special handling for LIBOBJS and ALLOCA
|
||
* Program Variables:: Variables used when building a program
|
||
* Yacc and Lex:: Yacc and Lex support
|
||
* C++ Support:: Compiling C++ sources
|
||
* Objective C Support:: Compiling Objective C sources
|
||
* Objective C++ Support:: Compiling Objective C++ sources
|
||
* Unified Parallel C Support:: Compiling Unified Parallel C sources
|
||
* Assembly Support:: Compiling assembly sources
|
||
* Fortran 77 Support:: Compiling Fortran 77 sources
|
||
* Fortran 9x Support:: Compiling Fortran 9x sources
|
||
* Java Support with gcj:: Compiling Java sources using gcj
|
||
* Vala Support:: Compiling Vala sources
|
||
* Support for Other Languages:: Compiling other languages
|
||
* Dependencies:: Automatic dependency tracking
|
||
* EXEEXT:: Support for executable extensions
|
||
|
||
Building a program
|
||
|
||
* Program Sources:: Defining program sources
|
||
* Linking:: Linking with libraries or extra objects
|
||
* Conditional Sources:: Handling conditional sources
|
||
* Conditional Programs:: Building a program conditionally
|
||
|
||
Building a Shared Library
|
||
|
||
* Libtool Concept:: Introducing Libtool
|
||
* Libtool Libraries:: Declaring Libtool Libraries
|
||
* Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
|
||
* Conditional Libtool Sources:: Choosing Library Sources Conditionally
|
||
* Libtool Convenience Libraries:: Building Convenience Libtool Libraries
|
||
* Libtool Modules:: Building Libtool Modules
|
||
* Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
|
||
* LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
|
||
* Libtool Issues:: Common Issues Related to Libtool’s Use
|
||
|
||
Common Issues Related to Libtool’s Use
|
||
|
||
* Error required file ltmain.sh not found:: The need to run libtoolize
|
||
* Objects created both with libtool and without:: Avoid a specific build race
|
||
|
||
Fortran 77 Support
|
||
|
||
* Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
|
||
* Compiling Fortran 77 Files:: Compiling Fortran 77 sources
|
||
* Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
|
||
|
||
Mixing Fortran 77 With C and C++
|
||
|
||
* How the Linker is Chosen:: Automatic linker selection
|
||
|
||
Fortran 9x Support
|
||
|
||
* Compiling Fortran 9x Files:: Compiling Fortran 9x sources
|
||
|
||
Other Derived Objects
|
||
|
||
* Scripts:: Executable scripts
|
||
* Headers:: Header files
|
||
* Data:: Architecture-independent data files
|
||
* Sources:: Derived sources
|
||
|
||
Built Sources
|
||
|
||
* Built Sources Example:: Several ways to handle built sources.
|
||
|
||
Other GNU Tools
|
||
|
||
* Emacs Lisp:: Emacs Lisp
|
||
* gettext:: Gettext
|
||
* Libtool:: Libtool
|
||
* Java:: Java bytecode compilation (deprecated)
|
||
* Python:: Python
|
||
|
||
Building documentation
|
||
|
||
* Texinfo:: Texinfo
|
||
* Man Pages:: Man pages
|
||
|
||
What Gets Installed
|
||
|
||
* Basics of Installation:: What gets installed where
|
||
* The Two Parts of Install:: Installing data and programs separately
|
||
* Extending Installation:: Adding your own rules for installation
|
||
* Staged Installs:: Installation in a temporary location
|
||
* Install Rules for the User:: Useful additional rules
|
||
|
||
What Goes in a Distribution
|
||
|
||
* Basics of Distribution:: Files distributed by default
|
||
* Fine-grained Distribution Control:: ‘dist_’ and ‘nodist_’ prefixes
|
||
* The dist Hook:: A target for last-minute distribution changes
|
||
* Checking the Distribution:: ‘make distcheck’ explained
|
||
* The Types of Distributions:: A variety of formats and compression methods
|
||
|
||
Support for test suites
|
||
|
||
* Generalities about Testing:: Generic concepts and terminology about testing
|
||
* Simple Tests:: Listing test scripts in ‘TESTS’
|
||
* Custom Test Drivers:: Writing and using custom test drivers
|
||
* Using the TAP test protocol:: Integrating test scripts that use the TAP protocol
|
||
* DejaGnu Tests:: Interfacing with the ‘dejagnu’ testing framework
|
||
* Install Tests:: Running tests on installed packages
|
||
|
||
Simple Tests
|
||
|
||
* Scripts-based Testsuites:: Automake-specific concepts and terminology
|
||
* Serial Test Harness:: Older (and discouraged) serial test harness
|
||
* Parallel Test Harness:: Generic concurrent test harness
|
||
|
||
Using the TAP test protocol
|
||
|
||
* Introduction to TAP::
|
||
* Use TAP with the Automake test harness::
|
||
* Incompatibilities with other TAP parsers and drivers::
|
||
* Links and external resources on TAP::
|
||
|
||
Custom Test Drivers
|
||
|
||
* Overview of Custom Test Drivers Support::
|
||
* Declaring Custom Test Drivers::
|
||
* API for Custom Test Drivers::
|
||
|
||
API for Custom Test Drivers
|
||
|
||
* Command-line arguments for test drivers::
|
||
* Log files generation and test results recording::
|
||
* Testsuite progress output::
|
||
|
||
Changing Automake’s Behavior
|
||
|
||
* Options generalities:: Semantics of Automake option
|
||
* List of Automake options:: A comprehensive list of Automake options
|
||
|
||
Miscellaneous Rules
|
||
|
||
* Tags:: Interfacing to cscope, etags and mkid
|
||
* Suffixes:: Handling new file extensions
|
||
|
||
Conditionals
|
||
|
||
* Usage of Conditionals:: Declaring conditional content
|
||
* Limits of Conditionals:: Enclosing complete statements
|
||
|
||
Silencing Make
|
||
|
||
* Make verbosity:: Make is verbose by default
|
||
* Tricks For Silencing Make:: Standard and generic ways to silence make
|
||
* Automake Silent Rules:: How Automake can help in silencing make
|
||
|
||
When Automake Isn’t Enough
|
||
|
||
* Extending:: Adding new rules or overriding existing ones.
|
||
* Third-Party Makefiles:: Integrating Non-Automake ‘Makefile’s.
|
||
|
||
Frequently Asked Questions about Automake
|
||
|
||
* CVS:: CVS and generated files
|
||
* maintainer-mode:: missing and AM_MAINTAINER_MODE
|
||
* Wildcards:: Why doesn’t Automake support wildcards?
|
||
* Limitations on File Names:: Limitations on source and installed file names
|
||
* Errors with distclean:: Files left in build directory after distclean
|
||
* Flag Variables Ordering:: CFLAGS vs. AM_CFLAGS vs. mumble_CFLAGS
|
||
* Renamed Objects:: Why are object files sometimes renamed?
|
||
* Per-Object Flags:: How to simulate per-object flags?
|
||
* Multiple Outputs:: Writing rules for tools with many output files
|
||
* Hard-Coded Install Paths:: Installing to hard-coded locations
|
||
* Debugging Make Rules:: Strategies when things don’t work as expected
|
||
* Reporting Bugs:: Feedback on bugs and feature requests
|
||
|
||
Copying This Manual
|
||
|
||
* GNU Free Documentation License:: License for copying this manual
|
||
|
||
Indices
|
||
|
||
* Macro Index:: Index of Autoconf macros
|
||
* Variable Index:: Index of Makefile variables
|
||
* General Index:: General index
|
||
|
||
|
||
|
||
File: automake.info, Node: Introduction, Next: Autotools Introduction, Prev: Top, Up: Top
|
||
|
||
1 Introduction
|
||
**************
|
||
|
||
Automake is a tool for automatically generating ‘Makefile.in’s from
|
||
files called ‘Makefile.am’. Each ‘Makefile.am’ is basically a series of
|
||
‘make’ variable definitions(1), with rules being thrown in occasionally.
|
||
The generated ‘Makefile.in’s are compliant with the GNU Makefile
|
||
standards.
|
||
|
||
The GNU Makefile Standards Document (*note (standards)Makefile
|
||
Conventions::) is long, complicated, and subject to change. The goal of
|
||
Automake is to remove the burden of Makefile maintenance from the back
|
||
of the individual GNU maintainer (and put it on the back of the Automake
|
||
maintainers).
|
||
|
||
The typical Automake input file is simply a series of variable
|
||
definitions. Each such file is processed to create a ‘Makefile.in’.
|
||
|
||
Automake does constrain a project in certain ways; for instance, it
|
||
assumes that the project uses Autoconf (*note Introduction:
|
||
(autoconf)Top.), and enforces certain restrictions on the ‘configure.ac’
|
||
contents.
|
||
|
||
Automake requires ‘perl’ in order to generate the ‘Makefile.in’s.
|
||
However, the distributions created by Automake are fully GNU
|
||
standards-compliant, and do not require ‘perl’ in order to be built.
|
||
|
||
For more information on bug reports, *Note Reporting Bugs::.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) These variables are also called “make macros” in Make
|
||
terminology, however in this manual we reserve the term “macro” for
|
||
Autoconf’s macros.
|
||
|
||
|
||
File: automake.info, Node: Autotools Introduction, Next: Generalities, Prev: Introduction, Up: Top
|
||
|
||
2 An Introduction to the Autotools
|
||
**********************************
|
||
|
||
If you are new to Automake, maybe you know that it is part of a set of
|
||
tools called _The Autotools_. Maybe you’ve already delved into a
|
||
package full of files named ‘configure’, ‘configure.ac’, ‘Makefile.in’,
|
||
‘Makefile.am’, ‘aclocal.m4’, ..., some of them claiming to be _generated
|
||
by_ Autoconf or Automake. But the exact purpose of these files and
|
||
their relations is probably fuzzy. The goal of this chapter is to
|
||
introduce you to this machinery, to show you how it works and how
|
||
powerful it is. If you’ve never installed or seen such a package, do
|
||
not worry: this chapter will walk you through it.
|
||
|
||
If you need some teaching material, more illustrations, or a less
|
||
‘automake’-centered continuation, some slides for this introduction are
|
||
available in Alexandre Duret-Lutz’s Autotools Tutorial
|
||
(http://www.lrde.epita.fr/~adl/autotools.html). This chapter is the
|
||
written version of the first part of his tutorial.
|
||
|
||
* Menu:
|
||
|
||
* GNU Build System:: Introducing the GNU Build System
|
||
* Use Cases:: Use Cases for the GNU Build System
|
||
* Why Autotools:: How Autotools Help
|
||
* Hello World:: A Small Hello World Package
|
||
|
||
|
||
File: automake.info, Node: GNU Build System, Next: Use Cases, Up: Autotools Introduction
|
||
|
||
2.1 Introducing the GNU Build System
|
||
====================================
|
||
|
||
It is a truth universally acknowledged, that as a developer in
|
||
possession of a new package, you must be in want of a build system.
|
||
|
||
In the Unix world, such a build system is traditionally achieved
|
||
using the command ‘make’ (*note Overview: (make)Top.). You express the
|
||
recipe to build your package in a ‘Makefile’. This file is a set of
|
||
rules to build the files in the package. For instance the program
|
||
‘prog’ may be built by running the linker on the files ‘main.o’,
|
||
‘foo.o’, and ‘bar.o’; the file ‘main.o’ may be built by running the
|
||
compiler on ‘main.c’; etc. Each time ‘make’ is run, it reads
|
||
‘Makefile’, checks the existence and modification time of the files
|
||
mentioned, decides what files need to be built (or rebuilt), and runs
|
||
the associated commands.
|
||
|
||
When a package needs to be built on a different platform than the one
|
||
it was developed on, its ‘Makefile’ usually needs to be adjusted. For
|
||
instance the compiler may have another name or require more options. In
|
||
1991, David J. MacKenzie got tired of customizing ‘Makefile’ for the 20
|
||
platforms he had to deal with. Instead, he handcrafted a little shell
|
||
script called ‘configure’ to automatically adjust the ‘Makefile’ (*note
|
||
Genesis: (autoconf)Genesis.). Compiling his package was now as simple
|
||
as running ‘./configure && make’.
|
||
|
||
Today this process has been standardized in the GNU project. The GNU
|
||
Coding Standards (*note The Release Process: (standards)Managing
|
||
Releases.) explains how each package of the GNU project should have a
|
||
‘configure’ script, and the minimal interface it should have. The
|
||
‘Makefile’ too should follow some established conventions. The result?
|
||
A unified build system that makes all packages almost indistinguishable
|
||
by the installer. In its simplest scenario, all the installer has to do
|
||
is to unpack the package, run ‘./configure && make && make install’, and
|
||
repeat with the next package to install.
|
||
|
||
We call this build system the “GNU Build System”, since it was grown
|
||
out of the GNU project. However it is used by a vast number of other
|
||
packages: following any existing convention has its advantages.
|
||
|
||
The Autotools are tools that will create a GNU Build System for your
|
||
package. Autoconf mostly focuses on ‘configure’ and Automake on
|
||
‘Makefile’s. It is entirely possible to create a GNU Build System
|
||
without the help of these tools. However it is rather burdensome and
|
||
error-prone. We will discuss this again after some illustration of the
|
||
GNU Build System in action.
|
||
|
||
|
||
File: automake.info, Node: Use Cases, Next: Why Autotools, Prev: GNU Build System, Up: Autotools Introduction
|
||
|
||
2.2 Use Cases for the GNU Build System
|
||
======================================
|
||
|
||
In this section we explore several use cases for the GNU Build System.
|
||
You can replay all of these examples on the ‘amhello-1.0.tar.gz’ package
|
||
distributed with Automake. If Automake is installed on your system, you
|
||
should find a copy of this file in
|
||
‘PREFIX/share/doc/automake/amhello-1.0.tar.gz’, where PREFIX is the
|
||
installation prefix specified during configuration (PREFIX defaults to
|
||
‘/usr/local’, however if Automake was installed by some GNU/Linux
|
||
distribution it most likely has been set to ‘/usr’). If you do not have
|
||
a copy of Automake installed, you can find a copy of this file inside
|
||
the ‘doc/’ directory of the Automake package.
|
||
|
||
Some of the following use cases present features that are in fact
|
||
extensions to the GNU Build System. Read: they are not specified by the
|
||
GNU Coding Standards, but they are nonetheless part of the build system
|
||
created by the Autotools. To keep things simple, we do not point out
|
||
the difference. Our objective is to show you many of the features that
|
||
the build system created by the Autotools will offer to you.
|
||
|
||
* Menu:
|
||
|
||
* Basic Installation:: Common installation procedure
|
||
* Standard Targets:: A list of standard Makefile targets
|
||
* Standard Directory Variables:: A list of standard directory variables
|
||
* Standard Configuration Variables:: Using configuration variables
|
||
* config.site:: Using a config.site file
|
||
* VPATH Builds:: Parallel build trees
|
||
* Two-Part Install:: Installing data and programs separately
|
||
* Cross-Compilation:: Building for other architectures
|
||
* Renaming:: Renaming programs at install time
|
||
* DESTDIR:: Building binary packages with DESTDIR
|
||
* Preparing Distributions:: Rolling out tarballs
|
||
* Dependency Tracking:: Automatic dependency tracking
|
||
* Nested Packages:: The GNU Build Systems can be nested
|
||
|
||
|
||
File: automake.info, Node: Basic Installation, Next: Standard Targets, Up: Use Cases
|
||
|
||
2.2.1 Basic Installation
|
||
------------------------
|
||
|
||
The most common installation procedure looks as follows.
|
||
|
||
~ % tar zxf amhello-1.0.tar.gz
|
||
~ % cd amhello-1.0
|
||
~/amhello-1.0 % ./configure
|
||
...
|
||
config.status: creating Makefile
|
||
config.status: creating src/Makefile
|
||
...
|
||
~/amhello-1.0 % make
|
||
...
|
||
~/amhello-1.0 % make check
|
||
...
|
||
~/amhello-1.0 % su
|
||
Password:
|
||
/home/adl/amhello-1.0 # make install
|
||
...
|
||
/home/adl/amhello-1.0 # exit
|
||
~/amhello-1.0 % make installcheck
|
||
...
|
||
|
||
The user first unpacks the package. Here, and in the following
|
||
examples, we will use the non-portable ‘tar zxf’ command for simplicity.
|
||
On a system without GNU ‘tar’ installed, this command should read
|
||
‘gunzip -c amhello-1.0.tar.gz | tar xf -’.
|
||
|
||
The user then enters the newly created directory to run the
|
||
‘configure’ script. This script probes the system for various features,
|
||
and finally creates the ‘Makefile’s. In this toy example there are only
|
||
two ‘Makefile’s, but in real-world projects, there may be many more,
|
||
usually one ‘Makefile’ per directory.
|
||
|
||
It is now possible to run ‘make’. This will construct all the
|
||
programs, libraries, and scripts that need to be constructed for the
|
||
package. In our example, this compiles the ‘hello’ program. All files
|
||
are constructed in place, in the source tree; we will see later how this
|
||
can be changed.
|
||
|
||
‘make check’ causes the package’s tests to be run. This step is not
|
||
mandatory, but it is often good to make sure the programs that have been
|
||
built behave as they should, before you decide to install them. Our
|
||
example does not contain any tests, so running ‘make check’ is a no-op.
|
||
|
||
After everything has been built, and maybe tested, it is time to
|
||
install it on the system. That means copying the programs, libraries,
|
||
header files, scripts, and other data files from the source directory to
|
||
their final destination on the system. The command ‘make install’ will
|
||
do that. However, by default everything will be installed in
|
||
subdirectories of ‘/usr/local’: binaries will go into ‘/usr/local/bin’,
|
||
libraries will end up in ‘/usr/local/lib’, etc. This destination is
|
||
usually not writable by any user, so we assume that we have to become
|
||
root before we can run ‘make install’. In our example, running ‘make
|
||
install’ will copy the program ‘hello’ into ‘/usr/local/bin’ and
|
||
‘README’ into ‘/usr/local/share/doc/amhello’.
|
||
|
||
A last and optional step is to run ‘make installcheck’. This command
|
||
may run tests on the installed files. ‘make check’ tests the files in
|
||
the source tree, while ‘make installcheck’ tests their installed copies.
|
||
The tests run by the latter can be different from those run by the
|
||
former. For instance, there are tests that cannot be run in the source
|
||
tree. Conversely, some packages are set up so that ‘make installcheck’
|
||
will run the very same tests as ‘make check’, only on different files
|
||
(non-installed vs. installed). It can make a difference, for instance
|
||
when the source tree’s layout is different from that of the
|
||
installation. Furthermore it may help to diagnose an incomplete
|
||
installation.
|
||
|
||
Presently most packages do not have any ‘installcheck’ tests because
|
||
the existence of ‘installcheck’ is little known, and its usefulness is
|
||
neglected. Our little toy package is no better: ‘make installcheck’
|
||
does nothing.
|
||
|
||
|
||
File: automake.info, Node: Standard Targets, Next: Standard Directory Variables, Prev: Basic Installation, Up: Use Cases
|
||
|
||
2.2.2 Standard ‘Makefile’ Targets
|
||
---------------------------------
|
||
|
||
So far we have come across four ways to run ‘make’ in the GNU Build
|
||
System: ‘make’, ‘make check’, ‘make install’, and ‘make installcheck’.
|
||
The words ‘check’, ‘install’, and ‘installcheck’, passed as arguments to
|
||
‘make’, are called “targets”. ‘make’ is a shorthand for ‘make all’,
|
||
‘all’ being the default target in the GNU Build System.
|
||
|
||
Here is a list of the most useful targets that the GNU Coding
|
||
Standards specify.
|
||
|
||
‘make all’
|
||
Build programs, libraries, documentation, etc. (same as ‘make’).
|
||
‘make install’
|
||
Install what needs to be installed, copying the files from the
|
||
package’s tree to system-wide directories.
|
||
‘make install-strip’
|
||
Same as ‘make install’, then strip debugging symbols. Some users
|
||
like to trade space for useful bug reports...
|
||
‘make uninstall’
|
||
The opposite of ‘make install’: erase the installed files. (This
|
||
needs to be run from the same build tree that was installed.)
|
||
‘make clean’
|
||
Erase from the build tree the files built by ‘make all’.
|
||
‘make distclean’
|
||
Additionally erase anything ‘./configure’ created.
|
||
‘make check’
|
||
Run the test suite, if any.
|
||
‘make installcheck’
|
||
Check the installed programs or libraries, if supported.
|
||
‘make dist’
|
||
Recreate ‘PACKAGE-VERSION.tar.gz’ from all the source files.
|
||
|
||
|
||
File: automake.info, Node: Standard Directory Variables, Next: Standard Configuration Variables, Prev: Standard Targets, Up: Use Cases
|
||
|
||
2.2.3 Standard Directory Variables
|
||
----------------------------------
|
||
|
||
The GNU Coding Standards also specify a hierarchy of variables to denote
|
||
installation directories. Some of these are:
|
||
|
||
Directory variable Default value
|
||
-------------------------------------------------------
|
||
‘prefix’ ‘/usr/local’
|
||
‘exec_prefix’ ‘${prefix}’
|
||
‘bindir’ ‘${exec_prefix}/bin’
|
||
‘libdir’ ‘${exec_prefix}/lib’
|
||
...
|
||
‘includedir’ ‘${prefix}/include’
|
||
‘datarootdir’ ‘${prefix}/share’
|
||
‘datadir’ ‘${datarootdir}’
|
||
‘mandir’ ‘${datarootdir}/man’
|
||
‘infodir’ ‘${datarootdir}/info’
|
||
‘docdir’ ‘${datarootdir}/doc/${PACKAGE}’
|
||
...
|
||
|
||
Each of these directories has a role which is often obvious from its
|
||
name. In a package, any installable file will be installed in one of
|
||
these directories. For instance in ‘amhello-1.0’, the program ‘hello’
|
||
is to be installed in BINDIR, the directory for binaries. The default
|
||
value for this directory is ‘/usr/local/bin’, but the user can supply a
|
||
different value when calling ‘configure’. Also the file ‘README’ will
|
||
be installed into DOCDIR, which defaults to
|
||
‘/usr/local/share/doc/amhello’.
|
||
|
||
As a user, if you wish to install a package on your own account, you
|
||
could proceed as follows:
|
||
|
||
~/amhello-1.0 % ./configure --prefix ~/usr
|
||
...
|
||
~/amhello-1.0 % make
|
||
...
|
||
~/amhello-1.0 % make install
|
||
...
|
||
|
||
This would install ‘~/usr/bin/hello’ and
|
||
‘~/usr/share/doc/amhello/README’.
|
||
|
||
The list of all such directory options is shown by ‘./configure
|
||
--help’.
|
||
|
||
|
||
File: automake.info, Node: Standard Configuration Variables, Next: config.site, Prev: Standard Directory Variables, Up: Use Cases
|
||
|
||
2.2.4 Standard Configuration Variables
|
||
--------------------------------------
|
||
|
||
The GNU Coding Standards also define a set of standard configuration
|
||
variables used during the build. Here are some:
|
||
|
||
‘CC’
|
||
C compiler command
|
||
‘CFLAGS’
|
||
C compiler flags
|
||
‘CXX’
|
||
C++ compiler command
|
||
‘CXXFLAGS’
|
||
C++ compiler flags
|
||
‘LDFLAGS’
|
||
linker flags
|
||
‘CPPFLAGS’
|
||
C/C++ preprocessor flags
|
||
...
|
||
|
||
‘configure’ usually does a good job at setting appropriate values for
|
||
these variables, but there are cases where you may want to override
|
||
them. For instance you may have several versions of a compiler
|
||
installed and would like to use another one, you may have header files
|
||
installed outside the default search path of the compiler, or even
|
||
libraries out of the way of the linker.
|
||
|
||
Here is how one would call ‘configure’ to force it to use ‘gcc-3’ as
|
||
C compiler, use header files from ‘~/usr/include’ when compiling, and
|
||
libraries from ‘~/usr/lib’ when linking.
|
||
|
||
~/amhello-1.0 % ./configure --prefix ~/usr CC=gcc-3 \
|
||
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib
|
||
|
||
Again, a full list of these variables appears in the output of
|
||
‘./configure --help’.
|
||
|
||
|
||
File: automake.info, Node: config.site, Next: VPATH Builds, Prev: Standard Configuration Variables, Up: Use Cases
|
||
|
||
2.2.5 Overriding Default Configuration Setting with ‘config.site’
|
||
-----------------------------------------------------------------
|
||
|
||
When installing several packages using the same setup, it can be
|
||
convenient to create a file to capture common settings. If a file named
|
||
‘PREFIX/share/config.site’ exists, ‘configure’ will source it at the
|
||
beginning of its execution.
|
||
|
||
Recall the command from the previous section:
|
||
|
||
~/amhello-1.0 % ./configure --prefix ~/usr CC=gcc-3 \
|
||
CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib
|
||
|
||
Assuming we are installing many package in ‘~/usr’, and will always
|
||
want to use these definitions of ‘CC’, ‘CPPFLAGS’, and ‘LDFLAGS’, we can
|
||
automate this by creating the following ‘~/usr/share/config.site’ file:
|
||
|
||
test -z "$CC" && CC=gcc-3
|
||
test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include
|
||
test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib
|
||
|
||
Now, any time a ‘configure’ script is using the ‘~/usr’ prefix, it
|
||
will execute the above ‘config.site’ and define these three variables.
|
||
|
||
~/amhello-1.0 % ./configure --prefix ~/usr
|
||
configure: loading site script /home/adl/usr/share/config.site
|
||
...
|
||
|
||
*Note Setting Site Defaults: (autoconf)Site Defaults, for more
|
||
information about this feature.
|
||
|
||
|
||
File: automake.info, Node: VPATH Builds, Next: Two-Part Install, Prev: config.site, Up: Use Cases
|
||
|
||
2.2.6 Parallel Build Trees (a.k.a. VPATH Builds)
|
||
------------------------------------------------
|
||
|
||
The GNU Build System distinguishes two trees: the source tree, and the
|
||
build tree.
|
||
|
||
The source tree is rooted in the directory containing ‘configure’.
|
||
It contains all the sources files (those that are distributed), and may
|
||
be arranged using several subdirectories.
|
||
|
||
The build tree is rooted in the directory in which ‘configure’ was
|
||
run, and is populated with all object files, programs, libraries, and
|
||
other derived files built from the sources (and hence not distributed).
|
||
The build tree usually has the same subdirectory layout as the source
|
||
tree; its subdirectories are created automatically by the build system.
|
||
|
||
If ‘configure’ is executed in its own directory, the source and build
|
||
trees are combined: derived files are constructed in the same
|
||
directories as their sources. This was the case in our first
|
||
installation example (*note Basic Installation::).
|
||
|
||
A common request from users is that they want to confine all derived
|
||
files to a single directory, to keep their source directories
|
||
uncluttered. Here is how we could run ‘configure’ to build everything
|
||
in a subdirectory called ‘build/’.
|
||
|
||
~ % tar zxf ~/amhello-1.0.tar.gz
|
||
~ % cd amhello-1.0
|
||
~/amhello-1.0 % mkdir build && cd build
|
||
~/amhello-1.0/build % ../configure
|
||
...
|
||
~/amhello-1.0/build % make
|
||
...
|
||
|
||
These setups, where source and build trees are different, are often
|
||
called “parallel builds” or “VPATH builds”. The expression _parallel
|
||
build_ is misleading: the word _parallel_ is a reference to the way the
|
||
build tree shadows the source tree, it is not about some concurrency in
|
||
the way build commands are run. For this reason we refer to such setups
|
||
using the name _VPATH builds_ in the following. _VPATH_ is the name of
|
||
the ‘make’ feature used by the ‘Makefile’s to allow these builds (*note
|
||
‘VPATH’ Search Path for All Prerequisites: (make)General Search.).
|
||
|
||
VPATH builds have other interesting uses. One is to build the same
|
||
sources with multiple configurations. For instance:
|
||
|
||
~ % tar zxf ~/amhello-1.0.tar.gz
|
||
~ % cd amhello-1.0
|
||
~/amhello-1.0 % mkdir debug optim && cd debug
|
||
~/amhello-1.0/debug % ../configure CFLAGS='-g -O0'
|
||
...
|
||
~/amhello-1.0/debug % make
|
||
...
|
||
~/amhello-1.0/debug % cd ../optim
|
||
~/amhello-1.0/optim % ../configure CFLAGS='-O3 -fomit-frame-pointer'
|
||
...
|
||
~/amhello-1.0/optim % make
|
||
...
|
||
|
||
With network file systems, a similar approach can be used to build
|
||
the same sources on different machines. For instance, suppose that the
|
||
sources are installed on a directory shared by two hosts: ‘HOST1’ and
|
||
‘HOST2’, which may be different platforms.
|
||
|
||
~ % cd /nfs/src
|
||
/nfs/src % tar zxf ~/amhello-1.0.tar.gz
|
||
|
||
On the first host, you could create a local build directory:
|
||
[HOST1] ~ % mkdir /tmp/amh && cd /tmp/amh
|
||
[HOST1] /tmp/amh % /nfs/src/amhello-1.0/configure
|
||
...
|
||
[HOST1] /tmp/amh % make && sudo make install
|
||
...
|
||
|
||
(Here we assume that the installer has configured ‘sudo’ so it can
|
||
execute ‘make install’ with root privileges; it is more convenient than
|
||
using ‘su’ like in *note Basic Installation::).
|
||
|
||
On the second host, you would do exactly the same, possibly at the
|
||
same time:
|
||
[HOST2] ~ % mkdir /tmp/amh && cd /tmp/amh
|
||
[HOST2] /tmp/amh % /nfs/src/amhello-1.0/configure
|
||
...
|
||
[HOST2] /tmp/amh % make && sudo make install
|
||
...
|
||
|
||
In this scenario, nothing forbids the ‘/nfs/src/amhello-1.0’
|
||
directory from being read-only. In fact VPATH builds are also a means
|
||
of building packages from a read-only medium such as a CD-ROM. (The FSF
|
||
used to sell CD-ROM with unpacked source code, before the GNU project
|
||
grew so big.)
|
||
|
||
|
||
File: automake.info, Node: Two-Part Install, Next: Cross-Compilation, Prev: VPATH Builds, Up: Use Cases
|
||
|
||
2.2.7 Two-Part Installation
|
||
---------------------------
|
||
|
||
In our last example (*note VPATH Builds::), a source tree was shared by
|
||
two hosts, but compilation and installation were done separately on each
|
||
host.
|
||
|
||
The GNU Build System also supports networked setups where part of the
|
||
installed files should be shared amongst multiple hosts. It does so by
|
||
distinguishing architecture-dependent files from
|
||
architecture-independent files, and providing two ‘Makefile’ targets to
|
||
install each of these classes of files.
|
||
|
||
These targets are ‘install-exec’ for architecture-dependent files and
|
||
‘install-data’ for architecture-independent files. The command we used
|
||
up to now, ‘make install’, can be thought of as a shorthand for ‘make
|
||
install-exec install-data’.
|
||
|
||
From the GNU Build System point of view, the distinction between
|
||
architecture-dependent files and architecture-independent files is based
|
||
exclusively on the directory variable used to specify their installation
|
||
destination. In the list of directory variables we provided earlier
|
||
(*note Standard Directory Variables::), all the variables based on
|
||
EXEC-PREFIX designate architecture-dependent directories whose files
|
||
will be installed by ‘make install-exec’. The others designate
|
||
architecture-independent directories and will serve files installed by
|
||
‘make install-data’. *Note The Two Parts of Install::, for more
|
||
details.
|
||
|
||
Here is how we could revisit our two-host installation example,
|
||
assuming that (1) we want to install the package directly in ‘/usr’, and
|
||
(2) the directory ‘/usr/share’ is shared by the two hosts.
|
||
|
||
On the first host we would run
|
||
[HOST1] ~ % mkdir /tmp/amh && cd /tmp/amh
|
||
[HOST1] /tmp/amh % /nfs/src/amhello-1.0/configure --prefix /usr
|
||
...
|
||
[HOST1] /tmp/amh % make && sudo make install
|
||
...
|
||
|
||
On the second host, however, we need only install the
|
||
architecture-specific files.
|
||
[HOST2] ~ % mkdir /tmp/amh && cd /tmp/amh
|
||
[HOST2] /tmp/amh % /nfs/src/amhello-1.0/configure --prefix /usr
|
||
...
|
||
[HOST2] /tmp/amh % make && sudo make install-exec
|
||
...
|
||
|
||
In packages that have installation checks, it would make sense to run
|
||
‘make installcheck’ (*note Basic Installation::) to verify that the
|
||
package works correctly despite the apparent partial installation.
|
||
|
||
|
||
File: automake.info, Node: Cross-Compilation, Next: Renaming, Prev: Two-Part Install, Up: Use Cases
|
||
|
||
2.2.8 Cross-Compilation
|
||
-----------------------
|
||
|
||
To “cross-compile” is to build on one platform a binary that will run on
|
||
another platform. When speaking of cross-compilation, it is important
|
||
to distinguish between the “build platform” on which the compilation is
|
||
performed, and the “host platform” on which the resulting executable is
|
||
expected to run. The following ‘configure’ options are used to specify
|
||
each of them:
|
||
|
||
‘--build=BUILD’
|
||
The system on which the package is built.
|
||
‘--host=HOST’
|
||
The system where built programs and libraries will run.
|
||
|
||
When the ‘--host’ is used, ‘configure’ will search for the
|
||
cross-compiling suite for this platform. Cross-compilation tools
|
||
commonly have their target architecture as prefix of their name. For
|
||
instance my cross-compiler for MinGW32 has its binaries called
|
||
‘i586-mingw32msvc-gcc’, ‘i586-mingw32msvc-ld’, ‘i586-mingw32msvc-as’,
|
||
etc.
|
||
|
||
Here is how we could build ‘amhello-1.0’ for ‘i586-mingw32msvc’ on a
|
||
GNU/Linux PC.
|
||
|
||
~/amhello-1.0 % ./configure --build i686-pc-linux-gnu --host i586-mingw32msvc
|
||
checking for a BSD-compatible install... /usr/bin/install -c
|
||
checking whether build environment is sane... yes
|
||
checking for gawk... gawk
|
||
checking whether make sets $(MAKE)... yes
|
||
checking for i586-mingw32msvc-strip... i586-mingw32msvc-strip
|
||
checking for i586-mingw32msvc-gcc... i586-mingw32msvc-gcc
|
||
checking for C compiler default output file name... a.exe
|
||
checking whether the C compiler works... yes
|
||
checking whether we are cross compiling... yes
|
||
checking for suffix of executables... .exe
|
||
checking for suffix of object files... o
|
||
checking whether we are using the GNU C compiler... yes
|
||
checking whether i586-mingw32msvc-gcc accepts -g... yes
|
||
checking for i586-mingw32msvc-gcc option to accept ANSI C...
|
||
...
|
||
~/amhello-1.0 % make
|
||
...
|
||
~/amhello-1.0 % cd src; file hello.exe
|
||
hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable
|
||
|
||
The ‘--host’ and ‘--build’ options are usually all we need for
|
||
cross-compiling. The only exception is if the package being built is
|
||
itself a cross-compiler: we need a third option to specify its target
|
||
architecture.
|
||
|
||
‘--target=TARGET’
|
||
When building compiler tools: the system for which the tools will
|
||
create output.
|
||
|
||
For instance when installing GCC, the GNU Compiler Collection, we can
|
||
use ‘--target=TARGET’ to specify that we want to build GCC as a
|
||
cross-compiler for TARGET. Mixing ‘--build’ and ‘--target’, we can
|
||
actually cross-compile a cross-compiler; such a three-way
|
||
cross-compilation is known as a “Canadian cross”.
|
||
|
||
*Note Specifying the System Type: (autoconf)Specifying Names, for
|
||
more information about these ‘configure’ options.
|
||
|
||
|
||
File: automake.info, Node: Renaming, Next: DESTDIR, Prev: Cross-Compilation, Up: Use Cases
|
||
|
||
2.2.9 Renaming Programs at Install Time
|
||
---------------------------------------
|
||
|
||
The GNU Build System provides means to automatically rename executables
|
||
and manpages before they are installed (*note Man Pages::). This is
|
||
especially convenient when installing a GNU package on a system that
|
||
already has a proprietary implementation you do not want to overwrite.
|
||
For instance, you may want to install GNU ‘tar’ as ‘gtar’ so you can
|
||
distinguish it from your vendor’s ‘tar’.
|
||
|
||
This can be done using one of these three ‘configure’ options.
|
||
|
||
‘--program-prefix=PREFIX’
|
||
Prepend PREFIX to installed program names.
|
||
‘--program-suffix=SUFFIX’
|
||
Append SUFFIX to installed program names.
|
||
‘--program-transform-name=PROGRAM’
|
||
Run ‘sed PROGRAM’ on installed program names.
|
||
|
||
The following commands would install ‘hello’ as
|
||
‘/usr/local/bin/test-hello’, for instance.
|
||
|
||
~/amhello-1.0 % ./configure --program-prefix test-
|
||
...
|
||
~/amhello-1.0 % make
|
||
...
|
||
~/amhello-1.0 % sudo make install
|
||
...
|
||
|
||
|
||
File: automake.info, Node: DESTDIR, Next: Preparing Distributions, Prev: Renaming, Up: Use Cases
|
||
|
||
2.2.10 Building Binary Packages Using DESTDIR
|
||
---------------------------------------------
|
||
|
||
The GNU Build System’s ‘make install’ and ‘make uninstall’ interface
|
||
does not exactly fit the needs of a system administrator who has to
|
||
deploy and upgrade packages on lots of hosts. In other words, the GNU
|
||
Build System does not replace a package manager.
|
||
|
||
Such package managers usually need to know which files have been
|
||
installed by a package, so a mere ‘make install’ is inappropriate.
|
||
|
||
The ‘DESTDIR’ variable can be used to perform a staged installation.
|
||
The package should be configured as if it was going to be installed in
|
||
its final location (e.g., ‘--prefix /usr’), but when running ‘make
|
||
install’, the ‘DESTDIR’ should be set to the absolute name of a
|
||
directory into which the installation will be diverted. From this
|
||
directory it is easy to review which files are being installed where,
|
||
and finally copy them to their final location by some means.
|
||
|
||
For instance here is how we could create a binary package containing
|
||
a snapshot of all the files to be installed.
|
||
|
||
~/amhello-1.0 % ./configure --prefix /usr
|
||
...
|
||
~/amhello-1.0 % make
|
||
...
|
||
~/amhello-1.0 % make DESTDIR=$HOME/inst install
|
||
...
|
||
~/amhello-1.0 % cd ~/inst
|
||
~/inst % find . -type f -print > ../files.lst
|
||
~/inst % tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`
|
||
./usr/bin/hello
|
||
./usr/share/doc/amhello/README
|
||
|
||
After this example, ‘amhello-1.0-i686.tar.gz’ is ready to be
|
||
uncompressed in ‘/’ on many hosts. (Using ‘`cat ../files.lst`’ instead
|
||
of ‘.’ as argument for ‘tar’ avoids entries for each subdirectory in the
|
||
archive: we would not like ‘tar’ to restore the modification time of
|
||
‘/’, ‘/usr/’, etc.)
|
||
|
||
Note that when building packages for several architectures, it might
|
||
be convenient to use ‘make install-data’ and ‘make install-exec’ (*note
|
||
Two-Part Install::) to gather architecture-independent files in a single
|
||
package.
|
||
|
||
*Note Install::, for more information.
|
||
|
||
|
||
File: automake.info, Node: Preparing Distributions, Next: Dependency Tracking, Prev: DESTDIR, Up: Use Cases
|
||
|
||
2.2.11 Preparing Distributions
|
||
------------------------------
|
||
|
||
We have already mentioned ‘make dist’. This target collects all your
|
||
source files and the necessary parts of the build system to create a
|
||
tarball named ‘PACKAGE-VERSION.tar.gz’.
|
||
|
||
Another, more useful command is ‘make distcheck’. The ‘distcheck’
|
||
target constructs ‘PACKAGE-VERSION.tar.gz’ just as well as ‘dist’, but
|
||
it additionally ensures most of the use cases presented so far work:
|
||
|
||
• It attempts a full compilation of the package (*note Basic
|
||
Installation::), unpacking the newly constructed tarball, running
|
||
‘make’, ‘make check’, ‘make install’, as well as ‘make
|
||
installcheck’, and even ‘make dist’,
|
||
• it tests VPATH builds with read-only source tree (*note VPATH
|
||
Builds::),
|
||
• it makes sure ‘make clean’, ‘make distclean’, and ‘make uninstall’
|
||
do not omit any file (*note Standard Targets::),
|
||
• and it checks that ‘DESTDIR’ installations work (*note DESTDIR::).
|
||
|
||
All of these actions are performed in a temporary 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 ‘make distcheck’ means that one of the
|
||
scenarios we presented will not work and some users will be
|
||
disappointed. Therefore it is a good practice to release a package only
|
||
after a successful ‘make distcheck’. This of course does not imply that
|
||
the package will be flawless, but at least it will prevent some of the
|
||
embarrassing errors you may find in packages released by people who have
|
||
never heard about ‘distcheck’ (like ‘DESTDIR’ not working because of a
|
||
typo, or a distributed file being erased by ‘make clean’, or even
|
||
‘VPATH’ builds not working).
|
||
|
||
*Note Creating amhello::, to recreate ‘amhello-1.0.tar.gz’ using
|
||
‘make distcheck’. *Note Checking the Distribution::, for more
|
||
information about ‘distcheck’.
|
||
|
||
|
||
File: automake.info, Node: Dependency Tracking, Next: Nested Packages, Prev: Preparing Distributions, Up: Use Cases
|
||
|
||
2.2.12 Automatic Dependency Tracking
|
||
------------------------------------
|
||
|
||
Dependency tracking is performed as a side-effect of compilation. Each
|
||
time the build system compiles a source file, it computes its list of
|
||
dependencies (in C these are the header files included by the source
|
||
being compiled). Later, any time ‘make’ is run and a dependency appears
|
||
to have changed, the dependent files will be rebuilt.
|
||
|
||
Automake generates code for automatic dependency tracking by default,
|
||
unless the developer chooses to override it; for more information, *note
|
||
Dependencies::.
|
||
|
||
When ‘configure’ is executed, you can see it probing each compiler
|
||
for the dependency mechanism it supports (several mechanisms can be
|
||
used):
|
||
|
||
~/amhello-1.0 % ./configure --prefix /usr
|
||
...
|
||
checking dependency style of gcc... gcc3
|
||
...
|
||
|
||
Because dependencies are only computed as a side-effect of the
|
||
compilation, no dependency information exists the first time a package
|
||
is built. This is OK because all the files need to be built anyway:
|
||
‘make’ does not have to decide which files need to be rebuilt. In fact,
|
||
dependency tracking is completely useless for one-time builds and there
|
||
is a ‘configure’ option to disable this:
|
||
|
||
‘--disable-dependency-tracking’
|
||
Speed up one-time builds.
|
||
|
||
Some compilers do not offer any practical way to derive the list of
|
||
dependencies as a side-effect of the compilation, requiring a separate
|
||
run (maybe of another tool) to compute these dependencies. The
|
||
performance penalty implied by these methods is important enough to
|
||
disable them by default. The option ‘--enable-dependency-tracking’ must
|
||
be passed to ‘configure’ to activate them.
|
||
|
||
‘--enable-dependency-tracking’
|
||
Do not reject slow dependency extractors.
|
||
|
||
*Note Dependency Tracking Evolution: (automake-history)Dependency
|
||
Tracking Evolution, for some discussion about the different dependency
|
||
tracking schemes used by Automake over the years.
|
||
|
||
|
||
File: automake.info, Node: Nested Packages, Prev: Dependency Tracking, Up: Use Cases
|
||
|
||
2.2.13 Nested Packages
|
||
----------------------
|
||
|
||
Although nesting packages isn’t something we would recommend to someone
|
||
who is discovering the Autotools, it is a nice feature worthy of mention
|
||
in this small advertising tour.
|
||
|
||
Autoconfiscated packages (that means packages whose build system have
|
||
been created by Autoconf and friends) can be nested to arbitrary depth.
|
||
|
||
A typical setup is that package A will distribute one of the
|
||
libraries it needs in a subdirectory. This library B is a complete
|
||
package with its own GNU Build System. The ‘configure’ script of A will
|
||
run the ‘configure’ script of B as part of its execution, building and
|
||
installing A will also build and install B. Generating a distribution
|
||
for A will also include B.
|
||
|
||
It is possible to gather several packages like this. GCC is a heavy
|
||
user of this feature. This gives installers a single package to
|
||
configure, build and install, while it allows developers to work on
|
||
subpackages independently.
|
||
|
||
When configuring nested packages, the ‘configure’ options given to
|
||
the top-level ‘configure’ are passed recursively to nested ‘configure’s.
|
||
A package that does not understand an option will ignore it, assuming it
|
||
is meaningful to some other package.
|
||
|
||
The command ‘configure --help=recursive’ can be used to display the
|
||
options supported by all the included packages.
|
||
|
||
*Note Subpackages::, for an example setup.
|
||
|
||
|
||
File: automake.info, Node: Why Autotools, Next: Hello World, Prev: Use Cases, Up: Autotools Introduction
|
||
|
||
2.3 How Autotools Help
|
||
======================
|
||
|
||
There are several reasons why you may not want to implement the GNU
|
||
Build System yourself (read: write a ‘configure’ script and ‘Makefile’s
|
||
yourself).
|
||
|
||
• As we have seen, the GNU Build System has a lot of features (*note
|
||
Use Cases::). Some users may expect features you have not
|
||
implemented because you did not need them.
|
||
• Implementing these features portably is difficult and exhausting.
|
||
Think of writing portable shell scripts, and portable ‘Makefile’s,
|
||
for systems you may not have handy. *Note Portable Shell
|
||
Programming: (autoconf)Portable Shell, to convince yourself.
|
||
• You will have to upgrade your setup to follow changes to the GNU
|
||
Coding Standards.
|
||
|
||
The GNU Autotools take all this burden off your back and provide:
|
||
|
||
• Tools to create a portable, complete, and self-contained GNU Build
|
||
System, from simple instructions. _Self-contained_ meaning the
|
||
resulting build system does not require the GNU Autotools.
|
||
• A central place where fixes and improvements are made: a bug-fix
|
||
for a portability issue will benefit every package.
|
||
|
||
Yet there also exist reasons why you may want NOT to use the
|
||
Autotools... For instance you may be already using (or used to) another
|
||
incompatible build system. Autotools will only be useful if you do
|
||
accept the concepts of the GNU Build System. People who have their own
|
||
idea of how a build system should work will feel frustrated by the
|
||
Autotools.
|
||
|
||
|
||
File: automake.info, Node: Hello World, Prev: Why Autotools, Up: Autotools Introduction
|
||
|
||
2.4 A Small Hello World
|
||
=======================
|
||
|
||
In this section we recreate the ‘amhello-1.0’ package from scratch. The
|
||
first subsection shows how to call the Autotools to instantiate the GNU
|
||
Build System, while the second explains the meaning of the
|
||
‘configure.ac’ and ‘Makefile.am’ files read by the Autotools.
|
||
|
||
* Menu:
|
||
|
||
* Creating amhello:: Create ‘amhello-1.0.tar.gz’ from scratch
|
||
* amhello's configure.ac Setup Explained::
|
||
* amhello's Makefile.am Setup Explained::
|
||
|
||
|
||
File: automake.info, Node: Creating amhello, Next: amhello's configure.ac Setup Explained, Up: Hello World
|
||
|
||
2.4.1 Creating ‘amhello-1.0.tar.gz’
|
||
-----------------------------------
|
||
|
||
Here is how we can recreate ‘amhello-1.0.tar.gz’ from scratch. The
|
||
package is simple enough so that we will only need to write 5 files.
|
||
(You may copy them from the final ‘amhello-1.0.tar.gz’ that is
|
||
distributed with Automake if you do not want to write them.)
|
||
|
||
Create the following files in an empty directory.
|
||
|
||
• ‘src/main.c’ is the source file for the ‘hello’ program. We store
|
||
it in the ‘src/’ subdirectory, because later, when the package
|
||
evolves, it will ease the addition of a ‘man/’ directory for man
|
||
pages, a ‘data/’ directory for data files, etc.
|
||
~/amhello % cat src/main.c
|
||
#include <config.h>
|
||
#include <stdio.h>
|
||
|
||
int
|
||
main (void)
|
||
{
|
||
puts ("Hello World!");
|
||
puts ("This is " PACKAGE_STRING ".");
|
||
return 0;
|
||
}
|
||
|
||
• ‘README’ contains some very limited documentation for our little
|
||
package.
|
||
~/amhello % cat README
|
||
This is a demonstration package for GNU Automake.
|
||
Type 'info Automake' to read the Automake manual.
|
||
|
||
• ‘Makefile.am’ and ‘src/Makefile.am’ contain Automake instructions
|
||
for these two directories.
|
||
|
||
~/amhello % cat src/Makefile.am
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = main.c
|
||
~/amhello % cat Makefile.am
|
||
SUBDIRS = src
|
||
dist_doc_DATA = README
|
||
|
||
• Finally, ‘configure.ac’ contains Autoconf instructions to create
|
||
the ‘configure’ script.
|
||
|
||
~/amhello % cat configure.ac
|
||
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
|
||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||
AC_PROG_CC
|
||
AC_CONFIG_HEADERS([config.h])
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
|
||
Once you have these five files, it is time to run the Autotools to
|
||
instantiate the build system. Do this using the ‘autoreconf’ command as
|
||
follows:
|
||
|
||
~/amhello % autoreconf --install
|
||
configure.ac: installing './install-sh'
|
||
configure.ac: installing './missing'
|
||
configure.ac: installing './compile'
|
||
src/Makefile.am: installing './depcomp'
|
||
|
||
At this point the build system is complete.
|
||
|
||
In addition to the three scripts mentioned in its output, you can see
|
||
that ‘autoreconf’ created four other files: ‘configure’, ‘config.h.in’,
|
||
‘Makefile.in’, and ‘src/Makefile.in’. The latter three files are
|
||
templates that will be adapted to the system by ‘configure’ under the
|
||
names ‘config.h’, ‘Makefile’, and ‘src/Makefile’. Let’s do this:
|
||
|
||
~/amhello % ./configure
|
||
checking for a BSD-compatible install... /usr/bin/install -c
|
||
checking whether build environment is sane... yes
|
||
checking for gawk... no
|
||
checking for mawk... mawk
|
||
checking whether make sets $(MAKE)... yes
|
||
checking for gcc... gcc
|
||
checking for C compiler default output file name... a.out
|
||
checking whether the C compiler works... yes
|
||
checking whether we are cross compiling... no
|
||
checking for suffix of executables...
|
||
checking for suffix of object files... o
|
||
checking whether we are using the GNU C compiler... yes
|
||
checking whether gcc accepts -g... yes
|
||
checking for gcc option to accept ISO C89... none needed
|
||
checking for style of include used by make... GNU
|
||
checking dependency style of gcc... gcc3
|
||
configure: creating ./config.status
|
||
config.status: creating Makefile
|
||
config.status: creating src/Makefile
|
||
config.status: creating config.h
|
||
config.status: executing depfiles commands
|
||
|
||
You can see ‘Makefile’, ‘src/Makefile’, and ‘config.h’ being created
|
||
at the end after ‘configure’ has probed the system. It is now possible
|
||
to run all the targets we wish (*note Standard Targets::). For
|
||
instance:
|
||
|
||
~/amhello % make
|
||
...
|
||
~/amhello % src/hello
|
||
Hello World!
|
||
This is amhello 1.0.
|
||
~/amhello % make distcheck
|
||
...
|
||
=============================================
|
||
amhello-1.0 archives ready for distribution:
|
||
amhello-1.0.tar.gz
|
||
=============================================
|
||
|
||
Note that running ‘autoreconf’ is only needed initially when the GNU
|
||
Build System does not exist. When you later change some instructions in
|
||
a ‘Makefile.am’ or ‘configure.ac’, the relevant part of the build system
|
||
will be regenerated automatically when you execute ‘make’.
|
||
|
||
‘autoreconf’ is a script that calls ‘autoconf’, ‘automake’, and a
|
||
bunch of other commands in the right order. If you are beginning with
|
||
these tools, it is not important to figure out in which order all of
|
||
these tools should be invoked and why. However, because Autoconf and
|
||
Automake have separate manuals, the important point to understand is
|
||
that ‘autoconf’ is in charge of creating ‘configure’ from
|
||
‘configure.ac’, while ‘automake’ is in charge of creating ‘Makefile.in’s
|
||
from ‘Makefile.am’s and ‘configure.ac’. This should at least direct you
|
||
to the right manual when seeking answers.
|
||
|
||
|
||
File: automake.info, Node: amhello's configure.ac Setup Explained, Next: amhello's Makefile.am Setup Explained, Prev: Creating amhello, Up: Hello World
|
||
|
||
2.4.2 ‘amhello’’s ‘configure.ac’ Setup Explained
|
||
------------------------------------------------
|
||
|
||
Let us begin with the contents of ‘configure.ac’.
|
||
|
||
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
|
||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||
AC_PROG_CC
|
||
AC_CONFIG_HEADERS([config.h])
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
|
||
This file is read by both ‘autoconf’ (to create ‘configure’) and
|
||
‘automake’ (to create the various ‘Makefile.in’s). It contains a series
|
||
of M4 macros that will be expanded as shell code to finally form the
|
||
‘configure’ script. We will not elaborate on the syntax of this file,
|
||
because the Autoconf manual has a whole section about it (*note Writing
|
||
‘configure.ac’: (autoconf)Writing Autoconf Input.).
|
||
|
||
The macros prefixed with ‘AC_’ are Autoconf macros, documented in the
|
||
Autoconf manual (*note Autoconf Macro Index: (autoconf)Autoconf Macro
|
||
Index.). The macros that start with ‘AM_’ are Automake macros,
|
||
documented later in this manual (*note Macro Index::).
|
||
|
||
The first two lines of ‘configure.ac’ initialize Autoconf and
|
||
Automake. ‘AC_INIT’ takes in as parameters the name of the package, its
|
||
version number, and a contact address for bug-reports about the package
|
||
(this address is output at the end of ‘./configure --help’, for
|
||
instance). When adapting this setup to your own package, by all means
|
||
please do not blindly copy Automake’s address: use the mailing list of
|
||
your package, or your own mail address.
|
||
|
||
The argument to ‘AM_INIT_AUTOMAKE’ is a list of options for
|
||
‘automake’ (*note Options::). ‘-Wall’ and ‘-Werror’ ask ‘automake’ to
|
||
turn on all warnings and report them as errors. We are speaking of
|
||
*Automake* warnings here, such as dubious instructions in ‘Makefile.am’.
|
||
This has absolutely nothing to do with how the compiler will be called,
|
||
even though it may support options with similar names. Using ‘-Wall
|
||
-Werror’ is a safe setting when starting to work on a package: you do
|
||
not want to miss any issues. Later you may decide to relax things a
|
||
bit. The ‘foreign’ option tells Automake that this package will not
|
||
follow the GNU Standards. GNU packages should always distribute
|
||
additional files such as ‘ChangeLog’, ‘AUTHORS’, etc. We do not want
|
||
‘automake’ to complain about these missing files in our small example.
|
||
|
||
The ‘AC_PROG_CC’ line causes the ‘configure’ script to search for a C
|
||
compiler and define the variable ‘CC’ with its name. The
|
||
‘src/Makefile.in’ file generated by Automake uses the variable ‘CC’ to
|
||
build ‘hello’, so when ‘configure’ creates ‘src/Makefile’ from
|
||
‘src/Makefile.in’, it will define ‘CC’ with the value it has found. If
|
||
Automake is asked to create a ‘Makefile.in’ that uses ‘CC’ but
|
||
‘configure.ac’ does not define it, it will suggest you add a call to
|
||
‘AC_PROG_CC’.
|
||
|
||
The ‘AC_CONFIG_HEADERS([config.h])’ invocation causes the ‘configure’
|
||
script to create a ‘config.h’ file gathering ‘#define’s defined by other
|
||
macros in ‘configure.ac’. In our case, the ‘AC_INIT’ macro already
|
||
defined a few of them. Here is an excerpt of ‘config.h’ after
|
||
‘configure’ has run:
|
||
|
||
...
|
||
/* Define to the address where bug reports for this package should be sent. */
|
||
#define PACKAGE_BUGREPORT "bug-automake@gnu.org"
|
||
|
||
/* Define to the full name and version of this package. */
|
||
#define PACKAGE_STRING "amhello 1.0"
|
||
...
|
||
|
||
As you probably noticed, ‘src/main.c’ includes ‘config.h’ so it can
|
||
use ‘PACKAGE_STRING’. In a real-world project, ‘config.h’ can grow
|
||
really big, with one ‘#define’ per feature probed on the system.
|
||
|
||
The ‘AC_CONFIG_FILES’ macro declares the list of files that
|
||
‘configure’ should create from their ‘*.in’ templates. Automake also
|
||
scans this list to find the ‘Makefile.am’ files it must process. (This
|
||
is important to remember: when adding a new directory to your project,
|
||
you should add its ‘Makefile’ to this list, otherwise Automake will
|
||
never process the new ‘Makefile.am’ you wrote in that directory.)
|
||
|
||
Finally, the ‘AC_OUTPUT’ line is a closing command that actually
|
||
produces the part of the script in charge of creating the files
|
||
registered with ‘AC_CONFIG_HEADERS’ and ‘AC_CONFIG_FILES’.
|
||
|
||
When starting a new project, we suggest you start with such a simple
|
||
‘configure.ac’, and gradually add the other tests it requires. The
|
||
command ‘autoscan’ can also suggest a few of the tests your package may
|
||
need (*note Using ‘autoscan’ to Create ‘configure.ac’:
|
||
(autoconf)autoscan Invocation.).
|
||
|
||
|
||
File: automake.info, Node: amhello's Makefile.am Setup Explained, Prev: amhello's configure.ac Setup Explained, Up: Hello World
|
||
|
||
2.4.3 ‘amhello’’s ‘Makefile.am’ Setup Explained
|
||
-----------------------------------------------
|
||
|
||
We now turn to ‘src/Makefile.am’. This file contains Automake
|
||
instructions to build and install ‘hello’.
|
||
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = main.c
|
||
|
||
A ‘Makefile.am’ has the same syntax as an ordinary ‘Makefile’. When
|
||
‘automake’ processes a ‘Makefile.am’ it copies the entire file into the
|
||
output ‘Makefile.in’ (that will be later turned into ‘Makefile’ by
|
||
‘configure’) but will react to certain variable definitions by
|
||
generating some build rules and other variables. Often ‘Makefile.am’s
|
||
contain only a list of variable definitions as above, but they can also
|
||
contain other variable and rule definitions that ‘automake’ will pass
|
||
along without interpretation.
|
||
|
||
Variables that end with ‘_PROGRAMS’ are special variables that list
|
||
programs that the resulting ‘Makefile’ should build. In Automake speak,
|
||
this ‘_PROGRAMS’ suffix is called a “primary”; Automake recognizes other
|
||
primaries such as ‘_SCRIPTS’, ‘_DATA’, ‘_LIBRARIES’, etc. corresponding
|
||
to different types of files.
|
||
|
||
The ‘bin’ part of the ‘bin_PROGRAMS’ tells ‘automake’ that the
|
||
resulting programs should be installed in BINDIR. Recall that the GNU
|
||
Build System uses a set of variables to denote destination directories
|
||
and allow users to customize these locations (*note Standard Directory
|
||
Variables::). Any such directory variable can be put in front of a
|
||
primary (omitting the ‘dir’ suffix) to tell ‘automake’ where to install
|
||
the listed files.
|
||
|
||
Programs need to be built from source files, so for each program
|
||
‘PROG’ listed in a ‘_PROGRAMS’ variable, ‘automake’ will look for
|
||
another variable named ‘PROG_SOURCES’ listing its source files. There
|
||
may be more than one source file: they will all be compiled and linked
|
||
together.
|
||
|
||
Automake also knows that source files need to be distributed when
|
||
creating a tarball (unlike built programs). So a side-effect of this
|
||
‘hello_SOURCES’ declaration is that ‘main.c’ will be part of the tarball
|
||
created by ‘make dist’.
|
||
|
||
Finally here are some explanations regarding the top-level
|
||
‘Makefile.am’.
|
||
|
||
SUBDIRS = src
|
||
dist_doc_DATA = README
|
||
|
||
‘SUBDIRS’ is a special variable listing all directories that ‘make’
|
||
should recurse into before processing the current directory. So this
|
||
line is responsible for ‘make’ building ‘src/hello’ even though we run
|
||
it from the top-level. This line also causes ‘make install’ to install
|
||
‘src/hello’ before installing ‘README’ (not that this order matters).
|
||
|
||
The line ‘dist_doc_DATA = README’ causes ‘README’ to be distributed
|
||
and installed in DOCDIR. Files listed with the ‘_DATA’ primary are not
|
||
automatically part of the tarball built with ‘make dist’, so we add the
|
||
‘dist_’ prefix so they get distributed. However, for ‘README’ it would
|
||
not have been necessary: ‘automake’ automatically distributes any
|
||
‘README’ file it encounters (the list of other files automatically
|
||
distributed is presented by ‘automake --help’). The only important
|
||
effect of this second line is therefore to install ‘README’ during ‘make
|
||
install’.
|
||
|
||
One thing not covered in this example is accessing the installation
|
||
directory values (*note Standard Directory Variables::) from your
|
||
program code, that is, converting them into defined macros. For this,
|
||
*note (autoconf)Defining Directories::.
|
||
|
||
|
||
File: automake.info, Node: Generalities, Next: Examples, Prev: Autotools Introduction, Up: Top
|
||
|
||
3 General ideas
|
||
***************
|
||
|
||
The following sections cover a few basic ideas that will help you
|
||
understand how Automake works.
|
||
|
||
* Menu:
|
||
|
||
* General Operation:: General operation of Automake
|
||
* Strictness:: Standards conformance checking
|
||
* Uniform:: The Uniform Naming Scheme
|
||
* Length Limitations:: Staying below the command line length limit
|
||
* Canonicalization:: How derived variables are named
|
||
* User Variables:: Variables reserved for the user
|
||
* Auxiliary Programs:: Programs automake might require
|
||
|
||
|
||
File: automake.info, Node: General Operation, Next: Strictness, Up: Generalities
|
||
|
||
3.1 General Operation
|
||
=====================
|
||
|
||
Automake works by reading a ‘Makefile.am’ and generating a
|
||
‘Makefile.in’. Certain variables and rules defined in the ‘Makefile.am’
|
||
instruct Automake to generate more specialized code; for instance, a
|
||
‘bin_PROGRAMS’ variable definition will cause rules for compiling and
|
||
linking programs to be generated.
|
||
|
||
The variable definitions and rules in the ‘Makefile.am’ are copied
|
||
mostly verbatim into the generated file, with all variable definitions
|
||
preceding all rules. This allows you to add almost arbitrary code into
|
||
the generated ‘Makefile.in’. For instance, the Automake distribution
|
||
includes a non-standard rule for the ‘git-dist’ target, which the
|
||
Automake maintainer uses to make distributions from the source control
|
||
system.
|
||
|
||
Note that most GNU make extensions are not recognized by Automake.
|
||
Using such extensions in a ‘Makefile.am’ will lead to errors or
|
||
confusing behavior.
|
||
|
||
A special exception is that the GNU make append operator, ‘+=’, is
|
||
supported. This operator appends its right hand argument to the
|
||
variable specified on the left. Automake will translate the operator
|
||
into an ordinary ‘=’ operator; ‘+=’ will thus work with any make
|
||
program.
|
||
|
||
Automake tries to keep comments grouped with any adjoining rules or
|
||
variable definitions.
|
||
|
||
Generally, Automake is not particularly smart in the parsing of
|
||
unusual Makefile constructs, so you’re advised to avoid fancy constructs
|
||
or “creative” use of whitespace. For example, <TAB> characters cannot
|
||
be used between a target name and the following “‘:’” character, and
|
||
variable assignments shouldn’t be indented with <TAB> characters. Also,
|
||
using more complex macro in target names can cause trouble:
|
||
|
||
% cat Makefile.am
|
||
$(FOO:=x): bar
|
||
% automake
|
||
Makefile.am:1: bad characters in variable name '$(FOO'
|
||
Makefile.am:1: ':='-style assignments are not portable
|
||
|
||
A rule defined in ‘Makefile.am’ generally overrides any such rule of
|
||
a similar name that would be automatically generated by ‘automake’.
|
||
Although this is a supported feature, it is generally best to avoid
|
||
making use of it, as sometimes the generated rules are very particular.
|
||
|
||
Similarly, a variable defined in ‘Makefile.am’ or ‘AC_SUBST’ed from
|
||
‘configure.ac’ will override any definition of the variable that
|
||
‘automake’ would ordinarily create. This feature is more often useful
|
||
than the ability to override a rule. Be warned that many of the
|
||
variables generated by ‘automake’ are considered to be for internal use
|
||
only, and their names might change in future releases.
|
||
|
||
When examining a variable definition, Automake will recursively
|
||
examine variables referenced in the definition. For example, if
|
||
Automake is looking at the content of ‘foo_SOURCES’ in this snippet
|
||
|
||
xs = a.c b.c
|
||
foo_SOURCES = c.c $(xs)
|
||
|
||
it would use the files ‘a.c’, ‘b.c’, and ‘c.c’ as the contents of
|
||
‘foo_SOURCES’.
|
||
|
||
Automake also allows a form of comment that is _not_ copied into the
|
||
output; all lines beginning with ‘##’ (leading spaces allowed) are
|
||
completely ignored by Automake.
|
||
|
||
It is customary to make the first line of ‘Makefile.am’ read:
|
||
|
||
## Process this file with automake to produce Makefile.in
|
||
|
||
|
||
File: automake.info, Node: Strictness, Next: Uniform, Prev: General Operation, Up: Generalities
|
||
|
||
3.2 Strictness
|
||
==============
|
||
|
||
While Automake is intended to be used by maintainers of GNU packages, it
|
||
does make some effort to accommodate those who wish to use it, but do
|
||
not want to use all the GNU conventions.
|
||
|
||
To this end, Automake supports three levels of “strictness”—the
|
||
strictness indicating how stringently Automake should check standards
|
||
conformance.
|
||
|
||
The valid strictness levels are:
|
||
|
||
‘foreign’
|
||
Automake will check for only those things that are absolutely
|
||
required for proper operations. For instance, whereas GNU
|
||
standards dictate the existence of a ‘NEWS’ file, it will not be
|
||
required in this mode. This strictness will also turn off some
|
||
warnings by default (among them, portability warnings). The name
|
||
comes from the fact that Automake is intended to be used for GNU
|
||
programs; these relaxed rules are not the standard mode of
|
||
operation.
|
||
|
||
‘gnu’
|
||
Automake will check—as much as possible—for compliance to the GNU
|
||
standards for packages. This is the default.
|
||
|
||
‘gnits’
|
||
Automake will check for compliance to the as-yet-unwritten “Gnits
|
||
standards”. These are based on the GNU standards, but are even
|
||
more detailed. Unless you are a Gnits standards contributor, it is
|
||
recommended that you avoid this option until such time as the Gnits
|
||
standard is actually published (which may never happen).
|
||
|
||
*Note Gnits::, for more information on the precise implications of
|
||
the strictness level.
|
||
|
||
|
||
File: automake.info, Node: Uniform, Next: Length Limitations, Prev: Strictness, Up: Generalities
|
||
|
||
3.3 The Uniform Naming Scheme
|
||
=============================
|
||
|
||
Automake variables generally follow a “uniform naming scheme” that makes
|
||
it easy to decide how programs (and other derived objects) are built,
|
||
and how they are installed. This scheme also supports ‘configure’ time
|
||
determination of what should be built.
|
||
|
||
At ‘make’ time, certain variables are used to determine which objects
|
||
are to be built. The variable names are made of several pieces that are
|
||
concatenated together.
|
||
|
||
The piece that tells ‘automake’ what is being built is commonly
|
||
called the “primary”. For instance, the primary ‘PROGRAMS’ holds a list
|
||
of programs that are to be compiled and linked.
|
||
|
||
A different set of names is used to decide where the built objects
|
||
should be installed. These names are prefixes to the primary, and they
|
||
indicate which standard directory should be used as the installation
|
||
directory. The standard directory names are given in the GNU standards
|
||
(*note (standards)Directory Variables::). Automake extends this list
|
||
with ‘pkgdatadir’, ‘pkgincludedir’, ‘pkglibdir’, and ‘pkglibexecdir’;
|
||
these are the same as the non-‘pkg’ versions, but with ‘$(PACKAGE)’
|
||
appended. For instance, ‘pkglibdir’ is defined as
|
||
‘$(libdir)/$(PACKAGE)’.
|
||
|
||
For each primary, there is one additional variable named by
|
||
prepending ‘EXTRA_’ to the primary name. This variable is used to list
|
||
objects that may or may not be built, depending on what ‘configure’
|
||
decides. This variable is required because Automake must statically
|
||
know the entire list of objects that may be built in order to generate a
|
||
‘Makefile.in’ that will work in all cases.
|
||
|
||
For instance, ‘cpio’ decides at configure time which programs should
|
||
be built. Some of the programs are installed in ‘bindir’, and some are
|
||
installed in ‘sbindir’:
|
||
|
||
EXTRA_PROGRAMS = mt rmt
|
||
bin_PROGRAMS = cpio pax
|
||
sbin_PROGRAMS = $(MORE_PROGRAMS)
|
||
|
||
Defining a primary without a prefix as a variable, e.g., ‘PROGRAMS’,
|
||
is an error.
|
||
|
||
Note that the common ‘dir’ suffix is left off when constructing the
|
||
variable names; thus one writes ‘bin_PROGRAMS’ and not
|
||
‘bindir_PROGRAMS’.
|
||
|
||
Not every sort of object can be installed in every directory.
|
||
Automake will flag those attempts it finds in error (but see below how
|
||
to override the check if you really need to). Automake will also
|
||
diagnose obvious misspellings in directory names.
|
||
|
||
Sometimes the standard directories—even as augmented by Automake—are
|
||
not enough. In particular it is sometimes useful, for clarity, to
|
||
install objects in a subdirectory of some predefined directory. To this
|
||
end, Automake allows you to extend the list of possible installation
|
||
directories. A given prefix (e.g., ‘zar’) is valid if a variable of the
|
||
same name with ‘dir’ appended is defined (e.g., ‘zardir’).
|
||
|
||
For instance, the following snippet will install ‘file.xml’ into
|
||
‘$(datadir)/xml’.
|
||
|
||
xmldir = $(datadir)/xml
|
||
xml_DATA = file.xml
|
||
|
||
This feature can also be used to override the sanity checks Automake
|
||
performs to diagnose suspicious directory/primary couples (in the
|
||
unlikely case these checks are undesirable, and you really know what
|
||
you’re doing). For example, Automake would error out on this input:
|
||
|
||
# Forbidden directory combinations, automake will error out on this.
|
||
pkglib_PROGRAMS = foo
|
||
doc_LIBRARIES = libquux.a
|
||
|
||
but it will succeed with this:
|
||
|
||
# Work around forbidden directory combinations. Do not use this
|
||
# without a very good reason!
|
||
my_execbindir = $(pkglibdir)
|
||
my_doclibdir = $(docdir)
|
||
my_execbin_PROGRAMS = foo
|
||
my_doclib_LIBRARIES = libquux.a
|
||
|
||
The ‘exec’ substring of the ‘my_execbindir’ variable lets the files
|
||
be installed at the right time (*note The Two Parts of Install::).
|
||
|
||
The special prefix ‘noinst_’ indicates that the objects in question
|
||
should be built but not installed at all. This is usually used for
|
||
objects required to build the rest of your package, for instance static
|
||
libraries (*note A Library::), or helper scripts.
|
||
|
||
The special prefix ‘check_’ indicates that the objects in question
|
||
should not be built until the ‘make check’ command is run. Those
|
||
objects are not installed either.
|
||
|
||
The current primary names are ‘PROGRAMS’, ‘LIBRARIES’, ‘LTLIBRARIES’,
|
||
‘LISP’, ‘PYTHON’, ‘JAVA’, ‘SCRIPTS’, ‘DATA’, ‘HEADERS’, ‘MANS’, and
|
||
‘TEXINFOS’.
|
||
|
||
Some primaries also allow additional prefixes that control other
|
||
aspects of ‘automake’’s behavior. The currently defined prefixes are
|
||
‘dist_’, ‘nodist_’, ‘nobase_’, and ‘notrans_’. These prefixes are
|
||
explained later (*note Program and Library Variables::) (*note Man
|
||
Pages::).
|
||
|
||
|
||
File: automake.info, Node: Length Limitations, Next: Canonicalization, Prev: Uniform, Up: Generalities
|
||
|
||
3.4 Staying below the command line length limit
|
||
===============================================
|
||
|
||
Traditionally, most unix-like systems have a length limitation for the
|
||
command line arguments and environment contents when creating new
|
||
processes (see for example
|
||
<http://www.in-ulm.de/~mascheck/various/argmax/> for an overview on this
|
||
issue), which of course also applies to commands spawned by ‘make’.
|
||
POSIX requires this limit to be at least 4096 bytes, and most modern
|
||
systems have quite high limits (or are unlimited).
|
||
|
||
In order to create portable Makefiles that do not trip over these
|
||
limits, it is necessary to keep the length of file lists bounded.
|
||
Unfortunately, it is not possible to do so fully transparently within
|
||
Automake, so your help may be needed. Typically, you can split long
|
||
file lists manually and use different installation directory names for
|
||
each list. For example,
|
||
|
||
data_DATA = file1 ... fileN fileN+1 ... file2N
|
||
|
||
may also be written as
|
||
|
||
data_DATA = file1 ... fileN
|
||
data2dir = $(datadir)
|
||
data2_DATA = fileN+1 ... file2N
|
||
|
||
and will cause Automake to treat the two lists separately during ‘make
|
||
install’. See *note The Two Parts of Install:: for choosing directory
|
||
names that will keep the ordering of the two parts of installation Note
|
||
that ‘make dist’ may still only work on a host with a higher length
|
||
limit in this example.
|
||
|
||
Automake itself employs a couple of strategies to avoid long command
|
||
lines. For example, when ‘${srcdir}/’ is prepended to file names, as
|
||
can happen with above ‘$(data_DATA)’ lists, it limits the amount of
|
||
arguments passed to external commands.
|
||
|
||
Unfortunately, some system’s ‘make’ commands may prepend ‘VPATH’
|
||
prefixes like ‘${srcdir}/’ to file names from the source tree
|
||
automatically (*note Automatic Rule Rewriting: (autoconf)Automatic Rule
|
||
Rewriting.). In this case, the user may have to switch to use GNU Make,
|
||
or refrain from using VPATH builds, in order to stay below the length
|
||
limit.
|
||
|
||
For libraries and programs built from many sources, convenience
|
||
archives may be used as intermediates in order to limit the object list
|
||
length (*note Libtool Convenience Libraries::).
|
||
|
||
|
||
File: automake.info, Node: Canonicalization, Next: User Variables, Prev: Length Limitations, Up: Generalities
|
||
|
||
3.5 How derived variables are named
|
||
===================================
|
||
|
||
Sometimes a Makefile variable name is derived from some text the
|
||
maintainer supplies. For instance, a program name listed in ‘_PROGRAMS’
|
||
is rewritten into the name of a ‘_SOURCES’ variable. In cases like
|
||
this, Automake canonicalizes the text, so that program names and the
|
||
like do not have to follow Makefile variable naming rules. All
|
||
characters in the name except for letters, numbers, the strudel (@), and
|
||
the underscore are turned into underscores when making variable
|
||
references.
|
||
|
||
For example, if your program is named ‘sniff-glue’, the derived
|
||
variable name would be ‘sniff_glue_SOURCES’, not ‘sniff-glue_SOURCES’.
|
||
Similarly the sources for a library named ‘libmumble++.a’ should be
|
||
listed in the ‘libmumble___a_SOURCES’ variable.
|
||
|
||
The strudel is an addition, to make the use of Autoconf substitutions
|
||
in variable names less obfuscating.
|
||
|
||
|
||
File: automake.info, Node: User Variables, Next: Auxiliary Programs, Prev: Canonicalization, Up: Generalities
|
||
|
||
3.6 Variables reserved for the user
|
||
===================================
|
||
|
||
Some ‘Makefile’ variables are reserved by the GNU Coding Standards for
|
||
the use of the “user”—the person building the package. For instance,
|
||
‘CFLAGS’ is one such variable.
|
||
|
||
Sometimes package developers are tempted to set user variables such
|
||
as ‘CFLAGS’ because it appears to make their job easier. However, the
|
||
package itself should never set a user variable, particularly not to
|
||
include switches that are required for proper compilation of the
|
||
package. Since these variables are documented as being for the package
|
||
builder, that person rightfully expects to be able to override any of
|
||
these variables at build time.
|
||
|
||
To get around this problem, Automake introduces an automake-specific
|
||
shadow variable for each user flag variable. (Shadow variables are not
|
||
introduced for variables like ‘CC’, where they would make no sense.)
|
||
The shadow variable is named by prepending ‘AM_’ to the user variable’s
|
||
name. For instance, the shadow variable for ‘YFLAGS’ is ‘AM_YFLAGS’.
|
||
The package maintainer—that is, the author(s) of the ‘Makefile.am’ and
|
||
‘configure.ac’ files—may adjust these shadow variables however
|
||
necessary.
|
||
|
||
*Note Flag Variables Ordering::, for more discussion about these
|
||
variables and how they interact with per-target variables.
|
||
|
||
|
||
File: automake.info, Node: Auxiliary Programs, Prev: User Variables, Up: Generalities
|
||
|
||
3.7 Programs automake might require
|
||
===================================
|
||
|
||
Automake sometimes requires helper programs so that the generated
|
||
‘Makefile’ can do its work properly. There are a fairly large number of
|
||
them, and we list them here.
|
||
|
||
Although all of these files are distributed and installed with
|
||
Automake, a couple of them are maintained separately. The Automake
|
||
copies are updated before each release, but we mention the original
|
||
source in case you need more recent versions.
|
||
|
||
‘ar-lib’
|
||
This is a wrapper primarily for the Microsoft lib archiver, to make
|
||
it more POSIX-like.
|
||
|
||
‘compile’
|
||
This is a wrapper for compilers that do not accept options ‘-c’ and
|
||
‘-o’ at the same time. It is only used when absolutely required.
|
||
Such compilers are rare, with the Microsoft C/C++ Compiler as the
|
||
most notable exception. This wrapper also makes the following
|
||
common options available for that compiler, while performing file
|
||
name translation where needed: ‘-I’, ‘-L’, ‘-l’, ‘-Wl,’ and
|
||
‘-Xlinker’.
|
||
|
||
‘config.guess’
|
||
‘config.sub’
|
||
These two programs compute the canonical triplets for the given
|
||
build, host, or target architecture. These programs are updated
|
||
regularly to support new architectures and fix probes broken by
|
||
changes in new kernel versions. Each new release of Automake comes
|
||
with up-to-date copies of these programs. If your copy of Automake
|
||
is getting old, you are encouraged to fetch the latest versions of
|
||
these files from <http://savannah.gnu.org/git/?group=config> before
|
||
making a release.
|
||
|
||
‘depcomp’
|
||
This program understands how to run a compiler so that it will
|
||
generate not only the desired output but also dependency
|
||
information that is then used by the automatic dependency tracking
|
||
feature (*note Dependencies::).
|
||
|
||
‘install-sh’
|
||
This is a replacement for the ‘install’ program that works on
|
||
platforms where ‘install’ is unavailable or unusable.
|
||
|
||
‘mdate-sh’
|
||
This script is used to generate a ‘version.texi’ file. It examines
|
||
a file and prints some date information about it.
|
||
|
||
‘missing’
|
||
This wraps a number of programs that are typically only required by
|
||
maintainers. If the program in question doesn’t exist, or seems to
|
||
old, ‘missing’ will print an informative warning before failing
|
||
out, to provide the user with more context and information.
|
||
|
||
‘mkinstalldirs’
|
||
This script used to be a wrapper around ‘mkdir -p’, which is not
|
||
portable. Now we prefer to use ‘install-sh -d’ when ‘configure’
|
||
finds that ‘mkdir -p’ does not work, this makes one less script to
|
||
distribute.
|
||
|
||
For backward compatibility ‘mkinstalldirs’ is still used and
|
||
distributed when ‘automake’ finds it in a package. But it is no
|
||
longer installed automatically, and it should be safe to remove it.
|
||
|
||
‘py-compile’
|
||
This is used to byte-compile Python scripts.
|
||
|
||
‘test-driver’
|
||
This implements the default test driver offered by the parallel
|
||
testsuite harness.
|
||
|
||
‘texinfo.tex’
|
||
Not a program, this file is required for ‘make dvi’, ‘make ps’ and
|
||
‘make pdf’ to work when Texinfo sources are in the package. The
|
||
latest version can be downloaded from
|
||
<http://www.gnu.org/software/texinfo/>.
|
||
|
||
‘ylwrap’
|
||
This program wraps ‘lex’ and ‘yacc’ to rename their output files.
|
||
It also ensures that, for instance, multiple ‘yacc’ instances can
|
||
be invoked in a single directory in parallel.
|
||
|
||
|
||
File: automake.info, Node: Examples, Next: automake Invocation, Prev: Generalities, Up: Top
|
||
|
||
4 Some example packages
|
||
***********************
|
||
|
||
This section contains two small examples.
|
||
|
||
The first example (*note Complete::) assumes you have an existing
|
||
project already using Autoconf, with handcrafted ‘Makefile’s, and that
|
||
you want to convert it to using Automake. If you are discovering both
|
||
tools, it is probably better that you look at the Hello World example
|
||
presented earlier (*note Hello World::).
|
||
|
||
The second example (*note true::) shows how two programs can be built
|
||
from the same file, using different compilation parameters. It contains
|
||
some technical digressions that are probably best skipped on first read.
|
||
|
||
* Menu:
|
||
|
||
* Complete:: A simple example, start to finish
|
||
* true:: Building true and false
|
||
|
||
|
||
File: automake.info, Node: Complete, Next: true, Up: Examples
|
||
|
||
4.1 A simple example, start to finish
|
||
=====================================
|
||
|
||
Let’s suppose you just finished writing ‘zardoz’, a program to make your
|
||
head float from vortex to vortex. You’ve been using Autoconf to provide
|
||
a portability framework, but your ‘Makefile.in’s have been ad-hoc. You
|
||
want to make them bulletproof, so you turn to Automake.
|
||
|
||
The first step is to update your ‘configure.ac’ to include the
|
||
commands that ‘automake’ needs. The way to do this is to add an
|
||
‘AM_INIT_AUTOMAKE’ call just after ‘AC_INIT’:
|
||
|
||
AC_INIT([zardoz], [1.0])
|
||
AM_INIT_AUTOMAKE
|
||
...
|
||
|
||
Since your program doesn’t have any complicating factors (e.g., it
|
||
doesn’t use ‘gettext’, it doesn’t want to build a shared library),
|
||
you’re done with this part. That was easy!
|
||
|
||
Now you must regenerate ‘configure’. But to do that, you’ll need to
|
||
tell ‘autoconf’ how to find the new macro you’ve used. The easiest way
|
||
to do this is to use the ‘aclocal’ program to generate your ‘aclocal.m4’
|
||
for you. But wait... maybe you already have an ‘aclocal.m4’, because
|
||
you had to write some hairy macros for your program. The ‘aclocal’
|
||
program lets you put your own macros into ‘acinclude.m4’, so simply
|
||
rename and then run:
|
||
|
||
mv aclocal.m4 acinclude.m4
|
||
aclocal
|
||
autoconf
|
||
|
||
Now it is time to write your ‘Makefile.am’ for ‘zardoz’. Since
|
||
‘zardoz’ is a user program, you want to install it where the rest of the
|
||
user programs go: ‘bindir’. Additionally, ‘zardoz’ has some Texinfo
|
||
documentation. Your ‘configure.ac’ script uses ‘AC_REPLACE_FUNCS’, so
|
||
you need to link against ‘$(LIBOBJS)’. So here’s what you’d write:
|
||
|
||
bin_PROGRAMS = zardoz
|
||
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
|
||
zardoz_LDADD = $(LIBOBJS)
|
||
|
||
info_TEXINFOS = zardoz.texi
|
||
|
||
Now you can run ‘automake --add-missing’ to generate your
|
||
‘Makefile.in’ and grab any auxiliary files you might need, and you’re
|
||
done!
|
||
|
||
|
||
File: automake.info, Node: true, Prev: Complete, Up: Examples
|
||
|
||
4.2 Building true and false
|
||
===========================
|
||
|
||
Here is another, trickier example. It shows how to generate two
|
||
programs (‘true’ and ‘false’) from the same source file (‘true.c’). The
|
||
difficult part is that each compilation of ‘true.c’ requires different
|
||
‘cpp’ flags.
|
||
|
||
bin_PROGRAMS = true false
|
||
false_SOURCES =
|
||
false_LDADD = false.o
|
||
|
||
true.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=0 -c true.c
|
||
|
||
false.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c
|
||
|
||
Note that there is no ‘true_SOURCES’ definition. Automake will
|
||
implicitly assume that there is a source file named ‘true.c’ (*note
|
||
Default _SOURCES::), and define rules to compile ‘true.o’ and link
|
||
‘true’. The ‘true.o: true.c’ rule supplied by the above ‘Makefile.am’,
|
||
will override the Automake generated rule to build ‘true.o’.
|
||
|
||
‘false_SOURCES’ is defined to be empty—that way no implicit value is
|
||
substituted. Because we have not listed the source of ‘false’, we have
|
||
to tell Automake how to link the program. This is the purpose of the
|
||
‘false_LDADD’ line. A ‘false_DEPENDENCIES’ variable, holding the
|
||
dependencies of the ‘false’ target will be automatically generated by
|
||
Automake from the content of ‘false_LDADD’.
|
||
|
||
The above rules won’t work if your compiler doesn’t accept both ‘-c’
|
||
and ‘-o’. The simplest fix for this is to introduce a bogus dependency
|
||
(to avoid problems with a parallel ‘make’):
|
||
|
||
true.o: true.c false.o
|
||
$(COMPILE) -DEXIT_CODE=0 -c true.c
|
||
|
||
false.o: true.c
|
||
$(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o
|
||
|
||
As it turns out, there is also a much easier way to do this same
|
||
task. Some of the above technique is useful enough that we’ve kept the
|
||
example in the manual. However if you were to build ‘true’ and ‘false’
|
||
in real life, you would probably use per-program compilation flags, like
|
||
so:
|
||
|
||
bin_PROGRAMS = false true
|
||
|
||
false_SOURCES = true.c
|
||
false_CPPFLAGS = -DEXIT_CODE=1
|
||
|
||
true_SOURCES = true.c
|
||
true_CPPFLAGS = -DEXIT_CODE=0
|
||
|
||
In this case Automake will cause ‘true.c’ to be compiled twice, with
|
||
different flags. In this instance, the names of the object files would
|
||
be chosen by automake; they would be ‘false-true.o’ and ‘true-true.o’.
|
||
(The name of the object files rarely matters.)
|
||
|
||
|
||
File: automake.info, Node: automake Invocation, Next: configure, Prev: Examples, Up: Top
|
||
|
||
5 Creating a ‘Makefile.in’
|
||
**************************
|
||
|
||
To create all the ‘Makefile.in’s for a package, run the ‘automake’
|
||
program in the top level directory, with no arguments. ‘automake’ will
|
||
automatically find each appropriate ‘Makefile.am’ (by scanning
|
||
‘configure.ac’; *note configure::) and generate the corresponding
|
||
‘Makefile.in’. Note that ‘automake’ has a rather simplistic view of
|
||
what constitutes a package; it assumes that a package has only one
|
||
‘configure.ac’, at the top. If your package has multiple
|
||
‘configure.ac’s, then you must run ‘automake’ in each directory holding
|
||
a ‘configure.ac’. (Alternatively, you may rely on Autoconf’s
|
||
‘autoreconf’, which is able to recurse your package tree and run
|
||
‘automake’ where appropriate.)
|
||
|
||
You can optionally give ‘automake’ an argument; ‘.am’ is appended to
|
||
the argument and the result is used as the name of the input file. This
|
||
feature is generally only used to automatically rebuild an out-of-date
|
||
‘Makefile.in’. Note that ‘automake’ must always be run from the topmost
|
||
directory of a project, even if being used to regenerate the
|
||
‘Makefile.in’ in some subdirectory. This is necessary because
|
||
‘automake’ must scan ‘configure.ac’, and because ‘automake’ uses the
|
||
knowledge that a ‘Makefile.in’ is in a subdirectory to change its
|
||
behavior in some cases.
|
||
|
||
Automake will run ‘autoconf’ to scan ‘configure.ac’ and its
|
||
dependencies (i.e., ‘aclocal.m4’ and any included file), therefore
|
||
‘autoconf’ must be in your ‘PATH’. If there is an ‘AUTOCONF’ variable
|
||
in your environment it will be used instead of ‘autoconf’, this allows
|
||
you to select a particular version of Autoconf. By the way, don’t
|
||
misunderstand this paragraph: ‘automake’ runs ‘autoconf’ to *scan* your
|
||
‘configure.ac’, this won’t build ‘configure’ and you still have to run
|
||
‘autoconf’ yourself for this purpose.
|
||
|
||
‘automake’ accepts the following options:
|
||
|
||
‘-a’
|
||
‘--add-missing’
|
||
Automake requires certain common files to exist in certain
|
||
situations; for instance, ‘config.guess’ is required if
|
||
‘configure.ac’ invokes ‘AC_CANONICAL_HOST’. Automake is
|
||
distributed with several of these files (*note Auxiliary
|
||
Programs::); this option will cause the missing ones to be
|
||
automatically added to the package, whenever possible. In general
|
||
if Automake tells you a file is missing, try using this option. By
|
||
default Automake tries to make a symbolic link pointing to its own
|
||
copy of the missing file; this can be changed with ‘--copy’.
|
||
|
||
Many of the potentially-missing files are common scripts whose
|
||
location may be specified via the ‘AC_CONFIG_AUX_DIR’ macro.
|
||
Therefore, ‘AC_CONFIG_AUX_DIR’’s setting affects whether a file is
|
||
considered missing, and where the missing file is added (*note
|
||
Optional::).
|
||
|
||
In some strictness modes, additional files are installed, see *note
|
||
Gnits:: for more information.
|
||
|
||
‘--libdir=DIR’
|
||
Look for Automake data files in directory DIR instead of in the
|
||
installation directory. This is typically used for debugging.
|
||
|
||
‘--print-libdir’
|
||
Print the path of the installation directory containing
|
||
Automake-provided scripts and data files (like e.g., ‘texinfo.texi’
|
||
and ‘install-sh’).
|
||
|
||
‘-c’
|
||
‘--copy’
|
||
When used with ‘--add-missing’, causes installed files to be
|
||
copied. The default is to make a symbolic link.
|
||
|
||
‘-f’
|
||
‘--force-missing’
|
||
When used with ‘--add-missing’, causes standard files to be
|
||
reinstalled even if they already exist in the source tree. This
|
||
involves removing the file from the source tree before creating the
|
||
new symlink (or, with ‘--copy’, copying the new file).
|
||
|
||
‘--foreign’
|
||
Set the global strictness to ‘foreign’. For more information, see
|
||
*note Strictness::.
|
||
|
||
‘--gnits’
|
||
Set the global strictness to ‘gnits’. For more information, see
|
||
*note Gnits::.
|
||
|
||
‘--gnu’
|
||
Set the global strictness to ‘gnu’. For more information, see
|
||
*note Gnits::. This is the default strictness.
|
||
|
||
‘--help’
|
||
Print a summary of the command line options and exit.
|
||
|
||
‘-i’
|
||
‘--ignore-deps’
|
||
This disables the dependency tracking feature in generated
|
||
‘Makefile’s; see *note Dependencies::.
|
||
|
||
‘--include-deps’
|
||
This enables the dependency tracking feature. This feature is
|
||
enabled by default. This option is provided for historical reasons
|
||
only and probably should not be used.
|
||
|
||
‘--no-force’
|
||
Ordinarily ‘automake’ creates all ‘Makefile.in’s mentioned in
|
||
‘configure.ac’. This option causes it to only update those
|
||
‘Makefile.in’s that are out of date with respect to one of their
|
||
dependents.
|
||
|
||
‘-o DIR’
|
||
‘--output-dir=DIR’
|
||
Put the generated ‘Makefile.in’ in the directory DIR. Ordinarily
|
||
each ‘Makefile.in’ is created in the directory of the corresponding
|
||
‘Makefile.am’. This option is deprecated and will be removed in a
|
||
future release.
|
||
|
||
‘-v’
|
||
‘--verbose’
|
||
Cause Automake to print information about which files are being
|
||
read or created.
|
||
|
||
‘--version’
|
||
Print the version number of Automake and exit.
|
||
|
||
‘-W CATEGORY’
|
||
‘--warnings=CATEGORY’
|
||
Output warnings falling in CATEGORY. CATEGORY can be one of:
|
||
‘gnu’
|
||
warnings related to the GNU Coding Standards (*note
|
||
(standards)Top::).
|
||
‘obsolete’
|
||
obsolete features or constructions
|
||
‘override’
|
||
user redefinitions of Automake rules or variables
|
||
‘portability’
|
||
portability issues (e.g., use of ‘make’ features that are
|
||
known to be not portable)
|
||
‘extra-portability’
|
||
extra portability issues related to obscure tools. One
|
||
example of such a tool is the Microsoft ‘lib’ archiver.
|
||
‘syntax’
|
||
weird syntax, unused variables, typos
|
||
‘unsupported’
|
||
unsupported or incomplete features
|
||
‘all’
|
||
all the warnings
|
||
‘none’
|
||
turn off all the warnings
|
||
‘error’
|
||
treat warnings as errors
|
||
|
||
A category can be turned off by prefixing its name with ‘no-’. For
|
||
instance, ‘-Wno-syntax’ will hide the warnings about unused
|
||
variables.
|
||
|
||
The categories output by default are ‘obsolete’, ‘syntax’ and
|
||
‘unsupported’. Additionally, ‘gnu’ and ‘portability’ are enabled
|
||
in ‘--gnu’ and ‘--gnits’ strictness.
|
||
|
||
Turning off ‘portability’ will also turn off ‘extra-portability’,
|
||
and similarly turning on ‘extra-portability’ will also turn on
|
||
‘portability’. However, turning on ‘portability’ or turning off
|
||
‘extra-portability’ will not affect the other category.
|
||
|
||
The environment variable ‘WARNINGS’ can contain a comma separated
|
||
list of categories to enable. It will be taken into account before
|
||
the command-line switches, this way ‘-Wnone’ will also ignore any
|
||
warning category enabled by ‘WARNINGS’. This variable is also used
|
||
by other tools like ‘autoconf’; unknown categories are ignored for
|
||
this reason.
|
||
|
||
If the environment variable ‘AUTOMAKE_JOBS’ contains a positive
|
||
number, it is taken as the maximum number of Perl threads to use in
|
||
‘automake’ for generating multiple ‘Makefile.in’ files concurrently.
|
||
This is an experimental feature.
|
||
|
||
|
||
File: automake.info, Node: configure, Next: Directories, Prev: automake Invocation, Up: Top
|
||
|
||
6 Scanning ‘configure.ac’, using ‘aclocal’
|
||
******************************************
|
||
|
||
Automake scans the package’s ‘configure.ac’ to determine certain
|
||
information about the package. Some ‘autoconf’ macros are required and
|
||
some variables must be defined in ‘configure.ac’. Automake will also
|
||
use information from ‘configure.ac’ to further tailor its output.
|
||
|
||
Automake also supplies some Autoconf macros to make the maintenance
|
||
easier. These macros can automatically be put into your ‘aclocal.m4’
|
||
using the ‘aclocal’ program.
|
||
|
||
* Menu:
|
||
|
||
* Requirements:: Configuration requirements
|
||
* Optional:: Other things Automake recognizes
|
||
* aclocal Invocation:: Auto-generating aclocal.m4
|
||
* Macros:: Autoconf macros supplied with Automake
|
||
|
||
|
||
File: automake.info, Node: Requirements, Next: Optional, Up: configure
|
||
|
||
6.1 Configuration requirements
|
||
==============================
|
||
|
||
The one real requirement of Automake is that your ‘configure.ac’ call
|
||
‘AM_INIT_AUTOMAKE’. This macro does several things that are required
|
||
for proper Automake operation (*note Macros::).
|
||
|
||
Here are the other macros that Automake requires but which are not
|
||
run by ‘AM_INIT_AUTOMAKE’:
|
||
|
||
‘AC_CONFIG_FILES’
|
||
‘AC_OUTPUT’
|
||
These two macros are usually invoked as follows near the end of
|
||
‘configure.ac’.
|
||
|
||
...
|
||
AC_CONFIG_FILES([
|
||
Makefile
|
||
doc/Makefile
|
||
src/Makefile
|
||
src/lib/Makefile
|
||
...
|
||
])
|
||
AC_OUTPUT
|
||
|
||
Automake uses these to determine which files to create (*note
|
||
Creating Output Files: (autoconf)Output.). A listed file is
|
||
considered to be an Automake generated ‘Makefile’ if there exists a
|
||
file with the same name and the ‘.am’ extension appended.
|
||
Typically, ‘AC_CONFIG_FILES([foo/Makefile])’ will cause Automake to
|
||
generate ‘foo/Makefile.in’ if ‘foo/Makefile.am’ exists.
|
||
|
||
When using ‘AC_CONFIG_FILES’ with multiple input files, as in
|
||
|
||
AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])
|
||
|
||
‘automake’ will generate the first ‘.in’ input file for which a
|
||
‘.am’ file exists. If no such file exists the output file is not
|
||
considered to be generated by Automake.
|
||
|
||
Files created by ‘AC_CONFIG_FILES’, be they Automake ‘Makefile’s or
|
||
not, are all removed by ‘make distclean’. Their inputs are
|
||
automatically distributed, unless they are the output of prior
|
||
‘AC_CONFIG_FILES’ commands. Finally, rebuild rules are generated
|
||
in the Automake ‘Makefile’ existing in the subdirectory of the
|
||
output file, if there is one, or in the top-level ‘Makefile’
|
||
otherwise.
|
||
|
||
The above machinery (cleaning, distributing, and rebuilding) works
|
||
fine if the ‘AC_CONFIG_FILES’ specifications contain only literals.
|
||
If part of the specification uses shell variables, ‘automake’ will
|
||
not be able to fulfill this setup, and you will have to complete
|
||
the missing bits by hand. For instance, on
|
||
|
||
file=input
|
||
...
|
||
AC_CONFIG_FILES([output:$file],, [file=$file])
|
||
|
||
‘automake’ will output rules to clean ‘output’, and rebuild it.
|
||
However the rebuild rule will not depend on ‘input’, and this file
|
||
will not be distributed either. (You must add ‘EXTRA_DIST = input’
|
||
to your ‘Makefile.am’ if ‘input’ is a source file.)
|
||
|
||
Similarly
|
||
|
||
file=output
|
||
file2=out:in
|
||
...
|
||
AC_CONFIG_FILES([$file:input],, [file=$file])
|
||
AC_CONFIG_FILES([$file2],, [file2=$file2])
|
||
|
||
will only cause ‘input’ to be distributed. No file will be cleaned
|
||
automatically (add ‘DISTCLEANFILES = output out’ yourself), and no
|
||
rebuild rule will be output.
|
||
|
||
Obviously ‘automake’ cannot guess what value ‘$file’ is going to
|
||
hold later when ‘configure’ is run, and it cannot use the shell
|
||
variable ‘$file’ in a ‘Makefile’. However, if you make reference
|
||
to ‘$file’ as ‘${file}’ (i.e., in a way that is compatible with
|
||
‘make’’s syntax) and furthermore use ‘AC_SUBST’ to ensure that
|
||
‘${file}’ is meaningful in a ‘Makefile’, then ‘automake’ will be
|
||
able to use ‘${file}’ to generate all of these rules. For
|
||
instance, here is how the Automake package itself generates
|
||
versioned scripts for its test suite:
|
||
|
||
AC_SUBST([APIVERSION], ...)
|
||
...
|
||
AC_CONFIG_FILES(
|
||
[tests/aclocal-${APIVERSION}:tests/aclocal.in],
|
||
[chmod +x tests/aclocal-${APIVERSION}],
|
||
[APIVERSION=$APIVERSION])
|
||
AC_CONFIG_FILES(
|
||
[tests/automake-${APIVERSION}:tests/automake.in],
|
||
[chmod +x tests/automake-${APIVERSION}])
|
||
|
||
Here cleaning, distributing, and rebuilding are done automatically,
|
||
because ‘${APIVERSION}’ is known at ‘make’-time.
|
||
|
||
Note that you should not use shell variables to declare ‘Makefile’
|
||
files for which ‘automake’ must create ‘Makefile.in’. Even
|
||
‘AC_SUBST’ does not help here, because ‘automake’ needs to know the
|
||
file name when it runs in order to check whether ‘Makefile.am’
|
||
exists. (In the very hairy case that your setup requires such use
|
||
of variables, you will have to tell Automake which ‘Makefile.in’s
|
||
to generate on the command-line.)
|
||
|
||
It is possible to let ‘automake’ emit conditional rules for
|
||
‘AC_CONFIG_FILES’ with the help of ‘AM_COND_IF’ (*note Optional::).
|
||
|
||
To summarize:
|
||
• Use literals for ‘Makefile’s, and for other files whenever
|
||
possible.
|
||
• Use ‘$file’ (or ‘${file}’ without ‘AC_SUBST([file])’) for
|
||
files that ‘automake’ should ignore.
|
||
• Use ‘${file}’ and ‘AC_SUBST([file])’ for files that ‘automake’
|
||
should not ignore.
|
||
|
||
|
||
File: automake.info, Node: Optional, Next: aclocal Invocation, Prev: Requirements, Up: configure
|
||
|
||
6.2 Other things Automake recognizes
|
||
====================================
|
||
|
||
Every time Automake is run it calls Autoconf to trace ‘configure.ac’.
|
||
This way it can recognize the use of certain macros and tailor the
|
||
generated ‘Makefile.in’ appropriately. Currently recognized macros and
|
||
their effects are:
|
||
|
||
‘AC_CANONICAL_BUILD’
|
||
‘AC_CANONICAL_HOST’
|
||
‘AC_CANONICAL_TARGET’
|
||
Automake will ensure that ‘config.guess’ and ‘config.sub’ exist.
|
||
Also, the ‘Makefile’ variables ‘build_triplet’, ‘host_triplet’ and
|
||
‘target_triplet’ are introduced. See *note Getting the Canonical
|
||
System Type: (autoconf)Canonicalizing.
|
||
|
||
‘AC_CONFIG_AUX_DIR’
|
||
Automake will look for various helper scripts, such as
|
||
‘install-sh’, in the directory named in this macro invocation.
|
||
(The full list of scripts is: ‘ar-lib’, ‘config.guess’,
|
||
‘config.sub’, ‘depcomp’, ‘compile’, ‘install-sh’, ‘ltmain.sh’,
|
||
‘mdate-sh’, ‘missing’, ‘mkinstalldirs’, ‘py-compile’,
|
||
‘test-driver’, ‘texinfo.tex’, ‘ylwrap’.) Not all scripts are
|
||
always searched for; some scripts will only be sought if the
|
||
generated ‘Makefile.in’ requires them.
|
||
|
||
If ‘AC_CONFIG_AUX_DIR’ is not given, the scripts are looked for in
|
||
their standard locations. For ‘mdate-sh’, ‘texinfo.tex’, and
|
||
‘ylwrap’, the standard location is the source directory
|
||
corresponding to the current ‘Makefile.am’. For the rest, the
|
||
standard location is the first one of ‘.’, ‘..’, or ‘../..’
|
||
(relative to the top source directory) that provides any one of the
|
||
helper scripts. *Note Finding ‘configure’ Input: (autoconf)Input.
|
||
|
||
Required files from ‘AC_CONFIG_AUX_DIR’ are automatically
|
||
distributed, even if there is no ‘Makefile.am’ in this directory.
|
||
|
||
‘AC_CONFIG_LIBOBJ_DIR’
|
||
Automake will require the sources file declared with ‘AC_LIBSOURCE’
|
||
(see below) in the directory specified by this macro.
|
||
|
||
‘AC_CONFIG_HEADERS’
|
||
Automake will generate rules to rebuild these headers from the
|
||
corresponding templates (usually, the template for a ‘foo.h’ header
|
||
being ‘foo.h.in’). Older versions of Automake required the use of
|
||
‘AM_CONFIG_HEADER’; this is no longer the case, and that macro has
|
||
indeed been removed.
|
||
|
||
As with ‘AC_CONFIG_FILES’ (*note Requirements::), parts of the
|
||
specification using shell variables will be ignored as far as
|
||
cleaning, distributing, and rebuilding is concerned.
|
||
|
||
‘AC_CONFIG_LINKS’
|
||
Automake will generate rules to remove ‘configure’ generated links
|
||
on ‘make distclean’ and to distribute named source files as part of
|
||
‘make dist’.
|
||
|
||
As for ‘AC_CONFIG_FILES’ (*note Requirements::), parts of the
|
||
specification using shell variables will be ignored as far as
|
||
cleaning and distributing is concerned. (There are no rebuild
|
||
rules for links.)
|
||
|
||
‘AC_LIBOBJ’
|
||
‘AC_LIBSOURCE’
|
||
‘AC_LIBSOURCES’
|
||
Automake will automatically distribute any file listed in
|
||
‘AC_LIBSOURCE’ or ‘AC_LIBSOURCES’.
|
||
|
||
Note that the ‘AC_LIBOBJ’ macro calls ‘AC_LIBSOURCE’. So if an
|
||
Autoconf macro is documented to call ‘AC_LIBOBJ([file])’, then
|
||
‘file.c’ will be distributed automatically by Automake. This
|
||
encompasses many macros like ‘AC_FUNC_ALLOCA’, ‘AC_FUNC_MEMCMP’,
|
||
‘AC_REPLACE_FUNCS’, and others.
|
||
|
||
By the way, direct assignments to ‘LIBOBJS’ are no longer
|
||
supported. You should always use ‘AC_LIBOBJ’ for this purpose.
|
||
*Note ‘AC_LIBOBJ’ vs. ‘LIBOBJS’: (autoconf)AC_LIBOBJ vs LIBOBJS.
|
||
|
||
‘AC_PROG_RANLIB’
|
||
This is required if any libraries are built in the package. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_PROG_CXX’
|
||
This is required if any C++ source is included. *Note Particular
|
||
Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_PROG_OBJC’
|
||
This is required if any Objective C source is included. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_PROG_OBJCXX’
|
||
This is required if any Objective C++ source is included. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_PROG_F77’
|
||
This is required if any Fortran 77 source is included. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_F77_LIBRARY_LDFLAGS’
|
||
This is required for programs and shared libraries that are a
|
||
mixture of languages that include Fortran 77 (*note Mixing Fortran
|
||
77 With C and C++::). *Note Autoconf macros supplied with
|
||
Automake: Macros.
|
||
|
||
‘AC_FC_SRCEXT’
|
||
Automake will add the flags computed by ‘AC_FC_SRCEXT’ to
|
||
compilation of files with the respective source extension (*note
|
||
Fortran Compiler Characteristics: (autoconf)Fortran Compiler.).
|
||
|
||
‘AC_PROG_FC’
|
||
This is required if any Fortran 90/95 source is included. This
|
||
macro is distributed with Autoconf version 2.58 and later. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_PROG_LIBTOOL’
|
||
Automake will turn on processing for ‘libtool’ (*note Introduction:
|
||
(libtool)Top.).
|
||
|
||
‘AC_PROG_YACC’
|
||
If a Yacc source file is seen, then you must either use this macro
|
||
or define the variable ‘YACC’ in ‘configure.ac’. The former is
|
||
preferred (*note Particular Program Checks: (autoconf)Particular
|
||
Programs.).
|
||
|
||
‘AC_PROG_LEX’
|
||
If a Lex source file is seen, then this macro must be used. *Note
|
||
Particular Program Checks: (autoconf)Particular Programs.
|
||
|
||
‘AC_REQUIRE_AUX_FILE’
|
||
For each ‘AC_REQUIRE_AUX_FILE([FILE])’, ‘automake’ will ensure that
|
||
‘FILE’ exists in the aux directory, and will complain otherwise.
|
||
It will also automatically distribute the file. This macro should
|
||
be used by third-party Autoconf macros that require some supporting
|
||
files in the aux directory specified with ‘AC_CONFIG_AUX_DIR’
|
||
above. *Note Finding ‘configure’ Input: (autoconf)Input.
|
||
|
||
‘AC_SUBST’
|
||
The first argument is automatically defined as a variable in each
|
||
generated ‘Makefile.in’, unless ‘AM_SUBST_NOTMAKE’ is also used for
|
||
this variable. *Note Setting Output Variables: (autoconf)Setting
|
||
Output Variables.
|
||
|
||
For every substituted variable VAR, ‘automake’ will add a line ‘VAR
|
||
= VALUE’ to each ‘Makefile.in’ file. Many Autoconf macros invoke
|
||
‘AC_SUBST’ to set output variables this way, e.g., ‘AC_PATH_XTRA’
|
||
defines ‘X_CFLAGS’ and ‘X_LIBS’. Thus, you can access these
|
||
variables as ‘$(X_CFLAGS)’ and ‘$(X_LIBS)’ in any ‘Makefile.am’ if
|
||
‘AC_PATH_XTRA’ is called.
|
||
|
||
‘AM_CONDITIONAL’
|
||
This introduces an Automake conditional (*note Conditionals::).
|
||
|
||
‘AM_COND_IF’
|
||
This macro allows ‘automake’ to detect subsequent access within
|
||
‘configure.ac’ to a conditional previously introduced with
|
||
‘AM_CONDITIONAL’, thus enabling conditional ‘AC_CONFIG_FILES’
|
||
(*note Usage of Conditionals::).
|
||
|
||
‘AM_GNU_GETTEXT’
|
||
This macro is required for packages that use GNU gettext (*note
|
||
gettext::). It is distributed with gettext. If Automake sees this
|
||
macro it ensures that the package meets some of gettext’s
|
||
requirements.
|
||
|
||
‘AM_GNU_GETTEXT_INTL_SUBDIR’
|
||
This macro specifies that the ‘intl/’ subdirectory is to be built,
|
||
even if the ‘AM_GNU_GETTEXT’ macro was invoked with a first
|
||
argument of ‘external’.
|
||
|
||
‘AM_MAINTAINER_MODE([DEFAULT-MODE])’
|
||
This macro adds an ‘--enable-maintainer-mode’ option to
|
||
‘configure’. If this is used, ‘automake’ will cause
|
||
“maintainer-only” rules to be turned off by default in the
|
||
generated ‘Makefile.in’s, unless DEFAULT-MODE is ‘enable’. This
|
||
macro defines the ‘MAINTAINER_MODE’ conditional, which you can use
|
||
in your own ‘Makefile.am’. *Note maintainer-mode::.
|
||
|
||
‘AM_SUBST_NOTMAKE(VAR)’
|
||
Prevent Automake from defining a variable VAR, even if it is
|
||
substituted by ‘config.status’. Normally, Automake defines a
|
||
‘make’ variable for each ‘configure’ substitution, i.e., for each
|
||
‘AC_SUBST([VAR])’. This macro prevents that definition from
|
||
Automake. If ‘AC_SUBST’ has not been called for this variable,
|
||
then ‘AM_SUBST_NOTMAKE’ has no effects. Preventing variable
|
||
definitions may be useful for substitution of multi-line values,
|
||
where ‘VAR = @VALUE@’ might yield unintended results.
|
||
|
||
‘m4_include’
|
||
Files included by ‘configure.ac’ using this macro will be detected
|
||
by Automake and automatically distributed. They will also appear
|
||
as dependencies in ‘Makefile’ rules.
|
||
|
||
‘m4_include’ is seldom used by ‘configure.ac’ authors, but can
|
||
appear in ‘aclocal.m4’ when ‘aclocal’ detects that some required
|
||
macros come from files local to your package (as opposed to macros
|
||
installed in a system-wide directory, *note aclocal Invocation::).
|
||
|
||
|
||
File: automake.info, Node: aclocal Invocation, Next: Macros, Prev: Optional, Up: configure
|
||
|
||
6.3 Auto-generating aclocal.m4
|
||
==============================
|
||
|
||
Automake includes a number of Autoconf macros that can be used in your
|
||
package (*note Macros::); some of them are actually required by Automake
|
||
in certain situations. These macros must be defined in your
|
||
‘aclocal.m4’; otherwise they will not be seen by ‘autoconf’.
|
||
|
||
The ‘aclocal’ program will automatically generate ‘aclocal.m4’ files
|
||
based on the contents of ‘configure.ac’. This provides a convenient way
|
||
to get Automake-provided macros, without having to search around. The
|
||
‘aclocal’ mechanism allows other packages to supply their own macros
|
||
(*note Extending aclocal::). You can also use it to maintain your own
|
||
set of custom macros (*note Local Macros::).
|
||
|
||
At startup, ‘aclocal’ scans all the ‘.m4’ files it can find, looking
|
||
for macro definitions (*note Macro Search Path::). Then it scans
|
||
‘configure.ac’. Any mention of one of the macros found in the first
|
||
step causes that macro, and any macros it in turn requires, to be put
|
||
into ‘aclocal.m4’.
|
||
|
||
_Putting_ the file that contains the macro definition into
|
||
‘aclocal.m4’ is usually done by copying the entire text of this file,
|
||
including unused macro definitions as well as both ‘#’ and ‘dnl’
|
||
comments. If you want to make a comment that will be completely ignored
|
||
by ‘aclocal’, use ‘##’ as the comment leader.
|
||
|
||
When a file selected by ‘aclocal’ is located in a subdirectory
|
||
specified as a relative search path with ‘aclocal’’s ‘-I’ argument,
|
||
‘aclocal’ assumes the file belongs to the package and uses ‘m4_include’
|
||
instead of copying it into ‘aclocal.m4’. This makes the package
|
||
smaller, eases dependency tracking, and cause the file to be distributed
|
||
automatically. (*Note Local Macros::, for an example.) Any macro that
|
||
is found in a system-wide directory, or via an absolute search path will
|
||
be copied. So use ‘-I `pwd`/reldir’ instead of ‘-I reldir’ whenever
|
||
some relative directory should be considered outside the package.
|
||
|
||
The contents of ‘acinclude.m4’, if this file exists, are also
|
||
automatically included in ‘aclocal.m4’. We recommend against using
|
||
‘acinclude.m4’ in new packages (*note Local Macros::).
|
||
|
||
While computing ‘aclocal.m4’, ‘aclocal’ runs ‘autom4te’ (*note Using
|
||
‘Autom4te’: (autoconf)Using autom4te.) in order to trace the macros that
|
||
are really used, and omit from ‘aclocal.m4’ all macros that are
|
||
mentioned but otherwise unexpanded (this can happen when a macro is
|
||
called conditionally). ‘autom4te’ is expected to be in the ‘PATH’, just
|
||
as ‘autoconf’. Its location can be overridden using the ‘AUTOM4TE’
|
||
environment variable.
|
||
|
||
* Menu:
|
||
|
||
* aclocal Options:: Options supported by aclocal
|
||
* Macro Search Path:: How aclocal finds .m4 files
|
||
* Extending aclocal:: Writing your own aclocal macros
|
||
* Local Macros:: Organizing local macros
|
||
* Serials:: Serial lines in Autoconf macros
|
||
* Future of aclocal:: aclocal’s scheduled death
|
||
|
||
|
||
File: automake.info, Node: aclocal Options, Next: Macro Search Path, Up: aclocal Invocation
|
||
|
||
6.3.1 aclocal Options
|
||
---------------------
|
||
|
||
‘aclocal’ accepts the following options:
|
||
|
||
‘--automake-acdir=DIR’
|
||
Look for the automake-provided macro files in DIR instead of in the
|
||
installation directory. This is typically used for debugging.
|
||
|
||
‘--system-acdir=DIR’
|
||
Look for the system-wide third-party macro files (and the special
|
||
‘dirlist’ file) in DIR instead of in the installation directory.
|
||
This is typically used for debugging.
|
||
|
||
‘--diff[=COMMAND]’
|
||
Run COMMAND on M4 file that would be installed or overwritten by
|
||
‘--install’. The default COMMAND is ‘diff -u’. This option
|
||
implies ‘--install’ and ‘--dry-run’.
|
||
|
||
‘--dry-run’
|
||
Do not actually overwrite (or create) ‘aclocal.m4’ and M4 files
|
||
installed by ‘--install’.
|
||
|
||
‘--help’
|
||
Print a summary of the command line options and exit.
|
||
|
||
‘-I DIR’
|
||
Add the directory DIR to the list of directories searched for ‘.m4’
|
||
files.
|
||
|
||
‘--install’
|
||
Install system-wide third-party macros into the first directory
|
||
specified with ‘-I DIR’ instead of copying them in the output file.
|
||
Note that this will happen also if DIR is an absolute path.
|
||
|
||
When this option is used, and only when this option is used,
|
||
‘aclocal’ will also honor ‘#serial NUMBER’ lines that appear in
|
||
macros: an M4 file is ignored if there exists another M4 file with
|
||
the same basename and a greater serial number in the search path
|
||
(*note Serials::).
|
||
|
||
‘--force’
|
||
Always overwrite the output file. The default is to overwrite the
|
||
output file only when really needed, i.e., when its contents
|
||
changes or if one of its dependencies is younger.
|
||
|
||
This option forces the update of ‘aclocal.m4’ (or the file
|
||
specified with ‘--output’ below) and only this file, it has
|
||
absolutely no influence on files that may need to be installed by
|
||
‘--install’.
|
||
|
||
‘--output=FILE’
|
||
Cause the output to be put into FILE instead of ‘aclocal.m4’.
|
||
|
||
‘--print-ac-dir’
|
||
Prints the name of the directory that ‘aclocal’ will search to find
|
||
third-party ‘.m4’ files. When this option is given, normal
|
||
processing is suppressed. This option was used _in the past_ by
|
||
third-party packages to determine where to install ‘.m4’ macro
|
||
files, but _this usage is today discouraged_, since it causes
|
||
‘$(prefix)’ not to be thoroughly honored (which violates the GNU
|
||
Coding Standards), and a similar semantics can be better obtained
|
||
with the ‘ACLOCAL_PATH’ environment variable; *note Extending
|
||
aclocal::.
|
||
|
||
‘--verbose’
|
||
Print the names of the files it examines.
|
||
|
||
‘--version’
|
||
Print the version number of Automake and exit.
|
||
|
||
‘-W CATEGORY’
|
||
‘--warnings=CATEGORY’
|
||
Output warnings falling in CATEGORY. CATEGORY can be one of:
|
||
‘syntax’
|
||
dubious syntactic constructs, underquoted macros, unused
|
||
macros, etc.
|
||
‘unsupported’
|
||
unknown macros
|
||
‘all’
|
||
all the warnings, this is the default
|
||
‘none’
|
||
turn off all the warnings
|
||
‘error’
|
||
treat warnings as errors
|
||
|
||
All warnings are output by default.
|
||
|
||
The environment variable ‘WARNINGS’ is honored in the same way as
|
||
it is for ‘automake’ (*note automake Invocation::).
|
||
|
||
|
||
File: automake.info, Node: Macro Search Path, Next: Extending aclocal, Prev: aclocal Options, Up: aclocal Invocation
|
||
|
||
6.3.2 Macro Search Path
|
||
-----------------------
|
||
|
||
By default, ‘aclocal’ searches for ‘.m4’ files in the following
|
||
directories, in this order:
|
||
|
||
‘ACDIR-APIVERSION’
|
||
This is where the ‘.m4’ macros distributed with Automake itself are
|
||
stored. APIVERSION depends on the Automake release used; for
|
||
example, for Automake 1.11.x, APIVERSION = ‘1.11’.
|
||
|
||
‘ACDIR’
|
||
This directory is intended for third party ‘.m4’ files, and is
|
||
configured when ‘automake’ itself is built. This is
|
||
‘@datadir@/aclocal/’, which typically expands to
|
||
‘${prefix}/share/aclocal/’. To find the compiled-in value of
|
||
ACDIR, use the ‘--print-ac-dir’ option (*note aclocal Options::).
|
||
|
||
As an example, suppose that ‘automake-1.11.2’ was configured with
|
||
‘--prefix=/usr/local’. Then, the search path would be:
|
||
|
||
1. ‘/usr/local/share/aclocal-1.11.2/’
|
||
2. ‘/usr/local/share/aclocal/’
|
||
|
||
The paths for the ACDIR and ACDIR-APIVERSION directories can be
|
||
changed respectively through aclocal options ‘--system-acdir’ and
|
||
‘--automake-acdir’ (*note aclocal Options::). Note however that these
|
||
options are only intended for use by the internal Automake test suite,
|
||
or for debugging under highly unusual situations; they are not
|
||
ordinarily needed by end-users.
|
||
|
||
As explained in (*note aclocal Options::), there are several options
|
||
that can be used to change or extend this search path.
|
||
|
||
Modifying the Macro Search Path: ‘-I DIR’
|
||
.........................................
|
||
|
||
Any extra directories specified using ‘-I’ options (*note aclocal
|
||
Options::) are _prepended_ to this search list. Thus, ‘aclocal -I /foo
|
||
-I /bar’ results in the following search path:
|
||
|
||
1. ‘/foo’
|
||
2. ‘/bar’
|
||
3. ACDIR-APIVERSION
|
||
4. ACDIR
|
||
|
||
Modifying the Macro Search Path: ‘dirlist’
|
||
..........................................
|
||
|
||
There is a third mechanism for customizing the search path. If a
|
||
‘dirlist’ file exists in ACDIR, then that file is assumed to contain a
|
||
list of directory patterns, one per line. ‘aclocal’ expands these
|
||
patterns to directory names, and adds them to the search list _after_
|
||
all other directories. ‘dirlist’ entries may use shell wildcards such
|
||
as ‘*’, ‘?’, or ‘[...]’.
|
||
|
||
For example, suppose ‘ACDIR/dirlist’ contains the following:
|
||
|
||
/test1
|
||
/test2
|
||
/test3*
|
||
|
||
and that ‘aclocal’ was called with the ‘-I /foo -I /bar’ options. Then,
|
||
the search path would be
|
||
|
||
1. ‘/foo’
|
||
2. ‘/bar’
|
||
3. ACDIR-APIVERSION
|
||
4. ACDIR
|
||
5. ‘/test1’
|
||
6. ‘/test2’
|
||
|
||
and all directories with path names starting with ‘/test3’.
|
||
|
||
If the ‘--system-acdir=DIR’ option is used, then ‘aclocal’ will
|
||
search for the ‘dirlist’ file in DIR; but remember the warnings above
|
||
against the use of ‘--system-acdir’.
|
||
|
||
‘dirlist’ is useful in the following situation: suppose that
|
||
‘automake’ version ‘1.11.2’ is installed with ‘--prefix=/usr’ by the
|
||
system vendor. Thus, the default search directories are
|
||
|
||
1. ‘/usr/share/aclocal-1.11/’
|
||
2. ‘/usr/share/aclocal/’
|
||
|
||
However, suppose further that many packages have been manually
|
||
installed on the system, with $prefix=/usr/local, as is typical. In
|
||
that case, many of these “extra” ‘.m4’ files are in
|
||
‘/usr/local/share/aclocal’. The only way to force ‘/usr/bin/aclocal’ to
|
||
find these “extra” ‘.m4’ files is to always call ‘aclocal -I
|
||
/usr/local/share/aclocal’. This is inconvenient. With ‘dirlist’, one
|
||
may create a file ‘/usr/share/aclocal/dirlist’ containing only the
|
||
single line
|
||
|
||
/usr/local/share/aclocal
|
||
|
||
Now, the “default” search path on the affected system is
|
||
|
||
1. ‘/usr/share/aclocal-1.11/’
|
||
2. ‘/usr/share/aclocal/’
|
||
3. ‘/usr/local/share/aclocal/’
|
||
|
||
without the need for ‘-I’ options; ‘-I’ options can be reserved for
|
||
project-specific needs (‘my-source-dir/m4/’), rather than using it to
|
||
work around local system-dependent tool installation directories.
|
||
|
||
Similarly, ‘dirlist’ can be handy if you have installed a local copy
|
||
of Automake in your account and want ‘aclocal’ to look for macros
|
||
installed at other places on the system.
|
||
|
||
Modifying the Macro Search Path: ‘ACLOCAL_PATH’
|
||
...............................................
|
||
|
||
The fourth and last mechanism to customize the macro search path is also
|
||
the simplest. Any directory included in the colon-separated environment
|
||
variable ‘ACLOCAL_PATH’ is added to the search path and takes precedence
|
||
over system directories (including those found via ‘dirlist’), with the
|
||
exception of the versioned directory ACDIR-APIVERSION (*note Macro
|
||
Search Path::). However, directories passed via ‘-I’ will take
|
||
precedence over directories in ‘ACLOCAL_PATH’.
|
||
|
||
Also note that, if the ‘--install’ option is used, any ‘.m4’ file
|
||
containing a required macro that is found in a directory listed in
|
||
‘ACLOCAL_PATH’ will be installed locally. In this case, serial numbers
|
||
in ‘.m4’ are honored too, *note Serials::.
|
||
|
||
Conversely to ‘dirlist’, ‘ACLOCAL_PATH’ is useful if you are using a
|
||
global copy of Automake and want ‘aclocal’ to look for macros somewhere
|
||
under your home directory.
|
||
|
||
Planned future incompatibilities
|
||
................................
|
||
|
||
The order in which the directories in the macro search path are
|
||
currently looked up is confusing and/or suboptimal in various aspects,
|
||
and is probably going to be changed in the future Automake release. In
|
||
particular, directories in ‘ACLOCAL_PATH’ and ‘ACDIR’ might end up
|
||
taking precedence over ‘ACDIR-APIVERSION’, and directories in
|
||
‘ACDIR/dirlist’ might end up taking precedence over ‘ACDIR’. _This is a
|
||
possible future incompatibility!_
|
||
|
||
|
||
File: automake.info, Node: Extending aclocal, Next: Local Macros, Prev: Macro Search Path, Up: aclocal Invocation
|
||
|
||
6.3.3 Writing your own aclocal macros
|
||
-------------------------------------
|
||
|
||
The ‘aclocal’ program doesn’t have any built-in knowledge of any macros,
|
||
so it is easy to extend it with your own macros.
|
||
|
||
This can be used by libraries that want to supply their own Autoconf
|
||
macros for use by other programs. For instance, the ‘gettext’ library
|
||
supplies a macro ‘AM_GNU_GETTEXT’ that should be used by any package
|
||
using ‘gettext’. When the library is installed, it installs this macro
|
||
so that ‘aclocal’ will find it.
|
||
|
||
A macro file’s name should end in ‘.m4’. Such files should be
|
||
installed in ‘$(datadir)/aclocal’. This is as simple as writing:
|
||
|
||
aclocaldir = $(datadir)/aclocal
|
||
aclocal_DATA = mymacro.m4 myothermacro.m4
|
||
|
||
Please do use ‘$(datadir)/aclocal’, and not something based on the
|
||
result of ‘aclocal --print-ac-dir’ (*note Hard-Coded Install Paths::,
|
||
for arguments). It might also be helpful to suggest to the user to add
|
||
the ‘$(datadir)/aclocal’ directory to his ‘ACLOCAL_PATH’ variable (*note
|
||
ACLOCAL_PATH::) so that ‘aclocal’ will find the ‘.m4’ files installed by
|
||
your package automatically.
|
||
|
||
A file of macros should be a series of properly quoted ‘AC_DEFUN’’s
|
||
(*note (autoconf)Macro Definitions::). The ‘aclocal’ programs also
|
||
understands ‘AC_REQUIRE’ (*note (autoconf)Prerequisite Macros::), so it
|
||
is safe to put each macro in a separate file. Each file should have no
|
||
side effects but macro definitions. Especially, any call to ‘AC_PREREQ’
|
||
should be done inside the defined macro, not at the beginning of the
|
||
file.
|
||
|
||
Starting with Automake 1.8, ‘aclocal’ will warn about all underquoted
|
||
calls to ‘AC_DEFUN’. We realize this will annoy a lot of people,
|
||
because ‘aclocal’ was not so strict in the past and many third party
|
||
macros are underquoted; and we have to apologize for this temporary
|
||
inconvenience. The reason we have to be stricter is that a future
|
||
implementation of ‘aclocal’ (*note Future of aclocal::) will have to
|
||
temporarily include all of these third party ‘.m4’ files, maybe several
|
||
times, including even files that are not actually needed. Doing so
|
||
should alleviate many problems of the current implementation, however it
|
||
requires a stricter style from the macro authors. Hopefully it is easy
|
||
to revise the existing macros. For instance,
|
||
|
||
# bad style
|
||
AC_PREREQ(2.68)
|
||
AC_DEFUN(AX_FOOBAR,
|
||
[AC_REQUIRE([AX_SOMETHING])dnl
|
||
AX_FOO
|
||
AX_BAR
|
||
])
|
||
|
||
should be rewritten as
|
||
|
||
AC_DEFUN([AX_FOOBAR],
|
||
[AC_PREREQ([2.68])dnl
|
||
AC_REQUIRE([AX_SOMETHING])dnl
|
||
AX_FOO
|
||
AX_BAR
|
||
])
|
||
|
||
Wrapping the ‘AC_PREREQ’ call inside the macro ensures that Autoconf
|
||
2.68 will not be required if ‘AX_FOOBAR’ is not actually used. Most
|
||
importantly, quoting the first argument of ‘AC_DEFUN’ allows the macro
|
||
to be redefined or included twice (otherwise this first argument would
|
||
be expanded during the second definition). For consistency we like to
|
||
quote even arguments such as ‘2.68’ that do not require it.
|
||
|
||
If you have been directed here by the ‘aclocal’ diagnostic but are
|
||
not the maintainer of the implicated macro, you will want to contact the
|
||
maintainer of that macro. Please make sure you have the latest version
|
||
of the macro and that the problem hasn’t already been reported before
|
||
doing so: people tend to work faster when they aren’t flooded by mails.
|
||
|
||
Another situation where ‘aclocal’ is commonly used is to manage
|
||
macros that are used locally by the package, *note Local Macros::.
|
||
|
||
|
||
File: automake.info, Node: Local Macros, Next: Serials, Prev: Extending aclocal, Up: aclocal Invocation
|
||
|
||
6.3.4 Handling Local Macros
|
||
---------------------------
|
||
|
||
Feature tests offered by Autoconf do not cover all needs. People often
|
||
have to supplement existing tests with their own macros, or with
|
||
third-party macros.
|
||
|
||
There are two ways to organize custom macros in a package.
|
||
|
||
The first possibility (the historical practice) is to list all your
|
||
macros in ‘acinclude.m4’. This file will be included in ‘aclocal.m4’
|
||
when you run ‘aclocal’, and its macro(s) will henceforth be visible to
|
||
‘autoconf’. However if it contains numerous macros, it will rapidly
|
||
become difficult to maintain, and it will be almost impossible to share
|
||
macros between packages.
|
||
|
||
The second possibility, which we do recommend, is to write each macro
|
||
in its own file and gather all these files in a directory. This
|
||
directory is usually called ‘m4/’. Then it’s enough to update
|
||
‘configure.ac’ by adding a proper call to ‘AC_CONFIG_MACRO_DIRS’:
|
||
|
||
AC_CONFIG_MACRO_DIRS([m4])
|
||
|
||
‘aclocal’ will then take care of automatically adding ‘m4/’ to its
|
||
search path for m4 files.
|
||
|
||
When ‘aclocal’ is run, it will build an ‘aclocal.m4’ that
|
||
‘m4_include’s any file from ‘m4/’ that defines a required macro. Macros
|
||
not found locally will still be searched in system-wide directories, as
|
||
explained in *note Macro Search Path::.
|
||
|
||
Custom macros should be distributed for the same reason that
|
||
‘configure.ac’ is: so that other people have all the sources of your
|
||
package if they want to work on it. Actually, this distribution happens
|
||
automatically because all ‘m4_include’d files are distributed.
|
||
|
||
However there is no consensus on the distribution of third-party
|
||
macros that your package may use. Many libraries install their own
|
||
macro in the system-wide ‘aclocal’ directory (*note Extending
|
||
aclocal::). For instance, Guile ships with a file called ‘guile.m4’
|
||
that contains the macro ‘GUILE_FLAGS’ that can be used to define setup
|
||
compiler and linker flags appropriate for using Guile. Using
|
||
‘GUILE_FLAGS’ in ‘configure.ac’ will cause ‘aclocal’ to copy ‘guile.m4’
|
||
into ‘aclocal.m4’, but as ‘guile.m4’ is not part of the project, it will
|
||
not be distributed. Technically, that means a user who needs to rebuild
|
||
‘aclocal.m4’ will have to install Guile first. This is probably OK, if
|
||
Guile already is a requirement to build the package. However, if Guile
|
||
is only an optional feature, or if your package might run on
|
||
architectures where Guile cannot be installed, this requirement will
|
||
hinder development. An easy solution is to copy such third-party macros
|
||
in your local ‘m4/’ directory so they get distributed.
|
||
|
||
Since Automake 1.10, ‘aclocal’ offers the option ‘--install’ to copy
|
||
these system-wide third-party macros in your local macro directory,
|
||
helping to solve the above problem.
|
||
|
||
With this setup, system-wide macros will be copied to ‘m4/’ the first
|
||
time you run ‘aclocal’. Then the locally installed macros will have
|
||
precedence over the system-wide installed macros each time ‘aclocal’ is
|
||
run again.
|
||
|
||
One reason why you should keep ‘--install’ in the flags even after
|
||
the first run is that when you later edit ‘configure.ac’ and depend on a
|
||
new macro, this macro will be installed in your ‘m4/’ automatically.
|
||
Another one is that serial numbers (*note Serials::) can be used to
|
||
update the macros in your source tree automatically when new system-wide
|
||
versions are installed. A serial number should be a single line of the
|
||
form
|
||
|
||
#serial NNN
|
||
|
||
where NNN contains only digits and dots. It should appear in the M4
|
||
file before any macro definition. It is a good practice to maintain a
|
||
serial number for each macro you distribute, even if you do not use the
|
||
‘--install’ option of ‘aclocal’: this allows other people to use it.
|
||
|
||
|
||
File: automake.info, Node: Serials, Next: Future of aclocal, Prev: Local Macros, Up: aclocal Invocation
|
||
|
||
6.3.5 Serial Numbers
|
||
--------------------
|
||
|
||
Because third-party macros defined in ‘*.m4’ files are naturally shared
|
||
between multiple projects, some people like to version them. This makes
|
||
it easier to tell which of two M4 files is newer. Since at least 1996,
|
||
the tradition is to use a ‘#serial’ line for this.
|
||
|
||
A serial number should be a single line of the form
|
||
|
||
# serial VERSION
|
||
|
||
where VERSION is a version number containing only digits and dots.
|
||
Usually people use a single integer, and they increment it each time
|
||
they change the macro (hence the name of “serial”). Such a line should
|
||
appear in the M4 file before any macro definition.
|
||
|
||
The ‘#’ must be the first character on the line, and it is OK to have
|
||
extra words after the version, as in
|
||
|
||
#serial VERSION GARBAGE
|
||
|
||
Normally these serial numbers are completely ignored by ‘aclocal’ and
|
||
‘autoconf’, like any genuine comment. However when using ‘aclocal’’s
|
||
‘--install’ feature, these serial numbers will modify the way ‘aclocal’
|
||
selects the macros to install in the package: if two files with the same
|
||
basename exist in your search path, and if at least one of them uses a
|
||
‘#serial’ line, ‘aclocal’ will ignore the file that has the older
|
||
‘#serial’ line (or the file that has none).
|
||
|
||
Note that a serial number applies to a whole M4 file, not to any
|
||
macro it contains. A file can contains multiple macros, but only one
|
||
serial.
|
||
|
||
Here is a use case that illustrates the use of ‘--install’ and its
|
||
interaction with serial numbers. Let’s assume we maintain a package
|
||
called MyPackage, the ‘configure.ac’ of which requires a third-party
|
||
macro ‘AX_THIRD_PARTY’ defined in ‘/usr/share/aclocal/thirdparty.m4’ as
|
||
follows:
|
||
|
||
# serial 1
|
||
AC_DEFUN([AX_THIRD_PARTY], [...])
|
||
|
||
MyPackage uses an ‘m4/’ directory to store local macros as explained
|
||
in *note Local Macros::, and has
|
||
|
||
AC_CONFIG_MACRO_DIRS([m4])
|
||
|
||
in its ‘configure.ac’.
|
||
|
||
Initially the ‘m4/’ directory is empty. The first time we run
|
||
‘aclocal --install’, it will notice that
|
||
|
||
• ‘configure.ac’ uses ‘AX_THIRD_PARTY’
|
||
• No local macros define ‘AX_THIRD_PARTY’
|
||
• ‘/usr/share/aclocal/thirdparty.m4’ defines ‘AX_THIRD_PARTY’ with
|
||
serial 1.
|
||
|
||
Because ‘/usr/share/aclocal/thirdparty.m4’ is a system-wide macro and
|
||
‘aclocal’ was given the ‘--install’ option, it will copy this file in
|
||
‘m4/thirdparty.m4’, and output an ‘aclocal.m4’ that contains
|
||
‘m4_include([m4/thirdparty.m4])’.
|
||
|
||
The next time ‘aclocal --install’ is run, something different
|
||
happens. ‘aclocal’ notices that
|
||
|
||
• ‘configure.ac’ uses ‘AX_THIRD_PARTY’
|
||
• ‘m4/thirdparty.m4’ defines ‘AX_THIRD_PARTY’ with serial 1.
|
||
• ‘/usr/share/aclocal/thirdparty.m4’ defines ‘AX_THIRD_PARTY’ with
|
||
serial 1.
|
||
|
||
Because both files have the same serial number, ‘aclocal’ uses the first
|
||
it found in its search path order (*note Macro Search Path::).
|
||
‘aclocal’ therefore ignores ‘/usr/share/aclocal/thirdparty.m4’ and
|
||
outputs an ‘aclocal.m4’ that contains ‘m4_include([m4/thirdparty.m4])’.
|
||
|
||
Local directories specified with ‘-I’ are always searched before
|
||
system-wide directories, so a local file will always be preferred to the
|
||
system-wide file in case of equal serial numbers.
|
||
|
||
Now suppose the system-wide third-party macro is changed. This can
|
||
happen if the package installing this macro is updated. Let’s suppose
|
||
the new macro has serial number 2. The next time ‘aclocal --install’ is
|
||
run the situation is the following:
|
||
|
||
• ‘configure.ac’ uses ‘AX_THIRD_PARTY’
|
||
• ‘m4/thirdparty.m4’ defines ‘AX_THIRD_PARTY’ with serial 1.
|
||
• ‘/usr/share/aclocal/thirdparty.m4’ defines ‘AX_THIRD_PARTY’ with
|
||
serial 2.
|
||
|
||
When ‘aclocal’ sees a greater serial number, it immediately forgets
|
||
anything it knows from files that have the same basename and a smaller
|
||
serial number. So after it has found ‘/usr/share/aclocal/thirdparty.m4’
|
||
with serial 2, ‘aclocal’ will proceed as if it had never seen
|
||
‘m4/thirdparty.m4’. This brings us back to a situation similar to that
|
||
at the beginning of our example, where no local file defined the macro.
|
||
‘aclocal’ will install the new version of the macro in
|
||
‘m4/thirdparty.m4’, in this case overriding the old version. MyPackage
|
||
just had its macro updated as a side effect of running ‘aclocal’.
|
||
|
||
If you are leery of letting ‘aclocal’ update your local macro, you
|
||
can run ‘aclocal --diff’ to review the changes ‘aclocal --install’ would
|
||
perform on these macros.
|
||
|
||
Finally, note that the ‘--force’ option of ‘aclocal’ has absolutely
|
||
no effect on the files installed by ‘--install’. For instance, if you
|
||
have modified your local macros, do not expect ‘--install --force’ to
|
||
replace the local macros by their system-wide versions. If you want to
|
||
do so, simply erase the local macros you want to revert, and run
|
||
‘aclocal --install’.
|
||
|
||
|
||
File: automake.info, Node: Future of aclocal, Prev: Serials, Up: aclocal Invocation
|
||
|
||
6.3.6 The Future of ‘aclocal’
|
||
-----------------------------
|
||
|
||
‘aclocal’ is expected to disappear. This feature really should not be
|
||
offered by Automake. Automake should focus on generating ‘Makefile’s;
|
||
dealing with M4 macros really is Autoconf’s job. The fact that some
|
||
people install Automake just to use ‘aclocal’, but do not use ‘automake’
|
||
otherwise is an indication of how that feature is misplaced.
|
||
|
||
The new implementation will probably be done slightly differently.
|
||
For instance, it could enforce the ‘m4/’-style layout discussed in *note
|
||
Local Macros::.
|
||
|
||
We have no idea when and how this will happen. This has been
|
||
discussed several times in the past, but someone still has to commit to
|
||
that non-trivial task.
|
||
|
||
From the user point of view, ‘aclocal’’s removal might turn out to be
|
||
painful. There is a simple precaution that you may take to make that
|
||
switch more seamless: never call ‘aclocal’ yourself. Keep this guy
|
||
under the exclusive control of ‘autoreconf’ and Automake’s rebuild
|
||
rules. Hopefully you won’t need to worry about things breaking, when
|
||
‘aclocal’ disappears, because everything will have been taken care of.
|
||
If otherwise you used to call ‘aclocal’ directly yourself or from some
|
||
script, you will quickly notice the change.
|
||
|
||
Many packages come with a script called ‘bootstrap’ or ‘autogen.sh’,
|
||
that will just call ‘aclocal’, ‘libtoolize’, ‘gettextize’ or
|
||
‘autopoint’, ‘autoconf’, ‘autoheader’, and ‘automake’ in the right
|
||
order. Actually this is precisely what ‘autoreconf’ can do for you. If
|
||
your package has such a ‘bootstrap’ or ‘autogen.sh’ script, consider
|
||
using ‘autoreconf’. That should simplify its logic a lot (less things
|
||
to maintain, yum!), it’s even likely you will not need the script
|
||
anymore, and more to the point you will not call ‘aclocal’ directly
|
||
anymore.
|
||
|
||
For the time being, third-party packages should continue to install
|
||
public macros into ‘/usr/share/aclocal/’. If ‘aclocal’ is replaced by
|
||
another tool it might make sense to rename the directory, but supporting
|
||
‘/usr/share/aclocal/’ for backward compatibility should be really easy
|
||
provided all macros are properly written (*note Extending aclocal::).
|
||
|
||
|
||
File: automake.info, Node: Macros, Prev: aclocal Invocation, Up: configure
|
||
|
||
6.4 Autoconf macros supplied with Automake
|
||
==========================================
|
||
|
||
Automake ships with several Autoconf macros that you can use from your
|
||
‘configure.ac’. When you use one of them it will be included by
|
||
‘aclocal’ in ‘aclocal.m4’.
|
||
|
||
* Menu:
|
||
|
||
* Public Macros:: Macros that you can use.
|
||
* Obsolete Macros:: Macros that will soon be removed.
|
||
* Private Macros:: Macros that you should not use.
|
||
|
||
|
||
File: automake.info, Node: Public Macros, Next: Obsolete Macros, Up: Macros
|
||
|
||
6.4.1 Public Macros
|
||
-------------------
|
||
|
||
‘AM_INIT_AUTOMAKE([OPTIONS])’
|
||
Runs many macros required for proper operation of the generated
|
||
Makefiles.
|
||
|
||
Today, ‘AM_INIT_AUTOMAKE’ is called with a single argument: a
|
||
space-separated list of Automake options that should be applied to
|
||
every ‘Makefile.am’ in the tree. The effect is as if each option
|
||
were listed in ‘AUTOMAKE_OPTIONS’ (*note Options::).
|
||
|
||
This macro can also be called in another, _deprecated_ form:
|
||
‘AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])’. In this form,
|
||
there are two required arguments: the package and the version
|
||
number. This usage is mostly obsolete because the PACKAGE and
|
||
VERSION can be obtained from Autoconf’s ‘AC_INIT’ macro. However,
|
||
differently from what happens for ‘AC_INIT’ invocations, this
|
||
‘AM_INIT_AUTOMAKE’ invocation supports shell variables’ expansions
|
||
in the ‘PACKAGE’ and ‘VERSION’ arguments (which otherwise defaults,
|
||
respectively, to the ‘PACKAGE_TARNAME’ and ‘PACKAGE_VERSION’
|
||
defined via the ‘AC_INIT’ invocation; *note The ‘AC_INIT’ macro:
|
||
(autoconf)AC_INIT.); and this can be still be useful in some
|
||
selected situations. Our hope is that future Autoconf versions
|
||
will improve their support for package versions defined dynamically
|
||
at configure runtime; when (and if) this happens, support for the
|
||
two-args ‘AM_INIT_AUTOMAKE’ invocation will likely be removed from
|
||
Automake.
|
||
|
||
If your ‘configure.ac’ has:
|
||
|
||
AC_INIT([src/foo.c])
|
||
AM_INIT_AUTOMAKE([mumble], [1.5])
|
||
|
||
you should modernize it as follows:
|
||
|
||
AC_INIT([mumble], [1.5])
|
||
AC_CONFIG_SRCDIR([src/foo.c])
|
||
AM_INIT_AUTOMAKE
|
||
|
||
Note that if you’re upgrading your ‘configure.ac’ from an earlier
|
||
version of Automake, it is not always correct to simply move the
|
||
package and version arguments from ‘AM_INIT_AUTOMAKE’ directly to
|
||
‘AC_INIT’, as in the example above. The first argument to
|
||
‘AC_INIT’ should be the name of your package (e.g., ‘GNU
|
||
Automake’), not the tarball name (e.g., ‘automake’) that you used
|
||
to pass to ‘AM_INIT_AUTOMAKE’. Autoconf tries to derive a tarball
|
||
name from the package name, which should work for most but not all
|
||
package names. (If it doesn’t work for yours, you can use the
|
||
four-argument form of ‘AC_INIT’ to provide the tarball name
|
||
explicitly).
|
||
|
||
By default this macro ‘AC_DEFINE’’s ‘PACKAGE’ and ‘VERSION’. This
|
||
can be avoided by passing the ‘no-define’ option (*note List of
|
||
Automake options::):
|
||
AM_INIT_AUTOMAKE([no-define ...])
|
||
|
||
‘AM_PATH_LISPDIR’
|
||
Searches for the program ‘emacs’, and, if found, sets the output
|
||
variable ‘lispdir’ to the full path to Emacs’ site-lisp directory.
|
||
|
||
Note that this test assumes the ‘emacs’ found to be a version that
|
||
supports Emacs Lisp (such as GNU Emacs or XEmacs). Other emacsen
|
||
can cause this test to hang (some, like old versions of MicroEmacs,
|
||
start up in interactive mode, requiring ‘C-x C-c’ to exit, which is
|
||
hardly obvious for a non-emacs user). In most cases, however, you
|
||
should be able to use ‘C-c’ to kill the test. In order to avoid
|
||
problems, you can set ‘EMACS’ to “no” in the environment, or use
|
||
the ‘--with-lispdir’ option to ‘configure’ to explicitly set the
|
||
correct path (if you’re sure you have an ‘emacs’ that supports
|
||
Emacs Lisp).
|
||
|
||
‘AM_PROG_AR([ACT-IF-FAIL])’
|
||
You must use this macro when you use the archiver in your project,
|
||
if you want support for unusual archivers such as Microsoft ‘lib’.
|
||
The content of the optional argument is executed if the archiver
|
||
interface is not recognized; the default action is to abort
|
||
configure with an error message.
|
||
|
||
‘AM_PROG_AS’
|
||
Use this macro when you have assembly code in your project. This
|
||
will choose the assembler for you (by default the C compiler) and
|
||
set ‘CCAS’, and will also set ‘CCASFLAGS’ if required.
|
||
|
||
‘AM_PROG_CC_C_O’
|
||
This is an obsolescent macro that checks that the C compiler
|
||
supports the ‘-c’ and ‘-o’ options together. Note that, since
|
||
Automake 1.14, the ‘AC_PROG_CC’ is rewritten to implement such
|
||
checks itself, and thus the explicit use of ‘AM_PROG_CC_C_O’ should
|
||
no longer be required.
|
||
|
||
‘AM_PROG_LEX’
|
||
Like ‘AC_PROG_LEX’ (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.), but uses the ‘missing’ script on
|
||
systems that do not have ‘lex’. HP-UX 10 is one such system.
|
||
|
||
‘AM_PROG_GCJ’
|
||
This macro finds the ‘gcj’ program or causes an error. It sets
|
||
‘GCJ’ and ‘GCJFLAGS’. ‘gcj’ is the Java front-end to the GNU
|
||
Compiler Collection.
|
||
|
||
‘AM_PROG_UPC([COMPILER-SEARCH-LIST])’
|
||
Find a compiler for Unified Parallel C and define the ‘UPC’
|
||
variable. The default COMPILER-SEARCH-LIST is ‘upcc upc’. This
|
||
macro will abort ‘configure’ if no Unified Parallel C compiler is
|
||
found.
|
||
|
||
‘AM_MISSING_PROG(NAME, PROGRAM)’
|
||
Find a maintainer tool PROGRAM and define the NAME environment
|
||
variable with its location. If PROGRAM is not detected, then NAME
|
||
will instead invoke the ‘missing’ script, in order to give useful
|
||
advice to the user about the missing maintainer tool. *Note
|
||
maintainer-mode::, for more information on when the ‘missing’
|
||
script is appropriate.
|
||
|
||
‘AM_SILENT_RULES’
|
||
Control the machinery for less verbose build output (*note Automake
|
||
Silent Rules::).
|
||
|
||
‘AM_WITH_DMALLOC’
|
||
Add support for the Dmalloc package (http://dmalloc.com/). If the
|
||
user runs ‘configure’ with ‘--with-dmalloc’, then define
|
||
‘WITH_DMALLOC’ and add ‘-ldmalloc’ to ‘LIBS’.
|
||
|
||
|
||
File: automake.info, Node: Obsolete Macros, Next: Private Macros, Prev: Public Macros, Up: Macros
|
||
|
||
6.4.2 Obsolete Macros
|
||
---------------------
|
||
|
||
Although using some of the following macros was required in past
|
||
releases, you should not use any of them in new code. _All these macros
|
||
will be removed in the next major Automake version_; if you are still
|
||
using them, running ‘autoupdate’ should adjust your ‘configure.ac’
|
||
automatically (*note Using ‘autoupdate’ to Modernize ‘configure.ac’:
|
||
(autoconf)autoupdate Invocation.). _Do it NOW!_
|
||
|
||
‘AM_PROG_MKDIR_P’
|
||
|
||
From Automake 1.8 to 1.9.6 this macro used to define the output
|
||
variable ‘mkdir_p’ to one of ‘mkdir -p’, ‘install-sh -d’, or
|
||
‘mkinstalldirs’.
|
||
|
||
Nowadays Autoconf provides a similar functionality with
|
||
‘AC_PROG_MKDIR_P’ (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.), however this defines the output
|
||
variable ‘MKDIR_P’ instead. In case you are still using the
|
||
‘AM_PROG_MKDIR_P’ macro in your ‘configure.ac’, or its provided
|
||
variable ‘$(mkdir_p)’ in your ‘Makefile.am’, you are advised to
|
||
switch ASAP to the more modern Autoconf-provided interface instead;
|
||
both the macro and the variable might be removed in a future major
|
||
Automake release.
|
||
|
||
|
||
File: automake.info, Node: Private Macros, Prev: Obsolete Macros, Up: Macros
|
||
|
||
6.4.3 Private Macros
|
||
--------------------
|
||
|
||
The following macros are private macros you should not call directly.
|
||
They are called by the other public macros when appropriate. Do not
|
||
rely on them, as they might be changed in a future version. Consider
|
||
them as implementation details; or better, do not consider them at all:
|
||
skip this section!
|
||
|
||
‘_AM_DEPENDENCIES’
|
||
‘AM_SET_DEPDIR’
|
||
‘AM_DEP_TRACK’
|
||
‘AM_OUTPUT_DEPENDENCY_COMMANDS’
|
||
These macros are used to implement Automake’s automatic dependency
|
||
tracking scheme. They are called automatically by Automake when
|
||
required, and there should be no need to invoke them manually.
|
||
|
||
‘AM_MAKE_INCLUDE’
|
||
This macro is used to discover how the user’s ‘make’ handles
|
||
‘include’ statements. This macro is automatically invoked when
|
||
needed; there should be no need to invoke it manually.
|
||
|
||
‘AM_PROG_INSTALL_STRIP’
|
||
This is used to find a version of ‘install’ that can be used to
|
||
strip a program at installation time. This macro is automatically
|
||
included when required.
|
||
|
||
‘AM_SANITY_CHECK’
|
||
This checks to make sure that a file created in the build directory
|
||
is newer than a file in the source directory. This can fail on
|
||
systems where the clock is set incorrectly. This macro is
|
||
automatically run from ‘AM_INIT_AUTOMAKE’.
|
||
|
||
|
||
File: automake.info, Node: Directories, Next: Programs, Prev: configure, Up: Top
|
||
|
||
7 Directories
|
||
*************
|
||
|
||
For simple projects that distribute all files in the same directory it
|
||
is enough to have a single ‘Makefile.am’ that builds everything in
|
||
place.
|
||
|
||
In larger projects, it is common to organize files in different
|
||
directories, in a tree. For example, there could be a directory for the
|
||
program’s source, one for the testsuite, and one for the documentation;
|
||
or, for very large projects, there could be one directory per program,
|
||
per library or per module.
|
||
|
||
The traditional approach is to build these subdirectories
|
||
recursively, employing _make recursion_: each directory contains its own
|
||
‘Makefile’, and when ‘make’ is run from the top-level directory, it
|
||
enters each subdirectory in turn, and invokes there a new ‘make’
|
||
instance to build the directory’s contents.
|
||
|
||
Because this approach is very widespread, Automake offers built-in
|
||
support for it. However, it is worth nothing that the use of make
|
||
recursion has its own serious issues and drawbacks, and that it’s well
|
||
possible to have packages with a multi directory layout that make little
|
||
or no use of such recursion (examples of such packages are GNU Bison and
|
||
GNU Automake itself); see also the *note Alternative:: section below.
|
||
|
||
* Menu:
|
||
|
||
* Subdirectories:: Building subdirectories recursively
|
||
* Conditional Subdirectories:: Conditionally not building directories
|
||
* Alternative:: Subdirectories without recursion
|
||
* Subpackages:: Nesting packages
|
||
|
||
|
||
File: automake.info, Node: Subdirectories, Next: Conditional Subdirectories, Up: Directories
|
||
|
||
7.1 Recursing subdirectories
|
||
============================
|
||
|
||
In packages using make recursion, the top level ‘Makefile.am’ must tell
|
||
Automake which subdirectories are to be built. This is done via the
|
||
‘SUBDIRS’ variable.
|
||
|
||
The ‘SUBDIRS’ variable holds a list of subdirectories in which
|
||
building of various sorts can occur. The rules for many targets (e.g.,
|
||
‘all’) in the generated ‘Makefile’ will run commands both locally and in
|
||
all specified subdirectories. Note that the directories listed in
|
||
‘SUBDIRS’ are not required to contain ‘Makefile.am’s; only ‘Makefile’s
|
||
(after configuration). This allows inclusion of libraries from packages
|
||
that do not use Automake (such as ‘gettext’; see also *note Third-Party
|
||
Makefiles::).
|
||
|
||
In packages that use subdirectories, the top-level ‘Makefile.am’ is
|
||
often very short. For instance, here is the ‘Makefile.am’ from the GNU
|
||
Hello distribution:
|
||
|
||
EXTRA_DIST = BUGS ChangeLog.O README-alpha
|
||
SUBDIRS = doc intl po src tests
|
||
|
||
When Automake invokes ‘make’ in a subdirectory, it uses the value of
|
||
the ‘MAKE’ variable. It passes the value of the variable ‘AM_MAKEFLAGS’
|
||
to the ‘make’ invocation; this can be set in ‘Makefile.am’ if there are
|
||
flags you must always pass to ‘make’.
|
||
|
||
The directories mentioned in ‘SUBDIRS’ are usually direct children of
|
||
the current directory, each subdirectory containing its own
|
||
‘Makefile.am’ with a ‘SUBDIRS’ pointing to deeper subdirectories.
|
||
Automake can be used to construct packages of arbitrary depth this way.
|
||
|
||
By default, Automake generates ‘Makefiles’ that work depth-first in
|
||
postfix order: the subdirectories are built before the current
|
||
directory. However, it is possible to change this ordering. You can do
|
||
this by putting ‘.’ into ‘SUBDIRS’. For instance, putting ‘.’ first
|
||
will cause a prefix ordering of directories.
|
||
|
||
Using
|
||
|
||
SUBDIRS = lib src . test
|
||
|
||
will cause ‘lib/’ to be built before ‘src/’, then the current directory
|
||
will be built, finally the ‘test/’ directory will be built. It is
|
||
customary to arrange test directories to be built after everything else
|
||
since they are meant to test what has been constructed.
|
||
|
||
In addition to the built-in recursive targets defined by Automake
|
||
(‘all’, ‘check’, etc.), the developer can also define his own recursive
|
||
targets. That is done by passing the names of such targets as arguments
|
||
to the m4 macro ‘AM_EXTRA_RECURSIVE_TARGETS’ in ‘configure.ac’.
|
||
Automake generates rules to handle the recursion for such targets; and
|
||
the developer can define real actions for them by defining corresponding
|
||
‘-local’ targets.
|
||
|
||
% cat configure.ac
|
||
AC_INIT([pkg-name], [1.0]
|
||
AM_INIT_AUTOMAKE
|
||
AM_EXTRA_RECURSIVE_TARGETS([foo])
|
||
AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile])
|
||
AC_OUTPUT
|
||
% cat Makefile.am
|
||
SUBDIRS = sub
|
||
foo-local:
|
||
@echo This will be run by "make foo".
|
||
% cat sub/Makefile.am
|
||
SUBDIRS = src
|
||
% cat sub/src/Makefile.am
|
||
foo-local:
|
||
@echo This too will be run by a "make foo" issued either in
|
||
@echo the 'sub/src/' directory, the 'sub/' directory, or the
|
||
@echo top-level directory.
|
||
|
||
|
||
File: automake.info, Node: Conditional Subdirectories, Next: Alternative, Prev: Subdirectories, Up: Directories
|
||
|
||
7.2 Conditional Subdirectories
|
||
==============================
|
||
|
||
It is possible to define the ‘SUBDIRS’ variable conditionally if, like
|
||
in the case of GNU Inetutils, you want to only build a subset of the
|
||
entire package.
|
||
|
||
To illustrate how this works, let’s assume we have two directories
|
||
‘src/’ and ‘opt/’. ‘src/’ should always be built, but we want to decide
|
||
in ‘configure’ whether ‘opt/’ will be built or not. (For this example
|
||
we will assume that ‘opt/’ should be built when the variable ‘$want_opt’
|
||
was set to ‘yes’.)
|
||
|
||
Running ‘make’ should thus recurse into ‘src/’ always, and then maybe
|
||
in ‘opt/’.
|
||
|
||
However ‘make dist’ should always recurse into both ‘src/’ and
|
||
‘opt/’. Because ‘opt/’ should be distributed even if it is not needed
|
||
in the current configuration. This means ‘opt/Makefile’ should be
|
||
created _unconditionally_.
|
||
|
||
There are two ways to setup a project like this. You can use
|
||
Automake conditionals (*note Conditionals::) or use Autoconf ‘AC_SUBST’
|
||
variables (*note Setting Output Variables: (autoconf)Setting Output
|
||
Variables.). Using Automake conditionals is the preferred solution.
|
||
Before we illustrate these two possibilities, let’s introduce
|
||
‘DIST_SUBDIRS’.
|
||
|
||
* Menu:
|
||
|
||
* SUBDIRS vs DIST_SUBDIRS:: Two sets of directories
|
||
* Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories
|
||
* Subdirectories with AC_SUBST:: Another way for conditional recursion
|
||
* Unconfigured Subdirectories:: Not even creating a ‘Makefile’
|
||
|
||
|
||
File: automake.info, Node: SUBDIRS vs DIST_SUBDIRS, Next: Subdirectories with AM_CONDITIONAL, Up: Conditional Subdirectories
|
||
|
||
7.2.1 ‘SUBDIRS’ vs. ‘DIST_SUBDIRS’
|
||
----------------------------------
|
||
|
||
Automake considers two sets of directories, defined by the variables
|
||
‘SUBDIRS’ and ‘DIST_SUBDIRS’.
|
||
|
||
‘SUBDIRS’ contains the subdirectories of the current directory that
|
||
must be built (*note Subdirectories::). It must be defined manually;
|
||
Automake will never guess a directory is to be built. As we will see in
|
||
the next two sections, it is possible to define it conditionally so that
|
||
some directory will be omitted from the build.
|
||
|
||
‘DIST_SUBDIRS’ is used in rules that need to recurse in all
|
||
directories, even those that have been conditionally left out of the
|
||
build. Recall our example where we may not want to build subdirectory
|
||
‘opt/’, but yet we want to distribute it? This is where ‘DIST_SUBDIRS’
|
||
comes into play: ‘opt’ may not appear in ‘SUBDIRS’, but it must appear
|
||
in ‘DIST_SUBDIRS’.
|
||
|
||
Precisely, ‘DIST_SUBDIRS’ is used by ‘make maintainer-clean’, ‘make
|
||
distclean’ and ‘make dist’. All other recursive rules use ‘SUBDIRS’.
|
||
|
||
If ‘SUBDIRS’ is defined conditionally using Automake conditionals,
|
||
Automake will define ‘DIST_SUBDIRS’ automatically from the possible
|
||
values of ‘SUBDIRS’ in all conditions.
|
||
|
||
If ‘SUBDIRS’ contains ‘AC_SUBST’ variables, ‘DIST_SUBDIRS’ will not
|
||
be defined correctly because Automake does not know the possible values
|
||
of these variables. In this case ‘DIST_SUBDIRS’ needs to be defined
|
||
manually.
|
||
|
||
|
||
File: automake.info, Node: Subdirectories with AM_CONDITIONAL, Next: Subdirectories with AC_SUBST, Prev: SUBDIRS vs DIST_SUBDIRS, Up: Conditional Subdirectories
|
||
|
||
7.2.2 Subdirectories with ‘AM_CONDITIONAL’
|
||
------------------------------------------
|
||
|
||
‘configure’ should output the ‘Makefile’ for each directory and define a
|
||
condition into which ‘opt/’ should be built.
|
||
|
||
...
|
||
AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
|
||
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
|
||
...
|
||
|
||
Then ‘SUBDIRS’ can be defined in the top-level ‘Makefile.am’ as
|
||
follows.
|
||
|
||
if COND_OPT
|
||
MAYBE_OPT = opt
|
||
endif
|
||
SUBDIRS = src $(MAYBE_OPT)
|
||
|
||
As you can see, running ‘make’ will rightly recurse into ‘src/’ and
|
||
maybe ‘opt/’.
|
||
|
||
As you can’t see, running ‘make dist’ will recurse into both ‘src/’
|
||
and ‘opt/’ directories because ‘make dist’, unlike ‘make all’, doesn’t
|
||
use the ‘SUBDIRS’ variable. It uses the ‘DIST_SUBDIRS’ variable.
|
||
|
||
In this case Automake will define ‘DIST_SUBDIRS = src opt’
|
||
automatically because it knows that ‘MAYBE_OPT’ can contain ‘opt’ in
|
||
some condition.
|
||
|
||
|
||
File: automake.info, Node: Subdirectories with AC_SUBST, Next: Unconfigured Subdirectories, Prev: Subdirectories with AM_CONDITIONAL, Up: Conditional Subdirectories
|
||
|
||
7.2.3 Subdirectories with ‘AC_SUBST’
|
||
------------------------------------
|
||
|
||
Another possibility is to define ‘MAYBE_OPT’ from ‘./configure’ using
|
||
‘AC_SUBST’:
|
||
|
||
...
|
||
if test "$want_opt" = yes; then
|
||
MAYBE_OPT=opt
|
||
else
|
||
MAYBE_OPT=
|
||
fi
|
||
AC_SUBST([MAYBE_OPT])
|
||
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
|
||
...
|
||
|
||
In this case the top-level ‘Makefile.am’ should look as follows.
|
||
|
||
SUBDIRS = src $(MAYBE_OPT)
|
||
DIST_SUBDIRS = src opt
|
||
|
||
The drawback is that since Automake cannot guess what the possible
|
||
values of ‘MAYBE_OPT’ are, it is necessary to define ‘DIST_SUBDIRS’.
|
||
|
||
|
||
File: automake.info, Node: Unconfigured Subdirectories, Prev: Subdirectories with AC_SUBST, Up: Conditional Subdirectories
|
||
|
||
7.2.4 Unconfigured Subdirectories
|
||
---------------------------------
|
||
|
||
The semantics of ‘DIST_SUBDIRS’ are often misunderstood by some users
|
||
that try to _configure and build_ subdirectories conditionally. Here by
|
||
configuring we mean creating the ‘Makefile’ (it might also involve
|
||
running a nested ‘configure’ script: this is a costly operation that
|
||
explains why people want to do it conditionally, but only the ‘Makefile’
|
||
is relevant to the discussion).
|
||
|
||
The above examples all assume that every ‘Makefile’ is created, even
|
||
in directories that are not going to be built. The simple reason is
|
||
that we want ‘make dist’ to distribute even the directories that are not
|
||
being built (e.g., platform-dependent code), hence ‘make dist’ must
|
||
recurse into the subdirectory, hence this directory must be configured
|
||
and appear in ‘DIST_SUBDIRS’.
|
||
|
||
Building packages that do not configure every subdirectory is a
|
||
tricky business, and we do not recommend it to the novice as it is easy
|
||
to produce an incomplete tarball by mistake. We will not discuss this
|
||
topic in depth here, yet for the adventurous here are a few rules to
|
||
remember.
|
||
|
||
• ‘SUBDIRS’ should always be a subset of ‘DIST_SUBDIRS’.
|
||
|
||
It makes little sense to have a directory in ‘SUBDIRS’ that is not
|
||
in ‘DIST_SUBDIRS’. Think of the former as a way to tell which
|
||
directories listed in the latter should be built.
|
||
• Any directory listed in ‘DIST_SUBDIRS’ and ‘SUBDIRS’ must be
|
||
configured.
|
||
|
||
I.e., the ‘Makefile’ must exists or the recursive ‘make’ rules will
|
||
not be able to process the directory.
|
||
• Any configured directory must be listed in ‘DIST_SUBDIRS’.
|
||
|
||
So that the cleaning rules remove the generated ‘Makefile’s. It
|
||
would be correct to see ‘DIST_SUBDIRS’ as a variable that lists all
|
||
the directories that have been configured.
|
||
|
||
In order to prevent recursion in some unconfigured directory you must
|
||
therefore ensure that this directory does not appear in ‘DIST_SUBDIRS’
|
||
(and ‘SUBDIRS’). For instance, if you define ‘SUBDIRS’ conditionally
|
||
using ‘AC_SUBST’ and do not define ‘DIST_SUBDIRS’ explicitly, it will be
|
||
default to ‘$(SUBDIRS)’; another possibility is to force ‘DIST_SUBDIRS =
|
||
$(SUBDIRS)’.
|
||
|
||
Of course, directories that are omitted from ‘DIST_SUBDIRS’ will not
|
||
be distributed unless you make other arrangements for this to happen
|
||
(for instance, always running ‘make dist’ in a configuration where all
|
||
directories are known to appear in ‘DIST_SUBDIRS’; or writing a
|
||
‘dist-hook’ target to distribute these directories).
|
||
|
||
In few packages, unconfigured directories are not even expected to be
|
||
distributed. Although these packages do not require the aforementioned
|
||
extra arrangements, there is another pitfall. If the name of a
|
||
directory appears in ‘SUBDIRS’ or ‘DIST_SUBDIRS’, ‘automake’ will make
|
||
sure the directory exists. Consequently ‘automake’ cannot be run on
|
||
such a distribution when one directory has been omitted. One way to
|
||
avoid this check is to use the ‘AC_SUBST’ method to declare conditional
|
||
directories; since ‘automake’ does not know the values of ‘AC_SUBST’
|
||
variables it cannot ensure the corresponding directory exists.
|
||
|
||
|
||
File: automake.info, Node: Alternative, Next: Subpackages, Prev: Conditional Subdirectories, Up: Directories
|
||
|
||
7.3 An Alternative Approach to Subdirectories
|
||
=============================================
|
||
|
||
If you’ve ever read Peter Miller’s excellent paper, Recursive Make
|
||
Considered Harmful (http://miller.emu.id.au/pmiller/books/rmch/), the
|
||
preceding sections on the use of make recursion will probably come as
|
||
unwelcome advice. For those who haven’t read the paper, Miller’s main
|
||
thesis is that recursive ‘make’ invocations are both slow and
|
||
error-prone.
|
||
|
||
Automake provides sufficient cross-directory support (1) to enable
|
||
you to write a single ‘Makefile.am’ for a complex multi-directory
|
||
package.
|
||
|
||
By default an installable file specified in a subdirectory will have
|
||
its directory name stripped before installation. For instance, in this
|
||
example, the header file will be installed as ‘$(includedir)/stdio.h’:
|
||
|
||
include_HEADERS = inc/stdio.h
|
||
|
||
However, the ‘nobase_’ prefix can be used to circumvent this path
|
||
stripping. In this example, the header file will be installed as
|
||
‘$(includedir)/sys/types.h’:
|
||
|
||
nobase_include_HEADERS = sys/types.h
|
||
|
||
‘nobase_’ should be specified first when used in conjunction with
|
||
either ‘dist_’ or ‘nodist_’ (*note Fine-grained Distribution Control::).
|
||
For instance:
|
||
|
||
nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg
|
||
|
||
Finally, note that a variable using the ‘nobase_’ prefix can often be
|
||
replaced by several variables, one for each destination directory (*note
|
||
Uniform::). For instance, the last example could be rewritten as
|
||
follows:
|
||
|
||
imagesdir = $(pkgdatadir)/images
|
||
soundsdir = $(pkgdatadir)/sounds
|
||
dist_images_DATA = images/vortex.pgm
|
||
dist_sounds_DATA = sounds/whirl.ogg
|
||
|
||
This latter syntax makes it possible to change one destination directory
|
||
without changing the layout of the source tree.
|
||
|
||
Currently, ‘nobase_*_LTLIBRARIES’ are the only exception to this
|
||
rule, in that there is no particular installation order guarantee for an
|
||
otherwise equivalent set of variables without ‘nobase_’ prefix.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) We believe. This work is new and there are probably warts.
|
||
*Note Introduction::, for information on reporting bugs.
|
||
|
||
|
||
File: automake.info, Node: Subpackages, Prev: Alternative, Up: Directories
|
||
|
||
7.4 Nesting Packages
|
||
====================
|
||
|
||
In the GNU Build System, packages can be nested to arbitrary depth.
|
||
This means that a package can embed other packages with their own
|
||
‘configure’, ‘Makefile’s, etc.
|
||
|
||
These other packages should just appear as subdirectories of their
|
||
parent package. They must be listed in ‘SUBDIRS’ like other ordinary
|
||
directories. However the subpackage’s ‘Makefile’s should be output by
|
||
its own ‘configure’ script, not by the parent’s ‘configure’. This is
|
||
achieved using the ‘AC_CONFIG_SUBDIRS’ Autoconf macro (*note
|
||
AC_CONFIG_SUBDIRS: (autoconf)Subdirectories.).
|
||
|
||
Here is an example package for an ‘arm’ program that links with a
|
||
‘hand’ library that is a nested package in subdirectory ‘hand/’.
|
||
|
||
‘arm’’s ‘configure.ac’:
|
||
|
||
AC_INIT([arm], [1.0])
|
||
AC_CONFIG_AUX_DIR([.])
|
||
AM_INIT_AUTOMAKE
|
||
AC_PROG_CC
|
||
AC_CONFIG_FILES([Makefile])
|
||
# Call hand's ./configure script recursively.
|
||
AC_CONFIG_SUBDIRS([hand])
|
||
AC_OUTPUT
|
||
|
||
‘arm’’s ‘Makefile.am’:
|
||
|
||
# Build the library in the hand subdirectory first.
|
||
SUBDIRS = hand
|
||
|
||
# Include hand's header when compiling this directory.
|
||
AM_CPPFLAGS = -I$(srcdir)/hand
|
||
|
||
bin_PROGRAMS = arm
|
||
arm_SOURCES = arm.c
|
||
# link with the hand library.
|
||
arm_LDADD = hand/libhand.a
|
||
|
||
Now here is ‘hand’’s ‘hand/configure.ac’:
|
||
|
||
AC_INIT([hand], [1.2])
|
||
AC_CONFIG_AUX_DIR([.])
|
||
AM_INIT_AUTOMAKE
|
||
AC_PROG_CC
|
||
AM_PROG_AR
|
||
AC_PROG_RANLIB
|
||
AC_CONFIG_FILES([Makefile])
|
||
AC_OUTPUT
|
||
|
||
and its ‘hand/Makefile.am’:
|
||
|
||
lib_LIBRARIES = libhand.a
|
||
libhand_a_SOURCES = hand.c
|
||
|
||
When ‘make dist’ is run from the top-level directory it will create
|
||
an archive ‘arm-1.0.tar.gz’ that contains the ‘arm’ code as well as the
|
||
‘hand’ subdirectory. This package can be built and installed like any
|
||
ordinary package, with the usual ‘./configure && make && make install’
|
||
sequence (the ‘hand’ subpackage will be built and installed by the
|
||
process).
|
||
|
||
When ‘make dist’ is run from the hand directory, it will create a
|
||
self-contained ‘hand-1.2.tar.gz’ archive. So although it appears to be
|
||
embedded in another package, it can still be used separately.
|
||
|
||
The purpose of the ‘AC_CONFIG_AUX_DIR([.])’ instruction is to force
|
||
Automake and Autoconf to search for auxiliary scripts in the current
|
||
directory. For instance, this means that there will be two copies of
|
||
‘install-sh’: one in the top-level of the ‘arm’ package, and another one
|
||
in the ‘hand/’ subdirectory for the ‘hand’ package.
|
||
|
||
The historical default is to search for these auxiliary scripts in
|
||
the parent directory and the grandparent directory. So if the
|
||
‘AC_CONFIG_AUX_DIR([.])’ line was removed from ‘hand/configure.ac’, that
|
||
subpackage would share the auxiliary script of the ‘arm’ package. This
|
||
may looks like a gain in size (a few kilobytes), but it is actually a
|
||
loss of modularity as the ‘hand’ subpackage is no longer self-contained
|
||
(‘make dist’ in the subdirectory will not work anymore).
|
||
|
||
Packages that do not use Automake need more work to be integrated
|
||
this way. *Note Third-Party Makefiles::.
|
||
|
||
|
||
File: automake.info, Node: Programs, Next: Other Objects, Prev: Directories, Up: Top
|
||
|
||
8 Building Programs and Libraries
|
||
*********************************
|
||
|
||
A large part of Automake’s functionality is dedicated to making it easy
|
||
to build programs and libraries.
|
||
|
||
* Menu:
|
||
|
||
* A Program:: Building a program
|
||
* A Library:: Building a library
|
||
* A Shared Library:: Building a Libtool library
|
||
* Program and Library Variables:: Variables controlling program and
|
||
library builds
|
||
* Default _SOURCES:: Default source files
|
||
* LIBOBJS:: Special handling for LIBOBJS and ALLOCA
|
||
* Program Variables:: Variables used when building a program
|
||
* Yacc and Lex:: Yacc and Lex support
|
||
* C++ Support:: Compiling C++ sources
|
||
* Objective C Support:: Compiling Objective C sources
|
||
* Objective C++ Support:: Compiling Objective C++ sources
|
||
* Unified Parallel C Support:: Compiling Unified Parallel C sources
|
||
* Assembly Support:: Compiling assembly sources
|
||
* Fortran 77 Support:: Compiling Fortran 77 sources
|
||
* Fortran 9x Support:: Compiling Fortran 9x sources
|
||
* Java Support with gcj:: Compiling Java sources using gcj
|
||
* Vala Support:: Compiling Vala sources
|
||
* Support for Other Languages:: Compiling other languages
|
||
* Dependencies:: Automatic dependency tracking
|
||
* EXEEXT:: Support for executable extensions
|
||
|
||
|
||
File: automake.info, Node: A Program, Next: A Library, Up: Programs
|
||
|
||
8.1 Building a program
|
||
======================
|
||
|
||
In order to build a program, you need to tell Automake which sources are
|
||
part of it, and which libraries it should be linked with.
|
||
|
||
This section also covers conditional compilation of sources or
|
||
programs. Most of the comments about these also apply to libraries
|
||
(*note A Library::) and libtool libraries (*note A Shared Library::).
|
||
|
||
* Menu:
|
||
|
||
* Program Sources:: Defining program sources
|
||
* Linking:: Linking with libraries or extra objects
|
||
* Conditional Sources:: Handling conditional sources
|
||
* Conditional Programs:: Building a program conditionally
|
||
|
||
|
||
File: automake.info, Node: Program Sources, Next: Linking, Up: A Program
|
||
|
||
8.1.1 Defining program sources
|
||
------------------------------
|
||
|
||
In a directory containing source that gets built into a program (as
|
||
opposed to a library or a script), the ‘PROGRAMS’ primary is used.
|
||
Programs can be installed in ‘bindir’, ‘sbindir’, ‘libexecdir’,
|
||
‘pkglibexecdir’, or not at all (‘noinst_’). They can also be built only
|
||
for ‘make check’, in which case the prefix is ‘check_’.
|
||
|
||
For instance:
|
||
|
||
bin_PROGRAMS = hello
|
||
|
||
In this simple case, the resulting ‘Makefile.in’ will contain code to
|
||
generate a program named ‘hello’.
|
||
|
||
Associated with each program are several assisting variables that are
|
||
named after the program. These variables are all optional, and have
|
||
reasonable defaults. Each variable, its use, and default is spelled out
|
||
below; we use the “hello” example throughout.
|
||
|
||
The variable ‘hello_SOURCES’ is used to specify which source files
|
||
get built into an executable:
|
||
|
||
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
|
||
|
||
This causes each mentioned ‘.c’ file to be compiled into the
|
||
corresponding ‘.o’. Then all are linked to produce ‘hello’.
|
||
|
||
If ‘hello_SOURCES’ is not specified, then it defaults to the single
|
||
file ‘hello.c’ (*note Default _SOURCES::).
|
||
|
||
Multiple programs can be built in a single directory. Multiple
|
||
programs can share a single source file, which must be listed in each
|
||
‘_SOURCES’ definition.
|
||
|
||
Header files listed in a ‘_SOURCES’ definition will be included in
|
||
the distribution but otherwise ignored. In case it isn’t obvious, you
|
||
should not include the header file generated by ‘configure’ in a
|
||
‘_SOURCES’ variable; this file should not be distributed. Lex (‘.l’)
|
||
and Yacc (‘.y’) files can also be listed; see *note Yacc and Lex::.
|
||
|
||
|
||
File: automake.info, Node: Linking, Next: Conditional Sources, Prev: Program Sources, Up: A Program
|
||
|
||
8.1.2 Linking the program
|
||
-------------------------
|
||
|
||
If you need to link against libraries that are not found by ‘configure’,
|
||
you can use ‘LDADD’ to do so. This variable is used to specify
|
||
additional objects or libraries to link with; it is inappropriate for
|
||
specifying specific linker flags, you should use ‘AM_LDFLAGS’ for this
|
||
purpose.
|
||
|
||
Sometimes, multiple programs are built in one directory but do not
|
||
share the same link-time requirements. In this case, you can use the
|
||
‘PROG_LDADD’ variable (where PROG is the name of the program as it
|
||
appears in some ‘_PROGRAMS’ variable, and usually written in lowercase)
|
||
to override ‘LDADD’. If this variable exists for a given program, then
|
||
that program is not linked using ‘LDADD’.
|
||
|
||
For instance, in GNU cpio, ‘pax’, ‘cpio’ and ‘mt’ are linked against
|
||
the library ‘libcpio.a’. However, ‘rmt’ is built in the same directory,
|
||
and has no such link requirement. Also, ‘mt’ and ‘rmt’ are only built
|
||
on certain architectures. Here is what cpio’s ‘src/Makefile.am’ looks
|
||
like (abridged):
|
||
|
||
bin_PROGRAMS = cpio pax $(MT)
|
||
libexec_PROGRAMS = $(RMT)
|
||
EXTRA_PROGRAMS = mt rmt
|
||
|
||
LDADD = ../lib/libcpio.a $(INTLLIBS)
|
||
rmt_LDADD =
|
||
|
||
cpio_SOURCES = ...
|
||
pax_SOURCES = ...
|
||
mt_SOURCES = ...
|
||
rmt_SOURCES = ...
|
||
|
||
‘PROG_LDADD’ is inappropriate for passing program-specific linker
|
||
flags (except for ‘-l’, ‘-L’, ‘-dlopen’ and ‘-dlpreopen’). So, use the
|
||
‘PROG_LDFLAGS’ variable for this purpose.
|
||
|
||
It is also occasionally useful to have a program depend on some other
|
||
target that is not actually part of that program. This can be done
|
||
using either the ‘PROG_DEPENDENCIES’ or the ‘EXTRA_PROG_DEPENDENCIES’
|
||
variable. Each program depends on the contents both variables, but no
|
||
further interpretation is done.
|
||
|
||
Since these dependencies are associated to the link rule used to
|
||
create the programs they should normally list files used by the link
|
||
command. That is ‘*.$(OBJEXT)’, ‘*.a’, or ‘*.la’ files. In rare cases
|
||
you may need to add other kinds of files such as linker scripts, but
|
||
_listing a source file in ‘_DEPENDENCIES’ is wrong_. If some source
|
||
file needs to be built before all the components of a program are built,
|
||
consider using the ‘BUILT_SOURCES’ variable instead (*note Sources::).
|
||
|
||
If ‘PROG_DEPENDENCIES’ is not supplied, it is computed by Automake.
|
||
The automatically-assigned value is the contents of ‘PROG_LDADD’, with
|
||
most configure substitutions, ‘-l’, ‘-L’, ‘-dlopen’ and ‘-dlpreopen’
|
||
options removed. The configure substitutions that are left in are only
|
||
‘$(LIBOBJS)’ and ‘$(ALLOCA)’; these are left because it is known that
|
||
they will not cause an invalid value for ‘PROG_DEPENDENCIES’ to be
|
||
generated.
|
||
|
||
*note Conditional Sources:: shows a situation where ‘_DEPENDENCIES’
|
||
may be used.
|
||
|
||
The ‘EXTRA_PROG_DEPENDENCIES’ may be useful for cases where you
|
||
merely want to augment the ‘automake’-generated ‘PROG_DEPENDENCIES’
|
||
rather than replacing it.
|
||
|
||
We recommend that you avoid using ‘-l’ options in ‘LDADD’ or
|
||
‘PROG_LDADD’ when referring to libraries built by your package.
|
||
Instead, write the file name of the library explicitly as in the above
|
||
‘cpio’ example. Use ‘-l’ only to list third-party libraries. If you
|
||
follow this rule, the default value of ‘PROG_DEPENDENCIES’ will list all
|
||
your local libraries and omit the other ones.
|
||
|
||
|
||
File: automake.info, Node: Conditional Sources, Next: Conditional Programs, Prev: Linking, Up: A Program
|
||
|
||
8.1.3 Conditional compilation of sources
|
||
----------------------------------------
|
||
|
||
You can’t put a configure substitution (e.g., ‘@FOO@’ or ‘$(FOO)’ where
|
||
‘FOO’ is defined via ‘AC_SUBST’) into a ‘_SOURCES’ variable. The reason
|
||
for this is a bit hard to explain, but suffice to say that it simply
|
||
won’t work. Automake will give an error if you try to do this.
|
||
|
||
Fortunately there are two other ways to achieve the same result. One
|
||
is to use configure substitutions in ‘_LDADD’ variables, the other is to
|
||
use an Automake conditional.
|
||
|
||
Conditional Compilation using ‘_LDADD’ Substitutions
|
||
....................................................
|
||
|
||
Automake must know all the source files that could possibly go into a
|
||
program, even if not all the files are built in every circumstance. Any
|
||
files that are only conditionally built should be listed in the
|
||
appropriate ‘EXTRA_’ variable. For instance, if ‘hello-linux.c’ or
|
||
‘hello-generic.c’ were conditionally included in ‘hello’, the
|
||
‘Makefile.am’ would contain:
|
||
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello-common.c
|
||
EXTRA_hello_SOURCES = hello-linux.c hello-generic.c
|
||
hello_LDADD = $(HELLO_SYSTEM)
|
||
hello_DEPENDENCIES = $(HELLO_SYSTEM)
|
||
|
||
You can then setup the ‘$(HELLO_SYSTEM)’ substitution from
|
||
‘configure.ac’:
|
||
|
||
...
|
||
case $host in
|
||
*linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
|
||
*) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
|
||
esac
|
||
AC_SUBST([HELLO_SYSTEM])
|
||
...
|
||
|
||
In this case, the variable ‘HELLO_SYSTEM’ should be replaced by
|
||
either ‘hello-linux.o’ or ‘hello-generic.o’, and added to both
|
||
‘hello_DEPENDENCIES’ and ‘hello_LDADD’ in order to be built and linked
|
||
in.
|
||
|
||
Conditional Compilation using Automake Conditionals
|
||
...................................................
|
||
|
||
An often simpler way to compile source files conditionally is to use
|
||
Automake conditionals. For instance, you could use this ‘Makefile.am’
|
||
construct to build the same ‘hello’ example:
|
||
|
||
bin_PROGRAMS = hello
|
||
if LINUX
|
||
hello_SOURCES = hello-linux.c hello-common.c
|
||
else
|
||
hello_SOURCES = hello-generic.c hello-common.c
|
||
endif
|
||
|
||
In this case, ‘configure.ac’ should setup the ‘LINUX’ conditional
|
||
using ‘AM_CONDITIONAL’ (*note Conditionals::).
|
||
|
||
When using conditionals like this you don’t need to use the ‘EXTRA_’
|
||
variable, because Automake will examine the contents of each variable to
|
||
construct the complete list of source files.
|
||
|
||
If your program uses a lot of files, you will probably prefer a
|
||
conditional ‘+=’.
|
||
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello-common.c
|
||
if LINUX
|
||
hello_SOURCES += hello-linux.c
|
||
else
|
||
hello_SOURCES += hello-generic.c
|
||
endif
|
||
|
||
|
||
File: automake.info, Node: Conditional Programs, Prev: Conditional Sources, Up: A Program
|
||
|
||
8.1.4 Conditional compilation of programs
|
||
-----------------------------------------
|
||
|
||
Sometimes it is useful to determine the programs that are to be built at
|
||
configure time. For instance, GNU ‘cpio’ only builds ‘mt’ and ‘rmt’
|
||
under special circumstances. The means to achieve conditional
|
||
compilation of programs are the same you can use to compile source files
|
||
conditionally: substitutions or conditionals.
|
||
|
||
Conditional Programs using ‘configure’ Substitutions
|
||
....................................................
|
||
|
||
In this case, you must notify Automake of all the programs that can
|
||
possibly be built, but at the same time cause the generated
|
||
‘Makefile.in’ to use the programs specified by ‘configure’. This is
|
||
done by having ‘configure’ substitute values into each ‘_PROGRAMS’
|
||
definition, while listing all optionally built programs in
|
||
‘EXTRA_PROGRAMS’.
|
||
|
||
bin_PROGRAMS = cpio pax $(MT)
|
||
libexec_PROGRAMS = $(RMT)
|
||
EXTRA_PROGRAMS = mt rmt
|
||
|
||
As explained in *note EXEEXT::, Automake will rewrite ‘bin_PROGRAMS’,
|
||
‘libexec_PROGRAMS’, and ‘EXTRA_PROGRAMS’, appending ‘$(EXEEXT)’ to each
|
||
binary. Obviously it cannot rewrite values obtained at run-time through
|
||
‘configure’ substitutions, therefore you should take care of appending
|
||
‘$(EXEEXT)’ yourself, as in ‘AC_SUBST([MT], ['mt${EXEEXT}'])’.
|
||
|
||
Conditional Programs using Automake Conditionals
|
||
................................................
|
||
|
||
You can also use Automake conditionals (*note Conditionals::) to select
|
||
programs to be built. In this case you don’t have to worry about
|
||
‘$(EXEEXT)’ or ‘EXTRA_PROGRAMS’.
|
||
|
||
bin_PROGRAMS = cpio pax
|
||
if WANT_MT
|
||
bin_PROGRAMS += mt
|
||
endif
|
||
if WANT_RMT
|
||
libexec_PROGRAMS = rmt
|
||
endif
|
||
|
||
|
||
File: automake.info, Node: A Library, Next: A Shared Library, Prev: A Program, Up: Programs
|
||
|
||
8.2 Building a library
|
||
======================
|
||
|
||
Building a library is much like building a program. In this case, the
|
||
name of the primary is ‘LIBRARIES’. Libraries can be installed in
|
||
‘libdir’ or ‘pkglibdir’.
|
||
|
||
*Note A Shared Library::, for information on how to build shared
|
||
libraries using libtool and the ‘LTLIBRARIES’ primary.
|
||
|
||
Each ‘_LIBRARIES’ variable is a list of the libraries to be built.
|
||
For instance, to create a library named ‘libcpio.a’, but not install it,
|
||
you would write:
|
||
|
||
noinst_LIBRARIES = libcpio.a
|
||
libcpio_a_SOURCES = ...
|
||
|
||
The sources that go into a library are determined exactly as they are
|
||
for programs, via the ‘_SOURCES’ variables. Note that the library name
|
||
is canonicalized (*note Canonicalization::), so the ‘_SOURCES’ variable
|
||
corresponding to ‘libcpio.a’ is ‘libcpio_a_SOURCES’, not
|
||
‘libcpio.a_SOURCES’.
|
||
|
||
Extra objects can be added to a library using the ‘LIBRARY_LIBADD’
|
||
variable. This should be used for objects determined by ‘configure’.
|
||
Again from ‘cpio’:
|
||
|
||
libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA)
|
||
|
||
In addition, sources for extra objects that will not exist until
|
||
configure-time must be added to the ‘BUILT_SOURCES’ variable (*note
|
||
Sources::).
|
||
|
||
Building a static library is done by compiling all object files, then
|
||
by invoking ‘$(AR) $(ARFLAGS)’ followed by the name of the library and
|
||
the list of objects, and finally by calling ‘$(RANLIB)’ on that library.
|
||
You should call ‘AC_PROG_RANLIB’ from your ‘configure.ac’ to define
|
||
‘RANLIB’ (Automake will complain otherwise). You should also call
|
||
‘AM_PROG_AR’ to define ‘AR’, in order to support unusual archivers such
|
||
as Microsoft lib. ‘ARFLAGS’ will default to ‘cru’; you can override
|
||
this variable by setting it in your ‘Makefile.am’ or by ‘AC_SUBST’ing it
|
||
from your ‘configure.ac’. You can override the ‘AR’ variable by
|
||
defining a per-library ‘maude_AR’ variable (*note Program and Library
|
||
Variables::).
|
||
|
||
Be careful when selecting library components conditionally. Because
|
||
building an empty library is not portable, you should ensure that any
|
||
library always contains at least one object.
|
||
|
||
To use a static library when building a program, add it to ‘LDADD’
|
||
for this program. In the following example, the program ‘cpio’ is
|
||
statically linked with the library ‘libcpio.a’.
|
||
|
||
noinst_LIBRARIES = libcpio.a
|
||
libcpio_a_SOURCES = ...
|
||
|
||
bin_PROGRAMS = cpio
|
||
cpio_SOURCES = cpio.c ...
|
||
cpio_LDADD = libcpio.a
|
||
|
||
|
||
File: automake.info, Node: A Shared Library, Next: Program and Library Variables, Prev: A Library, Up: Programs
|
||
|
||
8.3 Building a Shared Library
|
||
=============================
|
||
|
||
Building shared libraries portably is a relatively complex matter. For
|
||
this reason, GNU Libtool (*note Introduction: (libtool)Top.) was created
|
||
to help build shared libraries in a platform-independent way.
|
||
|
||
* Menu:
|
||
|
||
* Libtool Concept:: Introducing Libtool
|
||
* Libtool Libraries:: Declaring Libtool Libraries
|
||
* Conditional Libtool Libraries:: Building Libtool Libraries Conditionally
|
||
* Conditional Libtool Sources:: Choosing Library Sources Conditionally
|
||
* Libtool Convenience Libraries:: Building Convenience Libtool Libraries
|
||
* Libtool Modules:: Building Libtool Modules
|
||
* Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
|
||
* LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA)
|
||
* Libtool Issues:: Common Issues Related to Libtool’s Use
|
||
|
||
|
||
File: automake.info, Node: Libtool Concept, Next: Libtool Libraries, Up: A Shared Library
|
||
|
||
8.3.1 The Libtool Concept
|
||
-------------------------
|
||
|
||
Libtool abstracts shared and static libraries into a unified concept
|
||
henceforth called “libtool libraries”. Libtool libraries are files
|
||
using the ‘.la’ suffix, and can designate a static library, a shared
|
||
library, or maybe both. Their exact nature cannot be determined until
|
||
‘./configure’ is run: not all platforms support all kinds of libraries,
|
||
and users can explicitly select which libraries should be built.
|
||
(However the package’s maintainers can tune the default, *note The
|
||
‘AC_PROG_LIBTOOL’ macro: (libtool)AC_PROG_LIBTOOL.)
|
||
|
||
Because object files for shared and static libraries must be compiled
|
||
differently, libtool is also used during compilation. Object files
|
||
built by libtool are called “libtool objects”: these are files using the
|
||
‘.lo’ suffix. Libtool libraries are built from these libtool objects.
|
||
|
||
You should not assume anything about the structure of ‘.la’ or ‘.lo’
|
||
files and how libtool constructs them: this is libtool’s concern, and
|
||
the last thing one wants is to learn about libtool’s guts. However the
|
||
existence of these files matters, because they are used as targets and
|
||
dependencies in ‘Makefile’s rules when building libtool libraries.
|
||
There are situations where you may have to refer to these, for instance
|
||
when expressing dependencies for building source files conditionally
|
||
(*note Conditional Libtool Sources::).
|
||
|
||
People considering writing a plug-in system, with dynamically loaded
|
||
modules, should look into ‘libltdl’: libtool’s dlopening library (*note
|
||
Using libltdl: (libtool)Using libltdl.). This offers a portable
|
||
dlopening facility to load libtool libraries dynamically, and can also
|
||
achieve static linking where unavoidable.
|
||
|
||
Before we discuss how to use libtool with Automake in details, it
|
||
should be noted that the libtool manual also has a section about how to
|
||
use Automake with libtool (*note Using Automake with Libtool:
|
||
(libtool)Using Automake.).
|
||
|
||
|
||
File: automake.info, Node: Libtool Libraries, Next: Conditional Libtool Libraries, Prev: Libtool Concept, Up: A Shared Library
|
||
|
||
8.3.2 Building Libtool Libraries
|
||
--------------------------------
|
||
|
||
Automake uses libtool to build libraries declared with the ‘LTLIBRARIES’
|
||
primary. Each ‘_LTLIBRARIES’ variable is a list of libtool libraries to
|
||
build. For instance, to create a libtool library named ‘libgettext.la’,
|
||
and install it in ‘libdir’, write:
|
||
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c gettext.h ...
|
||
|
||
Automake predefines the variable ‘pkglibdir’, so you can use
|
||
‘pkglib_LTLIBRARIES’ to install libraries in ‘$(libdir)/@PACKAGE@/’.
|
||
|
||
If ‘gettext.h’ is a public header file that needs to be installed in
|
||
order for people to use the library, it should be declared using a
|
||
‘_HEADERS’ variable, not in ‘libgettext_la_SOURCES’. Headers listed in
|
||
the latter should be internal headers that are not part of the public
|
||
interface.
|
||
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c ...
|
||
include_HEADERS = gettext.h ...
|
||
|
||
A package can build and install such a library along with other
|
||
programs that use it. This dependency should be specified using
|
||
‘LDADD’. The following example builds a program named ‘hello’ that is
|
||
linked with ‘libgettext.la’.
|
||
|
||
lib_LTLIBRARIES = libgettext.la
|
||
libgettext_la_SOURCES = gettext.c ...
|
||
|
||
bin_PROGRAMS = hello
|
||
hello_SOURCES = hello.c ...
|
||
hello_LDADD = libgettext.la
|
||
|
||
Whether ‘hello’ is statically or dynamically linked with ‘libgettext.la’
|
||
is not yet known: this will depend on the configuration of libtool and
|
||
the capabilities of the host.
|
||
|
||
|
||
File: automake.info, Node: Conditional Libtool Libraries, Next: Conditional Libtool Sources, Prev: Libtool Libraries, Up: A Shared Library
|
||
|
||
8.3.3 Building Libtool Libraries Conditionally
|
||
----------------------------------------------
|
||
|
||
Like conditional programs (*note Conditional Programs::), there are two
|
||
main ways to build conditional libraries: using Automake conditionals or
|
||
using Autoconf ‘AC_SUBST’itutions.
|
||
|
||
The important implementation detail you have to be aware of is that
|
||
the place where a library will be installed matters to libtool: it needs
|
||
to be indicated _at link-time_ using the ‘-rpath’ option.
|
||
|
||
For libraries whose destination directory is known when Automake
|
||
runs, Automake will automatically supply the appropriate ‘-rpath’ option
|
||
to libtool. This is the case for libraries listed explicitly in some
|
||
installable ‘_LTLIBRARIES’ variables such as ‘lib_LTLIBRARIES’.
|
||
|
||
However, for libraries determined at configure time (and thus
|
||
mentioned in ‘EXTRA_LTLIBRARIES’), Automake does not know the final
|
||
installation directory. For such libraries you must add the ‘-rpath’
|
||
option to the appropriate ‘_LDFLAGS’ variable by hand.
|
||
|
||
The examples below illustrate the differences between these two
|
||
methods.
|
||
|
||
Here is an example where ‘WANTEDLIBS’ is an ‘AC_SUBST’ed variable set
|
||
at ‘./configure’-time to either ‘libfoo.la’, ‘libbar.la’, both, or none.
|
||
Although ‘$(WANTEDLIBS)’ appears in the ‘lib_LTLIBRARIES’, Automake
|
||
cannot guess it relates to ‘libfoo.la’ or ‘libbar.la’ at the time it
|
||
creates the link rule for these two libraries. Therefore the ‘-rpath’
|
||
argument must be explicitly supplied.
|
||
|
||
EXTRA_LTLIBRARIES = libfoo.la libbar.la
|
||
lib_LTLIBRARIES = $(WANTEDLIBS)
|
||
libfoo_la_SOURCES = foo.c ...
|
||
libfoo_la_LDFLAGS = -rpath '$(libdir)'
|
||
libbar_la_SOURCES = bar.c ...
|
||
libbar_la_LDFLAGS = -rpath '$(libdir)'
|
||
|
||
Here is how the same ‘Makefile.am’ would look using Automake
|
||
conditionals named ‘WANT_LIBFOO’ and ‘WANT_LIBBAR’. Now Automake is
|
||
able to compute the ‘-rpath’ setting itself, because it’s clear that
|
||
both libraries will end up in ‘$(libdir)’ if they are installed.
|
||
|
||
lib_LTLIBRARIES =
|
||
if WANT_LIBFOO
|
||
lib_LTLIBRARIES += libfoo.la
|
||
endif
|
||
if WANT_LIBBAR
|
||
lib_LTLIBRARIES += libbar.la
|
||
endif
|
||
libfoo_la_SOURCES = foo.c ...
|
||
libbar_la_SOURCES = bar.c ...
|
||
|
||
|
||
File: automake.info, Node: Conditional Libtool Sources, Next: Libtool Convenience Libraries, Prev: Conditional Libtool Libraries, Up: A Shared Library
|
||
|
||
8.3.4 Libtool Libraries with Conditional Sources
|
||
------------------------------------------------
|
||
|
||
Conditional compilation of sources in a library can be achieved in the
|
||
same way as conditional compilation of sources in a program (*note
|
||
Conditional Sources::). The only difference is that ‘_LIBADD’ should be
|
||
used instead of ‘_LDADD’ and that it should mention libtool objects
|
||
(‘.lo’ files).
|
||
|
||
So, to mimic the ‘hello’ example from *note Conditional Sources::, we
|
||
could build a ‘libhello.la’ library using either ‘hello-linux.c’ or
|
||
‘hello-generic.c’ with the following ‘Makefile.am’.
|
||
|
||
lib_LTLIBRARIES = libhello.la
|
||
libhello_la_SOURCES = hello-common.c
|
||
EXTRA_libhello_la_SOURCES = hello-linux.c hello-generic.c
|
||
libhello_la_LIBADD = $(HELLO_SYSTEM)
|
||
libhello_la_DEPENDENCIES = $(HELLO_SYSTEM)
|
||
|
||
And make sure ‘configure’ defines ‘HELLO_SYSTEM’ as either
|
||
‘hello-linux.lo’ or ‘hello-generic.lo’.
|
||
|
||
Or we could simply use an Automake conditional as follows.
|
||
|
||
lib_LTLIBRARIES = libhello.la
|
||
libhello_la_SOURCES = hello-common.c
|
||
if LINUX
|
||
libhello_la_SOURCES += hello-linux.c
|
||
else
|
||
libhello_la_SOURCES += hello-generic.c
|
||
endif
|
||
|
||
|
||
File: automake.info, Node: Libtool Convenience Libraries, Next: Libtool Modules, Prev: Conditional Libtool Sources, Up: A Shared Library
|
||
|
||
8.3.5 Libtool Convenience Libraries
|
||
-----------------------------------
|
||
|
||
Sometimes you want to build libtool libraries that should not be
|
||
installed. These are called “libtool convenience libraries” and are
|
||
typically used to encapsulate many sublibraries, later gathered into one
|
||
big installed library.
|
||
|
||
Libtool convenience libraries are declared by directory-less
|
||
variables such as ‘noinst_LTLIBRARIES’, ‘check_LTLIBRARIES’, or even
|
||
‘EXTRA_LTLIBRARIES’. Unlike installed libtool libraries they do not
|
||
need an ‘-rpath’ flag at link time (actually this is the only
|
||
difference).
|
||
|
||
Convenience libraries listed in ‘noinst_LTLIBRARIES’ are always
|
||
built. Those listed in ‘check_LTLIBRARIES’ are built only upon ‘make
|
||
check’. Finally, libraries listed in ‘EXTRA_LTLIBRARIES’ are never
|
||
built explicitly: Automake outputs rules to build them, but if the
|
||
library does not appear as a Makefile dependency anywhere it won’t be
|
||
built (this is why ‘EXTRA_LTLIBRARIES’ is used for conditional
|
||
compilation).
|
||
|
||
Here is a sample setup merging libtool convenience libraries from
|
||
subdirectories into one main ‘libtop.la’ library.
|
||
|
||
# -- Top-level Makefile.am --
|
||
SUBDIRS = sub1 sub2 ...
|
||
lib_LTLIBRARIES = libtop.la
|
||
libtop_la_SOURCES =
|
||
libtop_la_LIBADD = \
|
||
sub1/libsub1.la \
|
||
sub2/libsub2.la \
|
||
...
|
||
|
||
# -- sub1/Makefile.am --
|
||
noinst_LTLIBRARIES = libsub1.la
|
||
libsub1_la_SOURCES = ...
|
||
|
||
# -- sub2/Makefile.am --
|
||
# showing nested convenience libraries
|
||
SUBDIRS = sub2.1 sub2.2 ...
|
||
noinst_LTLIBRARIES = libsub2.la
|
||
libsub2_la_SOURCES =
|
||
libsub2_la_LIBADD = \
|
||
sub21/libsub21.la \
|
||
sub22/libsub22.la \
|
||
...
|
||
|
||
When using such setup, beware that ‘automake’ will assume ‘libtop.la’
|
||
is to be linked with the C linker. This is because ‘libtop_la_SOURCES’
|
||
is empty, so ‘automake’ picks C as default language. If
|
||
‘libtop_la_SOURCES’ was not empty, ‘automake’ would select the linker as
|
||
explained in *note How the Linker is Chosen::.
|
||
|
||
If one of the sublibraries contains non-C source, it is important
|
||
that the appropriate linker be chosen. One way to achieve this is to
|
||
pretend that there is such a non-C file among the sources of the
|
||
library, thus forcing ‘automake’ to select the appropriate linker. Here
|
||
is the top-level ‘Makefile’ of our example updated to force C++ linking.
|
||
|
||
SUBDIRS = sub1 sub2 ...
|
||
lib_LTLIBRARIES = libtop.la
|
||
libtop_la_SOURCES =
|
||
# Dummy C++ source to cause C++ linking.
|
||
nodist_EXTRA_libtop_la_SOURCES = dummy.cxx
|
||
libtop_la_LIBADD = \
|
||
sub1/libsub1.la \
|
||
sub2/libsub2.la \
|
||
...
|
||
|
||
‘EXTRA_*_SOURCES’ variables are used to keep track of source files
|
||
that might be compiled (this is mostly useful when doing conditional
|
||
compilation using ‘AC_SUBST’, *note Conditional Libtool Sources::), and
|
||
the ‘nodist_’ prefix means the listed sources are not to be distributed
|
||
(*note Program and Library Variables::). In effect the file ‘dummy.cxx’
|
||
does not need to exist in the source tree. Of course if you have some
|
||
real source file to list in ‘libtop_la_SOURCES’ there is no point in
|
||
cheating with ‘nodist_EXTRA_libtop_la_SOURCES’.
|
||
|
||
|
||
File: automake.info, Node: Libtool Modules, Next: Libtool Flags, Prev: Libtool Convenience Libraries, Up: A Shared Library
|
||
|
||
8.3.6 Libtool Modules
|
||
---------------------
|
||
|
||
These are libtool libraries meant to be dlopened. They are indicated to
|
||
libtool by passing ‘-module’ at link-time.
|
||
|
||
pkglib_LTLIBRARIES = mymodule.la
|
||
mymodule_la_SOURCES = doit.c
|
||
mymodule_la_LDFLAGS = -module
|
||
|
||
Ordinarily, Automake requires that a library’s name start with ‘lib’.
|
||
However, when building a dynamically loadable module you might wish to
|
||
use a "nonstandard" name. Automake will not complain about such
|
||
nonstandard names if it knows the library being built is a libtool
|
||
module, i.e., if ‘-module’ explicitly appears in the library’s
|
||
‘_LDFLAGS’ variable (or in the common ‘AM_LDFLAGS’ variable when no
|
||
per-library ‘_LDFLAGS’ variable is defined).
|
||
|
||
As always, ‘AC_SUBST’ variables are black boxes to Automake since
|
||
their values are not yet known when ‘automake’ is run. Therefore if
|
||
‘-module’ is set via such a variable, Automake cannot notice it and will
|
||
proceed as if the library was an ordinary libtool library, with strict
|
||
naming.
|
||
|
||
If ‘mymodule_la_SOURCES’ is not specified, then it defaults to the
|
||
single file ‘mymodule.c’ (*note Default _SOURCES::).
|
||
|
||
|
||
File: automake.info, Node: Libtool Flags, Next: LTLIBOBJS, Prev: Libtool Modules, Up: A Shared Library
|
||
|
||
8.3.7 ‘_LIBADD’, ‘_LDFLAGS’, and ‘_LIBTOOLFLAGS’
|
||
------------------------------------------------
|
||
|
||
As shown in previous sections, the ‘LIBRARY_LIBADD’ variable should be
|
||
used to list extra libtool objects (‘.lo’ files) or libtool libraries
|
||
(‘.la’) to add to LIBRARY.
|
||
|
||
The ‘LIBRARY_LDFLAGS’ variable is the place to list additional
|
||
libtool linking flags, such as ‘-version-info’, ‘-static’, and a lot
|
||
more. *Note Link mode: (libtool)Link mode.
|
||
|
||
The ‘libtool’ command has two kinds of options: mode-specific options
|
||
and generic options. Mode-specific options such as the aforementioned
|
||
linking flags should be lumped with the other flags passed to the tool
|
||
invoked by ‘libtool’ (hence the use of ‘LIBRARY_LDFLAGS’ for libtool
|
||
linking flags). Generic options include ‘--tag=TAG’ and ‘--silent’
|
||
(*note Invoking ‘libtool’: (libtool)Invoking libtool. for more options)
|
||
should appear before the mode selection on the command line; in
|
||
‘Makefile.am’s they should be listed in the ‘LIBRARY_LIBTOOLFLAGS’
|
||
variable.
|
||
|
||
If ‘LIBRARY_LIBTOOLFLAGS’ is not defined, then the variable
|
||
‘AM_LIBTOOLFLAGS’ is used instead.
|
||
|
||
These flags are passed to libtool after the ‘--tag=TAG’ option
|
||
computed by Automake (if any), so ‘LIBRARY_LIBTOOLFLAGS’ (or
|
||
‘AM_LIBTOOLFLAGS’) is a good place to override or supplement the
|
||
‘--tag=TAG’ setting.
|
||
|
||
The libtool rules also use a ‘LIBTOOLFLAGS’ variable that should not
|
||
be set in ‘Makefile.am’: this is a user variable (*note Flag Variables
|
||
Ordering::. It allows users to run ‘make LIBTOOLFLAGS=--silent’, for
|
||
instance. Note that the verbosity of ‘libtool’ can also be influenced
|
||
by the Automake support for silent rules (*note Automake Silent
|
||
Rules::).
|
||
|
||
|
||
File: automake.info, Node: LTLIBOBJS, Next: Libtool Issues, Prev: Libtool Flags, Up: A Shared Library
|
||
|
||
8.3.8 ‘LTLIBOBJS’ and ‘LTALLOCA’
|
||
--------------------------------
|
||
|
||
Where an ordinary library might include ‘$(LIBOBJS)’ or ‘$(ALLOCA)’
|
||
(*note LIBOBJS::), a libtool library must use ‘$(LTLIBOBJS)’ or
|
||
‘$(LTALLOCA)’. This is required because the object files that libtool
|
||
operates on do not necessarily end in ‘.o’.
|
||
|
||
Nowadays, the computation of ‘LTLIBOBJS’ from ‘LIBOBJS’ is performed
|
||
automatically by Autoconf (*note ‘AC_LIBOBJ’ vs. ‘LIBOBJS’:
|
||
(autoconf)AC_LIBOBJ vs LIBOBJS.).
|
||
|
||
|
||
File: automake.info, Node: Libtool Issues, Prev: LTLIBOBJS, Up: A Shared Library
|
||
|
||
8.3.9 Common Issues Related to Libtool’s Use
|
||
--------------------------------------------
|
||
|
||
* Menu:
|
||
|
||
* Error required file ltmain.sh not found:: The need to run libtoolize
|
||
* Objects created both with libtool and without:: Avoid a specific build race
|
||
|
||
|
||
File: automake.info, Node: Error required file ltmain.sh not found, Next: Objects created both with libtool and without, Up: Libtool Issues
|
||
|
||
8.3.9.1 Error: ‘required file `./ltmain.sh' not found’
|
||
......................................................
|
||
|
||
Libtool comes with a tool called ‘libtoolize’ that will install
|
||
libtool’s supporting files into a package. Running this command will
|
||
install ‘ltmain.sh’. You should execute it before ‘aclocal’ and
|
||
‘automake’.
|
||
|
||
People upgrading old packages to newer autotools are likely to face
|
||
this issue because older Automake versions used to call ‘libtoolize’.
|
||
Therefore old build scripts do not call ‘libtoolize’.
|
||
|
||
Since Automake 1.6, it has been decided that running ‘libtoolize’ was
|
||
none of Automake’s business. Instead, that functionality has been moved
|
||
into the ‘autoreconf’ command (*note Using ‘autoreconf’:
|
||
(autoconf)autoreconf Invocation.). If you do not want to remember what
|
||
to run and when, just learn the ‘autoreconf’ command. Hopefully,
|
||
replacing existing ‘bootstrap’ or ‘autogen.sh’ scripts by a call to
|
||
‘autoreconf’ should also free you from any similar incompatible change
|
||
in the future.
|
||
|
||
|
||
File: automake.info, Node: Objects created both with libtool and without, Prev: Error required file ltmain.sh not found, Up: Libtool Issues
|
||
|
||
8.3.9.2 Objects ‘created with both libtool and without’
|
||
.......................................................
|
||
|
||
Sometimes, the same source file is used both to build a libtool library
|
||
and to build another non-libtool target (be it a program or another
|
||
library).
|
||
|
||
Let’s consider the following ‘Makefile.am’.
|
||
|
||
bin_PROGRAMS = prog
|
||
prog_SOURCES = prog.c foo.c ...
|
||
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.c ...
|
||
|
||
(In this trivial case the issue could be avoided by linking ‘libfoo.la’
|
||
with ‘prog’ instead of listing ‘foo.c’ in ‘prog_SOURCES’. But let’s
|
||
assume we really want to keep ‘prog’ and ‘libfoo.la’ separate.)
|
||
|
||
Technically, it means that we should build ‘foo.$(OBJEXT)’ for
|
||
‘prog’, and ‘foo.lo’ for ‘libfoo.la’. The problem is that in the course
|
||
of creating ‘foo.lo’, libtool may erase (or replace) ‘foo.$(OBJEXT)’,
|
||
and this cannot be avoided.
|
||
|
||
Therefore, when Automake detects this situation it will complain with
|
||
a message such as
|
||
object 'foo.$(OBJEXT)' created both with libtool and without
|
||
|
||
A workaround for this issue is to ensure that these two objects get
|
||
different basenames. As explained in *note Renamed Objects::, this
|
||
happens automatically when per-targets flags are used.
|
||
|
||
bin_PROGRAMS = prog
|
||
prog_SOURCES = prog.c foo.c ...
|
||
prog_CFLAGS = $(AM_CFLAGS)
|
||
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.c ...
|
||
|
||
Adding ‘prog_CFLAGS = $(AM_CFLAGS)’ is almost a no-op, because when the
|
||
‘prog_CFLAGS’ is defined, it is used instead of ‘AM_CFLAGS’. However as
|
||
a side effect it will cause ‘prog.c’ and ‘foo.c’ to be compiled as
|
||
‘prog-prog.$(OBJEXT)’ and ‘prog-foo.$(OBJEXT)’, which solves the issue.
|
||
|
||
|
||
File: automake.info, Node: Program and Library Variables, Next: Default _SOURCES, Prev: A Shared Library, Up: Programs
|
||
|
||
8.4 Program and Library Variables
|
||
=================================
|
||
|
||
Associated with each program is a collection of variables that can be
|
||
used to modify how that program is built. There is a similar list of
|
||
such variables for each library. The canonical name of the program (or
|
||
library) is used as a base for naming these variables.
|
||
|
||
In the list below, we use the name “maude” to refer to the program or
|
||
library. In your ‘Makefile.am’ you would replace this with the
|
||
canonical name of your program. This list also refers to “maude” as a
|
||
program, but in general the same rules apply for both static and dynamic
|
||
libraries; the documentation below notes situations where programs and
|
||
libraries differ.
|
||
|
||
‘maude_SOURCES’
|
||
This variable, if it exists, lists all the source files that are
|
||
compiled to build the program. These files are added to the
|
||
distribution by default. When building the program, Automake will
|
||
cause each source file to be compiled to a single ‘.o’ file (or
|
||
‘.lo’ when using libtool). Normally these object files are named
|
||
after the source file, but other factors can change this. If a
|
||
file in the ‘_SOURCES’ variable has an unrecognized extension,
|
||
Automake will do one of two things with it. If a suffix rule
|
||
exists for turning files with the unrecognized extension into ‘.o’
|
||
files, then ‘automake’ will treat this file as it will any other
|
||
source file (*note Support for Other Languages::). Otherwise, the
|
||
file will be ignored as though it were a header file.
|
||
|
||
The prefixes ‘dist_’ and ‘nodist_’ can be used to control whether
|
||
files listed in a ‘_SOURCES’ variable are distributed. ‘dist_’ is
|
||
redundant, as sources are distributed by default, but it can be
|
||
specified for clarity if desired.
|
||
|
||
It is possible to have both ‘dist_’ and ‘nodist_’ variants of a
|
||
given ‘_SOURCES’ variable at once; this lets you easily distribute
|
||
some files and not others, for instance:
|
||
|
||
nodist_maude_SOURCES = nodist.c
|
||
dist_maude_SOURCES = dist-me.c
|
||
|
||
By default the output file (on Unix systems, the ‘.o’ file) will be
|
||
put into the current build directory. However, if the option
|
||
‘subdir-objects’ is in effect in the current directory then the
|
||
‘.o’ file will be put into the subdirectory named after the source
|
||
file. For instance, with ‘subdir-objects’ enabled,
|
||
‘sub/dir/file.c’ will be compiled to ‘sub/dir/file.o’. Some people
|
||
prefer this mode of operation. You can specify ‘subdir-objects’ in
|
||
‘AUTOMAKE_OPTIONS’ (*note Options::).
|
||
|
||
‘EXTRA_maude_SOURCES’
|
||
Automake needs to know the list of files you intend to compile
|
||
_statically_. For one thing, this is the only way Automake has of
|
||
knowing what sort of language support a given ‘Makefile.in’
|
||
requires. (1) This means that, for example, you can’t put a
|
||
configure substitution like ‘@my_sources@’ into a ‘_SOURCES’
|
||
variable. If you intend to conditionally compile source files and
|
||
use ‘configure’ to substitute the appropriate object names into,
|
||
e.g., ‘_LDADD’ (see below), then you should list the corresponding
|
||
source files in the ‘EXTRA_’ variable.
|
||
|
||
This variable also supports ‘dist_’ and ‘nodist_’ prefixes. For
|
||
instance, ‘nodist_EXTRA_maude_SOURCES’ would list extra sources
|
||
that may need to be built, but should not be distributed.
|
||
|
||
‘maude_AR’
|
||
A static library is created by default by invoking ‘$(AR)
|
||
$(ARFLAGS)’ followed by the name of the library and then the
|
||
objects being put into the library. You can override this by
|
||
setting the ‘_AR’ variable. This is usually used with C++; some
|
||
C++ compilers require a special invocation in order to instantiate
|
||
all the templates that should go into a library. For instance, the
|
||
SGI C++ compiler likes this variable set like so:
|
||
libmaude_a_AR = $(CXX) -ar -o
|
||
|
||
‘maude_LIBADD’
|
||
Extra objects can be added to a _library_ using the ‘_LIBADD’
|
||
variable. For instance, this should be used for objects determined
|
||
by ‘configure’ (*note A Library::).
|
||
|
||
In the case of libtool libraries, ‘maude_LIBADD’ can also refer to
|
||
other libtool libraries.
|
||
|
||
‘maude_LDADD’
|
||
Extra objects (‘*.$(OBJEXT)’) and libraries (‘*.a’, ‘*.la’) can be
|
||
added to a _program_ by listing them in the ‘_LDADD’ variable. For
|
||
instance, this should be used for objects determined by ‘configure’
|
||
(*note Linking::).
|
||
|
||
‘_LDADD’ and ‘_LIBADD’ are inappropriate for passing
|
||
program-specific linker flags (except for ‘-l’, ‘-L’, ‘-dlopen’ and
|
||
‘-dlpreopen’). Use the ‘_LDFLAGS’ variable for this purpose.
|
||
|
||
For instance, if your ‘configure.ac’ uses ‘AC_PATH_XTRA’, you could
|
||
link your program against the X libraries like so:
|
||
|
||
maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS)
|
||
|
||
We recommend that you use ‘-l’ and ‘-L’ only when referring to
|
||
third-party libraries, and give the explicit file names of any
|
||
library built by your package. Doing so will ensure that
|
||
‘maude_DEPENDENCIES’ (see below) is correctly defined by default.
|
||
|
||
‘maude_LDFLAGS’
|
||
This variable is used to pass extra flags to the link step of a
|
||
program or a shared library. It overrides the ‘AM_LDFLAGS’
|
||
variable.
|
||
|
||
‘maude_LIBTOOLFLAGS’
|
||
This variable is used to pass extra options to ‘libtool’. It
|
||
overrides the ‘AM_LIBTOOLFLAGS’ variable. These options are output
|
||
before ‘libtool’’s ‘--mode=MODE’ option, so they should not be
|
||
mode-specific options (those belong to the compiler or linker
|
||
flags). *Note Libtool Flags::.
|
||
|
||
‘maude_DEPENDENCIES’
|
||
‘EXTRA_maude_DEPENDENCIES’
|
||
It is also occasionally useful to have a target (program or
|
||
library) depend on some other file that is not actually part of
|
||
that target. This can be done using the ‘_DEPENDENCIES’ variable.
|
||
Each target depends on the contents of such a variable, but no
|
||
further interpretation is done.
|
||
|
||
Since these dependencies are associated to the link rule used to
|
||
create the programs they should normally list files used by the
|
||
link command. That is ‘*.$(OBJEXT)’, ‘*.a’, or ‘*.la’ files for
|
||
programs; ‘*.lo’ and ‘*.la’ files for Libtool libraries; and
|
||
‘*.$(OBJEXT)’ files for static libraries. In rare cases you may
|
||
need to add other kinds of files such as linker scripts, but
|
||
_listing a source file in ‘_DEPENDENCIES’ is wrong_. If some
|
||
source file needs to be built before all the components of a
|
||
program are built, consider using the ‘BUILT_SOURCES’ variable
|
||
(*note Sources::).
|
||
|
||
If ‘_DEPENDENCIES’ is not supplied, it is computed by Automake.
|
||
The automatically-assigned value is the contents of ‘_LDADD’ or
|
||
‘_LIBADD’, with most configure substitutions, ‘-l’, ‘-L’, ‘-dlopen’
|
||
and ‘-dlpreopen’ options removed. The configure substitutions that
|
||
are left in are only ‘$(LIBOBJS)’ and ‘$(ALLOCA)’; these are left
|
||
because it is known that they will not cause an invalid value for
|
||
‘_DEPENDENCIES’ to be generated.
|
||
|
||
‘_DEPENDENCIES’ is more likely used to perform conditional
|
||
compilation using an ‘AC_SUBST’ variable that contains a list of
|
||
objects. *Note Conditional Sources::, and *note Conditional
|
||
Libtool Sources::.
|
||
|
||
The ‘EXTRA_*_DEPENDENCIES’ variable may be useful for cases where
|
||
you merely want to augment the ‘automake’-generated ‘_DEPENDENCIES’
|
||
variable rather than replacing it.
|
||
|
||
‘maude_LINK’
|
||
You can override the linker on a per-program basis. By default the
|
||
linker is chosen according to the languages used by the program.
|
||
For instance, a program that includes C++ source code would use the
|
||
C++ compiler to link. The ‘_LINK’ variable must hold the name of a
|
||
command that can be passed all the ‘.o’ file names and libraries to
|
||
link against as arguments. Note that the name of the underlying
|
||
program is _not_ passed to ‘_LINK’; typically one uses ‘$@’:
|
||
|
||
maude_LINK = $(CCLD) -magic -o $@
|
||
|
||
If a ‘_LINK’ variable is not supplied, it may still be generated
|
||
and used by Automake due to the use of per-target link flags such
|
||
as ‘_CFLAGS’, ‘_LDFLAGS’ or ‘_LIBTOOLFLAGS’, in cases where they
|
||
apply.
|
||
|
||
‘maude_CCASFLAGS’
|
||
‘maude_CFLAGS’
|
||
‘maude_CPPFLAGS’
|
||
‘maude_CXXFLAGS’
|
||
‘maude_FFLAGS’
|
||
‘maude_GCJFLAGS’
|
||
‘maude_LFLAGS’
|
||
‘maude_OBJCFLAGS’
|
||
‘maude_OBJCXXFLAGS’
|
||
‘maude_RFLAGS’
|
||
‘maude_UPCFLAGS’
|
||
‘maude_YFLAGS’
|
||
Automake allows you to set compilation flags on a per-program (or
|
||
per-library) basis. A single source file can be included in
|
||
several programs, and it will potentially be compiled with
|
||
different flags for each program. This works for any language
|
||
directly supported by Automake. These “per-target compilation
|
||
flags” are ‘_CCASFLAGS’, ‘_CFLAGS’, ‘_CPPFLAGS’, ‘_CXXFLAGS’,
|
||
‘_FFLAGS’, ‘_GCJFLAGS’, ‘_LFLAGS’, ‘_OBJCFLAGS’, ‘_OBJCXXFLAGS’,
|
||
‘_RFLAGS’, ‘_UPCFLAGS’, and ‘_YFLAGS’.
|
||
|
||
When using a per-target compilation flag, Automake will choose a
|
||
different name for the intermediate object files. Ordinarily a
|
||
file like ‘sample.c’ will be compiled to produce ‘sample.o’.
|
||
However, if the program’s ‘_CFLAGS’ variable is set, then the
|
||
object file will be named, for instance, ‘maude-sample.o’. (See
|
||
also *note Renamed Objects::).
|
||
|
||
In compilations with per-target flags, the ordinary ‘AM_’ form of
|
||
the flags variable is _not_ automatically included in the
|
||
compilation (however, the user form of the variable _is_ included).
|
||
So for instance, if you want the hypothetical ‘maude’ compilations
|
||
to also use the value of ‘AM_CFLAGS’, you would need to write:
|
||
|
||
maude_CFLAGS = ... your flags ... $(AM_CFLAGS)
|
||
|
||
*Note Flag Variables Ordering::, for more discussion about the
|
||
interaction between user variables, ‘AM_’ shadow variables, and
|
||
per-target variables.
|
||
|
||
‘maude_SHORTNAME’
|
||
On some platforms the allowable file names are very short. In
|
||
order to support these systems and per-target compilation flags at
|
||
the same time, Automake allows you to set a “short name” that will
|
||
influence how intermediate object files are named. For instance,
|
||
in the following example,
|
||
|
||
bin_PROGRAMS = maude
|
||
maude_CPPFLAGS = -DSOMEFLAG
|
||
maude_SHORTNAME = m
|
||
maude_SOURCES = sample.c ...
|
||
|
||
the object file would be named ‘m-sample.o’ rather than
|
||
‘maude-sample.o’.
|
||
|
||
This facility is rarely needed in practice, and we recommend
|
||
avoiding it until you find it is required.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) There are other, more obscure reasons for this limitation as
|
||
well.
|
||
|
||
|
||
File: automake.info, Node: Default _SOURCES, Next: LIBOBJS, Prev: Program and Library Variables, Up: Programs
|
||
|
||
8.5 Default ‘_SOURCES’
|
||
======================
|
||
|
||
‘_SOURCES’ variables are used to specify source files of programs (*note
|
||
A Program::), libraries (*note A Library::), and Libtool libraries
|
||
(*note A Shared Library::).
|
||
|
||
When no such variable is specified for a target, Automake will define
|
||
one itself. The default is to compile a single C file whose base name
|
||
is the name of the target itself, with any extension replaced by
|
||
‘AM_DEFAULT_SOURCE_EXT’, which defaults to ‘.c’.
|
||
|
||
For example if you have the following somewhere in your ‘Makefile.am’
|
||
with no corresponding ‘libfoo_a_SOURCES’:
|
||
|
||
lib_LIBRARIES = libfoo.a sub/libc++.a
|
||
|
||
‘libfoo.a’ will be built using a default source file named ‘libfoo.c’,
|
||
and ‘sub/libc++.a’ will be built from ‘sub/libc++.c’. (In older
|
||
versions ‘sub/libc++.a’ would be built from ‘sub_libc___a.c’, i.e., the
|
||
default source was the canonized name of the target, with ‘.c’ appended.
|
||
We believe the new behavior is more sensible, but for backward
|
||
compatibility ‘automake’ will use the old name if a file or a rule with
|
||
that name exists and ‘AM_DEFAULT_SOURCE_EXT’ is not used.)
|
||
|
||
Default sources are mainly useful in test suites, when building many
|
||
test programs each from a single source. For instance, in
|
||
|
||
check_PROGRAMS = test1 test2 test3
|
||
AM_DEFAULT_SOURCE_EXT = .cpp
|
||
|
||
‘test1’, ‘test2’, and ‘test3’ will be built from ‘test1.cpp’,
|
||
‘test2.cpp’, and ‘test3.cpp’. Without the last line, they will be built
|
||
from ‘test1.c’, ‘test2.c’, and ‘test3.c’.
|
||
|
||
Another case where this is convenient is building many Libtool
|
||
modules (‘moduleN.la’), each defined in its own file (‘moduleN.c’).
|
||
|
||
AM_LDFLAGS = -module
|
||
lib_LTLIBRARIES = module1.la module2.la module3.la
|
||
|
||
Finally, there is one situation where this default source computation
|
||
needs to be avoided: when a target should not be built from sources. We
|
||
already saw such an example in *note true::; this happens when all the
|
||
constituents of a target have already been compiled and just need to be
|
||
combined using a ‘_LDADD’ variable. Then it is necessary to define an
|
||
empty ‘_SOURCES’ variable, so that ‘automake’ does not compute a
|
||
default.
|
||
|
||
bin_PROGRAMS = target
|
||
target_SOURCES =
|
||
target_LDADD = libmain.a libmisc.a
|
||
|
||
|
||
File: automake.info, Node: LIBOBJS, Next: Program Variables, Prev: Default _SOURCES, Up: Programs
|
||
|
||
8.6 Special handling for ‘LIBOBJS’ and ‘ALLOCA’
|
||
===============================================
|
||
|
||
The ‘$(LIBOBJS)’ and ‘$(ALLOCA)’ variables list object files that should
|
||
be compiled into the project to provide an implementation for functions
|
||
that are missing or broken on the host system. They are substituted by
|
||
‘configure’.
|
||
|
||
These variables are defined by Autoconf macros such as ‘AC_LIBOBJ’,
|
||
‘AC_REPLACE_FUNCS’ (*note Generic Function Checks: (autoconf)Generic
|
||
Functions.), or ‘AC_FUNC_ALLOCA’ (*note Particular Function Checks:
|
||
(autoconf)Particular Functions.). Many other Autoconf macros call
|
||
‘AC_LIBOBJ’ or ‘AC_REPLACE_FUNCS’ to populate ‘$(LIBOBJS)’.
|
||
|
||
Using these variables is very similar to doing conditional
|
||
compilation using ‘AC_SUBST’ variables, as described in *note
|
||
Conditional Sources::. That is, when building a program, ‘$(LIBOBJS)’
|
||
and ‘$(ALLOCA)’ should be added to the associated ‘*_LDADD’ variable, or
|
||
to the ‘*_LIBADD’ variable when building a library. However there is no
|
||
need to list the corresponding sources in ‘EXTRA_*_SOURCES’ nor to
|
||
define ‘*_DEPENDENCIES’. Automake automatically adds ‘$(LIBOBJS)’ and
|
||
‘$(ALLOCA)’ to the dependencies, and it will discover the list of
|
||
corresponding source files automatically (by tracing the invocations of
|
||
the ‘AC_LIBSOURCE’ Autoconf macros). If you have already defined
|
||
‘*_DEPENDENCIES’ explicitly for an unrelated reason, then you either
|
||
need to add these variables manually, or use ‘EXTRA_*_DEPENDENCIES’
|
||
instead of ‘*_DEPENDENCIES’.
|
||
|
||
These variables are usually used to build a portability library that
|
||
is linked with all the programs of the project. We now review a sample
|
||
setup. First, ‘configure.ac’ contains some checks that affect either
|
||
‘LIBOBJS’ or ‘ALLOCA’.
|
||
|
||
# configure.ac
|
||
...
|
||
AC_CONFIG_LIBOBJ_DIR([lib])
|
||
...
|
||
AC_FUNC_MALLOC dnl May add malloc.$(OBJEXT) to LIBOBJS
|
||
AC_FUNC_MEMCMP dnl May add memcmp.$(OBJEXT) to LIBOBJS
|
||
AC_REPLACE_FUNCS([strdup]) dnl May add strdup.$(OBJEXT) to LIBOBJS
|
||
AC_FUNC_ALLOCA dnl May add alloca.$(OBJEXT) to ALLOCA
|
||
...
|
||
AC_CONFIG_FILES([
|
||
lib/Makefile
|
||
src/Makefile
|
||
])
|
||
AC_OUTPUT
|
||
|
||
The ‘AC_CONFIG_LIBOBJ_DIR’ tells Autoconf that the source files of
|
||
these object files are to be found in the ‘lib/’ directory. Automake
|
||
can also use this information, otherwise it expects the source files are
|
||
to be in the directory where the ‘$(LIBOBJS)’ and ‘$(ALLOCA)’ variables
|
||
are used.
|
||
|
||
The ‘lib/’ directory should therefore contain ‘malloc.c’, ‘memcmp.c’,
|
||
‘strdup.c’, ‘alloca.c’. Here is its ‘Makefile.am’:
|
||
|
||
# lib/Makefile.am
|
||
|
||
noinst_LIBRARIES = libcompat.a
|
||
libcompat_a_SOURCES =
|
||
libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA)
|
||
|
||
The library can have any name, of course, and anyway it is not going
|
||
to be installed: it just holds the replacement versions of the missing
|
||
or broken functions so we can later link them in. Many projects also
|
||
include extra functions, specific to the project, in that library: they
|
||
are simply added on the ‘_SOURCES’ line.
|
||
|
||
There is a small trap here, though: ‘$(LIBOBJS)’ and ‘$(ALLOCA)’
|
||
might be empty, and building an empty library is not portable. You
|
||
should ensure that there is always something to put in ‘libcompat.a’.
|
||
Most projects will also add some utility functions in that directory,
|
||
and list them in ‘libcompat_a_SOURCES’, so in practice ‘libcompat.a’
|
||
cannot be empty.
|
||
|
||
Finally here is how this library could be used from the ‘src/’
|
||
directory.
|
||
|
||
# src/Makefile.am
|
||
|
||
# Link all programs in this directory with libcompat.a
|
||
LDADD = ../lib/libcompat.a
|
||
|
||
bin_PROGRAMS = tool1 tool2 ...
|
||
tool1_SOURCES = ...
|
||
tool2_SOURCES = ...
|
||
|
||
When option ‘subdir-objects’ is not used, as in the above example,
|
||
the variables ‘$(LIBOBJS)’ or ‘$(ALLOCA)’ can only be used in the
|
||
directory where their sources lie. E.g., here it would be wrong to use
|
||
‘$(LIBOBJS)’ or ‘$(ALLOCA)’ in ‘src/Makefile.am’. However if both
|
||
‘subdir-objects’ and ‘AC_CONFIG_LIBOBJ_DIR’ are used, it is OK to use
|
||
these variables in other directories. For instance ‘src/Makefile.am’
|
||
could be changed as follows.
|
||
|
||
# src/Makefile.am
|
||
|
||
AUTOMAKE_OPTIONS = subdir-objects
|
||
LDADD = $(LIBOBJS) $(ALLOCA)
|
||
|
||
bin_PROGRAMS = tool1 tool2 ...
|
||
tool1_SOURCES = ...
|
||
tool2_SOURCES = ...
|
||
|
||
Because ‘$(LIBOBJS)’ and ‘$(ALLOCA)’ contain object file names that
|
||
end with ‘.$(OBJEXT)’, they are not suitable for Libtool libraries
|
||
(where the expected object extension is ‘.lo’): ‘LTLIBOBJS’ and
|
||
‘LTALLOCA’ should be used instead.
|
||
|
||
‘LTLIBOBJS’ is defined automatically by Autoconf and should not be
|
||
defined by hand (as in the past), however at the time of writing
|
||
‘LTALLOCA’ still needs to be defined from ‘ALLOCA’ manually. *Note
|
||
‘AC_LIBOBJ’ vs. ‘LIBOBJS’: (autoconf)AC_LIBOBJ vs LIBOBJS.
|
||
|
||
|
||
File: automake.info, Node: Program Variables, Next: Yacc and Lex, Prev: LIBOBJS, Up: Programs
|
||
|
||
8.7 Variables used when building a program
|
||
==========================================
|
||
|
||
Occasionally it is useful to know which ‘Makefile’ variables Automake
|
||
uses for compilations, and in which order (*note Flag Variables
|
||
Ordering::); for instance, you might need to do your own compilation in
|
||
some special cases.
|
||
|
||
Some variables are inherited from Autoconf; these are ‘CC’, ‘CFLAGS’,
|
||
‘CPPFLAGS’, ‘DEFS’, ‘LDFLAGS’, and ‘LIBS’.
|
||
|
||
There are some additional variables that Automake defines on its own:
|
||
|
||
‘AM_CPPFLAGS’
|
||
The contents of this variable are passed to every compilation that
|
||
invokes the C preprocessor; it is a list of arguments to the
|
||
preprocessor. For instance, ‘-I’ and ‘-D’ options should be listed
|
||
here.
|
||
|
||
Automake already provides some ‘-I’ options automatically, in a
|
||
separate variable that is also passed to every compilation that
|
||
invokes the C preprocessor. In particular it generates ‘-I.’,
|
||
‘-I$(srcdir)’, and a ‘-I’ pointing to the directory holding
|
||
‘config.h’ (if you’ve used ‘AC_CONFIG_HEADERS’). You can disable
|
||
the default ‘-I’ options using the ‘nostdinc’ option.
|
||
|
||
When a file to be included is generated during the build and not
|
||
part of a distribution tarball, its location is under
|
||
‘$(builddir)’, not under ‘$(srcdir)’. This matters especially for
|
||
packages that use header files placed in sub-directories and want
|
||
to allow builds outside the source tree (*note VPATH Builds::). In
|
||
that case we recommend to use a pair of ‘-I’ options, such as,
|
||
e.g., ‘-Isome/subdir -I$(srcdir)/some/subdir’ or
|
||
‘-I$(top_builddir)/some/subdir -I$(top_srcdir)/some/subdir’. Note
|
||
that the reference to the build tree should come before the
|
||
reference to the source tree, so that accidentally leftover
|
||
generated files in the source directory are ignored.
|
||
|
||
‘AM_CPPFLAGS’ is ignored in preference to a per-executable (or
|
||
per-library) ‘_CPPFLAGS’ variable if it is defined.
|
||
|
||
‘INCLUDES’
|
||
This does the same job as ‘AM_CPPFLAGS’ (or any per-target
|
||
‘_CPPFLAGS’ variable if it is used). It is an older name for the
|
||
same functionality. This variable is deprecated; we suggest using
|
||
‘AM_CPPFLAGS’ and per-target ‘_CPPFLAGS’ instead.
|
||
|
||
‘AM_CFLAGS’
|
||
This is the variable the ‘Makefile.am’ author can use to pass in
|
||
additional C compiler flags. In some situations, this is not used,
|
||
in preference to the per-executable (or per-library) ‘_CFLAGS’.
|
||
|
||
‘COMPILE’
|
||
This is the command used to actually compile a C source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
‘AM_LDFLAGS’
|
||
This is the variable the ‘Makefile.am’ author can use to pass in
|
||
additional linker flags. In some situations, this is not used, in
|
||
preference to the per-executable (or per-library) ‘_LDFLAGS’.
|
||
|
||
‘LINK’
|
||
This is the command used to actually link a C program. It already
|
||
includes ‘-o $@’ and the usual variable references (for instance,
|
||
‘CFLAGS’); it takes as “arguments” the names of the object files
|
||
and libraries to link in. This variable is not used when the
|
||
linker is overridden with a per-target ‘_LINK’ variable or
|
||
per-target flags cause Automake to define such a ‘_LINK’ variable.
|
||
|
||
|
||
File: automake.info, Node: Yacc and Lex, Next: C++ Support, Prev: Program Variables, Up: Programs
|
||
|
||
8.8 Yacc and Lex support
|
||
========================
|
||
|
||
Automake has somewhat idiosyncratic support for Yacc and Lex.
|
||
|
||
Automake assumes that the ‘.c’ file generated by ‘yacc’ (or ‘lex’)
|
||
should be named using the basename of the input file. That is, for a
|
||
yacc source file ‘foo.y’, Automake will cause the intermediate file to
|
||
be named ‘foo.c’ (as opposed to ‘y.tab.c’, which is more traditional).
|
||
|
||
The extension of a yacc source file is used to determine the
|
||
extension of the resulting C or C++ source and header files. Note that
|
||
header files are generated only when the ‘-d’ Yacc option is used; see
|
||
below for more information about this flag, and how to specify it.
|
||
Files with the extension ‘.y’ will thus be turned into ‘.c’ sources and
|
||
‘.h’ headers; likewise, ‘.yy’ will become ‘.cc’ and ‘.hh’, ‘.y++’ will
|
||
become ‘c++’ and ‘h++’, ‘.yxx’ will become ‘.cxx’ and ‘.hxx’, and ‘.ypp’
|
||
will become ‘.cpp’ and ‘.hpp’.
|
||
|
||
Similarly, lex source files can be used to generate C or C++; the
|
||
extensions ‘.l’, ‘.ll’, ‘.l++’, ‘.lxx’, and ‘.lpp’ are recognized.
|
||
|
||
You should never explicitly mention the intermediate (C or C++) file
|
||
in any ‘SOURCES’ variable; only list the source file.
|
||
|
||
The intermediate files generated by ‘yacc’ (or ‘lex’) will be
|
||
included in any distribution that is made. That way the user doesn’t
|
||
need to have ‘yacc’ or ‘lex’.
|
||
|
||
If a ‘yacc’ source file is seen, then your ‘configure.ac’ must define
|
||
the variable ‘YACC’. This is most easily done by invoking the macro
|
||
‘AC_PROG_YACC’ (*note Particular Program Checks: (autoconf)Particular
|
||
Programs.).
|
||
|
||
When ‘yacc’ is invoked, it is passed ‘AM_YFLAGS’ and ‘YFLAGS’. The
|
||
latter is a user variable and the former is intended for the
|
||
‘Makefile.am’ author.
|
||
|
||
‘AM_YFLAGS’ is usually used to pass the ‘-d’ option to ‘yacc’.
|
||
Automake knows what this means and will automatically adjust its rules
|
||
to update and distribute the header file built by ‘yacc -d’(1). What
|
||
Automake cannot guess, though, is where this header will be used: it is
|
||
up to you to ensure the header gets built before it is first used.
|
||
Typically this is necessary in order for dependency tracking to work
|
||
when the header is included by another file. The common solution is
|
||
listing the header file in ‘BUILT_SOURCES’ (*note Sources::) as follows.
|
||
|
||
BUILT_SOURCES = parser.h
|
||
AM_YFLAGS = -d
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = ... parser.y ...
|
||
|
||
If a ‘lex’ source file is seen, then your ‘configure.ac’ must define
|
||
the variable ‘LEX’. You can use ‘AC_PROG_LEX’ to do this (*note
|
||
Particular Program Checks: (autoconf)Particular Programs.), but using
|
||
‘AM_PROG_LEX’ macro (*note Macros::) is recommended.
|
||
|
||
When ‘lex’ is invoked, it is passed ‘AM_LFLAGS’ and ‘LFLAGS’. The
|
||
latter is a user variable and the former is intended for the
|
||
‘Makefile.am’ author.
|
||
|
||
When ‘AM_MAINTAINER_MODE’ (*note maintainer-mode::) is used, the
|
||
rebuild rule for distributed Yacc and Lex sources are only used when
|
||
‘maintainer-mode’ is enabled, or when the files have been erased.
|
||
|
||
When ‘lex’ or ‘yacc’ sources are used, ‘automake -a’ automatically
|
||
installs an auxiliary program called ‘ylwrap’ in your package (*note
|
||
Auxiliary Programs::). This program is used by the build rules to
|
||
rename the output of these tools, and makes it possible to include
|
||
multiple ‘yacc’ (or ‘lex’) source files in a single directory. (This is
|
||
necessary because yacc’s output file name is fixed, and a parallel make
|
||
could conceivably invoke more than one instance of ‘yacc’
|
||
simultaneously.)
|
||
|
||
For ‘yacc’, simply managing locking is insufficient. The output of
|
||
‘yacc’ always uses the same symbol names internally, so it isn’t
|
||
possible to link two ‘yacc’ parsers into the same executable.
|
||
|
||
We recommend using the following renaming hack used in ‘gdb’:
|
||
#define yymaxdepth c_maxdepth
|
||
#define yyparse c_parse
|
||
#define yylex c_lex
|
||
#define yyerror c_error
|
||
#define yylval c_lval
|
||
#define yychar c_char
|
||
#define yydebug c_debug
|
||
#define yypact c_pact
|
||
#define yyr1 c_r1
|
||
#define yyr2 c_r2
|
||
#define yydef c_def
|
||
#define yychk c_chk
|
||
#define yypgo c_pgo
|
||
#define yyact c_act
|
||
#define yyexca c_exca
|
||
#define yyerrflag c_errflag
|
||
#define yynerrs c_nerrs
|
||
#define yyps c_ps
|
||
#define yypv c_pv
|
||
#define yys c_s
|
||
#define yy_yys c_yys
|
||
#define yystate c_state
|
||
#define yytmp c_tmp
|
||
#define yyv c_v
|
||
#define yy_yyv c_yyv
|
||
#define yyval c_val
|
||
#define yylloc c_lloc
|
||
#define yyreds c_reds
|
||
#define yytoks c_toks
|
||
#define yylhs c_yylhs
|
||
#define yylen c_yylen
|
||
#define yydefred c_yydefred
|
||
#define yydgoto c_yydgoto
|
||
#define yysindex c_yysindex
|
||
#define yyrindex c_yyrindex
|
||
#define yygindex c_yygindex
|
||
#define yytable c_yytable
|
||
#define yycheck c_yycheck
|
||
#define yyname c_yyname
|
||
#define yyrule c_yyrule
|
||
|
||
For each define, replace the ‘c_’ prefix with whatever you like.
|
||
These defines work for ‘bison’, ‘byacc’, and traditional ‘yacc’s. If
|
||
you find a parser generator that uses a symbol not covered here, please
|
||
report the new name so it can be added to the list.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) Please note that ‘automake’ recognizes ‘-d’ in ‘AM_YFLAGS’ only
|
||
if it is not clustered with other options; for example, it won’t be
|
||
recognized if ‘AM_YFLAGS’ is ‘-dt’, but it will be if ‘AM_YFLAGS’ is ‘-d
|
||
-t’ or ‘-t -d’.
|
||
|
||
|
||
File: automake.info, Node: C++ Support, Next: Objective C Support, Prev: Yacc and Lex, Up: Programs
|
||
|
||
8.9 C++ Support
|
||
===============
|
||
|
||
Automake includes full support for C++.
|
||
|
||
Any package including C++ code must define the output variable ‘CXX’
|
||
in ‘configure.ac’; the simplest way to do this is to use the
|
||
‘AC_PROG_CXX’ macro (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.).
|
||
|
||
A few additional variables are defined when a C++ source file is
|
||
seen:
|
||
|
||
‘CXX’
|
||
The name of the C++ compiler.
|
||
|
||
‘CXXFLAGS’
|
||
Any flags to pass to the C++ compiler.
|
||
|
||
‘AM_CXXFLAGS’
|
||
The maintainer’s variant of ‘CXXFLAGS’.
|
||
|
||
‘CXXCOMPILE’
|
||
The command used to actually compile a C++ source file. The file
|
||
name is appended to form the complete command line.
|
||
|
||
‘CXXLINK’
|
||
The command used to actually link a C++ program.
|
||
|
||
|
||
File: automake.info, Node: Objective C Support, Next: Objective C++ Support, Prev: C++ Support, Up: Programs
|
||
|
||
8.10 Objective C Support
|
||
========================
|
||
|
||
Automake includes some support for Objective C.
|
||
|
||
Any package including Objective C code must define the output
|
||
variable ‘OBJC’ in ‘configure.ac’; the simplest way to do this is to use
|
||
the ‘AC_PROG_OBJC’ macro (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.).
|
||
|
||
A few additional variables are defined when an Objective C source
|
||
file is seen:
|
||
|
||
‘OBJC’
|
||
The name of the Objective C compiler.
|
||
|
||
‘OBJCFLAGS’
|
||
Any flags to pass to the Objective C compiler.
|
||
|
||
‘AM_OBJCFLAGS’
|
||
The maintainer’s variant of ‘OBJCFLAGS’.
|
||
|
||
‘OBJCCOMPILE’
|
||
The command used to actually compile an Objective C source file.
|
||
The file name is appended to form the complete command line.
|
||
|
||
‘OBJCLINK’
|
||
The command used to actually link an Objective C program.
|
||
|
||
|
||
File: automake.info, Node: Objective C++ Support, Next: Unified Parallel C Support, Prev: Objective C Support, Up: Programs
|
||
|
||
8.11 Objective C++ Support
|
||
==========================
|
||
|
||
Automake includes some support for Objective C++.
|
||
|
||
Any package including Objective C++ code must define the output
|
||
variable ‘OBJCXX’ in ‘configure.ac’; the simplest way to do this is to
|
||
use the ‘AC_PROG_OBJCXX’ macro (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.).
|
||
|
||
A few additional variables are defined when an Objective C++ source
|
||
file is seen:
|
||
|
||
‘OBJCXX’
|
||
The name of the Objective C++ compiler.
|
||
|
||
‘OBJCXXFLAGS’
|
||
Any flags to pass to the Objective C++ compiler.
|
||
|
||
‘AM_OBJCXXFLAGS’
|
||
The maintainer’s variant of ‘OBJCXXFLAGS’.
|
||
|
||
‘OBJCXXCOMPILE’
|
||
The command used to actually compile an Objective C++ source file.
|
||
The file name is appended to form the complete command line.
|
||
|
||
‘OBJCXXLINK’
|
||
The command used to actually link an Objective C++ program.
|
||
|
||
|
||
File: automake.info, Node: Unified Parallel C Support, Next: Assembly Support, Prev: Objective C++ Support, Up: Programs
|
||
|
||
8.12 Unified Parallel C Support
|
||
===============================
|
||
|
||
Automake includes some support for Unified Parallel C.
|
||
|
||
Any package including Unified Parallel C code must define the output
|
||
variable ‘UPC’ in ‘configure.ac’; the simplest way to do this is to use
|
||
the ‘AM_PROG_UPC’ macro (*note Public Macros::).
|
||
|
||
A few additional variables are defined when a Unified Parallel C
|
||
source file is seen:
|
||
|
||
‘UPC’
|
||
The name of the Unified Parallel C compiler.
|
||
|
||
‘UPCFLAGS’
|
||
Any flags to pass to the Unified Parallel C compiler.
|
||
|
||
‘AM_UPCFLAGS’
|
||
The maintainer’s variant of ‘UPCFLAGS’.
|
||
|
||
‘UPCCOMPILE’
|
||
The command used to actually compile a Unified Parallel C source
|
||
file. The file name is appended to form the complete command line.
|
||
|
||
‘UPCLINK’
|
||
The command used to actually link a Unified Parallel C program.
|
||
|
||
|
||
File: automake.info, Node: Assembly Support, Next: Fortran 77 Support, Prev: Unified Parallel C Support, Up: Programs
|
||
|
||
8.13 Assembly Support
|
||
=====================
|
||
|
||
Automake includes some support for assembly code. There are two forms
|
||
of assembler files: normal (‘*.s’) and preprocessed by ‘CPP’ (‘*.S’ or
|
||
‘*.sx’).
|
||
|
||
The variable ‘CCAS’ holds the name of the compiler used to build
|
||
assembly code. This compiler must work a bit like a C compiler; in
|
||
particular it must accept ‘-c’ and ‘-o’. The values of ‘CCASFLAGS’ and
|
||
‘AM_CCASFLAGS’ (or its per-target definition) is passed to the
|
||
compilation. For preprocessed files, ‘DEFS’, ‘DEFAULT_INCLUDES’,
|
||
‘INCLUDES’, ‘CPPFLAGS’ and ‘AM_CPPFLAGS’ are also used.
|
||
|
||
The autoconf macro ‘AM_PROG_AS’ will define ‘CCAS’ and ‘CCASFLAGS’
|
||
for you (unless they are already set, it simply sets ‘CCAS’ to the C
|
||
compiler and ‘CCASFLAGS’ to the C compiler flags), but you are free to
|
||
define these variables by other means.
|
||
|
||
Only the suffixes ‘.s’, ‘.S’, and ‘.sx’ are recognized by ‘automake’
|
||
as being files containing assembly code.
|
||
|
||
|
||
File: automake.info, Node: Fortran 77 Support, Next: Fortran 9x Support, Prev: Assembly Support, Up: Programs
|
||
|
||
8.14 Fortran 77 Support
|
||
=======================
|
||
|
||
Automake includes full support for Fortran 77.
|
||
|
||
Any package including Fortran 77 code must define the output variable
|
||
‘F77’ in ‘configure.ac’; the simplest way to do this is to use the
|
||
‘AC_PROG_F77’ macro (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.).
|
||
|
||
A few additional variables are defined when a Fortran 77 source file
|
||
is seen:
|
||
|
||
‘F77’
|
||
The name of the Fortran 77 compiler.
|
||
|
||
‘FFLAGS’
|
||
Any flags to pass to the Fortran 77 compiler.
|
||
|
||
‘AM_FFLAGS’
|
||
The maintainer’s variant of ‘FFLAGS’.
|
||
|
||
‘RFLAGS’
|
||
Any flags to pass to the Ratfor compiler.
|
||
|
||
‘AM_RFLAGS’
|
||
The maintainer’s variant of ‘RFLAGS’.
|
||
|
||
‘F77COMPILE’
|
||
The command used to actually compile a Fortran 77 source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
‘FLINK’
|
||
The command used to actually link a pure Fortran 77 program or
|
||
shared library.
|
||
|
||
Automake can handle preprocessing Fortran 77 and Ratfor source files
|
||
in addition to compiling them(1). Automake also contains some support
|
||
for creating programs and shared libraries that are a mixture of Fortran
|
||
77 and other languages (*note Mixing Fortran 77 With C and C++::).
|
||
|
||
These issues are covered in the following sections.
|
||
|
||
* Menu:
|
||
|
||
* Preprocessing Fortran 77:: Preprocessing Fortran 77 sources
|
||
* Compiling Fortran 77 Files:: Compiling Fortran 77 sources
|
||
* Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) Much, if not most, of the information in the following sections
|
||
pertaining to preprocessing Fortran 77 programs was taken almost
|
||
verbatim from *note Catalogue of Rules: (make)Catalogue of Rules.
|
||
|
||
|
||
File: automake.info, Node: Preprocessing Fortran 77, Next: Compiling Fortran 77 Files, Up: Fortran 77 Support
|
||
|
||
8.14.1 Preprocessing Fortran 77
|
||
-------------------------------
|
||
|
||
‘N.f’ is made automatically from ‘N.F’ or ‘N.r’. This rule runs just
|
||
the preprocessor to convert a preprocessable Fortran 77 or Ratfor source
|
||
file into a strict Fortran 77 source file. The precise command used is
|
||
as follows:
|
||
|
||
‘.F’
|
||
‘$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
|
||
$(AM_FFLAGS) $(FFLAGS)’
|
||
|
||
‘.r’
|
||
‘$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)’
|
||
|
||
|
||
File: automake.info, Node: Compiling Fortran 77 Files, Next: Mixing Fortran 77 With C and C++, Prev: Preprocessing Fortran 77, Up: Fortran 77 Support
|
||
|
||
8.14.2 Compiling Fortran 77 Files
|
||
---------------------------------
|
||
|
||
‘N.o’ is made automatically from ‘N.f’, ‘N.F’ or ‘N.r’ by running the
|
||
Fortran 77 compiler. The precise command used is as follows:
|
||
|
||
‘.f’
|
||
‘$(F77) -c $(AM_FFLAGS) $(FFLAGS)’
|
||
|
||
‘.F’
|
||
‘$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
|
||
$(AM_FFLAGS) $(FFLAGS)’
|
||
|
||
‘.r’
|
||
‘$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)’
|
||
|
||
|
||
File: automake.info, Node: Mixing Fortran 77 With C and C++, Prev: Compiling Fortran 77 Files, Up: Fortran 77 Support
|
||
|
||
8.14.3 Mixing Fortran 77 With C and C++
|
||
---------------------------------------
|
||
|
||
Automake currently provides _limited_ support for creating programs and
|
||
shared libraries that are a mixture of Fortran 77 and C and/or C++.
|
||
However, there are many other issues related to mixing Fortran 77 with
|
||
other languages that are _not_ (currently) handled by Automake, but that
|
||
are handled by other packages(1).
|
||
|
||
Automake can help in two ways:
|
||
|
||
1. Automatic selection of the linker depending on which combinations
|
||
of source code.
|
||
|
||
2. Automatic selection of the appropriate linker flags (e.g., ‘-L’ and
|
||
‘-l’) to pass to the automatically selected linker in order to link
|
||
in the appropriate Fortran 77 intrinsic and run-time libraries.
|
||
|
||
These extra Fortran 77 linker flags are supplied in the output
|
||
variable ‘FLIBS’ by the ‘AC_F77_LIBRARY_LDFLAGS’ Autoconf macro.
|
||
*Note Fortran Compiler Characteristics: (autoconf)Fortran Compiler.
|
||
|
||
If Automake detects that a program or shared library (as mentioned in
|
||
some ‘_PROGRAMS’ or ‘_LTLIBRARIES’ primary) contains source code that is
|
||
a mixture of Fortran 77 and C and/or C++, then it requires that the
|
||
macro ‘AC_F77_LIBRARY_LDFLAGS’ be called in ‘configure.ac’, and that
|
||
either ‘$(FLIBS)’ appear in the appropriate ‘_LDADD’ (for programs) or
|
||
‘_LIBADD’ (for shared libraries) variables. It is the responsibility of
|
||
the person writing the ‘Makefile.am’ to make sure that ‘$(FLIBS)’
|
||
appears in the appropriate ‘_LDADD’ or ‘_LIBADD’ variable.
|
||
|
||
For example, consider the following ‘Makefile.am’:
|
||
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = main.cc foo.f
|
||
foo_LDADD = libfoo.la $(FLIBS)
|
||
|
||
pkglib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = bar.f baz.c zardoz.cc
|
||
libfoo_la_LIBADD = $(FLIBS)
|
||
|
||
In this case, Automake will insist that ‘AC_F77_LIBRARY_LDFLAGS’ is
|
||
mentioned in ‘configure.ac’. Also, if ‘$(FLIBS)’ hadn’t been mentioned
|
||
in ‘foo_LDADD’ and ‘libfoo_la_LIBADD’, then Automake would have issued a
|
||
warning.
|
||
|
||
* Menu:
|
||
|
||
* How the Linker is Chosen:: Automatic linker selection
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) For example, the cfortran package
|
||
(http://www-zeus.desy.de/~burow/cfortran/) addresses all of these
|
||
inter-language issues, and runs under nearly all Fortran 77, C and C++
|
||
compilers on nearly all platforms. However, ‘cfortran’ is not yet Free
|
||
Software, but it will be in the next major release.
|
||
|
||
|
||
File: automake.info, Node: How the Linker is Chosen, Up: Mixing Fortran 77 With C and C++
|
||
|
||
8.14.3.1 How the Linker is Chosen
|
||
.................................
|
||
|
||
When a program or library mixes several languages, Automake choose the
|
||
linker according to the following priorities. (The names in parentheses
|
||
are the variables containing the link command.)
|
||
|
||
1. Native Java (‘GCJLINK’)
|
||
2. Objective C++ (‘OBJCXXLINK’)
|
||
3. C++ (‘CXXLINK’)
|
||
4. Fortran 77 (‘F77LINK’)
|
||
5. Fortran (‘FCLINK’)
|
||
6. Objective C (‘OBJCLINK’)
|
||
7. Unified Parallel C (‘UPCLINK’)
|
||
8. C (‘LINK’)
|
||
|
||
For example, if Fortran 77, C and C++ source code is compiled into a
|
||
program, then the C++ linker will be used. In this case, if the C or
|
||
Fortran 77 linkers required any special libraries that weren’t included
|
||
by the C++ linker, then they must be manually added to an ‘_LDADD’ or
|
||
‘_LIBADD’ variable by the user writing the ‘Makefile.am’.
|
||
|
||
Automake only looks at the file names listed in ‘_SOURCES’ variables
|
||
to choose the linker, and defaults to the C linker. Sometimes this is
|
||
inconvenient because you are linking against a library written in
|
||
another language and would like to set the linker more appropriately.
|
||
*Note Libtool Convenience Libraries::, for a trick with
|
||
‘nodist_EXTRA_..._SOURCES’.
|
||
|
||
A per-target ‘_LINK’ variable will override the above selection.
|
||
Per-target link flags will cause Automake to write a per-target ‘_LINK’
|
||
variable according to the language chosen as above.
|
||
|
||
|
||
File: automake.info, Node: Fortran 9x Support, Next: Java Support with gcj, Prev: Fortran 77 Support, Up: Programs
|
||
|
||
8.15 Fortran 9x Support
|
||
=======================
|
||
|
||
Automake includes support for Fortran 9x.
|
||
|
||
Any package including Fortran 9x code must define the output variable
|
||
‘FC’ in ‘configure.ac’; the simplest way to do this is to use the
|
||
‘AC_PROG_FC’ macro (*note Particular Program Checks:
|
||
(autoconf)Particular Programs.).
|
||
|
||
A few additional variables are defined when a Fortran 9x source file
|
||
is seen:
|
||
|
||
‘FC’
|
||
The name of the Fortran 9x compiler.
|
||
|
||
‘FCFLAGS’
|
||
Any flags to pass to the Fortran 9x compiler.
|
||
|
||
‘AM_FCFLAGS’
|
||
The maintainer’s variant of ‘FCFLAGS’.
|
||
|
||
‘FCCOMPILE’
|
||
The command used to actually compile a Fortran 9x source file. The
|
||
file name is appended to form the complete command line.
|
||
|
||
‘FCLINK’
|
||
The command used to actually link a pure Fortran 9x program or
|
||
shared library.
|
||
|
||
* Menu:
|
||
|
||
* Compiling Fortran 9x Files:: Compiling Fortran 9x sources
|
||
|
||
|
||
File: automake.info, Node: Compiling Fortran 9x Files, Up: Fortran 9x Support
|
||
|
||
8.15.1 Compiling Fortran 9x Files
|
||
---------------------------------
|
||
|
||
‘FILE.o’ is made automatically from ‘FILE.f90’, ‘FILE.f95’, ‘FILE.f03’,
|
||
or ‘FILE.f08’ by running the Fortran 9x compiler. The precise command
|
||
used is as follows:
|
||
|
||
‘.f90’
|
||
‘$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<’
|
||
|
||
‘.f95’
|
||
‘$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<’
|
||
|
||
‘.f03’
|
||
‘$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<’
|
||
|
||
‘.f08’
|
||
‘$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<’
|
||
|
||
|
||
File: automake.info, Node: Java Support with gcj, Next: Vala Support, Prev: Fortran 9x Support, Up: Programs
|
||
|
||
8.16 Compiling Java sources using gcj
|
||
=====================================
|
||
|
||
Automake includes support for natively compiled Java, using ‘gcj’, the
|
||
Java front end to the GNU Compiler Collection (rudimentary support for
|
||
compiling Java to bytecode using the ‘javac’ compiler is also present,
|
||
_albeit deprecated_; *note Java::).
|
||
|
||
Any package including Java code to be compiled must define the output
|
||
variable ‘GCJ’ in ‘configure.ac’; the variable ‘GCJFLAGS’ must also be
|
||
defined somehow (either in ‘configure.ac’ or ‘Makefile.am’). The
|
||
simplest way to do this is to use the ‘AM_PROG_GCJ’ macro.
|
||
|
||
By default, programs including Java source files are linked with
|
||
‘gcj’.
|
||
|
||
As always, the contents of ‘AM_GCJFLAGS’ are passed to every
|
||
compilation invoking ‘gcj’ (in its role as an ahead-of-time compiler,
|
||
when invoking it to create ‘.class’ files, ‘AM_JAVACFLAGS’ is used
|
||
instead). If it is necessary to pass options to ‘gcj’ from
|
||
‘Makefile.am’, this variable, and not the user variable ‘GCJFLAGS’,
|
||
should be used.
|
||
|
||
‘gcj’ can be used to compile ‘.java’, ‘.class’, ‘.zip’, or ‘.jar’
|
||
files.
|
||
|
||
When linking, ‘gcj’ requires that the main class be specified using
|
||
the ‘--main=’ option. The easiest way to do this is to use the
|
||
‘_LDFLAGS’ variable for the program.
|
||
|
||
|
||
File: automake.info, Node: Vala Support, Next: Support for Other Languages, Prev: Java Support with gcj, Up: Programs
|
||
|
||
8.17 Vala Support
|
||
=================
|
||
|
||
Automake provides initial support for Vala
|
||
(<http://www.vala-project.org/>). This requires valac version 0.7.0 or
|
||
later, and currently requires the user to use GNU ‘make’.
|
||
|
||
foo_SOURCES = foo.vala bar.vala zardoc.c
|
||
|
||
Any ‘.vala’ file listed in a ‘_SOURCES’ variable will be compiled
|
||
into C code by the Vala compiler. The generated ‘.c’ files are
|
||
distributed. The end user does not need to have a Vala compiler
|
||
installed.
|
||
|
||
Automake ships with an Autoconf macro called ‘AM_PROG_VALAC’ that
|
||
will locate the Vala compiler and optionally check its version number.
|
||
|
||
-- Macro: AM_PROG_VALAC ([MINIMUM-VERSION], [ACTION-IF-FOUND],
|
||
[ACTION-IF-NOT-FOUND]) Search for a Vala compiler in ‘PATH’. If it
|
||
is found, the variable ‘VALAC’ is set to point to it (see below for
|
||
more details). This macro takes three optional arguments. The
|
||
first argument, if present, is the minimum version of the Vala
|
||
compiler required to compile this package. If a compiler is found
|
||
and satisfies MINIMUM-VERSION, then ACTION-IF-FOUND is run (this
|
||
defaults to do nothing). Otherwise, ACTION-IF-NOT-FOUND is run.
|
||
If ACTION-IF-NOT-FOUND is not specified, the default value is to
|
||
print a warning in case no compiler is found, or if a too-old
|
||
version of the compiler is found.
|
||
|
||
There are a few variables that are used when compiling Vala sources:
|
||
|
||
‘VALAC’
|
||
Absolute path to the Vala compiler, or simply ‘valac’ if no
|
||
suitable compiler Vala could be found at configure runtime.
|
||
|
||
‘VALAFLAGS’
|
||
Additional arguments for the Vala compiler.
|
||
|
||
‘AM_VALAFLAGS’
|
||
The maintainer’s variant of ‘VALAFLAGS’.
|
||
|
||
lib_LTLIBRARIES = libfoo.la
|
||
libfoo_la_SOURCES = foo.vala
|
||
|
||
Note that currently, you cannot use per-target ‘*_VALAFLAGS’ (*note
|
||
Renamed Objects::) to produce different C files from one Vala source
|
||
file.
|
||
|
||
|
||
File: automake.info, Node: Support for Other Languages, Next: Dependencies, Prev: Vala Support, Up: Programs
|
||
|
||
8.18 Support for Other Languages
|
||
================================
|
||
|
||
Automake currently only includes full support for C, C++ (*note C++
|
||
Support::), Objective C (*note Objective C Support::), Objective C++
|
||
(*note Objective C++ Support::), Fortran 77 (*note Fortran 77
|
||
Support::), Fortran 9x (*note Fortran 9x Support::), and Java (*note
|
||
Java Support with gcj::). There is only rudimentary support for other
|
||
languages, support for which will be improved based on user demand.
|
||
|
||
Some limited support for adding your own languages is available via
|
||
the suffix rule handling (*note Suffixes::).
|
||
|
||
|
||
File: automake.info, Node: Dependencies, Next: EXEEXT, Prev: Support for Other Languages, Up: Programs
|
||
|
||
8.19 Automatic dependency tracking
|
||
==================================
|
||
|
||
As a developer it is often painful to continually update the
|
||
‘Makefile.am’ whenever the include-file dependencies change in a
|
||
project. Automake supplies a way to automatically track dependency
|
||
changes (*note Dependency Tracking::).
|
||
|
||
Automake always uses complete dependencies for a compilation,
|
||
including system headers. Automake’s model is that dependency
|
||
computation should be a side effect of the build. To this end,
|
||
dependencies are computed by running all compilations through a special
|
||
wrapper program called ‘depcomp’. ‘depcomp’ understands how to coax
|
||
many different C and C++ compilers into generating dependency
|
||
information in the format it requires. ‘automake -a’ will install
|
||
‘depcomp’ into your source tree for you. If ‘depcomp’ can’t figure out
|
||
how to properly invoke your compiler, dependency tracking will simply be
|
||
disabled for your build.
|
||
|
||
Experience with earlier versions of Automake (*note Dependency
|
||
Tracking Evolution: (automake-history)Dependency Tracking Evolution.)
|
||
taught us that it is not reliable to generate dependencies only on the
|
||
maintainer’s system, as configurations vary too much. So instead
|
||
Automake implements dependency tracking at build time.
|
||
|
||
Automatic dependency tracking can be suppressed by putting
|
||
‘no-dependencies’ in the variable ‘AUTOMAKE_OPTIONS’, or passing
|
||
‘no-dependencies’ as an argument to ‘AM_INIT_AUTOMAKE’ (this should be
|
||
the preferred way). Or, you can invoke ‘automake’ with the ‘-i’ option.
|
||
Dependency tracking is enabled by default.
|
||
|
||
The person building your package also can choose to disable
|
||
dependency tracking by configuring with ‘--disable-dependency-tracking’.
|
||
|
||
|
||
File: automake.info, Node: EXEEXT, Prev: Dependencies, Up: Programs
|
||
|
||
8.20 Support for executable extensions
|
||
======================================
|
||
|
||
On some platforms, such as Windows, executables are expected to have an
|
||
extension such as ‘.exe’. On these platforms, some compilers (GCC among
|
||
them) will automatically generate ‘foo.exe’ when asked to generate
|
||
‘foo’.
|
||
|
||
Automake provides mostly-transparent support for this. Unfortunately
|
||
_mostly_ doesn’t yet mean _fully_. Until the English dictionary is
|
||
revised, you will have to assist Automake if your package must support
|
||
those platforms.
|
||
|
||
One thing you must be aware of is that, internally, Automake rewrites
|
||
something like this:
|
||
|
||
bin_PROGRAMS = liver
|
||
|
||
to this:
|
||
|
||
bin_PROGRAMS = liver$(EXEEXT)
|
||
|
||
The targets Automake generates are likewise given the ‘$(EXEEXT)’
|
||
extension.
|
||
|
||
The variables ‘TESTS’ and ‘XFAIL_TESTS’ (*note Simple Tests::) are
|
||
also rewritten if they contain filenames that have been declared as
|
||
programs in the same ‘Makefile’. (This is mostly useful when some
|
||
programs from ‘check_PROGRAMS’ are listed in ‘TESTS’.)
|
||
|
||
However, Automake cannot apply this rewriting to ‘configure’
|
||
substitutions. This means that if you are conditionally building a
|
||
program using such a substitution, then your ‘configure.ac’ must take
|
||
care to add ‘$(EXEEXT)’ when constructing the output variable.
|
||
|
||
Sometimes maintainers like to write an explicit link rule for their
|
||
program. Without executable extension support, this is easy—you simply
|
||
write a rule whose target is the name of the program. However, when
|
||
executable extension support is enabled, you must instead add the
|
||
‘$(EXEEXT)’ suffix.
|
||
|
||
This might be a nuisance for maintainers who know their package will
|
||
never run on a platform that has executable extensions. For those
|
||
maintainers, the ‘no-exeext’ option (*note Options::) will disable this
|
||
feature. This works in a fairly ugly way; if ‘no-exeext’ is seen, then
|
||
the presence of a rule for a target named ‘foo’ in ‘Makefile.am’ will
|
||
override an ‘automake’-generated rule for ‘foo$(EXEEXT)’. Without the
|
||
‘no-exeext’ option, this use will give a diagnostic.
|
||
|
||
|
||
File: automake.info, Node: Other Objects, Next: Other GNU Tools, Prev: Programs, Up: Top
|
||
|
||
9 Other Derived Objects
|
||
***********************
|
||
|
||
Automake can handle derived objects that are not C programs. Sometimes
|
||
the support for actually building such objects must be explicitly
|
||
supplied, but Automake will still automatically handle installation and
|
||
distribution.
|
||
|
||
* Menu:
|
||
|
||
* Scripts:: Executable scripts
|
||
* Headers:: Header files
|
||
* Data:: Architecture-independent data files
|
||
* Sources:: Derived sources
|
||
|
||
|
||
File: automake.info, Node: Scripts, Next: Headers, Up: Other Objects
|
||
|
||
9.1 Executable Scripts
|
||
======================
|
||
|
||
It is possible to define and install programs that are scripts. Such
|
||
programs are listed using the ‘SCRIPTS’ primary name. When the script
|
||
is distributed in its final, installable form, the ‘Makefile’ usually
|
||
looks as follows:
|
||
|
||
# Install my_script in $(bindir) and distribute it.
|
||
dist_bin_SCRIPTS = my_script
|
||
|
||
Scripts are not distributed by default; as we have just seen, those
|
||
that should be distributed can be specified using a ‘dist_’ prefix as
|
||
with other primaries.
|
||
|
||
Scripts can be installed in ‘bindir’, ‘sbindir’, ‘libexecdir’,
|
||
‘pkglibexecdir’, or ‘pkgdatadir’.
|
||
|
||
Scripts that need not be installed can be listed in ‘noinst_SCRIPTS’,
|
||
and among them, those which are needed only by ‘make check’ should go in
|
||
‘check_SCRIPTS’.
|
||
|
||
When a script needs to be built, the ‘Makefile.am’ should include the
|
||
appropriate rules. For instance the ‘automake’ program itself is a Perl
|
||
script that is generated from ‘automake.in’. Here is how this is
|
||
handled:
|
||
|
||
bin_SCRIPTS = automake
|
||
CLEANFILES = $(bin_SCRIPTS)
|
||
EXTRA_DIST = automake.in
|
||
|
||
do_subst = sed -e 's,[@]datadir[@],$(datadir),g' \
|
||
-e 's,[@]PERL[@],$(PERL),g' \
|
||
-e 's,[@]PACKAGE[@],$(PACKAGE),g' \
|
||
-e 's,[@]VERSION[@],$(VERSION),g' \
|
||
...
|
||
|
||
automake: automake.in Makefile
|
||
$(do_subst) < $(srcdir)/automake.in > automake
|
||
chmod +x automake
|
||
|
||
Such scripts for which a build rule has been supplied need to be
|
||
deleted explicitly using ‘CLEANFILES’ (*note Clean::), and their sources
|
||
have to be distributed, usually with ‘EXTRA_DIST’ (*note Basics of
|
||
Distribution::).
|
||
|
||
Another common way to build scripts is to process them from
|
||
‘configure’ with ‘AC_CONFIG_FILES’. In this situation Automake knows
|
||
which files should be cleaned and distributed, and what the rebuild
|
||
rules should look like.
|
||
|
||
For instance if ‘configure.ac’ contains
|
||
|
||
AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script])
|
||
|
||
to build ‘src/my_script’ from ‘src/my_script.in’, then a
|
||
‘src/Makefile.am’ to install this script in ‘$(bindir)’ can be as simple
|
||
as
|
||
|
||
bin_SCRIPTS = my_script
|
||
CLEANFILES = $(bin_SCRIPTS)
|
||
|
||
There is no need for ‘EXTRA_DIST’ or any build rule: Automake infers
|
||
them from ‘AC_CONFIG_FILES’ (*note Requirements::). ‘CLEANFILES’ is
|
||
still useful, because by default Automake will clean targets of
|
||
‘AC_CONFIG_FILES’ in ‘distclean’, not ‘clean’.
|
||
|
||
Although this looks simpler, building scripts this way has one
|
||
drawback: directory variables such as ‘$(datadir)’ are not fully
|
||
expanded and may refer to other directory variables.
|
||
|
||
|
||
File: automake.info, Node: Headers, Next: Data, Prev: Scripts, Up: Other Objects
|
||
|
||
9.2 Header files
|
||
================
|
||
|
||
Header files that must be installed are specified by the ‘HEADERS’
|
||
family of variables. Headers can be installed in ‘includedir’,
|
||
‘oldincludedir’, ‘pkgincludedir’ or any other directory you may have
|
||
defined (*note Uniform::). For instance,
|
||
|
||
include_HEADERS = foo.h bar/bar.h
|
||
|
||
will install the two files as ‘$(includedir)/foo.h’ and
|
||
‘$(includedir)/bar.h’.
|
||
|
||
The ‘nobase_’ prefix is also supported,
|
||
|
||
nobase_include_HEADERS = foo.h bar/bar.h
|
||
|
||
will install the two files as ‘$(includedir)/foo.h’ and
|
||
‘$(includedir)/bar/bar.h’ (*note Alternative::).
|
||
|
||
Usually, only header files that accompany installed libraries need to
|
||
be installed. Headers used by programs or convenience libraries are not
|
||
installed. The ‘noinst_HEADERS’ variable can be used for such headers.
|
||
However when the header actually belongs to a single convenience library
|
||
or program, we recommend listing it in the program’s or library’s
|
||
‘_SOURCES’ variable (*note Program Sources::) instead of in
|
||
‘noinst_HEADERS’. This is clearer for the ‘Makefile.am’ reader.
|
||
‘noinst_HEADERS’ would be the right variable to use in a directory
|
||
containing only headers and no associated library or program.
|
||
|
||
All header files must be listed somewhere; in a ‘_SOURCES’ variable
|
||
or in a ‘_HEADERS’ variable. Missing ones will not appear in the
|
||
distribution.
|
||
|
||
For header files that are built and must not be distributed, use the
|
||
‘nodist_’ prefix as in ‘nodist_include_HEADERS’ or
|
||
‘nodist_prog_SOURCES’. If these generated headers are needed during the
|
||
build, you must also ensure they exist before they are used (*note
|
||
Sources::).
|
||
|
||
|
||
File: automake.info, Node: Data, Next: Sources, Prev: Headers, Up: Other Objects
|
||
|
||
9.3 Architecture-independent data files
|
||
=======================================
|
||
|
||
Automake supports the installation of miscellaneous data files using the
|
||
‘DATA’ family of variables.
|
||
|
||
Such data can be installed in the directories ‘datadir’,
|
||
‘sysconfdir’, ‘sharedstatedir’, ‘localstatedir’, or ‘pkgdatadir’.
|
||
|
||
By default, data files are _not_ included in a distribution. Of
|
||
course, you can use the ‘dist_’ prefix to change this on a per-variable
|
||
basis.
|
||
|
||
Here is how Automake declares its auxiliary data files:
|
||
|
||
dist_pkgdata_DATA = clean-kr.am clean.am ...
|
||
|
||
|
||
File: automake.info, Node: Sources, Prev: Data, Up: Other Objects
|
||
|
||
9.4 Built Sources
|
||
=================
|
||
|
||
Because Automake’s automatic dependency tracking works as a side-effect
|
||
of compilation (*note Dependencies::) there is a bootstrap issue: a
|
||
target should not be compiled before its dependencies are made, but
|
||
these dependencies are unknown until the target is first compiled.
|
||
|
||
Ordinarily this is not a problem, because dependencies are
|
||
distributed sources: they preexist and do not need to be built. Suppose
|
||
that ‘foo.c’ includes ‘foo.h’. When it first compiles ‘foo.o’, ‘make’
|
||
only knows that ‘foo.o’ depends on ‘foo.c’. As a side-effect of this
|
||
compilation ‘depcomp’ records the ‘foo.h’ dependency so that following
|
||
invocations of ‘make’ will honor it. In these conditions, it’s clear
|
||
there is no problem: either ‘foo.o’ doesn’t exist and has to be built
|
||
(regardless of the dependencies), or accurate dependencies exist and
|
||
they can be used to decide whether ‘foo.o’ should be rebuilt.
|
||
|
||
It’s a different story if ‘foo.h’ doesn’t exist by the first ‘make’
|
||
run. For instance, there might be a rule to build ‘foo.h’. This time
|
||
‘file.o’’s build will fail because the compiler can’t find ‘foo.h’.
|
||
‘make’ failed to trigger the rule to build ‘foo.h’ first by lack of
|
||
dependency information.
|
||
|
||
The ‘BUILT_SOURCES’ variable is a workaround for this problem. A
|
||
source file listed in ‘BUILT_SOURCES’ is made on ‘make all’ or ‘make
|
||
check’ (or even ‘make install’) before other targets are processed.
|
||
However, such a source file is not _compiled_ unless explicitly
|
||
requested by mentioning it in some other ‘_SOURCES’ variable.
|
||
|
||
So, to conclude our introductory example, we could use ‘BUILT_SOURCES
|
||
= foo.h’ to ensure ‘foo.h’ gets built before any other target (including
|
||
‘foo.o’) during ‘make all’ or ‘make check’.
|
||
|
||
‘BUILT_SOURCES’ is actually a bit of a misnomer, as any file which
|
||
must be created early in the build process can be listed in this
|
||
variable. Moreover, all built sources do not necessarily have to be
|
||
listed in ‘BUILT_SOURCES’. For instance, a generated ‘.c’ file doesn’t
|
||
need to appear in ‘BUILT_SOURCES’ (unless it is included by another
|
||
source), because it’s a known dependency of the associated object.
|
||
|
||
It might be important to emphasize that ‘BUILT_SOURCES’ is honored
|
||
only by ‘make all’, ‘make check’ and ‘make install’. This means you
|
||
cannot build a specific target (e.g., ‘make foo’) in a clean tree if it
|
||
depends on a built source. However it will succeed if you have run
|
||
‘make all’ earlier, because accurate dependencies are already available.
|
||
|
||
The next section illustrates and discusses the handling of built
|
||
sources on a toy example.
|
||
|
||
* Menu:
|
||
|
||
* Built Sources Example:: Several ways to handle built sources.
|
||
|
||
|
||
File: automake.info, Node: Built Sources Example, Up: Sources
|
||
|
||
9.4.1 Built Sources Example
|
||
---------------------------
|
||
|
||
Suppose that ‘foo.c’ includes ‘bindir.h’, which is
|
||
installation-dependent and not distributed: it needs to be built. Here
|
||
‘bindir.h’ defines the preprocessor macro ‘bindir’ to the value of the
|
||
‘make’ variable ‘bindir’ (inherited from ‘configure’).
|
||
|
||
We suggest several implementations below. It’s not meant to be an
|
||
exhaustive listing of all ways to handle built sources, but it will give
|
||
you a few ideas if you encounter this issue.
|
||
|
||
First Try
|
||
.........
|
||
|
||
This first implementation will illustrate the bootstrap issue mentioned
|
||
in the previous section (*note Sources::).
|
||
|
||
Here is a tentative ‘Makefile.am’.
|
||
|
||
# This won't work.
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@
|
||
|
||
This setup doesn’t work, because Automake doesn’t know that ‘foo.c’
|
||
includes ‘bindir.h’. Remember, automatic dependency tracking works as a
|
||
side-effect of compilation, so the dependencies of ‘foo.o’ will be known
|
||
only after ‘foo.o’ has been compiled (*note Dependencies::). The
|
||
symptom is as follows.
|
||
|
||
% make
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
foo.c:2: bindir.h: No such file or directory
|
||
make: *** [foo.o] Error 1
|
||
|
||
In this example ‘bindir.h’ is not distributed nor installed, and it
|
||
is not even being built on-time. One may wonder if the
|
||
‘nodist_foo_SOURCES = bindir.h’ line has any use at all. This line
|
||
simply states that ‘bindir.h’ is a source of ‘foo’, so for instance, it
|
||
should be inspected while generating tags (*note Tags::). In other
|
||
words, it does not help our present problem, and the build would fail
|
||
identically without it.
|
||
|
||
Using ‘BUILT_SOURCES’
|
||
.....................
|
||
|
||
A solution is to require ‘bindir.h’ to be built before anything else.
|
||
This is what ‘BUILT_SOURCES’ is meant for (*note Sources::).
|
||
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
BUILT_SOURCES = bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@
|
||
|
||
See how ‘bindir.h’ gets built first:
|
||
|
||
% make
|
||
echo '#define bindir "/usr/local/bin"' >bindir.h
|
||
make all-am
|
||
make[1]: Entering directory `/home/adl/tmp'
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
gcc -g -O2 -o foo foo.o
|
||
make[1]: Leaving directory `/home/adl/tmp'
|
||
|
||
However, as said earlier, ‘BUILT_SOURCES’ applies only to the ‘all’,
|
||
‘check’, and ‘install’ targets. It still fails if you try to run ‘make
|
||
foo’ explicitly:
|
||
|
||
% make clean
|
||
test -z "bindir.h" || rm -f bindir.h
|
||
test -z "foo" || rm -f foo
|
||
rm -f *.o
|
||
% : > .deps/foo.Po # Suppress previously recorded dependencies
|
||
% make foo
|
||
source='foo.c' object='foo.o' libtool=no \
|
||
depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \
|
||
depmode=gcc /bin/sh ./depcomp \
|
||
gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c
|
||
foo.c:2: bindir.h: No such file or directory
|
||
make: *** [foo.o] Error 1
|
||
|
||
Recording Dependencies manually
|
||
...............................
|
||
|
||
Usually people are happy enough with ‘BUILT_SOURCES’ because they never
|
||
build targets such as ‘make foo’ before ‘make all’, as in the previous
|
||
example. However if this matters to you, you can avoid ‘BUILT_SOURCES’
|
||
and record such dependencies explicitly in the ‘Makefile.am’.
|
||
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
nodist_foo_SOURCES = bindir.h
|
||
foo.$(OBJEXT): bindir.h
|
||
CLEANFILES = bindir.h
|
||
bindir.h: Makefile
|
||
echo '#define bindir "$(bindir)"' >$@
|
||
|
||
You don’t have to list _all_ the dependencies of ‘foo.o’ explicitly,
|
||
only those that might need to be built. If a dependency already exists,
|
||
it will not hinder the first compilation and will be recorded by the
|
||
normal dependency tracking code. (Note that after this first
|
||
compilation the dependency tracking code will also have recorded the
|
||
dependency between ‘foo.o’ and ‘bindir.h’; so our explicit dependency is
|
||
really useful to the first build only.)
|
||
|
||
Adding explicit dependencies like this can be a bit dangerous if you
|
||
are not careful enough. This is due to the way Automake tries not to
|
||
overwrite your rules (it assumes you know better than it).
|
||
‘foo.$(OBJEXT): bindir.h’ supersedes any rule Automake may want to
|
||
output to build ‘foo.$(OBJEXT)’. It happens to work in this case
|
||
because Automake doesn’t have to output any ‘foo.$(OBJEXT):’ target: it
|
||
relies on a suffix rule instead (i.e., ‘.c.$(OBJEXT):’). Always check
|
||
the generated ‘Makefile.in’ if you do this.
|
||
|
||
Build ‘bindir.h’ from ‘configure’
|
||
.................................
|
||
|
||
It’s possible to define this preprocessor macro from ‘configure’, either
|
||
in ‘config.h’ (*note Defining Directories: (autoconf)Defining
|
||
Directories.), or by processing a ‘bindir.h.in’ file using
|
||
‘AC_CONFIG_FILES’ (*note Configuration Actions: (autoconf)Configuration
|
||
Actions.).
|
||
|
||
At this point it should be clear that building ‘bindir.h’ from
|
||
‘configure’ works well for this example. ‘bindir.h’ will exist before
|
||
you build any target, hence will not cause any dependency issue.
|
||
|
||
The Makefile can be shrunk as follows. We do not even have to
|
||
mention ‘bindir.h’.
|
||
|
||
bin_PROGRAMS = foo
|
||
foo_SOURCES = foo.c
|
||
|
||
However, it’s not always possible to build sources from ‘configure’,
|
||
especially when these sources are generated by a tool that needs to be
|
||
built first.
|
||
|
||
Build ‘bindir.c’, not ‘bindir.h’.
|
||
.................................
|
||
|
||
Another attractive idea is to define ‘bindir’ as a variable or function
|
||
exported from ‘bindir.o’, and build ‘bindir.c’ instead of ‘bindir.h’.
|
||
|
||
noinst_PROGRAMS = foo
|
||
foo_SOURCES = foo.c bindir.h
|
||
nodist_foo_SOURCES = bindir.c
|
||
CLEANFILES = bindir.c
|
||
bindir.c: Makefile
|
||
echo 'const char bindir[] = "$(bindir)";' >$@
|
||
|
||
‘bindir.h’ contains just the variable’s declaration and doesn’t need
|
||
to be built, so it won’t cause any trouble. ‘bindir.o’ is always
|
||
dependent on ‘bindir.c’, so ‘bindir.c’ will get built first.
|
||
|
||
Which is best?
|
||
..............
|
||
|
||
There is no panacea, of course. Each solution has its merits and
|
||
drawbacks.
|
||
|
||
You cannot use ‘BUILT_SOURCES’ if the ability to run ‘make foo’ on a
|
||
clean tree is important to you.
|
||
|
||
You won’t add explicit dependencies if you are leery of overriding an
|
||
Automake rule by mistake.
|
||
|
||
Building files from ‘./configure’ is not always possible, neither is
|
||
converting ‘.h’ files into ‘.c’ files.
|
||
|
||
|
||
File: automake.info, Node: Other GNU Tools, Next: Documentation, Prev: Other Objects, Up: Top
|
||
|
||
10 Other GNU Tools
|
||
******************
|
||
|
||
Since Automake is primarily intended to generate ‘Makefile.in’s for use
|
||
in GNU programs, it tries hard to interoperate with other GNU tools.
|
||
|
||
* Menu:
|
||
|
||
* Emacs Lisp:: Emacs Lisp
|
||
* gettext:: Gettext
|
||
* Libtool:: Libtool
|
||
* Java:: Java bytecode compilation (deprecated)
|
||
* Python:: Python
|
||
|
||
|
||
File: automake.info, Node: Emacs Lisp, Next: gettext, Up: Other GNU Tools
|
||
|
||
10.1 Emacs Lisp
|
||
===============
|
||
|
||
Automake provides some support for Emacs Lisp. The ‘LISP’ primary is
|
||
used to hold a list of ‘.el’ files. Possible prefixes for this primary
|
||
are ‘lisp_’ and ‘noinst_’. Note that if ‘lisp_LISP’ is defined, then
|
||
‘configure.ac’ must run ‘AM_PATH_LISPDIR’ (*note Macros::).
|
||
|
||
Lisp sources are not distributed by default. You can prefix the
|
||
‘LISP’ primary with ‘dist_’, as in ‘dist_lisp_LISP’ or
|
||
‘dist_noinst_LISP’, to indicate that these files should be distributed.
|
||
|
||
Automake will byte-compile all Emacs Lisp source files using the
|
||
Emacs found by ‘AM_PATH_LISPDIR’, if any was found. When performing
|
||
such byte-compilation, the flags specified in the (developer-reserved)
|
||
‘AM_ELCFLAGS’ and (user-reserved) ‘ELCFLAGS’ make variables will be
|
||
passed to the Emacs invocation.
|
||
|
||
Byte-compiled Emacs Lisp files are not portable among all versions of
|
||
Emacs, so it makes sense to turn this off if you expect sites to have
|
||
more than one version of Emacs installed. Furthermore, many packages
|
||
don’t actually benefit from byte-compilation. Still, we recommend that
|
||
you byte-compile your Emacs Lisp sources. It is probably better for
|
||
sites with strange setups to cope for themselves than to make the
|
||
installation less nice for everybody else.
|
||
|
||
There are two ways to avoid byte-compiling. Historically, we have
|
||
recommended the following construct.
|
||
|
||
lisp_LISP = file1.el file2.el
|
||
ELCFILES =
|
||
|
||
‘ELCFILES’ is an internal Automake variable that normally lists all
|
||
‘.elc’ files that must be byte-compiled. Automake defines ‘ELCFILES’
|
||
automatically from ‘lisp_LISP’. Emptying this variable explicitly
|
||
prevents byte-compilation.
|
||
|
||
Since Automake 1.8, we now recommend using ‘lisp_DATA’ instead:
|
||
|
||
lisp_DATA = file1.el file2.el
|
||
|
||
Note that these two constructs are not equivalent. ‘_LISP’ will not
|
||
install a file if Emacs is not installed, while ‘_DATA’ will always
|
||
install its files.
|
||
|
||
|
||
File: automake.info, Node: gettext, Next: Libtool, Prev: Emacs Lisp, Up: Other GNU Tools
|
||
|
||
10.2 Gettext
|
||
============
|
||
|
||
If ‘AM_GNU_GETTEXT’ is seen in ‘configure.ac’, then Automake turns on
|
||
support for GNU gettext, a message catalog system for
|
||
internationalization (*note Introduction: (gettext)Top.).
|
||
|
||
The ‘gettext’ support in Automake requires the addition of one or two
|
||
subdirectories to the package: ‘po’ and possibly also ‘intl’. The
|
||
latter is needed if ‘AM_GNU_GETTEXT’ is not invoked with the ‘external’
|
||
argument, or if ‘AM_GNU_GETTEXT_INTL_SUBDIR’ is used. Automake ensures
|
||
that these directories exist and are mentioned in ‘SUBDIRS’.
|
||
|
||
|
||
File: automake.info, Node: Libtool, Next: Java, Prev: gettext, Up: Other GNU Tools
|
||
|
||
10.3 Libtool
|
||
============
|
||
|
||
Automake provides support for GNU Libtool (*note Introduction:
|
||
(libtool)Top.) with the ‘LTLIBRARIES’ primary. *Note A Shared
|
||
Library::.
|
||
|
||
|
||
File: automake.info, Node: Java, Next: Python, Prev: Libtool, Up: Other GNU Tools
|
||
|
||
10.4 Java bytecode compilation (deprecated)
|
||
===========================================
|
||
|
||
Automake provides some minimal support for Java bytecode compilation
|
||
with the ‘JAVA’ primary (in addition to the support for compiling Java
|
||
to native machine code; *note Java Support with gcj::). Note however
|
||
that _the interface and most features described here are deprecated_.
|
||
Future Automake releases will strive to provide a better and cleaner
|
||
interface, which however _won’t be backward-compatible_; the present
|
||
interface will probably be removed altogether some time after the
|
||
introduction of the new interface (if that ever materializes). In any
|
||
case, the current ‘JAVA’ primary features are frozen and will no longer
|
||
be developed, not even to take bug fixes.
|
||
|
||
Any ‘.java’ files listed in a ‘_JAVA’ variable will be compiled with
|
||
‘JAVAC’ at build time. By default, ‘.java’ files are not included in
|
||
the distribution, you should use the ‘dist_’ prefix to distribute them.
|
||
|
||
Here is a typical setup for distributing ‘.java’ files and installing
|
||
the ‘.class’ files resulting from their compilation.
|
||
|
||
javadir = $(datadir)/java
|
||
dist_java_JAVA = a.java b.java ...
|
||
|
||
Currently Automake enforces the restriction that only one ‘_JAVA’
|
||
primary can be used in a given ‘Makefile.am’. The reason for this
|
||
restriction is that, in general, it isn’t possible to know which
|
||
‘.class’ files were generated from which ‘.java’ files, so it would be
|
||
impossible to know which files to install where. For instance, a
|
||
‘.java’ file can define multiple classes; the resulting ‘.class’ file
|
||
names cannot be predicted without parsing the ‘.java’ file.
|
||
|
||
There are a few variables that are used when compiling Java sources:
|
||
|
||
‘JAVAC’
|
||
The name of the Java compiler. This defaults to ‘javac’.
|
||
|
||
‘JAVACFLAGS’
|
||
The flags to pass to the compiler. This is considered to be a user
|
||
variable (*note User Variables::).
|
||
|
||
‘AM_JAVACFLAGS’
|
||
More flags to pass to the Java compiler. This, and not
|
||
‘JAVACFLAGS’, should be used when it is necessary to put Java
|
||
compiler flags into ‘Makefile.am’.
|
||
|
||
‘JAVAROOT’
|
||
The value of this variable is passed to the ‘-d’ option to ‘javac’.
|
||
It defaults to ‘$(top_builddir)’.
|
||
|
||
‘CLASSPATH_ENV’
|
||
This variable is a shell expression that is used to set the
|
||
‘CLASSPATH’ environment variable on the ‘javac’ command line. (In
|
||
the future we will probably handle class path setting differently.)
|
||
|
||
|
||
File: automake.info, Node: Python, Prev: Java, Up: Other GNU Tools
|
||
|
||
10.5 Python
|
||
===========
|
||
|
||
Automake provides support for Python compilation with the ‘PYTHON’
|
||
primary. A typical setup is to call ‘AM_PATH_PYTHON’ in ‘configure.ac’
|
||
and use a line like the following in ‘Makefile.am’:
|
||
|
||
python_PYTHON = tree.py leave.py
|
||
|
||
Any files listed in a ‘_PYTHON’ variable will be byte-compiled with
|
||
‘py-compile’ at install time. ‘py-compile’ actually creates both
|
||
standard (‘.pyc’) and optimized (‘.pyo’) byte-compiled versions of the
|
||
source files. Note that because byte-compilation occurs at install
|
||
time, any files listed in ‘noinst_PYTHON’ will not be compiled. Python
|
||
source files are included in the distribution by default, prepend
|
||
‘nodist_’ (as in ‘nodist_python_PYTHON’) to omit them.
|
||
|
||
Automake ships with an Autoconf macro called ‘AM_PATH_PYTHON’ that
|
||
will determine some Python-related directory variables (see below). If
|
||
you have called ‘AM_PATH_PYTHON’ from ‘configure.ac’, then you may use
|
||
the variables ‘python_PYTHON’ or ‘pkgpython_PYTHON’ to list Python
|
||
source files in your ‘Makefile.am’, depending on where you want your
|
||
files installed (see the definitions of ‘pythondir’ and ‘pkgpythondir’
|
||
below).
|
||
|
||
-- Macro: AM_PATH_PYTHON ([VERSION], [ACTION-IF-FOUND],
|
||
[ACTION-IF-NOT-FOUND])
|
||
|
||
Search for a Python interpreter on the system. This macro takes
|
||
three optional arguments. The first argument, if present, is the
|
||
minimum version of Python required for this package:
|
||
‘AM_PATH_PYTHON’ will skip any Python interpreter that is older
|
||
than VERSION. If an interpreter is found and satisfies VERSION,
|
||
then ACTION-IF-FOUND is run. Otherwise, ACTION-IF-NOT-FOUND is
|
||
run.
|
||
|
||
If ACTION-IF-NOT-FOUND is not specified, as in the following
|
||
example, the default is to abort ‘configure’.
|
||
|
||
AM_PATH_PYTHON([2.2])
|
||
|
||
This is fine when Python is an absolute requirement for the
|
||
package. If Python >= 2.5 was only _optional_ to the package,
|
||
‘AM_PATH_PYTHON’ could be called as follows.
|
||
|
||
AM_PATH_PYTHON([2.5],, [:])
|
||
|
||
If the ‘PYTHON’ variable is set when ‘AM_PATH_PYTHON’ is called,
|
||
then that will be the only Python interpreter that is tried.
|
||
|
||
‘AM_PATH_PYTHON’ creates the following output variables based on
|
||
the Python installation found during configuration.
|
||
|
||
‘PYTHON’
|
||
The name of the Python executable, or ‘:’ if no suitable
|
||
interpreter could be found.
|
||
|
||
Assuming ACTION-IF-NOT-FOUND is used (otherwise ‘./configure’ will
|
||
abort if Python is absent), the value of ‘PYTHON’ can be used to
|
||
setup a conditional in order to disable the relevant part of a
|
||
build as follows.
|
||
|
||
AM_PATH_PYTHON(,, [:])
|
||
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
|
||
|
||
‘PYTHON_VERSION’
|
||
The Python version number, in the form MAJOR.MINOR (e.g., ‘2.5’).
|
||
This is currently the value of ‘sys.version[:3]’.
|
||
|
||
‘PYTHON_PREFIX’
|
||
The string ‘${prefix}’. This term may be used in future work that
|
||
needs the contents of Python’s ‘sys.prefix’, but general consensus
|
||
is to always use the value from ‘configure’.
|
||
|
||
‘PYTHON_EXEC_PREFIX’
|
||
The string ‘${exec_prefix}’. This term may be used in future work
|
||
that needs the contents of Python’s ‘sys.exec_prefix’, but general
|
||
consensus is to always use the value from ‘configure’.
|
||
|
||
‘PYTHON_PLATFORM’
|
||
The canonical name used by Python to describe the operating system,
|
||
as given by ‘sys.platform’. This value is sometimes needed when
|
||
building Python extensions.
|
||
|
||
‘pythondir’
|
||
The directory name for the ‘site-packages’ subdirectory of the
|
||
standard Python install tree.
|
||
|
||
‘pkgpythondir’
|
||
This is the directory under ‘pythondir’ that is named after the
|
||
package. That is, it is ‘$(pythondir)/$(PACKAGE)’. It is provided
|
||
as a convenience.
|
||
|
||
‘pyexecdir’
|
||
This is the directory where Python extension modules (shared
|
||
libraries) should be installed. An extension module written in C
|
||
could be declared as follows to Automake:
|
||
|
||
pyexec_LTLIBRARIES = quaternion.la
|
||
quaternion_la_SOURCES = quaternion.c support.c support.h
|
||
quaternion_la_LDFLAGS = -avoid-version -module
|
||
|
||
‘pkgpyexecdir’
|
||
This is a convenience variable that is defined as
|
||
‘$(pyexecdir)/$(PACKAGE)’.
|
||
|
||
All of these directory variables have values that start with either
|
||
‘${prefix}’ or ‘${exec_prefix}’ unexpanded. This works fine in
|
||
‘Makefiles’, but it makes these variables hard to use in ‘configure’.
|
||
This is mandated by the GNU coding standards, so that the user can run
|
||
‘make prefix=/foo install’. The Autoconf manual has a section with more
|
||
details on this topic (*note Installation Directory Variables:
|
||
(autoconf)Installation Directory Variables.). See also *note Hard-Coded
|
||
Install Paths::.
|
||
|
||
|
||
File: automake.info, Node: Documentation, Next: Install, Prev: Other GNU Tools, Up: Top
|
||
|
||
11 Building documentation
|
||
*************************
|
||
|
||
Currently Automake provides support for Texinfo and man pages.
|
||
|
||
* Menu:
|
||
|
||
* Texinfo:: Texinfo
|
||
* Man Pages:: Man pages
|
||
|
||
|
||
File: automake.info, Node: Texinfo, Next: Man Pages, Up: Documentation
|
||
|
||
11.1 Texinfo
|
||
============
|
||
|
||
If the current directory contains Texinfo source, you must declare it
|
||
with the ‘TEXINFOS’ primary. Generally Texinfo files are converted into
|
||
info, and thus the ‘info_TEXINFOS’ variable is most commonly used here.
|
||
Any Texinfo source file should have the ‘.texi’ extension. Automake
|
||
also accepts ‘.txi’ or ‘.texinfo’ extensions, but their use is
|
||
discouraged now, and will elicit runtime warnings.
|
||
|
||
Automake generates rules to build ‘.info’, ‘.dvi’, ‘.ps’, ‘.pdf’ and
|
||
‘.html’ files from your Texinfo sources. Following the GNU Coding
|
||
Standards, only the ‘.info’ files are built by ‘make all’ and installed
|
||
by ‘make install’ (unless you use ‘no-installinfo’, see below).
|
||
Furthermore, ‘.info’ files are automatically distributed so that Texinfo
|
||
is not a prerequisite for installing your package.
|
||
|
||
It is worth noting that, contrary to what happens with the other
|
||
formats, the generated ‘.info’ files are by default placed in ‘srcdir’
|
||
rather than in the ‘builddir’. This can be changed with the
|
||
‘info-in-builddir’ option.
|
||
|
||
Other documentation formats can be built on request by ‘make dvi’,
|
||
‘make ps’, ‘make pdf’ and ‘make html’, and they can be installed with
|
||
‘make install-dvi’, ‘make install-ps’, ‘make install-pdf’ and ‘make
|
||
install-html’ explicitly. ‘make uninstall’ will remove everything: the
|
||
Texinfo documentation installed by default as well as all the above
|
||
optional formats.
|
||
|
||
All of these targets can be extended using ‘-local’ rules (*note
|
||
Extending::).
|
||
|
||
If the ‘.texi’ file ‘@include’s ‘version.texi’, then that file will
|
||
be automatically generated. The file ‘version.texi’ defines four
|
||
Texinfo flags you can reference using ‘@value{EDITION}’,
|
||
‘@value{VERSION}’, ‘@value{UPDATED}’, and ‘@value{UPDATED-MONTH}’.
|
||
|
||
‘EDITION’
|
||
‘VERSION’
|
||
Both of these flags hold the version number of your program. They
|
||
are kept separate for clarity.
|
||
|
||
‘UPDATED’
|
||
This holds the date the primary ‘.texi’ file was last modified.
|
||
|
||
‘UPDATED-MONTH’
|
||
This holds the name of the month in which the primary ‘.texi’ file
|
||
was last modified.
|
||
|
||
The ‘version.texi’ support requires the ‘mdate-sh’ script; this
|
||
script is supplied with Automake and automatically included when
|
||
‘automake’ is invoked with the ‘--add-missing’ option.
|
||
|
||
If you have multiple Texinfo files, and you want to use the
|
||
‘version.texi’ feature, then you have to have a separate version file
|
||
for each Texinfo file. Automake will treat any include in a Texinfo
|
||
file that matches ‘vers*.texi’ just as an automatically generated
|
||
version file.
|
||
|
||
Sometimes an info file actually depends on more than one ‘.texi’
|
||
file. For instance, in GNU Hello, ‘hello.texi’ includes the file
|
||
‘fdl.texi’. You can tell Automake about these dependencies using the
|
||
‘TEXI_TEXINFOS’ variable. Here is how GNU Hello does it:
|
||
|
||
info_TEXINFOS = hello.texi
|
||
hello_TEXINFOS = fdl.texi
|
||
|
||
By default, Automake requires the file ‘texinfo.tex’ to appear in the
|
||
same directory as the ‘Makefile.am’ file that lists the ‘.texi’ files.
|
||
If you used ‘AC_CONFIG_AUX_DIR’ in ‘configure.ac’ (*note Finding
|
||
‘configure’ Input: (autoconf)Input.), then ‘texinfo.tex’ is looked for
|
||
there. In both cases, ‘automake’ then supplies ‘texinfo.tex’ if
|
||
‘--add-missing’ is given, and takes care of its distribution. However,
|
||
if you set the ‘TEXINFO_TEX’ variable (see below), it overrides the
|
||
location of the file and turns off its installation into the source as
|
||
well as its distribution.
|
||
|
||
The option ‘no-texinfo.tex’ can be used to eliminate the requirement
|
||
for the file ‘texinfo.tex’. Use of the variable ‘TEXINFO_TEX’ is
|
||
preferable, however, because that allows the ‘dvi’, ‘ps’, and ‘pdf’
|
||
targets to still work.
|
||
|
||
Automake generates an ‘install-info’ rule; some people apparently use
|
||
this. By default, info pages are installed by ‘make install’, so
|
||
running ‘make install-info’ is pointless. This can be prevented via the
|
||
‘no-installinfo’ option. In this case, ‘.info’ files are not installed
|
||
by default, and user must request this explicitly using ‘make
|
||
install-info’.
|
||
|
||
By default, ‘make install-info’ and ‘make uninstall-info’ will try to
|
||
run the ‘install-info’ program (if available) to update (or
|
||
create/remove) the ‘${infodir}/dir’ index. If this is undesired, it can
|
||
be prevented by exporting the ‘AM_UPDATE_INFO_DIR’ variable to "‘no’".
|
||
|
||
The following variables are used by the Texinfo build rules.
|
||
|
||
‘MAKEINFO’
|
||
The name of the program invoked to build ‘.info’ files. This
|
||
variable is defined by Automake. If the ‘makeinfo’ program is
|
||
found on the system then it will be used by default; otherwise
|
||
‘missing’ will be used instead.
|
||
|
||
‘MAKEINFOHTML’
|
||
The command invoked to build ‘.html’ files. Automake defines this
|
||
to ‘$(MAKEINFO) --html’.
|
||
|
||
‘MAKEINFOFLAGS’
|
||
User flags passed to each invocation of ‘$(MAKEINFO)’ and
|
||
‘$(MAKEINFOHTML)’. This user variable (*note User Variables::) is
|
||
not expected to be defined in any ‘Makefile’; it can be used by
|
||
users to pass extra flags to suit their needs.
|
||
|
||
‘AM_MAKEINFOFLAGS’
|
||
‘AM_MAKEINFOHTMLFLAGS’
|
||
Maintainer flags passed to each ‘makeinfo’ invocation. Unlike
|
||
‘MAKEINFOFLAGS’, these variables are meant to be defined by
|
||
maintainers in ‘Makefile.am’. ‘$(AM_MAKEINFOFLAGS)’ is passed to
|
||
‘makeinfo’ when building ‘.info’ files; and
|
||
‘$(AM_MAKEINFOHTMLFLAGS)’ is used when building ‘.html’ files.
|
||
|
||
For instance, the following setting can be used to obtain one
|
||
single ‘.html’ file per manual, without node separators.
|
||
AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
|
||
|
||
‘AM_MAKEINFOHTMLFLAGS’ defaults to ‘$(AM_MAKEINFOFLAGS)’. This
|
||
means that defining ‘AM_MAKEINFOFLAGS’ without defining
|
||
‘AM_MAKEINFOHTMLFLAGS’ will impact builds of both ‘.info’ and
|
||
‘.html’ files.
|
||
|
||
‘TEXI2DVI’
|
||
The name of the command that converts a ‘.texi’ file into a ‘.dvi’
|
||
file. This defaults to ‘texi2dvi’, a script that ships with the
|
||
Texinfo package.
|
||
|
||
‘TEXI2PDF’
|
||
The name of the command that translates a ‘.texi’ file into a
|
||
‘.pdf’ file. This defaults to ‘$(TEXI2DVI) --pdf --batch’.
|
||
|
||
‘DVIPS’
|
||
The name of the command that builds a ‘.ps’ file out of a ‘.dvi’
|
||
file. This defaults to ‘dvips’.
|
||
|
||
‘TEXINFO_TEX’
|
||
|
||
If your package has Texinfo files in many directories, you can use
|
||
the variable ‘TEXINFO_TEX’ to tell Automake where to find the
|
||
canonical ‘texinfo.tex’ for your package. The value of this
|
||
variable should be the relative path from the current ‘Makefile.am’
|
||
to ‘texinfo.tex’:
|
||
|
||
TEXINFO_TEX = ../doc/texinfo.tex
|
||
|
||
|
||
File: automake.info, Node: Man Pages, Prev: Texinfo, Up: Documentation
|
||
|
||
11.2 Man Pages
|
||
==============
|
||
|
||
A package can also include man pages (but see the GNU standards on this
|
||
matter, *note (standards)Man Pages::.) Man pages are declared using the
|
||
‘MANS’ primary. Generally the ‘man_MANS’ variable is used. Man pages
|
||
are automatically installed in the correct subdirectory of ‘mandir’,
|
||
based on the file extension.
|
||
|
||
File extensions such as ‘.1c’ are handled by looking for the valid
|
||
part of the extension and using that to determine the correct
|
||
subdirectory of ‘mandir’. Valid section names are the digits ‘0’
|
||
through ‘9’, and the letters ‘l’ and ‘n’.
|
||
|
||
Sometimes developers prefer to name a man page something like
|
||
‘foo.man’ in the source, and then rename it to have the correct suffix,
|
||
for example ‘foo.1’, when installing the file. Automake also supports
|
||
this mode. For a valid section named SECTION, there is a corresponding
|
||
directory named ‘manSECTIONdir’, and a corresponding ‘_MANS’ variable.
|
||
Files listed in such a variable are installed in the indicated section.
|
||
If the file already has a valid suffix, then it is installed as-is;
|
||
otherwise the file suffix is changed to match the section.
|
||
|
||
For instance, consider this example:
|
||
man1_MANS = rename.man thesame.1 alsothesame.1c
|
||
|
||
In this case, ‘rename.man’ will be renamed to ‘rename.1’ when installed,
|
||
but the other files will keep their names.
|
||
|
||
By default, man pages are installed by ‘make install’. However,
|
||
since the GNU project does not require man pages, many maintainers do
|
||
not expend effort to keep the man pages up to date. In these cases, the
|
||
‘no-installman’ option will prevent the man pages from being installed
|
||
by default. The user can still explicitly install them via ‘make
|
||
install-man’.
|
||
|
||
For fast installation, with many files it is preferable to use
|
||
‘manSECTION_MANS’ over ‘man_MANS’ as well as files that do not need to
|
||
be renamed.
|
||
|
||
Man pages are not currently considered to be source, because it is
|
||
not uncommon for man pages to be automatically generated. Therefore
|
||
they are not automatically included in the distribution. However, this
|
||
can be changed by use of the ‘dist_’ prefix. For instance here is how
|
||
to distribute and install the two man pages of GNU ‘cpio’ (which
|
||
includes both Texinfo documentation and man pages):
|
||
|
||
dist_man_MANS = cpio.1 mt.1
|
||
|
||
The ‘nobase_’ prefix is meaningless for man pages and is disallowed.
|
||
|
||
Executables and manpages may be renamed upon installation (*note
|
||
Renaming::). For manpages this can be avoided by use of the ‘notrans_’
|
||
prefix. For instance, suppose an executable ‘foo’ allowing to access a
|
||
library function ‘foo’ from the command line. The way to avoid renaming
|
||
of the ‘foo.3’ manpage is:
|
||
|
||
man_MANS = foo.1
|
||
notrans_man_MANS = foo.3
|
||
|
||
‘notrans_’ must be specified first when used in conjunction with
|
||
either ‘dist_’ or ‘nodist_’ (*note Fine-grained Distribution Control::).
|
||
For instance:
|
||
|
||
notrans_dist_man3_MANS = bar.3
|
||
|
||
|
||
File: automake.info, Node: Install, Next: Clean, Prev: Documentation, Up: Top
|
||
|
||
12 What Gets Installed
|
||
**********************
|
||
|
||
Naturally, Automake handles the details of actually installing your
|
||
program once it has been built. All files named by the various
|
||
primaries are automatically installed in the appropriate places when the
|
||
user runs ‘make install’.
|
||
|
||
* Menu:
|
||
|
||
* Basics of Installation:: What gets installed where
|
||
* The Two Parts of Install:: Installing data and programs separately
|
||
* Extending Installation:: Adding your own rules for installation
|
||
* Staged Installs:: Installation in a temporary location
|
||
* Install Rules for the User:: Useful additional rules
|
||
|
||
|
||
File: automake.info, Node: Basics of Installation, Next: The Two Parts of Install, Up: Install
|
||
|
||
12.1 Basics of Installation
|
||
===========================
|
||
|
||
A file named in a primary is installed by copying the built file into
|
||
the appropriate directory. The base name of the file is used when
|
||
installing.
|
||
|
||
bin_PROGRAMS = hello subdir/goodbye
|
||
|
||
In this example, both ‘hello’ and ‘goodbye’ will be installed in
|
||
‘$(bindir)’.
|
||
|
||
Sometimes it is useful to avoid the basename step at install time.
|
||
For instance, you might have a number of header files in subdirectories
|
||
of the source tree that are laid out precisely how you want to install
|
||
them. In this situation you can use the ‘nobase_’ prefix to suppress
|
||
the base name step. For example:
|
||
|
||
nobase_include_HEADERS = stdio.h sys/types.h
|
||
|
||
will install ‘stdio.h’ in ‘$(includedir)’ and ‘types.h’ in
|
||
‘$(includedir)/sys’.
|
||
|
||
For most file types, Automake will install multiple files at once,
|
||
while avoiding command line length issues (*note Length Limitations::).
|
||
Since some ‘install’ programs will not install the same file twice in
|
||
one invocation, you may need to ensure that file lists are unique within
|
||
one variable such as ‘nobase_include_HEADERS’ above.
|
||
|
||
You should not rely on the order in which files listed in one
|
||
variable are installed. Likewise, to cater for parallel make, you
|
||
should not rely on any particular file installation order even among
|
||
different file types (library dependencies are an exception here).
|
||
|
||
|
||
File: automake.info, Node: The Two Parts of Install, Next: Extending Installation, Prev: Basics of Installation, Up: Install
|
||
|
||
12.2 The Two Parts of Install
|
||
=============================
|
||
|
||
Automake generates separate ‘install-data’ and ‘install-exec’ rules, in
|
||
case the installer is installing on multiple machines that share
|
||
directory structure—these targets allow the machine-independent parts to
|
||
be installed only once. ‘install-exec’ installs platform-dependent
|
||
files, and ‘install-data’ installs platform-independent files. The
|
||
‘install’ target depends on both of these targets. While Automake tries
|
||
to automatically segregate objects into the correct category, the
|
||
‘Makefile.am’ author is, in the end, responsible for making sure this is
|
||
done correctly.
|
||
|
||
Variables using the standard directory prefixes ‘data’, ‘info’,
|
||
‘man’, ‘include’, ‘oldinclude’, ‘pkgdata’, or ‘pkginclude’ are installed
|
||
by ‘install-data’.
|
||
|
||
Variables using the standard directory prefixes ‘bin’, ‘sbin’,
|
||
‘libexec’, ‘sysconf’, ‘localstate’, ‘lib’, or ‘pkglib’ are installed by
|
||
‘install-exec’.
|
||
|
||
For instance, ‘data_DATA’ files are installed by ‘install-data’,
|
||
while ‘bin_PROGRAMS’ files are installed by ‘install-exec’.
|
||
|
||
Any variable using a user-defined directory prefix with ‘exec’ in the
|
||
name (e.g., ‘myexecbin_PROGRAMS’) is installed by ‘install-exec’. All
|
||
other user-defined prefixes are installed by ‘install-data’.
|
||
|
||
|
||
File: automake.info, Node: Extending Installation, Next: Staged Installs, Prev: The Two Parts of Install, Up: Install
|
||
|
||
12.3 Extending Installation
|
||
===========================
|
||
|
||
It is possible to extend this mechanism by defining an
|
||
‘install-exec-local’ or ‘install-data-local’ rule. If these rules
|
||
exist, they will be run at ‘make install’ time. These rules can do
|
||
almost anything; care is required.
|
||
|
||
Automake also supports two install hooks, ‘install-exec-hook’ and
|
||
‘install-data-hook’. These hooks are run after all other install rules
|
||
of the appropriate type, exec or data, have completed. So, for
|
||
instance, it is possible to perform post-installation modifications
|
||
using an install hook. *Note Extending::, for some examples.
|
||
|