Joe Yates's patch to make mkfiles.pl generate Visual Studio project
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 17 Jan 2004 13:48:40 +0000 (13:48 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 17 Jan 2004 13:48:40 +0000 (13:48 +0000)
files as well as an nmake makefile. Needed line-end tweakery in
order to be able to generate usable project files when run on Unix,
but other than that appears fine. Ooh!

git-svn-id: svn://svn.tartarus.org/sgt/putty@3721 cda61777-01e9-0310-a592-d414129be87e

README
mkfiles.pl

diff --git a/README b/README
index de698aa..b9a7cc6 100644 (file)
--- a/README
+++ b/README
@@ -1,17 +1,26 @@
 This is the README for the source archive of PuTTY, a free Win32
 Telnet and SSH client.
 
-If you want to rebuild PuTTY from source, we provide three
-Makefiles:
+If you want to rebuild PuTTY from source, we provide a variety of
+Makefiles and equivalents:
 
- - Makefile.vc is for MS Visual C++ systems. Type `nmake -f
-   Makefile.vc' to build all the PuTTY binaries.
+ - Makefile.vc is for command-line builds on MS Visual C++ systems.
+   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.
+
+   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.
 
@@ -22,21 +31,6 @@ Makefiles:
    time of writing this Cygwin doesn't include the necessary
    headers.
 
-If you have MS Visual Studio version 6 and you want to build a
-DevStudio project for GUI editing and debugging, you should be aware
-that the default GUI configuration of the compiler falls over on the
-nasty macros in ssh.c. This is a bug in Visual Studio. The culprit
-is the /ZI compiler option (debug info generation: Edit and
-Continue). To avoid this problem while compiling PuTTY under VS6,
-you should:
- - right-click ssh.c in the FileView
- - click Settings
- - select the C/C++ tab and the General category
- - under `Debug info:', select anything _other_ than `Program
-   Database for Edit and Continue'.
-Alternatively disable the /ZI option, replacing it with a saner
-value, such as /Zi.
-
 All of the Makefiles are generated automatically from the file
 `Recipe' by the Perl script `mkfiles.pl'. Additions and corrections
 to Recipe and the mkfiles.pl are much more useful than additions and
index 652d2ec..f9c48c0 100755 (executable)
@@ -533,6 +533,256 @@ print
 "\t-del debug.log\n";
 select STDOUT; close OUT;
 
+##-- MSVC 6 Workspace and projects
+#
+# Note: All files created in this section are written in binary
+# mode, because although MSVC's command-line make can deal with
+# LF-only line endings, MSVC project files really _need_ to be
+# CRLF. Hence, in order for mkfiles.pl to generate usable project
+# files even when run from Unix, I make sure all files are binary
+# and explicitly write the CRLFs.
+#
+# Create directories if necessary
+mkdir 'MSVC'
+       if(! -d 'MSVC');
+chdir 'MSVC';
+@deps = &deps("X.obj", "X.res", "", "\\");
+%all_object_deps = map {$_->{obj} => $_->{deps}} @deps;
+# Create the project files
+# Get names of all Windows projects (GUI and console)
+my @prognames = &prognames("GC");
+foreach $progname (@prognames) {
+       create_project(\%all_object_deps, $progname);
+}
+# Create the workspace file
+open OUT, ">putty.dsw"; binmode OUT; select OUT;
+print
+"Microsoft Developer Studio Workspace File, Format Version 6.00\r\n".
+"# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n".
+"\r\n".
+"###############################################################################\r\n".
+"\r\n";
+# List projects
+foreach $progname (@prognames) {
+  ($windows_project, $type) = split ",", $progname;
+       print "Project: \"$windows_project\"=\".\\$windows_project\\$windows_project.dsp\" - Package Owner=<4>\r\n";
+}
+print
+"\r\n".
+"Package=<5>\r\n".
+"{{{\r\n".
+"}}}\r\n".
+"\r\n".
+"Package=<4>\r\n".
+"{{{\r\n".
+"}}}\r\n".
+"\r\n".
+"###############################################################################\r\n".
+"\r\n".
+"Global:\r\n".
+"\r\n".
+"Package=<5>\r\n".
+"{{{\r\n".
+"}}}\r\n".
+"\r\n".
+"Package=<3>\r\n".
+"{{{\r\n".
+"}}}\r\n".
+"\r\n".
+"###############################################################################\r\n".
+"\r\n";
+select STDOUT; close OUT;
+chdir '..';
+
+sub create_project {
+       my ($all_object_deps, $progname) = @_;
+       # Construct program's dependency info
+       %seen_objects = ();
+       %lib_files = ();
+       %source_files = ();
+       %header_files = ();
+       %resource_files = ();
+       @object_files = split " ", &objects($progname, "X.obj", "X.res", "X.lib");
+       foreach $object_file (@object_files) {
+               next if defined $seen_objects{$object_file};
+               $seen_objects{$object_file} = 1;
+               if($object_file =~ /\.lib$/io) {
+                       $lib_files{$object_file} = 1;
+                       next;
+               }
+               $object_deps = $all_object_deps{$object_file};
+               foreach $object_dep (@$object_deps) {
+                       if($object_dep =~ /\.c$/io) {
+                               $source_files{$object_dep} = 1;
+                               next;
+                       }
+                       if($object_dep =~ /\.h$/io) {
+                               $header_files{$object_dep} = 1;
+                               next;
+                       }
+                       if($object_dep =~ /\.(rc|ico)$/io) {
+                               $resource_files{$object_dep} = 1;
+                               next;
+                       }
+               }
+       }
+       $libs = join " ", sort keys %lib_files;
+       @source_files = sort keys %source_files;
+       @header_files = sort keys %header_files;
+       @resources = sort keys %resource_files;
+  ($windows_project, $type) = split ",", $progname;
+       mkdir $windows_project
+               if(! -d $windows_project);
+       chdir $windows_project;
+  $subsys = ($type eq "G") ? "windows" : "console";
+       open OUT, ">$windows_project.dsp"; binmode OUT; select OUT;
+       print
+       "# Microsoft Developer Studio Project File - Name=\"$windows_project\" - Package Owner=<4>\r\n".
+       "# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n".
+       "# ** DO NOT EDIT **\r\n".
+       "\r\n".
+       "# TARGTYPE \"Win32 (x86) Application\" 0x0101\r\n".
+       "\r\n".
+       "CFG=$windows_project - Win32 Debug\r\n".
+       "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n".
+       "!MESSAGE use the Export Makefile command and run\r\n".
+       "!MESSAGE \r\n".
+       "!MESSAGE NMAKE /f \"$windows_project.mak\".\r\n".
+       "!MESSAGE \r\n".
+       "!MESSAGE You can specify a configuration when running NMAKE\r\n".
+       "!MESSAGE by defining the macro CFG on the command line. For example:\r\n".
+       "!MESSAGE \r\n".
+       "!MESSAGE NMAKE /f \"$windows_project.mak\" CFG=\"$windows_project - Win32 Debug\"\r\n".
+       "!MESSAGE \r\n".
+       "!MESSAGE Possible choices for configuration are:\r\n".
+       "!MESSAGE \r\n".
+       "!MESSAGE \"$windows_project - Win32 Release\" (based on \"Win32 (x86) Application\")\r\n".
+       "!MESSAGE \"$windows_project - Win32 Debug\" (based on \"Win32 (x86) Application\")\r\n".
+       "!MESSAGE \r\n".
+       "\r\n".
+       "# Begin Project\r\n".
+       "# PROP AllowPerConfigDependencies 0\r\n".
+       "# PROP Scc_ProjName \"\"\r\n".
+       "# PROP Scc_LocalPath \"\"\r\n".
+       "CPP=cl.exe\r\n".
+       "MTL=midl.exe\r\n".
+       "RSC=rc.exe\r\n".
+       "\r\n".
+       "!IF  \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n".
+       "\r\n".
+       "# PROP BASE Use_MFC 0\r\n".
+       "# PROP BASE Use_Debug_Libraries 0\r\n".
+       "# PROP BASE Output_Dir \"Release\"\r\n".
+       "# PROP BASE Intermediate_Dir \"Release\"\r\n".
+       "# PROP BASE Target_Dir \"\"\r\n".
+       "# PROP Use_MFC 0\r\n".
+       "# PROP Use_Debug_Libraries 0\r\n".
+       "# PROP Output_Dir \"Release\"\r\n".
+       "# 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 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".
+       "# ADD RSC /l 0x809 /d \"NDEBUG\"\r\n".
+       "BSC32=bscmake.exe\r\n".
+       "# ADD BASE BSC32 /nologo\r\n".
+       "# ADD BSC32 /nologo\r\n".
+       "LINK32=link.exe\r\n".
+       "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:$subsys /machine:I386\r\n".
+       "# ADD LINK32 $libs /nologo /subsystem:$subsys /machine:I386\r\n".
+       "# SUBTRACT LINK32 /pdb:none\r\n".
+       "\r\n".
+       "!ELSEIF  \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n".
+       "\r\n".
+       "# PROP BASE Use_MFC 0\r\n".
+       "# PROP BASE Use_Debug_Libraries 1\r\n".
+       "# PROP BASE Output_Dir \"Debug\"\r\n".
+       "# PROP BASE Intermediate_Dir \"Debug\"\r\n".
+       "# PROP BASE Target_Dir \"\"\r\n".
+       "# PROP Use_MFC 0\r\n".
+       "# PROP Use_Debug_Libraries 1\r\n".
+       "# PROP Output_Dir \"Debug\"\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 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".
+       "# ADD RSC /l 0x809 /d \"_DEBUG\"\r\n".
+       "BSC32=bscmake.exe\r\n".
+       "# ADD BASE BSC32 /nologo\r\n".
+       "# ADD BSC32 /nologo\r\n".
+       "LINK32=link.exe\r\n".
+       "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:$subsys /debug /machine:I386 /pdbtype:sept\r\n".
+       "# ADD LINK32 $libs /nologo /subsystem:$subsys /debug /machine:I386 /pdbtype:sept\r\n".
+       "# SUBTRACT LINK32 /pdb:none\r\n".
+       "\r\n".
+       "!ENDIF \r\n".
+       "\r\n".
+       "# Begin Target\r\n".
+       "\r\n".
+       "# Name \"$windows_project - Win32 Release\"\r\n".
+       "# Name \"$windows_project - Win32 Debug\"\r\n".
+       "# Begin Group \"Source Files\"\r\n".
+       "\r\n".
+       "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n";
+       foreach $source_file (@source_files) {
+               print
+               "# Begin Source File\r\n".
+               "\r\n".
+               "SOURCE=..\\..\\$source_file\r\n";
+               if($source_file =~ /ssh\.c/io) {
+                       # Disable 'Edit and continue' as Visual Studio can't handle the macros
+                       print
+                       "\r\n".
+                       "!IF  \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n".
+                       "\r\n".
+                       "!ELSEIF  \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n".
+                       "\r\n".
+                       "# ADD CPP /Zi\r\n".
+                       "\r\n".
+                       "!ENDIF \r\n".
+                       "\r\n";
+               }
+               print "# End Source File\r\n";
+       }
+       print
+       "# End Group\r\n".
+       "# Begin Group \"Header Files\"\r\n".
+       "\r\n".
+       "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n";
+       foreach $header_file (@header_files) {
+               print
+               "# Begin Source File\r\n".
+               "\r\n".
+               "SOURCE=..\\..\\$header_file\r\n".
+               "# End Source File\r\n";
+               }
+       print
+       "# End Group\r\n".
+       "# Begin Group \"Resource Files\"\r\n".
+       "\r\n".
+       "# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\r\n";
+       foreach $resource_file (@resources) {
+               print
+               "# Begin Source File\r\n".
+               "\r\n".
+               "SOURCE=..\\..\\$resource_file\r\n".
+               "# End Source File\r\n";
+               }
+       print
+       "# End Group\r\n".
+       "# End Target\r\n".
+       "# End Project\r\n";
+       select STDOUT; close OUT;
+       chdir '..';
+       }
+
 ##-- X/GTK/Unix makefile
 open OUT, ">unix/Makefile.gtk"; select OUT;
 print