Skip to content

Commit b3549b3

Browse files
committed
WIP: Support for building plugin dependencies for the host
Hacky support for building plugin dependencies for the host. This is achieved by creating a second build operation with altered build parameters and individually building dependencies using that build operation, somewhat similar to how command plugins operate.
1 parent cc30527 commit b3549b3

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

Sources/Build/BuildOperation.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,13 +394,15 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
394394
let prebuildCommandResults: [ResolvedTarget: [PrebuildCommandResult]]
395395
// Invoke any build tool plugins in the graph to generate prebuild commands and build commands.
396396
if let pluginConfiguration = self.pluginConfiguration {
397+
let buildOperationForPluginDependencies = try BuildOperation(buildParameters: self.buildParameters.withDestination(self.buildParameters.hostTriple), cacheBuildManifest: false, packageGraphLoader: { return graph }, additionalFileRules: self.additionalFileRules, pkgConfigDirectories: self.pkgConfigDirectories, outputStream: self.outputStream, logLevel: self.logLevel, fileSystem: self.fileSystem, observabilityScope: self.observabilityScope)
397398
buildToolPluginInvocationResults = try graph.invokeBuildToolPlugins(
398399
outputDir: pluginConfiguration.workDirectory.appending(component: "outputs"),
399400
builtToolsDir: self.buildParameters.buildPath,
400401
buildEnvironment: self.buildParameters.buildEnvironment,
401402
toolSearchDirectories: [self.buildParameters.toolchain.swiftCompilerPath.parentDirectory],
402403
pkgConfigDirectories: self.pkgConfigDirectories,
403404
pluginScriptRunner: pluginConfiguration.scriptRunner,
405+
buildSystemForPluginDependencies: buildOperationForPluginDependencies,
404406
observabilityScope: self.observabilityScope,
405407
fileSystem: self.fileSystem
406408
)

Sources/SPMBuildCore/BuildParameters.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,50 @@ public struct BuildParameters: Encodable {
293293
self.verboseOutput = verboseOutput
294294
}
295295

296+
public func withDestination(_ destinationTriple: Triple) throws -> BuildParameters {
297+
let forceTestDiscovery: Bool
298+
let testEntryPointPath: AbsolutePath?
299+
switch self.testProductStyle {
300+
case .entryPointExecutable(let explicitlyEnabledDiscovery, let explicitlySpecifiedPath):
301+
forceTestDiscovery = explicitlyEnabledDiscovery
302+
testEntryPointPath = explicitlySpecifiedPath
303+
case .loadableBundle:
304+
forceTestDiscovery = false
305+
testEntryPointPath = nil
306+
}
307+
308+
return .init(
309+
dataPath: self.dataPath.parentDirectory.appending(components: ["plugins", "tools"]),
310+
configuration: self.configuration,
311+
toolchain: try UserToolchain(destination: Destination.hostDestination()),
312+
hostTriple: self.hostTriple,
313+
destinationTriple: destinationTriple,
314+
flags: BuildFlags(),
315+
pkgConfigDirectories: self.pkgConfigDirectories,
316+
architectures: nil,
317+
workers: self.workers,
318+
shouldLinkStaticSwiftStdlib: self.shouldLinkStaticSwiftStdlib,
319+
shouldEnableManifestCaching: self.shouldEnableManifestCaching,
320+
canRenameEntrypointFunctionName: self.canRenameEntrypointFunctionName,
321+
shouldCreateDylibForDynamicProducts: self.shouldCreateDylibForDynamicProducts,
322+
sanitizers: self.sanitizers,
323+
enableCodeCoverage: self.enableCodeCoverage,
324+
indexStoreMode: self.indexStoreMode,
325+
enableParseableModuleInterfaces: self.enableParseableModuleInterfaces,
326+
emitSwiftModuleSeparately: self.emitSwiftModuleSeparately,
327+
useIntegratedSwiftDriver: self.useIntegratedSwiftDriver,
328+
useExplicitModuleBuild: self.useExplicitModuleBuild,
329+
isXcodeBuildSystemEnabled: self.isXcodeBuildSystemEnabled,
330+
enableTestability: self.enableTestability,
331+
forceTestDiscovery: forceTestDiscovery,
332+
testEntryPointPath: testEntryPointPath,
333+
explicitTargetDependencyImportCheckingMode: self.explicitTargetDependencyImportCheckingMode,
334+
linkerDeadStrip: self.linkerDeadStrip,
335+
colorizedOutput: self.colorizedOutput,
336+
verboseOutput: self.verboseOutput
337+
)
338+
}
339+
296340
/// The path to the build directory (inside the data directory).
297341
public var buildPath: AbsolutePath {
298342
if isXcodeBuildSystemEnabled {

Sources/SPMBuildCore/PluginInvocation.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ extension PackageGraph {
332332
toolSearchDirectories: [AbsolutePath],
333333
pkgConfigDirectories: [AbsolutePath],
334334
pluginScriptRunner: PluginScriptRunner,
335+
buildSystemForPluginDependencies: BuildSystem? = nil,
335336
observabilityScope: ObservabilityScope,
336337
fileSystem: FileSystem
337338
) throws -> [ResolvedTarget: [BuildToolPluginInvocationResult]] {
@@ -372,8 +373,17 @@ extension PackageGraph {
372373
// names to the corresponding paths. Built tools are assumed to be in the build tools directory.
373374
var builtToolNames: [String] = []
374375
let accessibleTools = try pluginTarget.processAccessibleTools(packageGraph: self, fileSystem: fileSystem, environment: buildEnvironment, for: try pluginScriptRunner.hostTriple) { name, path in
375-
builtToolNames.append(name)
376-
return builtToolsDir.appending(path)
376+
if let buildSystem = buildSystemForPluginDependencies {
377+
try buildSystem.build(subset: .product(name))
378+
if let builtTool = try buildSystem.buildPlan.buildProducts.first(where: { $0.product.name == name}) {
379+
return builtTool.binaryPath
380+
} else {
381+
return nil
382+
}
383+
} else {
384+
builtToolNames.append(name)
385+
return builtToolsDir.appending(path)
386+
}
377387
}
378388

379389
// Determine additional input dependencies for any plugin commands, based on any executables the plugin target depends on.

0 commit comments

Comments
 (0)