diff --git a/CHECKLST.txt b/CHECKLST.txt index 522892ee..608d578e 100644 --- a/CHECKLST.txt +++ b/CHECKLST.txt @@ -21,9 +21,11 @@ The resource files: - putty/windows/puttygen.rc + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! - - putty/windows/win_res.rc + - putty/windows/win_res.rc2 + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! + - putty/windows/version.rc2 + + the copyright date appears once only. - putty/mac/mac_res.r + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! @@ -70,8 +72,13 @@ and again in a subsequent comment): - putty/windows/putty.iss +The Windows resource file (used to generate the binary bit of the +VERSIONINFO resources -- the strings are supplied by the usual means): + + - putty/windows/version.rc2 (BASE_VERSION; NB, _comma_-separated) + The Mac resource file (used to generate the binary bit of the 'vers' -resources -- the strings are supplied by the usual means): +resources): - putty/mac/version.r @@ -114,7 +121,8 @@ of the tag. - Build the Windows/x86 release binaries. Don't forget to supply VER=/DRELEASE=. Run them, or at least one or two of them, to - ensure that they really do report their version number correctly. + ensure that they really do report their version number correctly, + and sanity-check the version info reported on the files by Windows. + Save the release link maps. Currently I keep these on ixion, in src/putty/local/maps-. diff --git a/Recipe b/Recipe index 6b9f200f..457e7b66 100644 --- a/Recipe +++ b/Recipe @@ -36,9 +36,9 @@ # # Extra options you can set: # -# - VER=/DSNAPSHOT=1999-01-25 +# - VER="/DSNAPSHOT=1999-01-25 /DSVN_REV=1234" # Generates executables whose About box report them as being a -# development snapshot. +# development snapshot. SVN_REV is a Subversion revision number. # # - VER=/DRELEASE=0.43 # Generates executables whose About box report them as being a @@ -127,27 +127,23 @@ version.obj: *.c *.h *.rc !specialobj vc version !begin cygwin version.o: FORCE -FORCE: $(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) $(VER) -c ../version.c !end !specialobj cygwin version !begin borland version.obj: FORCE -FORCE: bcc32 $(VER) $(CFLAGS) /c ..\version.c !end !specialobj borland version !begin lcc version.obj: FORCE -FORCE: lcc $(VER) $(CFLAGS) /c ..\version.c !end !specialobj lcc version # For Unix, we also need the gross MD5 hack that causes automatic # version number selection in release source archives. !begin gtk -version.o: FORCE; -FORCE: +version.o: FORCE if test -z "$(VER)" && (cd ..; md5sum -c manifest); then \ $(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) `cat ../version.def` -c ../version.c; \ else \ @@ -156,6 +152,30 @@ FORCE: !end !specialobj gtk version +# Add VER to Windows resource targets, and force them to be rebuilt every +# time, on the assumption that they will contain version information. +!begin vc vars +RCFLAGS = $(RCFLAGS) $(VER) +!end +!begin cygwin vars +# XXX GNU-ism, but it's probably all right for a Cygwin/MinGW Makfile. +RCFLAGS += $(patsubst -D%,--define %,$(VER)) +!end +!begin borland vars +# Borland doesn't support +=. This probably shouldn't work, but seems to. +RCFLAGS = $(RCFLAGS) $(VER) +!end +!begin lcc vars +RCFLAGS += $(VER) +!end +!forceobj putty.res +!forceobj puttytel.res +!forceobj plink.res +!forceobj pscp.res +!forceobj psftp.res +!forceobj pageant.res +!forceobj puttygen.res + # `make install' target for Unix. !begin gtk install: @@ -249,14 +269,14 @@ BE_NONE = be_none nocproxy # keywords [G] for Windows GUI app, [C] for Console app, [X] for # X/GTK Unix app, [U] for command-line Unix app, [M] for Macintosh app. -putty : [G] GUITERM NONSSH WINSSH BE_ALL WINMISC win_res.res LIBS -puttytel : [G] GUITERM NONSSH BE_NOSSH WINMISC win_res.res LIBS +putty : [G] GUITERM NONSSH WINSSH BE_ALL WINMISC putty.res LIBS +puttytel : [G] GUITERM NONSSH BE_NOSSH WINMISC puttytel.res LIBS plink : [C] winplink wincons NONSSH WINSSH BE_ALL logging WINMISC + plink.res LIBS pscp : [C] pscp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC + pscp.res LIBS psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC - + pscp.res LIBS + + psftp.res LIBS pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234 + misc sshaes sshsha winpgntc sshdss sshsh512 winutils winmisc diff --git a/mkfiles.pl b/mkfiles.pl index ff468b5f..76e8e8a1 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -12,6 +12,8 @@ # are hardwired, and also the libraries are fixed. This is # mainly because I was too scared to go anywhere near it. # - sbcsgen.pl is still run at startup. +# +# FIXME: no attempt made to handle !forceobj in the project files. use FileHandle; use Cwd; @@ -52,6 +54,7 @@ while () { if ($_[0] eq "!srcdir") { push @srcdirs, $_[1]; next; } if ($_[0] eq "!makefile" and &mfval($_[1])) { $makefiles{$_[1]}=$_[2]; next;} if ($_[0] eq "!specialobj" and &mfval($_[1])) { $specialobj{$_[1]}->{$_[2]} = 1; next;} + if ($_[0] eq "!forceobj") { $forceobj{$_[1]} = 1; next; } if ($_[0] eq "!begin") { if (&mfval($_[1])) { $sect = $_[2] ? $_[2] : "end"; @@ -325,7 +328,7 @@ sub deps { s/\//$dirsep/g; $_ = $prefix . $_; } @deps; - push @ret, {obj => $x, deps => [@deps]}; + push @ret, {obj => $x, obj_orig => $i, deps => [@deps]}; } return @ret; } @@ -376,7 +379,7 @@ if (defined $makefiles{'cygwin'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # gcc command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "\n". @@ -416,8 +419,12 @@ if (defined $makefiles{'cygwin'}) { $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", "X.res.o", $dirpfx, "/", "cygwin")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf ("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } if ($d->{obj} =~ /\.res\.o$/) { print "\t\$(RC) \$(RCFL) \$(RCFLAGS) ".$d->{deps}->[0]." ".$d->{obj}."\n\n"; } else { @@ -428,7 +435,8 @@ if (defined $makefiles{'cygwin'}) { print $makefile_extra{'cygwin'}->{'end'}; print "\nclean:\n". "\trm -f *.o *.exe *.res.o *.map\n". - "\n"; + "\n". + "FORCE:\n"; select STDOUT; close OUT; } @@ -455,7 +463,7 @@ if (defined $makefiles{'borland'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # bcc32 command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "\n". @@ -465,6 +473,8 @@ if (defined $makefiles{'borland'}) { "\n". "# C compilation flags\n". "CFLAGS = -D_WINDOWS -DWINVER=0x0401\n". + "# Resource compilation flags\n". + "RCFLAGS = -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401\n". "\n". "# Get include directory for resource compiler\n". "!if !\$d(BCB)\n". @@ -480,7 +490,7 @@ if (defined $makefiles{'borland'}) { " /c \$*.c",69)."\n". ".rc.res:\n". &splitline("\tbrcc32 \$(RCFL) -i \$(BCB)\\include -r". - " -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401 \$*.rc",69)."\n". + " \$(RCFLAGS) \$*.rc",69)."\n". "\n"; print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("G:C")); print "\n\n"; @@ -520,8 +530,12 @@ if (defined $makefiles{'borland'}) { print "\n"; } foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "borland")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } } print "\n"; print $makefile_extra{'borland'}->{'end'}; @@ -535,7 +549,10 @@ if (defined $makefiles{'borland'}) { "\t-del *.pdb\n". "\t-del *.rsp\n". "\t-del *.tds\n". - "\t-del *.\$\$\$\$\$\$\n"; + "\t-del *.\$\$\$\$\$\$\n". + "\n". + "FORCE:\n". + "\t-rem dummy command\n"; select STDOUT; close OUT; } @@ -560,6 +577,7 @@ if (defined $makefiles{'vc'}) { (join " ", map {"-I$dirpfx$_"} @srcdirs) . " /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n". "LFLAGS = /incremental:no /fixed\n". + "RCFLAGS = -DWIN32 -D_WIN32 -DWINVER=0x0400\n". "\n". $makefile_extra{'vc'}->{'vars'} . "\n". @@ -592,12 +610,13 @@ if (defined $makefiles{'vc'}) { print "\n"; } foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "vc")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + $extradeps = $forceobj{$d->{obj_orig}} ? ["*.c","*.h","*.rc"] : []; + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @$extradeps, @{$d->{deps}})), "\n"; if ($d->{obj} =~ /.obj$/) { print "\tcl \$(COMPAT) \$(XFLAGS) \$(CFLAGS) /c ".$d->{deps}->[0],"\n\n"; } else { - print "\trc \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 ".$d->{deps}->[0],"\n\n"; + print "\trc \$(RCFL) -r \$(RCFLAGS) ".$d->{deps}->[0],"\n\n"; } } print "\n"; @@ -897,7 +916,7 @@ if (defined $makefiles{'gtk'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # gcc command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "\n". @@ -935,14 +954,19 @@ if (defined $makefiles{'gtk'}) { $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } print &splitline("\t\$(CC) \$(COMPAT) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n"); } print "\n"; print $makefile_extra{'gtk'}->{'end'}; print "\nclean:\n". "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n"; + print "\nFORCE:\n"; select STDOUT; close OUT; } @@ -956,7 +980,7 @@ if (defined $makefiles{'ac'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # gcc command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "\n". @@ -993,14 +1017,19 @@ if (defined $makefiles{'ac'}) { $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } print &splitline("\t\$(CC) \$(COMPAT) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n"); } print "\n"; print $makefile_extra{'gtk'}->{'end'}; print "\nclean:\n". "\trm -f *.o". (join "", map { " $_" } &progrealnames("X:U")) . "\n"; + print "\nFORCE:\n"; select STDOUT; close OUT; } @@ -1011,8 +1040,8 @@ if (defined $makefiles{'mpw'}) { "# Makefile for $project_name under MPW.\n#\n". "# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; - # MPW command line option is -d not /D - ($_ = $help) =~ s/=\/D/=-d /gs; + # MPW command line option is -d not /D (FIXME further massaging?) + ($_ = $help) =~ s/([=" ])\/D/\1-d /gs; print $_; print "\n\n". "ROptions = `Echo \"{VER}\" | StreamEdit -e \"1,\$ replace /=(\xc5)\xa81\xb0/ 'STR=\xb6\xb6\xb6\xb6\xb6\"' \xa81 '\xb6\xb6\xb6\xb6\xb6\"'\"`". @@ -1154,7 +1183,7 @@ if (defined $makefiles{'lcc'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # lcc command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "\n". @@ -1166,6 +1195,8 @@ if (defined $makefiles{'lcc'}) { "CFLAGS = -D_WINDOWS " . (join " ", map {"-I$dirpfx$_"} @srcdirs) . "\n". + "# Resource compilation flags\n". + "RCFLAGS = \n". "\n". "# Get include directory for resource compiler\n". "\n". @@ -1185,13 +1216,18 @@ if (defined $makefiles{'lcc'}) { } foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "lcc")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } if ($d->{obj} =~ /\.obj$/) { print &splitline("\tlcc -O -p6 \$(COMPAT)". " \$(XFLAGS) \$(CFLAGS) ".$d->{deps}->[0],69)."\n"; } else { - print &splitline("\tlrc \$(RCFL) -r ".$d->{deps}->[0],69)."\n"; + print &splitline("\tlrc \$(RCFL) -r \$(RCFLAGS) ". + $d->{deps}->[0],69)."\n"; } } print "\n"; @@ -1199,7 +1235,9 @@ if (defined $makefiles{'lcc'}) { print "\nclean:\n". "\t-del *.obj\n". "\t-del *.exe\n". - "\t-del *.res\n"; + "\t-del *.res\n". + "\n". + "FORCE:\n"; select STDOUT; close OUT; } @@ -1214,7 +1252,7 @@ if (defined $makefiles{'osx'}) { "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # gcc command line option is -D not /D - ($_ = $help) =~ s/=\/D/=-D/gs; + ($_ = $help) =~ s/([=" ])\/D/\1-D/gs; print $_; print "CC = \$(TOOLPATH)gcc\n". @@ -1263,8 +1301,12 @@ if (defined $makefiles{'osx'}) { $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, $dirpfx, "/")) { - print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), - "\n"; + if ($forceobj{$d->{obj_orig}}) { + printf("%s: FORCE\n", $d->{obj}); + } else { + print &splitline(sprintf("%s: %s", $d->{obj}, + join " ", @{$d->{deps}})), "\n"; + } $firstdep = $d->{deps}->[0]; if ($firstdep =~ /\.c$/) { print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n"; @@ -1274,8 +1316,10 @@ if (defined $makefiles{'osx'}) { } print "\n".$makefile_extra{'osx'}->{'end'}; print "\nclean:\n". - "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U")) . "\n"; + "\trm -f *.o *.dmg". (join "", map { " $_" } &progrealnames("U")) . "\n". "\trm -rf *.app\n"; + "\n". + "FORCE:\n"; select STDOUT; close OUT; } diff --git a/windows/pageant.rc b/windows/pageant.rc index 1e613d07..0102ca21 100644 --- a/windows/pageant.rc +++ b/windows/pageant.rc @@ -4,6 +4,9 @@ #include "rcstuff.h" +#define APPNAME "Pageant" +#define APPDESC "PuTTY SSH authentication agent" + 200 ICON "pageant.ico" 201 ICON "pageants.ico" @@ -85,6 +88,8 @@ BEGIN END +#include "version.rc2" + #ifndef NO_MANIFESTS 1 RT_MANIFEST "pageant.mft" #endif /* NO_MANIFESTS */ diff --git a/windows/plink.rc b/windows/plink.rc index 2c2cacaf..5282907d 100644 --- a/windows/plink.rc +++ b/windows/plink.rc @@ -1 +1,8 @@ +#include "rcstuff.h" + +#define APPNAME "Plink" +#define APPDESC "Command-line SSH, Telnet, and Rlogin client" + 200 ICON "putty.ico" + +#include "version.rc2" diff --git a/windows/pscp.rc b/windows/pscp.rc index bc1fec14..f9932451 100644 --- a/windows/pscp.rc +++ b/windows/pscp.rc @@ -1,2 +1,8 @@ +#include "rcstuff.h" + +#define APPNAME "PSCP" +#define APPDESC "Command-line SCP/SFTP client" + 200 ICON "pscp.ico" +#include "version.rc2" diff --git a/windows/psftp.rc b/windows/psftp.rc new file mode 100644 index 00000000..6b39531e --- /dev/null +++ b/windows/psftp.rc @@ -0,0 +1,8 @@ +#include "rcstuff.h" + +#define APPNAME "PSFTP" +#define APPDESC "Command-line interactive SFTP client" + +200 ICON "pscp.ico" + +#include "version.rc2" diff --git a/windows/putty.rc b/windows/putty.rc new file mode 100644 index 00000000..9cfd43d2 --- /dev/null +++ b/windows/putty.rc @@ -0,0 +1,10 @@ +#include "rcstuff.h" + +#define APPNAME "PuTTY" +#define APPDESC "SSH, Telnet and Rlogin client" + +#include "win_res.rc2" + +#ifndef NO_MANIFESTS +1 RT_MANIFEST "putty.mft" +#endif /* NO_MANIFESTS */ diff --git a/windows/puttygen.rc b/windows/puttygen.rc index 94acd61e..629b155b 100644 --- a/windows/puttygen.rc +++ b/windows/puttygen.rc @@ -4,6 +4,9 @@ #include "rcstuff.h" +#define APPNAME "PuTTYgen" +#define APPDESC "PuTTY SSH key generation utility" + 200 ICON "puttygen.ico" 201 DIALOG DISCARDABLE 0, 0, 318, 270 @@ -78,6 +81,8 @@ BEGIN END +#include "version.rc2" + #ifndef NO_MANIFESTS 1 RT_MANIFEST "puttygen.mft" #endif /* NO_MANIFESTS */ diff --git a/windows/puttytel.rc b/windows/puttytel.rc new file mode 100644 index 00000000..dbdfc46d --- /dev/null +++ b/windows/puttytel.rc @@ -0,0 +1,11 @@ +#include "rcstuff.h" + +#define APPNAME "PuTTYtel" +#define APPDESC "Telnet and Rlogin client" + +#include "win_res.rc2" + +#ifndef NO_MANIFESTS +/* FIXME */ +1 RT_MANIFEST "putty.mft" +#endif /* NO_MANIFESTS */ diff --git a/windows/rcstuff.h b/windows/rcstuff.h index 1936f7d4..22b22035 100644 --- a/windows/rcstuff.h +++ b/windows/rcstuff.h @@ -30,4 +30,21 @@ #define RT_MANIFEST 24 #endif +/* LCC is the offender here. */ +#ifndef VS_FF_DEBUG +#define VS_FF_DEBUG 1 +#endif +#ifndef VS_FF_PRERELEASE +#define VS_FF_PRERELEASE 2 +#endif +#ifndef VS_FF_PRIVATEBUILD +#define VS_FF_PRIVATEBUILD 8 +#endif +#ifndef VOS__WINDOWS32 +#define VOS__WINDOWS32 4 +#endif +#ifndef VFT_APP +#define VFT_APP 1 +#endif + #endif /* PUTTY_RCSTUFF_H */ diff --git a/windows/version.rc2 b/windows/version.rc2 new file mode 100644 index 00000000..d5c620a7 --- /dev/null +++ b/windows/version.rc2 @@ -0,0 +1,121 @@ +/* + * Standard Windows version information. + * (For inclusion in other .rc files with appropriate macro definitions.) + * FIXME: This file is called '.rc2' rather than '.rc' to avoid MSVC trying + * to compile it on its own when using the project files. Nicer solutions + * welcome. + */ + +/* + * Binary versions in Windows are major.minor.build.revision. Each + * component is 16-bit. + * Here we have: + * major.minor + * PuTTY version number (e.g. 0.58). (We've made a policy decision + * that these will be numeric from now on.) + * Present in releases and snapshots (for the sake of monotonicity + * in version numbers). + * build + * In releases, always 0. + * In snapshots, nearest Subversion revision. (It shouldn't be + * assumed that only one binary will have a given build number, of + * course.) + * revision + * Reserved; always 0. + * + * Examples of these version numbers: + * Release: 0.58.0.0 (but 0.58 didn't have a VERSIONINFO resource) + * Snapshot: 0.58.6356.0 (between 0.58 and the next release) + * Local: 0.0.0.0 + */ + +/* + * Mechanics of version naming/numbering. + * (This is a ripoff of ../version.c.) + */ + +#define STR1(x) #x +#define STR(x) STR1(x) + +/* We keep this around even for snapshots, for monotonicity of version + * numbering. It needs to be kept up to date. NB _comma_-separated. */ +#define BASE_VERSION 0,58 + +#if defined SNAPSHOT + +/* Make SVN_REV mandatory for snapshots, to avoid issuing binary + * version numbers that look like full releases. */ +#if (!defined SVN_REV) || (SVN_REV == 0) +#error SVN_REV not defined/nonzero for snapshot build +#endif + +#define VERSION_TEXT "Development snapshot " STR(SNAPSHOT) ":r" STR(SVN_REV) +#define BINARY_VERSION BASE_VERSION,SVN_REV,0 + +#elif defined RELEASE + +#define VERSION_TEXT "Release " STR(RELEASE) +#define BINARY_VERSION BASE_VERSION,0,0 + +#else + +/* We can't reliably get the same date and time as version.c, so + * we won't bother trying. */ +#define VERSION_TEXT "Unidentified build" +#define BINARY_VERSION 0,0,0,0 + +#endif + +/* + * The actual VERSIONINFO resource. + */ +VS_VERSION_INFO VERSIONINFO +/* (None of this "fixed" info appears to be trivially user-visible on + * Win98SE. The binary version does show up on Win2K.) */ +FILEVERSION BINARY_VERSION +PRODUCTVERSION BINARY_VERSION /* version of whole suite */ +FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE | VS_FF_PRIVATEBUILD +FILEFLAGS 0x0L +#if defined DEBUG + | VS_FF_DEBUG +#endif +#if defined SNAPSHOT + | VS_FF_PRERELEASE +#elif !defined RELEASE + | VS_FF_PRIVATEBUILD +#endif +FILEOS VOS__WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE 0x0L /* n/a for VFT_APP */ +BEGIN + /* (On Win98SE and Win2K, we can see most of this on the Version tab + * in the file properties in Explorer.) */ + BLOCK "StringFileInfo" + BEGIN + /* "lang-charset" LLLLCCCC = (UK English, Unicode) */ + BLOCK "080904B0" + BEGIN + VALUE "CompanyName", "Simon Tatham" /* required :/ */ + VALUE "ProductName", "PuTTY suite" + VALUE "FileDescription", APPDESC + VALUE "InternalName", APPNAME + VALUE "OriginalFilename", APPNAME + VALUE "FileVersion", VERSION_TEXT + VALUE "ProductVersion", VERSION_TEXT + VALUE "LegalCopyright", "Copyright \251 1997-2005 Simon Tatham." +#if (!defined SNAPSHOT) && (!defined RELEASE) + /* Only if VS_FF_PRIVATEBUILD. */ + VALUE "PrivateBuild", VERSION_TEXT /* NBI */ +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + /* Once again -- same meanings -- apparently necessary */ + VALUE "Translation", 0x809, 1200 + END +END + +#undef VERSION_TEXT +#undef BASE_VERSION +#undef BINARY_VERSION diff --git a/windows/win_res.rc b/windows/win_res.rc2 similarity index 88% rename from windows/win_res.rc rename to windows/win_res.rc2 index c24db046..3b55158c 100644 --- a/windows/win_res.rc +++ b/windows/win_res.rc2 @@ -1,8 +1,14 @@ /* - * Windows resources for PuTTY and PuTTYtel. + * Windows resources shared between PuTTY and PuTTYtel, to be #include'd + * after defining appropriate macros. + * Note that many of these strings mention PuTTY. Due to restrictions in + * VC's handling of string concatenation, this can't easily be fixed. + * It's fixed up at runtime. + * FIXME: This file is called '.rc2' rather than '.rc' to avoid MSVC trying + * to compile it on its own when using the project files. Nicer solutions + * welcome. */ -#include "rcstuff.h" #include "win_res.h" IDI_MAINICON ICON "putty.ico" @@ -83,6 +89,4 @@ BEGIN END -#ifndef NO_MANIFESTS -1 RT_MANIFEST "putty.mft" -#endif /* NO_MANIFESTS */ +#include "version.rc2"