-
-
Notifications
You must be signed in to change notification settings - Fork 506
/
TargetGenerator.swift
126 lines (111 loc) · 5.66 KB
/
TargetGenerator.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import Basic
import Foundation
import TuistCore
import XcodeProj
protocol TargetGenerating: AnyObject {
func generateTarget(target: Target,
pbxproj: PBXProj,
pbxProject: PBXProject,
projectSettings: Settings,
fileElements: ProjectFileElements,
path: AbsolutePath,
sourceRootPath: AbsolutePath,
graph: Graphing,
system: Systeming) throws -> PBXNativeTarget
func generateTargetDependencies(path: AbsolutePath,
targets: [Target],
nativeTargets: [String: PBXNativeTarget],
graph: Graphing) throws
}
final class TargetGenerator: TargetGenerating {
// MARK: - Attributes
let configGenerator: ConfigGenerating
let buildPhaseGenerator: BuildPhaseGenerating
let linkGenerator: LinkGenerating
let fileGenerator: FileGenerating
// MARK: - Init
init(configGenerator: ConfigGenerating = ConfigGenerator(),
fileGenerator: FileGenerating = FileGenerator(),
buildPhaseGenerator: BuildPhaseGenerating = BuildPhaseGenerator(),
linkGenerator: LinkGenerating = LinkGenerator()) {
self.configGenerator = configGenerator
self.fileGenerator = fileGenerator
self.buildPhaseGenerator = buildPhaseGenerator
self.linkGenerator = linkGenerator
}
// MARK: - TargetGenerating
func generateTarget(target: Target,
pbxproj: PBXProj,
pbxProject: PBXProject,
projectSettings: Settings,
fileElements: ProjectFileElements,
path: AbsolutePath,
sourceRootPath: AbsolutePath,
graph: Graphing,
system: Systeming = System()) throws -> PBXNativeTarget {
/// Products reference.
let productFileReference = fileElements.products[target.name]!
/// Target
let pbxTarget = PBXNativeTarget(name: target.name,
buildConfigurationList: nil,
buildPhases: [],
buildRules: [],
dependencies: [],
productInstallPath: nil,
productName: target.productName,
product: productFileReference,
productType: target.product.xcodeValue)
pbxproj.add(object: pbxTarget)
pbxProject.targets.append(pbxTarget)
/// Pre actions
try buildPhaseGenerator.generateActions(actions: target.actions.preActions,
pbxTarget: pbxTarget,
pbxproj: pbxproj,
sourceRootPath: sourceRootPath)
/// Build configuration
try configGenerator.generateTargetConfig(target,
pbxTarget: pbxTarget,
pbxproj: pbxproj,
projectSettings: projectSettings,
fileElements: fileElements,
graph: graph,
sourceRootPath: sourceRootPath)
/// Build phases
try buildPhaseGenerator.generateBuildPhases(path: path,
target: target,
graph: graph,
pbxTarget: pbxTarget,
fileElements: fileElements,
pbxproj: pbxproj,
sourceRootPath: sourceRootPath)
/// Links
try linkGenerator.generateLinks(target: target,
pbxTarget: pbxTarget,
pbxproj: pbxproj,
pbxProject: pbxProject,
fileElements: fileElements,
path: path,
sourceRootPath: sourceRootPath,
graph: graph,
system: system)
/// Post actions
try buildPhaseGenerator.generateActions(actions: target.actions.postActions,
pbxTarget: pbxTarget,
pbxproj: pbxproj,
sourceRootPath: sourceRootPath)
return pbxTarget
}
func generateTargetDependencies(path: AbsolutePath,
targets: [Target],
nativeTargets: [String: PBXNativeTarget],
graph: Graphing) throws {
try targets.forEach { targetSpec in
let dependencies = graph.targetDependencies(path: path, name: targetSpec.name)
try dependencies.forEach { dependency in
let target = nativeTargets[targetSpec.name]!
let dependency = nativeTargets[dependency.target.name]!
_ = try target.addDependency(target: dependency)
}
}
}
}