Ver código fonte

ENH: Visual Studio 6 and 7 generators now set CMAKE_CONFIGURATION_TYPES to be a semicolon-separated list of configurations that will be built.

Brad King 23 anos atrás
pai
commit
4e6ad941e9

+ 2 - 2
Modules/Platform/Windows-cl.cmake

@@ -67,8 +67,8 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
    SET (CMAKE_NO_BUILD_TYPE 1)
 ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
 IF(CMAKE_GENERATOR MATCHES "Visual Studio 7")
-  SET (CMAKE_CONFIGURATION_TYPES "Debug Release MinSizeRel RelWithDebInfo" CACHE STRING 
-     "Space separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.")
+  SET (CMAKE_CONFIGURATION_TYPES "Debug;Release;MinSizeRel;RelWithDebInfo" CACHE STRING 
+     "Semicolon separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.")
   SET (CMAKE_CXX_WARNING_LEVEL "3" CACHE STRING
        "Size of stack for programs.")
   SET (CMAKE_CXX_STACK_SIZE "10000000" CACHE STRING

+ 31 - 0
Source/cmGlobalVisualStudio6Generator.cxx

@@ -30,9 +30,40 @@ void cmGlobalVisualStudio6Generator::EnableLanguage(const char* lang,
   mf->AddDefinition("CMAKE_CFG_INTDIR","$(IntDir)");
   mf->AddDefinition("CMAKE_GENERATOR_CC", "cl");
   mf->AddDefinition("CMAKE_GENERATOR_CXX", "cl");
+  this->GenerateConfigurations(mf);
   this->cmGlobalGenerator::EnableLanguage(lang, mf);
 }
 
+void cmGlobalVisualStudio6Generator::GenerateConfigurations(cmMakefile* mf)
+{
+  std::string fname= mf->GetDefinition("CMAKE_ROOT");
+  const char* def= mf->GetDefinition( "MSPROJECT_TEMPLATE_DIRECTORY");
+  if(def)
+    {
+    fname = def;
+    }
+  else
+    {
+    fname += "/Templates";
+    }
+  fname += "/CMakeVisualStudio6Configurations.cmake";
+  if(!mf->ReadListFile(mf->GetCurrentListFile(), fname.c_str()))
+    {
+    cmSystemTools::Error("Cannot open ", fname.c_str(),
+                         ".  Please copy this file from the main "
+                         "CMake/Templates directory and edit it for "
+                         "your build configurations.");
+    }
+  else if(!mf->GetDefinition("CMAKE_CONFIGURATION_TYPES"))
+    {
+    cmSystemTools::Error("CMAKE_CONFIGURATION_TYPES not set by ",
+                         fname.c_str(),
+                         ".  Please copy this file from the main "
+                         "CMake/Templates directory and edit it for "
+                         "your build configurations.");
+    }
+}
+
 int cmGlobalVisualStudio6Generator::TryCompile(const char *, 
                                                const char *bindir, 
                                                const char *projectName,

+ 1 - 0
Source/cmGlobalVisualStudio6Generator.h

@@ -66,6 +66,7 @@ public:
   virtual void OutputDSWFile();
 
 private:
+  void GenerateConfigurations(cmMakefile* mf);
   void SetupTests();
   void WriteDSWFile(std::ostream& fout);
   void WriteDSWHeader(std::ostream& fout);

+ 21 - 9
Source/cmGlobalVisualStudio7Generator.cxx

@@ -33,11 +33,12 @@ void cmGlobalVisualStudio7Generator::EnableLanguage(const char* lang,
   mf->AddDefinition("CMAKE_CFG_INTDIR","$(IntDir)");
   mf->AddDefinition("CMAKE_GENERATOR_CC", "cl");
   mf->AddDefinition("CMAKE_GENERATOR_CXX", "cl");
+  
+  // Create list of configurations requested by user's cache, if any.
+  this->GenerateConfigurations(mf);
   this->cmGlobalGenerator::EnableLanguage(lang, mf);
 }
 
-
-
 int cmGlobalVisualStudio7Generator::TryCompile(const char *, 
                                                const char *bindir, 
                                                const char *projectName,
@@ -150,7 +151,7 @@ void cmGlobalVisualStudio7Generator::SetupTests()
     }
 }
 
-void cmGlobalVisualStudio7Generator::GenerateConfigurations()
+void cmGlobalVisualStudio7Generator::GenerateConfigurations(cmMakefile* mf)
 {
   // process the configurations
   const char* ct 
@@ -163,7 +164,7 @@ void cmGlobalVisualStudio7Generator::GenerateConfigurations()
     std::string::size_type endpos = 0;
     while(endpos != std::string::npos)
       {
-      endpos = configTypes.find(' ', start);
+      endpos = configTypes.find_first_of(" ;", start);
       std::string config;
       std::string::size_type len;
       if(endpos != std::string::npos)
@@ -200,13 +201,26 @@ void cmGlobalVisualStudio7Generator::GenerateConfigurations()
     m_Configurations.push_back("Debug");
     m_Configurations.push_back("Release");
     }
+  
+  // Reset the entry to have a semi-colon separated list.
+  std::string configs = m_Configurations[0];
+  for(unsigned int i=1; i < m_Configurations.size(); ++i)
+    {
+    configs += ";";
+    configs += m_Configurations[i];
+    }
+  
+  mf->AddCacheDefinition(
+    "CMAKE_CONFIGURATION_TYPES",
+    configs.c_str(),
+    "Semicolon separated list of supported configuration types, "
+    "only supports Debug, Release, MinSizeRel, and RelWithDebInfo, "
+    "anything else will be ignored.",
+    cmCacheManager::STRING);
 }
 
 void cmGlobalVisualStudio7Generator::Generate()
 {
-  // Generate the possible configuraitons
-  this->GenerateConfigurations();
-  
   // add a special target that depends on ALL projects for easy build
   // of Debug only
   m_LocalGenerators[0]->GetMakefile()->
@@ -580,8 +594,6 @@ std::string cmGlobalVisualStudio7Generator::CreateGUID(const char* name)
 
 void cmGlobalVisualStudio7Generator::LocalGenerate()
 {
-  // load the possible configuraitons
-  this->GenerateConfigurations();
   this->cmGlobalGenerator::LocalGenerate();
 }
 

+ 1 - 1
Source/cmGlobalVisualStudio7Generator.h

@@ -78,7 +78,7 @@ public:
       
 private:
   void SetupTests();
-  void GenerateConfigurations();
+  void GenerateConfigurations(cmMakefile* mf);
   void WriteSLNFile(std::ostream& fout);
   void WriteSLNHeader(std::ostream& fout);
   void WriteProject(std::ostream& fout, 

+ 3 - 0
Templates/CMakeVisualStudio6Configurations.cmake

@@ -0,0 +1,3 @@
+# When the dll templates are changed, this list should be 
+# updated with the list of possible configurations.
+SET(CMAKE_CONFIGURATION_TYPES Debug Release MinSizeRel RelWithDebInfo)