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
|
//===-------- DriverExtensions.swift - Driver Testing Extensions ----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
@_spi(Testing) import SwiftDriver
import SwiftDriverExecution
import TSCBasic
import protocol Foundation.LocalizedError
import var Foundation.EXIT_SUCCESS
extension Driver {
/// Initializer which creates an executor suitable for use in tests.
public init(
args: [String],
env: [String: String] = ProcessEnv.vars,
diagnosticsEngine: DiagnosticsEngine = DiagnosticsEngine(handlers: [Driver.stderrDiagnosticsHandler]),
fileSystem: FileSystem = localFileSystem,
integratedDriver: Bool = true,
interModuleDependencyOracle: InterModuleDependencyOracle? = nil
) throws {
let executor = try SwiftDriverExecutor(diagnosticsEngine: diagnosticsEngine,
processSet: ProcessSet(),
fileSystem: fileSystem,
env: env)
try self.init(args: args,
env: env,
diagnosticsOutput: .engine(diagnosticsEngine),
fileSystem: fileSystem,
executor: executor,
integratedDriver: integratedDriver,
interModuleDependencyOracle: interModuleDependencyOracle)
}
/// For tests that need to set the sdk path.
/// Only works on hosts with `xcrun`, so return nil if cannot work on current host.
public static func sdkArgumentsForTesting() throws -> [String]? {
try cachedSDKPath.map {["-sdk", try $0.get()]}
}
public func verifyBeingAbleToQueryTargetInfoInProcess(workingDirectory: AbsolutePath?,
invocationCommand: [String],
expectedSDKPath: String) throws -> Bool {
guard let targetInfo = try Self.queryTargetInfoInProcess(of: toolchain,
fileSystem: fileSystem,
workingDirectory: workingDirectory,
invocationCommand: invocationCommand) else {
return false
}
guard let sdkPath = targetInfo.sdkPath else {
return false
}
if sdkPath.path.description != expectedSDKPath {
return false
}
return true
}
}
/// Set to nil if cannot perform on this host
private let cachedSDKPath: Result<String, Error>? = {
#if os(Windows)
if let sdk = ProcessEnv.vars["SDKROOT"] {
return Result{sdk}
}
// Assume that if neither of the environment variables are set, we are
// using a build-tree version of the swift frontend, and so we do not set
// `-sdk`.
return nil
#elseif os(macOS)
return Result {
if let pathFromEnv = ProcessEnv.vars["SDKROOT"] {
return pathFromEnv
}
let process = Process(arguments: ["xcrun", "-sdk", "macosx", "--show-sdk-path"])
try process.launch()
let result = try process.waitUntilExit()
guard result.exitStatus == .terminated(code: EXIT_SUCCESS) else {
enum XCRunFailure: LocalizedError {
case xcrunFailure
}
throw XCRunFailure.xcrunFailure
}
guard let path = String(bytes: try result.output.get(), encoding: .utf8)
else {
enum Error: LocalizedError {
case couldNotUnwrapSDKPath
}
throw Error.couldNotUnwrapSDKPath
}
return path.spm_chomp()
}
#else
return nil
#endif
}()
|