From 40c0482153b54f60cd2f2e573cc1183df56e8a76 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 27 Sep 2016 08:38:18 -0400 Subject: [PATCH 1/2] Tests: Decide earlier whether to test resources Provide a CMake_TEST_RESOURCES variable storing the decision. --- Tests/CMakeLists.txt | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 368184312..c056fb878 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -83,6 +83,17 @@ if(BUILD_TESTING) set(MAKE_SUPPORTS_SPACES 0) endif() + # assume no resources building to test + set(CMake_TEST_RESOURCES FALSE) + # for windows and cygwin assume we have resources + if(WIN32 OR CYGWIN) + set(CMake_TEST_RESOURCES TRUE) + endif() + # for borland and watcom there is no resource support + if(WATCOM OR BORLAND) + set(CMake_TEST_RESOURCES FALSE) + endif() + set(build_generator_args --build-generator ${CMAKE_GENERATOR} ) @@ -262,17 +273,7 @@ if(BUILD_TESTING) ADD_TEST_MACRO(CompileFeatures CompileFeatures) ADD_TEST_MACRO(CMakeCommands.target_compile_features target_compile_features) - # assume no resources building to test - set(TEST_RESOURCES FALSE) - # for windows and cygwin assume we have resources - if(WIN32 OR CYGWIN) - set(TEST_RESOURCES TRUE) - endif() - # for borland and watcom there is no resource support - if(WATCOM OR BORLAND) - set(TEST_RESOURCES FALSE) - endif() - if(TEST_RESOURCES) + if(CMake_TEST_RESOURCES) ADD_TEST_MACRO(VSResource VSResource) if (CMAKE_GENERATOR MATCHES "Ninja") add_test_macro(VSResourceNinjaForceRSP VSResourceNinjaForceRSP) From 9c5238dfd6a3aa1d7e0ba30f302e75ffbc893851 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 27 Sep 2016 09:33:58 -0400 Subject: [PATCH 2/2] 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 --- Source/cmMakefile.cxx | 21 ++++++++++++++++++++- Tests/RunCMake/CMakeLists.txt | 2 +- Tests/RunCMake/project/ExplicitRC.cmake | 1 + Tests/RunCMake/project/RunCMakeTest.cmake | 3 +++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/project/ExplicitRC.cmake diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 48e6c6182..df993ceb7 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -3142,7 +3142,26 @@ void cmMakefile::EnableLanguage(std::vector const& lang, { this->AddDefinition("CMAKE_CFG_INTDIR", 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 langs; + std::vector langsRC; + langs.reserve(lang.size()); + for (std::vector::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, diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 778982faf..0eafbeff5 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -207,7 +207,7 @@ add_RunCMake_test(include) add_RunCMake_test(include_directories) add_RunCMake_test(list) 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(set_property) add_RunCMake_test(string) diff --git a/Tests/RunCMake/project/ExplicitRC.cmake b/Tests/RunCMake/project/ExplicitRC.cmake new file mode 100644 index 000000000..b3feaa9b8 --- /dev/null +++ b/Tests/RunCMake/project/ExplicitRC.cmake @@ -0,0 +1 @@ +project(ExplicitRC C RC) diff --git a/Tests/RunCMake/project/RunCMakeTest.cmake b/Tests/RunCMake/project/RunCMakeTest.cmake index 6ab0fc957..dba97d2b2 100644 --- a/Tests/RunCMake/project/RunCMakeTest.cmake +++ b/Tests/RunCMake/project/RunCMakeTest.cmake @@ -1,5 +1,8 @@ include(RunCMake) +if(CMake_TEST_RESOURCES) + run_cmake(ExplicitRC) +endif() run_cmake(LanguagesImplicit) run_cmake(LanguagesEmpty) run_cmake(LanguagesNONE)