From 58de2f3c7d0312d782a9940c898399f473fb2a2b Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 17 Jan 2004 13:48:40 +0000 Subject: [PATCH] Joe Yates's patch to make mkfiles.pl generate Visual Studio project 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 | 32 ++++---- mkfiles.pl | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+), 19 deletions(-) diff --git a/README b/README index de698aa8..b9a7cc63 100644 --- 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 diff --git a/mkfiles.pl b/mkfiles.pl index 652d2ecf..f9c48c0a 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -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 -- 2.11.0