diff --git a/Sources/XcodeGenKit/SpecGenerator.swift b/Sources/XcodeGenKit/SpecGenerator.swift index 343f0113..c01480f6 100644 --- a/Sources/XcodeGenKit/SpecGenerator.swift +++ b/Sources/XcodeGenKit/SpecGenerator.swift @@ -280,20 +280,44 @@ private func generateTargetSpec(target: PBXNativeTarget, mainGroup: PBXGroup, so let frameworks = target.buildPhases .compactMap { $0 as? PBXFrameworksBuildPhase } - .compactMap { $0.files?.compactMap { $0.file } } + .compactMap { $0.files } .reduce([], { $0 + $1 }) - let dependencies: [Dependency] = frameworks.compactMap { fileElement in - guard let path = fileElement.path else { + let targetDependencies: [Dependency] = target.dependencies.compactMap { + guard let name = $0.target?.name else { return nil } - if let sourceTree = fileElement.sourceTree, sourceTree == .sdkRoot { - return Dependency(type: .sdk(root: Path(path).parent().string), - reference: fileElement.name ?? Path(path).lastComponent) + return Dependency(type: .target, reference: name) + } + + let targetDependencyProductNames = target.dependencies.compactMap { $0.target?.productNameWithExtension() } + + let frameworkDependencies: [Dependency] = frameworks.compactMap { file in + guard let fileElement = file.file, + let path = fileElement.path else { + return nil + } + if let sourceTree = fileElement.sourceTree { + switch sourceTree { + case .sdkRoot: + return Dependency(type: .sdk(root: Path(path).parent().string), + reference: fileElement.name ?? Path(path).lastComponent) + case .buildProductsDir: + let file = Path(path).lastComponent + if targetDependencyProductNames.contains(file) { + return nil // skip target dependency + } + return Dependency(type: .target, + reference: file) + default: + break + } } return Dependency(type: .framework, reference: path) } + let dependencies = targetDependencies + frameworkDependencies + let targetSources = sources + headers + implicitHeaders + resources let buildScripts = target.buildPhases diff --git a/Tests/XcodeGenKitTests/SpecGeneratorTests.swift b/Tests/XcodeGenKitTests/SpecGeneratorTests.swift index d3abc5c5..bf03cf43 100644 --- a/Tests/XcodeGenKitTests/SpecGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SpecGeneratorTests.swift @@ -1,5 +1,9 @@ import XCTest import XcodeGenKit +import TestSupport +import XcodeProj +import PathKit +import Yams class SpecGeneratorTests: XCTestCase { func testRemoveEmpty() { @@ -12,4 +16,15 @@ class SpecGeneratorTests: XCTestCase { let removed3: [String: Any] = dict.compactMapValues { $0 } XCTAssertEqual(removed3.count, 0) } + + func testMigrateDependencies() throws { + let file = fixturePath + "MigrationTestProject/MigrationTestProject.xcodeproj" + let xcodeProj = try XcodeProj(path: file) + let project = try generateSpec(xcodeProj: xcodeProj, projectDirectory: file.parent())! + let target = project.targets.first { $0.name == "MigrationTestProject" }! + XCTAssertEqual(target.dependencies[0].reference, "ExampleFramework") + XCTAssertEqual(target.dependencies[0].type, .target) + XCTAssertEqual(target.dependencies[1].reference, "AVKit.framework") + XCTAssertEqual(target.dependencies[1].type, .sdk(root: "System/Library/Frameworks")) + } }