@@ -107,6 +107,45 @@ public actor SwiftPMBuildSystem {
107107 let fileSystem : FileSystem
108108 private let toolchainRegistry : ToolchainRegistry
109109
110+ private let swiftBuildSupportsPrepareForIndexingTask = SKSupport . ThreadSafeBox < Task < Bool , Never > ? > ( initialValue: nil )
111+
112+ #if compiler(>=6.1)
113+ #warning(
114+ " Remove swiftBuildSupportsPrepareForIndexing when we no longer need to support SwiftPM versions that don't have support for `--experimental-prepare-for-indexing` "
115+ )
116+ #endif
117+ /// Whether `swift build` supports the `--experimental-prepare-for-indexing` flag.
118+ private var swiftBuildSupportsPrepareForIndexing : Bool {
119+ get async {
120+ let task = swiftBuildSupportsPrepareForIndexingTask. withLock { task in
121+ if let task {
122+ return task
123+ }
124+ let newTask = Task { ( ) -> Bool in
125+ guard let swift = await toolchainRegistry. default? . swift else {
126+ return false
127+ }
128+
129+ do {
130+ let process = Process ( args: swift. pathString, " build " , " --help-hidden " )
131+ try process. launch ( )
132+ let result = try await process. waitUntilExit ( )
133+ guard let output = String ( bytes: try result. output. get ( ) , encoding: . utf8) else {
134+ return false
135+ }
136+ return output. contains ( " --experimental-prepare-for-indexing " )
137+ } catch {
138+ return false
139+ }
140+ }
141+ task = newTask
142+ return newTask
143+ }
144+
145+ return await task. value
146+ }
147+ }
148+
110149 var fileToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
111150 var sourceDirToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
112151
@@ -523,13 +562,16 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem {
523562 )
524563 return
525564 }
526- let arguments = [
565+ var arguments = [
527566 swift. pathString, " build " ,
528567 " --package-path " , workspacePath. pathString,
529568 " --scratch-path " , self . workspace. location. scratchDirectory. pathString,
530569 " --disable-index-store " ,
531570 " --target " , target. targetID,
532571 ]
572+ if await swiftBuildSupportsPrepareForIndexing {
573+ arguments. append ( " --experimental-prepare-for-indexing " )
574+ }
533575 if Task. isCancelled {
534576 return
535577 }
0 commit comments