GNU Libtool
***********

1. Introduction
===============

This file attempts to describe the processes we use to maintain libtool,
and is not part of a release distribution.

2. Maintenance Notes
====================

* 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
	doc/
	    + fdl.texi
	libltdl/
	    + COPYING.LIB
	libltdl/config/
	    + compile
	    + config.guess
	    + config.sub
	    + depcomp
	    + install-sh
	    + mdate-sh
	    + missing
	    + texinfo.tex
  The ones that are important for a release can be udated with,
  `make -fMakefile.maint fetch' (or `make -f../Makefile.maint fetch'
  if you are running from a VPATH build directory, where `../' is the
  relative path to the directory with `configure' in it).

* Changes other than bug fixes must be mentioned in NEWS


3. Test Suite
=============

* When writing tests, make sure the link invocation (first argument to
  AT_CHECK) is on a single line so that `testsuite -x' displays the
  whole thing.  You can use m4_do or `[... ]dnl' to wrap long lines.

* Use
    make -k check
  liberally, on as many platforms as you can.  Use as many compilers and
  linkers you can.  To run old and new testsuites separately, use
    make check TESTSUITEFLAGS=-V
    make check-local

* The new Autotest testsuite uses keywords to denote test features:
    autoconf		needs Autoconf
    automake		needs Automake
    libltdl		exercises the `libltdl' library
    libtool		exercises the `libtool' script
    libtoolize		exercises the `libtoolize' script
    recursive		runs the suite recursively, with a modified
			`libtool' script and with `-k libtool'
    CXX F77 FC GCJ	exercises a language other than C


4. Naming
=========

* We've adopted the convention that exported Autoconf macros should be
  named with a leading `LT_' and be documented in the libtool manual.
  Internal macros begin with `_LT_' if they are visible to aclocal, or
  potentially part of an AC_DEFUN/AC_REQUIRE path, or else `_lt_' if
  they are very low level.  This convention was only introduced just
  before libtool-2.0, so there may still be exceptions in the existing
  code.  But all new code should use it.

* All shell variables used internally by libtool's Autoconf macros
  should be named with the a leading `lt_' (not that they cannot clash
  with the `_lt_' macro namespace).


5. Editing 'ChangeLog'
======================

* When in doubt, check that emacs can syntax-color properly in
  change-log-mode.  And preferably use emacs 'C-x 4 a'
  (add-change-log-entry-other-window) to open ChangeLog with an
  appropriate new template.

* If this change is by a different author, or on a different date to the
  last entry start a new entry at the top of the file with the format
  (note two spaces between each field):

yyyy-mm-dd  Name of Author  <email@address>

*  If more than one person collaborated on the change, additional
   authors can be listed on subsequent lines, thus:

yyyy-mm-dd  Name of Main Author  <email@address>,
            Name of Contributor  <another@email.address>

* Where a change author did not supply a copyright assignment, but the
  changes they submitted were sufficiently trivial to commit in any case
  (see the GCS for guidelines on this), then flag this against their
  name in the header, thus:

yyyy-mm-dd  Name of Author  <email@address>  (tiny change)

* In ChangeLog.2004 and earlier, 'Name of Author' was sometimes the name
  of the author of the ChangeLog when the person who made the change
  being documented didn't supply one.   In that case separated from
  the previous field by a blank line and indented by 1 tab (note, only
  1 space between fields here) you will see:

	From Author of Actual Change <email@address>:

  As of now, don't do that anymore, since the GNU Coding Standards say
  that the author of the change must be credited in the main entry
  header for legal purposes.

* Preferably the next part should be a description of the overall
  purpose of the change, separated from the header by a blank line,
  indented by 1 tab, and filled at column 72.  The last character of the
  description should be a period.  Ideally, this description fits on one
  line, or begins with a one-line summary.

* Changes to each file come next.  Each new file starts on a new line,
  indented by 1 tab and starting with an asterisk and a space.  Multiple
  files can be listed here relative to $top_srcdir, and comma separated.
  Names of functions (or sections as appropriate) to which the change
  applies should be named inside parentheses and comma separated.  If
  this goes beyond column 72, then parens should be closed and re-opened
  on the next line:

	* file, another/file, test/testcases/foo.test (func_foo)
	(func_bar, func_baz): Description of changes.

* If the change does not apply to particular functions (or sections),
  the section list can be omitted:

	* file, another/file, test/testcases/foo.test: General changes.

* If the changes are particular to certain architectures, they should be
  listed after the functions in square brackets:

	* file, another/file (func_foo) [linux, solaris]: Description of
	changes.

* Subsequent changes in other files that are related to the same overall
  enhancement or bugfix should be listed concurrently, without blank
  lines.  Always start a fresh line for a new file:

	* file, another/file (func_foo) [linux, solaris]: Description of
	changes.
	* doc/foo.texi (Invoking Foo): Document.
	* NEWS: Updated.

* If the change is in response to a problem reported by someone other
  than the author, then credit them at the end of the description with:

	Reported by Reporter Name <email@address>.

* See the GNU Coding Standards document for more details on ChangeLog
  formatting.


2005-01-08  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>  (tiny change),
            Peter O'Gorman  <peter@pogma.com>

	This is the overall description of the purpose of this change
	and any useful background for a model ChangeLog entry.

	* HACKING: Updated copyright.  This isn't attached to a
	particular section of the file, so it comes first.
	(Editing 'ChangeLog'): New section.  This applies to the same
	file, but since it applies to a particular section it starts on
	a new line.
	(Introduction, Maintenance Notes, Test Suite, Naming)
	(Editing '.am' Files): If I had changed all these sections in
	the same way, I can list them like this, being careful to close
	and reopen the parentheses when starting a new line.  The colon
	only comes after the last section before this description.
	* NEWS: Updated.
	Reported by Bob Friesenhahn <bfriesen@simple.dallas.tx.us>.


6. Using git
============

* Preferably, let the git commit message mirror the ChangeLog entry,
  without the leading TABs.  Use --author for the (first, main) author
  of patches from others, sign patches you have reviewed.  If the
  ChangeLog entry is longer than a line, use a one line summary, then an
  empty line, then the rest of the log entry; this makes for nice output
  of `git log'.

* You may find it useful to install the git-merge-changelog merge driver:
  <http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/git-merge-changelog.c>

* Do not ever rewind the public master branch nor any public release
  branch on savannah, neither any release tags once they have been
  published.  Other branches and tags may have different rules.

* Avoid merge commits on the master branch of the public git repository.
  For unpublished changes in your development tree, it's easiest to
  rebase against the current master before applying them, this preserves
  a linear history.


7. Editing `.am' Files
======================

* Always use $(...) and not ${...}

* Use `:', not `true'.  Use `exit 1', not `false'.

* Use `##' comments liberally.  Comment anything even remotely unusual.

* Never use basename or dirname.  Instead use sed.

* Do not use `cd' within back-quotes, use `$(lt__cd)' instead.
  Otherwise the directory name may be printed, depending on CDPATH.

* In general, if a loop is required, it should be silent.  Then the body
  of the loop itself should print each "important" command it runs.

* Use 4 extra spaces to indent continued dependencies.

* One needs to remember that for our whole logic for the different
  libltdl modes to function correctly, the thing we need to ensure
  *before the client runs libtoolize*, is that the subpackage case is
  correct (because all files may be symlinked there).  All others can
  and will be fixed in the `libtoolize --ltdl --(non)recursive' stage.


8. Editing `.m4sh' Files
========================

* Use shell functions, but be careful not to assume local scope for
  variable names.  Don't use `return', instead echo the result of a
  function and call it from within backquotes.

* Function names should be prefixed `func_', the function header should
  look like this:

  # func_foo [ OPTIONS ]
  # Description of what func_foo does and returns.
  func_foo ()
  {
      $opt_debug
      # contents of func_foo ...
  }

  The `$opt_debug' is used to enable shell tracing (Korn shells reset
  this on function entry).

* For functions that are called frequently, if you need to return a
  value, don't cause unneccessary forking of the shell using echo as
  described above; instead set the return value in a variable named
  after the called function with a suffix of `_result'.  For example
  the function `func_quote_for_eval' stores its return value in the
  variable `$func_quote_for_eval_result'.

* Although sh-indentation is set to 2 (by the `Local Variables:' block
  at the end of .m4sh files), the left margin of the body of shell
  functions should begin indented by 4 spaces.

* Where there are large blocks of shell code with no m4 or m4sh
  expansions, put the entire block in an M4SH_VERBATIM call.  This
  saves both on copy-and-paste errors, and needing to remember to
  internally double the m4 quoting characters:

  M4SH_VERBATIM([[
  my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
  ...
  ]])


9. Editing `.m4' Files
======================

* Be careful with both `echo' and `$ECHO'.  As the latter may be one of
   print -r --
   printf %s\n
   func_fallback_echo
  it may not have more than one argument and its value may not be
  eval'ed.  However, the argument may start with a `-' and contain
  backslashes.  As a rule of thumb, use
   echo ..		for literal (constant) strings without leading
			hyphen and no backslashes within,
   $ECHO ".."		otherwise.
   func_echo_all	when multiple arguments are present, or when
			placed in an eval'ed variable.

* The Autoconf manual says that giving an empty parameter is equivalent
  to not giving it at all.  (In particular, the Autoconf manual doesn't
  explain that "FOO()" is calling macro FOO with one empty parameter.)
  To prevent misunderstanding, we should use m4_ifval to check whether
  a parameter is empty, and not $# to check for the number of parameters.

* Any time we add a macro to an older version, lt~obsolete.m4 needs to
  be updated in all newer versions.


10. Abstraction layers in libltdl
=================================

* The libltdl API uses a layered approach to differentiate internal and
  external interfaces, among other things.  To keep the abstraction
  consistent, files in a given layer may only use APIs from files in the
  lower layers.  The ASCII art boxes below represent this stack, from
  top to bottom...

* But first, outside of the stack, there is a convenience header that
  defines the internal interfaces (as evidenced by the `lt__' prefix to
  the filename!) shared between implementation files in the stack, that
  are however not exported to libltdl clients:

	,-------------.
	|lt__private.h|
	`-------------'

* The top layer of the stack is the libltdl API proper, which includes
  the relevant subsystems automatically.  Clients of libltdl need only
  invoke:

  #include <ltdl.h>

	,------.
	|ltdl.h|
	+------+
	|ltdl.c|
	`------'

* The next layer is comprised of the subsystems of the exported libltdl
  API, which are implemented by files that are named with a leading `lt_'
  (single underscore!):

	,------------v---------------.
	| lt_error.h | lt_dlloader.h |
	+------------+---------------+
	| lt_error.c | lt_dlloader.c |
	`------------^---------------'

* The next file is used both by the headers that implement it (in which
  case its function is to avoid namespace clashes when linking with the
  GNU C library proper) and is included by code that wants to program
  against a glibc-like interface, in which case it serves to pull in all
  the glibc-like functionality used by libltdl with a simple:

    #include <libltdl/lt__glibc.h>

  It consists of a single file:

	,-----------.
	|lt__glibc.h|
	`-----------'

* Next to last is the libc abstraction layer, which provides a uniform
  API to various system libc interfaces that differ between hosts
  supported by libtool.  Typically, the files that implement this layer
  begin:

    #if defined(LT_CONFIG_H)
    #  include LT_CONFIG_H
    #else
    #  include <config.h>
    #endif
    #include "lt_system.h"

  Or if they are installed headers that must work outside the libtool
  source tree, simply:

    #include <libltdl/lt_system.h>

  This layer's interface is defined by files that are usually named with
  a leading `lt__':

	,--------------v-------------v------------v--------v---------.
	| lt__dirent.h | lt__alloc.h | lt__strl.h | argz.h | slist.h |
	+--------------+-------------+------------+--------+---------+
	| lt__dirent.c | lt__alloc.c | lt__strl.c | argz.c | slist.c |
	`--------------^-------------^------------^--------^---------'

  (argz.h and slist.h are used independently of libltdl in other projects)

* At the bottom of the stack we have the system abstraction layer,
  which tries to smooth over the cracks where there are differences
  between host systems and compilers.  config.h is generated at
  configure time and is not installed; lt_system.h is an installed
  file and cannot use macros from config.h:

	,-----------.
	|../config.h|
	`-----------'

	,-----------.
	|lt_system.h|
	`-----------'

* Tacked on the side of this stack, attached via the lt_dlloader.h
  definitions are the various implementation modules for run-time module
  loading: preopen.c, dlopen.c etc.


11. Licensing Rules
===================

GNU Libtool uses 3 different licenses for various of the files distributed
herein, with several variations on license text.  It is important that
you use the correct license text in each new file added.  Here are the
texts along with some notes on when each is appropriate.  Appropriate
commenting (shell, C etc) and decoration (m4sh etc) assumed throughout.



11.1. Notice preservation

Autoconf macros and files used to generate them need this license, along
with files such as HACKING, NEWS, README, README.alpha, TODO and
ChangeLogs:

   Copyright (C) <year list> Free Software Foundation, Inc.
   Written by <author>, <year>

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.  This file is offered as-is,
without warranty of any kind.



11.2. GPL

Everything else in the distribution has the following license text
unless there is good reason to use one of the other license texts
below:

   Copyright (C) <year list> Free Software Foundation, Inc.
   Written by <author>, <year>

   This file is part of GNU Libtool.

GNU Libtool is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.

GNU Libtool is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Libtool; see the file COPYING.  If not, a copy
can be downloaded from  http://www.gnu.org/licenses/gpl.html,
or obtained by writing to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.



11.3. GPL with self extracting version

Some of the sources built atop the getopt.m4sh framework use
func_version() to extract their --version output from the copyright
block.  Those files also need the --version copyright text paragraph as
follows:

   <program name> (GNU @PACKAGE@) <version number>
   Written by <author> <email address>.

   This file is part of <parent package name>.

Copyright (C) <year list> Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

<program name> is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

<program name> is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with <program name>; see the file COPYING.  If not, a copy
can be downloaded from http://www.gnu.org/licenses/gpl.html,
or obtained by writing to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.



11.4. GPL with self extracting version and Libtool exception clause

Although the libtool script is generated from `ltmain.m4sh' according
to the rules in the preceding subsection, it also needs the Libtool
exception clause so that it can be redistributed by other projects
that use libtool:

  <program name> (GNU @PACKAGE@@TIMESTAMP@) <version number>
  Written by <author> <email address>.

  This file is part of GNU Libtool.

Copyright (C) <year list> Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

<program name> is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

As a special exception to the GNU General Public License,
if you distribute this file as part of a program or library that
is built using GNU Libtool, you may include this file under the
same distribution terms that you use for the rest of that program.

<program name> is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with <program name>; see the file COPYING.  If not, a copy
can be downloaded from http://www.gnu.org/licenses/gpl.html,
or obtained by writing to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.



11.5. LGPL with Libtool exception clause

Finally, not only is Libltdl is LGPLed, but it is routinely
redistributed inside projects that use it, so its sources need to use
the following license text citing the LGPL along with Libtool's special
exception clause:

   Copyright (C) <year list> Free Software Foundation, Inc.
   Written by <author>, <year>

   NOTE: The canonical source of this file is maintained with the
   GNU Libtool package.  Report bugs to bug-libtool@gnu.org.

GNU Libltdl is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

As a special exception to the GNU Lesser General Public License,
if you distribute this file as part of a program or library that
is built using GNU Libtool, you may include this file under the
same distribution terms that you use for the rest of that program.

GNU Libltdl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with GNU Libltdl; see the file COPYING.LIB.  If not, a
copy can be downloaded from  http://www.gnu.org/licenses/lgpl.html,
or obtained by writing to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.


12. Release Procedure
=====================

* If you are a libtool maintainer, but have not yet registered your
  gpg public key and (preferred) email address with the FSF, send an
  email, preferably GPG-signed, to <ftp-upload@gnu.org> that includes
  the following:

    (a) name of package(s) that you are the maintainer for, and your
        preferred email address.

    (b) an ASCII armored copy of your GnuPG key, as an attachment.
	("gpg --export -a YOUR_KEY_ID > mykey.asc" should give you
	this.)

  When you have received acknowledgement of your message, the proper GPG
  keys will be registered on ftp-upload.gnu.org and only then will you be
  authorized to upload files to the FSF ftp machines.

* If you do not have access to the mailing list administrative interface,
  approach the list owners for the password.  Be sure to check the lists
  (esp. bug-libtool) for outstanding bug reports also in the list of
  pending moderation requests.

* Make sure you have wget and xz installed.

* Make sure your locale is sane, e.g. by exporting LC_ALL=C.

* Double check that serial number updates in public m4 files weren't forgotten
  since last release (they should be updated in git along with commits that
  require it so that users can work with git snapshots).

* Update the LTDL_VERSION_INFO in libltdl/Makefile.inc for changes since
  the last release.

* Update the version number in configure.ac and libltdl/configure.ac.
  See http://www.gnu.org/software/libtool/contribute.html for details of
  the numbering scheme.

* Update NEWS, ChangeLog.

* Run ./bootstrap.

* Run ./configure (or create a build directory first and run configure
  from there, if you want to keep the build tree separate).

* Run `make -fMakefile.maint fetch' (or `make -f../Makefile.maint fetch'
  if you are running from a VPATH build directory, where `../' is the
  relative path to the directory with `configure' in it), which will
  fetch new versions of the files that are maintained outside of
  libtool.

* Run `make distcheck'
  and `make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-ltdl-install'
  and `make distcheck DISTCHECK_CONFIGURE_FLAGS=--program-prefix=g'
  and `make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-shared'
  and `make distcheck CC=g++'
  If there are any problems, fix them and start again.

* Run `git commit' from the source tree.

* Run `make -fMakefile.maint git-dist' (or `make -f../Makefile.maint
  git-dist' if you are running from a VPATH build directory, where `../'
  is the relative path to the directory with `configure' in it), which
  will build a release tarball (with `make distcheck'), tag the tree
  with release-$(VERSION) and generate the gpg signature files.

* Run 'make -f[../]Makefile.maint diffs' (pass
  LASTRELEASE=maj.min[.mic[alpha]] if needed) to create diff files
  between the previous release tarball and the new with detached gpg
  signature files and clear signed directive files.

* If not an alpha, generate with `make -f[../]Makefile.maint
  web-manual'.

* Upload release tarballs and diff files, plus their associated
  detached gpg signature files and clear signed directive files to
  ftp-upload.gnu.org.  If the upload is destined for ftp.gnu.org, then the
  files should be placed in the /incoming/ftp directory.  If the upload is
  an alpha release destined for alpha.gnu.org, then the files should be
  placed in the /incoming/alpha directory.

* Update version number in configure.ac and libltdl/configure.ac to next
  alpha number.  See http://www.gnu.org/software/libtool/contribute.html
  for details of the numbering scheme.

* Update NEWS, ChangeLog.

* Run `git commit'.

* Run `git push --tags', to push the new changes and tags to origin.

* Update the webpages, libtool.html will need to indicate the latest
  release number.

* If not an alpha, upload new manual pages you created earlier in
  doc/manual using cvs to here:
  <yourusername>@cvs.savannah.gnu.org:/webcvs/libtool

* Write a release announcement, and post it to `libtool@gnu.org' and
  `autotools-announce@gnu.org' with the Reply-To header set to
  `bug-libtool@gnu.org'.  Stable releases should also be announced
  on `info-gnu@gnu.org'.

* Post a copy of your release announcement to savannah news:
  https://savannah.gnu.org/news/submit.php?group=libtool
  which will automatically propogate to http://planet.gnu.org.


13. Alpha release note template
===============================

To: libtool@gnu.org, autotools-announce@gnu.org
Reply-To: bug-libtool@gnu.org
Subject: GNU Libtool @VERSION@ released (alpha release).

The Libtool Team is pleased to announce alpha release @VERSION@ of GNU
Libtool.

GNU Libtool hides the complexity of using shared libraries behind a
consistent, portable interface. GNU Libtool ships with GNU libltdl,
which hides the complexity of loading dynamic runtime libraries
(modules) behind a consistent, portable interface.

Here are the compressed sources:

  ftp://alpha.gnu.org/gnu/libtool/libtool-@VERSION@.tar.gz
  ftp://alpha.gnu.org/gnu/libtool/libtool-@VERSION@.tar.bz2

Here are the xdeltas and diffs against libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@:

  ftp://alpha.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  ftp://alpha.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta

Here are the gpg detached signatures:

  ftp://alpha.gnu.org/gnu/libtool/libtool-@VERSION@.tar.gz.sig
  ftp://alpha.gnu.org/gnu/libtool/libtool-@VERSION@.tar.bz2.sig
  ftp://alpha.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz.sig
  ftp://alpha.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta.sig

You should download the signature named after any tarball you download,
and then verify its integrity with, for example:

  gpg --verify libtool-@VERSION@.tar.gz.sig

Here are the MD5 and SHA1 checksums:

  @MD5SUM@ libtool-@VERSION@.tar.gz
  @MD5SUM@ libtool-@VERSION@.tar.bz2
  @MD5SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  @MD5SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta
  @SHA1SUM@ libtool-@VERSION@.tar.gz
  @SHA1SUM@ libtool-@VERSION@.tar.bz2
  @SHA1SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  @SHA1SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta

This release has @SUMMARY_OF_IMPROVEMENTS_SINCE_LAST_RELEASE_ON_THIS_BRANCH@.

This release was bootstrapped with @BOOTSTRAP_TOOLS_WITH_VERSIONS@,
but is useable with @COMPATIBLE_AUTOTOOL_VERSIONS@ in your own
projects.

Alternatively, you can fetch the unbootstrapped source code with
git by using the following command:

  $ git clone git://git.savannah.gnu.org/libtool.git
  $ cd libtool
  $ git checkout @GIT_RELEASE_TAG@

You will then need to have recent (possibly as yet unreleased) versions
of Automake and Autoconf installed to bootstrap the checked out
sources yourself.

New in @VERSION@: @RELEASE_DATE@

  @EXCERPT_FROM_NEWS_FILE@

Please report bugs to <bug-libtool@gnu.org>, along with the verbose
output of any failed test groups, and the output from `./libtool --config.'
The README file explains how to capture the verbose test output.



14. Full release note template
==============================

To: info-gnu@gnu.org
Cc: libtool@gnu.org, autotools-announce@gnu.org
Reply-To: bug-libtool@gnu.org
Subject: GNU Libtool @VERSION@ released.

The Libtool Team is pleased to announce the release of GNU Libtool
@VERSION@.

GNU Libtool hides the complexity of using shared libraries behind a
consistent, portable interface. GNU Libtool ships with GNU libltdl,
which hides the complexity of loading dynamic runtime libraries
(modules) behind a consistent, portable interface.

This release has @SUMMARY_OF_IMPROVEMENTS_SINCE_LAST_RELEASE_ON_THIS_BRANCH@.

New in @VERSION@: @RELEASE_DATE@

  @EXCERPT_FROM_NEWS_FILE@

libtool-@VERSION@ is available now from ftp.gnu.org, along with
diffs and xdeltas against libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@
that are also available from ftp.gnu.org.  Please
use a mirror to reduce stress on the main gnu machine:

  http://www.gnu.org/order/ftp.html

Here are the compressed sources:

  ftp://ftp.gnu.org/gnu/libtool/libtool-@VERSION@.tar.gz
  ftp://ftp.gnu.org/gnu/libtool/libtool-@VERSION@.tar.bz2

Here are the xdeltas and diffs against libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@:

  ftp://ftp.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  ftp://ftp.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta

Here are the gpg detached signatures:

  ftp://ftp.gnu.org/gnu/libtool/libtool-@VERSION@.tar.gz.sig
  ftp://ftp.gnu.org/gnu/libtool/libtool-@VERSION@.tar.bz2.sig
  ftp://ftp.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz.sig
  ftp://ftp.gnu.org/gnu/libtool/libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta.sig

You should download the signature named after any tarball you download,
and then verify its integrity with, for example:

  gpg --verify libtool-@VERSION@.tar.gz.sig

Here are the MD5 and SHA1 checksums:

  @MD5SUM@ libtool-@VERSION@.tar.gz
  @MD5SUM@ libtool-@VERSION@.tar.bz2
  @MD5SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  @MD5SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta
  @SHA1SUM@ libtool-@VERSION@.tar.gz
  @SHA1SUM@ libtool-@VERSION@.tar.bz2
  @SHA1SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.diff.gz
  @SHA1SUM@ libtool-@PREV_RELEASE_VERSION_ON_THIS_BRANCH@-@VERSION@.xdelta

This release was bootstrapped with @BOOTSTRAP_TOOLS_WITH_VERSIONS@,
but is useable with @COMPATIBLE_AUTOTOOL_VERSIONS@ in your own
projects.

Alternatively, you can fetch the unbootstrapped source code with
git by using the following command:

  $ git clone git://git.savannah.gnu.org/libtool.git
  $ cd libtool
  $ git checkout @GIT_RELEASE_TAG@

You will then need to have the latest release versions of Automake
(@AUTOMAKE_VERSION@) and Autoconf (@AUTOCONF_VERSION@) installed to
bootstrap the checked out sources yourself.

Please report bugs to <bug-libtool@gnu.org>, along with the verbose
output of any failed test groups, and the output from `./libtool --config.'
The README file explains how to capture the verbose test output.

-- 
  Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Free Software
  Foundation, Inc.
  Written by Gary V. Vaughan, 2004

  This file is part of GNU Libtool.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.  This file is offered as-is,
without warranty of any kind.

Local Variables:
mode: text
fill-column: 72
End:
vim:tw=72
