summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@crascit.com>2020-11-16 19:23:44 +0000
committerKitware Robot <kwrobot@kitware.com>2020-11-16 14:23:52 -0500
commitc22f434c8304e6142d3fea54e932846afe4af59a (patch)
tree60f683b78caafb604e8fca740685673ff9ed1ea0
parent87ef95686501e43e441956f54f874fb243fca44b (diff)
parentb1ef2fffe73570dfdbb244e19dd66bed2d6f10c4 (diff)
downloadcmake-c22f434c8304e6142d3fea54e932846afe4af59a.tar.gz
Merge topic 'xcode-clean-lib-paths' into release-3.19
b1ef2fffe7 Xcode: Clean library paths to avoid linker duplicate symbol definitions Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !5511
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx30
1 files changed, 20 insertions, 10 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 908c182d11..766ae7224f 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -3442,10 +3442,16 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
if (!libTarget) {
if (libItem->IsPath) {
// Get or create a direct file ref in the root project
- auto it = this->ExternalLibRefs.find(libItem->Value.Value);
+ auto cleanPath = libItem->Value.Value;
+ if (cmSystemTools::FileIsFullPath(cleanPath)) {
+ // Some arguments are reported as paths, but they are actually not,
+ // so we can't collapse them, and neither can we collapse relative
+ // paths
+ cleanPath = cmSystemTools::CollapseFullPath(cleanPath);
+ }
+ auto it = this->ExternalLibRefs.find(cleanPath);
if (it == this->ExternalLibRefs.end()) {
- buildFile = CreateXCodeBuildFileFromPath(libItem->Value.Value, gt,
- "", nullptr);
+ buildFile = CreateXCodeBuildFileFromPath(cleanPath, gt, "", nullptr);
if (!buildFile) {
// Add this library item back to a regular linker flag list
for (const auto& conf : configItemMap) {
@@ -3453,7 +3459,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
}
continue;
}
- this->ExternalLibRefs.emplace(libItem->Value.Value, buildFile);
+ this->ExternalLibRefs.emplace(cleanPath, buildFile);
} else {
buildFile = it->second;
}
@@ -3585,7 +3591,11 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
for (auto const& libItem : configItemMap[configName]) {
auto const& libName = *libItem;
if (libName.IsPath) {
- const auto libPath = GetLibraryOrFrameworkPath(libName.Value.Value);
+ auto cleanPath = libName.Value.Value;
+ if (cmSystemTools::FileIsFullPath(cleanPath)) {
+ cleanPath = cmSystemTools::CollapseFullPath(cleanPath);
+ }
+ const auto libPath = GetLibraryOrFrameworkPath(cleanPath);
if (cmSystemTools::StringEndsWith(libPath.c_str(), ".framework")) {
const auto fwName =
cmSystemTools::GetFilenameWithoutExtension(libPath);
@@ -3593,17 +3603,17 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
libPaths.Add("-F " + this->XCodeEscapePath(fwDir));
libPaths.Add("-framework " + fwName);
} else {
- libPaths.Add(this->XCodeEscapePath(libName.Value.Value));
+ libPaths.Add(this->XCodeEscapePath(cleanPath));
}
if ((!libName.Target || libName.Target->IsImported()) &&
IsLinkPhaseLibraryExtension(libPath)) {
// Create file reference for embedding
- auto it = this->ExternalLibRefs.find(libName.Value.Value);
+ auto it = this->ExternalLibRefs.find(cleanPath);
if (it == this->ExternalLibRefs.end()) {
- auto* buildFile = this->CreateXCodeBuildFileFromPath(
- libName.Value.Value, gt, "", nullptr);
+ auto* buildFile =
+ this->CreateXCodeBuildFileFromPath(cleanPath, gt, "", nullptr);
if (buildFile) {
- this->ExternalLibRefs.emplace(libName.Value.Value, buildFile);
+ this->ExternalLibRefs.emplace(cleanPath, buildFile);
}
}
}