How to Prepare a Ghostscript Release¶
Introduction¶
This document describes the process for making new Ghostscript releases. Please note that while the the license allows anyone to prepare and distribute releases in accordance with its terms and conditions, this document is really meant only to document the process used by Artifex Software, Inc. However, the eventual purpose of this document is to describe Ghostscript release procedures in enough detail that someone who knows little about Ghostscript but is generally familiar with the platform on which the procedure is being carried out can execute the procedures correctly. So if you add or changing anything to/in this document, be sure to specify all command lines, file names, etc. in explicit detail.
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
base/gscdef.c
to changeGS_PRODUCTFAMILY
andGS_PRODUCT
from “GPL Ghostscript” to something else, in order to avoid confusion with Artifex 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 release number, you must change it in all the places listed under Release numbering below.
Servers¶
The GPL Ghostscript files are maintained on sites accessible to the public. One specific site hosts the active SVN repository for code, data, and documentation, and the bug report data base; several sites offer distributions with release numbers, intended for wider distribution.
Development sources and bug reports¶
The primary repository for GPL Ghostscript is ghostscript.com. Please check there first for any news about releases or current work, and for information about where to download ghostscript and how to access the mailing lists. Development source access is through svn.ghostscript.com.
Distribution¶
Stable, beta, and development releases are all available from ghostscript.com/releases.
Release numbering¶
Ghostscript uses a two-part (major.minor) release number. The second part of the release number is a 2-digit decimal fraction: it counts 00, 01, 02, and so on through 99.
- Release numbers N.0x and N.5x indicate stable versions.
- Successive increments generally indicate bug fixes and minor enhancements.
- Development, testing and beta releases generally begin with a minor release number that is a multiple of ten and increment from there.
Release numbers appear in the following places in the Ghostscript files:
- In
Resource/Init/gs_init.ps
, as an integer (release number x100) at the beginning of the file just after the initial comment blocks. - In
base/version.mak
, split into 3 lines. - In
doc/src/News.rst
, in the header and mentioned in the Changelog link. - In
doc/src/footer.rst
, after the copyright notes.
Before a release¶
The current release number in the development code must be set to the desired value. The increment from just after the previous release (see below) is sufficient for minor updates. In the case of major changes or a new stable release, the number will need to be bumped; this is generally done as the first step of preparing a new release.
After a release¶
After making a release the release number in the repository is incremented. Thus versions built from svn are always marked with a future (or unused) release number to avoid confusion.
Additionally, After an N.00 or N.50 stable release, a branch is made in svn so that development can continue independently of changes to the stable series. When this happens, the minor release number is incremented by 10 (or 20) on the development branch (and by 1 on the new stable branch, as above) to avoid collisions.
While incrementing the release number after making a release may seem counter-intuitive, it ensures that, at any given time, the version number alone is sufficient to distinguish between the current SVN state and a numbered release.
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 upstream does not always produce these, and this document does not discuss them.
To make a source distribution, you will need the scripts and data files in the toolbin/
directory. The instructions below generally assume that you’re invoking the relative to the top level of the source tree. To run the scripts, you will need reasonably current versions of Tcl and Python.
The instructions below also refer to some files that are deliberately omitted from the public distribution, because they are not freely redistributable. You will need to provide similar files for your environment.
data/*/*.ps
(PostScript files) - needed for smoke testing
Preparing the source code¶
If necessary, update the release number by incrementing it as described in Release numbering above.
Update references to the date for release:
- In
version.mak
, the numeric date. - In
doc/src/News.rst
, in the page header. - In
doc/src/footer.rst
, after the copyright notes. - In
psi/dwsetup.rc
andpsi/winint.mak
, update the year in the embedded copyright notice.
We recommend using a UTC release date to avoid timezone skew.
Also in doc/src/News.rst
, update the release notes.
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 “SVN PRE-RELEASE”.
Run the source-consistency checks from the test suite:
toolbin/tests/check_all.py --gsroot=.
Where the argument of --gsroot
is the path to the top level of the source tree. Fix any problems it indicates, and commit them to svn.
Check for patched configuration parameters, #define TESTs
, version/date inconsistencies, and mismatches between the working directory and the SVN repository by running:
toolbin/pre.tcl
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 for the default file names. The important one is the check file, toolbin/pre.chk
. pre.tcl
also verifies that the right information is in the following places:
- release number in
man/*.1
,doc/*.htm
,version.mak
,doc/gs-vms.hlp
,Resource/Init/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.tcl update
to update the version and revision date in the doc files, and then, again. run:
toolbin/pre.tcl
To confirm that everything is updated. You may have to commit to svn after the update to satify the script that all the dates are correct.
Check the consistency of the source code with the makefiles by running:
toolbin/gsmake.tcl check
This script assumes the top level makefile
is named ‘makefile’.
Fix any problems and commit to svn.
Testing¶
Edit your top-level Makefile
to set:
FEATURE_DEVS=$(FEATURE_DEVS_ALL)
COMPILE_INITS=1
This will help catch compilation problems.
Run:
rm obj/*
make -j2 >& make.log
and look for warnings and errors in the log file.
Do a smoke test, updating the example paths as necessary:
unset GS_DEVICE GS_FONTPATH GS_LIB GS_OPTIONS
./bin/gs -I./lib -I./fonts -dNOPAUSE -dBATCH toolbin/smoke.ps
./bin/gs -I./lib -I./fonts -dNOPAUSE -dBATCH -sDEVICE=bitcmyk\
-sOutputFile=/dev/null -r600 -dBufferSpace=200000 toolbin/smoke.ps
This reads files named:
data/misc/*.ps
data/ps/*.ps
data/psl2/*.ps
data/psl3/*.ps
(Edit toolbin/smoke.ps
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:
svn commit
to ensure the repository is up to date.
Updating the changelog¶
Create a new changelog by running:
svn log -rHEAD:rev --xml --verbose > doc/changelog.xml
Where rev
is the revision number of the branch point for the previous release.
This consolidates all the commit logs since the previous release in a readable format. You may also wish to remap user names in the <author/>
tags of the output to the real names of the developers.
Making the source distribution¶
First, tag the versions of the files in svn with the release version number.
svn cp svn+ssh://svn.ghostscript.com/svn/ghostscript/trunk/gs \
svn+ssh://svn.ghostscript.com/svn/ghostscript/tags/ghostscript-#.##
If you’ve already tagged this release (e.g. in making an earlier release candidate) you’ll need to svn rm the old tree first. We recommend just appending ‘rcn’ to the end of release candidate tag names, or a ‘.n’ tiny release number to post-release fixes.
Pull a fresh copy for distribution from the repository:
svn export http://svn.ghostscript.com/ghostscript/tags/ghostscript-#.##
Generate the text versions of the README
document:
cd ghostscript-#.##
lynx -dump -nolist doc/Readme.htm > doc/README
Add copies of needed third-party libraries for the release. Versions of the normally required ones are included in the repository so this is only needed when doing special feature releases.
For the unix source distributions only, generate the configure scripts. From the top level directory, run:
./autogen.sh
make distclean
This should create links to configure.ac
and Makefile.in
in the top level directory and invoke autoconf
to create the configure script.
Also run make distclean
in the jasper subdir
to clean up any incidental config there. If you get a warning, for example if the build files think they need updating and not all the tools are available, be sure to run autoreconf
&& make distclean
to avoid version skew issues. You may also need to manually remove the autom4te.cache
directory.
Move back to directory containing the distribution code and make the source archives with:
tar cvzf ghostscript-#.##.tar.gz ghostscript-#.##/*
zcat ghostscript-#.##.tar.gz | bzip2 -c > ghostscript-#.##.tar.bz2
This creates the files:
ghostscript-#.##.tar.gz (main archive)
ghostscript-#.##.tar.bz2 (main archive)
The important issue is that the tarballs unpack into a directory of the same name, and that the code be a pristine copy without build or .svn housekeeping files.
It is also customary to make a gs###src.zip
archive for the convenience of Windows developers. See below.
Testing on Windows¶
For Windows testing, you will need, in addition to the files listed under Preparing the source code above:
toolbin/makewin.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.
Building the Windows distribution¶
Extract the sources from ghostscript-N.NN.tar.gz
then repackage in a zip file as follows:
zip -r temp.zip gsN.NN/LICENSE gsN.NN/doc gsN.NN/examples gsN.NN/icclib gsN.NN/ijs gsN.NN/jasper gsN.NN/jbig2dec gsN.NN/jpeg gsN.NN/lib gsN.NN/libpng gsN.NN/base gsN.NN/psi gsN.NN/Resource gsN.NN/zlib
Unzip converting the line endings to CRLF:
unzip -a temp.zip
del temp.zip
Then finally zip up the sources to the distribution file:
zip -9 -r -X gsNNNsrc.zip gsN.NN
This method is reasonably portable, and does not convert binary files such as examples/annots.pdf
.
Unzip gsNNNsrc.zip
. The directory must be named gsN.NN
.
Extract the fonts ghostscript-fonts-std-#.##.tar.gz
into a directory fonts adjacent to the gsN.NN
directory. The fonts are needed in this location for building the distribution archive later.
You will need the command line Info-Zip zip program. Alternatively, the command line version of WinZip (wzzip.exe) can be used by replacing the Info-Zip command line options -9 -r
with -ex -P
in winint.mak
.
You will need WinZip Self-Extractor for building the self extracting archive. This is commercial software. You may need to update the path WINZIPSE_XE
in winint.mak
.
Unzip the jpeg, libpng and zlib libraries, then make Ghostscript as documented in How to Build Ghostscript from Source Code.
Run the command nmake
archive. This builds the distribution archive gsNNNw32.exe
and an ordinary zip file gsNNNw32.zip
in the parent directory. If you do not have WinZip Self-Extractor, you can use nmake zip to make gsNNNw32.zip
only.
Starting with Ghostscript 9.x (Summer 2010), nmake nsis
(msvc) or make nsis
(Borland) builds an nsis-based installer gsNNNw32.exe
. This requires Nullsoft Scriptable Install System. You may need to update the path MAKENSIS_XE
in winint.mak
.
Finishing up¶
Upload ghostscript-#.##.tar.*
to SourceForge (by anonymous FTP to upload.sourceforge.net
, directory /incoming
), and then post it using the “File Release” facility in the Ghostscript project. Put the release in the appropriate package, usually “GPL Ghostscript”. If you are adding executable builds or source archives for other platforms to an existing source release, please use the same release date as the source release, not the current date.
Beta distributions¶
Do the steps for distributions in general.
Upload ghostscript-#.##.tar.*
to ghostscript.com/releases.
Public releases¶
Do the steps for distributions in general.
MS Windows source and executables:
gs###w32.exe
gs###w64.exe
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 should be consistent with the values of and version numbers specifically listed 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::
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 release number. This is a historical artifact that might be changed someday.)
E-mail the release announcement using:
To: gs-announce
Also update the documentation snapshots on the website.
After releasing¶
Update the release number by incrementing it as described in Release numbering above.
In gscdef.c
, edit the definition of GS_PRODUCT
to include “SVN PRE-RELEASE”.
Fonts¶
Artifex Software, Inc. distributes a package of the base 35 PostScript fonts, and a package of other miscellaneous fonts.
These are included in the Ghostscript release archive.
This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of that license. Refer to licensing information at https://www.artifex.com or contact Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, CA 94945, U.S.A., +1(415)492-9861, for further information.