From 5ddd1a66bf3c64ad27f7187e882a580bc778556a Mon Sep 17 00:00:00 2001 From: Owen Voorhees Date: Tue, 11 Nov 2025 17:38:43 -0800 Subject: [PATCH 1/2] [Swift Build] Wire up --jobs --- Sources/SwiftBuildSupport/SwiftBuildSystem.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift index 9e10380367d..4e38ec9c5a8 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -1082,6 +1082,7 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { request.hideShellScriptEnvironment = true request.showNonLoggedProgress = true request.recordBuildBacktraces = buildParameters.outputParameters.enableTaskBacktraces + request.schedulerLaneWidthOverride = buildParameters.workers // Override the arena. We need to apply the arena info to both the request-global build // parameters as well as the target-specific build parameters, since they may have been From ab7b3325fb9227bb59006dde5a5ac220126505e9 Mon Sep 17 00:00:00 2001 From: Bassam Khouri Date: Fri, 5 Dec 2025 00:19:15 -0500 Subject: [PATCH 2/2] Add an automated test to validate the `--jobs` arguments is passed to SwiftBuild correctly --- .../SwiftBuildSupport/SwiftBuildSystem.swift | 14 ++++++-- .../MockBuildTestHelper.swift | 3 +- .../SwiftBuildSystemTests.swift | 32 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift index 4e38ec9c5a8..e7a0b8970db 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -1072,9 +1072,19 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { return params } - public func makeBuildRequest(session: SWBBuildServiceSession, configuredTargets: [SWBTargetGUID], derivedDataPath: Basics.AbsolutePath, symbolGraphOptions: BuildOutput.SymbolGraphOptions?) async throws -> SWBBuildRequest { + public func makeBuildRequest( + session: SWBBuildServiceSession, + configuredTargets: [SWBTargetGUID], + derivedDataPath: Basics.AbsolutePath, + symbolGraphOptions: BuildOutput.SymbolGraphOptions?, + setToolchainSetting: Bool = true, + ) async throws -> SWBBuildRequest { var request = SWBBuildRequest() - request.parameters = try await makeBuildParameters(session: session, symbolGraphOptions: symbolGraphOptions) + request.parameters = try await makeBuildParameters( + session: session, + symbolGraphOptions: symbolGraphOptions, + setToolchainSetting: setToolchainSetting, + ) request.configuredTargets = configuredTargets.map { SWBConfiguredTarget(guid: $0.rawValue, parameters: request.parameters) } request.useParallelTargets = true request.useImplicitDependencies = false diff --git a/Sources/_InternalTestSupport/MockBuildTestHelper.swift b/Sources/_InternalTestSupport/MockBuildTestHelper.swift index ecbdf5db37d..0648ff1b89a 100644 --- a/Sources/_InternalTestSupport/MockBuildTestHelper.swift +++ b/Sources/_InternalTestSupport/MockBuildTestHelper.swift @@ -98,6 +98,7 @@ public func mockBuildParameters( enableXCFrameworksOnLinux: Bool = false, prepareForIndexing: BuildParameters.PrepareForIndexingMode = .off, sanitizers: [Sanitizer] = [], + numberOfWorkers: UInt32 = 3, ) -> BuildParameters { try! BuildParameters( destination: destination, @@ -108,7 +109,7 @@ public func mockBuildParameters( flags: flags, buildSystemKind: buildSystemKind, pkgConfigDirectories: [], - workers: 3, + workers: numberOfWorkers, sanitizers: EnabledSanitizers(Set(sanitizers)), indexStoreMode: indexStoreMode, prepareForIndexing: prepareForIndexing, diff --git a/Tests/SwiftBuildSupportTests/SwiftBuildSystemTests.swift b/Tests/SwiftBuildSupportTests/SwiftBuildSystemTests.swift index f8a6c243bde..696d57daea5 100644 --- a/Tests/SwiftBuildSupportTests/SwiftBuildSystemTests.swift +++ b/Tests/SwiftBuildSupportTests/SwiftBuildSystemTests.swift @@ -269,4 +269,36 @@ struct SwiftBuildSystemTests { ) } } + + @Test( + arguments: [ + 0, + 1, + 2, + 10, + ], + ) + func numberOfWorkersBuildParameterSetsTheExpectedSwiftBuildRequest( + expectedNumberOfWorkers: UInt32, + ) async throws { + try await withTemporaryDirectory { tempDir in + try await withInstantiatedSwiftBuildSystem( + fromFixture: "PIFBuilder/Simple", + buildParameters: mockBuildParameters( + destination: .host, + numberOfWorkers: expectedNumberOfWorkers, + ), + ) { swiftBuild, session, observabilityScope, buildParameters in + let buildRequest = try await swiftBuild.makeBuildRequest( + session: session, + configuredTargets: [], + derivedDataPath: tempDir, + symbolGraphOptions: nil, + setToolchainSetting: false + ) + + #expect(buildRequest.schedulerLaneWidthOverride == expectedNumberOfWorkers) + } + } + } }