123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- # -*- 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 18819 # 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 installers.
- # 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)
- in putty/doc do echo "\\\\versionid $(Puttytextver)" > version.but
- # 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 -Release-$(RELEASE)
- ifneq "$(PRERELEASE)" "" set Sshver -Prerelease-$(PRERELEASE):$(Ndate).$(vcsid)
- ifneq "$(SNAPSHOT)" "" set Sshver -Snapshot-$(Date).$(vcsid)
- ifeq "$(RELEASE)$(PRERELEASE)$(SNAPSHOT)" "" set Sshver -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 filenames for the Windows installers (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 Ifilenamea32 putty-arm32-$(Isuffix)
- set Ifilenamea64 putty-arm64-$(Isuffix)
- # Set up the Windows version resource info, for both the installers 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 cmake/gitcommit.cmake, replace the default output "unavailable"
- # with the commit string generated by bob, so that people rebuilding
- # the source archive will still get a useful value.
- in putty do sed -i '/set(DEFAULT_COMMIT/s/unavailable/$(vcsfullid)/' cmake/gitcommit.cmake
- in . do mkdir docbuild
- in docbuild do cmake ../putty/doc
- in docbuild do make -j$(nproc) VERBOSE=1
- in putty/doc do cp ../../docbuild/*.1 .
- in putty/doc do cp ../../docbuild/puttydoc.txt .
- in putty/doc do cp ../../docbuild/putty.chm .
- in putty/doc do cp -r ../../docbuild/html .
- in putty do ./mksrcarc.sh
- in putty do ./mkunxarc.sh '$(Uxarcsuffix)'
- delegate -
- # Run the test suite, under self-delegation so that we don't leave any
- # cruft lying around. This involves doing a build of the Unix tools
- # (which is a useful double-check anyway to pick up any build failures)
- in putty do cmake . -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=address -fsanitize=leak" -DSTRICT=ON
- in putty do make -j$(nproc) VERBOSE=1
- in putty do python3 test/cryptsuite.py
- in putty do ./test_lineedit
- in putty do ./test_terminal
- in putty do ./test_conf
- enddelegate
- delegate -
- # Also, test-build the Windows tools using MinGW. This is important if
- # we want the MinGW build to carry on working, partly because of the
- # chance of compiler compatibility issues, but mostly because MinGW's
- # linker uses Unix-style library search semantics (once down the
- # library list), and no other Windows toolchain we build with is that
- # picky. So this ensures the Windows library structure continues to
- # work in the most difficult circumstance we expect it to encounter.
- in putty do cmake . -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw.cmake -DSTRICT=ON
- in putty do make -j$(nproc) VERBOSE=1
- enddelegate
- # Windowsify LICENCE, since it's going in the Windows installers.
- 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 -j$(nproc)
- in putty do ./windows/make_install_images.sh
- mkdir putty/windows/build32
- mkdir putty/windows/build64
- mkdir putty/windows/buildold
- mkdir putty/windows/abuild32
- mkdir putty/windows/abuild64
- # Build the binaries to go in the installers, 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/build32 with cmake_at_least_3.20 do cmake ../.. -DCMAKE_TOOLCHAIN_FILE=$(cmake_toolchain_clangcl32) -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DPUTTY_LINK_MAPS=ON -DCMAKE_C_FLAGS_RELEASE="/MT /O2" -DPUTTY_SUBSYSTEM_VERSION=5.01 -DSTRICT=ON
- in putty/windows/build32 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- in putty/windows/build64 with cmake_at_least_3.20 do cmake ../.. -DCMAKE_TOOLCHAIN_FILE=$(cmake_toolchain_clangcl64) -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DPUTTY_LINK_MAPS=ON -DCMAKE_C_FLAGS_RELEASE="/MT /O2" -DSTRICT=ON
- in putty/windows/build64 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- # The cmake mechanism used to set the subsystem version is a bit of a
- # bodge (it depends on knowing how cmake set up all its build command
- # variables), so just in case it breaks in future, double-check we
- # really did get the subsystem version we wanted.
- in putty/windows/build32 do objdump -x putty.exe > exe-headers.txt
- in putty/windows/build32 do grep -Ex 'MajorOSystemVersion[[:space:]]+5' exe-headers.txt
- in putty/windows/build32 do grep -Ex 'MinorOSystemVersion[[:space:]]+1' exe-headers.txt
- in putty/windows/build32 do grep -Ex 'MajorSubsystemVersion[[:space:]]+5' exe-headers.txt
- in putty/windows/build32 do grep -Ex 'MinorSubsystemVersion[[:space:]]+1' exe-headers.txt
- # Build experimental Arm Windows binaries.
- in putty/windows/abuild32 with cmake_at_least_3.20 do cmake ../.. -DCMAKE_TOOLCHAIN_FILE=$(cmake_toolchain_clangcl_a32) -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DPUTTY_LINK_MAPS=ON -DCMAKE_C_FLAGS_RELEASE="/MT /O2" -DSTRICT=ON
- in putty/windows/abuild32 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- in putty/windows/abuild64 with cmake_at_least_3.20 do cmake ../.. -DCMAKE_TOOLCHAIN_FILE=$(cmake_toolchain_clangcl_a64) -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DPUTTY_LINK_MAPS=ON -DCMAKE_C_FLAGS_RELEASE="/MT /O2" -DSTRICT=ON
- in putty/windows/abuild64 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- # Make a list of the Windows binaries we're going to ship, so that we
- # can sign them.
- in putty/windows do for subdir in build32 abuild32 build64 abuild64; do sed "s!^!$$subdir/!" $$subdir/shipped.txt; done > to-sign.txt
- # 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/ $$(cat to-sign.txt)
- # Make a preliminary set of cryptographic checksums giving the hashes
- # of these versions of the binaries. We'll make the rest below.
- in putty do for hash in md5 sha1 sha256 sha512; do for dir_plat in "build32 w32" "build64 w64" "abuild32 wa32" "abuild64 wa64"; do set -- $$dir_plat; (cd windows/$$1 && $${hash}sum *.exe | sed 's!\( \+\)!\1'$$2'/!;s!$$! (installer version)!') >> $${hash}sums.installer; done; done
- # Build a WiX MSI installer, for each build flavour.
- in putty/windows with wixonlinux do candle -arch x86 -dRealPlatform=x86 -dDllOk=yes -dBuilddir=build32/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" -dHelpFilePath="../../docbuild/putty.chm" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installer32.msi -spdb
- in putty/windows with wixonlinux do candle -arch x64 -dRealPlatform=x64 -dDllOk=yes -dBuilddir=build64/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" -dHelpFilePath="../../docbuild/putty.chm" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installer64.msi -spdb
- in putty/windows with wixonlinux do candle -arch x64 -dRealPlatform=Arm -dDllOk=no -dBuilddir=abuild32/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" -dHelpFilePath="../../docbuild/putty.chm" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installera32.msi -spdb
- in putty/windows with wixonlinux do candle -arch x64 -dRealPlatform=Arm64 -dDllOk=no -dBuilddir=abuild64/ -dWinver="$(Winver)" -dPuttytextver="$(Puttytextver)" -dHelpFilePath="../../docbuild/putty.chm" installer.wxs && light -ext WixUIExtension -ext WixUtilExtension -sval installer.wixobj -o installera64.msi -spdb
- # Change the width field for our dialog background image so that it
- # doesn't stretch across the whole dialog. (WiX's default one does; we
- # replace it with a narrow one so that the text to the right of it
- # shows up on system default background colour, meaning that
- # high-contrast mode doesn't make the text white on white. But that
- # means we also have to modify the width field, and there's nothing in
- # WiX's source syntax to make that happen.)
- #
- # Also bodge the platform fields for the Windows on Arm installers,
- # since WiX 3 doesn't understand Arm platform names itself.
- in putty/windows do ./msifixup.py installer32.msi --dialog-bmp-width=123
- in putty/windows do ./msifixup.py installer64.msi --dialog-bmp-width=123
- in putty/windows do ./msifixup.py installera32.msi --dialog-bmp-width=123 --platform=Arm
- in putty/windows do ./msifixup.py installera64.msi --dialog-bmp-width=123 --platform=Arm64
- # 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 installera32.msi installera64.msi
- # Build the standalone binaries, in both 32- and 64-bit flavours.
- # These differ from the previous set in that they embed the help file.
- in putty/windows/build32 with cmake_at_least_3.20 do cmake . -DPUTTY_EMBEDDED_CHM_FILE=$$(realpath ../../../docbuild/putty.chm)
- in putty/windows/build32 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- in putty/windows/build64 with cmake_at_least_3.20 do cmake . -DPUTTY_EMBEDDED_CHM_FILE=$$(realpath ../../../docbuild/putty.chm)
- in putty/windows/build64 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- in putty/windows/abuild32 with cmake_at_least_3.20 do cmake . -DPUTTY_EMBEDDED_CHM_FILE=$$(realpath ../../../docbuild/putty.chm)
- in putty/windows/abuild32 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- in putty/windows/abuild64 with cmake_at_least_3.20 do cmake . -DPUTTY_EMBEDDED_CHM_FILE=$$(realpath ../../../docbuild/putty.chm)
- in putty/windows/abuild64 with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- # 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.
- #
- # There's no installer to go with these, so they must also embed the
- # help file.
- in putty/windows/buildold with cmake_at_least_3.20 do cmake ../.. -DCMAKE_TOOLCHAIN_FILE=$(cmake_toolchain_clangcl32_2003) -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DPUTTY_LINK_MAPS=ON -DSTRICT=ON
- in putty/windows/buildold with cmake_at_least_3.20 do make -j$(nproc) VERBOSE=1
- # Regenerate to-sign.txt with the 'old' binaries included.
- in putty/windows do for subdir in build32 abuild32 build64 abuild64 buildold; do sed "s!^!$$subdir/!" $$subdir/shipped.txt; done > to-sign.txt
- # Code-sign the standalone versions of the binaries.
- ifneq "$(cross_winsigncode)" "" in putty/windows do $(cross_winsigncode) -N -i https://www.chiark.greenend.org.uk/~sgtatham/putty/ $$(cat to-sign.txt)
- # Move the shipped (and signed) binaries into another directory to
- # deliver them from, so that we omit testcrypt and its ilk.
- in putty/windows do mkdir deliver
- in putty/windows do for subdir in build32 abuild32 build64 abuild64 buildold; do mkdir deliver/$$subdir; done
- in putty/windows do while read x; do mv $$x deliver/$$x; mv $$x.map deliver/$$x.map; done < to-sign.txt
- # Make putty.zip in each Windows directory. We add the files one by
- # one, because 'zip' exits with a success status if it managed to add
- # _at least one_ of the input files, even if another didn't exist. So
- # doing them one at a time gets us proper error reporting.
- in putty/windows/deliver/buildold do for file in *.exe ../../../../docbuild/putty.chm; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip -k -j putty.zip "$$file";; esac; done
- in putty/windows/deliver/build32 do for file in *.exe ../../../../docbuild/putty.chm; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip -k -j putty.zip "$$file";; esac; done
- in putty/windows/deliver/build64 do for file in *.exe ../../../../docbuild/putty.chm; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip -k -j putty.zip "$$file";; esac; done
- in putty/windows/deliver/abuild32 do for file in *.exe ../../../../docbuild/putty.chm; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip -k -j putty.zip "$$file";; esac; done
- in putty/windows/deliver/abuild64 do for file in *.exe ../../../../docbuild/putty.chm; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip -k -j putty.zip "$$file";; esac; done
- in docbuild/html do for file in *.html; do case "$$file" in puttytel.exe | pterm.exe) ;; *) zip puttydoc.zip "$$file";; esac; done
- # Deliver the actual PuTTY release directory into a subdir `putty'.
- deliver putty/windows/deliver/buildold/*.exe putty/w32old/$@
- deliver putty/windows/deliver/buildold/putty.zip putty/w32old/$@
- deliver putty/windows/deliver/build32/*.exe putty/w32/$@
- deliver putty/windows/deliver/build32/putty.zip putty/w32/$@
- deliver putty/windows/deliver/build64/*.exe putty/w64/$@
- deliver putty/windows/deliver/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/windows/installera32.msi putty/wa32/$(Ifilenamea32).msi
- deliver putty/windows/installera64.msi putty/wa64/$(Ifilenamea64).msi
- deliver putty/windows/deliver/abuild32/*.exe putty/wa32/$@
- deliver putty/windows/deliver/abuild32/putty.zip putty/wa32/$@
- deliver putty/windows/deliver/abuild64/*.exe putty/wa64/$@
- deliver putty/windows/deliver/abuild64/putty.zip putty/wa64/$@
- deliver docbuild/html/puttydoc.zip putty/$@
- deliver docbuild/putty.chm putty/$@
- deliver docbuild/puttydoc.txt putty/$@
- deliver docbuild/html/*.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/deliver/buildold/*.map maps/w32old/$@
- deliver putty/windows/deliver/build32/*.map maps/w32/$@
- deliver putty/windows/deliver/build64/*.map maps/w64/$@
- deliver putty/windows/deliver/abuild32/*.map maps/wa32/$@
- deliver putty/windows/deliver/abuild64/*.map maps/wa64/$@
- # 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 . do pwd > builddir
- read Builddir builddir
- in-dest putty do a=`\find * -type f -print`; for hash in md5 sha1 sha256 sha512; do ($${hash}sum $$a; echo; cat $(Builddir)/putty/$${hash}sums.installer) > $${hash}sums; done
- # 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 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" "wa32 putty-arm32-installer" "wa64 putty-arm64-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
|