diff options
author | Brad King <brad.king@kitware.com> | 2023-11-07 14:55:39 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2023-11-07 14:56:25 (GMT) |
commit | 49df33c342eb6c267159db2d559602ab91bf1c87 (patch) | |
tree | d068d559fabc37b374f35cb126764512ce564e26 /Source | |
parent | 5afd411ed0722869ae1be535ba0f9549009b5acc (diff) | |
parent | 7d1924613858ec15d7d628306ea0e3156a1a6ddd (diff) | |
download | CMake-49df33c342eb6c267159db2d559602ab91bf1c87.zip CMake-49df33c342eb6c267159db2d559602ab91bf1c87.tar.gz CMake-49df33c342eb6c267159db2d559602ab91bf1c87.tar.bz2 |
Merge topic 'static-library-link-xcframework'
7d19246138 Xcode: Fix linking against .xcframework from static libraries
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !8949
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 93 |
1 files changed, 72 insertions, 21 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 9f6786e..2e6ed37 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3857,18 +3857,84 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target) configName); } - // Skip link information for object libraries. - if (gt->GetType() == cmStateEnums::OBJECT_LIBRARY || - gt->GetType() == cmStateEnums::STATIC_LIBRARY) { - continue; - } - // Compute the link library and directory information. cmComputeLinkInformation* cli = gt->GetLinkInformation(configName); if (!cli) { continue; } + // add .xcframework include paths + { + // Keep track of framework search paths we've already added or that are + // part of the set of implicit search paths. We don't want to repeat + // them and we also need to avoid hard-coding any SDK-specific paths. + // This is essential for getting device-and-simulator builds to work, + // otherwise we end up hard-coding a path to the wrong SDK for + // SDK-provided frameworks that are added by their full path. + std::set<std::string> emitted(cli->GetFrameworkPathsEmitted()); + BuildObjectListOrString includePaths(this, true); + BuildObjectListOrString fwSearchPaths(this, true); + for (auto const& libItem : configItemMap[configName]) { + auto const& libName = *libItem; + if (libName.IsPath == cmComputeLinkInformation::ItemIsPath::Yes) { + auto cleanPath = libName.Value.Value; + if (cmSystemTools::FileIsFullPath(cleanPath)) { + cleanPath = cmSystemTools::CollapseFullPath(cleanPath); + } + bool isXcFramework = + cmHasSuffix(libName.GetFeatureName(), "XCFRAMEWORK"_s); + if (isXcFramework) { + auto plist = cmParseXcFrameworkPlist( + cleanPath, *this->Makefiles.front(), libName.Value.Backtrace); + if (!plist) { + return; + } + if (auto const* library = plist->SelectSuitableLibrary( + *this->Makefiles.front(), libName.Value.Backtrace)) { + auto libraryPath = + cmStrCat(cleanPath, '/', library->LibraryIdentifier, '/', + library->LibraryPath); + if (auto const fwDescriptor = this->SplitFrameworkPath( + libraryPath, + cmGlobalGenerator::FrameworkFormat::Relaxed)) { + if (!fwDescriptor->Directory.empty() && + emitted.insert(fwDescriptor->Directory).second) { + // This is a search path we had not added before and it + // isn't an implicit search path, so we need it + fwSearchPaths.Add( + this->XCodeEscapePath(fwDescriptor->Directory)); + } + } else { + if (!library->HeadersPath.empty()) { + includePaths.Add(this->XCodeEscapePath( + cmStrCat(cleanPath, '/', library->LibraryIdentifier, '/', + library->HeadersPath))); + } + } + } else { + return; + } + } + } + } + if (!includePaths.IsEmpty()) { + this->AppendBuildSettingAttribute(target, "HEADER_SEARCH_PATHS", + includePaths.CreateList(), + configName); + } + if (!fwSearchPaths.IsEmpty()) { + this->AppendBuildSettingAttribute(target, "FRAMEWORK_SEARCH_PATHS", + fwSearchPaths.CreateList(), + configName); + } + } + + // Skip link information for object libraries. + if (gt->GetType() == cmStateEnums::OBJECT_LIBRARY || + gt->GetType() == cmStateEnums::STATIC_LIBRARY) { + continue; + } + // Add dependencies directly on library files. for (auto const& libDep : cli->GetDepends()) { target->AddDependLibrary(configName, libDep); @@ -3975,13 +4041,6 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target) if (auto const fwDescriptor = this->SplitFrameworkPath( libraryPath, cmGlobalGenerator::FrameworkFormat::Relaxed)) { - if (!fwDescriptor->Directory.empty() && - emitted.insert(fwDescriptor->Directory).second) { - // This is a search path we had not added before and it - // isn't an implicit search path, so we need it - fwSearchPaths.Add( - this->XCodeEscapePath(fwDescriptor->Directory)); - } libPaths.Add(cmStrCat( "-framework ", this->XCodeEscapePath(fwDescriptor->GetLinkName()))); @@ -3989,14 +4048,6 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target) libPaths.Add( libName.GetFormattedItem(this->XCodeEscapePath(libraryPath)) .Value); - if (!library->HeadersPath.empty()) { - this->AppendBuildSettingAttribute( - target, "HEADER_SEARCH_PATHS", - this->CreateString(this->XCodeEscapePath( - cmStrCat(cleanPath, '/', library->LibraryIdentifier, '/', - library->HeadersPath))), - configName); - } } } else { return; |