12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214 |
- \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
|