зеркало из https://github.com/github/putty.git
244 строки
14 KiB
Bash
244 строки
14 KiB
Bash
# -*- sh -*-
|
|
# Build script to construct a full distribution directory of PuTTY.
|
|
|
|
module putty
|
|
|
|
# Start by figuring out what our version information looks like.
|
|
#
|
|
# There are four classes of PuTTY build:
|
|
# - a release, which just has an X.YY version number
|
|
# - a prerelease, which has an X.YY version number, plus a date and
|
|
# version control commit id (and is considered to be 'almost'
|
|
# version X.YY)
|
|
# - a development snapshot, which just has a date and commit id
|
|
# - a custom build, which also has a date and commit id (but is
|
|
# labelled differently, to stress that development snapshots are
|
|
# built from the checked-in code by the automated nightly script
|
|
# whereas custom builds are made manually, perhaps from uncommitted
|
|
# changes, e.g. to send to a user for diagnostic or testing
|
|
# purposes).
|
|
#
|
|
# The four classes of build are triggered by invoking bob with
|
|
# different command-line variable definitions:
|
|
#
|
|
# - RELEASE=X.YY makes a release build
|
|
# - PRERELEASE=X.YY makes a prerelease build (combined with the build
|
|
# date and VCS info)
|
|
# - setting SNAPSHOT to any non-empty string makes a development
|
|
# snapshot
|
|
# - setting none of these makes a custom build.
|
|
|
|
# If we need a date for our build, start by computing it in the
|
|
# various forms we need. $(Ndate) is the date in purely numeric form
|
|
# (YYYYMMDD); $(Date) is separated as YYYY-MM-DD; $(Days) is the
|
|
# number of days since the epoch.
|
|
ifeq "$(RELEASE)" "" set Ndate $(!builddate)
|
|
ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -pe 's/(....)(..)(..)/$$1-$$2-$$3/' > date
|
|
ifneq "$(Ndate)" "" read Date date
|
|
set Epoch 16351 # update this at every release
|
|
ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -ne 'use Time::Local; /(....)(..)(..)/ and print timegm(0,0,0,$$3,$$2-1,$$1) / 86400 - $(Epoch)' > days
|
|
ifneq "$(Ndate)" "" read Days days
|
|
|
|
# For any non-release, we're going to need the number of the prior
|
|
# release, for putting in various places so as to get monotonic
|
|
# comparisons with the surrounding actual releases.
|
|
ifeq "$(RELEASE)" "" read Lastver putty/LATEST.VER
|
|
|
|
# Set up the textual version strings for the docs build and installer.
|
|
# We have one of these including the word 'PuTTY', and one without,
|
|
# which are inconveniently capitalised differently.
|
|
ifneq "$(RELEASE)" "" set Puttytextver PuTTY release $(RELEASE)
|
|
ifneq "$(RELEASE)" "" set Textver Release $(RELEASE)
|
|
ifneq "$(PRERELEASE)" "" set Puttytextver PuTTY pre-release $(PRERELEASE):$(Date).$(vcsid)
|
|
ifneq "$(PRERELEASE)" "" set Textver Pre-release $(PRERELEASE):$(Date).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Puttytextver PuTTY development snapshot $(Date).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Textver Development snapshot $(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Puttytextver PuTTY custom build $(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Textver Custom build $(Date).$(vcsid)
|
|
set Docmakever VERSION="$(Puttytextver)"
|
|
|
|
# Set up the version string for use in the SSH connection greeting.
|
|
#
|
|
# We use $(Ndate) rather than $(Date) in the pre-release string to
|
|
# make sure it's under 40 characters, which is a hard limit in the SSH
|
|
# protocol spec (and enforced by a compile-time assertion in
|
|
# version.c).
|
|
ifneq "$(RELEASE)" "" set Sshver PuTTY-Release-$(RELEASE)
|
|
ifneq "$(PRERELEASE)" "" set Sshver PuTTY-Prerelease-$(PRERELEASE):$(Ndate).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Sshver PuTTY-Snapshot-$(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Sshver PuTTY-Custom-$(Date).$(vcsid)
|
|
|
|
# Set up the filename suffix for the Unix source archive.
|
|
ifneq "$(RELEASE)" "" set Uxarcsuffix -$(RELEASE)
|
|
ifneq "$(PRERELEASE)" "" set Uxarcsuffix -$(PRERELEASE)~pre$(Ndate).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Uxarcsuffix -$(Lastver)-$(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Uxarcsuffix -custom-$(Date).$(vcsid)
|
|
|
|
# Set up the version number for the autoconf system.
|
|
ifneq "$(RELEASE)" "" set Autoconfver $(RELEASE)
|
|
ifneq "$(PRERELEASE)" "" set Autoconfver $(PRERELEASE)~pre$(Ndate).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Autoconfver $(Lastver)-$(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Autoconfver Custom.$(Date).$(vcsid)
|
|
|
|
# Set up the filenames for the Windows installer (minus extension,
|
|
# which goes on later).
|
|
ifneq "$(RELEASE)" "" set Isuffix $(RELEASE)-installer
|
|
ifneq "$(PRERELEASE)" "" set Isuffix $(PRERELEASE)-pre$(Ndate)-installer
|
|
ifneq "$(SNAPSHOT)" "" set Isuffix $(Date)-installer
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Isuffix custom-$(Date)-installer
|
|
set Ifilename32 putty-$(Isuffix)
|
|
set Ifilename64 putty-64bit-$(Isuffix)
|
|
|
|
# Set up the version string for the Windows installer.
|
|
ifneq "$(RELEASE)" "" set Iversion $(RELEASE)
|
|
ifneq "$(PRERELEASE)" "" set Iversion $(PRERELEASE)-pre$(Ndate).$(vcsid)
|
|
ifneq "$(SNAPSHOT)" "" set Iversion $(Date).$(vcsid)
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Iversion Custom-$(Date).$(vcsid)
|
|
|
|
# Set up the Windows version resource info, for both the installer and
|
|
# the individual programs. This must be a sequence of four 16-bit
|
|
# integers compared lexicographically, and we define it as follows:
|
|
#
|
|
# For release X.YY: X.YY.0.0
|
|
# For a prerelease before the X.YY release: (X.YY-1).(DDDDD + 0x8000).0
|
|
# For a devel snapshot after the X.YY release: X.YY.DDDDD.0
|
|
# For a custom build: X.YY.DDDDD.1
|
|
#
|
|
# where DDDDD is a representation of the build date, in the form of a
|
|
# number of days since an epoch date. The epoch is reset at every
|
|
# release (which, with 15 bits, gives us a comfortable 80-odd years
|
|
# before it becomes vital to make another release to reset the count
|
|
# :-).
|
|
|
|
ifneq "$(RELEASE)" "" in . do echo $(RELEASE).0.0 > winver
|
|
ifneq "$(PRERELEASE)" "" in . do perl -e 'printf "%s.%d.0", $$ARGV[0], 0x8000+$$ARGV[1]' $(Lastver) $(Days) > winver
|
|
ifneq "$(SNAPSHOT)" "" in . do perl -e 'printf "%s.%d.0", $$ARGV[0], $$ARGV[1]' $(Lastver) $(Days) > winver
|
|
ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" in . do perl -e 'printf "%s.%d.1", $$ARGV[0], $$ARGV[1]' $(Lastver) $(Days) > winver
|
|
in . do perl -pe 'y!.!,!' winver > winvercommas
|
|
read Winver winver
|
|
read Winvercommas winvercommas
|
|
|
|
# Write out a version.h that contains the real version number.
|
|
in putty do echo '/* Generated by automated build script */' > version.h
|
|
ifneq "$(RELEASE)" "" in putty do echo '$#define RELEASE $(RELEASE)' >> version.h
|
|
ifneq "$(PRERELEASE)" "" in putty do echo '$#define PRERELEASE $(PRERELEASE)' >> version.h
|
|
ifneq "$(SNAPSHOT)" "" in putty do echo '$#define SNAPSHOT' >> version.h
|
|
in putty do echo '$#define TEXTVER "$(Textver)"' >> version.h
|
|
in putty do echo '$#define SSHVER "$(Sshver)"' >> version.h
|
|
in putty do echo '$#define BINARY_VERSION $(Winvercommas)' >> version.h
|
|
in putty do echo '$#define SOURCE_COMMIT "$(vcsfullid)"' >> version.h
|
|
|
|
# Set up the extra arguments for the main Windows nmake command. The
|
|
# user can define XFLAGS and MAKEARGS on the bob command line, to pass
|
|
# in extra compile and make options respectively (e.g. to do a
|
|
# debugging or Minefield build).
|
|
set Makeargs
|
|
ifneq "$(XFLAGS)" "" set Makeargs $(Makeargs) XFLAGS="$(XFLAGS)"
|
|
ifneq "$(MAKEARGS)" "" set Makeargs $(Makeargs) $(MAKEARGS)
|
|
|
|
in putty do ./mksrcarc.sh
|
|
in putty do ./mkunxarc.sh '$(Autoconfver)' '$(Uxarcsuffix)' $(Docmakever)
|
|
in putty do perl mkfiles.pl
|
|
in putty/doc do make $(Docmakever) putty.hlp putty.chm
|
|
|
|
# Munge the installer script locally so that it reports the version
|
|
# we're really building.
|
|
in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(AppVerName=).*$$/$$1$$a/' '$(Puttytextver)' putty.iss
|
|
in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(VersionInfoTextVersion=).*$$/$$1$$a/' '$(Textver)' putty.iss
|
|
in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(AppVersion=).*$$/$$1$$a/' '$(Iversion)' putty.iss
|
|
in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(VersionInfoVersion=)\d+\.\d+\.\d+\.\d+\r?$$/$$1$$a/' '$(Winver)' putty.iss
|
|
|
|
# Windowsify LICENCE, since it's going in the Windows installer.
|
|
in putty do perl -i~ -pe 'y/\015//d;s/$$/\015/' LICENCE
|
|
|
|
# Some gratuitous theming for the MSI installer UI.
|
|
in putty/icons do make
|
|
in putty do convert -size 164x312 'gradient:blue-white' -distort SRT -90 -swirl 180 \( -size 329x312 canvas:white \) +append \( icons/putty-48.png -geometry +28+24 \) -composite \( icons/pscp-48.png -geometry +88+96 \) -composite \( icons/puttygen-48.png -geometry +28+168 \) -composite \( icons/pageant-48.png -geometry +88+240 \) -composite windows/msidialog.bmp
|
|
in putty do convert -size 493x58 canvas:white \( icons/putty-48.png -geometry +440+5 \) -composite windows/msibanner.bmp
|
|
|
|
# Build the standard binaries, in both 32- and 64-bit flavours.
|
|
#
|
|
# For the 32-bit ones, we set a subsystem version of 5.01, which
|
|
# allows the resulting files to still run on Windows XP.
|
|
in putty/windows with clangcl32 do mkdir build32 && Platform=x86 make -f Makefile.clangcl BUILDDIR=build32/ SUBSYSVER=,5.01 $(Makeargs) all cleantestprogs
|
|
in putty/windows with clangcl64 do mkdir build64 && Platform=x64 make -f Makefile.clangcl BUILDDIR=build64/ $(Makeargs) all cleantestprogs
|
|
|
|
# Build the 'old' binaries, which should still run on all 32-bit
|
|
# versions of Windows back to Win95 (but not Win32s). These link
|
|
# against Visual Studio 2003 libraries (the more modern versions
|
|
# assume excessively modern Win32 API calls to be available), specify
|
|
# a subsystem version of 4.0, and compile with /arch:IA32 to prevent
|
|
# the use of modern CPU features like MMX which older machines also
|
|
# might not have.
|
|
in putty/windows with clangcl32_2003 do mkdir buildold && Platform=x86 make -f Makefile.clangcl BUILDDIR=buildold/ $(Makeargs) CCTARGET=i386-pc-windows-msvc13.0.0 SUBSYSVER=,4.0 EXTRA_windows=wincrt0.obj EXTRA_console=crt0.obj XFLAGS=/arch:IA32 all cleantestprogs
|
|
|
|
# Code-sign the Windows binaries, if the local bob config provides a
|
|
# script to do so in a cross-compiling way. We assume here that the
|
|
# script accepts an -i option to provide a 'more info' URL, an
|
|
# optional -n option to provide a program name, and an -N option to
|
|
# take the program name from an .exe's version resource, and that it
|
|
# can accept multiple .exe or .msi filename arguments and sign them
|
|
# all in place.
|
|
ifneq "$(cross_winsigncode)" "" in putty/windows do $(cross_winsigncode) -N -i https://www.chiark.greenend.org.uk/~sgtatham/putty/ build*/*.exe
|
|
|
|
# Build a WiX MSI installer, for each of build32 and build64.
|
|
in putty/windows with wixonlinux do candle -arch x86 -dWin64=no -dBuilddir=build32/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installer32.msi -spdb
|
|
in putty/windows with wixonlinux do candle -arch x64 -dWin64=yes -dBuilddir=build64/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installer64.msi -spdb
|
|
|
|
# Sign the Windows installers.
|
|
ifneq "$(cross_winsigncode)" "" in putty/windows do $(cross_winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/putty/ -n "PuTTY Installer" installer32.msi installer64.msi
|
|
|
|
in putty/doc do make mostlyclean
|
|
in putty/doc do make $(Docmakever)
|
|
in putty/windows/buildold do zip -k -j putty.zip `ls *.exe | grep -v puttytel` ../../doc/putty.chm ../../doc/putty.hlp ../../doc/putty.cnt
|
|
in putty/windows/build32 do zip -k -j putty.zip `ls *.exe | grep -v puttytel` ../../doc/putty.chm ../../doc/putty.hlp ../../doc/putty.cnt
|
|
in putty/windows/build64 do zip -k -j putty.zip `ls *.exe | grep -v puttytel` ../../doc/putty.chm ../../doc/putty.hlp ../../doc/putty.cnt
|
|
in putty/doc do zip puttydoc.zip *.html
|
|
|
|
# Deliver the actual PuTTY release directory into a subdir `putty'.
|
|
deliver putty/windows/buildold/*.exe putty/w32old/$@
|
|
deliver putty/windows/buildold/putty.zip putty/w32old/$@
|
|
deliver putty/windows/build32/*.exe putty/w32/$@
|
|
deliver putty/windows/build32/putty.zip putty/w32/$@
|
|
deliver putty/windows/build64/*.exe putty/w64/$@
|
|
deliver putty/windows/build64/putty.zip putty/w64/$@
|
|
deliver putty/windows/installer32.msi putty/w32/$(Ifilename32).msi
|
|
deliver putty/windows/installer64.msi putty/w64/$(Ifilename64).msi
|
|
deliver putty/doc/puttydoc.zip putty/$@
|
|
deliver putty/doc/putty.chm putty/$@
|
|
deliver putty/doc/putty.hlp putty/$@
|
|
deliver putty/doc/putty.cnt putty/$@
|
|
deliver putty/doc/puttydoc.txt putty/$@
|
|
deliver putty/doc/*.html putty/htmldoc/$@
|
|
deliver putty/putty-src.zip putty/$@
|
|
deliver putty/*.tar.gz putty/$@
|
|
|
|
# Deliver the map files alongside the `proper' release deliverables.
|
|
deliver putty/windows/buildold/*.map maps/w32old/$@
|
|
deliver putty/windows/build32/*.map maps/w32/$@
|
|
deliver putty/windows/build64/*.map maps/w64/$@
|
|
|
|
# Deliver sign.sh, so that whoever has just built PuTTY (the
|
|
# snapshot scripts or me, depending) can conveniently sign it with
|
|
# whatever key they want.
|
|
deliver putty/sign.sh $@
|
|
|
|
# Create files of cryptographic checksums, which will be signed along
|
|
# with the files they verify. We've provided MD5 checksums for a
|
|
# while, but now MD5 is looking iffy, we're expanding our selection.
|
|
#
|
|
# Creating these files is most easily done in the destination
|
|
# directory, where all the files we're delivering are already in their
|
|
# final relative layout.
|
|
in-dest putty do a=`\find * -type f -print`; md5sum $$a > md5sums && sha1sum $$a > sha1sums && sha256sum $$a > sha256sums && sha512sum $$a > sha512sums
|
|
|
|
# And construct .htaccess files. One in the top-level directory,
|
|
# setting the MIME types for Windows help files and providing an
|
|
# appropriate link to the source archive:
|
|
in-dest putty do echo "AddType application/octet-stream .chm" >> .htaccess
|
|
in-dest putty do echo "AddType application/octet-stream .hlp" >> .htaccess
|
|
in-dest putty do echo "AddType application/octet-stream .cnt" >> .htaccess
|
|
in-dest putty do set -- putty*.tar.gz; for k in '' .gpg; do echo RedirectMatch temp '(.*/)'putty.tar.gz$$k\$$ '$$1'"$$1$$k" >> .htaccess; done
|
|
# And one in each binary directory, providing links for the installers.
|
|
in-dest putty do for params in "w32 putty-installer" "w64 putty-64bit-installer"; do (set -- $$params; subdir=$$1; installername=$$2; cd $$subdir && for ext in msi exe; do set -- putty*installer.$$ext; if test -f $$1; then for k in '' .gpg; do echo RedirectMatch temp '(.*/)'$${installername}.$$ext$$k\$$ '$$1'"$$1$$k" >> .htaccess; done; fi; done); done
|