From 5b172f59c05ad8d1e1e18c0c9c4d0bcffa3ec7e2 Mon Sep 17 00:00:00 2001 From: Roland Heusser Date: Wed, 7 Sep 2022 08:48:03 -0700 Subject: [PATCH 1/5] enable aggregate targets to have project external targets --- Sources/ProjectSpec/SpecValidation.swift | 3 +- Sources/XcodeGenKit/PBXProjGenerator.swift | 31 ++++++++++++++++++- .../paths_test/included_paths_test.yml | 1 + Tests/ProjectSpecTests/SpecLoadingTests.swift | 2 +- .../ProjectGeneratorTests.swift | 19 +++++++++--- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Sources/ProjectSpec/SpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift index 376c0153f..1376aa724 100644 --- a/Sources/ProjectSpec/SpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -147,7 +147,8 @@ extension Project { for target in aggregateTargets { for dependency in target.targets { - if getProjectTarget(dependency) == nil { + if getProjectTarget(dependency) == nil, let projectName = dependency.components(separatedBy: "/").first, + (getPackage(projectName) == nil && getProjectReference(projectName) == nil) { errors.append(.invalidTargetDependency(target: target.name, dependency: dependency)) } } diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 60ebdfca3..b501672bc 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -336,7 +336,36 @@ public class PBXProjGenerator { return addObject(buildConfig) } - let dependencies = target.targets.map { generateTargetDependency(from: target.name, to: $0, platform: nil) } + let dependencies = target.targets.map { + let dependency = $0 + if dependency.contains("/") + , let tokens: [String] = dependency.components(separatedBy: "/") + , tokens.count == 2 + , let projectName: String = tokens[0] + , let targetName: String = tokens[1] { + + + if let packageReference = packageReferences[dependency] { + let productName = targetName + let packageDependency = addObject( + XCSwiftPackageProductDependency(productName: productName, package: packageReference) + ) + + let targetDependency = addObject( + //platformFilter: platform, + PBXTargetDependency( product: packageDependency) + ) + return targetDependency + } + + do { + return try generateExternalTargetDependency(from: target.name, to: targetName, in: projectName, platform: .iOS).0 + } catch { + print("Error: \(error)") + } + } + return generateTargetDependency(from: target.name, to: $0, platform: nil) + } let defaultConfigurationName = project.options.defaultConfig ?? project.configs.first?.name ?? "" let buildConfigList = addObject(XCConfigurationList( diff --git a/Tests/Fixtures/paths_test/included_paths_test.yml b/Tests/Fixtures/paths_test/included_paths_test.yml index f40bf5aed..4606b7063 100644 --- a/Tests/Fixtures/paths_test/included_paths_test.yml +++ b/Tests/Fixtures/paths_test/included_paths_test.yml @@ -32,6 +32,7 @@ aggregateTargets: IncludedAggregateTarget: targets: - IncludedTarget + - AnotherProject/ExternalTarget configFiles: Config: config buildScripts: diff --git a/Tests/ProjectSpecTests/SpecLoadingTests.swift b/Tests/ProjectSpecTests/SpecLoadingTests.swift index 0c9c96657..68ff5ef19 100644 --- a/Tests/ProjectSpecTests/SpecLoadingTests.swift +++ b/Tests/ProjectSpecTests/SpecLoadingTests.swift @@ -97,7 +97,7 @@ class SpecLoadingTests: XCTestCase { try expect(project.aggregateTargets) == [ AggregateTarget( name: "IncludedAggregateTarget", - targets: ["IncludedTarget"], + targets: ["IncludedTarget", "ProjX/TestFramework"], configFiles: ["Config": "paths_test/config"], buildScripts: [BuildScript(script: .path("paths_test/buildScript"))] ), diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 4ed5ae082..72fa201d4 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -243,12 +243,21 @@ class ProjectGeneratorTests: XCTestCase { func testAggregateTargets() { describe { - + let externalProjectPath = fixturePath + "TestProject/AnotherProject/AnotherProject.xcodeproj" + let projectReference1 = ProjectReference(name: "AnotherProject", path: externalProjectPath.string) + + var target = app + target.dependencies = [ + Dependency(type: .target, reference: "AnotherProject/ExternalTarget") + ] + let otherTarget = Target(name: "Other", type: .framework, platform: .iOS, dependencies: [Dependency(type: .target, reference: "AggregateTarget")]) let otherTarget2 = Target(name: "Other2", type: .framework, platform: .iOS, dependencies: [Dependency(type: .target, reference: "Other")], transitivelyLinkDependencies: true) - let aggregateTarget = AggregateTarget(name: "AggregateTarget", targets: ["MyApp", "MyFramework"]) + let aggregateTarget = AggregateTarget(name: "AggregateTarget", targets: ["MyApp", "MyFramework", "AnotherProject/ExternalTarget"]) let aggregateTarget2 = AggregateTarget(name: "AggregateTarget2", targets: ["AggregateTarget"]) - let project = Project(name: "test", targets: [app, framework, otherTarget, otherTarget2], aggregateTargets: [aggregateTarget, aggregateTarget2]) + + let project = Project(name: "test", targets: [target, framework, otherTarget, otherTarget2], aggregateTargets: [aggregateTarget, aggregateTarget2], projectReferences: [projectReference1]) + $0.it("generates aggregate targets") { let pbxProject = try project.generatePbxProj() @@ -259,7 +268,7 @@ class ProjectGeneratorTests: XCTestCase { try expect(aggregateTargets.count) == 2 let aggregateTarget1 = aggregateTargets.first { $0.name == "AggregateTarget" } - try expect(aggregateTarget1?.dependencies.count) == 2 + try expect(aggregateTarget1?.dependencies.count) == 3 let aggregateTarget2 = aggregateTargets.first { $0.name == "AggregateTarget2" } try expect(aggregateTarget2?.dependencies.count) == 1 @@ -270,7 +279,7 @@ class ProjectGeneratorTests: XCTestCase { let target2 = nativeTargets.first { $0.name == "Other2" } try expect(target2?.dependencies.count) == 2 - try expect(pbxProject.targetDependencies.count) == 7 + try expect(pbxProject.targetDependencies.count) == 8 } } } From a43e8e08018d2467d7d61298efa0097046aa0e3f Mon Sep 17 00:00:00 2001 From: Roland Heusser Date: Wed, 7 Sep 2022 14:23:04 -0700 Subject: [PATCH 2/5] check whether SPM package is part of the project dependencies --- Sources/XcodeGenKit/PBXProjGenerator.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index b501672bc..ed6dc197c 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -344,15 +344,13 @@ public class PBXProjGenerator { , let projectName: String = tokens[0] , let targetName: String = tokens[1] { - - if let packageReference = packageReferences[dependency] { + if nil != project.packages[projectName] { let productName = targetName let packageDependency = addObject( - XCSwiftPackageProductDependency(productName: productName, package: packageReference) + XCSwiftPackageProductDependency(productName: productName) ) let targetDependency = addObject( - //platformFilter: platform, PBXTargetDependency( product: packageDependency) ) return targetDependency From 8546c3374f29815bc607a20af1381f5d3b46d600 Mon Sep 17 00:00:00 2001 From: Roland Heusser Date: Wed, 7 Sep 2022 15:32:18 -0700 Subject: [PATCH 3/5] fix test case --- Tests/ProjectSpecTests/SpecLoadingTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/ProjectSpecTests/SpecLoadingTests.swift b/Tests/ProjectSpecTests/SpecLoadingTests.swift index 68ff5ef19..380f842f7 100644 --- a/Tests/ProjectSpecTests/SpecLoadingTests.swift +++ b/Tests/ProjectSpecTests/SpecLoadingTests.swift @@ -97,7 +97,7 @@ class SpecLoadingTests: XCTestCase { try expect(project.aggregateTargets) == [ AggregateTarget( name: "IncludedAggregateTarget", - targets: ["IncludedTarget", "ProjX/TestFramework"], + targets: ["IncludedTarget", "AnotherProject/ExternalTarget"], configFiles: ["Config": "paths_test/config"], buildScripts: [BuildScript(script: .path("paths_test/buildScript"))] ), From d239b355c6b79c9d176efd25d51255fd76838107 Mon Sep 17 00:00:00 2001 From: Roland Heusser Date: Wed, 7 Sep 2022 15:32:30 -0700 Subject: [PATCH 4/5] make type explicit --- Sources/XcodeGenKit/PBXProjGenerator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index ed6dc197c..4bd649c03 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -336,7 +336,7 @@ public class PBXProjGenerator { return addObject(buildConfig) } - let dependencies = target.targets.map { + let dependencies: [PBXTargetDependency] = target.targets.map { let dependency = $0 if dependency.contains("/") , let tokens: [String] = dependency.components(separatedBy: "/") From e8c7b8d0810fda4e39502b073955710188ec8cb4 Mon Sep 17 00:00:00 2001 From: Roland Heusser Date: Fri, 9 Sep 2022 10:26:13 -0700 Subject: [PATCH 5/5] fix warnings --- Sources/XcodeGenKit/PBXProjGenerator.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4bd649c03..927ddbfc0 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -338,11 +338,10 @@ public class PBXProjGenerator { let dependencies: [PBXTargetDependency] = target.targets.map { let dependency = $0 - if dependency.contains("/") - , let tokens: [String] = dependency.components(separatedBy: "/") - , tokens.count == 2 - , let projectName: String = tokens[0] - , let targetName: String = tokens[1] { + if dependency.contains("/") && dependency.components(separatedBy: "/").count == 2 { + let tokens: [String] = dependency.components(separatedBy: "/") + let projectName: String = tokens[0] + let targetName: String = tokens[1] if nil != project.packages[projectName] { let productName = targetName