summaryrefslogtreecommitdiff
path: root/Source/cmGlobalXCodeGenerator.cxx
diff options
context:
space:
mode:
authorGusts Kaksis <gusts.kaksis@sonarworks.com>2020-11-15 11:08:21 +0200
committerCraig Scott <craig.scott@crascit.com>2020-11-16 07:14:57 +1100
commitb1ef2fffe73570dfdbb244e19dd66bed2d6f10c4 (patch)
tree40dd18cee236a6b6d20d7de3cd0cc440820680a7 /Source/cmGlobalXCodeGenerator.cxx
parentc35c4ae85c068eec0642e3f211daf2e3615fbfcf (diff)
downloadcmake-b1ef2fffe73570dfdbb244e19dd66bed2d6f10c4.tar.gz
Xcode: Clean library paths to avoid linker duplicate symbol definitions
Diffstat (limited to 'Source/cmGlobalXCodeGenerator.cxx')
-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);
}
}
}