Explorar el Código

include_external_msproject: Honor MAP_IMPORTED_CONFIG_<CONFIG>

This allows projects added via `include_external_msproject` to compile
the preferred configuration despite different naming conventions.
Beeble hace 8 años
padre
commit
227de0b95d

+ 4 - 0
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_<CONFIG>`
+target property to specify the mapping.

+ 6 - 0
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_<CONFIG>` target property
+  to map current configurations to the external configurations.

+ 9 - 4
Source/cmGlobalVisualStudio71Generator.cxx

@@ -259,13 +259,18 @@ void cmGlobalVisualStudio71Generator::WriteProjectConfigurations(
   std::string guid = this->GetGUID(name);
   for (std::vector<std::string>::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<std::string>::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;
     }
   }
 }

+ 8 - 3
Source/cmGlobalVisualStudio8Generator.cxx

@@ -361,8 +361,13 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations(
   std::string guid = this->GetGUID(name);
   for (std::vector<std::string>::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";

+ 1 - 0
Tests/RunCMake/include_external_msproject/CustomConfig-check.cmake

@@ -0,0 +1 @@
+check_project(CustomConfig external "aaa-bbb-ccc-000" "" "" "Custom - Release")

+ 3 - 0
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")

+ 1 - 1
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" "" "" "")

+ 1 - 1
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" "")

+ 1 - 1
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" "")

+ 1 - 0
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)

+ 26 - 1
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()