add aggregate targets

This commit is contained in:
Yonas Kolb
2018-07-24 22:05:29 +10:00
parent 31c3f1de0f
commit 3b17164bbf
13 changed files with 491 additions and 155 deletions
+90 -43
View File
@@ -150,6 +150,7 @@ public class PBXProjGenerator {
}
try project.targets.forEach(generateTarget)
try project.aggregateTargets.forEach(generateAggregateTarget)
let productGroup = createObject(
id: "Products",
@@ -218,6 +219,92 @@ public class PBXProjGenerator {
return pbxProj
}
func generateAggregateTarget(_ target: AggregateTarget) throws {
let configs: [ObjectReference<XCBuildConfiguration>] = project.configs.map { config in
let buildSettings = project.getBuildSettings(settings: target.settings, config: config)
var baseConfigurationReference: String?
if let configPath = target.configFiles[config.name] {
baseConfigurationReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath)
}
let buildConfig = XCBuildConfiguration(
name: config.name,
baseConfigurationReference: baseConfigurationReference,
buildSettings: buildSettings
)
return createObject(id: config.name + target.name, buildConfig)
}
let dependencies: [String] = target.targets.map { generateTargetDependency(from: target.name, to: $0).reference }
let buildConfigList = createObject(id: target.name, XCConfigurationList(
buildConfigurations: configs.map { $0.reference },
defaultConfigurationName: ""
))
var buildPhases: [String] = []
buildPhases += try target.buildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
let aggregateTarget = PBXAggregateTarget(name: target.name,
buildConfigurationList:
buildConfigList.reference,
buildPhases: buildPhases,
buildRules: [],
dependencies: dependencies,
productName: target.name,
productReference: nil,
productType: nil
)
_ = addObject(id: target.name, aggregateTarget)
}
func generateTargetDependency(from: String, to target: String) -> ObjectReference<PBXTargetDependency> {
let targetProxy = createObject(
id: "\(from)-\(target)",
PBXContainerItemProxy(
containerPortal: pbxProj.rootObject,
remoteGlobalIDString: targetObjects[target]!.reference,
proxyType: .nativeTarget,
remoteInfo: target
)
)
let targetDependency = createObject(
id: "\(from)-\(target)",
PBXTargetDependency(
target: targetObjects[target]!.reference,
targetProxy: targetProxy.reference
)
)
return targetDependency
}
func generateBuildScript(targetName: String, buildScript: BuildScript) throws -> String {
let shellScript: String
switch buildScript.script {
case let .path(path):
shellScript = try (project.basePath + path).read()
case let .script(script):
shellScript = script
}
let shellScriptPhase = PBXShellScriptBuildPhase(
files: [],
name: buildScript.name ?? "Run Script",
inputPaths: buildScript.inputFiles,
outputPaths: buildScript.outputFiles,
shellPath: buildScript.shell ?? "/bin/sh",
shellScript: shellScript
)
shellScriptPhase.runOnlyForDeploymentPostprocessing = buildScript.runOnlyWhenInstalling
shellScriptPhase.showEnvVarsInLog = buildScript.showEnvVars
return createObject(id: String(describing: buildScript.name) + shellScript + targetName, shellScriptPhase).reference
}
func generateTargetAttributes() -> [String: Any]? {
var targetAttributes: [String: [String: Any]] = [:]
@@ -415,23 +502,7 @@ public class PBXProjGenerator {
guard let dependencyTarget = project.getTarget(dependencyTargetName) else { continue }
let dependencyFileReference = targetFileReferences[dependencyTargetName]!
let targetProxy = createObject(
id: "\(target.name)-\(dependency.reference)",
PBXContainerItemProxy(
containerPortal: pbxProj.rootObject,
remoteGlobalIDString: targetObjects[dependencyTargetName]!.reference,
proxyType: .nativeTarget,
remoteInfo: dependencyTargetName
)
)
let targetDependency = createObject(
id: dependencyTargetName + target.name,
PBXTargetDependency(
target: targetObjects[dependencyTargetName]!.reference,
targetProxy: targetProxy.reference
)
)
let targetDependency = generateTargetDependency(from: target.name, to: dependencyTargetName)
dependencies.append(targetDependency.reference)
@@ -549,31 +620,7 @@ public class PBXProjGenerator {
.map { $0.reference }
}
func generateBuildScript(buildScript: BuildScript) throws {
let shellScript: String
switch buildScript.script {
case let .path(path):
shellScript = try (project.basePath + path).read()
case let .script(script):
shellScript = script
}
let shellScriptPhase = PBXShellScriptBuildPhase(
files: [],
name: buildScript.name ?? "Run Script",
inputPaths: buildScript.inputFiles,
outputPaths: buildScript.outputFiles,
shellPath: buildScript.shell ?? "/bin/sh",
shellScript: shellScript
)
shellScriptPhase.runOnlyForDeploymentPostprocessing = buildScript.runOnlyWhenInstalling
shellScriptPhase.showEnvVarsInLog = buildScript.showEnvVars
let shellScriptPhaseReference = createObject(id: String(describing: buildScript.name) + shellScript + target.name, shellScriptPhase)
buildPhases.append(shellScriptPhaseReference.reference)
}
try target.prebuildScripts.forEach(generateBuildScript)
buildPhases += try target.prebuildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
let sourcesBuildPhaseFiles = getBuildFilesForPhase(.sources)
let sourcesBuildPhase = createObject(id: target.name, PBXSourcesBuildPhase(files: sourcesBuildPhaseFiles))
@@ -687,7 +734,7 @@ public class PBXProjGenerator {
).reference
}
try target.postbuildScripts.forEach(generateBuildScript)
buildPhases += try target.postbuildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) }
let targetObject = targetObjects[target.name]!.object