diff options
Diffstat (limited to 'doc/automake-history.texi')
-rw-r--r-- | doc/automake-history.texi | 1214 |
1 files changed, 1214 insertions, 0 deletions
diff --git a/doc/automake-history.texi b/doc/automake-history.texi new file mode 100644 index 000000000..75141f97a --- /dev/null +++ b/doc/automake-history.texi @@ -0,0 +1,1214 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename automake-history.info +@settitle automake-history +@setchapternewpage on +@c %**end of header + +@copying + +This manual describes (part of) the history of GNU Automake, a program +that creates GNU standards-compliant Makefiles from template files. + +Copyright @copyright{} 1995-2017 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, +Version 1.3 or any later version published by the Free Software +Foundation; with no Invariant Sections, with no Front-Cover texts, +and with no Back-Cover Texts. A copy of the license is included in the +section entitled ``GNU Free Documentation License.'' + +@end quotation +@end copying + +@titlepage +@title Brief History of Automake +@author David MacKenzie +@author Tom Tromey +@author Alexandre Duret-Lutz +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top +@comment node-name, next, previous, up +@top Brief History of Automake + +@insertcopying + +@menu +* Timeline:: The Automake story. +* Dependency Tracking Evolution:: Evolution of Automatic Dependency Tracking +* Releases:: Release statistics +* Copying This Manual:: How to make copies of this manual + +@detailmenu + --- The Detailed Node Listing --- + +Evolution of Automatic Dependency Tracking + +* First Take on Dependencies:: Precomputed dependency tracking +* Dependencies As Side Effects:: Update at developer compile time +* Dependencies for the User:: Update at user compile time +* Techniques for Dependencies:: Alternative approaches + +Techniques for Computing Dependencies + +* Recommendations for Tool Writers:: +* Future Directions for Dependencies:: + +Copying This Manual + +* GNU Free Documentation License:: License for copying this manual + +@end detailmenu +@end menu + +@end ifnottex + +@node Timeline +@chapter Timeline + +@table @asis +@item 1994-09-19 First CVS commit. + +If we can trust the CVS repository, David J.@tie{}MacKenzie (djm) started +working on Automake (or AutoMake, as it was spelt then) this Monday. + +The first version of the @command{automake} script looks as follows. + +@example +#!/bin/sh + +status=0 + +for makefile +do + if test ! -f $@{makefile@}.am; then + echo "automake: $@{makefile@}.am: No such honkin' file" + status=1 + continue + fi + + exec 4> $@{makefile@}.in + +done +@end example + +From this you can already see that Automake will be about reading +@file{*.am} file and producing @file{*.in} files. You cannot see +anything else, but if you also know that David is the one who created +Autoconf two years before you can guess the rest. + +Several commits follow, and by the end of the day Automake is +reported to work for GNU fileutils and GNU m4. + +The modus operandi is the one that is still used today: variable +assignments in @file{Makefile.am} files trigger injections of +precanned @file{Makefile} fragments into the generated +@file{Makefile.in}. The use of @file{Makefile} fragments was inspired +by the 4.4BSD @command{make} and include files, however Automake aims +to be portable and to conform to the GNU standards for @file{Makefile} +variables and targets. + +At this point, the most recent release of Autoconf is version 1.11, +and David is preparing to release Autoconf 2.0 in late October. As a +matter of fact, he will barely touch Automake after September. + +@item 1994-11-05 David MacKenzie's last commit. + +At this point Automake is a 200 line portable shell script, plus 332 +lines of @file{Makefile} fragments. In the @file{README}, David +states his ambivalence between ``portable shell'' and ``more +appropriate language'': + +@quotation +I wrote it keeping in mind the possibility of it becoming an Autoconf +macro, so it would run at configure-time. That would slow +configuration down a bit, but allow users to modify the Makefile.am +without needing to fetch the AutoMake package. And, the Makefile.in +files wouldn't need to be distributed. But all of AutoMake would. So +I might reimplement AutoMake in Perl, m4, or some other more +appropriate language. +@end quotation + +Automake is described as ``an experimental Makefile generator''. +There is no documentation. Adventurous users are referred to the +examples and patches needed to use Automake with GNU m4 1.3, fileutils +3.9, time 1.6, and development versions of find and indent. + +These examples seem to have been lost. However at the time of writing +(10 years later in September, 2004) the FSF still distributes a +package that uses this version of Automake: check out GNU termutils +2.0. + +@item 1995-11-12 Tom Tromey's first commit. + +After one year of inactivity, Tom Tromey takes over the package. +Tom was working on GNU cpio back then, and doing this just for fun, +having trouble finding a project to contribute to. So while hacking +he wanted to bring the @file{Makefile.in} up to GNU standards. This +was hard, and one day he saw Automake on @url{ftp://alpha.gnu.org/}, +grabbed it and tried it out. + +Tom didn't talk to djm about it until later, just to make sure he +didn't mind if he made a release. He did a bunch of early releases to +the Gnits folks. + +Gnits was (and still is) totally informal, just a few GNU friends who +Fran@,cois Pinard knew, who were all interested in making a common +infrastructure for GNU projects, and shared a similar outlook on how +to do it. So they were able to make some progress. It came along +with Autoconf and extensions thereof, and then Automake from David and +Tom (who were both gnitsians). One of their ideas was to write a +document paralleling the GNU standards, that was more strict in some +ways and more detailed. They never finished the GNITS standards, but +the ideas mostly made their way into Automake. + +@item 1995-11-23 Automake 0.20 + +Besides introducing automatic dependency tracking (@pxref{Dependency +Tracking Evolution}), this version also supplies a 9-page manual. + +At this time @command{aclocal} and @code{AM_INIT_AUTOMAKE} did not +exist, so many things had to be done by hand. For instance, here is +what a configure.in (this is the former name of the +@file{configure.ac} we use today) must contain in order to use +Automake 0.20: + +@example +PACKAGE=cpio +VERSION=2.3.911 +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") +AC_DEFINE_UNQUOTED(VERSION, "$VERSION") +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) +AC_ARG_PROGRAM +AC_PROG_INSTALL +@end example + +(Today all of the above is achieved by @code{AC_INIT} and +@code{AM_INIT_AUTOMAKE}.) + +Here is how programs are specified in @file{Makefile.am}: + +@example +PROGRAMS = hello +hello_SOURCES = hello.c +@end example + +This looks pretty much like what we do today, except the +@code{PROGRAMS} variable has no directory prefix specifying where +@file{hello} should be installed: all programs are installed in +@samp{$(bindir)}. @code{LIBPROGRAMS} can be used to specify programs +that must be built but not installed (it is called +@code{noinst_PROGRAMS} nowadays). + +Programs can be built conditionally using @code{AC_SUBST}itutions: + +@example +PROGRAMS = @@progs@@ +AM_PROGRAMS = foo bar baz +@end example + +(@code{AM_PROGRAMS} has since then been renamed to +@code{EXTRA_PROGRAMS}.) + +Similarly scripts, static libraries, and data can be built and installed +using the @code{LIBRARIES}, @code{SCRIPTS}, and @code{DATA} variables. +However @code{LIBRARIES} were treated a bit specially in that Automake +did automatically supply the @file{lib} and @file{.a} prefixes. +Therefore to build @file{libcpio.a}, one had to write + +@example +LIBRARIES = cpio +cpio_SOURCES = ... +@end example + +Extra files to distribute must be listed in @code{DIST_OTHER} (the +ancestor of @code{EXTRA_DIST}). Also extra directories that are to be +distributed should appear in @code{DIST_SUBDIRS}, but the manual +describes this as a temporary ugly hack (today extra directories should +also be listed in @code{EXTRA_DIST}, and @code{DIST_SUBDIRS} is used +for another purpose, @pxref{Conditional Subdirectories, , Conditional +Subdirectories, automake, GNU Automake}). + +@item 1995-11-26 Automake 0.21 + +In less time than it takes to cook a frozen pizza, Tom rewrites +Automake using Perl. At this time Perl 5 is only one year old, and +Perl 4.036 is in use at many sites. Supporting several Perl versions +has been a source of problems through the whole history of Automake. + +If you never used Perl 4, imagine Perl 5 without objects, without +@samp{my} variables (only dynamically scoped @samp{local} variables), +without function prototypes, with function calls that needs to be +prefixed with @samp{&}, etc. Traces of this old style can still be +found in today's @command{automake}. + +@item 1995-11-28 Automake 0.22 +@itemx 1995-11-29 Automake 0.23 + +Bug fixes. + +@item 1995-12-08 Automake 0.24 +@itemx 1995-12-10 Automake 0.25 + +Releases are raining. 0.24 introduces the uniform naming scheme we +use today, i.e., @code{bin_PROGRAMS} instead of @code{PROGRAMS}, +@code{noinst_LIBRARIES} instead of @code{LIBLIBRARIES}, etc. (However +@code{EXTRA_PROGRAMS} does not exist yet, @code{AM_PROGRAMS} is still +in use; and @code{TEXINFOS} and @code{MANS} still have no directory +prefixes.) Adding support for prefixes like that was one of the major +ideas in @command{automake}; it has lasted pretty well. + +AutoMake is renamed to Automake (Tom seems to recall it was Fran@,cois +Pinard's doing). + +0.25 fixes a Perl 4 portability bug. + +@item 1995-12-18 Jim Meyering starts using Automake in GNU Textutils. +@item 1995-12-31 Fran@,cois Pinard starts using Automake in GNU tar. + +@item 1996-01-03 Automake 0.26 +@itemx 1996-01-03 Automake 0.27 + +Of the many changes and suggestions sent by Fran@,cois Pinard and +included in 0.26, perhaps the most important is the advice that to +ease customization a user rule or variable definition should always +override an Automake rule or definition. + +Gordon Matzigkeit and Jim Meyering are two other early contributors +that have been sending fixes. + +0.27 fixes yet another Perl 4 portability bug. + +@item 1996-01-13 Automake 0.28 + +Automake starts scanning @file{configure.in} for @code{LIBOBJS} +support. This is an important step because until this version +Automake only knew about the @file{Makefile.am}s it processed. +@file{configure.in} was Autoconf's world and the link between Autoconf +and Automake had to be done by the @file{Makefile.am} author. For +instance, if @file{config.h} was generated by @file{configure}, it was the +package maintainer's responsibility to define the @code{CONFIG_HEADER} +variable in each @file{Makefile.am}. + +Succeeding releases will rely more and more on scanning +@file{configure.in} to better automate the Autoconf integration. + +0.28 also introduces the @code{AUTOMAKE_OPTIONS} variable and the +@option{--gnu} and @option{--gnits} options, the latter being stricter. + +@item 1996-02-07 Automake 0.29 + +Thanks to @file{configure.in} scanning, @code{CONFIG_HEADER} is gone, +and rebuild rules for @file{configure}-generated file are +automatically output. + +@code{TEXINFOS} and @code{MANS} converted to the uniform naming +scheme. + +@item 1996-02-24 Automake 0.30 + +The test suite is born. It contains 9 tests. From now on test cases +will be added pretty regularly (@pxref{Releases}), and this proved to +be really helpful later on. + +@code{EXTRA_PROGRAMS} finally replaces @code{AM_PROGRAMS}. + +All the third-party Autoconf macros, written mostly by Fran@,cois +Pinard (and later Jim Meyering), are distributed in Automake's +hand-written @file{aclocal.m4} file. Package maintainers are expected +to extract the necessary macros from this file. (In previous versions +you had to copy and paste them from the manual...) + +@item 1996-03-11 Automake 0.31 + +The test suite in 0.30 was run via a long @code{check-local} rule. Upon +Ulrich Drepper's suggestion, 0.31 makes it an Automake rule output +whenever the @code{TESTS} variable is defined. + +@code{DIST_OTHER} is renamed to @code{EXTRA_DIST}, and the @code{check_} +prefix is introduced. The syntax is now the same as today. + +@item 1996-03-15 Gordon Matzigkeit starts writing libtool. + +@item 1996-04-27 Automake 0.32 + +@code{-hook} targets are introduced; an idea from Dieter Baron. + +@file{*.info} files, which were output in the build directory are +now built in the source directory, because they are distributed. It +seems these files like to move back and forth as that will happen +again in future versions. + +@item 1996-05-18 Automake 0.33 + +Gord Matzigkeit's main two contributions: + +@itemize +@item very preliminary libtool support +@item the distcheck rule +@end itemize + +Although they were very basic at this point, these are probably +among the top features for Automake today. + +Jim Meyering also provides the infamous @code{jm_MAINTAINER_MODE}, since +then renamed to @code{AM_MAINTAINER_MODE} and abandoned by its author +(@pxref{maintainer-mode, , maintainer-mode, automake, GNU Automake}). + +@item 1996-05-28 Automake 1.0 + +After only six months of heavy development, the @command{automake} script is +3134 lines long, plus 973 lines of @file{Makefile} fragments. The +package has 30 pages of documentation, and 38 test cases. +@file{aclocal.m4} contains 4 macros. + +From now on and until version 1.4, new releases will occur at a rate +of about one a year. 1.1 did not exist, actually 1.1b to 1.1p have +been the name of beta releases for 1.2. This is the first time +Automake uses suffix letters to designate beta releases, a habit that +lasts. + +@item 1996-10-10 Kevin Dalley packages Automake 1.0 for Debian GNU/Linux. + +@item 1996-11-26 David J.@tie{}MacKenzie releases Autoconf 2.12. + +Between June and October, the Autoconf development is almost stalled. +Roland McGrath has been working at the beginning of the year. David +comes back in November to release 2.12, but he won't touch Autoconf +anymore after this year, and Autoconf then really stagnates. The +desolate Autoconf @file{ChangeLog} for 1997 lists only 7 commits. + +@item 1997-02-28 @email{automake@@gnu.ai.mit.edu} list alive + +The mailing list is announced as follows: +@smallexample +I've created the "automake" mailing list. It is +"automake@@gnu.ai.mit.edu". Administrivia, as always, to +automake-request@@gnu.ai.mit.edu. + +The charter of this list is discussion of automake, autoconf, and +other configuration/portability tools (e.g., libtool). It is expected +that discussion will range from pleas for help all the way up to +patches. + +This list is archived on the FSF machines. Offhand I don't know if +you can get the archive without an account there. + +This list is open to anybody who wants to join. Tell all your +friends! +-- Tom Tromey +@end smallexample + +Before that people were discussing Automake privately, on the Gnits +mailing list (which is not public either), and less frequently on +@code{gnu.misc.discuss}. + +@code{gnu.ai.mit.edu} is now @code{gnu.org}, in case you never +noticed. The archives of the early years of the +@code{automake@@gnu.org} list have been lost, so today it is almost +impossible to find traces of discussions that occurred before 1999. +This has been annoying more than once, as such discussions can be +useful to understand the rationale behind a piece of uncommented code +that was introduced back then. + +@item 1997-06-22 Automake 1.2 + +Automake developments continues, and more and more new Autoconf macros +are required. Distributing them in @file{aclocal.m4} and requiring +people to browse this file to extract the relevant macros becomes +uncomfortable. Ideally, some of them should be contributed to +Autoconf so that they can be used directly, however Autoconf is +currently inactive. Automake 1.2 consequently introduces +@command{aclocal} (@command{aclocal} was actually started on +1996-07-28), a tool that automatically constructs an @file{aclocal.m4} +file from a repository of third-party macros. Because Autoconf has +stalled, Automake also becomes a kind of repository for such +third-party macros, even macros completely unrelated to Automake (for +instance macros that fix broken Autoconf macros). + +The 1.2 release contains 20 macros, including the +@code{AM_INIT_AUTOMAKE} macro that simplifies the creation of +@file{configure.in}. + +Libtool is fully supported using @code{*_LTLIBRARIES}. + +The missing script is introduced by Fran@,cois Pinard; it is meant +to be a better solution than @code{AM_MAINTAINER_MODE} +(@pxref{maintainer-mode, , maintainer-mode, automake, GNU Automake}). + +Conditionals support was implemented by Ian Lance Taylor. At the +time, Tom and Ian were working on an internal project at Cygnus. They +were using ILU, which is pretty similar to CORBA@. They wanted to +integrate ILU into their build, which was all @file{configure}-based, +and Ian thought that adding conditionals to @command{automake} was +simpler than doing all the work in @file{configure} (which was the +standard at the time). So this was actually funded by Cygnus. + +This very useful but tricky feature will take a lot of time to +stabilize. (At the time this text is written, there are still +primaries that have not been updated to support conditional +definitions in Automake 1.9.) + +The @command{automake} script has almost doubled: 6089 lines of Perl, +plus 1294 lines of @file{Makefile} fragments. + +@item 1997-07-08 Gordon Matzigkeit releases Libtool 1.0. + +@item 1998-04-05 Automake 1.3 + +This is a small advance compared to 1.2. +It adds support for assembly, and preliminary support for Java. + +Perl 5.004_04 is out, but fixes to support Perl 4 are still +regularly submitted whenever Automake breaks it. + +@item 1998-09-06 @code{sourceware.cygnus.com} is on-line. + +Sourceware was setup by Jason Molenda to host open source projects. + +@item 1998-09-19 Automake CVS repository moved to @code{sourceware.cygnus.com} +@itemx 1998-10-26 @code{sourceware.cygnus.com} announces it hosts Automake: +Automake is now hosted on @code{sourceware.cygnus.com}. It has a +publicly accessible CVS repository. This CVS repository is a copy of +the one Tom was using on his machine, which in turn is based on +a copy of the CVS repository of David MacKenzie. This is why we still +have to full source history. (Automake was on Sourceware until 2007-10-29, +when it moved to a git repository on @code{savannah.gnu.org}, +but the Sourceware host had been renamed to @code{sources.redhat.com}.) + +The oldest file in the administrative directory of the CVS repository +that was created on Sourceware is dated 1998-09-19, while the +announcement that @command{automake} and @command{autoconf} had joined +@command{sourceware} was made on 1998-10-26. They were among the +first projects to be hosted there. + +The heedful reader will have noticed Automake was exactly 4 years old +on 1998-09-19. + +@item 1999-01-05 Ben Elliston releases Autoconf 2.13. + +@item 1999-01-14 Automake 1.4 + +This release adds support for Fortran 77 and for the @code{include} +statement. Also, @samp{+=} assignments are introduced, but it is +still quite easy to fool Automake when mixing this with conditionals. + +These two releases, Automake 1.4 and Autoconf 2.13 make a duo that +will be used together for years. + +@command{automake} is 7228 lines, plus 1591 lines of Makefile +fragment, 20 macros (some 1.3 macros were finally contributed back to +Autoconf), 197 test cases, and 51 pages of documentation. + +@item 1999-03-27 The @code{user-dep-branch} is created on the CVS repository. + +This implements a new dependency tracking schemed that should be +able to handle automatic dependency tracking using any compiler (not +just gcc) and any make (not just GNU @command{make}). In addition, +the new scheme should be more reliable than the old one, as +dependencies are generated on the end user's machine. Alexandre Oliva +creates depcomp for this purpose. + +@xref{Dependency Tracking Evolution}, for more details about the +evolution of automatic dependency tracking in Automake. + +@item 1999-11-21 The @code{user-dep-branch} is merged into the main trunk. + +This was a huge problem since we also had patches going in on the +trunk. The merge took a long time and was very painful. + +@item 2000-05-10 + +Since September 1999 and until 2003, Akim Demaille will be zealously +revamping Autoconf. + +@quotation +I think the next release should be called "3.0".@* +Let's face it: you've basically rewritten autoconf.@* +Every weekend there are 30 new patches.@* +I don't see how we could call this "2.15" with a straight face.@* +-- Tom Tromey on @email{autoconf@@gnu.org} +@end quotation + +Actually Akim works like a submarine: he will pile up patches while he +works off-line during the weekend, and flush them in batch when he +resurfaces on Monday. + +@item 2001-01-24 + +On this Wednesday, Autoconf 2.49c, the last beta before Autoconf 2.50 +is out, and Akim has to find something to do during his week-end :) + +@item 2001-01-28 + +Akim sends a batch of 14 patches to @email{automake@@gnu.org}. + +@quotation +Aiieeee! I was dreading the day that the Demaillator turned his +sights on automake@dots{} and now it has arrived! -- Tom Tromey +@end quotation + +It's only the beginning: in two months he will send 192 patches. Then +he would slow down so Tom can catch up and review all this. Initially +Tom actually read all of these patches, then he probably trustingly +answered OK to most of them, and finally gave up and let Akim apply +whatever he wanted. There was no way to keep up with that patch rate. + +@quotation +Anyway the patch below won't apply since it predates Akim's +sourcequake; I have yet to figure where the relevant passage has +been moved :) -- Alexandre Duret-Lutz +@end quotation + +All of these patches were sent to and discussed on +@email{automake@@gnu.org}, so subscribed users were literally drowning in +technical mails. Eventually, the @email{automake-patches@@gnu.org} +mailing list was created in May. + +Year after year, Automake had drifted away from its initial design: +construct @file{Makefile.in} by assembling various @file{Makefile} +fragments. In 1.4, lots of @file{Makefile} rules are being emitted at +various places in the @command{automake} script itself; this does not +help ensuring a consistent treatment of these rules (for instance +making sure that user-defined rules override Automake's own rules). +One of Akim's goal was moving all of these hard-coded rules to separate +@file{Makefile} fragments, so the logic could be centralized in a +@file{Makefile} fragment processor. + +Another significant contribution of Akim is the interface with the +``trace'' feature of Autoconf. The way to scan @file{configure.in} at +this time was to read the file and grep the various macro of interest +to Automake. Doing so could break in many unexpected ways; @command{automake} +could miss some definition (for instance @samp{AC_SUBST([$1], [$2])} +where the arguments are known only when M4 is run), or conversely it +could detect some macro that was not expanded (because it is called +conditionally). In the CVS version of Autoconf, Akim had implemented +the @option{--trace} option, which provides accurate information about +where macros are actually called and with what arguments. Akim will +equip Automake with a second @file{configure.in} scanner that uses +this @option{--trace} interface. Since it was not sensible to drop the +Autoconf 2.13 compatibility yet, this experimental scanner was only +used when an environment variable was set, the traditional +grep-scanner being still the default. + +@item 2001-04-25 Gary V.@tie{}Vaughan releases Libtool 1.4 + +It has been more than two years since Automake 1.4, CVS Automake has +suffered lot's of heavy changes and still is not ready for release. +Libtool 1.4 had to be distributed with a patch against Automake 1.4. + +@item 2001-05-08 Automake 1.4-p1 +@itemx 2001-05-24 Automake 1.4-p2 + +Gary V.@tie{}Vaughan, the principal Libtool maintainer, makes a ``patch +release'' of Automake: + +@quotation +The main purpose of this release is to have a stable automake +which is compatible with the latest stable libtool. +@end quotation + +The release also contains obvious fixes for bugs in Automake 1.4, +some of which were reported almost monthly. + +@item 2001-05-21 Akim Demaille releases Autoconf 2.50 + +@item 2001-06-07 Automake 1.4-p3 +@itemx 2001-06-10 Automake 1.4-p4 +@itemx 2001-07-15 Automake 1.4-p5 + +Gary continues his patch-release series. These also add support for +some new Autoconf 2.50 idioms. Essentially, Autoconf now advocates +@file{configure.ac} over @file{configure.in}, and it introduces a new +syntax for @code{AC_OUTPUT}ing files. + +@item 2001-08-23 Automake 1.5 + +A major and long-awaited release, that comes more than two years after +1.4. It brings many changes, among which: +@itemize +@item The new dependency tracking scheme that uses @command{depcomp}. +Aside from the improvement on the dependency tracking itself +(@pxref{Dependency Tracking Evolution}), this also streamlines the use +of @command{automake}-generated @file{Makefile.in}s as the @file{Makefile.in}s +used during development are now the same as those used in +distributions. Before that the @file{Makefile.in}s generated for +maintainers required GNU @command{make} and GCC, they were different +from the portable @file{Makefile} generated for distribution; this was +causing some confusion. + +@item Support for per-target compilation flags. + +@item Support for reference to files in subdirectories in most +@file{Makefile.am} variables. + +@item Introduction of the @code{dist_}, @code{nodist_}, and @code{nobase_} +prefixes. +@item Perl 4 support is finally dropped. +@end itemize + +1.5 did break several packages that worked with 1.4. Enough so that +Linux distributions could not easily install the new Automake version +without breaking many of the packages for which they had to run +@command{automake}. + +Some of these breakages were effectively bugs that would eventually be +fixed in the next release. However, a lot of damage was caused by +some changes made deliberately to render Automake stricter on some +setup we did consider bogus. For instance, @samp{make distcheck} was +improved to check that @samp{make uninstall} did remove all the files +@samp{make install} installed, that @samp{make distclean} did not omit +some file, and that a VPATH build would work even if the source +directory was read-only. Similarly, Automake now rejects multiple +definitions of the same variable (because that would mix very badly +with conditionals), and @samp{+=} assignments with no previous +definition. Because these changes all occurred suddenly after 1.4 had +been established for more than two years, it hurt users. + +To make matter worse, meanwhile Autoconf (now at version 2.52) was +facing similar troubles, for similar reasons. + +@item 2002-03-05 Automake 1.6 + +This release introduced versioned installation (@pxref{API Versioning, , +API Versioning, automake, GNU Automake}). This was mainly pushed by +Havoc Pennington, taking the GNOME source tree as motive: due to +incompatibilities between the autotools it's impossible for the GNOME +packages to switch to Autoconf 2.53 and Automake 1.5 all at once, so +they are currently stuck with Autoconf 2.13 and Automake 1.4. + +The idea was to call this version @file{automake-1.6}, call all its +bug-fix versions identically, and switch to @file{automake-1.7} for +the next release that adds new features or changes some rules. This +scheme implies maintaining a bug-fix branch in addition to the +development trunk, which means more work from the maintainer, but +providing regular bug-fix releases proved to be really worthwhile. + +Like 1.5, 1.6 also introduced a bunch of incompatibilities, intentional or +not. Perhaps the more annoying was the dependence on the newly +released Autoconf 2.53. Autoconf seemed to have stabilized enough +since its explosive 2.50 release and included changes required to fix +some bugs in Automake. In order to upgrade to Automake 1.6, people +now had to upgrade Autoconf too; for some packages it was no picnic. + +While versioned installation helped people to upgrade, it also +unfortunately allowed people not to upgrade. At the time of writing, +some Linux distributions are shipping packages for Automake 1.4, 1.5, +1.6, 1.7, 1.8, and 1.9. Most of these still install 1.4 by default. +Some distribution also call 1.4 the ``stable'' version, and present +``1.9'' as the development version; this does not really makes sense +since 1.9 is way more solid than 1.4. All this does not help the +newcomer. + +@item 2002-04-11 Automake 1.6.1 + +1.6, and the upcoming 1.4-p6 release were the last release by Tom. +This one and those following will be handled by Alexandre +Duret-Lutz. Tom is still around, and will be there until about 1.7, +but his interest into Automake is drifting away towards projects like +@command{gcj}. + +Alexandre has been using Automake since 2000, and started to +contribute mostly on Akim's incitement (Akim and Alexandre have been +working in the same room from 1999 to 2002). In 2001 and 2002 he had +a lot of free time to enjoy hacking Automake. + +@item 2002-06-14 Automake 1.6.2 + +@item 2002-07-28 Automake 1.6.3 +@itemx 2002-07-28 Automake 1.4-p6 + +Two releases on the same day. 1.6.3 is a bug-fix release. + +Tom Tromey backported the versioned installation mechanism on the 1.4 +branch, so that Automake 1.6.x and Automake 1.4-p6 could be installed +side by side. Another request from the GNOME folks. + +@item 2002-09-25 Automake 1.7 + +This release switches to the new @file{configure.ac} scanner Akim +was experimenting in 1.5. + +@item 2002-10-16 Automake 1.7.1 +@itemx 2002-12-06 Automake 1.7.2 +@itemx 2003-02-20 Automake 1.7.3 +@itemx 2003-04-23 Automake 1.7.4 +@itemx 2003-05-18 Automake 1.7.5 +@itemx 2003-07-10 Automake 1.7.6 +@itemx 2003-09-07 Automake 1.7.7 +@itemx 2003-10-07 Automake 1.7.8 + +Many bug-fix releases. 1.7 lasted because the development version +(upcoming 1.8) was suffering some major internal revamping. + +@item 2003-10-26 Automake on screen + +Episode 49, `Repercussions', in the third season of the `Alias' TV +show is first aired. + +Marshall, one of the characters, is working on a computer virus that he +has to modify before it gets into the wrong hands or something like +that. The screenshots you see do not show any program code, they show +a @file{Makefile.in} generated by automake... + +@item 2003-11-09 Automake 1.7.9 + +@item 2003-12-10 Automake 1.8 + +The most striking update is probably that of @command{aclocal}. + +@command{aclocal} now uses @code{m4_include} in the produced +@file{aclocal.m4} when the included macros are already distributed +with the package (an idiom used in many packages), which reduces code +duplication. Many people liked that, but in fact this change was +really introduced to fix a bug in rebuild rules: @file{Makefile.in} +must be rebuilt whenever a dependency of @file{configure} changes, but +all the @file{m4} files included in @file{aclocal.m4} where unknown +from @command{automake}. Now @command{automake} can just trace the +@code{m4_include}s to discover the dependencies. + +@command{aclocal} also starts using the @option{--trace} Autoconf option +in order to discover used macros more accurately. This will turn out +to be very tricky (later releases will improve this) as people had +devised many ways to cope with the limitation of previous +@command{aclocal} versions, notably using handwritten +@code{m4_include}s: @command{aclocal} must make sure not to redefine a +rule that is already included by such statement. + +Automake also has seen its guts rewritten. Although this rewriting +took a lot of efforts, it is only apparent to the users in that some +constructions previously disallowed by the implementation now work +nicely. Conditionals, Locations, Variable and Rule definitions, +Options: these items on which Automake works have been rewritten as +separate Perl modules, and documented. + +@item 2004-01-11 Automake 1.8.1 +@itemx 2004-01-12 Automake 1.8.2 +@itemx 2004-03-07 Automake 1.8.3 +@itemx 2004-04-25 Automake 1.8.4 +@itemx 2004-05-16 Automake 1.8.5 + +@item 2004-07-28 Automake 1.9 + +This release tries to simplify the compilation rules it outputs to +reduce the size of the Makefile. The complaint initially come from +the libgcj developers. Their @file{Makefile.in} generated with +Automake 1.4 and custom build rules (1.4 did not support compiled +Java) is 250KB@. The one generated by 1.8 was over 9MB@! 1.9 gets it +down to 1.2MB@. + +Aside from this it contains mainly minor changes and bug-fixes. + +@item 2004-08-11 Automake 1.9.1 +@itemx 2004-09-19 Automake 1.9.2 + +Automake has ten years. This chapter of the manual was initially +written for this occasion. + +@item 2007-10-29 Automake repository moves to @code{savannah.gnu.org} +and uses git as primary repository. + +@end table + +@node Dependency Tracking Evolution +@chapter Evolution of Automatic Dependency Tracking + +Over the years Automake has deployed three different dependency +tracking methods. Each method, including the current one, has had +flaws of various sorts. Here we lay out the different dependency +tracking methods, their flaws, and their fixes. We conclude with +recommendations for tool writers, and by indicating future directions +for dependency tracking work in Automake. + +@menu +* First Take on Dependencies:: Precomputed dependency tracking +* Dependencies As Side Effects:: Update at developer compile time +* Dependencies for the User:: Update at user compile time +* Techniques for Dependencies:: Alternative approaches +@end menu + +@node First Take on Dependencies +@section First Take on Dependency Tracking +@unnumberedsubsec Description + +Our first attempt at automatic dependency tracking was based on the +method recommended by GNU @command{make}. (@pxref{Automatic +Prerequisites, , Generating Prerequisites Automatically, make, The GNU +make Manual}) + +This version worked by precomputing dependencies ahead of time. For +each source file, it had a special @file{.P} file that held the +dependencies. There was a rule to generate a @file{.P} file by +invoking the compiler appropriately. All such @file{.P} files were +included by the @file{Makefile}, thus implicitly becoming dependencies +of @file{Makefile}. + +@unnumberedsubsec Bugs + +This approach had several critical bugs. + +@itemize +@item +The code to generate the @file{.P} file relied on @command{gcc}. +(A limitation, not technically a bug.) +@item +The dependency tracking mechanism itself relied on GNU @command{make}. +(A limitation, not technically a bug.) +@item +Because each @file{.P} file was a dependency of @file{Makefile}, this +meant that dependency tracking was done eagerly by @command{make}. +For instance, @samp{make clean} would cause all the dependency files +to be updated, and then immediately removed. This eagerness also +caused problems with some configurations; if a certain source file +could not be compiled on a given architecture for some reason, +dependency tracking would fail, aborting the entire build. +@item +As dependency tracking was done as a pre-pass, compile times were +doubled--the compiler had to be run twice per source file. +@item +@samp{make dist} re-ran @command{automake} to generate a +@file{Makefile} that did not have automatic dependency tracking (and +that was thus portable to any version of @command{make}). In order to +do this portably, Automake had to scan the dependency files and remove +any reference that was to a source file not in the distribution. +This process was error-prone. Also, if @samp{make dist} was run in an +environment where some object file had a dependency on a source file +that was only conditionally created, Automake would generate a +@file{Makefile} that referred to a file that might not appear in the +end user's build. A special, hacky mechanism was required to work +around this. +@end itemize + +@unnumberedsubsec Historical Note + +The code generated by Automake is often inspired by the +@file{Makefile} style of a particular author. In the case of the first +implementation of dependency tracking, I believe the impetus and +inspiration was Jim Meyering. (I could be mistaken. If you know +otherwise feel free to correct me.) + +@node Dependencies As Side Effects +@section Dependencies As Side Effects +@unnumberedsubsec Description + +The next refinement of Automake's automatic dependency tracking scheme +was to implement dependencies as side effects of the compilation. +This was aimed at solving the most commonly reported problems with the +first approach. In particular we were most concerned with eliminating +the weird rebuilding effect associated with make clean. + +In this approach, the @file{.P} files were included using the +@code{-include} command, which let us create these files lazily. This +avoided the @samp{make clean} problem. + +We only computed dependencies when a file was actually compiled. This +avoided the performance penalty associated with scanning each file +twice. It also let us avoid the other problems associated with the +first, eager, implementation. For instance, dependencies would never +be generated for a source file that was not compilable on a given +architecture (because it in fact would never be compiled). + +@unnumberedsubsec Bugs + +@itemize +@item +This approach also relied on the existence of @command{gcc} and GNU +@command{make}. (A limitation, not technically a bug.) +@item +Dependency tracking was still done by the developer, so the problems +from the first implementation relating to massaging of dependencies by +@samp{make dist} were still in effect. +@item +This implementation suffered from the ``deleted header file'' problem. +Suppose a lazily-created @file{.P} file includes a dependency on a +given header file, like this: + +@example +maude.o: maude.c something.h +@end example + +Now suppose that you remove @file{something.h} and update @file{maude.c} +so that this include is no longer needed. If you run @command{make}, +you will get an error because there is no way to create +@file{something.h}. + +We fixed this problem in a later release by further massaging the +output of @command{gcc} to include a dummy dependency for each header +file. +@end itemize + +@node Dependencies for the User +@section Dependencies for the User +@unnumberedsubsec Description + +The bugs associated with @samp{make dist}, over time, became a real +problem. Packages using Automake were being built on a large number +of platforms, and were becoming increasingly complex. Broken +dependencies were distributed in ``portable'' @file{Makefile.in}s, +leading to user complaints. Also, the requirement for @command{gcc} +and GNU @command{make} was a constant source of bug reports. The next +implementation of dependency tracking aimed to remove these problems. + +We realized that the only truly reliable way to automatically track +dependencies was to do it when the package itself was built. This +meant discovering a method portable to any version of make and any +compiler. Also, we wanted to preserve what we saw as the best point +of the second implementation: dependency computation as a side effect +of compilation. + +In the end we found that most modern make implementations support some +form of include directive. Also, we wrote a wrapper script that let +us abstract away differences between dependency tracking methods for +compilers. For instance, some compilers cannot generate dependencies +as a side effect of compilation. In this case we simply have the +script run the compiler twice. Currently our wrapper script +(@command{depcomp}) knows about twelve different compilers (including +a "compiler" that simply invokes @command{makedepend} and then the +real compiler, which is assumed to be a standard Unix-like C compiler +with no way to do dependency tracking). + +@unnumberedsubsec Bugs + +@itemize +@item +Running a wrapper script for each compilation slows down the build. +@item +Many users don't really care about precise dependencies. +@item +This implementation, like every other automatic dependency tracking +scheme in common use today (indeed, every one we've ever heard of), +suffers from the ``duplicated new header'' bug. + +This bug occurs because dependency tracking tools, such as the +compiler, only generate dependencies on the successful opening of a +file, and not on every probe. + +Suppose for instance that the compiler searches three directories for +a given header, and that the header is found in the third directory. +If the programmer erroneously adds a header file with the same name to +the first directory, then a clean rebuild from scratch could fail +(suppose the new header file is buggy), whereas an incremental rebuild +will succeed. + +What has happened here is that people have a misunderstanding of what +a dependency is. Tool writers think a dependency encodes information +about which files were read by the compiler. However, a dependency +must actually encode information about what the compiler tried to do. + +This problem is not serious in practice. Programmers typically do not +use the same name for a header file twice in a given project. (At +least, not in C or C++. This problem may be more troublesome in +Java.) This problem is easy to fix, by modifying dependency +generators to record every probe, instead of every successful open. + +@item +Since Automake generates dependencies as a side effect of compilation, +there is a bootstrapping problem when header files are generated by +running a program. The problem is that, the first time the build is +done, there is no way by default to know that the headers are +required, so make might try to run a compilation for which the headers +have not yet been built. + +This was also a problem in the previous dependency tracking implementation. + +The current fix is to use @code{BUILT_SOURCES} to list built headers +(@pxref{Sources, , Sources, automake, GNU Automake}). This causes them +to be built before any other build rules are run. This is unsatisfactory +as a general solution, however in practice it seems sufficient for most +actual programs. +@end itemize + +This code is used since Automake 1.5. + +In GCC 3.0, we managed to convince the maintainers to add special +command-line options to help Automake more efficiently do its job. We +hoped this would let us avoid the use of a wrapper script when +Automake's automatic dependency tracking was used with @command{gcc}. + +Unfortunately, this code doesn't quite do what we want. In +particular, it removes the dependency file if the compilation fails; +we'd prefer that it instead only touch the file in any way if the +compilation succeeds. + +Nevertheless, since Automake 1.7, when a recent @command{gcc} is +detected at @command{configure} time, we inline the +dependency-generation code and do not use the @command{depcomp} +wrapper script. This makes compilations faster for those using this +compiler (probably our primary user base). The counterpart is that +because we have to encode two compilation rules in @file{Makefile} +(with or without @command{depcomp}), the produced @file{Makefile}s are +larger. + +@node Techniques for Dependencies +@section Techniques for Computing Dependencies + +There are actually several ways for a build tool like Automake to +cause tools to generate dependencies. + +@table @asis +@item @command{makedepend} +This was a commonly-used method in the past. The idea is to run a +special program over the source and have it generate dependency +information. Traditional implementations of @command{makedepend} are +not completely precise; ordinarily they were conservative and +discovered too many dependencies. +@item The tool +An obvious way to generate dependencies is to simply write the tool so +that it can generate the information needed by the build tool. This is +also the most portable method. Many compilers have an option to +generate dependencies. Unfortunately, not all tools provide such an +option. +@item The file system +It is possible to write a special file system that tracks opens, +reads, writes, etc, and then feed this information back to the build +tool. @command{clearmake} does this. This is a very powerful +technique, as it doesn't require cooperation from the +tool. Unfortunately it is also very difficult to implement and also +not practical in the general case. +@item @code{LD_PRELOAD} +Rather than use the file system, one could write a special library to +intercept @code{open} and other syscalls. This technique is also quite +powerful, but unfortunately it is not portable enough for use in +@command{automake}. +@end table + +@menu +* Recommendations for Tool Writers:: +* Future Directions for Dependencies:: +@end menu + +@node Recommendations for Tool Writers +@subsection Recommendations for Tool Writers + +We think that every compilation tool ought to be able to generate +dependencies as a side effect of compilation. Furthermore, at least +while @command{make}-based tools are nearly universally in use (at +least in the free software community), the tool itself should generate +dummy dependencies for header files, to avoid the deleted header file +bug. Finally, the tool should generate a dependency for each probe, +instead of each successful file open, in order to avoid the duplicated +new header bug. + +@node Future Directions for Dependencies +@subsection Future Directions for Dependencies + +Currently, only languages and compilers understood by Automake can +have dependency tracking enabled. We would like to see if it is +practical (and worthwhile) to let this support be extended by the user +to languages unknown to Automake. + +@node Releases +@chapter Release Statistics + +The following table (inspired by @samp{perlhist(1)}) quantifies the +evolution of Automake using these metrics: + +@table @asis +@item Date, Rel +The date and version of the release. +@item am +The number of lines of the @command{automake} script. +@item acl +The number of lines of the @command{aclocal} script. +@item pm +The number of lines of the @command{Perl} supporting modules. +@item @file{*.am} +The number of lines of the @file{Makefile} fragments. The number in +parentheses is the number of files. +@item m4 +The number of lines (and files) of Autoconf macros. +@item doc +The number of pages of the documentation (the Postscript version). +@item t +The number of test cases in the test suite. Of those, the number in +parentheses is the number of generated test cases. +@end table + +@multitable {8888-88-88} {8.8-p8} {8888} {8888} {8888} {8888 (88)} {8888 (88)} {888} {888 (88)} +@headitem Date @tab Rel @tab am @tab acl @tab pm @tab @file{*.am} @tab m4 @tab doc @tab t +@item 1994-09-19 @tab CVS @tab 141 @tab @tab @tab 299 (24) @tab @tab @tab +@item 1994-11-05 @tab CVS @tab 208 @tab @tab @tab 332 (28) @tab @tab @tab +@item 1995-11-23 @tab 0.20 @tab 533 @tab @tab @tab 458 (35) @tab @tab 9 @tab +@item 1995-11-26 @tab 0.21 @tab 613 @tab @tab @tab 480 (36) @tab @tab 11 @tab +@item 1995-11-28 @tab 0.22 @tab 1116 @tab @tab @tab 539 (38) @tab @tab 12 @tab +@item 1995-11-29 @tab 0.23 @tab 1240 @tab @tab @tab 541 (38) @tab @tab 12 @tab +@item 1995-12-08 @tab 0.24 @tab 1462 @tab @tab @tab 504 (33) @tab @tab 14 @tab +@item 1995-12-10 @tab 0.25 @tab 1513 @tab @tab @tab 511 (37) @tab @tab 15 @tab +@item 1996-01-03 @tab 0.26 @tab 1706 @tab @tab @tab 438 (36) @tab @tab 16 @tab +@item 1996-01-03 @tab 0.27 @tab 1706 @tab @tab @tab 438 (36) @tab @tab 16 @tab +@item 1996-01-13 @tab 0.28 @tab 1964 @tab @tab @tab 934 (33) @tab @tab 16 @tab +@item 1996-02-07 @tab 0.29 @tab 2299 @tab @tab @tab 936 (33) @tab @tab 17 @tab +@item 1996-02-24 @tab 0.30 @tab 2544 @tab @tab @tab 919 (32) @tab 85 (1) @tab 20 @tab 9 +@item 1996-03-11 @tab 0.31 @tab 2877 @tab @tab @tab 919 (32) @tab 85 (1) @tab 29 @tab 17 +@item 1996-04-27 @tab 0.32 @tab 3058 @tab @tab @tab 921 (31) @tab 85 (1) @tab 30 @tab 26 +@item 1996-05-18 @tab 0.33 @tab 3110 @tab @tab @tab 926 (31) @tab 105 (1) @tab 30 @tab 35 +@item 1996-05-28 @tab 1.0 @tab 3134 @tab @tab @tab 973 (32) @tab 105 (1) @tab 30 @tab 38 +@item 1997-06-22 @tab 1.2 @tab 6089 @tab 385 @tab @tab 1294 (36) @tab 592 (20) @tab 37 @tab 126 +@item 1998-04-05 @tab 1.3 @tab 6415 @tab 422 @tab @tab 1470 (39) @tab 741 (23) @tab 39 @tab 156 +@item 1999-01-14 @tab 1.4 @tab 7240 @tab 426 @tab @tab 1591 (40) @tab 734 (20) @tab 51 @tab 197 +@item 2001-05-08 @tab 1.4-p1 @tab 7251 @tab 426 @tab @tab 1591 (40) @tab 734 (20) @tab 51 @tab 197 +@item 2001-05-24 @tab 1.4-p2 @tab 7268 @tab 439 @tab @tab 1591 (40) @tab 734 (20) @tab 49 @tab 197 +@item 2001-06-07 @tab 1.4-p3 @tab 7312 @tab 439 @tab @tab 1591 (40) @tab 734 (20) @tab 49 @tab 197 +@item 2001-06-10 @tab 1.4-p4 @tab 7321 @tab 439 @tab @tab 1591 (40) @tab 734 (20) @tab 49 @tab 198 +@item 2001-07-15 @tab 1.4-p5 @tab 7228 @tab 426 @tab @tab 1596 (40) @tab 734 (20) @tab 51 @tab 198 +@item 2001-08-23 @tab 1.5 @tab 8016 @tab 475 @tab 600 @tab 2654 (39) @tab 1166 (29) @tab 63 @tab 327 +@item 2002-03-05 @tab 1.6 @tab 8465 @tab 475 @tab 1136 @tab 2732 (39) @tab 1603 (27) @tab 66 @tab 365 +@item 2002-04-11 @tab 1.6.1 @tab 8544 @tab 475 @tab 1136 @tab 2741 (39) @tab 1603 (27) @tab 66 @tab 372 +@item 2002-06-14 @tab 1.6.2 @tab 8575 @tab 475 @tab 1136 @tab 2800 (39) @tab 1609 (27) @tab 67 @tab 386 +@item 2002-07-28 @tab 1.6.3 @tab 8600 @tab 475 @tab 1153 @tab 2809 (39) @tab 1609 (27) @tab 67 @tab 391 +@item 2002-07-28 @tab 1.4-p6 @tab 7332 @tab 455 @tab @tab 1596 (40) @tab 735 (20) @tab 49 @tab 197 +@item 2002-09-25 @tab 1.7 @tab 9189 @tab 471 @tab 1790 @tab 2965 (39) @tab 1606 (28) @tab 73 @tab 430 +@item 2002-10-16 @tab 1.7.1 @tab 9229 @tab 475 @tab 1790 @tab 2977 (39) @tab 1606 (28) @tab 73 @tab 437 +@item 2002-12-06 @tab 1.7.2 @tab 9334 @tab 475 @tab 1790 @tab 2988 (39) @tab 1606 (28) @tab 77 @tab 445 +@item 2003-02-20 @tab 1.7.3 @tab 9389 @tab 475 @tab 1790 @tab 3023 (39) @tab 1651 (29) @tab 84 @tab 448 +@item 2003-04-23 @tab 1.7.4 @tab 9429 @tab 475 @tab 1790 @tab 3031 (39) @tab 1644 (29) @tab 85 @tab 458 +@item 2003-05-18 @tab 1.7.5 @tab 9429 @tab 475 @tab 1790 @tab 3033 (39) @tab 1645 (29) @tab 85 @tab 459 +@item 2003-07-10 @tab 1.7.6 @tab 9442 @tab 475 @tab 1790 @tab 3033 (39) @tab 1660 (29) @tab 85 @tab 461 +@item 2003-09-07 @tab 1.7.7 @tab 9443 @tab 475 @tab 1790 @tab 3041 (39) @tab 1660 (29) @tab 90 @tab 467 +@item 2003-10-07 @tab 1.7.8 @tab 9444 @tab 475 @tab 1790 @tab 3041 (39) @tab 1660 (29) @tab 90 @tab 468 +@item 2003-11-09 @tab 1.7.9 @tab 9444 @tab 475 @tab 1790 @tab 3048 (39) @tab 1660 (29) @tab 90 @tab 468 +@item 2003-12-10 @tab 1.8 @tab 7171 @tab 585 @tab 7730 @tab 3236 (39) @tab 1666 (31) @tab 104 @tab 521 +@item 2004-01-11 @tab 1.8.1 @tab 7217 @tab 663 @tab 7726 @tab 3287 (39) @tab 1686 (31) @tab 104 @tab 525 +@item 2004-01-12 @tab 1.8.2 @tab 7217 @tab 663 @tab 7726 @tab 3288 (39) @tab 1686 (31) @tab 104 @tab 526 +@item 2004-03-07 @tab 1.8.3 @tab 7214 @tab 686 @tab 7735 @tab 3303 (39) @tab 1695 (31) @tab 111 @tab 530 +@item 2004-04-25 @tab 1.8.4 @tab 7214 @tab 686 @tab 7736 @tab 3310 (39) @tab 1701 (31) @tab 112 @tab 531 +@item 2004-05-16 @tab 1.8.5 @tab 7240 @tab 686 @tab 7736 @tab 3299 (39) @tab 1701 (31) @tab 112 @tab 533 +@item 2004-07-28 @tab 1.9 @tab 7508 @tab 715 @tab 7794 @tab 3352 (40) @tab 1812 (32) @tab 115 @tab 551 +@item 2004-08-11 @tab 1.9.1 @tab 7512 @tab 715 @tab 7794 @tab 3354 (40) @tab 1812 (32) @tab 115 @tab 552 +@item 2004-09-19 @tab 1.9.2 @tab 7512 @tab 715 @tab 7794 @tab 3354 (40) @tab 1812 (32) @tab 132 @tab 554 +@item 2004-11-01 @tab 1.9.3 @tab 7507 @tab 718 @tab 7804 @tab 3354 (40) @tab 1812 (32) @tab 134 @tab 556 +@item 2004-12-18 @tab 1.9.4 @tab 7508 @tab 718 @tab 7856 @tab 3361 (40) @tab 1811 (32) @tab 140 @tab 560 +@item 2005-02-13 @tab 1.9.5 @tab 7523 @tab 719 @tab 7859 @tab 3373 (40) @tab 1453 (32) @tab 142 @tab 562 +@item 2005-07-10 @tab 1.9.6 @tab 7539 @tab 699 @tab 7867 @tab 3400 (40) @tab 1453 (32) @tab 144 @tab 570 +@item 2006-10-15 @tab 1.10 @tab 7859 @tab 1072 @tab 8024 @tab 3512 (40) @tab 1496 (34) @tab 172 @tab 604 +@item 2008-01-19 @tab 1.10.1 @tab 7870 @tab 1089 @tab 8025 @tab 3520 (40) @tab 1499 (34) @tab 173 @tab 617 +@item 2008-11-23 @tab 1.10.2 @tab 7882 @tab 1089 @tab 8027 @tab 3540 (40) @tab 1509 (34) @tab 176 @tab 628 +@item 2009-05-17 @tab 1.11 @tab 8721 @tab 1092 @tab 8289 @tab 4164 (42) @tab 1714 (37) @tab 181 @tab 732 (20) +@end multitable + + +@c ========================================================== Appendices + +@page +@node Copying This Manual +@appendix Copying This Manual + +@menu +* GNU Free Documentation License:: License for copying this manual +@end menu + +@node GNU Free Documentation License +@appendixsec GNU Free Documentation License +@include fdl.texi + +@bye |