@@ -107,6 +107,45 @@ public actor SwiftPMBuildSystem {
107
107
let fileSystem : FileSystem
108
108
private let toolchainRegistry : ToolchainRegistry
109
109
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
+
110
149
var fileToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
111
150
var sourceDirToTarget : [ AbsolutePath : SwiftBuildTarget ] = [ : ]
112
151
@@ -523,13 +562,16 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem {
523
562
)
524
563
return
525
564
}
526
- let arguments = [
565
+ var arguments = [
527
566
swift. pathString, " build " ,
528
567
" --package-path " , workspacePath. pathString,
529
568
" --scratch-path " , self . workspace. location. scratchDirectory. pathString,
530
569
" --disable-index-store " ,
531
570
" --target " , target. targetID,
532
571
]
572
+ if await swiftBuildSupportsPrepareForIndexing {
573
+ arguments. append ( " --experimental-prepare-for-indexing " )
574
+ }
533
575
if Task. isCancelled {
534
576
return
535
577
}
0 commit comments