		README for MAKING BINUTILS RELEASES

This is a collection of notes on how to perform a binutils release.  A
lot of this information can also be found in the maintain.texi file in
the gnulib project:

  https://www.gnu.org/software/gnulib/

It is useful to have a cloned copy of the sources of this project as
it also contains an upload script used to install tarballs on the GNU
FTP server.

Make sure that you have upload authority on sourceware and fencepost.
Beware - this is an involved process and can take weeks to complete.
See the maintain.texi file for details on how to obtain these
permissions.

-------------------------------------------------
How to perform a release.
-------------------------------------------------

  1. Send an email out warning contributors about the forthcoming
     branch.  Set a date for the branch (weekends are better because
     they are less busy).

  2. When the branch date is near:  Update the libiberty and config
     directories and the top level configure files.

  3. When branch day arrives add markers for the upcoming release to
     the NEWS files in gas, ld, gold and binutils.

     Likewise for the ChangeLog files in: bfd, binutils, config, cpu,
     elfcpp, gas, gold, gprof, include, ld, opcodes and toplevel.

     Add a note of the name of the new branch to binutils/BRANCHES.

     Commit these changes.

  4. Create the release branch using:

	git branch binutils-2_33-branch
        git push origin binutils-2_33-branch

     If you get a message like:
     
       remote: fatal: Invalid revision range 0000000000000000000000000000000000000000..f974f26cb16cc6fe3946f163c787a05e713fb77b
       
     It appears that this can be ignored...

  5. Make sure that the branch is there.  IE check out the branch sources:
  
        git clone ssh://sourceware.org/git/binutils-gdb.git -b binutils-2_33-branch 2.33

     If you get a message about being in a "detached head" state, something
     has gone wrong...

     Keep the checked out sources - they are going to be needed in future
     steps.

  6. Update "BINUTILS_BRANCH" in gdbadmin's crontab:

     Log in as gdbadmin on sourceware.org, and then:

        $ cd crontab
        $ vi crontab
        [change BINUTILS_BRANCH]
        $ cvs ci crontab
        $ crontab crontab

     If you do not have access to this account, please feel free to
     ask Joel Brobecker <brobecker AT adacore DOT com>.

  7. Rename the current HEAD version entry in Bugzilla, and create a
     new one.  E.g. rename "2.33 (HEAD)" to 2.33, and create "2.34
     (HEAD)":
     
        https://sourceware.org/bugzilla/editversions.cgi?product=binutils

  8. Update bfd/version.m4 on HEAD to indicate that is now a snapshot
     of the next release:
     
       m4_define([BFD_VERSION], [2.33.51])
       
     Update the release number in bfd/version.m4 for the branch.
     The branch only needs the point value set to 90 as the release
     has not actually happened yet.

       m4_define([BFD_VERSION], [2.32.90])

     Regenerate various files on both branch and HEAD by configuring
     with "--enable-maintainer-mode --enable-gold" and then building
     with "make all-binutils all-gas all-gold all-gprof all-ld"

     Add ChangeLog entries for the updated files.  Commit the changes.
     Make sure that this includes the .pot files as well as the
     configure and makefiles.

  8. Create an initial pre-release:

     a. Remove any auto-generated files, in order to force the
        src-release script to rebuild them.
	 
          cd <branch-sources>
          git clean -fdx .
	  
     b. Create a source tarball of the BRANCH sources:

          ./src-release -x binutils

     c. Build a test target using this tarball.

           cp binutils-<version>.tar.xz /dev/shm
	   cd /dev/shm
	   tar xvf binutils-<version>.tar.xz
	   mkdir build
	   cd build
	   ../<version>/configure --quiet --enable-gold
	   make

        If there are problems, fix them.

     d. Upload the pre-release snapshot to the sourceware FTP site:

          cd <branch-sources>
          scp binutils-<version>.tar.xz sourceware.org:~ftp/pub/binutils/snapshots
          ssh sourceware.org md5sum ~ftp/pub/binutils/snapshots/binutils-<version>.tar.xz

     e. Clean up the source directory again.

         git clean -fdx .

   9. Tell the Translation Project where to find the new tarball.
      <coordinator@translationproject.org>
      qv: http://translationproject.org/html/maintainers.html

------------------------------------------------------------------------
Dear Translation Project

  The 2.3x release branch has been created for the FSF binutils.

  A snapshot of the branch sources can be found here:

    https://sourceware.org/pub/binutils/snapshots/binutils-2.3x.90.tar.xz

  We hope to make the official release of the sources on the 8th July
  although that could change if there are important bugs that need to
  be fixed before the release.
------------------------------------------------------------------------

  10. Announce the availability of the snapshot and the branch on the
      binutils mailing list.  Set a date for when the release will
      actually happen.  Something like:
      
------------------------------------------------------------------------
Hi Everyone, 

  The 2.3x branch has now been created:

     git clone git://sourceware.org/git/binutils-gdb.git -b binutils-2_3x-branch 2.3x

  A snapshot of the sources is also available here:

    https://sourceware.org/pub/binutils/snapshots/binutils-2.3x.90.tar.xz

  Please could all patches for the branch be run by me.
  The rules for the branch are:

    * No new features.
    * Target specific bug fixes are OK.
    * Generic bug fixes are OK if they are important and widely tested.
    * Documentation updates/fixes are OK.
    * Translation updates are OK.
    * Fixes for testsuite failures are OK.

  Ideally I would like to make the release happen in two weeks time,
  i.e. Saturday 27th Jan.  Which I hope will be enough time for everyone
  to get their final fixes in.
------------------------------------------------------------------------

  11. Build various different toolchains, test them and nag
      maintainers to fix any testsuite failures for their
      architectures...


When the time comes to actually make the release....


  20. Make sure that the branch sources still build, test and install 
      correctly.  Make sure that the sources are clean, without any
      patch files (.reg .orig *~) left over.

         cd <branch>
	 git clean -dfx .

  21. Update the release number in bfd/version.m4 on the release
      branch to a whole new minor version number, without a point
      value.  Eg "2.29.90" becomes "2.30".  Change bfd/development.sh
      to set all values to "false".  Regenerate the configure and
      makefiles.  And *info* files.  Add ChangeLog entries for the
      updates and add a  "this-is-the-2.3x-release" comment and
      commit.

  22. Check that your file creation mask will create the
      correct file permissions.  Eg:

      	    % umask
	    22

      Remove any spurious autom4te.cache files left over from the
      reconfiguring:

            % find . -depth -name autom4te.cache -exec rm -r {} \;

  23. Note - check to see if any new files have been added to the top
      level of the source directory, but which are not in the
      DEVO_SUPPORT variable in the src-release.sh script.  If they are
      needed then add them.

       Create the release tarballs:
  
            ./src-release.sh -b -g -l -x binutils

  24. Check that the files in the tarballs have the correct
      permissions. 

  25. Sanity check the release on x86_64-pc-linux-gnu by building and
      running the testsuites (gas, gold, binutils and ld).  Make the
      source directory read-only before building.  Also test
      "make install".  If necessary fix any problems.

  26. Tag the branch with the new release number:

            git tag -a binutils-2_3x
	      [optional: add "-u XXXXX" to sign with a gpg key]
	    git push origin binutils-2_3x

        NB/ If you do sign the binaries make sure to use a key
	that has been published with the FSF.

  27. Upload the tarballs to ftp.gnu.org.

       gnupload --to ftp.gnu.org:binutils binutils-2.3x.tar.*

      The gnupload script is in the gnulib/build-aux directory.

      Check for an email response from the upload.  If necessary
      fix any problems.

  28. Upload the tarballs (and signatures) to sourceware.org:

       sftp sourceware.org
         cd /sourceware/ftp/pub/binutils/releases
 	 put binutils-2.3x.tar.*
 	 chmod 644 binutils-2.3x.tar.*
	 quit

      FIXME: Should the signatures (created by the gnupload script in
      step 29) be uploaded as well ?

  29. Update web pages.  For sourceware.org:

      Create a new documentation folder on the sourceware.org web
      pages as /sourceware/www/sourceware/htdocs/binutils/docs-2.3x.

       sftp sourceware.org
         cd /sourceware/www/sourceware/htdocs/binutils
	 mkdir docs-2.3x
	 cd docs-2.3x
	 mkdir as bfd binutils gprof ld
	 cd ../docs-2.3(x-1)
	 get index.html

      Update the (local copy of the) index.html file to point to the
      new documentation and mention the new version and then upload it.

	 cd ../docs-2.3x
	 put index.html

      Make the html documentation locally with the "make html" command
      and then upload and rename the directories as needed.  (sftp
      does not appear to support recursive uploads however, so the
      directories will have to be made by hand).

         cd as
	 lcd <build-dir>/gas/doc/as.html
	 put *
	 cd ../bfd
	 lcd ../../../bfd/doc/bfd.html
	 put *
	 cd ../binutils
	 lcd ../../../binutils/doc/binutils.html
	 put *
	 cd ../gprof
	 lcd ../../../gprof/gprof.html
	 put *
	 cd ../ld
	 lcd ../../ld/ld.html
	 put *
	 
      Edit the top level binutils index.html file to change the links
      to the new documentation.

         cd ../../..
	 get index.html
	 [edit]
	 put index.html
	 quit

      Check that the new web page is correct.

      For the www.gnu.org site you have to email webmasters@gnu.org
      and ask them to make the change(s).

  30. Send emails to binutils@sourceware.org, info-gnu@gnu.org and
      David Edelsohn <dje.gcc@gmail.com> announcing the new release.
      Sign the email and include the checksum.
      (The email to Davis is so that he can update the GNU Toolchain
      social media).  Something like this:
      -----------------------------------------------------------------------
        Hi Everyone,

        We are pleased to announce that version 2.3x of the GNU Binutils project
        sources have been released and are now available for download at:

          https://ftp.gnu.org/gnu/binutils
          https://sourceware.org/pub/binutils/releases/

          checksums: xxxx

       This release contains numerous bug fixes, and also the
       following new features:

          <extract info from the NEWS files>

       Our thanks go out to all of the binutils contributors, past and
       present, for helping to make this release possible.

      -----------------------------------------------------------------------

  31. Clean up the source tree:

        git clean -fdx .

  32. Edit bfd/development.sh on the branch and set the development flag
      to "true".  (Leave the experimental flag set to "false").  Also bump
      the version in bfd/version.m4 by adding a trailing .0, so that the
      date suffix keeps the version lower than the trunk version.
      Regenerate files.  Commit these changes.

  33. Email the binutils list telling everyone that the 2.3x branch
      is now open for business as usual and that patched no longer
      need special approval.

  34. Examine the bfd/config.bfd file and move any pending obsolete
      targets into the definitely obsolete section.  Create a
      changelog entry and commit.
      
-------------------------------------------------
How to perform a point release.
-------------------------------------------------

A point release is easier than a normal release since a lot of the
work has already been done.  The branch has been created, the
translations updated and the documentation uploaded.  So the procedure
looks like this:

  0. Decide that a point release is necessary.

     Usually this only happens when a sufficient number of serious
     bugs have been found and fixed since the previous release, and a
     new official release is not imminent.

  1. Tell the community that a point release is happening.  Ask
     maintainers to ensure that their ports are up to date on the
     release branch.  Ask the community if there are any bug fixes
     which are missing from the branch.  Allow some time for the
     responses to this step.

  2. Make sure that the branch sources build, test and install
     correctly.

  2.5 Prepare a list of the bugs which have been fixed.  This
      will be needed for step 8.

  3. In the branch sources:

       a. Update the minor release number in bfd/version.m4.
       b. Edit bfd/development.sh, set "development=false".
       c. Regenerate the configure files.
       c.1. Remove spurious autom4te.cache files:

          find . -depth -name autom4te.cache -exec rm -r {} \;
	  
       d. Commit the updates along with a "this-is-the-2.3x.y-release"
          note in all of the changelogs.
       e. Tag the branch with the new release number:

            git tag -a binutils-2_3x_y
	      [optional: add "-u XXXXX" to sign with a gpg key]
	    git push origin binutils-2_3x_y

       f. Check that your file creation mask will create the
          correct file permissions.  Eg:

	    umask 022

       g. Create the release tarballs:
       
            ./src-release -b -g -l -x binutils

       h. Check that the files in the tarballs have the correct
          permissions.

       i. Edit bfd/development.sh and set "development=true".
       j. Commit this change into the git repository.
       k. Clean up the source tree.
       
            git clean -dfx .

  4. [If paranoid - upload the tarballs to one of the FTP servers and
      ask people to test it before going on to step 5].

  5. Upload the tarballs to ftp.gnu.org.

       gnupload --to ftp.gnu.org:binutils binutils-2.3x.y.tar.*

     The gnupload script is in the gnulib/build-aux directory.

  6. Upload the tarballs to sourceware.org:

       sftp sourceware.org
         cd /sourceware/ftp/pub/binutils/releases
 	 put binutils-2.3x.y.tar.*
 	 chmod 644 binutils-2.3x.y.tar.*
	 quit

    It is OK to upload the signatures as well.

  7. Update web pages.  For sourceware.org:

      * Log on to sourceware.org
      * Go to /sourceware/www/sourceware/htdocs/binutils
      * Edit index.html

      For the www.gnu.org site you have to email webmasters@gnu.org
      and ask them to make the change(s).

  8. Send an emails to the binutils list, info-gnu@gnu.org and
     David Edelsohn <dje.gcc@gmail.com> announcing the new release.
     (The email to Davis is so that he can update the GNU Toolchain
     social media).  Something like this:
------------------------------------------------------------------------
Hi Everyone,

  We are pleased to announce that version 2.3x.y of the GNU Binutils
  project sources have been released and are now available for download at:

    https://ftp.gnu.org/gnu/binutils
    https://sourceware.org/pub/binutils/releases/

  This is a point release over the previous 2.3x version, containing bug
  fixes but no new features.

  Our thanks go out to all of the binutils contributors, past and
  present, for helping to make this release possible.

  Here is a list of the bugs that have been fixed:
    xx
    xx
    xx
    xx
--------------------------------------------------------------------------


Copyright (C) 2017-2019 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.
