浏览代码

Merge branch 'cmake-server-fix-16423' into release

Brad King 9 年之前
父节点
当前提交
afb4a224be
共有 2 个文件被更改,包括 77 次插入28 次删除
  1. 53 28
      Source/cmServerProtocol.cxx
  2. 24 0
      Source/cmServerProtocol.h

+ 53 - 28
Source/cmServerProtocol.cxx

@@ -381,25 +381,9 @@ bool cmServerProtocol1_0::DoActivate(const cmServerRequest& request,
     return false;
   }
 
-  const std::string fullGeneratorName =
-    cmExternalMakefileProjectGenerator::CreateFullGeneratorName(
-      generator, extraGenerator);
-
-  cm->SetGeneratorToolset(toolset);
-  cm->SetGeneratorPlatform(platform);
-
-  cmGlobalGenerator* gg = cm->CreateGlobalGenerator(fullGeneratorName);
-  if (!gg) {
-    setErrorMessage(
-      errorMessage,
-      std::string("Could not set up the requested combination of \"") +
-        kGENERATOR_KEY + "\" and \"" + kEXTRA_GENERATOR_KEY + "\"");
-    return false;
-  }
-
-  cm->SetGlobalGenerator(gg);
-  cm->SetHomeDirectory(sourceDirectory);
-  cm->SetHomeOutputDirectory(buildDirectory);
+  this->GeneratorInfo =
+    GeneratorInformation(generator, extraGenerator, toolset, platform,
+                         sourceDirectory, buildDirectory);
 
   this->m_State = STATE_ACTIVE;
   return true;
@@ -931,6 +915,13 @@ cmServerResponse cmServerProtocol1_0::ProcessConfigure(
 
   FileMonitor()->StopMonitoring();
 
+  std::string errorMessage;
+  cmake* cm = this->CMakeInstance();
+  this->GeneratorInfo.SetupGenerator(cm, &errorMessage);
+  if (!errorMessage.empty()) {
+    return request.ReportError(errorMessage);
+  }
+
   // Make sure the types of cacheArguments matches (if given):
   std::vector<std::string> cacheArgs;
   bool cacheArgumentsError = false;
@@ -955,15 +946,13 @@ cmServerResponse cmServerProtocol1_0::ProcessConfigure(
       "cacheArguments must be unset, a string or an array of strings.");
   }
 
-  cmake* cm = this->CMakeInstance();
   std::string sourceDir = cm->GetHomeDirectory();
   const std::string buildDir = cm->GetHomeOutputDirectory();
 
   cmGlobalGenerator* gg = cm->GetGlobalGenerator();
 
   if (buildDir.empty()) {
-    return request.ReportError(
-      "No build directory set via setGlobalSettings.");
+    return request.ReportError("No build directory set via Handshake.");
   }
 
   if (cm->LoadCache(buildDir)) {
@@ -1038,14 +1027,12 @@ cmServerResponse cmServerProtocol1_0::ProcessGlobalSettings(
   obj[kWARN_UNUSED_CLI_KEY] = cm->GetWarnUnusedCli();
   obj[kCHECK_SYSTEM_VARS_KEY] = cm->GetCheckSystemVars();
 
-  obj[kSOURCE_DIRECTORY_KEY] = cm->GetHomeDirectory();
-  obj[kBUILD_DIRECTORY_KEY] = cm->GetHomeOutputDirectory();
+  obj[kSOURCE_DIRECTORY_KEY] = this->GeneratorInfo.SourceDirectory;
+  obj[kBUILD_DIRECTORY_KEY] = this->GeneratorInfo.BuildDirectory;
 
   // Currently used generator:
-  cmGlobalGenerator* gen = cm->GetGlobalGenerator();
-  obj[kGENERATOR_KEY] = gen ? gen->GetName() : std::string();
-  obj[kEXTRA_GENERATOR_KEY] =
-    gen ? gen->GetExtraGeneratorName() : std::string();
+  obj[kGENERATOR_KEY] = this->GeneratorInfo.GeneratorName;
+  obj[kEXTRA_GENERATOR_KEY] = this->GeneratorInfo.ExtraGeneratorName;
 
   return request.Reply(obj);
 }
@@ -1109,3 +1096,41 @@ cmServerResponse cmServerProtocol1_0::ProcessFileSystemWatchers(
 
   return request.Reply(result);
 }
+
+cmServerProtocol1_0::GeneratorInformation::GeneratorInformation(
+  const std::string& generatorName, const std::string& extraGeneratorName,
+  const std::string& toolset, const std::string& platform,
+  const std::string& sourceDirectory, const std::string& buildDirectory)
+  : GeneratorName(generatorName)
+  , ExtraGeneratorName(extraGeneratorName)
+  , Toolset(toolset)
+  , Platform(platform)
+  , SourceDirectory(sourceDirectory)
+  , BuildDirectory(buildDirectory)
+{
+}
+
+void cmServerProtocol1_0::GeneratorInformation::SetupGenerator(
+  cmake* cm, std::string* errorMessage)
+{
+  const std::string fullGeneratorName =
+    cmExternalMakefileProjectGenerator::CreateFullGeneratorName(
+      GeneratorName, ExtraGeneratorName);
+
+  cm->SetHomeDirectory(SourceDirectory);
+  cm->SetHomeOutputDirectory(BuildDirectory);
+
+  cmGlobalGenerator* gg = cm->CreateGlobalGenerator(fullGeneratorName);
+  if (!gg) {
+    setErrorMessage(
+      errorMessage,
+      std::string("Could not set up the requested combination of \"") +
+        kGENERATOR_KEY + "\" and \"" + kEXTRA_GENERATOR_KEY + "\"");
+    return;
+  }
+
+  cm->SetGlobalGenerator(gg);
+
+  cm->SetGeneratorToolset(Toolset);
+  cm->SetGeneratorPlatform(Platform);
+}

+ 24 - 0
Source/cmServerProtocol.h

@@ -131,4 +131,28 @@ private:
   State m_State = STATE_INACTIVE;
 
   bool m_isDirty = false;
+
+  struct GeneratorInformation
+  {
+  public:
+    GeneratorInformation() = default;
+    GeneratorInformation(const std::string& generatorName,
+                         const std::string& extraGeneratorName,
+                         const std::string& toolset,
+                         const std::string& platform,
+                         const std::string& sourceDirectory,
+                         const std::string& buildDirectory);
+
+    void SetupGenerator(cmake* cm, std::string* errorMessage);
+
+    std::string GeneratorName;
+    std::string ExtraGeneratorName;
+    std::string Toolset;
+    std::string Platform;
+
+    std::string SourceDirectory;
+    std::string BuildDirectory;
+  };
+
+  GeneratorInformation GeneratorInfo;
 };