automake.texi (automake-1.16.2.tar.xz) | : | automake.texi (automake-1.16.3.tar.xz) | ||
---|---|---|---|---|
skipping to change at line 121 | skipping to change at line 121 | |||
* Install:: What gets installed | * Install:: What gets installed | |||
* Clean:: What gets cleaned | * Clean:: What gets cleaned | |||
* Dist:: What goes in a distribution | * Dist:: What goes in a distribution | |||
* Tests:: Support for test suites | * Tests:: Support for test suites | |||
* Rebuilding:: Automatic rebuilding of Makefile | * Rebuilding:: Automatic rebuilding of Makefile | |||
* Options:: Changing Automake's behavior | * Options:: Changing Automake's behavior | |||
* Miscellaneous:: Miscellaneous rules | * Miscellaneous:: Miscellaneous rules | |||
* Include:: Including extra files in an Automake template | * Include:: Including extra files in an Automake template | |||
* Conditionals:: Conditionals | * Conditionals:: Conditionals | |||
* Silencing Make:: Obtain less verbose output from @command{make} | * 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 | * Not Enough:: When Automake is not Enough | |||
* Distributing:: Distributing the Makefile.in | * Distributing:: Distributing the Makefile.in | |||
* API Versioning:: About compatibility between Automake versions | * API Versioning:: About compatibility between Automake versions | |||
* Upgrading:: Upgrading to a Newer Automake Version | * Upgrading:: Upgrading to a Newer Automake Version | |||
* FAQ:: Frequently Asked Questions | * FAQ:: Frequently Asked Questions | |||
* Copying This Manual:: How to make copies of this manual | * Copying This Manual:: How to make copies of this manual | |||
* Indices:: Indices of variables, macros, and concepts | * Indices:: Indices of variables, macros, and concepts | |||
@detailmenu | @detailmenu | |||
--- The Detailed Node Listing --- | --- The Detailed Node Listing --- | |||
skipping to change at line 467 | skipping to change at line 466 | |||
some of them claiming to be @emph{generated by} Autoconf or Automake. | some of them claiming to be @emph{generated by} Autoconf or Automake. | |||
But the exact purpose of these files and their relations is probably | 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, | 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 | 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 | installed or seen such a package, do not worry: this chapter will walk | |||
you through it. | you through it. | |||
If you need some teaching material, more illustrations, or a less | If you need some teaching material, more illustrations, or a less | |||
@command{automake}-centered continuation, some slides for this | @command{automake}-centered continuation, some slides for this | |||
introduction are available in Alexandre Duret-Lutz's | introduction are available in Alexandre Duret-Lutz's | |||
@uref{http://www.lrde.epita.fr/@/~adl/@/autotools.html, | @uref{https://www.lrde.epita.fr/@/~adl/@/autotools.html, | |||
Autotools Tutorial}. | Autotools Tutorial}. | |||
This chapter is the written version of the first part of his tutorial. | This chapter is the written version of the first part of his tutorial. | |||
@menu | @menu | |||
* GNU Build System:: Introducing the GNU Build System | * GNU Build System:: Introducing the GNU Build System | |||
* Use Cases:: Use Cases for the GNU Build System | * Use Cases:: Use Cases for the GNU Build System | |||
* Why Autotools:: How Autotools Help | * Why Autotools:: How Autotools Help | |||
* Hello World:: A Small Hello World Package | * Hello World:: A Small Hello World Package | |||
@end menu | @end menu | |||
skipping to change at line 1232 | skipping to change at line 1231 | |||
Another, more useful command is @code{make distcheck}. The | Another, more useful command is @code{make distcheck}. The | |||
@code{distcheck} target constructs | @code{distcheck} target constructs | |||
@file{@var{package}-@var{version}.tar.gz} just as well as @code{dist}, | @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 | but it additionally ensures most of the use cases presented so far | |||
work: | work: | |||
@itemize @bullet | @itemize @bullet | |||
@item | @item | |||
It attempts a full compilation of the package (@pxref{Basic | It attempts a full compilation of the package (@pxref{Basic | |||
Installation}), unpacking the newly constructed tarball, running | Installation}): unpacking the newly constructed tarball, running | |||
@code{make}, @code{make check}, @code{make install}, as well as | @code{make}, @code{make dvi}, @code{make check}, @code{make install}, | |||
@code{make installcheck}, and even @code{make dist}, | as well as @code{make installcheck}, and even @code{make dist}, | |||
@item | @item | |||
it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}), | it tests VPATH builds with read-only source tree (@pxref{VPATH Builds}), | |||
@item | @item | |||
it makes sure @code{make clean}, @code{make distclean}, and @code{make | it makes sure @code{make clean}, @code{make distclean}, and @code{make | |||
uninstall} do not omit any file (@pxref{Standard Targets}), | uninstall} do not omit any file (@pxref{Standard Targets}), | |||
@item | @item | |||
and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}). | and it checks that @code{DESTDIR} installations work (@pxref{DESTDIR}). | |||
@end itemize | @end itemize | |||
All of these actions are performed in a temporary directory, so that no | All of these actions are performed in a temporary directory, so that | |||
root privileges are required. Please note that the exact location and the | no root privileges are required. The exact location and the exact | |||
exact structure of such a subdirectory (where the extracted sources are | structure of such a subdirectory (where the extracted sources are | |||
placed, how the temporary build and install directories are named and how | placed, how the temporary build and install directories are named and | |||
deeply they are nested, etc.) is to be considered an implementation detail, | how deeply they are nested, etc.) is to be considered an | |||
which can change at any time; so do not rely on it. | 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 | Releasing a package that fails @code{make distcheck} means that one of | |||
the scenarios we presented will not work and some users will be | the scenarios we presented will not work and some users will be | |||
disappointed. Therefore it is a good practice to release a package | disappointed. Therefore it is a good practice to release a package | |||
only after a successful @code{make distcheck}. This of course does | only after a successful @code{make distcheck}. This of course does | |||
not imply that the package will be flawless, but at least it will | not imply that the package will be flawless, but at least it will | |||
prevent some of the embarrassing errors you may find in packages | prevent some of the embarrassing errors you may find in packages | |||
released by people who have never heard about @code{distcheck} (like | released by people who have never heard about @code{distcheck} (like | |||
@code{DESTDIR} not working because of a typo, or a distributed file | @code{DESTDIR} not working because of a typo, or a distributed file | |||
being erased by @code{make clean}, or even @code{VPATH} builds not | being erased by @code{make clean}, or even @code{VPATH} builds not | |||
skipping to change at line 1908 | skipping to change at line 1908 | |||
@cindex First line of Makefile.am | @cindex First line of Makefile.am | |||
@example | @example | |||
## Process this file with automake to produce Makefile.in | ## Process this file with automake to produce Makefile.in | |||
@end example | @end example | |||
@c FIXME document customary ordering of Makefile.am here! | @c FIXME document customary ordering of Makefile.am here! | |||
@node Strictness | @node Strictness | |||
@section Strictness | @section Strictness | |||
@c "Gnits" used to be a separate section. | ||||
@c This @anchor allows old links to still work. | ||||
@anchor{Gnits} | ||||
@cindex Non-GNU packages | @cindex Non-GNU packages | |||
While Automake is intended to be used by maintainers of GNU packages, it | 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 | does make some effort to accommodate those who wish to use it, but do | |||
not want to use all the GNU conventions. | not want to use all the GNU conventions. | |||
@cindex Strictness, defined | @cindex Strictness, defined | |||
@cindex Strictness, @option{foreign} | To this end, Automake supports three levels of @dfn{strictness}---how | |||
@cindex @option{foreign} strictness | stringently Automake should enforce conformance with GNU conventions. | |||
Each strictness level can be selected using an option of the same name; | ||||
see @ref{Options}. | ||||
The strictness levels are: | ||||
@table @option | ||||
@item gnu | ||||
@cindex Strictness, @option{gnu} | @cindex Strictness, @option{gnu} | |||
@cindex @option{gnu} strictness | @cindex @option{gnu} strictness | |||
@cindex Strictness, @option{gnits} | @opindex --gnu | |||
@cindex @option{gnits} strictness | This is the default level of strictness. Automake will check for | |||
basic compliance with the GNU standards for software packaging. | ||||
@xref{Top,,, standards, The GNU Coding Standards} for full details | ||||
of these standards. Currently the following checks are made: | ||||
To this end, Automake supports three levels of @dfn{strictness}---the | @itemize @bullet | |||
strictness indicating how stringently Automake should check standards | @item | |||
conformance. | 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. | ||||
The valid strictness levels are: | 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 | ||||
Future versions of Automake will add more checks at this level of | ||||
strictness; it is advisable to be familiar with the precise requirements | ||||
of the GNU standards. | ||||
Future versions of Automake may, at this level of strictness, require | ||||
certain non-standard GNU tools to be available to maintainer-only | ||||
Makefile rules. For instance, in the future @command{pathchk} | ||||
(@pxref{pathchk invocation,,, coreutils, GNU Coreutils}) | ||||
may be required to run @samp{make dist}. | ||||
@table @option | ||||
@item foreign | @item foreign | |||
@cindex Strictness, @option{foreign} | ||||
@cindex @option{foreign} strictness | ||||
@opindex --foreign | ||||
Automake will check for only those things that are absolutely | Automake will check for only those things that are absolutely | |||
required for proper operation. For instance, whereas GNU standards | required for proper operation. For instance, whereas GNU standards | |||
dictate the existence of a @file{NEWS} file, it will not be required in | 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 | this mode. This strictness will also turn off some warnings by default | |||
(among them, portability warnings). | (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 | @item gnits | |||
@cindex Strictness, @option{gnits} | ||||
@cindex @option{gnits} strictness | ||||
@opindex --gnits | ||||
Automake will check for compliance to the as-yet-unwritten @dfn{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 | standards}. These are based on the GNU standards, but are even more | |||
detailed. Unless you are a Gnits standards contributor, it is | detailed. Unless you are a Gnits standards contributor, it is | |||
recommended that you avoid this option until such time as the Gnits | recommended that you avoid this option until such time as the Gnits | |||
standard is actually published (which may never happen). | standard is actually published (which may never happen). | |||
@end table | ||||
@xref{Gnits}, for more information on the precise implications of the | Currently, @option{--gnits} does all the checks that | |||
strictness level. | @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 | ||||
@end table | ||||
@node Uniform | @node Uniform | |||
@section The Uniform Naming Scheme | @section The Uniform Naming Scheme | |||
@cindex Uniform naming scheme | @cindex Uniform naming scheme | |||
Automake variables generally follow a @dfn{uniform naming scheme} that | Automake variables generally follow a @dfn{uniform naming scheme} that | |||
makes it easy to decide how programs (and other derived objects) are | makes it easy to decide how programs (and other derived objects) are | |||
built, and how they are installed. This scheme also supports | built, and how they are installed. This scheme also supports | |||
@command{configure} time determination of what should be built. | @command{configure} time determination of what should be built. | |||
skipping to change at line 2130 | skipping to change at line 2194 | |||
@node Length Limitations | @node Length Limitations | |||
@section Staying below the command line length limit | @section Staying below the command line length limit | |||
@cindex command line length limit | @cindex command line length limit | |||
@cindex ARG_MAX | @cindex ARG_MAX | |||
Traditionally, most unix-like systems have a length limitation for the | Traditionally, most unix-like systems have a length limitation for the | |||
command line arguments and environment contents when creating new | command line arguments and environment contents when creating new | |||
processes (see for example | processes (see for example | |||
@uref{http://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an | @uref{https://www.in-ulm.de/@/~mascheck/@/various/@/argmax/} for an | |||
overview on this issue), | overview on this issue), | |||
which of course also applies to commands spawned by @command{make}. | which of course also applies to commands spawned by @command{make}. | |||
POSIX requires this limit to be at least 4096 bytes, and most modern | POSIX requires this limit to be at least 4096 bytes, and most modern | |||
systems have quite high limits (or are unlimited). | systems have quite high limits (or are unlimited). | |||
In order to create portable Makefiles that do not trip over these | In order to create portable Makefiles that do not trip over these | |||
limits, it is necessary to keep the length of file lists bounded. | limits, it is necessary to keep the length of file lists bounded. | |||
Unfortunately, it is not possible to do so fully transparently within | Unfortunately, it is not possible to do so fully transparently within | |||
Automake, so your help may be needed. Typically, you can split long | Automake, so your help may be needed. Typically, you can split long | |||
file lists manually and use different installation directory names for | file lists manually and use different installation directory names for | |||
skipping to change at line 2250 | skipping to change at line 2314 | |||
@file{Makefile} can do its work properly. There are a fairly large | @file{Makefile} can do its work properly. There are a fairly large | |||
number of them, and we list them here. | number of them, and we list them here. | |||
Although all of these files are distributed and installed with | Although all of these files are distributed and installed with | |||
Automake, a couple of them are maintained separately. The Automake | Automake, a couple of them are maintained separately. The Automake | |||
copies are updated before each release, but we mention the original | copies are updated before each release, but we mention the original | |||
source in case you need more recent versions. | source in case you need more recent versions. | |||
@table @code | @table @code | |||
@item ar-lib | @item ar-lib | |||
@cmindex ar-lib | ||||
This is a wrapper primarily for the Microsoft lib archiver, to make | This is a wrapper primarily for the Microsoft lib archiver, to make | |||
it more POSIX-like. | it more POSIX-like. | |||
@item compile | @item compile | |||
@cmindex compile | ||||
This is a wrapper for compilers that do not accept options @option{-c} | 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 | and @option{-o} at the same time. It is only used when absolutely | |||
required. Such compilers are rare, with the Microsoft C/C++ Compiler | required. Such compilers are rare, with the Microsoft C/C++ Compiler | |||
as the most notable exception. This wrapper also makes the following | as the most notable exception. This wrapper also makes the following | |||
common options available for that compiler, while performing file name | common options available for that compiler, while performing file name | |||
translation where needed: @option{-I}, @option{-L}, @option{-l}, | translation where needed: @option{-I}, @option{-L}, @option{-l}, | |||
@option{-Wl,} and @option{-Xlinker}. | @option{-Wl,} and @option{-Xlinker}. | |||
@item config.guess | @item config.guess | |||
@itemx config.sub | @itemx config.sub | |||
@cmindex config.guess | ||||
@cmindex config.sub | ||||
These two programs compute the canonical triplets for the given build, | These two programs compute the canonical triplets for the given build, | |||
host, or target architecture. These programs are updated regularly to | host, or target architecture. These programs are updated regularly to | |||
support new architectures and fix probes broken by changes in new | support new architectures and fix probes broken by changes in new | |||
kernel versions. Each new release of Automake comes with up-to-date | kernel versions. Each new release of Automake comes with up-to-date | |||
copies of these programs. If your copy of Automake is getting old, | copies of these programs. If your copy of Automake is getting old, | |||
you are encouraged to fetch the latest versions of these files from | you are encouraged to fetch the latest versions of these files from | |||
@url{https://savannah.gnu.org/git/?group=config} before making a | @url{https://savannah.gnu.org/git/?group=config} before making a | |||
release. | release. | |||
@item depcomp | @item depcomp | |||
@cmindex depcomp | ||||
This program understands how to run a compiler so that it will | This program understands how to run a compiler so that it will | |||
generate not only the desired output but also dependency information | generate not only the desired output but also dependency information | |||
that is then used by the automatic dependency tracking feature | that is then used by the automatic dependency tracking feature | |||
(@pxref{Dependencies}). | (@pxref{Dependencies}). | |||
@item install-sh | @item install-sh | |||
@cmindex install-sh | ||||
This is a replacement for the @command{install} program that works on | This is a replacement for the @command{install} program that works on | |||
platforms where @command{install} is unavailable or unusable. | platforms where @command{install} is unavailable or unusable. | |||
@item mdate-sh | @item mdate-sh | |||
@cmindex mdate-sh | ||||
This script is used to generate a @file{version.texi} file. It examines | This script is used to generate a @file{version.texi} file. It examines | |||
a file and prints some date information about it. | a file and prints some date information about it. | |||
@item missing | @item missing | |||
@cmindex missing @r{program} | ||||
This wraps a number of programs that are typically only required by | This wraps a number of programs that are typically only required by | |||
maintainers. If the program in question doesn't exist, or seems too old, | maintainers. If the program in question doesn't exist, or seems too old, | |||
@command{missing} will print an informative warning before failing out, | @command{missing} will print an informative warning before failing out, | |||
to provide the user with more context and information. | to provide the user with more context and information. | |||
@item mkinstalldirs | @item mkinstalldirs | |||
@cmindex mkinstalldirs | ||||
This script used to be a wrapper around @samp{mkdir -p}, which is not | 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} | 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 | finds that @samp{mkdir -p} does not work, this makes one less script to | |||
distribute. | distribute. | |||
For backward compatibility @file{mkinstalldirs} is still used and | For backward compatibility @file{mkinstalldirs} is still used and | |||
distributed when @command{automake} finds it in a package. But it is no | distributed when @command{automake} finds it in a package. But it is no | |||
longer installed automatically, and it should be safe to remove it. | longer installed automatically, and it should be safe to remove it. | |||
@item py-compile | @item py-compile | |||
@cmindex py-compile | ||||
This is used to byte-compile Python scripts. | This is used to byte-compile Python scripts. | |||
@item test-driver | @item test-driver | |||
@cmindex test-driver | ||||
This implements the default test driver offered by the parallel | This implements the default test driver offered by the parallel | |||
testsuite harness. | testsuite harness. | |||
@item texinfo.tex | @item texinfo.tex | |||
Not a program, this file is required for @samp{make dvi}, @samp{make | @cmindex texinfo.tex | |||
ps} and @samp{make pdf} to work when Texinfo sources are in the | When Texinfo sources are in the package, this file is required for | |||
package. The latest version can be downloaded from | @samp{make dvi}, @samp{make ps} and @samp{make pdf}. The latest | |||
@url{https://www.gnu.org/software/texinfo/}. | version can be downloaded from | |||
@url{https://www.gnu.org/software/texinfo/}. A working @TeX{} | ||||
distribution, or at least a @file{tex} program, is also required. | ||||
Furthermore, @samp{make dist} invokes @samp{make dvi}, so these become | ||||
requirements for making a distribution with Texinfo sources. | ||||
@item ylwrap | @item ylwrap | |||
@cmindex ylwrap | ||||
This program wraps @command{lex} and @command{yacc} to rename their | This program wraps @command{lex} and @command{yacc} to rename their | |||
output files. It also ensures that, for instance, multiple | output files. It also ensures that, for instance, multiple | |||
@command{yacc} instances can be invoked in a single directory in | @command{yacc} instances can be invoked in a single directory in | |||
parallel. | parallel. | |||
@end table | @end table | |||
@node Examples | @node Examples | |||
@chapter Some example packages | @chapter Some example packages | |||
skipping to change at line 2604 | skipping to change at line 2684 | |||
@option{--copy}, copying the new file). | @option{--copy}, copying the new file). | |||
@item --foreign | @item --foreign | |||
@opindex --foreign | @opindex --foreign | |||
Set the global strictness to @option{foreign}. For more information, see | Set the global strictness to @option{foreign}. For more information, see | |||
@ref{Strictness}. | @ref{Strictness}. | |||
@item --gnits | @item --gnits | |||
@opindex --gnits | @opindex --gnits | |||
Set the global strictness to @option{gnits}. For more information, see | Set the global strictness to @option{gnits}. For more information, see | |||
@ref{Gnits}. | @ref{Strictness}. | |||
@item --gnu | @item --gnu | |||
@opindex --gnu | @opindex --gnu | |||
Set the global strictness to @option{gnu}. For more information, see | Set the global strictness to @option{gnu}. For more information, see | |||
@ref{Gnits}. This is the default strictness. | @ref{Strictness}. This is the default strictness. | |||
@item --help | @item --help | |||
@opindex --help | @opindex --help | |||
Print a summary of the command line options and exit. | Print a summary of the command line options and exit. | |||
@item -i | @item -i | |||
@itemx --ignore-deps | @itemx --ignore-deps | |||
@opindex -i | @opindex -i | |||
This disables the dependency tracking feature in generated | This disables the dependency tracking feature in generated | |||
@file{Makefile}s; see @ref{Dependencies}. | @file{Makefile}s; see @ref{Dependencies}. | |||
skipping to change at line 2654 | skipping to change at line 2734 | |||
@itemx --verbose | @itemx --verbose | |||
@opindex -v | @opindex -v | |||
@opindex --verbose | @opindex --verbose | |||
Cause Automake to print information about which files are being read or | Cause Automake to print information about which files are being read or | |||
created. | created. | |||
@item --version | @item --version | |||
@opindex --version | @opindex --version | |||
Print the version number of Automake and exit. | Print the version number of Automake and exit. | |||
@item -W CATEGORY | @item -W @var{category}[,@var{category}...] | |||
@itemx --warnings=@var{category} | @itemx --warnings=@var{category}[,@var{category}...] | |||
@opindex -W | @opindex -W | |||
@opindex --warnings | @opindex --warnings | |||
Output warnings falling in @var{category}. @var{category} can be | Output warnings about a @var{category} of potential problems with the | |||
one of: | package. @var{category} can be any of: | |||
@table @code | @table @code | |||
@item cross | ||||
Constructs compromising the ability to cross-compile the package. | ||||
@item gnu | @item gnu | |||
warnings related to the GNU Coding Standards | Minor deviations from the GNU Coding Standards | |||
(@pxref{Top, , , standards, The GNU Coding Standards}). | (@pxref{Top, , , standards, The GNU Coding Standards}). | |||
@item obsolete | @item obsolete | |||
obsolete features or constructions | Obsolete features or constructions. | |||
@item override | @item override | |||
user redefinitions of Automake rules or variables | Redefinitions of Automake rules or variables. | |||
@item portability | @item portability | |||
portability issues (e.g., use of @command{make} features that are | Portability issues (e.g., use of @command{make} features that are | |||
known to be not portable) | known to be not portable). | |||
@item portability-recursive | ||||
Recursive, or nested, Make variable expansions (@code{$(foo$(x))}). | ||||
These are not universally supported, but are more portable than the | ||||
other non-portable constructs diagnosed by @option{-Wportability}. | ||||
These warnings are turned on by @option{-Wportability} but can then be | ||||
turned off specifically by @option{-Wno-portability-recursive}. | ||||
@item extra-portability | @item extra-portability | |||
extra portability issues related to obscure tools. One example of such | Extra portability issues, related to rarely-used tools such as | |||
a tool is the Microsoft @command{lib} archiver. | the Microsoft @command{lib} archiver. | |||
@item syntax | @item syntax | |||
weird syntax, unused variables, typos | Questionable syntax, unused variables, typos, etc. | |||
@item unsupported | @item unsupported | |||
unsupported or incomplete features | Unsupported or incomplete features. | |||
@item all | @item all | |||
all the warnings | Turn on all the above categories of warnings. | |||
@item none | @item none | |||
turn off all the warnings | Turn off all the above categories of warnings. | |||
@item error | @item error | |||
treat warnings as errors | Treat warnings as errors. | |||
@end table | @end table | |||
A category can be turned off by prefixing its name with @samp{no-}. For | A category can be turned off by prefixing its name with @samp{no-}. For | |||
instance, @option{-Wno-syntax} will hide the warnings about unused | instance, @option{-Wno-syntax} will hide the warnings about unused | |||
variables. | variables. | |||
The categories output by default are @samp{obsolete}, @samp{syntax} and | Warnings in the @samp{gnu}, @samp{obsolete}, @samp{portability}, | |||
@samp{unsupported}. Additionally, @samp{gnu} and @samp{portability} | @samp{syntax}, and @samp{unsupported} categories are turned on by | |||
are enabled in @option{--gnu} and @option{--gnits} strictness. | default. The @samp{gnu} and @samp{portability} categories are turned | |||
off in @option{--foreign} strictness. | ||||
@c Checked by extra-portability.sh | @c Checked by extra-portability.sh | |||
Turning off @samp{portability} will also turn off @samp{extra-portability}, | Turning off @samp{portability} will also turn off @samp{extra-portability}, | |||
and similarly turning on @samp{extra-portability} will also turn on | and similarly turning on @samp{extra-portability} will also turn on | |||
@samp{portability}. However, turning on @samp{portability} or turning | @samp{portability}. However, turning on @samp{portability} or turning | |||
off @samp{extra-portability} will not affect the other category. | off @samp{extra-portability} will not affect the other category. | |||
Unknown warning categories supplied as an argument to @option{-W} will | ||||
themselves produce a warning, in the @samp{unsupported} category. This | ||||
warning is never treated as an error. | ||||
@vindex WARNINGS | @vindex WARNINGS | |||
The environment variable @env{WARNINGS} can contain a comma separated | The environment variable @env{WARNINGS} can contain a comma separated | |||
list of categories to enable. It will be taken into account before the | list of categories to enable. @option{-W} settings on the command line | |||
command-line switches, this way @option{-Wnone} will also ignore any | take precedence; for instance, @option{-Wnone} also turns off any | |||
warning category enabled by @env{WARNINGS}. This variable is also used | warning categories enabled by @env{WARNINGS}. | |||
by other tools like @command{autoconf}; unknown categories are ignored | ||||
for this reason. | Unknown warning categories named in @env{WARNINGS} are silently ignored. | |||
@end table | @end table | |||
@vindex AUTOMAKE_JOBS | @vindex AUTOMAKE_JOBS | |||
If the environment variable @env{AUTOMAKE_JOBS} contains a positive | If the environment variable @env{AUTOMAKE_JOBS} contains a positive | |||
number, it is taken as the maximum number of Perl threads to use in | number, it is taken as the maximum number of Perl threads to use in | |||
@command{automake} for generating multiple @file{Makefile.in} files | @command{automake} for generating multiple @file{Makefile.in} files | |||
concurrently. This is an experimental feature. | concurrently. This is an experimental feature. | |||
@node configure | @node configure | |||
skipping to change at line 4048 | skipping to change at line 4142 | |||
@item AM_SILENT_RULES | @item AM_SILENT_RULES | |||
@acindex AM_SILENT_RULES | @acindex AM_SILENT_RULES | |||
Control the machinery for less verbose build output | Control the machinery for less verbose build output | |||
(@pxref{Automake Silent Rules}). | (@pxref{Automake Silent Rules}). | |||
@item AM_WITH_DMALLOC | @item AM_WITH_DMALLOC | |||
@acindex AM_WITH_DMALLOC | @acindex AM_WITH_DMALLOC | |||
@cindex @command{dmalloc}, support for | @cindex @command{dmalloc}, support for | |||
@vindex WITH_DMALLOC | @vindex WITH_DMALLOC | |||
@opindex --with-dmalloc | @opindex --with-dmalloc | |||
Add support for the @uref{http://dmalloc.com/, Dmalloc package}. If | Add support for the @uref{https://dmalloc.com/, Dmalloc package}. If | |||
the user runs @command{configure} with @option{--with-dmalloc}, then | the user runs @command{configure} with @option{--with-dmalloc}, then | |||
define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}. | define @code{WITH_DMALLOC} and add @option{-ldmalloc} to @code{LIBS}. | |||
@end table | @end table | |||
@node Obsolete Macros | @node Obsolete Macros | |||
@subsection Obsolete Macros | @subsection Obsolete Macros | |||
@cindex obsolete macros | @cindex obsolete macros | |||
@cindex autoupdate | @cindex autoupdate | |||
skipping to change at line 4473 | skipping to change at line 4567 | |||
@command{automake} will make sure the directory exists. Consequently | @command{automake} will make sure the directory exists. Consequently | |||
@command{automake} cannot be run on such a distribution when one | @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 | directory has been omitted. One way to avoid this check is to use the | |||
@code{AC_SUBST} method to declare conditional directories; since | @code{AC_SUBST} method to declare conditional directories; since | |||
@command{automake} does not know the values of @code{AC_SUBST} | @command{automake} does not know the values of @code{AC_SUBST} | |||
variables it cannot ensure the corresponding directory exists. | variables it cannot ensure the corresponding directory exists. | |||
@node Alternative | @node Alternative | |||
@section An Alternative Approach to Subdirectories | @section An Alternative Approach to Subdirectories | |||
If you've ever read Peter Miller's excellent paper, | If you've ever read Peter Miller's excellent paper, @cite{Recursive | |||
@uref{http://miller.emu.id.au/pmiller/books/rmch/, | Make Considered Harmful}, the preceding sections on the use of make | |||
Recursive Make Considered Harmful}, the preceding sections on the use of | recursion will probably come as unwelcome advice. For those who | |||
make recursion will probably come as unwelcome advice. For those who | ||||
haven't read the paper, Miller's main thesis is that recursive | haven't read the paper, Miller's main thesis is that recursive | |||
@command{make} invocations are both slow and error-prone. | @command{make} invocations are both slow and error-prone. | |||
Automake provides sufficient cross-directory support @footnote{We | Automake provides sufficient cross-directory support @footnote{We | |||
believe. This work is new and there are probably warts. | believe. This work is new and there are probably warts. | |||
@xref{Introduction}, for information on reporting bugs.} to enable you | @xref{Introduction}, for information on reporting bugs.} to enable you | |||
to write a single @file{Makefile.am} for a complex multi-directory | to write a single @file{Makefile.am} for a complex multi-directory | |||
package. | package. | |||
By default an installable file specified in a subdirectory will have its | By default an installable file specified in a subdirectory will have its | |||
skipping to change at line 5108 | skipping to change at line 5201 | |||
@cindex suffix @file{.la}, defined | @cindex suffix @file{.la}, defined | |||
@cindex @file{.la} suffix, defined | @cindex @file{.la} suffix, defined | |||
Libtool abstracts shared and static libraries into a unified concept | Libtool abstracts shared and static libraries into a unified concept | |||
henceforth called @dfn{libtool libraries}. Libtool libraries are | henceforth called @dfn{libtool libraries}. Libtool libraries are | |||
files using the @file{.la} suffix, and can designate a static library, | files using the @file{.la} suffix, and can designate a static library, | |||
a shared library, or maybe both. Their exact nature cannot be | a shared library, or maybe both. Their exact nature cannot be | |||
determined until @file{./configure} is run: not all platforms support | determined until @file{./configure} is run: not all platforms support | |||
all kinds of libraries, and users can explicitly select which | all kinds of libraries, and users can explicitly select which | |||
libraries should be built. (However the package's maintainers can | libraries should be built. (However the package's maintainers can | |||
tune the default; @pxref{AC_PROG_LIBTOOL, , The @code{AC_PROG_LIBTOOL} | tune the default; @pxref{LT_INIT, , The @code{LT_INIT} | |||
macro, libtool, The Libtool Manual}.) | macro, libtool, The Libtool Manual}.) | |||
@cindex suffix @file{.lo}, defined | @cindex suffix @file{.lo}, defined | |||
Because object files for shared and static libraries must be compiled | Because object files for shared and static libraries must be compiled | |||
differently, libtool is also used during compilation. Object files | differently, libtool is also used during compilation. Object files | |||
built by libtool are called @dfn{libtool objects}: these are files | built by libtool are called @dfn{libtool objects}: these are files | |||
using the @file{.lo} suffix. Libtool libraries are built from these | using the @file{.lo} suffix. Libtool libraries are built from these | |||
libtool objects. | libtool objects. | |||
You should not assume anything about the structure of @file{.la} or | You should not assume anything about the structure of @file{.la} or | |||
skipping to change at line 6578 | skipping to change at line 6671 | |||
@cindex Mixing Fortran 77 with C and C++ | @cindex Mixing Fortran 77 with C and C++ | |||
@cindex Linking Fortran 77 with C and C++ | @cindex Linking Fortran 77 with C and C++ | |||
@cindex cfortran | @cindex cfortran | |||
@cindex Mixing Fortran 77 with C and/or C++ | @cindex Mixing Fortran 77 with C and/or C++ | |||
Automake currently provides @emph{limited} support for creating programs | Automake currently provides @emph{limited} support for creating programs | |||
and shared libraries that are a mixture of Fortran 77 and C and/or C++. | 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 | However, there are many other issues related to mixing Fortran 77 with | |||
other languages that are @emph{not} (currently) handled by Automake, but | other languages that are @emph{not} (currently) handled by Automake, but | |||
that are handled by other packages@footnote{For example, | that are handled by other packages@footnote{For example, | |||
@uref{http://www-zeus.desy.de/~burow/cfortran/, the cfortran package} | @uref{https://www-zeus.desy.de/~burow/cfortran/, the cfortran package} | |||
addresses all of these inter-language issues, and runs under nearly all | addresses all of these inter-language issues, and runs under nearly all | |||
Fortran 77, C and C++ compilers on nearly all platforms. However, | 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 | @command{cfortran} is not yet Free Software, but it will be in the next | |||
major release.}. | major release.}. | |||
Automake can help in two ways: | Automake can help in two ways: | |||
@enumerate | @enumerate | |||
@item | @item | |||
Automatic selection of the linker depending on which combinations of | Automatic selection of the linker depending on which combinations of | |||
skipping to change at line 6811 | skipping to change at line 6904 | |||
the @code{_LDFLAGS} variable for the program. | the @code{_LDFLAGS} variable for the program. | |||
@node Vala Support | @node Vala Support | |||
@comment node-name, next, previous, up | @comment node-name, next, previous, up | |||
@section Vala Support | @section Vala Support | |||
@cindex Vala Support | @cindex Vala Support | |||
@cindex Support for Vala | @cindex Support for Vala | |||
Automake provides initial support for Vala | Automake provides initial support for Vala | |||
(@uref{http://www.vala-project.org/}). | (@uref{https://www.vala-project.org/}). | |||
This requires valac version 0.7.0 or later, and currently requires | This requires valac version 0.7.0 or later, and currently requires | |||
the user to use GNU @command{make}. | the user to use GNU @command{make}. | |||
@example | @example | |||
foo_SOURCES = foo.vala bar.vala zardoc.c | foo_SOURCES = foo.vala bar.vala zardoc.c | |||
@end example | @end example | |||
Any @file{.vala} file listed in a @code{_SOURCES} variable will be | 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 | 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. | 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} | Automake ships with an Autoconf macro called @code{AM_PROG_VALAC} | |||
that will locate the Vala compiler and optionally check its version | that will locate the Vala compiler and optionally check its version | |||
number. | number. | |||
@defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found}, | @defmac AM_PROG_VALAC (@ovar{minimum-version}, @ovar{action-if-found}, | |||
@ovar{action-if-not-found}) | @ovar{action-if-not-found}) | |||
Search for a Vala compiler in @env{PATH}. If it is found, the variable | 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 | @code{VALAC} is set to point to it (see below for more details). This | |||
macro takes three optional arguments. The first argument, if present, | macro takes three optional arguments. The first argument, if present, | |||
is the minimum version of the Vala compiler required to compile this | is the minimum version of the Vala API required to compile this package. | |||
package. If a compiler is found and satisfies @var{minimum-version}, | For Vala releases, this is the same as the major and minor release | |||
then @var{action-if-found} is run (this defaults to do nothing). | number; e.g., when @code{valac --version} reports @code{0.48.7}, | |||
Otherwise, @var{action-if-not-found} is run. If @var{action-if-not-found} | @code{valac --api-version} reports @code{0.48}. If a compiler is found | |||
is not specified, the default value is to print a warning in case no | and satisfies @var{minimum-version}, then @var{action-if-found} is run | |||
compiler is found, or if a too-old version of the compiler is found. | (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 | @end defmac | |||
There are a few variables that are used when compiling Vala sources: | There are a few variables that are used when compiling Vala sources: | |||
@vtable @code | @vtable @code | |||
@item VALAC | @item VALAC | |||
Absolute path to the Vala compiler, or simply @samp{valac} if no | Absolute path to the Vala compiler, or simply @samp{valac} if no | |||
suitable Vala compiler could be found at configure runtime. | suitable Vala compiler could be found at configure runtime. | |||
@item VALAFLAGS | @item VALAFLAGS | |||
skipping to change at line 7217 | skipping to change at line 7313 | |||
It's a different story if @file{foo.h} doesn't exist by the first | 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 | @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 | @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 | 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. | rule to build @file{foo.h} first by lack of dependency information. | |||
@vindex BUILT_SOURCES | @vindex BUILT_SOURCES | |||
@cindex @code{BUILT_SOURCES}, defined | @cindex @code{BUILT_SOURCES}, defined | |||
The @code{BUILT_SOURCES} variable is a workaround for this problem. A | 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} | source file listed in @code{BUILT_SOURCES} is made when @samp{make | |||
or @samp{make check} (or even @samp{make install}) before other | all}, @samp{make check}, @samp{make install}, @samp{make install-exec} | |||
targets are processed. However, such a source file is not | (or @code{make dist}) is run, before other targets are processed. | |||
@emph{compiled} unless explicitly requested by mentioning it in some | However, such a source file is not @emph{compiled} unless explicitly | |||
other @code{_SOURCES} variable. | requested by mentioning it in some other @code{_SOURCES} variable. | |||
So, to conclude our introductory example, we could use | So, to conclude our introductory example, we could use | |||
@samp{BUILT_SOURCES = foo.h} to ensure @file{foo.h} gets built before | @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 | any other target (including @file{foo.o}) during @samp{make all} or | |||
@samp{make check}. | @samp{make check}. | |||
@code{BUILT_SOURCES} is actually a bit of a misnomer, as any file which | @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 | must be created early in the build process can be listed in this | |||
variable. Moreover, all built sources do not necessarily have to be | variable. Moreover, all built sources do not necessarily have to be | |||
listed in @code{BUILT_SOURCES}. For instance, a generated @file{.c} file | 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 | 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 | another source), because it's a known dependency of the associated | |||
object. | object. | |||
It might be important to emphasize that @code{BUILT_SOURCES} is | To emphasize, @code{BUILT_SOURCES} is honored only by @samp{make all}, | |||
honored only by @samp{make all}, @samp{make check} and @samp{make | @samp{make check}, @samp{make install}, and @code{make install-exec} | |||
install}. This means you cannot build a specific target (e.g., | (and @samp{make dist}). This means you cannot build an arbitrary | |||
@samp{make foo}) in a clean tree if it depends on a built source. | target (e.g., @samp{make foo}) in a clean tree if it depends on a | |||
However it will succeed if you have run @samp{make all} earlier, | built source. However it will succeed if you have run @samp{make all} | |||
because accurate dependencies are already available. | earlier, because accurate dependencies are already available. | |||
The next section illustrates and discusses the handling of built sources | The next section illustrates and discusses the handling of built sources | |||
on a toy example. | on a toy example. | |||
@menu | @menu | |||
* Built Sources Example:: Several ways to handle built sources. | * Built Sources Example:: Several ways to handle built sources. | |||
@end menu | @end menu | |||
@node Built Sources Example | @node Built Sources Example | |||
@subsection Built Sources Example | @subsection Built Sources Example | |||
skipping to change at line 7710 | skipping to change at line 7806 | |||
as follows. | as follows. | |||
@example | @example | |||
AM_PATH_PYTHON(,, [:]) | AM_PATH_PYTHON(,, [:]) | |||
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :]) | AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :]) | |||
@end example | @end example | |||
@item PYTHON_VERSION | @item PYTHON_VERSION | |||
The Python version number, in the form @var{major}.@var{minor} | The Python version number, in the form @var{major}.@var{minor} | |||
(e.g., @samp{2.5}). This is currently the value of | (e.g., @samp{2.5}). This is currently the value of | |||
@samp{sys.version[:3]}. | @samp{'%u.%u' % sys.version_info[:2]}. | |||
@item PYTHON_PREFIX | @item PYTHON_PREFIX | |||
The string @samp{$@{prefix@}}. This term may be used in future work | The string @samp{$@{prefix@}}. This term may be used in future work | |||
that needs the contents of Python's @samp{sys.prefix}, but general | that needs the contents of Python's @samp{sys.prefix}, but general | |||
consensus is to always use the value from @command{configure}. | consensus is to always use the value from @command{configure}. | |||
@item PYTHON_EXEC_PREFIX | @item PYTHON_EXEC_PREFIX | |||
The string @samp{$@{exec_prefix@}}. This term may be used in future work | 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 | that needs the contents of Python's @samp{sys.exec_prefix}, but general | |||
consensus is to always use the value from @command{configure}. | consensus is to always use the value from @command{configure}. | |||
skipping to change at line 7974 | skipping to change at line 8070 | |||
@item TEXI2PDF | @item TEXI2PDF | |||
The name of the command that translates a @file{.texi} file into a | The name of the command that translates a @file{.texi} file into a | |||
@file{.pdf} file. This defaults to @samp{$(TEXI2DVI) --pdf --batch}. | @file{.pdf} file. This defaults to @samp{$(TEXI2DVI) --pdf --batch}. | |||
@item DVIPS | @item DVIPS | |||
The name of the command that builds a @file{.ps} file out of a | The name of the command that builds a @file{.ps} file out of a | |||
@file{.dvi} file. This defaults to @samp{dvips}. | @file{.dvi} file. This defaults to @samp{dvips}. | |||
@item TEXINFO_TEX | @item TEXINFO_TEX | |||
If your package has Texinfo files in many directories, you can use the | 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 | variable @code{TEXINFO_TEX} to tell Automake where to find the canonical | |||
@file{texinfo.tex} for your package. The value of this variable should | @file{texinfo.tex} for your package. The value of this variable should | |||
be the relative path from the current @file{Makefile.am} to | be the relative path from the current @file{Makefile.am} to | |||
@file{texinfo.tex}: | @file{texinfo.tex}: | |||
@example | @example | |||
TEXINFO_TEX = ../doc/texinfo.tex | TEXINFO_TEX = ../doc/texinfo.tex | |||
@end example | @end example | |||
@end vtable | @end vtable | |||
skipping to change at line 8344 | skipping to change at line 8439 | |||
@vindex PACKAGE | @vindex PACKAGE | |||
@vindex VERSION | @vindex VERSION | |||
@trindex dist | @trindex dist | |||
The @code{dist} rule in the generated @file{Makefile.in} can be used | 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 | to generate a gzipped @code{tar} file and other flavors of archive for | |||
distribution. The file is named based on the @code{PACKAGE} and | distribution. The file is named based on the @code{PACKAGE} and | |||
@code{VERSION} variables automatically defined by either the | @code{VERSION} variables automatically defined by either the | |||
@code{AC_INIT} invocation or by a @emph{deprecated} two-arguments | @code{AC_INIT} invocation or by a @emph{deprecated} two-arguments | |||
invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros} | invocation of the @code{AM_INIT_AUTOMAKE} macro (see @ref{Public Macros} | |||
for how these variables get their values, from either defaults or explicit | for how these variables get their values, from either defaults or explicit | |||
values -- it's slightly trickier than one would expect). | values---it's slightly trickier than one would expect). | |||
More precisely the gzipped @code{tar} file is named | More precisely the gzipped @code{tar} file is named | |||
@samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}. | @samp{$@{PACKAGE@}-$@{VERSION@}.tar.gz}. | |||
@vindex GZIP_ENV | @vindex GZIP_ENV | |||
You can use the @command{make} variable @code{GZIP_ENV} to control how gzip | You can use the @command{make} variable @code{GZIP_ENV} to control how gzip | |||
is run. The default setting is @option{--best}. | is run. The default setting is @option{--best}. | |||
@c See automake #9822. | ||||
@vindex TAR | ||||
You can set the environment variable @code{TAR} to override the tar | ||||
program used; it defaults to @code{tar}. | ||||
@cindex @code{m4_include}, distribution | @cindex @code{m4_include}, distribution | |||
@cindex @code{include}, distribution | @cindex @code{include}, distribution | |||
@acindex m4_include | @acindex m4_include | |||
@cmindex include | @cmindex include | |||
For the most part, the files to distribute are automatically found by | For the most part, the files to distribute are automatically found by | |||
Automake: all source files are automatically included in a distribution, | Automake: all source files are automatically included in a distribution, | |||
as are all @file{Makefile.am} and @file{Makefile.in} files. Automake also | 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 | has a built-in list of commonly used files that are automatically | |||
included if they are found in the current directory (either physically, | 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 | or as the target of a @file{Makefile.am} rule); this list is printed by | |||
skipping to change at line 8437 | skipping to change at line 8538 | |||
Occasionally it is useful to be able to change the distribution before | 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 | it is packaged up. If the @code{dist-hook} rule exists, it is run | |||
after the distribution directory is filled, but before the actual | after the distribution directory is filled, but before the actual | |||
distribution archives are created. One way to use this is for | distribution archives are created. One way to use this is for | |||
removing unnecessary files that get recursively included by specifying | removing unnecessary files that get recursively included by specifying | |||
a directory in @code{EXTRA_DIST}: | a directory in @code{EXTRA_DIST}: | |||
@example | @example | |||
EXTRA_DIST = doc | EXTRA_DIST = doc | |||
dist-hook: | dist-hook: | |||
chmod -R u+w $(distdir)/doc | ||||
rm -rf `find $(distdir)/doc -type d -name .svn` | rm -rf `find $(distdir)/doc -type d -name .svn` | |||
@end example | @end example | |||
@c The caveats described here should be documented in 'disthook.sh'. | @c The caveats described here should be documented in 'disthook.sh'. | |||
@noindent | @noindent | |||
Note that the @code{dist-hook} recipe shouldn't assume that the regular | 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 | 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 | 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 | @code{make distcheck} is being done. For similar reasons, the recipe | |||
shouldn't assume that the subdirectories put into the distribution | shouldn't assume that the subdirectories put into the distribution | |||
directory as an effect of having them listed in @code{EXTRA_DIST} are | directory as an effect of having them listed in @code{EXTRA_DIST} are | |||
writable. So, if the @code{dist-hook} recipe wants to modify the | writable. So, if the @code{dist-hook} recipe wants to modify the | |||
content of an existing file (or @code{EXTRA_DIST} subdirectory) in the | content of an existing file (or @code{EXTRA_DIST} subdirectory) in the | |||
distribution directory, it should explicitly to make it writable first: | distribution directory, it should explicitly to make it writable first: | |||
@example | @example | |||
EXTRA_DIST = README doc | EXTRA_DIST = README doc | |||
dist-hook: | dist-hook: | |||
chmod u+w $(distdir)/README $(distdir)/doc | chmod u+w $(distdir)/README $(distdir)/doc | |||
echo "Distribution date: `date`" >> README | echo "Distribution date: `date`" >> $(distdir)/README | |||
rm -f $(distdir)/doc/HACKING | rm -f $(distdir)/doc/HACKING | |||
@end example | @end example | |||
@vindex distdir | @vindex distdir | |||
@vindex top_distdir | @vindex top_distdir | |||
Two variables that come handy when writing @code{dist-hook} rules are | Two variables that come handy when writing @code{dist-hook} rules are | |||
@samp{$(distdir)} and @samp{$(top_distdir)}. | @samp{$(distdir)} and @samp{$(top_distdir)}. | |||
@samp{$(distdir)} points to the directory where the @code{dist} rule | @samp{$(distdir)} points to the directory where the @code{dist} rule | |||
will copy files from the current directory before creating the | will copy files from the current directory before creating the | |||
skipping to change at line 8492 | skipping to change at line 8594 | |||
dist} was run, not to any sub-packages involved. | dist} was run, not to any sub-packages involved. | |||
@node Checking the Distribution | @node Checking the Distribution | |||
@section Checking the Distribution | @section Checking the Distribution | |||
@cindex @samp{make distcheck} | @cindex @samp{make distcheck} | |||
@trindex distcheck | @trindex distcheck | |||
Automake also generates a @code{distcheck} rule that can be of help | Automake also generates a @code{distcheck} rule that can be of help | |||
to ensure that a given distribution will actually work. Simplifying | to ensure that a given distribution will actually work. Simplifying | |||
a bit, we can say this rule first makes a distribution, and then, | a bit, we can say this rule first makes a distribution, and then, | |||
@emph{operating from it}, takes the following steps: | @emph{operating from it}, takes the following steps (in this order): | |||
@itemize | @itemize | |||
@item | @item | |||
tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the | tries to do a @code{VPATH} build (@pxref{VPATH Builds}), with the | |||
@code{srcdir} and all its content made @emph{read-only}; | @code{srcdir} and all its content made @emph{read-only}; | |||
@item | @item | |||
tries to make the printable documentation, if any (with @command{make dvi}), | ||||
@item | ||||
runs the test suite (with @command{make check}) on this fresh build; | runs the test suite (with @command{make check}) on this fresh build; | |||
@item | @item | |||
installs the package in a temporary directory (with @command{make | installs the package in a temporary directory (with @command{make | |||
install}), and runs the test suite on the resulting installation | install}), and runs the test suite on the resulting installation | |||
(with @command{make installcheck}); | (with @command{make installcheck}); | |||
@item | @item | |||
checks that the package can be correctly uninstalled (by @command{make | checks that the package can be correctly uninstalled (by @command{make | |||
uninstall}) and cleaned (by @code{make distclean}); | uninstall}) and cleaned (by @code{make distclean}); | |||
@item | @item | |||
finally, makes another tarball to ensure the distribution is | finally, makes another tarball to ensure the distribution is | |||
self-contained. | self-contained. | |||
@end itemize | @end itemize | |||
All of these actions are performed in a temporary directory. Please | All of these actions are performed in a temporary directory. The | |||
note that the exact location and the exact structure of such a directory | exact location and the exact structure of such a directory (where the | |||
(where the read-only sources are placed, how the temporary build and | read-only sources are placed, how the temporary build and install | |||
install directories are named and how deeply they are nested, etc.) is | directories are named and how deeply they are nested, etc.) is to be | |||
to be considered an implementation detail, which can change at any time; | considered an implementation detail, which can change at any time; so | |||
so do not rely on it. | do not rely on it. | |||
@vindex AM_DISTCHECK_CONFIGURE_FLAGS | @vindex AM_DISTCHECK_CONFIGURE_FLAGS | |||
@vindex DISTCHECK_CONFIGURE_FLAGS | @vindex DISTCHECK_CONFIGURE_FLAGS | |||
@subheading DISTCHECK_CONFIGURE_FLAGS | @subheading DISTCHECK_CONFIGURE_FLAGS | |||
Building the package involves running @samp{./configure}. If you need | Building the package involves running @samp{./configure}. If you need | |||
to supply additional flags to @command{configure}, define them in the | to supply additional flags to @command{configure}, define them in the | |||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level | @code{AM_DISTCHECK_CONFIGURE_FLAGS} variable in your top-level | |||
@file{Makefile.am}. The user can still extend or override the flags | @file{Makefile.am}. The user can still extend or override the flags | |||
provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable, | provided there by defining the @code{DISTCHECK_CONFIGURE_FLAGS} variable, | |||
on the command line when invoking @command{make}. | on the command line when invoking @command{make}. | |||
skipping to change at line 8550 | skipping to change at line 8654 | |||
default with its experimental and seldom used "changeword" feature | default with its experimental and seldom used "changeword" feature | |||
disabled; so in this case it is useful to have @command{make distcheck} | disabled; so in this case it is useful to have @command{make distcheck} | |||
run configure with the @option{--with-changeword} option, to ensure that | run configure with the @option{--with-changeword} option, to ensure that | |||
the code for changeword support still compiles correctly. | the code for changeword support still compiles correctly. | |||
GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS} | GNU @command{m4} also employs the @code{AM_DISTCHECK_CONFIGURE_FLAGS} | |||
variable to stress-test the use of @option{--program-prefix=g}, since at | 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 | one point the @command{m4} build system had a bug where @command{make | |||
installcheck} was wrongly assuming it could blindly test "@command{m4}", | installcheck} was wrongly assuming it could blindly test "@command{m4}", | |||
rather than the just-installed "@command{gm4}". | rather than the just-installed "@command{gm4}". | |||
@trindex dvi | ||||
@subheading dvi and distcheck | ||||
@cindex @code{eps} images | ||||
Ordinarily, @command{make distcheck} runs @command{make dvi}. It does | ||||
nothing if the distribution contains no Texinfo sources. If the | ||||
distribution does contain a Texinfo manual, by default the @code{dvi} | ||||
target will run @TeX{} to make sure it can be successfully processed | ||||
(@pxref{Texinfo}). | ||||
However, you may wish to test the manual by producing @code{pdf} | ||||
(e.g., if your manual uses images in formats other than @code{eps}), | ||||
@code{html} (if you don't have @TeX{} at all), some other format, or | ||||
just skip the test entirely (not recommended). You can change the | ||||
target that is run by setting the variable | ||||
@code{AM_DISTCHECK_DVI_TARGET} in your @code{Makefile.am}; for | ||||
example, | ||||
@example | ||||
AM_DISTCHECK_DVI_TARGET = pdf | ||||
@end example | ||||
To make @code{dvi} into a do-nothing target, see the example for | ||||
@code{EMPTY_AUTOMAKE_TARGETS} in @ref{Third-Party Makefiles}. | ||||
@trindex distcheck-hook | @trindex distcheck-hook | |||
@subheading distcheck-hook | @subheading distcheck-hook | |||
If the @code{distcheck-hook} rule is defined in your top-level | If the @code{distcheck-hook} rule is defined in your top-level | |||
@file{Makefile.am}, then it will be invoked by @code{distcheck} after | @file{Makefile.am}, then it will be invoked by @code{distcheck} after | |||
the new distribution has been unpacked, but before the unpacked copy | the new distribution has been unpacked, but before the unpacked copy | |||
is configured and built. Your @code{distcheck-hook} can do almost | is configured and built. Your @code{distcheck-hook} can do almost | |||
anything, though as always caution is advised. Generally this hook is | anything, though as always caution is advised. Generally this hook is | |||
used to check for potential distribution errors not caught by the | used to check for potential distribution errors not caught by the | |||
standard mechanism. Note that @code{distcheck-hook} as well as | standard mechanism. Note that @code{distcheck-hook} as well as | |||
@code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS} | @code{AM_DISTCHECK_CONFIGURE_FLAGS} and @code{DISTCHECK_CONFIGURE_FLAGS} | |||
skipping to change at line 8772 | skipping to change at line 8900 | |||
@cindex test failure | @cindex test failure | |||
A test is said to @emph{pass} when it can determine that the condition or | 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 | 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. | determine that such condition of behaviour does @emph{not} hold. | |||
@cindex test skip | @cindex test skip | |||
Sometimes, tests can rely on non-portable tools or prerequisites, or | 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 | 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 | Windows-specific feature makes no sense on a GNU/Linux system). In this | |||
case, accordingly to the definition above, the tests can neither be | case, accordingly to the definition above, the tests can neither be | |||
considered passed nor failed; instead, they are @emph{skipped} -- i.e., | considered passed nor failed; instead, they are @emph{skipped}- --i.e., | |||
they are not run, or their result is anyway ignored for what concerns | they are not run, or their result is anyway ignored for what concerns | |||
the count of failures and successes. Skips are usually explicitly | the count of failures and successes. Skips are usually explicitly | |||
reported though, so that the user will be aware that not all of the | reported though, so that the user will be aware that not all of the | |||
testsuite has really run. | testsuite has really run. | |||
@cindex xfail | @cindex xfail | |||
@cindex expected failure | @cindex expected failure | |||
@cindex expected test failure | @cindex expected test failure | |||
@cindex xpass | @cindex xpass | |||
@cindex unexpected pass | @cindex unexpected pass | |||
skipping to change at line 8830 | skipping to change at line 8958 | |||
Test scripts can be executed serially or concurrently. Automake supports | Test scripts can be executed serially or concurrently. Automake supports | |||
both these kinds of test execution, with the parallel test harness being | both these kinds of test execution, with the parallel test harness being | |||
the default. The concurrent test harness relies on the concurrence | the default. The concurrent test harness relies on the concurrence | |||
capabilities (if any) offered by the underlying @command{make} | capabilities (if any) offered by the underlying @command{make} | |||
implementation, and can thus only be as good as those are. | implementation, and can thus only be as good as those are. | |||
By default, only the exit statuses of the test scripts are considered when | By default, only the exit statuses of the test scripts are considered when | |||
determining the testsuite outcome. But Automake allows also the use of | determining the testsuite outcome. But Automake allows also the use of | |||
more complex test protocols, either standard (@pxref{Using the TAP test | more complex test protocols, either standard (@pxref{Using the TAP test | |||
protocol}) or custom (@pxref{Custom Test Drivers}). Note that you can't | protocol}) or custom (@pxref{Custom Test Drivers}). You can't | |||
enable such protocols when the serial harness is used, though. | enable such protocols when the serial harness is used, though. | |||
In the rest of this section we are going to concentrate mostly on | 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 | protocol-less tests, since we cover test protocols in a later section | |||
(again, @pxref{Custom Test Drivers}). | (again, @pxref{Custom Test Drivers}). | |||
@cindex Exit status 77, special interpretation | @cindex Exit status 77, special interpretation | |||
@cindex Exit status 99, 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 | 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 | denote a success, an exit status of 77 a skipped test, an exit status of 99 | |||
a hard error, and any other exit status will denote a failure. | a hard error, and any other exit status will denote a failure. | |||
skipping to change at line 8888 | skipping to change at line 9016 | |||
SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted | SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted | |||
PASS: zardoz.tap 4 - Daemon stopped | PASS: zardoz.tap 4 - Daemon stopped | |||
SKIP: bar.sh | SKIP: bar.sh | |||
PASS: mu.tap 1 | PASS: mu.tap 1 | |||
XFAIL: mu.tap 2 # TODO frobnication not yet implemented | XFAIL: mu.tap 2 # TODO frobnication not yet implemented | |||
@end example | @end example | |||
@noindent | @noindent | |||
A testsuite summary (expected to report at least the number of run, | 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 | skipped and failed tests) will be printed at the end of the testsuite | |||
run. | run. By default, the first line of the summary has the form: | |||
@example | ||||
Testsuite summary for @var{package-string} | ||||
@end example | ||||
@c See automake bug#11745. | ||||
@vindex AM_TESTSUITE_SUMMARY_HEADER | ||||
@noindent | ||||
where @var{package-string} is the name and version of the package. If | ||||
you have several independent test suites for different parts of the | ||||
package, though, it can be misleading for each suite to imply it is | ||||
for the whole package. Or, in complex projects, you may wish to add | ||||
the current directory or other information to the testsuite header | ||||
line. So you can override the @samp{ for @var{package-string}} suffix | ||||
on that line by setting the @code{AM_TESTSUITE_SUMMARY_HEADER} | ||||
variable. The value of this variable is used unquoted in a shell echo | ||||
command, so you must include any necessary quotes. For example, the | ||||
default value is | ||||
@example | ||||
AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' | ||||
@end example | ||||
@noindent | ||||
including the double quotes (interpreted by the shell) and the leading | ||||
space (since the value is output directly after the @samp{Testsuite | ||||
summary}). The @code{$(PACKAGE_STRING)} is substituted by @code{make}. | ||||
@anchor{Simple tests and color-tests} | @anchor{Simple tests and color-tests} | |||
@vindex AM_COLOR_TESTS | @vindex AM_COLOR_TESTS | |||
@cindex Colorized testsuite output | @cindex Colorized testsuite output | |||
If the standard output is connected to a capable terminal, then the test | If the standard output is connected to a capable terminal, then the test | |||
results and the summary are colored appropriately. The developer and the | results and the summary are colored appropriately. The developer and the | |||
user can disable colored output by setting the @command{make} variable | user can disable colored output by setting the @command{make} variable | |||
@samp{AM_COLOR_TESTS=no}; the user can in addition force colored output | @samp{AM_COLOR_TESTS=no}; the user can in addition force colored output | |||
even without a connecting terminal with @samp{AM_COLOR_TESTS=always}. | even without a connecting terminal with @samp{AM_COLOR_TESTS=always}. | |||
It's also worth noting that some @command{make} implementations, | It's also worth noting that some @command{make} implementations, | |||
skipping to change at line 9594 | skipping to change at line 9749 | |||
``TAP producers'' in this context) write test results in a simple format | ``TAP producers'' in this context) write test results in a simple format | |||
on standard output; a test harness (also called ``TAP consumer'') will | on standard output; a test harness (also called ``TAP consumer'') will | |||
parse and interpret these results, and properly present them to the user, | 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 | and/or register them for later analysis. The exact details of how this | |||
is accomplished can vary among different test harnesses. The Automake | is accomplished can vary among different test harnesses. The Automake | |||
harness will present the results on the console in the usual | harness will present the results on the console in the usual | |||
fashion (@pxref{Testsuite progress on console}), and will use the | fashion (@pxref{Testsuite progress on console}), and will use the | |||
@file{.trs} files (@pxref{Basics of test metadata}) to store the test | @file{.trs} files (@pxref{Basics of test metadata}) to store the test | |||
results and related metadata. Apart from that, it will try to remain | results and related metadata. Apart from that, it will try to remain | |||
as compatible as possible with pre-existing and widespread utilities, | as compatible as possible with pre-existing and widespread utilities, | |||
such as the @uref{http://search.cpan.org/~andya/Test-Harness/bin/prove, | such as the | |||
@uref{https://metacpan.org/pod/distribution/Test-Harness/bin/prove, | ||||
@command{prove} utility}, at least for the simpler usages. | @command{prove} utility}, at least for the simpler usages. | |||
TAP started its life as part of the test harness for Perl, but today | TAP started its life as part of the test harness for Perl, but today | |||
it has been (mostly) standardized, and has various independent | it has been (mostly) standardized, and has various independent | |||
implementations in different languages; among them, C, C++, Perl, | implementations in different languages; among them, C, C++, Perl, | |||
Python, PHP, and Java. For a semi-official specification of the | Python, PHP, and Java. For a semi-official specification of the | |||
TAP protocol, please refer to the documentation of | TAP protocol, please refer to the documentation of | |||
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod, | @uref{https://metacpan.org/pod/Test::Harness, @samp{Test::Harness}}. | |||
@samp{Test::Harness::TAP}}. | ||||
The most relevant real-world usages of TAP are obviously in the testsuites | The most relevant real-world usages of TAP are obviously in the testsuites | |||
of @command{perl} and of many perl modules. Still, other important | of @command{perl} and of many Perl modules. Still, other important | |||
third-party packages, such as @uref{http://git-scm.com/, @command{git}}, | third-party packages, such as @uref{https://git-scm.com/, @command{git}}, | |||
also use TAP in their testsuite. | also use TAP in their testsuite. | |||
@node Use TAP with the Automake test harness | @node Use TAP with the Automake test harness | |||
@subsection 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 | Currently, the TAP driver that comes with Automake requires some by-hand | |||
steps on the developer's part (this situation should hopefully be improved | 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} | 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, | 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 | and use the Automake support for third-party test drivers to instruct the | |||
skipping to change at line 9775 | skipping to change at line 9930 | |||
@node Links and external resources on TAP | @node Links and external resources on TAP | |||
@subsection Links and external resources on TAP | @subsection Links and external resources on TAP | |||
@noindent | @noindent | |||
Here are some links to more extensive official or third-party | Here are some links to more extensive official or third-party | |||
documentation and resources about the TAP protocol and related | documentation and resources about the TAP protocol and related | |||
tools and libraries. | tools and libraries. | |||
@itemize @bullet | @itemize @bullet | |||
@item | @item | |||
@uref{http://search.cpan.org/~petdance/Test-Harness/lib/Test/Harness/TAP.pod, | @uref{https://metacpan.org/pod/Test::Harness, @samp{Test::Harness}}, | |||
@samp{Test::Harness::TAP}}, | ||||
the (mostly) official documentation about the TAP format and protocol. | the (mostly) official documentation about the TAP format and protocol. | |||
@item | @item | |||
@uref{http://search.cpan.org/~andya/Test-Harness/bin/prove, | @uref{https://metacpan.org/pod/distribution/Test-Harness/bin/prove, | |||
@command{prove}}, | @command{prove}}, | |||
the most famous command-line TAP test driver, included in the distribution | the most famous command-line TAP test driver, included in the distribution | |||
of @command{perl} and | of @command{perl} and | |||
@uref{http://search.cpan.org/~andya/Test-Harness/lib/Test/Harness.pm, | @uref{https://metacpan.org/pod/distribution/Test-Harness/lib/Test/Harness.pm, | |||
@samp{Test::Harness}}. | @samp{Test::Harness}}. | |||
@item | @item | |||
The @uref{http://testanything.org/wiki/index.php/Main_Page,TAP wiki}. | The @uref{https://testanything.org/,TAP wiki}. | |||
@item | @item | |||
A ``gentle introduction'' to testing for perl coders: | A ``gentle introduction'' to testing for Perl coders: | |||
@uref{http://search.cpan.org/dist/Test-Simple/lib/Test/Tutorial.pod, | @uref{https://metacpan.org/pod/distribution/Test-Simple/lib/Test/Tutorial.pod, | |||
@samp{Test::Tutorial}}. | @samp{Test::Tutorial}}. | |||
@item | @item | |||
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/Simple.pm, | @uref{https://metacpan.org/pod/distribution/Test-Simple/lib/Test/Simple.pm, | |||
@samp{Test::Simple}} | @samp{Test::Simple}} | |||
and | and | |||
@uref{http://search.cpan.org/~mschwern/Test-Simple/lib/Test/More.pm, | @uref{https://metacpan.org/pod/distribution/Test-Simple/lib/Test/More.pm, | |||
@samp{Test::More}}, | @samp{Test::More}}, | |||
the standard perl testing libraries, which are based on TAP. | the standard Perl testing libraries, which are based on TAP. | |||
@item | @item | |||
@uref{http://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness}, | @uref{https://www.eyrie.org/~eagle/software/c-tap-harness/,C TAP Harness}, | |||
a C-based project implementing both a TAP producer and a TAP consumer. | a C-based project implementing both a TAP producer and a TAP consumer. | |||
@item | @item | |||
@uref{http://www.tap4j.org/,tap4j}, | @uref{https://tap4j.org/,tap4j}, | |||
a Java-based project implementing both a TAP producer and a TAP consumer. | a Java-based project implementing both a TAP producer and a TAP consumer. | |||
@end itemize | @end itemize | |||
@node DejaGnu Tests | @node DejaGnu Tests | |||
@section DejaGnu Tests | @section DejaGnu Tests | |||
If @uref{https://ftp.gnu.org/gnu/dejagnu/, @command{dejagnu}} appears in | If @command{dejagnu} (@pxref{Top, , Introduction, dejagnu, DejaGnu}) | |||
@code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based test suite is | appears in @code{AUTOMAKE_OPTIONS}, then a @command{dejagnu}-based | |||
assumed. The variable @code{DEJATOOL} is a list of names that are | test suite is assumed. The variable @code{DEJATOOL} is a list of | |||
passed, one at a time, as the @option{--tool} argument to | names that are passed, one at a time, as the @option{--tool} argument | |||
@command{runtest} invocations; it defaults to the name of the package. | to @command{runtest} invocations; it defaults to the name of the | |||
package. | ||||
The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and | The variable @code{RUNTESTDEFAULTFLAGS} holds the @option{--tool} and | |||
@option{--srcdir} flags that are passed to dejagnu by default; this can be | @option{--srcdir} flags that are passed to dejagnu by default; this can be | |||
overridden if necessary. | overridden if necessary. | |||
@vindex RUNTESTDEFAULTFLAGS | @vindex RUNTESTDEFAULTFLAGS | |||
The variables @code{EXPECT} and @code{RUNTEST} can | The variables @code{EXPECT} and @code{RUNTEST} can | |||
also be overridden to provide project-specific values. For instance, | also be overridden to provide project-specific values. For instance, | |||
you will need to do this if you are testing a compiler toolchain, | 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 | because the default values do not take into account host and target | |||
skipping to change at line 10033 | skipping to change at line 10188 | |||
@item @option{gnits} | @item @option{gnits} | |||
@itemx @option{gnu} | @itemx @option{gnu} | |||
@itemx @option{foreign} | @itemx @option{foreign} | |||
@cindex Option, @option{gnits} | @cindex Option, @option{gnits} | |||
@cindex Option, @option{gnu} | @cindex Option, @option{gnu} | |||
@cindex Option, @option{foreign} | @cindex Option, @option{foreign} | |||
@opindex gnits | @opindex gnits | |||
@opindex gnu | @opindex gnu | |||
@opindex foreign | @opindex foreign | |||
Set the strictness as appropriate. The @option{gnits} option also | Set the strictness as appropriate. @xref{Strictness}. | |||
implies options @option{readme-alpha} and @option{check-news}. | The @option{gnits} option also implies options @option{readme-alpha} and | |||
@option{check-news}. | ||||
@item @option{check-news} | @item @option{check-news} | |||
@cindex Option, @option{check-news} | @cindex Option, @option{check-news} | |||
@opindex check-news | @opindex check-news | |||
Cause @samp{make dist} to fail unless the current version number appears | Cause @samp{make dist} to fail unless the current version number appears | |||
in the first few lines of the @file{NEWS} file. | in the first few lines of the @file{NEWS} file. | |||
@item @option{dejagnu} | @item @option{dejagnu} | |||
@cindex Option, @option{dejagnu} | @cindex Option, @option{dejagnu} | |||
@opindex dejagnu | @opindex dejagnu | |||
skipping to change at line 10987 | skipping to change at line 11143 | |||
$(pkg_verbose)cp $(srcdir)/foo.in $@@ | $(pkg_verbose)cp $(srcdir)/foo.in $@@ | |||
@end example | @end example | |||
@end itemize | @end itemize | |||
As a final note, observe that, even when silent rules are enabled, | As a final note, observe that, even when silent rules are enabled, | |||
the @option{--no-print-directory} option is still required with GNU | the @option{--no-print-directory} option is still required with GNU | |||
@command{make} if the ``@i{Entering/Leaving directory ...}'' messages | @command{make} if the ``@i{Entering/Leaving directory ...}'' messages | |||
are to be disabled. | 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 | @node Not Enough | |||
@chapter When Automake Isn't Enough | @chapter When Automake Isn't Enough | |||
In some situations, where Automake is not up to one task, one has to | In some situations, where Automake is not up to one task, one has to | |||
resort to handwritten rules or even handwritten @file{Makefile}s. | resort to handwritten rules or even handwritten @file{Makefile}s. | |||
@menu | @menu | |||
* Extending:: Adding new rules or overriding existing ones. | * Extending:: Adding new rules or overriding existing ones. | |||
* Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s. | * Third-Party Makefiles:: Integrating Non-Automake @file{Makefile}s. | |||
@end menu | @end menu | |||
skipping to change at line 11356 | skipping to change at line 11442 | |||
@code{SUBDIRS} need only the @code{distclean}, | @code{SUBDIRS} need only the @code{distclean}, | |||
@code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional | @code{maintainer-clean}, and @code{distdir} rules (@pxref{Conditional | |||
Subdirectories}). | Subdirectories}). | |||
Usually, many of these rules are irrelevant to the third-party | Usually, many of these rules are irrelevant to the third-party | |||
subproject, but they are required for the whole package to work. It's | 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 | 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 | third-party project with no documentation or tag support, you could | |||
simply augment its @file{Makefile} as follows: | simply augment its @file{Makefile} as follows: | |||
@vindex EMPTY_AUTOMAKE_TARGETS | ||||
@cindex Automake targets, no-op | ||||
@cindex do-nothing Automake targets | ||||
@cindex empty Automake targets | ||||
@cindex no-op Automake targets | ||||
@cindex targets, making into no-op | ||||
@example | @example | |||
EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags | EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags | |||
.PHONY: $(EMPTY_AUTOMAKE_TARGETS) | .PHONY: $(EMPTY_AUTOMAKE_TARGETS) | |||
$(EMPTY_AUTOMAKE_TARGETS): | $(EMPTY_AUTOMAKE_TARGETS): | |||
@end example | @end example | |||
To be clear, there is nothing special about the variable name | ||||
@code{EMPTY_AUTOMAKE_TARGETS}; the name could be anything. | ||||
Another aspect of integrating third-party build systems is whether | Another aspect of integrating third-party build systems is whether | |||
they support VPATH builds (@pxref{VPATH Builds}). Obviously if the | they support VPATH builds (@pxref{VPATH Builds}). Obviously if the | |||
subpackage does not support VPATH builds the whole package will not | subpackage does not support VPATH builds the whole package will not | |||
support VPATH builds. This in turns means that @samp{make distcheck} | support VPATH builds. This in turns means that @samp{make distcheck} | |||
will not work, because it relies on VPATH builds. Some people can | will not work, because it relies on VPATH builds. Some people can | |||
live without this (actually, many Automake users have never heard of | live without this (actually, many Automake users have never heard of | |||
@samp{make distcheck}). Other people may prefer to revamp the | @samp{make distcheck}). Other people may prefer to revamp the | |||
existing @file{Makefile}s to support VPATH@. Doing so does not | existing @file{Makefile}s to support VPATH@. Doing so does not | |||
necessarily require Automake; only Autoconf is needed (@pxref{Build | necessarily require Automake; only Autoconf is needed (@pxref{Build | |||
Directories, , Build Directories, autoconf, The Autoconf Manual}). | Directories, , Build Directories, autoconf, The Autoconf Manual}). | |||
skipping to change at line 11790 | skipping to change at line 11885 | |||
@cindex third-party files and CVS | @cindex third-party files and CVS | |||
Another class of files not discussed here (because they do not cause | Another class of files not discussed here (because they do not cause | |||
timestamp issues) are files that are shipped with a package, but | timestamp issues) are files that are shipped with a package, but | |||
maintained elsewhere. For instance, tools like @command{gettextize} | maintained elsewhere. For instance, tools like @command{gettextize} | |||
and @command{autopoint} (from Gettext) or @command{libtoolize} (from | and @command{autopoint} (from Gettext) or @command{libtoolize} (from | |||
Libtool), will install or update files in your package. | Libtool), will install or update files in your package. | |||
These files, whether they are kept under CVS or not, raise similar | These files, whether they are kept under CVS or not, raise similar | |||
concerns about version mismatch between developers' tools. The | concerns about version mismatch between developers' tools. The | |||
Gettext manual has a section about this; see @ref{CVS Issues, CVS | Gettext manual has a section about this; see @ref{Version Control Issues,, | |||
Issues, Integrating with CVS, gettext, GNU gettext tools}. | Integrating with Version Control Systems, gettext, GNU gettext tools}. | |||
@node maintainer-mode | @node maintainer-mode | |||
@section @command{missing} and @code{AM_MAINTAINER_MODE} | @section @command{missing} and @code{AM_MAINTAINER_MODE} | |||
@subheading @command{missing} | @subheading @command{missing} | |||
@cindex @command{missing}, purpose | @cindex @command{missing}, purpose | |||
The @command{missing} script is a wrapper around several maintainer | The @command{missing} script is a wrapper around several maintainer | |||
tools, designed to warn users if a maintainer tool is required but | tools, designed to warn users if a maintainer tool is required but | |||
missing. Typical maintainer tools are @command{autoconf}, | missing. Typical maintainer tools are @command{autoconf}, | |||
skipping to change at line 12015 | skipping to change at line 12110 | |||
files should not contain these characters. | files should not contain these characters. | |||
Source and installation file names like @file{main.c} are limited even | Source and installation file names like @file{main.c} are limited even | |||
further: they should conform to the POSIX/XOPEN | further: they should conform to the POSIX/XOPEN | |||
rules described above. In addition, if you plan to port to | rules described above. In addition, if you plan to port to | |||
non-POSIX environments, you should avoid file names that | non-POSIX environments, you should avoid file names that | |||
differ only in case (e.g., @file{makefile} and @file{Makefile}). | differ only in case (e.g., @file{makefile} and @file{Makefile}). | |||
Nowadays it is no longer worth worrying about the 8.3 limits of | Nowadays it is no longer worth worrying about the 8.3 limits of | |||
DOS file systems. | DOS file systems. | |||
@c FIXME This should probably be moved in the "Checking the Distribution" | @c FIXME This should probably be moved to the "Checking the Distribution" | |||
@c FIXME section... | @c FIXME section... | |||
@node Errors with distclean | @node Errors with distclean | |||
@section Errors with distclean | @section Errors with distclean | |||
@cindex @code{distclean}, diagnostic | @cindex @code{distclean}, diagnostic | |||
@cindex @samp{make distclean}, diagnostic | @cindex @samp{make distclean}, diagnostic | |||
@cindex dependencies and distributed files | @cindex dependencies and distributed files | |||
@trindex distclean | @trindex distclean | |||
This is a diagnostic you might encounter while running @samp{make | This is a diagnostic you might encounter while running @samp{make | |||
distcheck}. | distcheck}. | |||
skipping to change at line 12620 | skipping to change at line 12715 | |||
@file{data.foo}, and this is already the case. | @file{data.foo}, and this is already the case. | |||
What we need is a rule that forces a rebuild when @file{data.h} is | What we need is a rule that forces a rebuild when @file{data.h} is | |||
missing. Here it is: | missing. Here it is: | |||
@example | @example | |||
data.c: data.foo | data.c: data.foo | |||
foo data.foo | foo data.foo | |||
data.h: data.c | data.h: data.c | |||
## Recover from the removal of $@@ | ## Recover from the removal of $@@ | |||
@@test -f $@@ || rm -f data.c | ||||
@@test -f $@@ || $(MAKE) $(AM_MAKEFLAGS) data.c | ||||
@end example | ||||
It is tempting to use a single test as follows: | ||||
@example | ||||
data.h: data.c | ||||
## Recover from the removal of $@@ | ||||
@@if test -f $@@; then :; else \ | @@if test -f $@@; then :; else \ | |||
rm -f data.c; \ | rm -f data.c; \ | |||
$(MAKE) $(AM_MAKEFLAGS) data.c; \ | $(MAKE) $(AM_MAKEFLAGS) data.c; \ | |||
fi | fi | |||
@end example | @end example | |||
@noindent | ||||
but that would break @samp{make -n}: at least GNU @command{make} and | ||||
Solaris @command{make} execute recipes containing the @samp{$(MAKE)} | ||||
string even when they are running in dry mode. So if we didn't break | ||||
the recipe above in two invocations, the file @file{data.c} would be | ||||
removed even upon @samp{make -n}. Not nice. | ||||
The above scheme can be extended to handle more outputs and more | 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 | 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 | successful completion of the command, it depends upon all inputs, and | |||
all other outputs depend upon it. For instance, if @command{foo} | all other outputs depend upon it. For instance, if @command{foo} | |||
should additionally read @file{data.bar} and also produce | should additionally read @file{data.bar} and also produce | |||
@file{data.w} and @file{data.x}, we would write: | @file{data.w} and @file{data.x}, we would write: | |||
@example | @example | |||
data.c: data.foo data.bar | data.c: data.foo data.bar | |||
foo data.foo data.bar | foo data.foo data.bar | |||
data.h data.w data.x: data.c | data.h data.w data.x: data.c | |||
## Recover from the removal of $@@ | ## Recover from the removal of $@@ | |||
@@if test -f $@@; then :; else \ | @@test -f $@@ || rm -f data.c | |||
rm -f data.c; \ | @@test -f $@@ || $(MAKE) $(AM_MAKEFLAGS) data.c | |||
$(MAKE) $(AM_MAKEFLAGS) data.c; \ | ||||
fi | ||||
@end example | @end example | |||
However there are now three minor problems in this setup. One is related | However there are now three minor problems in this setup. One is related | |||
to the timestamp ordering of @file{data.h}, @file{data.w}, | to the timestamp ordering of @file{data.h}, @file{data.w}, | |||
@file{data.x}, and @file{data.c}. Another one is a race condition | @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 | if a parallel @command{make} attempts to run multiple instances of the | |||
recover block at once. Finally, the recursive rule breaks @samp{make -n} | 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} | 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 | implementations), as it may remove @file{data.h} even when it should not | |||
(@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make, | (@pxref{MAKE Variable, , How the @code{MAKE} Variable Works, make, | |||
skipping to change at line 12671 | skipping to change at line 12780 | |||
that is: nothing. In other words, because the witness we selected is | that is: nothing. In other words, because the witness we selected is | |||
not the first file created by @command{foo}, @command{make} will start | not the first file created by @command{foo}, @command{make} will start | |||
a shell to do nothing each time it is run. | a shell to do nothing each time it is run. | |||
A simple riposte is to fix the timestamps when this happens. | A simple riposte is to fix the timestamps when this happens. | |||
@example | @example | |||
data.c: data.foo data.bar | data.c: data.foo data.bar | |||
foo data.foo data.bar | foo data.foo data.bar | |||
data.h data.w data.x: data.c | data.h data.w data.x: data.c | |||
@@if test -f $@@; then \ | @@test ! -f $@@ || touch $@@ | |||
touch $@@; \ | ||||
else \ | ||||
## Recover from the removal of $@@ | ## Recover from the removal of $@@ | |||
rm -f data.c; \ | @@test -f $@@ || rm -f data.c | |||
$(MAKE) $(AM_MAKEFLAGS) data.c; \ | @@test -f $@@ || $(MAKE) $(AM_MAKEFLAGS) data.c | |||
fi | ||||
@end example | @end example | |||
Another solution is to use a different and dedicated file as witness, | Another solution is to use a different and dedicated file as witness, | |||
rather than using any of @command{foo}'s outputs. | rather than using any of @command{foo}'s outputs. | |||
@example | @example | |||
data.stamp: data.foo data.bar | data.stamp: data.foo data.bar | |||
@@rm -f data.tmp | @@rm -f data.tmp | |||
@@touch data.tmp | @@touch data.tmp | |||
foo data.foo data.bar | foo data.foo data.bar | |||
@@mv -f data.tmp $@@ | @@mv -f data.tmp $@@ | |||
data.c data.h data.w data.x: data.stamp | data.c data.h data.w data.x: data.stamp | |||
## Recover from the removal of $@@ | ## Recover from the removal of $@@ | |||
@@if test -f $@@; then :; else \ | @@test -f $@@ || rm -f data.stamp | |||
rm -f data.stamp; \ | @@test -f $@@ || $(MAKE) $(AM_MAKEFLAGS) data.stamp | |||
$(MAKE) $(AM_MAKEFLAGS) data.stamp; \ | ||||
fi | ||||
@end example | @end example | |||
@file{data.tmp} is created before @command{foo} is run, so it has a | @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 | timestamp older than output files output by @command{foo}. It is then | |||
renamed to @file{data.stamp} after @command{foo} has run, because we | renamed to @file{data.stamp} after @command{foo} has run, because we | |||
do not want to update @file{data.stamp} if @command{foo} fails. | do not want to update @file{data.stamp} if @command{foo} fails. | |||
This solution still suffers from the second problem: the race | This solution still suffers from the second problem: the race | |||
condition in the recover rule. If, after a successful build, a user | 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 | erases @file{data.c} and @file{data.h}, and runs @samp{make -j}, then | |||
skipping to change at line 13028 | skipping to change at line 13132 | |||
that it is a bug, we want to hear about problems you encounter. Often we | that it is a bug, we want to hear about problems you encounter. Often we | |||
agree they are bugs and want to fix them. | 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 | 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. | 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. | 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} | You can look at the @uref{https://debbugs.gnu.org/, GNU Bug Tracker} | |||
and the @uref{https://lists.gnu.org/@/archive/@/html/@/bug-automake/, | and the @uref{https://lists.gnu.org/@/archive/@/html/@/bug-automake/, | |||
bug-automake mailing list archives} for previous bug reports. We | bug-automake mailing list archives} for previous bug reports. We | |||
previously used a | previously used a Gnats database for bug tracking, but it is no longer | |||
@uref{http://sourceware.org/@/cgi-bin/@/gnatsweb.pl?database=automake, | online. | |||
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 | 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 | important to report bugs in a way that is useful and efficient. For | |||
this, please familiarize yourself with | this, please familiarize yourself with | |||
@uref{http://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to | @uref{https://www.chiark.greenend.org.uk/@/~sgtatham/@/bugs.html, How to | |||
Report Bugs Effectively} and | Report Bugs Effectively} and | |||
@uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask | @uref{http://catb.org/@/~esr/@/faqs/@/smart-questions.html, How to Ask | |||
Questions the Smart Way}. This helps you and developers to save time, | Questions the Smart Way}. This helps you and developers to save time, | |||
which can then be spent on fixing more bugs and implementing more | which can then be spent on fixing more bugs and implementing more | |||
features. | features. | |||
For a bug report, a feature request or other suggestions, please send | For a bug report, a feature request or other suggestions, please send | |||
email to @email{@value{PACKAGE_BUGREPORT}}. This will then open a new | email to @email{@value{PACKAGE_BUGREPORT}}. This will then open a new | |||
bug in the @uref{https://debbugs.gnu.org/@/automake, bug tracker}. Be | bug in the @uref{https://debbugs.gnu.org/@/automake, bug tracker}. Be | |||
sure to include the versions of Autoconf and Automake that you use. | sure to include the versions of Autoconf and Automake that you use. | |||
End of changes. 96 change blocks. | ||||
218 lines changed or deleted | 319 lines changed or added |