diff --git a/Sources/SwiftDriver/Driver/Driver.swift b/Sources/SwiftDriver/Driver/Driver.swift index 03e8d392e..3c53f36eb 100644 --- a/Sources/SwiftDriver/Driver/Driver.swift +++ b/Sources/SwiftDriver/Driver/Driver.swift @@ -432,6 +432,24 @@ public struct Driver { return supportedFrontendFeatures.contains(feature.rawValue) } + @_spi(Testing) + public static func findBlocklists(RelativeTo execDir: AbsolutePath) throws -> [AbsolutePath] { + // Expect to find all blocklists in such dir: + // .../XcodeDefault.xctoolchain/usr/local/lib/swift/blocklists + var results: [AbsolutePath] = [] + let blockListDir = execDir.parentDirectory + .appending(components: "local", "lib", "swift", "blocklists") + if (localFileSystem.exists(blockListDir)) { + try localFileSystem.getDirectoryContents(blockListDir).forEach { + let currentFile = AbsolutePath(blockListDir, try VirtualPath(path: $0).relativePath!) + if currentFile.extension == "yml" || currentFile.extension == "yaml" { + results.append(currentFile) + } + } + } + return results + } + /// Handler for emitting diagnostics to stderr. public static let stderrDiagnosticsHandler: DiagnosticsEngine.DiagnosticsHandler = { diagnostic in stdErrQueue.sync { diff --git a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift index cc1156fca..4e9b47e5c 100644 --- a/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift +++ b/Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift @@ -269,6 +269,13 @@ extension Driver { commandLine.appendPath(localPluginPath) } + if isFrontendArgSupported(.blockListFile) { + try Driver.findBlocklists(RelativeTo: try toolchain.executableDir).forEach { + commandLine.appendFlag(.blockListFile) + commandLine.appendPath($0) + } + } + // Pass down -user-module-version if we are working with a compiler that // supports it. if let ver = parsedOptions.getLastArgument(.userModuleVersion)?.asSingle, diff --git a/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list1.yml b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list1.yml new file mode 100644 index 000000000..ed97d539c --- /dev/null +++ b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list1.yml @@ -0,0 +1 @@ +--- diff --git a/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list2.yaml b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list2.yaml new file mode 100644 index 000000000..ed97d539c --- /dev/null +++ b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list2.yaml @@ -0,0 +1 @@ +--- diff --git a/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list3.txt b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list3.txt new file mode 100644 index 000000000..ed97d539c --- /dev/null +++ b/TestInputs/Dummy.xctoolchain/usr/local/lib/swift/blocklists/block-list3.txt @@ -0,0 +1 @@ +--- diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index 6e3df061e..eede6b08a 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -6822,6 +6822,13 @@ final class SwiftDriverTests: XCTestCase { #endif } + func testFindingBlockLists() throws { + let execDir = testInputsPath.appending(components: "Dummy.xctoolchain", "usr", "bin") + let list = try Driver.findBlocklists(RelativeTo: execDir) + XCTAssertEqual(list.count, 2) + XCTAssertTrue(list.allSatisfy { $0.extension! == "yml" || $0.extension! == "yaml"}) + } + func testToolSearching() throws { #if os(Windows) let PATH = "Path"