Skip to content

Commit fab38b1

Browse files
committed
Refactor Commands module
This is the initial step in reducing the first stage of the bootstrap build. Currently, the initial bootstrap build using CMake is essentially building the entirety of SwiftPM and that is (mostly) because the `Commands` module pulls in everything that SwiftPM possibly offers. This introduces a new `CoreCommands` module which contains the necessary parts for providing a minimal build command using the native build system. This can be used to provide a new `swift-bootstrap` executable which is a minimal version of `swift-build`, but actually doing so will be a separate PR. The Windows build currently relies entirely on CMake, so initally we will not be able to profit much from the minimal build, but this will get us closer to doing so in the future.
1 parent 256c682 commit fab38b1

26 files changed

+613
-420
lines changed

Package.swift

+15
Original file line numberDiff line numberDiff line change
@@ -342,13 +342,28 @@ let package = Package(
342342

343343
// MARK: Commands
344344

345+
.target(
346+
/** Minimal set of commands required for bootstrapping a new SwiftPM */
347+
name: "CoreCommands",
348+
dependencies: [
349+
.product(name: "ArgumentParser", package: "swift-argument-parser"),
350+
"Basics",
351+
"Build",
352+
"PackageFingerprint",
353+
"PackageModel",
354+
"Workspace",
355+
],
356+
exclude: ["CMakeLists.txt"]
357+
),
358+
345359
.target(
346360
/** High-level commands */
347361
name: "Commands",
348362
dependencies: [
349363
.product(name: "ArgumentParser", package: "swift-argument-parser"),
350364
"Basics",
351365
"Build",
366+
"CoreCommands",
352367
"PackageCollections",
353368
"PackageFingerprint",
354369
"PackageGraph",

Sources/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ add_subdirectory(SPMSQLite3)
1010
add_subdirectory(Basics)
1111
add_subdirectory(Build)
1212
add_subdirectory(Commands)
13+
add_subdirectory(CoreCommands)
1314
add_subdirectory(DriverSupport)
1415
add_subdirectory(LLBuildManifest)
1516
add_subdirectory(PackageCollections)

Sources/Commands/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors
88

99
add_library(Commands
10-
Options.swift
1110
Snippets/CardEvent.swift
1211
Snippets/Cards/SnippetCard.swift
1312
Snippets/Cards/SnippetGroupCard.swift
@@ -21,7 +20,7 @@ add_library(Commands
2120
SwiftPackageTool.swift
2221
SwiftRunTool.swift
2322
SwiftTestTool.swift
24-
SwiftTool.swift
23+
ToolWorkspaceDelegate.swift
2524
Utilities/APIDigester.swift
2625
Utilities/DependenciesSerializer.swift
2726
Utilities/Describe.swift
@@ -34,6 +33,7 @@ target_link_libraries(Commands PUBLIC
3433
ArgumentParser
3534
Basics
3635
Build
36+
CoreCommands
3737
PackageCollections
3838
PackageFingerprint
3939
PackageGraph

Sources/Commands/Snippets/CardStack.swift

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14+
import CoreCommands
1415
import PackageGraph
1516
import PackageModel
1617
import TSCBasic

Sources/Commands/Snippets/Cards/SnippetCard.swift

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import CoreCommands
1314
import PackageModel
1415
import TSCBasic
1516

Sources/Commands/Snippets/Cards/SnippetGroupCard.swift

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import CoreCommands
1314
import PackageModel
1415

1516
/// A card showing the snippets in a ``SnippetGroup``.

Sources/Commands/Snippets/Cards/TopCard.swift

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import CoreCommands
1314
import Foundation
1415
import PackageModel
1516
import PackageGraph

Sources/Commands/SwiftBuildTool.swift

+20-4
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import ArgumentParser
1414
import Basics
1515
import Build
16+
import CoreCommands
1617
import PackageGraph
1718
import SPMBuildCore
1819
import TSCBasic
20+
import XCBuildSupport
1921

2022
import enum TSCUtility.Diagnostics
2123
import func TSCUtility.getClangVersion
@@ -94,7 +96,7 @@ public struct SwiftBuildTool: SwiftCommand {
9496
helpNames: [.short, .long, .customLong("help", withSingleDash: true)])
9597

9698
@OptionGroup()
97-
var globalOptions: GlobalOptions
99+
public var globalOptions: GlobalOptions
98100

99101
@OptionGroup()
100102
var options: BuildToolOptions
@@ -157,8 +159,22 @@ public struct SwiftBuildTool: SwiftCommand {
157159
public init() {}
158160
}
159161

160-
extension Basics.Diagnostic {
161-
static func mutuallyExclusiveArgumentsError(arguments: [String]) -> Self {
162-
.error(arguments.map{ "'\($0)'" }.spm_localizedJoin(type: .conjunction) + " are mutually exclusive")
162+
extension SwiftCommand {
163+
public func buildSystemProvider(_ swiftTool: SwiftTool) throws -> BuildSystemProvider {
164+
return .init(providers: try swiftTool.defaultBuildSystemProvider.providers.merging([
165+
.xcode: { (explicitProduct: String?, cacheBuildManifest: Bool, customBuildParameters: BuildParameters?, customPackageGraphLoader: (() throws -> PackageGraph)?, customOutputStream: OutputByteStream?, customLogLevel: Basics.Diagnostic.Severity?, customObservabilityScope: ObservabilityScope?) throws -> BuildSystem in
166+
let graphLoader = { try swiftTool.loadPackageGraph(explicitProduct: explicitProduct) }
167+
return try XcodeBuildSystem(
168+
buildParameters: customBuildParameters ?? swiftTool.buildParameters(),
169+
packageGraphLoader: customPackageGraphLoader ?? graphLoader,
170+
outputStream: customOutputStream ?? swiftTool.outputStream,
171+
logLevel: customLogLevel ?? swiftTool.logLevel,
172+
fileSystem: swiftTool.fileSystem,
173+
observabilityScope: customObservabilityScope ?? swiftTool.observabilityScope
174+
)
175+
},
176+
], uniquingKeysWith: { a, b in
177+
return b
178+
}))
163179
}
164180
}

Sources/Commands/SwiftPackageCollectionsTool.swift

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ArgumentParser
1414
import Basics
15+
import CoreCommands
1516
import Foundation
1617
import PackageCollections
1718
import PackageModel

Sources/Commands/SwiftPackageRegistryTool.swift

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ArgumentParser
1414
import Basics
15+
import CoreCommands
1516
import TSCBasic
1617
import SPMBuildCore
1718
import PackageModel

Sources/Commands/SwiftPackageTool.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ArgumentParser
1414
import Basics
15+
import CoreCommands
1516
import TSCBasic
1617
import SPMBuildCore
1718
import PackageModel
@@ -1190,7 +1191,7 @@ final class PluginDelegate: PluginInvocationDelegate {
11901191
buildParameters.flags.linkerFlags.append(contentsOf: parameters.otherLinkerFlags)
11911192

11921193
// Configure the verbosity of the output.
1193-
let logLevel: Diagnostic.Severity
1194+
let logLevel: Basics.Diagnostic.Severity
11941195
switch parameters.logging {
11951196
case .concise:
11961197
logLevel = .warning

Sources/Commands/SwiftRunTool.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ArgumentParser
1414
import Basics
15+
import CoreCommands
1516
import PackageGraph
1617
import PackageModel
1718
import TSCBasic
@@ -96,12 +97,12 @@ public struct SwiftRunTool: SwiftCommand {
9697
helpNames: [.short, .long, .customLong("help", withSingleDash: true)])
9798

9899
@OptionGroup()
99-
var globalOptions: GlobalOptions
100+
public var globalOptions: GlobalOptions
100101

101102
@OptionGroup()
102103
var options: RunToolOptions
103104

104-
var toolWorkspaceConfiguration: ToolWorkspaceConfiguration {
105+
public var toolWorkspaceConfiguration: ToolWorkspaceConfiguration {
105106
return .init(wantsREPLProduct: options.mode == .repl)
106107
}
107108

Sources/Commands/SwiftTestTool.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import ArgumentParser
1414
import Basics
15+
import CoreCommands
1516
import Dispatch
1617
import class Foundation.NSLock
1718
import class Foundation.ProcessInfo
@@ -150,7 +151,7 @@ public struct SwiftTestTool: SwiftCommand {
150151
helpNames: [.short, .long, .customLong("help", withSingleDash: true)])
151152

152153
@OptionGroup()
153-
var globalOptions: GlobalOptions
154+
public var globalOptions: GlobalOptions
154155

155156
@OptionGroup()
156157
var sharedOptions: SharedOptions

0 commit comments

Comments
 (0)