Browse Source

project: Fix support for explicit RC language

The check added in commit v3.6.0-rc1~293^2 (Diagnose recursive
project/enable_language without crashing, 2016-03-07) broke support for
enabling `RC` explicitly along with other languages like `C`.  The
reason is that we enable all listed languages at once so the internal
`enable_language(RC)` that we do while enabling `C` or `CXX` on some
platforms triggers the recursion check if `RC` is explicitly listed.

Ideally we should refactor things to only enable one language at a time,
but for now it is simplest to just exclude `RC` from the explicit list
until other languages are enabled, and then enable it.

Closes: #16330
Brad King 9 years ago
parent
commit
9c5238dfd6

+ 20 - 1
Source/cmMakefile.cxx

@@ -3142,7 +3142,26 @@ void cmMakefile::EnableLanguage(std::vector<std::string> const& lang,
 {
 {
   this->AddDefinition("CMAKE_CFG_INTDIR",
   this->AddDefinition("CMAKE_CFG_INTDIR",
                       this->GetGlobalGenerator()->GetCMakeCFGIntDir());
                       this->GetGlobalGenerator()->GetCMakeCFGIntDir());
-  this->GetGlobalGenerator()->EnableLanguage(lang, this, optional);
+  // If RC is explicitly listed we need to do it after other languages.
+  // On some platforms we enable RC implicitly while enabling others.
+  // Do not let that look like recursive enable_language(RC).
+  std::vector<std::string> langs;
+  std::vector<std::string> langsRC;
+  langs.reserve(lang.size());
+  for (std::vector<std::string>::const_iterator i = lang.begin();
+       i != lang.end(); ++i) {
+    if (i->compare("RC") == 0) {
+      langsRC.push_back(*i);
+    } else {
+      langs.push_back(*i);
+    }
+  }
+  if (!langs.empty()) {
+    this->GetGlobalGenerator()->EnableLanguage(langs, this, optional);
+  }
+  if (!langsRC.empty()) {
+    this->GetGlobalGenerator()->EnableLanguage(langsRC, this, optional);
+  }
 }
 }
 
 
 int cmMakefile::TryCompile(const std::string& srcdir,
 int cmMakefile::TryCompile(const std::string& srcdir,

+ 1 - 1
Tests/RunCMake/CMakeLists.txt

@@ -207,7 +207,7 @@ add_RunCMake_test(include)
 add_RunCMake_test(include_directories)
 add_RunCMake_test(include_directories)
 add_RunCMake_test(list)
 add_RunCMake_test(list)
 add_RunCMake_test(message)
 add_RunCMake_test(message)
-add_RunCMake_test(project)
+add_RunCMake_test(project -DCMake_TEST_RESOURCES=${CMake_TEST_RESOURCES})
 add_RunCMake_test(return)
 add_RunCMake_test(return)
 add_RunCMake_test(set_property)
 add_RunCMake_test(set_property)
 add_RunCMake_test(string)
 add_RunCMake_test(string)

+ 1 - 0
Tests/RunCMake/project/ExplicitRC.cmake

@@ -0,0 +1 @@
+project(ExplicitRC C RC)

+ 3 - 0
Tests/RunCMake/project/RunCMakeTest.cmake

@@ -1,5 +1,8 @@
 include(RunCMake)
 include(RunCMake)
 
 
+if(CMake_TEST_RESOURCES)
+  run_cmake(ExplicitRC)
+endif()
 run_cmake(LanguagesImplicit)
 run_cmake(LanguagesImplicit)
 run_cmake(LanguagesEmpty)
 run_cmake(LanguagesEmpty)
 run_cmake(LanguagesNONE)
 run_cmake(LanguagesNONE)