浏览代码

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 <[email protected]>
Merge-request: !5511
Craig Scott 5 年之前
父节点
当前提交
c22f434c83
共有 1 个文件被更改,包括 20 次插入10 次删除
  1. 20 10
      Source/cmGlobalXCodeGenerator.cxx

+ 20 - 10
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);
               }
             }
           }