diff options
Diffstat (limited to 'doc/automake-history.texi')
-rw-r--r-- | doc/automake-history.texi | 1214 |
1 files changed, 0 insertions, 1214 deletions
diff --git a/doc/automake-history.texi b/doc/automake-history.texi deleted file mode 100644 index 57355544a..000000000 --- a/doc/automake-history.texi +++ /dev/null @@ -1,1214 +0,0 @@ -\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-2015 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 |