This is an alpha testing release of GNU Libtool.  To get the latest
CVS version of this package, do:

  cvs -d :pserver:anoncvs@subversions.gnu.org:/home/cvs login
  [Hit return when prompted for the password]
  cvs -d :pserver:anoncvs@subversions.gnu.org:/home/cvs checkout libtool
  cd libtool
  ./bootstrap

The `bootstrap' script sets up the source directory for you to hack. To
use it, you need a recent (maybe yet to be released) version of both
Autoconf and Automake.

If you have any suggestions or bug reports, or you wish to port
libtool to a new platform, please send electronic mail to the libtool
mailing list <libtool@gnu.org> or bug reports to <bug-libtool@gnu.org>.
Don't forget to mention the version of libtool that you are currently
using (by typing `ltconfig --version').

================================================================
= Administrivia

* If you incorporate a change from somebody on the net:
  If it is a large change, you must make sure they have signed the
  appropriate paperwork, and be sure to add their name and email
  address to THANKS

* If a change fixes a test, mention the test in the ChangeLog entry.

* If somebody reports a new bug, mention his name in the ChangeLog entry
  and in the test case you write.

* The correct response to most actual bugs is to write a new test case
  which demonstrates the bug.  Then fix the bug, re-run the test suite,
  and check everything in.

* Some files in the libtool package are not owned by libtool.  These
  files should never be edited here.  These files are COPYING, INSTALL,
  config.guess, config.sub, install-sh, mdate-sh, mkinstalldirs,
  texinfo.tex.

* Changes other than bug fixes must be mentioned in NEWS

================================================================
= Test suite

* Use "make check" liberally, on as many platforms as you can.  Use as
  many compilers and linkers you can.


================================================================
= Release procedure

* Fetch new versions of the files that are maintained by the FSF.
  config.guess and config.sub are available via ftp from
  ftp://ftp.gnu.org/gnu/config/

* Update NEWS.

* Update the version number in configure.in.
  (The idea is that every other alpha number will be a net release.
  The repository will always have its own "odd" number so we can easily
  distinguish net and repo versions.)

* Configure, build, and install.

* Commit

* Run `make cvs-dist' which will tag the tree with release-maj-min<alpha>.

* Run `make cvs-diff' which will create a diff file against the previous
  release tag (set OLDVERSION=min.maj<alpha> in the environment beforehand
  if necessary).

* Download a copy of the previous release tarball and generate an
  xdelta with:

    xdelta delta libtool-<prev>.tar.gz libtool-<version>.tar.gz > \
    libtool-<prev>-<version>.tar.xdp.gz'

* Upload release tarball, diff file and xdelta file 
  ftp://melange.gnu.org/~ftp/gnu/libtool and send announcement to
  libtool@gnu.org.

* If not an alpha, announcement must also go to info-gnu@gnu.org, and an
  upload request be sent to ftp-upload@gnu.org requesting files be transferred
  from ftp://alpha.gnu.org/gnu/libtool to ftp://ftp.gnu.org/gnu/libtool.

* Update version number in configure.in to next alpha number.

* Commit.
