From 1523ce0e0feff7c41318dd46c422ecb31fd0bcb7 Mon Sep 17 00:00:00 2001 From: Owen Voorhees Date: Thu, 6 Mar 2025 12:27:36 -0800 Subject: [PATCH 1/2] Include Swift Build support in second stage bootstrap builds --- Utilities/bootstrap | 1 - 1 file changed, 1 deletion(-) diff --git a/Utilities/bootstrap b/Utilities/bootstrap index 8fc540d2983..82c4f6e9067 100755 --- a/Utilities/bootstrap +++ b/Utilities/bootstrap @@ -809,7 +809,6 @@ def get_swiftpm_env_cmd(args): if args.llbuild_link_framework: env_cmd.append("SWIFTPM_LLBUILD_FWK=1") - env_cmd.append("SWIFTPM_NO_SWBUILD_DEPENDENCY=1") env_cmd.append("SWIFTCI_USE_LOCAL_DEPS=1") env_cmd.append("SWIFTPM_MACOS_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target) From c1519f2c49d086a381e96d91723d51821d2105fa Mon Sep 17 00:00:00 2001 From: Owen Voorhees Date: Fri, 7 Mar 2025 09:53:24 -0800 Subject: [PATCH 2/2] Install Swift Build resource bundles in /usr/share/pm --- Sources/CoreCommands/BuildSystemSupport.swift | 1 + Sources/CoreCommands/Options.swift | 6 ++++++ Sources/CoreCommands/SwiftCommandState.swift | 14 ++++++++++++++ Sources/SwiftBuildSupport/SwiftBuildSystem.swift | 8 ++++++-- Sources/swift-bootstrap/main.swift | 1 + Utilities/bootstrap | 5 +++++ 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Sources/CoreCommands/BuildSystemSupport.swift b/Sources/CoreCommands/BuildSystemSupport.swift index 22e5e1b5f92..d3ac82f75ca 100644 --- a/Sources/CoreCommands/BuildSystemSupport.swift +++ b/Sources/CoreCommands/BuildSystemSupport.swift @@ -120,6 +120,7 @@ private struct SwiftBuildSystemFactory: BuildSystemFactory { explicitProduct: explicitProduct ) }, + packageManagerResourcesDirectory: swiftCommandState.packageManagerResourcesDirectory, outputStream: outputStream ?? self.swiftCommandState.outputStream, logLevel: logLevel ?? self.swiftCommandState.logLevel, fileSystem: self.swiftCommandState.fileSystem, diff --git a/Sources/CoreCommands/Options.swift b/Sources/CoreCommands/Options.swift index fd139aa53c3..6180c5ee508 100644 --- a/Sources/CoreCommands/Options.swift +++ b/Sources/CoreCommands/Options.swift @@ -146,6 +146,12 @@ public struct LocationOptions: ParsableArguments { completion: .directory ) public var pkgConfigDirectories: [AbsolutePath] = [] + + @Option( + help: .init("Specify alternate path to search for SwiftPM resources.", visibility: .hidden), + completion: .directory + ) + public var packageManagerResourcesDirectory: AbsolutePath? @Flag(name: .customLong("ignore-lock"), help: .hidden) public var ignoreLock: Bool = false diff --git a/Sources/CoreCommands/SwiftCommandState.swift b/Sources/CoreCommands/SwiftCommandState.swift index 1773c70e489..bb1fcafcd17 100644 --- a/Sources/CoreCommands/SwiftCommandState.swift +++ b/Sources/CoreCommands/SwiftCommandState.swift @@ -227,6 +227,9 @@ public final class SwiftCommandState { /// Path to the shared configuration directory public let sharedConfigurationDirectory: AbsolutePath + + /// Path to the package manager's own resources directory. + public let packageManagerResourcesDirectory: AbsolutePath? /// Path to the cross-compilation Swift SDKs directory. public let sharedSwiftSDKsDirectory: AbsolutePath @@ -371,6 +374,17 @@ public final class SwiftCommandState { warning: "`--experimental-swift-sdks-path` is deprecated and will be removed in a future version of SwiftPM. Use `--swift-sdks-path` instead." ) } + + if let packageManagerResourcesDirectory = options.locations.packageManagerResourcesDirectory { + self.packageManagerResourcesDirectory = packageManagerResourcesDirectory + } else if let cwd = localFileSystem.currentWorkingDirectory { + self.packageManagerResourcesDirectory = try? AbsolutePath(validating: CommandLine.arguments[0], relativeTo: cwd) + .parentDirectory.parentDirectory.appending(components: ["share", "pm"]) + } else { + self.packageManagerResourcesDirectory = try? AbsolutePath(validating: CommandLine.arguments[0]) + .parentDirectory.parentDirectory.appending(components: ["share", "pm"]) + } + self.sharedSwiftSDKsDirectory = try fileSystem.getSharedSwiftSDKsDirectory( explicitDirectory: options.locations.swiftSDKsDirectory ?? options.locations.deprecatedSwiftSDKsDirectory ) diff --git a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift index d451bf92475..4613a77b728 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -46,12 +46,13 @@ struct SessionFailedError: Error { func withSession( service: SWBBuildService, name: String, + packageManagerResourcesDirectory: Basics.AbsolutePath?, body: @escaping ( _ session: SWBBuildServiceSession, _ diagnostics: [SwiftBuild.SwiftBuildMessage.DiagnosticInfo] ) async throws -> Void ) async throws { - switch await service.createSession(name: name, cachePath: nil, inferiorProductsPath: nil, environment: nil) { + switch await service.createSession(name: name, resourceSearchPaths: packageManagerResourcesDirectory.map { [$0.pathString] } ?? [], cachePath: nil, inferiorProductsPath: nil, environment: nil) { case (.success(let session), let diagnostics): do { try await body(session, diagnostics) @@ -143,6 +144,7 @@ private final class PlanningOperationDelegate: SWBPlanningOperationDelegate, Sen public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { private let buildParameters: BuildParameters private let packageGraphLoader: () async throws -> ModulesGraph + private let packageManagerResourcesDirectory: Basics.AbsolutePath? private let logLevel: Basics.Diagnostic.Severity private var packageGraph: AsyncThrowingValueMemoizer = .init() private var pifBuilder: AsyncThrowingValueMemoizer = .init() @@ -193,6 +195,7 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { public init( buildParameters: BuildParameters, packageGraphLoader: @escaping () async throws -> ModulesGraph, + packageManagerResourcesDirectory: Basics.AbsolutePath?, outputStream: OutputByteStream, logLevel: Basics.Diagnostic.Severity, fileSystem: FileSystem, @@ -200,6 +203,7 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { ) throws { self.buildParameters = buildParameters self.packageGraphLoader = packageGraphLoader + self.packageManagerResourcesDirectory = packageManagerResourcesDirectory self.outputStream = outputStream self.logLevel = logLevel self.fileSystem = fileSystem @@ -241,7 +245,7 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { ) do { - try await withSession(service: service, name: buildParameters.pifManifest.pathString) { session, _ in + try await withSession(service: service, name: buildParameters.pifManifest.pathString, packageManagerResourcesDirectory: packageManagerResourcesDirectory) { session, _ in // Load the workspace, and set the system information to the default do { try await session.loadWorkspace(containerPath: self.buildParameters.pifManifest.pathString) diff --git a/Sources/swift-bootstrap/main.swift b/Sources/swift-bootstrap/main.swift index 3a9df06b679..da9c6f7e5b1 100644 --- a/Sources/swift-bootstrap/main.swift +++ b/Sources/swift-bootstrap/main.swift @@ -362,6 +362,7 @@ struct SwiftBootstrapBuildTool: AsyncParsableCommand { return try SwiftBuildSystem( buildParameters: buildParameters, packageGraphLoader: asyncUnsafePackageGraphLoader, + packageManagerResourcesDirectory: nil, outputStream: TSCBasic.stdoutStream, logLevel: logLevel, fileSystem: self.fileSystem, diff --git a/Utilities/bootstrap b/Utilities/bootstrap index 82c4f6e9067..8eb66816e7b 100755 --- a/Utilities/bootstrap +++ b/Utilities/bootstrap @@ -518,6 +518,11 @@ def install_swiftpm(prefix, args): dest = os.path.join(prefix, "lib", "swift", "pm", "PluginAPI") install_dylib(args, "PackagePlugin", dest, ["PackagePlugin"]) + # Install resource bundles produced during the build. + for file in os.listdir(args.bin_dir): + if file.endswith('.bundle') or file.endswith('.resources'): + install_binary(args, file, os.path.join(os.path.join(prefix, "share"), "pm")) + # Helper function that installs a dynamic library and a set of modules to a particular directory. def install_dylib(args, library_name, install_dir, module_names):