For building on Windows:
- - Makefile.vc is for command-line builds on MS Visual C++ systems.
- Type `nmake -f Makefile.vc' to build all the PuTTY binaries.
+ - windows/Makefile.vc is for command-line builds on MS Visual C++
+ systems. Change into the `windows' subdirectory and type `nmake
+ -f Makefile.vc' to build all the PuTTY binaries.
(We've also had one report of success building with the
OpenWatcom compiler -- www.openwatcom.org -- using Makefile.vc
with `wmake -ms -f makefile.vc' and NO_MULTIMON, although we
haven't tried this ourselves.)
- - Inside the MSVC subdirectory are MS Visual Studio project files
- for doing GUI-based builds of the various PuTTY utilities. These
- have been tested on Visual Studio 6.
+ - Inside the windows/MSVC subdirectory are MS Visual Studio project
+ files for doing GUI-based builds of the various PuTTY utilities.
+ These have been tested on Visual Studio 6.
You should be able to build each PuTTY utility by loading the
corresponding .dsp file in Visual Studio. For example,
MSVC/putty/putty.dsp builds PuTTY itself, MSVC/plink/plink.dsp
builds Plink, and so on.
- - Makefile.bor is for the Borland C compiler. Type `make -f
- Makefile.bor' to build all the PuTTY binaries.
+ - windows/Makefile.bor is for the Borland C compiler. Type `make -f
+ Makefile.bor' while in the `windows' subdirectory to build all
+ the PuTTY binaries.
- - Makefile.cyg is for Cygwin / mingw32 installations. Type `make -f
- Makefile.cyg' to build all the PuTTY binaries. Note that by
- default the Pageant WinNT security features and the multiple
- monitor support are excluded from the Cygwin build, since at the
+ - windows/Makefile.cyg is for Cygwin / mingw32 installations. Type
+ `make -f Makefile.cyg' while in the `windows' subdirectory to
+ build all the PuTTY binaries. Note that by default the multiple
+ monitor support is excluded from the Cygwin build, since at the
time of writing Cygwin doesn't include the necessary headers.
- - Makefile.lcc is for lcc-win32. Type `make -f Makefile.lcc'. (You
- will probably need to specify COMPAT=-DNO_MULTIMON.)
+ - windows/Makefile.lcc is for lcc-win32. Type `make -f
+ Makefile.lcc' while in the `windows' subdirectory. (You will
+ probably need to specify COMPAT=-DNO_MULTIMON.)
For building on Unix:
# Overall project name.
!name putty
# Locations and types of output Makefiles.
-!makefile vc Makefile.vc
-!makefile vcproj MSVC
-!makefile cygwin Makefile.cyg
-!makefile borland Makefile.bor
-!makefile lcc Makefile.lcc
+!makefile vc windows/Makefile.vc
+!makefile vcproj windows/MSVC
+!makefile cygwin windows/Makefile.cyg
+!makefile borland windows/Makefile.bor
+!makefile lcc windows/Makefile.lcc
!makefile gtk unix/Makefile.gtk
!makefile mpw mac/Makefile.mpw
# Source directories.
!srcdir charset/
+!srcdir windows/
!srcdir unix/
!srcdir mac/
# Hack to force version.o to be rebuilt always.
!begin vc
version.obj: *.c *.h *.rc
- cl $(FWHACK) $(VER) $(CFLAGS) /c version.c
+ cl $(FWHACK) $(VER) $(CFLAGS) /c ..\version.c
!end
+!specialobj vc version
!begin cygwin
-version.o: FORCE;
+version.o: FORCE
FORCE:
- $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c version.c
+ $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c ../version.c
!end
+!specialobj cygwin version
!begin borland
version.obj: FORCE
FORCE:
- bcc32 $(FWHACK) $(VER) $(CFLAGS) /c version.c
+ bcc32 $(FWHACK) $(VER) $(CFLAGS) /c ..\version.c
!end
+!specialobj borland version
!begin lcc
version.o: FORCE
FORCE:
- lcc $(FWHACK) $(VER) $(CFLAGS) /c version.c
+ lcc $(FWHACK) $(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
$(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c ../version.c; \
fi
!end
+!specialobj gtk version
# `make install' target for Unix.
!begin gtk
+ config dialog
# GUI front end and terminal emulator (putty, puttytel).
-GUITERM = TERMINAL window windlg winctrls sizetip unicode printing
+GUITERM = TERMINAL window windlg winctrls sizetip winucs winprint
+ winutils wincfg
# Same thing on Unix.
SSH = ssh sshcrc sshdes sshmd5 sshrsa sshrand sshsha sshblowf
+ sshdh sshcrcda sshpubk sshzlib sshdss x11fwd portfwd
+ sshaes sshsh512 sshbn wildcard
-WINSSH = SSH noise pageantc
+WINSSH = SSH winnoise winpgntc
UXSSH = SSH uxnoise uxagentc
MACSSH = SSH macnoise
putty : [G] GUITERM NONSSH WINSSH BE_ALL WINMISC win_res.res LIBS
puttytel : [G] GUITERM NONSSH BE_NOSSH WINMISC win_res.res LIBS
-plink : [C] plink console NONSSH WINSSH BE_ALL logging WINMISC
+plink : [C] winplink wincons NONSSH WINSSH BE_ALL logging WINMISC
+ plink.res LIBS
-pscp : [C] scp winsftp console WINSSH BE_SSH SFTP wildcard WINMISC
+pscp : [C] scp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC
+ scp.res LIBS
-psftp : [C] psftp winsftp console WINSSH BE_SSH SFTP WINMISC scp.res LIBS
+psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP WINMISC scp.res LIBS
-pageant : [G] pageant sshrsa sshpubk sshdes sshbn sshmd5 version tree234
- + misc sshaes sshsha pageantc sshdss sshsh512 winutils winmisc
+pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234
+ + misc sshaes sshsha winpgntc sshdss sshsh512 winutils winmisc
+ pageant.res LIBS
-puttygen : [G] puttygen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version
- + sshrand noise sshsha winstore misc winctrls sshrsa sshdss winmisc
+puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version
+ + sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc
+ sshpubk sshaes sshsh512 import winutils puttygen.res tree234 LIBS
pterm : [X] UXTERM uxmisc misc ldisc settings pty uxsel BE_NONE uxstore
if ($_[0] eq "!name") { $project_name = $_[1]; next; }
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 "!begin") {
if (&mfval($_[1])) {
$divert = \$makefile_extra{$_[1]};
my ($path) = shift @_;
my ($sep) = shift @_;
my $ret = "", $i;
- while (($i = index $path, $sep) >= 0) {
- $path = substr $path, ($i + length $sep);
+
+ while (($i = index $path, $sep) >= 0 ||
+ ($j = index $path, "/") >= 0) {
+ if ($i >= 0 and ($j < 0 or $i < $j)) {
+ $path = substr $path, ($i + length $sep);
+ } else {
+ $path = substr $path, ($j + 1);
+ }
$ret .= "..$sep";
}
return $ret;
}
sub deps {
- my ($otmpl, $rtmpl, $prefix, $dirsep, $depchar, $splitchar) = @_;
+ my ($otmpl, $rtmpl, $prefix, $dirsep, $mftyp, $depchar, $splitchar) = @_;
my ($i, $x, $y);
my @deps, @ret;
@ret = ();
$depchar ||= ':';
foreach $i (sort keys %depends) {
+ next if $specialobj{$mftyp}->{$i};
if ($i =~ /^(.*)\.(res|rsrc)/) {
next if !defined $rtmpl;
$y = $1;
" --define WINVER=0x0400 --define MINGW32_FIX=1")."\n".
"\n".
".SUFFIXES:\n".
- "\n".
- "%.o: %.c\n".
- "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n".
- "\n".
- "%.res.o: %.rc\n".
- "\t\$(RC) \$(FWHACK) \$(RCFL) \$(RCFLAGS) \$< \$\@\n".
"\n";
print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
print "\n\n";
"-Wl,-Map,$prog.map " .
$objstr . " $libstr", 69), "\n\n";
}
- foreach $d (&deps("X.o", "X.res.o", $dirpfx, "/")) {
+ foreach $d (&deps("X.o", "X.res.o", $dirpfx, "/", "cygwin")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
+ if ($d->{obj} =~ /\.res\.o$/) {
+ print "\t\$(RC) \$(FWHACK) \$(RCFL) \$(RCFLAGS) ".$d->{deps}->[0]." ".$d->{obj}."\n\n";
+ } else {
+ print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c ".$d->{deps}->[0]."\n\n";
+ }
}
print "\n";
print $makefile_extra{'cygwin'};
print "\techo " . &objects($p, undef, "X.res", undef) . " >> $prog.rsp\n";
print "\n";
}
- foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\")) {
+ foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "borland")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
}
"MAKEFILE = Makefile.vc\n".
"\n".
"# C compilation flags\n".
- "CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n".
+ "CFLAGS = /nologo /W3 /O1 " .
+ (join " ", map {"-I$dirpfx$_"} @srcdirs) .
+ " /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n".
"LFLAGS = /incremental:no /fixed\n".
"\n".
- ".c.obj:\n".
- "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c \$*.c\n".
- ".rc.res:\n".
- "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n".
"\n";
print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
print "\n\n";
}
print "\n";
}
- foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\")) {
+ foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "vc")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
+ if ($d->{obj} =~ /.obj$/) {
+ print "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c ".$d->{deps}->[0],"\n\n";
+ } else {
+ print "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 ".$d->{deps}->[0],"\n\n";
+ }
}
print "\n";
print $makefile_extra{'vc'};
}
if (defined $makefiles{'vcproj'}) {
+ $dirpfx = &dirpfx($makefiles{'vcproj'}, "\\");
$orig_dir = cwd;
mkdir $makefiles{'vcproj'}
if(! -d $makefiles{'vcproj'});
chdir $makefiles{'vcproj'};
- @deps = &deps("X.obj", "X.res", "", "\\");
+ @deps = &deps("X.obj", "X.res", $dirpfx, "\\", "vcproj");
%all_object_deps = map {$_->{obj} => $_->{deps}} @deps;
# Create the project files
# Get names of all Windows projects (GUI and console)
"# PROP Intermediate_Dir \"Release\"\r\n".
"# PROP Ignore_Export_Lib 0\r\n".
"# PROP Target_Dir \"\"\r\n".
- "# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n".
- "# ADD CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n".
+ "# ADD BASE CPP /nologo /W3 /GX /O2 ".
+ (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) .
+ " /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n".
+ "# ADD CPP /nologo /W3 /GX /O2 ".
+ (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) .
+ " /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n".
"# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n".
"# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n".
"# ADD BASE RSC /l 0x809 /d \"NDEBUG\"\r\n".
"# PROP Intermediate_Dir \"Debug\"\r\n".
"# PROP Ignore_Export_Lib 0\r\n".
"# PROP Target_Dir \"\"\r\n".
- "# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n".
- "# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n".
+ "# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od ".
+ (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) .
+ " /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n".
+ "# ADD CPP /nologo /W3 /Gm /GX /ZI /Od ".
+ (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) .
+ " /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n".
"# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n".
"# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n".
"# ADD BASE RSC /l 0x809 /d \"_DEBUG\"\r\n".
print &splitline("\t\$(CC)" . $mw . " \$(${type}LDFLAGS) -o \$@ " .
$objstr . " $libstr", 69), "\n\n";
}
- foreach $d (&deps("X.o", undef, $dirpfx, "/")) {
+ foreach $d (&deps("X.o", undef, $dirpfx, "/", "gtk")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
}
}
}
- foreach $d (&deps("", "X.rsrc", "::", ":")) {
+ foreach $d (&deps("", "X.rsrc", "::", ":", "mpw")) {
next unless $d->{obj};
print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}),
undef, "\xb6"), "\n";
print "\tRez ", $d->{deps}->[0], " -o {Targ} {ROptions}\n\n";
}
foreach $arch (qw(68K CFM68K)) {
- foreach $d (&deps("X.\L$arch\E.o", "", "::", ":")) {
+ foreach $d (&deps("X.\L$arch\E.o", "", "::", ":", "mpw")) {
next unless $d->{obj};
print &splitline(sprintf("%s \xc4 %s", $d->{obj},
join " ", @{$d->{deps}}),
}
}
foreach $arch (qw(PPC Carbon)) {
- foreach $d (&deps("X.\L$arch\E.o", "", "::", ":")) {
+ foreach $d (&deps("X.\L$arch\E.o", "", "::", ":", "mpw")) {
next unless $d->{obj};
print &splitline(sprintf("%s \xc4 %s", $d->{obj},
join " ", @{$d->{deps}}),
"\n".
"\n".
"# Get include directory for resource compiler\n".
- "\n".
- ".c.obj:\n".
- &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)".
- " \$(XFLAGS) \$(CFLAGS) \$*.c",69)."\n".
- ".rc.res:\n".
- &splitline("\tlrc \$(FWHACK) \$(RCFL) -r \$*.rc",69)."\n".
"\n";
print &splitline("all:" . join "", map { " $_.exe" } &progrealnames("GC"));
print "\n\n";
print "\n\n";
}
- foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\")) {
+ foreach $d (&deps("X.obj", "X.res", $dirpfx, "\\", "lcc")) {
print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})),
"\n";
+ if ($d->{obj} =~ /\.obj$/) {
+ print &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)".
+ " \$(XFLAGS) \$(CFLAGS) ".$d->{deps}->[0],69)."\n";
+ } else {
+ print &splitline("\tlrc \$(FWHACK) \$(RCFL) -r ".$d->{deps}->[0],69)."\n";
+ }
}
print "\n";
print $makefile_extra{'lcc'};
-; -*- no -*-\r
-; putty.iss\r
-;\r
-; -- Inno Setup installer script for PuTTY and its related tools.\r
-;\r
-; TODO for future releases:\r
-;\r
-; - It would be neighbourly to set up an [UninstallRun] entry that ran\r
-; some close cousin of `putty -cleanup', only it should prompt first\r
-; in case the user wants to keep stuff. And make the `leave it alone'\r
-; button the DEFAULT. And perhaps warn that on NT-style systems not\r
-; everything will be caught by this.\r
-;\r
-; - The Quick Launch bar is an interesting thought. Certainly a fair\r
-; number of people actually _believe_ my silly joke about how PuTTY\r
-; is the only thing that makes Windows usable, so perhaps they'd like\r
-; that. Unchecked by default, though, I think.\r
-; * does this need to be conditional on the Windows version?\r
-\r
-[Setup]\r
-AppName=PuTTY\r
-AppVerName=PuTTY version 0.56\r
-DefaultDirName={pf}\PuTTY\r
-DefaultGroupName=PuTTY\r
-UninstallDisplayIcon={app}\putty.exe\r
-ChangesAssociations=yes\r
-Compression=zip/9\r
-\r
-[Files]\r
-Source: "putty.exe"; DestDir: "{app}"\r
-Source: "pageant.exe"; DestDir: "{app}"\r
-Source: "puttygen.exe"; DestDir: "{app}"\r
-Source: "pscp.exe"; DestDir: "{app}"\r
-Source: "psftp.exe"; DestDir: "{app}"\r
-Source: "plink.exe"; DestDir: "{app}"\r
-Source: "website.url"; DestDir: "{app}"\r
-Source: "doc\putty.hlp"; DestDir: "{app}"\r
-Source: "doc\putty.cnt"; DestDir: "{app}"\r
-Source: "LICENCE"; DestDir: "{app}"\r
-Source: "README.txt"; DestDir: "{app}"; Flags: isreadme\r
-\r
-[Icons]\r
-Name: "{group}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: startmenu\r
-Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu\r
-Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu\r
-Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu\r
-Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu\r
-Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu\r
-Name: "{userdesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon\r
-\r
-[Tasks]\r
-Name: startmenu; Description: "Create a &Start Menu group"\r
-Name: desktopicon; Description: "Create a &desktop icon for PuTTY"\r
-Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant"\r
-\r
-[Registry]\r
-Root: HKCR; Subkey: ".ppk"; ValueType: string; ValueName: ""; ValueData: "PuTTYPrivateKey"; Flags: uninsdeletevalue; Tasks: associate\r
-Root: HKCR; Subkey: "PuTTYPrivateKey"; ValueType: string; ValueName: ""; ValueData: "PuTTY Private Key File"; Flags: uninsdeletekey; Tasks: associate\r
-Root: HKCR; Subkey: "PuTTYPrivateKey\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\pageant.exe,0"; Tasks: associate\r
-Root: HKCR; Subkey: "PuTTYPrivateKey\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\pageant.exe"" ""%1"""; Tasks: associate\r
-Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit"; ValueType: string; ValueName: ""; ValueData: "&Edit"; Tasks: associate\r
-Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: """{app}\puttygen.exe"" ""%1"""; Tasks: associate\r
+; -*- no -*-
+; putty.iss
+;
+; -- Inno Setup installer script for PuTTY and its related tools.
+;
+; TODO for future releases:
+;
+; - It would be neighbourly to set up an [UninstallRun] entry that ran
+; some close cousin of `putty -cleanup', only it should prompt first
+; in case the user wants to keep stuff. And make the `leave it alone'
+; button the DEFAULT. And perhaps warn that on NT-style systems not
+; everything will be caught by this.
+;
+; - The Quick Launch bar is an interesting thought. Certainly a fair
+; number of people actually _believe_ my silly joke about how PuTTY
+; is the only thing that makes Windows usable, so perhaps they'd like
+; that. Unchecked by default, though, I think.
+; * does this need to be conditional on the Windows version?
+
+[Setup]
+AppName=PuTTY
+AppVerName=PuTTY version 0.56
+DefaultDirName={pf}\PuTTY
+DefaultGroupName=PuTTY
+UninstallDisplayIcon={app}\putty.exe
+ChangesAssociations=yes
+Compression=zip/9
+
+[Files]
+Source: "putty.exe"; DestDir: "{app}"
+Source: "pageant.exe"; DestDir: "{app}"
+Source: "puttygen.exe"; DestDir: "{app}"
+Source: "pscp.exe"; DestDir: "{app}"
+Source: "psftp.exe"; DestDir: "{app}"
+Source: "plink.exe"; DestDir: "{app}"
+Source: "website.url"; DestDir: "{app}"
+Source: "doc\putty.hlp"; DestDir: "{app}"
+Source: "doc\putty.cnt"; DestDir: "{app}"
+Source: "LICENCE"; DestDir: "{app}"
+Source: "README.txt"; DestDir: "{app}"; Flags: isreadme
+
+[Icons]
+Name: "{group}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: startmenu
+Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu
+Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu
+Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu
+Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu
+Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu
+Name: "{userdesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon
+
+[Tasks]
+Name: startmenu; Description: "Create a &Start Menu group"
+Name: desktopicon; Description: "Create a &desktop icon for PuTTY"
+Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant"
+
+[Registry]
+Root: HKCR; Subkey: ".ppk"; ValueType: string; ValueName: ""; ValueData: "PuTTYPrivateKey"; Flags: uninsdeletevalue; Tasks: associate
+Root: HKCR; Subkey: "PuTTYPrivateKey"; ValueType: string; ValueName: ""; ValueData: "PuTTY Private Key File"; Flags: uninsdeletekey; Tasks: associate
+Root: HKCR; Subkey: "PuTTYPrivateKey\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\pageant.exe,0"; Tasks: associate
+Root: HKCR; Subkey: "PuTTYPrivateKey\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\pageant.exe"" ""%1"""; Tasks: associate
+Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit"; ValueType: string; ValueName: ""; ValueData: "&Edit"; Tasks: associate
+Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: """{app}\puttygen.exe"" ""%1"""; Tasks: associate