From 227de0b95d6fd12e47da502ce34e8aea6d57cc43 Mon Sep 17 00:00:00 2001 From: Beeble Date: Tue, 4 Apr 2017 21:13:35 +0200 Subject: [PATCH] include_external_msproject: Honor MAP_IMPORTED_CONFIG_ This allows projects added via `include_external_msproject` to compile the preferred configuration despite different naming conventions. --- Help/command/include_external_msproject.rst | 4 +++ .../include_external_msproject-map-config.rst | 6 +++++ Source/cmGlobalVisualStudio71Generator.cxx | 13 ++++++--- Source/cmGlobalVisualStudio8Generator.cxx | 11 +++++--- .../CustomConfig-check.cmake | 1 + .../CustomConfig.cmake | 3 +++ .../CustomGuid-check.cmake | 2 +- .../CustomGuidTypePlatform-check.cmake | 2 +- .../CustomTypePlatform-check.cmake | 2 +- .../RunCMakeTest.cmake | 1 + .../check_utils.cmake | 27 ++++++++++++++++++- 11 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 Help/release/dev/include_external_msproject-map-config.rst create mode 100644 Tests/RunCMake/include_external_msproject/CustomConfig-check.cmake create mode 100644 Tests/RunCMake/include_external_msproject/CustomConfig.cmake diff --git a/Help/command/include_external_msproject.rst b/Help/command/include_external_msproject.rst index 18a2b50805..335282a30c 100644 --- a/Help/command/include_external_msproject.rst +++ b/Help/command/include_external_msproject.rst @@ -20,3 +20,7 @@ command to make things depend on the external project. specify the type of project, id (GUID) of the project and the name of the target platform. This is useful for projects requiring values other than the default (e.g. WIX projects). + +If the imported project has different configuration names than the +current project, set the :prop_tgt:`MAP_IMPORTED_CONFIG_` +target property to specify the mapping. diff --git a/Help/release/dev/include_external_msproject-map-config.rst b/Help/release/dev/include_external_msproject-map-config.rst new file mode 100644 index 0000000000..d5f7a7f3aa --- /dev/null +++ b/Help/release/dev/include_external_msproject-map-config.rst @@ -0,0 +1,6 @@ +include_external_msproject-map-config +------------------------------------- + +* The :command:`include_external_msproject` command learned to use + the :prop_tgt:`MAP_IMPORTED_CONFIG_` target property + to map current configurations to the external configurations. diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx index 05aec5284b..3f8d3817ce 100644 --- a/Source/cmGlobalVisualStudio71Generator.cxx +++ b/Source/cmGlobalVisualStudio71Generator.cxx @@ -259,13 +259,18 @@ void cmGlobalVisualStudio71Generator::WriteProjectConfigurations( std::string guid = this->GetGUID(name); for (std::vector::const_iterator i = configs.begin(); i != configs.end(); ++i) { - fout << "\t\t{" << guid << "}." << *i << ".ActiveCfg = " << *i << "|" - << platformName << std::endl; + const char* dstConfig = target.GetProperty("MAP_IMPORTED_CONFIG_" + + cmSystemTools::UpperCase(*i)); + if (dstConfig == CM_NULLPTR) { + dstConfig = i->c_str(); + } + fout << "\t\t{" << guid << "}." << *i << ".ActiveCfg = " << dstConfig + << "|" << platformName << std::endl; std::set::const_iterator ci = configsPartOfDefaultBuild.find(*i); if (!(ci == configsPartOfDefaultBuild.end())) { - fout << "\t\t{" << guid << "}." << *i << ".Build.0 = " << *i << "|" - << platformName << std::endl; + fout << "\t\t{" << guid << "}." << *i << ".Build.0 = " << dstConfig + << "|" << platformName << std::endl; } } } diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index 13a9ab317c..634db7ff85 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -361,8 +361,13 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations( std::string guid = this->GetGUID(name); for (std::vector::const_iterator i = configs.begin(); i != configs.end(); ++i) { + const char* dstConfig = target.GetProperty("MAP_IMPORTED_CONFIG_" + + cmSystemTools::UpperCase(*i)); + if (dstConfig == CM_NULLPTR) { + dstConfig = i->c_str(); + } fout << "\t\t{" << guid << "}." << *i << "|" << this->GetPlatformName() - << ".ActiveCfg = " << *i << "|" + << ".ActiveCfg = " << dstConfig << "|" << (!platformMapping.empty() ? platformMapping : this->GetPlatformName()) << "\n"; @@ -370,14 +375,14 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations( configsPartOfDefaultBuild.find(*i); if (!(ci == configsPartOfDefaultBuild.end())) { fout << "\t\t{" << guid << "}." << *i << "|" << this->GetPlatformName() - << ".Build.0 = " << *i << "|" + << ".Build.0 = " << dstConfig << "|" << (!platformMapping.empty() ? platformMapping : this->GetPlatformName()) << "\n"; } if (this->NeedsDeploy(target.GetType())) { fout << "\t\t{" << guid << "}." << *i << "|" << this->GetPlatformName() - << ".Deploy.0 = " << *i << "|" + << ".Deploy.0 = " << dstConfig << "|" << (!platformMapping.empty() ? platformMapping : this->GetPlatformName()) << "\n"; diff --git a/Tests/RunCMake/include_external_msproject/CustomConfig-check.cmake b/Tests/RunCMake/include_external_msproject/CustomConfig-check.cmake new file mode 100644 index 0000000000..1a940b8106 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomConfig-check.cmake @@ -0,0 +1 @@ +check_project(CustomConfig external "aaa-bbb-ccc-000" "" "" "Custom - Release") diff --git a/Tests/RunCMake/include_external_msproject/CustomConfig.cmake b/Tests/RunCMake/include_external_msproject/CustomConfig.cmake new file mode 100644 index 0000000000..1f935cd58c --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomConfig.cmake @@ -0,0 +1,3 @@ +include_external_msproject(external external.project + GUID aaa-bbb-ccc-000) +set_target_properties(external PROPERTIES MAP_IMPORTED_CONFIG_RELEASE "Custom - Release") diff --git a/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake b/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake index 68dec4c08d..3747934db6 100644 --- a/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake +++ b/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake @@ -1 +1 @@ -check_project(CustomGuid external "aaa-bbb-ccc-000" "" "") +check_project(CustomGuid external "aaa-bbb-ccc-000" "" "" "") diff --git a/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake index 614712ee67..0b2ac1db0d 100644 --- a/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake +++ b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake @@ -1 +1 @@ -check_project(CustomGuidTypePlatform external "aaa-bbb-ccc-111" "aaa-bbb-ccc-ddd-eee" "Custom Platform") +check_project(CustomGuidTypePlatform external "aaa-bbb-ccc-111" "aaa-bbb-ccc-ddd-eee" "Custom Platform" "") diff --git a/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake b/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake index 054eeb0374..c431b03d62 100644 --- a/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake +++ b/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake @@ -1 +1 @@ -check_project(CustomTypePlatform external "" "aaa-bbb-ccc-ddd-eee" "Custom Platform") +check_project(CustomTypePlatform external "" "aaa-bbb-ccc-ddd-eee" "Custom Platform" "") diff --git a/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake b/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake index 90710f9bf3..47dac349f0 100644 --- a/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake +++ b/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake @@ -4,3 +4,4 @@ include(${CMAKE_CURRENT_LIST_DIR}/check_utils.cmake) run_cmake(CustomGuid) run_cmake(CustomTypePlatform) run_cmake(CustomGuidTypePlatform) +run_cmake(CustomConfig) diff --git a/Tests/RunCMake/include_external_msproject/check_utils.cmake b/Tests/RunCMake/include_external_msproject/check_utils.cmake index 5dd92f9ccb..e9e9cac72a 100644 --- a/Tests/RunCMake/include_external_msproject/check_utils.cmake +++ b/Tests/RunCMake/include_external_msproject/check_utils.cmake @@ -71,8 +71,24 @@ function(check_custom_platform TARGET_FILE PROJECT_NAME PLATFORM_NAME RESULT) set(${RESULT} ${IS_FOUND} PARENT_SCOPE) endfunction() +# Search project's build configuration line by project name and target configuration name. +# Returns TRUE if found and FALSE otherwise +function(check_custom_configuration TARGET_FILE PROJECT_NAME SLN_CONFIG DST_CONFIG RESULT) + set(${RESULT} "FALSE" PARENT_SCOPE) + # extract project guid + parse_project_section(${TARGET_FILE} ${PROJECT_NAME}) + if(NOT IS_FOUND) + return() + endif() + + set(REG_EXP "^(\t)*\\{${FOUND_GUID}\\}\\.${SLN_CONFIG}[^ ]*\\.ActiveCfg = ${DST_CONFIG}\\|.*$") + check_line_exists(${TARGET_FILE} REG_EXP) + + set(${RESULT} ${IS_FOUND} PARENT_SCOPE) +endfunction() + # RunCMake test check helper -function(check_project test name guid type platform) +function(check_project test name guid type platform imported_release_config_name) set(sln "${RunCMake_TEST_BINARY_DIR}/${test}.sln") set(sep "") set(failed "") @@ -88,6 +104,9 @@ function(check_project test name guid type platform) set(platform "Win32") endif() endif() + if(NOT imported_release_config_name) + set(imported_release_config_name "Release") + endif() if(guid) check_project_guid("${sln}" "${name}" "${guid}" passed_guid) if(NOT passed_guid) @@ -107,5 +126,11 @@ function(check_project test name guid type platform) string(APPEND failed "${sep}${name} solution has no project with expected PLATFORM=${platform}") set(sep "\n") endif() + check_custom_configuration("${sln}" "${name}" "Release" "${imported_release_config_name}" passed_configuration) + if(NOT passed_configuration) + string(APPEND failed "${sep}${name} solution has no project with expected CONFIG=${imported_release_config_name}") + set(sep "\n") + endif() + set(RunCMake_TEST_FAILED "${failed}" PARENT_SCOPE) endfunction()