Skip to content

Commit f4035c1

Browse files
authored
Build SwiftBuild as part of CMake bootstrapping (#8445)
Build on swiftlang/swift-build#376 to begin building Swift Build during the CMake bootstrap of SwiftPM Depends on: swiftlang/swift-installer-scripts#417
1 parent 43e524c commit f4035c1

16 files changed

+20
-69
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ if(FIND_PM_DEPS)
4545
find_package(SwiftASN1 CONFIG REQUIRED)
4646
find_package(SwiftCertificates CONFIG REQUIRED)
4747
find_package(SwiftCrypto CONFIG REQUIRED)
48+
find_package(SwiftBuild CONFIG REQUIRED)
4849
endif()
4950

5051
find_package(dispatch QUIET)

Package.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,8 +1108,7 @@ if ProcessInfo.processInfo.environment["ENABLE_APPLE_PRODUCT_TYPES"] == "1" {
11081108
}
11091109
}
11101110

1111-
if ProcessInfo.processInfo.environment["SWIFTPM_SWBUILD_FRAMEWORK"] == nil &&
1112-
ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil {
1111+
if ProcessInfo.processInfo.environment["SWIFTPM_SWBUILD_FRAMEWORK"] == nil {
11131112

11141113
let swiftbuildsupport: Target = package.targets.first(where: { $0.name == "SwiftBuildSupport" } )!
11151114
swiftbuildsupport.dependencies += [

Sources/SwiftBuildSupport/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ target_link_libraries(SwiftBuildSupport PUBLIC
2424
TSCBasic
2525
TSCUtility
2626
PackageGraph
27+
SwiftBuild::SwiftBuild
28+
SwiftBuild::SWBBuildService
2729
)
2830

2931
set_target_properties(SwiftBuildSupport PROPERTIES

Sources/SwiftBuildSupport/DotPIFSerializer.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Basics
99
import Foundation
1010
import protocol TSCBasic.OutputByteStream
1111

12-
#if canImport(SwiftBuild)
1312
import SwiftBuild
1413

1514
/// Serializes the specified PIF as a **Graphviz** directed graph.
@@ -223,5 +222,3 @@ fileprivate extension String {
223222
"\""
224223
}
225224
}
226-
227-
#endif

Sources/SwiftBuildSupport/PIF.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import PackageModel
1717

1818
import struct TSCBasic.ByteString
1919

20-
#if canImport(SwiftBuild)
2120
import enum SwiftBuild.ProjectModel
2221

2322
/// The Project Interchange Format (PIF) is a structured representation of the
@@ -286,5 +285,3 @@ extension PIF {
286285
workspace.signature = try signature(of: workspace)
287286
}
288287
}
289-
290-
#endif // SwiftBuild

Sources/SwiftBuildSupport/PIFBuilder.swift

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ import func TSCBasic.memoize
2424
import func TSCBasic.topologicalSort
2525
import var TSCBasic.stdoutStream
2626

27-
#if canImport(SwiftBuild)
2827
import enum SwiftBuild.ProjectModel
29-
#endif
3028

3129
/// The parameters required by `PIFBuilder`.
3230
struct PIFBuilderParameters {
@@ -103,7 +101,6 @@ public final class PIFBuilder {
103101
printPIFManifestGraphviz: Bool = false,
104102
buildParameters: BuildParameters
105103
) throws -> String {
106-
#if canImport(SwiftBuild)
107104
let encoder = prettyPrint ? JSONEncoder.makeWithDefaults() : JSONEncoder()
108105

109106
if !preservePIFModelStructure {
@@ -129,13 +126,8 @@ public final class PIFBuilder {
129126
}
130127

131128
return pifString
132-
#else
133-
fatalError("Swift Build support is not linked in.")
134-
#endif
135129
}
136-
137-
#if canImport(SwiftBuild)
138-
130+
139131
private var cachedPIF: PIF.TopLevelObject?
140132

141133
/// Constructs a `PIF.TopLevelObject` representing the package graph.
@@ -192,8 +184,6 @@ public final class PIFBuilder {
192184
return PIF.TopLevelObject(workspace: workspace)
193185
}
194186
}
195-
196-
#endif
197187

198188
// Convenience method for generating PIF.
199189
public static func generatePIF(
@@ -214,8 +204,6 @@ public final class PIFBuilder {
214204
}
215205
}
216206

217-
#if canImport(SwiftBuild)
218-
219207
fileprivate final class PackagePIFBuilderDelegate: PackagePIFBuilder.BuildDelegate {
220208
let package: ResolvedPackage
221209

@@ -421,8 +409,6 @@ fileprivate func buildAggregateProject(
421409
return aggregateProject
422410
}
423411

424-
#endif
425-
426412
public enum PIFGenerationError: Error {
427413
case rootPackageNotFound, multipleRootPackagesFound
428414

Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ func targetName(forProductName name: String, suffix: String? = nil) -> String {
6161
return "\(name)\(suffix)-product"
6262
}
6363

64-
#if canImport(SwiftBuild)
65-
6664
import enum SwiftBuild.ProjectModel
6765

6866
// MARK: - PIF GUID Helpers
@@ -1216,4 +1214,3 @@ extension UserDefaults {
12161214
}
12171215
}
12181216

1219-
#endif

Sources/SwiftBuildSupport/PackagePIFBuilder+Plugins.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import enum Basics.Sandbox
1818
import struct Basics.AbsolutePath
1919
import struct Basics.SourceControlURL
2020

21-
#if canImport(SwiftBuild)
22-
2321
import enum SwiftBuild.ProjectModel
2422

2523
extension PackagePIFBuilder {
@@ -136,4 +134,3 @@ extension PackagePIFBuilder {
136134
}
137135
}
138136

139-
#endif

Sources/SwiftBuildSupport/PackagePIFBuilder.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ import struct PackageGraph.ModulesGraph
3232
import struct PackageGraph.ResolvedModule
3333
import struct PackageGraph.ResolvedPackage
3434

35-
#if canImport(SwiftBuild)
36-
3735
import enum SwiftBuild.ProjectModel
3836

3937
typealias GUID = SwiftBuild.ProjectModel.GUID
@@ -668,5 +666,3 @@ extension PackagePIFBuilder.LinkedPackageBinary {
668666
}
669667
}
670668
}
671-
672-
#endif

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Modules.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import class PackageModel.SystemLibraryModule
2626
import struct PackageGraph.ResolvedModule
2727
import struct PackageGraph.ResolvedPackage
2828

29-
#if canImport(SwiftBuild)
30-
3129
import enum SwiftBuild.ProjectModel
3230

3331
/// Extension to create PIF **modules** for a given package.
@@ -884,5 +882,3 @@ extension PackagePIFProjectBuilder {
884882
self.builtModulesAndProducts.append(systemModule)
885883
}
886884
}
887-
888-
#endif

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Products.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import struct PackageGraph.ResolvedModule
2828
import struct PackageGraph.ResolvedPackage
2929
import struct PackageGraph.ResolvedProduct
3030

31-
#if canImport(SwiftBuild)
32-
3331
import enum SwiftBuild.ProjectModel
3432

3533
/// Extension to create PIF **products** for a given package.
@@ -1014,4 +1012,3 @@ private struct PackageRegistrySignature: Encodable {
10141012
let formatVersion = 2
10151013
}
10161014

1017-
#endif

Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ import struct PackageGraph.ResolvedPackage
3131
import struct PackageLoading.FileRuleDescription
3232
import struct PackageLoading.TargetSourcesBuilder
3333

34-
#if canImport(SwiftBuild)
35-
3634
import struct SwiftBuild.Pair
3735
import enum SwiftBuild.ProjectModel
3836
import struct SwiftBuild.SwiftBuildFileType
@@ -549,4 +547,3 @@ struct PackagePIFProjectBuilder {
549547
}
550548
}
551549

552-
#endif

Sources/SwiftBuildSupport/SwiftBuildSystem.swift

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,10 @@ import func TSCBasic.withTemporaryFile
3030

3131
import enum TSCUtility.Diagnostics
3232

33-
#if canImport(SwiftBuild)
3433
import Foundation
3534
import SWBBuildService
3635
import SwiftBuild
37-
#endif
3836

39-
#if canImport(SwiftBuild)
4037

4138
struct SessionFailedError: Error {
4239
var error: Error
@@ -155,7 +152,6 @@ private final class PlanningOperationDelegate: SWBPlanningOperationDelegate, Sen
155152
.deferred
156153
}
157154
}
158-
#endif
159155

160156
public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
161157
private let buildParameters: BuildParameters
@@ -232,7 +228,6 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
232228
}
233229

234230
public func build(subset: BuildSubset) async throws {
235-
#if canImport(SwiftBuild)
236231
guard !buildParameters.shouldSkipBuilding else {
237232
return
238233
}
@@ -247,12 +242,9 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
247242

248243
try await startSWBuildOperation(pifTargetName: subset.pifTargetName)
249244

250-
#else
251-
fatalError("Swift Build support is not linked in.")
252-
#endif
245+
253246
}
254247

255-
#if canImport(SwiftBuild)
256248
private func startSWBuildOperation(pifTargetName: String) async throws {
257249
let buildStartTime = ContinuousClock.Instant.now
258250

@@ -511,7 +503,6 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
511503
return pifBuilder
512504
}
513505
}
514-
#endif
515506

516507
public func cancel(deadline: DispatchTime) throws {}
517508

@@ -545,8 +536,6 @@ extension Basics.Diagnostic.Severity {
545536
}
546537
}
547538

548-
#if canImport(SwiftBuild)
549-
550539
fileprivate extension SwiftBuild.SwiftBuildMessage.DiagnosticInfo.Location {
551540
var userDescription: String? {
552541
switch self {
@@ -573,5 +562,3 @@ fileprivate extension SwiftBuild.SwiftBuildMessage.DiagnosticInfo.Location {
573562
}
574563
}
575564
}
576-
577-
#endif

Tests/CommandsTests/BuildCommandTests.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -942,10 +942,6 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
942942
override func testBuildSystemDefaultSettings() async throws {
943943
try XCTSkipIfWorkingDirectoryUnsupported()
944944

945-
if ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] != nil {
946-
throw XCTSkip("SWIFTPM_NO_SWBUILD_DEPENDENCY is set so skipping because SwiftPM doesn't have the swift-build capability built inside.")
947-
}
948-
949945
try await super.testBuildSystemDefaultSettings()
950946
}
951947

Tests/CommandsTests/TestCommandTests.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -632,18 +632,10 @@ class TestCommandSwiftBuildTests: TestCommandTestCase {
632632
}
633633

634634
override func testFatalErrorDisplayedCorrectNumberOfTimesWhenSingleXCTestHasFatalErrorInBuildCompilation() async throws {
635-
guard ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil else {
636-
throw XCTSkip("Skipping test because SwiftBuild is not linked in.")
637-
}
638-
639635
try await super.testFatalErrorDisplayedCorrectNumberOfTimesWhenSingleXCTestHasFatalErrorInBuildCompilation()
640636
}
641637

642638
override func testListWithSkipBuildAndNoBuildArtifacts() async throws {
643-
guard ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil else {
644-
throw XCTSkip("Skipping test because SwiftBuild is not linked in.")
645-
}
646-
647639
try await super.testListWithSkipBuildAndNoBuildArtifacts()
648640
}
649641

Utilities/bootstrap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ def parse_global_args(args):
243243
args.source_dirs["swift-certificates"] = os.path.join(args.project_root, "..", "swift-certificates")
244244
args.source_dirs["swift-asn1"] = os.path.join(args.project_root, "..", "swift-asn1")
245245
args.source_dirs["swift-syntax"] = os.path.join(args.project_root, "..", "swift-syntax")
246+
args.source_dirs["swift-build"] = os.path.join(args.project_root, "..", "swift-build")
246247
args.source_root = os.path.join(args.project_root, "Sources")
247248

248249
if platform.system() == 'Darwin':
@@ -442,6 +443,16 @@ def build(args):
442443
build_dependency(args, "swift-certificates",
443444
["-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
444445
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules")])
446+
swift_build_cmake_flags = [
447+
get_llbuild_cmake_arg(args),
448+
"-DSwiftSystem_DIR=" + os.path.join(args.build_dirs["swift-system"], "cmake/modules"),
449+
"-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
450+
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
451+
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
452+
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
453+
"-DSwiftDriver_DIR=" + os.path.join(args.build_dirs["swift-driver"], "cmake/modules"),
454+
]
455+
build_dependency(args, "swift-build", swift_build_cmake_flags)
445456
build_swiftpm_with_cmake(args)
446457

447458
build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
@@ -718,6 +729,7 @@ def build_swiftpm_with_cmake(args):
718729
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
719730
"-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
720731
"-DSwiftCertificates_DIR=" + os.path.join(args.build_dirs["swift-certificates"], "cmake/modules"),
732+
"-DSwiftBuild_DIR=" + os.path.join(args.build_dirs["swift-build"], "cmake/modules"),
721733
"-DSWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE=" + args.source_dirs["swift-syntax"],
722734
]
723735

@@ -738,6 +750,7 @@ def build_swiftpm_with_cmake(args):
738750
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-collections"], "lib"))
739751
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-asn1"], "lib"))
740752
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-certificates"], "lib"))
753+
add_rpath_for_cmake_build(args, os.path.join(args.build_dirs["swift-build"], "lib"))
741754

742755
# rpaths for compatibility libraries
743756
for lib_path in get_swift_backdeploy_library_paths(args):
@@ -875,6 +888,7 @@ def get_swiftpm_env_cmd(args):
875888
os.path.join(args.build_dirs["swift-collections"], "lib"),
876889
os.path.join(args.build_dirs["swift-asn1"], "lib"),
877890
os.path.join(args.build_dirs["swift-certificates"], "lib"),
891+
os.path.join(args.build_dirs["swift-build"], "lib"),
878892
]
879893

880894
if platform.system() == 'Darwin':

0 commit comments

Comments
 (0)