-*- outline -*-

This file attempts to describe the maintainer-specific notes to follow
when hacking Autoconf.  Don't put this file into the distribution.
Don't mention it in the ChangeLog.  You may want to first see
README-hacking for more general rules on building Autoconf from
checked-out sources.

* Administrivia

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

** Test fixes
If a change fixes a test, mention the test in the ChangeLog entry.
To this end, the Autotest-mode is handy.

** Bug reports
If somebody reports a new bug, mention their name in the ChangeLog
entry and in the test case you write.  Put them into THANKS.

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.

** Visible changes
Which include serious bug fixes, must be mentioned in NEWS.

** Portability issues
Discoveries in portability matters should be written down in the
documentation (what fails, why it fails, *where* it fails, and what's
to be written instead?).

** Allow bootstrapping
Make sure that a fresh checkout of Autoconf can be bootstrapped using
the previous stable release of Autoconf.  In other words, do not use
newly-added features in configure.ac if doing so would require an
installed git checkout to rerun 'autoreconf -i' successfully.

* Test suite

** make check
Use liberally.

** Release checks
Try to run the test suite with more severe conditions before a
release:

- Run 'make syntax-check'
  This makes sure that the source files follow some consistent rules.
  The checks live in maint.mk, shared from gnulib, and customized in
  cfg.mk.

- Run 'make distcheck' and 'make maintainer-check'.

- Try some real world packages
  A good example is the coreutils package.

* Release Procedure
These steps describe what a maintainer does to make a release; they
are not needed for ordinary patch submission.

** Upload Privileges
If you have not yet registered your gpg public key and (preferred)
email address with the FSF in relation to the Autoconf package, 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.  Beware; this
process can take several days.

** Mailing list Admin Privileges
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-autoconf) for outstanding bug reports also
in the list of pending moderation requests.  This step is not strictly
necessary, but helps.

** Preparation for release
Make sure you have GNU make installed.  Make sure your PATH includes a
Automake 1.11 or later (preferably not a development snapshot).  Make
sure your locale is sane, e.g. by exporting LC_ALL=C.  Bootstrap the
checkout, and make sure the testsuite passes.  See above for more
hints on the testsuite.  If needed, update cfg.mk with details
specific to your environment, such as the location of a gnulib checkout.

** Update the foreign files
Running 'make fetch' in the top level should grab it all for you; you
should check the results before committing them in git.

** Set the version number
Update the version number in NEWS (with version, date, and release
type).  Make sure all changes are committed, then run 'git tag -s -m
<version> -u <gpg_key> v<version>'.  Do not push anything upstream at
this point.

** Update configure
As much as possible, make sure to release an Autoconf that uses
itself.  That's easy: just be in the top level, and run
'tests/autoconf'.  Or install this autoconf and run 'autoreconf -f'.

** Make the release
Run 'make {alpha,beta,stable}' depending on which type of release this
is.  This runs the various checks, creates delta files, creates a
preliminary announcement in ~/announce-autoconf-<version>, prints
out the command to upload the files, and updates the previous version
file.

If it fails, run 'git tag -d v<version>', fix the problems, and go
back to the step of setting the version.

** Upload
Put the tarballs where they should be, using the instructions
regarding gnupload that were printed during the previous step.  Verify
that the files are correctly uploaded before sending a release
announcement.

** Push the updates
Run 'git push origin refs/tags/v<version>' to push the release tag.

** Announce
Complete/fix the announcement file, and email it at least to
autoconf@gnu.org and autotools-announce@gnu.org.  If this is a stable
release, also mail to info-gnu@gnu.org; if it is a beta release,
also mail to platform-testers@gnu.org.

** Other web updates
For alpha and beta releases, the process is complete.  For stable
releases, there are several other web pages that need updates.

Update the online manual: Run 'make web-manual', then copy the
contents of doc/manual into a CVS checkout of the documentation
repository.  Remember to use 'cvs add -ko' so that RCS keywords in the
generated output do not get expanded improperly.
  $ export CVS_RSH=ssh
  $ cvs -z3 -d:ext:<user>@cvs.sv.gnu.org:/web/autoconf co autoconf

Post a news blurb on https://savannah.gnu.org/projects/autoconf.

Update the Free Software Directory: browse to:
  https://directory.fsf.org/project/autoconf/
and send an email to <bug-directory@gnu.org> mentioning any content
that needs to be updated.

-----

Copyright (C) 2002, 2008-2017, 2020-2024 Free Software Foundation, Inc.

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.
