Skip to content

Commit a3364a1

Browse files
authored
Merge pull request #911 from artemcm/SwiftScanTargetInfoQuery
Add `-print-target-info` libSwiftScan entry-points
2 parents 26895b4 + a75dcae commit a3364a1

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ typedef struct {
193193
void
194194
(*swiftscan_scan_invocation_dispose)(swiftscan_scan_invocation_t);
195195

196+
//=== Target Info Functions-------- ---------------------------------------===//
197+
swiftscan_string_ref_t
198+
(*swiftscan_compiler_target_info_query)(swiftscan_scan_invocation_t);
199+
196200
//=== Functionality Query Functions ---------------------------------------===//
197201
swiftscan_string_set_t *
198202
(*swiftscan_compiler_supported_arguments_query)(void);

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public enum DependencyScanningError: Error, DiagnosticData {
5656
}
5757

5858
/// Wrapper for libSwiftScan, taking care of initialization, shutdown, and dispatching dependency scanning queries.
59-
internal final class SwiftScan {
59+
@_spi(Testing) public final class SwiftScan {
6060
/// The path to the libSwiftScan dylib.
6161
let path: AbsolutePath
6262

@@ -251,6 +251,26 @@ internal final class SwiftScan {
251251
throw DependencyScanningError.argumentQueryFailed
252252
}
253253
}
254+
255+
@_spi(Testing) public func canQueryTargetInfo() -> Bool {
256+
return api.swiftscan_compiler_target_info_query != nil &&
257+
api.swiftscan_string_set_dispose != nil
258+
}
259+
260+
@_spi(Testing) public func queryTargetInfo(invocationCommand: [String])
261+
throws -> FrontendTargetInfo {
262+
// Create and configure the scanner invocation
263+
let invocation = api.swiftscan_scan_invocation_create()
264+
defer { api.swiftscan_scan_invocation_dispose(invocation) }
265+
withArrayOfCStrings(invocationCommand) { invocationStringArray in
266+
api.swiftscan_scan_invocation_set_argv(invocation,
267+
Int32(invocationCommand.count),
268+
invocationStringArray)
269+
}
270+
let targetInfoString = try toSwiftString(api.swiftscan_compiler_target_info_query(invocation))
271+
let targetInfoData = Data(targetInfoString.utf8)
272+
return try JSONDecoder().decode(FrontendTargetInfo.self, from: targetInfoData)
273+
}
254274
}
255275

256276
// Used for testing purposes only
@@ -290,6 +310,10 @@ private extension swiftscan_functions_t {
290310
self.swiftscan_compiler_supported_features_query =
291311
try loadOptional("swiftscan_compiler_supported_features_query")
292312

313+
// Target Info query
314+
self.swiftscan_compiler_target_info_query =
315+
try loadOptional("swiftscan_compiler_target_info_query")
316+
293317
// Dependency scanner serialization/deserialization features
294318
self.swiftscan_scanner_cache_serialize =
295319
try loadOptional("swiftscan_scanner_cache_serialize")

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4546,7 +4546,7 @@ final class SwiftDriverTests: XCTestCase {
45464546

45474547
func testPrintTargetInfo() throws {
45484548
do {
4549-
var driver = try Driver(args: ["swift", "-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"])
4549+
var driver = try Driver(args: ["swift", "-print-target-info", "-sdk", "bar", "-resource-dir", "baz"])
45504550
let plannedJobs = try driver.planBuild()
45514551
XCTAssertTrue(plannedJobs.count == 1)
45524552
let job = plannedJobs[0]
@@ -4557,6 +4557,22 @@ final class SwiftDriverTests: XCTestCase {
45574557
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
45584558
}
45594559

4560+
do {
4561+
let targetInfoArgs = ["-print-target-info", "-sdk", "bar", "-resource-dir", "baz"]
4562+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
4563+
4564+
let env = ProcessEnv.vars
4565+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
4566+
hostTriple: driver.hostTriple,
4567+
env: env)
4568+
if localFileSystem.exists(swiftScanLibPath) {
4569+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
4570+
if libSwiftScanInstance.canQueryTargetInfo() {
4571+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
4572+
}
4573+
}
4574+
}
4575+
45604576
do {
45614577
struct MockExecutor: DriverExecutor {
45624578
let resolver: ArgsResolver

0 commit comments

Comments
 (0)