From 3f7e314a9caed14f4833ec4cb6ba5e88359ae1b5 Mon Sep 17 00:00:00 2001 From: Dalton Claybrook Date: Sun, 5 Jul 2026 15:20:57 -0400 Subject: [PATCH] Ensure static frameworks are embedded by default --- Sources/ProjectSpec/XCProjExtensions.swift | 27 +++++++++---------- .../ProjectGeneratorTests.swift | 26 +++++++++--------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Sources/ProjectSpec/XCProjExtensions.swift b/Sources/ProjectSpec/XCProjExtensions.swift index e1da8a3b0..ba8e20686 100644 --- a/Sources/ProjectSpec/XCProjExtensions.swift +++ b/Sources/ProjectSpec/XCProjExtensions.swift @@ -59,21 +59,20 @@ extension PBXProductType { /// Function to determine when a dependendency should be embedded into the target public func shouldEmbed(_ dependencyTarget: Target) -> Bool { - switch dependencyTarget.defaultLinkage { - case .static: - // Static dependencies should never embed + guard dependencyTarget.defaultLinkage != .static || dependencyTarget.type.isFramework else { + // Non-framework static dependencies should never embed + return false + } + + if isApp { + // If target is an app, all dependencies should be embed (unless they're static) + return true + } else if isTest, [.framework, .staticFramework, .bundle].contains(dependencyTarget.type) { + // If target is test, some dependencies should be embed (depending on their type) + return true + } else { + // If none of the above, do not embed the dependency return false - case .dynamic, .none: - if isApp { - // If target is an app, all dependencies should be embed (unless they're static) - return true - } else if isTest, [.framework, .bundle].contains(dependencyTarget.type) { - // If target is test, some dependencies should be embed (depending on their type) - return true - } else { - // If none of the above, do not embed the dependency - return false - } } } } diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index e38274737..331472c1b 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -982,8 +982,8 @@ class ProjectGeneratorTests: XCTestCase { } } - $0.it("ensures static frameworks are not embedded by default") { - + $0.it("ensures static frameworks are embedded by default") { + let app = Target( name: "App", type: .application, @@ -992,9 +992,9 @@ class ProjectGeneratorTests: XCTestCase { Dependency(type: .target, reference: "DynamicFramework"), Dependency(type: .target, reference: "DynamicFrameworkNotEmbedded", embed: false), Dependency(type: .target, reference: "StaticFramework"), - Dependency(type: .target, reference: "StaticFrameworkExplicitlyEmbedded", embed: true), + Dependency(type: .target, reference: "StaticFrameworkNotEmbedded", embed: false), Dependency(type: .target, reference: "StaticFramework2"), - Dependency(type: .target, reference: "StaticFramework2ExplicitlyEmbedded", embed: true), + Dependency(type: .target, reference: "StaticFramework2NotEmbedded", embed: false), Dependency(type: .target, reference: "StaticLibrary"), ] ) @@ -1018,7 +1018,7 @@ class ProjectGeneratorTests: XCTestCase { settings: Settings(buildSettings: ["MACH_O_TYPE": "staticlib"]) ), Target( - name: "StaticFrameworkExplicitlyEmbedded", + name: "StaticFrameworkNotEmbedded", type: .framework, platform: .iOS, settings: Settings(buildSettings: ["MACH_O_TYPE": "staticlib"]) @@ -1029,7 +1029,7 @@ class ProjectGeneratorTests: XCTestCase { platform: .iOS ), Target( - name: "StaticFramework2ExplicitlyEmbedded", + name: "StaticFramework2NotEmbedded", type: .staticFramework, platform: .iOS ), @@ -1039,21 +1039,21 @@ class ProjectGeneratorTests: XCTestCase { platform: .iOS ), ] - + let expectedLinkedFiles = Set([ "DynamicFramework.framework", "DynamicFrameworkNotEmbedded.framework", "StaticFramework.framework", - "StaticFrameworkExplicitlyEmbedded.framework", + "StaticFrameworkNotEmbedded.framework", "StaticFramework2.framework", - "StaticFramework2ExplicitlyEmbedded.framework", + "StaticFramework2NotEmbedded.framework", "libStaticLibrary.a", ]) - + let expectedEmbeddedFrameworks = Set([ "DynamicFramework.framework", - "StaticFrameworkExplicitlyEmbedded.framework", - "StaticFramework2ExplicitlyEmbedded.framework" + "StaticFramework.framework", + "StaticFramework2.framework", ]) let project = Project( @@ -1073,7 +1073,7 @@ class ProjectGeneratorTests: XCTestCase { let linkPackages = (frameworkPhases[0].files ?? []).compactMap { $0.product?.productName } try expect(Set(linkFrameworks + linkPackages)) == expectedLinkedFiles - // Ensure only dynamic frameworks are embedded (unless there's an explicit override) + // Ensure all frameworks are embedded (unless there's an explicit override) let embeddedFrameworks = Set((embedFrameworkPhase?.files ?? []).compactMap { $0.file?.nameOrPath }) try expect(embeddedFrameworks) == expectedEmbeddedFrameworks }