Skip to content

Commit 712b40c

Browse files
authored
Merge pull request swiftlang#58 from owenv/print_target_info
Forward -print-target-info to the frontend, begin refactoring planning for simple driver invocations
2 parents 3eafea1 + c14a835 commit 712b40c

File tree

5 files changed

+62
-8
lines changed

5 files changed

+62
-8
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ extension Driver {
553553

554554
/// Run the driver.
555555
public mutating func run(
556+
jobs: [Job],
556557
resolver: ArgsResolver,
557558
executorDelegate: JobExecutorDelegate? = nil,
558559
processSet: ProcessSet? = nil
@@ -567,17 +568,10 @@ extension Driver {
567568
return
568569
}
569570

570-
if parsedOptions.hasArgument(.version) || parsedOptions.hasArgument(.version_) {
571-
// Follow gcc/clang behavior and use stdout for --version and stderr for -v.
572-
try printVersion(outputStream: &stdoutStream)
573-
return
574-
}
575571
if parsedOptions.hasArgument(.v) {
576572
try printVersion(outputStream: &stderrStream)
577573
}
578574

579-
// Plan the build.
580-
let jobs = try planBuild()
581575
if jobs.isEmpty { return }
582576

583577
// If we're only supposed to print the jobs, do so now.

Sources/SwiftDriver/Jobs/Job.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public struct Job: Codable, Equatable {
2727
case interpret
2828
case repl
2929
case verifyDebugInfo = "verify-debug-info"
30+
case printTargetInfo = "print-target-info"
31+
case versionRequest = "version-request"
3032
}
3133

3234
public enum ArgTemplate: Equatable {

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,42 @@ extension Driver {
165165
return jobs
166166
}
167167

168+
/// Create a job if needed for simple requests that can be immediately
169+
/// forwarded to the frontend.
170+
public mutating func immediateForwardingJob() throws -> Job? {
171+
if parsedOptions.hasArgument(.printTargetInfo) {
172+
var commandLine: [Job.ArgTemplate] = [.flag("-frontend"),
173+
.flag("-print-target-info")]
174+
try commandLine.appendLast(.target, from: &parsedOptions)
175+
try commandLine.appendLast(.sdk, from: &parsedOptions)
176+
try commandLine.appendLast(.resourceDir, from: &parsedOptions)
177+
return Job(kind: .printTargetInfo,
178+
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
179+
commandLine: commandLine,
180+
inputs: [],
181+
outputs: [],
182+
requiresInPlaceExecution: true)
183+
}
184+
185+
if parsedOptions.hasArgument(.version) || parsedOptions.hasArgument(.version_) {
186+
return Job(kind: .versionRequest,
187+
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
188+
commandLine: [.flag("--version")],
189+
inputs: [],
190+
outputs: [],
191+
requiresInPlaceExecution: true)
192+
}
193+
194+
return nil
195+
}
196+
168197
/// Plan a build by producing a set of jobs to complete the build.
169198
public mutating func planBuild() throws -> [Job] {
199+
200+
if let job = try immediateForwardingJob() {
201+
return [job]
202+
}
203+
170204
// Plan the build.
171205
switch compilerMode {
172206
case .repl:

Sources/swift-driver/main.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ do {
4141
}
4242

4343
var driver = try Driver(args: arguments, diagnosticsEngine: diagnosticsEngine)
44+
let jobs = try driver.planBuild()
4445
let resolver = try ArgsResolver()
45-
try driver.run(resolver: resolver, processSet: processSet)
46+
try driver.run(jobs: jobs, resolver: resolver, processSet: processSet)
4647

4748
if driver.diagnosticEngine.hasErrors {
4849
exit(EXIT_FAILURE)

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,29 @@ final class SwiftDriverTests: XCTestCase {
12031203
XCTAssertNoThrow(try driver2.toolchain.getToolPath(.dsymutil))
12041204
}
12051205

1206+
func testVersionRequest() throws {
1207+
for arg in ["-version", "--version"] {
1208+
var driver = try Driver(args: ["swift"] + [arg])
1209+
let plannedJobs = try driver.planBuild()
1210+
XCTAssertTrue(plannedJobs.count == 1)
1211+
let job = plannedJobs[0]
1212+
XCTAssertEqual(job.kind, .versionRequest)
1213+
XCTAssertEqual(job.commandLine, [.flag("--version")])
1214+
}
1215+
}
1216+
1217+
func testPrintTargetInfo() throws {
1218+
var driver = try Driver(args: ["swift", "-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"])
1219+
let plannedJobs = try driver.planBuild()
1220+
XCTAssertTrue(plannedJobs.count == 1)
1221+
let job = plannedJobs[0]
1222+
XCTAssertEqual(job.kind, .printTargetInfo)
1223+
XCTAssertTrue(job.commandLine.contains(.flag("-print-target-info")))
1224+
XCTAssertTrue(job.commandLine.contains(.flag("-target")))
1225+
XCTAssertTrue(job.commandLine.contains(.flag("-sdk")))
1226+
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
1227+
}
1228+
12061229
func testPCHGeneration() throws {
12071230
do {
12081231
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "foo.swift"])

0 commit comments

Comments
 (0)