Explorar o código

Generator: Don't allow Ninja Multi-Config variables on other generators

We may want to enable these variables later on with specific
semantics. To avoid breaking backwards compatibility, make it an
error to use them for now.
Kyle Edwards %!s(int64=5) %!d(string=hai) anos
pai
achega
9590c3a400

+ 35 - 0
Source/cmGlobalGenerator.cxx

@@ -1361,8 +1361,43 @@ void cmGlobalGenerator::ComputeBuildFileGenerators()
   }
   }
 }
 }
 
 
+bool cmGlobalGenerator::UnsupportedVariableIsDefined(const std::string& name,
+                                                     bool supported) const
+{
+  if (!supported && this->Makefiles.front()->GetDefinition(name)) {
+    std::ostringstream e;
+    /* clang-format off */
+    e <<
+      "Generator\n"
+      "  " << this->GetName() << "\n"
+      "does not support variable\n"
+      "  " << name << "\n"
+      "but it has been specified."
+      ;
+    /* clang-format on */
+    this->GetCMakeInstance()->IssueMessage(MessageType::FATAL_ERROR, e.str());
+    return true;
+  }
+
+  return false;
+}
+
 bool cmGlobalGenerator::Compute()
 bool cmGlobalGenerator::Compute()
 {
 {
+  // Make sure unsupported variables are not used.
+  if (this->UnsupportedVariableIsDefined("CMAKE_DEFAULT_BUILD_TYPE",
+                                         this->SupportsDefaultBuildType())) {
+    return false;
+  }
+  if (this->UnsupportedVariableIsDefined("CMAKE_CROSS_CONFIGS",
+                                         this->SupportsCrossConfigs())) {
+    return false;
+  }
+  if (this->UnsupportedVariableIsDefined("CMAKE_DEFAULT_CONFIGS",
+                                         this->SupportsDefaultConfigs())) {
+    return false;
+  }
+
   // Some generators track files replaced during the Generate.
   // Some generators track files replaced during the Generate.
   // Start with an empty vector:
   // Start with an empty vector:
   this->FilesReplacedDuringGenerate.clear();
   this->FilesReplacedDuringGenerate.clear();

+ 7 - 0
Source/cmGlobalGenerator.h

@@ -455,6 +455,10 @@ public:
   /** Generate an <output>.rule file path for a given command output.  */
   /** Generate an <output>.rule file path for a given command output.  */
   virtual std::string GenerateRuleFile(std::string const& output) const;
   virtual std::string GenerateRuleFile(std::string const& output) const;
 
 
+  virtual bool SupportsDefaultBuildType() const { return false; }
+  virtual bool SupportsCrossConfigs() const { return false; }
+  virtual bool SupportsDefaultConfigs() const { return false; }
+
   static std::string EscapeJSON(const std::string& s);
   static std::string EscapeJSON(const std::string& s);
 
 
   void ProcessEvaluationFiles();
   void ProcessEvaluationFiles();
@@ -674,6 +678,9 @@ private:
 
 
   virtual const char* GetBuildIgnoreErrorsFlag() const { return nullptr; }
   virtual const char* GetBuildIgnoreErrorsFlag() const { return nullptr; }
 
 
+  bool UnsupportedVariableIsDefined(const std::string& name,
+                                    bool supported) const;
+
   // Cache directory content and target files to be built.
   // Cache directory content and target files to be built.
   struct DirectoryContent
   struct DirectoryContent
   {
   {

+ 4 - 0
Source/cmGlobalNinjaGenerator.h

@@ -640,6 +640,10 @@ public:
 
 
   bool ReadCacheEntriesForBuild(const cmState& state) override;
   bool ReadCacheEntriesForBuild(const cmState& state) override;
 
 
+  bool SupportsDefaultBuildType() const override { return true; }
+  bool SupportsCrossConfigs() const override { return true; }
+  bool SupportsDefaultConfigs() const override { return true; }
+
 protected:
 protected:
   bool OpenBuildFileStreams() override;
   bool OpenBuildFileStreams() override;
   void CloseBuildFileStreams() override;
   void CloseBuildFileStreams() override;

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_CROSS_CONFIGS-result.txt

@@ -0,0 +1 @@
+1

+ 11 - 0
Tests/RunCMake/Configure/NoCMAKE_CROSS_CONFIGS-stderr.txt

@@ -0,0 +1,11 @@
+^CMake Error:
+  Generator
+
+    [^
+]*
+
+  does not support variable
+
+    CMAKE_CROSS_CONFIGS
+
+  but it has been specified.

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_CROSS_CONFIGS.cmake

@@ -0,0 +1 @@
+set(CMAKE_CROSS_CONFIGS "")

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_BUILD_TYPE-result.txt

@@ -0,0 +1 @@
+1

+ 11 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_BUILD_TYPE-stderr.txt

@@ -0,0 +1,11 @@
+^CMake Error:
+  Generator
+
+    [^
+]*
+
+  does not support variable
+
+    CMAKE_DEFAULT_BUILD_TYPE
+
+  but it has been specified.

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_BUILD_TYPE.cmake

@@ -0,0 +1 @@
+set(CMAKE_DEFAULT_BUILD_TYPE "")

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_CONFIGS-result.txt

@@ -0,0 +1 @@
+1

+ 11 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_CONFIGS-stderr.txt

@@ -0,0 +1,11 @@
+^CMake Error:
+  Generator
+
+    [^
+]*
+
+  does not support variable
+
+    CMAKE_DEFAULT_CONFIGS
+
+  but it has been specified.

+ 1 - 0
Tests/RunCMake/Configure/NoCMAKE_DEFAULT_CONFIGS.cmake

@@ -0,0 +1 @@
+set(CMAKE_DEFAULT_CONFIGS "")

+ 6 - 0
Tests/RunCMake/Configure/RunCMakeTest.cmake

@@ -50,3 +50,9 @@ file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
 run_cmake(RemoveCache)
 run_cmake(RemoveCache)
 file(REMOVE "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
 file(REMOVE "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
 run_cmake(RemoveCache)
 run_cmake(RemoveCache)
+
+if(NOT RunCMake_GENERATOR MATCHES "^Ninja Multi-Config$")
+  run_cmake(NoCMAKE_CROSS_CONFIGS)
+  run_cmake(NoCMAKE_DEFAULT_BUILD_TYPE)
+  run_cmake(NoCMAKE_DEFAULT_CONFIGS)
+endif()