Browse Source

ENH: rework cmake, added ruleMaker classes and changed the syntax of the CMakeLists.txt files.

Bill Hoffman 25 years ago
parent
commit
c54a05bfc7
78 changed files with 2941 additions and 911 deletions
  1. 8 13
      Source/CMakeBuildTargets.cxx
  2. 14 13
      Source/CMakeSetupCMD.cxx
  3. 222 2
      Source/CMakeSetupCMD.dsp
  4. 202 2
      Source/MFCDialog/CMakeSetup.dsp
  5. 13 11
      Source/MFCDialog/CMakeSetupDialog.cpp
  6. 59 17
      Source/Makefile.in
  7. 26 0
      Source/cmAbstractFilesRule.cxx
  8. 37 0
      Source/cmAbstractFilesRule.h
  9. 19 0
      Source/cmAddTargetRule.cxx
  10. 37 0
      Source/cmAddTargetRule.h
  11. 46 0
      Source/cmAuxSourceDirectoryRule.cxx
  12. 38 0
      Source/cmAuxSourceDirectoryRule.h
  13. 3 6
      Source/cmClassFile.cxx
  14. 7 2
      Source/cmClassFile.h
  15. 0 139
      Source/cmCollectFlags.cxx
  16. 0 107
      Source/cmCollectFlags.h
  17. 51 39
      Source/cmDSPMakefile.cxx
  18. 9 5
      Source/cmDSPMakefile.h
  19. 51 39
      Source/cmDSPWriter.cxx
  20. 9 5
      Source/cmDSPWriter.h
  21. 53 47
      Source/cmDSWMakefile.cxx
  22. 9 10
      Source/cmDSWMakefile.h
  23. 53 47
      Source/cmDSWWriter.cxx
  24. 9 10
      Source/cmDSWWriter.h
  25. 2 3
      Source/cmDirectory.cxx
  26. 2 5
      Source/cmDirectory.h
  27. 20 0
      Source/cmExecutablesRule.cxx
  28. 37 0
      Source/cmExecutablesRule.h
  29. 18 0
      Source/cmFindIncludeRule.cxx
  30. 38 0
      Source/cmFindIncludeRule.h
  31. 18 0
      Source/cmFindLibraryRule.cxx
  32. 38 0
      Source/cmFindLibraryRule.h
  33. 65 0
      Source/cmFindProgramRule.cxx
  34. 39 0
      Source/cmFindProgramRule.h
  35. 18 0
      Source/cmIncludeDirectoryRule.cxx
  36. 38 0
      Source/cmIncludeDirectoryRule.h
  37. 14 0
      Source/cmLibraryRule.cxx
  38. 37 0
      Source/cmLibraryRule.h
  39. 18 0
      Source/cmLinkDirectoriesRule.cxx
  40. 42 0
      Source/cmLinkDirectoriesRule.h
  41. 18 0
      Source/cmLinkLibrariesRule.cxx
  42. 45 0
      Source/cmLinkLibrariesRule.h
  43. 31 0
      Source/cmMSProjectGenerator.cxx
  44. 45 0
      Source/cmMSProjectGenerator.h
  45. 17 20
      Source/cmMakeDepend.cxx
  46. 1 2
      Source/cmMakeDepend.h
  47. 311 177
      Source/cmMakefile.cxx
  48. 104 27
      Source/cmMakefile.h
  49. 7 0
      Source/cmMakefileGenerator.cxx
  50. 20 0
      Source/cmMakefileGenerator.h
  51. 14 0
      Source/cmProjectRule.cxx
  52. 38 0
      Source/cmProjectRule.h
  53. 2 1
      Source/cmRegularExpression.cxx
  54. 1 1
      Source/cmRegularExpression.h
  55. 52 0
      Source/cmRuleMaker.h
  56. 39 0
      Source/cmSourceFilesRequireRule.cxx
  57. 37 0
      Source/cmSourceFilesRequireRule.h
  58. 21 0
      Source/cmSourceFilesRule.cxx
  59. 37 0
      Source/cmSourceFilesRule.h
  60. 29 0
      Source/cmStandardIncludes.h
  61. 18 0
      Source/cmSubdirRule.cxx
  62. 40 0
      Source/cmSubdirRule.h
  63. 156 71
      Source/cmSystemTools.cxx
  64. 22 21
      Source/cmSystemTools.h
  65. 20 0
      Source/cmTestsRule.cxx
  66. 37 0
      Source/cmTestsRule.h
  67. 25 0
      Source/cmUnixDefinesRule.cxx
  68. 40 0
      Source/cmUnixDefinesRule.h
  69. 25 0
      Source/cmUnixLibrariesRule.cxx
  70. 39 0
      Source/cmUnixLibrariesRule.h
  71. 88 60
      Source/cmUnixMakefileGenerator.cxx
  72. 7 6
      Source/cmUnixMakefileGenerator.h
  73. 28 0
      Source/cmWin32DefinesRule.cxx
  74. 39 0
      Source/cmWin32DefinesRule.h
  75. 25 0
      Source/cmWin32LibrariesRule.cxx
  76. 42 0
      Source/cmWin32LibrariesRule.h
  77. 1 2
      Source/cmWindowsConfigure.cxx
  78. 1 1
      Source/cmWindowsConfigure.h

+ 8 - 13
Source/CMakeBuildTargets.cxx

@@ -1,7 +1,7 @@
-#include "cmUnixMakefile.h"
+#include "cmMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmMakeDepend.h"
-#include <iostream>
-
+#include "cmUnixMakefileGenerator.h"
 
 // This is the main program used to gentrate makefile fragments 
 // from CMakeLists.txt input files.   
@@ -12,10 +12,9 @@ main(int ac, char** av)
     std::cerr << "Usage: " << av[0] << " Makefile.in  -Ipath ..." << std::endl;
     return -1;
     }
-  // Create a unix makefile
-  cmUnixMakefile mf;
-  // Create a depends object
-  cmMakeDepend md;
+  // Create a makefile
+  cmMakefile mf;
+  mf.AddDefinition("UNIX", "1");
   // Parse the command line
   if(ac > 2)
     {
@@ -42,16 +41,12 @@ main(int ac, char** av)
 	}
       }
     }
+  mf.SetMakefileGenerator(new cmUnixMakefileGenerator);
   // Read and parse the input makefile
   if(!mf.ReadMakefile(av[1]))
     {
     std::cerr << "Usage: " << av[0] << " Makefile.in  -Ipath ..." << std::endl;
     return -1;
     }
-  // Set the makefile object on the depend object
-  md.SetMakefile(&mf);
-  // compute the depend information
-  md.DoDepends();
-  // Ouput the result
-  mf.OutputMakefile("CMakeTargets.make");
+  mf.GenerateMakefile();
 }

+ 14 - 13
Source/CMakeSetupCMD.cxx

@@ -1,6 +1,7 @@
-#include "cmDSWMakefile.h"
-#include "cmDSPMakefile.h"
-#include <iostream>
+#include "cmStandardIncludes.h"
+#include "cmMakefile.h"
+#include "cmMSProjectGenerator.h"
+
 
 // this is the command line version of CMakeSetup.
 // It is called from Visual Studio when a CMakeLists.txt
@@ -21,7 +22,6 @@ void SetArgs(cmMakefile& builder, int ac, char** av)
     if(arg.find("-D",0) != std::string::npos)
       {
       std::string path = arg.substr(2);
-      std::cerr << "set makefile dir " << path.c_str() << std::endl;
       builder.SetCurrentDirectory(path.c_str());
       }
     if(arg.find("-O",0) != std::string::npos)
@@ -44,24 +44,25 @@ main(int ac, char** av)
   if(ac < 3)
     {
     std::cerr << "Usage: " << av[0] << 
-      " Makefile.in -[DSP|DSW] -Hinsighthome -Dcurrentdir -Ooutput directory" << std::endl;
+      " CMakeLists.txt -[DSP|DSW] -Hinsighthome -Dcurrentdir"
+      " -Ooutput directory" << std::endl;
     return -1;
     }
   std::string arg = av[2];
+  cmMakefile builder;
+  SetArgs(builder, ac, av);
+  cmMSProjectGenerator* pg = new cmMSProjectGenerator;
   if(arg.find("-DSP", 0) != std::string::npos)
     {
-    cmDSPMakefile builder;
-    SetArgs(builder, ac, av);
-    builder.ReadMakefile(av[1]);
-    builder.OutputDSPFile();
+    pg->SetBuildDSP();
     }
   else
     {
-    cmDSWMakefile builder;
-    SetArgs(builder, ac, av);
-    builder.ReadMakefile(av[1]);
-    builder.OutputDSWFile();
+    pg->SetBuildDSW();
     }
+  builder.SetMakefileGenerator(pg);
+  builder.ReadMakefile(av[1]);
+  builder.GenerateMakefile();
   return 0;
 }
 

+ 222 - 2
Source/CMakeSetupCMD.dsp

@@ -91,15 +91,23 @@ LINK32=link.exe
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 # Begin Source File
 
+SOURCE=.\cmAbstractFilesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmAddTargetRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\CMakeSetupCMD.cxx
 # End Source File
 # Begin Source File
 
-SOURCE=.\cmClassFile.cxx
+SOURCE=.\cmAuxSourceDirectoryRule.cxx
 # End Source File
 # Begin Source File
 
-SOURCE=.\cmCollectFlags.cxx
+SOURCE=.\cmClassFile.cxx
 # End Source File
 # Begin Source File
 
@@ -115,6 +123,38 @@ SOURCE=.\cmDSWMakefile.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=.\cmExecutablesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindIncludeRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindLibraryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindProgramRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmIncludeDirectoryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLibraryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLinkDirectoriesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLinkLibrariesRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\cmMakeDepend.cxx
 # End Source File
 # Begin Source File
@@ -123,16 +163,196 @@ SOURCE=.\cmMakefile.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=.\cmMakefileGenerator.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMSProjectGenerator.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmProjectRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\cmRegularExpression.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=.\cmSourceFilesRequireRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmSourceFilesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmSubdirRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\cmSystemTools.cxx
 # End Source File
+# Begin Source File
+
+SOURCE=.\cmTestsRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmUnixDefinesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmUnixLibrariesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWin32DefinesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWin32LibrariesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWindowsConfigure.cxx
+# End Source File
 # End Group
 # Begin Group "Header Files"
 
 # PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\cmAbstractFilesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmAddTargetRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmAuxSourceDirectoryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmClassFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmDirectory.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmDSPMakefile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmDSWMakefile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmExecutablesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindIncludeRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindLibraryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmFindProgramRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmIncludeDirectoryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLibraryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLinkDirectoriesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmLinkLibrariesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMakeDepend.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMakefile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMakefile2.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMakefileGenerator.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmMSProjectGenerator.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmProjectRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmRegularExpression.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmRuleMaker.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmSourceFilesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmStandardIncludes.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmSubdirRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmSystemTools.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmTestsRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmUnixDefinesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmUnixLibrariesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWin32DefinesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWin32LibrariesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmWindowsConfigure.h
+# End Source File
 # End Group
 # Begin Group "Resource Files"
 

+ 202 - 2
Source/MFCDialog/CMakeSetup.dsp

@@ -92,6 +92,14 @@ LINK32=link.exe
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 # Begin Source File
 
+SOURCE=..\cmAbstractFilesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmAddTargetRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\CMakeSetup.cpp
 # End Source File
 # Begin Source File
@@ -100,15 +108,19 @@ SOURCE=.\CMakeSetup.rc
 # End Source File
 # Begin Source File
 
+SOURCE=..\CMakeSetupCMD.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\CMakeSetupDialog.cpp
 # End Source File
 # Begin Source File
 
-SOURCE=..\cmClassFile.cxx
+SOURCE=..\cmAuxSourceDirectoryRule.cxx
 # End Source File
 # Begin Source File
 
-SOURCE=..\cmCollectFlags.cxx
+SOURCE=..\cmClassFile.cxx
 # End Source File
 # Begin Source File
 
@@ -124,6 +136,38 @@ SOURCE=..\cmDSWMakefile.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmExecutablesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindIncludeRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindLibraryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindProgramRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmIncludeDirectoryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLibraryRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLinkDirectoriesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLinkLibrariesRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmMakeDepend.cxx
 # End Source File
 # Begin Source File
@@ -132,14 +176,58 @@ SOURCE=..\cmMakefile.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmMakefileGenerator.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmMSProjectGenerator.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmProjectRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmRegularExpression.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmSourceFilesRequireRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSourceFilesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSubdirRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmSystemTools.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmTestsRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmUnixDefinesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmUnixLibrariesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmWin32DefinesRule.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmWin32LibrariesRule.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmWindowsConfigure.cxx
 # End Source File
 # Begin Source File
@@ -153,6 +241,14 @@ SOURCE=.\StdAfx.cpp
 # PROP Default_Filter "h;hpp;hxx;hm;inl"
 # Begin Source File
 
+SOURCE=..\cmAbstractFilesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmAddTargetRule.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\CMakeSetup.h
 # End Source File
 # Begin Source File
@@ -165,10 +261,18 @@ SOURCE=.\CMakeSetupDialog.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmAuxSourceDirectoryRule.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmClassFile.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmDirectory.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmDSPBuilder.h
 # End Source File
 # Begin Source File
@@ -185,6 +289,38 @@ SOURCE=..\cmDSWMakefile.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmExecutablesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindIncludeRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindLibraryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmFindProgramRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmIncludeDirectoryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLibraryRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLinkDirectoriesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmLinkLibrariesRule.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmMakeDepend.h
 # End Source File
 # Begin Source File
@@ -193,10 +329,74 @@ SOURCE=..\cmMakefile.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmMakefile2.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmMakefileGenerator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmMSProjectGenerator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmProjectRule.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\cmRegularExpression.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\cmRuleMaker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSourceFilesRequireRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSourceFilesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmStandardIncludes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSubdirRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmSystemTools.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmTestsRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmUnixDefinesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmUnixLibrariesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmWin32DefinesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmWin32LibrariesRule.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\cmWindowsConfigure.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\Resource.h
 # End Source File
 # Begin Source File

+ 13 - 11
Source/MFCDialog/CMakeSetupDialog.cpp

@@ -6,7 +6,7 @@
 #include "CMakeSetupDialog.h"
 #include "../cmDSWMakefile.h"
 #include "../cmWindowsConfigure.h"
-
+#include "../cmMSProjectGenerator.h"
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #undef THIS_FILE
@@ -269,19 +269,21 @@ void CMakeSetupDialog::OnOK()
     }
   
   
-  cmDSWMakefile builder;
-  // Set the ITK home directory
-  builder.SetHomeDirectory(m_WhereSource);
-  // Set the CMakeLists.txt file
-  CString makefileIn = m_WhereSource;
-  makefileIn += "/CMakeLists.txt";
-  builder.ReadMakefile(makefileIn);
+  cmMakefile mf;
+  mf.SetMakefileGenerator(new cmMSProjectGenerator);
+  mf.SetHomeDirectory(m_WhereSource);
+
   // Set the output directory
-  builder.SetOutputDirectory(m_WhereBuild);
+  mf.SetOutputDirectory(m_WhereBuild);
   // set the directory which contains the CMakeLists.txt
-  builder.SetCurrentDirectory(m_WhereSource);
+  mf.SetCurrentDirectory(m_WhereSource);
   // Create the master DSW file and all children dsp files for ITK
-  builder.OutputDSWFile();
+  // Set the CMakeLists.txt file
+  CString makefileIn = m_WhereSource;
+  makefileIn += "/CMakeLists.txt";
+  mf.ReadMakefile(makefileIn);
+  // Move this to the cache editor
+  mf.GenerateMakefile();
   CDialog::OnOK();
   this->SaveToRegistry();
 }

+ 59 - 17
Source/Makefile.in

@@ -10,26 +10,68 @@ VPATH         = @srcdir@
 @MAKEINCLUDE@ @MAKEQUOTE@@CMAKE_CONFIG_DIR@/CMake/CMakeSimpleRules.make@MAKEQUOTE@
 
 OBJS = \
-cmClassFile.o \
-cmDirectory.o \
-cmMakefile.o \
-cmUnixMakefile.o \
+CMakeBuildTargets.o  \
 cmMakeDepend.o \
+cmMakefile.o \
+cmAbstractFilesRule.o \
+cmMakefileGenerator.o \
+cmAddTargetRule.o  \
+cmProjectRule.o \
+cmAuxSourceDirectoryRule.o \
 cmRegularExpression.o \
+cmClassFile.o \
+cmSourceFilesRule.o \
+cmSourceFilesRequireRule.o \
+cmSubdirRule.o \
 cmSystemTools.o \
-CMakeBuildTargets.o \
-cmCollectFlags.o
-
-
-cmCollectFlags.o : cmCollectFlags.h cmCollectFlags.cxx cmSystemTools.h
-cmSystemTools.o : cmSystemTools.h cmSystemTools.cxx cmSystemTools.h
-cmDirectory.o : cmDirectory.h cmDirectory.cxx cmSystemTools.h
-cmClassFile.o : cmClassFile.h cmClassFile.cxx cmSystemTools.h
-cmMakefile.o : cmMakefile.h cmMakefile.cxx cmClassFile.h cmSystemTools.h
-cmUnixMakefile.o : cmUnixMakefile.h cmUnixMakefile.cxx cmMakefile.h cmClassFile.h
-cmMakeDepend.o : cmMakeDepend.h cmMakeDepend.cxx  cmMakefile.h cmClassFile.h cmRegularExpression.h
-cmRegularExpression.o : cmRegularExpression.h cmRegularExpression.cxx
-CMakeBuildTargets.o : CMakeBuildTargets.cxx cmMakefile.h cmMakeDepend.h
+cmDirectory.o \
+cmUnixDefinesRule.o \
+cmExecutablesRule.o \
+cmTestsRule.o \
+cmUnixLibrariesRule.o \
+cmFindIncludeRule.o \
+cmFindLibraryRule.o \
+cmUnixMakefileGenerator.o \
+cmFindProgramRule.o \
+cmIncludeDirectoryRule.o \
+cmWin32DefinesRule.o \
+cmLibraryRule.o \
+cmWin32LibrariesRule.o \
+cmLinkDirectoriesRule.o \
+cmLinkLibrariesRule.o 
+
+
+cmCollectFlags.o : $(srcdir)/*.h 
+CMakeBuildTargets.o  : $(srcdir)/*.h
+cmMakeDepend.o : $(srcdir)/*.h
+cmMakefile.o : $(srcdir)/*.h
+cmAbstractFilesRule.o : $(srcdir)/*.h
+cmMakefileGenerator.o : $(srcdir)/*.h
+cmAddTargetRule.o  : $(srcdir)/*.h
+cmProjectRule.o : $(srcdir)/*.h
+cmAuxSourceDirectoryRule.o : $(srcdir)/*.h
+cmRegularExpression.o : $(srcdir)/*.h
+cmClassFile.o : $(srcdir)/*.h
+cmSourceFilesRule.o : $(srcdir)/*.h
+cmSourceFilesRequireRule.o : $(srcdir)/*.h
+cmSubdirRule.o : $(srcdir)/*.h
+cmSystemTools.o : $(srcdir)/*.h
+cmDirectory.o : $(srcdir)/*.h
+cmUnixDefinesRule.o : $(srcdir)/*.h
+cmExecutablesRule.o : $(srcdir)/*.h
+cmTestsRule.o : $(srcdir)/*.h
+cmUnixLibrariesRule.o : $(srcdir)/*.h
+cmFindIncludeRule.o : $(srcdir)/*.h
+cmFindLibraryRule.o : $(srcdir)/*.h
+cmUnixMakefileGenerator.o : $(srcdir)/*.h
+cmFindProgramRule.o : $(srcdir)/*.h
+cmIncludeDirectoryRule.o : $(srcdir)/*.h
+cmWin32DefinesRule.o : $(srcdir)/*.h
+cmLibraryRule.o : $(srcdir)/*.h
+cmWin32LibrariesRule.o : $(srcdir)/*.h
+cmLinkDirectoriesRule.o : $(srcdir)/*.h 
+cmLinkLibrariesRule.o  : $(srcdir)/*.h 
+
 
 CMakeBuildTargets: ${OBJS}
 	${CXX}  ${OBJS} ${CXX_FLAGS}  -o CMakeBuildTargets

+ 26 - 0
Source/cmAbstractFilesRule.cxx

@@ -0,0 +1,26 @@
+#include "cmAbstractFilesRule.h"
+
+// cmAbstractFilesRule
+bool cmAbstractFilesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator j = args.begin();
+      j != args.end(); ++j)
+    {   
+    std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+    for(int i = 0; i < Classes.size(); i++)
+      {
+      if(Classes[i].m_ClassName == (*j))
+        {
+        Classes[i].m_AbstractClass = true;
+        break;
+        }
+      }
+    }
+  return true;
+}
+

+ 37 - 0
Source/cmAbstractFilesRule.h

@@ -0,0 +1,37 @@
+#ifndef cmAbstractFilesRule_h
+#define cmAbstractFilesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmAbstractFilesRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmAbstractFilesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "ABSTRACT_FILES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "A list of abstract classes, useful for wrappers.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "ABSTRACT_FILES(file1 file2 ..)";
+    }
+};
+
+
+
+#endif

+ 19 - 0
Source/cmAddTargetRule.cxx

@@ -0,0 +1,19 @@
+#include "cmAddTargetRule.h"
+
+// cmAddTargetRule
+bool cmAddTargetRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  return false;
+  
+//    for(std::vector<std::string>::iterator i = args.begin();
+//        i != args.end(); ++i)
+//      {
+//      m_Makefile->Add((*i).c_str());
+//      }
+}
+

+ 37 - 0
Source/cmAddTargetRule.h

@@ -0,0 +1,37 @@
+#ifndef cmAddTargetRule_h
+#define cmAddTargetRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmAddTargetRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmAddTargetRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "ADD_TARGET";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add an extra target to the build system.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "ADD_TARGET(Name \"command to run\");";
+    }
+};
+
+
+
+#endif

+ 46 - 0
Source/cmAuxSourceDirectoryRule.cxx

@@ -0,0 +1,46 @@
+#include "cmAuxSourceDirectoryRule.h"
+#include "cmDirectory.h"
+
+// cmAuxSourceDirectoryRule
+bool cmAuxSourceDirectoryRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 || args.size() > 1)
+    {
+    this->SetError("PROJECT called with incorrect number of arguments");
+    return false;
+    }
+  
+  std::string templateDirectory = args[0];
+  m_Makefile->AddExtraDirectory(templateDirectory.c_str());
+  std::string tdir = m_Makefile->GetCurrentDirectory();
+  tdir += "/";
+  tdir += templateDirectory;
+  // Load all the files in the directory
+  cmDirectory dir;
+  if(dir.Load(tdir.c_str()))
+    {
+    int numfiles = dir.GetNumberOfFiles();
+    for(int i =0; i < numfiles; ++i)
+      {
+      std::string file = dir.GetFile(i);
+      // ignore files less than f.cxx in length
+      if(file.size() > 4)
+        {
+        // Remove the extension
+        std::string::size_type dotpos = file.rfind(".");
+        file = file.substr(0, dotpos);
+        std::string fullname = templateDirectory;
+        fullname += "/";
+        fullname += file;
+        // add the file as a class file so 
+        // depends can be done
+        cmClassFile cmfile;
+        cmfile.SetName(fullname.c_str(), m_Makefile->GetCurrentDirectory());
+        cmfile.m_AbstractClass = false;
+        m_Makefile->AddClass(cmfile);
+        }
+      }
+    }
+  return true;
+}
+

+ 38 - 0
Source/cmAuxSourceDirectoryRule.h

@@ -0,0 +1,38 @@
+#ifndef cmAuxSourceDirectoryRule_h
+#define cmAuxSourceDirectoryRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmAuxSourceDirectoryRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmAuxSourceDirectoryRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "AUX_SOURCE_DIRECTORY";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add all the source files found in the specified directory to\n"
+        " the build.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "AUX_SOURCE_DIRECTORY(dir)";
+    }
+};
+
+
+
+#endif

+ 3 - 6
Source/cmClassFile.cxx

@@ -1,9 +1,6 @@
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 #include "cmClassFile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include <iostream>
 
 
 
@@ -62,8 +59,8 @@ void cmClassFile::SetName(const char* name, const char* dir)
   hname += ".h";
   if(!cmSystemTools::FileExists(hname.c_str()))
     {
-    std::cerr << "ERROR, can not find file " << hname;
-    std::cerr << "Tried .txx .cxx .c " << std::endl;
+    cmSystemTools::Error("can not find file ", hname.c_str());
+    cmSystemTools::Error("Tried .txx .cxx .c for ", hname.c_str());
     }
 }
 

+ 7 - 2
Source/cmClassFile.h

@@ -19,12 +19,17 @@
  */
 #ifndef cmClassFile_h
 #define cmClassFile_h
-#include <string>
-#include <vector>
+#include "cmStandardIncludes.h"
 
 
 struct cmClassFile
 {
+  cmClassFile()
+    {
+      m_AbstractClass = false;
+      m_HeaderFileOnly = false;
+    }
+  
   /**
    * Set the name of the file, given the directory
    * the file should be in.   Extensions are tried on 

+ 0 - 139
Source/cmCollectFlags.cxx

@@ -1,139 +0,0 @@
-#include "cmCollectFlags.h"
-#include "cmMakefile.h"
-#include "cmSystemTools.h"
-#include <fstream>
-#include <iterator>
-#include <iostream>
-
-cmCollectFlags::cmCollectFlags()
-{
-}
-
-cmCollectFlags::~cmCollectFlags()
-{
-}
-
-void cmCollectFlags::Print()
-{
-  std::ostream_iterator<std::string> out(std::cout, "\n");
-  std::cout << "m_IncludeDirectories " << std::endl;
-  std::copy(m_IncludeDirectories.begin(), m_IncludeDirectories.end(), out);
-  std::cout << "m_linkdirectories " << std::endl;
-  std::copy(m_LinkDirectories.begin(), m_LinkDirectories.end(), out);
-  std::cout << "m_LinkLibraries " << std::endl;
-  std::copy(m_LinkLibraries.begin(), m_LinkLibraries.end(), out);
-  std::cout << "m_LinkLibrariesWin32 " << std::endl;
-  std::copy(m_LinkLibrariesWin32.begin(), m_LinkLibrariesWin32.end(), out);
-  std::cout << "m_LinkLibrariesUnix " << std::endl;
-  std::copy(m_LinkLibrariesUnix.begin(), m_LinkLibrariesUnix.end(), out);
-}
-
-void cmCollectFlags::SetSourceHomeDirectory(const char* dir)
-{
-  m_SourceHomeDirectory = dir;
-  cmSystemTools::ConvertToUnixSlashes(m_SourceHomeDirectory);
-}
-
-void cmCollectFlags::SetStartDirectory(const char* dir)
-{
-  m_StartDirectory = dir;
-  cmSystemTools::ConvertToUnixSlashes(m_StartDirectory);
-}
-
-
-void cmCollectFlags::ParseDirectories()
-{
-  this->ParseDirectory(m_StartDirectory.c_str());
-}
-
-
-void cmCollectFlags::ParseFile(const char* filename)
-{
-  std::ifstream fin(filename);
-  if(!fin)
-    {
-    std::cerr << "error can not open file " << filename << std::endl;
-    return;
-    }
-  char inbuffer[2048];
-  while ( fin.getline(inbuffer, 2047 ) )
-    {
-    std::string line = inbuffer;
-    if(line.find("INCLUDE_DIRECTORIES") != std::string::npos)
-      {
-      cmSystemTools::ReadList(m_IncludeDirectories, fin);
-      }
-    if(line.find("LINK_DIRECTORIES") != std::string::npos)
-      {
-      cmSystemTools::ReadList(m_LinkDirectories, fin);
-      }
-    if(line.find("LINK_LIBRARIES") != std::string::npos)
-      {
-      cmSystemTools::ReadList(m_LinkLibraries, fin);
-      }
-    if(line.find("WIN32_LIBRARIES") != std::string::npos)
-      {
-      cmSystemTools::ReadList(m_LinkLibrariesWin32, fin);
-      }
-    if(line.find("UNIX_LIBRARIES") != std::string::npos)
-      {
-      cmSystemTools::ReadList(m_LinkLibrariesUnix, fin);
-      }
-    }
-}
-
-
-
-// Go until directory == m_cmHomeDirectory 
-// 1. fix slashes
-// 2. peal off /dir until home found, go no higher
-void cmCollectFlags::ParseDirectory(const char* dir)
-{
-  std::string listsFile = dir;
-  listsFile += "/CMakeLists.txt";
-  if(cmSystemTools::FileExists(listsFile.c_str()))
-    {
-    this->ParseFile(listsFile.c_str());
-    }
-  if(m_SourceHomeDirectory == dir)
-    {
-    return;
-    }
-
-  std::string dotdotDir = dir;
-  std::string::size_type pos = dotdotDir.rfind('/');
-  if(pos != std::string::npos)
-    {
-    dotdotDir = dotdotDir.substr(0, pos);
-    this->ParseDirectory(dotdotDir.c_str());
-    }
-}
-
-
-// expance CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
-// include and library directories.
-
-void cmCollectFlags::ExpandVaribles(cmMakefile* makefile)
-{
-   // Now replace varibles
-  std::vector<std::string>& includes = m_IncludeDirectories;
-  std::vector<std::string>::iterator j, begin, end;
-  begin = m_IncludeDirectories.begin();
-  end = m_IncludeDirectories.end();
-  for(j = begin; j != end; ++j)
-    {
-    cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
-				 makefile->GetOutputHomeDirectory() );
-    cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_DIR}",
-				 makefile->GetHomeDirectory() );
-    }
-  begin = m_LinkDirectories.begin();
-  end = m_LinkDirectories.end();
-  for(j = begin; j != end; ++j)
-    {
-    cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
-				 makefile->GetOutputHomeDirectory() );
-    cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_DIR}",
-				 makefile->GetHomeDirectory() );
-    }
-}

+ 0 - 107
Source/cmCollectFlags.h

@@ -1,107 +0,0 @@
-/*=========================================================================
-
-  Program:   Insight Segmentation & Registration Toolkit
-  Module:    $RCSfile$
-  Language:  C++
-  Date:      $Date$
-  Version:   $Revision$
-
-
-  Copyright (c) 2000 National Library of Medicine
-  All rights reserved.
-
-  See COPYRIGHT.txt for copyright details.
-
-=========================================================================*/
-/**
- * cmCollectFlags - collect flags from CMakeLists.txt files.
- * This class collects include and link flags from a CMakeLists.txt
- * file and any CMakeLists.txt files above it in the directory tree.
- * It stops searching wen the home directory is found.
- */
-#ifndef cmCollectFlags_h
-#define cmCollectFlags_h
-
-#include <vector>
-#include <string>
-class cmMakefile;
-
-class cmCollectFlags
-{
-public:
-  cmCollectFlags();
-  ~cmCollectFlags ();
-  /**
-   * Set the home directory for the source code.
-   */
-  void SetSourceHomeDirectory(const char* dir);
-  /**
-   * Set the start directory to look for flags 
-   */
-  void SetStartDirectory(const char* dir);
-  /**
-   * Parse the directory and all of it's parents for config
-   * information
-   */
-  void ParseDirectories();
-  /**
-   * Print to standard out
-   */
-  void Print();
-  
-  /**
-   * Expance varibles for home and binary root in the collected flags.
-   * CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR are replaced with
-   * makefile->GetOutputHomeDirectory() and
-   * makefile->GetHomeDirectory()
-   */
-  void ExpandVaribles(cmMakefile* makefile);
-  
-  std::vector<std::string>& GetIncludeDirectories()
-    { 
-      return m_IncludeDirectories;
-    }
-  
-  std::vector<std::string>& GetLinkDirectories()
-    { 
-      return m_LinkDirectories;
-    }
-  
-  std::vector<std::string>& GetLinkLibraries()
-    { 
-      return m_LinkLibraries;
-    }
-  
-  std::vector<std::string>& GetLinkLibrariesWin32()
-    { 
-      return m_LinkLibrariesWin32;
-    }
-  
-  std::vector<std::string>& GetLinkLibrariesUnix()
-    { 
-      return m_LinkLibrariesUnix;
-    }
-  
-private:
-  /**
-   * Look for CMakeLists.txt files to parse in dir,
-   * then in dir's parents, until the SourceHome directory
-   * is found.
-   */
-  void ParseDirectory(const char* dir);
-  /**
-   * Parse a file for includes links and libs
-   */
-  void ParseFile(const char* dir);
-  
-  
-  std::string m_SourceHomeDirectory; // source code top level dir
-  std::string m_StartDirectory; // source code sub directory
-  std::vector<std::string> m_IncludeDirectories;
-  std::vector<std::string> m_LinkDirectories;
-  std::vector<std::string> m_LinkLibraries;
-  std::vector<std::string> m_LinkLibrariesWin32;
-  std::vector<std::string> m_LinkLibrariesUnix;
-};
-
-#endif

+ 51 - 39
Source/cmDSPMakefile.cxx

@@ -1,8 +1,6 @@
 #include "cmDSPMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include "cmCollectFlags.h"
-#include <iostream>
-#include <fstream>
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef GetCurrentDirectory
@@ -12,12 +10,20 @@ static void Die(const char* message)
   MessageBox(0, message, 0, MB_OK);
   exit(-1);
 }
+cmDSPMakefile::~cmDSPMakefile()
+{
+}
+
 
+cmDSPMakefile::cmDSPMakefile(cmMakefile*mf)
+{
+  m_Makefile = mf;
+}
 
 void cmDSPMakefile::OutputDSPFile()
 { 
   // Setup /I and /LIBPATH options
-  std::vector<std::string>& includes = m_BuildFlags.GetIncludeDirectories();
+  std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
   std::vector<std::string>::iterator i;
   for(i = includes.begin(); i != includes.end(); ++i)
     {
@@ -25,21 +31,21 @@ void cmDSPMakefile::OutputDSPFile()
     m_IncludeOptions += *i;
     m_IncludeOptions += "\" ";
     }
-  std::vector<std::string>& libs = m_BuildFlags.GetLinkLibraries();
+  std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
   for(i = libs.begin(); i != libs.end(); ++i)
     {
     m_DebugLibraryOptions += " ";
     m_DebugLibraryOptions += *i;
     m_DebugLibraryOptions += ".lib ";
     }
-  std::vector<std::string>& libswin32 = m_BuildFlags.GetLinkLibrariesWin32();
+  std::vector<std::string>& libswin32 = m_Makefile->GetLinkLibrariesWin32();
   for(i = libswin32.begin(); i != libswin32.end(); ++i)
     {
     m_DebugLibraryOptions += " ";
     m_DebugLibraryOptions += *i;
     m_DebugLibraryOptions += ".lib ";
     }
-  std::vector<std::string>& libdirs = m_BuildFlags.GetLinkDirectories();
+  std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
   for(i = libdirs.begin(); i != libdirs.end(); ++i)
     {
     m_DebugLibraryOptions += " /LIBPATH:\"";
@@ -53,23 +59,27 @@ void cmDSPMakefile::OutputDSPFile()
       }
     }
   m_DebugLibraryOptions += "/STACK:10000000 ";
+  // add any extra define flags 
+  m_DebugLibraryOptions += m_Makefile->GetDefineFlags();
   m_ReleaseLibraryOptions = m_DebugLibraryOptions;
   cmSystemTools::ReplaceString(m_ReleaseLibraryOptions, "Debug", "Release");
+  
   // If the output directory is not the m_cmHomeDirectory
   // then create it.
-  if(m_OutputDirectory != m_cmHomeDirectory)
+  if(strcmp(m_Makefile->GetOutputDirectory(),
+            m_Makefile->GetHomeDirectory()) != 0)
     {
-    if(!cmSystemTools::MakeDirectory(m_OutputDirectory.c_str()))
+    if(!cmSystemTools::MakeDirectory(m_Makefile->GetOutputDirectory()))
       {
       std::string message = "Error creating directory ";
-      message += m_OutputDirectory;
+      message += m_Makefile->GetOutputDirectory();
       Die(message.c_str());
       }
     }
   
-  if(!m_Executables)
+  if(!m_Makefile->HasExecutables())
     {
-    if(this->m_LibraryName == "")
+    if(strlen(m_Makefile->GetLibraryName()) == 0)
       {
       // if no library silently give up
       return;
@@ -84,10 +94,11 @@ void cmDSPMakefile::OutputDSPFile()
 }
 void cmDSPMakefile::CreateExecutableDSPFiles()
 {
-  for(int i = 0; i < m_Classes.size(); ++i)
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  for(int i = 0; i < Classes.size(); ++i)
     {
-    cmClassFile& classfile = m_Classes[i];
-    std::string fname = m_OutputDirectory;
+    cmClassFile& classfile = Classes[i];
+    std::string fname = m_Makefile->GetOutputDirectory();
     fname += "/";
     fname += classfile.m_ClassName;
     fname += ".dsp";
@@ -100,9 +111,9 @@ void cmDSPMakefile::CreateExecutableDSPFiles()
       }
     else
       {
-      m_LibraryName = classfile.m_ClassName;
+      m_Makefile->SetLibraryName(classfile.m_ClassName.c_str());
       this->SetBuildType(EXECUTABLE);
-      std::string pname = m_LibraryName;
+      std::string pname = m_Makefile->GetLibraryName();
       m_CreatedProjectNames.push_back(pname);
 
       this->WriteDSPHeader(fout);
@@ -120,12 +131,12 @@ void cmDSPMakefile::CreateExecutableDSPFiles()
 void cmDSPMakefile::CreateSingleDSP()
 {
   std::string fname;
-  fname = m_OutputDirectory;
+  fname = m_Makefile->GetOutputDirectory();
   fname += "/";
-  fname += this->m_LibraryName;
+  fname += m_Makefile->GetLibraryName();
   fname += ".dsp";
   m_CreatedProjectNames.clear();
-  std::string pname = m_LibraryName;
+  std::string pname = m_Makefile->GetLibraryName();
   m_CreatedProjectNames.push_back(pname);
   std::ofstream fout(fname.c_str());
   if(!fout)
@@ -141,20 +152,20 @@ void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
 {
   std::string dspname = *(m_CreatedProjectNames.end()-1);
   dspname += ".dsp";
-  std::string makefileIn = this->GetCurrentDirectory();
+  std::string makefileIn = m_Makefile->GetCurrentDirectory();
   makefileIn += "/";
   makefileIn += "CMakeLists.txt";
-  std::string dsprule = GetHomeDirectory();
+  std::string dsprule = m_Makefile->GetHomeDirectory();
   dsprule += "/CMake/Source/CMakeSetupCMD ";
   dsprule += makefileIn;
   dsprule += " -DSP -H";
-  dsprule += this->GetHomeDirectory();
+  dsprule += m_Makefile->GetHomeDirectory();
   dsprule += " -D";
-  dsprule += this->GetCurrentDirectory();
+  dsprule += m_Makefile->GetCurrentDirectory();
   dsprule += " -O";
-  dsprule += this->GetOutputDirectory();
+  dsprule += m_Makefile->GetOutputDirectory();
   dsprule += " -B";
-  dsprule += this->GetOutputHomeDirectory();
+  dsprule += m_Makefile->GetOutputHomeDirectory();
   this->WriteCustomRule(fout, makefileIn.c_str(), 
 			dspname.c_str(),
 			dsprule.c_str());
@@ -172,9 +183,9 @@ void cmDSPMakefile::WriteDSPFile(std::ostream& fout)
 
 
 void cmDSPMakefile::WriteCustomRule(std::ostream& fout,
-				     const char* source,
-				     const char* result,
-				     const char* command)
+                                    const char* source,
+                                    const char* result,
+                                    const char* command)
 {
   fout << "# Begin Source File\n\n";
   fout << "SOURCE=" << source << "\n\n";
@@ -208,21 +219,21 @@ void cmDSPMakefile::SetBuildType(BuildType b)
   switch(b)
     {
     case STATIC_LIBRARY:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate = m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/staticLibHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate = m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/staticLibFooter.dsptemplate";
       break;
     case DLL:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate =  m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/DLLHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate =  m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/DLLFooter.dsptemplate";
       break;
     case EXECUTABLE:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate = m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/EXEHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate = m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/EXEFooter.dsptemplate";
       break;
     }
@@ -250,7 +261,7 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
       cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
                                     m_IncludeOptions.c_str());
       cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME", 
-                                    m_LibraryName.c_str());
+                                    m_Makefile->GetLibraryName());
       cmSystemTools::ReplaceString(line, 
                                     "EXTRA_DEFINES", "");
       fout << line.c_str() << std::endl;
@@ -278,11 +289,12 @@ void cmDSPMakefile::WriteDSPFooter(std::ostream& fout)
 					
 void cmDSPMakefile::WriteDSPBuildRules(std::ostream& fout)
 {
-  for(int i = 0; i < m_Classes.size(); ++i)
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  for(int i = 0; i < Classes.size(); ++i)
     {
-    if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+    if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
       {
-      this->WriteDSPBuildRule(fout, m_Classes[i].m_FullPath.c_str());
+      this->WriteDSPBuildRule(fout, Classes[i].m_FullPath.c_str());
       }
     }
 }

+ 9 - 5
Source/cmDSPMakefile.h

@@ -20,15 +20,14 @@
  */
 #ifndef cmDSPMakefile_h
 #define cmDSPMakefile_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
+#include "cmStandardIncludes.h"
 #include "cmMakefile.h"
-#include <vector>
 
-class cmDSPMakefile : public cmMakefile
+class cmDSPMakefile 
 {
 public:
+  cmDSPMakefile(cmMakefile*);
+  ~cmDSPMakefile();
   void OutputDSPFile();
   enum BuildType { STATIC_LIBRARY, DLL, EXECUTABLE };
   void SetBuildType(BuildType );
@@ -38,6 +37,10 @@ public:
     {
       return m_CreatedProjectNames;
     }
+  cmMakefile* GetMakefile() 
+    {
+      return m_Makefile;
+    }
   
 private:
   std::string m_DSPHeaderTemplate;
@@ -64,6 +67,7 @@ private:
   std::string m_IncludeOptions;
   std::string m_DebugLibraryOptions;
   std::string m_ReleaseLibraryOptions;
+  cmMakefile* m_Makefile;
 };
 
 #endif

+ 51 - 39
Source/cmDSPWriter.cxx

@@ -1,8 +1,6 @@
 #include "cmDSPMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include "cmCollectFlags.h"
-#include <iostream>
-#include <fstream>
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef GetCurrentDirectory
@@ -12,12 +10,20 @@ static void Die(const char* message)
   MessageBox(0, message, 0, MB_OK);
   exit(-1);
 }
+cmDSPMakefile::~cmDSPMakefile()
+{
+}
+
 
+cmDSPMakefile::cmDSPMakefile(cmMakefile*mf)
+{
+  m_Makefile = mf;
+}
 
 void cmDSPMakefile::OutputDSPFile()
 { 
   // Setup /I and /LIBPATH options
-  std::vector<std::string>& includes = m_BuildFlags.GetIncludeDirectories();
+  std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
   std::vector<std::string>::iterator i;
   for(i = includes.begin(); i != includes.end(); ++i)
     {
@@ -25,21 +31,21 @@ void cmDSPMakefile::OutputDSPFile()
     m_IncludeOptions += *i;
     m_IncludeOptions += "\" ";
     }
-  std::vector<std::string>& libs = m_BuildFlags.GetLinkLibraries();
+  std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
   for(i = libs.begin(); i != libs.end(); ++i)
     {
     m_DebugLibraryOptions += " ";
     m_DebugLibraryOptions += *i;
     m_DebugLibraryOptions += ".lib ";
     }
-  std::vector<std::string>& libswin32 = m_BuildFlags.GetLinkLibrariesWin32();
+  std::vector<std::string>& libswin32 = m_Makefile->GetLinkLibrariesWin32();
   for(i = libswin32.begin(); i != libswin32.end(); ++i)
     {
     m_DebugLibraryOptions += " ";
     m_DebugLibraryOptions += *i;
     m_DebugLibraryOptions += ".lib ";
     }
-  std::vector<std::string>& libdirs = m_BuildFlags.GetLinkDirectories();
+  std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
   for(i = libdirs.begin(); i != libdirs.end(); ++i)
     {
     m_DebugLibraryOptions += " /LIBPATH:\"";
@@ -53,23 +59,27 @@ void cmDSPMakefile::OutputDSPFile()
       }
     }
   m_DebugLibraryOptions += "/STACK:10000000 ";
+  // add any extra define flags 
+  m_DebugLibraryOptions += m_Makefile->GetDefineFlags();
   m_ReleaseLibraryOptions = m_DebugLibraryOptions;
   cmSystemTools::ReplaceString(m_ReleaseLibraryOptions, "Debug", "Release");
+  
   // If the output directory is not the m_cmHomeDirectory
   // then create it.
-  if(m_OutputDirectory != m_cmHomeDirectory)
+  if(strcmp(m_Makefile->GetOutputDirectory(),
+            m_Makefile->GetHomeDirectory()) != 0)
     {
-    if(!cmSystemTools::MakeDirectory(m_OutputDirectory.c_str()))
+    if(!cmSystemTools::MakeDirectory(m_Makefile->GetOutputDirectory()))
       {
       std::string message = "Error creating directory ";
-      message += m_OutputDirectory;
+      message += m_Makefile->GetOutputDirectory();
       Die(message.c_str());
       }
     }
   
-  if(!m_Executables)
+  if(!m_Makefile->HasExecutables())
     {
-    if(this->m_LibraryName == "")
+    if(strlen(m_Makefile->GetLibraryName()) == 0)
       {
       // if no library silently give up
       return;
@@ -84,10 +94,11 @@ void cmDSPMakefile::OutputDSPFile()
 }
 void cmDSPMakefile::CreateExecutableDSPFiles()
 {
-  for(int i = 0; i < m_Classes.size(); ++i)
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  for(int i = 0; i < Classes.size(); ++i)
     {
-    cmClassFile& classfile = m_Classes[i];
-    std::string fname = m_OutputDirectory;
+    cmClassFile& classfile = Classes[i];
+    std::string fname = m_Makefile->GetOutputDirectory();
     fname += "/";
     fname += classfile.m_ClassName;
     fname += ".dsp";
@@ -100,9 +111,9 @@ void cmDSPMakefile::CreateExecutableDSPFiles()
       }
     else
       {
-      m_LibraryName = classfile.m_ClassName;
+      m_Makefile->SetLibraryName(classfile.m_ClassName.c_str());
       this->SetBuildType(EXECUTABLE);
-      std::string pname = m_LibraryName;
+      std::string pname = m_Makefile->GetLibraryName();
       m_CreatedProjectNames.push_back(pname);
 
       this->WriteDSPHeader(fout);
@@ -120,12 +131,12 @@ void cmDSPMakefile::CreateExecutableDSPFiles()
 void cmDSPMakefile::CreateSingleDSP()
 {
   std::string fname;
-  fname = m_OutputDirectory;
+  fname = m_Makefile->GetOutputDirectory();
   fname += "/";
-  fname += this->m_LibraryName;
+  fname += m_Makefile->GetLibraryName();
   fname += ".dsp";
   m_CreatedProjectNames.clear();
-  std::string pname = m_LibraryName;
+  std::string pname = m_Makefile->GetLibraryName();
   m_CreatedProjectNames.push_back(pname);
   std::ofstream fout(fname.c_str());
   if(!fout)
@@ -141,20 +152,20 @@ void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
 {
   std::string dspname = *(m_CreatedProjectNames.end()-1);
   dspname += ".dsp";
-  std::string makefileIn = this->GetCurrentDirectory();
+  std::string makefileIn = m_Makefile->GetCurrentDirectory();
   makefileIn += "/";
   makefileIn += "CMakeLists.txt";
-  std::string dsprule = GetHomeDirectory();
+  std::string dsprule = m_Makefile->GetHomeDirectory();
   dsprule += "/CMake/Source/CMakeSetupCMD ";
   dsprule += makefileIn;
   dsprule += " -DSP -H";
-  dsprule += this->GetHomeDirectory();
+  dsprule += m_Makefile->GetHomeDirectory();
   dsprule += " -D";
-  dsprule += this->GetCurrentDirectory();
+  dsprule += m_Makefile->GetCurrentDirectory();
   dsprule += " -O";
-  dsprule += this->GetOutputDirectory();
+  dsprule += m_Makefile->GetOutputDirectory();
   dsprule += " -B";
-  dsprule += this->GetOutputHomeDirectory();
+  dsprule += m_Makefile->GetOutputHomeDirectory();
   this->WriteCustomRule(fout, makefileIn.c_str(), 
 			dspname.c_str(),
 			dsprule.c_str());
@@ -172,9 +183,9 @@ void cmDSPMakefile::WriteDSPFile(std::ostream& fout)
 
 
 void cmDSPMakefile::WriteCustomRule(std::ostream& fout,
-				     const char* source,
-				     const char* result,
-				     const char* command)
+                                    const char* source,
+                                    const char* result,
+                                    const char* command)
 {
   fout << "# Begin Source File\n\n";
   fout << "SOURCE=" << source << "\n\n";
@@ -208,21 +219,21 @@ void cmDSPMakefile::SetBuildType(BuildType b)
   switch(b)
     {
     case STATIC_LIBRARY:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate = m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/staticLibHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate = m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/staticLibFooter.dsptemplate";
       break;
     case DLL:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate =  m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/DLLHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate =  m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/DLLFooter.dsptemplate";
       break;
     case EXECUTABLE:
-      m_DSPHeaderTemplate = m_cmHomeDirectory;
+      m_DSPHeaderTemplate = m_Makefile->GetHomeDirectory();
       m_DSPHeaderTemplate += "/CMake/Source/EXEHeader.dsptemplate";
-      m_DSPFooterTemplate = m_cmHomeDirectory;
+      m_DSPFooterTemplate = m_Makefile->GetHomeDirectory();
       m_DSPFooterTemplate += "/CMake/Source/EXEFooter.dsptemplate";
       break;
     }
@@ -250,7 +261,7 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
       cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
                                     m_IncludeOptions.c_str());
       cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME", 
-                                    m_LibraryName.c_str());
+                                    m_Makefile->GetLibraryName());
       cmSystemTools::ReplaceString(line, 
                                     "EXTRA_DEFINES", "");
       fout << line.c_str() << std::endl;
@@ -278,11 +289,12 @@ void cmDSPMakefile::WriteDSPFooter(std::ostream& fout)
 					
 void cmDSPMakefile::WriteDSPBuildRules(std::ostream& fout)
 {
-  for(int i = 0; i < m_Classes.size(); ++i)
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  for(int i = 0; i < Classes.size(); ++i)
     {
-    if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+    if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
       {
-      this->WriteDSPBuildRule(fout, m_Classes[i].m_FullPath.c_str());
+      this->WriteDSPBuildRule(fout, Classes[i].m_FullPath.c_str());
       }
     }
 }

+ 9 - 5
Source/cmDSPWriter.h

@@ -20,15 +20,14 @@
  */
 #ifndef cmDSPMakefile_h
 #define cmDSPMakefile_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
+#include "cmStandardIncludes.h"
 #include "cmMakefile.h"
-#include <vector>
 
-class cmDSPMakefile : public cmMakefile
+class cmDSPMakefile 
 {
 public:
+  cmDSPMakefile(cmMakefile*);
+  ~cmDSPMakefile();
   void OutputDSPFile();
   enum BuildType { STATIC_LIBRARY, DLL, EXECUTABLE };
   void SetBuildType(BuildType );
@@ -38,6 +37,10 @@ public:
     {
       return m_CreatedProjectNames;
     }
+  cmMakefile* GetMakefile() 
+    {
+      return m_Makefile;
+    }
   
 private:
   std::string m_DSPHeaderTemplate;
@@ -64,6 +67,7 @@ private:
   std::string m_IncludeOptions;
   std::string m_DebugLibraryOptions;
   std::string m_ReleaseLibraryOptions;
+  cmMakefile* m_Makefile;
 };
 
 #endif

+ 53 - 47
Source/cmDSWMakefile.cxx

@@ -1,46 +1,47 @@
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 #include "cmDSWMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
 #include "cmDSPMakefile.h"
-#include <iostream>
-#include <fstream>
+#include "cmMSProjectGenerator.h"
 #include <windows.h>
 
 // microsoft nonsense
 #undef GetCurrentDirectory
 #undef SetCurrentDirectory
 
+cmDSWMakefile::cmDSWMakefile(cmMakefile* m)
+{
+  m_Makefile = m;
+}
+
 // output the DSW file
 void cmDSWMakefile::OutputDSWFile()
 { 
-  if(m_OutputDirectory == "")
+  if(m_Makefile->GetOutputDirectory() == "")
     {
     // default to build in place
-    m_OutputDirectory = m_cmHomeDirectory;
+    m_Makefile->SetOutputDirectory(m_Makefile->GetHomeDirectory());
     }
   // If the output directory is not the m_cmHomeDirectory
   // then create it.
-  if(m_OutputDirectory != m_cmHomeDirectory)
+  if(strcmp(m_Makefile->GetOutputDirectory(),
+            m_Makefile->GetHomeDirectory()) != 0)
     {
-    if(!cmSystemTools::MakeDirectory(m_OutputDirectory.c_str()))
+    if(!cmSystemTools::MakeDirectory(m_Makefile->GetOutputDirectory()))
       {
       MessageBox(0, "Error creating directory ", 0, MB_OK);
-      MessageBox(0, m_OutputDirectory.c_str(), 0, MB_OK);
+      MessageBox(0, m_Makefile->GetOutputDirectory(), 0, MB_OK);
       }
     }
   std::string fname;
-  fname = m_OutputDirectory;
+  fname = m_Makefile->GetOutputDirectory();
   fname += "/";
-  fname += this->m_ProjectName;
+  fname += m_Makefile->GetProjectName();
   fname += ".dsw";
-  std::cerr << "writting dsw file " << fname.c_str() << std::endl;
   std::ofstream fout(fname.c_str());
   if(!fout)
     {
-    std::cerr  << "Error can not open " 
-	       << fname.c_str() << " for write" << std::endl;
+    cmSystemTools::Error("Error can not open for write: " , fname.c_str());
     return;
     }
   this->WriteDSWFile(fout);
@@ -53,10 +54,12 @@ void cmDSWMakefile::OutputDSWFile()
 // The result is a vector of cmDSPMakefile objects, one for
 // each directory with a CMakeLists.txt file
 //
-void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
-					   std::vector<cmDSPMakefile*>& makefiles)
+void 
+cmDSWMakefile
+::FindAllCMakeListsFiles(const char* subdir,
+                         std::vector<cmMSProjectGenerator*>& makefiles)
 {
-  std::string currentDir = this->GetCurrentDirectory();
+  std::string currentDir = m_Makefile->GetCurrentDirectory();
   currentDir += "/";
   currentDir += subdir;
   currentDir += "/";
@@ -66,31 +69,34 @@ void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
   if(cmSystemTools::FileExists(currentDir.c_str()))
     {
     // Create a new cmDSPMakefile to read the currentDir CMakeLists.txt file
-    cmDSPMakefile* dsp = new cmDSPMakefile;
+    cmMSProjectGenerator* pg = new cmMSProjectGenerator;
+    pg->SetBuildDSP();
+    cmMakefile* mf = new cmMakefile;
+    mf->SetMakefileGenerator(pg);
     // add it to the vector
-    makefiles.push_back(dsp);
+    makefiles.push_back(pg);
     // Set up the file with the current context
-    dsp->SetOutputHomeDirectory(this->GetOutputDirectory());
-    dsp->SetHomeDirectory(this->GetHomeDirectory());
+    mf->SetOutputHomeDirectory(m_Makefile->GetOutputDirectory());
+    mf->SetHomeDirectory(m_Makefile->GetHomeDirectory());
     // set the current directory in the Source as a full
     // path
-    std::string currentDir = this->GetCurrentDirectory();
+    std::string currentDir = m_Makefile->GetCurrentDirectory();
     currentDir += "/";
     currentDir += subdir;
-    dsp->SetCurrentDirectory(currentDir.c_str());
+    mf->SetCurrentDirectory(currentDir.c_str());
     // Parse the CMakeLists.txt file
     currentDir += "/CMakeLists.txt";
-    dsp->ReadMakefile(currentDir.c_str());
+    mf->ReadMakefile(currentDir.c_str());
     // Set the output directory which may be different than the source
-    std::string outdir = m_OutputDirectory;
+    std::string outdir = m_Makefile->GetOutputDirectory();
     outdir += "/";
     outdir += subdir;
-    dsp->SetOutputDirectory(outdir.c_str());
+    mf->SetOutputDirectory(outdir.c_str());
     // Create the DSP file
-    dsp->OutputDSPFile();
+    mf->GenerateMakefile();
     // Look at any sub directories parsed (SUBDIRS) and 
     // recurse into them    
-    const std::vector<std::string>& subdirs = dsp->GetSubDirectories();
+    const std::vector<std::string>& subdirs = mf->GetSubDirectories();
     for(std::vector<std::string>::const_iterator i = subdirs.begin();
 	i != subdirs.end(); ++i)
       {
@@ -105,8 +111,8 @@ void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
     }
   else
     {
-    std::cerr << "Can not find CMakeLists.txt in " << currentDir.c_str() 
-	      << std::endl;
+    cmSystemTools::Error("Can not find CMakeLists.txt in ",
+                         currentDir.c_str());
     }
 }
 
@@ -117,43 +123,43 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
   // Write out the header for a DSW file
   this->WriteDSWHeader(fout);
   // Create an array of dsp files for the project
-  std::vector<cmDSPMakefile*> dspfiles;
+  std::vector<cmMSProjectGenerator*> dspfiles;
   // loop over all the subdirectories for the DSW file,
   // and find all sub directory projects
-  for(std::vector<std::string>::iterator j = m_SubDirectories.begin();
-      j != m_SubDirectories.end(); ++j)
+  const std::vector<std::string>& dirs = m_Makefile->GetSubDirectories();
+  for(std::vector<std::string>::const_iterator j = dirs.begin();
+      j != dirs.end(); ++j)
     {
     this->FindAllCMakeListsFiles(j->c_str(), dspfiles);
     }
   // For each DSP file created insert them into the DSW file
-  for(std::vector<cmDSPMakefile*>::iterator k = dspfiles.begin();
+  for(std::vector<cmMSProjectGenerator*>::iterator k = dspfiles.begin();
       k != dspfiles.end(); ++k)
     {
     // Get the directory for the dsp file, it comes
     // from the source, so it has the source path which needs
     // to be removed as this may be built in a different directory
     // than the source
-    std::string dir = (*k)->GetCurrentDirectory();
+    std::string dir = (*k)->GetDSPMakefile()->
+      GetMakefile()->GetCurrentDirectory();
     // Get the home directory with the trailing slash
-    std::string homedir = this->GetHomeDirectory();
+    std::string homedir = m_Makefile->GetHomeDirectory();
     homedir += "/";
     // make the directory relative by removing the home directory part
     cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
     // Get the list of create dsp files from the cmDSPMakefile, more
     // than one dsp could have been created per input CMakeLists.txt file
-    std::vector<std::string> dspnames = (*k)->GetCreatedProjectNames();
-    std::cerr << "Create dsp for " 
-	      << dspnames.size()
-	      << " number of dsp files in " << dir << std::endl;
+    std::vector<std::string> dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames();
     for(std::vector<std::string>::iterator si = dspnames.begin();
 	si != dspnames.end(); ++si)
       {
       // Write the project into the DSW file
-      this->WriteProject(fout, si->c_str(), dir.c_str(), *k);
+      this->WriteProject(fout, si->c_str(), dir.c_str(), 
+                         (*k)->GetDSPMakefile());
       }
     // delete the cmDSPMakefile object once done with it to avoid
     // leaks
-    delete *k;
+    delete (*k)->GetDSPMakefile()->GetMakefile();
     }
   // Write the footer for the DSW file
   this->WriteDSWFooter(fout);
@@ -163,7 +169,7 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
 void cmDSWMakefile::WriteProject(std::ostream& fout, 
 				 const char* dspname,
 				 const char* dir,
-                                 cmMakefile* project)
+                                 cmDSPMakefile* project)
 {
   fout << "###############################################################################\n\n";
   fout << "Project: \"" << dspname << "\"=" 
@@ -171,12 +177,12 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
   fout << "Package=<5>\n{{{\n}}}\n\n";
   fout << "Package=<4>\n";
   fout << "{{{\n";
-  if(project->HasExecutables())
+  if(project->GetMakefile()->HasExecutables())
     {
     // insert Begin Project Dependency  Project_Dep_Name project stuff here 
     std::vector<std::string>::iterator i, end;
-    i = project->GetBuildFlags().GetLinkLibraries().begin();
-    end = project->GetBuildFlags().GetLinkLibraries().end();
+    i = project->GetMakefile()->GetLinkLibraries().begin();
+    end = project->GetMakefile()->GetLinkLibraries().end();
     for(;i!= end; ++i)
       {
       fout << "Begin Project Dependency\n";

+ 9 - 10
Source/cmDSWMakefile.h

@@ -18,28 +18,27 @@
  */
 #ifndef cmDSWMakefile_h
 #define cmDSWMakefile_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
-
+#include "cmStandardIncludes.h"
 #include "cmMakefile.h"
-#include <vector>
-class cmDSPMakefile;
 
+class cmDSPMakefile;
+class cmMSProjectGenerator;
 
-class cmDSWMakefile : public cmMakefile
+class cmDSWMakefile 
 {
 public:
+  cmDSWMakefile(cmMakefile*);
   virtual void OutputDSWFile();
 private:
   void FindAllCMakeListsFiles(const char* subdir,
-			      std::vector<cmDSPMakefile*>&);
+			      std::vector<cmMSProjectGenerator*>&);
   void WriteDSWFile(std::ostream& fout);
   void WriteDSWHeader(std::ostream& fout);
   void WriteProject(std::ostream& fout, 
-		     const char* name, const char* path,
-                    cmMakefile* project);
+                    const char* name, const char* path,
+                    cmDSPMakefile* project);
   void WriteDSWFooter(std::ostream& fout);
+  cmMakefile* m_Makefile;
 };
 
 #endif

+ 53 - 47
Source/cmDSWWriter.cxx

@@ -1,46 +1,47 @@
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 #include "cmDSWMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
 #include "cmDSPMakefile.h"
-#include <iostream>
-#include <fstream>
+#include "cmMSProjectGenerator.h"
 #include <windows.h>
 
 // microsoft nonsense
 #undef GetCurrentDirectory
 #undef SetCurrentDirectory
 
+cmDSWMakefile::cmDSWMakefile(cmMakefile* m)
+{
+  m_Makefile = m;
+}
+
 // output the DSW file
 void cmDSWMakefile::OutputDSWFile()
 { 
-  if(m_OutputDirectory == "")
+  if(m_Makefile->GetOutputDirectory() == "")
     {
     // default to build in place
-    m_OutputDirectory = m_cmHomeDirectory;
+    m_Makefile->SetOutputDirectory(m_Makefile->GetHomeDirectory());
     }
   // If the output directory is not the m_cmHomeDirectory
   // then create it.
-  if(m_OutputDirectory != m_cmHomeDirectory)
+  if(strcmp(m_Makefile->GetOutputDirectory(),
+            m_Makefile->GetHomeDirectory()) != 0)
     {
-    if(!cmSystemTools::MakeDirectory(m_OutputDirectory.c_str()))
+    if(!cmSystemTools::MakeDirectory(m_Makefile->GetOutputDirectory()))
       {
       MessageBox(0, "Error creating directory ", 0, MB_OK);
-      MessageBox(0, m_OutputDirectory.c_str(), 0, MB_OK);
+      MessageBox(0, m_Makefile->GetOutputDirectory(), 0, MB_OK);
       }
     }
   std::string fname;
-  fname = m_OutputDirectory;
+  fname = m_Makefile->GetOutputDirectory();
   fname += "/";
-  fname += this->m_ProjectName;
+  fname += m_Makefile->GetProjectName();
   fname += ".dsw";
-  std::cerr << "writting dsw file " << fname.c_str() << std::endl;
   std::ofstream fout(fname.c_str());
   if(!fout)
     {
-    std::cerr  << "Error can not open " 
-	       << fname.c_str() << " for write" << std::endl;
+    cmSystemTools::Error("Error can not open for write: " , fname.c_str());
     return;
     }
   this->WriteDSWFile(fout);
@@ -53,10 +54,12 @@ void cmDSWMakefile::OutputDSWFile()
 // The result is a vector of cmDSPMakefile objects, one for
 // each directory with a CMakeLists.txt file
 //
-void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
-					   std::vector<cmDSPMakefile*>& makefiles)
+void 
+cmDSWMakefile
+::FindAllCMakeListsFiles(const char* subdir,
+                         std::vector<cmMSProjectGenerator*>& makefiles)
 {
-  std::string currentDir = this->GetCurrentDirectory();
+  std::string currentDir = m_Makefile->GetCurrentDirectory();
   currentDir += "/";
   currentDir += subdir;
   currentDir += "/";
@@ -66,31 +69,34 @@ void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
   if(cmSystemTools::FileExists(currentDir.c_str()))
     {
     // Create a new cmDSPMakefile to read the currentDir CMakeLists.txt file
-    cmDSPMakefile* dsp = new cmDSPMakefile;
+    cmMSProjectGenerator* pg = new cmMSProjectGenerator;
+    pg->SetBuildDSP();
+    cmMakefile* mf = new cmMakefile;
+    mf->SetMakefileGenerator(pg);
     // add it to the vector
-    makefiles.push_back(dsp);
+    makefiles.push_back(pg);
     // Set up the file with the current context
-    dsp->SetOutputHomeDirectory(this->GetOutputDirectory());
-    dsp->SetHomeDirectory(this->GetHomeDirectory());
+    mf->SetOutputHomeDirectory(m_Makefile->GetOutputDirectory());
+    mf->SetHomeDirectory(m_Makefile->GetHomeDirectory());
     // set the current directory in the Source as a full
     // path
-    std::string currentDir = this->GetCurrentDirectory();
+    std::string currentDir = m_Makefile->GetCurrentDirectory();
     currentDir += "/";
     currentDir += subdir;
-    dsp->SetCurrentDirectory(currentDir.c_str());
+    mf->SetCurrentDirectory(currentDir.c_str());
     // Parse the CMakeLists.txt file
     currentDir += "/CMakeLists.txt";
-    dsp->ReadMakefile(currentDir.c_str());
+    mf->ReadMakefile(currentDir.c_str());
     // Set the output directory which may be different than the source
-    std::string outdir = m_OutputDirectory;
+    std::string outdir = m_Makefile->GetOutputDirectory();
     outdir += "/";
     outdir += subdir;
-    dsp->SetOutputDirectory(outdir.c_str());
+    mf->SetOutputDirectory(outdir.c_str());
     // Create the DSP file
-    dsp->OutputDSPFile();
+    mf->GenerateMakefile();
     // Look at any sub directories parsed (SUBDIRS) and 
     // recurse into them    
-    const std::vector<std::string>& subdirs = dsp->GetSubDirectories();
+    const std::vector<std::string>& subdirs = mf->GetSubDirectories();
     for(std::vector<std::string>::const_iterator i = subdirs.begin();
 	i != subdirs.end(); ++i)
       {
@@ -105,8 +111,8 @@ void cmDSWMakefile::FindAllCMakeListsFiles(const char* subdir,
     }
   else
     {
-    std::cerr << "Can not find CMakeLists.txt in " << currentDir.c_str() 
-	      << std::endl;
+    cmSystemTools::Error("Can not find CMakeLists.txt in ",
+                         currentDir.c_str());
     }
 }
 
@@ -117,43 +123,43 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
   // Write out the header for a DSW file
   this->WriteDSWHeader(fout);
   // Create an array of dsp files for the project
-  std::vector<cmDSPMakefile*> dspfiles;
+  std::vector<cmMSProjectGenerator*> dspfiles;
   // loop over all the subdirectories for the DSW file,
   // and find all sub directory projects
-  for(std::vector<std::string>::iterator j = m_SubDirectories.begin();
-      j != m_SubDirectories.end(); ++j)
+  const std::vector<std::string>& dirs = m_Makefile->GetSubDirectories();
+  for(std::vector<std::string>::const_iterator j = dirs.begin();
+      j != dirs.end(); ++j)
     {
     this->FindAllCMakeListsFiles(j->c_str(), dspfiles);
     }
   // For each DSP file created insert them into the DSW file
-  for(std::vector<cmDSPMakefile*>::iterator k = dspfiles.begin();
+  for(std::vector<cmMSProjectGenerator*>::iterator k = dspfiles.begin();
       k != dspfiles.end(); ++k)
     {
     // Get the directory for the dsp file, it comes
     // from the source, so it has the source path which needs
     // to be removed as this may be built in a different directory
     // than the source
-    std::string dir = (*k)->GetCurrentDirectory();
+    std::string dir = (*k)->GetDSPMakefile()->
+      GetMakefile()->GetCurrentDirectory();
     // Get the home directory with the trailing slash
-    std::string homedir = this->GetHomeDirectory();
+    std::string homedir = m_Makefile->GetHomeDirectory();
     homedir += "/";
     // make the directory relative by removing the home directory part
     cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
     // Get the list of create dsp files from the cmDSPMakefile, more
     // than one dsp could have been created per input CMakeLists.txt file
-    std::vector<std::string> dspnames = (*k)->GetCreatedProjectNames();
-    std::cerr << "Create dsp for " 
-	      << dspnames.size()
-	      << " number of dsp files in " << dir << std::endl;
+    std::vector<std::string> dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames();
     for(std::vector<std::string>::iterator si = dspnames.begin();
 	si != dspnames.end(); ++si)
       {
       // Write the project into the DSW file
-      this->WriteProject(fout, si->c_str(), dir.c_str(), *k);
+      this->WriteProject(fout, si->c_str(), dir.c_str(), 
+                         (*k)->GetDSPMakefile());
       }
     // delete the cmDSPMakefile object once done with it to avoid
     // leaks
-    delete *k;
+    delete (*k)->GetDSPMakefile()->GetMakefile();
     }
   // Write the footer for the DSW file
   this->WriteDSWFooter(fout);
@@ -163,7 +169,7 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
 void cmDSWMakefile::WriteProject(std::ostream& fout, 
 				 const char* dspname,
 				 const char* dir,
-                                 cmMakefile* project)
+                                 cmDSPMakefile* project)
 {
   fout << "###############################################################################\n\n";
   fout << "Project: \"" << dspname << "\"=" 
@@ -171,12 +177,12 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
   fout << "Package=<5>\n{{{\n}}}\n\n";
   fout << "Package=<4>\n";
   fout << "{{{\n";
-  if(project->HasExecutables())
+  if(project->GetMakefile()->HasExecutables())
     {
     // insert Begin Project Dependency  Project_Dep_Name project stuff here 
     std::vector<std::string>::iterator i, end;
-    i = project->GetBuildFlags().GetLinkLibraries().begin();
-    end = project->GetBuildFlags().GetLinkLibraries().end();
+    i = project->GetMakefile()->GetLinkLibraries().begin();
+    end = project->GetMakefile()->GetLinkLibraries().end();
     for(;i!= end; ++i)
       {
       fout << "Begin Project Dependency\n";

+ 9 - 10
Source/cmDSWWriter.h

@@ -18,28 +18,27 @@
  */
 #ifndef cmDSWMakefile_h
 #define cmDSWMakefile_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
-
+#include "cmStandardIncludes.h"
 #include "cmMakefile.h"
-#include <vector>
-class cmDSPMakefile;
 
+class cmDSPMakefile;
+class cmMSProjectGenerator;
 
-class cmDSWMakefile : public cmMakefile
+class cmDSWMakefile 
 {
 public:
+  cmDSWMakefile(cmMakefile*);
   virtual void OutputDSWFile();
 private:
   void FindAllCMakeListsFiles(const char* subdir,
-			      std::vector<cmDSPMakefile*>&);
+			      std::vector<cmMSProjectGenerator*>&);
   void WriteDSWFile(std::ostream& fout);
   void WriteDSWHeader(std::ostream& fout);
   void WriteProject(std::ostream& fout, 
-		     const char* name, const char* path,
-                    cmMakefile* project);
+                    const char* name, const char* path,
+                    cmDSPMakefile* project);
   void WriteDSWFooter(std::ostream& fout);
+  cmMakefile* m_Makefile;
 };
 
 #endif

+ 2 - 3
Source/cmDirectory.cxx

@@ -91,9 +91,8 @@ cmDirectory
     return 0;
     }
   
-  dirent* d =0;
   dir = opendir(name);
-  for ( d = readdir(dir); d; d = readdir(dir) )
+  for (dirent* d = readdir(dir); d; d = readdir(dir) )
     {
     m_Files.push_back(d->d_name);
     }
@@ -114,7 +113,7 @@ cmDirectory
 {
   if ( index >= m_Files.size() )
     {
-	std::cerr << "Bad index for GetFile on cmDirectory\n";
+    cmSystemTools::Error("Bad index for GetFile on cmDirectory\n", 0);
     return 0;
     }
   return m_Files[index].c_str();

+ 2 - 5
Source/cmDirectory.h

@@ -16,11 +16,8 @@
 #ifndef __cmDirectory_h
 #define __cmDirectory_h
 
-#include <iostream>
-#include <string>
-#include <vector>
-
-
+#include "cmStandardIncludes.h"
+#include "cmSystemTools.h"
 /** \class cmDirectory
  * \brief Portable directory/filename traversal.
  * 

+ 20 - 0
Source/cmExecutablesRule.cxx

@@ -0,0 +1,20 @@
+#include "cmExecutablesRule.h"
+
+// cmExecutableRule
+bool cmExecutablesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    cmClassFile file;
+    file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
+    m_Makefile->AddExecutable(file);
+    }
+  return true;
+}
+

+ 37 - 0
Source/cmExecutablesRule.h

@@ -0,0 +1,37 @@
+#ifndef cmExecutablesRule_h
+#define cmExecutablesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmExecutablesRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmExecutablesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "EXECUTABLES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add a list of executables files.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "EXECUTABLES(file1 file2 ...)";
+    }
+};
+
+
+
+#endif

+ 18 - 0
Source/cmFindIncludeRule.cxx

@@ -0,0 +1,18 @@
+#include "cmFindIncludeRule.h"
+
+// cmFindIncludeRule
+bool cmFindIncludeRule::Invoke(std::vector<std::string>& args)
+{
+  return false;
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddDefineFlag((*i).c_str());
+    }
+}
+

+ 38 - 0
Source/cmFindIncludeRule.h

@@ -0,0 +1,38 @@
+#ifndef cmFindIncludeRule_h
+#define cmFindIncludeRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmFindIncludeRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmFindIncludeRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "FIND_INCLUDE";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Find an include path.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "FIND_INCLUDE(DEFINE try1 try2 ...);";
+    }
+};
+
+
+
+#endif

+ 18 - 0
Source/cmFindLibraryRule.cxx

@@ -0,0 +1,18 @@
+#include "cmFindLibraryRule.h"
+
+// cmFindLibraryRule
+bool cmFindLibraryRule::Invoke(std::vector<std::string>& args)
+{
+  return false;
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddDefineFlag((*i).c_str());
+    }
+}
+

+ 38 - 0
Source/cmFindLibraryRule.h

@@ -0,0 +1,38 @@
+#ifndef cmFindLibraryRule_h
+#define cmFindLibraryRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmFindLibraryRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmFindLibraryRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "FIND_LIBRARY";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Set a name for the entire project. One argument.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "FIND_LIBRARY(DEFINE try1 try2);";
+    }
+};
+
+
+
+#endif

+ 65 - 0
Source/cmFindProgramRule.cxx

@@ -0,0 +1,65 @@
+#include "cmFindProgramRule.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+static void GetPath(std::vector<std::string>& path)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  char* pathSep = ";";
+#else
+  char* pathSep = ":";
+#endif
+  std::string pathEnv = getenv("PATH");
+  std::string::size_type start =0;
+  bool done = false;
+  while(!done)
+    {
+    std::string::size_type endpos = pathEnv.find(pathSep, start);
+    if(endpos != std::string::npos)
+      {
+      path.push_back(pathEnv.substr(start, endpos-start));
+      start = endpos+1;
+      }
+    else
+      {
+      done = true;
+      }
+    }
+}
+
+  
+
+// cmFindProgramRule
+bool cmFindProgramRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 2 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+
+  std::vector<std::string> path;
+  GetPath(path);
+  std::vector<std::string>::iterator i = args.begin();
+  const char* define = (*i).c_str();
+  i++;
+  for(; i != args.end(); ++i)
+    {
+    for(int k=0; k < path.size(); k++)
+      {
+      std::string tryPath = path[k];
+      tryPath += "/";
+      tryPath += *i;
+#ifdef _WIN32
+      tryPath += ".exe";
+#endif
+      if(cmSystemTools::FileExists(tryPath.c_str()))
+        {
+        m_Makefile->AddDefinition(define, tryPath.c_str());
+        return true;
+        }
+      }
+    }
+  return false;
+}
+

+ 39 - 0
Source/cmFindProgramRule.h

@@ -0,0 +1,39 @@
+#ifndef cmFindProgramRule_h
+#define cmFindProgramRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmFindProgramRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmFindProgramRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "FIND_PROGRARM";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "not implemented.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "not implemented.\n"
+        "FIND_PROGRARM(NAME try1 try2 ...);";
+    }
+};
+
+
+
+#endif

+ 18 - 0
Source/cmIncludeDirectoryRule.cxx

@@ -0,0 +1,18 @@
+#include "cmIncludeDirectoryRule.h"
+
+// cmIncludeDirectoryRule
+bool cmIncludeDirectoryRule::Invoke(std::vector<std::string>& args)
+{
+ if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddIncludeDirectory((*i).c_str());
+    }
+  return true;
+}
+

+ 38 - 0
Source/cmIncludeDirectoryRule.h

@@ -0,0 +1,38 @@
+#ifndef cmIncludeDirectoryRule_h
+#define cmIncludeDirectoryRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmIncludeDirectoryRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmIncludeDirectoryRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "INCLUDE_DIRECTORIES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add include directories to the build.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "INCLUDE_DIRECTORIES(dir1 dir2 ...).\n";
+    }
+};
+
+
+
+#endif

+ 14 - 0
Source/cmLibraryRule.cxx

@@ -0,0 +1,14 @@
+#include "cmLibraryRule.h"
+
+// cmLibraryRule
+bool cmLibraryRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 || args.size() > 1)
+    {
+    this->SetError("PROJECT called with incorrect number of arguments");
+    return false;
+    }
+  m_Makefile->SetLibraryName(args[0].c_str());
+  return true;
+}
+

+ 37 - 0
Source/cmLibraryRule.h

@@ -0,0 +1,37 @@
+#ifndef cmLibraryRule_h
+#define cmLibraryRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmLibraryRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmLibraryRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "LIBRARY";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Set a name for the Library.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "LIBRARY(libraryname);";
+    }
+};
+
+
+
+#endif

+ 18 - 0
Source/cmLinkDirectoriesRule.cxx

@@ -0,0 +1,18 @@
+#include "cmLinkDirectoriesRule.h"
+
+// cmLinkDirectoriesRule
+bool cmLinkDirectoriesRule::Invoke(std::vector<std::string>& args)
+{
+ if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddLinkDirectory((*i).c_str());
+    }
+  return true;
+}
+

+ 42 - 0
Source/cmLinkDirectoriesRule.h

@@ -0,0 +1,42 @@
+#ifndef cmLinkDirectoriesRule_h
+#define cmLinkDirectoriesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmLinkDirectoriesRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmLinkDirectoriesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "LINK_DIRECTORIES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Specify link directories.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Specify the paths to the libraries that will be linked in.\n"
+        "LINK_DIRECTORIES(directory1 directory2 ...);\n"
+        "The directories can use built in definitions like \n"
+        "CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR.";
+    }
+};
+
+
+
+#endif

+ 18 - 0
Source/cmLinkLibrariesRule.cxx

@@ -0,0 +1,18 @@
+#include "cmLinkLibrariesRule.h"
+
+// cmLinkLibrariesRule
+bool cmLinkLibrariesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddLinkLibrary((*i).c_str());
+    }
+  return true;
+}
+

+ 45 - 0
Source/cmLinkLibrariesRule.h

@@ -0,0 +1,45 @@
+#ifndef cmLinkLibrariesRule_h
+#define cmLinkLibrariesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmLinkLibrariesRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmLinkLibrariesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+  
+    
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "LINK_LIBRARIES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return 
+        "Specify a list of libraries to be linked into executables or \n"
+        "shared objects.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Specify a list of libraries to be linked into executables or \n"
+        "shared objects.  This rule is passed down to all other rules."
+        "LINK_LIBRARIES(library1 library2).\n"
+        "The library name should be the same as the name used in the\n"
+        "LIBRARY(library) rule.";
+    }
+};
+
+
+
+#endif

+ 31 - 0
Source/cmMSProjectGenerator.cxx

@@ -0,0 +1,31 @@
+#include "cmMSProjectGenerator.h"
+#include "cmDSWMakefile.h"
+#include "cmDSPMakefile.h"
+
+cmMSProjectGenerator::cmMSProjectGenerator()
+{
+  m_DSWMakefile = 0;
+  m_DSPMakefile = 0;
+  SetBuildDSW();
+}
+
+void cmMSProjectGenerator::GenerateMakefile()
+{
+  if(m_BuildDSW)
+    {
+    m_DSWMakefile = new cmDSWMakefile(m_Makefile);
+    m_DSWMakefile->OutputDSWFile();
+    }
+  else
+    {
+    m_DSPMakefile = new cmDSPMakefile(m_Makefile);
+    m_DSPMakefile->OutputDSPFile();
+    }
+}
+
+cmMSProjectGenerator::~cmMSProjectGenerator()
+{
+  delete m_DSPMakefile;
+  delete m_DSWMakefile;
+}
+

+ 45 - 0
Source/cmMSProjectGenerator.h

@@ -0,0 +1,45 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) 2000 National Library of Medicine
+  All rights reserved.
+
+  See COPYRIGHT.txt for copyright details.
+
+=========================================================================*/
+/**
+ * cmMSProjectGenerator - class to write a microsoft DSW file.
+ */
+#ifndef cmMSProjectGenerator_h
+#define cmMSProjectGenerator_h
+#include "cmStandardIncludes.h"
+#include "cmMakefileGenerator.h"
+
+class cmDSPMakefile;
+class cmDSWMakefile;
+
+
+class cmMSProjectGenerator : public cmMakefileGenerator
+{
+public:
+  cmMSProjectGenerator();
+  ~cmMSProjectGenerator();
+  virtual void GenerateMakefile();
+  void SetBuildDSP() { m_BuildDSW = false;}
+  void SetBuildDSW() { m_BuildDSW = true;}
+  cmDSWMakefile* GetDSWMakefile() { return m_DSWMakefile;}
+  cmDSPMakefile* GetDSPMakefile() { return m_DSPMakefile;}
+private:
+  cmDSWMakefile* m_DSWMakefile;
+  cmDSPMakefile* m_DSPMakefile;
+  bool m_BuildDSW;
+};
+
+
+#endif

+ 17 - 20
Source/cmMakeDepend.cxx

@@ -1,13 +1,6 @@
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 #include "cmMakeDepend.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include <fstream>
-#include <iostream>
-#include <algorithm>
-#include <functional>
-
 
 cmMakeDepend::cmMakeDepend()
 {
@@ -43,8 +36,7 @@ void cmMakeDepend::SetMakefile(cmMakefile* makefile)
   m_Makefile = makefile;
   
   // Now extract any include paths from the makefile flags
-  cmCollectFlags& flags = m_Makefile->GetBuildFlags();
-  std::vector<std::string>& includes = flags.GetIncludeDirectories();
+  std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
   std::vector<std::string>::iterator j;
   for(j = includes.begin(); j != includes.end(); ++j)
     {
@@ -76,7 +68,7 @@ void cmMakeDepend::DoDepends()
   // The size of the m_DependInformation will change as
   // Depend is called so do not use an iterater but rather
   // depend on the size of the array.
-  int j = 0;
+  unsigned int j = 0;
   while(j != m_DependInformation.size())
     {
     cmDependInformation* info = m_DependInformation[j];
@@ -94,7 +86,6 @@ void cmMakeDepend::DoDepends()
     cmDependInformation* info = *i;
     // Remove duplicate depends
     info->RemoveDuplicateIndices();
-    std::vector<cmClassFile>::iterator j = m_Makefile->m_Classes.begin();
     // find the class 
     if(info->m_ClassFileIndex != -1)
       {
@@ -115,14 +106,14 @@ void cmMakeDepend::Depend(cmDependInformation* info)
   const char* path = info->m_FullPath.c_str();
   if(!path)
     {
-    std::cerr << "no full path for object"  << std::endl;
+    cmSystemTools::Error("no full path for object", 0);
     return;
     }
   
   std::ifstream fin(path);
   if(!fin)
     {
-    std::cerr << "error can not open " << info->m_FullPath << std::endl;
+    cmSystemTools::Error("error can not open ", info->m_FullPath.c_str());
     return;
     }
   char line[255];
@@ -142,8 +133,8 @@ void cmMakeDepend::Depend(cmDependInformation* info)
 	// if a < is not found then move on
 	if(qstart == std::string::npos)
 	  {
-	  std::cerr << "unknown include directive " << currentline 
-		    << std::endl;
+	  cmSystemTools::Error("unknown include directive ", 
+                               currentline.c_str() );
 	  continue;
 	  }
 	else
@@ -162,7 +153,11 @@ void cmMakeDepend::Depend(cmDependInformation* info)
 	{
 	if(m_Verbose)
 	  {
-	  std::cerr  << "skipping " << includeFile << " for file " << path << std::endl;
+          std::string message = "Skipping ";
+          message += includeFile;
+          message += " for file ";
+          message += path;
+	  cmSystemTools::Error(message.c_str(), 0);
 	  }
 	continue;
 	}
@@ -196,7 +191,7 @@ void cmMakeDepend::Depend(cmDependInformation* info)
 // object if one is not found
 int cmMakeDepend::FindInformation(const char* fname)
 {
-  int i = 0;
+  unsigned int i = 0;
   
   while(i < m_DependInformation.size())
     {
@@ -245,6 +240,7 @@ std::string cmMakeDepend::FullPath(const char* fname)
     {
       return std::string(fname);
     }
+  
   for(std::vector<std::string>::iterator i = m_IncludeDirectories.begin();
       i != m_IncludeDirectories.end(); ++i)
     {
@@ -256,7 +252,7 @@ std::string cmMakeDepend::FullPath(const char* fname)
       return path;
       }
     }
-  std::cerr << "Depend: File not found " << fname  << std::endl;
+  cmSystemTools::Error("Depend: File not found ", fname);
   return std::string(fname);
 }
 
@@ -274,7 +270,8 @@ void cmMakeDepend::AddFileToSearchPath(const char* file)
   if(pos != std::string::npos)
     {
     std::string path = filepath.substr(0, pos);
-    if(std::find(m_IncludeDirectories.begin(), m_IncludeDirectories.end(), path)
+    if(std::find(m_IncludeDirectories.begin(),
+                 m_IncludeDirectories.end(), path)
        == m_IncludeDirectories.end())
       {
       m_IncludeDirectories.push_back(path);

+ 1 - 2
Source/cmMakeDepend.h

@@ -22,8 +22,7 @@
 #include "cmMakefile.h"
 #include "cmClassFile.h"
 #include "cmRegularExpression.h"
-#include <vector>
-#include <string>
+#include "cmStandardIncludes.h"
 
 
 // This structure stores the depend information 

+ 311 - 177
Source/cmMakefile.cxx

@@ -1,225 +1,359 @@
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 #include "cmMakefile.h"
+#include "cmRuleMaker.h"
+#include "cmStandardIncludes.h"
 #include "cmClassFile.h"
 #include "cmDirectory.h"
 #include "cmSystemTools.h"
-#include <fstream>
-#include <iostream>
+#include "cmMakefileGenerator.h"
 
+#include "cmAbstractFilesRule.h"
+#include "cmAddTargetRule.h"
+#include "cmAuxSourceDirectoryRule.h"
+#include "cmExecutablesRule.h"
+#include "cmFindIncludeRule.h"
+#include "cmFindLibraryRule.h"
+#include "cmFindProgramRule.h"
+#include "cmIncludeDirectoryRule.h"
+#include "cmLibraryRule.h"
+#include "cmLinkDirectoriesRule.h"
+#include "cmLinkLibrariesRule.h"
+#include "cmProjectRule.h"
+#include "cmSourceFilesRule.h"
+#include "cmSourceFilesRequireRule.h"
+#include "cmSubdirRule.h"
+#include "cmUnixDefinesRule.h"
+#include "cmUnixLibrariesRule.h"
+#include "cmWin32DefinesRule.h"
+#include "cmWin32LibrariesRule.h"
+#include "cmTestsRule.h"
 
 // default is not to be building executables
 cmMakefile::cmMakefile()
 {
+  m_DefineFlags = " ";
   m_Executables = false;
+  m_MakefileGenerator = 0;
+  this->AddDefaultRules();
+}
+
+void cmMakefile::AddDefaultRules()
+{
+  this->AddRuleMaker(new cmAbstractFilesRule);
+  this->AddRuleMaker(new cmAddTargetRule);
+  this->AddRuleMaker(new cmAuxSourceDirectoryRule);
+  this->AddRuleMaker(new cmExecutablesRule);
+  this->AddRuleMaker(new cmFindIncludeRule);
+  this->AddRuleMaker(new cmFindLibraryRule);
+  this->AddRuleMaker(new cmFindProgramRule);
+  this->AddRuleMaker(new cmIncludeDirectoryRule);
+  this->AddRuleMaker(new cmLibraryRule);
+  this->AddRuleMaker(new cmLinkDirectoriesRule);
+  this->AddRuleMaker(new cmLinkLibrariesRule);
+  this->AddRuleMaker(new cmProjectRule);
+  this->AddRuleMaker(new cmSourceFilesRule);
+  this->AddRuleMaker(new cmSourceFilesRequireRule);
+  this->AddRuleMaker(new cmSubdirRule);
+  this->AddRuleMaker(new cmUnixLibrariesRule);
+  this->AddRuleMaker(new cmUnixDefinesRule);
+  this->AddRuleMaker(new cmWin32LibrariesRule);
+  this->AddRuleMaker(new cmWin32DefinesRule);
+  this->AddRuleMaker(new cmTestsRule);
+#ifdef _WIN32
+  this->AddDefinition("WIN32", "1");
+#else
+  this->AddDefinition("UNIX", "1");
+#endif
+  // Cygwin is more like unix so enable the unix rules
+#if defined(__CYGWIN__)
+  this->AddDefinition("UNIX", "1");
+#endif
+}
+
+
+cmMakefile::~cmMakefile()
+{
+  for(int i=0; i < m_UsedRuleMakers.size(); i++)
+    {
+    delete m_UsedRuleMakers[i];
+    }
+  for(StringRuleMakerMap::iterator j = m_RuleMakers.begin();
+      j != m_RuleMakers.end(); ++j)
+    {
+    delete (*j).second;
+    }
+  delete m_MakefileGenerator;
+}
+
+void cmMakefile::PrintStringVector(const char* s, std::vector<std::string>& v)
+{
+  std::cout << s << ": ( \n";
+  for(std::vector<std::string>::iterator i = v.begin();
+      i != v.end(); ++i)
+    {
+    std::cout << (*i).c_str() << " ";
+    }
+  std::cout << " )\n";
 }
 
 
 // call print on all the classes in the makefile
 void cmMakefile::Print()
 {
-  for(int i = 0; i < m_Classes.size(); i++)
+  std::cout << "classes:\n";
+  for(unsigned int i = 0; i < m_Classes.size(); i++)
     m_Classes[i].Print();
+  std::cout << " m_OutputDirectory; " << 
+    m_OutputDirectory.c_str() << std::endl;
+  std::cout << " m_OutputHomeDirectory; " << 
+    m_OutputHomeDirectory.c_str() << std::endl;
+  std::cout << " m_cmHomeDirectory; " << 
+    m_cmHomeDirectory.c_str() << std::endl;
+  std::cout << " m_cmCurrentDirectory; " << 
+    m_cmCurrentDirectory.c_str() << std::endl;
+  std::cout << " m_LibraryName;	" <<  m_LibraryName.c_str() << std::endl;
+  std::cout << " m_ProjectName;	" <<  m_ProjectName.c_str() << std::endl;
+  this->PrintStringVector("m_SubDirectories ", m_SubDirectories); 
+  this->PrintStringVector("m_MakeVerbatim ", m_MakeVerbatim); 
+  this->PrintStringVector("m_IncludeDirectories;", m_IncludeDirectories);
+  this->PrintStringVector("m_LinkDirectories", m_LinkDirectories);
+  this->PrintStringVector("m_LinkLibraries", m_LinkLibraries);
+  this->PrintStringVector("m_LinkLibrariesWin32", m_LinkLibrariesWin32);
+  this->PrintStringVector("m_LinkLibrariesUnix", m_LinkLibrariesUnix);
 }
 
 // Parse the given CMakeLists.txt file into a list of classes.
-bool cmMakefile::ReadMakefile(const char* filename)
+bool cmMakefile::ReadMakefile(const char* filename, bool inheriting)
 {
-  m_BuildFlags.SetSourceHomeDirectory(this->GetHomeDirectory());
-  m_BuildFlags.SetStartDirectory(this->GetCurrentDirectory());
-  m_BuildFlags.ParseDirectories();
-  m_BuildFlags.ExpandVaribles(this);
- 
+  // If not being called from ParseDirectory which
+  // sets the inheriting flag, then parse up the
+  // tree and collect inherited parameters
+  if(!inheriting)
+    {
+    cmSystemTools::ConvertToUnixSlashes(m_cmCurrentDirectory);
+    m_SourceHomeDirectory = m_cmHomeDirectory;
+    cmSystemTools::ConvertToUnixSlashes(m_SourceHomeDirectory);
+    this->ParseDirectory(m_cmCurrentDirectory.c_str());
+    }
+  // Now read the input file
   std::ifstream fin(filename);
   if(!fin)
     {
-    std::cerr << "error can not open file " << filename << std::endl;
+    cmSystemTools::Error("error can not open file ", filename);
     return false;
     }
-  char inbuffer[2048];
-  while ( fin.getline(inbuffer, 2047 ) )
+  std::string name;
+  std::vector<std::string> arguments;
+  while ( fin )
     {
-    std::string line = inbuffer;
-    cmClassFile file;
-    std::string::size_type pos = line.find("SOURCE_FILES");
-    if((pos != std::string::npos) && (pos == 0 ) )
-      {
-      if(line.find("\\") != std::string::npos)
-	{
-	this->ReadClasses(fin, false);
-	}
-      }
-#ifdef _WIN32
-    else if(line.find("WIN32_SOURCE_FILES") != std::string::npos)
-      {
-      if(line.find("\\") != std::string::npos)
-	{
-	this->ReadClasses(fin, false);
-	}
-      }
-#else
-    else if(line.find("UNIX_SOURCE_FILES") != std::string::npos)
-      {
-      if(line.find("\\") != std::string::npos)
-	{
-	this->ReadClasses(fin, false);
-	}
-      }
-#endif
-    else if(line.find("ABSTRACT_CLASSES") != std::string::npos)
+    if(cmSystemTools::ParseFunction(fin, name, arguments) )
       {
-      if(line.find("\\") != std::string::npos)
-	{
-	this->ReadClasses(fin, true);
-	}
-      }
-    else if(line.find("AUX_SOURCE_DIRECTORY") != std::string::npos)
-      {
-      this->ReadTemplateInstanceDirectory(line);
-      }
-    else if(line.find("SUBDIRS") != std::string::npos)
-      {
-      if(line.find("\\") != std::string::npos)
-	{
-        cmSystemTools::ReadList(m_SubDirectories, fin);
-	}
-      }
-    else if(line.find("EXECUTABLES") != std::string::npos || line.find("TESTS") != std::string::npos )
-      {
-      if(line.find("\\") != std::string::npos)
-	{
-	this->ReadClasses(fin, false);
-	m_Executables = true;
-	}
-      }
-    else if(line.find("BEGIN MAKE VERBATIM") != std::string::npos)
-      {
-      char inbuffer[2048];
-      bool done = false;
-      m_MakeVerbatim.push_back("# Begin CMakeLists Verbatim\n");
-      while(!done)
+      // Special rule that needs to be removed when 
+      // ADD_RULE is implemented
+      if(name == "VERBATIM")
         {
-        fin.getline(inbuffer, 2047);
-        m_MakeVerbatim.push_back(inbuffer);
-        if((m_MakeVerbatim.end()-1)->find("END MAKE VERBATIM") 
-           != std::string::npos )
+        if(!inheriting)
           {
-          done = true;
-          *(m_MakeVerbatim.end()-1) = "# End CMakeLists VERBATIM\n\n";
+          m_MakeVerbatim = arguments;
+          }
+        }
+      else
+        {
+        StringRuleMakerMap::iterator pos = m_RuleMakers.find(name);
+        if(pos != m_RuleMakers.end())
+          {
+          cmRuleMaker* rm = (*pos).second;
+          cmRuleMaker* usedMaker = rm->Clone();
+          usedMaker->SetMakefile(this);
+          usedMaker->LoadCache();
+          m_UsedRuleMakers.push_back(usedMaker);
+          if(usedMaker->GetEnabled())
+            {
+            // if not running in inherit mode or
+            // if the rule is inherited then Invoke it.
+            if(!inheriting || usedMaker->IsInherited())
+              {
+              if(!usedMaker->Invoke(arguments))
+                {
+                cmSystemTools::Error(usedMaker->GetError());
+                }
+              }
+            }
+          }
+        else
+          {
+          cmSystemTools::Error("unknown CMake function", name.c_str());
           }
         }
-      }
-    else if(line.find("LIBRARY") != std::string::npos)
-      {
-      std::string libname = cmSystemTools::ExtractVariable("LIBRARY", 
-                                                           line.c_str());
-      this->SetLibraryName(libname.c_str());
-      }
-    else if(line.find("PROJECT") != std::string::npos)
-      {
-      std::string libname = cmSystemTools::ExtractVariable("PROJECT", 
-                                                           line.c_str());
-      this->SetProjectName(libname.c_str());
       }
     }
   return true;
 }
   
 
-// Read a list from the Makefile stream
-void cmMakefile::ReadClasses(std::ifstream& fin,
-			      bool abstract)
-{
-  char inbuffer[2048];
-  bool done = false;
-  while (!done)
-    {  
-    // read a line from the makefile
-    fin.getline(inbuffer, 2047); 
-    // convert to a string class
-    std::string classname = inbuffer;
-    // if the line does not end in \ then we are at the
-    // end of the list
-    if(classname.find('\\') == std::string::npos)
-      {
-      done = true;
-      }
-    // remove extra spaces and \ from the class name
-    classname = cmSystemTools::CleanUpName(classname.c_str());
-    
-    // if this is not an abstract list then add new class
-    // to the list of classes in this makefile
-    if(!abstract)
-      {
-      cmClassFile file;
-      file.SetName(classname.c_str(), this->GetCurrentDirectory());
-      file.m_AbstractClass = false;
-      m_Classes.push_back(file);
-      }
-    else
-      {
-      // if this is an abstract list, then look
-      // for an existing class and set it to abstract
-      for(int i = 0; i < m_Classes.size(); i++)
-	{
-	if(m_Classes[i].m_ClassName == classname)
-	  {
-	  m_Classes[i].m_AbstractClass = true;
-	  break;
-	  }
-	}
-      }
+void cmMakefile::AddRuleMaker(cmRuleMaker* wg)
+{
+  std::string name = wg->GetName();
+  m_RuleMakers.insert( StringRuleMakerMap::value_type(name, wg));
+}
+
+  // Set the make file 
+void cmMakefile::SetMakefileGenerator(cmMakefileGenerator* mf)
+{
+  delete m_MakefileGenerator;
+  m_MakefileGenerator = mf;
+}
+
+  // Generate the output file
+void cmMakefile::GenerateMakefile()
+{
+  // do all the variable expansions here
+  this->ExpandVaribles();
+  // set the makefile on the generator
+  m_MakefileGenerator->SetMakefile(this);
+  // give all the rules a chance to do something
+  // after the file has been parsed before generation
+  for(std::vector<cmRuleMaker*>::iterator i = m_UsedRuleMakers.begin();
+      i != m_UsedRuleMakers.end(); ++i)
+    {
+    (*i)->FinalPass();
     }
+  // now do the generation
+  m_MakefileGenerator->GenerateMakefile();
 }
 
-// Find all of the files in dir as specified from this line:
-// AUX_SOURCE_DIRECTORY = dir
-// Add all the files to the m_Classes array.
+void cmMakefile::AddClass(cmClassFile& cmfile)
+{
+  m_Classes.push_back(cmfile);
+}
+
+
+
+void cmMakefile::AddCustomRule(const char* source,
+                               const char* result,
+                               const char* command,
+                               std::vector<std::string>& depends)
+{
+  cmMakefile::customRule rule;
+  rule.m_Source = source;
+  rule.m_Result = result;
+  rule.m_Command = command;
+  rule.m_Depends = depends;
+  m_CustomRules.push_back(rule);
+}
+
+void cmMakefile::AddDefineFlag(const char* flag)
+{
+  m_DefineFlags += " ";
+  m_DefineFlags += flag;
+}
+
+void cmMakefile::AddExecutable(cmClassFile& cf)
+{
+  m_Classes.push_back(cf);
+  m_Executables = true;
+}
+
+void cmMakefile::AddLinkLibrary(const char* lib)
+{
+  m_LinkLibraries.push_back(lib);
+}
+
+void cmMakefile::AddLinkDirectory(const char* dir)
+{
+  m_LinkDirectories.push_back(dir);
+}
+
+void cmMakefile::AddSubDirectory(const char* sub)
+{
+  m_SubDirectories.push_back(sub);
+}
+
+void cmMakefile::AddIncludeDirectory(const char* inc)
+{
+  m_IncludeDirectories.push_back(inc);
+}
+
+void cmMakefile::AddDefinition(const char* name, const char* value)
+{
+  m_Definitions.insert(DefinitionMap::value_type(name, value));
+}
+
+void cmMakefile::SetProjectName(const char* p)
+{
+  m_ProjectName = p;
+}
+
+void cmMakefile::SetLibraryName(const char* l)
+{
+  m_LibraryName = l;
+}
+
+
+void cmMakefile::AddExtraDirectory(const char* dir)
+{
+  m_AuxSourceDirectories.push_back(dir);
+}
 
-void cmMakefile::ReadTemplateInstanceDirectory(std::string& line)
+
+// Go until directory == m_cmHomeDirectory 
+// 1. fix slashes
+// 2. peal off /dir until home found, go no higher
+void cmMakefile::ParseDirectory(const char* dir)
 {
-  std::string::size_type start = line.find("=");
-  if(start != std::string::npos)
+  std::string listsFile = dir;
+  listsFile += "/CMakeLists.txt";
+  if(cmSystemTools::FileExists(listsFile.c_str()))
     {
-    std::string templateDirectory = line.substr(start+1, line.size());
-    templateDirectory = cmSystemTools::CleanUpName(templateDirectory.c_str());
-    m_TemplateDirectories.push_back(templateDirectory);
-    std::string tdir = this->GetCurrentDirectory();
-    tdir += "/";
-    tdir += templateDirectory;
-    // Load all the files in the directory
-    cmDirectory dir;
-    if(dir.Load(tdir.c_str()))
-      {
-      int numfiles = dir.GetNumberOfFiles();
-      for(int i =0; i < numfiles; ++i)
-        {
-        std::string file = dir.GetFile(i);
-        // ignore files less than f.cxx in length
-        if(file.size() > 4)
-          {
-          // Remove the extension
-          std::string::size_type dotpos = file.rfind(".");
-          file = file.substr(0, dotpos);
-          std::string fullname = templateDirectory;
-          fullname += "/";
-          fullname += file;
-          // add the file as a class file so 
-          // depends can be done
-          cmClassFile cmfile;
-          cmfile.SetName(fullname.c_str(), this->GetCurrentDirectory());
-          cmfile.m_AbstractClass = false;
-          m_Classes.push_back(cmfile);
-          }
-        }
-      }
-    else
-      {
-      std::cerr << "Warning can not open template instance directory "
-                << templateDirectory.c_str() << std::endl;
-      }
+    this->ReadMakefile(listsFile.c_str(), true);
+    }
+  if(m_SourceHomeDirectory == dir)
+    {
+    return;
+    }
+
+  std::string dotdotDir = dir;
+  std::string::size_type pos = dotdotDir.rfind('/');
+  if(pos != std::string::npos)
+    {
+    dotdotDir = dotdotDir.substr(0, pos);
+    this->ParseDirectory(dotdotDir.c_str());
     }
 }
 
 
+// expance CMAKE_BINARY_DIR and CMAKE_SOURCE_DIR in the
+// include and library directories.
+
+void cmMakefile::ExpandVaribles()
+{
+   // Now replace varibles
+  std::vector<std::string>::iterator j, begin, end;
+  begin = m_IncludeDirectories.begin();
+  end = m_IncludeDirectories.end();
+  for(j = begin; j != end; ++j)
+    {
+    cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
+				 this->GetOutputHomeDirectory() );
+    cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_DIR}",
+				 this->GetHomeDirectory() );
+    }
+  begin = m_LinkDirectories.begin();
+  end = m_LinkDirectories.end();
+  for(j = begin; j != end; ++j)
+    {
+    cmSystemTools::ReplaceString(*j, "${CMAKE_BINARY_DIR}",
+				 this->GetOutputHomeDirectory() );
+    cmSystemTools::ReplaceString(*j, "${CMAKE_SOURCE_DIR}",
+                                 this->GetHomeDirectory() );
+    }
+}
+
+const char* cmMakefile::GetDefinition(const char* name)
+{
+  DefinitionMap::iterator pos = m_Definitions.find(name);
+  if(pos != m_Definitions.end())
+    {
+    return (*pos).second.c_str();
+    }
+  return 0;
+}

+ 104 - 27
Source/cmMakefile.h

@@ -19,28 +19,52 @@
  */
 #ifndef cmMakefile_h
 #define cmMakefile_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
-
+#include "cmStandardIncludes.h"
 #include "cmClassFile.h"
-#include "cmCollectFlags.h"
-#include <vector>
-#include <fstream>
-#include <iostream>
+#include "cmSystemTools.h"
+class cmRuleMaker;
+class cmMakefileGenerator;
+
 
 class cmMakefile
 {
 public:
   cmMakefile();
-  // Parse a Makfile.in file
-  bool ReadMakefile(const char* makefile); 
+  ~cmMakefile();
+  // Parse a CMakeLists.txt file
+  bool ReadMakefile(const char* makefile, bool inheriting = false); 
+  // Add a wrap generator 
+  void AddRuleMaker(cmRuleMaker* );
+  // Set the make file 
+  void SetMakefileGenerator(cmMakefileGenerator*);
+  // Generate the output file
+  void GenerateMakefile();
+  
   // Print useful stuff to stdout
   void Print();
+  
+  // cmRuleMaker interfaces
+  void AddCustomRule(const char* source,
+                     const char* result,
+                     const char* command,
+                     std::vector<std::string>& depends);
+  void AddDefineFlag(const char* definition);
+  void AddExecutable(cmClassFile&);
+  void AddLinkLibrary(const char*);
+  void AddLinkDirectory(const char*);
+  void AddSubDirectory(const char*);
+  void AddIncludeDirectory(const char*);
+  void AddDefinition(const char* name, const char* value);
+  void SetProjectName(const char*);
+  void SetLibraryName(const char*);
+  void AddClass(cmClassFile& );
+  void AddExtraDirectory(const char* dir);
+  
   // Set the home directory for the project
   void SetHomeDirectory(const char* dir) 
     {
       m_cmHomeDirectory = dir;
+      cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory);
     }
   const char* GetHomeDirectory() 
     {
@@ -56,19 +80,11 @@ public:
       return m_cmCurrentDirectory.c_str();
     }
   // Set the name of the library that is built by this makefile
-  void SetLibraryName(const char* lib)
-    {
-      m_LibraryName = lib;
-    }
   const char* GetLibraryName()
     {
       return m_LibraryName.c_str();
     }
-  // Set the name of the library that is built by this makefile
-  void SetProjectName(const char* lib)
-    {
-      m_ProjectName = lib;
-    }
+
   const char* GetProjectName()
     {
       return m_ProjectName.c_str();
@@ -93,10 +109,6 @@ public:
     {
       return m_OutputHomeDirectory.c_str();
     }
-  cmCollectFlags& GetBuildFlags() 
-    {
-      return m_BuildFlags;
-    }
   const std::vector<std::string>& GetSubDirectories()
     { 
       return m_SubDirectories;
@@ -107,15 +119,60 @@ public:
       return m_Executables;
     }
   
+  std::vector<std::string>& GetIncludeDirectories()
+    { 
+      return m_IncludeDirectories;
+    }
+  
+  std::vector<std::string>& GetLinkDirectories()
+    { 
+      return m_LinkDirectories;
+    }
+  
+  std::vector<std::string>& GetLinkLibraries()
+    { 
+      return m_LinkLibraries;
+    }
+  
+  std::vector<std::string>& GetLinkLibrariesWin32()
+    { 
+      return m_LinkLibrariesWin32;
+    }
+  
+  std::vector<std::string>& GetLinkLibrariesUnix()
+    { 
+      return m_LinkLibrariesUnix;
+    }
+  std::vector<cmClassFile>& GetClasses(){ return  m_Classes;}
+  std::vector<std::string>& GetAuxSourceDirectories()
+    { return m_AuxSourceDirectories; }
+  std::vector<std::string>& GetMakeVerbatim() 
+    { return m_MakeVerbatim;}
+  const char* GetDefinition(const char*);
+
+  const char* GetDefineFlags()
+    { return m_DefineFlags.c_str();}
+
 private:
-  void ReadTemplateInstanceDirectory(std::string&);
+   /**
+   * Look for CMakeLists.txt files to parse in dir,
+   * then in dir's parents, until the SourceHome directory
+   * is found.
+   */
+  void ParseDirectory(const char* dir);
+  /**
+   * Parse a file for includes links and libs
+   */
+  void ExpandVaribles();
   void ReadClasses(std::ifstream& fin, bool t);
   friend class cmMakeDepend;	// make depend needs direct access 
-				// to the m_Classes array
+				// to the m_Classes array 
+  void PrintStringVector(const char* s, std::vector<std::string>& v);
+  void AddDefaultRules();
 protected:
   bool m_Executables;
   std::string m_Prefix;
-  std::vector<std::string> m_TemplateDirectories; // Template directory name if found in file
+  std::vector<std::string> m_AuxSourceDirectories; // 
   std::string m_OutputDirectory; // Current output directory for makefile
   std::string m_OutputHomeDirectory; // Top level output directory
   std::string m_cmHomeDirectory; // Home directory for source
@@ -125,7 +182,27 @@ protected:
   std::vector<cmClassFile> m_Classes; // list of classes in makefile
   std::vector<std::string> m_SubDirectories; // list of sub directories
   std::vector<std::string> m_MakeVerbatim; // lines copied from input file
-  cmCollectFlags m_BuildFlags;
+  std::vector<std::string> m_IncludeDirectories;
+  std::vector<std::string> m_LinkDirectories;
+  std::vector<std::string> m_LinkLibraries;
+  std::vector<std::string> m_LinkLibrariesWin32;
+  std::vector<std::string> m_LinkLibrariesUnix;
+  std::string m_DefineFlags;
+  std::string m_SourceHomeDirectory;
+  struct customRule
+  {
+    std::string m_Source;
+    std::string m_Result;
+    std::string m_Command;
+    std::vector<std::string> m_Depends;
+  };
+  std::vector<customRule> m_CustomRules;
+  typedef std::map<std::string, cmRuleMaker*> StringRuleMakerMap;
+  typedef std::map<std::string, std::string> DefinitionMap;
+  DefinitionMap m_Definitions;
+  StringRuleMakerMap m_RuleMakers;
+  std::vector<cmRuleMaker*> m_UsedRuleMakers;
+  cmMakefileGenerator* m_MakefileGenerator;
 };
 
 

+ 7 - 0
Source/cmMakefileGenerator.cxx

@@ -0,0 +1,7 @@
+#include "cmMakeFileGenerator.h"
+
+void cmMakefileGenerator::SetMakefile(cmMakefile* mf)
+{
+  m_Makefile = mf;
+}
+

+ 20 - 0
Source/cmMakefileGenerator.h

@@ -0,0 +1,20 @@
+#ifndef cmMakeFileGenerator_h
+#define cmMakeFileGenerator_h
+
+#include "cmStandardIncludes.h"
+
+class cmMakefile;
+struct cmClassFile;
+
+class cmMakefileGenerator
+{
+public:
+  // use the m_Makefile and the m_CustomRules and m_ExtraSourceFiles
+  // to generate the makefile
+  virtual void GenerateMakefile() = 0;
+  void SetMakefile(cmMakefile*);
+protected:
+  cmMakefile* m_Makefile;
+};
+
+#endif

+ 14 - 0
Source/cmProjectRule.cxx

@@ -0,0 +1,14 @@
+#include "cmProjectRule.h"
+
+// cmProjectRule
+bool cmProjectRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 || args.size() > 1)
+    {
+    this->SetError("PROJECT called with incorrect number of arguments");
+    return false;
+    }
+  m_Makefile->SetProjectName(args[0].c_str());
+  return true;
+}
+

+ 38 - 0
Source/cmProjectRule.h

@@ -0,0 +1,38 @@
+#ifndef cmProjectRule_h
+#define cmProjectRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmProjectRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmProjectRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "PROJECT";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Set a name for the entire project. One argument.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Set the name for the entire project.  This takes one argument.\n"
+        "PROJECT(projectname);";
+    }
+};
+
+
+
+#endif

+ 2 - 1
Source/cmRegularExpression.cxx

@@ -115,8 +115,9 @@
 //
 
 #include "cmRegularExpression.h"	// Include class specification 
+#include "cmStandardIncludes.h"
 #include <stdio.h>
-#include <string>
+
 
 // cmRegularExpression -- Copies the given regular expression.
 

+ 1 - 1
Source/cmRegularExpression.h

@@ -32,7 +32,7 @@
 #ifndef cmRegularExpression_h
 #define cmRegularExpression_h
 
-#include <string>
+#include "cmStandardIncludes.h"
 
 const int NSUBEXP = 10;
 

+ 52 - 0
Source/cmRuleMaker.h

@@ -0,0 +1,52 @@
+#ifndef cmRuleMaker_h
+#define cmRuleMaker_h
+#include "cmStandardIncludes.h"
+#include "cmMakefile.h"
+
+class cmRuleMaker
+{
+public:
+  cmRuleMaker()  {  m_Makefile = 0; m_Enabled = true; }
+  void SetMakefile(cmMakefile*m) {m_Makefile = m; }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args) = 0;
+  // This is called after the entire file has been parsed.
+  virtual void FinalPass() = 0;
+  // This is called to let the rule check the cache
+  virtual void LoadCache() {  }
+  
+  virtual cmRuleMaker* Clone() = 0;
+  
+  // This determines if the rule gets passed down
+  // to sub directory makefiles
+  virtual bool IsInherited() 
+    {
+      return false;
+    }
+  // This is the name used in the input file.
+  virtual const char* GetName() = 0;
+  // Return the terse documentaion for the rule
+  virtual const char* TerseDocumentaion() = 0;
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion() = 0;
+  // enable or disable this rule
+  bool GetEnabled()  { return m_Enabled; }
+  void SetEnableOn() { m_Enabled = true; }
+  void SetEnableOff() {  m_Enabled = false; }
+  const char* GetError() { return m_Error.c_str();}
+protected:
+  void SetError(const char* e)
+    {
+      m_Error = this->GetName();
+      m_Error += " ";
+      m_Error += e;
+    }
+  cmMakefile* m_Makefile;
+private:
+  bool m_Enabled;
+  std::string m_Error;
+};
+
+
+#endif

+ 39 - 0
Source/cmSourceFilesRequireRule.cxx

@@ -0,0 +1,39 @@
+#include "cmSourceFilesRequireRule.h"
+
+// cmSourceFilesRequireRule
+bool cmSourceFilesRequireRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 3 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  std::vector<std::string>::iterator i = args.begin();
+  // Search to the key word SOURCES_BEGIN is found
+  // if one of the required defines is not there, then
+  // return as none of the source files will be added
+  // if the required definition is not there.
+  while(i != args.end() && (*i) != "SOURCES_BEGIN" )
+    {
+    if(!m_Makefile->GetDefinition((*i).c_str()))
+      {
+      return true;
+      }
+    i++;
+    }
+  if(i != args.end())
+    {
+    i++;
+    }
+  
+  // Add the rest of the arguments as source files
+  for(; i != args.end(); ++i)
+    {
+    cmClassFile file;
+    file.m_AbstractClass = false;
+    file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
+    m_Makefile->AddClass(file);
+    }
+  return true;
+}
+

+ 37 - 0
Source/cmSourceFilesRequireRule.h

@@ -0,0 +1,37 @@
+#ifndef cmSourceFilesRequireRule_h
+#define cmSourceFilesRequireRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmSourceFilesRequireRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmSourceFilesRequireRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "SOURCE_FILES_REQUIRE";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add a list of source files.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "SOURCE_FILES(file1 file2 ...)";
+    }
+};
+
+
+
+#endif

+ 21 - 0
Source/cmSourceFilesRule.cxx

@@ -0,0 +1,21 @@
+#include "cmSourceFilesRule.h"
+
+// cmSourceFilesRule
+bool cmSourceFilesRule::Invoke(std::vector<std::string>& args)
+{
+ if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    cmClassFile file;
+    file.m_AbstractClass = false;
+    file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
+    m_Makefile->AddClass(file);
+    }
+  return true;
+}
+

+ 37 - 0
Source/cmSourceFilesRule.h

@@ -0,0 +1,37 @@
+#ifndef cmSourceFilesRule_h
+#define cmSourceFilesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmSourceFilesRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmSourceFilesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "SOURCE_FILES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add a list of source files.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "SOURCE_FILES(file1 file2 ...)";
+    }
+};
+
+
+
+#endif

+ 29 - 0
Source/cmStandardIncludes.h

@@ -0,0 +1,29 @@
+#ifndef cmStandardIncludes_h
+#define cmStandardIncludes_h
+
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#endif
+
+#ifndef CMAKE_NO_ANSI_STREAM_HEADERS
+#include <fstream>
+#include <iostream>
+#else
+#include <fsream.h>
+#include <iostream.h>
+#endif
+
+#include <vector>
+#include <string>
+#include <iterator>
+#include <algorithm>
+#include <functional>
+#include <map>
+
+#ifdef CMAKE_NO_STD_NAMESPACE
+#define std 
+#endif
+
+
+#endif

+ 18 - 0
Source/cmSubdirRule.cxx

@@ -0,0 +1,18 @@
+#include "cmSubdirRule.h"
+
+// cmSubdirRule
+bool cmSubdirRule::Invoke(std::vector<std::string>& args)
+{
+ if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddSubDirectory((*i).c_str());
+    }
+  return true;
+}
+

+ 40 - 0
Source/cmSubdirRule.h

@@ -0,0 +1,40 @@
+#ifndef cmSubdirRule_h
+#define cmSubdirRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmSubdirRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmSubdirRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "SUBDIRS";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add a list of subdirectories to the build.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Add a list of subdirectories to the build.\n"
+        "SUBDIRS(dir1 dir2 ...)\n"
+        "This will cause any CMakeLists.txt files in the sub directories\n"
+        "to be parsed by cmake.";
+    }
+};
+
+
+
+#endif

+ 156 - 71
Source/cmSystemTools.cxx

@@ -3,7 +3,7 @@
 #include <sys/stat.h>
 #include "cmRegularExpression.h"
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__BORLANDC__)
 #include <windows.h>
 #include <direct.h>
 inline int Mkdir(const char* dir)
@@ -20,39 +20,6 @@ inline int Mkdir(const char* dir)
 }
 #endif
 
-// remove extra spaces and the "\" character from the name
-// of the class as it is in the CMakeLists.txt
-std::string cmSystemTools::CleanUpName(const char* name)
-{
-  std::string className = name;
-  size_t i =0;
-  while(className[i] == ' ' || className[i] == '\t')
-    {
-    i++;
-    }
-  if(i)
-    {
-    className = className.substr(i, className.size());
-    } 
-  size_t pos = className.find('\\');
-  if(pos != std::string::npos)
-    {
-    className = className.substr(0, pos);
-    }
-  
-  pos = className.find(' ');
-  if(pos != std::string::npos)
-    {
-    className = className.substr(0, pos);
-    }
-  pos = className.find('\t');
-  if(pos != std::string::npos)
-    {
-    className = className.substr(0, pos);
-    }
-  return className;
-}
-
 
 bool cmSystemTools::MakeDirectory(const char* path)
 {
@@ -121,29 +88,6 @@ bool cmSystemTools::FileExists(const char* filename)
   }
 }
 
-// Read a list from a CMakeLists.txt file open stream.
-// assume the stream has just read "VAR = \"
-// read until there is not a "\" at the end of the line.
-void cmSystemTools::ReadList(std::vector<std::string>& stringList, 
-                             std::ifstream& fin)
-{
-  char inbuffer[2048];
-  bool done = false;
-  while ( !done )
-    {
-    fin.getline(inbuffer, sizeof(inbuffer) );
-    std::string inname = inbuffer;
-    if(inname.find('\\') == std::string::npos)
-      {
-      done = true;
-      }
-    if(inname.size())
-      {
-      stringList.push_back(cmSystemTools::CleanUpName(inname.c_str()));
-      }
-    }
-}
-
 
 // convert windows slashes to unix slashes \ with /
 void cmSystemTools::ConvertToUnixSlashes(std::string& path)
@@ -179,26 +123,167 @@ int cmSystemTools::Grep(const char* dir, const char* file, const char* expressio
   return count;
 }
 
-std::string cmSystemTools::ExtractVariable(const char* variable,
-                                           const char* l)
+  
+void cmSystemTools::ConvertCygwinPath(std::string& pathname)
+{
+  if(pathname.find("/cygdrive/") != std::string::npos)
+    {
+    std::string cygStuff = pathname.substr(0, 11);
+    std::string replace;
+    replace += cygStuff.at(10);
+    replace += ":";
+    cmSystemTools::ReplaceString(pathname, cygStuff.c_str(), replace.c_str());
+    }
+}
+
+
+bool cmSystemTools::ParseFunction(std::ifstream& fin,
+                                  std::string& name,
+                                  std::vector<std::string>& arguments)
+{
+  name = "";
+  arguments = std::vector<std::string>();
+  const int BUFFER_SIZE = 4096;
+  char inbuffer[BUFFER_SIZE];
+  if(!fin)
+    {
+    return false;
+    }
+  
+  if(fin.getline(inbuffer, BUFFER_SIZE ) )
+    {
+    cmRegularExpression blankLine("^$");
+    cmRegularExpression comment("^#.*");
+    cmRegularExpression oneLiner("[ \t]*([A-Za-z_0-9]*).*\\((.*)\\)");
+    cmRegularExpression multiLine("[ \t]*([A-Za-z_0-9]*).*\\((.*)");
+    cmRegularExpression lastLine("(.*)\\)");
+
+    // BEGIN VERBATIM JUNK SHOULD BE REMOVED
+    cmRegularExpression verbatim("BEGIN MAKE VERBATIM");
+    if(verbatim.find(inbuffer))
+      {
+      cmRegularExpression endVerbatim("END MAKE VERBATIM");
+      name = "VERBATIM";
+      bool done = false;
+      while(!done)
+        {
+        if(fin.getline(inbuffer, BUFFER_SIZE))
+          {
+          if(endVerbatim.find(inbuffer))
+            {
+            done = true;
+            }
+          else
+            {
+            arguments.push_back(inbuffer);
+            }
+          }
+        else
+          {
+          done = true;
+          }
+        }
+      return true;
+      }
+    // END VERBATIM JUNK SHOULD BE REMOVED
+
+    // check for black line or comment
+    if(blankLine.find(inbuffer) || comment.find(inbuffer))
+      {
+      return false;
+      }
+    // look for a oneline fun(arg arg2) 
+    else if(oneLiner.find(inbuffer))
+      {
+      // the arguments are the second match
+      std::string args = oneLiner.match(2);
+      name = oneLiner.match(1);
+      // break up the arguments
+      cmSystemTools::GetArguments(args, arguments);
+      return true;
+      }
+    // look for a start of a multiline with no trailing ")"  fun(arg arg2 
+    else if(multiLine.find(inbuffer))
+      {
+      name = multiLine.match(1);
+      std::string args = multiLine.match(2);
+      cmSystemTools::GetArguments(args, arguments);
+      // Read lines until the closing paren is hit
+      bool done = false;
+      while(!done)
+        {
+        // read lines until the end paren is found
+        if(fin.getline(inbuffer, BUFFER_SIZE ) )
+          {
+          if(lastLine.find(inbuffer))
+            {
+            done = true;
+            std::string args = lastLine.match(1);
+            cmSystemTools::GetArguments(args, arguments);
+            }
+          else
+            {
+            std::string line = inbuffer;
+            cmSystemTools::GetArguments(line, arguments);
+            }
+          }
+        }
+      return true;
+      }
+    else
+      {
+      cmSystemTools::Error("Parse error in read function ", inbuffer);
+      return false;
+      }
+    }
+  return false;
+
+}
+
+void cmSystemTools::GetArguments(std::string& line,
+                                 std::vector<std::string>& arguments)
 {
-  std::string line = l;
-  size_t varstart = line.find(variable);
-  size_t start = line.find("=");
-  if(start != std::string::npos && start > varstart )
+  cmRegularExpression argument("[\t ]*([-/\\\\{}\\$A-Za-z_0-9]+)[\t ]*");
+  cmRegularExpression argumentWithSpaces("[\t ]*\"([- /\\\\{}\\$A-Za-z_0-9]+)\"[\t ]*");
+  std::string arg(" ");
+  while(arg.length() )
     {
-    start++;
-    while(line[start] == ' ' && start < line.size())
+    arg = "";
+    long endpos;
+
+    if (argumentWithSpaces.find(line.c_str()))
+      {
+      arg = argumentWithSpaces.match(1);
+      endpos = argumentWithSpaces.end(1);
+      }
+    else if(argument.find(line.c_str()))
       {
-      start++;
+      arg = argument.match(1);
+      endpos = argument.end(1);
       }
-    size_t end = line.size()-1;
-    while(line[end] == ' ' && end > start)
+    if(arg.length())
       {
-      end--;
+      arguments.push_back(arg);
+      line = line.substr(endpos, line.length() - endpos);
       }
-    return line.substr(start, end).c_str();
     }
-  return std::string("");
 }
 
+void cmSystemTools::Error(const char* m1, const char* m2)
+{
+  std::string message = "CMake Error: ";
+  if(m1)
+    {
+    message += m1;
+    }
+  if(m2)
+    {
+    message += m2;
+    }
+#ifdef _WIN32
+//  MessageBox(0, message.c_str(), 0, MB_OK);
+  std::cerr << message.c_str() << std::endl;
+#else
+  std::cerr << message.c_str() << std::endl;
+#endif
+}

+ 22 - 21
Source/cmSystemTools.h

@@ -18,13 +18,8 @@
  */
 #ifndef cmSystemTools_h
 #define cmSystemTools_h
-#ifdef _MSC_VER
-#pragma warning ( disable : 4786 )
-#endif
 
-#include <string>
-#include <vector>
-#include <fstream>
+#include "cmStandardIncludes.h"
 
 class cmSystemTools
 {
@@ -42,10 +37,6 @@ public:
   static void ReplaceString(std::string& source,
                             const char* replace,
                             const char* with);
-  /**
-   *  Remove extra spaces and the trailing \ from a string.
-   */
-  static std::string CleanUpName(const char* name);
   /**
    * Replace windows slashes with unix style slashes
    */
@@ -61,20 +52,30 @@ public:
   static int Grep(const char* dir, const char* file, const char* expression);
   
   /**
-   * Extract the right hand side of an asignment varibale = value
+   * remove /cygdrive/d and replace with d:/
    */
-  static std::string ExtractVariable(const char* varible,
-                                     const char* line);
-  
+  static void ConvertCygwinPath(std::string& pathname);
+
   /**
-   * Read a list from a file into the array of strings.
-   * This function assumes that the first line of the
-   * list has been read.  For example: NAME = \ was already
-   * read in.   The reading stops when there are no more
-   * continuation characters.
+   * Read a cmake function from an input file.  This
+   * returns the name of the function and a list of its 
+   * arguments.
    */
-  static void ReadList(std::vector<std::string>& stringList, 
-                       std::ifstream& fin);
+  static bool ParseFunction(std::ifstream&, 
+                            std::string& name,
+                            std::vector<std::string>& arguments);
+  /**
+   *  Extract space separated arguments from a string.
+   *  Double quoted strings are accepted with spaces.
+   *  This is called by ParseFunction.
+   */
+  static void GetArguments(std::string& line,
+                           std::vector<std::string>& arguments);
+  /**
+   * Display an error message.
+   */
+  static void Error(const char* m, const char* m2=0 );
+  
 };
 
 

+ 20 - 0
Source/cmTestsRule.cxx

@@ -0,0 +1,20 @@
+#include "cmTestsRule.h"
+
+// cmExecutableRule
+bool cmTestsRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    cmClassFile file;
+    file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
+    m_Makefile->AddExecutable(file);
+    }
+  return true;
+}
+

+ 37 - 0
Source/cmTestsRule.h

@@ -0,0 +1,37 @@
+#ifndef cmTestsRule_h
+#define cmTestsRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmTestsRule : public cmRuleMaker
+{
+public:
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmTestsRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "TESTS";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add a list of executables files that are run as tests.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "TESTS(file1 file2 ...)";
+    }
+};
+
+
+
+#endif

+ 25 - 0
Source/cmUnixDefinesRule.cxx

@@ -0,0 +1,25 @@
+#include "cmUnixDefinesRule.h"
+
+cmUnixDefinesRule::cmUnixDefinesRule()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  this->SetEnableOff();
+#endif
+}
+
+// cmUNIXDefinesRule
+bool cmUnixDefinesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("Win32Defines called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddDefineFlag((*i).c_str());
+    }
+  return true;
+}
+

+ 40 - 0
Source/cmUnixDefinesRule.h

@@ -0,0 +1,40 @@
+#ifndef cmUnixDefinesRule_h
+#define cmUnixDefinesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmUnixDefinesRule : public cmRuleMaker
+{
+public:
+  cmUnixDefinesRule();
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmUnixDefinesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "UNIX_DEFINES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add -D flags to the command line for unix only.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Add -D flags to the command line for unix only.\n"
+        "UNIX_DEFINES(-DFOO -DBAR);";
+    }
+};
+
+
+
+#endif

+ 25 - 0
Source/cmUnixLibrariesRule.cxx

@@ -0,0 +1,25 @@
+#include "cmUnixLibrariesRule.h"
+
+cmUnixLibrariesRule::cmUnixLibrariesRule()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  this->SetEnableOff();
+#endif
+}
+
+// cmUnixLibrariesRule
+bool cmUnixLibrariesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddLinkLibrary((*i).c_str());
+    }
+  return true;
+}
+

+ 39 - 0
Source/cmUnixLibrariesRule.h

@@ -0,0 +1,39 @@
+#ifndef cmUnixLibrariesRule_h
+#define cmUnixLibrariesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmUnixLibrariesRule : public cmRuleMaker
+{
+public:
+  cmUnixLibrariesRule();
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmUnixLibrariesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "UNIX_LIBRARIES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add libraries that are only used for unix programs.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "UNIX_LIBRARIES(library -lm ...);";
+    }
+};
+
+
+
+#endif

+ 88 - 60
Source/cmUnixMakefile.cxx → Source/cmUnixMakefileGenerator.cxx

@@ -1,25 +1,37 @@
-#include "cmUnixMakefile.h"
+#include "cmUnixMakefileGenerator.h"
+#include "cmMakefile.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include <fstream>
-#include <iostream>
+#include "cmClassFile.h"
+#include "cmMakeDepend.h"
+
+void cmUnixMakefileGenerator::GenerateMakefile()
+{
+  cmMakeDepend md;
+  md.SetMakefile(m_Makefile);
+  md.DoDepends();
+  this->OutputMakefile("CMakeTargets.make"); 
+}
+
 
 // Output the depend information for all the classes 
 // in the makefile.  These would have been generated
-// by the class cmMakeDepend in the main of CMakeBuildTargets.
-void cmUnixMakefile::OutputDepends(std::ostream& fout)
+// by the class cmMakeDepend GenerateMakefile
+void cmUnixMakefileGenerator::OutputDepends(std::ostream& fout)
 {
-  for(int i = 0; i < m_Classes.size(); i++)
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  for(unsigned int i = 0; i < Classes.size(); i++)
     {
-    if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+    if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
       {
-      if( m_Classes[i].m_Depends.size())
+      if( Classes[i].m_Depends.size())
 	{
-	fout << m_Classes[i].m_ClassName << ".o : \\\n";
+	fout << Classes[i].m_ClassName << ".o : \\\n";
 	for(std::vector<std::string>::iterator j =  
-	      m_Classes[i].m_Depends.begin();
-	    j != m_Classes[i].m_Depends.end(); ++j)
+	      Classes[i].m_Depends.begin();
+	    j != Classes[i].m_Depends.end(); ++j)
 	  {
-	  if(j+1 == m_Classes[i].m_Depends.end())
+	  if(j+1 == Classes[i].m_Depends.end())
 	    {
 	    fout << *j << " \n";
 	    }
@@ -63,15 +75,16 @@ inline std::string FixDirectoryName(const char* dir)
 // 4. Rules to build in sub directories
 // 5. The name of the library being built, if it is a library
 
-void cmUnixMakefile::OutputMakefile(const char* file)
+void cmUnixMakefileGenerator::OutputMakefile(const char* file)
 {
-  if( m_TemplateDirectories.size() )
+  std::vector<std::string>& auxSourceDirs = m_Makefile->GetAuxSourceDirectories();
+  if( auxSourceDirs.size() )
     {
     // For the case when this is running as a remote build
     // on unix, make the directory
     
-    for(std::vector<std::string>::iterator i = m_TemplateDirectories.begin();
-        i != m_TemplateDirectories.end(); ++i)
+    for(std::vector<std::string>::iterator i = auxSourceDirs.begin();
+        i != auxSourceDirs.end(); ++i)
       {
       cmSystemTools::MakeDirectory(i->c_str());
       }
@@ -80,12 +93,12 @@ void cmUnixMakefile::OutputMakefile(const char* file)
   std::ofstream fout(file);
   if(!fout)
     {
-    std::cerr  << "Error can not open " << file << " for write" << std::endl;
+    cmSystemTools::Error("Error can not open for write: ", file);
     return;
     }
   // Output Include paths
   fout << "INCLUDE_FLAGS = ";
-  std::vector<std::string>& includes = m_BuildFlags.GetIncludeDirectories();
+  std::vector<std::string>& includes = m_Makefile->GetIncludeDirectories();
   std::vector<std::string>::iterator i;
   for(i = includes.begin(); i != includes.end(); ++i)
     {
@@ -96,22 +109,23 @@ void cmUnixMakefile::OutputMakefile(const char* file)
   fout << "\n";
   // see if there are files to compile in this makefile
   // These are used for both libraries and executables
-  if(m_Classes.size() )
+  std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
+  if(Classes.size() )
     {
     // Ouput Library name if there are SRC_OBJS
-    if(strlen(this->GetLibraryName()) > 0)
+    if(strlen(m_Makefile->GetLibraryName()) > 0)
       {
-      fout << "LIBRARY = " <<  this->GetLibraryName() << "\n\n";
+      fout << "LIBRARY = " <<  m_Makefile->GetLibraryName() << "\n\n";
       fout << "BUILD_LIB_FILE = lib${LIBRARY}${CMAKE_LIB_EXT}\n\n";
       }
     // Output SRC_OBJ list for all the classes to be compiled
     fout << "SRC_OBJ = \\\n";
-    for(int i = 0; i < m_Classes.size(); i++)
+    for(unsigned int i = 0; i < Classes.size(); i++)
       {
-      if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+      if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
 	{
-	fout << m_Classes[i].m_ClassName << ".o ";
-	if(i ==  m_Classes.size() -1)
+	fout << Classes[i].m_ClassName << ".o ";
+	if(i ==  Classes.size() -1)
 	  {
 	  fout << "\n\n";
 	  }
@@ -123,34 +137,43 @@ void cmUnixMakefile::OutputMakefile(const char* file)
       }
     fout << "\n";
     }
+  std::vector<std::string>& MakeVerbatim = m_Makefile->GetMakeVerbatim();
   // Ouput user make text embeded in the input file
-  for(int i =0; i < m_MakeVerbatim.size(); i++)
+  for(unsigned int i =0; i < MakeVerbatim.size(); i++)
     {
-    fout << m_MakeVerbatim[i] << "\n";
+    fout << MakeVerbatim[i] << "\n";
     }
   fout << "\n\n";
 
   // Output rules for building executables  
-  if( m_Executables )
+  if( m_Makefile->HasExecutables() )
     {
     // collect all the flags needed for linking libraries
     std::string linkLibs;        
     std::vector<std::string>::iterator j;
-    std::vector<std::string>& libdirs = m_BuildFlags.GetLinkDirectories();
+    std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
     for(j = libdirs.begin(); j != libdirs.end(); ++j)
-      {
-      linkLibs += "-L";
+      { 
+      if((*j).find("-L") == std::string::npos 
+         && (*j).find("${") == std::string::npos)
+        {
+        linkLibs += "-L";
+        }
       linkLibs += *j;
       linkLibs += " ";
       }
-    std::vector<std::string>& libs = m_BuildFlags.GetLinkLibraries();
+    std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
     for(j = libs.begin(); j != libs.end(); ++j)
       {
-      linkLibs += "-l";
+      if((*j).find("-l") == std::string::npos 
+         && (*j).find("${") == std::string::npos)
+        {
+        linkLibs += "-l";
+        }
       linkLibs += *j;
       linkLibs += " ";
       }
-    std::vector<std::string>& libsUnix = m_BuildFlags.GetLinkLibrariesUnix();
+    std::vector<std::string>& libsUnix = m_Makefile->GetLinkLibrariesUnix();
     for(j = libsUnix.begin(); j != libsUnix.end(); ++j)
       {
       linkLibs += *j;
@@ -163,16 +186,15 @@ void cmUnixMakefile::OutputMakefile(const char* file)
     fout << "CMAKE_DEPEND_LIBS = ";
     this->OutputDependLibraries(fout);
     // Now create rules for all of the executables to be built
-    for(int i = 0; i < m_Classes.size(); i++)
+    for(unsigned int i = 0; i < Classes.size(); i++)
       {
-      if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+      if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
 	{ 
-        std::string DotO = m_Classes[i].m_ClassName;
+        std::string DotO = Classes[i].m_ClassName;
         DotO += ".o";
-        
-        fout << m_Classes[i].m_ClassName << ": " << DotO << " ";
+        fout << Classes[i].m_ClassName << ": " << DotO << " ";
         fout << "${CMAKE_DEPEND_LIBS}\n";
-	fout << "\t${CXX}  ${CXX_FLAGS}  " 
+	fout << "\t${CXX}  ${CXX_FLAGS}  " << m_Makefile->GetDefineFlags()
 	     << DotO.c_str() << " "
              << linkLibs.c_str() 
 	     << " -o $@ ""\n\n";
@@ -180,12 +202,12 @@ void cmUnixMakefile::OutputMakefile(const char* file)
       }
     // ouput the list of executables
     fout << "EXECUTABLES = \\\n";
-    for(int i = 0; i < m_Classes.size(); i++)
+    for(unsigned int i = 0; i < Classes.size(); i++)
       {
-      if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
+      if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
 	{ 
-        fout << m_Classes[i].m_ClassName;
-	if(i < m_Classes.size()-1)
+        fout << Classes[i].m_ClassName;
+	if(i < Classes.size()-1)
 	  {
 	    fout << " \\";
 	  }
@@ -195,15 +217,18 @@ void cmUnixMakefile::OutputMakefile(const char* file)
     fout << "\n";
     }
   // Output Sub directory build rules
-  if( m_SubDirectories.size() )
+  const std::vector<std::string>& SubDirectories
+    = m_Makefile->GetSubDirectories();
+    
+  if( SubDirectories.size() )
     {
     fout << "SUBDIR_BUILD = \\\n";
-    int i;
-    for(i =0; i < m_SubDirectories.size(); i++)
+    unsigned int i;
+    for(i =0; i < SubDirectories.size(); i++)
       { 
-      std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
+      std::string subdir = FixDirectoryName(SubDirectories[i].c_str());
       fout << "build_" << subdir.c_str();
-      if(i == m_SubDirectories.size()-1)
+      if(i == SubDirectories.size()-1)
 	{
 	fout << " \n\n";
 	}
@@ -214,11 +239,11 @@ void cmUnixMakefile::OutputMakefile(const char* file)
       }
     fout << std::endl;
     fout << "SUBDIR_CLEAN = \\\n";
-    for(i =0; i < m_SubDirectories.size(); i++)
+    for(i =0; i < SubDirectories.size(); i++)
       { 
-      std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
+      std::string subdir = FixDirectoryName(SubDirectories[i].c_str());
       fout << "clean_" << subdir.c_str();
-      if(i == m_SubDirectories.size()-1)
+      if(i == SubDirectories.size()-1)
 	{
 	fout << " \n\n";
 	}
@@ -230,27 +255,30 @@ void cmUnixMakefile::OutputMakefile(const char* file)
     fout << std::endl;
     fout << "alldirs : ${SUBDIR_BUILD}\n\n";
 
-    for(i =0; i < m_SubDirectories.size(); i++)
+    for(i =0; i < SubDirectories.size(); i++)
       {
-      std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
+      std::string subdir = FixDirectoryName(SubDirectories[i].c_str());
       fout << "build_" << subdir.c_str() << ":\n";
-      fout << "\tcd " << m_SubDirectories[i].c_str()
+      fout << "\tcd " << SubDirectories[i].c_str()
 	   << "; ${MAKE} -${MAKEFLAGS} CMakeTargets.make\n";
-      fout << "\tcd " << m_SubDirectories[i].c_str()
+      fout << "\tcd " << SubDirectories[i].c_str()
 	   << "; ${MAKE} -${MAKEFLAGS} all\n\n";
 
       fout << "clean_" << subdir.c_str() << ": \n";
-      fout << "\tcd " << m_SubDirectories[i].c_str() 
+      fout << "\tcd " << SubDirectories[i].c_str() 
 	   << "; ${MAKE} -${MAKEFLAGS} clean\n\n";
       }
     }
   this->OutputDepends(fout);
 }
 
-void cmUnixMakefile::OutputDependLibraries(std::ostream& fout)
+
+// output the list of libraries that the executables 
+// in this makefile will depend on.
+void cmUnixMakefileGenerator::OutputDependLibraries(std::ostream& fout)
 {
-  std::vector<std::string>& libs = m_BuildFlags.GetLinkLibraries();
-  std::vector<std::string>& libdirs = m_BuildFlags.GetLinkDirectories();
+  std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
+  std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
   std::vector<std::string>::iterator dir, lib, endlibs, enddirs;
   for(lib = libs.begin(); lib != libs.end(); ++lib)
     {

+ 7 - 6
Source/cmUnixMakefile.h → Source/cmUnixMakefileGenerator.h

@@ -17,21 +17,22 @@
  * itkUnixMakefile is used generate unix makefiles.
  */
 
-#ifndef cmUnixMakefile_h
-#define cmUnixMakefile_h
+#ifndef cmUnixMakefileGenerator_h
+#define cmUnixMakefileGenerator_h
 #include "cmMakefile.h"
+#include "cmMakefileGenerator.h"
 
-
-class cmUnixMakefile : public cmMakefile
+class cmUnixMakefileGenerator : public cmMakefileGenerator
 {
 public:
   /** 
    * Write the makefile to the named file
    */
-  void OutputMakefile(const char* file);
+  virtual void GenerateMakefile();
+  void OutputDepends(std::ostream&);
 protected:
+  void OutputMakefile(const char* file);
   void OutputDependLibraries(std::ostream&);
-  void OutputDepends(std::ostream&);
 };
 
 #endif

+ 28 - 0
Source/cmWin32DefinesRule.cxx

@@ -0,0 +1,28 @@
+#include "cmWin32DefinesRule.h"
+
+
+
+cmWin32DefinesRule::cmWin32DefinesRule()
+{
+#ifndef _WIN32
+  this->SetEnableOff();
+#endif
+}
+
+
+// cmWin32DefinesRule
+bool cmWin32DefinesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddDefineFlag((*i).c_str());
+    }
+  return true;
+}
+

+ 39 - 0
Source/cmWin32DefinesRule.h

@@ -0,0 +1,39 @@
+#ifndef cmWin32DefinesRule_h
+#define cmWin32DefinesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmWin32DefinesRule : public cmRuleMaker
+{
+public:
+  cmWin32DefinesRule();
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmWin32DefinesRule;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "WIN32_DEFINES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Add -D define flags to command line for win32 environments.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Add -D define flags to command line for win32 environments.\n"
+        "WIN32_DEFINES(-DFOO -DBAR ...);";
+    }
+};
+
+
+
+#endif

+ 25 - 0
Source/cmWin32LibrariesRule.cxx

@@ -0,0 +1,25 @@
+#include "cmWin32LibrariesRule.h"
+cmWin32LibrariesRule::cmWin32LibrariesRule()
+{
+#ifndef _WIN32
+  this->SetEnableOff();
+#endif
+}
+
+
+// cmWin32LibrariesRule
+bool cmWin32LibrariesRule::Invoke(std::vector<std::string>& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("Called with incorrect number of arguments");
+    return false;
+    }
+  for(std::vector<std::string>::iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->AddLinkLibrary((*i).c_str());
+    }
+  return true;
+}
+

+ 42 - 0
Source/cmWin32LibrariesRule.h

@@ -0,0 +1,42 @@
+#ifndef cmWin32LibrariesRule_h
+#define cmWin32LibrariesRule_h
+
+#include "cmStandardIncludes.h"
+#include "cmRuleMaker.h"
+
+
+class cmWin32LibrariesRule  : public cmRuleMaker
+{
+public:
+  cmWin32LibrariesRule();
+  virtual cmRuleMaker* Clone() 
+    {
+      return new cmWin32LibrariesRule ;
+    }
+  // This is called when the rule is firt encountered in
+  // the input file
+  virtual bool Invoke(std::vector<std::string>& args);
+  virtual void FinalPass() { }
+  virtual bool IsInherited() { return true;  }
+
+  // This is the name used in the input file.
+  virtual const char* GetName() { return "WIN32_LIBRARIES";}
+  virtual const char* TerseDocumentaion() 
+    {
+      return "Set a name for the library to be built. One argument.";
+    }
+  
+  // Return full documentation for the rule
+  virtual const char* FullDocumentaion()
+    {
+      return
+        "Set the name for the library in this makefile.  \n"
+        "This takes one argument.\n"
+        "LIBRARY(libraryname);\n"
+        "There can be only one library per CMakeLists.txt file.\n";
+    }
+};
+
+
+
+#endif

+ 1 - 2
Source/cmWindowsConfigure.cxx

@@ -1,9 +1,8 @@
 #include "cmWindowsConfigure.h"
+#include "cmStandardIncludes.h"
 #include "cmSystemTools.h"
-#include <fstream>
 #include <windows.h>
 
-
 bool cmWindowsConfigure::Configure(const char* file)
 {
   std::ifstream fin(file);

+ 1 - 1
Source/cmWindowsConfigure.h

@@ -21,7 +21,7 @@
  */
 #ifndef cmWindowsConfigure_h
 #define cmWindowsConfigure_h
-#include <string>
+#include "cmStandardIncludes.h"
 
 class cmWindowsConfigure
 {