Skip to content

Commit a432dc8

Browse files
MaxDesiatoveuanh
andauthored
[5.9] Build command plugin dependencies for the host, not the target (#6799)
When cross-compiling, SwiftPM plugins and their dependencies run on the host and so must be compiled for the host OS and architecture, not the cross-compiled target OS and architecture. SwiftPM will compile a command plugin for the host but if the plugin depends on an executable it will cross-compile the executable for the target, so the plugin will not be able to run it: error: Error Domain=NSPOSIXErrorDomain Code=8 "Exec format error" Command plugin dependencies are already handled specially in PluginCommand.run; this commit makes that special build step use the host toolchain instead of the target toolchain. #6060 handled the equivalent problem for build tool plugins. (cherry picked from commit 1daaa1c) ``` # Conflicts: # Sources/CoreCommands/SwiftTool.swift ``` Co-authored-by: Euan Harris <[email protected]>
1 parent c0c9cf4 commit a432dc8

File tree

3 files changed

+57
-38
lines changed

3 files changed

+57
-38
lines changed

Sources/Commands/PackageTools/PluginCommand.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,11 @@ struct PluginCommand: SwiftCommand {
249249
+ getEnvSearchPaths(pathString: ProcessEnv.path, currentWorkingDirectory: .none)
250250

251251
// 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.
252-
let buildSystem = try swiftTool.createBuildSystem(explicitBuildSystem: .native, cacheBuildManifest: false)
252+
let buildSystem = try swiftTool.createBuildSystem(
253+
explicitBuildSystem: .native,
254+
cacheBuildManifest: false,
255+
customBuildParameters: swiftTool.hostBuildParameters()
256+
)
253257
let accessibleTools = try plugin.processAccessibleTools(
254258
packageGraph: packageGraph,
255259
fileSystem: swiftTool.fileSystem,

Sources/CoreCommands/SwiftTool.swift

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -664,50 +664,62 @@ public final class SwiftTool {
664664
return buildSystem
665665
}
666666

667+
private func _buildParams(toolchain: UserToolchain) throws -> BuildParameters {
668+
let destinationTriple = toolchain.triple
669+
670+
let dataPath = self.scratchDirectory.appending(
671+
component: destinationTriple.platformBuildPathComponent(buildSystem: options.build.buildSystem)
672+
)
673+
674+
return try BuildParameters(
675+
dataPath: dataPath,
676+
configuration: options.build.configuration,
677+
toolchain: toolchain,
678+
destinationTriple: destinationTriple,
679+
flags: options.build.buildFlags,
680+
pkgConfigDirectories: options.locations.pkgConfigDirectories,
681+
architectures: options.build.architectures,
682+
workers: options.build.jobs ?? UInt32(ProcessInfo.processInfo.activeProcessorCount),
683+
shouldLinkStaticSwiftStdlib: options.linker.shouldLinkStaticSwiftStdlib,
684+
canRenameEntrypointFunctionName: driverSupport.checkSupportedFrontendFlags(
685+
flags: ["entry-point-function-name"],
686+
toolchain: toolchain,
687+
fileSystem: self.fileSystem
688+
),
689+
sanitizers: options.build.enabledSanitizers,
690+
enableCodeCoverage: false, // set by test commands when appropriate
691+
indexStoreMode: options.build.indexStoreMode.buildParameter,
692+
enableParseableModuleInterfaces: options.build.shouldEnableParseableModuleInterfaces,
693+
useIntegratedSwiftDriver: options.build.useIntegratedSwiftDriver,
694+
useExplicitModuleBuild: options.build.useExplicitModuleBuild,
695+
isXcodeBuildSystemEnabled: options.build.buildSystem == .xcode,
696+
forceTestDiscovery: options.build.enableTestDiscovery, // backwards compatibility, remove with --enable-test-discovery
697+
testEntryPointPath: options.build.testEntryPointPath,
698+
explicitTargetDependencyImportCheckingMode: options.build.explicitTargetDependencyImportCheck.modeParameter,
699+
linkerDeadStrip: options.linker.linkerDeadStrip,
700+
verboseOutput: self.logLevel <= .info
701+
)
702+
}
703+
704+
/// Return the build parameters for the host toolchain.
705+
public func hostBuildParameters() throws -> BuildParameters {
706+
return try _hostBuildParameters.get()
707+
}
708+
709+
private lazy var _hostBuildParameters: Result<BuildParameters, Swift.Error> = {
710+
return Result(catching: {
711+
try _buildParams(toolchain: self.getHostToolchain())
712+
})
713+
}()
714+
667715
/// Return the build parameters.
668716
public func buildParameters() throws -> BuildParameters {
669717
return try _buildParameters.get()
670718
}
671719

672720
private lazy var _buildParameters: Result<BuildParameters, Swift.Error> = {
673721
return Result(catching: {
674-
let destinationToolchain = try self.getDestinationToolchain()
675-
let destinationTriple = destinationToolchain.triple
676-
677-
// Use "apple" as the subdirectory because in theory Xcode build system
678-
// can be used to build for any Apple platform and it has it's own
679-
// conventions for build subpaths based on platforms.
680-
let dataPath = self.scratchDirectory.appending(
681-
component: destinationTriple.platformBuildPathComponent(buildSystem: options.build.buildSystem)
682-
)
683-
684-
return try BuildParameters(
685-
dataPath: dataPath,
686-
configuration: options.build.configuration,
687-
toolchain: destinationToolchain,
688-
destinationTriple: destinationTriple,
689-
flags: options.build.buildFlags,
690-
pkgConfigDirectories: options.locations.pkgConfigDirectories,
691-
architectures: options.build.architectures,
692-
workers: options.build.jobs ?? UInt32(ProcessInfo.processInfo.activeProcessorCount),
693-
shouldLinkStaticSwiftStdlib: options.linker.shouldLinkStaticSwiftStdlib,
694-
canRenameEntrypointFunctionName: driverSupport.checkSupportedFrontendFlags(
695-
flags: ["entry-point-function-name"], toolchain: destinationToolchain, fileSystem: self.fileSystem
696-
),
697-
sanitizers: options.build.enabledSanitizers,
698-
enableCodeCoverage: false, // set by test commands when appropriate
699-
indexStoreMode: options.build.indexStoreMode.buildParameter,
700-
enableParseableModuleInterfaces: options.build.shouldEnableParseableModuleInterfaces,
701-
emitSwiftModuleSeparately: options.build.emitSwiftModuleSeparately,
702-
useIntegratedSwiftDriver: options.build.useIntegratedSwiftDriver,
703-
useExplicitModuleBuild: options.build.useExplicitModuleBuild,
704-
isXcodeBuildSystemEnabled: options.build.buildSystem == .xcode,
705-
forceTestDiscovery: options.build.enableTestDiscovery, // backwards compatibility, remove with --enable-test-discovery
706-
testEntryPointPath: options.build.testEntryPointPath,
707-
explicitTargetDependencyImportCheckingMode: options.build.explicitTargetDependencyImportCheck.modeParameter,
708-
linkerDeadStrip: options.linker.linkerDeadStrip,
709-
verboseOutput: self.logLevel <= .info
710-
)
722+
try _buildParams(toolchain: self.getDestinationToolchain())
711723
})
712724
}()
713725

Sources/SPMBuildCore/Triple+Extensions.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ extension Triple {
2424

2525
extension Triple {
2626
public func platformBuildPathComponent(buildSystem: BuildSystemProvider.Kind) -> String {
27+
// Use "apple" as the subdirectory because in theory Xcode build system
28+
// can be used to build for any Apple platform and it has its own
29+
// conventions for build subpaths based on platforms.
2730
buildSystem == .xcode ? "apple" : self.platformBuildPathComponent()
2831
}
2932
}

0 commit comments

Comments
 (0)