diff --git a/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift b/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift index ae7122823..bbe6ba00e 100644 --- a/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift +++ b/Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift @@ -261,6 +261,11 @@ extension Driver { commandLine.appendFlag(.Fsystem) commandLine.append(.path(iosMacFrameworksSearchPath)) } + // Use the specified module cache dir + if let mcp = parsedOptions.getLastArgument(.moduleCachePath)?.asSingle { + commandLine.appendFlag(.moduleCachePath) + commandLine.append(.path(try VirtualPath(path: mcp))) + } commandLine.appendFlag(.serializeParseableModuleInterfaceDependencyHashes) return Job( moduleName: moduleName, diff --git a/Sources/swift-build-sdk-interfaces/main.swift b/Sources/swift-build-sdk-interfaces/main.swift index 5fc343645..f17c083bc 100644 --- a/Sources/swift-build-sdk-interfaces/main.swift +++ b/Sources/swift-build-sdk-interfaces/main.swift @@ -22,14 +22,17 @@ guard let sdkPathRaw = ProcessEnv.vars["SDKROOT"] else { exit(1) } -var rawOutputDir = "" -if let oid = CommandLine.arguments.firstIndex(of: "-o") { - let dirId = oid.advanced(by: 1) - if dirId < CommandLine.arguments.count { - rawOutputDir = CommandLine.arguments[dirId] +func getArgument(_ flag: String) -> String? { + if let id = CommandLine.arguments.firstIndex(of: flag) { + let nextId = id.advanced(by: 1) + if nextId < CommandLine.arguments.count { + return CommandLine.arguments[nextId] + } } + return nil } -if rawOutputDir.isEmpty { + +guard let rawOutputDir = getArgument("-o") else { diagnosticsEngine.emit(.error("need to specify -o")) exit(1) } @@ -99,10 +102,17 @@ do { processSet: processSet, fileSystem: localFileSystem, env: ProcessEnv.vars) - var driver = try Driver(args: ["swiftc", - "-target", collector.targetTriple, - tempPath.description, - "-sdk", sdkPathRaw], + var args = ["swiftc", + "-target", collector.targetTriple, + tempPath.description, + "-sdk", sdkPathRaw] + let mcpFlag = "-module-cache-path" + // Append module cache path if given by the client + if let mcp = getArgument(mcpFlag) { + args.append(mcpFlag) + args.append(mcp) + } + var driver = try Driver(args: args, diagnosticsEngine: diagnosticsEngine, executor: executor, compilerExecutableDir: swiftcPath.parentDirectory) diff --git a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift index c1e6cf69e..75edf800f 100644 --- a/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift +++ b/Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift @@ -818,8 +818,10 @@ final class ExplicitModuleBuildTests: XCTestCase { $0 <<< "import H\n" $0 <<< "import Swift\n" } + let moduleCachePath = "/tmp/module-cache" var driver = try Driver(args: ["swiftc", main.pathString, "-sdk", mockSDKPath, + "-module-cache-path", moduleCachePath ]) let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: interfaceMap, @@ -834,6 +836,8 @@ final class ExplicitModuleBuildTests: XCTestCase { XCTAssertTrue(jobs.allSatisfy {$0.outputs.count == 1}) XCTAssertTrue(jobs.allSatisfy {$0.kind == .compile}) XCTAssertTrue(jobs.allSatisfy {$0.commandLine.contains(.flag("-compile-module-from-interface"))}) + XCTAssertTrue(jobs.allSatisfy {$0.commandLine.contains(.flag("-module-cache-path"))}) + XCTAssertTrue(try jobs.allSatisfy {$0.commandLine.contains(.path(try VirtualPath(path: moduleCachePath)))}) let HJobs = jobs.filter { $0.moduleName == "H"} XCTAssertTrue(HJobs.count == 2) XCTAssertTrue(getInputModules(HJobs[0]) == ["A", "E", "F", "G", "Swift"])