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

. 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 CC=g++; make

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

  Note that it is normally not necessary to test standard C
  compilation with the `configure`, `meson`, and `cmake` build tools
  since this is done by the CI process of 'gitlab.freetype.org' for
  every commit.

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

. Trigger the automatic generation of the online API reference by
  updating the `FT_VERSION` variable in file `.gitlab-ci.yml` of the
  'freetype-web' repository.

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

  - SHA256 checksums of all files,
  - instructions how to verify the bundles using the `.sig` file data,
  - the PGP public key used to sign the archives.

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

Copyright (C) 2003-2022 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 ---
