This file attempts to describe the rules to use when hacking Bison.
Don't put this file into the distribution.

Everything related to the development of Bison is on Savannah:

        http://savannah.gnu.org/projects/bison/


* 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.

** If a change fixes a test, mention the test in the commit message.

** Bug reports
If somebody reports a new bug, mention his name in the commit message
and in the test case you write.  Put him 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.


* Hacking

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

** Translations
Only user visible strings are to be translated: error messages, bits
of the .output file etc.  This excludes impossible error messages
(comparable to assert/abort), and all the --trace output which is
meant for the maintainers only.

** Horizontal tabs
Do not add horizontal tab characters to any file in Bison's repository
except where required.  For example, do not use tabs to format C code.
However, make files, ChangeLog, and some regular expressions require
tabs.  Also, test cases might need to contain tabs to check that Bison
properly processes tabs in its input.


* Working from the repository

These notes intend to help people working on the checked-out sources.
These requirements do not apply when building from a distribution tarball.

** Requirements

We've opted to keep only the highest-level sources in the repository.  This
eases our maintenance burden, (fewer merges etc.), but imposes more
requirements on anyone wishing to build from the just-checked-out sources.
For example, you have to use the latest stable versions of the maintainer
tools we depend upon, including:

- Autoconf <http://www.gnu.org/software/autoconf/>
- Automake <http://www.gnu.org/software/automake/>
- Flex <http://www.gnu.org/software/flex/>
- Gettext <http://www.gnu.org/software/gettext/>
- Graphviz <http://www.graphviz.org>
- Gzip <http://www.gnu.org/software/gzip/>
- Help2man <http://www.gnu.org/software/help2man/>
- Perl <http://www.cpan.org/>
- Rsync <http://samba.anu.edu.au/rsync/>
- Tar <http://www.gnu.org/software/tar/>
- Texinfo <http://www.gnu.org/software/texinfo/>

Valgrind <http://valgrind.org/> is also highly recommended, if it supports
your architecture.

If you're using a GNU/Linux distribution, the easiest way to install the
above packages depends on your system.  The following shell command should
work for Debian-based systems such as Ubuntu:

  sudo apt-get install \
    autoconf automake autopoint flex graphviz help2man texinfo valgrind

Bison is written using Bison grammars, so there are bootstrapping issues.
The bootstrap script attempts to discover when the C code generated from the
grammars is out of date, and to bootstrap with an out-of-date version of the
C code, but the process is not foolproof.  Also, you may run into similar
problems yourself if you modify Bison.

Only building the initial full source tree will be a bit painful.  Later,
after synchronizing from the repository a plain 'make' should be sufficient.
Note, however, that when gnulib is updated, running './bootstrap' again
might be needed.

** First checkout

Obviously, if you are reading these notes, you did manage to check out
this package from the repository.  For the record, you will find all the
relevant information on:

        http://savannah.gnu.org/git/?group=bison

Bison uses Git submodules: subscriptions to other Git repositories.
In particular it uses gnulib, the GNU portability library.  To ask Git
to perform the first checkout of the submodules, run

       $ git submodule update --init

Git submodule support is weak before versions 1.6 and later, upgrade Git if
your version is older.

The next step is to get other files needed to build, which are
extracted from other source packages:

        $ ./bootstrap

If it fails with missing symbols (e.g., "error: possibly undefined macro:
AC_PROG_GNU_M4"), you are likely to have forgotten the submodule
initialization part.  Otherwise, there you are!  Just

        $ ./configure
        $ make
        $ make check

At this point, there should be no difference between your local copy,
and the master copy:

        $ git diff

should output no difference.

Enjoy!

** Updating

The use of submodules make things somewhat different because git does
not support recursive operations: submodules must be taken care of
explicitly by the user.

*** Updating Bison

If you pull a newer version of a branch, say via "git pull", you might
import requests for updated submodules.  A simple "git diff" will
reveal if the current version of the submodule (i.e., the actual
contents of the gnulib directory) and the current request from the
subscriber (i.e., the reference of the version of gnulib that the
Bison repository requests) differ.  To upgrade the submodules (i.e.,
to check out the version that is actually requested by the subscriber,
run "git submodule update".

        $ git pull
        $ git submodule update

*** Updating a submodule
To update a submodule, say gnulib, do as follows:

Get the most recent version of the master branch from git.

        $ cd gnulib
        $ git fetch
        $ git checkout -b master --track origin/master

Make sure Bison can live with that version of gnulib.

        $ cd ..
        $ ./bootstrap
        $ make distcheck

Register your changes.

        $ git checkin ...

For a suggestion of what gnulib commit might be stable enough for a
formal release, see the ChangeLog in the latest gnulib snapshot at:

        http://erislabs.net/ianb/projects/gnulib/

The Autoconf files we use are currently:

        m4/m4.m4
        lib/m4sugar/m4sugar.m4
        lib/m4sugar/foreach.m4

These files don't change very often in Autoconf, so it should be
relatively straight-forward to examine the differences in order to
decide whether to update.

* Test suite

** make check
Use liberally.

** TESTSUITEFLAGS

The default is for make check to run all tests sequentially. This can be
very time consumming when checking repeatedly or on slower setups. This can
be sped up in two ways:

Using -j, in a make-like fashion, for example:
  $ make check TESTSUITEFLAGS='-j8'

Running only the tests of a certain category, as specified in the AT files
with AT_KEYWORDS([[category]]). Categories include:
  - c++, for c++ parsers
  - deprec, for tests concerning deprecated constructs.
  - glr, for glr parsers
  - java, for java parsers
  - report, for automaton dumps

To run a specific set of tests, use -k (for "keyword"). For example:
  $ make check TESTSUITEFLAGS='-k c++'

Both can be combined.

** Typical errors
If the test suite shows failures such as the following one

  .../bison/lib/getopt.h:196:8: error: redefinition of 'struct option'
  /usr/include/getopt.h:54:8: error: previous definition of 'struct option'

it probably means that some file was compiled without
AT_DATA_SOURCE_PROLOGUE.  This error is due to the fact that our -I options
pick up gnulib's replacement headers, such as getopt.h, and this will go
wrong if config.h was not included first.

See tests/local.at for details.

** make maintainer-check-valgrind
This target uses valgrind both to check bison, and the generated parsers.

This is not mature on Mac OS X.  First, Valgrind does support the way bison
calls m4, so Valgrind cannot be used to check bison on Mac OS X.

Second, there are many errors that come from the platform itself, not from
bison.  build-aux/darwin11.4.0.valgrind addresses some of them.

Third, valgrind issues warnings such as:

  --99312:0:syswrap- WARNING: Ignoring sigreturn( ..., UC_RESET_ALT_STACK );

which cause the test to fail uselessly.  It is hard to ignore these errors
with a major overhaul of the way instrumentation is performed in the test
suite.  So currently, do not try to run valgrind on Mac OS X.

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

- Configure the package with --enable-gcc-warnings, so that one checks
  that 1. Bison compiles cleanly, 2. the parsers it produces compile
  cleanly too.

- Maybe build with -DGNULIB_POSIXCHECK, which suggests gnulib modules
  that can fix portability issues.  See if you really want to pay
  attention to its warnings; there's no need to obey blindly to it
  (<http://lists.gnu.org/archive/html/bison-patches/2012-05/msg00057.html>).

- Check with "make syntax-check" if there are issues diagnosed by
  gnulib.

- run "make maintainer-check" which:
  - runs "valgrind -q bison" to run Bison under Valgrind.
  - runs the parsers under Valgrind.
  - runs the test suite with G++ as C compiler...

- run "make maintainer-push-check", which runs "make maintainer-check"
  while activating the push implementation and its pull interface wrappers
  in many test cases that were originally written to exercise only the
  pull implementation.  This makes certain the push implementation can
  perform every task the pull implementation can.

- run "make maintainer-xml-check", which runs "make maintainer-check"
  while checking Bison's XML automaton report for every working grammar
  passed to Bison in the test suite.  The check just diffs the output of
  Bison's included XSLT style sheets with the output of --report=all and
  --graph.

- running "make maintainer-release-check" takes care of running
  maintainer-check, maintainer-push-check and maintainer-xml-check.

- Change tests/atlocal/CFLAGS to add your preferred options.  For
  instance, "-traditional" to check that the parsers are K&R.  Note
  that it does not make sense for glr.c, which should be ANSI, but
  currently is actually GNU C, nor for lalr1.cc.

- Test with a very recent version of GCC for both C and C++.  Testing
  with older versions that are still in use is nice too.


* Release Procedure
This section needs to be updated to take into account features from
gnulib.  In particular, be sure to read README-release.

** Update the submodules.  See above.

** Update maintainer tools, such as Autoconf.  See above.

** Try to get the *.pot files to the Translation Project at least one
week before a stable release, to give them time to translate them.
Before generating the *.pot files, make sure that po/POTFILES.in and
runtime-po/POTFILES.in list all files with translatable strings.
This helps: grep -l '\<_(' *

** Tests
See above.

** Update the foreign files
Running "./bootstrap" in the top level should update them all for you.
This covers PO files too.  Sometimes a PO file contains problems that
causes it to be rejected by recent Gettext releases; please report
these to the Translation Project.

** Update README
Make sure the information in README is current.  Most notably, make sure
it recommends a version of GNU M4 that is compatible with the latest
Bison sources.

** Check copyright years.
We update years in copyright statements throughout Bison once at the
start of every year by running "make update-copyright".  However, before
a release, it's good to verify that it's actually been run.  Besides the
copyright statement for each Bison file, check the copyright statements
that the skeletons insert into generated parsers, and check all
occurrences of PACKAGE_COPYRIGHT_YEAR in configure.ac.

** Update NEWS, commit and tag.
See do-release-commit-and-tag in README-release.  For a while, we used
beta names such as "2.6_rc1".  Now that we use gnulib in the release
procedure, we must use "2.5.90", which has the additional benefit of
being properly sorted in "git tag -l".

** make alpha, beta, or stable
See README-release.

** Upload
There are two ways to upload the tarballs to the GNU servers: using
gnupload (from gnulib), or by hand.  Obviously prefer the former.  But
in either case, be sure to read the following paragraph.

*** Setup
You need "gnupg".

Make sure your public key has been uploaded at least to
keys.gnupg.net.  You can upload it with:

  gpg --keyserver keys.gnupg.net --send-keys F125BDF3

where F125BDF3 should be replaced with your key ID.

*** Using gnupload
You need "ncftp".

At the end "make stable" (or alpha/beta) will display the procedure to
run.  Just copy and paste it in your shell.

*** By hand

The generic GNU upload procedure is at:

  http://www.gnu.org/prep/maintain/maintain.html#Automated-FTP-Uploads

Follow the instructions there to register your information so you're permitted
to upload.

Here's a brief reminder of how to roll the tarballs and upload them:

*** make distcheck
*** gpg -b bison-2.3b.tar.gz
*** In a file named "bison-2.3b.tar.gz.directive", type:

      version: 1.1
      directory: bison
      filename: bison-2.3b.tar.gz

*** gpg --clearsign bison-2.3b.tar.gz.directive
*** ftp ftp-upload.gnu.org # Log in as anonymous.
*** cd /incoming/alpha # cd /incoming/ftp for full release.
*** put bison-2.3b.tar.gz # This can take a while.
*** put bison-2.3b.tar.gz.sig
*** put bison-2.3b.tar.gz.directive.asc
*** Repeat all these steps for bison-2.3b.tar.xz.

** Update Bison manual on www.gnu.org.

*** You need a non-anonymous checkout of the web pages directory.

  $ cvs -d YOUR_USERID@cvs.savannah.gnu.org:/web/bison checkout bison

*** Get familiar with the instructions for web page maintainers.
http://www.gnu.org/server/standards/readme_index.html
http://www.gnu.org/server/standards/README.software.html
especially the note about symlinks.

*** Build the web pages.
Assuming BISON_CHECKOUT refers to a checkout of the Bison dir, and
BISON_WWW_CHECKOUT refers to the web directory created above, do:

  $ cd $BISON_CHECKOUT/doc
  $ make stamp-vti
  $ ../build-aux/gendocs.sh -o "$BISON_WWW_CHECKOUT/manual" \
    bison "Bison - GNU parser generator"
  $ cd $BISON_WWW_CHECKOUT

Verify that the result looks sane.

*** Commit the modified and the new files.

*** Remove old files.
Find the files which have not been overwritten (because they belonged to
sections that have been removed or renamed):

   $ cd manual/html_node
   $ ls -lt

Remove these files and commit their removal to CVS.  For each of these
files, add a line to the file .symlinks.  This will ensure that
hyperlinks to the removed files will redirect to the entire manual; this
is better than a 404 error.

There is a problem with 'index.html' being written twice (once for POSIX
function 'index', once for the table of contents); you can ignore this
issue.

** Announce
The "make stable" (or alpha/beta) command just created a template,
$HOME/announce-bison-X.Y.  Otherwise, to generate it, run:

  make RELEASE_TYPE=alpha gpg_key_ID=F125BDF3 announcement

where alpha can be replaced by beta or stable and F125BDF3 should be
replaced with your key ID.

Complete/fix the announcement file.  The generated list of recipients
(info-gnu@gnu.org, bug-bison@gnu.org, help-bison@gnu.org,
bison-patches@gnu.org, and coordinator@translationproject.org) is
appropriate for a stable release or a "serious beta".  For any other
release, drop at least info-gnu@gnu.org.  For an example of how to
fill out the rest of the template, search the mailing list archives
for the most recent release announcement.

For a stable release, send the same announcement on the comp.compilers
newsgroup by sending email to compilers@iecc.com.  Do not make any Cc as
the moderator will throw away anything cross-posted or Cc'ed.  It really
needs to be a separate message.

** Prepare NEWS
So that developers don't accidentally add new items to the old NEWS
entry, create a new empty entry in line 3 (without the two leading
spaces):

  * Noteworthy changes in release ?.? (????-??-??) [?]

Push these changes.

-----

Copyright (C) 2002-2005, 2007-2015 Free Software Foundation, Inc.

This file is part of GNU Bison.

This program 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 3 of the License, or
(at your option) any later version.

This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

 LocalWords:  Automake Autoconf Gettext Gzip Rsync Valgrind gnulib submodules
 LocalWords:  submodule init cd distcheck checkin ChangeLog valgrind sigreturn
 LocalWords:  UC gcc DGNULIB POSIXCHECK xml XSLT glr lalr README po runtime rc
 LocalWords:  gnupload gnupg gpg keyserver BDF ncftp filename clearsign cvs dir
 LocalWords:  symlinks vti html lt POSIX Cc'ed

Local Variables:
mode: outline
fill-column: 76
End:
