@@ -106,6 +106,45 @@ public actor SwiftPMBuildSystem {
106
106
let fileSystem : FileSystem
107
107
private let toolchainRegistry : ToolchainRegistry
108
108
109
+ private let swiftBuildSupportsPrepareForIndexingTask = SKSupport . ThreadSafeBox < Task < Bool , Never > ? > ( initialValue: nil )
110
+
111
+ #if compiler(>=6.1)
112
+ #warning(
113
+ " Remove swiftBuildSupportsPrepareForIndexing when we no longer need to support SwiftPM versions that don't have support for `--experimental-prepare-for-indexing` "
114
+ )
115
+ #endif
116
+ /// Whether `swift build` supports the `--experimental-prepare-for-indexing` flag.
117
+ private var swiftBuildSupportsPrepareForIndexing : Bool {
118
+ get async {
119
+ let task = swiftBuildSupportsPrepareForIndexingTask. withLock { task in
120
+ if let task {
121
+ return task
122
+ }
123
+ let newTask = Task { ( ) -> Bool in
124
+ guard let swift = await toolchainRegistry. default? . swift else {
125
+ return false
126
+ }
127
+
128
+ do {
129
+ let process = Process ( args: swift. pathString, " build " , " --help " )
130
+ try process. launch ( )
131
+ let result = try await process. waitUntilExit ( )
132
+ guard let output = String ( bytes: try result. output. get ( ) , encoding: . utf8) else {
133
+ return false
134
+ }
135
+ return output. contains ( " --experimental-prepare-for-indexing " )
136
+ } catch {
137
+ return false
138
+ }
139
+ }
140
+ task = newTask
141
+ return newTask
142
+ }
143
+
144
+ return await task. value
145
+ }
146
+ }
147
+
109
148
var fileToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
110
149
var sourceDirToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
111
150
@@ -509,13 +548,16 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem {
509
548
)
510
549
return
511
550
}
512
- let arguments = [
551
+ var arguments = [
513
552
swift. pathString, " build " ,
514
553
" --package-path " , workspacePath. pathString,
515
554
" --scratch-path " , self . workspace. location. scratchDirectory. pathString,
516
555
" --disable-index-store " ,
517
556
" --target " , target. targetID,
518
557
]
558
+ if await swiftBuildSupportsPrepareForIndexing {
559
+ arguments. append ( " --experimental-prepare-for-indexing " )
560
+ }
519
561
if Task. isCancelled {
520
562
return
521
563
}
0 commit comments