Skip to content

Commit dd76ad4

Browse files
Skip compiling plugins when skipping building (#6696)
Sink `shouldSkipBuilding` down into build parameters, so we can respect it whereever we would be trying to build, e.g. when trying to build plugins during build planning. resolves #6683 Co-authored-by: Max Desiatov <[email protected]>
1 parent 175a886 commit dd76ad4

File tree

8 files changed

+70
-29
lines changed

8 files changed

+70
-29
lines changed
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
// swift-tools-version:4.2
1+
// swift-tools-version:5.8
22
import PackageDescription
33

44
let package = Package(
55
name: "Simple",
66
targets: [
7-
.target(name: "Simple"),
7+
.target(name: "Simple", plugins: ["SimplePlugin"]),
88
.testTarget(name: "SimpleTests", dependencies: ["Simple"]),
9+
.plugin(name: "SimplePlugin", capability: .buildTool()),
910
]
1011
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import PackagePlugin
2+
3+
@main
4+
struct Simple: BuildToolPlugin {
5+
func createBuildCommands(context: PackagePlugin.PluginContext, target: PackagePlugin.Target) async throws -> [PackagePlugin.Command] {
6+
return []
7+
}
8+
}

Sources/Build/BuildOperation.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
237237

238238
/// Perform a build using the given build description and subset.
239239
public func build(subset: BuildSubset) throws {
240+
guard !buildParameters.shouldSkipBuilding else {
241+
return
242+
}
240243

241244
let buildStartTime = DispatchTime.now()
242245

@@ -422,7 +425,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
422425
let buildToolPluginInvocationResults: [ResolvedTarget: [BuildToolPluginInvocationResult]]
423426
let prebuildCommandResults: [ResolvedTarget: [PrebuildCommandResult]]
424427
// Invoke any build tool plugins in the graph to generate prebuild commands and build commands.
425-
if let pluginConfiguration {
428+
if let pluginConfiguration, !self.buildParameters.shouldSkipBuilding {
426429
let buildOperationForPluginDependencies = try BuildOperation(
427430
buildParameters: self.buildParameters.forTriple(self.buildParameters.hostTriple),
428431
cacheBuildManifest: false,

Sources/Commands/SwiftTestTool.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public struct SwiftTestTool: SwiftCommand {
187187
} else if !self.options.shouldRunInParallel {
188188
let toolchain = try swiftTool.getTargetToolchain()
189189
let testProducts = try buildTestsIfNeeded(swiftTool: swiftTool)
190-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
190+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
191191

192192
// Clean out the code coverage directory that may contain stale
193193
// profraw files from a previous run of the code coverage tool.
@@ -216,6 +216,7 @@ public struct SwiftTestTool: SwiftCommand {
216216
in: testProducts,
217217
swiftTool: swiftTool,
218218
enableCodeCoverage: options.enableCodeCoverage,
219+
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
219220
sanitizers: globalOptions.build.sanitizers
220221
)
221222
let tests = try testSuites
@@ -267,12 +268,13 @@ public struct SwiftTestTool: SwiftCommand {
267268
in: testProducts,
268269
swiftTool: swiftTool,
269270
enableCodeCoverage: options.enableCodeCoverage,
271+
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
270272
sanitizers: globalOptions.build.sanitizers
271273
)
272274
let tests = try testSuites
273275
.filteredTests(specifier: options.testCaseSpecifier)
274276
.skippedTests(specifier: options.skippedTests(fileSystem: swiftTool.fileSystem))
275-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
277+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
276278

277279
// If there were no matches, emit a warning and exit.
278280
if tests.isEmpty {
@@ -338,7 +340,7 @@ public struct SwiftTestTool: SwiftCommand {
338340
// Merge all the profraw files to produce a single profdata file.
339341
try mergeCodeCovRawDataFiles(swiftTool: swiftTool)
340342

341-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
343+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
342344
for product in testProducts {
343345
// Export the codecov data as JSON.
344346
let jsonPath = buildParameters.codeCovAsJSONPath(packageName: rootManifest.displayName)
@@ -352,7 +354,7 @@ public struct SwiftTestTool: SwiftCommand {
352354
let llvmProf = try swiftTool.getTargetToolchain().getLLVMProf()
353355

354356
// Get the profraw files.
355-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
357+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
356358
let codeCovFiles = try swiftTool.fileSystem.getDirectoryContents(buildParameters.codeCovPath)
357359

358360
// Construct arguments for invoking the llvm-prof tool.
@@ -372,7 +374,7 @@ public struct SwiftTestTool: SwiftCommand {
372374
private func exportCodeCovAsJSON(to path: AbsolutePath, testBinary: AbsolutePath, swiftTool: SwiftTool) throws {
373375
// Export using the llvm-cov tool.
374376
let llvmCov = try swiftTool.getTargetToolchain().getLLVMCov()
375-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
377+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
376378
let args = [
377379
llvmCov.pathString,
378380
"export",
@@ -392,13 +394,11 @@ public struct SwiftTestTool: SwiftCommand {
392394
///
393395
/// - Returns: The paths to the build test products.
394396
private func buildTestsIfNeeded(swiftTool: SwiftTool) throws -> [BuiltTestProduct] {
395-
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
397+
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
396398
let buildSystem = try swiftTool.createBuildSystem(customBuildParameters: buildParameters)
397399

398-
if !self.sharedOptions.shouldSkipBuilding {
399-
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
400-
try buildSystem.build(subset: subset)
401-
}
400+
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
401+
try buildSystem.build(subset: subset)
402402

403403
// Find the test product.
404404
let testProducts = buildSystem.builtTestProducts
@@ -498,6 +498,7 @@ extension SwiftTestTool {
498498
in: testProducts,
499499
swiftTool: swiftTool,
500500
enableCodeCoverage: false,
501+
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
501502
sanitizers: globalOptions.build.sanitizers
502503
)
503504

@@ -508,13 +509,11 @@ extension SwiftTestTool {
508509
}
509510

510511
private func buildTestsIfNeeded(swiftTool: SwiftTool) throws -> [BuiltTestProduct] {
511-
let buildParameters = try swiftTool.buildParametersForTest(enableCodeCoverage: false)
512+
let buildParameters = try swiftTool.buildParametersForTest(enableCodeCoverage: false, shouldSkipBuilding: sharedOptions.shouldSkipBuilding)
512513
let buildSystem = try swiftTool.createBuildSystem(customBuildParameters: buildParameters)
513514

514-
if !self.sharedOptions.shouldSkipBuilding {
515-
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
516-
try buildSystem.build(subset: subset)
517-
}
515+
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
516+
try buildSystem.build(subset: subset)
518517

519518
// Find the test product.
520519
let testProducts = buildSystem.builtTestProducts
@@ -1041,10 +1040,11 @@ final class XUnitGenerator {
10411040
}
10421041

10431042
extension SwiftTool {
1044-
func buildParametersForTest(options: TestToolOptions) throws -> BuildParameters {
1043+
func buildParametersForTest(options: TestToolOptions, sharedOptions: SharedOptions) throws -> BuildParameters {
10451044
try self.buildParametersForTest(
10461045
enableCodeCoverage: options.enableCodeCoverage,
1047-
enableTestability: options.enableTestableImports
1046+
enableTestability: options.enableTestableImports,
1047+
shouldSkipBuilding: sharedOptions.shouldSkipBuilding
10481048
)
10491049
}
10501050
}

Sources/Commands/Utilities/PluginDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ final class PluginDelegate: PluginInvocationDelegate {
198198
fromTestAt: testProduct.bundlePath,
199199
swiftTool: swiftTool,
200200
enableCodeCoverage: parameters.enableCodeCoverage,
201+
shouldSkipBuilding: false,
201202
sanitizers: swiftTool.options.build.sanitizers
202203
)
203204
for testSuite in testSuites {

Sources/Commands/Utilities/TestingSupport.swift

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,21 @@ enum TestingSupport {
6262
throw InternalError("XCTestHelper binary not found, tried \(triedPaths.map { $0.pathString }.joined(separator: ", "))")
6363
}
6464

65-
static func getTestSuites(in testProducts: [BuiltTestProduct], swiftTool: SwiftTool, enableCodeCoverage: Bool, sanitizers: [Sanitizer]) throws -> [AbsolutePath: [TestSuite]] {
65+
static func getTestSuites(
66+
in testProducts: [BuiltTestProduct],
67+
swiftTool: SwiftTool,
68+
enableCodeCoverage: Bool,
69+
shouldSkipBuilding: Bool,
70+
sanitizers: [Sanitizer]
71+
) throws -> [AbsolutePath: [TestSuite]] {
6672
let testSuitesByProduct = try testProducts
6773
.map {(
6874
$0.bundlePath,
6975
try Self.getTestSuites(
7076
fromTestAt: $0.bundlePath,
7177
swiftTool: swiftTool,
7278
enableCodeCoverage: enableCodeCoverage,
79+
shouldSkipBuilding: shouldSkipBuilding,
7380
sanitizers: sanitizers
7481
)
7582
)}
@@ -86,15 +93,22 @@ enum TestingSupport {
8693
/// - Throws: TestError, SystemError, TSCUtility.Error
8794
///
8895
/// - Returns: Array of TestSuite
89-
static func getTestSuites(fromTestAt path: AbsolutePath, swiftTool: SwiftTool, enableCodeCoverage: Bool, sanitizers: [Sanitizer]) throws -> [TestSuite] {
96+
static func getTestSuites(
97+
fromTestAt path: AbsolutePath,
98+
swiftTool: SwiftTool,
99+
enableCodeCoverage: Bool,
100+
shouldSkipBuilding: Bool,
101+
sanitizers: [Sanitizer]
102+
) throws -> [TestSuite] {
90103
// Run the correct tool.
91104
#if os(macOS)
92105
let data: String = try withTemporaryFile { tempFile in
93106
let args = [try Self.xctestHelperPath(swiftTool: swiftTool).pathString, path.pathString, tempFile.path.pathString]
94107
var env = try Self.constructTestEnvironment(
95108
toolchain: try swiftTool.getTargetToolchain(),
96109
buildParameters: swiftTool.buildParametersForTest(
97-
enableCodeCoverage: enableCodeCoverage
110+
enableCodeCoverage: enableCodeCoverage,
111+
shouldSkipBuilding: shouldSkipBuilding
98112
),
99113
sanitizers: sanitizers
100114
)
@@ -113,7 +127,8 @@ enum TestingSupport {
113127
let env = try Self.constructTestEnvironment(
114128
toolchain: try swiftTool.getTargetToolchain(),
115129
buildParameters: swiftTool.buildParametersForTest(
116-
enableCodeCoverage: enableCodeCoverage
130+
enableCodeCoverage: enableCodeCoverage,
131+
shouldSkipBuilding: shouldSkipBuilding
117132
),
118133
sanitizers: sanitizers
119134
)
@@ -184,13 +199,15 @@ enum TestingSupport {
184199
extension SwiftTool {
185200
func buildParametersForTest(
186201
enableCodeCoverage: Bool,
187-
enableTestability: Bool? = nil
202+
enableTestability: Bool? = nil,
203+
shouldSkipBuilding: Bool = false
188204
) throws -> BuildParameters {
189205
var parameters = try self.buildParameters()
190206
parameters.enableCodeCoverage = enableCodeCoverage
191207
// for test commands, we normally enable building with testability
192208
// but we let users override this with a flag
193209
parameters.enableTestability = enableTestability ?? true
210+
parameters.shouldSkipBuilding = shouldSkipBuilding
194211
return parameters
195212
}
196213
}

Sources/SPMBuildCore/BuildParameters.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ public struct BuildParameters: Encodable {
270270

271271
public var debugInfoFormat: DebugInfoFormat
272272

273+
public var shouldSkipBuilding: Bool
274+
273275
@available(*, deprecated, message: "use `init` overload with `targetTriple` parameter name instead")
274276
@_disfavoredOverload
275277
public init(
@@ -302,7 +304,8 @@ public struct BuildParameters: Encodable {
302304
colorizedOutput: Bool = false,
303305
verboseOutput: Bool = false,
304306
linkTimeOptimizationMode: LinkTimeOptimizationMode? = nil,
305-
debugInfoFormat: DebugInfoFormat = .dwarf
307+
debugInfoFormat: DebugInfoFormat = .dwarf,
308+
shouldSkipBuilding: Bool = false
306309
) throws {
307310
try self.init(
308311
dataPath: dataPath,
@@ -334,7 +337,8 @@ public struct BuildParameters: Encodable {
334337
colorizedOutput: colorizedOutput,
335338
verboseOutput: verboseOutput,
336339
linkTimeOptimizationMode: linkTimeOptimizationMode,
337-
debugInfoFormat: debugInfoFormat
340+
debugInfoFormat: debugInfoFormat,
341+
shouldSkipBuilding: shouldSkipBuilding
338342
)
339343
}
340344

@@ -368,7 +372,8 @@ public struct BuildParameters: Encodable {
368372
colorizedOutput: Bool = false,
369373
verboseOutput: Bool = false,
370374
linkTimeOptimizationMode: LinkTimeOptimizationMode? = nil,
371-
debugInfoFormat: DebugInfoFormat = .dwarf
375+
debugInfoFormat: DebugInfoFormat = .dwarf,
376+
shouldSkipBuilding: Bool = false
372377
) throws {
373378
let targetTriple = try targetTriple ?? .getHostTriple(usingSwiftCompiler: toolchain.swiftCompilerPath)
374379

@@ -439,6 +444,7 @@ public struct BuildParameters: Encodable {
439444
self.verboseOutput = verboseOutput
440445
self.linkTimeOptimizationMode = linkTimeOptimizationMode
441446
self.debugInfoFormat = debugInfoFormat
447+
self.shouldSkipBuilding = shouldSkipBuilding
442448
}
443449

444450
@available(*, deprecated, renamed: "forTriple()")
@@ -487,7 +493,8 @@ public struct BuildParameters: Encodable {
487493
linkerDeadStrip: self.linkerDeadStrip,
488494
colorizedOutput: self.colorizedOutput,
489495
verboseOutput: self.verboseOutput,
490-
linkTimeOptimizationMode: self.linkTimeOptimizationMode
496+
linkTimeOptimizationMode: self.linkTimeOptimizationMode,
497+
shouldSkipBuilding: self.shouldSkipBuilding
491498
)
492499
}
493500

Sources/XCBuildSupport/XcodeBuildSystem.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
103103
}
104104

105105
public func build(subset: BuildSubset) throws {
106+
guard !buildParameters.shouldSkipBuilding else {
107+
return
108+
}
109+
106110
let pifBuilder = try getPIFBuilder()
107111
let pif = try pifBuilder.generatePIF()
108112
try self.fileSystem.writeIfChanged(path: buildParameters.pifManifest, string: pif)

0 commit comments

Comments
 (0)