diff options
author | Gusts Kaksis <gusts.kaksis@sonarworks.com> | 2020-11-15 11:08:21 +0200 |
---|---|---|
committer | Craig Scott <craig.scott@crascit.com> | 2020-11-16 07:14:57 +1100 |
commit | b1ef2fffe73570dfdbb244e19dd66bed2d6f10c4 (patch) | |
tree | 40dd18cee236a6b6d20d7de3cd0cc440820680a7 /Source/cmGlobalXCodeGenerator.cxx | |
parent | c35c4ae85c068eec0642e3f211daf2e3615fbfcf (diff) | |
download | cmake-b1ef2fffe73570dfdbb244e19dd66bed2d6f10c4.tar.gz |
Xcode: Clean library paths to avoid linker duplicate symbol definitions
Diffstat (limited to 'Source/cmGlobalXCodeGenerator.cxx')
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 30 |
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); } } } |