How to prepare a new release
----------------------------

. include/freetype/freetype.h: Update `FREETYPE_MAJOR`,
  `FREETYPE_MINOR`, and `FREETYPE_PATCH`.

. Update version numbers in all files where necessary (for example, do
  a grep for both '2.10.4' and '2104' for release 2.10.4).

. builds/unix/configure.raw: Update `version_info`.

. docs/CHANGES: Document differences to last release.

. README: Update.

. docs/VERSIONS.TXT: Document changed `version_info`.

. ChangeLog: Announce new release (both in the 'freetype' and
  'freetype-demos' repositories).

. Clone the git archive to another directory with

    git clone -l -s . ../freetype.test

  or something like this and run

    make distclean; make devel; make
    make distclean; make devel; make multi
    make distclean; make devel CC=g++; make CC=g++
    make distclean; make devel CC=g++; make multi CC=g++

    sh autogen.sh
    make distclean; ./configure; make
    make distclean; ./configure CC=g++; make

  in the cloned repository to test compilation with both gcc and g++.

. Test C++ compilation for 'freetype-demos' too (using `git clone` as
  above).

. Run `src/tools/chktrcmp.py` and check that there are no undefined
  `trace_XXXX` macros.

. After pushing the new release, tag the git repositories ('freetype',
  'freetype-demos') with

    git tag VER-<version> -m "" -u <committer>

  and push the tags with

    git push --tags

. Check with

    git clean -ndx

  that the git directory is really clean (and remove extraneous files
  if necessary).

. Say `make dist` in both the 'freetype' and 'freetype-demos'
  repositories to generate the `.tar.gz`, `.tar.xz`, and `.zip` files.

. Create the doc bundles (`freetype-doc-<version>.tar.gz`,
  `freetype-doc-<version>.tar.xz`, `ftdoc<version>.zip`).  This is
  everything in

    <freetype-web git repository>/freetype2/docs

  except the `reference` subdirectory.  Do *not* use option `-l` from
  zip!

. Run the following script (with updated `$VERSION`, `$SAVANNAH_USER`,
  and `$SOURCEFORGE_USER` variables) to sign and upload the bundles to
  both Savannah and SourceForge.  The signing code has been taken from
  the `gnupload` script (part of the 'automake' bundle).

    #!/bin/sh

    VERSION=2.10.4
    SAVANNAH_USER=wl
    SOURCEFORGE_USER=wlemb

    #####################################################################

    GPG='/usr/bin/gpg --batch --no-tty'

    version=`echo $VERSION | sed "s/\\.//g"`

    FREETYPE_PACKAGES="freetype-$VERSION.tar.gz \
                       freetype-$VERSION.tar.xz \
                       ft$version.zip"
    FT2DEMOS_PACKAGES="ft2demos-$VERSION.tar.gz \
                       ft2demos-$VERSION.tar.xz \
                       ftdmo$version.zip"
    FTDOC_PACKAGES="freetype-doc-$VERSION.tar.gz \
                    freetype-doc-$VERSION.tar.xz \
                    ftdoc$version.zip"

    PACKAGE_LIST="$FREETYPE_PACKAGES \
                  $FT2DEMOS_PACKAGES \
                  $FTDOC_PACKAGES"

    set -e
    unset passphrase

    PATH=/empty echo -n "Enter GPG passphrase: "
    stty -echo
    read -r passphrase
    stty echo
    echo

    for f in $PACKAGE_LIST; do
      if test ! -f $f; then
        echo "$0: Cannot find \`$f'" 1>&2
        exit 1
      else
        :
      fi
    done

    for f in $PACKAGE_LIST; do
      echo "Signing $f..."
      rm -f $f.sig
      echo $passphrase | $GPG --passphrase-fd 0 -ba -o $f.sig $f
    done

    FREETYPE_SIGNATURES=
    for i in $FREETYPE_PACKAGES; do
      FREETYPE_SIGNATURES="$FREETYPE_SIGNATURES $i.sig"
    done

    FT2DEMOS_SIGNATURES=
    for i in $FT2DEMOS_PACKAGES; do
      FT2DEMOS_SIGNATURES="$FT2DEMOS_SIGNATURES $i.sig"
    done

    FTDOC_SIGNATURES=
    for i in $FTDOC_PACKAGES; do
      FTDOC_SIGNATURES="$FTDOC_SIGNATURES $i.sig"
    done

    SIGNATURE_LIST="$FREETYPE_SIGNATURES \
                    $FT2DEMOS_SIGNATURES \
                    $FTDOC_SIGNATURES"

    scp $PACKAGE_LIST $SIGNATURE_LIST \
      $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/

    rsync -avP -e ssh $FREETYPE_PACKAGES $FREETYPE_SIGNATURES \
      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/
    rsync -avP -e ssh $FT2DEMOS_PACKAGES $FT2DEMOS_SIGNATURES \
      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-demos/$VERSION/
    rsync -avP -e ssh $FTDOC_PACKAGES $FTDOC_SIGNATURES \
      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-docs/$VERSION/

    # EOF

. Prepare a `README` file for SourceForge and upload it with the
  following script (with updated `$VERSION` and `$SOURCEFORGE_USER`
  variables).

    #!/bin/sh

    VERSION=2.10.4
    SOURCEFORGE_USER=wlemb

    #####################################################################

    rsync -avP -e ssh README \
      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/

    # EOF

. On SourceForge, tag the just uploaded `ftXXX.zip` and
  `freetype-XXX.tar.xz` files as the default files to download for
  'Windows' and 'Others', respectively.

. Copy the reference files (generated by `make dist`) to

    <freetype-web git repository>/freetype2/docs/reference

. Update the 'freetype-web' repository.  `git push` then automatically
  triggers an update of the public web pages within ten minutes due to
  a cron script (on 'wl@freedesktop.org') that rsyncs with

    freedesktop.org://srv/freetype.freedesktop.org/www

. Announce new release on 'freetype-announce@nongnu.org' and to
  relevant newsgroups.

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

Copyright (C) 2003-2021 by
David Turner, Robert Wilhelm, and Werner Lemberg.

This  file is  part of  the FreeType  project, and  may only  be used,
modified,  and distributed  under the  terms of  the  FreeType project
license,  LICENSE.TXT.  By  continuing to  use, modify,  or distribute
this file you  indicate that you have read  the license and understand
and accept it fully.


--- end of release ---
