You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
command plugins: Build command plugin dependencies for the host, not the target (#7280)
Always build command line plugin dependencies for the host triple.
### Motivation:
Since #7164, dependencies of command plugins are once again being built
for the _target_ rather than the host. This causes problem when cross
compiling because the host needs to be able to run the plugin
dependencies, but finds target binaries instead.
This problem was fixed before in #6791 by forcing command plugin
dependencies to be built for the host by overriding the default build
parameters in swiftTool.createBuildSystem(). The same solution still
works in this commit, but a better long-term option would be to rework
BuildOperation.plan() to handle command plugin dependencies specially,
as it already does for build plugin dependencies.
### Modifications:
At present, BuildOperation.plan calls graph.invokeBuildToolPlugins to
process sources. invokeBuildToolPlugins finds all build tool dependecies
and builds them separately, using a specially-created BuildOperation
instance:
https://github.com/apple/swift-package-manager/blob/34efc0bfe9d40d9a019644ac8fcd0b852c491dfe/Sources/SPMBuildCore/Plugins/PluginInvocation.swift#L409
There is no equivalent step for command plugin dependencies, so they are
built for the host architecture. Ideally we should rework
BuildOperation.plan to build command and build plugin dependencies in
the same way. This commit forces all plugin dependencies to be built for
the host - this is similar to what was done in #6791 and #7273.
### Testing:
An integration test checks that any targets depended on by a command plugin
are built for the host, not for the target.
* A new CommandPluginTestStub plugin has a dependency on a target executable
which will be built automatically when the plugin is run. The test checks that the
dependency is built for the host architecture, no matter which target architecture
is selected using '--triple'.
* The plugin also asks SwiftPM to build the 'placeholder' main target. The test
checks that the dependency is built for the target architecture.
The test is restricted to macOS because we can be sure of having a viable
cross-compilation environment (arm64 to x86_64 and vice versa). The standard
Linux build environments can't cross compile to other architectures.
### Result:
Command plugins can be used again when cross-compiling.
// Build or bring up-to-date any executable host-side tools on which this plugin depends. Add them and any binary dependencies to the tool-names-to-path map.
320
320
letbuildSystem=try swiftTool.createBuildSystem(
321
321
explicitBuildSystem:.native,
322
-
cacheBuildManifest:false
322
+
cacheBuildManifest:false,
323
+
// Force all dependencies to be built for the host, to work around the fact that BuildOperation.plan
324
+
// knows to compile build tool plugin dependencies for the host but does not do the same for command
0 commit comments