From 458ba9de89ab4e9b99dc2ad1235a93c006a04820 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Thu, 29 Aug 2019 03:52:27 +0900 Subject: [PATCH] Allow to link dylib into static library only when 'link' is true (#635) * Allow to link dylib into static library only when 'link' is true * Add test case to proof that links only when true * Update CHANGELOG.md --- CHANGELOG.md | 3 ++ Sources/XcodeGenKit/PBXProjGenerator.swift | 12 ++----- .../ProjectGeneratorTests.swift | 33 ++++++++++++++++--- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86e4a03c..4654d53f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ - Fixed included specs that were referenced multiple times from duplicating content [#599](https://github.com/yonaskolb/XcodeGen/pull/599) @haritowa - Fixed `.orig` files being added to the project [#627](https://github.com/yonaskolb/XcodeGen/pull/627) @keith +#### Changed +- Changed to link dylib into static library only when `link` is true [#635](https://github.com/yonaskolb/XcodeGen/pull/635) @kateinoigakukun + ## 2.6.0 #### Added diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4af316cb..6b580e08 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -504,9 +504,6 @@ public class PBXProjGenerator { let buildPath = Path(dependency.reference).parent().string.quoted frameworkBuildPaths.insert(buildPath) - // Static libraries can't link or embed dynamic frameworks - guard target.type != .staticLibrary else { break } - let fileReference: PBXFileElement if dependency.implicit { fileReference = sourceGenerator.getFileReference( @@ -521,7 +518,7 @@ public class PBXProjGenerator { ) } - if dependency.link ?? true { + if dependency.link ?? (target.type != .staticLibrary) { let buildFile = addObject( PBXBuildFile(file: fileReference, settings: getDependencyFrameworkSettings(dependency: dependency)) ) @@ -540,8 +537,6 @@ public class PBXProjGenerator { copyFrameworksReferences.append(embedFile) } case .sdk(let root): - // Static libraries can't link or embed dynamic frameworks - guard target.type != .staticLibrary else { break } var dependencyPath = Path(dependency.reference) if !dependency.reference.contains("/") { @@ -589,8 +584,6 @@ public class PBXProjGenerator { let allDependencies = findFrameworks ? carthageResolver.relatedDependencies(for: dependency, in: target.platform) : [dependency] allDependencies.forEach { dependency in - // Static libraries can't link or embed dynamic frameworks - guard target.type != .staticLibrary else { return } var platformPath = Path(carthageResolver.buildPath(for: target.platform)) var frameworkPath = platformPath + dependency.reference @@ -601,7 +594,7 @@ public class PBXProjGenerator { self.carthageFrameworksByPlatform[target.platform.carthageName, default: []].insert(fileReference) - if dependency.link ?? true { + if dependency.link ?? (target.type != .staticLibrary) { let buildFile = self.addObject( PBXBuildFile(file: fileReference, settings: getDependencyFrameworkSettings(dependency: dependency)) ) @@ -613,7 +606,6 @@ public class PBXProjGenerator { } for dependency in carthageDependencies { - guard target.type != .staticLibrary else { break } let embed = dependency.embed ?? target.shouldEmbedCarthageDependencies diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 60dfda7c..3e3be70b 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -339,6 +339,8 @@ class ProjectGeneratorTests: XCTestCase { // embed: false // iOSFrameworkZ: // dependencies: [] + // iOSFrameworkX: + // dependencies: [] // StaticLibrary: // dependencies: // - target: iOSFrameworkZ @@ -430,18 +432,33 @@ class ProjectGeneratorTests: XCTestCase { expectedLinkedFiles[iosFrameworkZ.name] = Set() expectedEmbeddedFrameworks[iosFrameworkZ.name] = Set() + let iosFrameworkX = Target( + name: "iOSFrameworkX", + type: .framework, + platform: .iOS, + dependencies: [] + ) + expectedResourceFiles[iosFrameworkX.name] = Set() + expectedLinkedFiles[iosFrameworkX.name] = Set() + expectedEmbeddedFrameworks[iosFrameworkX.name] = Set() + let staticLibrary = Target( name: "StaticLibrary", type: .staticLibrary, platform: .iOS, dependencies: [ - Dependency(type: .target, reference: iosFrameworkZ.name), - Dependency(type: .framework, reference: "FrameworkZ.framework"), + Dependency(type: .target, reference: iosFrameworkZ.name, link: true), + Dependency(type: .framework, reference: "FrameworkZ.framework", link: true), + Dependency(type: .target, reference: iosFrameworkX.name/*, link: false */), + Dependency(type: .framework, reference: "FrameworkX.framework"/*, link: false */), Dependency(type: .carthage(findFrameworks: false), reference: "CarthageZ"), ] ) expectedResourceFiles[staticLibrary.name] = Set() - expectedLinkedFiles[staticLibrary.name] = Set([]) + expectedLinkedFiles[staticLibrary.name] = Set([ + iosFrameworkZ.filename, + "FrameworkZ.framework", + ]) expectedEmbeddedFrameworks[staticLibrary.name] = Set() let resourceBundle = Target( @@ -471,7 +488,9 @@ class ProjectGeneratorTests: XCTestCase { expectedLinkedFiles[iosFrameworkA.name] = Set([ "FrameworkC.framework", iosFrameworkZ.filename, + iosFrameworkX.filename, "FrameworkZ.framework", + "FrameworkX.framework", "CarthageZ.framework", "CarthageA.framework", "CarthageB.framework", @@ -496,7 +515,9 @@ class ProjectGeneratorTests: XCTestCase { expectedLinkedFiles[iosFrameworkB.name] = Set([ iosFrameworkA.filename, iosFrameworkZ.filename, + iosFrameworkX.filename, "FrameworkZ.framework", + "FrameworkX.framework", "CarthageZ.framework", "FrameworkC.framework", "FrameworkD.framework", @@ -528,7 +549,9 @@ class ProjectGeneratorTests: XCTestCase { iosFrameworkA.filename, staticLibrary.filename, iosFrameworkZ.filename, + iosFrameworkX.filename, "FrameworkZ.framework", + "FrameworkX.framework", "CarthageZ.framework", "FrameworkC.framework", iosFrameworkB.filename, @@ -539,7 +562,9 @@ class ProjectGeneratorTests: XCTestCase { expectedEmbeddedFrameworks[appTest.name] = Set([ iosFrameworkA.filename, iosFrameworkZ.filename, + iosFrameworkX.filename, "FrameworkZ.framework", + "FrameworkX.framework", "FrameworkC.framework", iosFrameworkB.filename, "FrameworkD.framework", @@ -572,7 +597,7 @@ class ProjectGeneratorTests: XCTestCase { "NotificationCenter.framework", ]) - let targets = [app, iosFrameworkZ, staticLibrary, resourceBundle, iosFrameworkA, iosFrameworkB, appTest, appTestWithoutTransitive, stickerPack] + let targets = [app, iosFrameworkZ, iosFrameworkX, staticLibrary, resourceBundle, iosFrameworkA, iosFrameworkB, appTest, appTestWithoutTransitive, stickerPack] let project = Project( name: "test",