summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-07 14:55:39 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-11-07 14:56:24 (GMT)
commit4f26c238a68619d2603f970375096a1eb64eae85 (patch)
tree029467a7df2da128e5ca817490e19dfcff1aca17 /Source
parented154b38963437c7a0208a45592988aa577ac7c9 (diff)
parent7d1924613858ec15d7d628306ea0e3156a1a6ddd (diff)
downloadCMake-4f26c238a68619d2603f970375096a1eb64eae85.zip
CMake-4f26c238a68619d2603f970375096a1eb64eae85.tar.gz
CMake-4f26c238a68619d2603f970375096a1eb64eae85.tar.bz2
Merge topic 'static-library-link-xcframework' into release-3.28
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.cxx93
1 files changed, 72 insertions, 21 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 5076e6c..cce45a3 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -3854,18 +3854,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);
@@ -3972,13 +4038,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())));
@@ -3986,14 +4045,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;