in Sources/SwiftDriver/Jobs/GeneratePCHJob.swift [17:76]
mutating func generatePCHJob(input: TypedVirtualPath, output: TypedVirtualPath) throws -> Job {
var inputs = [TypedVirtualPath]()
var outputs = [TypedVirtualPath]()
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
commandLine.appendFlag("-frontend")
try addCommonFrontendOptions(
commandLine: &commandLine, inputs: &inputs, bridgingHeaderHandling: .parsed)
try commandLine.appendLast(.indexStorePath, from: &parsedOptions)
// TODO: Should this just be pch output with extension changed?
if parsedOptions.hasArgument(.serializeDiagnostics), let outputDirectory = parsedOptions.getLastArgument(.pchOutputDir)?.asSingle {
commandLine.appendFlag(.serializeDiagnosticsPath)
let path: VirtualPath
if let outputPath = outputFileMap?.existingOutput(inputFile: input.fileHandle, outputType: .diagnostics) {
path = VirtualPath.lookup(outputPath)
} else if let modulePath = parsedOptions.getLastArgument(.emitModulePath) {
// TODO: does this hash need to be persistent?
let code = UInt(bitPattern: modulePath.asSingle.hashValue)
let outputName = input.file.basenameWithoutExt + "-" + String(code, radix: 36)
path = try VirtualPath(path: outputDirectory).appending(component: outputName.appendingFileTypeExtension(.diagnostics))
} else {
path =
VirtualPath.createUniqueTemporaryFile(
RelativePath(input.file.basenameWithoutExt.appendingFileTypeExtension(.diagnostics)))
}
commandLine.appendPath(path)
outputs.append(.init(file: path.intern(), type: .diagnostics))
}
inputs.append(input)
commandLine.appendPath(input.file)
try commandLine.appendLast(.indexStorePath, from: &parsedOptions)
commandLine.appendFlag(.emitPch)
if parsedOptions.hasArgument(.pchOutputDir) {
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
} else {
commandLine.appendFlag(.o)
commandLine.appendPath(output.file)
}
outputs.append(output)
return Job(
moduleName: moduleOutputInfo.name,
kind: .generatePCH,
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
commandLine: commandLine,
displayInputs: [],
inputs: inputs,
primaryInputs: [],
outputs: outputs,
supportsResponseFiles: true
)
}