Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 13 additions & 14 deletions Sources/ProjectSpec/XCProjExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
}
Expand Down
26 changes: 13 additions & 13 deletions Tests/XcodeGenKitTests/ProjectGeneratorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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"),
]
)
Expand All @@ -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"])
Expand All @@ -1029,7 +1029,7 @@ class ProjectGeneratorTests: XCTestCase {
platform: .iOS
),
Target(
name: "StaticFramework2ExplicitlyEmbedded",
name: "StaticFramework2NotEmbedded",
type: .staticFramework,
platform: .iOS
),
Expand All @@ -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(
Expand All @@ -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
}
Expand Down