#
# 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
!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 \
!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:
# 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
# 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;
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";
s/\//$dirsep/g;
$_ = $prefix . $_;
} @deps;
- push @ret, {obj => $x, deps => [@deps]};
+ push @ret, {obj => $x, obj_orig => $i, deps => [@deps]};
}
return @ret;
}
"#\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".
$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 {
print $makefile_extra{'cygwin'}->{'end'};
print "\nclean:\n".
"\trm -f *.o *.exe *.res.o *.map\n".
- "\n";
+ "\n".
+ "FORCE:\n";
select STDOUT; close OUT;
}
"#\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".
"\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".
" /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";
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'};
"\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;
}
(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".
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";
"#\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".
$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;
}
"#\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".
$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;
}
"# 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\"'\"`".
"#\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".
"CFLAGS = -D_WINDOWS " .
(join " ", map {"-I$dirpfx$_"} @srcdirs) .
"\n".
+ "# Resource compilation flags\n".
+ "RCFLAGS = \n".
"\n".
"# Get include directory for resource compiler\n".
"\n".
}
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";
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;
}
"#\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".
$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";
}
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;
}
--- /dev/null
+/*
+ * 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