From 60d73393a50944c1e81472d7e80a458bcb898554 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 20 Oct 2016 11:28:39 -0400 Subject: Help: Format MAP_IMPORTED_CONFIG_ documentation --- Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst b/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst index 09ff0ce..9eed069 100644 --- a/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst +++ b/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst @@ -1,19 +1,20 @@ MAP_IMPORTED_CONFIG_ ---------------------------- -Map from project configuration to IMPORTED target's configuration. +Map from project configuration to +:ref:`imported target `'s configuration. Set this to the list of configurations of an imported target that may -be used for the current project's configuration. Targets +be used for the current project's ```` configuration. Targets imported from another project may not provide the same set of configuration names available in the current project. Setting this property tells CMake what imported configurations are suitable for use -when building the configuration. The first configuration in +when building the ```` configuration. The first configuration in the list found to be provided by the imported target is selected. If this property is set and no matching configurations are available, then the imported target is considered to be not found. This property is ignored for non-imported targets. -This property is initialized by the value of the variable -CMAKE_MAP_IMPORTED_CONFIG_ if it is set when a target is -created. +This property is initialized by the value of the +:variable:`CMAKE_MAP_IMPORTED_CONFIG_` variable if it is set when a +target is created. -- cgit v0.12 From 149d49ea7c009f9965d9be91cdac8ee6cd2cfb91 Mon Sep 17 00:00:00 2001 From: Jens Weggemann Date: Wed, 19 Oct 2016 03:39:51 +0200 Subject: Teach MAP_IMPORTED_CONFIG_ to support configuration-less import If this property has an empty list entry, check for `IMPORTED_LOCATION` instead of `IMPORTED_LOCATION_`. This allows custom imported targets to have some configurations mapped and others fall back to a default location. Closes: #16280 --- Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst | 9 +++-- Help/release/dev/allow-fallback-config-mapping.rst | 6 ++++ Source/cmTarget.cxx | 41 ++++++++++++++-------- 3 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 Help/release/dev/allow-fallback-config-mapping.rst diff --git a/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst b/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst index 9eed069..4da855b 100644 --- a/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst +++ b/Help/prop_tgt/MAP_IMPORTED_CONFIG_CONFIG.rst @@ -10,8 +10,13 @@ imported from another project may not provide the same set of configuration names available in the current project. Setting this property tells CMake what imported configurations are suitable for use when building the ```` configuration. The first configuration in -the list found to be provided by the imported target is selected. If -this property is set and no matching configurations are available, +the list found to be provided by the imported target (i.e. via +:prop_tgt:`IMPORTED_LOCATION_` for the mapped-to ````) +is selected. As a special case, an empty list element refers to the +configuration-less imported target location +(i.e. :prop_tgt:`IMPORTED_LOCATION`). + +If this property is set and no matching configurations are available, then the imported target is considered to be not found. This property is ignored for non-imported targets. diff --git a/Help/release/dev/allow-fallback-config-mapping.rst b/Help/release/dev/allow-fallback-config-mapping.rst new file mode 100644 index 0000000..2522e10 --- /dev/null +++ b/Help/release/dev/allow-fallback-config-mapping.rst @@ -0,0 +1,6 @@ +allow-fallback-config-mapping +----------------------------- + +* The :prop_tgt:`MAP_IMPORTED_CONFIG_` target property learned + to interpret empty list elements as referring to the configuration-less + imported location specified by :prop_tgt:`IMPORTED_LOCATION`. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 3a22309..de30f98 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1395,7 +1395,7 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config, std::string mapProp = "MAP_IMPORTED_CONFIG_"; mapProp += desired_config; if (const char* mapValue = this->GetProperty(mapProp)) { - cmSystemTools::ExpandListArgument(mapValue, mappedConfigs); + cmSystemTools::ExpandListArgument(mapValue, mappedConfigs, true); } } @@ -1408,20 +1408,33 @@ bool cmTarget::GetMappedConfig(std::string const& desired_config, for (std::vector::const_iterator mci = mappedConfigs.begin(); !*loc && !*imp && mci != mappedConfigs.end(); ++mci) { // Look for this configuration. - std::string mcUpper = cmSystemTools::UpperCase(*mci); - std::string locProp = "IMPORTED_LOCATION_"; - locProp += mcUpper; - *loc = this->GetProperty(locProp); - if (allowImp) { - std::string impProp = "IMPORTED_IMPLIB_"; - impProp += mcUpper; - *imp = this->GetProperty(impProp); - } + if (mci->empty()) { + // An empty string in the mapping has a special meaning: + // look up the config-less properties. + *loc = this->GetProperty("IMPORTED_LOCATION"); + if (allowImp) { + *imp = this->GetProperty("IMPORTED_IMPLIB"); + } + // If it was found, set the suffix. + if (*loc || *imp) { + suffix = ""; + } + } else { + std::string mcUpper = cmSystemTools::UpperCase(*mci); + std::string locProp = "IMPORTED_LOCATION_"; + locProp += mcUpper; + *loc = this->GetProperty(locProp); + if (allowImp) { + std::string impProp = "IMPORTED_IMPLIB_"; + impProp += mcUpper; + *imp = this->GetProperty(impProp); + } - // If it was found, use it for all properties below. - if (*loc || *imp) { - suffix = "_"; - suffix += mcUpper; + // If it was found, use it for all properties below. + if (*loc || *imp) { + suffix = "_"; + suffix += mcUpper; + } } } -- cgit v0.12 From 587ab3221300f04a4de0756dc1a44fa0eac9c0d2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 20 Oct 2016 11:49:57 -0400 Subject: Tests: Add test for MAP_IMPORTED_CONFIG_ empty fallback --- Tests/GeneratorExpression/CMakeLists.txt | 8 ++++++++ Tests/GeneratorExpression/check-part3.cmake | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt index 27f33a2..4f2f434 100644 --- a/Tests/GeneratorExpression/CMakeLists.txt +++ b/Tests/GeneratorExpression/CMakeLists.txt @@ -171,6 +171,13 @@ add_executable(Alias::SomeExe ALIAS someexe) add_library(Alias::SomeLib ALIAS empty1) +add_library(importedFallback STATIC IMPORTED) +set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION_DEBUG debug_loc) +set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION_RELEASE release_loc) +set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION fallback_loc) +set_property(TARGET importedFallback PROPERTY MAP_IMPORTED_CONFIG_DEBUG "" DEBUG) +set_property(TARGET importedFallback PROPERTY MAP_IMPORTED_CONFIG_RELEASE "") + add_custom_target(check-part3 ALL COMMAND ${CMAKE_COMMAND} -Dtest_version_greater_1=$ @@ -184,6 +191,7 @@ add_custom_target(check-part3 ALL -Dtest_imported_release=$ -Dtest_imported_relwithdebinfo=$ -Dtest_imported_minsizerel=$ + -Dtest_imported_fallback=$,fallback_loc> -Dtest_alias_file_exe=$,$> -Dtest_alias_file_lib=$,$> -Dtest_alias_target_name=$,$> diff --git a/Tests/GeneratorExpression/check-part3.cmake b/Tests/GeneratorExpression/check-part3.cmake index 70ccfe1..e12d8c6 100644 --- a/Tests/GeneratorExpression/check-part3.cmake +++ b/Tests/GeneratorExpression/check-part3.cmake @@ -21,6 +21,8 @@ foreach(c debug release relwithdebinfo minsizerel) endif() endforeach() +check(test_imported_fallback "1") + check(test_alias_file_exe "1") check(test_alias_file_lib "1") check(test_alias_target_name "1") -- cgit v0.12