# How to prepare a Ghostscript release

## Table of contents

> - Introduction
> - Servers
>   - Development sources and bug reports
>   - Distribution
> - Making distributions
>   - Preparing the source code
>   - Testing
>   - Testing on Windows
>   - Finishing up
>   - Beta distributions
>   - Public releases
> - After releasing
> - GNU Ghostscript releases
>   - GNU code
>   - After releasing (GNU)
> - Fonts

For other information, see the Ghostscript overview and the instructions on how to build Ghostscript.

## Introduction

This document describes the process that artofcode LLC, the copyright holder of Ghostscript, uses for making new Ghostscript releases. As time goes on, it will become a more suitable document for others wishing to prepare releases for distribution. Please note that although the Aladdin Free Public License allows anyone to prepare and distribute releases in accordance with its terms and conditions, this document is really meant only for developers working closely with artofcode LLC.

This document is primarily about AFPL Ghostscript releases. See the section on GNU releases below for information on making a GNU Ghostscript release from an existing AFPL Ghostscript release, and the section on fonts for information on releasing font packages.

The release process is evolving. This document is not necessarily up to date in all particulars.

File names below that don't include an explicit subdirectory name are in the `src` subdirectory.

If you do plan to make your own distribution, please be aware of some items you will want to change.

- If you make any significant changes, please edit `gscdef.c` to change `GS_PRODUCTFAMILY` and `GS_PRODUCT` from "AFPL Ghostscript" to something else, in order to avoid confusion with artofcode's releases.
- In the same file, you may also want to edit `GS_COPYRIGHT` to add your own copyright notice (although you must not remove any notice that is there).
- You will almost certainly want to edit `version.mak` to change the revision date, `GS_REVISIONDATE`.
- If you want to change the version number, you must change it in both `version.mak` (`GS_VERSION_`*) and `lib/gs_init.ps` (the integer on a line by itself near the beginning of the file).

## Servers

The AFPL Ghostscript files are maintained on sites accessible to the public. One specific site hosts the active CVS repository for code, data, and documentation, and the bug report data base; several sites offer distributions with version numbers, intended for wider distribution.

### Development sources and bug reports

While we are in the process of transitioning to ghostscript.com, the primary repository for AFPL Ghostscript is still SourceForge (http://sourceforge.net/). Please read the SourceForge AFPL Ghostscript home page (http://sourceforge.net/projects/ghostscript/) first. CVS access information is available at http://cvs.ghostscript.com/.

### Distribution

Stable, beta, and development releases are all available from

> http://sourceforge.net/project/showfiles.php?group_id=1897

Stable releases are also distributed from

> ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/

Development releases are also distributed from

> ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/test/

## Making distributions

This document only discusses source distributions. Source distributions currently can only be made on Linux systems (but it probably wouldn't take much work to support other Unix systems). Ghostscript as distributed also often includes executables or other packages for the Windows and MacOS environments, but artofcode does not produce these, and this document does not discuss them. For more information about Windows packages, please contact `bug-gswin@ghostscript.com`; for more information about MacOS packages, please contact `mac-gs@ghostscript.com`.

To make a source distribution, you will need the scripts and data files in the `toolbin/` directory. You will probably find it convenient to include this directory in the PATH, but the instructions below don't assume that you have done this. To run the scripts, you will need reasonably current versions of Tcl, freely available from Scriptics (`http://www.scriptics.com`), and Python, freely available from `http://www.python.org`.

The instructions below also refer to some files that are deliberately omitted from the public distribution, because they are copyrighted by their authors and not freely redistributable. You will need to provide similar files for your environment.

>     data/*/*.ps (PostScript files) - needed for smoke testing
>     beta.msg - the announcement message for the release

### Preparing the source code

Update references to the date:

- In `version.mak`, the numeric date.
- In `doc/News.htm`, in 3 places, skipping the Id: line.

Also in `doc/News.htm`, update the number of the highest closed bug and the list of open bugs.

Check in `gscdef.c` that the definition of `GS_PRODUCT` includes the appropriate one of "DEVELOPMENT RELEASE", "BETA RELEASE", or neither, and does not include "CVS PRE-RELEASE".

Check for patched configuration parameters, `#define TEST`s, version/date inconsistencies, and mismatches between the working directory and the CVS repository by running:

>     toolbin/pre

This program compares the result of various greps against a check file, writing the results of grep on one output file and the differences from the check file on another. See the source code of `toolbin/pre` for the default file names. The important one is the check file, `toolbin/pre.chk`. `pre` also verifies that the right information is in the following places:

- version number in `man/*.1`, `doc/*.htm`, `version.mak`, `doc/gs-vms.hlp`, `lib/gs_init.ps`
- revision date in `man/*.1`, `doc/*.htm`, `version.mak`, `doc/gs-vms.hlp`
- copyright year (if necessary) in `gscdef.c`
- third-party library version number in `*.mak`

If necessary, run

>     toolbin/pre update

to update the version and revision date in the doc files, and then run

>     toolbin/pre

again. Note: this script currently generates a number of spurious warnings.

Check the consistency of the source code with the makefiles by running:

>     toolbin/gsmake.tcl check

Note that this script seems to generate spurious warnings.

Check that all source and .ps files are documented at least minimally by running:

>     toolbin/hrefcov.tcl +src
>     toolbin/hrefcov.tcl +lib

### Testing

Edit the makefile (presumably `unix-gcc.mak`) to set

>     FEATURE_DEVS=$(FEATURE_DEVS_ALL)
>     COMPILE_INITS=1

This will help catch compilation problems.

Run

>     rm obj/*
>     make -j2 >& t.log

and look for warnings and errors in the log file.

Do a smoke test in a separate window, replacing `/gs` with the name of the development root directory if necessary:

>     unset GS_DEVICE GS_FONTPATH GS_LIB GS_OPTIONS
>     cd /tmp
>     /gs/bin/gs -I/gs/lib -I/gs/fonts -dNOPAUSE -dBATCH /gs/toolbin/smoke.ps | tee t
>     export TEMP=/gs/tmp
>     /gs/bin/gs -I/gs/lib -I/gs/fonts -dNOPAUSE -dBATCH -sDEVICE=bitcmyk\
>       -sOutputFile=/dev/null -r600 -dBufferSpace=50000 /gs/toolbin/smoke.ps | tee t

This reads files named

>     /gs/data/ps/*.ps
>     /gs/data/psl2/*.ps
>     /gs/data/psl3/*.ps
>     /gs/data/test/*.ps

(Edit `toolbin/smoke.ps` ad lib to use other test sets.) Watch for crashes, unusual error messages, or anomalous displayed output. If there are any problems, start over from the beginning of the process.

Undo the `FEATURE_DEVS` and `COMPILE_INITS` edits.

Run

>     cvs commit

to ensure the repository is up to date.

Execute

>     toolbin/cvs2hist.py -v #.## > doc/Changes.htm

This consolidates all the CVS logs since the previous release in a readable format. Note: the cvs2hist.py tool currently in the distribution is not branch-aware. The Changes.htm file for the 7.04 release was made using a patched version, and this command line:

>     cvs2hist.py -j gs7_03 -r-rGS_7_0X -v 7.04 > doc/Changes.htm

Run

>     tclsh
>     % source toolbin/makeset.tcl
>     % makehist

This updates `doc/History#.htm` from `doc/News.htm` and `doc/Changes.htm`. Then run

>     cvs commit

again to check in the Changes and history files.

For the unix source distributions only, generate the configure scripts. From the top level directory, run

>     ./autogen.sh
>     make clean

This should create links to `configure.ac` and `Makefile.in` in the top level directory and invoke autoconf to create the `configure` script.

You should then verify that only autogen.sh, configure, Makefile.in exist as files at the top level. Running ./configure will create a number of files that should not be distributed. 'make clean' may or may not remove these depending on the version.

Make the source archives with

>     tclsh
>     % source toolbin/makeset.tcl
>     % maketars

This creates the files

>     ghostscript-#.##.tar.gz (main archive)
>     ghostscript-#.##.tar.bz2 (main archive)

### Testing on Windows

For Windows testing, you will need, in addition to the files listed under "Preparing the source" above:

>     toolbin/makewin (link to makeset.tcl)

The following procedures rely on a large number of MS-DOS batch scripts that are not discussed here: they are unlikely to be generally useful.

Mount the Windows partition on `/c`, and create the `/c/work` directory if needed.

Make the zip archive of all files needed for a Windows build, and copy it to the Windows partition:

>     toolbin/makewin
>     cp gs###.zip /c/work

Boot into Windows. Unpack the archive:

>     cd \work
>     unzip -oq gs###.zip
>     gs###

The `gs###.bat` script creates some necessary directories, sets up `PATH` and `GS_LIB` for testing, and makes the `gs#.##` directory current.

Build with the Borland compiler:

>     config bcwin32
>     copy /y /b ..\gs\makefile
>     erase obj\*.*
>     make > bc.log

Smoke test the executables (both `gswin32` and `gswin32c`), as described above for source distributions. Then build with the Microsoft compiler:

>     config msvc32
>     copy /y /b ..\gs\makefile
>     erase obj\*.*
>     nmake > msvc.log

Smoke test these executables too.

Building with the Watcom compiler doesn't work, because the `wmake` or `wmakel` program runs out of memory. However, if it did work, this is how to do it:

>     config watcw32
>     copy /y /b ..\gs\makefile
>     erase obj\*.*
>     wmake -u > watc.log

Boot back into Linux. If testing in Windows revealed problems, edit the source files as necessary, and go back to "Preparing the source code."

### Finishing up

If you are maintaining local master copies, execute

>     toolbin/makemaster

This creates a `master/###` directory if necessary, and moves the archives to it.

Tag the source files with the release number by executing

>     cvs tag gs#_##

Upload `ghostscript-#.##.tar.*` to SourceForge (by anonymous FTP to `download.sourceforge.net`, directory `/incoming`), and then post it using the "File Release" facility in the AFPL Ghostscript project. If this is a test release, put it in the `gs-test` module, otherwise put it in the `ghostscript` module. If you are adding Windows executables to an existing source release, please use the same release date as the source release, not the current date.

If `ansi2knr.c` has changed, put it on `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/ansi2knr.c`.

If `doc/C-style.htm` has changed, put it on `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/C-style.htm`.

### Beta distributions

Do the steps for distributions in general.

Upload `ghostscript-#.##.tar.*` to `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/test`.

Construct the e-mail announcement by editing `beta.msg`. Mail using:

>     To: gs-test

### Public releases

Update the title (current version #), first heading (previous version #), and "new features" and "known problems" lists in `doc/Current.htm`.

Do the steps for distributions in general.

Create a directory at `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/gs###/`. In that directory, store the following files:

- Standard distribution files:

  >     ghostscript-#.##.tar.gz
  >     ghostscript-#.##.tar.bz2

- MS Windows source and executables:

  >     gs###src.zip
  >     gs###w32.exe
  >     gs###w32.zip

- Third-party libraries, as links (upload these if not installed), where `$$$` et al. refer to the version number of the library, which should be the latest compatible release of the library and must be consistent with the values of `JVERSION` and `PVERSION` in the makefiles:

  >     jpegsrc.v$$.tar.gz -> ../../3rdparty/jpegsrc.v$$.tar.gz
  >     libpng-$.$.$.tar.gz -> ../../3rdparty/libpng-$.$.$.tar.gz
  >     zlib-$.$.$.tar.gz -> ../../3rdparty/zlib-$.$.$.tar.gz
  >     jpegsr$$.zip -> ../../3rdparty/jpegsr$$.zip
  >     lpng$$$.zip -> ../../3rdparty/lpng$$$.zip
  >     zlib$$$.zip -> ../../3rdparty/zlib$$$.zip

  In any case, the names of the links in the distribution directory should reflect the original name of the upstream file.
- Fonts, where `$.$$` refers to the most recent version number of the fonts:

  >     ghostscript-fonts-other-$.$.tar.gz -> ../fonts/ghostscript-fonts-other-$.$.tar.gz
  >     ghostscript-fonts-std-$.$.tar.gz -> ../fonts/ghostscript-fonts-std-$.$.tar.gz

(Note that the link names are somewhat inconsistent: some of them retain the version number of the file being referenced, and some of them use the Ghostscript version number. This is a historical artifact that might be changed someday.)

E-mail the release announcement using:

>     To: gs-announce

Edit the Web pages in cvs and commit to reflect the new release. The Wisconsin server should update automatically.

## After releasing

Update the version number by incrementing it:

- In `lib/gs_init.ps`, at the very beginning of the file.
- In `version.mak`, in 3 definitions.
- In `doc/News.htm`, in 4 places.

In `gscdef.c`, edit the definition of `GS_PRODUCT` to include "CVS PRE-RELEASE".

Edit `doc/News.htm` to remove all the content.

## GNU Ghostscript releases

artofcode LLC re-releases each tested AFPL Ghostscript version with the GPL, as GNU Ghostscript, when the next tested AFPL Ghostscript version comes out.

Note: This section is completely out of date. We no longer use toolbin/makegnu to automatically create the GNU releases.

### GNU code

To make a GNU Ghostscript release from AFPL Ghostscript release #.##, run

>     toolbin/makegnu #.##

This reads the files

>     /gs/master/#.##/ghostscript-#.##.tar.gz
>     /gs/master/#.##/ghostscript-#.##gnu.tar.gz

and creates the file

>     /tmp/gnu-gs-#.##.tar.gz

Note that the `makegnu` script uses a program called `copyrite` that rewrites the copyright notices. The `copyrite` program is intentionally not distributed with Ghostscript.

Upload the file `/tmp/gnu-gs-#.##.tar.gz` to `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu/gs#.##/`. Delete the file after uploading.

### After releasing (GNU)

E-mail the full URL and the `md5sum` of the new archive(s) to `ftp-upload@gnu.org`.

## Fonts

artofcode LLC distributes a package of the base 35 PostScript fonts, and a package of other miscellaneous fonts. As with the Ghostscript code, each package is released both with the AFPL and with the GPL; however, unlike the Ghostscript code, artofcode releases these versions simultaneously rather than with a one-version delay.

To make the font packages, run the command

>     toolbin/makefonts #.##

This creates the following files:

>     ghostscript-fonts-std-#.##.tar.gz
>     ghostscript-fonts-other-#.##.tar.gz
>     gnu-gs-fonts-std-#.##.tar.gz
>     gnu-gs-fonts-other-#.##.tar.gz

The first two of these use the AFPL, and should be uploaded to `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/AFPL/fonts/`. The other two use the GPL, and should be uploaded to `ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu/fonts/`. For the GNU release, also see "After releasing (GNU)".

Copyright © 1999, 2000 Aladdin Enterprises. All rights reserved.

This file is part of AFPL Ghostscript. See the Aladdin Free Public License (the "License") for full details of the terms of using, copying, modifying, and redistributing AFPL Ghostscript.

Ghostscript version 7.04, 31 January 2002