Skip to content

Commit 1951243

Browse files
authored
Add an --allTargets option to the console build command (#896)
Since the console command doesn't allow a fine grained selection of targets but relies on names only, it is currently sometimes not possible to build certain targets at all using that. As a simple mitigation, add an option that will simply build all targets (minus dynamic variants).
1 parent f646d37 commit 1951243

File tree

5 files changed

+29
-8
lines changed

5 files changed

+29
-8
lines changed

Sources/SWBBuildService/Messages.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ private struct WorkspaceInfoMsg: MessageHandler {
465465

466466
return WorkspaceInfoResponse(sessionHandle: session.UID, workspaceInfo: .init(targetInfos: workspaceContext.workspace.projects.flatMap { project in
467467
return project.targets.map { target in
468-
return .init(guid: target.guid, targetName: target.name, projectName: project.name)
468+
return .init(guid: target.guid, targetName: target.name, projectName: project.name, dynamicTargetVariantGuid: target.dynamicTargetVariantGuid)
469469
}
470470
}))
471471
}

Sources/SWBProtocol/Message.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,11 +1049,13 @@ public struct WorkspaceInfoResponse: Message, Equatable {
10491049
public let guid: String
10501050
public let targetName: String
10511051
public let projectName: String
1052+
public let dynamicTargetVariantGuid: String?
10521053

1053-
public init(guid: String, targetName: String, projectName: String) {
1054+
public init(guid: String, targetName: String, projectName: String, dynamicTargetVariantGuid: String?) {
10541055
self.guid = guid
10551056
self.targetName = targetName
10561057
self.projectName = projectName
1058+
self.dynamicTargetVariantGuid = dynamicTargetVariantGuid
10571059
}
10581060
}
10591061

Sources/SwiftBuild/ConsoleCommands/SWBServiceConsoleBuildCommand.swift

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
5757
var buildRequestFile: Path? = nil
5858
var buildParametersFile: Path? = nil
5959
var derivedDataPath: Path? = nil
60+
var buildAllTargets: Bool = false
6061

6162
var iterator = invocation.commandLine.makeIterator()
6263
_ = iterator.next()
@@ -69,6 +70,9 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
6970

7071
actionName = name
7172

73+
case "--allTargets":
74+
buildAllTargets = true
75+
7276
case "--target":
7377
guard let name = iterator.next() else {
7478
return .failure(.invalidCommandError(description: "error: missing argument for \(arg)"))
@@ -120,6 +124,10 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
120124

121125
let containerPath = Path(positionalArgs[0])
122126

127+
if !configuredTargetNames.isEmpty, buildAllTargets {
128+
return .failure(.invalidCommandError(description: "error: pass either --allTargets or --target"))
129+
}
130+
123131
return await invocation.console.service.withSession(sessionName: containerPath.str) { session, diagnostics in
124132
let baseDirectory: AbsolutePath
125133
do {
@@ -165,7 +173,7 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
165173
let configuredTargets: [SWBConfiguredTarget]
166174
do {
167175
let workspaceInfo = try await session.workspaceInfo()
168-
configuredTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters)
176+
configuredTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters, buildAllTargets: buildAllTargets)
169177
} catch {
170178
return .failure(.failedCommandError(description: error.localizedDescription))
171179
}
@@ -303,11 +311,11 @@ class SWBServiceConsolePrepareForIndexCommand: SWBServiceConsoleCommand {
303311
var prepareTargets: [String]?
304312
do {
305313
let workspaceInfo = try await session.workspaceInfo()
306-
configuredTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters)
314+
configuredTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters, buildAllTargets: false)
307315

308316
if !prepareTargetNames.isEmpty {
309317
do {
310-
prepareTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters).map(\.guid)
318+
prepareTargets = try workspaceInfo.configuredTargets(targetNames: configuredTargetNames, parameters: parameters, buildAllTargets: false).map(\.guid)
311319
} catch {
312320
return .failure(.failedCommandError(description: error.localizedDescription))
313321
}
@@ -375,7 +383,17 @@ fileprivate func generateDependencyInfo(startInfo: SwiftBuildMessage.BuildStarte
375383
}
376384

377385
extension SWBWorkspaceInfo {
378-
func configuredTargets(targetNames: [String], parameters: SWBBuildParameters) throws -> [SWBConfiguredTarget] {
386+
func configuredTargets(targetNames: [String], parameters: SWBBuildParameters, buildAllTargets: Bool) throws -> [SWBConfiguredTarget] {
387+
if buildAllTargets {
388+
// Filter all dynamic targets to avoid building the same content multiple times.
389+
let dynamicTargetVariantGuids = targetInfos.compactMap { $0.dynamicTargetVariantGuid }
390+
let targets = targetInfos.filter {
391+
!dynamicTargetVariantGuids.contains($0.guid)
392+
}.map {
393+
SWBConfiguredTarget(guid: $0.guid, parameters: parameters)
394+
}
395+
return targets
396+
}
379397
return try targetNames.map { targetName in
380398
let infos = targetInfos.filter { $0.targetName == targetName }
381399
switch infos.count {

Sources/SwiftBuild/SWBWorkspaceInfo.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ public struct SWBTargetInfo: Sendable {
2222
public let guid: String
2323
public let targetName: String
2424
public let projectName: String
25+
public let dynamicTargetVariantGuid: String?
2526
}
2627

2728
extension SWBWorkspaceInfo {
2829
init(_ workspaceInfo: WorkspaceInfoResponse.WorkspaceInfo) {
29-
self = .init(targetInfos: workspaceInfo.targetInfos.map { .init(guid: $0.guid, targetName: $0.targetName, projectName: $0.projectName) })
30+
self = .init(targetInfos: workspaceInfo.targetInfos.map { .init(guid: $0.guid, targetName: $0.targetName, projectName: $0.projectName, dynamicTargetVariantGuid: $0.dynamicTargetVariantGuid) })
3031
}
3132
}

Tests/SWBProtocolTests/MessageSerializationTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ import Testing
9494
assertMsgPackMessageRoundTrip(AuditSessionPIFRequest(sessionHandle: "theSession", pifContents: [4, 7, 9, 13]))
9595
assertMsgPackMessageRoundTrip(IncrementalPIFLookupFailureRequest(sessionHandle: "theSession", diagnostic: "everything went wrong"))
9696
assertMsgPackMessageRoundTrip(WorkspaceInfoRequest(sessionHandle: "theSession"))
97-
assertMsgPackMessageRoundTrip(WorkspaceInfoResponse(sessionHandle: "theSession", workspaceInfo: .init(targetInfos: [.init(guid: "theGuid", targetName: "aTarget", projectName: "aProject")])))
97+
assertMsgPackMessageRoundTrip(WorkspaceInfoResponse(sessionHandle: "theSession", workspaceInfo: .init(targetInfos: [.init(guid: "theGuid", targetName: "aTarget", projectName: "aProject", dynamicTargetVariantGuid: nil)])))
9898

9999
assertMsgPackMessageRoundTrip(ErrorResponse("everything went wrong"))
100100
assertMsgPackMessageRoundTrip(BoolResponse(true))

0 commit comments

Comments
 (0)