| \input texinfo @c -*-texinfo-*- |
| @c %**start of header |
| @setfilename automake.info |
| @settitle automake |
| @documentencoding UTF-8 |
| @documentlanguage en |
| @setchapternewpage off |
| @c %**end of header |
| |
| @include version.texi |
| |
| @c @ovar(ARG, DEFAULT) |
| @c ------------------- |
| @c The ARG is an optional argument. To be used for macro arguments in |
| @c their documentation (@defmac). |
| @macro ovar{varname} |
| @r{[}@var{\varname\}@r{]} |
| @end macro |
| |
| @set PACKAGE_BUGREPORT bug-automake@@gnu.org |
| |
| @copying |
| |
| This manual is for GNU Automake (version @value{VERSION}, |
| @value{UPDATED}), a program that creates GNU standards-compliant |
| Makefiles from template files. |
| |
| Copyright @copyright{} 1995-2018 Free Software Foundation, Inc. |
| |
| @quotation |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, |
| Version 1.3 or any later version published by the Free Software |
| Foundation; with no Invariant Sections, with no Front-Cover texts, |
| and with no Back-Cover Texts. A copy of the license is included in the |
| section entitled ``GNU Free Documentation License.'' |
| |
| @end quotation |
| @end copying |
| |
| @dircategory Software development |
| @direntry |
| * Automake: (automake). Making GNU standards-compliant Makefiles. |
| @end direntry |
| |
| @dircategory Individual utilities |
| @direntry |
| * aclocal-invocation: (automake)aclocal Invocation. Generating aclocal.m4. |
| * automake-invocation: (automake)automake Invocation. Generating Makefile.in. |
| @end direntry |
| |
| @titlepage |
| @title GNU Automake |
| @subtitle For version @value{VERSION}, @value{UPDATED} |
| @author David MacKenzie |
| @author Tom Tromey |
| @author Alexandre Duret-Lutz |
| @author Ralf Wildenhues |
| @author Stefano Lattarini |
| @page |
| @vskip 0pt plus 1filll |
| @insertcopying |
| @end titlepage |
| |
| @contents |
| |
| @c We use the following macros to define indices: |
| @c @cindex concepts, and anything that does not fit elsewhere |
| @c @vindex Makefile variables |
| @c @trindex targets |
| @c @acindex Autoconf/Automake/Libtool/M4/... macros |
| @c @opindex tool options |
| |
| @c Define an index of configure macros. |
| @defcodeindex ac |
| @c Define an index of options. |
| @defcodeindex op |
| @c Define an index of targets. |
| @defcodeindex tr |
| @c Define an index of commands. |
| @defcodeindex cm |
| |
| @c Put the macros in the function index. |
| @syncodeindex ac fn |
| |
| @c Put everything else into one index (arbitrarily chosen to be the |
| @c concept index). |
| @syncodeindex op cp |
| @syncodeindex tr cp |
| @syncodeindex cm cp |
| |
| @ifnottex |
| @node Top |
| @comment node-name, next, previous, up |
| @top GNU Automake |
| |
| @insertcopying |
| |
| @menu |
| * Introduction:: Automake's purpose |
| * Autotools Introduction:: An Introduction to the Autotools |
| * Generalities:: General ideas |
| * Examples:: Some example packages |
| * automake Invocation:: Creating a Makefile.in |
| * configure:: Scanning configure.ac, using aclocal |
| * Directories:: Declaring subdirectories |
| * Programs:: Building programs and libraries |
| * Other Objects:: Other derived objects |
| * Other GNU Tools:: Other GNU Tools |
| * Documentation:: Building documentation |
| * Install:: What gets installed |
| * Clean:: What gets cleaned |
| * Dist:: What goes in a distribution |
| * Tests:: Support for test suites |
| * Rebuilding:: Automatic rebuilding of Makefile |
| * Options:: Changing Automake's behavior |
| * Miscellaneous:: Miscellaneous rules |
| * Include:: Including extra files in an Automake template |
| * Conditionals:: Conditionals |
| * Silencing Make:: Obtain less verbose output from @command{make} |
| * Gnits:: The effect of @option{--gnu} and @option{--gnits} |
| * Not Enough:: When Automake is not Enough |
| * Distributing:: Distributing the Makefile.in |
| * API Versioning:: About compatibility between Automake versions |
| * Upgrading:: Upgrading to a Newer Automake Version |
| * FAQ:: Frequently Asked Questions |
| * Copying This Manual:: How to make copies of this manual |
| * Indices:: Indices of variables, macros, and concepts |
| |
| @detailmenu |
| --- The Detailed Node Listing --- |
| |
| An Introduction to the Autotools |
| |
| * GNU Build System:: Introducing the GNU Build System |
| * Use Cases:: Use Cases for the GNU Build System |
| * Why Autotools:: How Autotools Help |
| * Hello World:: A Small Hello World Package |
| |
| Use Cases for the GNU Build System |
| |
| * Basic Installation:: Common installation procedure |
| * Standard Targets:: A list of standard Makefile targets |
| * Standard Directory Variables:: A list of standard directory variables |
| * Standard Configuration Variables:: Using configuration variables |
| * config.site:: Using a config.site file |
| * VPATH Builds:: Parallel build trees |
| * Two-Part Install:: Installing data and programs separately |
| * Cross-Compilation:: Building for other architectures |
| * Renaming:: Renaming programs at install time |
| * DESTDIR:: Building binary packages with DESTDIR |
| * Preparing Distributions:: Rolling out tarballs |
| * Dependency Tracking:: Automatic dependency tracking |
| * Nested Packages:: The GNU Build Systems can be nested |
| |
| A Small Hello World |
| |
| * Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch |
| * amhello's configure.ac Setup Explained:: |
| * amhello's Makefile.am Setup Explained:: |
| |
| General ideas |
| |
| * General Operation:: General operation of Automake |
| * Strictness:: Standards conformance checking |
| * Uniform:: The Uniform Naming Scheme |
| * Length Limitations:: Staying below the command line length limit |
| * Canonicalization:: How derived variables are named |
| * User Variables:: Variables reserved for the user |
| * Auxiliary Programs:: Programs automake might require |
| |
| Some example packages |
| |
| * Complete:: A simple example, start to finish |
| * true:: Building true and false |
| |
| Scanning @file{configure.ac}, using @command{aclocal} |
| |
| * Requirements:: Configuration requirements |
| * Optional:: Other things Automake recognizes |
| * aclocal Invocation:: Auto-generating aclocal.m4 |
| * Macros:: Autoconf macros supplied with Automake |
| |
| Auto-generating aclocal.m4 |
| |
| * aclocal Options:: Options supported by aclocal |
| * Macro Search Path:: How aclocal finds .m4 files |
| * Extending aclocal:: Writing your own aclocal macros |
| * Local Macros:: Organizing local macros |
| * Serials:: Serial lines in Autoconf macros |
| * Future of aclocal:: aclocal's scheduled death |
| |
| Autoconf macros supplied with Automake |
| |
| * Public Macros:: Macros that you can use. |
| * Private Macros:: Macros that you should not use. |
| |
| Directories |
| |
| * Subdirectories:: Building subdirectories recursively |
| * Conditional Subdirectories:: Conditionally not building directories |
| * Alternative:: Subdirectories without recursion |
| * Subpackages:: Nesting packages |
| |
| Conditional Subdirectories |
| |
| * SUBDIRS vs DIST_SUBDIRS:: Two sets of directories |
| * Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories |
| * Subdirectories with AC_SUBST:: Another way for conditional recursion |
| * Unconfigured Subdirectories:: Not even creating a @samp{Makefile} |
| |
| Building Programs and Libraries |
| |
| * A Program:: Building a program |
| * A Library:: Building a library |
| * A Shared Library:: Building a Libtool library |
| * Program and Library Variables:: Variables controlling program and |
| library builds |
| * Default _SOURCES:: Default source files |
| * LIBOBJS:: Special handling for LIBOBJS and ALLOCA |
| * Program Variables:: Variables used when building a program |
| * Yacc and Lex:: Yacc and Lex support |
| * C++ Support:: Compiling C++ sources |
| * Objective C Support:: Compiling Objective C sources |
| * Objective C++ Support:: Compiling Objective C++ sources |
| * Unified Parallel C Support:: Compiling Unified Parallel C sources |
| * Assembly Support:: Compiling assembly sources |
| * Fortran 77 Support:: Compiling Fortran 77 sources |
| * Fortran 9x Support:: Compiling Fortran 9x sources |
| * Java Support with gcj:: Compiling Java sources using gcj |
| * Vala Support:: Compiling Vala sources |
| * Support for Other Languages:: Compiling other languages |
| * Dependencies:: Automatic dependency tracking |
| * EXEEXT:: Support for executable extensions |
| |
| Building a program |
| |
| * Program Sources:: Defining program sources |
| * Linking:: Linking with libraries or extra objects |
| * Conditional Sources:: Handling conditional sources |
| * Conditional Programs:: Building a program conditionally |
| |
| Building a Shared Library |
| |
| * Libtool Concept:: Introducing Libtool |
| * Libtool Libraries:: Declaring Libtool Libraries |
| * Conditional Libtool Libraries:: Building Libtool Libraries Conditionally |
| * Conditional Libtool Sources:: Choosing Library Sources Conditionally |
| * Libtool Convenience Libraries:: Building Convenience Libtool Libraries |
| * Libtool Modules:: Building Libtool Modules |
| * Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS |
| * LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA) |
| * Libtool Issues:: Common Issues Related to Libtool's Use |
| |
| Common Issues Related to Libtool's Use |
| |
| * Error required file ltmain.sh not found:: The need to run libtoolize |
| * Objects created both with libtool and without:: Avoid a specific build race |
| |
| Fortran 77 Support |
| |
| * Preprocessing Fortran 77:: Preprocessing Fortran 77 sources |
| * Compiling Fortran 77 Files:: Compiling Fortran 77 sources |
| * Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++ |
| |
| Mixing Fortran 77 With C and C++ |
| |
| * How the Linker is Chosen:: Automatic linker selection |
| |
| Fortran 9x Support |
| |
| * Compiling Fortran 9x Files:: Compiling Fortran 9x sources |
| |
| Other Derived Objects |
| |
| * Scripts:: Executable scripts |
| * Headers:: Header files |
| * Data:: Architecture-independent data files |
| * Sources:: Derived sources |
| |
| Built Sources |
| |
| * Built Sources Example:: Several ways to handle built sources. |
| |
| Other GNU Tools |
| |
| * Emacs Lisp:: Emacs Lisp |
| * gettext:: Gettext |
| * Libtool:: Libtool |
| * Java:: Java bytecode compilation (deprecated) |
| * Python:: Python |
| |
| Building documentation |
| |
| * Texinfo:: Texinfo |
| * Man Pages:: Man pages |
| |
| What Gets Installed |
| |
| * Basics of Installation:: What gets installed where |
| * The Two Parts of Install:: Installing data and programs separately |
| * Extending Installation:: Adding your own rules for installation |
| * Staged Installs:: Installation in a temporary location |
| * Install Rules for the User:: Useful additional rules |
| |
| What Goes in a Distribution |
| |
| * Basics of Distribution:: Files distributed by default |
| * Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes |
| * The dist Hook:: A target for last-minute distribution changes |
| * Checking the Distribution:: @samp{make distcheck} explained |
| * The Types of Distributions:: A variety of formats and compression methods |
| |
| Support for test suites |
| |
| * Generalities about Testing:: Generic concepts and terminology about testing |
| * Simple Tests:: Listing test scripts in @code{TESTS} |
| * Custom Test Drivers:: Writing and using custom test drivers |
| * Using the TAP test protocol:: Integrating test scripts that use the TAP protocol |
| * DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework |
| * Install Tests:: Running tests on installed packages |
| |
| Simple Tests |
| |
| * Scripts-based Testsuites:: Automake-specific concepts and terminology |
| * Serial Test Harness:: Older (and discouraged) serial test harness |
| * Parallel Test Harness:: Generic concurrent test harness |
| |
| Using the TAP test protocol |
| |
| * Introduction to TAP:: |
| * Use TAP with the Automake test harness:: |
| * Incompatibilities with other TAP parsers and drivers:: |
| * Links and external resources on TAP:: |
| |
| Custom Test Drivers |
| |
| * Overview of Custom Test Drivers Support:: |
| * Declaring Custom Test Drivers:: |
| * API for Custom Test Drivers:: |
| |
| API for Custom Test Drivers |
| |
| * Command-line arguments for test drivers:: |
| * Log files generation and test results recording:: |
| * Testsuite progress output:: |
| |
| Changing Automake's Behavior |
| |
| * Options generalities:: Semantics of Automake option |
| * List of Automake options:: A comprehensive list of Automake options |
| |
| Miscellaneous Rules |
| |
| * Tags:: Interfacing to cscope, etags and mkid |
| * Suffixes:: Handling new file extensions |
| |
| Conditionals |
| |
| * Usage of Conditionals:: Declaring conditional content |
| * Limits of Conditionals:: Enclosing complete statements |
| |
| Silencing Make |
| |
| * Make verbosity:: Make is verbose by default |
| * Tricks For Silencing Make:: Standard and generic ways to silence make |
| * Automake Silent Rules:: How Automake can help in silencing make |
| |
| When Automake Isn't Enough |
| |
| * Extending:: Adding new rules or overriding existing ones. |
| * Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s. |
| |
| Frequently Asked Questions about Automake |
| |
| * CVS:: CVS and generated files |
| * maintainer-mode:: missing and AM_MAINTAINER_MODE |
| * Wildcards:: Why doesn't Automake support wildcards? |
| * Limitations on File Names:: Limitations on source and installed file names |
| * Errors with distclean:: Files left in build directory after distclean |
| * Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS |
| * Renamed Objects:: Why are object files sometimes renamed? |
| * Per-Object Flags:: How to simulate per-object flags? |
| * Multiple Outputs:: Writing rules for tools with many output files |
| * Hard-Coded Install Paths:: Installing to hard-coded locations |
| * Debugging Make Rules:: Strategies when things don't work as expected |
| * Reporting Bugs:: Feedback on bugs and feature requests |
| |
| Copying This Manual |
| |
| * GNU Free Documentation License:: License for copying this manual |
| |
| Indices |
| |
| * Macro Index:: Index of Autoconf macros |
| * Variable Index:: Index of Makefile variables |
| * General Index:: General index |
| |
| @end detailmenu |
| @end menu |
| |
| @end ifnottex |
| |
| |
| @node Introduction |
| @chapter Introduction |
| |
| Automake is a tool for automatically generating @file{Makefile.in}s |
| from files called @file{Makefile.am}. Each @file{Makefile.am} is |
| basically a series of @command{make} variable |
| definitions@footnote{These variables are also called @dfn{make macros} |
| in Make terminology, however in this manual we reserve the term |
| @dfn{macro} for Autoconf's macros.}, with rules being thrown in |
| occasionally. The generated @file{Makefile.in}s are compliant with |
| the GNU Makefile standards. |
| |
| @cindex GNU Makefile standards |
| |
| The GNU Makefile Standards Document |
| (@pxref{Makefile Conventions, , , standards, The GNU Coding Standards}) |
| is long, complicated, and subject to change. The goal of Automake is to |
| remove the burden of Makefile maintenance from the back of the |
| individual GNU maintainer (and put it on the back of the Automake |
| maintainers). |
| |
| The typical Automake input file is simply a series of variable definitions. |
| Each such file is processed to create a @file{Makefile.in}. |
| |
| @cindex Constraints of Automake |
| @cindex Automake constraints |
| |
| Automake does constrain a project in certain ways; for instance, it |
| assumes that the project uses Autoconf (@pxref{Top, , Introduction, |
| autoconf, The Autoconf Manual}), and enforces certain restrictions on |
| the @file{configure.ac} contents. |
| |
| @cindex Automake requirements |
| @cindex Requirements, Automake |
| |
| Automake requires @command{perl} in order to generate the |
| @file{Makefile.in}s. However, the distributions created by Automake are |
| fully GNU standards-compliant, and do not require @command{perl} in order |
| to be built. |
| |
| @cindex Bugs, reporting |
| @cindex Reporting bugs |
| @cindex E-mail, bug reports |
| |
| For more information on bug reports, @xref{Reporting Bugs}. |
| |
| @node Autotools Introduction |
| @chapter An Introduction to the Autotools |
| |
| If you are new to Automake, maybe you know that it is part of a set of |
| tools called @emph{The Autotools}. Maybe you've already delved into a |
| package full of files named @file{configure}, @file{configure.ac}, |
| @file{Makefile.in}, @file{Makefile.am}, @file{aclocal.m4}, @dots{}, |
| some of them claiming to be @emph{generated by} Autoconf or Automake. |
| But the exact purpose of these files and their relations is probably |
| fuzzy. The goal of this chapter is to introduce you to this machinery, |
| to show you how it works and how powerful it is. If you've never |
| installed or seen such a package, do not worry: this chapter will walk |
| you through it. |
| |
| If you need some teaching material, more illustrations, or a less |
| @command{automake}-centered continuation, some slides for this |
| introduction are available in Alexandre Duret-Lutz's |
| @uref{http://www.lrde.epita.fr/@/~adl/@/autotools.html, |
| Autotools Tutorial}. |
| This chapter is the written version of the first part of his tutorial. |
| |
| @menu |
| * GNU Build System:: Introducing the GNU Build System |
| * Use Cases:: Use Cases for the GNU Build System |
| * Why Autotools:: How Autotools Help |
| * Hello World:: A Small Hello World Package |
| @end menu |
| |
| @node GNU Build System |
| @section Introducing the GNU Build System |
| @cindex GNU Build System, introduction |
| |
| It is a truth universally acknowledged, that as a developer in |
| possession of a new package, you must be in want of a build system. |
| |
| In the Unix world, such a build system is traditionally achieved using |
| the command @command{make} (@pxref{Top, , Overview, make, The GNU Make |
| Manual}). You express the recipe to build your package in a |
| @file{Makefile}. This file is a set of rules to build the files in |
| the package. For instance the program @file{prog} may be built by |
| running the linker on the files @file{main.o}, @file{foo.o}, and |
| @file{bar.o}; the file @file{main.o} may be built by running the |
| compiler on @file{main.c}; etc. Each time @command{make} is run, it |
| reads @file{Makefile}, checks the existence and modification time of |
| the files mentioned, decides what files need to be built (or rebuilt), |
| and runs the associated commands. |
| |
| When a package needs to be built on a different platform than the one |
| it was developed on, its @file{Makefile} usually needs to be adjusted. |
| For instance the compiler may have another name or require more |
| options. In 1991, David J. MacKenzie got tired of customizing |
| @file{Makefile} for the 20 platforms he had to deal with. Instead, he |
| handcrafted a little shell script called @file{configure} to |
| automatically adjust the @file{Makefile} (@pxref{Genesis, , Genesis, |
| autoconf, The Autoconf Manual}). Compiling his package was now |
| as simple as running @code{./configure && make}. |
| |
| @cindex GNU Coding Standards |
| |
| Today this process has been standardized in the GNU project. The GNU |
| Coding Standards (@pxref{Managing Releases, The Release Process, , |
| standards, The GNU Coding Standards}) explains how each package of the |
| GNU project should have a @file{configure} script, and the minimal |
| interface it should have. The @file{Makefile} too should follow some |
| established conventions. The result? A unified build system that |
| makes all packages almost indistinguishable by the installer. In its |
| simplest scenario, all the installer has to do is to unpack the |
| package, run @code{./configure && make && make install}, and repeat |
| with the next package to install. |
| |
| We call this build system the @dfn{GNU Build System}, since it was |
| grown out of the GNU project. However it is used by a vast number of |
| other packages: following any existing convention has its advantages. |
| |
| @cindex Autotools, introduction |
| |
| The Autotools are tools that will create a GNU Build System for your |
| package. Autoconf mostly focuses on @file{configure} and Automake on |
| @file{Makefile}s. It is entirely possible to create a GNU Build |
| System without the help of these tools. However it is rather |
| burdensome and error-prone. We will discuss this again after some |
| illustration of the GNU Build System in action. |
| |
| @node Use Cases |
| @section Use Cases for the GNU Build System |
| @cindex GNU Build System, use cases |
| @cindex GNU Build System, features |
| @cindex Features of the GNU Build System |
| @cindex Use Cases for the GNU Build System |
| @cindex @file{amhello-1.0.tar.gz}, location |
| @cindex @file{amhello-1.0.tar.gz}, use cases |
| |
| In this section we explore several use cases for the GNU Build System. |
| You can replay all of these examples on the @file{amhello-1.0.tar.gz} |
| package distributed with Automake. If Automake is installed on your |
| system, you should find a copy of this file in |
| @file{@var{prefix}/share/doc/automake/amhello-1.0.tar.gz}, where |
| @var{prefix} is the installation prefix specified during configuration |
| (@var{prefix} defaults to @file{/usr/local}, however if Automake was |
| installed by some GNU/Linux distribution it most likely has been set |
| to @file{/usr}). If you do not have a copy of Automake installed, |
| you can find a copy of this file inside the @file{doc/} directory of |
| the Automake package. |
| |
| Some of the following use cases present features that are in fact |
| extensions to the GNU Build System. Read: they are not specified by |
| the GNU Coding Standards, but they are nonetheless part of the build |
| system created by the Autotools. To keep things simple, we do not |
| point out the difference. Our objective is to show you many of the |
| features that the build system created by the Autotools will offer to |
| you. |
| |
| @menu |
| * Basic Installation:: Common installation procedure |
| * Standard Targets:: A list of standard Makefile targets |
| * Standard Directory Variables:: A list of standard directory variables |
| * Standard Configuration Variables:: Using configuration variables |
| * config.site:: Using a config.site file |
| * VPATH Builds:: Parallel build trees |
| * Two-Part Install:: Installing data and programs separately |
| * Cross-Compilation:: Building for other architectures |
| * Renaming:: Renaming programs at install time |
| * DESTDIR:: Building binary packages with DESTDIR |
| * Preparing Distributions:: Rolling out tarballs |
| * Dependency Tracking:: Automatic dependency tracking |
| * Nested Packages:: The GNU Build Systems can be nested |
| @end menu |
| |
| @node Basic Installation |
| @subsection Basic Installation |
| @cindex Configuration, basics |
| @cindex Installation, basics |
| @cindex GNU Build System, basics |
| |
| The most common installation procedure looks as follows. |
| |
| @example |
| ~ % @kbd{tar zxf amhello-1.0.tar.gz} |
| ~ % @kbd{cd amhello-1.0} |
| ~/amhello-1.0 % @kbd{./configure} |
| @dots{} |
| config.status: creating Makefile |
| config.status: creating src/Makefile |
| @dots{} |
| ~/amhello-1.0 % @kbd{make} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make check} |
| @dots{} |
| ~/amhello-1.0 % @kbd{su} |
| Password: |
| /home/adl/amhello-1.0 # @kbd{make install} |
| @dots{} |
| /home/adl/amhello-1.0 # @kbd{exit} |
| ~/amhello-1.0 % @kbd{make installcheck} |
| @dots{} |
| @end example |
| |
| @cindex Unpacking |
| |
| The user first unpacks the package. Here, and in the following |
| examples, we will use the non-portable @code{tar zxf} command for |
| simplicity. On a system without GNU @command{tar} installed, this |
| command should read @code{gunzip -c amhello-1.0.tar.gz | tar xf -}. |
| |
| The user then enters the newly created directory to run the |
| @file{configure} script. This script probes the system for various |
| features, and finally creates the @file{Makefile}s. In this toy |
| example there are only two @file{Makefile}s, but in real-world projects, |
| there may be many more, usually one @file{Makefile} per directory. |
| |
| It is now possible to run @code{make}. This will construct all the |
| programs, libraries, and scripts that need to be constructed for the |
| package. In our example, this compiles the @file{hello} program. |
| All files are constructed in place, in the source tree; we will see |
| later how this can be changed. |
| |
| @code{make check} causes the package's tests to be run. This step is |
| not mandatory, but it is often good to make sure the programs that |
| have been built behave as they should, before you decide to install |
| them. Our example does not contain any tests, so running @code{make |
| check} is a no-op. |
| |
| @cindex su, before @code{make install} |
| After everything has been built, and maybe tested, it is time to |
| install it on the system. That means copying the programs, |
| libraries, header files, scripts, and other data files from the |
| source directory to their final destination on the system. The |
| command @code{make install} will do that. However, by default |
| everything will be installed in subdirectories of @file{/usr/local}: |
| binaries will go into @file{/usr/local/bin}, libraries will end up in |
| @file{/usr/local/lib}, etc. This destination is usually not writable |
| by any user, so we assume that we have to become root before we can |
| run @code{make install}. In our example, running @code{make install} |
| will copy the program @file{hello} into @file{/usr/local/bin} |
| and @file{README} into @file{/usr/local/share/doc/amhello}. |
| |
| A last and optional step is to run @code{make installcheck}. This |
| command may run tests on the installed files. @code{make check} tests |
| the files in the source tree, while @code{make installcheck} tests |
| their installed copies. The tests run by the latter can be different |
| from those run by the former. For instance, there are tests that |
| cannot be run in the source tree. Conversely, some packages are set |
| up so that @code{make installcheck} will run the very same tests as |
| @code{make check}, only on different files (non-installed |
| vs.@: installed). It can make a difference, for instance when the |
| source tree's layout is different from that of the installation. |
| Furthermore it may help to diagnose an incomplete installation. |
| |
| Presently most packages do not have any @code{installcheck} tests |
| because the existence of @code{installcheck} is little known, and its |
| usefulness is neglected. Our little toy package is no better: @code{make |
| installcheck} does nothing. |
| |
| @node Standard Targets |
| @subsection Standard @file{Makefile} Targets |
| |
| So far we have come across four ways to run @command{make} in the GNU |
| Build System: @code{make}, @code{make check}, @code{make install}, and |
| @code{make installcheck}. The words @code{check}, @code{install}, and |
| @code{installcheck}, passed as arguments to @command{make}, are called |
| @dfn{targets}. @code{make} is a shorthand for @code{make all}, |
| @code{all} being the default target in the GNU Build System. |
| |
| Here is a list of the most useful targets that the GNU Coding Standards |
| specify. |
| |
| @table @code |
| @item make all |
| @trindex all |
| Build programs, libraries, documentation, etc.@: (same as @code{make}). |
| @item make install |
| @trindex install |
| Install what needs to be installed, copying the files from the |
| package's tree to system-wide directories. |
| @item make install-strip |
| @trindex install-strip |
| Same as @code{make install}, then strip debugging symbols. Some |
| users like to trade space for useful bug reports@enddots{} |
| @item make uninstall |
| @trindex uninstall |
| The opposite of @code{make install}: erase the installed files. |
| (This needs to be run from the same build tree that was installed.) |
| @item make clean |
| @trindex clean |
| Erase from the build tree the files built by @code{make all}. |
| @item make distclean |
| @trindex distclean |
| Additionally erase anything @code{./configure} created. |
| @item make check |
| @trindex check |
| Run the test suite, if any. |
| @item make installcheck |
| @trindex installcheck |
| Check the installed programs or libraries, if supported. |
| @item make dist |
| @trindex dist |
| Recreate @file{@var{package}-@var{version}.tar.gz} from all the source |
| files. |
| @end table |
| |
| @node Standard Directory Variables |
| @subsection Standard Directory Variables |
| @cindex directory variables |
| |
| The GNU Coding Standards also specify a hierarchy of variables to |
| denote installation directories. Some of these are: |
| |
| @multitable {Directory variable} {@code{$@{datarootdir@}/doc/$@{PACKAGE@}}} |
| @headitem Directory variable @tab Default value |
| @item @code{prefix} @tab @code{/usr/local} |
| @item @w{@ @ @code{exec_prefix}} @tab @code{$@{prefix@}} |
| @item @w{@ @ @ @ @code{bindir}} @tab @code{$@{exec_prefix@}/bin} |
| @item @w{@ @ @ @ @code{libdir}} @tab @code{$@{exec_prefix@}/lib} |
| @item @w{@ @ @ @ @dots{}} |
| @item @w{@ @ @code{includedir}} @tab @code{$@{prefix@}/include} |
| @item @w{@ @ @code{datarootdir}} @tab @code{$@{prefix@}/share} |
| @item @w{@ @ @ @ @code{datadir}} @tab @code{$@{datarootdir@}} |
| @item @w{@ @ @ @ @code{mandir}} @tab @code{$@{datarootdir@}/man} |
| @item @w{@ @ @ @ @code{infodir}} @tab @code{$@{datarootdir@}/info} |
| @item @w{@ @ @ @ @code{docdir}} @tab @code{$@{datarootdir@}/doc/$@{PACKAGE@}} |
| @item @w{@ @ @dots{}} |
| @end multitable |
| |
| @c We should provide a complete table somewhere, but not here. The |
| @c complete list of directory variables it too confusing as-is. It |
| @c requires some explanations that are too complicated for this |
| @c introduction. Besides listing directories like localstatedir |
| @c would make the explanations in ``Two-Part Install'' harder. |
| |
| Each of these directories has a role which is often obvious from its |
| name. In a package, any installable file will be installed in one of |
| these directories. For instance in @code{amhello-1.0}, the program |
| @file{hello} is to be installed in @var{bindir}, the directory for |
| binaries. The default value for this directory is |
| @file{/usr/local/bin}, but the user can supply a different value when |
| calling @command{configure}. Also the file @file{README} will be |
| installed into @var{docdir}, which defaults to |
| @file{/usr/local/share/doc/amhello}. |
| |
| @opindex --prefix |
| |
| As a user, if you wish to install a package on your own account, you |
| could proceed as follows: |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix ~/usr} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make install} |
| @dots{} |
| @end example |
| |
| This would install @file{~/usr/bin/hello} and |
| @file{~/usr/share/doc/amhello/README}. |
| |
| The list of all such directory options is shown by |
| @code{./configure --help}. |
| |
| @node Standard Configuration Variables |
| @subsection Standard Configuration Variables |
| @cindex configuration variables, overriding |
| |
| The GNU Coding Standards also define a set of standard configuration |
| variables used during the build. Here are some: |
| |
| @table @asis |
| @item @code{CC} |
| C compiler command |
| @item @code{CFLAGS} |
| C compiler flags |
| @item @code{CXX} |
| C++ compiler command |
| @item @code{CXXFLAGS} |
| C++ compiler flags |
| @item @code{LDFLAGS} |
| linker flags |
| @item @code{CPPFLAGS} |
| C/C++ preprocessor flags |
| @item @dots{} |
| @end table |
| |
| @command{configure} usually does a good job at setting appropriate |
| values for these variables, but there are cases where you may want to |
| override them. For instance you may have several versions of a |
| compiler installed and would like to use another one, you may have |
| header files installed outside the default search path of the |
| compiler, or even libraries out of the way of the linker. |
| |
| Here is how one would call @command{configure} to force it to use |
| @command{gcc-3} as C compiler, use header files from |
| @file{~/usr/include} when compiling, and libraries from |
| @file{~/usr/lib} when linking. |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \ |
| CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib} |
| @end example |
| |
| Again, a full list of these variables appears in the output of |
| @code{./configure --help}. |
| |
| @node config.site |
| @subsection Overriding Default Configuration Setting with @file{config.site} |
| @cindex @file{config.site} example |
| |
| When installing several packages using the same setup, it can be |
| convenient to create a file to capture common settings. |
| If a file named @file{@var{prefix}/share/config.site} exists, |
| @command{configure} will source it at the beginning of its execution. |
| |
| Recall the command from the previous section: |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix ~/usr CC=gcc-3 \ |
| CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib} |
| @end example |
| |
| Assuming we are installing many package in @file{~/usr}, and will |
| always want to use these definitions of @code{CC}, @code{CPPFLAGS}, and |
| @code{LDFLAGS}, we can automate this by creating the following |
| @file{~/usr/share/config.site} file: |
| |
| @example |
| test -z "$CC" && CC=gcc-3 |
| test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include |
| test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib |
| @end example |
| |
| Now, any time a @file{configure} script is using the @file{~/usr} |
| prefix, it will execute the above @file{config.site} and define |
| these three variables. |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix ~/usr} |
| configure: loading site script /home/adl/usr/share/config.site |
| @dots{} |
| @end example |
| |
| @xref{Site Defaults, , Setting Site Defaults, autoconf, The Autoconf |
| Manual}, for more information about this feature. |
| |
| |
| @node VPATH Builds |
| @subsection Parallel Build Trees (a.k.a.@: VPATH Builds) |
| @cindex Parallel build trees |
| @cindex VPATH builds |
| @cindex source tree and build tree |
| @cindex build tree and source tree |
| @cindex trees, source vs.@: build |
| |
| The GNU Build System distinguishes two trees: the source tree, and |
| the build tree. |
| |
| The source tree is rooted in the directory containing |
| @file{configure}. It contains all the sources files (those that are |
| distributed), and may be arranged using several subdirectories. |
| |
| The build tree is rooted in the directory in which @file{configure} |
| was run, and is populated with all object files, programs, libraries, |
| and other derived files built from the sources (and hence not |
| distributed). The build tree usually has the same subdirectory layout |
| as the source tree; its subdirectories are created automatically by |
| the build system. |
| |
| If @file{configure} is executed in its own directory, the source and |
| build trees are combined: derived files are constructed in the same |
| directories as their sources. This was the case in our first |
| installation example (@pxref{Basic Installation}). |
| |
| A common request from users is that they want to confine all derived |
| files to a single directory, to keep their source directories |
| uncluttered. Here is how we could run @file{configure} to build |
| everything in a subdirectory called @file{build/}. |
| |
| @example |
| ~ % @kbd{tar zxf ~/amhello-1.0.tar.gz} |
| ~ % @kbd{cd amhello-1.0} |
| ~/amhello-1.0 % @kbd{mkdir build && cd build} |
| ~/amhello-1.0/build % @kbd{../configure} |
| @dots{} |
| ~/amhello-1.0/build % @kbd{make} |
| @dots{} |
| @end example |
| |
| These setups, where source and build trees are different, are often |
| called @dfn{parallel builds} or @dfn{VPATH builds}. The expression |
| @emph{parallel build} is misleading: the word @emph{parallel} is a |
| reference to the way the build tree shadows the source tree, it is not |
| about some concurrency in the way build commands are run. For this |
| reason we refer to such setups using the name @emph{VPATH builds} in |
| the following. @emph{VPATH} is the name of the @command{make} feature |
| used by the @file{Makefile}s to allow these builds (@pxref{General |
| Search, , @code{VPATH} Search Path for All Prerequisites, make, The |
| GNU Make Manual}). |
| |
| @cindex multiple configurations, example |
| @cindex debug build, example |
| @cindex optimized build, example |
| |
| VPATH builds have other interesting uses. One is to build the same |
| sources with multiple configurations. For instance: |
| |
| @c Keep in sync with amhello-cflags.sh |
| @example |
| ~ % @kbd{tar zxf ~/amhello-1.0.tar.gz} |
| ~ % @kbd{cd amhello-1.0} |
| ~/amhello-1.0 % @kbd{mkdir debug optim && cd debug} |
| ~/amhello-1.0/debug % @kbd{../configure CFLAGS='-g -O0'} |
| @dots{} |
| ~/amhello-1.0/debug % @kbd{make} |
| @dots{} |
| ~/amhello-1.0/debug % cd ../optim |
| ~/amhello-1.0/optim % @kbd{../configure CFLAGS='-O3 -fomit-frame-pointer'} |
| @dots{} |
| ~/amhello-1.0/optim % @kbd{make} |
| @dots{} |
| @end example |
| |
| With network file systems, a similar approach can be used to build the |
| same sources on different machines. For instance, suppose that the |
| sources are installed on a directory shared by two hosts: @code{HOST1} |
| and @code{HOST2}, which may be different platforms. |
| |
| @example |
| ~ % @kbd{cd /nfs/src} |
| /nfs/src % @kbd{tar zxf ~/amhello-1.0.tar.gz} |
| @end example |
| |
| On the first host, you could create a local build directory: |
| @example |
| [HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh} |
| [HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure} |
| ... |
| [HOST1] /tmp/amh % @kbd{make && sudo make install} |
| ... |
| @end example |
| |
| @noindent |
| (Here we assume that the installer has configured @command{sudo} so it |
| can execute @code{make install} with root privileges; it is more convenient |
| than using @command{su} like in @ref{Basic Installation}). |
| |
| On the second host, you would do exactly the same, possibly at |
| the same time: |
| @example |
| [HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh} |
| [HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure} |
| ... |
| [HOST2] /tmp/amh % @kbd{make && sudo make install} |
| ... |
| @end example |
| |
| @cindex read-only source tree |
| @cindex source tree, read-only |
| |
| In this scenario, nothing forbids the @file{/nfs/src/amhello-1.0} |
| directory from being read-only. In fact VPATH builds are also a means |
| of building packages from a read-only medium such as a CD-ROM. (The |
| FSF used to sell CD-ROM with unpacked source code, before the GNU |
| project grew so big.) |
| |
| @node Two-Part Install |
| @subsection Two-Part Installation |
| |
| In our last example (@pxref{VPATH Builds}), a source tree was shared |
| by two hosts, but compilation and installation were done separately on |
| each host. |
| |
| The GNU Build System also supports networked setups where part of the |
| installed files should be shared amongst multiple hosts. It does so |
| by distinguishing architecture-dependent files from |
| architecture-independent files, and providing two @file{Makefile} |
| targets to install each of these classes of files. |
| |
| @trindex install-exec |
| @trindex install-data |
| |
| These targets are @code{install-exec} for architecture-dependent files |
| and @code{install-data} for architecture-independent files. |
| The command we used up to now, @code{make install}, can be thought of |
| as a shorthand for @code{make install-exec install-data}. |
| |
| From the GNU Build System point of view, the distinction between |
| architecture-dependent files and architecture-independent files is |
| based exclusively on the directory variable used to specify their |
| installation destination. In the list of directory variables we |
| provided earlier (@pxref{Standard Directory Variables}), all the |
| variables based on @var{exec-prefix} designate architecture-dependent |
| directories whose files will be installed by @code{make install-exec}. |
| The others designate architecture-independent directories and will |
| serve files installed by @code{make install-data}. @xref{The Two Parts |
| of Install}, for more details. |
| |
| Here is how we could revisit our two-host installation example, |
| assuming that (1) we want to install the package directly in |
| @file{/usr}, and (2) the directory @file{/usr/share} is shared by the |
| two hosts. |
| |
| On the first host we would run |
| @example |
| [HOST1] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh} |
| [HOST1] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr} |
| ... |
| [HOST1] /tmp/amh % @kbd{make && sudo make install} |
| ... |
| @end example |
| |
| On the second host, however, we need only install the |
| architecture-specific files. |
| @example |
| [HOST2] ~ % @kbd{mkdir /tmp/amh && cd /tmp/amh} |
| [HOST2] /tmp/amh % @kbd{/nfs/src/amhello-1.0/configure --prefix /usr} |
| ... |
| [HOST2] /tmp/amh % @kbd{make && sudo make install-exec} |
| ... |
| @end example |
| |
| In packages that have installation checks, it would make sense to run |
| @code{make installcheck} (@pxref{Basic Installation}) to verify that |
| the package works correctly despite the apparent partial installation. |
| |
| @node Cross-Compilation |
| @subsection Cross-Compilation |
| @cindex cross-compilation |
| |
| To @dfn{cross-compile} is to build on one platform a binary that will |
| run on another platform. When speaking of cross-compilation, it is |
| important to distinguish between the @dfn{build platform} on which |
| the compilation is performed, and the @dfn{host platform} on which the |
| resulting executable is expected to run. The following |
| @command{configure} options are used to specify each of them: |
| |
| @table @option |
| @item --build=@var{build} |
| @opindex --build=@var{build} |
| The system on which the package is built. |
| @item --host=@var{host} |
| @opindex --host=@var{host} |
| The system where built programs and libraries will run. |
| @end table |
| |
| When the @option{--host} is used, @command{configure} will search for |
| the cross-compiling suite for this platform. Cross-compilation tools |
| commonly have their target architecture as prefix of their name. For |
| instance my cross-compiler for MinGW32 has its binaries called |
| @code{i586-mingw32msvc-gcc}, @code{i586-mingw32msvc-ld}, |
| @code{i586-mingw32msvc-as}, etc. |
| |
| @cindex MinGW cross-compilation example |
| @cindex cross-compilation example |
| |
| Here is how we could build @code{amhello-1.0} for |
| @code{i586-mingw32msvc} on a GNU/Linux PC. |
| |
| @c Keep in sync with amhello-cross-compile.sh |
| @smallexample |
| ~/amhello-1.0 % @kbd{./configure --build i686-pc-linux-gnu --host i586-mingw32msvc} |
| checking for a BSD-compatible install... /usr/bin/install -c |
| checking whether build environment is sane... yes |
| checking for gawk... gawk |
| checking whether make sets $(MAKE)... yes |
| checking for i586-mingw32msvc-strip... i586-mingw32msvc-strip |
| checking for i586-mingw32msvc-gcc... i586-mingw32msvc-gcc |
| checking for C compiler default output file name... a.exe |
| checking whether the C compiler works... yes |
| checking whether we are cross compiling... yes |
| checking for suffix of executables... .exe |
| checking for suffix of object files... o |
| checking whether we are using the GNU C compiler... yes |
| checking whether i586-mingw32msvc-gcc accepts -g... yes |
| checking for i586-mingw32msvc-gcc option to accept ANSI C... |
| @dots{} |
| ~/amhello-1.0 % @kbd{make} |
| @dots{} |
| ~/amhello-1.0 % @kbd{cd src; file hello.exe} |
| hello.exe: MS Windows PE 32-bit Intel 80386 console executable not relocatable |
| @end smallexample |
| |
| The @option{--host} and @option{--build} options are usually all we |
| need for cross-compiling. The only exception is if the package being |
| built is itself a cross-compiler: we need a third option to specify |
| its target architecture. |
| |
| @table @option |
| @item --target=@var{target} |
| @opindex --target=@var{target} |
| When building compiler tools: the system for which the tools will |
| create output. |
| @end table |
| |
| For instance when installing GCC, the GNU Compiler Collection, we can |
| use @option{--target=@/@var{target}} to specify that we want to build |
| GCC as a cross-compiler for @var{target}. Mixing @option{--build} and |
| @option{--target}, we can actually cross-compile a cross-compiler; |
| such a three-way cross-compilation is known as a @dfn{Canadian cross}. |
| |
| @xref{Specifying Names, , Specifying the System Type, autoconf, The |
| Autoconf Manual}, for more information about these @command{configure} |
| options. |
| |
| @node Renaming |
| @subsection Renaming Programs at Install Time |
| @cindex Renaming programs |
| @cindex Transforming program names |
| @cindex Programs, renaming during installation |
| |
| The GNU Build System provides means to automatically rename |
| executables and manpages before they are installed (@pxref{Man Pages}). |
| This is especially convenient |
| when installing a GNU package on a system that already has a |
| proprietary implementation you do not want to overwrite. For instance, |
| you may want to install GNU @command{tar} as @command{gtar} so you can |
| distinguish it from your vendor's @command{tar}. |
| |
| This can be done using one of these three @command{configure} options. |
| |
| @table @option |
| @item --program-prefix=@var{prefix} |
| @opindex --program-prefix=@var{prefix} |
| Prepend @var{prefix} to installed program names. |
| @item --program-suffix=@var{suffix} |
| @opindex --program-suffix=@var{suffix} |
| Append @var{suffix} to installed program names. |
| @item --program-transform-name=@var{program} |
| @opindex --program-transform-name=@var{program} |
| Run @code{sed @var{program}} on installed program names. |
| @end table |
| |
| The following commands would install @file{hello} |
| as @file{/usr/local/bin/test-hello}, for instance. |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --program-prefix test-} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make} |
| @dots{} |
| ~/amhello-1.0 % @kbd{sudo make install} |
| @dots{} |
| @end example |
| |
| @node DESTDIR |
| @subsection Building Binary Packages Using DESTDIR |
| @vindex DESTDIR |
| |
| The GNU Build System's @code{make install} and @code{make uninstall} |
| interface does not exactly fit the needs of a system administrator |
| who has to deploy and upgrade packages on lots of hosts. In other |
| words, the GNU Build System does not replace a package manager. |
| |
| Such package managers usually need to know which files have been |
| installed by a package, so a mere @code{make install} is |
| inappropriate. |
| |
| @cindex Staged installation |
| |
| The @code{DESTDIR} variable can be used to perform a staged |
| installation. The package should be configured as if it was going to |
| be installed in its final location (e.g., @code{--prefix /usr}), but |
| when running @code{make install}, the @code{DESTDIR} should be set to |
| the absolute name of a directory into which the installation will be |
| diverted. From this directory it is easy to review which files are |
| being installed where, and finally copy them to their final location |
| by some means. |
| |
| @cindex Binary package |
| |
| For instance here is how we could create a binary package containing a |
| snapshot of all the files to be installed. |
| |
| @c Keep in sync with amhello-binpkg.sh |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix /usr} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make} |
| @dots{} |
| ~/amhello-1.0 % @kbd{make DESTDIR=$HOME/inst install} |
| @dots{} |
| ~/amhello-1.0 % @kbd{cd ~/inst} |
| ~/inst % @kbd{find . -type f -print > ../files.lst} |
| ~/inst % @kbd{tar zcvf ~/amhello-1.0-i686.tar.gz `cat ../files.lst`} |
| ./usr/bin/hello |
| ./usr/share/doc/amhello/README |
| @end example |
| |
| After this example, @code{amhello-1.0-i686.tar.gz} is ready to be |
| uncompressed in @file{/} on many hosts. (Using @code{`cat ../files.lst`} |
| instead of @samp{.} as argument for @command{tar} avoids entries for |
| each subdirectory in the archive: we would not like @command{tar} to |
| restore the modification time of @file{/}, @file{/usr/}, etc.) |
| |
| Note that when building packages for several architectures, it might |
| be convenient to use @code{make install-data} and @code{make |
| install-exec} (@pxref{Two-Part Install}) to gather |
| architecture-independent files in a single package. |
| |
| @xref{Install}, for more information. |
| |
| @c We should document PRE_INSTALL/POST_INSTALL/NORMAL_INSTALL and their |
| @c UNINSTALL counterparts. |
| |
| @node Preparing Distributions |
| @subsection Preparing Distributions |
| @cindex Preparing distributions |
| @cindex Packages, preparation |
| @cindex Distributions, preparation |
| |
| We have already mentioned @code{make dist}. This target collects all |
| your source files and the necessary parts of the build system to |
| create a tarball named @file{@var{package}-@var{version}.tar.gz}. |
| |
| @cindex @code{distcheck} better than @code{dist} |
| |
| Another, more useful command is @code{make distcheck}. The |
| @code{distcheck} target constructs |
| @file{@var{package}-@var{version}.tar.gz} just as well as @code{dist}, |
| but it additionally ensures most of the use cases presented so far |
| work: |
| |
| @itemize @bullet |
| @item |
| It attempts a full compilation of the package (@pxref{Basic |
| Installation}), unpacking the newly constructed tarball, running |
| @code{make}, @code{make check}, @code{make install}, as well as |
| @code{make installcheck}, and even @code{make dist}, |
| @item |
| it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}), |
| @item |
| it makes sure @code{make clean}, @code{make distclean}, and @code{make |
| uninstall} do not omit any file (@pxref{Standard Targets}), |
| @item |
| and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}). |
| @end itemize |
| |
| All of these actions are performed in a temporary directory, so that no |
| root privileges are required. Please note that the exact location and the |
| exact structure of such a subdirectory (where the extracted sources are |
| placed, how the temporary build and install directories are named and how |
| deeply they are nested, etc.) is to be considered an implementation detail, |
| which can change at any time; so do not rely on it. |
| |
| Releasing a package that fails @code{make distcheck} means that one of |
| the scenarios we presented will not work and some users will be |
| disappointed. Therefore it is a good practice to release a package |
| only after a successful @code{make distcheck}. This of course does |
| not imply that the package will be flawless, but at least it will |
| prevent some of the embarrassing errors you may find in packages |
| released by people who have never heard about @code{distcheck} (like |
| @code{DESTDIR} not working because of a typo, or a distributed file |
| being erased by @code{make clean}, or even @code{VPATH} builds not |
| working). |
| |
| @xref{Creating amhello}, to recreate @file{amhello-1.0.tar.gz} using |
| @code{make distcheck}. @xref{Checking the Distribution}, for more |
| information about @code{distcheck}. |
| |
| @node Dependency Tracking |
| @subsection Automatic Dependency Tracking |
| @cindex Dependency tracking |
| |
| Dependency tracking is performed as a side-effect of compilation. |
| Each time the build system compiles a source file, it computes its |
| list of dependencies (in C these are the header files included by the |
| source being compiled). Later, any time @command{make} is run and a |
| dependency appears to have changed, the dependent files will be |
| rebuilt. |
| |
| Automake generates code for automatic dependency tracking by default, |
| unless the developer chooses to override it; for more information, |
| @pxref{Dependencies}. |
| |
| When @command{configure} is executed, you can see it probing each |
| compiler for the dependency mechanism it supports (several mechanisms |
| can be used): |
| |
| @example |
| ~/amhello-1.0 % @kbd{./configure --prefix /usr} |
| @dots{} |
| checking dependency style of gcc... gcc3 |
| @dots{} |
| @end example |
| |
| Because dependencies are only computed as a side-effect of the |
| compilation, no dependency information exists the first time a package |
| is built. This is OK because all the files need to be built anyway: |
| @code{make} does not have to decide which files need to be rebuilt. |
| In fact, dependency tracking is completely useless for one-time builds |
| and there is a @command{configure} option to disable this: |
| |
| @table @option |
| @item --disable-dependency-tracking |
| @opindex --disable-dependency-tracking |
| Speed up one-time builds. |
| @end table |
| |
| Some compilers do not offer any practical way to derive the list of |
| dependencies as a side-effect of the compilation, requiring a separate |
| run (maybe of another tool) to compute these dependencies. The |
| performance penalty implied by these methods is important enough to |
| disable them by default. The option @option{--enable-dependency-tracking} |
| must be passed to @command{configure} to activate them. |
| |
| @table @option |
| @item --enable-dependency-tracking |
| @opindex --enable-dependency-tracking |
| Do not reject slow dependency extractors. |
| @end table |
| |
| @xref{Dependency Tracking Evolution, , Dependency Tracking Evolution, |
| automake-history, Brief History of Automake}, for some discussion about |
| the different dependency tracking schemes used by Automake over the years. |
| |
| @node Nested Packages |
| @subsection Nested Packages |
| @cindex Nested packages |
| @cindex Packages, nested |
| @cindex Subpackages |
| |
| Although nesting packages isn't something we would recommend to |
| someone who is discovering the Autotools, it is a nice feature worthy |
| of mention in this small advertising tour. |
| |
| Autoconfiscated packages (that means packages whose build system have |
| been created by Autoconf and friends) can be nested to arbitrary |
| depth. |
| |
| A typical setup is that package A will distribute one of the libraries |
| it needs in a subdirectory. This library B is a complete package with |
| its own GNU Build System. The @command{configure} script of A will |
| run the @command{configure} script of B as part of its execution, |
| building and installing A will also build and install B. Generating a |
| distribution for A will also include B. |
| |
| It is possible to gather several packages like this. GCC is a heavy |
| user of this feature. This gives installers a single package to |
| configure, build and install, while it allows developers to work on |
| subpackages independently. |
| |
| When configuring nested packages, the @command{configure} options |
| given to the top-level @command{configure} are passed recursively to |
| nested @command{configure}s. A package that does not understand an |
| option will ignore it, assuming it is meaningful to some other |
| package. |
| |
| @opindex --help=recursive |
| |
| The command @code{configure --help=recursive} can be used to display |
| the options supported by all the included packages. |
| |
| @xref{Subpackages}, for an example setup. |
| |
| @node Why Autotools |
| @section How Autotools Help |
| @cindex Autotools, purpose |
| |
| There are several reasons why you may not want to implement the GNU |
| Build System yourself (read: write a @file{configure} script and |
| @file{Makefile}s yourself). |
| |
| @itemize @bullet |
| @item |
| As we have seen, the GNU Build System has a lot of |
| features (@pxref{Use Cases}). |
| Some users may expect features you have not implemented because |
| you did not need them. |
| @item |
| Implementing these features portably is difficult and exhausting. |
| Think of writing portable shell scripts, and portable |
| @file{Makefile}s, for systems you may not have handy. @xref{Portable |
| Shell, , Portable Shell Programming, autoconf, The Autoconf Manual}, to |
| convince yourself. |
| @item |
| You will have to upgrade your setup to follow changes to the GNU |
| Coding Standards. |
| @end itemize |
| |
| The GNU Autotools take all this burden off your back and provide: |
| |
| @itemize @bullet |
| @item |
| Tools to create a portable, complete, and self-contained GNU Build |
| System, from simple instructions. |
| @emph{Self-contained} meaning the resulting build system does not |
| require the GNU Autotools. |
| @item |
| A central place where fixes and improvements are made: |
| a bug-fix for a portability issue will benefit every package. |
| @end itemize |
| |
| Yet there also exist reasons why you may want NOT to use the |
| Autotools@enddots{} For instance you may be already using (or used to) |
| another incompatible build system. Autotools will only be useful if |
| you do accept the concepts of the GNU Build System. People who have their |
| own idea of how a build system should work will feel frustrated by the |
| Autotools. |
| |
| @node Hello World |
| @section A Small Hello World |
| @cindex Example Hello World |
| @cindex Hello World example |
| @cindex @file{amhello-1.0.tar.gz}, creation |
| |
| In this section we recreate the @file{amhello-1.0} package from |
| scratch. The first subsection shows how to call the Autotools to |
| instantiate the GNU Build System, while the second explains the |
| meaning of the @file{configure.ac} and @file{Makefile.am} files read |
| by the Autotools. |
| |
| @anchor{amhello Explained} |
| @menu |
| * Creating amhello:: Create @file{amhello-1.0.tar.gz} from scratch |
| * amhello's configure.ac Setup Explained:: |
| * amhello's Makefile.am Setup Explained:: |
| @end menu |
| |
| @node Creating amhello |
| @subsection Creating @file{amhello-1.0.tar.gz} |
| |
| Here is how we can recreate @file{amhello-1.0.tar.gz} from scratch. |
| The package is simple enough so that we will only need to write 5 |
| files. (You may copy them from the final @file{amhello-1.0.tar.gz} |
| that is distributed with Automake if you do not want to write them.) |
| |
| Create the following files in an empty directory. |
| |
| @itemize @bullet |
| |
| @item |
| @file{src/main.c} is the source file for the @file{hello} program. We |
| store it in the @file{src/} subdirectory, because later, when the package |
| evolves, it will ease the addition of a @file{man/} directory for man |
| pages, a @file{data/} directory for data files, etc. |
| @example |
| ~/amhello % @kbd{cat src/main.c} |
| #include <config.h> |
| #include <stdio.h> |
| |
| int |
| main (void) |
| @{ |
| puts ("Hello World!"); |
| puts ("This is " PACKAGE_STRING "."); |
| return 0; |
| @} |
| @end example |
| |
| @item |
| @file{README} contains some very limited documentation for our little |
| package. |
| @example |
| ~/amhello % @kbd{cat README} |
| This is a demonstration package for GNU Automake. |
| Type 'info Automake' to read the Automake manual. |
| @end example |
| |
| @item |
| @file{Makefile.am} and @file{src/Makefile.am} contain Automake |
| instructions for these two directories. |
| |
| @example |
| ~/amhello % @kbd{cat src/Makefile.am} |
| bin_PROGRAMS = hello |
| hello_SOURCES = main.c |
| ~/amhello % @kbd{cat Makefile.am} |
| SUBDIRS = src |
| dist_doc_DATA = README |
| @end example |
| |
| @item |
| Finally, @file{configure.ac} contains Autoconf instructions to |
| create the @command{configure} script. |
| |
| @example |
| ~/amhello % @kbd{cat configure.ac} |
| AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}]) |
| AM_INIT_AUTOMAKE([-Wall -Werror foreign]) |
| AC_PROG_CC |
| AC_CONFIG_HEADERS([config.h]) |
| AC_CONFIG_FILES([ |
| Makefile |
| src/Makefile |
| ]) |
| AC_OUTPUT |
| @end example |
| @end itemize |
| |
| @cindex @command{autoreconf}, example |
| |
| Once you have these five files, it is time to run the Autotools to |
| instantiate the build system. Do this using the @command{autoreconf} |
| command as follows: |
| |
| @example |
| ~/amhello % @kbd{autoreconf --install} |
| configure.ac: installing './install-sh' |
| configure.ac: installing './missing' |
| configure.ac: installing './compile' |
| src/Makefile.am: installing './depcomp' |
| @end example |
| |
| At this point the build system is complete. |
| |
| In addition to the three scripts mentioned in its output, you can see |
| that @command{autoreconf} created four other files: @file{configure}, |
| @file{config.h.in}, @file{Makefile.in}, and @file{src/Makefile.in}. |
| The latter three files are templates that will be adapted to the |
| system by @command{configure} under the names @file{config.h}, |
| @file{Makefile}, and @file{src/Makefile}. Let's do this: |
| |
| @example |
| ~/amhello % @kbd{./configure} |
| checking for a BSD-compatible install... /usr/bin/install -c |
| checking whether build environment is sane... yes |
| checking for gawk... no |
| checking for mawk... mawk |
| checking whether make sets $(MAKE)... yes |
| checking for gcc... gcc |
| checking for C compiler default output file name... a.out |
| checking whether the C compiler works... yes |
| checking whether we are cross compiling... no |
| checking for suffix of executables... |
| checking for suffix of object files... o |
| checking whether we are using the GNU C compiler... yes |
| checking whether gcc accepts -g... yes |
| checking for gcc option to accept ISO C89... none needed |
| checking for style of include used by make... GNU |
| checking dependency style of gcc... gcc3 |
| configure: creating ./config.status |
| config.status: creating Makefile |
| config.status: creating src/Makefile |
| config.status: creating config.h |
| config.status: executing depfiles commands |
| @end example |
| |
| @trindex distcheck |
| @cindex @code{distcheck} example |
| |
| You can see @file{Makefile}, @file{src/Makefile}, and @file{config.h} |
| being created at the end after @command{configure} has probed the |
| system. It is now possible to run all the targets we wish |
| (@pxref{Standard Targets}). For instance: |
| |
| @example |
| ~/amhello % @kbd{make} |
| @dots{} |
| ~/amhello % @kbd{src/hello} |
| Hello World! |
| This is amhello 1.0. |
| ~/amhello % @kbd{make distcheck} |
| @dots{} |
| ============================================= |
| amhello-1.0 archives ready for distribution: |
| amhello-1.0.tar.gz |
| ============================================= |
| @end example |
| |
| Note that running @command{autoreconf} is only needed initially when |
| the GNU Build System does not exist. When you later change some |
| instructions in a @file{Makefile.am} or @file{configure.ac}, the |
| relevant part of the build system will be regenerated automatically |
| when you execute @command{make}. |
| |
| @command{autoreconf} is a script that calls @command{autoconf}, |
| @command{automake}, and a bunch of other commands in the right order. |
| If you are beginning with these tools, it is not important to figure |
| out in which order all of these tools should be invoked and why. However, |
| because Autoconf and Automake have separate manuals, the important |
| point to understand is that @command{autoconf} is in charge of |
| creating @file{configure} from @file{configure.ac}, while |
| @command{automake} is in charge of creating @file{Makefile.in}s from |
| @file{Makefile.am}s and @file{configure.ac}. This should at least |
| direct you to the right manual when seeking answers. |
| |
| |
| @node amhello's configure.ac Setup Explained |
| @subsection @code{amhello}'s @file{configure.ac} Setup Explained |
| |
| @cindex @file{configure.ac}, Hello World |
| |
| Let us begin with the contents of @file{configure.ac}. |
| |
| @example |
| AC_INIT([amhello], [1.0], [@value{PACKAGE_BUGREPORT}]) |
| AM_INIT_AUTOMAKE([-Wall -Werror foreign]) |
| AC_PROG_CC |
| AC_CONFIG_HEADERS([config.h]) |
| AC_CONFIG_FILES([ |
| Makefile |
| src/Makefile |
| ]) |
| AC_OUTPUT |
| @end example |
| |
| This file is read by both @command{autoconf} (to create |
| @file{configure}) and @command{automake} (to create the various |
| @file{Makefile.in}s). It contains a series of M4 macros that will be |
| expanded as shell code to finally form the @file{configure} script. |
| We will not elaborate on the syntax of this file, because the Autoconf |
| manual has a whole section about it (@pxref{Writing Autoconf Input, , |
| Writing @file{configure.ac}, autoconf, The Autoconf Manual}). |
| |
| The macros prefixed with @code{AC_} are Autoconf macros, documented |
| in the Autoconf manual (@pxref{Autoconf Macro Index, , Autoconf Macro |
| Index, autoconf, The Autoconf Manual}). The macros that start with |
| @code{AM_} are Automake macros, documented later in this manual |
| (@pxref{Macro Index}). |
| |
| The first two lines of @file{configure.ac} initialize Autoconf and |
| Automake. @code{AC_INIT} takes in as parameters the name of the package, |
| its version number, and a contact address for bug-reports about the |
| package (this address is output at the end of @code{./configure |
| --help}, for instance). When adapting this setup to your own package, |
| by all means please do not blindly copy Automake's address: use the |
| mailing list of your package, or your own mail address. |
| |
| @opindex -Wall |
| @opindex -Werror |
| @opindex foreign |
| |
| The argument to @code{AM_INIT_AUTOMAKE} is a list of options for |
| @command{automake} (@pxref{Options}). @option{-Wall} and |
| @option{-Werror} ask @command{automake} to turn on all warnings and |
| report them as errors. We are speaking of @strong{Automake} warnings |
| here, such as dubious instructions in @file{Makefile.am}. This has |
| absolutely nothing to do with how the compiler will be called, even |
| though it may support options with similar names. Using @option{-Wall |
| -Werror} is a safe setting when starting to work on a package: you do |
| not want to miss any issues. Later you may decide to relax things a |
| bit. The @option{foreign} option tells Automake that this package |
| will not follow the GNU Standards. GNU packages should always |
| distribute additional files such as @file{ChangeLog}, @file{AUTHORS}, |
| etc. We do not want @command{automake} to complain about these |
| missing files in our small example. |
| |
| The @code{AC_PROG_CC} line causes the @command{configure} script to |
| search for a C compiler and define the variable @code{CC} with its |
| name. The @file{src/Makefile.in} file generated by Automake uses the |
| variable @code{CC} to build @file{hello}, so when @command{configure} |
| creates @file{src/Makefile} from @file{src/Makefile.in}, it will define |
| @code{CC} with the value it has found. If Automake is asked to create |
| a @file{Makefile.in} that uses @code{CC} but @file{configure.ac} does |
| not define it, it will suggest you add a call to @code{AC_PROG_CC}. |
| |
| The @code{AC_CONFIG_HEADERS([config.h])} invocation causes the |
| @command{configure} script to create a @file{config.h} file gathering |
| @samp{#define}s defined by other macros in @file{configure.ac}. In our |
| case, the @code{AC_INIT} macro already defined a few of them. Here |
| is an excerpt of @file{config.h} after @command{configure} has run: |
| |
| @smallexample |
| @dots{} |
| /* Define to the address where bug reports for this package should be sent. */ |
| #define PACKAGE_BUGREPORT "@value{PACKAGE_BUGREPORT}" |
| |
| /* Define to the full name and version of this package. */ |
| #define PACKAGE_STRING "amhello 1.0" |
| @dots{} |
| @end smallexample |
| |
| As you probably noticed, @file{src/main.c} includes @file{config.h} so |
| it can use @code{PACKAGE_STRING}. In a real-world project, |
| @file{config.h} can grow really big, with one @samp{#define} per |
| feature probed on the system. |
| |
| The @code{AC_CONFIG_FILES} macro declares the list of files that |
| @command{configure} should create from their @file{*.in} templates. |
| Automake also scans this list to find the @file{Makefile.am} files it must |
| process. (This is important to remember: when adding a new directory |
| to your project, you should add its @file{Makefile} to this list, |
| otherwise Automake will never process the new @file{Makefile.am} you |
| wrote in that directory.) |
| |
| Finally, the @code{AC_OUTPUT} line is a closing command that actually |
| produces the part of the script in charge of creating the files |
| registered with @code{AC_CONFIG_HEADERS} and @code{AC_CONFIG_FILES}. |
| |
| @cindex @command{autoscan} |
| |
| When starting a new project, we suggest you start with such a simple |
| @file{configure.ac}, and gradually add the other tests it requires. |
| The command @command{autoscan} can also suggest a few of the tests |
| your package may need (@pxref{autoscan Invocation, , Using |
| @command{autoscan} to Create @file{configure.ac}, autoconf, The |
| Autoconf Manual}). |
| |
| |
| @node amhello's Makefile.am Setup Explained |
| @subsection @code{amhello}'s @file{Makefile.am} Setup Explained |
| |
| @cindex @file{Makefile.am}, Hello World |
| |
| We now turn to @file{src/Makefile.am}. This file contains |
| Automake instructions to build and install @file{hello}. |
| |
| @example |
| bin_PROGRAMS = hello |
| hello_SOURCES = main.c |
| @end example |
| |
| A @file{Makefile.am} has the same syntax as an ordinary |
| @file{Makefile}. When @command{automake} processes a |
| @file{Makefile.am} it copies the entire file into the output |
| @file{Makefile.in} (that will be later turned into @file{Makefile} by |
| @command{configure}) but will react to certain variable definitions |
| by generating some build rules and other variables. |
| Often @file{Makefile.am}s contain only a list of variable definitions as |
| above, but they can also contain other variable and rule definitions that |
| @command{automake} will pass along without interpretation. |
| |
| Variables that end with @code{_PROGRAMS} are special variables |
| that list programs that the resulting @file{Makefile} should build. |
| In Automake speak, this @code{_PROGRAMS} suffix is called a |
| @dfn{primary}; Automake recognizes other primaries such as |
| @code{_SCRIPTS}, @code{_DATA}, @code{_LIBRARIES}, etc.@: corresponding |
| to different types of files. |
| |
| The @samp{bin} part of the @code{bin_PROGRAMS} tells |
| @command{automake} that the resulting programs should be installed in |
| @var{bindir}. Recall that the GNU Build System uses a set of variables |
| to denote destination directories and allow users to customize these |
| locations (@pxref{Standard Directory Variables}). Any such directory |
| variable can be put in front of a primary (omitting the @code{dir} |
| suffix) to tell @command{automake} where to install the listed files. |
| |
| Programs need to be built from source files, so for each program |
| @code{@var{prog}} listed in a @code{@w{_PROGRAMS}} variable, |
| @command{automake} will look for another variable named |
| @code{@var{prog}_SOURCES} listing its source files. There may be more |
| than one source file: they will all be compiled and linked together. |
| |
| Automake also knows that source files need to be distributed when |
| creating a tarball (unlike built programs). So a side-effect of this |
| @code{hello_SOURCES} declaration is that @file{main.c} will be |
| part of the tarball created by @code{make dist}. |
| |
| Finally here are some explanations regarding the top-level |
| @file{Makefile.am}. |
| |
| @example |
| SUBDIRS = src |
| dist_doc_DATA = README |
| @end example |
| |
| @code{SUBDIRS} is a special variable listing all directories that |
| @command{make} should recurse into before processing the current |
| directory. So this line is responsible for @command{make} building |
| @file{src/hello} even though we run it from the top-level. This line |
| also causes @code{make install} to install @file{src/hello} before |
| installing @file{README} (not that this order matters). |
| |
| The line @code{dist_doc_DATA = README} causes @file{README} to be |
| distributed and installed in @var{docdir}. Files listed with the |
| @code{_DATA} primary are not automatically part of the tarball built |
| with @code{make dist}, so we add the @code{dist_} prefix so they get |
| distributed. However, for @file{README} it would not have been |
| necessary: @command{automake} automatically distributes any |
| @file{README} file it encounters (the list of other files |
| automatically distributed is presented by @code{automake --help}). |
| The only important effect of this second line is therefore to install |
| @file{README} during @code{make install}. |
| |
| One thing not covered in this example is accessing the installation |
| directory values (@pxref{Standard Directory Variables}) from your |
| program code, that is, converting them into defined macros. For this, |
| @pxref{Defining Directories,,, autoconf, The Autoconf Manual}. |
| |
| |
| @node Generalities |
| @chapter General ideas |
| |
| The following sections cover a few basic ideas that will help you |
| understand how Automake works. |
| |
| @menu |
| * General Operation:: General operation of Automake |
| * Strictness:: Standards conformance checking |
| * Uniform:: The Uniform Naming Scheme |
| * Length Limitations:: Staying below the command line length limit |
| * Canonicalization:: How derived variables are named |
| * User Variables:: Variables reserved for the user |
| * Auxiliary Programs:: Programs automake might require |
| @end menu |
| |
| |
| @node General Operation |
| @section General Operation |
| |
| Automake works by reading a @file{Makefile.am} and generating a |
| @file{Makefile.in}. Certain variables and rules defined in the |
| @file{Makefile.am} instruct Automake to generate more specialized code; |
| for instance, a @code{bin_PROGRAMS} variable definition will cause rules |
| for compiling and linking programs to be generated. |
| |
| @cindex Non-standard targets |
| @cindex @code{git-dist}, non-standard example |
| @trindex git-dist |
| |
| The variable definitions and rules in the @file{Makefile.am} are |
| copied mostly verbatim into the generated file, with all variable |
| definitions preceding all rules. This allows you to add almost |
| arbitrary code into the generated @file{Makefile.in}. For instance, |
| the Automake distribution includes a non-standard rule for the |
| @code{git-dist} target, which the Automake maintainer uses to make |
| distributions from the source control system. |
| |
| @cindex GNU make extensions |
| |
| Note that most GNU make extensions are not recognized by Automake. Using |
| such extensions in a @file{Makefile.am} will lead to errors or confusing |
| behavior. |
| |
| @cindex Append operator |
| @cmindex += |
| A special exception is that the GNU make append operator, @samp{+=}, is |
| supported. This operator appends its right hand argument to the variable |
| specified on the left. Automake will translate the operator into |
| an ordinary @samp{=} operator; @samp{+=} will thus work with any make program. |
| |
| Automake tries to keep comments grouped with any adjoining rules or |
| variable definitions. |
| |
| @cindex Limitations of automake parser |
| @cindex Automake parser, limitations of |
| @cindex indentation in Makefile.am |
| Generally, Automake is not particularly smart in the parsing of unusual |
| Makefile constructs, so you're advised to avoid fancy constructs or |
| ``creative'' use of whitespace. |
| @c Keep this in sync with doc-parsing-buglets-tabs.sh |
| For example, @key{TAB} characters cannot be used between a target name |
| and the following ``@code{:}'' character, and variable assignments |
| shouldn't be indented with @key{TAB} characters. |
| @c Keep this in sync with doc-parsing-buglets-colneq-subst.sh |
| Also, using more complex macro in target names can cause trouble: |
| |
| @example |
| % @kbd{cat Makefile.am} |
| $(FOO:=x): bar |
| % @kbd{automake} |
| Makefile.am:1: bad characters in variable name '$(FOO' |
| Makefile.am:1: ':='-style assignments are not portable |
| @end example |
| |
| @cindex Make targets, overriding |
| @cindex Make rules, overriding |
| @cindex Overriding make rules |
| @cindex Overriding make targets |
| |
| A rule defined in @file{Makefile.am} generally overrides any such |
| rule of a similar name that would be automatically generated by |
| @command{automake}. Although this is a supported feature, it is generally |
| best to avoid making use of it, as sometimes the generated rules are |
| very particular. |
| |
| @cindex Variables, overriding |
| @cindex Overriding make variables |
| |
| Similarly, a variable defined in @file{Makefile.am} or |
| @code{AC_SUBST}ed from @file{configure.ac} will override any |
| definition of the variable that @command{automake} would ordinarily |
| create. This feature is more often useful than the ability to |
| override a rule. Be warned that many of the variables generated by |
| @command{automake} are considered to be for internal use only, and their |
| names might change in future releases. |
| |
| @cindex Recursive operation of Automake |
| @cindex Automake, recursive operation |
| @cindex Example of recursive operation |
| |
| When examining a variable definition, Automake will recursively examine |
| variables referenced in the definition. For example, if Automake is |
| looking at the content of @code{foo_SOURCES} in this snippet |
| |
| @c Keep in sync with interp.sh |
| @example |
| xs = a.c b.c |
| foo_SOURCES = c.c $(xs) |
| @end example |
| |
| it would use the files @file{a.c}, @file{b.c}, and @file{c.c} as the |
| contents of @code{foo_SOURCES}. |
| |
| @cindex @code{##} (special Automake comment) |
| @cindex Special Automake comment |
| @cindex Comment, special to Automake |
| |
| Automake also allows a form of comment that is @emph{not} copied into |
| the output; all lines beginning with @samp{##} (leading spaces allowed) |
| are completely ignored by Automake. |
| |
| It is customary to make the first line of @file{Makefile.am} read: |
| |
| @cindex Makefile.am, first line |
| @cindex First line of Makefile.am |
| |
| @example |
| ## Process this file with automake to produce Makefile.in |
| @end example |
| |
| @c FIXME document customary ordering of Makefile.am here! |
| |
| |
| @node Strictness |
| @section Strictness |
| |
| @cindex Non-GNU packages |
| |
| While Automake is intended to be used by maintainers of GNU packages, it |
| does make some effort to accommodate those who wish to use it, but do |
| not want to use all the GNU conventions. |
| |
| @cindex Strictness, defined |
| @cindex Strictness, @option{foreign} |
| @cindex @option{foreign} strictness |
| @cindex Strictness, @option{gnu} |
| @cindex @option{gnu} strictness |
| @cindex Strictness, @option{gnits} |
| @cindex @option{gnits} strictness |
| |
| To this end, Automake supports three levels of @dfn{strictness}---the |
| strictness indicating how stringently Automake should check standards |
| conformance. |
| |
| The valid strictness levels are: |
| |
| @table @option |
| @item foreign |
| Automake will check for only those things that are absolutely |
| required for proper operations. For instance, whereas GNU standards |
| dictate the existence of a @file{NEWS} file, it will not be required in |
| this mode. This strictness will also turn off some warnings by default |
| (among them, portability warnings). |
| The name comes from the fact that Automake is intended to be |
| used for GNU programs; these relaxed rules are not the standard mode of |
| operation. |
| |
| @item gnu |
| Automake will check---as much as possible---for compliance to the GNU |
| standards for packages. This is the default. |
| |
| @item gnits |
| Automake will check for compliance to the as-yet-unwritten @dfn{Gnits |
| standards}. These are based on the GNU standards, but are even more |
| detailed. Unless you are a Gnits standards contributor, it is |
| recommended that you avoid this option until such time as the Gnits |
| standard is actually published (which may never happen). |
| @end table |
| |
| @xref{Gnits}, for more information on the precise implications of the |
| strictness level. |
| |
| |
| @node Uniform |
| @section The Uniform Naming Scheme |
| |
| @cindex Uniform naming scheme |
| |
| Automake variables generally follow a @dfn{uniform naming scheme} that |
| makes it easy to decide how programs (and other derived objects) are |
| built, and how they are installed. This scheme also supports |
| @command{configure} time determination of what should be built. |
| |
| @cindex @code{_PROGRAMS} primary variable |
| @cindex @code{PROGRAMS} primary variable |
| @cindex Primary variable, @code{PROGRAMS} |
| @cindex Primary variable, defined |
| @vindex _PROGRAMS |
| |
| At @command{make} time, certain variables are used to determine which |
| objects are to be built. The variable names are made of several pieces |
| that are concatenated together. |
| |
| The piece that tells @command{automake} what is being built is commonly called |
| the @dfn{primary}. For instance, the primary @code{PROGRAMS} holds a |
| list of programs that are to be compiled and linked. |
| @vindex PROGRAMS |
| |
| @cindex @code{pkgdatadir}, defined |
| @cindex @code{pkgincludedir}, defined |
| @cindex @code{pkglibdir}, defined |
| @cindex @code{pkglibexecdir}, defined |
| |
| @vindex pkgdatadir |
| @vindex pkgincludedir |
| @vindex pkglibdir |
| @vindex pkglibexecdir |
| |
| @cindex @code{PACKAGE}, directory |
| A different set of names is used to decide where the built objects |
| should be installed. These names are prefixes to the primary, and they |
| indicate which standard directory should be used as the installation |
| directory. The standard directory names are given in the GNU standards |
| (@pxref{Directory Variables, , , standards, The GNU Coding Standards}). |
| Automake extends this list with @code{pkgdatadir}, @code{pkgincludedir}, |
| @code{pkglibdir}, and @code{pkglibexecdir}; these are the same as the |
| non-@samp{pkg} versions, but with @samp{$(PACKAGE)} appended. For instance, |
| @code{pkglibdir} is defined as @samp{$(libdir)/$(PACKAGE)}. |
| |
| @cindex @code{EXTRA_}, prepending |
| For each primary, there is one additional variable named by prepending |
| @samp{EXTRA_} to the primary name. This variable is used to list |
| objects that may or may not be built, depending on what |
| @command{configure} decides. This variable is required because Automake |
| must statically know the entire list of objects that may be built in |
| order to generate a @file{Makefile.in} that will work in all cases. |
| |
| @cindex @code{EXTRA_PROGRAMS}, defined |
| @cindex Example, @code{EXTRA_PROGRAMS} |
| @cindex @command{cpio} example |
| |
| For instance, @command{cpio} decides at configure time which programs |
| should be built. Some of the programs are installed in @code{bindir}, |
| and some are installed in @code{sbindir}: |
| |
| @example |
| EXTRA_PROGRAMS = mt rmt |
| bin_PROGRAMS = cpio pax |
| sbin_PROGRAMS = $(MORE_PROGRAMS) |
| @end example |
| |
| Defining a primary without a prefix as a variable, e.g., |
| @samp{PROGRAMS}, is an error. |
| |
| Note that the common @samp{dir} suffix is left off when constructing the |
| variable names; thus one writes @samp{bin_PROGRAMS} and not |
| @samp{bindir_PROGRAMS}. |
| |
| Not every sort of object can be installed in every directory. Automake |
| will flag those attempts it finds in error (but see below how to override |
| the check if you really need to). |
| Automake will also diagnose obvious misspellings in directory names. |
| |
| @cindex Extending list of installation directories |
| @cindex Installation directories, extending list |
| |
| Sometimes the standard directories---even as augmented by |
| Automake---are not enough. In particular it is sometimes useful, for |
| clarity, to install objects in a subdirectory of some predefined |
| directory. To this end, Automake allows you to extend the list of |
| possible installation directories. A given prefix (e.g., @samp{zar}) |
| is valid if a variable of the same name with @samp{dir} appended is |
| defined (e.g., @samp{zardir}). |
| |
| For instance, the following snippet will install @file{file.xml} into |
| @samp{$(datadir)/xml}. |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| xmldir = $(datadir)/xml |
| xml_DATA = file.xml |
| @end example |
| |
| This feature can also be used to override the sanity checks Automake |
| performs to diagnose suspicious directory/primary couples (in the |
| unlikely case these checks are undesirable, and you really know what |
| you're doing). For example, Automake would error out on this input: |
| |
| @c Should be tested in primary-prefix-invalid-couples.sh |
| @example |
| # Forbidden directory combinations, automake will error out on this. |
| pkglib_PROGRAMS = foo |
| doc_LIBRARIES = libquux.a |
| @end example |
| |
| @noindent |
| but it will succeed with this: |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| # Work around forbidden directory combinations. Do not use this |
| # without a very good reason! |
| my_execbindir = $(pkglibdir) |
| my_doclibdir = $(docdir) |
| my_execbin_PROGRAMS = foo |
| my_doclib_LIBRARIES = libquux.a |
| @end example |
| |
| The @samp{exec} substring of the @samp{my_execbindir} variable lets |
| the files be installed at the right time (@pxref{The Two Parts of |
| Install}). |
| |
| @cindex @samp{noinst_} primary prefix, definition |
| @vindex noinst_ |
| |
| The special prefix @samp{noinst_} indicates that the objects in question |
| should be built but not installed at all. This is usually used for |
| objects required to build the rest of your package, for instance static |
| libraries (@pxref{A Library}), or helper scripts. |
| |
| @cindex @samp{check_} primary prefix, definition |
| @vindex check_ |
| |
| The special prefix @samp{check_} indicates that the objects in question |
| should not be built until the @samp{make check} command is run. Those |
| objects are not installed either. |
| |
| The current primary names are @samp{PROGRAMS}, @samp{LIBRARIES}, |
| @samp{LTLIBRARIES}, @samp{LISP}, @samp{PYTHON}, @samp{JAVA}, |
| @samp{SCRIPTS}, @samp{DATA}, @samp{HEADERS}, @samp{MANS}, and |
| @samp{TEXINFOS}. |
| @vindex PROGRAMS |
| @vindex LIBRARIES |
| @vindex LTLIBRARIES |
| @vindex LISP |
| @vindex PYTHON |
| @vindex JAVA |
| @vindex SCRIPTS |
| @vindex DATA |
| @vindex HEADERS |
| @vindex MANS |
| @vindex TEXINFOS |
| |
| Some primaries also allow additional prefixes that control other |
| aspects of @command{automake}'s behavior. The currently defined prefixes |
| are @samp{dist_}, @samp{nodist_}, @samp{nobase_}, and @samp{notrans_}. |
| These prefixes are explained later (@pxref{Program and Library Variables}) |
| (@pxref{Man Pages}). |
| |
| |
| @node Length Limitations |
| @section Staying below the command line length limit |
| |
| @cindex command line length limit |
| @cindex ARG_MAX |
| |
| Traditionally, most unix-like systems have a length limitation for the |
| command line arguments and environment contents when creating new |
| processes (see for example |
| @uref{http://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an |
| overview on this issue), |
| which of course also applies to commands spawned by @command{make}. |
| POSIX requires this limit to be at least 4096 bytes, and most modern |
| systems have quite high limits (or are unlimited). |
| |
| In order to create portable Makefiles that do not trip over these |
| limits, it is necessary to keep the length of file lists bounded. |
| Unfortunately, it is not possible to do so fully transparently within |
| Automake, so your help may be needed. Typically, you can split long |
| file lists manually and use different installation directory names for |
| each list. For example, |
| |
| @example |
| data_DATA = file1 @dots{} file@var{N} file@var{N+1} @dots{} file@var{2N} |
| @end example |
| |
| @noindent |
| may also be written as |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| data_DATA = file1 @dots{} file@var{N} |
| data2dir = $(datadir) |
| data2_DATA = file@var{N+1} @dots{} file@var{2N} |
| @end example |
| |
| @noindent |
| and will cause Automake to treat the two lists separately during |
| @code{make install}. See @ref{The Two Parts of Install} for choosing |
| directory names that will keep the ordering of the two parts of |
| installation Note that @code{make dist} may still only work on a host |
| with a higher length limit in this example. |
| |
| Automake itself employs a couple of strategies to avoid long command |
| lines. For example, when @samp{$@{srcdir@}/} is prepended to file |
| names, as can happen with above @code{$(data_DATA)} lists, it limits |
| the amount of arguments passed to external commands. |
| |
| Unfortunately, some system's @command{make} commands may prepend |
| @code{VPATH} prefixes like @samp{$@{srcdir@}/} to file names from the |
| source tree automatically (@pxref{Automatic Rule Rewriting, , Automatic |
| Rule Rewriting, autoconf, The Autoconf Manual}). In this case, the user |
| may have to switch to use GNU Make, or refrain from using VPATH builds, |
| in order to stay below the length limit. |
| |
| For libraries and programs built from many sources, convenience archives |
| may be used as intermediates in order to limit the object list length |
| (@pxref{Libtool Convenience Libraries}). |
| |
| |
| @node Canonicalization |
| @section How derived variables are named |
| |
| @cindex canonicalizing Automake variables |
| |
| Sometimes a Makefile variable name is derived from some text the |
| maintainer supplies. For instance, a program name listed in |
| @samp{_PROGRAMS} is rewritten into the name of a @samp{_SOURCES} |
| variable. In cases like this, Automake canonicalizes the text, so that |
| program names and the like do not have to follow Makefile variable naming |
| rules. All characters in the name except for letters, numbers, the |
| strudel (@@), and the underscore are turned into underscores when making |
| variable references. |
| |
| For example, if your program is named @file{sniff-glue}, the derived |
| variable name would be @samp{sniff_glue_SOURCES}, not |
| @samp{sniff-glue_SOURCES}. Similarly the sources for a library named |
| @file{libmumble++.a} should be listed in the |
| @samp{libmumble___a_SOURCES} variable. |
| |
| The strudel is an addition, to make the use of Autoconf substitutions in |
| variable names less obfuscating. |
| |
| |
| @node User Variables |
| @section Variables reserved for the user |
| |
| @cindex variables, reserved for the user |
| @cindex user variables |
| |
| Some @file{Makefile} variables are reserved by the GNU Coding Standards |
| for the use of the ``user''---the person building the package. For |
| instance, @code{CFLAGS} is one such variable. |
| |
| Sometimes package developers are tempted to set user variables such as |
| @code{CFLAGS} because it appears to make their job easier. However, |
| the package itself should never set a user variable, particularly not |
| to include switches that are required for proper compilation of the |
| package. Since these variables are documented as being for the |
| package builder, that person rightfully expects to be able to override |
| any of these variables at build time. |
| |
| To get around this problem, Automake introduces an automake-specific |
| shadow variable for each user flag variable. (Shadow variables are |
| not introduced for variables like @code{CC}, where they would make no |
| sense.) The shadow variable is named by prepending @samp{AM_} to the |
| user variable's name. For instance, the shadow variable for |
| @code{YFLAGS} is @code{AM_YFLAGS}. The package maintainer---that is, |
| the author(s) of the @file{Makefile.am} and @file{configure.ac} |
| files---may adjust these shadow variables however necessary. |
| |
| @xref{Flag Variables Ordering}, for more discussion about these |
| variables and how they interact with per-target variables. |
| |
| @node Auxiliary Programs |
| @section Programs automake might require |
| |
| @cindex Programs, auxiliary |
| @cindex Auxiliary programs |
| |
| Automake sometimes requires helper programs so that the generated |
| @file{Makefile} can do its work properly. There are a fairly large |
| number of them, and we list them here. |
| |
| Although all of these files are distributed and installed with |
| Automake, a couple of them are maintained separately. The Automake |
| copies are updated before each release, but we mention the original |
| source in case you need more recent versions. |
| |
| @table @code |
| @item ar-lib |
| This is a wrapper primarily for the Microsoft lib archiver, to make |
| it more POSIX-like. |
| |
| @item compile |
| This is a wrapper for compilers that do not accept options @option{-c} |
| and @option{-o} at the same time. It is only used when absolutely |
| required. Such compilers are rare, with the Microsoft C/C++ Compiler |
| as the most notable exception. This wrapper also makes the following |
| common options available for that compiler, while performing file name |
| translation where needed: @option{-I}, @option{-L}, @option{-l}, |
| @option{-Wl,} and @option{-Xlinker}. |
| |
| @item config.guess |
| @itemx config.sub |
| These two programs compute the canonical triplets for the given build, |
| host, or target architecture. These programs are updated regularly to |
| support new architectures and fix probes broken by changes in new |
| kernel versions. Each new release of Automake comes with up-to-date |
| copies of these programs. If your copy of Automake is getting old, |
| you are encouraged to fetch the latest versions of these files from |
| @url{https://savannah.gnu.org/git/?group=config} before making a |
| release. |
| |
| @item depcomp |
| This program understands how to run a compiler so that it will |
| generate not only the desired output but also dependency information |
| that is then used by the automatic dependency tracking feature |
| (@pxref{Dependencies}). |
| |
| @item install-sh |
| This is a replacement for the @command{install} program that works on |
| platforms where @command{install} is unavailable or unusable. |
| |
| @item mdate-sh |
| This script is used to generate a @file{version.texi} file. It examines |
| a file and prints some date information about it. |
| |
| @item missing |
| This wraps a number of programs that are typically only required by |
| maintainers. If the program in question doesn't exist, or seems to old, |
| @command{missing} will print an informative warning before failing out, |
| to provide the user with more context and information. |
| |
| @item mkinstalldirs |
| This script used to be a wrapper around @samp{mkdir -p}, which is not |
| portable. Now we prefer to use @samp{install-sh -d} when @command{configure} |
| finds that @samp{mkdir -p} does not work, this makes one less script to |
| distribute. |
| |
| For backward compatibility @file{mkinstalldirs} is still used and |
| distributed when @command{automake} finds it in a package. But it is no |
| longer installed automatically, and it should be safe to remove it. |
| |
| @item py-compile |
| This is used to byte-compile Python scripts. |
| |
| @item test-driver |
| This implements the default test driver offered by the parallel |
| testsuite harness. |
| |
| @item texinfo.tex |
| Not a program, this file is required for @samp{make dvi}, @samp{make |
| ps} and @samp{make pdf} to work when Texinfo sources are in the |
| package. The latest version can be downloaded from |
| @url{https://www.gnu.org/software/texinfo/}. |
| |
| @item ylwrap |
| This program wraps @command{lex} and @command{yacc} to rename their |
| output files. It also ensures that, for instance, multiple |
| @command{yacc} instances can be invoked in a single directory in |
| parallel. |
| |
| @end table |
| |
| |
| @node Examples |
| @chapter Some example packages |
| |
| This section contains two small examples. |
| |
| The first example (@pxref{Complete}) assumes you have an existing |
| project already using Autoconf, with handcrafted @file{Makefile}s, and |
| that you want to convert it to using Automake. If you are discovering |
| both tools, it is probably better that you look at the Hello World |
| example presented earlier (@pxref{Hello World}). |
| |
| The second example (@pxref{true}) shows how two programs can be built |
| from the same file, using different compilation parameters. It |
| contains some technical digressions that are probably best skipped on |
| first read. |
| |
| @menu |
| * Complete:: A simple example, start to finish |
| * true:: Building true and false |
| @end menu |
| |
| |
| @node Complete |
| @section A simple example, start to finish |
| |
| @cindex Complete example |
| |
| Let's suppose you just finished writing @code{zardoz}, a program to make |
| your head float from vortex to vortex. You've been using Autoconf to |
| provide a portability framework, but your @file{Makefile.in}s have been |
| ad-hoc. You want to make them bulletproof, so you turn to Automake. |
| |
| @cindex @code{AM_INIT_AUTOMAKE}, example use |
| |
| The first step is to update your @file{configure.ac} to include the |
| commands that @command{automake} needs. The way to do this is to add an |
| @code{AM_INIT_AUTOMAKE} call just after @code{AC_INIT}: |
| |
| @example |
| AC_INIT([zardoz], [1.0]) |
| AM_INIT_AUTOMAKE |
| @dots{} |
| @end example |
| |
| Since your program doesn't have any complicating factors (e.g., it |
| doesn't use @code{gettext}, it doesn't want to build a shared library), |
| you're done with this part. That was easy! |
| |
| @cindex @command{aclocal} program, introduction |
| @cindex @file{aclocal.m4}, preexisting |
| @cindex @file{acinclude.m4}, defined |
| |
| Now you must regenerate @file{configure}. But to do that, you'll need |
| to tell @command{autoconf} how to find the new macro you've used. The |
| easiest way to do this is to use the @command{aclocal} program to |
| generate your @file{aclocal.m4} for you. But wait@dots{} maybe you |
| already have an @file{aclocal.m4}, because you had to write some hairy |
| macros for your program. The @command{aclocal} program lets you put |
| your own macros into @file{acinclude.m4}, so simply rename and then |
| run: |
| |
| @example |
| mv aclocal.m4 acinclude.m4 |
| aclocal |
| autoconf |
| @end example |
| |
| @cindex @command{zardoz} example |
| |
| Now it is time to write your @file{Makefile.am} for @code{zardoz}. |
| Since @code{zardoz} is a user program, you want to install it where the |
| rest of the user programs go: @code{bindir}. Additionally, |
| @code{zardoz} has some Texinfo documentation. Your @file{configure.ac} |
| script uses @code{AC_REPLACE_FUNCS}, so you need to link against |
| @samp{$(LIBOBJS)}. So here's what you'd write: |
| |
| @example |
| bin_PROGRAMS = zardoz |
| zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c |
| zardoz_LDADD = $(LIBOBJS) |
| |
| info_TEXINFOS = zardoz.texi |
| @end example |
| |
| Now you can run @samp{automake --add-missing} to generate your |
| @file{Makefile.in} and grab any auxiliary files you might need, and |
| you're done! |
| |
| |
| @node true |
| @section Building true and false |
| |
| @cindex Example, @command{false} and @command{true} |
| @cindex @command{false} Example |
| @cindex @command{true} Example |
| |
| Here is another, trickier example. It shows how to generate two |
| programs (@code{true} and @code{false}) from the same source file |
| (@file{true.c}). The difficult part is that each compilation of |
| @file{true.c} requires different @code{cpp} flags. |
| |
| @example |
| bin_PROGRAMS = true false |
| false_SOURCES = |
| false_LDADD = false.o |
| |
| true.o: true.c |
| $(COMPILE) -DEXIT_CODE=0 -c true.c |
| |
| false.o: true.c |
| $(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c |
| @end example |
| |
| Note that there is no @code{true_SOURCES} definition. Automake will |
| implicitly assume that there is a source file named @file{true.c} |
| (@pxref{Default _SOURCES}), and |
| define rules to compile @file{true.o} and link @file{true}. The |
| @samp{true.o: true.c} rule supplied by the above @file{Makefile.am}, |
| will override the Automake generated rule to build @file{true.o}. |
| |
| @code{false_SOURCES} is defined to be empty---that way no implicit value |
| is substituted. Because we have not listed the source of |
| @file{false}, we have to tell Automake how to link the program. This is |
| the purpose of the @code{false_LDADD} line. A @code{false_DEPENDENCIES} |
| variable, holding the dependencies of the @file{false} target will be |
| automatically generated by Automake from the content of |
| @code{false_LDADD}. |
| |
| The above rules won't work if your compiler doesn't accept both |
| @option{-c} and @option{-o}. The simplest fix for this is to introduce a |
| bogus dependency (to avoid problems with a parallel @command{make}): |
| |
| @example |
| true.o: true.c false.o |
| $(COMPILE) -DEXIT_CODE=0 -c true.c |
| |
| false.o: true.c |
| $(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o |
| @end example |
| |
| As it turns out, there is also a much easier way to do this same task. |
| Some of the above technique is useful enough that we've kept the |
| example in the manual. However if you were to build @code{true} and |
| @code{false} in real life, you would probably use per-program |
| compilation flags, like so: |
| |
| @c Keep in sync with specflg7.sh and specflg8.sh |
| @example |
| bin_PROGRAMS = false true |
| |
| false_SOURCES = true.c |
| false_CPPFLAGS = -DEXIT_CODE=1 |
| |
| true_SOURCES = true.c |
| true_CPPFLAGS = -DEXIT_CODE=0 |
| @end example |
| |
| In this case Automake will cause @file{true.c} to be compiled twice, |
| with different flags. In this instance, the names of the object files |
| would be chosen by automake; they would be @file{false-true.o} and |
| @file{true-true.o}. (The name of the object files rarely matters.) |
| |
| @node automake Invocation |
| @chapter Creating a @file{Makefile.in} |
| @c This node used to be named "Invoking automake". This @anchor |
| @c allows old links to still work. |
| @anchor{Invoking automake} |
| |
| @cindex Multiple @file{configure.ac} files |
| @cindex Invoking @command{automake} |
| @cindex @command{automake}, invoking |
| @cindex Invocation of @command{automake} |
| @cindex @command{automake}, invocation |
| |
| To create all the @file{Makefile.in}s for a package, run the |
| @command{automake} program in the top level directory, with no |
| arguments. @command{automake} will automatically find each |
| appropriate @file{Makefile.am} (by scanning @file{configure.ac}; |
| @pxref{configure}) and generate the corresponding @file{Makefile.in}. |
| Note that @command{automake} has a rather simplistic view of what |
| constitutes a package; it assumes that a package has only one |
| @file{configure.ac}, at the top. If your package has multiple |
| @file{configure.ac}s, then you must run @command{automake} in each |
| directory holding a @file{configure.ac}. (Alternatively, you may rely |
| on Autoconf's @command{autoreconf}, which is able to recurse your |
| package tree and run @command{automake} where appropriate.) |
| |
| You can optionally give @command{automake} an argument; @file{.am} is |
| appended to the argument and the result is used as the name of the |
| input file. This feature is generally only used to automatically |
| rebuild an out-of-date @file{Makefile.in}. Note that |
| @command{automake} must always be run from the topmost directory of a |
| project, even if being used to regenerate the @file{Makefile.in} in |
| some subdirectory. This is necessary because @command{automake} must |
| scan @file{configure.ac}, and because @command{automake} uses the |
| knowledge that a @file{Makefile.in} is in a subdirectory to change its |
| behavior in some cases. |
| |
| @vindex AUTOCONF |
| Automake will run @command{autoconf} to scan @file{configure.ac} and |
| its dependencies (i.e., @file{aclocal.m4} and any included file), |
| therefore @command{autoconf} must be in your @env{PATH}. If there is |
| an @env{AUTOCONF} variable in your environment it will be used |
| instead of @command{autoconf}, this allows you to select a particular |
| version of Autoconf. By the way, don't misunderstand this paragraph: |
| @command{automake} runs @command{autoconf} to @strong{scan} your |
| @file{configure.ac}, this won't build @file{configure} and you still |
| have to run @command{autoconf} yourself for this purpose. |
| |
| @cindex @command{automake} options |
| @cindex Options, @command{automake} |
| @cindex Strictness, command line |
| |
| @command{automake} accepts the following options: |
| |
| @cindex Extra files distributed with Automake |
| @cindex Files distributed with Automake |
| @cindex @file{config.guess} |
| |
| @table @code |
| @item -a |
| @itemx --add-missing |
| @opindex -a |
| @opindex --add-missing |
| Automake requires certain common files to exist in certain situations; |
| for instance, @file{config.guess} is required if @file{configure.ac} invokes |
| @code{AC_CANONICAL_HOST}. Automake is distributed with several of these |
| files (@pxref{Auxiliary Programs}); this option will cause the missing |
| ones to be automatically added to the package, whenever possible. In |
| general if Automake tells you a file is missing, try using this option. |
| By default Automake tries to make a symbolic link pointing to its own |
| copy of the missing file; this can be changed with @option{--copy}. |
| |
| Many of the potentially-missing files are common scripts whose |
| location may be specified via the @code{AC_CONFIG_AUX_DIR} macro. |
| Therefore, @code{AC_CONFIG_AUX_DIR}'s setting affects whether a |
| file is considered missing, and where the missing file is added |
| (@pxref{Optional}). |
| |
| In some strictness modes, additional files are installed, see @ref{Gnits} |
| for more information. |
| |
| @item --libdir=@var{dir} |
| @opindex --libdir |
| Look for Automake data files in directory @var{dir} instead of in the |
| installation directory. This is typically used for debugging. |
| |
| @vindex AUTOMAKE_LIBDIR |
| The environment variable @env{AUTOMAKE_LIBDIR} provides another way to |
| set the directory containing Automake data files. However |
| @option{--libdir} takes precedence over it. |
| |
| @item --print-libdir |
| @opindex --print-libdir |
| Print the path of the installation directory containing Automake-provided |
| scripts and data files (like e.g., @file{texinfo.texi} and |
| @file{install-sh}). |
| |
| @item -c |
| @opindex -c |
| @itemx --copy |
| @opindex --copy |
| When used with @option{--add-missing}, causes installed files to be |
| copied. The default is to make a symbolic link. |
| |
| @item -f |
| @opindex -f |
| @itemx --force-missing |
| @opindex --force-missing |
| When used with @option{--add-missing}, causes standard files to be reinstalled |
| even if they already exist in the source tree. This involves removing |
| the file from the source tree before creating the new symlink (or, with |
| @option{--copy}, copying the new file). |
| |
| @item --foreign |
| @opindex --foreign |
| Set the global strictness to @option{foreign}. For more information, see |
| @ref{Strictness}. |
| |
| @item --gnits |
| @opindex --gnits |
| Set the global strictness to @option{gnits}. For more information, see |
| @ref{Gnits}. |
| |
| @item --gnu |
| @opindex --gnu |
| Set the global strictness to @option{gnu}. For more information, see |
| @ref{Gnits}. This is the default strictness. |
| |
| @item --help |
| @opindex --help |
| Print a summary of the command line options and exit. |
| |
| @item -i |
| @itemx --ignore-deps |
| @opindex -i |
| This disables the dependency tracking feature in generated |
| @file{Makefile}s; see @ref{Dependencies}. |
| |
| @item --include-deps |
| @opindex --include-deps |
| This enables the dependency tracking feature. This feature is enabled |
| by default. This option is provided for historical reasons only and |
| probably should not be used. |
| |
| @item --no-force |
| @opindex --no-force |
| Ordinarily @command{automake} creates all @file{Makefile.in}s mentioned in |
| @file{configure.ac}. This option causes it to only update those |
| @file{Makefile.in}s that are out of date with respect to one of their |
| dependents. |
| |
| @item -o @var{dir} |
| @itemx --output-dir=@var{dir} |
| @opindex -o |
| @opindex --output-dir |
| Put the generated @file{Makefile.in} in the directory @var{dir}. |
| Ordinarily each @file{Makefile.in} is created in the directory of the |
| corresponding @file{Makefile.am}. This option is deprecated and will be |
| removed in a future release. |
| |
| @item -v |
| @itemx --verbose |
| @opindex -v |
| @opindex --verbose |
| Cause Automake to print information about which files are being read or |
| created. |
| |
| @item --version |
| @opindex --version |
| Print the version number of Automake and exit. |
| |
| @item -W CATEGORY |
| @itemx --warnings=@var{category} |
| @opindex -W |
| @opindex --warnings |
| Output warnings falling in @var{category}. @var{category} can be |
| one of: |
| @table @code |
| @item gnu |
| warnings related to the GNU Coding Standards |
| (@pxref{Top, , , standards, The GNU Coding Standards}). |
| @item obsolete |
| obsolete features or constructions |
| @item override |
| user redefinitions of Automake rules or variables |
| @item portability |
| portability issues (e.g., use of @command{make} features that are |
| known to be not portable) |
| @item extra-portability |
| extra portability issues related to obscure tools. One example of such |
| a tool is the Microsoft @command{lib} archiver. |
| @item syntax |
| weird syntax, unused variables, typos |
| @item unsupported |
| unsupported or incomplete features |
| @item all |
| all the warnings |
| @item none |
| turn off all the warnings |
| @item error |
| treat warnings as errors |
| @end table |
| |
| A category can be turned off by prefixing its name with @samp{no-}. For |
| instance, @option{-Wno-syntax} will hide the warnings about unused |
| variables. |
| |
| The categories output by default are @samp{obsolete}, @samp{syntax} and |
| @samp{unsupported}. Additionally, @samp{gnu} and @samp{portability} |
| are enabled in @option{--gnu} and @option{--gnits} strictness. |
| |
| @c Checked by extra-portability.sh |
| Turning off @samp{portability} will also turn off @samp{extra-portability}, |
| and similarly turning on @samp{extra-portability} will also turn on |
| @samp{portability}. However, turning on @samp{portability} or turning |
| off @samp{extra-portability} will not affect the other category. |
| |
| @vindex WARNINGS |
| The environment variable @env{WARNINGS} can contain a comma separated |
| list of categories to enable. It will be taken into account before the |
| command-line switches, this way @option{-Wnone} will also ignore any |
| warning category enabled by @env{WARNINGS}. This variable is also used |
| by other tools like @command{autoconf}; unknown categories are ignored |
| for this reason. |
| |
| @end table |
| |
| @vindex AUTOMAKE_JOBS |
| If the environment variable @env{AUTOMAKE_JOBS} contains a positive |
| number, it is taken as the maximum number of Perl threads to use in |
| @command{automake} for generating multiple @file{Makefile.in} files |
| concurrently. This is an experimental feature. |
| |
| |
| @node configure |
| @chapter Scanning @file{configure.ac}, using @command{aclocal} |
| |
| @cindex @file{configure.ac}, scanning |
| @cindex Scanning @file{configure.ac} |
| @cindex Using @command{aclocal} |
| @cindex @command{aclocal}, using |
| |
| Automake scans the package's @file{configure.ac} to determine certain |
| information about the package. Some @command{autoconf} macros are required |
| and some variables must be defined in @file{configure.ac}. Automake |
| will also use information from @file{configure.ac} to further tailor its |
| output. |
| |
| Automake also supplies some Autoconf macros to make the maintenance |
| easier. These macros can automatically be put into your |
| @file{aclocal.m4} using the @command{aclocal} program. |
| |
| @menu |
| * Requirements:: Configuration requirements |
| * Optional:: Other things Automake recognizes |
| * aclocal Invocation:: Auto-generating aclocal.m4 |
| * Macros:: Autoconf macros supplied with Automake |
| @end menu |
| |
| |
| @node Requirements |
| @section Configuration requirements |
| |
| @cindex Automake requirements |
| @cindex Requirements of Automake |
| |
| @acindex AM_INIT_AUTOMAKE |
| The one real requirement of Automake is that your @file{configure.ac} |
| call @code{AM_INIT_AUTOMAKE}. This macro does several things that are |
| required for proper Automake operation (@pxref{Macros}). |
| |
| Here are the other macros that Automake requires but which are not run |
| by @code{AM_INIT_AUTOMAKE}: |
| |
| @table @code |
| @item AC_CONFIG_FILES |
| @itemx AC_OUTPUT |
| @acindex AC_CONFIG_FILES |
| @acindex AC_OUTPUT |
| These two macros are usually invoked as follows near the end of |
| @file{configure.ac}. |
| |
| @example |
| @dots{} |
| AC_CONFIG_FILES([ |
| Makefile |
| doc/Makefile |
| src/Makefile |
| src/lib/Makefile |
| @dots{} |
| ]) |
| AC_OUTPUT |
| @end example |
| |
| Automake uses these to determine which files to create (@pxref{Output, , |
| Creating Output Files, autoconf, The Autoconf Manual}). A listed file |
| is considered to be an Automake generated @file{Makefile} if there |
| exists a file with the same name and the @file{.am} extension appended. |
| Typically, @samp{AC_CONFIG_FILES([foo/Makefile])} will cause Automake to |
| generate @file{foo/Makefile.in} if @file{foo/Makefile.am} exists. |
| |
| When using @code{AC_CONFIG_FILES} with multiple input files, as in |
| |
| @example |
| AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in]) |
| @end example |
| |
| @noindent |
| @command{automake} will generate the first @file{.in} input file for |
| which a @file{.am} file exists. If no such file exists the output |
| file is not considered to be generated by Automake. |
| |
| Files created by @code{AC_CONFIG_FILES}, be they Automake |
| @file{Makefile}s or not, are all removed by @samp{make distclean}. |
| Their inputs are automatically distributed, unless they |
| are the output of prior @code{AC_CONFIG_FILES} commands. |
| Finally, rebuild rules are generated in the Automake @file{Makefile} |
| existing in the subdirectory of the output file, if there is one, or |
| in the top-level @file{Makefile} otherwise. |
| |
| The above machinery (cleaning, distributing, and rebuilding) works |
| fine if the @code{AC_CONFIG_FILES} specifications contain only |
| literals. If part of the specification uses shell variables, |
| @command{automake} will not be able to fulfill this setup, and you will |
| have to complete the missing bits by hand. For instance, on |
| |
| @c Keep in sync with output11.sh |
| @example |
| file=input |
| @dots{} |
| AC_CONFIG_FILES([output:$file],, [file=$file]) |
| @end example |
| |
| @noindent |
| @command{automake} will output rules to clean @file{output}, and |
| rebuild it. However the rebuild rule will not depend on @file{input}, |
| and this file will not be distributed either. (You must add |
| @samp{EXTRA_DIST = input} to your @file{Makefile.am} if @file{input} is a |
| source file.) |
| |
| Similarly |
| |
| @c Keep in sync with output11.sh |
| @example |
| file=output |
| file2=out:in |
| @dots{} |
| AC_CONFIG_FILES([$file:input],, [file=$file]) |
| AC_CONFIG_FILES([$file2],, [file2=$file2]) |
| @end example |
| |
| @noindent |
| will only cause @file{input} to be distributed. No file will be |
| cleaned automatically (add @samp{DISTCLEANFILES = output out} |
| yourself), and no rebuild rule will be output. |
| |
| Obviously @command{automake} cannot guess what value @samp{$file} is |
| going to hold later when @file{configure} is run, and it cannot use |
| the shell variable @samp{$file} in a @file{Makefile}. However, if you |
| make reference to @samp{$file} as @samp{$@{file@}} (i.e., in a way |
| that is compatible with @command{make}'s syntax) and furthermore use |
| @code{AC_SUBST} to ensure that @samp{$@{file@}} is meaningful in a |
| @file{Makefile}, then @command{automake} will be able to use |
| @samp{$@{file@}} to generate all of these rules. For instance, here is |
| how the Automake package itself generates versioned scripts for its |
| test suite: |
| |
| @example |
| AC_SUBST([APIVERSION], @dots{}) |
| @dots{} |
| AC_CONFIG_FILES( |
| [tests/aclocal-$@{APIVERSION@}:tests/aclocal.in], |
| [chmod +x tests/aclocal-$@{APIVERSION@}], |
| [APIVERSION=$APIVERSION]) |
| AC_CONFIG_FILES( |
| [tests/automake-$@{APIVERSION@}:tests/automake.in], |
| [chmod +x tests/automake-$@{APIVERSION@}]) |
| @end example |
| |
| @noindent |
| Here cleaning, distributing, and rebuilding are done automatically, |
| because @samp{$@{APIVERSION@}} is known at @command{make}-time. |
| |
| Note that you should not use shell variables to declare |
| @file{Makefile} files for which @command{automake} must create |
| @file{Makefile.in}. Even @code{AC_SUBST} does not help here, because |
| @command{automake} needs to know the file name when it runs in order |
| to check whether @file{Makefile.am} exists. (In the very hairy case |
| that your setup requires such use of variables, you will have to tell |
| Automake which @file{Makefile.in}s to generate on the command-line.) |
| |
| It is possible to let @command{automake} emit conditional rules for |
| @code{AC_CONFIG_FILES} with the help of @code{AM_COND_IF} |
| (@pxref{Optional}). |
| |
| To summarize: |
| @itemize @bullet |
| @item |
| Use literals for @file{Makefile}s, and for other files whenever possible. |
| @item |
| Use @samp{$file} (or @samp{$@{file@}} without @samp{AC_SUBST([file])}) |
| for files that @command{automake} should ignore. |
| @item |
| Use @samp{$@{file@}} and @samp{AC_SUBST([file])} for files |
| that @command{automake} should not ignore. |
| @end itemize |
| |
| @end table |
| |
| |
| @node Optional |
| @section Other things Automake recognizes |
| |
| @cindex Macros Automake recognizes |
| @cindex Recognized macros by Automake |
| |
| Every time Automake is run it calls Autoconf to trace |
| @file{configure.ac}. This way it can recognize the use of certain |
| macros and tailor the generated @file{Makefile.in} appropriately. |
| Currently recognized macros and their effects are: |
| |
| @ftable @code |
| @item AC_CANONICAL_BUILD |
| @itemx AC_CANONICAL_HOST |
| @itemx AC_CANONICAL_TARGET |
| @vindex build_triplet |
| @vindex host_triplet |
| @vindex target_triplet |
| Automake will ensure that @file{config.guess} and @file{config.sub} |
| exist. Also, the @file{Makefile} variables @code{build_triplet}, |
| @code{host_triplet} and @code{target_triplet} are introduced. See |
| @ref{Canonicalizing, , Getting the Canonical System Type, autoconf, |
| The Autoconf Manual}. |
| |
| @item AC_CONFIG_AUX_DIR |
| Automake will look for various helper scripts, such as |
| @file{install-sh}, in the directory named in this macro invocation. |
| @c This list is accurate relative to version 1.11 |
| (The full list of scripts is: |
| @file{ar-lib}, |
| @file{config.guess}, |
| @file{config.sub}, |
| @file{depcomp}, |
| @file{compile}, |
| @file{install-sh}, |
| @file{ltmain.sh}, |
| @file{mdate-sh}, |
| @file{missing}, |
| @file{mkinstalldirs}, |
| @file{py-compile}, |
| @file{test-driver}, |
| @file{texinfo.tex}, |
| @file{ylwrap}.) |
| Not all scripts are always searched for; some scripts |
| will only be sought if the generated @file{Makefile.in} requires them. |
| |
| If @code{AC_CONFIG_AUX_DIR} is not given, the scripts are looked for in |
| their standard locations. For @file{mdate-sh}, |
| @file{texinfo.tex}, and @file{ylwrap}, the standard location is the |
| source directory corresponding to the current @file{Makefile.am}. For |
| the rest, the standard location is the first one of @file{.}, @file{..}, |
| or @file{../..} (relative to the top source directory) that provides any |
| one of the helper scripts. @xref{Input, , Finding `configure' Input, |
| autoconf, The Autoconf Manual}. |
| |
| Required files from @code{AC_CONFIG_AUX_DIR} are automatically |
| distributed, even if there is no @file{Makefile.am} in this directory. |
| |
| @item AC_CONFIG_LIBOBJ_DIR |
| Automake will require the sources file declared with |
| @code{AC_LIBSOURCE} (see below) in the directory specified by this |
| macro. |
| |
| @item AC_CONFIG_HEADERS |
| Automake will generate rules to rebuild these headers from the |
| corresponding templates (usually, the template for a @file{foo.h} |
| header being @file{foo.h.in}). Older versions of Automake |
| required the use of @code{AM_CONFIG_HEADER}; this is no longer |
| the case, and that macro has indeed been removed. |
| |
| As with @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the |
| specification using shell variables will be ignored as far as |
| cleaning, distributing, and rebuilding is concerned. |
| |
| @item AC_CONFIG_LINKS |
| Automake will generate rules to remove @file{configure} generated |
| links on @samp{make distclean} and to distribute named source files as |
| part of @samp{make dist}. |
| |
| As for @code{AC_CONFIG_FILES} (@pxref{Requirements}), parts of the |
| specification using shell variables will be ignored as far as cleaning |
| and distributing is concerned. (There are no rebuild rules for links.) |
| |
| @item AC_LIBOBJ |
| @itemx AC_LIBSOURCE |
| @itemx AC_LIBSOURCES |
| @vindex LIBOBJS |
| Automake will automatically distribute any file listed in |
| @code{AC_LIBSOURCE} or @code{AC_LIBSOURCES}. |
| |
| Note that the @code{AC_LIBOBJ} macro calls @code{AC_LIBSOURCE}. So if |
| an Autoconf macro is documented to call @samp{AC_LIBOBJ([file])}, then |
| @file{file.c} will be distributed automatically by Automake. This |
| encompasses many macros like @code{AC_FUNC_ALLOCA}, |
| @code{AC_FUNC_MEMCMP}, @code{AC_REPLACE_FUNCS}, and others. |
| |
| By the way, direct assignments to @code{LIBOBJS} are no longer |
| supported. You should always use @code{AC_LIBOBJ} for this purpose. |
| @xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, |
| autoconf, The Autoconf Manual}. |
| |
| @item AC_PROG_RANLIB |
| This is required if any libraries are built in the package. |
| @xref{Particular Programs, , Particular Program Checks, autoconf, The |
| Autoconf Manual}. |
| |
| @item AC_PROG_CXX |
| This is required if any C++ source is included. @xref{Particular |
| Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. |
| |
| @item AC_PROG_OBJC |
| This is required if any Objective C source is included. @xref{Particular |
| Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. |
| |
| @item AC_PROG_OBJCXX |
| This is required if any Objective C++ source is included. @xref{Particular |
| Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. |
| |
| @item AC_PROG_F77 |
| This is required if any Fortran 77 source is included. @xref{Particular |
| Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. |
| |
| @item AC_F77_LIBRARY_LDFLAGS |
| This is required for programs and shared libraries that are a mixture of |
| languages that include Fortran 77 (@pxref{Mixing Fortran 77 With C and |
| C++}). @xref{Macros, , Autoconf macros supplied with Automake}. |
| |
| @item AC_FC_SRCEXT |
| Automake will add the flags computed by @code{AC_FC_SRCEXT} to compilation |
| of files with the respective source extension (@pxref{Fortran Compiler, , |
| Fortran Compiler Characteristics, autoconf, The Autoconf Manual}). |
| |
| @item AC_PROG_FC |
| This is required if any Fortran 90/95 source is included. This macro is |
| distributed with Autoconf version 2.58 and later. @xref{Particular |
| Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. |
| |
| @item AC_PROG_LIBTOOL |
| Automake will turn on processing for @command{libtool} (@pxref{Top, , |
| Introduction, libtool, The Libtool Manual}). |
| |
| @item AC_PROG_YACC |
| @vindex YACC |
| If a Yacc source file is seen, then you must either use this macro or |
| define the variable @code{YACC} in @file{configure.ac}. The former is |
| preferred (@pxref{Particular Programs, , Particular Program Checks, |
| autoconf, The Autoconf Manual}). |
| |
| @item AC_PROG_LEX |
| If a Lex source file is seen, then this macro must be used. |
| @xref{Particular Programs, , Particular Program Checks, autoconf, The |
| Autoconf Manual}. |
| |
| @item AC_REQUIRE_AUX_FILE |
| For each @code{AC_REQUIRE_AUX_FILE([@var{file}])}, |
| @command{automake} will ensure that @file{@var{file}} exists in the |
| aux directory, and will complain otherwise. It |
| will also automatically distribute the file. This macro should be |
| used by third-party Autoconf macros that require some supporting |
| files in the aux directory specified with @code{AC_CONFIG_AUX_DIR} |
| above. @xref{Input, , Finding @command{configure} Input, autoconf, |
| The Autoconf Manual}. |
| |
| @item AC_SUBST |
| The first argument is automatically defined as a variable in each |
| generated @file{Makefile.in}, unless @code{AM_SUBST_NOTMAKE} is also |
| used for this variable. @xref{Setting Output Variables, , Setting |
| Output Variables, autoconf, The Autoconf Manual}. |
| |
| For every substituted variable @var{var}, @command{automake} will add |
| a line @code{@var{var} = @var{value}} to each @file{Makefile.in} file. |
| Many Autoconf macros invoke @code{AC_SUBST} to set output variables |
| this way, e.g., @code{AC_PATH_XTRA} defines @code{X_CFLAGS} and |
| @code{X_LIBS}. Thus, you can access these variables as |
| @code{$(X_CFLAGS)} and @code{$(X_LIBS)} in any @file{Makefile.am} |
| if @code{AC_PATH_XTRA} is called. |
| |
| @item AM_CONDITIONAL |
| This introduces an Automake conditional (@pxref{Conditionals}). |
| |
| @item AM_COND_IF |
| This macro allows @code{automake} to detect subsequent access within |
| @file{configure.ac} to a conditional previously introduced with |
| @code{AM_CONDITIONAL}, thus enabling conditional @code{AC_CONFIG_FILES} |
| (@pxref{Usage of Conditionals}). |
| |
| @item AM_GNU_GETTEXT |
| This macro is required for packages that use GNU gettext |
| (@pxref{gettext}). It is distributed with gettext. If Automake sees |
| this macro it ensures that the package meets some of gettext's |
| requirements. |
| |
| @item AM_GNU_GETTEXT_INTL_SUBDIR |
| This macro specifies that the @file{intl/} subdirectory is to be built, |
| even if the @code{AM_GNU_GETTEXT} macro was invoked with a first argument |
| of @samp{external}. |
| |
| @item AM_MAINTAINER_MODE(@ovar{default-mode}) |
| @opindex --enable-maintainer-mode |
| @opindex --disable-maintainer-mode |
| This macro adds an @option{--enable-maintainer-mode} option to |
| @command{configure}. If this is used, @command{automake} will cause |
| ``maintainer-only'' rules to be turned off by default in the |
| generated @file{Makefile.in}s, unless @var{default-mode} is |
| @samp{enable}. This macro defines the @code{MAINTAINER_MODE} |
| conditional, which you can use in your own @file{Makefile.am}. |
| @xref{maintainer-mode}. |
| |
| @item AM_SUBST_NOTMAKE(@var{var}) |
| Prevent Automake from defining a variable @var{var}, even if it is |
| substituted by @command{config.status}. Normally, Automake defines a |
| @command{make} variable for each @command{configure} substitution, |
| i.e., for each @code{AC_SUBST([@var{var}])}. This macro prevents that |
| definition from Automake. If @code{AC_SUBST} has not been called |
| for this variable, then @code{AM_SUBST_NOTMAKE} has no effects. |
| Preventing variable definitions may be useful for substitution of |
| multi-line values, where @code{@var{var} = @@@var{value}@@} might yield |
| unintended results. |
| |
| @item m4_include |
| Files included by @file{configure.ac} using this macro will be |
| detected by Automake and automatically distributed. They will also |
| appear as dependencies in @file{Makefile} rules. |
| |
| @code{m4_include} is seldom used by @file{configure.ac} authors, but |
| can appear in @file{aclocal.m4} when @command{aclocal} detects that |
| some required macros come from files local to your package (as opposed to |
| macros installed in a system-wide directory, @pxref{aclocal Invocation}). |
| |
| @end ftable |
| |
| @node aclocal Invocation |
| @section Auto-generating aclocal.m4 |
| @c This node used to be named "Invoking automake". This @anchor |
| @c allows old links to still work. |
| @anchor{Invoking aclocal} |
| |
| @cindex Invocation of @command{aclocal} |
| @cindex @command{aclocal}, Invocation |
| @cindex Invoking @command{aclocal} |
| @cindex @command{aclocal}, Invoking |
| |
| Automake includes a number of Autoconf macros that can be used in |
| your package (@pxref{Macros}); some of them are actually required by |
| Automake in certain situations. These macros must be defined in your |
| @file{aclocal.m4}; otherwise they will not be seen by |
| @command{autoconf}. |
| |
| The @command{aclocal} program will automatically generate |
| @file{aclocal.m4} files based on the contents of @file{configure.ac}. |
| This provides a convenient way to get Automake-provided macros, |
| without having to search around. The @command{aclocal} mechanism |
| allows other packages to supply their own macros (@pxref{Extending |
| aclocal}). You can also use it to maintain your own set of custom |
| macros (@pxref{Local Macros}). |
| |
| At startup, @command{aclocal} scans all the @file{.m4} files it can |
| find, looking for macro definitions (@pxref{Macro Search Path}). Then |
| it scans @file{configure.ac}. Any mention of one of the macros found |
| in the first step causes that macro, and any macros it in turn |
| requires, to be put into @file{aclocal.m4}. |
| |
| @emph{Putting} the file that contains the macro definition into |
| @file{aclocal.m4} is usually done by copying the entire text of this |
| file, including unused macro definitions as well as both @samp{#} and |
| @samp{dnl} comments. If you want to make a comment that will be |
| completely ignored by @command{aclocal}, use @samp{##} as the comment |
| leader. |
| |
| When a file selected by @command{aclocal} is located in a subdirectory |
| specified as a relative search path with @command{aclocal}'s @option{-I} |
| argument, @command{aclocal} assumes the file belongs to the package |
| and uses @code{m4_include} instead of copying it into |
| @file{aclocal.m4}. This makes the package smaller, eases dependency |
| tracking, and cause the file to be distributed automatically. |
| (@xref{Local Macros}, for an example.) Any macro that is found in a |
| system-wide directory, or via an absolute search path will be copied. |
| So use @samp{-I `pwd`/reldir} instead of @samp{-I reldir} whenever |
| some relative directory should be considered outside the package. |
| |
| The contents of @file{acinclude.m4}, if this file exists, are also |
| automatically included in @file{aclocal.m4}. We recommend against |
| using @file{acinclude.m4} in new packages (@pxref{Local Macros}). |
| |
| @vindex AUTOM4TE |
| @cindex autom4te |
| While computing @file{aclocal.m4}, @command{aclocal} runs |
| @command{autom4te} (@pxref{Using autom4te, , Using @command{Autom4te}, |
| autoconf, The Autoconf Manual}) in order to trace the macros that are |
| really used, and omit from @file{aclocal.m4} all macros that are |
| mentioned but otherwise unexpanded (this can happen when a macro is |
| called conditionally). @command{autom4te} is expected to be in the |
| @env{PATH}, just as @command{autoconf}. Its location can be |
| overridden using the @env{AUTOM4TE} environment variable. |
| |
| @menu |
| * aclocal Options:: Options supported by aclocal |
| * Macro Search Path:: How aclocal finds .m4 files |
| * Extending aclocal:: Writing your own aclocal macros |
| * Local Macros:: Organizing local macros |
| * Serials:: Serial lines in Autoconf macros |
| * Future of aclocal:: aclocal's scheduled death |
| @end menu |
| |
| @node aclocal Options |
| @subsection aclocal Options |
| |
| @cindex @command{aclocal}, Options |
| @cindex Options, @command{aclocal} |
| |
| @command{aclocal} accepts the following options: |
| |
| @table @code |
| @item --automake-acdir=@var{dir} |
| @opindex --automake-acdir |
| Look for the automake-provided macro files in @var{dir} instead of |
| in the installation directory. This is typically used for debugging. |
| |
| @vindex ACLOCAL_AUTOMAKE_DIR |
| The environment variable @env{ACLOCAL_AUTOMAKE_DIR} provides another |
| way to set the directory containing automake-provided macro files. |
| However @option{--automake-acdir} takes precedence over it. |
| |
| @item --system-acdir=@var{dir} |
| @opindex --system-acdir |
| Look for the system-wide third-party macro files (and the special |
| @file{dirlist} file) in @var{dir} instead of in the installation |
| directory. This is typically used for debugging. |
| |
| @item --diff[=@var{command}] |
| @opindex --diff |
| Run @var{command} on M4 file that would be installed or overwritten |
| by @option{--install}. The default @var{command} is @samp{diff -u}. |
| This option implies @option{--install} and @option{--dry-run}. |
| |
| @item --dry-run |
| @opindex --dry-run |
| Do not actually overwrite (or create) @file{aclocal.m4} and M4 |
| files installed by @option{--install}. |
| |
| @item --help |
| @opindex --help |
| Print a summary of the command line options and exit. |
| |
| @item -I @var{dir} |
| @opindex -I |
| Add the directory @var{dir} to the list of directories searched for |
| @file{.m4} files. |
| |
| @item --install |
| @opindex --install |
| Install system-wide third-party macros into the first directory |
| specified with @samp{-I @var{dir}} instead of copying them in the |
| output file. |
| @c Keep in sync with aclocal-install-absdir.sh |
| Note that this will happen also if @var{dir} is an absolute path. |
| |
| @cindex serial number and @option{--install} |
| When this option is used, and only when this option is used, |
| @command{aclocal} will also honor @samp{#serial @var{number}} lines |
| that appear in macros: an M4 file is ignored if there exists another |
| M4 file with the same basename and a greater serial number in the |
| search path (@pxref{Serials}). |
| |
| @item --force |
| @opindex --force |
| Always overwrite the output file. The default is to overwrite the output |
| file only when really needed, i.e., when its contents changes or if one |
| of its dependencies is younger. |
| |
| This option forces the update of @file{aclocal.m4} (or the file |
| specified with @file{--output} below) and only this file, it has |
| absolutely no influence on files that may need to be installed by |
| @option{--install}. |
| |
| @item --output=@var{file} |
| @opindex --output |
| Cause the output to be put into @var{file} instead of @file{aclocal.m4}. |
| |
| @item --print-ac-dir |
| @opindex --print-ac-dir |
| Prints the name of the directory that @command{aclocal} will search to |
| find third-party @file{.m4} files. When this option is given, normal |
| processing is suppressed. This option was used @emph{in the past} by |
| third-party packages to determine where to install @file{.m4} macro |
| files, but @emph{this usage is today discouraged}, since it causes |
| @samp{$(prefix)} not to be thoroughly honored (which violates the |
| GNU Coding Standards), and a similar semantics can be better obtained |
| with the @env{ACLOCAL_PATH} environment variable; @pxref{Extending aclocal}. |
| |
| @item --verbose |
| @opindex --verbose |
| Print the names of the files it examines. |
| |
| @item --version |
| @opindex --version |
| Print the version number of Automake and exit. |
| |
| @item -W CATEGORY |
| @item --warnings=@var{category} |
| @opindex -W |
| @opindex --warnings |
| Output warnings falling in @var{category}. @var{category} can be |
| one of: |
| @table @code |
| @item syntax |
| dubious syntactic constructs, underquoted macros, unused macros, etc. |
| @item unsupported |
| unknown macros |
| @item all |
| all the warnings, this is the default |
| @item none |
| turn off all the warnings |
| @item error |
| treat warnings as errors |
| @end table |
| |
| All warnings are output by default. |
| |
| @vindex WARNINGS |
| The environment variable @env{WARNINGS} is honored in the same |
| way as it is for @command{automake} (@pxref{automake Invocation}). |
| |
| @end table |
| |
| @node Macro Search Path |
| @subsection Macro Search Path |
| |
| @cindex Macro search path |
| @cindex @command{aclocal} search path |
| |
| By default, @command{aclocal} searches for @file{.m4} files in the following |
| directories, in this order: |
| |
| @table @code |
| @item @var{acdir-APIVERSION} |
| This is where the @file{.m4} macros distributed with Automake itself |
| are stored. @var{APIVERSION} depends on the Automake release used; |
| for example, for Automake 1.11.x, @var{APIVERSION} = @code{1.11}. |
| |
| @item @var{acdir} |
| This directory is intended for third party @file{.m4} files, and is |
| configured when @command{automake} itself is built. This is |
| @file{@@datadir@@/aclocal/}, which typically |
| expands to @file{$@{prefix@}/share/aclocal/}. To find the compiled-in |
| value of @var{acdir}, use the @option{--print-ac-dir} option |
| (@pxref{aclocal Options}). |
| @end table |
| |
| As an example, suppose that @command{automake-1.11.2} was configured with |
| @option{--prefix=@-/usr/local}. Then, the search path would be: |
| |
| @enumerate |
| @item @file{/usr/local/share/aclocal-1.11.2/} |
| @item @file{/usr/local/share/aclocal/} |
| @end enumerate |
| |
| The paths for the @var{acdir} and @var{acdir-APIVERSION} directories can |
| be changed respectively through aclocal options @option{--system-acdir} |
| and @option{--automake-acdir} (@pxref{aclocal Options}). Note however |
| that these options are only intended for use by the internal Automake |
| test suite, or for debugging under highly unusual situations; they are |
| not ordinarily needed by end-users. |
| |
| As explained in (@pxref{aclocal Options}), there are several options that |
| can be used to change or extend this search path. |
| |
| @subsubheading Modifying the Macro Search Path: @samp{-I @var{dir}} |
| |
| Any extra directories specified using @option{-I} options |
| (@pxref{aclocal Options}) are @emph{prepended} to this search list. Thus, |
| @samp{aclocal -I /foo -I /bar} results in the following search path: |
| |
| @enumerate |
| @item @file{/foo} |
| @item @file{/bar} |
| @item @var{acdir}-@var{APIVERSION} |
| @item @var{acdir} |
| @end enumerate |
| |
| @subsubheading Modifying the Macro Search Path: @file{dirlist} |
| @cindex @file{dirlist} |
| |
| There is a third mechanism for customizing the search path. If a |
| @file{dirlist} file exists in @var{acdir}, then that file is assumed to |
| contain a list of directory patterns, one per line. @command{aclocal} |
| expands these patterns to directory names, and adds them to the search |
| list @emph{after} all other directories. @file{dirlist} entries may |
| use shell wildcards such as @samp{*}, @samp{?}, or @code{[...]}. |
| |
| For example, suppose |
| @file{@var{acdir}/dirlist} contains the following: |
| |
| @example |
| /test1 |
| /test2 |
| /test3* |
| @end example |
| |
| @noindent |
| and that @command{aclocal} was called with the @samp{-I /foo -I /bar} options. |
| Then, the search path would be |
| |
| @c @code looks better than @file here |
| @enumerate |
| @item @code{/foo} |
| @item @code{/bar} |
| @item @var{acdir}-@var{APIVERSION} |
| @item @var{acdir} |
| @item @code{/test1} |
| @item @code{/test2} |
| @end enumerate |
| |
| @noindent |
| and all directories with path names starting with @code{/test3}. |
| |
| If the @option{--system-acdir=@var{dir}} option is used, then |
| @command{aclocal} will search for the @file{dirlist} file in |
| @var{dir}; but remember the warnings above against the use of |
| @option{--system-acdir}. |
| |
| @file{dirlist} is useful in the following situation: suppose that |
| @command{automake} version @code{1.11.2} is installed with |
| @samp{--prefix=/usr} by the system vendor. Thus, the default search |
| directories are |
| |
| @c @code looks better than @file here |
| @enumerate |
| @item @code{/usr/share/aclocal-1.11/} |
| @item @code{/usr/share/aclocal/} |
| @end enumerate |
| |
| However, suppose further that many packages have been manually |
| installed on the system, with $prefix=/usr/local, as is typical. In |
| that case, many of these ``extra'' @file{.m4} files are in |
| @file{/usr/local/share/aclocal}. The only way to force |
| @file{/usr/bin/aclocal} to find these ``extra'' @file{.m4} files is to |
| always call @samp{aclocal -I /usr/local/share/aclocal}. This is |
| inconvenient. With @file{dirlist}, one may create a file |
| @file{/usr/share/aclocal/dirlist} containing only the single line |
| |
| @example |
| /usr/local/share/aclocal |
| @end example |
| |
| Now, the ``default'' search path on the affected system is |
| |
| @c @code looks better than @file here |
| @enumerate |
| @item @code{/usr/share/aclocal-1.11/} |
| @item @code{/usr/share/aclocal/} |
| @item @code{/usr/local/share/aclocal/} |
| @end enumerate |
| |
| without the need for @option{-I} options; @option{-I} options can be reserved |
| for project-specific needs (@file{my-source-dir/m4/}), rather than |
| using it to work around local system-dependent tool installation |
| directories. |
| |
| Similarly, @file{dirlist} can be handy if you have installed a local |
| copy of Automake in your account and want @command{aclocal} to look for |
| macros installed at other places on the system. |
| |
| @anchor{ACLOCAL_PATH} |
| @subsubheading Modifying the Macro Search Path: @file{ACLOCAL_PATH} |
| @cindex @env{ACLOCAL_PATH} |
| |
| The fourth and last mechanism to customize the macro search path is |
| also the simplest. Any directory included in the colon-separated |
| environment variable @env{ACLOCAL_PATH} is added to the search path |
| @c Keep in sync with aclocal-path-precedence.sh |
| and takes precedence over system directories (including those found via |
| @file{dirlist}), with the exception of the versioned directory |
| @var{acdir-APIVERSION} (@pxref{Macro Search Path}). However, directories |
| passed via @option{-I} will take precedence over directories in |
| @env{ACLOCAL_PATH}. |
| |
| @c Keep in sync with aclocal-path-installed.sh |
| Also note that, if the @option{--install} option is used, any @file{.m4} |
| file containing a required macro that is found in a directory listed in |
| @env{ACLOCAL_PATH} will be installed locally. |
| @c Keep in sync with aclocal-path-installed-serial.sh |
| In this case, serial numbers in @file{.m4} are honored too, |
| @pxref{Serials}. |
| |
| Conversely to @file{dirlist}, @env{ACLOCAL_PATH} is useful if you are |
| using a global copy of Automake and want @command{aclocal} to look for |
| macros somewhere under your home directory. |
| |
| @subsubheading Planned future incompatibilities |
| |
| The order in which the directories in the macro search path are currently |
| looked up is confusing and/or suboptimal in various aspects, and is |
| probably going to be changed in the future Automake release. In |
| particular, directories in @env{ACLOCAL_PATH} and @file{@var{acdir}} |
| might end up taking precedence over @file{@var{acdir-APIVERSION}}, and |
| directories in @file{@var{acdir}/dirlist} might end up taking precedence |
| over @file{@var{acdir}}. @emph{This is a possible future incompatibility!} |
| |
| @node Extending aclocal |
| @subsection Writing your own aclocal macros |
| |
| @cindex @command{aclocal}, extending |
| @cindex Extending @command{aclocal} |
| |
| The @command{aclocal} program doesn't have any built-in knowledge of any |
| macros, so it is easy to extend it with your own macros. |
| |
| This can be used by libraries that want to supply their own Autoconf |
| macros for use by other programs. For instance, the @command{gettext} |
| library supplies a macro @code{AM_GNU_GETTEXT} that should be used by |
| any package using @command{gettext}. When the library is installed, it |
| installs this macro so that @command{aclocal} will find it. |
| |
| A macro file's name should end in @file{.m4}. Such files should be |
| installed in @file{$(datadir)/aclocal}. This is as simple as writing: |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| aclocaldir = $(datadir)/aclocal |
| aclocal_DATA = mymacro.m4 myothermacro.m4 |
| @end example |
| |
| @noindent |
| Please do use @file{$(datadir)/aclocal}, and not something based on |
| the result of @samp{aclocal --print-ac-dir} (@pxref{Hard-Coded Install |
| Paths}, for arguments). It might also be helpful to suggest to |
| the user to add the @file{$(datadir)/aclocal} directory to his |
| @env{ACLOCAL_PATH} variable (@pxref{ACLOCAL_PATH}) so that |
| @command{aclocal} will find the @file{.m4} files installed by your |
| package automatically. |
| |
| A file of macros should be a series of properly quoted |
| @code{AC_DEFUN}'s (@pxref{Macro Definitions, , , autoconf, The |
| Autoconf Manual}). The @command{aclocal} programs also understands |
| @code{AC_REQUIRE} (@pxref{Prerequisite Macros, , , autoconf, The |
| Autoconf Manual}), so it is safe to put each macro in a separate file. |
| Each file should have no side effects but macro definitions. |
| Especially, any call to @code{AC_PREREQ} should be done inside the |
| defined macro, not at the beginning of the file. |
| |
| @cindex underquoted @code{AC_DEFUN} |
| @acindex AC_DEFUN |
| @acindex AC_PREREQ |
| |
| Starting with Automake 1.8, @command{aclocal} will warn about all |
| underquoted calls to @code{AC_DEFUN}. We realize this will annoy a |
| lot of people, because @command{aclocal} was not so strict in the past |
| and many third party macros are underquoted; and we have to apologize |
| for this temporary inconvenience. The reason we have to be stricter |
| is that a future implementation of @command{aclocal} (@pxref{Future of |
| aclocal}) will have to temporarily include all of these third party |
| @file{.m4} files, maybe several times, including even files that are |
| not actually needed. Doing so should alleviate many problems of the |
| current implementation, however it requires a stricter style from the |
| macro authors. Hopefully it is easy to revise the existing macros. |
| For instance, |
| |
| @example |
| # bad style |
| AC_PREREQ(2.68) |
| AC_DEFUN(AX_FOOBAR, |
| [AC_REQUIRE([AX_SOMETHING])dnl |
| AX_FOO |
| AX_BAR |
| ]) |
| @end example |
| |
| @noindent |
| should be rewritten as |
| |
| @example |
| AC_DEFUN([AX_FOOBAR], |
| [AC_PREREQ([2.68])dnl |
| AC_REQUIRE([AX_SOMETHING])dnl |
| AX_FOO |
| AX_BAR |
| ]) |
| @end example |
| |
| Wrapping the @code{AC_PREREQ} call inside the macro ensures that |
| Autoconf 2.68 will not be required if @code{AX_FOOBAR} is not actually |
| used. Most importantly, quoting the first argument of @code{AC_DEFUN} |
| allows the macro to be redefined or included twice (otherwise this |
| first argument would be expanded during the second definition). For |
| consistency we like to quote even arguments such as @code{2.68} that |
| do not require it. |
| |
| If you have been directed here by the @command{aclocal} diagnostic but |
| are not the maintainer of the implicated macro, you will want to |
| contact the maintainer of that macro. Please make sure you have the |
| latest version of the macro and that the problem hasn't already been |
| reported before doing so: people tend to work faster when they aren't |
| flooded by mails. |
| |
| Another situation where @command{aclocal} is commonly used is to |
| manage macros that are used locally by the package, @ref{Local |
| Macros}. |
| |
| @node Local Macros |
| @subsection Handling Local Macros |
| |
| Feature tests offered by Autoconf do not cover all needs. People |
| often have to supplement existing tests with their own macros, or |
| with third-party macros. |
| |
| There are two ways to organize custom macros in a package. |
| |
| The first possibility (the historical practice) is to list all your |
| macros in @file{acinclude.m4}. This file will be included in |
| @file{aclocal.m4} when you run @command{aclocal}, and its macro(s) will |
| henceforth be visible to @command{autoconf}. However if it contains |
| numerous macros, it will rapidly become difficult to maintain, and it |
| will be almost impossible to share macros between packages. |
| |
| The second possibility, which we do recommend, is to write each macro |
| in its own file and gather all these files in a directory. This |
| directory is usually called @file{m4/}. Then it's enough to update |
| @file{configure.ac} by adding a proper call to @code{AC_CONFIG_MACRO_DIRS}: |
| |
| @example |
| AC_CONFIG_MACRO_DIRS([m4]) |
| @end example |
| |
| @command{aclocal} will then take care of automatically adding @file{m4/} |
| to its search path for m4 files. |
| |
| When @samp{aclocal} is run, it will build an @file{aclocal.m4} |
| that @code{m4_include}s any file from @file{m4/} that defines a |
| required macro. Macros not found locally will still be searched in |
| system-wide directories, as explained in @ref{Macro Search Path}. |
| |
| Custom macros should be distributed for the same reason that |
| @file{configure.ac} is: so that other people have all the sources of |
| your package if they want to work on it. Actually, this distribution |
| happens automatically because all @code{m4_include}d files are |
| distributed. |
| |
| However there is no consensus on the distribution of third-party |
| macros that your package may use. Many libraries install their own |
| macro in the system-wide @command{aclocal} directory (@pxref{Extending |
| aclocal}). For instance, Guile ships with a file called |
| @file{guile.m4} that contains the macro @code{GUILE_FLAGS} that can |
| be used to define setup compiler and linker flags appropriate for |
| using Guile. Using @code{GUILE_FLAGS} in @file{configure.ac} will |
| cause @command{aclocal} to copy @file{guile.m4} into |
| @file{aclocal.m4}, but as @file{guile.m4} is not part of the project, |
| it will not be distributed. Technically, that means a user who |
| needs to rebuild @file{aclocal.m4} will have to install Guile first. |
| This is probably OK, if Guile already is a requirement to build the |
| package. However, if Guile is only an optional feature, or if your |
| package might run on architectures where Guile cannot be installed, |
| this requirement will hinder development. An easy solution is to copy |
| such third-party macros in your local @file{m4/} directory so they get |
| distributed. |
| |
| Since Automake 1.10, @command{aclocal} offers the option @code{--install} |
| to copy these system-wide third-party macros in your local macro directory, |
| helping to solve the above problem. |
| |
| With this setup, system-wide macros will be copied to @file{m4/} |
| the first time you run @command{aclocal}. Then the locally installed |
| macros will have precedence over the system-wide installed macros |
| each time @command{aclocal} is run again. |
| |
| One reason why you should keep @option{--install} in the flags even |
| after the first run is that when you later edit @file{configure.ac} |
| and depend on a new macro, this macro will be installed in your |
| @file{m4/} automatically. Another one is that serial numbers |
| (@pxref{Serials}) can be used to update the macros in your source tree |
| automatically when new system-wide versions are installed. A serial |
| number should be a single line of the form |
| |
| @example |
| #serial @var{nnn} |
| @end example |
| |
| @noindent |
| where @var{nnn} contains only digits and dots. It should appear in |
| the M4 file before any macro definition. It is a good practice to |
| maintain a serial number for each macro you distribute, even if you do |
| not use the @option{--install} option of @command{aclocal}: this allows |
| other people to use it. |
| |
| |
| @node Serials |
| @subsection Serial Numbers |
| @cindex serial numbers in macros |
| @cindex macro serial numbers |
| @cindex @code{#serial} syntax |
| @cindex @command{aclocal} and serial numbers |
| |
| Because third-party macros defined in @file{*.m4} files are naturally |
| shared between multiple projects, some people like to version them. |
| This makes it easier to tell which of two M4 files is newer. Since at |
| least 1996, the tradition is to use a @samp{#serial} line for this. |
| |
| A serial number should be a single line of the form |
| |
| @example |
| # serial @var{version} |
| @end example |
| |
| @noindent |
| where @var{version} is a version number containing only digits and |
| dots. Usually people use a single integer, and they increment it each |
| time they change the macro (hence the name of ``serial''). Such a |
| line should appear in the M4 file before any macro definition. |
| |
| The @samp{#} must be the first character on the line, |
| and it is OK to have extra words after the version, as in |
| |
| @example |
| #serial @var{version} @var{garbage} |
| @end example |
| |
| Normally these serial numbers are completely ignored by |
| @command{aclocal} and @command{autoconf}, like any genuine comment. |
| However when using @command{aclocal}'s @option{--install} feature, these |
| serial numbers will modify the way @command{aclocal} selects the |
| macros to install in the package: if two files with the same basename |
| exist in your search path, and if at least one of them uses a |
| @samp{#serial} line, @command{aclocal} will ignore the file that has |
| the older @samp{#serial} line (or the file that has none). |
| |
| Note that a serial number applies to a whole M4 file, not to any macro |
| it contains. A file can contains multiple macros, but only one |
| serial. |
| |
| Here is a use case that illustrates the use of @option{--install} and |
| its interaction with serial numbers. Let's assume we maintain a |
| package called MyPackage, the @file{configure.ac} of which requires a |
| third-party macro @code{AX_THIRD_PARTY} defined in |
| @file{/usr/share/aclocal/thirdparty.m4} as follows: |
| |
| @example |
| # serial 1 |
| AC_DEFUN([AX_THIRD_PARTY], [...]) |
| @end example |
| |
| MyPackage uses an @file{m4/} directory to store local macros as |
| explained in @ref{Local Macros}, and has |
| |
| @example |
| AC_CONFIG_MACRO_DIRS([m4]) |
| @end example |
| |
| @noindent |
| in its @file{configure.ac}. |
| |
| Initially the @file{m4/} directory is empty. The first time we run |
| @command{aclocal --install}, it will notice that |
| |
| @itemize @bullet |
| @item |
| @file{configure.ac} uses @code{AX_THIRD_PARTY} |
| @item |
| No local macros define @code{AX_THIRD_PARTY} |
| @item |
| @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY} |
| with serial 1. |
| @end itemize |
| |
| @noindent |
| Because @file{/usr/share/aclocal/thirdparty.m4} is a system-wide macro |
| and @command{aclocal} was given the @option{--install} option, it will |
| copy this file in @file{m4/thirdparty.m4}, and output an |
| @file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}. |
| |
| The next time @samp{aclocal --install} is run, something different |
| happens. @command{aclocal} notices that |
| |
| @itemize @bullet |
| @item |
| @file{configure.ac} uses @code{AX_THIRD_PARTY} |
| @item |
| @file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY} |
| with serial 1. |
| @item |
| @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY} |
| with serial 1. |
| @end itemize |
| |
| @noindent |
| Because both files have the same serial number, @command{aclocal} uses |
| the first it found in its search path order (@pxref{Macro Search |
| Path}). @command{aclocal} therefore ignores |
| @file{/usr/share/aclocal/thirdparty.m4} and outputs an |
| @file{aclocal.m4} that contains @samp{m4_include([m4/thirdparty.m4])}. |
| |
| Local directories specified with @option{-I} are always searched before |
| system-wide directories, so a local file will always be preferred to |
| the system-wide file in case of equal serial numbers. |
| |
| Now suppose the system-wide third-party macro is changed. This can |
| happen if the package installing this macro is updated. Let's suppose |
| the new macro has serial number 2. The next time @samp{aclocal --install} |
| is run the situation is the following: |
| |
| @itemize @bullet |
| @item |
| @file{configure.ac} uses @code{AX_THIRD_PARTY} |
| @item |
| @file{m4/thirdparty.m4} defines @code{AX_THIRD_PARTY} |
| with serial 1. |
| @item |
| @file{/usr/share/aclocal/thirdparty.m4} defines @code{AX_THIRD_PARTY} |
| with serial 2. |
| @end itemize |
| |
| @noindent |
| When @command{aclocal} sees a greater serial number, it immediately |
| forgets anything it knows from files that have the same basename and a |
| smaller serial number. So after it has found |
| @file{/usr/share/aclocal/thirdparty.m4} with serial 2, |
| @command{aclocal} will proceed as if it had never seen |
| @file{m4/thirdparty.m4}. This brings us back to a situation similar |
| to that at the beginning of our example, where no local file defined |
| the macro. @command{aclocal} will install the new version of the |
| macro in @file{m4/thirdparty.m4}, in this case overriding the old |
| version. MyPackage just had its macro updated as a side effect of |
| running @command{aclocal}. |
| |
| If you are leery of letting @command{aclocal} update your local |
| macro, you can run @samp{aclocal --diff} to review the changes |
| @samp{aclocal --install} would perform on these macros. |
| |
| Finally, note that the @option{--force} option of @command{aclocal} has |
| absolutely no effect on the files installed by @option{--install}. For |
| instance, if you have modified your local macros, do not expect |
| @option{--install --force} to replace the local macros by their |
| system-wide versions. If you want to do so, simply erase the local |
| macros you want to revert, and run @samp{aclocal --install}. |
| |
| |
| @node Future of aclocal |
| @subsection The Future of @command{aclocal} |
| @cindex @command{aclocal}'s scheduled death |
| |
| @command{aclocal} is expected to disappear. This feature really |
| should not be offered by Automake. Automake should focus on |
| generating @file{Makefile}s; dealing with M4 macros really is |
| Autoconf's job. The fact that some people install Automake just to use |
| @command{aclocal}, but do not use @command{automake} otherwise is an |
| indication of how that feature is misplaced. |
| |
| The new implementation will probably be done slightly differently. |
| For instance, it could enforce the @file{m4/}-style layout discussed in |
| @ref{Local Macros}. |
| |
| We have no idea when and how this will happen. This has been |
| discussed several times in the past, but someone still has to commit |
| to that non-trivial task. |
| |
| From the user point of view, @command{aclocal}'s removal might turn |
| out to be painful. There is a simple precaution that you may take to |
| make that switch more seamless: never call @command{aclocal} yourself. |
| Keep this guy under the exclusive control of @command{autoreconf} and |
| Automake's rebuild rules. Hopefully you won't need to worry about |
| things breaking, when @command{aclocal} disappears, because everything |
| will have been taken care of. If otherwise you used to call |
| @command{aclocal} directly yourself or from some script, you will |
| quickly notice the change. |
| |
| Many packages come with a script called @file{bootstrap} or |
| @file{autogen.sh}, that will just call @command{aclocal}, |
| @command{libtoolize}, @command{gettextize} or @command{autopoint}, |
| @command{autoconf}, @command{autoheader}, and @command{automake} in |
| the right order. Actually this is precisely what @command{autoreconf} |
| can do for you. If your package has such a @file{bootstrap} or |
| @file{autogen.sh} script, consider using @command{autoreconf}. That |
| should simplify its logic a lot (less things to maintain, yum!), it's |
| even likely you will not need the script anymore, and more to the point |
| you will not call @command{aclocal} directly anymore. |
| |
| For the time being, third-party packages should continue to install |
| public macros into @file{/usr/share/aclocal/}. If @command{aclocal} |
| is replaced by another tool it might make sense to rename the |
| directory, but supporting @file{/usr/share/aclocal/} for backward |
| compatibility should be really easy provided all macros are properly |
| written (@pxref{Extending aclocal}). |
| |
| |
| |
| @node Macros |
| @section Autoconf macros supplied with Automake |
| |
| Automake ships with several Autoconf macros that you can use from your |
| @file{configure.ac}. When you use one of them it will be included by |
| @command{aclocal} in @file{aclocal.m4}. |
| |
| @menu |
| * Public Macros:: Macros that you can use. |
| * Obsolete Macros:: Macros that will soon be removed. |
| * Private Macros:: Macros that you should not use. |
| @end menu |
| |
| @c consider generating the following subsections automatically from m4 files. |
| |
| @node Public Macros |
| @subsection Public Macros |
| |
| @table @code |
| |
| @item AM_INIT_AUTOMAKE([OPTIONS]) |
| @acindex AM_INIT_AUTOMAKE |
| Runs many macros required for proper operation of the generated Makefiles. |
| |
| @vindex AUTOMAKE_OPTIONS |
| Today, @code{AM_INIT_AUTOMAKE} is called with a single argument: a |
| space-separated list of Automake options that should be applied to |
| every @file{Makefile.am} in the tree. The effect is as if |
| each option were listed in @code{AUTOMAKE_OPTIONS} (@pxref{Options}). |
| |
| @acindex AC_INIT |
| This macro can also be called in another, @emph{deprecated} form: |
| @code{AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])}. In this form, |
| there are two required arguments: the package and the version number. |
| This usage is mostly obsolete because the @var{package} and @var{version} |
| can be obtained from Autoconf's @code{AC_INIT} macro. However, |
| differently from what happens for @code{AC_INIT} invocations, this |
| @code{AM_INIT_AUTOMAKE} invocation supports shell variables' expansions |
| in the @code{PACKAGE} and @code{VERSION} arguments (which otherwise |
| defaults, respectively, to the @code{PACKAGE_TARNAME} and |
| @code{PACKAGE_VERSION} defined via the @code{AC_INIT} invocation; |
| @pxref{AC_INIT, , The @code{AC_INIT} macro, autoconf, The Autoconf Manual}); |
| and this can be still be useful in some selected situations. |
| Our hope is that future Autoconf versions will improve their support |
| for package versions defined dynamically at configure runtime; when |
| (and if) this happens, support for the two-args @code{AM_INIT_AUTOMAKE} |
| invocation will likely be removed from Automake. |
| |
| @anchor{Modernize AM_INIT_AUTOMAKE invocation} |
| If your @file{configure.ac} has: |
| |
| @example |
| AC_INIT([src/foo.c]) |
| AM_INIT_AUTOMAKE([mumble], [1.5]) |
| @end example |
| |
| @noindent |
| you should modernize it as follows: |
| |
| @example |
| AC_INIT([mumble], [1.5]) |
| AC_CONFIG_SRCDIR([src/foo.c]) |
| AM_INIT_AUTOMAKE |
| @end example |
| |
| Note that if you're upgrading your @file{configure.ac} from an earlier |
| version of Automake, it is not always correct to simply move the |
| package and version arguments from @code{AM_INIT_AUTOMAKE} directly to |
| @code{AC_INIT}, as in the example above. The first argument to |
| @code{AC_INIT} should be the name of your package (e.g., @samp{GNU |
| Automake}), not the tarball name (e.g., @samp{automake}) that you used |
| to pass to @code{AM_INIT_AUTOMAKE}. Autoconf tries to derive a |
| tarball name from the package name, which should work for most but not |
| all package names. (If it doesn't work for yours, you can use the |
| four-argument form of @code{AC_INIT} to provide the tarball name |
| explicitly). |
| |
| @cindex @code{PACKAGE}, prevent definition |
| @cindex @code{VERSION}, prevent definition |
| @opindex no-define |
| By default this macro @code{AC_DEFINE}'s @code{PACKAGE} and |
| @code{VERSION}. This can be avoided by passing the @option{no-define} |
| option (@pxref{List of Automake options}): |
| @example |
| AM_INIT_AUTOMAKE([no-define ...]) |
| @end example |
| |
| @item AM_PATH_LISPDIR |
| @acindex AM_PATH_LISPDIR |
| @vindex EMACS |
| @vindex lispdir |
| Searches for the program @command{emacs}, and, if found, sets the |
| output variable @code{lispdir} to the full path to Emacs' site-lisp |
| directory. |
| |
| Note that this test assumes the @command{emacs} found to be a version |
| that supports Emacs Lisp (such as GNU Emacs or XEmacs). Other |
| emacsen can cause this test to hang (some, like old versions of |
| MicroEmacs, start up in interactive mode, requiring @kbd{C-x C-c} to |
| exit, which is hardly obvious for a non-emacs user). In most cases, |
| however, you should be able to use @kbd{C-c} to kill the test. In |
| order to avoid problems, you can set @env{EMACS} to ``no'' in the |
| environment, or use the @option{--with-lispdir} option to |
| @command{configure} to explicitly set the correct path (if you're sure |
| you have an @command{emacs} that supports Emacs Lisp). |
| |
| @item AM_PROG_AR(@ovar{act-if-fail}) |
| @acindex AM_PROG_AR |
| @vindex AR |
| You must use this macro when you use the archiver in your project, if |
| you want support for unusual archivers such as Microsoft @command{lib}. |
| The content of the optional argument is executed if the archiver |
| interface is not recognized; the default action is to abort configure |
| with an error message. |
| |
| @item AM_PROG_AS |
| @acindex AM_PROG_AS |
| @vindex CCAS |
| @vindex CCASFLAGS |
| Use this macro when you have assembly code in your project. This will |
| choose the assembler for you (by default the C compiler) and set |
| @code{CCAS}, and will also set @code{CCASFLAGS} if required. |
| |
| @item AM_PROG_CC_C_O |
| @acindex AM_PROG_CC_C_O |
| This is an obsolescent macro that checks that the C compiler supports |
| the @option{-c} and @option{-o} options together. Note that, since |
| Automake 1.14, the @code{AC_PROG_CC} is rewritten to implement such |
| checks itself, and thus the explicit use of @code{AM_PROG_CC_C_O} |
| should no longer be required. |
| |
| @item AM_PROG_LEX |
| @acindex AM_PROG_LEX |
| @acindex AC_PROG_LEX |
| @cindex HP-UX 10, @command{lex} problems |
| @cindex @command{lex} problems with HP-UX 10 |
| Like @code{AC_PROG_LEX} (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}), but uses the |
| @command{missing} script on systems that do not have @command{lex}. |
| HP-UX 10 is one such system. |
| |
| @item AM_PROG_GCJ |
| @acindex AM_PROG_GCJ |
| @vindex GCJ |
| @vindex GCJFLAGS |
| This macro finds the @command{gcj} program or causes an error. It sets |
| @code{GCJ} and @code{GCJFLAGS}. @command{gcj} is the Java front-end to the |
| GNU Compiler Collection. |
| |
| @item AM_PROG_UPC([@var{compiler-search-list}]) |
| @acindex AM_PROG_UPC |
| @vindex UPC |
| Find a compiler for Unified Parallel C and define the @code{UPC} |
| variable. The default @var{compiler-search-list} is @samp{upcc upc}. |
| This macro will abort @command{configure} if no Unified Parallel C |
| compiler is found. |
| |
| @item AM_MISSING_PROG(@var{name}, @var{program}) |
| @acindex AM_MISSING_PROG |
| @vindex MISSING |
| Find a maintainer tool @var{program} and define the @var{name} |
| environment variable with its location. If @var{program} is not |
| detected, then @var{name} will instead invoke the @command{missing} |
| script, in order to give useful advice to the user about the missing |
| maintainer tool. @xref{maintainer-mode}, for more information on when |
| the @command{missing} script is appropriate. |
| |
| @item AM_SILENT_RULES |
| @acindex AM_SILENT_RULES |
| Control the machinery for less verbose build output |
| (@pxref{Automake Silent Rules}). |
| |
| @item AM_WITH_DMALLOC |
| @acindex AM_WITH_DMALLOC |
| @cindex @command{dmalloc}, support for |
| @vindex WITH_DMALLOC |
| @opindex --with-dmalloc |
| Add support for the @uref{http://dmalloc.com/, Dmalloc package}. If |
| the user runs @command{configure} with @option{--with-dmalloc}, then |
| define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}. |
| |
| @end table |
| |
| |
| @node Obsolete Macros |
| @subsection Obsolete Macros |
| @cindex obsolete macros |
| @cindex autoupdate |
| |
| Although using some of the following macros was required in past |
| releases, you should not use any of them in new code. @emph{All |
| these macros will be removed in the next major Automake version}; |
| if you are still using them, running @command{autoupdate} should |
| adjust your @file{configure.ac} automatically (@pxref{autoupdate |
| Invocation, , Using @command{autoupdate} to Modernize |
| @file{configure.ac}, autoconf, The Autoconf Manual}). |
| @emph{Do it NOW!} |
| |
| @table @code |
| |
| @item AM_PROG_MKDIR_P |
| @acindex AM_PROG_MKDIR_P |
| @cindex @code{mkdir -p}, macro check |
| @vindex MKDIR_P |
| @vindex mkdir_p |
| |
| From Automake 1.8 to 1.9.6 this macro used to define the output |
| variable @code{mkdir_p} to one of @code{mkdir -p}, @code{install-sh |
| -d}, or @code{mkinstalldirs}. |
| |
| Nowadays Autoconf provides a similar functionality with |
| @code{AC_PROG_MKDIR_P} (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}), however this defines |
| the output variable @code{MKDIR_P} instead. In case you are still |
| using the @code{AM_PROG_MKDIR_P} macro in your @file{configure.ac}, |
| or its provided variable @code{$(mkdir_p)} in your @file{Makefile.am}, |
| you are advised to switch ASAP to the more modern Autoconf-provided |
| interface instead; both the macro and the variable might be removed |
| in a future major Automake release. |
| |
| @end table |
| |
| |
| @node Private Macros |
| @subsection Private Macros |
| |
| The following macros are private macros you should not call directly. |
| They are called by the other public macros when appropriate. Do not |
| rely on them, as they might be changed in a future version. Consider |
| them as implementation details; or better, do not consider them at all: |
| skip this section! |
| |
| @ftable @code |
| @item _AM_DEPENDENCIES |
| @itemx AM_SET_DEPDIR |
| @itemx AM_DEP_TRACK |
| @itemx AM_OUTPUT_DEPENDENCY_COMMANDS |
| These macros are used to implement Automake's automatic dependency |
| tracking scheme. They are called automatically by Automake when |
| required, and there should be no need to invoke them manually. |
| |
| @item AM_MAKE_INCLUDE |
| This macro is used to discover how the user's @command{make} handles |
| @code{include} statements. This macro is automatically invoked when |
| needed; there should be no need to invoke it manually. |
| |
| @item AM_PROG_INSTALL_STRIP |
| This is used to find a version of @code{install} that can be used to |
| strip a program at installation time. This macro is automatically |
| included when required. |
| |
| @item AM_SANITY_CHECK |
| This checks to make sure that a file created in the build directory is |
| newer than a file in the source directory. This can fail on systems |
| where the clock is set incorrectly. This macro is automatically run |
| from @code{AM_INIT_AUTOMAKE}. |
| |
| @end ftable |
| |
| |
| @node Directories |
| @chapter Directories |
| |
| For simple projects that distribute all files in the same directory |
| it is enough to have a single @file{Makefile.am} that builds |
| everything in place. |
| |
| In larger projects, it is common to organize files in different |
| directories, in a tree. For example, there could be a directory |
| for the program's source, one for the testsuite, and one for the |
| documentation; or, for very large projects, there could be one |
| directory per program, per library or per module. |
| |
| The traditional approach is to build these subdirectories recursively, |
| employing @emph{make recursion}: each directory contains its |
| own @file{Makefile}, and when @command{make} is run from the top-level |
| directory, it enters each subdirectory in turn, and invokes there a |
| new @command{make} instance to build the directory's contents. |
| |
| Because this approach is very widespread, Automake offers built-in |
| support for it. However, it is worth nothing that the use of make |
| recursion has its own serious issues and drawbacks, and that it's |
| well possible to have packages with a multi directory layout that |
| make little or no use of such recursion (examples of such packages |
| are GNU Bison and GNU Automake itself); see also the @ref{Alternative} |
| section below. |
| |
| @menu |
| * Subdirectories:: Building subdirectories recursively |
| * Conditional Subdirectories:: Conditionally not building directories |
| * Alternative:: Subdirectories without recursion |
| * Subpackages:: Nesting packages |
| @end menu |
| |
| @node Subdirectories |
| @section Recursing subdirectories |
| |
| @cindex @code{SUBDIRS}, explained |
| |
| In packages using make recursion, the top level @file{Makefile.am} must |
| tell Automake which subdirectories are to be built. This is done via |
| the @code{SUBDIRS} variable. |
| @vindex SUBDIRS |
| |
| The @code{SUBDIRS} variable holds a list of subdirectories in which |
| building of various sorts can occur. The rules for many targets |
| (e.g., @code{all}) in the generated @file{Makefile} will run commands |
| both locally and in all specified subdirectories. Note that the |
| directories listed in @code{SUBDIRS} are not required to contain |
| @file{Makefile.am}s; only @file{Makefile}s (after configuration). |
| This allows inclusion of libraries from packages that do not use |
| Automake (such as @code{gettext}; see also @ref{Third-Party |
| Makefiles}). |
| |
| In packages that use subdirectories, the top-level @file{Makefile.am} is |
| often very short. For instance, here is the @file{Makefile.am} from the |
| GNU Hello distribution: |
| |
| @example |
| EXTRA_DIST = BUGS ChangeLog.O README-alpha |
| SUBDIRS = doc intl po src tests |
| @end example |
| |
| When Automake invokes @command{make} in a subdirectory, it uses the value |
| of the @code{MAKE} variable. It passes the value of the variable |
| @code{AM_MAKEFLAGS} to the @command{make} invocation; this can be set in |
| @file{Makefile.am} if there are flags you must always pass to |
| @command{make}. |
| @vindex MAKE |
| @vindex AM_MAKEFLAGS |
| |
| The directories mentioned in @code{SUBDIRS} are usually direct |
| children of the current directory, each subdirectory containing its |
| own @file{Makefile.am} with a @code{SUBDIRS} pointing to deeper |
| subdirectories. Automake can be used to construct packages of |
| arbitrary depth this way. |
| |
| By default, Automake generates @file{Makefiles} that work depth-first |
| in postfix order: the subdirectories are built before the current |
| directory. However, it is possible to change this ordering. You can |
| do this by putting @samp{.} into @code{SUBDIRS}. For instance, |
| putting @samp{.} first will cause a prefix ordering of |
| directories. |
| |
| Using |
| |
| @example |
| SUBDIRS = lib src . test |
| @end example |
| |
| @noindent |
| will cause @file{lib/} to be built before @file{src/}, then the |
| current directory will be built, finally the @file{test/} directory |
| will be built. It is customary to arrange test directories to be |
| built after everything else since they are meant to test what has |
| been constructed. |
| |
| In addition to the built-in recursive targets defined by Automake |
| (@code{all}, @code{check}, etc.), the developer can also define his |
| own recursive targets. That is done by passing the names of such |
| targets as arguments to the m4 macro @code{AM_EXTRA_RECURSIVE_TARGETS} |
| in @file{configure.ac}. Automake generates rules to handle the |
| recursion for such targets; and the developer can define real actions |
| for them by defining corresponding @code{-local} targets. |
| |
| @example |
| % @kbd{cat configure.ac} |
| AC_INIT([pkg-name], [1.0] |
| AM_INIT_AUTOMAKE |
| AM_EXTRA_RECURSIVE_TARGETS([foo]) |
| AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile]) |
| AC_OUTPUT |
| % @kbd{cat Makefile.am} |
| SUBDIRS = sub |
| foo-local: |
| @@echo This will be run by "make foo". |
| % @kbd{cat sub/Makefile.am} |
| SUBDIRS = src |
| % @kbd{cat sub/src/Makefile.am} |
| foo-local: |
| @@echo This too will be run by a "make foo" issued either in |
| @@echo the 'sub/src/' directory, the 'sub/' directory, or the |
| @@echo top-level directory. |
| @end example |
| |
| @node Conditional Subdirectories |
| @section Conditional Subdirectories |
| @cindex Subdirectories, building conditionally |
| @cindex Conditional subdirectories |
| @cindex @code{SUBDIRS}, conditional |
| @cindex Conditional @code{SUBDIRS} |
| |
| It is possible to define the @code{SUBDIRS} variable conditionally if, |
| like in the case of GNU Inetutils, you want to only build a subset of |
| the entire package. |
| |
| To illustrate how this works, let's assume we have two directories |
| @file{src/} and @file{opt/}. @file{src/} should always be built, but we |
| want to decide in @command{configure} whether @file{opt/} will be built |
| or not. (For this example we will assume that @file{opt/} should be |
| built when the variable @samp{$want_opt} was set to @samp{yes}.) |
| |
| Running @command{make} should thus recurse into @file{src/} always, and |
| then maybe in @file{opt/}. |
| |
| However @samp{make dist} should always recurse into both @file{src/} |
| and @file{opt/}. Because @file{opt/} should be distributed even if it |
| is not needed in the current configuration. This means |
| @file{opt/Makefile} should be created @emph{unconditionally}. |
| |
| There are two ways to setup a project like this. You can use Automake |
| conditionals (@pxref{Conditionals}) or use Autoconf @code{AC_SUBST} |
| variables (@pxref{Setting Output Variables, , Setting Output |
| Variables, autoconf, The Autoconf Manual}). Using Automake |
| conditionals is the preferred solution. Before we illustrate these |
| two possibilities, let's introduce @code{DIST_SUBDIRS}. |
| |
| @menu |
| * SUBDIRS vs DIST_SUBDIRS:: Two sets of directories |
| * Subdirectories with AM_CONDITIONAL:: Specifying conditional subdirectories |
| * Subdirectories with AC_SUBST:: Another way for conditional recursion |
| * Unconfigured Subdirectories:: Not even creating a @samp{Makefile} |
| @end menu |
| |
| @node SUBDIRS vs DIST_SUBDIRS |
| @subsection @code{SUBDIRS} vs.@: @code{DIST_SUBDIRS} |
| @cindex @code{DIST_SUBDIRS}, explained |
| |
| Automake considers two sets of directories, defined by the variables |
| @code{SUBDIRS} and @code{DIST_SUBDIRS}. |
| |
| @code{SUBDIRS} contains the subdirectories of the current directory |
| that must be built (@pxref{Subdirectories}). It must be defined |
| manually; Automake will never guess a directory is to be built. As we |
| will see in the next two sections, it is possible to define it |
| conditionally so that some directory will be omitted from the build. |
| |
| @code{DIST_SUBDIRS} is used in rules that need to recurse in all |
| directories, even those that have been conditionally left out of the |
| build. Recall our example where we may not want to build subdirectory |
| @file{opt/}, but yet we want to distribute it? This is where |
| @code{DIST_SUBDIRS} comes into play: @samp{opt} may not appear in |
| @code{SUBDIRS}, but it must appear in @code{DIST_SUBDIRS}. |
| |
| Precisely, @code{DIST_SUBDIRS} is used by @samp{make |
| maintainer-clean}, @samp{make distclean} and @samp{make dist}. All |
| other recursive rules use @code{SUBDIRS}. |
| |
| If @code{SUBDIRS} is defined conditionally using Automake |
| conditionals, Automake will define @code{DIST_SUBDIRS} automatically |
| from the possible values of @code{SUBDIRS} in all conditions. |
| |
| If @code{SUBDIRS} contains @code{AC_SUBST} variables, |
| @code{DIST_SUBDIRS} will not be defined correctly because Automake |
| does not know the possible values of these variables. In this case |
| @code{DIST_SUBDIRS} needs to be defined manually. |
| |
| @node Subdirectories with AM_CONDITIONAL |
| @subsection Subdirectories with @code{AM_CONDITIONAL} |
| @cindex @code{SUBDIRS} and @code{AM_CONDITIONAL} |
| @cindex @code{AM_CONDITIONAL} and @code{SUBDIRS} |
| |
| @c Keep in sync with subdir-am-cond.sh |
| |
| @file{configure} should output the @file{Makefile} for each directory |
| and define a condition into which @file{opt/} should be built. |
| |
| @example |
| @dots{} |
| AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes]) |
| AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile]) |
| @dots{} |
| @end example |
| |
| Then @code{SUBDIRS} can be defined in the top-level @file{Makefile.am} |
| as follows. |
| |
| @example |
| if COND_OPT |
| MAYBE_OPT = opt |
| endif |
| SUBDIRS = src $(MAYBE_OPT) |
| @end example |
| |
| As you can see, running @command{make} will rightly recurse into |
| @file{src/} and maybe @file{opt/}. |
| |
| @vindex DIST_SUBDIRS |
| As you can't see, running @samp{make dist} will recurse into both |
| @file{src/} and @file{opt/} directories because @samp{make dist}, unlike |
| @samp{make all}, doesn't use the @code{SUBDIRS} variable. It uses the |
| @code{DIST_SUBDIRS} variable. |
| |
| In this case Automake will define @samp{DIST_SUBDIRS = src opt} |
| automatically because it knows that @code{MAYBE_OPT} can contain |
| @samp{opt} in some condition. |
| |
| @node Subdirectories with AC_SUBST |
| @subsection Subdirectories with @code{AC_SUBST} |
| @cindex @code{SUBDIRS} and @code{AC_SUBST} |
| @cindex @code{AC_SUBST} and @code{SUBDIRS} |
| |
| @c Keep in sync with subdir-ac-subst.sh |
| |
| Another possibility is to define @code{MAYBE_OPT} from |
| @file{./configure} using @code{AC_SUBST}: |
| |
| @example |
| @dots{} |
| if test "$want_opt" = yes; then |
| MAYBE_OPT=opt |
| else |
| MAYBE_OPT= |
| fi |
| AC_SUBST([MAYBE_OPT]) |
| AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile]) |
| @dots{} |
| @end example |
| |
| In this case the top-level @file{Makefile.am} should look as follows. |
| |
| @example |
| SUBDIRS = src $(MAYBE_OPT) |
| DIST_SUBDIRS = src opt |
| @end example |
| |
| The drawback is that since Automake cannot guess what the possible |
| values of @code{MAYBE_OPT} are, it is necessary to define |
| @code{DIST_SUBDIRS}. |
| |
| @node Unconfigured Subdirectories |
| @subsection Unconfigured Subdirectories |
| @cindex Subdirectories, configured conditionally |
| |
| The semantics of @code{DIST_SUBDIRS} are often misunderstood by some |
| users that try to @emph{configure and build} subdirectories |
| conditionally. Here by configuring we mean creating the |
| @file{Makefile} (it might also involve running a nested |
| @command{configure} script: this is a costly operation that explains |
| why people want to do it conditionally, but only the @file{Makefile} |
| is relevant to the discussion). |
| |
| The above examples all assume that every @file{Makefile} is created, |
| even in directories that are not going to be built. The simple reason |
| is that we want @samp{make dist} to distribute even the directories |
| that are not being built (e.g., platform-dependent code), hence |
| @file{make dist} must recurse into the subdirectory, hence this |
| directory must be configured and appear in @code{DIST_SUBDIRS}. |
| |
| Building packages that do not configure every subdirectory is a tricky |
| business, and we do not recommend it to the novice as it is easy to |
| produce an incomplete tarball by mistake. We will not discuss this |
| topic in depth here, yet for the adventurous here are a few rules to |
| remember. |
| |
| @cartouche |
| @itemize |
| @item @code{SUBDIRS} should always be a subset of @code{DIST_SUBDIRS}. |
| |
| It makes little sense to have a directory in @code{SUBDIRS} that |
| is not in @code{DIST_SUBDIRS}. Think of the former as a way to tell |
| which directories listed in the latter should be built. |
| @item Any directory listed in @code{DIST_SUBDIRS} and @code{SUBDIRS} |
| must be configured. |
| |
| I.e., the @file{Makefile} must exists or the recursive @command{make} |
| rules will not be able to process the directory. |
| @item Any configured directory must be listed in @code{DIST_SUBDIRS}. |
| |
| So that the cleaning rules remove the generated @file{Makefile}s. |
| It would be correct to see @code{DIST_SUBDIRS} as a variable that |
| lists all the directories that have been configured. |
| @end itemize |
| @end cartouche |
| |
| In order to prevent recursion in some unconfigured directory you |
| must therefore ensure that this directory does not appear in |
| @code{DIST_SUBDIRS} (and @code{SUBDIRS}). For instance, if you define |
| @code{SUBDIRS} conditionally using @code{AC_SUBST} and do not define |
| @code{DIST_SUBDIRS} explicitly, it will be default to |
| @samp{$(SUBDIRS)}; another possibility is to force @code{DIST_SUBDIRS |
| = $(SUBDIRS)}. |
| |
| Of course, directories that are omitted from @code{DIST_SUBDIRS} will |
| not be distributed unless you make other arrangements for this to |
| happen (for instance, always running @samp{make dist} in a |
| configuration where all directories are known to appear in |
| @code{DIST_SUBDIRS}; or writing a @code{dist-hook} target to |
| distribute these directories). |
| |
| @cindex Subdirectories, not distributed |
| In few packages, unconfigured directories are not even expected to |
| be distributed. Although these packages do not require the |
| aforementioned extra arrangements, there is another pitfall. If the |
| name of a directory appears in @code{SUBDIRS} or @code{DIST_SUBDIRS}, |
| @command{automake} will make sure the directory exists. Consequently |
| @command{automake} cannot be run on such a distribution when one |
| directory has been omitted. One way to avoid this check is to use the |
| @code{AC_SUBST} method to declare conditional directories; since |
| @command{automake} does not know the values of @code{AC_SUBST} |
| variables it cannot ensure the corresponding directory exists. |
| |
| @node Alternative |
| @section An Alternative Approach to Subdirectories |
| |
| If you've ever read Peter Miller's excellent paper, |
| @uref{http://miller.emu.id.au/pmiller/books/rmch/, |
| Recursive Make Considered Harmful}, the preceding sections on the use of |
| make recursion will probably come as unwelcome advice. For those who |
| haven't read the paper, Miller's main thesis is that recursive |
| @command{make} invocations are both slow and error-prone. |
| |
| Automake provides sufficient cross-directory support @footnote{We |
| believe. This work is new and there are probably warts. |
| @xref{Introduction}, for information on reporting bugs.} to enable you |
| to write a single @file{Makefile.am} for a complex multi-directory |
| package. |
| |
| By default an installable file specified in a subdirectory will have its |
| directory name stripped before installation. For instance, in this |
| example, the header file will be installed as |
| @file{$(includedir)/stdio.h}: |
| |
| @example |
| include_HEADERS = inc/stdio.h |
| @end example |
| |
| @vindex nobase_ |
| @cindex @code{nobase_} prefix |
| @cindex Path stripping, avoiding |
| @cindex Avoiding path stripping |
| |
| However, the @samp{nobase_} prefix can be used to circumvent this path |
| stripping. In this example, the header file will be installed as |
| @file{$(includedir)/sys/types.h}: |
| |
| @example |
| nobase_include_HEADERS = sys/types.h |
| @end example |
| |
| @cindex @code{nobase_} and @code{dist_} or @code{nodist_} |
| @cindex @code{dist_} and @code{nobase_} |
| @cindex @code{nodist_} and @code{nobase_} |
| @vindex dist_ |
| @vindex nodist_ |
| |
| @samp{nobase_} should be specified first when used in conjunction with |
| either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution |
| Control}). For instance: |
| |
| @example |
| nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg |
| @end example |
| |
| Finally, note that a variable using the @samp{nobase_} prefix can |
| often be replaced by several variables, one for each destination |
| directory (@pxref{Uniform}). For instance, the last example could be |
| rewritten as follows: |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| imagesdir = $(pkgdatadir)/images |
| soundsdir = $(pkgdatadir)/sounds |
| dist_images_DATA = images/vortex.pgm |
| dist_sounds_DATA = sounds/whirl.ogg |
| @end example |
| |
| @noindent |
| This latter syntax makes it possible to change one destination |
| directory without changing the layout of the source tree. |
| |
| Currently, @samp{nobase_*_LTLIBRARIES} are the only exception to this |
| rule, in that there is no particular installation order guarantee for |
| an otherwise equivalent set of variables without @samp{nobase_} prefix. |
| |
| @node Subpackages |
| @section Nesting Packages |
| @cindex Nesting packages |
| @cindex Subpackages |
| @acindex AC_CONFIG_SUBDIRS |
| @acindex AC_CONFIG_AUX_DIR |
| |
| |
| In the GNU Build System, packages can be nested to arbitrary depth. |
| This means that a package can embed other packages with their own |
| @file{configure}, @file{Makefile}s, etc. |
| |
| These other packages should just appear as subdirectories of their |
| parent package. They must be listed in @code{SUBDIRS} like other |
| ordinary directories. However the subpackage's @file{Makefile}s |
| should be output by its own @file{configure} script, not by the |
| parent's @file{configure}. This is achieved using the |
| @code{AC_CONFIG_SUBDIRS} Autoconf macro (@pxref{Subdirectories, |
| AC_CONFIG_SUBDIRS, Configuring Other Packages in Subdirectories, |
| autoconf, The Autoconf Manual}). |
| |
| Here is an example package for an @code{arm} program that links with |
| a @code{hand} library that is a nested package in subdirectory |
| @file{hand/}. |
| |
| @code{arm}'s @file{configure.ac}: |
| |
| @example |
| AC_INIT([arm], [1.0]) |
| AC_CONFIG_AUX_DIR([.]) |
| AM_INIT_AUTOMAKE |
| AC_PROG_CC |
| AC_CONFIG_FILES([Makefile]) |
| # Call hand's ./configure script recursively. |
| AC_CONFIG_SUBDIRS([hand]) |
| AC_OUTPUT |
| @end example |
| |
| @code{arm}'s @file{Makefile.am}: |
| |
| @example |
| # Build the library in the hand subdirectory first. |
| SUBDIRS = hand |
| |
| # Include hand's header when compiling this directory. |
| AM_CPPFLAGS = -I$(srcdir)/hand |
| |
| bin_PROGRAMS = arm |
| arm_SOURCES = arm.c |
| # link with the hand library. |
| arm_LDADD = hand/libhand.a |
| @end example |
| |
| Now here is @code{hand}'s @file{hand/configure.ac}: |
| |
| @example |
| AC_INIT([hand], [1.2]) |
| AC_CONFIG_AUX_DIR([.]) |
| AM_INIT_AUTOMAKE |
| AC_PROG_CC |
| AM_PROG_AR |
| AC_PROG_RANLIB |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| @end example |
| |
| @noindent |
| and its @file{hand/Makefile.am}: |
| |
| @example |
| lib_LIBRARIES = libhand.a |
| libhand_a_SOURCES = hand.c |
| @end example |
| |
| When @samp{make dist} is run from the top-level directory it will |
| create an archive @file{arm-1.0.tar.gz} that contains the @code{arm} |
| code as well as the @file{hand} subdirectory. This package can be |
| built and installed like any ordinary package, with the usual |
| @samp{./configure && make && make install} sequence (the @code{hand} |
| subpackage will be built and installed by the process). |
| |
| When @samp{make dist} is run from the hand directory, it will create a |
| self-contained @file{hand-1.2.tar.gz} archive. So although it appears |
| to be embedded in another package, it can still be used separately. |
| |
| The purpose of the @samp{AC_CONFIG_AUX_DIR([.])} instruction is to |
| force Automake and Autoconf to search for auxiliary scripts in the |
| current directory. For instance, this means that there will be two |
| copies of @file{install-sh}: one in the top-level of the @code{arm} |
| package, and another one in the @file{hand/} subdirectory for the |
| @code{hand} package. |
| |
| The historical default is to search for these auxiliary scripts in |
| the parent directory and the grandparent directory. So if the |
| @samp{AC_CONFIG_AUX_DIR([.])} line was removed from |
| @file{hand/configure.ac}, that subpackage would share the auxiliary |
| script of the @code{arm} package. This may looks like a gain in size |
| (a few kilobytes), but it is actually a loss of modularity as the |
| @code{hand} subpackage is no longer self-contained (@samp{make dist} |
| in the subdirectory will not work anymore). |
| |
| Packages that do not use Automake need more work to be integrated this |
| way. @xref{Third-Party Makefiles}. |
| |
| @node Programs |
| @chapter Building Programs and Libraries |
| |
| A large part of Automake's functionality is dedicated to making it easy |
| to build programs and libraries. |
| |
| @menu |
| * A Program:: Building a program |
| * A Library:: Building a library |
| * A Shared Library:: Building a Libtool library |
| * Program and Library Variables:: Variables controlling program and |
| library builds |
| * Default _SOURCES:: Default source files |
| * LIBOBJS:: Special handling for LIBOBJS and ALLOCA |
| * Program Variables:: Variables used when building a program |
| * Yacc and Lex:: Yacc and Lex support |
| * C++ Support:: Compiling C++ sources |
| * Objective C Support:: Compiling Objective C sources |
| * Objective C++ Support:: Compiling Objective C++ sources |
| * Unified Parallel C Support:: Compiling Unified Parallel C sources |
| * Assembly Support:: Compiling assembly sources |
| * Fortran 77 Support:: Compiling Fortran 77 sources |
| * Fortran 9x Support:: Compiling Fortran 9x sources |
| * Java Support with gcj:: Compiling Java sources using gcj |
| * Vala Support:: Compiling Vala sources |
| * Support for Other Languages:: Compiling other languages |
| * Dependencies:: Automatic dependency tracking |
| * EXEEXT:: Support for executable extensions |
| @end menu |
| |
| |
| @node A Program |
| @section Building a program |
| |
| In order to build a program, you need to tell Automake which sources |
| are part of it, and which libraries it should be linked with. |
| |
| This section also covers conditional compilation of sources or |
| programs. Most of the comments about these also apply to libraries |
| (@pxref{A Library}) and libtool libraries (@pxref{A Shared Library}). |
| |
| @menu |
| * Program Sources:: Defining program sources |
| * Linking:: Linking with libraries or extra objects |
| * Conditional Sources:: Handling conditional sources |
| * Conditional Programs:: Building a program conditionally |
| @end menu |
| |
| @node Program Sources |
| @subsection Defining program sources |
| |
| @cindex @code{PROGRAMS}, @code{bindir} |
| @vindex _PROGRAMS |
| @vindex bin_PROGRAMS |
| @vindex sbin_PROGRAMS |
| @vindex libexec_PROGRAMS |
| @vindex pkglibexec_PROGRAMS |
| @vindex noinst_PROGRAMS |
| @vindex check_PROGRAMS |
| |
| In a directory containing source that gets built into a program (as |
| opposed to a library or a script), the @code{PROGRAMS} primary is used. |
| Programs can be installed in @code{bindir}, @code{sbindir}, |
| @code{libexecdir}, @code{pkglibexecdir}, or not at all |
| (@code{noinst_}). They can also be built only for @samp{make check}, in |
| which case the prefix is @samp{check_}. |
| |
| For instance: |
| |
| @example |
| bin_PROGRAMS = hello |
| @end example |
| |
| In this simple case, the resulting @file{Makefile.in} will contain code |
| to generate a program named @code{hello}. |
| |
| Associated with each program are several assisting variables that are |
| named after the program. These variables are all optional, and have |
| reasonable defaults. Each variable, its use, and default is spelled out |
| below; we use the ``hello'' example throughout. |
| |
| The variable @code{hello_SOURCES} is used to specify which source files |
| get built into an executable: |
| |
| @example |
| hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h |
| @end example |
| |
| This causes each mentioned @file{.c} file to be compiled into the |
| corresponding @file{.o}. Then all are linked to produce @file{hello}. |
| |
| @cindex @code{_SOURCES} primary, defined |
| @cindex @code{SOURCES} primary, defined |
| @cindex Primary variable, @code{SOURCES} |
| @vindex _SOURCES |
| |
| If @code{hello_SOURCES} is not specified, then it defaults to the single |
| file @file{hello.c} (@pxref{Default _SOURCES}). |
| @vindex _SOURCES |
| @vindex SOURCES |
| |
| Multiple programs can be built in a single directory. Multiple programs |
| can share a single source file, which must be listed in each |
| @code{_SOURCES} definition. |
| |
| @cindex Header files in @code{_SOURCES} |
| @cindex @code{_SOURCES} and header files |
| |
| Header files listed in a @code{_SOURCES} definition will be included in |
| the distribution but otherwise ignored. In case it isn't obvious, you |
| should not include the header file generated by @file{configure} in a |
| @code{_SOURCES} variable; this file should not be distributed. Lex |
| (@file{.l}) and Yacc (@file{.y}) files can also be listed; see @ref{Yacc |
| and Lex}. |
| |
| |
| @node Linking |
| @subsection Linking the program |
| |
| If you need to link against libraries that are not found by |
| @command{configure}, you can use @code{LDADD} to do so. This variable is |
| used to specify additional objects or libraries to link with; it is |
| inappropriate for specifying specific linker flags, you should use |
| @code{AM_LDFLAGS} for this purpose. |
| @vindex LDADD |
| @vindex AM_LDFLAGS |
| |
| @cindex @code{prog_LDADD}, defined |
| |
| Sometimes, multiple programs are built in one directory but do not share |
| the same link-time requirements. In this case, you can use the |
| @code{@var{prog}_LDADD} variable (where @var{prog} is the name of the |
| program as it appears in some @code{_PROGRAMS} variable, and usually |
| written in lowercase) to override @code{LDADD}. If this variable exists |
| for a given program, then that program is not linked using @code{LDADD}. |
| @vindex maude_LDADD |
| |
| For instance, in GNU cpio, @code{pax}, @code{cpio} and @code{mt} are |
| linked against the library @file{libcpio.a}. However, @code{rmt} is |
| built in the same directory, and has no such link requirement. Also, |
| @code{mt} and @code{rmt} are only built on certain architectures. Here |
| is what cpio's @file{src/Makefile.am} looks like (abridged): |
| |
| @example |
| bin_PROGRAMS = cpio pax $(MT) |
| libexec_PROGRAMS = $(RMT) |
| EXTRA_PROGRAMS = mt rmt |
| |
| LDADD = ../lib/libcpio.a $(INTLLIBS) |
| rmt_LDADD = |
| |
| cpio_SOURCES = @dots{} |
| pax_SOURCES = @dots{} |
| mt_SOURCES = @dots{} |
| rmt_SOURCES = @dots{} |
| @end example |
| |
| @cindex @code{_LDFLAGS}, defined |
| @vindex maude_LDFLAGS |
| @code{@var{prog}_LDADD} is inappropriate for passing program-specific |
| linker flags (except for @option{-l}, @option{-L}, @option{-dlopen} and |
| @option{-dlpreopen}). So, use the @code{@var{prog}_LDFLAGS} variable for |
| this purpose. |
| |
| @cindex @code{_DEPENDENCIES}, defined |
| @vindex maude_DEPENDENCIES |
| @vindex EXTRA_maude_DEPENDENCIES |
| It is also occasionally useful to have a program depend on some other |
| target that is not actually part of that program. This can be done |
| using either the @code{@var{prog}_DEPENDENCIES} or the |
| @code{EXTRA_@var{prog}_DEPENDENCIES} variable. Each program depends on |
| the contents both variables, but no further interpretation is done. |
| |
| Since these dependencies are associated to the link rule used to |
| create the programs they should normally list files used by the link |
| command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la} |
| files. In rare cases you may need to add other kinds of files such as |
| linker scripts, but @emph{listing a source file in |
| @code{_DEPENDENCIES} is wrong}. If some source file needs to be built |
| before all the components of a program are built, consider using the |
| @code{BUILT_SOURCES} variable instead (@pxref{Sources}). |
| |
| If @code{@var{prog}_DEPENDENCIES} is not supplied, it is computed by |
| Automake. The automatically-assigned value is the contents of |
| @code{@var{prog}_LDADD}, with most configure substitutions, @option{-l}, |
| @option{-L}, @option{-dlopen} and @option{-dlpreopen} options removed. The |
| configure substitutions that are left in are only @samp{$(LIBOBJS)} and |
| @samp{$(ALLOCA)}; these are left because it is known that they will not |
| cause an invalid value for @code{@var{prog}_DEPENDENCIES} to be |
| generated. |
| |
| @ref{Conditional Sources} shows a situation where @code{_DEPENDENCIES} |
| may be used. |
| |
| The @code{EXTRA_@var{prog}_DEPENDENCIES} may be useful for cases where |
| you merely want to augment the @command{automake}-generated |
| @code{@var{prog}_DEPENDENCIES} rather than replacing it. |
| |
| @cindex @code{LDADD} and @option{-l} |
| @cindex @option{-l} and @code{LDADD} |
| We recommend that you avoid using @option{-l} options in @code{LDADD} |
| or @code{@var{prog}_LDADD} when referring to libraries built by your |
| package. Instead, write the file name of the library explicitly as in |
| the above @code{cpio} example. Use @option{-l} only to list |
| third-party libraries. If you follow this rule, the default value of |
| @code{@var{prog}_DEPENDENCIES} will list all your local libraries and |
| omit the other ones. |
| |
| |
| @node Conditional Sources |
| @subsection Conditional compilation of sources |
| |
| You can't put a configure substitution (e.g., @samp{@@FOO@@} or |
| @samp{$(FOO)} where @code{FOO} is defined via @code{AC_SUBST}) into a |
| @code{_SOURCES} variable. The reason for this is a bit hard to |
| explain, but suffice to say that it simply won't work. Automake will |
| give an error if you try to do this. |
| |
| Fortunately there are two other ways to achieve the same result. One is |
| to use configure substitutions in @code{_LDADD} variables, the other is |
| to use an Automake conditional. |
| |
| @subsubheading Conditional Compilation using @code{_LDADD} Substitutions |
| |
| @cindex @code{EXTRA_prog_SOURCES}, defined |
| |
| Automake must know all the source files that could possibly go into a |
| program, even if not all the files are built in every circumstance. Any |
| files that are only conditionally built should be listed in the |
| appropriate @code{EXTRA_} variable. For instance, if |
| @file{hello-linux.c} or @file{hello-generic.c} were conditionally included |
| in @code{hello}, the @file{Makefile.am} would contain: |
| |
| @example |
| bin_PROGRAMS = hello |
| hello_SOURCES = hello-common.c |
| EXTRA_hello_SOURCES = hello-linux.c hello-generic.c |
| hello_LDADD = $(HELLO_SYSTEM) |
| hello_DEPENDENCIES = $(HELLO_SYSTEM) |
| @end example |
| |
| @noindent |
| You can then setup the @samp{$(HELLO_SYSTEM)} substitution from |
| @file{configure.ac}: |
| |
| @example |
| @dots{} |
| case $host in |
| *linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;; |
| *) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;; |
| esac |
| AC_SUBST([HELLO_SYSTEM]) |
| @dots{} |
| @end example |
| |
| In this case, the variable @code{HELLO_SYSTEM} should be replaced by |
| either @file{hello-linux.o} or @file{hello-generic.o}, and added to |
| both @code{hello_DEPENDENCIES} and @code{hello_LDADD} in order to be |
| built and linked in. |
| |
| @subsubheading Conditional Compilation using Automake Conditionals |
| |
| An often simpler way to compile source files conditionally is to use |
| Automake conditionals. For instance, you could use this |
| @file{Makefile.am} construct to build the same @file{hello} example: |
| |
| @example |
| bin_PROGRAMS = hello |
| if LINUX |
| hello_SOURCES = hello-linux.c hello-common.c |
| else |
| hello_SOURCES = hello-generic.c hello-common.c |
| endif |
| @end example |
| |
| In this case, @file{configure.ac} should setup the @code{LINUX} |
| conditional using @code{AM_CONDITIONAL} (@pxref{Conditionals}). |
| |
| When using conditionals like this you don't need to use the |
| @code{EXTRA_} variable, because Automake will examine the contents of |
| each variable to construct the complete list of source files. |
| |
| If your program uses a lot of files, you will probably prefer a |
| conditional @samp{+=}. |
| |
| @example |
| bin_PROGRAMS = hello |
| hello_SOURCES = hello-common.c |
| if LINUX |
| hello_SOURCES += hello-linux.c |
| else |
| hello_SOURCES += hello-generic.c |
| endif |
| @end example |
| |
| @node Conditional Programs |
| @subsection Conditional compilation of programs |
| @cindex Conditional programs |
| @cindex Programs, conditional |
| |
| Sometimes it is useful to determine the programs that are to be built |
| at configure time. For instance, GNU @code{cpio} only builds |
| @code{mt} and @code{rmt} under special circumstances. The means to |
| achieve conditional compilation of programs are the same you can use |
| to compile source files conditionally: substitutions or conditionals. |
| |
| @subsubheading Conditional Programs using @command{configure} Substitutions |
| |
| @vindex EXTRA_PROGRAMS |
| @cindex @code{EXTRA_PROGRAMS}, defined |
| In this case, you must notify Automake of all the programs that can |
| possibly be built, but at the same time cause the generated |
| @file{Makefile.in} to use the programs specified by @command{configure}. |
| This is done by having @command{configure} substitute values into each |
| @code{_PROGRAMS} definition, while listing all optionally built programs |
| in @code{EXTRA_PROGRAMS}. |
| |
| @example |
| bin_PROGRAMS = cpio pax $(MT) |
| libexec_PROGRAMS = $(RMT) |
| EXTRA_PROGRAMS = mt rmt |
| @end example |
| |
| As explained in @ref{EXEEXT}, Automake will rewrite |
| @code{bin_PROGRAMS}, @code{libexec_PROGRAMS}, and |
| @code{EXTRA_PROGRAMS}, appending @samp{$(EXEEXT)} to each binary. |
| Obviously it cannot rewrite values obtained at run-time through |
| @command{configure} substitutions, therefore you should take care of |
| appending @samp{$(EXEEXT)} yourself, as in @samp{AC_SUBST([MT], |
| ['mt$@{EXEEXT@}'])}. |
| |
| @subsubheading Conditional Programs using Automake Conditionals |
| |
| You can also use Automake conditionals (@pxref{Conditionals}) to |
| select programs to be built. In this case you don't have to worry |
| about @samp{$(EXEEXT)} or @code{EXTRA_PROGRAMS}. |
| |
| @c Keep in sync with exeext.sh |
| @example |
| bin_PROGRAMS = cpio pax |
| if WANT_MT |
| bin_PROGRAMS += mt |
| endif |
| if WANT_RMT |
| libexec_PROGRAMS = rmt |
| endif |
| @end example |
| |
| |
| @node A Library |
| @section Building a library |
| |
| @cindex @code{_LIBRARIES} primary, defined |
| @cindex @code{LIBRARIES} primary, defined |
| @cindex Primary variable, @code{LIBRARIES} |
| @vindex _LIBRARIES |
| |
| @vindex lib_LIBRARIES |
| @vindex pkglib_LIBRARIES |
| @vindex noinst_LIBRARIES |
| |
| Building a library is much like building a program. In this case, the |
| name of the primary is @code{LIBRARIES}. Libraries can be installed in |
| @code{libdir} or @code{pkglibdir}. |
| |
| @xref{A Shared Library}, for information on how to build shared |
| libraries using libtool and the @code{LTLIBRARIES} primary. |
| |
| Each @code{_LIBRARIES} variable is a list of the libraries to be built. |
| For instance, to create a library named @file{libcpio.a}, but not install |
| it, you would write: |
| |
| @example |
| noinst_LIBRARIES = libcpio.a |
| libcpio_a_SOURCES = @dots{} |
| @end example |
| |
| The sources that go into a library are determined exactly as they are |
| for programs, via the @code{_SOURCES} variables. Note that the library |
| name is canonicalized (@pxref{Canonicalization}), so the @code{_SOURCES} |
| variable corresponding to @file{libcpio.a} is @samp{libcpio_a_SOURCES}, |
| not @samp{libcpio.a_SOURCES}. |
| |
| @vindex maude_LIBADD |
| Extra objects can be added to a library using the |
| @code{@var{library}_LIBADD} variable. This should be used for objects |
| determined by @command{configure}. Again from @code{cpio}: |
| |
| @c Keep in sync with pr401c.sh |
| @example |
| libcpio_a_LIBADD = $(LIBOBJS) $(ALLOCA) |
| @end example |
| |
| In addition, sources for extra objects that will not exist until |
| configure-time must be added to the @code{BUILT_SOURCES} variable |
| (@pxref{Sources}). |
| |
| Building a static library is done by compiling all object files, then |
| by invoking @samp{$(AR) $(ARFLAGS)} followed by the name of the |
| library and the list of objects, and finally by calling |
| @samp{$(RANLIB)} on that library. You should call |
| @code{AC_PROG_RANLIB} from your @file{configure.ac} to define |
| @code{RANLIB} (Automake will complain otherwise). You should also |
| call @code{AM_PROG_AR} to define @code{AR}, in order to support unusual |
| archivers such as Microsoft lib. @code{ARFLAGS} will default to |
| @code{cru}; you can override this variable by setting it in your |
| @file{Makefile.am} or by @code{AC_SUBST}ing it from your |
| @file{configure.ac}. You can override the @code{AR} variable by |
| defining a per-library @code{maude_AR} variable (@pxref{Program and |
| Library Variables}). |
| |
| @cindex Empty libraries |
| Be careful when selecting library components conditionally. Because |
| building an empty library is not portable, you should ensure that any |
| library always contains at least one object. |
| |
| To use a static library when building a program, add it to |
| @code{LDADD} for this program. In the following example, the program |
| @file{cpio} is statically linked with the library @file{libcpio.a}. |
| |
| @example |
| noinst_LIBRARIES = libcpio.a |
| libcpio_a_SOURCES = @dots{} |
| |
| bin_PROGRAMS = cpio |
| cpio_SOURCES = cpio.c @dots{} |
| cpio_LDADD = libcpio.a |
| @end example |
| |
| |
| @node A Shared Library |
| @section Building a Shared Library |
| |
| @cindex Shared libraries, support for |
| |
| Building shared libraries portably is a relatively complex matter. |
| For this reason, GNU Libtool (@pxref{Top, , Introduction, libtool, The |
| Libtool Manual}) was created to help build shared libraries in a |
| platform-independent way. |
| |
| @menu |
| * Libtool Concept:: Introducing Libtool |
| * Libtool Libraries:: Declaring Libtool Libraries |
| * Conditional Libtool Libraries:: Building Libtool Libraries Conditionally |
| * Conditional Libtool Sources:: Choosing Library Sources Conditionally |
| * Libtool Convenience Libraries:: Building Convenience Libtool Libraries |
| * Libtool Modules:: Building Libtool Modules |
| * Libtool Flags:: Using _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS |
| * LTLIBOBJS:: Using $(LTLIBOBJS) and $(LTALLOCA) |
| * Libtool Issues:: Common Issues Related to Libtool's Use |
| @end menu |
| |
| @node Libtool Concept |
| @subsection The Libtool Concept |
| |
| @cindex @command{libtool}, introduction |
| @cindex libtool library, definition |
| @cindex suffix @file{.la}, defined |
| @cindex @file{.la} suffix, defined |
| |
| Libtool abstracts shared and static libraries into a unified concept |
| henceforth called @dfn{libtool libraries}. Libtool libraries are |
| files using the @file{.la} suffix, and can designate a static library, |
| a shared library, or maybe both. Their exact nature cannot be |
| determined until @file{./configure} is run: not all platforms support |
| all kinds of libraries, and users can explicitly select which |
| libraries should be built. (However the package's maintainers can |
| tune the default, @pxref{AC_PROG_LIBTOOL, , The @code{AC_PROG_LIBTOOL} |
| macro, libtool, The Libtool Manual}.) |
| |
| @cindex suffix @file{.lo}, defined |
| Because object files for shared and static libraries must be compiled |
| differently, libtool is also used during compilation. Object files |
| built by libtool are called @dfn{libtool objects}: these are files |
| using the @file{.lo} suffix. Libtool libraries are built from these |
| libtool objects. |
| |
| You should not assume anything about the structure of @file{.la} or |
| @file{.lo} files and how libtool constructs them: this is libtool's |
| concern, and the last thing one wants is to learn about libtool's |
| guts. However the existence of these files matters, because they are |
| used as targets and dependencies in @file{Makefile}s rules when |
| building libtool libraries. There are situations where you may have |
| to refer to these, for instance when expressing dependencies for |
| building source files conditionally (@pxref{Conditional Libtool |
| Sources}). |
| |
| @cindex @file{libltdl}, introduction |
| |
| People considering writing a plug-in system, with dynamically loaded |
| modules, should look into @file{libltdl}: libtool's dlopening library |
| (@pxref{Using libltdl, , Using libltdl, libtool, The Libtool Manual}). |
| This offers a portable dlopening facility to load libtool libraries |
| dynamically, and can also achieve static linking where unavoidable. |
| |
| Before we discuss how to use libtool with Automake in details, it |
| should be noted that the libtool manual also has a section about how |
| to use Automake with libtool (@pxref{Using Automake, , Using Automake |
| with Libtool, libtool, The Libtool Manual}). |
| |
| @node Libtool Libraries |
| @subsection Building Libtool Libraries |
| |
| @cindex @code{_LTLIBRARIES} primary, defined |
| @cindex @code{LTLIBRARIES} primary, defined |
| @cindex Primary variable, @code{LTLIBRARIES} |
| @cindex Example of shared libraries |
| @vindex lib_LTLIBRARIES |
| @vindex pkglib_LTLIBRARIES |
| @vindex _LTLIBRARIES |
| |
| Automake uses libtool to build libraries declared with the |
| @code{LTLIBRARIES} primary. Each @code{_LTLIBRARIES} variable is a |
| list of libtool libraries to build. For instance, to create a libtool |
| library named @file{libgettext.la}, and install it in @code{libdir}, |
| write: |
| |
| @example |
| lib_LTLIBRARIES = libgettext.la |
| libgettext_la_SOURCES = gettext.c gettext.h @dots{} |
| @end example |
| |
| Automake predefines the variable @code{pkglibdir}, so you can use |
| @code{pkglib_LTLIBRARIES} to install libraries in |
| @samp{$(libdir)/@@PACKAGE@@/}. |
| |
| If @file{gettext.h} is a public header file that needs to be installed |
| in order for people to use the library, it should be declared using a |
| @code{_HEADERS} variable, not in @code{libgettext_la_SOURCES}. |
| Headers listed in the latter should be internal headers that are not |
| part of the public interface. |
| |
| @example |
| lib_LTLIBRARIES = libgettext.la |
| libgettext_la_SOURCES = gettext.c @dots{} |
| include_HEADERS = gettext.h @dots{} |
| @end example |
| |
| A package can build and install such a library along with other |
| programs that use it. This dependency should be specified using |
| @code{LDADD}. The following example builds a program named |
| @file{hello} that is linked with @file{libgettext.la}. |
| |
| @example |
| lib_LTLIBRARIES = libgettext.la |
| libgettext_la_SOURCES = gettext.c @dots{} |
| |
| bin_PROGRAMS = hello |
| hello_SOURCES = hello.c @dots{} |
| hello_LDADD = libgettext.la |
| @end example |
| |
| @noindent |
| Whether @file{hello} is statically or dynamically linked with |
| @file{libgettext.la} is not yet known: this will depend on the |
| configuration of libtool and the capabilities of the host. |
| |
| |
| @node Conditional Libtool Libraries |
| @subsection Building Libtool Libraries Conditionally |
| @cindex libtool libraries, conditional |
| @cindex conditional libtool libraries |
| |
| Like conditional programs (@pxref{Conditional Programs}), there are |
| two main ways to build conditional libraries: using Automake |
| conditionals or using Autoconf @code{AC_SUBST}itutions. |
| |
| The important implementation detail you have to be aware of is that |
| the place where a library will be installed matters to libtool: it |
| needs to be indicated @emph{at link-time} using the @option{-rpath} |
| option. |
| |
| For libraries whose destination directory is known when Automake runs, |
| Automake will automatically supply the appropriate @option{-rpath} |
| option to libtool. This is the case for libraries listed explicitly in |
| some installable @code{_LTLIBRARIES} variables such as |
| @code{lib_LTLIBRARIES}. |
| |
| However, for libraries determined at configure time (and thus |
| mentioned in @code{EXTRA_LTLIBRARIES}), Automake does not know the |
| final installation directory. For such libraries you must add the |
| @option{-rpath} option to the appropriate @code{_LDFLAGS} variable by |
| hand. |
| |
| The examples below illustrate the differences between these two methods. |
| |
| Here is an example where @code{WANTEDLIBS} is an @code{AC_SUBST}ed |
| variable set at @file{./configure}-time to either @file{libfoo.la}, |
| @file{libbar.la}, both, or none. Although @samp{$(WANTEDLIBS)} |
| appears in the @code{lib_LTLIBRARIES}, Automake cannot guess it |
| relates to @file{libfoo.la} or @file{libbar.la} at the time it creates |
| the link rule for these two libraries. Therefore the @option{-rpath} |
| argument must be explicitly supplied. |
| |
| @c Keep in sync with ltcond.sh |
| @example |
| EXTRA_LTLIBRARIES = libfoo.la libbar.la |
| lib_LTLIBRARIES = $(WANTEDLIBS) |
| libfoo_la_SOURCES = foo.c @dots{} |
| libfoo_la_LDFLAGS = -rpath '$(libdir)' |
| libbar_la_SOURCES = bar.c @dots{} |
| libbar_la_LDFLAGS = -rpath '$(libdir)' |
| @end example |
| |
| Here is how the same @file{Makefile.am} would look using Automake |
| conditionals named @code{WANT_LIBFOO} and @code{WANT_LIBBAR}. Now |
| Automake is able to compute the @option{-rpath} setting itself, because |
| it's clear that both libraries will end up in @samp{$(libdir)} if they |
| are installed. |
| |
| @c Keep in sync with ltcond.sh |
| @example |
| lib_LTLIBRARIES = |
| if WANT_LIBFOO |
| lib_LTLIBRARIES += libfoo.la |
| endif |
| if WANT_LIBBAR |
| lib_LTLIBRARIES += libbar.la |
| endif |
| libfoo_la_SOURCES = foo.c @dots{} |
| libbar_la_SOURCES = bar.c @dots{} |
| @end example |
| |
| @node Conditional Libtool Sources |
| @subsection Libtool Libraries with Conditional Sources |
| |
| Conditional compilation of sources in a library can be achieved in the |
| same way as conditional compilation of sources in a program |
| (@pxref{Conditional Sources}). The only difference is that |
| @code{_LIBADD} should be used instead of @code{_LDADD} and that it |
| should mention libtool objects (@file{.lo} files). |
| |
| So, to mimic the @file{hello} example from @ref{Conditional Sources}, |
| we could build a @file{libhello.la} library using either |
| @file{hello-linux.c} or @file{hello-generic.c} with the following |
| @file{Makefile.am}. |
| |
| @c Keep in sync with ltcond2.sh |
| @example |
| lib_LTLIBRARIES = libhello.la |
| libhello_la_SOURCES = hello-common.c |
| EXTRA_libhello_la_SOURCES = hello-linux.c hello-generic.c |
| libhello_la_LIBADD = $(HELLO_SYSTEM) |
| libhello_la_DEPENDENCIES = $(HELLO_SYSTEM) |
| @end example |
| |
| @noindent |
| And make sure @command{configure} defines @code{HELLO_SYSTEM} as |
| either @file{hello-linux.lo} or @file{hello-@-generic.lo}. |
| |
| Or we could simply use an Automake conditional as follows. |
| |
| @c Keep in sync with ltcond2.sh |
| @example |
| lib_LTLIBRARIES = libhello.la |
| libhello_la_SOURCES = hello-common.c |
| if LINUX |
| libhello_la_SOURCES += hello-linux.c |
| else |
| libhello_la_SOURCES += hello-generic.c |
| endif |
| @end example |
| |
| @node Libtool Convenience Libraries |
| @subsection Libtool Convenience Libraries |
| @cindex convenience libraries, libtool |
| @cindex libtool convenience libraries |
| @vindex noinst_LTLIBRARIES |
| @vindex check_LTLIBRARIES |
| |
| Sometimes you want to build libtool libraries that should not be |
| installed. These are called @dfn{libtool convenience libraries} and |
| are typically used to encapsulate many sublibraries, later gathered |
| into one big installed library. |
| |
| Libtool convenience libraries are declared by directory-less variables |
| such as @code{noinst_LTLIBRARIES}, @code{check_LTLIBRARIES}, or even |
| @code{EXTRA_LTLIBRARIES}. Unlike installed libtool libraries they do |
| not need an @option{-rpath} flag at link time (actually this is the only |
| difference). |
| |
| Convenience libraries listed in @code{noinst_LTLIBRARIES} are always |
| built. Those listed in @code{check_LTLIBRARIES} are built only upon |
| @samp{make check}. Finally, libraries listed in |
| @code{EXTRA_LTLIBRARIES} are never built explicitly: Automake outputs |
| rules to build them, but if the library does not appear as a Makefile |
| dependency anywhere it won't be built (this is why |
| @code{EXTRA_LTLIBRARIES} is used for conditional compilation). |
| |
| Here is a sample setup merging libtool convenience libraries from |
| subdirectories into one main @file{libtop.la} library. |
| |
| @c Keep in sync with ltconv.sh |
| @example |
| # -- Top-level Makefile.am -- |
| SUBDIRS = sub1 sub2 @dots{} |
| lib_LTLIBRARIES = libtop.la |
| libtop_la_SOURCES = |
| libtop_la_LIBADD = \ |
| sub1/libsub1.la \ |
| sub2/libsub2.la \ |
| @dots{} |
| |
| # -- sub1/Makefile.am -- |
| noinst_LTLIBRARIES = libsub1.la |
| libsub1_la_SOURCES = @dots{} |
| |
| # -- sub2/Makefile.am -- |
| # showing nested convenience libraries |
| SUBDIRS = sub2.1 sub2.2 @dots{} |
| noinst_LTLIBRARIES = libsub2.la |
| libsub2_la_SOURCES = |
| libsub2_la_LIBADD = \ |
| sub21/libsub21.la \ |
| sub22/libsub22.la \ |
| @dots{} |
| @end example |
| |
| When using such setup, beware that @command{automake} will assume |
| @file{libtop.la} is to be linked with the C linker. This is because |
| @code{libtop_la_SOURCES} is empty, so @command{automake} picks C as |
| default language. If @code{libtop_la_SOURCES} was not empty, |
| @command{automake} would select the linker as explained in @ref{How |
| the Linker is Chosen}. |
| |
| If one of the sublibraries contains non-C source, it is important that |
| the appropriate linker be chosen. One way to achieve this is to |
| pretend that there is such a non-C file among the sources of the |
| library, thus forcing @command{automake} to select the appropriate |
| linker. Here is the top-level @file{Makefile} of our example updated |
| to force C++ linking. |
| |
| @example |
| SUBDIRS = sub1 sub2 @dots{} |
| lib_LTLIBRARIES = libtop.la |
| libtop_la_SOURCES = |
| # Dummy C++ source to cause C++ linking. |
| nodist_EXTRA_libtop_la_SOURCES = dummy.cxx |
| libtop_la_LIBADD = \ |
| sub1/libsub1.la \ |
| sub2/libsub2.la \ |
| @dots{} |
| @end example |
| |
| @samp{EXTRA_*_SOURCES} variables are used to keep track of source |
| files that might be compiled (this is mostly useful when doing |
| conditional compilation using @code{AC_SUBST}, @pxref{Conditional |
| Libtool Sources}), and the @code{nodist_} prefix means the listed |
| sources are not to be distributed (@pxref{Program and Library |
| Variables}). In effect the file @file{dummy.cxx} does not need to |
| exist in the source tree. Of course if you have some real source file |
| to list in @code{libtop_la_SOURCES} there is no point in cheating with |
| @code{nodist_EXTRA_libtop_la_SOURCES}. |
| |
| |
| @node Libtool Modules |
| @subsection Libtool Modules |
| @cindex modules, libtool |
| @cindex libtool modules |
| @cindex @option{-module}, libtool |
| |
| These are libtool libraries meant to be dlopened. They are |
| indicated to libtool by passing @option{-module} at link-time. |
| |
| @example |
| pkglib_LTLIBRARIES = mymodule.la |
| mymodule_la_SOURCES = doit.c |
| mymodule_la_LDFLAGS = -module |
| @end example |
| |
| Ordinarily, Automake requires that a library's name start with |
| @code{lib}. However, when building a dynamically loadable module you |
| might wish to use a "nonstandard" name. Automake will not complain |
| about such nonstandard names if it knows the library being built is a |
| libtool module, i.e., if @option{-module} explicitly appears in the |
| library's @code{_LDFLAGS} variable (or in the common @code{AM_LDFLAGS} |
| variable when no per-library @code{_LDFLAGS} variable is defined). |
| |
| As always, @code{AC_SUBST} variables are black boxes to Automake since |
| their values are not yet known when @command{automake} is run. |
| Therefore if @option{-module} is set via such a variable, Automake |
| cannot notice it and will proceed as if the library was an ordinary |
| libtool library, with strict naming. |
| |
| If @code{mymodule_la_SOURCES} is not specified, then it defaults to |
| the single file @file{mymodule.c} (@pxref{Default _SOURCES}). |
| |
| @node Libtool Flags |
| @subsection @code{_LIBADD}, @code{_LDFLAGS}, and @code{_LIBTOOLFLAGS} |
| @cindex @code{_LIBADD}, libtool |
| @cindex @code{_LDFLAGS}, libtool |
| @cindex @code{_LIBTOOLFLAGS}, libtool |
| @vindex AM_LIBTOOLFLAGS |
| @vindex LIBTOOLFLAGS |
| @vindex maude_LIBTOOLFLAGS |
| |
| As shown in previous sections, the @samp{@var{library}_LIBADD} |
| variable should be used to list extra libtool objects (@file{.lo} |
| files) or libtool libraries (@file{.la}) to add to @var{library}. |
| |
| The @samp{@var{library}_LDFLAGS} variable is the place to list |
| additional libtool linking flags, such as @option{-version-info}, |
| @option{-static}, and a lot more. @xref{Link mode, , Link mode, |
| libtool, The Libtool Manual}. |
| |
| The @command{libtool} command has two kinds of options: mode-specific |
| options and generic options. Mode-specific options such as the |
| aforementioned linking flags should be lumped with the other flags |
| passed to the tool invoked by @command{libtool} (hence the use of |
| @samp{@var{library}_LDFLAGS} for libtool linking flags). Generic |
| options include @option{--tag=@var{tag}} and @option{--silent} |
| (@pxref{Invoking libtool, , Invoking @command{libtool}, libtool, The |
| Libtool Manual} for more options) should appear before the mode |
| selection on the command line; in @file{Makefile.am}s they should |
| be listed in the @samp{@var{library}_LIBTOOLFLAGS} variable. |
| |
| If @samp{@var{library}_LIBTOOLFLAGS} is not defined, then the variable |
| @code{AM_LIBTOOLFLAGS} is used instead. |
| |
| These flags are passed to libtool after the @option{--tag=@var{tag}} |
| option computed by Automake (if any), so |
| @samp{@var{library}_LIBTOOLFLAGS} (or @code{AM_LIBTOOLFLAGS}) is a |
| good place to override or supplement the @option{--tag=@var{tag}} |
| setting. |
| |
| The libtool rules also use a @code{LIBTOOLFLAGS} variable that should |
| not be set in @file{Makefile.am}: this is a user variable (@pxref{Flag |
| Variables Ordering}. It allows users to run @samp{make |
| LIBTOOLFLAGS=--silent}, for instance. Note that the verbosity of |
| @command{libtool} can also be influenced by the Automake support |
| for silent rules (@pxref{Automake Silent Rules}). |
| |
| @node LTLIBOBJS, Libtool Issues, Libtool Flags, A Shared Library |
| @subsection @code{LTLIBOBJS} and @code{LTALLOCA} |
| @cindex @code{LTLIBOBJS}, special handling |
| @cindex @code{LIBOBJS}, and Libtool |
| @cindex @code{LTALLOCA}, special handling |
| @cindex @code{ALLOCA}, and Libtool |
| @vindex LTLIBOBJS |
| @vindex LIBOBJS |
| @vindex LTALLOCA |
| @vindex ALLOCA |
| @acindex AC_LIBOBJ |
| |
| Where an ordinary library might include @samp{$(LIBOBJS)} or |
| @samp{$(ALLOCA)} (@pxref{LIBOBJS}), a libtool library must use |
| @samp{$(LTLIBOBJS)} or @samp{$(LTALLOCA)}. This is required because |
| the object files that libtool operates on do not necessarily end in |
| @file{.o}. |
| |
| Nowadays, the computation of @code{LTLIBOBJS} from @code{LIBOBJS} is |
| performed automatically by Autoconf (@pxref{AC_LIBOBJ vs LIBOBJS, , |
| @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, autoconf, The Autoconf Manual}). |
| |
| @node Libtool Issues |
| @subsection Common Issues Related to Libtool's Use |
| |
| @menu |
| * Error required file ltmain.sh not found:: The need to run libtoolize |
| * Objects created both with libtool and without:: Avoid a specific build race |
| @end menu |
| |
| @node Error required file ltmain.sh not found |
| @subsubsection Error: @samp{required file `./ltmain.sh' not found} |
| @cindex @file{ltmain.sh} not found |
| @cindex @command{libtoolize}, no longer run by @command{automake} |
| @cindex @command{libtoolize} and @command{autoreconf} |
| @cindex @command{autoreconf} and @command{libtoolize} |
| @cindex @file{bootstrap} and @command{autoreconf} |
| @cindex @file{autogen.sh} and @command{autoreconf} |
| |
| Libtool comes with a tool called @command{libtoolize} that will |
| install libtool's supporting files into a package. Running this |
| command will install @file{ltmain.sh}. You should execute it before |
| @command{aclocal} and @command{automake}. |
| |
| People upgrading old packages to newer autotools are likely to face |
| this issue because older Automake versions used to call |
| @command{libtoolize}. Therefore old build scripts do not call |
| @command{libtoolize}. |
| |
| Since Automake 1.6, it has been decided that running |
| @command{libtoolize} was none of Automake's business. Instead, that |
| functionality has been moved into the @command{autoreconf} command |
| (@pxref{autoreconf Invocation, , Using @command{autoreconf}, autoconf, |
| The Autoconf Manual}). If you do not want to remember what to run and |
| when, just learn the @command{autoreconf} command. Hopefully, |
| replacing existing @file{bootstrap} or @file{autogen.sh} scripts by |
| a call to @command{autoreconf} should also free you from any similar |
| incompatible change in the future. |
| |
| @node Objects created both with libtool and without |
| @subsubsection Objects @samp{created with both libtool and without} |
| |
| Sometimes, the same source file is used both to build a libtool |
| library and to build another non-libtool target (be it a program or |
| another library). |
| |
| Let's consider the following @file{Makefile.am}. |
| |
| @example |
| bin_PROGRAMS = prog |
| prog_SOURCES = prog.c foo.c @dots{} |
| |
| lib_LTLIBRARIES = libfoo.la |
| libfoo_la_SOURCES = foo.c @dots{} |
| @end example |
| |
| @noindent |
| (In this trivial case the issue could be avoided by linking |
| @file{libfoo.la} with @file{prog} instead of listing @file{foo.c} in |
| @code{prog_SOURCES}. But let's assume we really want to keep |
| @file{prog} and @file{libfoo.la} separate.) |
| |
| Technically, it means that we should build @file{foo.$(OBJEXT)} for |
| @file{prog}, and @file{foo.lo} for @file{libfoo.la}. The problem is |
| that in the course of creating @file{foo.lo}, libtool may erase (or |
| replace) @file{foo.$(OBJEXT)}, and this cannot be avoided. |
| |
| Therefore, when Automake detects this situation it will complain |
| with a message such as |
| @example |
| object 'foo.$(OBJEXT)' created both with libtool and without |
| @end example |
| |
| A workaround for this issue is to ensure that these two objects get |
| different basenames. As explained in @ref{Renamed Objects}, this |
| happens automatically when per-targets flags are used. |
| |
| @example |
| bin_PROGRAMS = prog |
| prog_SOURCES = prog.c foo.c @dots{} |
| prog_CFLAGS = $(AM_CFLAGS) |
| |
| lib_LTLIBRARIES = libfoo.la |
| libfoo_la_SOURCES = foo.c @dots{} |
| @end example |
| |
| @noindent |
| Adding @samp{prog_CFLAGS = $(AM_CFLAGS)} is almost a no-op, because |
| when the @code{prog_CFLAGS} is defined, it is used instead of |
| @code{AM_CFLAGS}. However as a side effect it will cause |
| @file{prog.c} and @file{foo.c} to be compiled as |
| @file{prog-prog.$(OBJEXT)} and @file{prog-foo.$(OBJEXT)}, which solves |
| the issue. |
| |
| @node Program and Library Variables |
| @section Program and Library Variables |
| |
| Associated with each program is a collection of variables that can be |
| used to modify how that program is built. There is a similar list of |
| such variables for each library. The canonical name of the program (or |
| library) is used as a base for naming these variables. |
| |
| In the list below, we use the name ``maude'' to refer to the program or |
| library. In your @file{Makefile.am} you would replace this with the |
| canonical name of your program. This list also refers to ``maude'' as a |
| program, but in general the same rules apply for both static and dynamic |
| libraries; the documentation below notes situations where programs and |
| libraries differ. |
| |
| @vtable @code |
| @item maude_SOURCES |
| This variable, if it exists, lists all the source files that are |
| compiled to build the program. These files are added to the |
| distribution by default. When building the program, Automake will cause |
| each source file to be compiled to a single @file{.o} file (or |
| @file{.lo} when using libtool). Normally these object files are named |
| after the source file, but other factors can change this. If a file in |
| the @code{_SOURCES} variable has an unrecognized extension, Automake |
| will do one of two things with it. If a suffix rule exists for turning |
| files with the unrecognized extension into @file{.o} files, then |
| @command{automake} will treat this file as it will any other source file |
| (@pxref{Support for Other Languages}). Otherwise, the file will be |
| ignored as though it were a header file. |
| |
| The prefixes @code{dist_} and @code{nodist_} can be used to control |
| whether files listed in a @code{_SOURCES} variable are distributed. |
| @code{dist_} is redundant, as sources are distributed by default, but it |
| can be specified for clarity if desired. |
| |
| It is possible to have both @code{dist_} and @code{nodist_} variants of |
| a given @code{_SOURCES} variable at once; this lets you easily |
| distribute some files and not others, for instance: |
| |
| @example |
| nodist_maude_SOURCES = nodist.c |
| dist_maude_SOURCES = dist-me.c |
| @end example |
| |
| By default the output file (on Unix systems, the @file{.o} file) will |
| be put into the current build directory. However, if the option |
| @option{subdir-objects} is in effect in the current directory then the |
| @file{.o} file will be put into the subdirectory named after the |
| source file. For instance, with @option{subdir-objects} enabled, |
| @file{sub/dir/file.c} will be compiled to @file{sub/dir/file.o}. Some |
| people prefer this mode of operation. You can specify |
| @option{subdir-objects} in @code{AUTOMAKE_OPTIONS} (@pxref{Options}). |
| @cindex Subdirectory, objects in |
| @cindex Objects in subdirectory |
| |
| |
| @item EXTRA_maude_SOURCES |
| Automake needs to know the list of files you intend to compile |
| @emph{statically}. For one thing, this is the only way Automake has of |
| knowing what sort of language support a given @file{Makefile.in} |
| requires. @footnote{There are other, more obscure reasons for |
| this limitation as well.} This means that, for example, you can't put a |
| configure substitution like @samp{@@my_sources@@} into a @samp{_SOURCES} |
| variable. If you intend to conditionally compile source files and use |
| @file{configure} to substitute the appropriate object names into, e.g., |
| @code{_LDADD} (see below), then you should list the corresponding source |
| files in the @code{EXTRA_} variable. |
| |
| This variable also supports @code{dist_} and @code{nodist_} prefixes. |
| For instance, @code{nodist_EXTRA_maude_SOURCES} would list extra |
| sources that may need to be built, but should not be distributed. |
| |
| @item maude_AR |
| A static library is created by default by invoking @samp{$(AR) |
| $(ARFLAGS)} followed by the name of the library and then the objects |
| being put into the library. You can override this by setting the |
| @code{_AR} variable. This is usually used with C++; some C++ |
| compilers require a special invocation in order to instantiate all the |
| templates that should go into a library. For instance, the SGI C++ |
| compiler likes this variable set like so: |
| @example |
| libmaude_a_AR = $(CXX) -ar -o |
| @end example |
| |
| @item maude_LIBADD |
| Extra objects can be added to a @emph{library} using the @code{_LIBADD} |
| variable. For instance, this should be used for objects determined by |
| @command{configure} (@pxref{A Library}). |
| |
| In the case of libtool libraries, @code{maude_LIBADD} can also refer |
| to other libtool libraries. |
| |
| @item maude_LDADD |
| Extra objects (@file{*.$(OBJEXT)}) and libraries (@file{*.a}, |
| @file{*.la}) can be added to a @emph{program} by listing them in the |
| @code{_LDADD} variable. For instance, this should be used for objects |
| determined by @command{configure} (@pxref{Linking}). |
| |
| @code{_LDADD} and @code{_LIBADD} are inappropriate for passing |
| program-specific linker flags (except for @option{-l}, @option{-L}, |
| @option{-dlopen} and @option{-dlpreopen}). Use the @code{_LDFLAGS} variable |
| for this purpose. |
| |
| For instance, if your @file{configure.ac} uses @code{AC_PATH_XTRA}, you |
| could link your program against the X libraries like so: |
| |
| @example |
| maude_LDADD = $(X_PRE_LIBS) $(X_LIBS) $(X_EXTRA_LIBS) |
| @end example |
| |
| We recommend that you use @option{-l} and @option{-L} only when |
| referring to third-party libraries, and give the explicit file names |
| of any library built by your package. Doing so will ensure that |
| @code{maude_DEPENDENCIES} (see below) is correctly defined by default. |
| |
| @item maude_LDFLAGS |
| This variable is used to pass extra flags to the link step of a program |
| or a shared library. It overrides the @code{AM_LDFLAGS} variable. |
| |
| @item maude_LIBTOOLFLAGS |
| This variable is used to pass extra options to @command{libtool}. |
| It overrides the @code{AM_LIBTOOLFLAGS} variable. |
| These options are output before @command{libtool}'s @option{--mode=@var{mode}} |
| option, so they should not be mode-specific options (those belong to |
| the compiler or linker flags). @xref{Libtool Flags}. |
| |
| @item maude_DEPENDENCIES |
| @itemx EXTRA_maude_DEPENDENCIES |
| It is also occasionally useful to have a target (program or library) |
| depend on some other file that is not actually part of that target. |
| This can be done using the @code{_DEPENDENCIES} variable. Each |
| target depends on the contents of such a variable, but no further |
| interpretation is done. |
| |
| Since these dependencies are associated to the link rule used to |
| create the programs they should normally list files used by the link |
| command. That is @file{*.$(OBJEXT)}, @file{*.a}, or @file{*.la} files |
| for programs; @file{*.lo} and @file{*.la} files for Libtool libraries; |
| and @file{*.$(OBJEXT)} files for static libraries. In rare cases you |
| may need to add other kinds of files such as linker scripts, but |
| @emph{listing a source file in @code{_DEPENDENCIES} is wrong}. If |
| some source file needs to be built before all the components of a |
| program are built, consider using the @code{BUILT_SOURCES} variable |
| (@pxref{Sources}). |
| |
| If @code{_DEPENDENCIES} is not supplied, it is computed by Automake. |
| The automatically-assigned value is the contents of @code{_LDADD} or |
| @code{_LIBADD}, with most configure substitutions, @option{-l}, @option{-L}, |
| @option{-dlopen} and @option{-dlpreopen} options removed. The configure |
| substitutions that are left in are only @samp{$(LIBOBJS)} and |
| @samp{$(ALLOCA)}; these are left because it is known that they will not |
| cause an invalid value for @code{_DEPENDENCIES} to be generated. |
| |
| @code{_DEPENDENCIES} is more likely used to perform conditional |
| compilation using an @code{AC_SUBST} variable that contains a list of |
| objects. @xref{Conditional Sources}, and @ref{Conditional Libtool |
| Sources}. |
| |
| The @code{EXTRA_*_DEPENDENCIES} variable may be useful for cases where |
| you merely want to augment the @command{automake}-generated |
| @code{_DEPENDENCIES} variable rather than replacing it. |
| |
| @item maude_LINK |
| You can override the linker on a per-program basis. By default the |
| linker is chosen according to the languages used by the program. For |
| instance, a program that includes C++ source code would use the C++ |
| compiler to link. The @code{_LINK} variable must hold the name of a |
| command that can be passed all the @file{.o} file names and libraries |
| to link against as arguments. Note that the name of the underlying |
| program is @emph{not} passed to @code{_LINK}; typically one uses |
| @samp{$@@}: |
| |
| @example |
| maude_LINK = $(CCLD) -magic -o $@@ |
| @end example |
| |
| If a @code{_LINK} variable is not supplied, it may still be generated |
| and used by Automake due to the use of per-target link flags such as |
| @code{_CFLAGS}, @code{_LDFLAGS} or @code{_LIBTOOLFLAGS}, in cases where |
| they apply. |
| |
| @item maude_CCASFLAGS |
| @itemx maude_CFLAGS |
| @itemx maude_CPPFLAGS |
| @itemx maude_CXXFLAGS |
| @itemx maude_FFLAGS |
| @itemx maude_GCJFLAGS |
| @itemx maude_LFLAGS |
| @itemx maude_OBJCFLAGS |
| @itemx maude_OBJCXXFLAGS |
| @itemx maude_RFLAGS |
| @itemx maude_UPCFLAGS |
| @itemx maude_YFLAGS |
| @cindex per-target compilation flags, defined |
| Automake allows you to set compilation flags on a per-program (or |
| per-library) basis. A single source file can be included in several |
| programs, and it will potentially be compiled with different flags for |
| each program. This works for any language directly supported by |
| Automake. These @dfn{per-target compilation flags} are |
| @samp{_CCASFLAGS}, |
| @samp{_CFLAGS}, |
| @samp{_CPPFLAGS}, |
| @samp{_CXXFLAGS}, |
| @samp{_FFLAGS}, |
| @samp{_GCJFLAGS}, |
| @samp{_LFLAGS}, |
| @samp{_OBJCFLAGS}, |
| @samp{_OBJCXXFLAGS}, |
| @samp{_RFLAGS}, |
| @samp{_UPCFLAGS}, and |
| @samp{_YFLAGS}. |
| |
| When using a per-target compilation flag, Automake will choose a |
| different name for the intermediate object files. Ordinarily a file |
| like @file{sample.c} will be compiled to produce @file{sample.o}. |
| However, if the program's @code{_CFLAGS} variable is set, then the |
| object file will be named, for instance, @file{maude-sample.o}. (See |
| also @ref{Renamed Objects}). |
| |
| In compilations with per-target flags, the ordinary @samp{AM_} form of |
| the flags variable is @emph{not} automatically included in the |
| compilation (however, the user form of the variable @emph{is} included). |
| So for instance, if you want the hypothetical @file{maude} compilations |
| to also use the value of @code{AM_CFLAGS}, you would need to write: |
| |
| @example |
| maude_CFLAGS = @dots{} your flags @dots{} $(AM_CFLAGS) |
| @end example |
| |
| @xref{Flag Variables Ordering}, for more discussion about the |
| interaction between user variables, @samp{AM_} shadow variables, and |
| per-target variables. |
| |
| @item maude_SHORTNAME |
| On some platforms the allowable file names are very short. In order to |
| support these systems and per-target compilation flags at the same |
| time, Automake allows you to set a ``short name'' that will influence |
| how intermediate object files are named. For instance, in the following |
| example, |
| |
| @example |
| bin_PROGRAMS = maude |
| maude_CPPFLAGS = -DSOMEFLAG |
| maude_SHORTNAME = m |
| maude_SOURCES = sample.c @dots{} |
| @end example |
| |
| @noindent |
| the object file would be named @file{m-sample.o} rather than |
| @file{maude-sample.o}. |
| |
| This facility is rarely needed in practice, |
| and we recommend avoiding it until you find it is required. |
| @end vtable |
| |
| @node Default _SOURCES |
| @section Default @code{_SOURCES} |
| |
| @vindex _SOURCES |
| @vindex SOURCES |
| @cindex @code{_SOURCES}, default |
| @cindex default @code{_SOURCES} |
| @vindex AM_DEFAULT_SOURCE_EXT |
| |
| @code{_SOURCES} variables are used to specify source files of programs |
| (@pxref{A Program}), libraries (@pxref{A Library}), and Libtool |
| libraries (@pxref{A Shared Library}). |
| |
| When no such variable is specified for a target, Automake will define |
| one itself. The default is to compile a single C file whose base name |
| is the name of the target itself, with any extension replaced by |
| @code{AM_DEFAULT_SOURCE_EXT}, which defaults to @file{.c}. |
| |
| For example if you have the following somewhere in your |
| @file{Makefile.am} with no corresponding @code{libfoo_a_SOURCES}: |
| |
| @example |
| lib_LIBRARIES = libfoo.a sub/libc++.a |
| @end example |
| |
| @noindent |
| @file{libfoo.a} will be built using a default source file named |
| @file{libfoo.c}, and @file{sub/libc++.a} will be built from |
| @file{sub/libc++.c}. (In older versions @file{sub/libc++.a} |
| would be built from @file{sub_libc___a.c}, i.e., the default source |
| was the canonized name of the target, with @file{.c} appended. |
| We believe the new behavior is more sensible, but for backward |
| compatibility @command{automake} will use the old name if a file or a rule |
| with that name exists and @code{AM_DEFAULT_SOURCE_EXT} is not used.) |
| |
| @cindex @code{check_PROGRAMS} example |
| @vindex check_PROGRAMS |
| Default sources are mainly useful in test suites, when building many |
| test programs each from a single source. For instance, in |
| |
| @example |
| check_PROGRAMS = test1 test2 test3 |
| AM_DEFAULT_SOURCE_EXT = .cpp |
| @end example |
| |
| @noindent |
| @file{test1}, @file{test2}, and @file{test3} will be built |
| from @file{test1.cpp}, @file{test2.cpp}, and @file{test3.cpp}. |
| Without the last line, they will be built from @file{test1.c}, |
| @file{test2.c}, and @file{test3.c}. |
| |
| @cindex Libtool modules, default source example |
| @cindex default source, Libtool modules example |
| Another case where this is convenient is building many Libtool modules |
| (@file{module@var{n}.la}), each defined in its own file |
| (@file{module@var{n}.c}). |
| |
| @example |
| AM_LDFLAGS = -module |
| lib_LTLIBRARIES = module1.la module2.la module3.la |
| @end example |
| |
| @cindex empty @code{_SOURCES} |
| @cindex @code{_SOURCES}, empty |
| Finally, there is one situation where this default source computation |
| needs to be avoided: when a target should not be built from sources. |
| We already saw such an example in @ref{true}; this happens when all |
| the constituents of a target have already been compiled and just need |
| to be combined using a @code{_LDADD} variable. Then it is necessary |
| to define an empty @code{_SOURCES} variable, so that @command{automake} |
| does not compute a default. |
| |
| @example |
| bin_PROGRAMS = target |
| target_SOURCES = |
| target_LDADD = libmain.a libmisc.a |
| @end example |
| |
| @node LIBOBJS |
| @section Special handling for @code{LIBOBJS} and @code{ALLOCA} |
| |
| @cindex @code{LIBOBJS}, example |
| @cindex @code{ALLOCA}, example |
| @cindex @code{LIBOBJS}, special handling |
| @cindex @code{ALLOCA}, special handling |
| @vindex LTLIBOBJS |
| @vindex LIBOBJS |
| @vindex LTALLOCA |
| @vindex ALLOCA |
| |
| The @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} variables list object |
| files that should be compiled into the project to provide an |
| implementation for functions that are missing or broken on the host |
| system. They are substituted by @file{configure}. |
| |
| @acindex AC_LIBOBJ |
| |
| These variables are defined by Autoconf macros such as |
| @code{AC_LIBOBJ}, @code{AC_REPLACE_FUNCS} (@pxref{Generic Functions, , |
| Generic Function Checks, autoconf, The Autoconf Manual}), or |
| @code{AC_FUNC_ALLOCA} (@pxref{Particular Functions, , Particular |
| Function Checks, autoconf, The Autoconf Manual}). Many other Autoconf |
| macros call @code{AC_LIBOBJ} or @code{AC_REPLACE_FUNCS} to |
| populate @samp{$(LIBOBJS)}. |
| |
| @acindex AC_LIBSOURCE |
| |
| Using these variables is very similar to doing conditional compilation |
| using @code{AC_SUBST} variables, as described in @ref{Conditional |
| Sources}. That is, when building a program, @samp{$(LIBOBJS)} and |
| @samp{$(ALLOCA)} should be added to the associated @samp{*_LDADD} |
| variable, or to the @samp{*_LIBADD} variable when building a library. |
| However there is no need to list the corresponding sources in |
| @samp{EXTRA_*_SOURCES} nor to define @samp{*_DEPENDENCIES}. Automake |
| automatically adds @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} to the |
| dependencies, and it will discover the list of corresponding source |
| files automatically (by tracing the invocations of the |
| @code{AC_LIBSOURCE} Autoconf macros). If you have already defined |
| @samp{*_DEPENDENCIES} explicitly for an unrelated reason, then you |
| either need to add these variables manually, or use |
| @samp{EXTRA_*_DEPENDENCIES} instead of @samp{*_DEPENDENCIES}. |
| |
| These variables are usually used to build a portability library that |
| is linked with all the programs of the project. We now review a |
| sample setup. First, @file{configure.ac} contains some checks that |
| affect either @code{LIBOBJS} or @code{ALLOCA}. |
| |
| @example |
| # configure.ac |
| @dots{} |
| AC_CONFIG_LIBOBJ_DIR([lib]) |
| @dots{} |
| AC_FUNC_MALLOC dnl May add malloc.$(OBJEXT) to LIBOBJS |
| AC_FUNC_MEMCMP dnl May add memcmp.$(OBJEXT) to LIBOBJS |
| AC_REPLACE_FUNCS([strdup]) dnl May add strdup.$(OBJEXT) to LIBOBJS |
| AC_FUNC_ALLOCA dnl May add alloca.$(OBJEXT) to ALLOCA |
| @dots{} |
| AC_CONFIG_FILES([ |
| lib/Makefile |
| src/Makefile |
| ]) |
| AC_OUTPUT |
| @end example |
| |
| @acindex AC_CONFIG_LIBOBJ_DIR |
| |
| The @code{AC_CONFIG_LIBOBJ_DIR} tells Autoconf that the source files |
| of these object files are to be found in the @file{lib/} directory. |
| Automake can also use this information, otherwise it expects the |
| source files are to be in the directory where the @samp{$(LIBOBJS)} |
| and @samp{$(ALLOCA)} variables are used. |
| |
| The @file{lib/} directory should therefore contain @file{malloc.c}, |
| @file{memcmp.c}, @file{strdup.c}, @file{alloca.c}. Here is its |
| @file{Makefile.am}: |
| |
| @example |
| # lib/Makefile.am |
| |
| noinst_LIBRARIES = libcompat.a |
| libcompat_a_SOURCES = |
| libcompat_a_LIBADD = $(LIBOBJS) $(ALLOCA) |
| @end example |
| |
| The library can have any name, of course, and anyway it is not going |
| to be installed: it just holds the replacement versions of the missing |
| or broken functions so we can later link them in. Many projects |
| also include extra functions, specific to the project, in that |
| library: they are simply added on the @code{_SOURCES} line. |
| |
| @cindex Empty libraries and @samp{$(LIBOBJS)} |
| @cindex @samp{$(LIBOBJS)} and empty libraries |
| There is a small trap here, though: @samp{$(LIBOBJS)} and |
| @samp{$(ALLOCA)} might be empty, and building an empty library is not |
| portable. You should ensure that there is always something to put in |
| @file{libcompat.a}. Most projects will also add some utility |
| functions in that directory, and list them in |
| @code{libcompat_a_SOURCES}, so in practice @file{libcompat.a} cannot |
| be empty. |
| |
| Finally here is how this library could be used from the @file{src/} |
| directory. |
| |
| @example |
| # src/Makefile.am |
| |
| # Link all programs in this directory with libcompat.a |
| LDADD = ../lib/libcompat.a |
| |
| bin_PROGRAMS = tool1 tool2 @dots{} |
| tool1_SOURCES = @dots{} |
| tool2_SOURCES = @dots{} |
| @end example |
| |
| When option @option{subdir-objects} is not used, as in the above |
| example, the variables @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} can only |
| be used in the directory where their sources lie. E.g., here it would |
| be wrong to use @samp{$(LIBOBJS)} or @samp{$(ALLOCA)} in |
| @file{src/Makefile.am}. However if both @option{subdir-objects} and |
| @code{AC_CONFIG_LIBOBJ_DIR} are used, it is OK to use these variables |
| in other directories. For instance @file{src/Makefile.am} could be |
| changed as follows. |
| |
| @example |
| # src/Makefile.am |
| |
| AUTOMAKE_OPTIONS = subdir-objects |
| LDADD = $(LIBOBJS) $(ALLOCA) |
| |
| bin_PROGRAMS = tool1 tool2 @dots{} |
| tool1_SOURCES = @dots{} |
| tool2_SOURCES = @dots{} |
| @end example |
| |
| Because @samp{$(LIBOBJS)} and @samp{$(ALLOCA)} contain object |
| file names that end with @samp{.$(OBJEXT)}, they are not suitable for |
| Libtool libraries (where the expected object extension is @file{.lo}): |
| @code{LTLIBOBJS} and @code{LTALLOCA} should be used instead. |
| |
| @code{LTLIBOBJS} is defined automatically by Autoconf and should not |
| be defined by hand (as in the past), however at the time of writing |
| @code{LTALLOCA} still needs to be defined from @code{ALLOCA} manually. |
| @xref{AC_LIBOBJ vs LIBOBJS, , @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}, |
| autoconf, The Autoconf Manual}. |
| |
| |
| @node Program Variables |
| @section Variables used when building a program |
| |
| Occasionally it is useful to know which @file{Makefile} variables |
| Automake uses for compilations, and in which order (@pxref{Flag |
| Variables Ordering}); for instance, you might need to do your own |
| compilation in some special cases. |
| |
| Some variables are inherited from Autoconf; these are @code{CC}, |
| @code{CFLAGS}, @code{CPPFLAGS}, @code{DEFS}, @code{LDFLAGS}, and |
| @code{LIBS}. |
| @vindex CC |
| @vindex CFLAGS |
| @vindex CPPFLAGS |
| @vindex DEFS |
| @vindex LDFLAGS |
| @vindex LIBS |
| |
| There are some additional variables that Automake defines on its own: |
| |
| @vtable @code |
| @item AM_CPPFLAGS |
| The contents of this variable are passed to every compilation that invokes |
| the C preprocessor; it is a list of arguments to the preprocessor. For |
| instance, @option{-I} and @option{-D} options should be listed here. |
| |
| Automake already provides some @option{-I} options automatically, in a |
| separate variable that is also passed to every compilation that invokes |
| the C preprocessor. In particular it generates @samp{-I.}, |
| @samp{-I$(srcdir)}, and a @option{-I} pointing to the directory holding |
| @file{config.h} (if you've used @code{AC_CONFIG_HEADERS}). You can |
| disable the default @option{-I} options using the @option{nostdinc} |
| option. |
| |
| When a file to be included is generated during the build and not part |
| of a distribution tarball, its location is under @code{$(builddir)}, |
| not under @code{$(srcdir)}. This matters especially for packages that |
| use header files placed in sub-directories and want to allow builds |
| outside the source tree (@pxref{VPATH Builds}). In that case we |
| recommend to use a pair of @option{-I} options, such as, e.g., |
| @samp{-Isome/subdir -I$(srcdir)/some/subdir} or |
| @samp{-I$(top_builddir)/some/subdir -I$(top_srcdir)/some/subdir}. |
| Note that the reference to the build tree should come before the |
| reference to the source tree, so that accidentally leftover generated |
| files in the source directory are ignored. |
| |
| @code{AM_CPPFLAGS} is ignored in preference to a per-executable (or |
| per-library) @code{_CPPFLAGS} variable if it is defined. |
| |
| @item INCLUDES |
| This does the same job as @code{AM_CPPFLAGS} (or any per-target |
| @code{_CPPFLAGS} variable if it is used). It is an older name for the |
| same functionality. This variable is deprecated; we suggest using |
| @code{AM_CPPFLAGS} and per-target @code{_CPPFLAGS} instead. |
| |
| @item AM_CFLAGS |
| This is the variable the @file{Makefile.am} author can use to pass |
| in additional C compiler flags. In some situations, this is |
| not used, in preference to the per-executable (or per-library) |
| @code{_CFLAGS}. |
| |
| @item COMPILE |
| This is the command used to actually compile a C source file. The |
| file name is appended to form the complete command line. |
| |
| @item AM_LDFLAGS |
| This is the variable the @file{Makefile.am} author can use to pass |
| in additional linker flags. In some situations, this is not used, in |
| preference to the per-executable (or per-library) @code{_LDFLAGS}. |
| |
| @item LINK |
| This is the command used to actually link a C program. It already |
| includes @samp{-o $@@} and the usual variable references (for instance, |
| @code{CFLAGS}); it takes as ``arguments'' the names of the object files |
| and libraries to link in. This variable is not used when the linker is |
| overridden with a per-target @code{_LINK} variable or per-target flags |
| cause Automake to define such a @code{_LINK} variable. |
| @end vtable |
| |
| |
| @node Yacc and Lex |
| @section Yacc and Lex support |
| |
| Automake has somewhat idiosyncratic support for Yacc and Lex. |
| |
| Automake assumes that the @file{.c} file generated by @command{yacc} |
| (or @command{lex}) should be named using the basename of the input |
| file. That is, for a yacc source file @file{foo.y}, Automake will |
| cause the intermediate file to be named @file{foo.c} (as opposed to |
| @file{y.tab.c}, which is more traditional). |
| |
| The extension of a yacc source file is used to determine the extension |
| of the resulting C or C++ source and header files. Note that header |
| files are generated only when the @option{-d} Yacc option is used; see |
| below for more information about this flag, and how to specify it. |
| Files with the extension @file{.y} will thus be turned into @file{.c} |
| sources and @file{.h} headers; likewise, @file{.yy} will become |
| @file{.cc} and @file{.hh}, @file{.y++} will become @file{c++} and |
| @file{h++}, @file{.yxx} will become @file{.cxx} and @file{.hxx}, |
| and @file{.ypp} will become @file{.cpp} and @file{.hpp}. |
| |
| Similarly, lex source files can be used to generate C or C++; the |
| extensions @file{.l}, @file{.ll}, @file{.l++}, @file{.lxx}, and |
| @file{.lpp} are recognized. |
| |
| You should never explicitly mention the intermediate (C or C++) file |
| in any @code{SOURCES} variable; only list the source file. |
| |
| The intermediate files generated by @command{yacc} (or @command{lex}) |
| will be included in any distribution that is made. That way the user |
| doesn't need to have @command{yacc} or @command{lex}. |
| |
| If a @command{yacc} source file is seen, then your @file{configure.ac} must |
| define the variable @code{YACC}. This is most easily done by invoking |
| the macro @code{AC_PROG_YACC} (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| @vindex YFLAGS |
| @vindex AM_YFLAGS |
| When @code{yacc} is invoked, it is passed @code{AM_YFLAGS} and |
| @code{YFLAGS}. The latter is a user variable and the former is |
| intended for the @file{Makefile.am} author. |
| |
| @code{AM_YFLAGS} is usually used to pass the @option{-d} option to |
| @command{yacc}. Automake knows what this means and will automatically |
| adjust its rules to update and distribute the header file built by |
| @samp{yacc -d}@footnote{Please note that @command{automake} recognizes |
| @option{-d} in @code{AM_YFLAGS} only if it is not clustered with other |
| options; for example, it won't be recognized if @code{AM_YFLAGS} is |
| @option{-dt}, but it will be if @code{AM_YFLAGS} is @option{-d -t} or |
| @option{-t -d}.}. |
| What Automake cannot guess, though, is where this |
| header will be used: it is up to you to ensure the header gets built |
| before it is first used. Typically this is necessary in order for |
| dependency tracking to work when the header is included by another |
| file. The common solution is listing the header file in |
| @code{BUILT_SOURCES} (@pxref{Sources}) as follows. |
| |
| @example |
| BUILT_SOURCES = parser.h |
| AM_YFLAGS = -d |
| bin_PROGRAMS = foo |
| foo_SOURCES = @dots{} parser.y @dots{} |
| @end example |
| |
| If a @command{lex} source file is seen, then your @file{configure.ac} |
| must define the variable @code{LEX}. You can use @code{AC_PROG_LEX} |
| to do this (@pxref{Particular Programs, , Particular Program Checks, |
| autoconf, The Autoconf Manual}), but using @code{AM_PROG_LEX} macro |
| (@pxref{Macros}) is recommended. |
| |
| @vindex LFLAGS |
| @vindex AM_LFLAGS |
| When @command{lex} is invoked, it is passed @code{AM_LFLAGS} and |
| @code{LFLAGS}. The latter is a user variable and the former is |
| intended for the @file{Makefile.am} author. |
| |
| When @code{AM_MAINTAINER_MODE} (@pxref{maintainer-mode}) is used, the |
| rebuild rule for distributed Yacc and Lex sources are only used when |
| @code{maintainer-mode} is enabled, or when the files have been erased. |
| |
| @cindex @command{ylwrap} |
| @cindex @command{yacc}, multiple parsers |
| @cindex Multiple @command{yacc} parsers |
| @cindex Multiple @command{lex} lexers |
| @cindex @command{lex}, multiple lexers |
| |
| When @command{lex} or @command{yacc} sources are used, @code{automake -a} |
| automatically installs an auxiliary program called @command{ylwrap} in |
| your package (@pxref{Auxiliary Programs}). |
| This program is used by the build rules to rename the output of these |
| tools, and makes it possible to include multiple @command{yacc} (or |
| @command{lex}) source files in a single directory. (This is necessary |
| because yacc's output file name is fixed, and a parallel make could |
| conceivably invoke more than one instance of @command{yacc} |
| simultaneously.) |
| |
| For @command{yacc}, simply managing locking is insufficient. The output of |
| @command{yacc} always uses the same symbol names internally, so it isn't |
| possible to link two @command{yacc} parsers into the same executable. |
| |
| We recommend using the following renaming hack used in @command{gdb}: |
| @example |
| #define yymaxdepth c_maxdepth |
| #define yyparse c_parse |
| #define yylex c_lex |
| #define yyerror c_error |
| #define yylval c_lval |
| #define yychar c_char |
| #define yydebug c_debug |
| #define yypact c_pact |
| #define yyr1 c_r1 |
| #define yyr2 c_r2 |
| #define yydef c_def |
| #define yychk c_chk |
| #define yypgo c_pgo |
| #define yyact c_act |
| #define yyexca c_exca |
| #define yyerrflag c_errflag |
| #define yynerrs c_nerrs |
| #define yyps c_ps |
| #define yypv c_pv |
| #define yys c_s |
| #define yy_yys c_yys |
| #define yystate c_state |
| #define yytmp c_tmp |
| #define yyv c_v |
| #define yy_yyv c_yyv |
| #define yyval c_val |
| #define yylloc c_lloc |
| #define yyreds c_reds |
| #define yytoks c_toks |
| #define yylhs c_yylhs |
| #define yylen c_yylen |
| #define yydefred c_yydefred |
| #define yydgoto c_yydgoto |
| #define yysindex c_yysindex |
| #define yyrindex c_yyrindex |
| #define yygindex c_yygindex |
| #define yytable c_yytable |
| #define yycheck c_yycheck |
| #define yyname c_yyname |
| #define yyrule c_yyrule |
| @end example |
| |
| For each define, replace the @samp{c_} prefix with whatever you like. |
| These defines work for @command{bison}, @command{byacc}, and |
| traditional @code{yacc}s. If you find a parser generator that uses a |
| symbol not covered here, please report the new name so it can be added |
| to the list. |
| |
| |
| @node C++ Support |
| @section C++ Support |
| |
| @cindex C++ support |
| @cindex Support for C++ |
| |
| Automake includes full support for C++. |
| |
| Any package including C++ code must define the output variable |
| @code{CXX} in @file{configure.ac}; the simplest way to do this is to use |
| the @code{AC_PROG_CXX} macro (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| A few additional variables are defined when a C++ source file is seen: |
| |
| @vtable @code |
| @item CXX |
| The name of the C++ compiler. |
| |
| @item CXXFLAGS |
| Any flags to pass to the C++ compiler. |
| |
| @item AM_CXXFLAGS |
| The maintainer's variant of @code{CXXFLAGS}. |
| |
| @item CXXCOMPILE |
| The command used to actually compile a C++ source file. The file name |
| is appended to form the complete command line. |
| |
| @item CXXLINK |
| The command used to actually link a C++ program. |
| @end vtable |
| |
| |
| @node Objective C Support |
| @section Objective C Support |
| |
| @cindex Objective C support |
| @cindex Support for Objective C |
| |
| Automake includes some support for Objective C. |
| |
| Any package including Objective C code must define the output variable |
| @code{OBJC} in @file{configure.ac}; the simplest way to do this is to use |
| the @code{AC_PROG_OBJC} macro (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| A few additional variables are defined when an Objective C source file |
| is seen: |
| |
| @vtable @code |
| @item OBJC |
| The name of the Objective C compiler. |
| |
| @item OBJCFLAGS |
| Any flags to pass to the Objective C compiler. |
| |
| @item AM_OBJCFLAGS |
| The maintainer's variant of @code{OBJCFLAGS}. |
| |
| @item OBJCCOMPILE |
| The command used to actually compile an Objective C source file. The |
| file name is appended to form the complete command line. |
| |
| @item OBJCLINK |
| The command used to actually link an Objective C program. |
| @end vtable |
| |
| |
| @node Objective C++ Support |
| @section Objective C++ Support |
| |
| @cindex Objective C++ support |
| @cindex Support for Objective C++ |
| |
| Automake includes some support for Objective C++. |
| |
| Any package including Objective C++ code must define the output variable |
| @code{OBJCXX} in @file{configure.ac}; the simplest way to do this is to use |
| the @code{AC_PROG_OBJCXX} macro (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| A few additional variables are defined when an Objective C++ source file |
| is seen: |
| |
| @vtable @code |
| @item OBJCXX |
| The name of the Objective C++ compiler. |
| |
| @item OBJCXXFLAGS |
| Any flags to pass to the Objective C++ compiler. |
| |
| @item AM_OBJCXXFLAGS |
| The maintainer's variant of @code{OBJCXXFLAGS}. |
| |
| @item OBJCXXCOMPILE |
| The command used to actually compile an Objective C++ source file. The |
| file name is appended to form the complete command line. |
| |
| @item OBJCXXLINK |
| The command used to actually link an Objective C++ program. |
| @end vtable |
| |
| |
| @node Unified Parallel C Support |
| @section Unified Parallel C Support |
| |
| @cindex Unified Parallel C support |
| @cindex Support for Unified Parallel C |
| |
| Automake includes some support for Unified Parallel C. |
| |
| Any package including Unified Parallel C code must define the output |
| variable @code{UPC} in @file{configure.ac}; the simplest way to do |
| this is to use the @code{AM_PROG_UPC} macro (@pxref{Public Macros}). |
| |
| A few additional variables are defined when a Unified Parallel C |
| source file is seen: |
| |
| @vtable @code |
| @item UPC |
| The name of the Unified Parallel C compiler. |
| |
| @item UPCFLAGS |
| Any flags to pass to the Unified Parallel C compiler. |
| |
| @item AM_UPCFLAGS |
| The maintainer's variant of @code{UPCFLAGS}. |
| |
| @item UPCCOMPILE |
| The command used to actually compile a Unified Parallel C source file. |
| The file name is appended to form the complete command line. |
| |
| @item UPCLINK |
| The command used to actually link a Unified Parallel C program. |
| @end vtable |
| |
| |
| @node Assembly Support |
| @section Assembly Support |
| |
| Automake includes some support for assembly code. There are two forms |
| of assembler files: normal (@file{*.s}) and preprocessed by @code{CPP} |
| (@file{*.S} or @file{*.sx}). |
| |
| @vindex CCAS |
| @vindex CCASFLAGS |
| @vindex CPPFLAGS |
| @vindex AM_CCASFLAGS |
| @vindex AM_CPPFLAGS |
| The variable @code{CCAS} holds the name of the compiler used to build |
| assembly code. This compiler must work a bit like a C compiler; in |
| particular it must accept @option{-c} and @option{-o}. The values of |
| @code{CCASFLAGS} and @code{AM_CCASFLAGS} (or its per-target |
| definition) is passed to the compilation. For preprocessed files, |
| @code{DEFS}, @code{DEFAULT_INCLUDES}, @code{INCLUDES}, @code{CPPFLAGS} |
| and @code{AM_CPPFLAGS} are also used. |
| |
| The autoconf macro @code{AM_PROG_AS} will define @code{CCAS} and |
| @code{CCASFLAGS} for you (unless they are already set, it simply sets |
| @code{CCAS} to the C compiler and @code{CCASFLAGS} to the C compiler |
| flags), but you are free to define these variables by other means. |
| |
| Only the suffixes @file{.s}, @file{.S}, and @file{.sx} are recognized by |
| @command{automake} as being files containing assembly code. |
| |
| |
| @node Fortran 77 Support |
| @comment node-name, next, previous, up |
| @section Fortran 77 Support |
| |
| @cindex Fortran 77 support |
| @cindex Support for Fortran 77 |
| |
| Automake includes full support for Fortran 77. |
| |
| Any package including Fortran 77 code must define the output variable |
| @code{F77} in @file{configure.ac}; the simplest way to do this is to use |
| the @code{AC_PROG_F77} macro (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| A few additional variables are defined when a Fortran 77 source file is |
| seen: |
| |
| @vtable @code |
| |
| @item F77 |
| The name of the Fortran 77 compiler. |
| |
| @item FFLAGS |
| Any flags to pass to the Fortran 77 compiler. |
| |
| @item AM_FFLAGS |
| The maintainer's variant of @code{FFLAGS}. |
| |
| @item RFLAGS |
| Any flags to pass to the Ratfor compiler. |
| |
| @item AM_RFLAGS |
| The maintainer's variant of @code{RFLAGS}. |
| |
| @item F77COMPILE |
| The command used to actually compile a Fortran 77 source file. The file |
| name is appended to form the complete command line. |
| |
| @item FLINK |
| The command used to actually link a pure Fortran 77 program or shared |
| library. |
| |
| @end vtable |
| |
| Automake can handle preprocessing Fortran 77 and Ratfor source files in |
| addition to compiling them@footnote{Much, if not most, of the |
| information in the following sections pertaining to preprocessing |
| Fortran 77 programs was taken almost verbatim from @ref{Catalogue of |
| Rules, , Catalogue of Rules, make, The GNU Make Manual}.}. Automake |
| also contains some support for creating programs and shared libraries |
| that are a mixture of Fortran 77 and other languages (@pxref{Mixing |
| Fortran 77 With C and C++}). |
| |
| These issues are covered in the following sections. |
| |
| @menu |
| * Preprocessing Fortran 77:: Preprocessing Fortran 77 sources |
| * Compiling Fortran 77 Files:: Compiling Fortran 77 sources |
| * Mixing Fortran 77 With C and C++:: Mixing Fortran 77 With C and C++ |
| @end menu |
| |
| |
| @node Preprocessing Fortran 77 |
| @comment node-name, next, previous, up |
| @subsection Preprocessing Fortran 77 |
| |
| @cindex Preprocessing Fortran 77 |
| @cindex Fortran 77, Preprocessing |
| @cindex Ratfor programs |
| |
| @file{N.f} is made automatically from @file{N.F} or @file{N.r}. This |
| rule runs just the preprocessor to convert a preprocessable Fortran 77 |
| or Ratfor source file into a strict Fortran 77 source file. The precise |
| command used is as follows: |
| |
| @table @file |
| |
| @item .F |
| @code{$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@* |
| $(AM_FFLAGS) $(FFLAGS)} |
| |
| @item .r |
| @code{$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)} |
| |
| @end table |
| |
| |
| @node Compiling Fortran 77 Files |
| @comment node-name, next, previous, up |
| @subsection Compiling Fortran 77 Files |
| |
| @file{N.o} is made automatically from @file{N.f}, @file{N.F} or |
| @file{N.r} by running the Fortran 77 compiler. The precise command used |
| is as follows: |
| |
| @table @file |
| |
| @item .f |
| @code{$(F77) -c $(AM_FFLAGS) $(FFLAGS)} |
| |
| @item .F |
| @code{$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)@* |
| $(AM_FFLAGS) $(FFLAGS)} |
| |
| @item .r |
| @code{$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)} |
| |
| @end table |
| |
| |
| @node Mixing Fortran 77 With C and C++ |
| @comment node-name, next, previous, up |
| @subsection Mixing Fortran 77 With C and C++ |
| |
| @cindex Fortran 77, mixing with C and C++ |
| @cindex Mixing Fortran 77 with C and C++ |
| @cindex Linking Fortran 77 with C and C++ |
| @cindex cfortran |
| @cindex Mixing Fortran 77 with C and/or C++ |
| |
| Automake currently provides @emph{limited} support for creating programs |
| and shared libraries that are a mixture of Fortran 77 and C and/or C++. |
| However, there are many other issues related to mixing Fortran 77 with |
| other languages that are @emph{not} (currently) handled by Automake, but |
| that are handled by other packages@footnote{For example, |
| @uref{http://www-zeus.desy.de/~burow/cfortran/, the cfortran package} |
| addresses all of these inter-language issues, and runs under nearly all |
| Fortran 77, C and C++ compilers on nearly all platforms. However, |
| @command{cfortran} is not yet Free Software, but it will be in the next |
| major release.}. |
| |
| Automake can help in two ways: |
| |
| @enumerate |
| @item |
| Automatic selection of the linker depending on which combinations of |
| source code. |
| |
| @item |
| Automatic selection of the appropriate linker flags (e.g., @option{-L} and |
| @option{-l}) to pass to the automatically selected linker in order to link |
| in the appropriate Fortran 77 intrinsic and run-time libraries. |
| |
| @cindex @code{FLIBS}, defined |
| @vindex FLIBS |
| These extra Fortran 77 linker flags are supplied in the output variable |
| @code{FLIBS} by the @code{AC_F77_LIBRARY_LDFLAGS} Autoconf macro. |
| @xref{Fortran Compiler, , Fortran Compiler Characteristics, autoconf, |
| The Autoconf Manual}. |
| @end enumerate |
| |
| If Automake detects that a program or shared library (as mentioned in |
| some @code{_PROGRAMS} or @code{_LTLIBRARIES} primary) contains source |
| code that is a mixture of Fortran 77 and C and/or C++, then it requires |
| that the macro @code{AC_F77_LIBRARY_LDFLAGS} be called in |
| @file{configure.ac}, and that either @code{$(FLIBS)} |
| appear in the appropriate @code{_LDADD} (for programs) or @code{_LIBADD} |
| (for shared libraries) variables. It is the responsibility of the |
| person writing the @file{Makefile.am} to make sure that @samp{$(FLIBS)} |
| appears in the appropriate @code{_LDADD} or |
| @code{_LIBADD} variable. |
| |
| @cindex Mixed language example |
| @cindex Example, mixed language |
| |
| For example, consider the following @file{Makefile.am}: |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = main.cc foo.f |
| foo_LDADD = libfoo.la $(FLIBS) |
| |
| pkglib_LTLIBRARIES = libfoo.la |
| libfoo_la_SOURCES = bar.f baz.c zardoz.cc |
| libfoo_la_LIBADD = $(FLIBS) |
| @end example |
| |
| In this case, Automake will insist that @code{AC_F77_LIBRARY_LDFLAGS} |
| is mentioned in @file{configure.ac}. Also, if @samp{$(FLIBS)} hadn't |
| been mentioned in @code{foo_LDADD} and @code{libfoo_la_LIBADD}, then |
| Automake would have issued a warning. |
| |
| @menu |
| * How the Linker is Chosen:: Automatic linker selection |
| @end menu |
| |
| @node How the Linker is Chosen |
| @comment node-name, next, previous, up |
| @subsubsection How the Linker is Chosen |
| |
| @cindex Automatic linker selection |
| @cindex Selecting the linker automatically |
| |
| When a program or library mixes several languages, Automake choose the |
| linker according to the following priorities. (The names in |
| parentheses are the variables containing the link command.) |
| |
| @enumerate |
| @item |
| @vindex GCJLINK |
| Native Java (@code{GCJLINK}) |
| @item |
| @vindex OBJCXXLINK |
| Objective C++ (@code{OBJCXXLINK}) |
| @item |
| @vindex CXXLINK |
| C++ (@code{CXXLINK}) |
| @item |
| @vindex F77LINK |
| Fortran 77 (@code{F77LINK}) |
| @item |
| @vindex FCLINK |
| Fortran (@code{FCLINK}) |
| @item |
| @vindex OBJCLINK |
| Objective C (@code{OBJCLINK}) |
| @item |
| @vindex UPCLINK |
| Unified Parallel C (@code{UPCLINK}) |
| @item |
| @vindex LINK |
| C (@code{LINK}) |
| @end enumerate |
| |
| For example, if Fortran 77, C and C++ source code is compiled |
| into a program, then the C++ linker will be used. In this case, if the |
| C or Fortran 77 linkers required any special libraries that weren't |
| included by the C++ linker, then they must be manually added to an |
| @code{_LDADD} or @code{_LIBADD} variable by the user writing the |
| @file{Makefile.am}. |
| |
| Automake only looks at the file names listed in @file{_SOURCES} |
| variables to choose the linker, and defaults to the C linker. |
| Sometimes this is inconvenient because you are linking against a |
| library written in another language and would like to set the linker |
| more appropriately. @xref{Libtool Convenience Libraries}, for a |
| trick with @code{nodist_EXTRA_@dots{}_SOURCES}. |
| |
| A per-target @code{_LINK} variable will override the above selection. |
| Per-target link flags will cause Automake to write a per-target |
| @code{_LINK} variable according to the language chosen as above. |
| |
| |
| @node Fortran 9x Support |
| @comment node-name, next, previous, up |
| @section Fortran 9x Support |
| |
| @cindex Fortran 9x support |
| @cindex Support for Fortran 9x |
| |
| Automake includes support for Fortran 9x. |
| |
| Any package including Fortran 9x code must define the output variable |
| @code{FC} in @file{configure.ac}; the simplest way to do this is to use |
| the @code{AC_PROG_FC} macro (@pxref{Particular Programs, , Particular |
| Program Checks, autoconf, The Autoconf Manual}). |
| |
| A few additional variables are defined when a Fortran 9x source file is |
| seen: |
| |
| @vtable @code |
| |
| @item FC |
| The name of the Fortran 9x compiler. |
| |
| @item FCFLAGS |
| Any flags to pass to the Fortran 9x compiler. |
| |
| @item AM_FCFLAGS |
| The maintainer's variant of @code{FCFLAGS}. |
| |
| @item FCCOMPILE |
| The command used to actually compile a Fortran 9x source file. The file |
| name is appended to form the complete command line. |
| |
| @item FCLINK |
| The command used to actually link a pure Fortran 9x program or shared |
| library. |
| |
| @end vtable |
| |
| @menu |
| * Compiling Fortran 9x Files:: Compiling Fortran 9x sources |
| @end menu |
| |
| @node Compiling Fortran 9x Files |
| @comment node-name, next, previous, up |
| @subsection Compiling Fortran 9x Files |
| |
| @file{@var{file}.o} is made automatically from @file{@var{file}.f90}, |
| @file{@var{file}.f95}, @file{@var{file}.f03}, or @file{@var{file}.f08} |
| by running the Fortran 9x compiler. The precise command used |
| is as follows: |
| |
| @table @file |
| |
| @item .f90 |
| @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f90) $<} |
| |
| @item .f95 |
| @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f95) $<} |
| |
| @item .f03 |
| @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f03) $<} |
| |
| @item .f08 |
| @code{$(FC) $(AM_FCFLAGS) $(FCFLAGS) -c $(FCFLAGS_f08) $<} |
| |
| @end table |
| |
| @node Java Support with gcj |
| @comment node-name, next, previous, up |
| @section Compiling Java sources using gcj |
| |
| @cindex Java support with gcj |
| @cindex Support for Java with gcj |
| @cindex Java to native code, compilation |
| @cindex Compilation of Java to native code |
| |
| Automake includes support for natively compiled Java, using @command{gcj}, |
| the Java front end to the GNU Compiler Collection (rudimentary support |
| for compiling Java to bytecode using the @command{javac} compiler is |
| also present, @emph{albeit deprecated}; @pxref{Java}). |
| |
| Any package including Java code to be compiled must define the output |
| variable @code{GCJ} in @file{configure.ac}; the variable @code{GCJFLAGS} |
| must also be defined somehow (either in @file{configure.ac} or |
| @file{Makefile.am}). The simplest way to do this is to use the |
| @code{AM_PROG_GCJ} macro. |
| |
| @vindex GCJFLAGS |
| |
| By default, programs including Java source files are linked with |
| @command{gcj}. |
| |
| As always, the contents of @code{AM_GCJFLAGS} are passed to every |
| compilation invoking @command{gcj} (in its role as an ahead-of-time |
| compiler, when invoking it to create @file{.class} files, |
| @code{AM_JAVACFLAGS} is used instead). If it is necessary to pass |
| options to @command{gcj} from @file{Makefile.am}, this variable, and not |
| the user variable @code{GCJFLAGS}, should be used. |
| |
| @vindex AM_GCJFLAGS |
| |
| @command{gcj} can be used to compile @file{.java}, @file{.class}, |
| @file{.zip}, or @file{.jar} files. |
| |
| When linking, @command{gcj} requires that the main class be specified |
| using the @option{--main=} option. The easiest way to do this is to use |
| the @code{_LDFLAGS} variable for the program. |
| |
| |
| @node Vala Support |
| @comment node-name, next, previous, up |
| @section Vala Support |
| |
| @cindex Vala Support |
| @cindex Support for Vala |
| |
| Automake provides initial support for Vala |
| (@uref{http://www.vala-project.org/}). |
| This requires valac version 0.7.0 or later, and currently requires |
| the user to use GNU @command{make}. |
| |
| @example |
| foo_SOURCES = foo.vala bar.vala zardoc.c |
| @end example |
| |
| Any @file{.vala} file listed in a @code{_SOURCES} variable will be |
| compiled into C code by the Vala compiler. The generated @file{.c} files |
| are distributed. The end user does not need to have a Vala compiler installed. |
| |
| Automake ships with an Autoconf macro called @code{AM_PROG_VALAC} |
| that will locate the Vala compiler and optionally check its version |
| number. |
| |
| @defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found}, |
| @ovar{action-if-not-found}) |
| Search for a Vala compiler in @env{PATH}. If it is found, the variable |
| @code{VALAC} is set to point to it (see below for more details). This |
| macro takes three optional arguments. The first argument, if present, |
| is the minimum version of the Vala compiler required to compile this |
| package. If a compiler is found and satisfies @var{minimum-version}, |
| then @var{action-if-found} is run (this defaults to do nothing). |
| Otherwise, @var{action-if-not-found} is run. If @var{action-if-not-found} |
| is not specified, the default value is to print a warning in case no |
| compiler is found, or if a too-old version of the compiler is found. |
| @end defmac |
| |
| There are a few variables that are used when compiling Vala sources: |
| |
| @vtable @code |
| @item VALAC |
| Absolute path to the Vala compiler, or simply @samp{valac} if no |
| suitable compiler Vala could be found at configure runtime. |
| |
| @item VALAFLAGS |
| Additional arguments for the Vala compiler. |
| |
| @item AM_VALAFLAGS |
| The maintainer's variant of @code{VALAFLAGS}. |
| |
| @example |
| lib_LTLIBRARIES = libfoo.la |
| libfoo_la_SOURCES = foo.vala |
| @end example |
| @end vtable |
| |
| Note that currently, you cannot use per-target @code{*_VALAFLAGS} |
| (@pxref{Renamed Objects}) to produce different C files from one Vala |
| source file. |
| |
| |
| @node Support for Other Languages |
| @comment node-name, next, previous, up |
| @section Support for Other Languages |
| |
| Automake currently only includes full support for C, C++ (@pxref{C++ |
| Support}), Objective C (@pxref{Objective C Support}), |
| Objective C++ (@pxref{Objective C++ Support}), |
| Fortran 77 |
| (@pxref{Fortran 77 Support}), Fortran 9x (@pxref{Fortran 9x Support}), |
| and Java (@pxref{Java Support with gcj}). There is only rudimentary |
| support for other languages, support for which will be improved based |
| on user demand. |
| |
| Some limited support for adding your own languages is available via the |
| suffix rule handling (@pxref{Suffixes}). |
| |
| @node Dependencies |
| @section Automatic dependency tracking |
| |
| As a developer it is often painful to continually update the |
| @file{Makefile.am} whenever the include-file dependencies change in a |
| project. Automake supplies a way to automatically track dependency |
| changes (@pxref{Dependency Tracking}). |
| |
| @cindex Dependency tracking |
| @cindex Automatic dependency tracking |
| |
| Automake always uses complete dependencies for a compilation, |
| including system headers. Automake's model is that dependency |
| computation should be a side effect of the build. To this end, |
| dependencies are computed by running all compilations through a |
| special wrapper program called @command{depcomp}. @command{depcomp} |
| understands how to coax many different C and C++ compilers into |
| generating dependency information in the format it requires. |
| @samp{automake -a} will install @command{depcomp} into your source |
| tree for you. If @command{depcomp} can't figure out how to properly |
| invoke your compiler, dependency tracking will simply be disabled for |
| your build. |
| |
| @cindex @command{depcomp} |
| |
| Experience with earlier versions of Automake (@pxref{Dependency Tracking |
| Evolution, , Dependency Tracking Evolution, automake-history, Brief History |
| of Automake}) taught us that it is not reliable to generate dependencies |
| only on the maintainer's system, as configurations vary too much. So |
| instead Automake implements dependency tracking at build time. |
| |
| Automatic dependency tracking can be suppressed by putting |
| @option{no-dependencies} in the variable @code{AUTOMAKE_OPTIONS}, or |
| passing @option{no-dependencies} as an argument to @code{AM_INIT_AUTOMAKE} |
| (this should be the preferred way). Or, you can invoke @command{automake} |
| with the @option{-i} option. Dependency tracking is enabled by default. |
| |
| @vindex AUTOMAKE_OPTIONS |
| @opindex no-dependencies |
| |
| The person building your package also can choose to disable dependency |
| tracking by configuring with @option{--disable-dependency-tracking}. |
| |
| @cindex Disabling dependency tracking |
| @cindex Dependency tracking, disabling |
| |
| |
| @node EXEEXT |
| @section Support for executable extensions |
| |
| @cindex Executable extension |
| @cindex Extension, executable |
| @cindex Windows |
| |
| On some platforms, such as Windows, executables are expected to have an |
| extension such as @file{.exe}. On these platforms, some compilers (GCC |
| among them) will automatically generate @file{foo.exe} when asked to |
| generate @file{foo}. |
| |
| Automake provides mostly-transparent support for this. Unfortunately |
| @emph{mostly} doesn't yet mean @emph{fully}. Until the English |
| dictionary is revised, you will have to assist Automake if your package |
| must support those platforms. |
| |
| One thing you must be aware of is that, internally, Automake rewrites |
| something like this: |
| |
| @example |
| bin_PROGRAMS = liver |
| @end example |
| |
| to this: |
| |
| @example |
| bin_PROGRAMS = liver$(EXEEXT) |
| @end example |
| |
| The targets Automake generates are likewise given the @samp{$(EXEEXT)} |
| extension. |
| |
| The variables @code{TESTS} and @code{XFAIL_TESTS} (@pxref{Simple Tests}) |
| are also rewritten if they contain filenames that have been declared as |
| programs in the same @file{Makefile}. (This is mostly useful when some |
| programs from @code{check_PROGRAMS} are listed in @code{TESTS}.) |
| |
| However, Automake cannot apply this rewriting to @command{configure} |
| substitutions. This means that if you are conditionally building a |
| program using such a substitution, then your @file{configure.ac} must |
| take care to add @samp{$(EXEEXT)} when constructing the output variable. |
| |
| Sometimes maintainers like to write an explicit link rule for their |
| program. Without executable extension support, this is easy---you |
| simply write a rule whose target is the name of the program. However, |
| when executable extension support is enabled, you must instead add the |
| @samp{$(EXEEXT)} suffix. |
| |
| This might be a nuisance for maintainers who know their package will |
| never run on a platform that has |
| executable extensions. For those maintainers, the @option{no-exeext} |
| option (@pxref{Options}) will disable this feature. This works in a |
| fairly ugly way; if @option{no-exeext} is seen, then the presence of a |
| rule for a target named @code{foo} in @file{Makefile.am} will override |
| an @command{automake}-generated rule for @samp{foo$(EXEEXT)}. Without |
| the @option{no-exeext} option, this use will give a diagnostic. |
| |
| |
| @node Other Objects |
| @chapter Other Derived Objects |
| |
| Automake can handle derived objects that are not C programs. Sometimes |
| the support for actually building such objects must be explicitly |
| supplied, but Automake will still automatically handle installation and |
| distribution. |
| |
| @menu |
| * Scripts:: Executable scripts |
| * Headers:: Header files |
| * Data:: Architecture-independent data files |
| * Sources:: Derived sources |
| @end menu |
| |
| |
| @node Scripts |
| @section Executable Scripts |
| |
| @cindex @code{_SCRIPTS} primary, defined |
| @cindex @code{SCRIPTS} primary, defined |
| @cindex Primary variable, @code{SCRIPTS} |
| @vindex _SCRIPTS |
| @cindex Installing scripts |
| |
| It is possible to define and install programs that are scripts. Such |
| programs are listed using the @code{SCRIPTS} primary name. When the |
| script is distributed in its final, installable form, the |
| @file{Makefile} usually looks as follows: |
| @vindex SCRIPTS |
| |
| @example |
| # Install my_script in $(bindir) and distribute it. |
| dist_bin_SCRIPTS = my_script |
| @end example |
| |
| Scripts are not distributed by default; as we have just seen, those |
| that should be distributed can be specified using a @code{dist_} |
| prefix as with other primaries. |
| |
| @cindex @code{SCRIPTS}, installation directories |
| @vindex bin_SCRIPTS |
| @vindex sbin_SCRIPTS |
| @vindex libexec_SCRIPTS |
| @vindex pkgdata_SCRIPTS |
| @vindex pkglibexec_SCRIPTS |
| @vindex noinst_SCRIPTS |
| @vindex check_SCRIPTS |
| |
| Scripts can be installed in @code{bindir}, @code{sbindir}, |
| @code{libexecdir}, @code{pkglibexecdir}, or @code{pkgdatadir}. |
| |
| Scripts that need not be installed can be listed in |
| @code{noinst_SCRIPTS}, and among them, those which are needed only by |
| @samp{make check} should go in @code{check_SCRIPTS}. |
| |
| When a script needs to be built, the @file{Makefile.am} should include |
| the appropriate rules. For instance the @command{automake} program |
| itself is a Perl script that is generated from @file{automake.in}. |
| Here is how this is handled: |
| |
| @example |
| bin_SCRIPTS = automake |
| CLEANFILES = $(bin_SCRIPTS) |
| EXTRA_DIST = automake.in |
| |
| do_subst = sed -e 's,[@@]datadir[@@],$(datadir),g' \ |
| -e 's,[@@]PERL[@@],$(PERL),g' \ |
| -e 's,[@@]PACKAGE[@@],$(PACKAGE),g' \ |
| -e 's,[@@]VERSION[@@],$(VERSION),g' \ |
| @dots{} |
| |
| automake: automake.in Makefile |
| $(do_subst) < $(srcdir)/automake.in > automake |
| chmod +x automake |
| @end example |
| |
| Such scripts for which a build rule has been supplied need to be |
| deleted explicitly using @code{CLEANFILES} (@pxref{Clean}), and their |
| sources have to be distributed, usually with @code{EXTRA_DIST} |
| (@pxref{Basics of Distribution}). |
| |
| Another common way to build scripts is to process them from |
| @file{configure} with @code{AC_CONFIG_FILES}. In this situation |
| Automake knows which files should be cleaned and distributed, and what |
| the rebuild rules should look like. |
| |
| For instance if @file{configure.ac} contains |
| |
| @example |
| AC_CONFIG_FILES([src/my_script], [chmod +x src/my_script]) |
| @end example |
| |
| @noindent |
| to build @file{src/my_script} from @file{src/my_script.in}, then a |
| @file{src/Makefile.am} to install this script in @code{$(bindir)} can |
| be as simple as |
| |
| @example |
| bin_SCRIPTS = my_script |
| CLEANFILES = $(bin_SCRIPTS) |
| @end example |
| |
| @noindent |
| There is no need for @code{EXTRA_DIST} or any build rule: Automake |
| infers them from @code{AC_CONFIG_FILES} (@pxref{Requirements}). |
| @code{CLEANFILES} is still useful, because by default Automake will |
| clean targets of @code{AC_CONFIG_FILES} in @code{distclean}, not |
| @code{clean}. |
| |
| Although this looks simpler, building scripts this way has one |
| drawback: directory variables such as @code{$(datadir)} are not fully |
| expanded and may refer to other directory variables. |
| |
| @node Headers |
| @section Header files |
| |
| @cindex @code{_HEADERS} primary, defined |
| @cindex @code{HEADERS} primary, defined |
| @cindex Primary variable, @code{HEADERS} |
| @vindex _HEADERS |
| @vindex noinst_HEADERS |
| @cindex @code{HEADERS}, installation directories |
| @cindex Installing headers |
| @vindex include_HEADERS |
| @vindex oldinclude_HEADERS |
| @vindex pkginclude_HEADERS |
| |
| |
| Header files that must be installed are specified by the |
| @code{HEADERS} family of variables. Headers can be installed in |
| @code{includedir}, @code{oldincludedir}, @code{pkgincludedir} or any |
| other directory you may have defined (@pxref{Uniform}). For instance, |
| |
| @example |
| include_HEADERS = foo.h bar/bar.h |
| @end example |
| |
| @noindent |
| will install the two files as @file{$(includedir)/foo.h} and |
| @file{$(includedir)/bar.h}. |
| |
| The @code{nobase_} prefix is also supported, |
| |
| @example |
| nobase_include_HEADERS = foo.h bar/bar.h |
| @end example |
| |
| @noindent |
| will install the two files as @file{$(includedir)/foo.h} and |
| @file{$(includedir)/bar/bar.h} (@pxref{Alternative}). |
| |
| @vindex noinst_HEADERS |
| Usually, only header files that accompany installed libraries need to |
| be installed. Headers used by programs or convenience libraries are |
| not installed. The @code{noinst_HEADERS} variable can be used for |
| such headers. However when the header actually belongs to a single |
| convenience library or program, we recommend listing it in the |
| program's or library's @code{_SOURCES} variable (@pxref{Program |
| Sources}) instead of in @code{noinst_HEADERS}. This is clearer for |
| the @file{Makefile.am} reader. @code{noinst_HEADERS} would be the |
| right variable to use in a directory containing only headers and no |
| associated library or program. |
| |
| All header files must be listed somewhere; in a @code{_SOURCES} |
| variable or in a @code{_HEADERS} variable. Missing ones will not |
| appear in the distribution. |
| |
| For header files that are built and must not be distributed, use the |
| @code{nodist_} prefix as in @code{nodist_include_HEADERS} or |
| @code{nodist_prog_SOURCES}. If these generated headers are needed |
| during the build, you must also ensure they exist before they are |
| used (@pxref{Sources}). |
| |
| |
| @node Data |
| @section Architecture-independent data files |
| |
| @cindex @code{_DATA} primary, defined |
| @cindex @code{DATA} primary, defined |
| @cindex Primary variable, @code{DATA} |
| @vindex _DATA |
| |
| Automake supports the installation of miscellaneous data files using the |
| @code{DATA} family of variables. |
| @vindex DATA |
| |
| @vindex data_DATA |
| @vindex sysconf_DATA |
| @vindex sharedstate_DATA |
| @vindex localstate_DATA |
| @vindex pkgdata_DATA |
| |
| Such data can be installed in the directories @code{datadir}, |
| @code{sysconfdir}, @code{sharedstatedir}, @code{localstatedir}, or |
| @code{pkgdatadir}. |
| |
| By default, data files are @emph{not} included in a distribution. Of |
| course, you can use the @code{dist_} prefix to change this on a |
| per-variable basis. |
| |
| Here is how Automake declares its auxiliary data files: |
| |
| @example |
| dist_pkgdata_DATA = clean-kr.am clean.am @dots{} |
| @end example |
| |
| |
| @node Sources |
| @section Built Sources |
| |
| Because Automake's automatic dependency tracking works as a side-effect |
| of compilation (@pxref{Dependencies}) there is a bootstrap issue: a |
| target should not be compiled before its dependencies are made, but |
| these dependencies are unknown until the target is first compiled. |
| |
| Ordinarily this is not a problem, because dependencies are distributed |
| sources: they preexist and do not need to be built. Suppose that |
| @file{foo.c} includes @file{foo.h}. When it first compiles |
| @file{foo.o}, @command{make} only knows that @file{foo.o} depends on |
| @file{foo.c}. As a side-effect of this compilation @command{depcomp} |
| records the @file{foo.h} dependency so that following invocations of |
| @command{make} will honor it. In these conditions, it's clear there is |
| no problem: either @file{foo.o} doesn't exist and has to be built |
| (regardless of the dependencies), or accurate dependencies exist and |
| they can be used to decide whether @file{foo.o} should be rebuilt. |
| |
| It's a different story if @file{foo.h} doesn't exist by the first |
| @command{make} run. For instance, there might be a rule to build |
| @file{foo.h}. This time @file{file.o}'s build will fail because the |
| compiler can't find @file{foo.h}. @command{make} failed to trigger the |
| rule to build @file{foo.h} first by lack of dependency information. |
| |
| @vindex BUILT_SOURCES |
| @cindex @code{BUILT_SOURCES}, defined |
| |
| The @code{BUILT_SOURCES} variable is a workaround for this problem. A |
| source file listed in @code{BUILT_SOURCES} is made on @samp{make all} |
| or @samp{make check} (or even @samp{make install}) before other |
| targets are processed. However, such a source file is not |
| @emph{compiled} unless explicitly requested by mentioning it in some |
| other @code{_SOURCES} variable. |
| |
| So, to conclude our introductory example, we could use |
| @samp{BUILT_SOURCES = foo.h} to ensure @file{foo.h} gets built before |
| any other target (including @file{foo.o}) during @samp{make all} or |
| @samp{make check}. |
| |
| @code{BUILT_SOURCES} is actually a bit of a misnomer, as any file which |
| must be created early in the build process can be listed in this |
| variable. Moreover, all built sources do not necessarily have to be |
| listed in @code{BUILT_SOURCES}. For instance, a generated @file{.c} file |
| doesn't need to appear in @code{BUILT_SOURCES} (unless it is included by |
| another source), because it's a known dependency of the associated |
| object. |
| |
| It might be important to emphasize that @code{BUILT_SOURCES} is |
| honored only by @samp{make all}, @samp{make check} and @samp{make |
| install}. This means you cannot build a specific target (e.g., |
| @samp{make foo}) in a clean tree if it depends on a built source. |
| However it will succeed if you have run @samp{make all} earlier, |
| because accurate dependencies are already available. |
| |
| The next section illustrates and discusses the handling of built sources |
| on a toy example. |
| |
| @menu |
| * Built Sources Example:: Several ways to handle built sources. |
| @end menu |
| |
| @node Built Sources Example |
| @subsection Built Sources Example |
| |
| Suppose that @file{foo.c} includes @file{bindir.h}, which is |
| installation-dependent and not distributed: it needs to be built. Here |
| @file{bindir.h} defines the preprocessor macro @code{bindir} to the |
| value of the @command{make} variable @code{bindir} (inherited from |
| @file{configure}). |
| |
| We suggest several implementations below. It's not meant to be an |
| exhaustive listing of all ways to handle built sources, but it will give |
| you a few ideas if you encounter this issue. |
| |
| @subsubheading First Try |
| |
| This first implementation will illustrate the bootstrap issue mentioned |
| in the previous section (@pxref{Sources}). |
| |
| Here is a tentative @file{Makefile.am}. |
| |
| @example |
| # This won't work. |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| nodist_foo_SOURCES = bindir.h |
| CLEANFILES = bindir.h |
| bindir.h: Makefile |
| echo '#define bindir "$(bindir)"' >$@@ |
| @end example |
| |
| This setup doesn't work, because Automake doesn't know that @file{foo.c} |
| includes @file{bindir.h}. Remember, automatic dependency tracking works |
| as a side-effect of compilation, so the dependencies of @file{foo.o} will |
| be known only after @file{foo.o} has been compiled (@pxref{Dependencies}). |
| The symptom is as follows. |
| |
| @example |
| % make |
| source='foo.c' object='foo.o' libtool=no \ |
| depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \ |
| depmode=gcc /bin/sh ./depcomp \ |
| gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c |
| foo.c:2: bindir.h: No such file or directory |
| make: *** [foo.o] Error 1 |
| @end example |
| |
| In this example @file{bindir.h} is not distributed nor installed, and |
| it is not even being built on-time. One may wonder if the |
| @samp{nodist_foo_SOURCES = bindir.h} line has any use at all. This |
| line simply states that @file{bindir.h} is a source of @code{foo}, so |
| for instance, it should be inspected while generating tags |
| (@pxref{Tags}). In other words, it does not help our present problem, |
| and the build would fail identically without it. |
| |
| @subsubheading Using @code{BUILT_SOURCES} |
| |
| A solution is to require @file{bindir.h} to be built before anything |
| else. This is what @code{BUILT_SOURCES} is meant for (@pxref{Sources}). |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| nodist_foo_SOURCES = bindir.h |
| BUILT_SOURCES = bindir.h |
| CLEANFILES = bindir.h |
| bindir.h: Makefile |
| echo '#define bindir "$(bindir)"' >$@@ |
| @end example |
| |
| See how @file{bindir.h} gets built first: |
| |
| @example |
| % make |
| echo '#define bindir "/usr/local/bin"' >bindir.h |
| make all-am |
| make[1]: Entering directory `/home/adl/tmp' |
| source='foo.c' object='foo.o' libtool=no \ |
| depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \ |
| depmode=gcc /bin/sh ./depcomp \ |
| gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c |
| gcc -g -O2 -o foo foo.o |
| make[1]: Leaving directory `/home/adl/tmp' |
| @end example |
| |
| However, as said earlier, @code{BUILT_SOURCES} applies only to the |
| @code{all}, @code{check}, and @code{install} targets. It still fails |
| if you try to run @samp{make foo} explicitly: |
| |
| @example |
| % make clean |
| test -z "bindir.h" || rm -f bindir.h |
| test -z "foo" || rm -f foo |
| rm -f *.o |
| % : > .deps/foo.Po # Suppress previously recorded dependencies |
| % make foo |
| source='foo.c' object='foo.o' libtool=no \ |
| depfile='.deps/foo.Po' tmpdepfile='.deps/foo.TPo' \ |
| depmode=gcc /bin/sh ./depcomp \ |
| gcc -I. -I. -g -O2 -c `test -f 'foo.c' || echo './'`foo.c |
| foo.c:2: bindir.h: No such file or directory |
| make: *** [foo.o] Error 1 |
| @end example |
| |
| @subsubheading Recording Dependencies manually |
| |
| Usually people are happy enough with @code{BUILT_SOURCES} because they |
| never build targets such as @samp{make foo} before @samp{make all}, as |
| in the previous example. However if this matters to you, you can |
| avoid @code{BUILT_SOURCES} and record such dependencies explicitly in |
| the @file{Makefile.am}. |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| nodist_foo_SOURCES = bindir.h |
| foo.$(OBJEXT): bindir.h |
| CLEANFILES = bindir.h |
| bindir.h: Makefile |
| echo '#define bindir "$(bindir)"' >$@@ |
| @end example |
| |
| You don't have to list @emph{all} the dependencies of @file{foo.o} |
| explicitly, only those that might need to be built. If a dependency |
| already exists, it will not hinder the first compilation and will be |
| recorded by the normal dependency tracking code. (Note that after |
| this first compilation the dependency tracking code will also have |
| recorded the dependency between @file{foo.o} and |
| @file{bindir.h}; so our explicit dependency is really useful to |
| the first build only.) |
| |
| Adding explicit dependencies like this can be a bit dangerous if you are |
| not careful enough. This is due to the way Automake tries not to |
| overwrite your rules (it assumes you know better than it). |
| @samp{foo.$(OBJEXT): bindir.h} supersedes any rule Automake may want to |
| output to build @samp{foo.$(OBJEXT)}. It happens to work in this case |
| because Automake doesn't have to output any @samp{foo.$(OBJEXT):} |
| target: it relies on a suffix rule instead (i.e., @samp{.c.$(OBJEXT):}). |
| Always check the generated @file{Makefile.in} if you do this. |
| |
| @subsubheading Build @file{bindir.h} from @file{configure} |
| |
| It's possible to define this preprocessor macro from @file{configure}, |
| either in @file{config.h} (@pxref{Defining Directories, , Defining |
| Directories, autoconf, The Autoconf Manual}), or by processing a |
| @file{bindir.h.in} file using @code{AC_CONFIG_FILES} |
| (@pxref{Configuration Actions, ,Configuration Actions, autoconf, The |
| Autoconf Manual}). |
| |
| At this point it should be clear that building @file{bindir.h} from |
| @file{configure} works well for this example. @file{bindir.h} will exist |
| before you build any target, hence will not cause any dependency issue. |
| |
| The Makefile can be shrunk as follows. We do not even have to mention |
| @file{bindir.h}. |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| @end example |
| |
| However, it's not always possible to build sources from |
| @file{configure}, especially when these sources are generated by a tool |
| that needs to be built first. |
| |
| @subsubheading Build @file{bindir.c}, not @file{bindir.h}. |
| |
| Another attractive idea is to define @code{bindir} as a variable or |
| function exported from @file{bindir.o}, and build @file{bindir.c} |
| instead of @file{bindir.h}. |
| |
| @example |
| noinst_PROGRAMS = foo |
| foo_SOURCES = foo.c bindir.h |
| nodist_foo_SOURCES = bindir.c |
| CLEANFILES = bindir.c |
| bindir.c: Makefile |
| echo 'const char bindir[] = "$(bindir)";' >$@@ |
| @end example |
| |
| @file{bindir.h} contains just the variable's declaration and doesn't |
| need to be built, so it won't cause any trouble. @file{bindir.o} is |
| always dependent on @file{bindir.c}, so @file{bindir.c} will get built |
| first. |
| |
| @subsubheading Which is best? |
| |
| There is no panacea, of course. Each solution has its merits and |
| drawbacks. |
| |
| You cannot use @code{BUILT_SOURCES} if the ability to run @samp{make |
| foo} on a clean tree is important to you. |
| |
| You won't add explicit dependencies if you are leery of overriding |
| an Automake rule by mistake. |
| |
| Building files from @file{./configure} is not always possible, neither |
| is converting @file{.h} files into @file{.c} files. |
| |
| |
| @node Other GNU Tools |
| @chapter Other GNU Tools |
| |
| Since Automake is primarily intended to generate @file{Makefile.in}s for |
| use in GNU programs, it tries hard to interoperate with other GNU tools. |
| |
| @menu |
| * Emacs Lisp:: Emacs Lisp |
| * gettext:: Gettext |
| * Libtool:: Libtool |
| * Java:: Java bytecode compilation (deprecated) |
| * Python:: Python |
| @end menu |
| |
| |
| @node Emacs Lisp |
| @section Emacs Lisp |
| |
| @cindex @code{_LISP} primary, defined |
| @cindex @code{LISP} primary, defined |
| @cindex Primary variable, @code{LISP} |
| |
| @vindex _LISP |
| @vindex lisp_LISP |
| @vindex noinst_LISP |
| |
| Automake provides some support for Emacs Lisp. The @code{LISP} primary |
| is used to hold a list of @file{.el} files. Possible prefixes for this |
| primary are @code{lisp_} and @code{noinst_}. Note that if |
| @code{lisp_LISP} is defined, then @file{configure.ac} must run |
| @code{AM_PATH_LISPDIR} (@pxref{Macros}). |
| |
| @vindex dist_lisp_LISP |
| @vindex dist_noinst_LISP |
| Lisp sources are not distributed by default. You can prefix the |
| @code{LISP} primary with @code{dist_}, as in @code{dist_lisp_LISP} or |
| @code{dist_noinst_LISP}, to indicate that these files should be |
| distributed. |
| |
| Automake will byte-compile all Emacs Lisp source files using the Emacs |
| found by @code{AM_PATH_LISPDIR}, if any was found. When performing such |
| byte-compilation, the flags specified in the (developer-reserved) |
| @code{AM_ELCFLAGS} and (user-reserved) @code{ELCFLAGS} make variables |
| will be passed to the Emacs invocation. |
| |
| Byte-compiled Emacs Lisp files are not portable among all versions of |
| Emacs, so it makes sense to turn this off if you expect sites to have |
| more than one version of Emacs installed. Furthermore, many packages |
| don't actually benefit from byte-compilation. Still, we recommend |
| that you byte-compile your Emacs Lisp sources. It is probably better |
| for sites with strange setups to cope for themselves than to make the |
| installation less nice for everybody else. |
| |
| There are two ways to avoid byte-compiling. Historically, we have |
| recommended the following construct. |
| |
| @example |
| lisp_LISP = file1.el file2.el |
| ELCFILES = |
| @end example |
| |
| @noindent |
| @code{ELCFILES} is an internal Automake variable that normally lists |
| all @file{.elc} files that must be byte-compiled. Automake defines |
| @code{ELCFILES} automatically from @code{lisp_LISP}. Emptying this |
| variable explicitly prevents byte-compilation. |
| |
| Since Automake 1.8, we now recommend using @code{lisp_DATA} instead: |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| lisp_DATA = file1.el file2.el |
| @end example |
| |
| Note that these two constructs are not equivalent. @code{_LISP} will |
| not install a file if Emacs is not installed, while @code{_DATA} will |
| always install its files. |
| |
| @node gettext |
| @section Gettext |
| |
| @cindex GNU Gettext support |
| @cindex Gettext support |
| @cindex Support for GNU Gettext |
| |
| If @code{AM_GNU_GETTEXT} is seen in @file{configure.ac}, then Automake |
| turns on support for GNU gettext, a message catalog system for |
| internationalization |
| (@pxref{Top, , Introduction, gettext, GNU gettext utilities}). |
| |
| The @code{gettext} support in Automake requires the addition of one or |
| two subdirectories to the package: @file{po} and possibly also @file{intl}. |
| The latter is needed if @code{AM_GNU_GETTEXT} is not invoked with the |
| @samp{external} argument, or if @code{AM_GNU_GETTEXT_INTL_SUBDIR} is used. |
| Automake ensures that these directories exist and are mentioned in |
| @code{SUBDIRS}. |
| |
| @node Libtool |
| @section Libtool |
| |
| Automake provides support for GNU Libtool (@pxref{Top, , Introduction, |
| libtool, The Libtool Manual}) with the @code{LTLIBRARIES} primary. |
| @xref{A Shared Library}. |
| |
| |
| @node Java |
| @section Java bytecode compilation (deprecated) |
| |
| @cindex @code{_JAVA} primary, defined |
| @cindex @code{JAVA} primary, defined |
| @cindex Primary variable, @code{JAVA} |
| @cindex Java to bytecode, compilation |
| @cindex Compilation of Java to bytecode |
| |
| Automake provides some minimal support for Java bytecode compilation with |
| the @code{JAVA} primary (in addition to the support for compiling Java to |
| native machine code; @pxref{Java Support with gcj}). Note however that |
| @emph{the interface and most features described here are deprecated}. |
| Future Automake releases will strive to provide a better and cleaner |
| interface, which however @emph{won't be backward-compatible}; the present |
| interface will probably be removed altogether some time after the |
| introduction of the new interface (if that ever materializes). In any |
| case, the current @code{JAVA} primary features are frozen and will no |
| longer be developed, not even to take bug fixes. |
| |
| Any @file{.java} files listed in a @code{_JAVA} variable will be |
| compiled with @code{JAVAC} at build time. By default, @file{.java} |
| files are not included in the distribution, you should use the |
| @code{dist_} prefix to distribute them. |
| |
| Here is a typical setup for distributing @file{.java} files and |
| installing the @file{.class} files resulting from their compilation. |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| javadir = $(datadir)/java |
| dist_java_JAVA = a.java b.java @dots{} |
| @end example |
| |
| @cindex @code{JAVA} restrictions |
| @cindex Restrictions for @code{JAVA} |
| |
| Currently Automake enforces the restriction that only one @code{_JAVA} |
| primary can be used in a given @file{Makefile.am}. The reason for this |
| restriction is that, in general, it isn't possible to know which |
| @file{.class} files were generated from which @file{.java} files, so |
| it would be impossible to know which files to install where. For |
| instance, a @file{.java} file can define multiple classes; the resulting |
| @file{.class} file names cannot be predicted without parsing the |
| @file{.java} file. |
| |
| There are a few variables that are used when compiling Java sources: |
| |
| @vtable @code |
| @item JAVAC |
| The name of the Java compiler. This defaults to @samp{javac}. |
| |
| @item JAVACFLAGS |
| The flags to pass to the compiler. This is considered to be a user |
| variable (@pxref{User Variables}). |
| |
| @item AM_JAVACFLAGS |
| More flags to pass to the Java compiler. This, and not |
| @code{JAVACFLAGS}, should be used when it is necessary to put Java |
| compiler flags into @file{Makefile.am}. |
| |
| @item JAVAROOT |
| The value of this variable is passed to the @option{-d} option to |
| @code{javac}. It defaults to @samp{$(top_builddir)}. |
| |
| @item CLASSPATH_ENV |
| This variable is a shell expression that is used to set the |
| @env{CLASSPATH} environment variable on the @code{javac} command line. |
| (In the future we will probably handle class path setting differently.) |
| @end vtable |
| |
| |
| @node Python |
| @section Python |
| |
| @cindex @code{_PYTHON} primary, defined |
| @cindex @code{PYTHON} primary, defined |
| @cindex Primary variable, @code{PYTHON} |
| @vindex _PYTHON |
| |
| Automake provides support for Python compilation with the |
| @code{PYTHON} primary. A typical setup is to call |
| @code{AM_PATH_PYTHON} in @file{configure.ac} and use a line like the |
| following in @file{Makefile.am}: |
| |
| @example |
| python_PYTHON = tree.py leave.py |
| @end example |
| |
| Any files listed in a @code{_PYTHON} variable will be byte-compiled |
| with @command{py-compile} at install time. @command{py-compile} |
| actually creates both standard (@file{.pyc}) and optimized |
| (@file{.pyo}) byte-compiled versions of the source files. Note that |
| because byte-compilation occurs at install time, any files listed in |
| @code{noinst_PYTHON} will not be compiled. Python source files are |
| included in the distribution by default, prepend @code{nodist_} (as in |
| @code{nodist_python_PYTHON}) to omit them. |
| |
| Automake ships with an Autoconf macro called @code{AM_PATH_PYTHON} |
| that will determine some Python-related directory variables (see |
| below). If you have called @code{AM_PATH_PYTHON} from |
| @file{configure.ac}, then you may use the variables |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @code{python_PYTHON} or @code{pkgpython_PYTHON} to list Python source |
| files in your @file{Makefile.am}, depending on where you want your files |
| installed (see the definitions of @code{pythondir} and |
| @code{pkgpythondir} below). |
| |
| @defmac AM_PATH_PYTHON (@ovar{version}, @ovar{action-if-found}, |
| @ovar{action-if-not-found}) |
| |
| Search for a Python interpreter on the system. This macro takes three |
| optional arguments. The first argument, if present, is the minimum |
| version of Python required for this package: @code{AM_PATH_PYTHON} |
| will skip any Python interpreter that is older than @var{version}. |
| If an interpreter is found and satisfies @var{version}, then |
| @var{action-if-found} is run. Otherwise, @var{action-if-not-found} is |
| run. |
| |
| If @var{action-if-not-found} is not specified, as in the following |
| example, the default is to abort @command{configure}. |
| |
| @example |
| AM_PATH_PYTHON([2.2]) |
| @end example |
| |
| @noindent |
| This is fine when Python is an absolute requirement for the package. |
| If Python >= 2.5 was only @emph{optional} to the package, |
| @code{AM_PATH_PYTHON} could be called as follows. |
| |
| @example |
| AM_PATH_PYTHON([2.5],, [:]) |
| @end example |
| |
| If the @env{PYTHON} variable is set when @code{AM_PATH_PYTHON} is |
| called, then that will be the only Python interpreter that is tried. |
| |
| @code{AM_PATH_PYTHON} creates the following output variables based on |
| the Python installation found during configuration. |
| @end defmac |
| |
| @vtable @code |
| @item PYTHON |
| The name of the Python executable, or @samp{:} if no suitable |
| interpreter could be found. |
| |
| Assuming @var{action-if-not-found} is used (otherwise @file{./configure} |
| will abort if Python is absent), the value of @code{PYTHON} can be used |
| to setup a conditional in order to disable the relevant part of a build |
| as follows. |
| |
| @example |
| AM_PATH_PYTHON(,, [:]) |
| AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :]) |
| @end example |
| |
| @item PYTHON_VERSION |
| The Python version number, in the form @var{major}.@var{minor} |
| (e.g., @samp{2.5}). This is currently the value of |
| @samp{sys.version[:3]}. |
| |
| @item PYTHON_PREFIX |
| The string @samp{$@{prefix@}}. This term may be used in future work |
| that needs the contents of Python's @samp{sys.prefix}, but general |
| consensus is to always use the value from @command{configure}. |
| |
| @item PYTHON_EXEC_PREFIX |
| The string @samp{$@{exec_prefix@}}. This term may be used in future work |
| that needs the contents of Python's @samp{sys.exec_prefix}, but general |
| consensus is to always use the value from @command{configure}. |
| |
| @item PYTHON_PLATFORM |
| The canonical name used by Python to describe the operating system, as |
| given by @samp{sys.platform}. This value is sometimes needed when |
| building Python extensions. |
| |
| @item pythondir |
| The directory name for the @file{site-packages} subdirectory of the |
| standard Python install tree. |
| |
| @item pkgpythondir |
| This is the directory under @code{pythondir} that is named after the |
| package. That is, it is @samp{$(pythondir)/$(PACKAGE)}. It is provided |
| as a convenience. |
| |
| @item pyexecdir |
| This is the directory where Python extension modules (shared libraries) |
| should be installed. An extension module written in C could be declared |
| as follows to Automake: |
| |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @example |
| pyexec_LTLIBRARIES = quaternion.la |
| quaternion_la_SOURCES = quaternion.c support.c support.h |
| quaternion_la_LDFLAGS = -avoid-version -module |
| @end example |
| |
| @item pkgpyexecdir |
| This is a convenience variable that is defined as |
| @samp{$(pyexecdir)/$(PACKAGE)}. |
| @end vtable |
| |
| All of these directory variables have values that start with either |
| @samp{$@{prefix@}} or @samp{$@{exec_prefix@}} unexpanded. This works |
| fine in @file{Makefiles}, but it makes these variables hard to use in |
| @file{configure}. This is mandated by the GNU coding standards, so |
| that the user can run @samp{make prefix=/foo install}. The Autoconf |
| manual has a section with more details on this topic |
| (@pxref{Installation Directory Variables, , Installation Directory |
| Variables, autoconf, The Autoconf Manual}). See also @ref{Hard-Coded |
| Install Paths}. |
| |
| |
| @node Documentation |
| @chapter Building documentation |
| |
| Currently Automake provides support for Texinfo and man pages. |
| |
| @menu |
| * Texinfo:: Texinfo |
| * Man Pages:: Man pages |
| @end menu |
| |
| |
| @node Texinfo |
| @section Texinfo |
| |
| @cindex @code{_TEXINFOS} primary, defined |
| @cindex @code{TEXINFOS} primary, defined |
| @cindex Primary variable, @code{TEXINFOS} |
| @cindex HTML output using Texinfo |
| @cindex PDF output using Texinfo |
| @cindex PS output using Texinfo |
| @cindex DVI output using Texinfo |
| @vindex _TEXINFOS |
| @vindex info_TEXINFOS |
| |
| If the current directory contains Texinfo source, you must declare it |
| with the @code{TEXINFOS} primary. Generally Texinfo files are converted |
| into info, and thus the @code{info_TEXINFOS} variable is most commonly used |
| here. Any Texinfo source file should have the @file{.texi} extension. |
| Automake also accepts @file{.txi} or @file{.texinfo} extensions, but their |
| use is discouraged now, and will elicit runtime warnings. |
| |
| Automake generates rules to build @file{.info}, @file{.dvi}, |
| @file{.ps}, @file{.pdf} and @file{.html} files from your Texinfo |
| sources. Following the GNU Coding Standards, only the @file{.info} |
| files are built by @samp{make all} and installed by @samp{make |
| install} (unless you use @option{no-installinfo}, see below). |
| Furthermore, @file{.info} files are automatically distributed so that |
| Texinfo is not a prerequisite for installing your package. |
| |
| It is worth noting that, contrary to what happens with the other formats, |
| the generated @file{.info} files are by default placed in @code{srcdir} |
| rather than in the @code{builddir}. This can be changed with the |
| @option{info-in-builddir} option. |
| |
| @trindex dvi |
| @trindex html |
| @trindex pdf |
| @trindex ps |
| @trindex install-dvi |
| @trindex install-html |
| @trindex install-pdf |
| @trindex install-ps |
| Other documentation formats can be built on request by @samp{make |
| dvi}, @samp{make ps}, @samp{make pdf} and @samp{make html}, and they |
| can be installed with @samp{make install-dvi}, @samp{make install-ps}, |
| @samp{make install-pdf} and @samp{make install-html} explicitly. |
| @samp{make uninstall} will remove everything: the Texinfo |
| documentation installed by default as well as all the above optional |
| formats. |
| |
| All of these targets can be extended using @samp{-local} rules |
| (@pxref{Extending}). |
| |
| @cindex Texinfo flag, @code{VERSION} |
| @cindex Texinfo flag, @code{UPDATED} |
| @cindex Texinfo flag, @code{EDITION} |
| @cindex Texinfo flag, @code{UPDATED-MONTH} |
| |
| @cindex @code{VERSION} Texinfo flag |
| @cindex @code{UPDATED} Texinfo flag |
| @cindex @code{EDITION} Texinfo flag |
| @cindex @code{UPDATED-MONTH} Texinfo flag |
| |
| @cindex @file{mdate-sh} |
| |
| If the @file{.texi} file @code{@@include}s @file{version.texi}, then |
| that file will be automatically generated. The file @file{version.texi} |
| defines four Texinfo flags you can reference using |
| @code{@@value@{EDITION@}}, @code{@@value@{VERSION@}}, |
| @code{@@value@{UPDATED@}}, and @code{@@value@{UPDATED-MONTH@}}. |
| |
| @table @code |
| @item EDITION |
| @itemx VERSION |
| Both of these flags hold the version number of your program. They are |
| kept separate for clarity. |
| |
| @item UPDATED |
| This holds the date the primary @file{.texi} file was last modified. |
| |
| @item UPDATED-MONTH |
| This holds the name of the month in which the primary @file{.texi} file |
| was last modified. |
| @end table |
| |
| The @file{version.texi} support requires the @command{mdate-sh} |
| script; this script is supplied with Automake and automatically |
| included when @command{automake} is invoked with the |
| @option{--add-missing} option. |
| |
| If you have multiple Texinfo files, and you want to use the |
| @file{version.texi} feature, then you have to have a separate version |
| file for each Texinfo file. Automake will treat any include in a |
| Texinfo file that matches @file{vers*.texi} just as an automatically |
| generated version file. |
| |
| Sometimes an info file actually depends on more than one @file{.texi} |
| file. For instance, in GNU Hello, @file{hello.texi} includes the file |
| @file{fdl.texi}. You can tell Automake about these dependencies using |
| the @code{@var{texi}_TEXINFOS} variable. Here is how GNU Hello does it: |
| @vindex TEXINFOS |
| @vindex _TEXINFOS |
| |
| @example |
| info_TEXINFOS = hello.texi |
| hello_TEXINFOS = fdl.texi |
| @end example |
| |
| @cindex @file{texinfo.tex} |
| |
| By default, Automake requires the file @file{texinfo.tex} to appear in |
| the same directory as the @file{Makefile.am} file that lists the |
| @file{.texi} files. If you used @code{AC_CONFIG_AUX_DIR} in |
| @file{configure.ac} (@pxref{Input, , Finding `configure' Input, |
| autoconf, The Autoconf Manual}), then @file{texinfo.tex} is looked for |
| there. In both cases, @command{automake} then supplies @file{texinfo.tex} if |
| @option{--add-missing} is given, and takes care of its distribution. |
| However, if you set the @code{TEXINFO_TEX} variable (see below), |
| it overrides the location of the file and turns off its installation |
| into the source as well as its distribution. |
| |
| The option @option{no-texinfo.tex} can be used to eliminate the |
| requirement for the file @file{texinfo.tex}. Use of the variable |
| @code{TEXINFO_TEX} is preferable, however, because that allows the |
| @code{dvi}, @code{ps}, and @code{pdf} targets to still work. |
| |
| @cindex Option, @code{no-installinfo} |
| @cindex Target, @code{install-info} |
| @cindex @code{install-info} target |
| @cindex @code{no-installinfo} option |
| |
| @opindex no-installinfo |
| @trindex install-info |
| |
| Automake generates an @code{install-info} rule; some people apparently |
| use this. By default, info pages are installed by @samp{make |
| install}, so running @code{make install-info} is pointless. This can |
| be prevented via the @code{no-installinfo} option. In this case, |
| @file{.info} files are not installed by default, and user must |
| request this explicitly using @samp{make install-info}. |
| |
| @vindex AM_UPDATE_INFO_DIR |
| By default, @code{make install-info} and @code{make uninstall-info} |
| will try to run the @command{install-info} program (if available) to |
| update (or create/remove) the @file{@code{$@{infodir@}}/dir} index. |
| If this is undesired, it can be prevented by exporting the |
| @code{AM_UPDATE_INFO_DIR} variable to "@code{no}". |
| |
| The following variables are used by the Texinfo build rules. |
| |
| @vtable @code |
| @item MAKEINFO |
| The name of the program invoked to build @file{.info} files. This |
| variable is defined by Automake. If the @command{makeinfo} program is |
| found on the system then it will be used by default; otherwise |
| @command{missing} will be used instead. |
| |
| @item MAKEINFOHTML |
| The command invoked to build @file{.html} files. Automake |
| defines this to @samp{$(MAKEINFO) --html}. |
| |
| @item MAKEINFOFLAGS |
| User flags passed to each invocation of @samp{$(MAKEINFO)} and |
| @samp{$(MAKEINFOHTML)}. This user variable (@pxref{User Variables}) is |
| not expected to be defined in any @file{Makefile}; it can be used by |
| users to pass extra flags to suit their needs. |
| |
| @item AM_MAKEINFOFLAGS |
| @itemx AM_MAKEINFOHTMLFLAGS |
| Maintainer flags passed to each @command{makeinfo} invocation. Unlike |
| @code{MAKEINFOFLAGS}, these variables are meant to be defined by |
| maintainers in @file{Makefile.am}. @samp{$(AM_MAKEINFOFLAGS)} is |
| passed to @code{makeinfo} when building @file{.info} files; and |
| @samp{$(AM_MAKEINFOHTMLFLAGS)} is used when building @file{.html} |
| files. |
| |
| @c Keep in sync with txinfo-many-output-formats.sh |
| For instance, the following setting can be used to obtain one single |
| @file{.html} file per manual, without node separators. |
| @example |
| AM_MAKEINFOHTMLFLAGS = --no-headers --no-split |
| @end example |
| |
| @code{AM_MAKEINFOHTMLFLAGS} defaults to @samp{$(AM_MAKEINFOFLAGS)}. |
| This means that defining @code{AM_MAKEINFOFLAGS} without defining |
| @code{AM_MAKEINFOHTMLFLAGS} will impact builds of both @file{.info} |
| and @file{.html} files. |
| |
| @item TEXI2DVI |
| The name of the command that converts a @file{.texi} file into a |
| @file{.dvi} file. This defaults to @samp{texi2dvi}, a script that ships |
| with the Texinfo package. |
| |
| @item TEXI2PDF |
| The name of the command that translates a @file{.texi} file into a |
| @file{.pdf} file. This defaults to @samp{$(TEXI2DVI) --pdf --batch}. |
| |
| @item DVIPS |
| The name of the command that builds a @file{.ps} file out of a |
| @file{.dvi} file. This defaults to @samp{dvips}. |
| |
| @item TEXINFO_TEX |
| |
| If your package has Texinfo files in many directories, you can use the |
| variable @code{TEXINFO_TEX} to tell Automake where to find the canonical |
| @file{texinfo.tex} for your package. The value of this variable should |
| be the relative path from the current @file{Makefile.am} to |
| @file{texinfo.tex}: |
| |
| @example |
| TEXINFO_TEX = ../doc/texinfo.tex |
| @end example |
| @end vtable |
| |
| |
| @node Man Pages |
| @section Man Pages |
| |
| @cindex @code{_MANS} primary, defined |
| @cindex @code{MANS} primary, defined |
| @cindex Primary variable, @code{MANS} |
| |
| @vindex _MANS |
| @vindex man_MANS |
| A package can also include man pages (but see the GNU standards on this |
| matter, @ref{Man Pages, , , standards, The GNU Coding Standards}.) Man |
| pages are declared using the @code{MANS} primary. Generally the |
| @code{man_MANS} variable is used. Man pages are automatically installed in |
| the correct subdirectory of @code{mandir}, based on the file extension. |
| |
| File extensions such as @file{.1c} are handled by looking for the valid |
| part of the extension and using that to determine the correct |
| subdirectory of @code{mandir}. Valid section names are the digits |
| @samp{0} through @samp{9}, and the letters @samp{l} and @samp{n}. |
| |
| Sometimes developers prefer to name a man page something like |
| @file{foo.man} in the source, and then rename it to have the correct |
| suffix, for example @file{foo.1}, when installing the file. Automake |
| also supports this mode. For a valid section named @var{section}, |
| there is a corresponding directory named @samp{man@var{section}dir}, |
| and a corresponding @code{_MANS} variable. Files listed in such a |
| variable are installed in the indicated section. If the file already |
| has a valid suffix, then it is installed as-is; otherwise the file |
| suffix is changed to match the section. |
| |
| For instance, consider this example: |
| @example |
| man1_MANS = rename.man thesame.1 alsothesame.1c |
| @end example |
| |
| @noindent |
| In this case, @file{rename.man} will be renamed to @file{rename.1} when |
| installed, but the other files will keep their names. |
| |
| @cindex Target, @code{install-man} |
| @cindex Option, @option{no-installman} |
| @cindex @code{install-man} target |
| @cindex @option{no-installman} option |
| @opindex no-installman |
| @trindex install-man |
| |
| By default, man pages are installed by @samp{make install}. However, |
| since the GNU project does not require man pages, many maintainers do |
| not expend effort to keep the man pages up to date. In these cases, the |
| @option{no-installman} option will prevent the man pages from being |
| installed by default. The user can still explicitly install them via |
| @samp{make install-man}. |
| |
| For fast installation, with many files it is preferable to use |
| @samp{man@var{section}_MANS} over @samp{man_MANS} as well as files that |
| do not need to be renamed. |
| |
| Man pages are not currently considered to be source, because it is not |
| uncommon for man pages to be automatically generated. Therefore they |
| are not automatically included in the distribution. However, this can |
| be changed by use of the @code{dist_} prefix. For instance here is |
| how to distribute and install the two man pages of GNU @command{cpio} |
| (which includes both Texinfo documentation and man pages): |
| |
| @example |
| dist_man_MANS = cpio.1 mt.1 |
| @end example |
| |
| The @code{nobase_} prefix is meaningless for man pages and is |
| disallowed. |
| |
| @vindex notrans_ |
| @cindex @code{notrans_} prefix |
| @cindex Man page renaming, avoiding |
| @cindex Avoiding man page renaming |
| |
| Executables and manpages may be renamed upon installation |
| (@pxref{Renaming}). For manpages this can be avoided by use of the |
| @code{notrans_} prefix. For instance, suppose an executable @samp{foo} |
| allowing to access a library function @samp{foo} from the command line. |
| The way to avoid renaming of the @file{foo.3} manpage is: |
| |
| @example |
| man_MANS = foo.1 |
| notrans_man_MANS = foo.3 |
| @end example |
| |
| @cindex @code{notrans_} and @code{dist_} or @code{nodist_} |
| @cindex @code{dist_} and @code{notrans_} |
| @cindex @code{nodist_} and @code{notrans_} |
| |
| @samp{notrans_} must be specified first when used in conjunction with |
| either @samp{dist_} or @samp{nodist_} (@pxref{Fine-grained Distribution |
| Control}). For instance: |
| |
| @example |
| notrans_dist_man3_MANS = bar.3 |
| @end example |
| |
| @node Install |
| @chapter What Gets Installed |
| |
| @cindex Installation support |
| @cindex @samp{make install} support |
| |
| Naturally, Automake handles the details of actually installing your |
| program once it has been built. All files named by the various |
| primaries are automatically installed in the appropriate places when the |
| user runs @samp{make install}. |
| |
| @menu |
| * Basics of Installation:: What gets installed where |
| * The Two Parts of Install:: Installing data and programs separately |
| * Extending Installation:: Adding your own rules for installation |
| * Staged Installs:: Installation in a temporary location |
| * Install Rules for the User:: Useful additional rules |
| @end menu |
| |
| @node Basics of Installation |
| @section Basics of Installation |
| |
| A file named in a primary is installed by copying the built file into |
| the appropriate directory. The base name of the file is used when |
| installing. |
| |
| @example |
| bin_PROGRAMS = hello subdir/goodbye |
| @end example |
| |
| In this example, both @samp{hello} and @samp{goodbye} will be installed |
| in @samp{$(bindir)}. |
| |
| Sometimes it is useful to avoid the basename step at install time. For |
| instance, you might have a number of header files in subdirectories of |
| the source tree that are laid out precisely how you want to install |
| them. In this situation you can use the @code{nobase_} prefix to |
| suppress the base name step. For example: |
| |
| @example |
| nobase_include_HEADERS = stdio.h sys/types.h |
| @end example |
| |
| @noindent |
| will install @file{stdio.h} in @samp{$(includedir)} and @file{types.h} |
| in @samp{$(includedir)/sys}. |
| |
| For most file types, Automake will install multiple files at once, while |
| avoiding command line length issues (@pxref{Length Limitations}). Since |
| some @command{install} programs will not install the same file twice in |
| one invocation, you may need to ensure that file lists are unique within |
| one variable such as @samp{nobase_include_HEADERS} above. |
| |
| You should not rely on the order in which files listed in one variable |
| are installed. Likewise, to cater for parallel make, you should not |
| rely on any particular file installation order even among different |
| file types (library dependencies are an exception here). |
| |
| |
| @node The Two Parts of Install |
| @section The Two Parts of Install |
| |
| Automake generates separate @code{install-data} and @code{install-exec} |
| rules, in case the installer is installing on multiple machines that |
| share directory structure---these targets allow the machine-independent |
| parts to be installed only once. @code{install-exec} installs |
| platform-dependent files, and @code{install-data} installs |
| platform-independent files. The @code{install} target depends on both |
| of these targets. While Automake tries to automatically segregate |
| objects into the correct category, the @file{Makefile.am} author is, in |
| the end, responsible for making sure this is done correctly. |
| @trindex install-data |
| @trindex install-exec |
| @trindex install |
| @cindex Install, two parts of |
| |
| Variables using the standard directory prefixes @samp{data}, |
| @samp{info}, @samp{man}, @samp{include}, @samp{oldinclude}, |
| @samp{pkgdata}, or @samp{pkginclude} are installed by |
| @code{install-data}. |
| |
| Variables using the standard directory prefixes @samp{bin}, |
| @samp{sbin}, @samp{libexec}, @samp{sysconf}, @samp{localstate}, |
| @samp{lib}, or @samp{pkglib} are installed by @code{install-exec}. |
| |
| For instance, @code{data_DATA} files are installed by @code{install-data}, |
| while @code{bin_PROGRAMS} files are installed by @code{install-exec}. |
| |
| Any variable using a user-defined directory prefix with |
| @samp{exec} in the name (e.g., |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| @code{myexecbin_PROGRAMS}) is installed by @code{install-exec}. All |
| other user-defined prefixes are installed by @code{install-data}. |
| |
| @node Extending Installation |
| @section Extending Installation |
| |
| It is possible to extend this mechanism by defining an |
| @code{install-exec-local} or @code{install-data-local} rule. If these |
| rules exist, they will be run at @samp{make install} time. These |
| rules can do almost anything; care is required. |
| @trindex install-exec-local |
| @trindex install-data-local |
| |
| Automake also supports two install hooks, @code{install-exec-hook} and |
| @code{install-data-hook}. These hooks are run after all other install |
| rules of the appropriate type, exec or data, have completed. So, for |
| instance, it is possible to perform post-installation modifications |
| using an install hook. @xref{Extending}, for some examples. |
| @cindex Install hook |
| |
| @node Staged Installs |
| @section Staged Installs |
| |
| @vindex DESTDIR |
| Automake generates support for the @code{DESTDIR} variable in all |
| install rules. @code{DESTDIR} is used during the @samp{make install} |
| step to relocate install objects into a staging area. Each object and |
| path is prefixed with the value of @code{DESTDIR} before being copied |
| into the install area. Here is an example of typical DESTDIR usage: |
| |
| @example |
| mkdir /tmp/staging && |
| make DESTDIR=/tmp/staging install |
| @end example |
| |
| The @command{mkdir} command avoids a security problem if the attacker |
| creates a symbolic link from @file{/tmp/staging} to a victim area; |
| then @command{make} places install objects in a directory tree built under |
| @file{/tmp/staging}. If @file{/gnu/bin/foo} and |
| @file{/gnu/share/aclocal/foo.m4} are to be installed, the above command |
| would install @file{/tmp/staging/gnu/bin/foo} and |
| @file{/tmp/staging/gnu/share/aclocal/foo.m4}. |
| |
| This feature is commonly used to build install images and packages |
| (@pxref{DESTDIR}). |
| |
| Support for @code{DESTDIR} is implemented by coding it directly into |
| the install rules. If your @file{Makefile.am} uses a local install |
| rule (e.g., @code{install-exec-local}) or an install hook, then you |
| must write that code to respect @code{DESTDIR}. |
| |
| @xref{Makefile Conventions, , , standards, The GNU Coding Standards}, |
| for another usage example. |
| |
| @node Install Rules for the User |
| @section Install Rules for the User |
| |
| Automake also generates rules for targets @code{uninstall}, |
| @code{installdirs}, and @code{install-strip}. |
| @trindex uninstall |
| @trindex installdirs |
| @trindex install-strip |
| |
| Automake supports @code{uninstall-local} and @code{uninstall-hook}. |
| There is no notion of separate uninstalls for ``exec'' and ``data'', as |
| these features would not provide additional functionality. |
| |
| Note that @code{uninstall} is not meant as a replacement for a real |
| packaging tool. |
| |
| |
| @node Clean |
| @chapter What Gets Cleaned |
| |
| @cindex @samp{make clean} support |
| |
| The GNU Makefile Standards specify a number of different clean rules. |
| @xref{Standard Targets, , Standard Targets for Users, standards, |
| The GNU Coding Standards}. |
| |
| Generally the files that can be cleaned are determined automatically by |
| Automake. Of course, Automake also recognizes some variables that can |
| be defined to specify additional files to clean. These variables are |
| @code{MOSTLYCLEANFILES}, @code{CLEANFILES}, @code{DISTCLEANFILES}, and |
| @code{MAINTAINERCLEANFILES}. |
| @vindex MOSTLYCLEANFILES |
| @vindex CLEANFILES |
| @vindex DISTCLEANFILES |
| @vindex MAINTAINERCLEANFILES |
| |
| @trindex mostlyclean-local |
| @trindex clean-local |
| @trindex distclean-local |
| @trindex maintainer-clean-local |
| When cleaning involves more than deleting some hard-coded list of |
| files, it is also possible to supplement the cleaning rules with your |
| own commands. Simply define a rule for any of the |
| @code{mostlyclean-local}, @code{clean-local}, @code{distclean-local}, |
| or @code{maintainer-clean-local} targets (@pxref{Extending}). A common |
| case is deleting a directory, for instance, a directory created by the |
| test suite: |
| |
| @example |
| clean-local: |
| -rm -rf testSubDir |
| @end example |
| |
| Since @command{make} allows only one set of rules for a given target, |
| a more extensible way of writing this is to use a separate target |
| listed as a dependency: |
| |
| @example |
| clean-local: clean-local-check |
| .PHONY: clean-local-check |
| clean-local-check: |
| -rm -rf testSubDir |
| @end example |
| |
| As the GNU Standards aren't always explicit as to which files should |
| be removed by which rule, we've adopted a heuristic that we believe |
| was first formulated by Fran@,{c}ois Pinard: |
| |
| @itemize @bullet |
| @item |
| If @command{make} built it, and it is commonly something that one would |
| want to rebuild (for instance, a @file{.o} file), then |
| @code{mostlyclean} should delete it. |
| |
| @item |
| Otherwise, if @command{make} built it, then @code{clean} should delete it. |
| |
| @item |
| If @command{configure} built it, then @code{distclean} should delete it. |
| |
| @item |
| If the maintainer built it (for instance, a @file{.info} file), then |
| @code{maintainer-clean} should delete it. However |
| @code{maintainer-clean} should not delete anything that needs to exist |
| in order to run @samp{./configure && make}. |
| @end itemize |
| |
| We recommend that you follow this same set of heuristics in your |
| @file{Makefile.am}. |
| |
| |
| @node Dist |
| @chapter What Goes in a Distribution |
| |
| @menu |
| * Basics of Distribution:: Files distributed by default |
| * Fine-grained Distribution Control:: @code{dist_} and @code{nodist_} prefixes |
| * The dist Hook:: A target for last-minute distribution changes |
| * Checking the Distribution:: @samp{make distcheck} explained |
| * The Types of Distributions:: A variety of formats and compression methods |
| @end menu |
| |
| @node Basics of Distribution |
| @section Basics of Distribution |
| |
| @cindex @samp{make dist} |
| |
| @vindex PACKAGE |
| @vindex VERSION |
| @trindex dist |
| The @code{dist} rule in the generated @file{Makefile.in} can be used |
| to generate a gzipped @code{tar} file and other flavors of archive for |
| distribution. The file is named based on the @code{PACKAGE} and |
| @code{VERSION} variables automatically defined by either the |
| @code{AC_INIT} invocation or by a @emph{deprecated} two-arguments |
| invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros} |
| for how these variables get their values, from either defaults or explicit |
| values -- it's slightly trickier than one would expect). |
| More precisely the gzipped @code{tar} file is named |
| @samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}. |
| @vindex GZIP_ENV |
| You can use the @command{make} variable @code{GZIP_ENV} to control how gzip |
| is run. The default setting is @option{--best}. |
| |
| @cindex @code{m4_include}, distribution |
| @cindex @code{include}, distribution |
| @acindex m4_include |
| @cmindex include |
| For the most part, the files to distribute are automatically found by |
| Automake: all source files are automatically included in a distribution, |
| as are all @file{Makefile.am} and @file{Makefile.in} files. Automake also |
| has a built-in list of commonly used files that are automatically |
| included if they are found in the current directory (either physically, |
| or as the target of a @file{Makefile.am} rule); this list is printed by |
| @samp{automake --help}. Note that some files in this list are actually |
| distributed only if other certain conditions hold (for example, |
| @c Keep in sync with autodist-config-headers.sh |
| the @file{config.h.top} and @file{config.h.bot} files are automatically |
| distributed only if, e.g., @samp{AC_CONFIG_HEADERS([config.h])} is used |
| in @file{configure.ac}). Also, files that are read by @command{configure} |
| (i.e.@: the source files corresponding to the files specified in various |
| Autoconf macros such as @code{AC_CONFIG_FILES} and siblings) are |
| automatically distributed. Files included in a @file{Makefile.am} (using |
| @code{include}) or in @file{configure.ac} (using @code{m4_include}), and |
| helper scripts installed with @samp{automake --add-missing} are also |
| distributed. |
| |
| @vindex EXTRA_DIST |
| Still, sometimes there are files that must be distributed, but which |
| are not covered in the automatic rules. These files should be listed in |
| the @code{EXTRA_DIST} variable. You can mention files from |
| subdirectories in @code{EXTRA_DIST}. |
| |
| You can also mention a directory in @code{EXTRA_DIST}; in this case the |
| entire directory will be recursively copied into the distribution. |
| Please note that this will also copy @emph{everything} in the directory, |
| including, e.g., Subversion's @file{.svn} private directories or CVS/RCS |
| version control files; thus we recommend against using this feature |
| as-is. However, you can use the @code{dist-hook} feature to |
| ameliorate the problem; @pxref{The dist Hook}. |
| |
| @vindex SUBDIRS |
| @vindex DIST_SUBDIRS |
| If you define @code{SUBDIRS}, Automake will recursively include the |
| subdirectories in the distribution. If @code{SUBDIRS} is defined |
| conditionally (@pxref{Conditionals}), Automake will normally include |
| all directories that could possibly appear in @code{SUBDIRS} in the |
| distribution. If you need to specify the set of directories |
| conditionally, you can set the variable @code{DIST_SUBDIRS} to the |
| exact list of subdirectories to include in the distribution |
| (@pxref{Conditional Subdirectories}). |
| |
| |
| @node Fine-grained Distribution Control |
| @section Fine-grained Distribution Control |
| |
| @vindex dist_ |
| @vindex nodist_ |
| Sometimes you need tighter control over what does @emph{not} go into the |
| distribution; for instance, you might have source files that are |
| generated and that you do not want to distribute. In this case |
| Automake gives fine-grained control using the @code{dist} and |
| @code{nodist} prefixes. Any primary or @code{_SOURCES} variable can be |
| prefixed with @code{dist_} to add the listed files to the distribution. |
| Similarly, @code{nodist_} can be used to omit the files from the |
| distribution. |
| |
| As an example, here is how you would cause some data to be distributed |
| while leaving some source code out of the distribution: |
| |
| @example |
| dist_data_DATA = distribute-this |
| bin_PROGRAMS = foo |
| nodist_foo_SOURCES = do-not-distribute.c |
| @end example |
| |
| @node The dist Hook |
| @section The dist Hook |
| |
| @trindex dist-hook |
| |
| Occasionally it is useful to be able to change the distribution before |
| it is packaged up. If the @code{dist-hook} rule exists, it is run |
| after the distribution directory is filled, but before the actual |
| distribution archives are created. One way to use this is for |
| removing unnecessary files that get recursively included by specifying |
| a directory in @code{EXTRA_DIST}: |
| |
| @example |
| EXTRA_DIST = doc |
| dist-hook: |
| rm -rf `find $(distdir)/doc -type d -name .svn` |
| @end example |
| |
| @c The caveats described here should be documented in 'disthook.sh'. |
| @noindent |
| Note that the @code{dist-hook} recipe shouldn't assume that the regular |
| files in the distribution directory are writable; this might not be the |
| case if one is packaging from a read-only source tree, or when a |
| @code{make distcheck} is being done. For similar reasons, the recipe |
| shouldn't assume that the subdirectories put into the distribution |
| directory as effect of having them listed in @code{EXTRA_DIST} are |
| writable. So, if the @code{dist-hook} recipe wants to modify the |
| content of an existing file (or @code{EXTRA_DIST} subdirectory) in the |
| distribution directory, it should explicitly to make it writable first: |
| |
| @example |
| EXTRA_DIST = README doc |
| dist-hook: |
| chmod u+w $(distdir)/README $(distdir)/doc |
| echo "Distribution date: `date`" >> README |
| rm -f $(distdir)/doc/HACKING |
| @end example |
| |
| @vindex distdir |
| @vindex top_distdir |
| Two variables that come handy when writing @code{dist-hook} rules are |
| @samp{$(distdir)} and @samp{$(top_distdir)}. |
| |
| @samp{$(distdir)} points to the directory where the @code{dist} rule |
| will copy files from the current directory before creating the |
| tarball. If you are at the top-level directory, then @samp{distdir = |
| $(PACKAGE)-$(VERSION)}. When used from subdirectory named |
| @file{foo/}, then @samp{distdir = ../$(PACKAGE)-$(VERSION)/foo}. |
| @samp{$(distdir)} can be a relative or absolute path, do not assume |
| any form. |
| |
| @samp{$(top_distdir)} always points to the root directory of the |
| distributed tree. At the top-level it's equal to @samp{$(distdir)}. |
| In the @file{foo/} subdirectory |
| @samp{top_distdir = ../$(PACKAGE)-$(VERSION)}. |
| @samp{$(top_distdir)} too can be a relative or absolute path. |
| |
| Note that when packages are nested using @code{AC_CONFIG_SUBDIRS} |
| (@pxref{Subpackages}), then @samp{$(distdir)} and |
| @samp{$(top_distdir)} are relative to the package where @samp{make |
| dist} was run, not to any sub-packages involved. |
| |
| @node Checking the Distribution |
| @section Checking the Distribution |
| |
| @cindex @samp{make distcheck} |
| @trindex distcheck |
| Automake also generates a @code{distcheck} rule that can be of help |
| to ensure that a given distribution will actually work. Simplifying |
| a bit, we can say this rule first makes a distribution, and then, |
| @emph{operating from it}, takes the following steps: |
| @itemize |
| @item |
| tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the |
| @code{srcdir} and all its content made @emph{read-only}; |
| @item |
| runs the test suite (with @command{make check}) on this fresh build; |
| @item |
| installs the package in a temporary directory (with @command{make |
| install}), and tries runs the test suite on the resulting installation |
| (with @command{make installcheck}); |
| @item |
| checks that the package can be correctly uninstalled (by @command{make |
| uninstall}) and cleaned (by @code{make distclean}); |
| @item |
| finally, makes another tarball to ensure the distribution is |
| self-contained. |
| @end itemize |
| |
| All of these actions are performed in a temporary directory. Please |
| note that the exact location and the exact structure of such a directory |
| (where the read-only sources are placed, how the temporary build and |
| install directories are named and how deeply they are nested, etc.) is |
| to be considered an implementation detail, which can change at any time; |
| so do not reply on it. |
| |
| @vindex AM_DISTCHECK_CONFIGURE_FLAGS |
| @vindex DISTCHECK_CONFIGURE_FLAGS |
| @subheading DISTCHECK_CONFIGURE_FLAGS |
| Building the package involves running @samp{./configure}. If you need |
| to supply additional flags to @command{configure}, define them in the |
| @code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level |
| @file{Makefile.am}. The user can still extend or override the flags |
| provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable, |
| on the command line when invoking @command{make}. |
| @c See automake bug#14991 for more details about how the following holds. |
| It's worth noting that @command{make distcheck} needs complete control |
| over the @command{configure} options @option{--srcdir} and |
| @option{--prefix}, so those options cannot be overridden by |
| @code{AM_DISTCHECK_CONFIGURE_FLAGS} nor by |
| @code{DISTCHECK_CONFIGURE_FLAGS}. |
| |
| Also note that developers are encouraged to strive to make their code |
| buildable without requiring any special configure option; thus, in |
| general, you shouldn't define @code{AM_DISTCHECK_CONFIGURE_FLAGS}. |
| However, there might be few scenarios in which the use of this variable |
| is justified. |
| GNU @command{m4} offers an example. GNU @command{m4} configures by |
| default with its experimental and seldom used "changeword" feature |
| disabled; so in its case it is useful to have @command{make distcheck} |
| run configure with the @option{--with-changeword} option, to ensure that |
| the code for changeword support still compiles correctly. |
| GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS} |
| variable to stress-test the use of @option{--program-prefix=g}, since at |
| one point the @command{m4} build system had a bug where @command{make |
| installcheck} was wrongly assuming it could blindly test "@command{m4}", |
| rather than the just-installed "@command{gm4}". |
| |
| @trindex distcheck-hook |
| @subheading distcheck-hook |
| If the @code{distcheck-hook} rule is defined in your top-level |
| @file{Makefile.am}, then it will be invoked by @code{distcheck} after |
| the new distribution has been unpacked, but before the unpacked copy |
| is configured and built. Your @code{distcheck-hook} can do almost |
| anything, though as always caution is advised. Generally this hook is |
| used to check for potential distribution errors not caught by the |
| standard mechanism. Note that @code{distcheck-hook} as well as |
| @code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS} |
| are not honored in a subpackage @file{Makefile.am}, but the flags from |
| @code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS} |
| are passed down to the @command{configure} script of the subpackage. |
| |
| @cindex @samp{make distcleancheck} |
| @trindex distcleancheck |
| @vindex DISTCLEANFILES |
| @vindex distcleancheck_listfiles |
| |
| @subheading distcleancheck |
| Speaking of potential distribution errors, @code{distcheck} also |
| ensures that the @code{distclean} rule actually removes all built |
| files. This is done by running @samp{make distcleancheck} at the end of |
| the @code{VPATH} build. By default, @code{distcleancheck} will run |
| @code{distclean} and then make sure the build tree has been emptied by |
| running @samp{$(distcleancheck_listfiles)}. Usually this check will |
| find generated files that you forgot to add to the @code{DISTCLEANFILES} |
| variable (@pxref{Clean}). |
| |
| The @code{distcleancheck} behavior should be OK for most packages, |
| otherwise you have the possibility to override the definition of |
| either the @code{distcleancheck} rule, or the |
| @samp{$(distcleancheck_listfiles)} variable. For instance, to disable |
| @code{distcleancheck} completely, add the following rule to your |
| top-level @file{Makefile.am}: |
| |
| @example |
| distcleancheck: |
| @@: |
| @end example |
| |
| If you want @code{distcleancheck} to ignore built files that have not |
| been cleaned because they are also part of the distribution, add the |
| following definition instead: |
| |
| @c Keep in sync with distcleancheck.sh |
| @example |
| distcleancheck_listfiles = \ |
| find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \ |
| sh '@{@}' ';' |
| @end example |
| |
| The above definition is not the default because it's usually an error if |
| your Makefiles cause some distributed files to be rebuilt when the user |
| build the package. (Think about the user missing the tool required to |
| build the file; or if the required tool is built by your package, |
| consider the cross-compilation case where it can't be run.) There is |
| an entry in the FAQ about this (@pxref{Errors with distclean}), make |
| sure you read it before playing with @code{distcleancheck_listfiles}. |
| |
| @cindex @samp{make distuninstallcheck} |
| @trindex distuninstallcheck |
| @vindex distuninstallcheck_listfiles |
| |
| @subheading distuninstallcheck |
| @code{distcheck} also checks that the @code{uninstall} rule works |
| properly, both for ordinary and @code{DESTDIR} builds. It does this |
| by invoking @samp{make uninstall}, and then it checks the install tree |
| to see if any files are left over. This check will make sure that you |
| correctly coded your @code{uninstall}-related rules. |
| |
| By default, the checking is done by the @code{distuninstallcheck} rule, |
| and the list of files in the install tree is generated by |
| @samp{$(distuninstallcheck_listfiles)} (this is a variable whose value is |
| a shell command to run that prints the list of files to stdout). |
| |
| Either of these can be overridden to modify the behavior of |
| @code{distcheck}. For instance, to disable this check completely, you |
| would write: |
| |
| @example |
| distuninstallcheck: |
| @@: |
| @end example |
| |
| @node The Types of Distributions |
| @section The Types of Distributions |
| |
| Automake generates rules to provide archives of the project for |
| distributions in various formats. Their targets are: |
| |
| @table @asis |
| @item @code{dist-gzip} |
| Generate a @samp{gzip} tar archive of the distribution. This is the |
| only format enabled by default. |
| @trindex dist-gzip |
| |
| @vindex BZIP2 |
| @item @code{dist-bzip2} |
| Generate a @samp{bzip2} tar archive of the distribution. bzip2 archives |
| are frequently smaller than gzipped archives. |
| By default, this rule makes @samp{bzip2} use a compression option of @option{-9}. |
| To make it use a different one, set the @env{BZIP2} environment variable. |
| For example, @samp{make dist-bzip2 BZIP2=-7}. |
| @trindex dist-bzip2 |
| |
| @item @code{dist-lzip} |
| Generate an @samp{lzip} tar archive of the distribution. @command{lzip} |
| archives are frequently smaller than @command{bzip2}-compressed archives. |
| @trindex dist-lzip |
| |
| @vindex XZ_OPT |
| @item @code{dist-xz} |
| Generate an @samp{xz} tar archive of the distribution. @command{xz} |
| archives are frequently smaller than @command{bzip2}-compressed archives. |
| By default, this rule makes @samp{xz} use a compression option of |
| @option{-e}. To make it use a different one, set the @env{XZ_OPT} |
| environment variable. For example, run this command to use the |
| default compression ratio, but with a progress indicator: |
| @samp{make dist-xz XZ_OPT=-ve}. |
| @trindex dist-xz |
| |
| @item @code{dist-zip} |
| Generate a @samp{zip} archive of the distribution. |
| @trindex dist-zip |
| |
| @item @code{dist-tarZ} |
| Generate a tar archive of the distribution, compressed with the |
| historical (and obsolescent) program @command{compress}. This |
| option is deprecated, and it and the corresponding functionality |
| will be removed altogether in Automake 2.0. |
| @trindex dist-tarZ |
| |
| @item @code{dist-shar} |
| Generate a @samp{shar} archive of the distribution. This format |
| archive is obsolescent, and use of this option is deprecated. |
| It and the corresponding functionality will be removed altogether |
| in Automake 2.0. |
| @trindex dist-shar |
| |
| @end table |
| |
| The rule @code{dist} (and its historical synonym @code{dist-all}) |
| will create archives in all the enabled formats (@pxref{List of |
| Automake options} for how to change this list). By default, only |
| the @code{dist-gzip} target is hooked to @code{dist}. |
| |
| |
| @node Tests |
| @chapter Support for test suites |
| |
| @cindex Test suites |
| @cindex @code{make check} |
| @trindex check |
| |
| Automake can generate code to handle two kinds of test suites. One is |
| based on integration with the @command{dejagnu} framework. The other |
| (and most used) form is based on the use of generic test scripts, and |
| its activation is triggered by the definition of the special @code{TESTS} |
| variable. This second form allows for various degrees of sophistication |
| and customization; in particular, it allows for concurrent execution |
| of test scripts, use of established test protocols such as TAP, and |
| definition of custom test drivers and test runners. |
| |
| @noindent |
| In either case, the testsuite is invoked via @samp{make check}. |
| |
| @menu |
| * Generalities about Testing:: Concepts and terminology about testing |
| * Simple Tests:: Listing test scripts in @code{TESTS} |
| * Custom Test Drivers:: Writing and using custom test drivers |
| * Using the TAP test protocol:: Integrating test scripts that use the TAP protocol |
| * DejaGnu Tests:: Interfacing with the @command{dejagnu} testing framework |
| * Install Tests:: Running tests on installed packages |
| @end menu |
| |
| @node Generalities about Testing |
| @section Generalities about Testing |
| |
| The purpose of testing is to determine whether a program or system behaves |
| as expected (e.g., known inputs produce the expected outputs, error |
| conditions are correctly handled or reported, and older bugs do not |
| resurface). |
| |
| @cindex test case |
| The minimal unit of testing is usually called @emph{test case}, or simply |
| @emph{test}. How a test case is defined or delimited, and even what |
| exactly @emph{constitutes} a test case, depends heavily on the testing |
| paradigm and/or framework in use, so we won't attempt any more precise |
| definition. The set of the test cases for a given program or system |
| constitutes its @emph{testsuite}. |
| |
| @cindex test harness |
| @cindex testsuite harness |
| A @emph{test harness} (also @emph{testsuite harness}) is a program or |
| software component that executes all (or part of) the defined test cases, |
| analyzes their outcomes, and report or register these outcomes |
| appropriately. Again, the details of how this is accomplished (and how |
| the developer and user can influence it or interface with it) varies |
| wildly, and we'll attempt no precise definition. |
| |
| @cindex test pass |
| @cindex test failure |
| A test is said to @emph{pass} when it can determine that the condition or |
| behaviour it means to verify holds, and is said to @emph{fail} when it can |
| determine that such condition of behaviour does @emph{not} hold. |
| |
| @cindex test skip |
| Sometimes, tests can rely on non-portable tools or prerequisites, or |
| simply make no sense on a given system (for example, a test checking a |
| Windows-specific feature makes no sense on a GNU/Linux system). In this |
| case, accordingly to the definition above, the tests can neither be |
| considered passed nor failed; instead, they are @emph{skipped} -- i.e., |
| they are not run, or their result is anyway ignored for what concerns |
| the count of failures an successes. Skips are usually explicitly |
| reported though, so that the user will be aware that not all of the |
| testsuite has really run. |
| |
| @cindex xfail |
| @cindex expected failure |
| @cindex expected test failure |
| @cindex xpass |
| @cindex unexpected pass |
| @cindex unexpected test pass |
| It's not uncommon, especially during early development stages, that some |
| tests fail for known reasons, and that the developer doesn't want to |
| tackle these failures immediately (this is especially true when the |
| failing tests deal with corner cases). In this situation, the better |
| policy is to declare that each of those failures is an @emph{expected |
| failure} (or @emph{xfail}). In case a test that is expected to fail ends |
| up passing instead, many testing environments will flag the result as a |
| special kind of failure called @emph{unexpected pass} (or @emph{xpass}). |
| |
| @cindex hard error |
| @cindex Distinction between errors and failures in testsuites |
| Many testing environments and frameworks distinguish between test failures |
| and hard errors. As we've seen, a test failure happens when some invariant |
| or expected behaviour of the software under test is not met. An @emph{hard |
| error} happens when e.g., the set-up of a test case scenario fails, or when |
| some other unexpected or highly undesirable condition is encountered (for |
| example, the program under test experiences a segmentation fault). |
| |
| @node Simple Tests |
| @section Simple Tests |
| |
| @menu |
| * Scripts-based Testsuites:: Automake-specific concepts and terminology |
| * Serial Test Harness:: Older (and discouraged) serial test harness |
| * Parallel Test Harness:: Generic concurrent test harness |
| @end menu |
| |
| @node Scripts-based Testsuites |
| @subsection Scripts-based Testsuites |
| |
| If the special variable @code{TESTS} is defined, its value is taken to be |
| a list of programs or scripts to run in order to do the testing. Under |
| the appropriate circumstances, it's possible for @code{TESTS} to list |
| also data files to be passed to one or more test scripts defined by |
| different means (the so-called ``log compilers'', @pxref{Parallel Test |
| Harness}). |
| |
| Test scripts can be executed serially or concurrently. Automake supports |
| both these kinds of test execution, with the parallel test harness being |
| the default. The concurrent test harness relies on the concurrence |
| capabilities (if any) offered by the underlying @command{make} |
| implementation, and can thus only be as good as those are. |
| |
| By default, only the exit statuses of the test scripts are considered when |
| determining the testsuite outcome. But Automake allows also the use of |
| more complex test protocols, either standard (@pxref{Using the TAP test |
| protocol}) or custom (@pxref{Custom Test Drivers}). Note that you can't |
| enable such protocols when the serial harness is used, though. |
| In the rest of this section we are going to concentrate mostly on |
| protocol-less tests, since we cover test protocols in a later section |
| (again, @pxref{Custom Test Drivers}). |
| |
| @cindex Exit status 77, special interpretation |
| @cindex Exit status 99, special interpretation |
| When no test protocol is in use, an exit status of 0 from a test script will |
| denote a success, an exit status of 77 a skipped test, an exit status of 99 |
| an hard error, and any other exit status will denote a failure. |
| |
| @cindex Tests, expected failure |
| @cindex Expected test failure |
| @vindex XFAIL_TESTS |
| @vindex DISABLE_HARD_ERRORS |
| @cindex Disabling hard errors |
| You may define the variable @code{XFAIL_TESTS} to a list of tests |
| (usually a subset of @code{TESTS}) that are expected to fail; this will |
| effectively reverse the result of those tests (with the provision that |
| skips and hard errors remain untouched). You may also instruct the |
| testsuite harness to treat hard errors like simple failures, by defining |
| the @code{DISABLE_HARD_ERRORS} make variable to a nonempty value. |
| |
| Note however that, for tests based on more complex test protocols, |
| the exact effects of @code{XFAIL_TESTS} and @code{DISABLE_HARD_ERRORS} |
| might change, or they might even have no effect at all (for example, |
| @c Keep this in sync with tap-no-disable-hard-errors.sh |
| in tests using TAP, there is no way to disable hard errors, and the |
| @code{DISABLE_HARD_ERRORS} variable has no effect on them). |
| |
| @anchor{Testsuite progress on console} |
| @cindex Testsuite progress on console |
| The result of each test case run by the scripts in @code{TESTS} will be |
| printed on standard output, along with the test name. For test protocols |
| that allow more test cases per test script (such as TAP), a number, |
| identifier and/or brief description specific for the single test case is |
| expected to be printed in addition to the name of the test script. The |
| possible results (whose meanings should be clear from the previous |
| @ref{Generalities about Testing}) are @code{PASS}, @code{FAIL}, |
| @code{SKIP}, @code{XFAIL}, @code{XPASS} and @code{ERROR}. Here is an |
| example of output from an hypothetical testsuite that uses both plain |
| and TAP tests: |
| @c Keep in sync with tap-doc.sh |
| @example |
| PASS: foo.sh |
| PASS: zardoz.tap 1 - Daemon started |
| PASS: zardoz.tap 2 - Daemon responding |
| SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted |
| PASS: zardoz.tap 4 - Daemon stopped |
| SKIP: bar.sh |
| PASS: mu.tap 1 |
| XFAIL: mu.tap 2 # TODO frobnication not yet implemented |
| @end example |
| |
| @noindent |
| A testsuite summary (expected to report at least the number of run, |
| skipped and failed tests) will be printed at the end of the testsuite |
| run. |
| |
| @anchor{Simple tests and color-tests} |
| @vindex AM_COLOR_TESTS |
| @cindex Colorized testsuite output |
| If the standard output is connected to a capable terminal, then the test |
| results and the summary are colored appropriately. The developer and the |
| user can disable colored output by setting the @command{make} variable |
| @samp{AM_COLOR_TESTS=no}; the user can in addition force colored output |
| even without a connecting terminal with @samp{AM_COLOR_TESTS=always}. |
| It's also worth noting that some @command{make} implementations, |
| when used in parallel mode, have slightly different semantics |
| (@pxref{Parallel make,,, autoconf, The Autoconf Manual}), which can |
| break the automatic detection of a connection to a capable terminal. |
| If this is the case, the user will have to resort to the use of |
| @samp{AM_COLOR_TESTS=always} in order to have the testsuite output |
| colorized. |
| |
| Test programs that need data files should look for them in @code{srcdir} |
| (which is both a make variable and an environment variable made available |
| to the tests), so that they work when building in a separate directory |
| (@pxref{Build Directories, , Build Directories , autoconf, |
| The Autoconf Manual}), and in particular for the @code{distcheck} rule |
| (@pxref{Checking the Distribution}). |
| |
| @vindex TESTS |
| @vindex TESTS_ENVIRONMENT |
| @vindex AM_TESTS_ENVIRONMENT |
| The @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables can |
| be used to run initialization code and set environment variables for the |
| test scripts. The former variable is developer-reserved, and can be |
| defined in the @file{Makefile.am}, while the latter is reserved for the |
| user, which can employ it to extend or override the settings in the |
| former; for this to work portably, however, the contents of a non-empty |
| @code{AM_TESTS_ENVIRONMENT} @emph{must} be terminated by a semicolon. |
| |
| @vindex AM_TESTS_FD_REDIRECT |
| The @code{AM_TESTS_FD_REDIRECT} variable can be used to define file |
| descriptor redirections for the test scripts. One might think that |
| @code{AM_TESTS_ENVIRONMENT} could be used for this purpose, but experience |
| has shown that doing so portably is practically impossible. The main |
| hurdle is constituted by Korn shells, which usually set the close-on-exec |
| flag on file descriptors opened with the @command{exec} builtin, thus |
| rendering an idiom like @code{AM_TESTS_ENVIRONMENT = exec 9>&2;} |
| ineffectual. This issue also affects some Bourne shells, such as the |
| HP-UX's @command{/bin/sh}, |
| |
| @c Keep in sync with tests-environment-backcompat.sh |
| @example |
| AM_TESTS_ENVIRONMENT = \ |
| ## Some environment initializations are kept in a separate shell |
| ## file 'tests-env.sh', which can make it easier to also run tests |
| ## from the command line. |
| . $(srcdir)/tests-env.sh; \ |
| ## On Solaris, prefer more POSIX-compliant versions of the standard |
| ## tools by default. |
| if test -d /usr/xpg4/bin; then \ |
| PATH=/usr/xpg4/bin:$$PATH; export PATH; \ |
| fi; |
| @c $$ restore font-lock |
| ## With this, the test scripts will be able to print diagnostic |
| ## messages to the original standard error stream, even if the test |
| ## driver redirects the stderr of the test scripts to a log file |
| ## before executing them. |
| AM_TESTS_FD_REDIRECT = 9>&2 |
| @end example |
| |
| @noindent |
| Note however that @code{AM_TESTS_ENVIRONMENT} is, for historical and |
| implementation reasons, @emph{not} supported by the serial harness |
| (@pxref{Serial Test Harness}). |
| |
| Automake ensures that each file listed in @code{TESTS} is built before |
| it is run; you can list both source and derived programs (or scripts) |
| in @code{TESTS}; the generated rule will look both in @code{srcdir} and |
| @file{.}. For instance, you might want to run a C program as a test. |
| To do this you would list its name in @code{TESTS} and also in |
| @code{check_PROGRAMS}, and then specify it as you would any other |
| program. |
| |
| Programs listed in @code{check_PROGRAMS} (and @code{check_LIBRARIES}, |
| @code{check_LTLIBRARIES}...) are only built during @code{make check}, |
| not during @code{make all}. You should list there any program needed |
| by your tests that does not need to be built by @code{make all}. Note |
| that @code{check_PROGRAMS} are @emph{not} automatically added to |
| @code{TESTS} because @code{check_PROGRAMS} usually lists programs used |
| by the tests, not the tests themselves. Of course you can set |
| @code{TESTS = $(check_PROGRAMS)} if all your programs are test cases. |
| |
| @node Serial Test Harness |
| @subsection Older (and discouraged) serial test harness |
| @cindex @option{serial-tests}, Using |
| |
| First, note that today the use of this harness is strongly discouraged in |
| favour of the parallel test harness (@pxref{Parallel Test Harness}). |
| Still, there are @emph{few} situations when the advantages offered by |
| the parallel harness are irrelevant, and when test concurrency can |
| even cause tricky problems. In those cases, it might make sense to |
| still use the serial harness, for simplicity and reliability (we still |
| suggest trying to give the parallel harness a shot though). |
| |
| The serial test harness is enabled by the Automake option |
| @option{serial-tests}. It operates by simply running the tests serially, |
| one at the time, without any I/O redirection. It's up to the user to |
| implement logging of tests' output, if that's required or desired. |
| |
| For historical and implementation reasons, the @code{AM_TESTS_ENVIRONMENT} |
| variable is @emph{not} supported by this harness (it will be silently |
| ignored if defined); only @code{TESTS_ENVIRONMENT} is, and it is to be |
| considered a developer-reserved variable. This is done so that, when |
| using the serial harness, @code{TESTS_ENVIRONMENT} can be defined to an |
| invocation of an interpreter through which the tests are to be run. |
| For instance, the following setup may be used to run tests with Perl: |
| |
| @example |
| TESTS_ENVIRONMENT = $(PERL) -Mstrict -w |
| TESTS = foo.pl bar.pl baz.pl |
| @end example |
| |
| @noindent |
| It's important to note that the use of @code{TESTS_ENVIRONMENT} endorsed |
| here would be @emph{invalid} with the parallel harness. That harness |
| provides a more elegant way to achieve the same effect, with the further |
| benefit of freeing the @code{TESTS_ENVIRONMENT} variable for the user |
| (@pxref{Parallel Test Harness}). |
| |
| Another, less serious limit of the serial harness is that it doesn't |
| really distinguish between simple failures and hard errors; this is |
| due to historical reasons only, and might be fixed in future Automake |
| versions. |
| |
| @node Parallel Test Harness |
| @subsection Parallel Test Harness |
| |
| By default, Automake generated a parallel (concurrent) test harness. It |
| features automatic collection of the test scripts output in @file{.log} |
| files, concurrent execution of tests with @code{make -j}, specification |
| of inter-test dependencies, lazy reruns of tests that have not completed |
| in a prior run, and hard errors for exceptional failures. |
| |
| @anchor{Basics of test metadata} |
| @vindex TEST_SUITE_LOG |
| @vindex TESTS |
| @cindex @file{.log} files |
| @cindex @file{.trs} files |
| @cindex test metadata |
| The parallel test harness operates by defining a set of @command{make} |
| rules that run the test scripts listed in @code{TESTS}, and, for each |
| such script, save its output in a corresponding @file{.log} file and |
| its results (and other ``metadata'', @pxref{API for Custom Test Drivers}) |
| in a corresponding @file{.trs} (as in @b{T}est @b{R}e@b{S}ults) file. |
| @c We choose the '.trs' extension also because, at the time of writing, |
| @c it isn't already used for other significant purposes; see e.g.: |
| @c - http://filext.com/file-extension/trs |
| @c - http://www.file-extensions.org/search/?searchstring=trs |
| The @file{.log} file will contain all the output emitted by the test on |
| its standard output and its standard error. The @file{.trs} file will |
| contain, among the other things, the results of the test cases run by |
| the script. |
| |
| The parallel test harness will also create a summary log file, |
| @code{TEST_SUITE_LOG}, which defaults to @file{test-suite.log} and requires |
| a @file{.log} suffix. This file depends upon all the @file{.log} and |
| @file{.trs} files created for the test scripts listed in @code{TESTS}. |
| |
| @vindex VERBOSE |
| As with the serial harness above, by default one status line is printed |
| per completed test, and a short summary after the suite has completed. |
| However, standard output and standard error of the test are redirected |
| to a per-test log file, so that parallel execution does not produce |
| intermingled output. The output from failed tests is collected in the |
| @file{test-suite.log} file. If the variable @samp{VERBOSE} is set, this |
| file is output after the summary. |
| |
| @vindex TEST_EXTENSIONS |
| @vindex TEST_LOGS |
| Each couple of @file{.log} and @file{.trs} files is created when the |
| corresponding test has completed. The set of log files is listed in |
| the read-only variable @code{TEST_LOGS}, and defaults to @code{TESTS}, |
| with the executable extension if any (@pxref{EXEEXT}), as well as any |
| suffix listed in @code{TEST_EXTENSIONS} removed, and @file{.log} appended. |
| Results are undefined if a test file name ends in several concatenated |
| suffixes. @code{TEST_EXTENSIONS} defaults to @file{.test}; it can be |
| overridden by the user, in which case any extension listed in it must be |
| constituted by a dot, followed by a non-digit alphabetic character, |
| followed by any number of alphabetic characters. |
| @c Keep in sync with test-extensions.sh |
| For example, @samp{.sh}, @samp{.T} and @samp{.t1} are valid extensions, |
| while @samp{.x-y}, @samp{.6c} and @samp{.t.1} are not. |
| |
| @cindex Configure substitutions in @code{TESTS} |
| It is important to note that, due to current limitations (unlikely to be |
| lifted), configure substitutions in the definition of @code{TESTS} can |
| only work if they will expand to a list of tests that have a suffix listed |
| in @code{TEST_EXTENSIONS}. |
| |
| @vindex _LOG_COMPILE |
| @vindex _LOG_COMPILER |
| @vindex _LOG_FLAGS |
| @vindex LOG_COMPILE |
| @vindex LOG_COMPILER |
| @vindex LOG_FLAGS |
| @vindex @var{ext}_LOG_COMPILE |
| @vindex @var{ext}_LOG_COMPILER |
| @vindex @var{ext}_LOG_FLAGS |
| @vindex AM_@var{ext}_LOG_FLAGS |
| @vindex AM_LOG_FLAGS |
| For tests that match an extension @code{.@var{ext}} listed in |
| @code{TEST_EXTENSIONS}, you can provide a custom ``test runner'' using |
| the variable @code{@var{ext}_LOG_COMPILER} (note the upper-case |
| extension) and pass options in @code{AM_@var{ext}_LOG_FLAGS} and allow |
| the user to pass options in @code{@var{ext}_LOG_FLAGS}. It will cause |
| all tests with this extension to be called with this runner. For all |
| tests without a registered extension, the variables @code{LOG_COMPILER}, |
| @code{AM_LOG_FLAGS}, and @code{LOG_FLAGS} may be used. For example, |
| |
| @c Keep in sync with parallel-tests-log-compiler-example.sh |
| @example |
| TESTS = foo.pl bar.py baz |
| TEST_EXTENSIONS = .pl .py |
| PL_LOG_COMPILER = $(PERL) |
| AM_PL_LOG_FLAGS = -w |
| PY_LOG_COMPILER = $(PYTHON) |
| AM_PY_LOG_FLAGS = -v |
| LOG_COMPILER = ./wrapper-script |
| AM_LOG_FLAGS = -d |
| @end example |
| |
| @noindent |
| will invoke @samp{$(PERL) -w foo.pl}, @samp{$(PYTHON) -v bar.py}, |
| and @samp{./wrapper-script -d baz} to produce @file{foo.log}, |
| @file{bar.log}, and @file{baz.log}, respectively. The @file{foo.trs}, |
| @file{bar.trs} and @file{baz.trs} files will be automatically produced |
| as a side-effect. |
| |
| It's important to note that, differently from what we've seen for the |
| serial test harness (@pxref{Serial Test Harness}), the |
| @code{AM_TESTS_ENVIRONMENT} and @code{TESTS_ENVIRONMENT} variables |
| @emph{cannot} be used to define a custom test runner; the |
| @code{LOG_COMPILER} and @code{LOG_FLAGS} (or their extension-specific |
| counterparts) should be used instead: |
| |
| @example |
| ## This is WRONG! |
| AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib' $(PERL) -Mstrict -w |
| @end example |
| |
| @example |
| ## Do this instead. |
| AM_TESTS_ENVIRONMENT = PERL5LIB='$(srcdir)/lib'; export PERL5LIB; |
| LOG_COMPILER = $(PERL) |
| AM_LOG_FLAGS = -Mstrict -w |
| @end example |
| |
| By default, the test suite harness will run all tests, but there are |
| several ways to limit the set of tests that are run: |
| |
| @itemize @bullet |
| @item |
| You can set the @code{TESTS} variable. For example, you can use a |
| command like this to run only a subset of the tests: |
| |
| @example |
| env TESTS="foo.test bar.test" make -e check |
| @end example |
| |
| Note however that the command above will unconditionally overwrite the |
| @file{test-suite.log} file, thus clobbering the recorded results |
| of any previous testsuite run. This might be undesirable for packages |
| whose testsuite takes long time to execute. Luckily, this problem can |
| easily be avoided by overriding also @code{TEST_SUITE_LOG} at runtime; |
| for example, |
| |
| @c Keep in sync with parallel-tests-log-override-2.sh |
| @example |
| env TEST_SUITE_LOG=partial.log TESTS="..." make -e check |
| @end example |
| |
| will write the result of the partial testsuite runs to the |
| @file{partial.log}, without touching @file{test-suite.log}. |
| |
| @item |
| You can set the @code{TEST_LOGS} variable. By default, this variable is |
| computed at @command{make} run time from the value of @code{TESTS} as |
| described above. For example, you can use the following: |
| |
| @example |
| set x subset*.log; shift |
| env TEST_LOGS="foo.log $*" make -e check |
| @end example |
| |
| The comments made above about @code{TEST_SUITE_LOG} overriding applies |
| here too. |
| |
| @item |
| @vindex RECHECK_LOGS |
| @cindex lazy test execution |
| By default, the test harness removes all old per-test @file{.log} and |
| @file{.trs} files before it starts running tests to regenerate them. The |
| variable @code{RECHECK_LOGS} contains the set of @file{.log} (and, by |
| implication, @file{.trs}) files which are removed. @code{RECHECK_LOGS} |
| defaults to @code{TEST_LOGS}, which means all tests need to be rechecked. |
| By overriding this variable, you can choose which tests need to be |
| reconsidered. For example, you can lazily rerun only those tests which |
| are outdated, i.e., older than their prerequisite test files, by setting |
| this variable to the empty value: |
| |
| @example |
| env RECHECK_LOGS= make -e check |
| @end example |
| |
| @item |
| @trindex recheck |
| You can ensure that all tests are rerun which have failed or passed |
| unexpectedly, by running @code{make recheck} in the test directory. |
| This convenience target will set @code{RECHECK_LOGS} appropriately |
| before invoking the main test harness. |
| @end itemize |
| |
| @noindent |
| In order to guarantee an ordering between tests even with @code{make |
| -j@var{N}}, dependencies between the corresponding @file{.log} files |
| may be specified through usual @command{make} dependencies. For example, |
| the following snippet lets the test named @file{foo-execute.test} depend |
| upon completion of the test @file{foo-compile.test}: |
| |
| @example |
| TESTS = foo-compile.test foo-execute.test |
| foo-execute.log: foo-compile.log |
| @end example |
| |
| @noindent |
| Please note that this ordering ignores the @emph{results} of required |
| tests, thus the test @file{foo-execute.test} is run even if the test |
| @file{foo-compile.test} failed or was skipped beforehand. Further, |
| please note that specifying such dependencies currently works only for |
| tests that end in one of the suffixes listed in @code{TEST_EXTENSIONS}. |
| |
| Tests without such specified dependencies may be run concurrently with |
| parallel @command{make -j@var{N}}, so be sure they are prepared for |
| concurrent execution. |
| |
| @cindex Unit tests |
| @c Keep in sync with 'parallel-tests-extra-programs.sh'. |
| The combination of lazy test execution and correct dependencies between |
| tests and their sources may be exploited for efficient unit testing |
| during development. To further speed up the edit-compile-test cycle, it |
| may even be useful to specify compiled programs in @code{EXTRA_PROGRAMS} |
| instead of with @code{check_PROGRAMS}, as the former allows intertwined |
| compilation and test execution (but note that @code{EXTRA_PROGRAMS} are |
| not cleaned automatically, @pxref{Uniform}). |
| |
| The variables @code{TESTS} and @code{XFAIL_TESTS} may contain |
| conditional parts as well as configure substitutions. In the latter |
| case, however, certain restrictions apply: substituted test names |
| must end with a nonempty test suffix like @file{.test}, so that one of |
| the inference rules generated by @command{automake} can apply. For |
| literal test names, @command{automake} can generate per-target rules |
| to avoid this limitation. |
| |
| Please note that it is currently not possible to use @code{$(srcdir)/} |
| or @code{$(top_srcdir)/} in the @code{TESTS} variable. This technical |
| limitation is necessary to avoid generating test logs in the source tree |
| and has the unfortunate consequence that it is not possible to specify |
| distributed tests that are themselves generated by means of explicit |
| rules, in a way that is portable to all @command{make} implementations |
| (@pxref{Make Target Lookup,,, autoconf, The Autoconf Manual}, the |
| semantics of FreeBSD and OpenBSD @command{make} conflict with this). |
| In case of doubt you may want to require to use GNU @command{make}, |
| or work around the issue with inference rules to generate the tests. |
| |
| @node Custom Test Drivers |
| @section Custom Test Drivers |
| |
| @menu |
| * Overview of Custom Test Drivers Support:: |
| * Declaring Custom Test Drivers:: |
| * API for Custom Test Drivers:: |
| @end menu |
| |
| @node Overview of Custom Test Drivers Support |
| @subsection Overview of Custom Test Drivers Support |
| |
| Starting from Automake version 1.12, the parallel test harness allows |
| the package authors to use third-party custom test drivers, in case the |
| default ones are inadequate for their purposes, or do not support their |
| testing protocol of choice. |
| |
| A custom test driver is expected to properly run the test programs passed |
| to it (including the command-line arguments passed to those programs, if |
| any), to analyze their execution and outcome, to create the @file{.log} |
| and @file{.trs} files associated to these test runs, and to display the test |
| results on the console. It is responsibility of the author of the test |
| driver to ensure that it implements all the above steps meaningfully and |
| correctly; Automake isn't and can't be of any help here. On the other |
| hand, the Automake-provided code for testsuite summary generation offers |
| support for test drivers allowing several test results per test script, |
| if they take care to register such results properly (@pxref{Log files |
| generation and test results recording}). |
| |
| The exact details of how test scripts' results are to be determined and |
| analyzed is left to the individual drivers. Some drivers might only |
| consider the test script exit status (this is done for example by the |
| default test driver used by the parallel test harness, described |
| in the previous section). Other drivers might implement more complex and |
| advanced test protocols, which might require them to parse and interpreter |
| the output emitted by the test script they're running (examples of such |
| protocols are TAP and SubUnit). |
| |
| It's very important to note that, even when using custom test drivers, |
| most of the infrastructure described in the previous section about the |
| parallel harness remains in place; this includes: |
| |
| @itemize |
| @item |
| list of test scripts defined in @code{TESTS}, and overridable at |
| runtime through the redefinition of @code{TESTS} or @code{TEST_LOGS}; |
| @item |
| concurrency through the use of @command{make}'s option @option{-j}; |
| @item |
| per-test @file{.log} and @file{.trs} files, and generation of a summary |
| @file{.log} file from them; |
| @item |
| @code{recheck} target, @code{RECHECK_LOGS} variable, and lazy reruns |
| of tests; |
| @item |
| inter-test dependencies; |
| @item |
| support for @code{check_*} variables (@code{check_PROGRAMS}, |
| @code{check_LIBRARIES}, ...); |
| @item |
| use of @code{VERBOSE} environment variable to get verbose output on |
| testsuite failures; |
| @item |
| definition and honoring of @code{TESTS_ENVIRONMENT}, |
| @code{AM_TESTS_ENVIRONMENT} and @code{AM_TESTS_FD_REDIRECT} |
| variables; |
| @item |
| definition of generic and extension-specific @code{LOG_COMPILER} and |
| @code{LOG_FLAGS} variables. |
| @end itemize |
| |
| @noindent |
| On the other hand, the exact semantics of how (and if) testsuite output |
| colorization, @code{XFAIL_TESTS}, and hard errors are supported and |
| handled is left to the individual test drivers. |
| |
| @c TODO: We should really add a working example in the doc/ directory, |
| @c TODO: and reference if from here. |
| |
| @node Declaring Custom Test Drivers |
| @subsection Declaring Custom Test Drivers |
| |
| @vindex _LOG_DRIVER |
| @vindex _LOG_DRIVER_FLAGS |
| @vindex LOG_DRIVER |
| @vindex LOG_DRIVER_FLAGS |
| @vindex @var{ext}_LOG_DRIVER |
| @vindex @var{ext}_LOG_DRIVER_FLAGS |
| @vindex AM_@var{ext}_LOG_DRIVER_FLAGS |
| @vindex AM_LOG_DRIVER_FLAGS |
| Custom testsuite drivers are declared by defining the make variables |
| @code{LOG_DRIVER} or @code{@var{ext}_LOG_DRIVER} (where @var{ext} must |
| be declared in @code{TEST_EXTENSIONS}). They must be defined to |
| programs or scripts that will be used to drive the execution, logging, |
| and outcome report of the tests with corresponding extensions (or of |
| those with no registered extension in the case of @code{LOG_DRIVER}). |
| Clearly, multiple distinct test drivers can be declared in the same |
| @file{Makefile.am}. Note moreover that the @code{LOG_DRIVER} variables |
| are @emph{not} a substitute for the @code{LOG_COMPILER} variables: the |
| two sets of variables can, and often do, usefully and legitimately |
| coexist. |
| |
| @c TODO: We should really be able to point to a clarifying example here! |
| |
| The developer-reserved variable @code{AM_LOG_DRIVER_FLAGS} and the |
| user-reserved variable @code{LOG_DRIVER_FLAGS} can be used to define |
| flags that will be passed to each invocation of @code{LOG_DRIVER}, |
| with the user-defined flags obviously taking precedence over the |
| developer-reserved ones. Similarly, for each extension @var{ext} |
| declared in @code{TEST_EXTENSIONS}, flags listed in |
| @code{AM_@var{ext}_LOG_DRIVER_FLAGS} and |
| @code{@var{ext}_LOG_DRIVER_FLAGS} will be passed to |
| invocations of @code{@var{ext}_LOG_DRIVER}. |
| |
| @node API for Custom Test Drivers |
| @subsection API for Custom Test Drivers |
| |
| Note that @emph{the APIs described here are still highly experimental}, |
| and will very likely undergo tightenings and likely also extensive changes |
| in the future, to accommodate for new features or to satisfy additional |
| portability requirements. |
| |
| The main characteristic of these APIs is that they are designed to share |
| as much infrastructure, semantics, and implementation details as possible |
| with the parallel test harness and its default driver. |
| |
| @menu |
| * Command-line arguments for test drivers:: |
| * Log files generation and test results recording:: |
| * Testsuite progress output:: |
| @end menu |
| |
| @node Command-line arguments for test drivers |
| @subsubsection Command-line arguments for test drivers |
| |
| A custom driver can rely on various command-line options and arguments |
| being passed to it automatically by the Automake-generated test harness. |
| It is @emph{mandatory} that it understands all of them (even if the exact |
| interpretation of the associated semantics can legitimately change |
| between a test driver and another, and even be a no-op in some drivers). |
| |
| @noindent |
| Here is the list of options: |
| |
| @table @option |
| @item --test-name=@var{NAME} |
| The name of the test, with VPATH prefix (if any) removed. This can have a |
| suffix and a directory component (as in e.g., @file{sub/foo.test}), and is |
| mostly meant to be used in console reports about testsuite advancements and |
| results (@pxref{Testsuite progress output}). |
| @item --log-file=@file{@var{PATH}.log} |
| The @file{.log} file the test driver must create (@pxref{Basics of |
| test metadata}). If it has a directory component (as in e.g., |
| @file{sub/foo.log}), the test harness will ensure that such directory |
| exists @emph{before} the test driver is called. |
| @item --trs-file=@file{@var{PATH}.trs} |
| The @file{.trs} file the test driver must create (@pxref{Basics of |
| test metadata}). If it has a directory component (as in e.g., |
| @file{sub/foo.trs}), the test harness will ensure that such directory |
| exists @emph{before} the test driver is called. |
| @item --color-tests=@{yes|no@} |
| Whether the console output should be colorized or not (@pxref{Simple |
| tests and color-tests}, to learn when this option gets activated and |
| when it doesn't). |
| @item --expect-failure=@{yes|no@} |
| Whether the tested program is expected to fail. |
| @item --enable-hard-errors=@{yes|no@} |
| Whether ``hard errors'' in the tested program should be treated differently |
| from normal failures or not (the default should be @code{yes}). The exact |
| meaning of ``hard error'' is highly dependent from the test protocols or |
| conventions in use. |
| @item -- |
| Explicitly terminate the list of options. |
| @end table |
| |
| @noindent |
| The first non-option argument passed to the test driver is the program to |
| be run, and all the following ones are command-line options and arguments |
| for this program. |
| |
| Note that the exact semantics attached to the @option{--color-tests}, |
| @option{--expect-failure} and @option{--enable-hard-errors} options are |
| left up to the individual test drivers. Still, having a behaviour |
| compatible or at least similar to that provided by the default driver |
| is advised, as that would offer a better consistency and a more pleasant |
| user experience. |
| |
| @node Log files generation and test results recording |
| @subsubsection Log files generation and test results recording |
| |
| The test driver must correctly generate the files specified by the |
| @option{--log-file} and @option{--trs-file} option (even when the tested |
| program fails or crashes). |
| |
| The @file{.log} file should ideally contain all the output produced by the |
| tested program, plus optionally other information that might facilitate |
| debugging or analysis of bug reports. Apart from that, its format is |
| basically free. |
| |
| The @file{.trs} file is used to register some metadata through the use |
| of custom reStructuredText fields. This metadata is expected to be |
| employed in various ways by the parallel test harness; for example, to |
| count the test results when printing the testsuite summary, or to decide |
| which tests to re-run upon @command{make recheck}. Unrecognized metadata |
| in a @file{.trs} file is currently ignored by the harness, but this might |
| change in the future. The list of currently recognized metadata follows. |
| |
| @table @code |
| |
| @item :test-result: |
| @cindex Register test result |
| @cindex Register test case result |
| @cindex Test result, registering |
| @cindex Test case result, registering |
| @cindex @code{:test-result:} |
| @cindex reStructuredText field, @code{:test-result:} |
| The test driver must use this field to register the results of @emph{each} |
| test case run by a test script file. Several @code{:test-result:} fields |
| can be present in the same @file{.trs} file; this is done in order to |
| support test protocols that allow a single test script to run more test |
| cases. |
| |
| @c Keep this in sync with lib/am/check-am:$(TEST_SUITE_LOG). |
| The only recognized test results are currently @code{PASS}, @code{XFAIL}, |
| @code{SKIP}, @code{FAIL}, @code{XPASS} and @code{ERROR}. These results, |
| when declared with @code{:test-result:}, can be optionally followed by |
| text holding the name and/or a brief description of the corresponding |
| test; the harness will ignore such extra text when generating |
| @file{test-suite.log} and preparing the testsuite summary. |
| |
| @c Keep in sync with 'test-metadata-recheck.sh'. |
| @item @code{:recheck:} |
| @cindex :recheck: |
| @cindex reStructuredText field, @code{:recheck:} |
| If this field is present and defined to @code{no}, then the corresponding |
| test script will @emph{not} be run upon a @command{make recheck}. What |
| happens when two or more @code{:recheck:} fields are present in the same |
| @file{.trs} file is undefined behaviour. |
| |
| @c Keep in sync with 'test-metadata-global-log.sh'. |
| @item @code{:copy-in-global-log:} |
| @cindex :copy-in-global-log: |
| @cindex reStructuredText field, @code{:copy-in-global-log:} |
| If this field is present and defined to @code{no}, then the content |
| of the @file{.log} file will @emph{not} be copied into the global |
| @file{test-suite.log}. We allow to forsake such copying because, while |
| it can be useful in debugging and analysis of bug report, it can also be |
| just a waste of space in normal situations, e.g., when a test script is |
| successful. What happens when two or more @code{:copy-in-global-log:} |
| fields are present in the same @file{.trs} file is undefined behaviour. |
| |
| @c Keep in sync with 'test-metadata-global-result.sh'. |
| @item @code{:test-global-result:} |
| @cindex :test-global-result: |
| @cindex reStructuredText field, @code{:test-global-result:} |
| This is used to declare the "global result" of the script. Currently, |
| the value of this field is needed only to be reported (more or less |
| verbatim) in the generated global log file @code{$(TEST_SUITE_LOG)}, |
| so it's quite free-form. For example, a test script which run 10 test |
| cases, 6 of which pass and 4 of which are skipped, could reasonably have |
| a @code{PASS/SKIP} value for this field, while a test script which run |
| 19 successful tests and one failed test could have an @code{ALMOST |
| PASSED} value. What happens when two or more @code{:test-global-result:} |
| fields are present in the same @file{.trs} file is undefined behaviour. |
| @end table |
| |
| @noindent |
| Let's see a small example. Assume a @file{.trs} file contains the |
| following lines: |
| |
| @example |
| :test-result: PASS server starts |
| :global-log-copy: no |
| :test-result: PASS HTTP/1.1 request |
| :test-result: FAIL HTTP/1.0 request |
| :recheck: yes |
| :test-result: SKIP HTTPS request (TLS library wasn't available) |
| :test-result: PASS server stops |
| @end example |
| |
| @noindent |
| Then the corresponding test script will be re-run by @command{make check}, |
| will contribute with @emph{five} test results to the testsuite summary |
| (three of these tests being successful, one failed, and one skipped), and |
| the content of the corresponding @file{.log} file will @emph{not} be |
| copied in the global log file @file{test-suite.log}. |
| |
| @node Testsuite progress output |
| @subsubsection Testsuite progress output |
| |
| A custom test driver also has the task of displaying, on the standard |
| output, the test results as soon as they become available. Depending on |
| the protocol in use, it can also display the reasons for failures and |
| skips, and, more generally, any useful diagnostic output (but remember |
| that each line on the screen is precious, so that cluttering the screen |
| with overly verbose information is bad idea). The exact format of this |
| progress output is left up to the test driver; in fact, a custom test |
| driver might @emph{theoretically} even decide not to do any such report, |
| leaving it all to the testsuite summary (that would be a very lousy idea, |
| of course, and serves only to illustrate the flexibility that is |
| granted here). |
| |
| Remember that consistency is good; so, if possible, try to be consistent |
| with the output of the built-in Automake test drivers, providing a similar |
| ``look & feel''. In particular, the testsuite progress output should be |
| colorized when the @option{--color-tests} is passed to the driver. On the |
| other end, if you are using a known and widespread test protocol with |
| well-established implementations, being consistent with those |
| implementations' output might be a good idea too. |
| |
| @node Using the TAP test protocol |
| @section Using the TAP test protocol |
| |
| @menu |
| * Introduction to TAP:: |
| * Use TAP with the Automake test harness:: |
| * Incompatibilities with other TAP parsers and drivers:: |
| * Links and external resources on TAP:: |
| @end menu |
| |
| @node Introduction to TAP |
| @subsection Introduction to TAP |
| |
| TAP, the Test Anything Protocol, is a simple text-based interface between |
| testing modules or programs and a test harness. The tests (also called |
| ``TAP producers'' in this context) write test results in a simple format |
| on standard output; a test harness (also called ``TAP consumer'') will |
| parse and interpret these results, and properly present them to the user, |
| and/or register them for later analysis. The exact details of how this |
| is accomplished can vary among different test harnesses. The Automake |
| harness will present the results on the console in the usual |
| fashion (@pxref{Testsuite progress on console}), and will use the |
| @file{.trs} files (@pxref{Basics of test metadata}) to store the test |
| results and related metadata. Apart from that, it will try to remain |
| as much compatible as possible with pre-existing and widespread utilities, |
| such as the @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove, |
| @command{prove} utility}, at least for the simpler usages. |
| |
| TAP started its life as part of the test harness for Perl, but today |
| it has been (mostly) standardized, and has various independent |
| implementations in different languages; among them, C, C++, Perl, |
| Python, PHP, and Java. For a semi-official specification of the |
| TAP protocol, please refer to the documentation of |
| @uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod, |
| @samp{Test::Harness::TAP}}. |
| |
| The most relevant real-world usages of TAP are obviously in the testsuites |
| of @command{perl} and of many perl modules. Still, also other important |
| third-party packages, such as @uref{http://git-scm.com/, @command{git}}, |
| use TAP in their testsuite. |
| |
| @node Use TAP with the Automake test harness |
| @subsection Use TAP with the Automake test harness |
| |
| Currently, the TAP driver that comes with Automake requires some by-hand |
| steps on the developer's part (this situation should hopefully be improved |
| in future Automake versions). You'll have to grab the @file{tap-driver.sh} |
| script from the Automake distribution by hand, copy it in your source tree, |
| and use the Automake support for third-party test drivers to instruct the |
| harness to use the @file{tap-driver.sh} script and the awk program found |
| by @code{AM_INIT_AUTOMAKE} to run your TAP-producing tests. See the example |
| below for clarification. |
| |
| Apart from the options common to all the Automake test drivers |
| (@pxref{Command-line arguments for test drivers}), the @file{tap-driver.sh} |
| supports the following options, whose names are chosen for enhanced |
| compatibility with the @command{prove} utility. |
| |
| @table @option |
| @c Keep in sync with 'tap-exit.sh' and 'tap-signal.tap'. |
| @item --ignore-exit |
| Causes the test driver to ignore the exit status of the test scripts; |
| by default, the driver will report an error if the script exits with a |
| non-zero status. This option has effect also on non-zero exit statuses |
| due to termination by a signal. |
| @item --comments |
| Instruct the test driver to display TAP diagnostic (i.e., lines beginning |
| with the @samp{#} character) in the testsuite progress output too; by |
| default, TAP diagnostic is only copied to the @file{.log} file. |
| @item --no-comments |
| Revert the effects of @option{--comments}. |
| @item --merge |
| Instruct the test driver to merge the test scripts' standard error into |
| their standard output. This is necessary if you want to ensure that |
| diagnostics from the test scripts are displayed in the correct order |
| relative to test results; this can be of great help in debugging |
| (especially if your test scripts are shell scripts run with shell |
| tracing active). As a downside, this option might cause the test |
| harness to get confused if anything that appears on standard error |
| looks like a test result. |
| @item --no-merge |
| Revert the effects of @option{--merge}. |
| @item --diagnostic-string=@var{STRING} |
| Change the string that introduces TAP diagnostic from the default value |
| of ``@code{#}'' to @code{@var{STRING}}. This can be useful if your |
| TAP-based test scripts produce verbose output on which they have limited |
| control (because, say, the output comes from other tools invoked in the |
| scripts), and it might contain text that gets spuriously interpreted as |
| TAP diagnostic: such an issue can be solved by redefining the string that |
| activates TAP diagnostic to a value you know won't appear by chance in |
| the tests' output. Note however that this feature is non-standard, as |
| the ``official'' TAP protocol does not allow for such a customization; so |
| don't use it if you can avoid it. |
| @end table |
| |
| @noindent |
| Here is an example of how the TAP driver can be set up and used. |
| |
| @c Keep in sync with tap-doc2.sh |
| @example |
| % @kbd{cat configure.ac} |
| AC_INIT([GNU Try Tap], [1.0], [bug-automake@@gnu.org]) |
| AC_CONFIG_AUX_DIR([build-aux]) |
| AM_INIT_AUTOMAKE([foreign -Wall -Werror]) |
| AC_CONFIG_FILES([Makefile]) |
| AC_REQUIRE_AUX_FILE([tap-driver.sh]) |
| AC_OUTPUT |
| |
| % @kbd{cat Makefile.am} |
| TEST_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \ |
| $(top_srcdir)/build-aux/tap-driver.sh |
| TESTS = foo.test bar.test baz.test |
| EXTRA_DIST = $(TESTS) |
| |
| % @kbd{cat foo.test} |
| #!/bin/sh |
| echo 1..4 # Number of tests to be executed. |
| echo 'ok 1 - Swallows fly' |
| echo 'not ok 2 - Caterpillars fly # TODO metamorphosis in progress' |
| echo 'ok 3 - Pigs fly # SKIP not enough acid' |
| echo '# I just love word plays ...' |
| echo 'ok 4 - Flies fly too :-)' |
| |
| % @kbd{cat bar.test} |
| #!/bin/sh |
| echo 1..3 |
| echo 'not ok 1 - Bummer, this test has failed.' |
| echo 'ok 2 - This passed though.' |
| echo 'Bail out! Ennui kicking in, sorry...' |
| echo 'ok 3 - This will not be seen.' |
| |
| % @kbd{cat baz.test} |
| #!/bin/sh |
| echo 1..1 |
| echo ok 1 |
| # Exit with error, even if all the tests have been successful. |
| exit 7 |
| |
| % @kbd{cp @var{PREFIX}/share/automake-@var{APIVERSION}/tap-driver.sh .} |
| % @kbd{autoreconf -vi && ./configure && make check} |
| ... |
| PASS: foo.test 1 - Swallows fly |
| XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress |
| SKIP: foo.test 3 - Pigs fly # SKIP not enough acid |
| PASS: foo.test 4 - Flies fly too :-) |
| FAIL: bar.test 1 - Bummer, this test has failed. |
| PASS: bar.test 2 - This passed though. |
| ERROR: bar.test - Bail out! Ennui kicking in, sorry... |
| PASS: baz.test 1 |
| ERROR: baz.test - exited with status 7 |
| ... |
| Please report to bug-automake@@gnu.org |
| ... |
| % @kbd{echo exit status: $?} |
| exit status: 1 |
| |
| @c Keep the "skewed" indentation below, it produces pretty PDF output. |
| % @kbd{env TEST_LOG_DRIVER_FLAGS='--comments --ignore-exit' \ |
| TESTS='foo.test baz.test' make -e check} |
| ... |
| PASS: foo.test 1 - Swallows fly |
| XFAIL: foo.test 2 - Caterpillars fly # TODO metamorphosis in progress |
| SKIP: foo.test 3 - Pigs fly # SKIP not enough acid |
| # foo.test: I just love word plays... |
| PASS: foo.test 4 - Flies fly too :-) |
| PASS: baz.test 1 |
| ... |
| % @kbd{echo exit status: $?} |
| exit status: 0 |
| @end example |
| |
| @node Incompatibilities with other TAP parsers and drivers |
| @subsection Incompatibilities with other TAP parsers and drivers |
| |
| For implementation or historical reasons, the TAP driver and harness as |
| implemented by Automake have some minors incompatibilities with the |
| mainstream versions, which you should be aware of. |
| |
| @itemize @bullet |
| @item |
| A @code{Bail out!} directive doesn't stop the whole testsuite, but only |
| the test script it occurs in. This doesn't follow TAP specifications, |
| but on the other hand it maximizes compatibility (and code sharing) with |
| the ``hard error'' concept of the default testsuite driver. |
| @item |
| The @code{version} and @code{pragma} directives are not supported. |
| @item |
| The @option{--diagnostic-string} option of our driver allows to modify |
| the string that introduces TAP diagnostic from the default value |
| of ``@code{#}''. The standard TAP protocol has currently no way to |
| allow this, so if you use it your diagnostic will be lost to more |
| compliant tools like @command{prove} and @code{Test::Harness} |
| @item |
| And there are probably some other small and yet undiscovered |
| incompatibilities, especially in corner cases or with rare usages. |
| @end itemize |
| |
| @node Links and external resources on TAP |
| @subsection Links and external resources on TAP |
| |
| @noindent |
| Here are some links to more extensive official or third-party |
| documentation and resources about the TAP protocol and related |
| tools and libraries. |
| @itemize @bullet |
| @item |
| @uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod, |
| @samp{Test::Harness::TAP}}, |
| the (mostly) official documentation about the TAP format and protocol. |
| @item |
| @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove, |
| @command{prove}}, |
| the most famous command-line TAP test driver, included in the distribution |
| of @command{perl} and |
| @uref{http://search.cpan.org/~andya/Test-Harness/lib/Test/Harness.pm, |
| @samp{Test::Harness}}. |
| @item |
| The @uref{http://testanything.org/wiki/index.php/Main_Page,TAP wiki}. |
| @item |
| A ``gentle introduction'' to testing for perl coders: |
| @uref{http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod, |
| @samp{Test::Tutorial}}. |
| @item |
| @uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/Simple.pm, |
| @samp{Test::Simple}} |
| and |
| @uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/More.pm, |
| @samp{Test::More}}, |
| the standard perl testing libraries, which are based on TAP. |
| @item |
| @uref{http://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness}, |
| a C-based project implementing both a TAP producer and a TAP consumer. |
| @item |
| @uref{http://www.tap4j.org/,tap4j}, |
| a Java-based project implementing both a TAP producer and a TAP consumer. |
| @end itemize |
| |
| @node DejaGnu Tests |
| @section DejaGnu Tests |
| |
| If @uref{https://ftp.gnu.org/gnu/dejagnu/, @command{dejagnu}} appears in |
| @code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based test suite is |
| assumed. The variable @code{DEJATOOL} is a list of names that are |
| passed, one at a time, as the @option{--tool} argument to |
| @command{runtest} invocations; it defaults to the name of the package. |
| |
| The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and |
| @option{--srcdir} flags that are passed to dejagnu by default; this can be |
| overridden if necessary. |
| @vindex RUNTESTDEFAULTFLAGS |
| |
| The variables @code{EXPECT} and @code{RUNTEST} can |
| also be overridden to provide project-specific values. For instance, |
| you will need to do this if you are testing a compiler toolchain, |
| because the default values do not take into account host and target |
| names. |
| @opindex dejagnu |
| @vindex DEJATOOL |
| @vindex EXPECT |
| @vindex RUNTEST |
| |
| The contents of the variable @code{RUNTESTFLAGS} are passed to the |
| @code{runtest} invocation. This is considered a ``user variable'' |
| (@pxref{User Variables}). If you need to set @command{runtest} flags in |
| @file{Makefile.am}, you can use @code{AM_RUNTESTFLAGS} instead. |
| @vindex RUNTESTFLAGS |
| @vindex AM_RUNTESTFLAGS |
| |
| @cindex @file{site.exp} |
| Automake will generate rules to create a local @file{site.exp} file, |
| defining various variables detected by @command{configure}. This file |
| is automatically read by DejaGnu. It is OK for the user of a package |
| to edit this file in order to tune the test suite. However this is |
| not the place where the test suite author should define new variables: |
| this should be done elsewhere in the real test suite code. |
| Especially, @file{site.exp} should not be distributed. |
| |
| Still, if the package author has legitimate reasons to extend |
| @file{site.exp} at @command{make} time, he can do so by defining |
| the variable @code{EXTRA_DEJAGNU_SITE_CONFIG}; the files listed |
| there will be considered @file{site.exp} prerequisites, and their |
| content will be appended to it (in the same order in which they |
| appear in @code{EXTRA_DEJAGNU_SITE_CONFIG}). Note that files are |
| @emph{not} distributed by default. |
| |
| For more information regarding DejaGnu test suites, see @ref{Top, , , |
| dejagnu, The DejaGnu Manual}. |
| |
| @node Install Tests |
| @section Install Tests |
| |
| The @code{installcheck} target is available to the user as a way to |
| run any tests after the package has been installed. You can add tests |
| to this by writing an @code{installcheck-local} rule. |
| |
| |
| @node Rebuilding |
| @chapter Rebuilding Makefiles |
| @cindex rebuild rules |
| |
| Automake generates rules to automatically rebuild @file{Makefile}s, |
| @file{configure}, and other derived files like @file{Makefile.in}. |
| |
| @acindex AM_MAINTAINER_MODE |
| If you are using @code{AM_MAINTAINER_MODE} in @file{configure.ac}, then |
| these automatic rebuilding rules are only enabled in maintainer mode. |
| |
| @vindex CONFIG_STATUS_DEPENDENCIES |
| @vindex CONFIGURE_DEPENDENCIES |
| @cindex @file{version.sh}, example |
| @cindex @file{version.m4}, example |
| |
| Sometimes it is convenient to supplement the rebuild rules for |
| @file{configure} or @file{config.status} with additional dependencies. |
| The variables @code{CONFIGURE_DEPENDENCIES} and |
| @code{CONFIG_STATUS_DEPENDENCIES} can be used to list these extra |
| dependencies. These variables should be defined in all |
| @file{Makefile}s of the tree (because these two rebuild rules are |
| output in all them), so it is safer and easier to @code{AC_SUBST} them |
| from @file{configure.ac}. For instance, the following statement will |
| cause @file{configure} to be rerun each time @file{version.sh} is |
| changed. |
| |
| @c Keep in sync with remake-config-status-dependencies.sh |
| @example |
| AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/version.sh']) |
| @end example |
| |
| @noindent |
| Note the @samp{$(top_srcdir)/} in the file name. Since this variable |
| is to be used in all @file{Makefile}s, its value must be sensible at |
| any level in the build hierarchy. |
| |
| Beware not to mistake @code{CONFIGURE_DEPENDENCIES} for |
| @code{CONFIG_STATUS_DEPENDENCIES}. |
| |
| @c Keep in sync with remake-configure-dependencies.sh |
| @code{CONFIGURE_DEPENDENCIES} adds dependencies to the |
| @file{configure} rule, whose effect is to run @command{autoconf}. This |
| variable should be seldom used, because @command{automake} already tracks |
| @code{m4_include}d files. However it can be useful when playing |
| tricky games with @code{m4_esyscmd} or similar non-recommendable |
| macros with side effects. Be also aware that interactions of this |
| variable with the @ref{Autom4te Cache, , autom4te cache, autoconf, |
| The Autoconf Manual} are quite problematic and can cause subtle |
| breakage, so you might want to disable the cache if you want to use |
| @code{CONFIGURE_DEPENDENCIES}. |
| |
| @code{CONFIG_STATUS_DEPENDENCIES} adds dependencies to the |
| @file{config.status} rule, whose effect is to run @file{configure}. |
| This variable should therefore carry any non-standard source that may |
| be read as a side effect of running @command{configure}, like @file{version.sh} |
| in the example above. |
| |
| Speaking of @file{version.sh} scripts, we recommend against them |
| today. They are mainly used when the version of a package is updated |
| automatically by a script (e.g., in daily builds). Here is what some |
| old-style @file{configure.ac}s may look like: |
| |
| @example |
| AC_INIT |
| . $srcdir/version.sh |
| AM_INIT_AUTOMAKE([name], $VERSION_NUMBER) |
| @dots{} |
| @end example |
| |
| @noindent |
| Here, @file{version.sh} is a shell fragment that sets |
| @code{VERSION_NUMBER}. The problem with this example is that |
| @command{automake} cannot track dependencies (listing @file{version.sh} |
| in @command{CONFIG_STATUS_DEPENDENCIES}, and distributing this file is up |
| to the user), and that it uses the obsolete form of @code{AC_INIT} and |
| @code{AM_INIT_AUTOMAKE}. Upgrading to the new syntax is not |
| straightforward, because shell variables are not allowed in |
| @code{AC_INIT}'s arguments. We recommend that @file{version.sh} be |
| replaced by an M4 file that is included by @file{configure.ac}: |
| |
| @example |
| m4_include([version.m4]) |
| AC_INIT([name], VERSION_NUMBER) |
| AM_INIT_AUTOMAKE |
| @dots{} |
| @end example |
| |
| @noindent |
| Here @file{version.m4} could contain something like |
| @samp{m4_define([VERSION_NUMBER], [1.2])}. The advantage of this |
| second form is that @command{automake} will take care of the |
| dependencies when defining the rebuild rule, and will also distribute |
| the file automatically. An inconvenience is that @command{autoconf} |
| will now be rerun each time the version number is bumped, when only |
| @file{configure} had to be rerun in the previous setup. |
| |
| |
| @node Options |
| @chapter Changing Automake's Behavior |
| |
| @menu |
| * Options generalities:: Semantics of Automake option |
| * List of Automake options:: A comprehensive list of Automake options |
| @end menu |
| |
| @node Options generalities |
| @section Options generalities |
| |
| Various features of Automake can be controlled by options. Except where |
| noted otherwise, options can be specified in one of several ways. Most |
| options can be applied on a per-@file{Makefile} basis when listed in a |
| special @file{Makefile} variable named @code{AUTOMAKE_OPTIONS}. Some |
| of these options only make sense when specified in the toplevel |
| @file{Makefile.am} file. Options are applied globally to all processed |
| @file{Makefile} files when listed in the first argument of |
| @code{AM_INIT_AUTOMAKE} in @file{configure.ac}, and some options which |
| require changes to the @command{configure} script can only be specified |
| there. These are annotated below. |
| |
| As a general rule, options specified in @code{AUTOMAKE_OPTIONS} take |
| precedence over those specified in @code{AM_INIT_AUTOMAKE}, which in |
| turn take precedence over those specified on the command line. |
| |
| Also, some care must be taken about the interactions among strictness |
| level and warning categories. As a general rule, strictness-implied |
| warnings are overridden by those specified by explicit options. For |
| example, even if @samp{portability} warnings are disabled by default |
| in @option{foreign} strictness, an usage like this will end up enabling |
| them: |
| |
| @example |
| AUTOMAKE_OPTIONS = -Wportability foreign |
| @end example |
| |
| However, a strictness level specified in a higher-priority context |
| will override all the explicit warnings specified in a lower-priority |
| context. For example, if @file{configure.ac} contains: |
| |
| @example |
| AM_INIT_AUTOMAKE([-Wportability]) |
| @end example |
| |
| @noindent |
| and @file{Makefile.am} contains: |
| |
| @example |
| AUTOMAKE_OPTIONS = foreign |
| @end example |
| |
| @noindent |
| then @samp{portability} warnings will be @emph{disabled} in |
| @file{Makefile.am}. |
| |
| @node List of Automake options |
| @section List of Automake options |
| |
| @vindex AUTOMAKE_OPTIONS |
| |
| @table @asis |
| @item @option{gnits} |
| @itemx @option{gnu} |
| @itemx @option{foreign} |
| @cindex Option, @option{gnits} |
| @cindex Option, @option{gnu} |
| @cindex Option, @option{foreign} |
| @opindex gnits |
| @opindex gnu |
| @opindex foreign |
| |
| Set the strictness as appropriate. The @option{gnits} option also |
| implies options @option{readme-alpha} and @option{check-news}. |
| |
| @item @option{check-news} |
| @cindex Option, @option{check-news} |
| @opindex check-news |
| Cause @samp{make dist} to fail unless the current version number appears |
| in the first few lines of the @file{NEWS} file. |
| |
| @item @option{dejagnu} |
| @cindex Option, @option{dejagnu} |
| @opindex dejagnu |
| Cause @command{dejagnu}-specific rules to be generated. @xref{DejaGnu Tests}. |
| |
| @item @option{dist-bzip2} |
| @cindex Option, @option{dist-bzip2} |
| @opindex dist-bzip2 |
| Hook @code{dist-bzip2} to @code{dist}. |
| @trindex dist-bzip2 |
| |
| @item @option{dist-lzip} |
| @cindex Option, @option{dist-lzip} |
| @opindex dist-lzip |
| Hook @code{dist-lzip} to @code{dist}. |
| @trindex dist-lzip |
| |
| @item @option{dist-xz} |
| @cindex Option, @option{dist-xz} |
| @opindex dist-xz |
| Hook @code{dist-xz} to @code{dist}. |
| @trindex dist-xz |
| |
| @item @option{dist-zip} |
| @cindex Option, @option{dist-zip} |
| @opindex dist-zip |
| Hook @code{dist-zip} to @code{dist}. |
| @trindex dist-zip |
| |
| @item @option{dist-shar} |
| @cindex Option, @option{dist-shar} |
| @opindex dist-shar |
| Hook @code{dist-shar} to @code{dist}. Use of this option |
| is deprecated, as the @samp{shar} format is obsolescent and |
| problematic. Support for it will be removed altogether in |
| Automake 2.0. |
| @trindex dist-shar |
| |
| @item @option{dist-tarZ} |
| @cindex Option, @option{dist-tarZ} |
| @opindex dist-tarZ |
| Hook @code{dist-tarZ} to @code{dist}. Use of this option |
| is deprecated, as the @samp{compress} program is obsolete. |
| Support for it will be removed altogether in Automake 2.0. |
| @trindex dist-tarZ |
| |
| @item @option{filename-length-max=99} |
| @cindex Option, @option{filename-length-max=99} |
| @opindex filename-length-max=99 |
| Abort if file names longer than 99 characters are found during |
| @samp{make dist}. Such long file names are generally considered not to |
| be portable in tarballs. See the @option{tar-v7} and @option{tar-ustar} |
| options below. This option should be used in the top-level |
| @file{Makefile.am} or as an argument of @code{AM_INIT_AUTOMAKE} in |
| @file{configure.ac}, it will be ignored otherwise. It will also be |
| ignored in sub-packages of nested packages (@pxref{Subpackages}). |
| |
| @item @option{info-in-builddir} |
| @cindex Option, @option{info-in-builddir} |
| @opindex info-in-builddir |
| Instruct Automake to place the generated @file{.info} files in the |
| @code{builddir} rather than in the @code{srcdir}. Note that this |
| might make VPATH builds with some non-GNU make implementations more |
| brittle. |
| |
| @item @option{no-define} |
| @cindex Option, @option{no-define} |
| @opindex no-define |
| This option is meaningful only when passed as an argument to |
| @code{AM_INIT_AUTOMAKE}. It will prevent the @code{PACKAGE} and |
| @code{VERSION} variables from being @code{AC_DEFINE}d. But notice |
| that they will remain defined as shell variables in the generated |
| @code{configure}, and as make variables in the generated |
| @code{Makefile}; this is deliberate, and required for backward |
| compatibility. |
| |
| @item @option{no-dependencies} |
| @cindex Option, @option{no-dependencies} |
| @opindex no-dependencies |
| This is similar to using @option{--ignore-deps} on the command line, |
| but is useful for those situations where you don't have the necessary |
| bits to make automatic dependency tracking work |
| (@pxref{Dependencies}). In this case the effect is to effectively |
| disable automatic dependency tracking. |
| |
| @item @option{no-dist} |
| @cindex Option, @option{no-dist} |
| @opindex no-dist |
| Don't emit any code related to @code{dist} target. This is useful |
| when a package has its own method for making distributions. |
| |
| @item @option{no-dist-gzip} |
| @cindex Option, @option{no-dist-gzip} |
| @opindex no-dist-gzip |
| Do not hook @code{dist-gzip} to @code{dist}. |
| @trindex no-dist-gzip |
| |
| @item @option{no-exeext} |
| @cindex Option, @option{no-exeext} |
| @opindex no-exeext |
| If your @file{Makefile.am} defines a rule for target @code{foo}, it |
| will override a rule for a target named @samp{foo$(EXEEXT)}. This is |
| necessary when @code{EXEEXT} is found to be empty. However, by |
| default @command{automake} will generate an error for this use. The |
| @option{no-exeext} option will disable this error. This is intended for |
| use only where it is known in advance that the package will not be |
| ported to Windows, or any other operating system using extensions on |
| executables. |
| |
| @item @option{no-installinfo} |
| @cindex Option, @option{no-installinfo} |
| @opindex no-installinfo |
| The generated @file{Makefile.in} will not cause info pages to be built |
| or installed by default. However, @code{info} and @code{install-info} |
| targets will still be available. This option is disallowed at |
| @option{gnu} strictness and above. |
| @trindex info |
| @trindex install-info |
| |
| @item @option{no-installman} |
| @cindex Option, @option{no-installman} |
| @opindex no-installman |
| The generated @file{Makefile.in} will not cause man pages to be |
| installed by default. However, an @code{install-man} target will still |
| be available for optional installation. This option is disallowed at |
| @option{gnu} strictness and above. |
| @trindex install-man |
| |
| @item @option{nostdinc} |
| @cindex Option, @option{nostdinc} |
| @opindex nostdinc |
| This option can be used to disable the standard @option{-I} options that |
| are ordinarily automatically provided by Automake. |
| |
| @item @option{no-texinfo.tex} |
| @cindex Option, @option{no-texinfo.tex} |
| @opindex no-texinfo.tex |
| Don't require @file{texinfo.tex}, even if there are texinfo files in |
| this directory. |
| |
| @item @option{serial-tests} |
| @cindex Option, @option{serial-tests} |
| @opindex serial-tests |
| Enable the older serial test suite harness for @code{TESTS} (@pxref{Serial |
| Test Harness}, for more information). |
| |
| @item @option{parallel-tests} |
| @cindex Option, @option{parallel-tests} |
| @opindex parallel-tests |
| Enable test suite harness for @code{TESTS} that can run tests in parallel |
| (@pxref{Parallel Test Harness}, for more information). This option is |
| only kept for backward-compatibility, since the parallel test harness is |
| the default now. |
| |
| @item @option{readme-alpha} |
| @cindex Option, @option{readme-alpha} |
| @opindex readme-alpha |
| If this release is an alpha release, and the file @file{README-alpha} |
| exists, then it will be added to the distribution. If this option is |
| given, version numbers are expected to follow one of two forms. The |
| first form is @samp{@var{major}.@var{minor}.@var{alpha}}, where each |
| element is a number; the final period and number should be left off for |
| non-alpha releases. The second form is |
| @samp{@var{major}.@var{minor}@var{alpha}}, where @var{alpha} is a |
| letter; it should be omitted for non-alpha releases. |
| |
| @item @option{std-options} |
| @cindex Options, @option{std-options} |
| @cindex @samp{make installcheck}, testing @option{--help} and @option{--version} |
| @cindex @option{--help} check |
| @cindex @option{--version} check |
| @opindex std-options |
| |
| Make the @code{installcheck} rule check that installed scripts and |
| programs support the @option{--help} and @option{--version} options. |
| This also provides a basic check that the program's |
| run-time dependencies are satisfied after installation. |
| |
| @vindex AM_INSTALLCHECK_STD_OPTIONS_EXEMPT |
| In a few situations, programs (or scripts) have to be exempted from this |
| test. For instance, @command{false} (from GNU coreutils) is never |
| successful, even for @option{--help} or @option{--version}. You can list |
| such programs in the variable @code{AM_INSTALLCHECK_STD_OPTIONS_EXEMPT}. |
| Programs (not scripts) listed in this variable should be suffixed by |
| @samp{$(EXEEXT)} for the sake of Windows or OS/2. For instance, suppose we |
| build @file{false} as a program but @file{true.sh} as a script, and that |
| neither of them support @option{--help} or @option{--version}: |
| |
| @example |
| AUTOMAKE_OPTIONS = std-options |
| bin_PROGRAMS = false ... |
| bin_SCRIPTS = true.sh ... |
| AM_INSTALLCHECK_STD_OPTIONS_EXEMPT = false$(EXEEXT) true.sh |
| @end example |
| |
| @item @option{subdir-objects} |
| @cindex Options, @option{subdir-objects} |
| @opindex subdir-objects |
| If this option is specified, then objects are placed into the |
| subdirectory of the build directory corresponding to the subdirectory of |
| the source file. For instance, if the source file is |
| @file{subdir/file.cxx}, then the output file would be |
| @file{subdir/file.o}. |
| |
| @anchor{tar-formats} |
| @item @option{tar-v7} |
| @itemx @option{tar-ustar} |
| @itemx @option{tar-pax} |
| @cindex Option, @option{tar-v7} |
| @cindex Option, @option{tar-ustar} |
| @cindex Option, @option{tar-pax} |
| @cindex @command{tar} formats |
| @cindex v7 @command{tar} format |
| @cindex ustar format |
| @cindex pax format |
| @opindex tar-v7 |
| @opindex tar-ustar |
| @opindex tar-pax |
| |
| These three mutually exclusive options select the tar format to use |
| when generating tarballs with @samp{make dist}. (The tar file created |
| is then compressed according to the set of @option{no-dist-gzip}, |
| @option{dist-bzip2}, @option{dist-lzip}, @option{dist-xz} and |
| @option{dist-tarZ} options in use.) |
| |
| These options must be passed as arguments to @code{AM_INIT_AUTOMAKE} |
| (@pxref{Macros}) because they can require additional configure checks. |
| Automake will complain if it sees such options in an |
| @code{AUTOMAKE_OPTIONS} variable. |
| |
| @option{tar-v7} selects the old V7 tar format. This is the historical |
| default. This antiquated format is understood by all tar |
| implementations and supports file names with up to 99 characters. When |
| given longer file names some tar implementations will diagnose the |
| problem while other will generate broken tarballs or use non-portable |
| extensions. Furthermore, the V7 format cannot store empty |
| directories. When using this format, consider using the |
| @option{filename-length-max=99} option to catch file names too long. |
| |
| @option{tar-ustar} selects the ustar format defined by POSIX |
| 1003.1-1988. This format is old enough to be portable: |
| As of 2018, it is supported by the native @code{tar} command on |
| GNU, FreeBSD, NetBSD, OpenBSD, AIX, HP-UX, Solaris, at least. |
| It fully supports empty directories. It can store file names with up |
| to 256 characters, provided that the file name can be split at |
| directory separator in two parts, first of them being at most 155 |
| bytes long. So, in most cases the maximum file name length will be |
| shorter than 256 characters. |
| |
| @option{tar-pax} selects the new pax interchange format defined by POSIX |
| 1003.1-2001. It does not limit the length of file names. However, |
| this format is very young and should probably be restricted to |
| packages that target only very modern platforms. |
| As of 2018, this format is supported by the native @code{tar} command only |
| on GNU, FreeBSD, OpenBSD system; it is not supported by the native |
| @code{tar} command on NetBSD, AIX, HP-UX, Solaris. |
| There are moves to |
| change the pax format in an upward-compatible way, so this option may |
| refer to a more recent version in the future. |
| |
| @xref{Formats, , Controlling the Archive Format, tar, GNU Tar}, for |
| further discussion about tar formats. |
| |
| @command{configure} knows several ways to construct these formats. It |
| will not abort if it cannot find a tool up to the task (so that the |
| package can still be built), but @samp{make dist} will fail. |
| |
| @item @var{version} |
| @cindex Option, @var{version} |
| A version number (e.g., @samp{0.30}) can be specified. If Automake is not |
| newer than the version specified, creation of the @file{Makefile.in} |
| will be suppressed. |
| |
| @item @option{-W@var{category}} or @option{--warnings=@var{category}} |
| @cindex Option, warnings |
| @cindex Option, @option{-W@var{category}} |
| @cindex Option, @option{--warnings=@var{category}} |
| These options behave exactly like their command-line counterpart |
| (@pxref{automake Invocation}). This allows you to enable or disable some |
| warning categories on a per-file basis. You can also setup some warnings |
| for your entire project; for instance, try @samp{AM_INIT_AUTOMAKE([-Wall])} |
| in your @file{configure.ac}. |
| |
| @end table |
| |
| Unrecognized options are diagnosed by @command{automake}. |
| |
| If you want an option to apply to all the files in the tree, you can use |
| the @code{AM_INIT_AUTOMAKE} macro in @file{configure.ac}. |
| @xref{Macros}. |
| |
| |
| @node Miscellaneous |
| @chapter Miscellaneous Rules |
| |
| There are a few rules and variables that didn't fit anywhere else. |
| |
| @menu |
| * Tags:: Interfacing to cscope, etags and mkid |
| * Suffixes:: Handling new file extensions |
| @end menu |
| |
| |
| @node Tags |
| @section Interfacing to @command{etags} |
| |
| @cindex @file{TAGS} support |
| |
| Automake will generate rules to generate @file{TAGS} files for use with |
| GNU Emacs under some circumstances. |
| |
| @trindex tags |
| If any C, C++ or Fortran 77 source code or headers are present, then |
| @code{tags} and @code{TAGS} rules will be generated for the directory. |
| All files listed using the @code{_SOURCES}, @code{_HEADERS}, and |
| @code{_LISP} primaries will be used to generate tags. Note that |
| generated source files that are not distributed must be declared in |
| variables like @code{nodist_noinst_HEADERS} or |
| @code{nodist_@var{prog}_SOURCES} or they will be ignored. |
| |
| A @code{tags} rule will be output at the topmost directory of a |
| multi-directory package. When run from this topmost directory, |
| @samp{make tags} will generate a @file{TAGS} file that includes by |
| reference all @file{TAGS} files from subdirectories. |
| |
| The @code{tags} rule will also be generated if the variable |
| @code{ETAGS_ARGS} is defined. This variable is intended for use in |
| directories that contain taggable source that @command{etags} does |
| not understand. The user can use the @code{ETAGSFLAGS} to pass |
| additional flags to @command{etags}; @code{AM_ETAGSFLAGS} is also |
| available for use in @file{Makefile.am}. |
| @vindex ETAGS_ARGS |
| @vindex ETAGSFLAGS |
| @vindex AM_ETAGSFLAGS |
| |
| Here is how Automake generates tags for its source, and for nodes in its |
| Texinfo file: |
| |
| @example |
| ETAGS_ARGS = automake.in --lang=none \ |
| --regex='/^@@node[ \t]+\([^,]+\)/\1/' automake.texi |
| @end example |
| |
| If you add file names to @code{ETAGS_ARGS}, you will probably also |
| want to define @code{TAGS_DEPENDENCIES}. The contents of this variable |
| are added directly to the dependencies for the @code{tags} rule. |
| @vindex TAGS_DEPENDENCIES |
| |
| Automake also generates a @code{ctags} rule that can be used to |
| build @command{vi}-style @file{tags} files. The variable @code{CTAGS} |
| is the name of the program to invoke (by default @command{ctags}); |
| @code{CTAGSFLAGS} can be used by the user to pass additional flags, |
| and @code{AM_CTAGSFLAGS} can be used by the @file{Makefile.am}. |
| |
| @trindex id |
| Automake will also generate an @code{ID} rule that will run |
| @command{mkid} on the source. This is only supported on a |
| directory-by-directory basis. |
| |
| Similarly, the @code{cscope} rule will create a list of all the source |
| files in the tree and run @command{cscope} to build an inverted index |
| database. The variable @code{CSCOPE} is the name of the program to invoke |
| (by default @command{cscope}); @code{CSCOPEFLAGS} and |
| @code{CSCOPE_ARGS} can be used by the user to pass additional flags and |
| file names respectively, while @code{AM_CSCOPEFLAGS} can be used by the |
| @file{Makefile.am}. Note that, currently, the Automake-provided |
| @code{cscope} support, when used in a VPATH build, might not work well |
| with non-GNU make implementations (especially with make implementations |
| performing @ref{Automatic Rule Rewriting, , VPATH rewrites, autoconf, |
| The Autoconf Manual}). |
| |
| Finally, Automake also emits rules to support the |
| @uref{https://www.gnu.org/software/global/, GNU Global Tags program}. |
| The @code{GTAGS} rule runs Global Tags and puts the |
| result in the top build directory. The variable @code{GTAGS_ARGS} |
| holds arguments that are passed to @command{gtags}. |
| @vindex GTAGS_ARGS |
| |
| |
| @node Suffixes |
| @section Handling new file extensions |
| |
| @cindex Adding new @code{SUFFIXES} |
| @cindex @code{SUFFIXES}, adding |
| @vindex SUFFIXES |
| |
| It is sometimes useful to introduce a new implicit rule to handle a file |
| type that Automake does not know about. |
| |
| For instance, suppose you had a compiler that could compile @file{.foo} |
| files to @file{.o} files. You would simply define a suffix rule for |
| your language: |
| |
| @example |
| .foo.o: |
| foocc -c -o $@@ $< |
| @end example |
| |
| Then you could directly use a @file{.foo} file in a @code{_SOURCES} |
| variable and expect the correct results: |
| |
| @example |
| bin_PROGRAMS = doit |
| doit_SOURCES = doit.foo |
| @end example |
| |
| This was the simpler and more common case. In other cases, you will |
| have to help Automake to figure out which extensions you are defining your |
| suffix rule for. This usually happens when your extension does not |
| start with a dot. Then, all you have to do is to put a list of new |
| suffixes in the @code{SUFFIXES} variable @strong{before} you define your |
| implicit rule. |
| |
| For instance, the following definition prevents Automake from misinterpreting |
| the @samp{.idlC.cpp:} rule as an attempt to transform @file{.idlC} files into |
| @file{.cpp} files. |
| |
| @c Keep in sync with suffix7.sh |
| @example |
| SUFFIXES = .idl C.cpp |
| .idlC.cpp: |
| # whatever |
| @end example |
| |
| As you may have noted, the @code{SUFFIXES} variable behaves like the |
| @code{.SUFFIXES} special target of @command{make}. You should not touch |
| @code{.SUFFIXES} yourself, but use @code{SUFFIXES} instead and let |
| Automake generate the suffix list for @code{.SUFFIXES}. Any given |
| @code{SUFFIXES} go at the start of the generated suffixes list, followed |
| by Automake generated suffixes not already in the list. |
| |
| @node Include |
| @chapter Include |
| |
| @cmindex include |
| @cindex Including @file{Makefile} fragment |
| @cindex @file{Makefile} fragment, including |
| |
| Automake supports an @code{include} directive that can be used to |
| include other @file{Makefile} fragments when @command{automake} is run. |
| Note that these fragments are read and interpreted by @command{automake}, |
| not by @command{make}. As with conditionals, @command{make} has no idea that |
| @code{include} is in use. |
| |
| There are two forms of @code{include}: |
| |
| @table @code |
| @item include $(srcdir)/file |
| Include a fragment that is found relative to the current source |
| directory. |
| |
| @item include $(top_srcdir)/file |
| Include a fragment that is found relative to the top source directory. |
| @end table |
| |
| Note that if a fragment is included inside a conditional, then the |
| condition applies to the entire contents of that fragment. |
| |
| Makefile fragments included this way are always distributed because |
| they are needed to rebuild @file{Makefile.in}. |
| |
| Inside a fragment, the construct @code{%reldir%} is replaced with the |
| directory of the fragment relative to the base @file{Makefile.am}. |
| Similarly, @code{%canon_reldir%} is replaced with the canonicalized |
| (@pxref{Canonicalization}) form of @code{%reldir%}. As a convenience, |
| @code{%D%} is a synonym for @code{%reldir%}, and @code{%C%} |
| is a synonym for @code{%canon_reldir%}. |
| |
| A special feature is that if the fragment is in the same directory as |
| the base @file{Makefile.am} (i.e., @code{%reldir%} is @code{.}), then |
| @code{%reldir%} and @code{%canon_reldir%} will expand to the empty |
| string as well as eat, if present, a following slash or underscore |
| respectively. |
| |
| Thus, a makefile fragment might look like this: |
| |
| @example |
| bin_PROGRAMS += %reldir%/mumble |
| %canon_reldir%_mumble_SOURCES = %reldir%/one.c |
| @end example |
| |
| @node Conditionals |
| @chapter Conditionals |
| |
| @cindex Conditionals |
| |
| Automake supports a simple type of conditionals. |
| |
| These conditionals are not the same as conditionals in |
| GNU Make. Automake conditionals are checked at configure time by the |
| @file{configure} script, and affect the translation from |
| @file{Makefile.in} to @file{Makefile}. They are based on options passed |
| to @file{configure} and on results that @file{configure} has discovered |
| about the host system. GNU Make conditionals are checked at @command{make} |
| time, and are based on variables passed to the make program or defined |
| in the @file{Makefile}. |
| |
| Automake conditionals will work with any make program. |
| |
| @menu |
| * Usage of Conditionals:: Declaring conditional content |
| * Limits of Conditionals:: Enclosing complete statements |
| @end menu |
| |
| @node Usage of Conditionals |
| @section Usage of Conditionals |
| |
| @acindex AM_CONDITIONAL |
| Before using a conditional, you must define it by using |
| @code{AM_CONDITIONAL} in the @file{configure.ac} file (@pxref{Macros}). |
| |
| @defmac AM_CONDITIONAL (@var{conditional}, @var{condition}) |
| The conditional name, @var{conditional}, should be a simple string |
| starting with a letter and containing only letters, digits, and |
| underscores. It must be different from @samp{TRUE} and @samp{FALSE} |
| that are reserved by Automake. |
| |
| The shell @var{condition} (suitable for use in a shell @code{if} |
| statement) is evaluated when @command{configure} is run. Note that you |
| must arrange for @emph{every} @code{AM_CONDITIONAL} to be invoked every |
| time @command{configure} is run. If @code{AM_CONDITIONAL} is run |
| conditionally (e.g., in a shell @code{if} statement), then the result |
| will confuse @command{automake}. |
| @end defmac |
| |
| @cindex @option{--enable-debug}, example |
| @cindex Example conditional @option{--enable-debug} |
| @cindex Conditional example, @option{--enable-debug} |
| |
| Conditionals typically depend upon options that the user provides to |
| the @command{configure} script. Here is an example of how to write a |
| conditional that is true if the user uses the @option{--enable-debug} |
| option. |
| |
| @example |
| AC_ARG_ENABLE([debug], |
| [ --enable-debug Turn on debugging], |
| [case "$@{enableval@}" in |
| yes) debug=true ;; |
| no) debug=false ;; |
| *) AC_MSG_ERROR([bad value $@{enableval@} for --enable-debug]) ;; |
| esac],[debug=false]) |
| AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) |
| @end example |
| |
| Here is an example of how to use that conditional in @file{Makefile.am}: |
| |
| @cmindex if |
| @cmindex endif |
| @cmindex else |
| |
| @example |
| if DEBUG |
| DBG = debug |
| else |
| DBG = |
| endif |
| noinst_PROGRAMS = $(DBG) |
| @end example |
| |
| This trivial example could also be handled using @code{EXTRA_PROGRAMS} |
| (@pxref{Conditional Programs}). |
| |
| You may only test a single variable in an @code{if} statement, possibly |
| negated using @samp{!}. The @code{else} statement may be omitted. |
| Conditionals may be nested to any depth. You may specify an argument to |
| @code{else} in which case it must be the negation of the condition used |
| for the current @code{if}. Similarly you may specify the condition |
| that is closed on the @code{endif} line: |
| |
| @example |
| if DEBUG |
| DBG = debug |
| else !DEBUG |
| DBG = |
| endif !DEBUG |
| @end example |
| |
| @noindent |
| Unbalanced conditions are errors. The @code{if}, @code{else}, and |
| @code{endif} statements should not be indented, i.e., start on column |
| one. |
| |
| The @code{else} branch of the above two examples could be omitted, |
| since assigning the empty string to an otherwise undefined variable |
| makes no difference. |
| |
| @acindex AM_COND_IF |
| In order to allow access to the condition registered by |
| @code{AM_CONDITIONAL} inside @file{configure.ac}, and to allow |
| conditional @code{AC_CONFIG_FILES}, @code{AM_COND_IF} may be used: |
| |
| @defmac AM_COND_IF (@var{conditional}, @ovar{if-true}, @ovar{if-false}) |
| If @var{conditional} is fulfilled, execute @var{if-true}, otherwise |
| execute @var{if-false}. If either branch contains @code{AC_CONFIG_FILES}, |
| it will cause @command{automake} to output the rules for the respective |
| files only for the given condition. |
| @end defmac |
| |
| @code{AM_COND_IF} macros may be nested when m4 quotation is used |
| properly (@pxref{M4 Quotation, ,, autoconf, The Autoconf Manual}). |
| |
| @cindex Example conditional @code{AC_CONFIG_FILES} |
| @cindex @code{AC_CONFIG_FILES}, conditional |
| |
| Here is an example of how to define a conditional config file: |
| |
| @example |
| AM_CONDITIONAL([SHELL_WRAPPER], [test "x$with_wrapper" = xtrue]) |
| AM_COND_IF([SHELL_WRAPPER], |
| [AC_CONFIG_FILES([wrapper:wrapper.in])]) |
| @end example |
| |
| @node Limits of Conditionals |
| @section Limits of Conditionals |
| |
| Conditionals should enclose complete statements like variables or |
| rules definitions. Automake cannot deal with conditionals used inside |
| a variable definition, for instance, and is not even able to diagnose |
| this situation. The following example would not work: |
| |
| @example |
| # This syntax is not understood by Automake |
| AM_CPPFLAGS = \ |
| -DFEATURE_A \ |
| if WANT_DEBUG |
| -DDEBUG \ |
| endif |
| -DFEATURE_B |
| @end example |
| |
| However the intended definition of @code{AM_CPPFLAGS} can be achieved |
| with |
| |
| @example |
| if WANT_DEBUG |
| DEBUGFLAGS = -DDEBUG |
| endif |
| AM_CPPFLAGS = -DFEATURE_A $(DEBUGFLAGS) -DFEATURE_B |
| @end example |
| |
| @noindent |
| or |
| |
| @example |
| AM_CPPFLAGS = -DFEATURE_A |
| if WANT_DEBUG |
| AM_CPPFLAGS += -DDEBUG |
| endif |
| AM_CPPFLAGS += -DFEATURE_B |
| @end example |
| |
| More details and examples of conditionals are described alongside |
| various Automake features in this manual (@pxref{Conditional |
| Subdirectories}, @pxref{Conditional Sources}, @pxref{Conditional |
| Programs}, @pxref{Conditional Libtool Libraries}, @pxref{Conditional |
| Libtool Sources}). |
| |
| @node Silencing Make |
| @chapter Silencing @command{make} |
| |
| @cindex Silent @command{make} |
| @cindex Silencing @command{make} |
| @cindex Silent rules |
| @cindex Silent @command{make} rules |
| |
| @menu |
| * Make verbosity:: Make is verbose by default |
| * Tricks For Silencing Make:: Standard and generic ways to silence make |
| * Automake Silent Rules:: How Automake can help in silencing make |
| @end menu |
| |
| @node Make verbosity |
| @section Make is verbose by default |
| |
| Normally, when executing the set of rules associated with a target, |
| @command{make} prints each rule before it is executed. This behaviour, |
| while having been in place for a long time, and being even mandated by |
| the POSIX standard, starkly violates the ``silence is golden'' UNIX |
| principle@footnote{See also |
| @uref{http://catb.org/~esr/writings/taoup/html/ch11s09.html}.}: |
| |
| @quotation |
| When a program has nothing interesting or surprising to say, it should |
| say nothing. Well-behaved Unix programs do their jobs unobtrusively, |
| with a minimum of fuss and bother. Silence is golden. |
| @end quotation |
| |
| In fact, while such verbosity of @command{make} can theoretically be |
| useful to track bugs and understand reasons of failures right away, it |
| can also hide warning and error messages from @command{make}-invoked |
| tools, drowning them in a flood of uninteresting and seldom useful |
| messages, and thus allowing them to go easily undetected. |
| |
| This problem can be very annoying, especially for developers, who usually |
| know quite well what's going on behind the scenes, and for whom the |
| verbose output from @command{make} ends up being mostly noise that hampers |
| the easy detection of potentially important warning messages. |
| |
| @node Tricks For Silencing Make |
| @section Standard and generic ways to silence make |
| |
| Here we describe some common idioms/tricks to obtain a quieter make |
| output, with their relative advantages and drawbacks. In the next |
| section (@ref{Automake Silent Rules}) we'll see how Automake can help |
| in this respect, providing more elaborate and flexible idioms. |
| |
| @itemize @bullet |
| |
| @item @command{make -s} |
| |
| This simply causes @command{make} not to print @emph{any} rule before |
| executing it. |
| |
| The @option{-s} flag is mandated by POSIX, universally supported, and |
| its purpose and function are easy to understand. |
| |
| But it also has its serious limitations too. First of all, it embodies |
| an ``all or nothing'' strategy, i.e., either everything is silenced, or |
| nothing is; this lack of granularity can sometimes be a fatal flaw. |
| Moreover, when the @option{-s} flag is used, the @command{make} output |
| might turn out to be too much terse; in case of errors, the user won't |
| be able to easily see what rule or command have caused them, or even, |
| in case of tools with poor error reporting, what the errors were! |
| |
| @item @command{make >/dev/null || make} |
| |
| Apparently, this perfectly obeys the ``silence is golden'' rule: warnings |
| from stderr are passed through, output reporting is done only in case of |
| error, and in that case it should provide a verbose-enough report to allow |
| an easy determination of the error location and causes. |
| |
| However, calling @command{make} two times in a row might hide errors |
| (especially intermittent ones), or subtly change the expected semantic |
| of the @command{make} calls --- things these which can clearly make |
| debugging and error assessment very difficult. |
| |
| @item @command{make --no-print-directory} |
| |
| This is GNU @command{make} specific. When called with the |
| @option{--no-print-directory} option, GNU @command{make} will disable |
| printing of the working directory by invoked sub-@command{make}s (the |
| well-known ``@i{Entering/Leaving directory ...}'' messages). This helps |
| to decrease the verbosity of the output, but experience has shown that |
| it can also often render debugging considerably harder in projects using |
| deeply-nested @command{make} recursion. |
| |
| As an aside, notice that the @option{--no-print-directory} option is |
| automatically activated if the @option{-s} flag is used. |
| |
| @c TODO: Other tricks? |
| @c TODO: Maybe speak about the @code{.SILENT} target? |
| @c TODO: - Pros: More granularity on what to silence. |
| @c TODO: - Cons: No easy way to temporarily override. |
| |
| @end itemize |
| |
| @node Automake Silent Rules |
| @section How Automake can help in silencing make |
| |
| The tricks and idioms for silencing @command{make} described in the |
| previous section can be useful from time to time, but we've seen that |
| they all have their serious drawbacks and limitations. That's why |
| automake provides support for a more advanced and flexible way of |
| obtaining quieter output from @command{make} (for most rules at least). |
| |
| To give the gist of what Automake can do in this respect, here is a simple |
| comparison between a typical @command{make} output (where silent rules |
| are disabled) and one with silent rules enabled: |
| |
| @example |
| % @kbd{cat Makefile.am} |
| bin_PROGRAMS = foo |
| foo_SOURCES = main.c func.c |
| % @kbd{cat main.c} |
| int main (void) @{ return func (); @} /* func used undeclared */ |
| % @kbd{cat func.c} |
| int func (void) @{ int i; return i; @} /* i used uninitialized */ |
| |
| @i{The make output is by default very verbose. This causes warnings |
| from the compiler to be somewhat hidden, and not immediate to spot.} |
| % @kbd{make CFLAGS=-Wall} |
| gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ... |
| -DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ... |
| -DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT main.o |
| -MD -MP -MF .deps/main.Tpo -c -o main.o main.c |
| main.c: In function ‘main’: |
| main.c:3:3: warning: implicit declaration of function ‘func’ |
| mv -f .deps/main.Tpo .deps/main.Po |
| gcc -DPACKAGE_NAME=\"foo\" -DPACKAGE_TARNAME=\"foo\" ... |
| -DPACKAGE_STRING=\"foo\ 1.0\" -DPACKAGE_BUGREPORT=\"\" ... |
| -DPACKAGE=\"foo\" -DVERSION=\"1.0\" -I. -Wall -MT func.o |
| -MD -MP -MF .deps/func.Tpo -c -o func.o func.c |
| func.c: In function ‘func’: |
| func.c:4:3: warning: ‘i’ used uninitialized in this function |
| mv -f .deps/func.Tpo .deps/func.Po |
| gcc -Wall -o foo main.o func.o |
| |
| @i{Clean up, so that we we can rebuild everything from scratch.} |
| % @kbd{make clean} |
| test -z "foo" || rm -f foo |
| rm -f *.o |
| |
| @i{Silent rules enabled: the output is minimal but informative. In |
| particular, the warnings from the compiler stick out very clearly.} |
| % @kbd{make V=0 CFLAGS=-Wall} |
| CC main.o |
| main.c: In function ‘main’: |
| main.c:3:3: warning: implicit declaration of function ‘func’ |
| CC func.o |
| func.c: In function ‘func’: |
| func.c:4:3: warning: ‘i’ used uninitialized in this function |
| CCLD foo |
| @end example |
| |
| @cindex silent rules and libtool |
| Also, in projects using @command{libtool}, the use of silent rules can |
| automatically enable the @command{libtool}'s @option{--silent} option: |
| |
| @example |
| % @kbd{cat Makefile.am} |
| lib_LTLIBRARIES = libx.la |
| |
| % @kbd{make # Both make and libtool are verbose by default.} |
| ... |
| libtool: compile: gcc -DPACKAGE_NAME=\"foo\" ... -DLT_OBJDIR=\".libs/\" |
| -I. -g -O2 -MT libx.lo -MD -MP -MF .deps/libx.Tpo -c libx.c -fPIC |
| -DPIC -o .libs/libx.o |
| mv -f .deps/libx.Tpo .deps/libx.Plo |
| /bin/sh ./libtool --tag=CC --mode=link gcc -g -O2 -o libx.la -rpath |
| /usr/local/lib libx.lo |
| libtool: link: gcc -shared .libs/libx.o -Wl,-soname -Wl,libx.so.0 |
| -o .libs/libx.so.0.0.0 |
| libtool: link: cd .libs && rm -f libx.so && ln -s libx.so.0.0.0 libx.so |
| ... |
| |
| % @kbd{make V=0} |
| CC libx.lo |
| CCLD libx.la |
| @end example |
| |
| For Automake-generated @file{Makefile}s, the user may influence the |
| verbosity at @command{configure} run time as well as at @command{make} |
| run time: |
| |
| @itemize @bullet |
| @item |
| @opindex --enable-silent-rules |
| @opindex --disable-silent-rules |
| Passing @option{--enable-silent-rules} to @command{configure} will cause |
| build rules to be less verbose; the option @option{--disable-silent-rules} |
| will cause normal verbose output. |
| @item |
| @vindex @code{V} |
| At @command{make} run time, the default chosen at @command{configure} |
| time may be overridden: @code{make V=1} will produce verbose output, |
| @code{make V=0} less verbose output. |
| @end itemize |
| |
| @cindex default verbosity for silent rules |
| Note that silent rules are @emph{disabled} by default; the user must |
| enable them explicitly at either @command{configure} run time or at |
| @command{make} run time. We think that this is a good policy, since |
| it provides the casual user with enough information to prepare a good |
| bug report in case anything breaks. |
| |
| Still, notwithstanding the rationales above, a developer who really |
| wants to make silent rules enabled by default in his own package can |
| do so by calling @code{AM_SILENT_RULES([yes])} in @file{configure.ac}. |
| |
| @c Keep in sync with silent-configsite.sh |
| Users who prefer to have silent rules enabled by default can edit their |
| @file{config.site} file to make the variable @code{enable_silent_rules} |
| default to @samp{yes}. This should still allow disabling silent rules |
| at @command{configure} time and at @command{make} time. |
| |
| @c FIXME: there's really a need to specify this explicitly? |
| For portability to different @command{make} implementations, package authors |
| are advised to not set the variable @code{V} inside the @file{Makefile.am} |
| file, to allow the user to override the value for subdirectories as well. |
| |
| To work at its best, the current implementation of this feature normally |
| uses nested variable expansion @samp{$(@var{var1}$(V))}, a @file{Makefile} |
| feature that is not required by POSIX 2008 but is widely supported in |
| practice. On the rare @command{make} implementations that do not support |
| nested variable expansion, whether rules are silent is always determined at |
| configure time, and cannot be overridden at make time. Future versions of |
| POSIX are likely to require nested variable expansion, so this minor |
| limitation should go away with time. |
| |
| @vindex @code{AM_V_GEN} |
| @vindex @code{AM_V_at} |
| @vindex @code{AM_DEFAULT_VERBOSITY} |
| @vindex @code{AM_V} |
| @vindex @code{AM_DEFAULT_V} |
| To extend the silent mode to your own rules, you have few choices: |
| |
| @itemize @bullet |
| |
| @item |
| You can use the predefined variable @code{AM_V_GEN} as a prefix to |
| commands that should output a status line in silent mode, and |
| @code{AM_V_at} as a prefix to commands that should not output anything |
| in silent mode. When output is to be verbose, both of these variables |
| will expand to the empty string. |
| |
| @item |
| You can silence a recipe unconditionally with @code{@@}, and then use |
| the predefined variable @code{AM_V_P} to know whether make is being run |
| in silent or verbose mode, adjust the verbose information your recipe |
| displays accordingly: |
| |
| @example |
| generate-headers: |
| @set -e; \ |
| ... [commands defining a shell variable '$headers'] ...; \ |
| if $(AM_V_P); then set -x; else echo " GEN [headers]"; fi; \ |
| rm -f $$headers && generate-header --flags $$headers |
| @end example |
| |
| @item |
| You can add your own variables, so strings of your own choice are shown. |
| The following snippet shows how you would define your own equivalent of |
| @code{AM_V_GEN}: |
| |
| @example |
| pkg_verbose = $(pkg_verbose_@@AM_V@@) |
| pkg_verbose_ = $(pkg_verbose_@@AM_DEFAULT_V@@) |
| pkg_verbose_0 = @@echo PKG-GEN $@@; |
| |
| foo: foo.in |
| $(pkg_verbose)cp $(srcdir)/foo.in $@@ |
| @end example |
| |
| @end itemize |
| |
| As a final note, observe that, even when silent rules are enabled, |
| the @option{--no-print-directory} option is still required with GNU |
| @command{make} if the ``@i{Entering/Leaving directory ...}'' messages |
| are to be disabled. |
| |
| @node Gnits |
| @chapter The effect of @option{--gnu} and @option{--gnits} |
| |
| @cindex @option{--gnu}, required files |
| @cindex @option{--gnu}, complete description |
| |
| The @option{--gnu} option (or @option{gnu} in the |
| @code{AUTOMAKE_OPTIONS} variable) causes @command{automake} to check |
| the following: |
| |
| @itemize @bullet |
| @item |
| The files @file{INSTALL}, @file{NEWS}, @file{README}, @file{AUTHORS}, |
| and @file{ChangeLog}, plus one of @file{COPYING.LIB}, @file{COPYING.LESSER} |
| or @file{COPYING}, are required at the topmost directory of the package. |
| |
| If the @option{--add-missing} option is given, @command{automake} will |
| add a generic version of the @file{INSTALL} file as well as the |
| @file{COPYING} file containing the text of the current version of the |
| GNU General Public License existing at the time of this Automake release |
| (version 3 as this is written, @uref{https://www.gnu.org/@/copyleft/@/gpl.html}). |
| However, an existing @file{COPYING} file will never be overwritten by |
| @command{automake}. |
| |
| @item |
| The options @option{no-installman} and @option{no-installinfo} are |
| prohibited. |
| @end itemize |
| |
| Note that this option will be extended in the future to do even more |
| checking; it is advisable to be familiar with the precise requirements |
| of the GNU standards. Also, @option{--gnu} can require certain |
| non-standard GNU programs to exist for use by various maintainer-only |
| rules; for instance, in the future @command{pathchk} might be required for |
| @samp{make dist}. |
| |
| @cindex @option{--gnits}, complete description |
| |
| The @option{--gnits} option does everything that @option{--gnu} does, and |
| checks the following as well: |
| |
| @itemize @bullet |
| @item |
| @samp{make installcheck} will check to make sure that the @option{--help} |
| and @option{--version} really print a usage message and a version string, |
| respectively. This is the @option{std-options} option (@pxref{Options}). |
| |
| @item |
| @samp{make dist} will check to make sure the @file{NEWS} file has been |
| updated to the current version. |
| |
| @item |
| @code{VERSION} is checked to make sure its format complies with Gnits |
| standards. |
| @c FIXME xref when standards are finished |
| |
| @item |
| @cindex @file{README-alpha} |
| If @code{VERSION} indicates that this is an alpha release, and the file |
| @file{README-alpha} appears in the topmost directory of a package, then |
| it is included in the distribution. This is done in @option{--gnits} |
| mode, and no other, because this mode is the only one where version |
| number formats are constrained, and hence the only mode where Automake |
| can automatically determine whether @file{README-alpha} should be |
| included. |
| |
| @item |
| The file @file{THANKS} is required. |
| @end itemize |
| |
| |
| @node Not Enough |
| @chapter When Automake Isn't Enough |
| |
| In some situations, where Automake is not up to one task, one has to |
| resort to handwritten rules or even handwritten @file{Makefile}s. |
| |
| @menu |
| * Extending:: Adding new rules or overriding existing ones. |
| * Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s. |
| @end menu |
| |
| @node Extending |
| @section Extending Automake Rules |
| |
| With some minor exceptions (for example @code{_PROGRAMS} variables, |
| @code{TESTS}, or @code{XFAIL_TESTS}) being rewritten to append |
| @samp{$(EXEEXT)}), the contents of a @file{Makefile.am} is copied to |
| @file{Makefile.in} verbatim. |
| |
| @cindex copying semantics |
| |
| These copying semantics mean that many problems can be worked around |
| by simply adding some @command{make} variables and rules to |
| @file{Makefile.am}. Automake will ignore these additions. |
| |
| @cindex conflicting definitions |
| @cindex rules, conflicting |
| @cindex variables, conflicting |
| @cindex definitions, conflicts |
| |
| Since a @file{Makefile.in} is built from data gathered from three |
| different places (@file{Makefile.am}, @file{configure.ac}, and |
| @command{automake} itself), it is possible to have conflicting |
| definitions of rules or variables. When building @file{Makefile.in} |
| the following priorities are respected by @command{automake} to ensure |
| the user always has the last word: |
| |
| @itemize |
| @item |
| User defined variables in @file{Makefile.am} have priority over |
| variables @code{AC_SUBST}ed from @file{configure.ac}, and |
| @code{AC_SUBST}ed variables have priority over |
| @command{automake}-defined variables. |
| @item |
| As far as rules are concerned, a user-defined rule overrides any |
| @command{automake}-defined rule for the same target. |
| @end itemize |
| |
| @cindex overriding rules |
| @cindex overriding semantics |
| @cindex rules, overriding |
| |
| These overriding semantics make it possible to fine tune some default |
| settings of Automake, or replace some of its rules. Overriding |
| Automake rules is often inadvisable, particularly in the topmost |
| directory of a package with subdirectories. The @option{-Woverride} |
| option (@pxref{automake Invocation}) comes in handy to catch overridden |
| definitions. |
| |
| Note that Automake does not make any distinction between rules with |
| commands and rules that only specify dependencies. So it is not |
| possible to append new dependencies to an @command{automake}-defined |
| target without redefining the entire rule. |
| |
| @cindex @option{-local} targets |
| @cindex local targets |
| |
| However, various useful targets have a @samp{-local} version you can |
| specify in your @file{Makefile.am}. Automake will supplement the |
| standard target with these user-supplied targets. |
| |
| @trindex all |
| @trindex all-local |
| @trindex info |
| @trindex info-local |
| @trindex dvi |
| @trindex dvi-local |
| @trindex ps |
| @trindex ps-local |
| @trindex pdf |
| @trindex pdf-local |
| @trindex html |
| @trindex html-local |
| @trindex check |
| @trindex check-local |
| @trindex install |
| @trindex install-data |
| @trindex install-data-local |
| @trindex install-dvi |
| @trindex install-dvi-local |
| @trindex install-exec |
| @trindex install-exec-local |
| @trindex install-html |
| @trindex install-html-local |
| @trindex install-info |
| @trindex install-info-local |
| @trindex install-pdf |
| @trindex install-pdf-local |
| @trindex install-ps |
| @trindex install-ps-local |
| @trindex uninstall |
| @trindex uninstall-local |
| @trindex mostlyclean |
| @trindex mostlyclean-local |
| @trindex clean |
| @trindex clean-local |
| @trindex distclean |
| @trindex distclean-local |
| @trindex installdirs |
| @trindex installdirs-local |
| @trindex installcheck |
| @trindex installcheck-local |
| |
| The targets that support a local version are @code{all}, @code{info}, |
| @code{dvi}, @code{ps}, @code{pdf}, @code{html}, @code{check}, |
| @code{install-data}, @code{install-dvi}, @code{install-exec}, |
| @code{install-html}, @code{install-info}, @code{install-pdf}, |
| @code{install-ps}, @code{uninstall}, @code{installdirs}, |
| @code{installcheck} and the various @code{clean} targets |
| (@code{mostlyclean}, @code{clean}, @code{distclean}, and |
| @code{maintainer-clean}). |
| |
| Note that there are no @code{uninstall-exec-local} or |
| @code{uninstall-data-local} targets; just use @code{uninstall-local}. |
| It doesn't make sense to uninstall just data or just executables. |
| |
| For instance, here is one way to erase a subdirectory during |
| @samp{make clean} (@pxref{Clean}). |
| |
| @example |
| clean-local: |
| -rm -rf testSubDir |
| @end example |
| |
| You may be tempted to use @code{install-data-local} to install a file |
| to some hard-coded location, but you should avoid this |
| (@pxref{Hard-Coded Install Paths}). |
| |
| With the @code{-local} targets, there is no particular guarantee of |
| execution order; typically, they are run early, but with parallel |
| make, there is no way to be sure of that. |
| |
| @cindex @option{-hook} targets |
| @cindex hook targets |
| @trindex install-data-hook |
| @trindex install-exec-hook |
| @trindex uninstall-hook |
| @trindex dist-hook |
| |
| In contrast, some rules also have a way to run another rule, called a |
| @dfn{hook}; hooks are always executed after the main rule's work is done. |
| The hook is named after the principal target, with @samp{-hook} appended. |
| The targets allowing hooks are @code{install-data}, |
| @code{install-exec}, @code{uninstall}, @code{dist}, and |
| @code{distcheck}. |
| |
| For instance, here is how to create a hard link to an installed program: |
| |
| @example |
| install-exec-hook: |
| ln $(DESTDIR)$(bindir)/program$(EXEEXT) \ |
| $(DESTDIR)$(bindir)/proglink$(EXEEXT) |
| @end example |
| |
| Although cheaper and more portable than symbolic links, hard links |
| will not work everywhere (for instance, OS/2 does not have |
| @command{ln}). Ideally you should fall back to @samp{cp -p} when |
| @command{ln} does not work. An easy way, if symbolic links are |
| acceptable to you, is to add @code{AC_PROG_LN_S} to |
| @file{configure.ac} (@pxref{Particular Programs, , Particular Program |
| Checks, autoconf, The Autoconf Manual}) and use @samp{$(LN_S)} in |
| @file{Makefile.am}. |
| |
| @cindex versioned binaries, installing |
| @cindex installing versioned binaries |
| @cindex @code{LN_S} example |
| For instance, here is how you could install a versioned copy of a |
| program using @samp{$(LN_S)}: |
| |
| @c Keep in sync with insthook.sh |
| @example |
| install-exec-hook: |
| cd $(DESTDIR)$(bindir) && \ |
| mv -f prog$(EXEEXT) prog-$(VERSION)$(EXEEXT) && \ |
| $(LN_S) prog-$(VERSION)$(EXEEXT) prog$(EXEEXT) |
| @end example |
| |
| Note that we rename the program so that a new version will erase the |
| symbolic link, not the real binary. Also we @command{cd} into the |
| destination directory in order to create relative links. |
| |
| When writing @code{install-exec-hook} or @code{install-data-hook}, |
| please bear in mind that the exec/data distinction is based on the |
| installation directory, not on the primary used (@pxref{The Two Parts of |
| Install}). |
| @c Keep in sync with primary-prefix-couples-documented-valid.sh |
| So a @code{foo_SCRIPTS} will be installed by |
| @code{install-data}, and a @code{barexec_SCRIPTS} will be installed by |
| @code{install-exec}. You should define your hooks consequently. |
| |
| @c FIXME should include discussion of variables you can use in these |
| @c rules |
| |
| @node Third-Party Makefiles |
| @section Third-Party @file{Makefile}s |
| |
| @cindex Third-party packages, interfacing with |
| @cindex Interfacing with third-party packages |
| |
| In most projects all @file{Makefile}s are generated by Automake. In |
| some cases, however, projects need to embed subdirectories with |
| handwritten @file{Makefile}s. For instance, one subdirectory could be |
| a third-party project with its own build system, not using Automake. |
| |
| It is possible to list arbitrary directories in @code{SUBDIRS} or |
| @code{DIST_SUBDIRS} provided each of these directories has a |
| @file{Makefile} that recognizes all the following recursive targets. |
| |
| @cindex recursive targets and third-party @file{Makefile}s |
| When a user runs one of these targets, that target is run recursively |
| in all subdirectories. This is why it is important that even |
| third-party @file{Makefile}s support them. |
| |
| @table @code |
| @item all |
| Compile the entire package. This is the default target in |
| Automake-generated @file{Makefile}s, but it does not need to be the |
| default in third-party @file{Makefile}s. |
| |
| @item distdir |
| @trindex distdir |
| @vindex distdir |
| @vindex top_distdir |
| Copy files to distribute into @samp{$(distdir)}, before a tarball is |
| constructed. Of course this target is not required if the |
| @option{no-dist} option (@pxref{Options}) is used. |
| |
| The variables @samp{$(top_distdir)} and @samp{$(distdir)} |
| (@pxref{The dist Hook}) will be passed from the outer package to the subpackage |
| when the @code{distdir} target is invoked. These two variables have |
| been adjusted for the directory that is being recursed into, so they |
| are ready to use. |
| |
| @item install |
| @itemx install-data |
| @itemx install-exec |
| @itemx uninstall |
| Install or uninstall files (@pxref{Install}). |
| |
| @item install-dvi |
| @itemx install-html |
| @itemx install-info |
| @itemx install-ps |
| @itemx install-pdf |
| Install only some specific documentation format (@pxref{Texinfo}). |
| |
| @item installdirs |
| Create install directories, but do not install any files. |
| |
| @item check |
| @itemx installcheck |
| Check the package (@pxref{Tests}). |
| |
| @item mostlyclean |
| @itemx clean |
| @itemx distclean |
| @itemx maintainer-clean |
| Cleaning rules (@pxref{Clean}). |
| |
| @item dvi |
| @itemx pdf |
| @itemx ps |
| @itemx info |
| @itemx html |
| Build the documentation in various formats (@pxref{Texinfo}). |
| |
| @item tags |
| @itemx ctags |
| Build @file{TAGS} and @file{CTAGS} (@pxref{Tags}). |
| @end table |
| |
| If you have ever used Gettext in a project, this is a good example of |
| how third-party @file{Makefile}s can be used with Automake. The |
| @file{Makefile}s @command{gettextize} puts in the @file{po/} and |
| @file{intl/} directories are handwritten @file{Makefile}s that |
| implement all of these targets. That way they can be added to |
| @code{SUBDIRS} in Automake packages. |
| |
| Directories that are only listed in @code{DIST_SUBDIRS} but not in |
| @code{SUBDIRS} need only the @code{distclean}, |
| @code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional |
| Subdirectories}). |
| |
| Usually, many of these rules are irrelevant to the third-party |
| subproject, but they are required for the whole package to work. It's |
| OK to have a rule that does nothing, so if you are integrating a |
| third-party project with no documentation or tag support, you could |
| simply augment its @file{Makefile} as follows: |
| |
| @example |
| EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags |
| .PHONY: $(EMPTY_AUTOMAKE_TARGETS) |
| $(EMPTY_AUTOMAKE_TARGETS): |
| @end example |
| |
| Another aspect of integrating third-party build systems is whether |
| they support VPATH builds (@pxref{VPATH Builds}). Obviously if the |
| subpackage does not support VPATH builds the whole package will not |
| support VPATH builds. This in turns means that @samp{make distcheck} |
| will not work, because it relies on VPATH builds. Some people can |
| live without this (actually, many Automake users have never heard of |
| @samp{make distcheck}). Other people may prefer to revamp the |
| existing @file{Makefile}s to support VPATH@. Doing so does not |
| necessarily require Automake, only Autoconf is needed (@pxref{Build |
| Directories, , Build Directories, autoconf, The Autoconf Manual}). |
| The necessary substitutions: @samp{@@srcdir@@}, @samp{@@top_srcdir@@}, |
| and @samp{@@top_builddir@@} are defined by @file{configure} when it |
| processes a @file{Makefile} (@pxref{Preset Output Variables, , Preset |
| Output Variables, autoconf, The Autoconf Manual}), they are not |
| computed by the Makefile like the aforementioned @samp{$(distdir)} and |
| @samp{$(top_distdir)} variables. |
| |
| It is sometimes inconvenient to modify a third-party @file{Makefile} |
| to introduce the above required targets. For instance, one may want to |
| keep the third-party sources untouched to ease upgrades to new |
| versions. |
| |
| @cindex @file{GNUmakefile} including @file{Makefile} |
| Here are two other ideas. If GNU make is assumed, one possibility is |
| to add to that subdirectory a @file{GNUmakefile} that defines the |
| required targets and includes the third-party @file{Makefile}. For |
| this to work in VPATH builds, @file{GNUmakefile} must lie in the build |
| directory; the easiest way to do this is to write a |
| @file{GNUmakefile.in} instead, and have it processed with |
| @code{AC_CONFIG_FILES} from the outer package. For example if we |
| assume @file{Makefile} defines all targets except the documentation |
| targets, and that the @code{check} target is actually called |
| @code{test}, we could write @file{GNUmakefile} (or |
| @file{GNUmakefile.in}) like this: |
| |
| @example |
| # First, include the real Makefile |
| include Makefile |
| # Then, define the other targets needed by Automake Makefiles. |
| .PHONY: dvi pdf ps info html check |
| dvi pdf ps info html: |
| check: test |
| @end example |
| |
| @cindex Proxy @file{Makefile} for third-party packages |
| A similar idea that does not use @code{include} is to write a proxy |
| @file{Makefile} that dispatches rules to the real @file{Makefile}, |
| either with @samp{$(MAKE) -f Makefile.real $(AM_MAKEFLAGS) target} (if |
| it's OK to rename the original @file{Makefile}) or with @samp{cd |
| subdir && $(MAKE) $(AM_MAKEFLAGS) target} (if it's OK to store the |
| subdirectory project one directory deeper). The good news is that |
| this proxy @file{Makefile} can be generated with Automake. All we |
| need are @option{-local} targets (@pxref{Extending}) that perform the |
| dispatch. Of course the other Automake features are available, so you |
| could decide to let Automake perform distribution or installation. |
| Here is a possible @file{Makefile.am}: |
| |
| @example |
| all-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) all |
| check-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) test |
| clean-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) clean |
| |
| # Assuming the package knows how to install itself |
| install-data-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-data |
| install-exec-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-exec |
| uninstall-local: |
| cd subdir && $(MAKE) $(AM_MAKEFLAGS) uninstall |
| |
| # Distribute files from here. |
| EXTRA_DIST = subdir/Makefile subdir/program.c ... |
| @end example |
| |
| Pushing this idea to the extreme, it is also possible to ignore the |
| subproject build system and build everything from this proxy |
| @file{Makefile.am}. This might sound very sensible if you need VPATH |
| builds but the subproject does not support them. |
| |
| @node Distributing |
| @chapter Distributing @file{Makefile.in}s |
| |
| Automake places no restrictions on the distribution of the resulting |
| @file{Makefile.in}s. We still encourage software authors to |
| distribute their work under terms like those of the GPL, but doing so |
| is not required to use Automake. |
| |
| Some of the files that can be automatically installed via the |
| @option{--add-missing} switch do fall under the GPL@. However, these also |
| have a special exception allowing you to distribute them with your |
| package, regardless of the licensing you choose. |
| |
| |
| @node API Versioning |
| @chapter Automake API Versioning |
| |
| New Automake releases usually include bug fixes and new features. |
| Unfortunately they may also introduce new bugs and incompatibilities. |
| This makes four reasons why a package may require a particular Automake |
| version. |
| |
| Things get worse when maintaining a large tree of packages, each one |
| requiring a different version of Automake. In the past, this meant that |
| any developer (and sometimes users) had to install several versions of |
| Automake in different places, and switch @samp{$PATH} appropriately for |
| each package. |
| |
| Starting with version 1.6, Automake installs versioned binaries. This |
| means you can install several versions of Automake in the same |
| @samp{$prefix}, and can select an arbitrary Automake version by running |
| @command{automake-1.6} or @command{automake-1.7} without juggling with |
| @samp{$PATH}. Furthermore, @file{Makefile}'s generated by Automake 1.6 |
| will use @command{automake-1.6} explicitly in their rebuild rules. |
| |
| The number @samp{1.6} in @command{automake-1.6} is Automake's API version, |
| not Automake's version. If a bug fix release is made, for instance |
| Automake 1.6.1, the API version will remain 1.6. This means that a |
| package that works with Automake 1.6 should also work with 1.6.1; after |
| all, this is what people expect from bug fix releases. |
| |
| If your package relies on a feature or a bug fix introduced in |
| a release, you can pass this version as an option to Automake to ensure |
| older releases will not be used. For instance, use this in your |
| @file{configure.ac}: |
| |
| @example |
| AM_INIT_AUTOMAKE([1.6.1]) dnl Require Automake 1.6.1 or better. |
| @end example |
| |
| @noindent |
| or, in a particular @file{Makefile.am}: |
| |
| @example |
| AUTOMAKE_OPTIONS = 1.6.1 # Require Automake 1.6.1 or better. |
| @end example |
| |
| @noindent |
| Automake will print an error message if its version is |
| older than the requested version. |
| |
| |
| @heading What is in the API |
| |
| Automake's programming interface is not easy to define. Basically it |
| should include at least all @strong{documented} variables and targets |
| that a @file{Makefile.am} author can use, any behavior associated with |
| them (e.g., the places where @samp{-hook}'s are run), the command line |
| interface of @command{automake} and @command{aclocal}, @dots{} |
| |
| @heading What is not in the API |
| |
| Every undocumented variable, target, or command line option, is not part |
| of the API@. You should avoid using them, as they could change from one |
| version to the other (even in bug fix releases, if this helps to fix a |
| bug). |
| |
| If it turns out you need to use such an undocumented feature, contact |
| @email{automake@@gnu.org} and try to get it documented and exercised by |
| the test-suite. |
| |
| @node Upgrading |
| @chapter Upgrading a Package to a Newer Automake Version |
| |
| Automake maintains three kind of files in a package. |
| |
| @itemize |
| @item @file{aclocal.m4} |
| @item @file{Makefile.in}s |
| @item auxiliary tools like @file{install-sh} or @file{py-compile} |
| @end itemize |
| |
| @file{aclocal.m4} is generated by @command{aclocal} and contains some |
| Automake-supplied M4 macros. Auxiliary tools are installed by |
| @samp{automake --add-missing} when needed. @file{Makefile.in}s are |
| built from @file{Makefile.am} by @command{automake}, and rely on the |
| definitions of the M4 macros put in @file{aclocal.m4} as well as the |
| behavior of the auxiliary tools installed. |
| |
| Because all of these files are closely related, it is important to |
| regenerate all of them when upgrading to a newer Automake release. |
| The usual way to do that is |
| |
| @example |
| aclocal # with any option needed (such a -I m4) |
| autoconf |
| automake --add-missing --force-missing |
| @end example |
| |
| @noindent |
| or more conveniently: |
| |
| @example |
| autoreconf -vfi |
| @end example |
| |
| The use of @option{--force-missing} ensures that auxiliary tools will be |
| overridden by new versions (@pxref{automake Invocation}). |
| |
| It is important to regenerate all of these files each time Automake is |
| upgraded, even between bug fixes releases. For instance, it is not |
| unusual for a bug fix to involve changes to both the rules generated |
| in @file{Makefile.in} and the supporting M4 macros copied to |
| @file{aclocal.m4}. |
| |
| Presently @command{automake} is able to diagnose situations where |
| @file{aclocal.m4} has been generated with another version of |
| @command{aclocal}. However it never checks whether auxiliary scripts |
| are up-to-date. In other words, @command{automake} will tell you when |
| @command{aclocal} needs to be rerun, but it will never diagnose a |
| missing @option{--force-missing}. |
| |
| Before upgrading to a new major release, it is a good idea to read the |
| file @file{NEWS}. This file lists all changes between releases: new |
| features, obsolete constructs, known incompatibilities, and |
| workarounds. |
| |
| @node FAQ |
| @chapter Frequently Asked Questions about Automake |
| |
| This chapter covers some questions that often come up on the mailing |
| lists. |
| |
| @menu |
| * CVS:: CVS and generated files |
| * maintainer-mode:: missing and AM_MAINTAINER_MODE |
| * Wildcards:: Why doesn't Automake support wildcards? |
| * Limitations on File Names:: Limitations on source and installed file names |
| * Errors with distclean:: Files left in build directory after distclean |
| * Flag Variables Ordering:: CFLAGS vs.@: AM_CFLAGS vs.@: mumble_CFLAGS |
| * Renamed Objects:: Why are object files sometimes renamed? |
| * Per-Object Flags:: How to simulate per-object flags? |
| * Multiple Outputs:: Writing rules for tools with many output files |
| * Hard-Coded Install Paths:: Installing to hard-coded locations |
| * Debugging Make Rules:: Strategies when things don't work as expected |
| * Reporting Bugs:: Feedback on bugs and feature requests |
| @end menu |
| |
| @node CVS |
| @section CVS and generated files |
| |
| @subheading Background: distributed generated Files |
| @cindex generated files, distributed |
| @cindex rebuild rules |
| |
| Packages made with Autoconf and Automake ship with some generated |
| files like @file{configure} or @file{Makefile.in}. These files were |
| generated on the developer's machine and are distributed so that |
| end-users do not have to install the maintainer tools required to |
| rebuild them. Other generated files like Lex scanners, Yacc parsers, |
| or Info documentation, are usually distributed on similar grounds. |
| |
| Automake output rules in @file{Makefile}s to rebuild these files. For |
| instance, @command{make} will run @command{autoconf} to rebuild |
| @file{configure} whenever @file{configure.ac} is changed. This makes |
| development safer by ensuring a @file{configure} is never out-of-date |
| with respect to @file{configure.ac}. |
| |
| As generated files shipped in packages are up-to-date, and because |
| @command{tar} preserves times-tamps, these rebuild rules are not |
| triggered when a user unpacks and builds a package. |
| |
| @subheading Background: CVS and Timestamps |
| @cindex timestamps and CVS |
| @cindex CVS and timestamps |
| |
| Unless you use CVS keywords (in which case files must be updated at |
| commit time), CVS preserves timestamp during @samp{cvs commit} and |
| @samp{cvs import -d} operations. |
| |
| When you check out a file using @samp{cvs checkout} its timestamp is |
| set to that of the revision that is being checked out. |
| |
| However, during @command{cvs update}, files will have the date of the |
| update, not the original timestamp of this revision. This is meant to |
| make sure that @command{make} notices sources files have been updated. |
| |
| This timestamp shift is troublesome when both sources and generated |
| files are kept under CVS@. Because CVS processes files in lexical |
| order, @file{configure.ac} will appear newer than @file{configure} |
| after a @command{cvs update} that updates both files, even if |
| @file{configure} was newer than @file{configure.ac} when it was |
| checked in. Calling @command{make} will then trigger a spurious rebuild |
| of @file{configure}. |
| |
| @subheading Living with CVS in Autoconfiscated Projects |
| @cindex CVS and generated files |
| @cindex generated files and CVS |
| |
| There are basically two clans amongst maintainers: those who keep all |
| distributed files under CVS, including generated files, and those who |
| keep generated files @emph{out} of CVS. |
| |
| @subsubheading All Files in CVS |
| |
| @itemize @bullet |
| @item |
| The CVS repository contains all distributed files so you know exactly |
| what is distributed, and you can checkout any prior version entirely. |
| |
| @item |
| Maintainers can see how generated files evolve (for instance, you can |
| see what happens to your @file{Makefile.in}s when you upgrade Automake |
| and make sure they look OK). |
| |
| @item |
| Users do not need the autotools to build a checkout of the project, it |
| works just like a released tarball. |
| |
| @item |
| If users use @command{cvs update} to update their copy, instead of |
| @command{cvs checkout} to fetch a fresh one, timestamps will be |
| inaccurate. Some rebuild rules will be triggered and attempt to |
| run developer tools such as @command{autoconf} or @command{automake}. |
| |
| Calls to such tools are all wrapped into a call to the @command{missing} |
| script discussed later (@pxref{maintainer-mode}), so that the user will |
| see more descriptive warnings about missing or out-of-date tools, and |
| possible suggestions about how to obtain them, rather than just some |
| ``command not found'' error, or (worse) some obscure message from some |
| older version of the required tool they happen to have installed. |
| |
| Maintainers interested in keeping their package buildable from a CVS |
| checkout even for those users that lack maintainer-specific tools might |
| want to provide an helper script (or to enhance their existing bootstrap |
| script) to fix the timestamps after a |
| @command{cvs update} or a @command{git checkout}, to prevent spurious |
| rebuilds. In case of a project committing the Autotools-generated |
| files, as well as the generated @file{.info} files, such script might |
| look something like this: |
| |
| @smallexample |
| #!/bin/sh |
| # fix-timestamp.sh: prevents useless rebuilds after "cvs update" |
| sleep 1 |
| # aclocal-generated aclocal.m4 depends on locally-installed |
| # '.m4' macro files, as well as on 'configure.ac' |
| touch aclocal.m4 |
| sleep 1 |
| # autoconf-generated configure depends on aclocal.m4 and on |
| # configure.ac |
| touch configure |
| # so does autoheader-generated config.h.in |
| touch config.h.in |
| # and all the automake-generated Makefile.in files |
| touch `find . -name Makefile.in -print` |
| # finally, the makeinfo-generated '.info' files depend on the |
| # corresponding '.texi' files |
| touch doc/*.info |
| @end smallexample |
| |
| @item |
| In distributed development, developers are likely to have different |
| version of the maintainer tools installed. In this case rebuilds |
| triggered by timestamp lossage will lead to spurious changes |
| to generated files. There are several solutions to this: |
| |
| @itemize |
| @item |
| All developers should use the same versions, so that the rebuilt files |
| are identical to files in CVS@. (This starts to be difficult when each |
| project you work on uses different versions.) |
| @item |
| Or people use a script to fix the timestamp after a checkout (the GCC |
| folks have such a script). |
| @item |
| Or @file{configure.ac} uses @code{AM_MAINTAINER_MODE}, which will |
| disable all of these rebuild rules by default. This is further discussed |
| in @ref{maintainer-mode}. |
| @end itemize |
| |
| @item |
| Although we focused on spurious rebuilds, the converse can also |
| happen. CVS's timestamp handling can also let you think an |
| out-of-date file is up-to-date. |
| |
| For instance, suppose a developer has modified @file{Makefile.am} and |
| has rebuilt @file{Makefile.in}, and then decides to do a last-minute |
| change to @file{Makefile.am} right before checking in both files |
| (without rebuilding @file{Makefile.in} to account for the change). |
| |
| This last change to @file{Makefile.am} makes the copy of |
| @file{Makefile.in} out-of-date. Since CVS processes files |
| alphabetically, when another developer @samp{cvs update}s his or her |
| tree, @file{Makefile.in} will happen to be newer than |
| @file{Makefile.am}. This other developer will not see that |
| @file{Makefile.in} is out-of-date. |
| |
| @end itemize |
| |
| @subsubheading Generated Files out of CVS |
| |
| One way to get CVS and @command{make} working peacefully is to never |
| store generated files in CVS, i.e., do not CVS-control files that |
| are @file{Makefile} targets (also called @emph{derived} files). |
| |
| This way developers are not annoyed by changes to generated files. It |
| does not matter if they all have different versions (assuming they are |
| compatible, of course). And finally, timestamps are not lost, changes |
| to sources files can't be missed as in the |
| @file{Makefile.am}/@file{Makefile.in} example discussed earlier. |
| |
| The drawback is that the CVS repository is not an exact copy of what |
| is distributed and that users now need to install various development |
| tools (maybe even specific versions) before they can build a checkout. |
| But, after all, CVS's job is versioning, not distribution. |
| |
| Allowing developers to use different versions of their tools can also |
| hide bugs during distributed development. Indeed, developers will be |
| using (hence testing) their own generated files, instead of the |
| generated files that will be released actually. The developer who |
| prepares the tarball might be using a version of the tool that |
| produces bogus output (for instance a non-portable C file), something |
| other developers could have noticed if they weren't using their own |
| versions of this tool. |
| |
| @subheading Third-party Files |
| @cindex CVS and third-party files |
| @cindex third-party files and CVS |
| |
| Another class of files not discussed here (because they do not cause |
| timestamp issues) are files that are shipped with a package, but |
| maintained elsewhere. For instance, tools like @command{gettextize} |
| and @command{autopoint} (from Gettext) or @command{libtoolize} (from |
| Libtool), will install or update files in your package. |
| |
| These files, whether they are kept under CVS or not, raise similar |
| concerns about version mismatch between developers' tools. The |
| Gettext manual has a section about this, see @ref{CVS Issues, CVS |
| Issues, Integrating with CVS, gettext, GNU gettext tools}. |
| |
| @node maintainer-mode |
| @section @command{missing} and @code{AM_MAINTAINER_MODE} |
| |
| @subheading @command{missing} |
| @cindex @command{missing}, purpose |
| |
| The @command{missing} script is a wrapper around several maintainer |
| tools, designed to warn users if a maintainer tool is required but |
| missing. Typical maintainer tools are @command{autoconf}, |
| @command{automake}, @command{bison}, etc. Because file generated by |
| these tools are shipped with the other sources of a package, these |
| tools shouldn't be required during a user build and they are not |
| checked for in @file{configure}. |
| |
| However, if for some reason a rebuild rule is triggered and involves a |
| missing tool, @command{missing} will notice it and warn the user, even |
| suggesting how to obtain such a tool (at least in case it is a well-known |
| one, like @command{makeinfo} or @command{bison}). This is more helpful |
| and user-friendly than just having the rebuild rules spewing out a terse |
| error message like @samp{sh: @var{tool}: command not found}. Similarly, |
| @command{missing} will warn the user if it detects that a maintainer |
| tool it attempted to use seems too old (be warned that diagnosing this |
| correctly is typically more difficult that detecting missing tools, and |
| requires cooperation from the tool itself, so it won't always work). |
| |
| If the required tool is installed, @command{missing} will run it and |
| won't attempt to continue after failures. This is correct during |
| development: developers love fixing failures. However, users with |
| missing or too old maintainer tools may get an error when the rebuild |
| rule is spuriously triggered, halting the build. This failure to let |
| the build continue is one of the arguments of the |
| @code{AM_MAINTAINER_MODE} advocates. |
| |
| @subheading @code{AM_MAINTAINER_MODE} |
| @cindex @code{AM_MAINTAINER_MODE}, purpose |
| @acindex AM_MAINTAINER_MODE |
| |
| @code{AM_MAINTAINER_MODE} allows you to choose whether the so called |
| "rebuild rules" should be enabled or disabled. With |
| @code{AM_MAINTAINER_MODE([enable])}, they are enabled by default, |
| otherwise they are disabled by default. In the latter case, if |
| you have @code{AM_MAINTAINER_MODE} in @file{configure.ac}, and run |
| @samp{./configure && make}, then @command{make} will *never* attempt to |
| rebuild @file{configure}, @file{Makefile.in}s, Lex or Yacc outputs, etc. |
| I.e., this disables build rules for files that are usually distributed |
| and that users should normally not have to update. |
| |
| The user can override the default setting by passing either |
| @samp{--enable-maintainer-mode} or @samp{--disable-maintainer-mode} |
| to @command{configure}. |
| |
| People use @code{AM_MAINTAINER_MODE} either because they do not want their |
| users (or themselves) annoyed by timestamps lossage (@pxref{CVS}), or |
| because they simply can't stand the rebuild rules and prefer running |
| maintainer tools explicitly. |
| |
| @code{AM_MAINTAINER_MODE} also allows you to disable some custom build |
| rules conditionally. Some developers use this feature to disable |
| rules that need exotic tools that users may not have available. |
| |
| Several years ago Fran@,{c}ois Pinard pointed out several arguments |
| against this @code{AM_MAINTAINER_MODE} macro. Most of them relate to |
| insecurity. By removing dependencies you get non-dependable builds: |
| changes to sources files can have no effect on generated files and this |
| can be very confusing when unnoticed. He adds that security shouldn't |
| be reserved to maintainers (what @option{--enable-maintainer-mode} |
| suggests), on the contrary. If one user has to modify a |
| @file{Makefile.am}, then either @file{Makefile.in} should be updated |
| or a warning should be output (this is what Automake uses |
| @command{missing} for) but the last thing you want is that nothing |
| happens and the user doesn't notice it (this is what happens when |
| rebuild rules are disabled by @code{AM_MAINTAINER_MODE}). |
| |
| Jim Meyering, the inventor of the @code{AM_MAINTAINER_MODE} macro was |
| swayed by Fran@,{c}ois's arguments, and got rid of |
| @code{AM_MAINTAINER_MODE} in all of his packages. |
| |
| Still many people continue to use @code{AM_MAINTAINER_MODE}, because |
| it helps them working on projects where all files are kept under version |
| control, and because @command{missing} isn't enough if you have the |
| wrong version of the tools. |
| |
| |
| @node Wildcards |
| @section Why doesn't Automake support wildcards? |
| @cindex wildcards |
| |
| Developers are lazy. They would often like to use wildcards in |
| @file{Makefile.am}s, so that they would not need to remember to |
| update @file{Makefile.am}s every time they add, delete, or rename |
| a file. |
| |
| There are several objections to this: |
| @itemize |
| @item |
| When using CVS (or similar) developers need to remember they have to |
| run @samp{cvs add} or @samp{cvs rm} anyway. Updating |
| @file{Makefile.am} accordingly quickly becomes a reflex. |
| |
| Conversely, if your application doesn't compile |
| because you forgot to add a file in @file{Makefile.am}, it will help |
| you remember to @samp{cvs add} it. |
| |
| @item |
| Using wildcards makes it easy to distribute files by mistake. For |
| instance, some code a developer is experimenting with (a test case, |
| say) that should not be part of the distribution. |
| |
| @item |
| Using wildcards it's easy to omit some files by mistake. For |
| instance, one developer creates a new file, uses it in many places, |
| but forgets to commit it. Another developer then checks out the |
| incomplete project and is able to run @samp{make dist} successfully, |
| even though a file is missing. By listing files, @samp{make dist} |
| @emph{will} complain. |
| |
| @item |
| Wildcards are not portable to some non-GNU @command{make} implementations, |
| e.g., NetBSD @command{make} will not expand globs such as @samp{*} in |
| prerequisites of a target. |
| |
| @item |
| Finally, it's really hard to @emph{forget} to add a file to |
| @file{Makefile.am}: files that are not listed in @file{Makefile.am} are |
| not compiled or installed, so you can't even test them. |
| @end itemize |
| |
| Still, these are philosophical objections, and as such you may disagree, |
| or find enough value in wildcards to dismiss all of them. Before you |
| start writing a patch against Automake to teach it about wildcards, |
| let's see the main technical issue: portability. |
| |
| Although @samp{$(wildcard ...)} works with GNU @command{make}, it is |
| not portable to other @command{make} implementations. |
| |
| The only way Automake could support @command{$(wildcard ...)} is by |
| expanding @command{$(wildcard ...)} when @command{automake} is run. |
| The resulting @file{Makefile.in}s would be portable since they would |
| list all files and not use @samp{$(wildcard ...)}. However that |
| means developers would need to remember to run @command{automake} each |
| time they add, delete, or rename files. |
| |
| Compared to editing @file{Makefile.am}, this is a very small gain. Sure, |
| it's easier and faster to type @samp{automake; make} than to type |
| @samp{emacs Makefile.am; make}. But nobody bothered enough to write a |
| patch to add support for this syntax. Some people use scripts to |
| generate file lists in @file{Makefile.am} or in separate |
| @file{Makefile} fragments. |
| |
| Even if you don't care about portability, and are tempted to use |
| @samp{$(wildcard ...)} anyway because you target only GNU Make, you |
| should know there are many places where Automake needs to know exactly |
| which files should be processed. As Automake doesn't know how to |
| expand @samp{$(wildcard ...)}, you cannot use it in these places. |
| @samp{$(wildcard ...)} is a black box comparable to @code{AC_SUBST}ed |
| variables as far Automake is concerned. |
| |
| You can get warnings about @samp{$(wildcard ...}) constructs using the |
| @option{-Wportability} flag. |
| |
| @node Limitations on File Names |
| @section Limitations on File Names |
| @cindex file names, limitations on |
| |
| Automake attempts to support all kinds of file names, even those that |
| contain unusual characters or are unusually long. However, some |
| limitations are imposed by the underlying operating system and tools. |
| |
| Most operating systems prohibit the use of the null byte in file |
| names, and reserve @samp{/} as a directory separator. Also, they |
| require that file names are properly encoded for the user's locale. |
| Automake is subject to these limits. |
| |
| Portable packages should limit themselves to POSIX file |
| names. These can contain ASCII letters and digits, |
| @samp{_}, @samp{.}, and @samp{-}. File names consist of components |
| separated by @samp{/}. File name components cannot begin with |
| @samp{-}. |
| |
| Portable POSIX file names cannot contain components that exceed a |
| 14-byte limit, but nowadays it's normally safe to assume the |
| more-generous XOPEN limit of 255 bytes. POSIX |
| limits file names to 255 bytes (XOPEN allows 1023 bytes), |
| but you may want to limit a source tarball to file names of 99 bytes |
| to avoid interoperability problems with old versions of @command{tar}. |
| |
| If you depart from these rules (e.g., by using non-ASCII |
| characters in file names, or by using lengthy file names), your |
| installers may have problems for reasons unrelated to Automake. |
| However, if this does not concern you, you should know about the |
| limitations imposed by Automake itself. These limitations are |
| undesirable, but some of them seem to be inherent to underlying tools |
| like Autoconf, Make, M4, and the shell. They fall into three |
| categories: install directories, build directories, and file names. |
| |
| The following characters: |
| |
| @example |
| @r{newline} " # $ ' ` |
| @end example |
| |
| should not appear in the names of install directories. For example, |
| the operand of @command{configure}'s @option{--prefix} option should |
| not contain these characters. |
| |
| Build directories suffer the same limitations as install directories, |
| and in addition should not contain the following characters: |
| |
| @example |
| & @@ \ |
| @end example |
| |
| For example, the full name of the directory containing the source |
| files should not contain these characters. |
| |
| Source and installation file names like @file{main.c} are limited even |
| further: they should conform to the POSIX/XOPEN |
| rules described above. In addition, if you plan to port to |
| non-POSIX environments, you should avoid file names that |
| differ only in case (e.g., @file{makefile} and @file{Makefile}). |
| Nowadays it is no longer worth worrying about the 8.3 limits of |
| DOS file systems. |
| |
| @c FIXME This should probably be moved in the "Checking the Distribution" |
| @c FIXME section... |
| @node Errors with distclean |
| @section Errors with distclean |
| @cindex @code{distclean}, diagnostic |
| @cindex @samp{make distclean}, diagnostic |
| @cindex dependencies and distributed files |
| @trindex distclean |
| |
| This is a diagnostic you might encounter while running @samp{make |
| distcheck}. |
| |
| As explained in @ref{Checking the Distribution}, @samp{make distcheck} |
| attempts to build and check your package for errors like this one. |
| |
| @samp{make distcheck} will perform a @code{VPATH} build of your |
| package (@pxref{VPATH Builds}), and then call @samp{make distclean}. |
| Files left in the build directory after @samp{make distclean} has run |
| are listed after this error. |
| |
| This diagnostic really covers two kinds of errors: |
| |
| @itemize @bullet |
| @item |
| files that are forgotten by distclean; |
| @item |
| distributed files that are erroneously rebuilt. |
| @end itemize |
| |
| The former left-over files are not distributed, so the fix is to mark |
| them for cleaning (@pxref{Clean}), this is obvious and doesn't deserve |
| more explanations. |
| |
| The latter bug is not always easy to understand and fix, so let's |
| proceed with an example. Suppose our package contains a program for |
| which we want to build a man page using @command{help2man}. GNU |
| @command{help2man} produces simple manual pages from the @option{--help} |
| and @option{--version} output of other commands (@pxref{Top, , Overview, |
| help2man, The Help2man Manual}). Because we don't want to force our |
| users to install @command{help2man}, we decide to distribute the |
| generated man page using the following setup. |
| |
| @example |
| # This Makefile.am is bogus. |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| dist_man_MANS = foo.1 |
| |
| foo.1: foo$(EXEEXT) |
| help2man --output=foo.1 ./foo$(EXEEXT) |
| @end example |
| |
| This will effectively distribute the man page. However, |
| @samp{make distcheck} will fail with: |
| |
| @example |
| ERROR: files left in build directory after distclean: |
| ./foo.1 |
| @end example |
| |
| Why was @file{foo.1} rebuilt? Because although distributed, |
| @file{foo.1} depends on a non-distributed built file: |
| @file{foo$(EXEEXT)}. @file{foo$(EXEEXT)} is built by the user, so it |
| will always appear to be newer than the distributed @file{foo.1}. |
| |
| @samp{make distcheck} caught an inconsistency in our package. Our |
| intent was to distribute @file{foo.1} so users do not need to install |
| @command{help2man}, however since this rule causes this file to be |
| always rebuilt, users @emph{do} need @command{help2man}. Either we |
| should ensure that @file{foo.1} is not rebuilt by users, or there is |
| no point in distributing @file{foo.1}. |
| |
| More generally, the rule is that distributed files should never depend |
| on non-distributed built files. If you distribute something |
| generated, distribute its sources. |
| |
| One way to fix the above example, while still distributing |
| @file{foo.1} is to not depend on @file{foo$(EXEEXT)}. For instance, |
| assuming @command{foo --version} and @command{foo --help} do not |
| change unless @file{foo.c} or @file{configure.ac} change, we could |
| write the following @file{Makefile.am}: |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c |
| dist_man_MANS = foo.1 |
| |
| foo.1: foo.c $(top_srcdir)/configure.ac |
| $(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT) |
| help2man --output=foo.1 ./foo$(EXEEXT) |
| @end example |
| |
| This way, @file{foo.1} will not get rebuilt every time |
| @file{foo$(EXEEXT)} changes. The @command{make} call makes sure |
| @file{foo$(EXEEXT)} is up-to-date before @command{help2man}. Another |
| way to ensure this would be to use separate directories for binaries |
| and man pages, and set @code{SUBDIRS} so that binaries are built |
| before man pages. |
| |
| We could also decide not to distribute @file{foo.1}. In |
| this case it's fine to have @file{foo.1} dependent upon |
| @file{foo$(EXEEXT)}, since both will have to be rebuilt. |
| However it would be impossible to build the package in a |
| cross-compilation, because building @file{foo.1} involves |
| an @emph{execution} of @file{foo$(EXEEXT)}. |
| |
| Another context where such errors are common is when distributed files |
| are built by tools that are built by the package. The pattern is |
| similar: |
| |
| @example |
| distributed-file: built-tools distributed-sources |
| build-command |
| @end example |
| |
| @noindent |
| should be changed to |
| |
| @example |
| distributed-file: distributed-sources |
| $(MAKE) $(AM_MAKEFLAGS) built-tools |
| build-command |
| @end example |
| |
| @noindent |
| or you could choose not to distribute @file{distributed-file}, if |
| cross-compilation does not matter. |
| |
| The points made through these examples are worth a summary: |
| |
| @cartouche |
| @itemize |
| @item |
| Distributed files should never depend upon non-distributed built |
| files. |
| @item |
| Distributed files should be distributed with all their dependencies. |
| @item |
| If a file is @emph{intended} to be rebuilt by users, then there is no point |
| in distributing it. |
| @end itemize |
| @end cartouche |
| |
| @vrindex distcleancheck_listfiles |
| For desperate cases, it's always possible to disable this check by |
| setting @code{distcleancheck_listfiles} as documented in @ref{Checking |
| the Distribution}. |
| Make sure you do understand the reason why @samp{make distcheck} |
| complains before you do this. @code{distcleancheck_listfiles} is a |
| way to @emph{hide} errors, not to fix them. You can always do better. |
| |
| @node Flag Variables Ordering |
| @section Flag Variables Ordering |
| @cindex Ordering flag variables |
| @cindex Flag variables, ordering |
| |
| @display |
| What is the difference between @code{AM_CFLAGS}, @code{CFLAGS}, and |
| @code{mumble_CFLAGS}? |
| @end display |
| |
| @display |
| Why does @command{automake} output @code{CPPFLAGS} after |
| @code{AM_CPPFLAGS} on compile lines? Shouldn't it be the converse? |
| @end display |
| |
| @display |
| My @file{configure} adds some warning flags into @code{CXXFLAGS}. In |
| one @file{Makefile.am} I would like to append a new flag, however if I |
| put the flag into @code{AM_CXXFLAGS} it is prepended to the other |
| flags, not appended. |
| @end display |
| |
| @subheading Compile Flag Variables |
| @cindex Flag Variables, Ordering |
| @cindex Compile Flag Variables |
| @cindex @code{AM_CCASFLAGS} and @code{CCASFLAGS} |
| @cindex @code{AM_CFLAGS} and @code{CFLAGS} |
| @cindex @code{AM_CPPFLAGS} and @code{CPPFLAGS} |
| @cindex @code{AM_CXXFLAGS} and @code{CXXFLAGS} |
| @cindex @code{AM_FCFLAGS} and @code{FCFLAGS} |
| @cindex @code{AM_FFLAGS} and @code{FFLAGS} |
| @cindex @code{AM_GCJFLAGS} and @code{GCJFLAGS} |
| @cindex @code{AM_LDFLAGS} and @code{LDFLAGS} |
| @cindex @code{AM_LFLAGS} and @code{LFLAGS} |
| @cindex @code{AM_LIBTOOLFLAGS} and @code{LIBTOOLFLAGS} |
| @cindex @code{AM_OBJCFLAGS} and @code{OBJCFLAGS} |
| @cindex @code{AM_OBJCXXFLAGS} and @code{OBJXXCFLAGS} |
| @cindex @code{AM_RFLAGS} and @code{RFLAGS} |
| @cindex @code{AM_UPCFLAGS} and @code{UPCFLAGS} |
| @cindex @code{AM_YFLAGS} and @code{YFLAGS} |
| @cindex @code{CCASFLAGS} and @code{AM_CCASFLAGS} |
| @cindex @code{CFLAGS} and @code{AM_CFLAGS} |
| @cindex @code{CPPFLAGS} and @code{AM_CPPFLAGS} |
| @cindex @code{CXXFLAGS} and @code{AM_CXXFLAGS} |
| @cindex @code{FCFLAGS} and @code{AM_FCFLAGS} |
| @cindex @code{FFLAGS} and @code{AM_FFLAGS} |
| @cindex @code{GCJFLAGS} and @code{AM_GCJFLAGS} |
| @cindex @code{LDFLAGS} and @code{AM_LDFLAGS} |
| @cindex @code{LFLAGS} and @code{AM_LFLAGS} |
| @cindex @code{LIBTOOLFLAGS} and @code{AM_LIBTOOLFLAGS} |
| @cindex @code{OBJCFLAGS} and @code{AM_OBJCFLAGS} |
| @cindex @code{OBJCXXFLAGS} and @code{AM_OBJCXXFLAGS} |
| @cindex @code{RFLAGS} and @code{AM_RFLAGS} |
| @cindex @code{UPCFLAGS} and @code{AM_UPCFLAGS} |
| @cindex @code{YFLAGS} and @code{AM_YFLAGS} |
| |
| This section attempts to answer all the above questions. We will |
| mostly discuss @code{CPPFLAGS} in our examples, but actually the |
| answer holds for all the compile flags used in Automake: |
| @code{CCASFLAGS}, @code{CFLAGS}, @code{CPPFLAGS}, @code{CXXFLAGS}, |
| @code{FCFLAGS}, @code{FFLAGS}, @code{GCJFLAGS}, @code{LDFLAGS}, |
| @code{LFLAGS}, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, @code{OBJCXXFLAGS}, |
| @code{RFLAGS}, @code{UPCFLAGS}, and @code{YFLAGS}. |
| |
| @code{CPPFLAGS}, @code{AM_CPPFLAGS}, and @code{mumble_CPPFLAGS} are |
| three variables that can be used to pass flags to the C preprocessor |
| (actually these variables are also used for other languages like C++ |
| or preprocessed Fortran). @code{CPPFLAGS} is the user variable |
| (@pxref{User Variables}), @code{AM_CPPFLAGS} is the Automake variable, |
| and @code{mumble_CPPFLAGS} is the variable specific to the |
| @code{mumble} target (we call this a per-target variable, |
| @pxref{Program and Library Variables}). |
| |
| Automake always uses two of these variables when compiling C sources |
| files. When compiling an object file for the @code{mumble} target, |
| the first variable will be @code{mumble_CPPFLAGS} if it is defined, or |
| @code{AM_CPPFLAGS} otherwise. The second variable is always |
| @code{CPPFLAGS}. |
| |
| In the following example, |
| |
| @example |
| bin_PROGRAMS = foo bar |
| foo_SOURCES = xyz.c |
| bar_SOURCES = main.c |
| foo_CPPFLAGS = -DFOO |
| AM_CPPFLAGS = -DBAZ |
| @end example |
| |
| @noindent |
| @file{xyz.o} will be compiled with @samp{$(foo_CPPFLAGS) $(CPPFLAGS)}, |
| (because @file{xyz.o} is part of the @code{foo} target), while |
| @file{main.o} will be compiled with @samp{$(AM_CPPFLAGS) $(CPPFLAGS)} |
| (because there is no per-target variable for target @code{bar}). |
| |
| The difference between @code{mumble_CPPFLAGS} and @code{AM_CPPFLAGS} |
| being clear enough, let's focus on @code{CPPFLAGS}. @code{CPPFLAGS} |
| is a user variable, i.e., a variable that users are entitled to modify |
| in order to compile the package. This variable, like many others, |
| is documented at the end of the output of @samp{configure --help}. |
| |
| For instance, someone who needs to add @file{/home/my/usr/include} to |
| the C compiler's search path would configure a package with |
| |
| @example |
| ./configure CPPFLAGS='-I /home/my/usr/include' |
| @end example |
| |
| @noindent |
| and this flag would be propagated to the compile rules of all |
| @file{Makefile}s. |
| |
| It is also not uncommon to override a user variable at |
| @command{make}-time. Many installers do this with @code{prefix}, but |
| this can be useful with compiler flags too. For instance, if, while |
| debugging a C++ project, you need to disable optimization in one |
| specific object file, you can run something like |
| |
| @example |
| rm file.o |
| make CXXFLAGS=-O0 file.o |
| make |
| @end example |
| |
| The reason @samp{$(CPPFLAGS)} appears after @samp{$(AM_CPPFLAGS)} or |
| @samp{$(mumble_CPPFLAGS)} in the compile command is that users |
| should always have the last say. It probably makes more sense if you |
| think about it while looking at the @samp{CXXFLAGS=-O0} above, which |
| should supersede any other switch from @code{AM_CXXFLAGS} or |
| @code{mumble_CXXFLAGS} (and this of course replaces the previous value |
| of @code{CXXFLAGS}). |
| |
| You should never redefine a user variable such as @code{CPPFLAGS} in |
| @file{Makefile.am}. Use @samp{automake -Woverride} to diagnose such |
| mistakes. Even something like |
| |
| @example |
| CPPFLAGS = -DDATADIR=\"$(datadir)\" @@CPPFLAGS@@ |
| @end example |
| |
| @noindent |
| is erroneous. Although this preserves @file{configure}'s value of |
| @code{CPPFLAGS}, the definition of @code{DATADIR} will disappear if a |
| user attempts to override @code{CPPFLAGS} from the @command{make} |
| command line. |
| |
| @example |
| AM_CPPFLAGS = -DDATADIR=\"$(datadir)\" |
| @end example |
| |
| @noindent |
| is all that is needed here if no per-target flags are used. |
| |
| You should not add options to these user variables within |
| @file{configure} either, for the same reason. Occasionally you need |
| to modify these variables to perform a test, but you should reset |
| their values afterwards. In contrast, it is OK to modify the |
| @samp{AM_} variables within @file{configure} if you @code{AC_SUBST} |
| them, but it is rather rare that you need to do this, unless you |
| really want to change the default definitions of the @samp{AM_} |
| variables in all @file{Makefile}s. |
| |
| What we recommend is that you define extra flags in separate |
| variables. For instance, you may write an Autoconf macro that computes |
| a set of warning options for the C compiler, and @code{AC_SUBST} them |
| in @code{WARNINGCFLAGS}; you may also have an Autoconf macro that |
| determines which compiler and which linker flags should be used to |
| link with library @file{libfoo}, and @code{AC_SUBST} these in |
| @code{LIBFOOCFLAGS} and @code{LIBFOOLDFLAGS}. Then, a |
| @file{Makefile.am} could use these variables as follows: |
| |
| @example |
| AM_CFLAGS = $(WARNINGCFLAGS) |
| bin_PROGRAMS = prog1 prog2 |
| prog1_SOURCES = @dots{} |
| prog2_SOURCES = @dots{} |
| prog2_CFLAGS = $(LIBFOOCFLAGS) $(AM_CFLAGS) |
| prog2_LDFLAGS = $(LIBFOOLDFLAGS) |
| @end example |
| |
| In this example both programs will be compiled with the flags |
| substituted into @samp{$(WARNINGCFLAGS)}, and @code{prog2} will |
| additionally be compiled with the flags required to link with |
| @file{libfoo}. |
| |
| Note that listing @code{AM_CFLAGS} in a per-target @code{CFLAGS} |
| variable is a common idiom to ensure that @code{AM_CFLAGS} applies to |
| every target in a @file{Makefile.in}. |
| |
| Using variables like this gives you full control over the ordering of |
| the flags. For instance, if there is a flag in $(WARNINGCFLAGS) that |
| you want to negate for a particular target, you can use something like |
| @samp{prog1_CFLAGS = $(AM_CFLAGS) -no-flag}. If all of these flags had |
| been forcefully appended to @code{CFLAGS}, there would be no way to |
| disable one flag. Yet another reason to leave user variables to |
| users. |
| |
| Finally, we have avoided naming the variable of the example |
| @code{LIBFOO_LDFLAGS} (with an underscore) because that would cause |
| Automake to think that this is actually a per-target variable (like |
| @code{mumble_LDFLAGS}) for some non-declared @code{LIBFOO} target. |
| |
| @subheading Other Variables |
| |
| There are other variables in Automake that follow similar principles |
| to allow user options. For instance, Texinfo rules (@pxref{Texinfo}) |
| use @code{MAKEINFOFLAGS} and @code{AM_MAKEINFOFLAGS}. Similarly, |
| DejaGnu tests (@pxref{DejaGnu Tests}) use @code{RUNTESTDEFAULTFLAGS} and |
| @code{AM_RUNTESTDEFAULTFLAGS}. The tags and ctags rules |
| (@pxref{Tags}) use @code{ETAGSFLAGS}, @code{AM_ETAGSFLAGS}, |
| @code{CTAGSFLAGS}, and @code{AM_CTAGSFLAGS}. Java rules |
| (@pxref{Java}) use @code{JAVACFLAGS} and @code{AM_JAVACFLAGS}. None |
| of these rules support per-target flags (yet). |
| |
| To some extent, even @code{AM_MAKEFLAGS} (@pxref{Subdirectories}) |
| obeys this naming scheme. The slight difference is that |
| @code{MAKEFLAGS} is passed to sub-@command{make}s implicitly by |
| @command{make} itself. |
| |
| @code{ARFLAGS} (@pxref{A Library}) is usually defined by Automake and |
| has neither @code{AM_} nor per-target cousin. |
| |
| Finally you should not think that the existence of a per-target |
| variable implies the existence of an @code{AM_} variable or of a user |
| variable. For instance, the @code{mumble_LDADD} per-target variable |
| overrides the makefile-wide @code{LDADD} variable (which is not a user |
| variable), and @code{mumble_LIBADD} exists only as a per-target |
| variable. @xref{Program and Library Variables}. |
| |
| |
| @node Renamed Objects |
| @section Why are object files sometimes renamed? |
| |
| This happens when per-target compilation flags are used. Object |
| files need to be renamed just in case they would clash with object |
| files compiled from the same sources, but with different flags. |
| Consider the following example. |
| |
| @example |
| bin_PROGRAMS = true false |
| true_SOURCES = generic.c |
| true_CPPFLAGS = -DEXIT_CODE=0 |
| false_SOURCES = generic.c |
| false_CPPFLAGS = -DEXIT_CODE=1 |
| @end example |
| |
| @noindent |
| Obviously the two programs are built from the same source, but it |
| would be bad if they shared the same object, because @file{generic.o} |
| cannot be built with both @samp{-DEXIT_CODE=0} @emph{and} |
| @samp{-DEXIT_CODE=1}. Therefore @command{automake} outputs rules to |
| build two different objects: @file{true-generic.o} and |
| @file{false-generic.o}. |
| |
| @command{automake} doesn't actually look whether source files are |
| shared to decide if it must rename objects. It will just rename all |
| objects of a target as soon as it sees per-target compilation flags |
| used. |
| |
| It's OK to share object files when per-target compilation flags are not |
| used. For instance, @file{true} and @file{false} will both use |
| @file{version.o} in the following example. |
| |
| @example |
| AM_CPPFLAGS = -DVERSION=1.0 |
| bin_PROGRAMS = true false |
| true_SOURCES = true.c version.c |
| false_SOURCES = false.c version.c |
| @end example |
| |
| Note that the renaming of objects is also affected by the |
| @code{_SHORTNAME} variable (@pxref{Program and Library Variables}). |
| |
| |
| @node Per-Object Flags |
| @section Per-Object Flags Emulation |
| @cindex Per-object flags, emulated |
| |
| @display |
| One of my source files needs to be compiled with different flags. How |
| do I do? |
| @end display |
| |
| Automake supports per-program and per-library compilation flags (see |
| @ref{Program and Library Variables} and @ref{Flag Variables |
| Ordering}). With this you can define compilation flags that apply to |
| all files compiled for a target. For instance, in |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = foo.c foo.h bar.c bar.h main.c |
| foo_CFLAGS = -some -flags |
| @end example |
| |
| @noindent |
| @file{foo-foo.o}, @file{foo-bar.o}, and @file{foo-main.o} will all be |
| compiled with @samp{-some -flags}. (If you wonder about the names of |
| these object files, see @ref{Renamed Objects}.) Note that |
| @code{foo_CFLAGS} gives the flags to use when compiling all the C |
| sources of the @emph{program} @code{foo}, it has nothing to do with |
| @file{foo.c} or @file{foo-foo.o} specifically. |
| |
| What if @file{foo.c} needs to be compiled into @file{foo.o} using some |
| specific flags, that none of the other files requires? Obviously |
| per-program flags are not directly applicable here. Something like |
| per-object flags are expected, i.e., flags that would be used only |
| when creating @file{foo-foo.o}. Automake does not support that, |
| however this is easy to simulate using a library that contains only |
| that object, and compiling this library with per-library flags. |
| |
| @example |
| bin_PROGRAMS = foo |
| foo_SOURCES = bar.c bar.h main.c |
| foo_CFLAGS = -some -flags |
| foo_LDADD = libfoo.a |
| noinst_LIBRARIES = libfoo.a |
| libfoo_a_SOURCES = foo.c foo.h |
| libfoo_a_CFLAGS = -some -other -flags |
| @end example |
| |
| Here @file{foo-bar.o} and @file{foo-main.o} will all be |
| compiled with @samp{-some -flags}, while @file{libfoo_a-foo.o} will |
| be compiled using @samp{-some -other -flags}. Eventually, all |
| three objects will be linked to form @file{foo}. |
| |
| This trick can also be achieved using Libtool convenience libraries, |
| for instance @samp{noinst_LTLIBRARIES = libfoo.la} (@pxref{Libtool |
| Convenience Libraries}). |
| |
| Another tempting idea to implement per-object flags is to override the |
| compile rules @command{automake} would output for these files. |
| Automake will not define a rule for a target you have defined, so you |
| could think about defining the @samp{foo-foo.o: foo.c} rule yourself. |
| We recommend against this, because this is error prone. For instance, |
| if you add such a rule to the first example, it will break the day you |
| decide to remove @code{foo_CFLAGS} (because @file{foo.c} will then be |
| compiled as @file{foo.o} instead of @file{foo-foo.o}, @pxref{Renamed |
| Objects}). Also in order to support dependency tracking, the two |
| @file{.o}/@file{.obj} extensions, and all the other flags variables |
| involved in a compilation, you will end up modifying a copy of the |
| rule previously output by @command{automake} for this file. If a new |
| release of Automake generates a different rule, your copy will need to |
| be updated by hand. |
| |
| @node Multiple Outputs |
| @section Handling Tools that Produce Many Outputs |
| @cindex multiple outputs, rules with |
| @cindex many outputs, rules with |
| @cindex rules with multiple outputs |
| |
| This section describes a @command{make} idiom that can be used when a |
| tool produces multiple output files. It is not specific to Automake |
| and can be used in ordinary @file{Makefile}s. |
| |
| Suppose we have a program called @command{foo} that will read one file |
| called @file{data.foo} and produce two files named @file{data.c} and |
| @file{data.h}. We want to write a @file{Makefile} rule that captures |
| this one-to-two dependency. |
| |
| The naive rule is incorrect: |
| |
| @example |
| # This is incorrect. |
| data.c data.h: data.foo |
| foo data.foo |
| @end example |
| |
| @noindent |
| What the above rule really says is that @file{data.c} and |
| @file{data.h} each depend on @file{data.foo}, and can each be built by |
| running @samp{foo data.foo}. In other words it is equivalent to: |
| |
| @example |
| # We do not want this. |
| data.c: data.foo |
| foo data.foo |
| data.h: data.foo |
| foo data.foo |
| @end example |
| |
| @noindent |
| which means that @command{foo} can be run twice. Usually it will not |
| be run twice, because @command{make} implementations are smart enough |
| to check for the existence of the second file after the first one has |
| been built; they will therefore detect that it already exists. |
| However there are a few situations where it can run twice anyway: |
| |
| @itemize |
| @item |
| The most worrying case is when running a parallel @command{make}. If |
| @file{data.c} and @file{data.h} are built in parallel, two @samp{foo |
| data.foo} commands will run concurrently. This is harmful. |
| @item |
| Another case is when the dependency (here @file{data.foo}) is |
| (or depends upon) a phony target. |
| @end itemize |
| |
| A solution that works with parallel @command{make} but not with |
| phony dependencies is the following: |
| |
| @example |
| data.c data.h: data.foo |
| foo data.foo |
| data.h: data.c |
| @end example |
| |
| @noindent |
| The above rules are equivalent to |
| |
| @example |
| data.c: data.foo |
| foo data.foo |
| data.h: data.foo data.c |
| foo data.foo |
| @end example |
| |
| @noindent |
| therefore a parallel @command{make} will have to serialize the builds |
| of @file{data.c} and @file{data.h}, and will detect that the second is |
| no longer needed once the first is over. |
| |
| Using this pattern is probably enough for most cases. However it does |
| not scale easily to more output files (in this scheme all output files |
| must be totally ordered by the dependency relation), so we will |
| explore a more complicated solution. |
| |
| Another idea is to write the following: |
| |
| @example |
| # There is still a problem with this one. |
| data.c: data.foo |
| foo data.foo |
| data.h: data.c |
| @end example |
| |
| @noindent |
| The idea is that @samp{foo data.foo} is run only when @file{data.c} |
| needs to be updated, but we further state that @file{data.h} depends |
| upon @file{data.c}. That way, if @file{data.h} is required and |
| @file{data.foo} is out of date, the dependency on @file{data.c} will |
| trigger the build. |
| |
| This is almost perfect, but suppose we have built @file{data.h} and |
| @file{data.c}, and then we erase @file{data.h}. Then, running |
| @samp{make data.h} will not rebuild @file{data.h}. The above rules |
| just state that @file{data.c} must be up-to-date with respect to |
| @file{data.foo}, and this is already the case. |
| |
| What we need is a rule that forces a rebuild when @file{data.h} is |
| missing. Here it is: |
| |
| @example |
| data.c: data.foo |
| foo data.foo |
| data.h: data.c |
| ## Recover from the removal of $@@ |
| @@if test -f $@@; then :; else \ |
| rm -f data.c; \ |
| $(MAKE) $(AM_MAKEFLAGS) data.c; \ |
| fi |
| @end example |
| |
| The above scheme can be extended to handle more outputs and more |
| inputs. One of the outputs is selected to serve as a witness to the |
| successful completion of the command, it depends upon all inputs, and |
| all other outputs depend upon it. For instance, if @command{foo} |
| should additionally read @file{data.bar} and also produce |
| @file{data.w} and @file{data.x}, we would write: |
| |
| @example |
| data.c: data.foo data.bar |
| foo data.foo data.bar |
| data.h data.w data.x: data.c |
| ## Recover from the removal of $@@ |
| @@if test -f $@@; then :; else \ |
| rm -f data.c; \ |
| $(MAKE) $(AM_MAKEFLAGS) data.c; \ |
| fi |
| @end example |
| |
| However there are now three minor problems in this setup. One is related |
| to the timestamp ordering of @file{data.h}, @file{data.w}, |
| @file{data.x}, and @file{data.c}. Another one is a race condition |
| if a parallel @command{make} attempts to run multiple instances of the |
| recover block at once. Finally, the recursive rule breaks @samp{make -n} |
| when run with GNU @command{make} (as well as some other @command{make} |
| implementations), as it may remove @file{data.h} even when it should not |
| (@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make, |
| The GNU Make Manual}). |
| |
| Let us deal with the first problem. @command{foo} outputs four files, |
| but we do not know in which order these files are created. Suppose |
| that @file{data.h} is created before @file{data.c}. Then we have a |
| weird situation. The next time @command{make} is run, @file{data.h} |
| will appear older than @file{data.c}, the second rule will be |
| triggered, a shell will be started to execute the @samp{if@dots{}fi} |
| command, but actually it will just execute the @code{then} branch, |
| that is: nothing. In other words, because the witness we selected is |
| not the first file created by @command{foo}, @command{make} will start |
| a shell to do nothing each time it is run. |
| |
| A simple riposte is to fix the timestamps when this happens. |
| |
| @example |
| data.c: data.foo data.bar |
| foo data.foo data.bar |
| data.h data.w data.x: data.c |
| @@if test -f $@@; then \ |
| touch $@@; \ |
| else \ |
| ## Recover from the removal of $@@ |
| rm -f data.c; \ |
| $(MAKE) $(AM_MAKEFLAGS) data.c; \ |
| fi |
| @end example |
| |
| Another solution is to use a different and dedicated file as witness, |
| rather than using any of @command{foo}'s outputs. |
| |
| @example |
| data.stamp: data.foo data.bar |
| @@rm -f data.tmp |
| @@touch data.tmp |
| foo data.foo data.bar |
| @@mv -f data.tmp $@@ |
| data.c data.h data.w data.x: data.stamp |
| ## Recover from the removal of $@@ |
| @@if test -f $@@; then :; else \ |
| rm -f data.stamp; \ |
| $(MAKE) $(AM_MAKEFLAGS) data.stamp; \ |
| fi |
| @end example |
| |
| @file{data.tmp} is created before @command{foo} is run, so it has a |
| timestamp older than output files output by @command{foo}. It is then |
| renamed to @file{data.stamp} after @command{foo} has run, because we |
| do not want to update @file{data.stamp} if @command{foo} fails. |
| |
| This solution still suffers from the second problem: the race |
| condition in the recover rule. If, after a successful build, a user |
| erases @file{data.c} and @file{data.h}, and runs @samp{make -j}, then |
| @command{make} may start both recover rules in parallel. If the two |
| instances of the rule execute @samp{$(MAKE) $(AM_MAKEFLAGS) |
| data.stamp} concurrently the build is likely to fail (for instance, the |
| two rules will create @file{data.tmp}, but only one can rename it). |
| |
| Admittedly, such a weird situation does not arise during ordinary |
| builds. It occurs only when the build tree is mutilated. Here |
| @file{data.c} and @file{data.h} have been explicitly removed without |
| also removing @file{data.stamp} and the other output files. |
| @code{make clean; make} will always recover from these situations even |
| with parallel makes, so you may decide that the recover rule is solely |
| to help non-parallel make users and leave things as-is. Fixing this |
| requires some locking mechanism to ensure only one instance of the |
| recover rule rebuilds @file{data.stamp}. One could imagine something |
| along the following lines. |
| |
| @example |
| data.c data.h data.w data.x: data.stamp |
| ## Recover from the removal of $@@ |
| @@if test -f $@@; then :; else \ |
| trap 'rm -rf data.lock data.stamp' 1 2 13 15; \ |
| ## mkdir is a portable test-and-set |
| if mkdir data.lock 2>/dev/null; then \ |
| ## This code is being executed by the first process. |
| rm -f data.stamp; \ |
| $(MAKE) $(AM_MAKEFLAGS) data.stamp; \ |
| result=$$?; rm -rf data.lock; exit $$result; \ |
| else \ |
| ## This code is being executed by the follower processes. |
| ## Wait until the first process is done. |
| while test -d data.lock; do sleep 1; done; \ |
| ## Succeed if and only if the first process succeeded. |
| test -f data.stamp; \ |
| fi; \ |
| fi |
| @end example |
| |
| Using a dedicated witness, like @file{data.stamp}, is very handy when |
| the list of output files is not known beforehand. As an illustration, |
| consider the following rules to compile many @file{*.el} files into |
| @file{*.elc} files in a single command. It does not matter how |
| @code{ELFILES} is defined (as long as it is not empty: empty targets |
| are not accepted by POSIX). |
| |
| @example |
| ELFILES = one.el two.el three.el @dots{} |
| ELCFILES = $(ELFILES:=c) |
| |
| elc-stamp: $(ELFILES) |
| @@rm -f elc-temp |
| @@touch elc-temp |
| $(elisp_comp) $(ELFILES) |
| @@mv -f elc-temp $@@ |
| |
| $(ELCFILES): elc-stamp |
| @@if test -f $@@; then :; else \ |
| ## Recover from the removal of $@@ |
| trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \ |
| if mkdir elc-lock 2>/dev/null; then \ |
| ## This code is being executed by the first process. |
| rm -f elc-stamp; \ |
| $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \ |
| rmdir elc-lock; \ |
| else \ |
| ## This code is being executed by the follower processes. |
| ## Wait until the first process is done. |
| while test -d elc-lock; do sleep 1; done; \ |
| ## Succeed if and only if the first process succeeded. |
| test -f elc-stamp; exit $$?; \ |
| @c $$ |
| fi; \ |
| fi |
| @end example |
| |
| These solutions all still suffer from the third problem, namely that |
| they break the promise that @samp{make -n} should not cause any actual |
| changes to the tree. For those solutions that do not create lock files, |
| it is possible to split the recover rules into two separate recipe |
| commands, one of which does all work but the recursion, and the |
| other invokes the recursive @samp{$(MAKE)}. The solutions involving |
| locking could act upon the contents of the @samp{MAKEFLAGS} variable, |
| but parsing that portably is not easy (@pxref{The Make Macro MAKEFLAGS,,, |
| autoconf, The Autoconf Manual}). Here is an example: |
| |
| @example |
| ELFILES = one.el two.el three.el @dots{} |
| ELCFILES = $(ELFILES:=c) |
| |
| elc-stamp: $(ELFILES) |
| @@rm -f elc-temp |
| @@touch elc-temp |
| $(elisp_comp) $(ELFILES) |
| @@mv -f elc-temp $@@ |
| |
| $(ELCFILES): elc-stamp |
| ## Recover from the removal of $@@ |
| @@dry=; for f in x $$MAKEFLAGS; do \ |
| case $$f in \ |
| *=*|--*);; \ |
| *n*) dry=:;; \ |
| esac; \ |
| done; \ |
| if test -f $@@; then :; else \ |
| $$dry trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \ |
| if $$dry mkdir elc-lock 2>/dev/null; then \ |
| ## This code is being executed by the first process. |
| $$dry rm -f elc-stamp; \ |
| $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \ |
| $$dry rmdir elc-lock; \ |
| else \ |
| ## This code is being executed by the follower processes. |
| ## Wait until the first process is done. |
| while test -d elc-lock && test -z "$$dry"; do \ |
| @c $$ |
| sleep 1; \ |
| done; \ |
| ## Succeed if and only if the first process succeeded. |
| $$dry test -f elc-stamp; exit $$?; \ |
| fi; \ |
| fi |
| @end example |
| |
| For completeness it should be noted that GNU @command{make} is able to |
| express rules with multiple output files using pattern rules |
| (@pxref{Pattern Examples, , Pattern Rule Examples, make, The GNU Make |
| Manual}). We do not discuss pattern rules here because they are not |
| portable, but they can be convenient in packages that assume GNU |
| @command{make}. |
| |
| |
| @node Hard-Coded Install Paths |
| @section Installing to Hard-Coded Locations |
| |
| @display |
| My package needs to install some configuration file. I tried to use |
| the following rule, but @samp{make distcheck} fails. Why? |
| |
| @example |
| # Do not do this. |
| install-data-local: |
| $(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile |
| @end example |
| @end display |
| |
| @display |
| My package needs to populate the installation directory of another |
| package at install-time. I can easily compute that installation |
| directory in @file{configure}, but if I install files therein, |
| @samp{make distcheck} fails. How else should I do? |
| @end display |
| |
| These two setups share their symptoms: @samp{make distcheck} fails |
| because they are installing files to hard-coded paths. In the later |
| case the path is not really hard-coded in the package, but we can |
| consider it to be hard-coded in the system (or in whichever tool that |
| supplies the path). As long as the path does not use any of the |
| standard directory variables (@samp{$(prefix)}, @samp{$(bindir)}, |
| @samp{$(datadir)}, etc.), the effect will be the same: |
| user-installations are impossible. |
| |
| As a (non-root) user who wants to install a package, you usually have no |
| right to install anything in @file{/usr} or @file{/usr/local}. So you |
| do something like @samp{./configure --prefix ~/usr} to install a |
| package in your own @file{~/usr} tree. |
| |
| If a package attempts to install something to some hard-coded path |
| (e.g., @file{/etc/afile}), regardless of this @option{--prefix} setting, |
| then the installation will fail. @samp{make distcheck} performs such |
| a @option{--prefix} installation, hence it will fail too. |
| |
| Now, there are some easy solutions. |
| |
| The above @code{install-data-local} example for installing |
| @file{/etc/afile} would be better replaced by |
| |
| @example |
| sysconf_DATA = afile |
| @end example |
| |
| @noindent |
| by default @code{sysconfdir} will be @samp{$(prefix)/etc}, because |
| this is what the GNU Standards require. When such a package is |
| installed on an FHS compliant system, the installer will have to set |
| @samp{--sysconfdir=/etc}. As the maintainer of the package you |
| should not be concerned by such site policies: use the appropriate |
| standard directory variable to install your files so that the installer |
| can easily redefine these variables to match their site conventions. |
| |
| Installing files that should be used by another package is slightly |
| more involved. Let's take an example and assume you want to install |
| a shared library that is a Python extension module. If you ask Python |
| where to install the library, it will answer something like this: |
| |
| @example |
| % @kbd{python -c 'from distutils import sysconfig; |
| print sysconfig.get_python_lib(1,0)'} |
| /usr/lib/python2.5/site-packages |
| @end example |
| |
| If you indeed use this absolute path to install your shared library, |
| non-root users will not be able to install the package, hence |
| distcheck fails. |
| |
| Let's do better. The @samp{sysconfig.get_python_lib()} function |
| actually accepts a third argument that will replace Python's |
| installation prefix. |
| |
| @example |
| % @kbd{python -c 'from distutils import sysconfig; |
| print sysconfig.get_python_lib(1,0,"$@{exec_prefix@}")'} |
| $@{exec_prefix@}/lib/python2.5/site-packages |
| @end example |
| |
| You can also use this new path. If you do |
| @itemize @bullet |
| @item |
| root users can install your package with the same @option{--prefix} |
| as Python (you get the behavior of the previous attempt) |
| |
| @item |
| non-root users can install your package too, they will have the |
| extension module in a place that is not searched by Python but they |
| can work around this using environment variables (and if you installed |
| scripts that use this shared library, it's easy to tell Python were to |
| look in the beginning of your script, so the script works in both |
| cases). |
| @end itemize |
| |
| The @code{AM_PATH_PYTHON} macro uses similar commands to define |
| @samp{$(pythondir)} and @samp{$(pyexecdir)} (@pxref{Python}). |
| |
| Of course not all tools are as advanced as Python regarding that |
| substitution of @var{prefix}. So another strategy is to figure the |
| part of the installation directory that must be preserved. For |
| instance, here is how @code{AM_PATH_LISPDIR} (@pxref{Emacs Lisp}) |
| computes @samp{$(lispdir)}: |
| |
| @example |
| $EMACS -batch -Q -eval '(while load-path |
| (princ (concat (car load-path) "\n")) |
| (setq load-path (cdr load-path)))' >conftest.out |
| lispdir=`sed -n |
| -e 's,/$,,' |
| -e '/.*\/lib\/x*emacs\/site-lisp$/@{ |
| s,.*/lib/\(x*emacs/site-lisp\)$,$@{libdir@}/\1,;p;q; |
| @}' |
| -e '/.*\/share\/x*emacs\/site-lisp$/@{ |
| s,.*/share/\(x*emacs/site-lisp\),$@{datarootdir@}/\1,;p;q; |
| @}' |
| conftest.out` |
| @end example |
| |
| I.e., it just picks the first directory that looks like |
| @file{*/lib/*emacs/site-lisp} or @file{*/share/*emacs/site-lisp} in |
| the search path of emacs, and then substitutes @samp{$@{libdir@}} or |
| @samp{$@{datadir@}} appropriately. |
| |
| The emacs case looks complicated because it processes a list and |
| expects two possible layouts, otherwise it's easy, and the benefits for |
| non-root users are really worth the extra @command{sed} invocation. |
| |
| |
| @node Debugging Make Rules |
| @section Debugging Make Rules |
| @cindex debugging rules |
| @cindex rules, debugging |
| |
| The rules and dependency trees generated by @command{automake} can get |
| rather complex, and leave the developer head-scratching when things |
| don't work as expected. Besides the debug options provided by the |
| @command{make} command (@pxref{Options Summary,,, make, The GNU Make |
| Manual}), here's a couple of further hints for debugging makefiles |
| generated by @command{automake} effectively: |
| |
| @itemize |
| @item |
| If less verbose output has been enabled in the package with the use |
| of silent rules (@pxref{Automake Silent Rules}), you can use |
| @code{make V=1} to see the commands being executed. |
| @item |
| @code{make -n} can help show what would be done without actually doing |
| it. Note however, that this will @emph{still execute} commands prefixed |
| with @samp{+}, and, when using GNU @command{make}, commands that contain |
| the strings @samp{$(MAKE)} or @samp{$@{MAKE@}} (@pxref{Instead of |
| Execution,,, make, The GNU Make Manual}). |
| Typically, this is helpful to show what recursive rules would do, but it |
| means that, in your own rules, you should not mix such recursion with |
| actions that change any files.@footnote{Automake's @samp{dist} and |
| @samp{distcheck} rules had a bug in this regard in that they created |
| directories even with @option{-n}, but this has been fixed in Automake |
| 1.11.} Furthermore, note that GNU @command{make} will update |
| prerequisites for the @file{Makefile} file itself even with @option{-n} |
| (@pxref{Remaking Makefiles,,, make, The GNU Make Manual}). |
| @item |
| @code{make SHELL="/bin/bash -vx"} can help debug complex rules. |
| @xref{The Make Macro SHELL,,, autoconf, The Autoconf Manual}, for some |
| portability quirks associated with this construct. |
| @item |
| @code{echo 'print: ; @@echo "$(VAR)"' | make -f Makefile -f - print} |
| can be handy to examine the expanded value of variables. You may need |
| to use a target other than @samp{print} if that is already used or a |
| file with that name exists. |
| @item |
| @url{http://bashdb.sourceforge.net/@/remake/} provides a modified |
| GNU @command{make} command called @command{remake} that copes with |
| complex GNU @command{make}-specific Makefiles and allows to trace |
| execution, examine variables, and call rules interactively, much like |
| a debugger. |
| @end itemize |
| |
| |
| @node Reporting Bugs |
| @section Reporting Bugs |
| |
| Most nontrivial software has bugs. Automake is no exception. Although |
| we cannot promise we can or will fix a bug, and we might not even agree |
| that it is a bug, we want to hear about problems you encounter. Often we |
| agree they are bugs and want to fix them. |
| |
| To make it possible for us to fix a bug, please report it. In order to |
| do so effectively, it helps to know when and how to do it. |
| |
| Before reporting a bug, it is a good idea to see if it is already known. |
| You can look at the @uref{https://debbugs.gnu.org/, GNU Bug Tracker} |
| and the @uref{https://lists.gnu.org/@/archive/@/html/@/bug-automake/, |
| bug-automake mailing list archives} for previous bug reports. We |
| previously used a |
| @uref{http://sourceware.org/@/cgi-bin/@/gnatsweb.pl?database=automake, |
| Gnats database} for bug tracking, so some bugs might have been reported |
| there already. Please do not use it for new bug reports, however. |
| |
| If the bug is not already known, it should be reported. It is very |
| important to report bugs in a way that is useful and efficient. For |
| this, please familiarize yourself with |
| @uref{http://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to |
| Report Bugs Effectively} and |
| @uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask |
| Questions the Smart Way}. This helps you and developers to save time |
| which can then be spent on fixing more bugs and implementing more |
| features. |
| |
| For a bug report, a feature request or other suggestions, please send |
| email to @email{@value{PACKAGE_BUGREPORT}}. This will then open a new |
| bug in the @uref{https://debbugs.gnu.org/@/automake, bug tracker}. Be |
| sure to include the versions of Autoconf and Automake that you use. |
| Ideally, post a minimal @file{Makefile.am} and @file{configure.ac} that |
| reproduces the problem you encounter. If you have encountered test |
| suite failures, please attach the @file{test-suite.log} file. |
| |
| @c ========================================================== Appendices |
| |
| @page |
| @node Copying This Manual |
| @appendix Copying This Manual |
| |
| @menu |
| * GNU Free Documentation License:: License for copying this manual |
| @end menu |
| |
| @node GNU Free Documentation License |
| @appendixsec GNU Free Documentation License |
| @include fdl.texi |
| |
| @page |
| @node Indices |
| @appendix Indices |
| |
| @menu |
| * Macro Index:: Index of Autoconf macros |
| * Variable Index:: Index of Makefile variables |
| * General Index:: General index |
| @end menu |
| |
| @node Macro Index |
| @appendixsec Macro Index |
| |
| @printindex fn |
| |
| @node Variable Index |
| @appendixsec Variable Index |
| |
| @printindex vr |
| |
| @node General Index |
| @appendixsec General Index |
| |
| @printindex cp |
| |
| |
| @bye |
| |
| @c LocalWords: texinfo setfilename settitle setchapternewpage texi direntry |
| @c LocalWords: dircategory in's aclocal ifinfo titlepage Tromey vskip pt sp |
| @c LocalWords: filll defcodeindex ov cv op tr syncodeindex fn cp vr ifnottex |
| @c LocalWords: dir Automake's ac Dist Gnits gnits dfn Autoconf's pxref |
| @c LocalWords: cindex Autoconf autoconf perl samp cvs dist trindex SUBST foo |
| @c LocalWords: xs emph FIXME ref vindex pkglibdir pkgincludedir pkgdatadir mt |
| @c LocalWords: pkg libdir cpio bindir sbindir rmt pax sbin zar zardir acindex |
| @c LocalWords: HTML htmldir html noinst TEXINFOS nodist nobase strudel CFLAGS |
| @c LocalWords: libmumble CC YFLAGS itemx de fication config url comp |
| @c LocalWords: depcomp elisp sh mdate mkinstalldirs mkdir py tex dvi ps pdf |
| @c LocalWords: ylwrap zardoz INIT gettext acinclude mv FUNCS LIBOBJS LDADD fr |
| @c LocalWords: uref featureful dnl src LINGUAS es ko nl pl sl sv PROG ISC doc |
| @c LocalWords: POSIX STDC fcntl FUNC ALLOCA blksize struct stat intl po chmod |
| @c LocalWords: ChangeLog SUBDIRS gettextize gpl testdata getopt INTLLIBS cpp |
| @c LocalWords: localedir datadir DLOCALEDIR DEXIT CPPFLAGS autoreconf opindex |
| @c LocalWords: AUX var symlink deps Wno Wnone package's aclocal's distclean |
| @c LocalWords: ltmain xref LIBSOURCE LIBSOURCES LIBOBJ MEMCMP vs RANLIB CXX |
| @c LocalWords: LDFLAGS LIBTOOL libtool XTRA LIBS gettext's acdir APIVERSION |
| @c LocalWords: dirlist noindent usr TIOCGWINSZ sc |
| @c LocalWords: GWINSZ termios SRCDIR tarball bzip LISPDIR lispdir XEmacs CCAS |
| @c LocalWords: emacsen MicroEmacs CCASFLAGS UX GCJ gcj GCJFLAGS posix DMALLOC |
| @c LocalWords: dmalloc ldmalloc REGEX regex DEPDIR DEP DEFUN aclocaldir fi |
| @c LocalWords: mymacro myothermacro AMFLAGS autopoint autogen libtoolize yum |
| @c LocalWords: autoheader README MAKEFLAGS subdir Inetutils sync COND endif |
| @c LocalWords: Miller's installable includedir inc pkgdata EXEEXT libexec bsd |
| @c LocalWords: pkglib libexecdir prog libcpio cpio's dlopen dlpreopen linux |
| @c LocalWords: subsubsection OBJEXT esac lib LTLIBRARIES liblob LIBADD AR ar |
| @c LocalWords: ARFLAGS cru ing maude libgettext lo LTLIBOBJS rpath SGI PRE yy |
| @c LocalWords: libmaude CCLD CXXFLAGS FFLAGS LFLAGS OBJCFLAGS RFLAGS DEFS cc |
| @c LocalWords: OBJCXXFLAGS |
| @c LocalWords: SHORTNAME vtable srcdir nostdinc basename yxx cxx ll lxx gdb |
| @c LocalWords: lexers yymaxdepth maxdepth yyparse yylex yyerror yylval lval |
| @c LocalWords: yychar yydebug yypact yyr yydef def yychk chk yypgo pgo yyact |
| @c LocalWords: yyexca exca yyerrflag errflag yynerrs nerrs yyps yypv pv yys |
| @c LocalWords: yystate yytmp tmp yyv yyval val yylloc lloc yyreds yytoks toks |
| @c LocalWords: yylhs yylen yydefred yydgoto yysindex yyrindex yygindex yyname |
| @c LocalWords: yytable yycheck yyrule byacc CXXCOMPILE CXXLINK FLINK cfortran |
| @c LocalWords: Catalogue preprocessable FLIBS libfoo baz JAVACFLAGS java exe |
| @c LocalWords: SunOS fying basenames exeext uninstalled oldinclude kr FSF's |
| @c LocalWords: pkginclude oldincludedir sysconf sharedstate localstate gcc rm |
| @c LocalWords: sysconfdir sharedstatedir localstatedir preexist CLEANFILES gz |
| @c LocalWords: depfile tmpdepfile depmode const interoperate |
| @c LocalWords: JAVAC javac JAVAROOT builddir CLASSPATH ENV pyc pyo pkgpython |
| @c LocalWords: pyexecdir pkgpyexecdir Python's pythondir pkgpythondir txi ois |
| @c LocalWords: installinfo vers MAKEINFO makeinfo MAKEINFOFLAGS noinstall rf |
| @c LocalWords: mandir thesame alsothesame installman myexecbin DESTDIR Pinard |
| @c LocalWords: uninstall installdirs uninstalls MOSTLYCLEANFILES mostlyclean |
| @c LocalWords: DISTCLEANFILES MAINTAINERCLEANFILES GZIP gzip shar exp |
| @c LocalWords: distdir distcheck distcleancheck listfiles distuninstallcheck |
| @c LocalWords: VPATH tarfile stdout XFAIL DejaGnu dejagnu DEJATOOL runtest ln |
| @c LocalWords: RUNTESTDEFAULTFLAGS toolchain RUNTESTFLAGS asis readme DVIPS |
| @c LocalWords: installcheck gzipped tarZ std utils etags mkid cd |
| @c LocalWords: ARGS taggable ETAGSFLAGS lang ctags CTAGSFLAGS GTAGS gtags idl |
| @c LocalWords: foocc doit idlC multilibs ABIs cmindex defmac ARG enableval FC |
| @c LocalWords: MSG xtrue DBG pathchk CYGWIN afile proglink versioned CVS's TE |
| @c LocalWords: wildcards Autoconfiscated subsubheading autotools Meyering API |
| @c LocalWords: ois's wildcard Wportability cartouche vrindex printindex Duret |
| @c LocalWords: DSOMEFLAG DVERSION automake Lutz insertcopying versioning FAQ |
| @c LocalWords: LTLIBOBJ Libtool's libtool's libltdl dlopening itutions libbar |
| @c LocalWords: WANTEDLIBS libhello sublibraries libtop libsub dlopened Ratfor |
| @c LocalWords: mymodule timestamps timestamp underquoted MAKEINFOHTMLFLAGS te |
| @c LocalWords: GNUmakefile Subpackages subpackage's subpackages aux |
| @c LocalWords: detailmenu Timeline pwd reldir AUTOM autom PREREQ FOOBAR libc |
| @c LocalWords: libhand subpackage moduleN libmain libmisc FCFLAGS FCCOMPILE |
| @c LocalWords: FCLINK subst sed ELCFILES elc MAKEINFOHTML dvips esyscmd ustar |
| @c LocalWords: tarballs Woverride vfi ELFILES djm AutoMake honkin FSF |
| @c LocalWords: fileutils precanned MacKenzie's reimplement termutils Tromey's |
| @c LocalWords: cois gnitsians LIBPROGRAMS progs LIBLIBRARIES Textutils Ulrich |
| @c LocalWords: Matzigkeit Drepper's Gord Matzigkeit's jm Dalley Debian org |
| @c LocalWords: Administrivia ILU CORBA Sourceware Molenda sourceware Elliston |
| @c LocalWords: dep Oliva Akim Demaille Aiieeee Demaillator Akim's sourcequake |
| @c LocalWords: grep backported screenshots libgcj KB unnumberedsubsubsec pre |
| @c LocalWords: precomputing hacky makedepend inline clearmake LD PRELOAD Rel |
| @c LocalWords: syscalls perlhist acl pm multitable headitem fdl appendixsec |
| @c LocalWords: LTALLOCA MALLOC malloc memcmp strdup alloca libcompat xyz DFOO |
| @c LocalWords: unprefixed buildable preprocessed DBAZ DDATADIR WARNINGCFLAGS |
| @c LocalWords: LIBFOOCFLAGS LIBFOOLDFLAGS ftable testSubDir obj LIBTOOLFLAGS |
| @c LocalWords: barexec Pinard's automatize initialize lzip xz cscope |