diff --git a/Sources/Build/BuildOperation.swift b/Sources/Build/BuildOperation.swift index 4e53d621ae3..cde0828dba9 100644 --- a/Sources/Build/BuildOperation.swift +++ b/Sources/Build/BuildOperation.swift @@ -455,9 +455,16 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS let prebuildCommandResults: [ResolvedTarget.ID: [PrebuildCommandResult]] // Invoke any build tool plugins in the graph to generate prebuild commands and build commands. if let pluginConfiguration, !self.productsBuildParameters.shouldSkipBuilding { + // Hacky workaround for rdar://120560817, but it replicates precisely enough the original behavior before + // products/tools build parameters were split. Ideally we want to have specify the correct path at the time + // when `toolsBuildParameters` is initialized, but we have too many places in the codebase where that's + // done, which makes it hard to realign them all at once. + var pluginsBuildParameters = self.toolsBuildParameters + pluginsBuildParameters.dataPath = pluginsBuildParameters.dataPath.parentDirectory.appending(components: ["plugins", "tools"]) let buildOperationForPluginDependencies = BuildOperation( - productsBuildParameters: self.productsBuildParameters, - toolsBuildParameters: self.toolsBuildParameters, + // FIXME: this doesn't maintain the products/tools split cleanly + productsBuildParameters: pluginsBuildParameters, + toolsBuildParameters: pluginsBuildParameters, cacheBuildManifest: false, packageGraphLoader: { return graph }, additionalFileRules: self.additionalFileRules, @@ -469,7 +476,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS ) buildToolPluginInvocationResults = try graph.invokeBuildToolPlugins( outputDir: pluginConfiguration.workDirectory.appending("outputs"), - buildParameters: self.toolsBuildParameters, + buildParameters: pluginsBuildParameters, additionalFileRules: self.additionalFileRules, toolSearchDirectories: [self.toolsBuildParameters.toolchain.swiftCompilerPath.parentDirectory], pkgConfigDirectories: self.pkgConfigDirectories, diff --git a/Tests/BuildTests/PluginsBuildPlanTests.swift b/Tests/BuildTests/PluginsBuildPlanTests.swift new file mode 100644 index 00000000000..a98070e0817 --- /dev/null +++ b/Tests/BuildTests/PluginsBuildPlanTests.swift @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift open source project +// +// Copyright (c) 2014-2024 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See http://swift.org/LICENSE.txt for license information +// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import Basics +import SPMTestSupport +import XCTest + +final class PluginsBuildPlanTests: XCTestCase { + func testBuildToolsDatabasePath() throws { + try fixture(name: "Miscellaneous/Plugins/MySourceGenPlugin") { fixturePath in + let (stdout, stderr) = try executeSwiftBuild(fixturePath) + XCTAssertMatch(stdout, .contains("Build complete!")) + XCTAssertTrue(localFileSystem.exists(fixturePath.appending(RelativePath(".build/plugins/tools/build.db")))) + } + } +}