Skip to content

Skip compiling plugins when skipping building #6696

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Fixtures/Miscellaneous/TestDiscovery/Simple/Package.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
// swift-tools-version:4.2
// swift-tools-version:5.8
import PackageDescription

let package = Package(
name: "Simple",
targets: [
.target(name: "Simple"),
.target(name: "Simple", plugins: ["SimplePlugin"]),
.testTarget(name: "SimpleTests", dependencies: ["Simple"]),
.plugin(name: "SimplePlugin", capability: .buildTool()),
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import PackagePlugin

@main
struct Simple: BuildToolPlugin {
func createBuildCommands(context: PackagePlugin.PluginContext, target: PackagePlugin.Target) async throws -> [PackagePlugin.Command] {
return []
}
}
5 changes: 4 additions & 1 deletion Sources/Build/BuildOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS

/// Perform a build using the given build description and subset.
public func build(subset: BuildSubset) throws {
guard !buildParameters.shouldSkipBuilding else {
return
}

let buildStartTime = DispatchTime.now()

Expand Down Expand Up @@ -422,7 +425,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
let buildToolPluginInvocationResults: [ResolvedTarget: [BuildToolPluginInvocationResult]]
let prebuildCommandResults: [ResolvedTarget: [PrebuildCommandResult]]
// Invoke any build tool plugins in the graph to generate prebuild commands and build commands.
if let pluginConfiguration {
if let pluginConfiguration, !self.buildParameters.shouldSkipBuilding {
let buildOperationForPluginDependencies = try BuildOperation(
buildParameters: self.buildParameters.forTriple(self.buildParameters.hostTriple),
cacheBuildManifest: false,
Expand Down
34 changes: 17 additions & 17 deletions Sources/Commands/SwiftTestTool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public struct SwiftTestTool: SwiftCommand {
} else if !self.options.shouldRunInParallel {
let toolchain = try swiftTool.getTargetToolchain()
let testProducts = try buildTestsIfNeeded(swiftTool: swiftTool)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)

// Clean out the code coverage directory that may contain stale
// profraw files from a previous run of the code coverage tool.
Expand Down Expand Up @@ -216,6 +216,7 @@ public struct SwiftTestTool: SwiftCommand {
in: testProducts,
swiftTool: swiftTool,
enableCodeCoverage: options.enableCodeCoverage,
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
sanitizers: globalOptions.build.sanitizers
)
let tests = try testSuites
Expand Down Expand Up @@ -267,12 +268,13 @@ public struct SwiftTestTool: SwiftCommand {
in: testProducts,
swiftTool: swiftTool,
enableCodeCoverage: options.enableCodeCoverage,
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
sanitizers: globalOptions.build.sanitizers
)
let tests = try testSuites
.filteredTests(specifier: options.testCaseSpecifier)
.skippedTests(specifier: options.skippedTests(fileSystem: swiftTool.fileSystem))
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)

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

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

// Get the profraw files.
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
let codeCovFiles = try swiftTool.fileSystem.getDirectoryContents(buildParameters.codeCovPath)

// Construct arguments for invoking the llvm-prof tool.
Expand All @@ -372,7 +374,7 @@ public struct SwiftTestTool: SwiftCommand {
private func exportCodeCovAsJSON(to path: AbsolutePath, testBinary: AbsolutePath, swiftTool: SwiftTool) throws {
// Export using the llvm-cov tool.
let llvmCov = try swiftTool.getTargetToolchain().getLLVMCov()
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
let args = [
llvmCov.pathString,
"export",
Expand All @@ -392,13 +394,11 @@ public struct SwiftTestTool: SwiftCommand {
///
/// - Returns: The paths to the build test products.
private func buildTestsIfNeeded(swiftTool: SwiftTool) throws -> [BuiltTestProduct] {
let buildParameters = try swiftTool.buildParametersForTest(options: self.options)
let buildParameters = try swiftTool.buildParametersForTest(options: self.options, sharedOptions: self.sharedOptions)
let buildSystem = try swiftTool.createBuildSystem(customBuildParameters: buildParameters)

if !self.sharedOptions.shouldSkipBuilding {
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
try buildSystem.build(subset: subset)
}
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
try buildSystem.build(subset: subset)

// Find the test product.
let testProducts = buildSystem.builtTestProducts
Expand Down Expand Up @@ -498,6 +498,7 @@ extension SwiftTestTool {
in: testProducts,
swiftTool: swiftTool,
enableCodeCoverage: false,
shouldSkipBuilding: sharedOptions.shouldSkipBuilding,
sanitizers: globalOptions.build.sanitizers
)

Expand All @@ -508,13 +509,11 @@ extension SwiftTestTool {
}

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

if !self.sharedOptions.shouldSkipBuilding {
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
try buildSystem.build(subset: subset)
}
let subset = self.sharedOptions.testProduct.map(BuildSubset.product) ?? .allIncludingTests
try buildSystem.build(subset: subset)

// Find the test product.
let testProducts = buildSystem.builtTestProducts
Expand Down Expand Up @@ -1041,10 +1040,11 @@ final class XUnitGenerator {
}

extension SwiftTool {
func buildParametersForTest(options: TestToolOptions) throws -> BuildParameters {
func buildParametersForTest(options: TestToolOptions, sharedOptions: SharedOptions) throws -> BuildParameters {
try self.buildParametersForTest(
enableCodeCoverage: options.enableCodeCoverage,
enableTestability: options.enableTestableImports
enableTestability: options.enableTestableImports,
shouldSkipBuilding: sharedOptions.shouldSkipBuilding
)
}
}
Expand Down
1 change: 1 addition & 0 deletions Sources/Commands/Utilities/PluginDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ final class PluginDelegate: PluginInvocationDelegate {
fromTestAt: testProduct.bundlePath,
swiftTool: swiftTool,
enableCodeCoverage: parameters.enableCodeCoverage,
shouldSkipBuilding: false,
sanitizers: swiftTool.options.build.sanitizers
)
for testSuite in testSuites {
Expand Down
27 changes: 22 additions & 5 deletions Sources/Commands/Utilities/TestingSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,21 @@ enum TestingSupport {
throw InternalError("XCTestHelper binary not found, tried \(triedPaths.map { $0.pathString }.joined(separator: ", "))")
}

static func getTestSuites(in testProducts: [BuiltTestProduct], swiftTool: SwiftTool, enableCodeCoverage: Bool, sanitizers: [Sanitizer]) throws -> [AbsolutePath: [TestSuite]] {
static func getTestSuites(
in testProducts: [BuiltTestProduct],
swiftTool: SwiftTool,
enableCodeCoverage: Bool,
shouldSkipBuilding: Bool,
sanitizers: [Sanitizer]
) throws -> [AbsolutePath: [TestSuite]] {
let testSuitesByProduct = try testProducts
.map {(
$0.bundlePath,
try Self.getTestSuites(
fromTestAt: $0.bundlePath,
swiftTool: swiftTool,
enableCodeCoverage: enableCodeCoverage,
shouldSkipBuilding: shouldSkipBuilding,
sanitizers: sanitizers
)
)}
Expand All @@ -86,15 +93,22 @@ enum TestingSupport {
/// - Throws: TestError, SystemError, TSCUtility.Error
///
/// - Returns: Array of TestSuite
static func getTestSuites(fromTestAt path: AbsolutePath, swiftTool: SwiftTool, enableCodeCoverage: Bool, sanitizers: [Sanitizer]) throws -> [TestSuite] {
static func getTestSuites(
fromTestAt path: AbsolutePath,
swiftTool: SwiftTool,
enableCodeCoverage: Bool,
shouldSkipBuilding: Bool,
sanitizers: [Sanitizer]
) throws -> [TestSuite] {
// Run the correct tool.
#if os(macOS)
let data: String = try withTemporaryFile { tempFile in
let args = [try Self.xctestHelperPath(swiftTool: swiftTool).pathString, path.pathString, tempFile.path.pathString]
var env = try Self.constructTestEnvironment(
toolchain: try swiftTool.getTargetToolchain(),
buildParameters: swiftTool.buildParametersForTest(
enableCodeCoverage: enableCodeCoverage
enableCodeCoverage: enableCodeCoverage,
shouldSkipBuilding: shouldSkipBuilding
),
sanitizers: sanitizers
)
Expand All @@ -113,7 +127,8 @@ enum TestingSupport {
let env = try Self.constructTestEnvironment(
toolchain: try swiftTool.getTargetToolchain(),
buildParameters: swiftTool.buildParametersForTest(
enableCodeCoverage: enableCodeCoverage
enableCodeCoverage: enableCodeCoverage,
shouldSkipBuilding: shouldSkipBuilding
),
sanitizers: sanitizers
)
Expand Down Expand Up @@ -184,13 +199,15 @@ enum TestingSupport {
extension SwiftTool {
func buildParametersForTest(
enableCodeCoverage: Bool,
enableTestability: Bool? = nil
enableTestability: Bool? = nil,
shouldSkipBuilding: Bool = false
) throws -> BuildParameters {
var parameters = try self.buildParameters()
parameters.enableCodeCoverage = enableCodeCoverage
// for test commands, we normally enable building with testability
// but we let users override this with a flag
parameters.enableTestability = enableTestability ?? true
parameters.shouldSkipBuilding = shouldSkipBuilding
return parameters
}
}
15 changes: 11 additions & 4 deletions Sources/SPMBuildCore/BuildParameters.swift
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ public struct BuildParameters: Encodable {

public var debugInfoFormat: DebugInfoFormat

public var shouldSkipBuilding: Bool

@available(*, deprecated, message: "use `init` overload with `targetTriple` parameter name instead")
@_disfavoredOverload
public init(
Expand Down Expand Up @@ -302,7 +304,8 @@ public struct BuildParameters: Encodable {
colorizedOutput: Bool = false,
verboseOutput: Bool = false,
linkTimeOptimizationMode: LinkTimeOptimizationMode? = nil,
debugInfoFormat: DebugInfoFormat = .dwarf
debugInfoFormat: DebugInfoFormat = .dwarf,
shouldSkipBuilding: Bool = false
) throws {
try self.init(
dataPath: dataPath,
Expand Down Expand Up @@ -334,7 +337,8 @@ public struct BuildParameters: Encodable {
colorizedOutput: colorizedOutput,
verboseOutput: verboseOutput,
linkTimeOptimizationMode: linkTimeOptimizationMode,
debugInfoFormat: debugInfoFormat
debugInfoFormat: debugInfoFormat,
shouldSkipBuilding: shouldSkipBuilding
)
}

Expand Down Expand Up @@ -368,7 +372,8 @@ public struct BuildParameters: Encodable {
colorizedOutput: Bool = false,
verboseOutput: Bool = false,
linkTimeOptimizationMode: LinkTimeOptimizationMode? = nil,
debugInfoFormat: DebugInfoFormat = .dwarf
debugInfoFormat: DebugInfoFormat = .dwarf,
shouldSkipBuilding: Bool = false
) throws {
let targetTriple = try targetTriple ?? .getHostTriple(usingSwiftCompiler: toolchain.swiftCompilerPath)

Expand Down Expand Up @@ -439,6 +444,7 @@ public struct BuildParameters: Encodable {
self.verboseOutput = verboseOutput
self.linkTimeOptimizationMode = linkTimeOptimizationMode
self.debugInfoFormat = debugInfoFormat
self.shouldSkipBuilding = shouldSkipBuilding
}

@available(*, deprecated, renamed: "forTriple()")
Expand Down Expand Up @@ -487,7 +493,8 @@ public struct BuildParameters: Encodable {
linkerDeadStrip: self.linkerDeadStrip,
colorizedOutput: self.colorizedOutput,
verboseOutput: self.verboseOutput,
linkTimeOptimizationMode: self.linkTimeOptimizationMode
linkTimeOptimizationMode: self.linkTimeOptimizationMode,
shouldSkipBuilding: self.shouldSkipBuilding
)
}

Expand Down
4 changes: 4 additions & 0 deletions Sources/XCBuildSupport/XcodeBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
}

public func build(subset: BuildSubset) throws {
guard !buildParameters.shouldSkipBuilding else {
return
}

let pifBuilder = try getPIFBuilder()
let pif = try pifBuilder.generatePIF()
try self.fileSystem.writeIfChanged(path: buildParameters.pifManifest, string: pif)
Expand Down