Fix XCODE_ATTRIBUTE_..._LOCATION target property lookup

Refactoring in commit v3.5.0-rc1~272^2~16 (cmGeneratorTarget: Add API for
property keys, 2015-10-25) changed the Xcode generator implementation of
`XCODE_ATTRIBUTE_...` properties to use the target `GetProperty` method on each
`XCODE_ATTRIBUTE_...` property listed by `GetPropertyKeys` instead of looping
over the property entries directly.  This made the lookup of property names of
the form `XCODE_ATTRIBUTE_..._LOCATION` accidentally trigger the computed
property logic for the undocumented/legacy `<CONFIG>_LOCATION` property.  Of
course the computed property value is not the same as the value stored in the
`XCODE_ATTRIBUTE_..._LOCATION` property.  Fix the computed property logic to
avoid triggering on `XCODE_ATTRIBUTE_...` attributes.

Closes: #16319
This commit is contained in:
Brad King 2016-09-22 11:03:40 -04:00
parent f4475eb92b
commit 764775c4dd
4 changed files with 13 additions and 1 deletions

View File

@ -1164,7 +1164,8 @@ const char* cmTarget::GetProperty(const std::string& prop,
} }
} }
// Support "<CONFIG>_LOCATION". // Support "<CONFIG>_LOCATION".
else if (cmHasLiteralSuffix(prop, "_LOCATION")) { else if (cmHasLiteralSuffix(prop, "_LOCATION") &&
!cmHasLiteralPrefix(prop, "XCODE_ATTRIBUTE_")) {
std::string configName(prop.c_str(), prop.size() - 9); std::string configName(prop.c_str(), prop.size() - 9);
if (configName != "IMPORTED") { if (configName != "IMPORTED") {
if (!this->HandleLocationPropertyPolicy(context)) { if (!this->HandleLocationPropertyPolicy(context)) {

View File

@ -1,6 +1,7 @@
include(RunCMake) include(RunCMake)
run_cmake(XcodeFileType) run_cmake(XcodeFileType)
run_cmake(XcodeAttributeLocation)
run_cmake(XcodeAttributeGenex) run_cmake(XcodeAttributeGenex)
run_cmake(XcodeAttributeGenexError) run_cmake(XcodeAttributeGenexError)
run_cmake(XcodeObjectNeedsEscape) run_cmake(XcodeObjectNeedsEscape)

View File

@ -0,0 +1,7 @@
set(expect "DEPLOYMENT_LOCATION = YES")
file(STRINGS ${RunCMake_TEST_BINARY_DIR}/XcodeAttributeLocation.xcodeproj/project.pbxproj actual
REGEX "DEPLOYMENT_LOCATION = .*;" LIMIT_COUNT 1)
if(NOT "${actual}" MATCHES "${expect}")
message(SEND_ERROR "The actual project contains the line:\n ${actual}\n"
"which does not match expected regex:\n ${expect}\n")
endif()

View File

@ -0,0 +1,3 @@
enable_language(C)
add_executable(some main.c)
set_property(TARGET some PROPERTY XCODE_ATTRIBUTE_DEPLOYMENT_LOCATION YES)