Skip to content

Build SwiftBuild as part of CMake bootstrapping #8445

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ if(FIND_PM_DEPS)
find_package(SwiftASN1 CONFIG REQUIRED)
find_package(SwiftCertificates CONFIG REQUIRED)
find_package(SwiftCrypto CONFIG REQUIRED)
find_package(SwiftBuild CONFIG REQUIRED)
endif()

find_package(dispatch QUIET)
Expand Down
3 changes: 1 addition & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1108,8 +1108,7 @@ if ProcessInfo.processInfo.environment["ENABLE_APPLE_PRODUCT_TYPES"] == "1" {
}
}

if ProcessInfo.processInfo.environment["SWIFTPM_SWBUILD_FRAMEWORK"] == nil &&
ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil {
if ProcessInfo.processInfo.environment["SWIFTPM_SWBUILD_FRAMEWORK"] == nil {

let swiftbuildsupport: Target = package.targets.first(where: { $0.name == "SwiftBuildSupport" } )!
swiftbuildsupport.dependencies += [
Expand Down
2 changes: 2 additions & 0 deletions Sources/SwiftBuildSupport/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ target_link_libraries(SwiftBuildSupport PUBLIC
TSCBasic
TSCUtility
PackageGraph
SwiftBuild::SwiftBuild
SwiftBuild::SWBBuildService
)

set_target_properties(SwiftBuildSupport PROPERTIES
Expand Down
3 changes: 0 additions & 3 deletions Sources/SwiftBuildSupport/DotPIFSerializer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import Basics
import Foundation
import protocol TSCBasic.OutputByteStream

#if canImport(SwiftBuild)
import SwiftBuild

/// Serializes the specified PIF as a **Graphviz** directed graph.
Expand Down Expand Up @@ -223,5 +222,3 @@ fileprivate extension String {
"\""
}
}

#endif
3 changes: 0 additions & 3 deletions Sources/SwiftBuildSupport/PIF.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import PackageModel

import struct TSCBasic.ByteString

#if canImport(SwiftBuild)
import enum SwiftBuild.ProjectModel

/// The Project Interchange Format (PIF) is a structured representation of the
Expand Down Expand Up @@ -286,5 +285,3 @@ extension PIF {
workspace.signature = try signature(of: workspace)
}
}

#endif // SwiftBuild
16 changes: 1 addition & 15 deletions Sources/SwiftBuildSupport/PIFBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ import func TSCBasic.memoize
import func TSCBasic.topologicalSort
import var TSCBasic.stdoutStream

#if canImport(SwiftBuild)
import enum SwiftBuild.ProjectModel
#endif

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

if !preservePIFModelStructure {
Expand All @@ -129,13 +126,8 @@ public final class PIFBuilder {
}

return pifString
#else
fatalError("Swift Build support is not linked in.")
#endif
}

#if canImport(SwiftBuild)


private var cachedPIF: PIF.TopLevelObject?

/// Constructs a `PIF.TopLevelObject` representing the package graph.
Expand Down Expand Up @@ -192,8 +184,6 @@ public final class PIFBuilder {
return PIF.TopLevelObject(workspace: workspace)
}
}

#endif

// Convenience method for generating PIF.
public static func generatePIF(
Expand All @@ -214,8 +204,6 @@ public final class PIFBuilder {
}
}

#if canImport(SwiftBuild)

fileprivate final class PackagePIFBuilderDelegate: PackagePIFBuilder.BuildDelegate {
let package: ResolvedPackage

Expand Down Expand Up @@ -421,8 +409,6 @@ fileprivate func buildAggregateProject(
return aggregateProject
}

#endif

public enum PIFGenerationError: Error {
case rootPackageNotFound, multipleRootPackagesFound

Expand Down
3 changes: 0 additions & 3 deletions Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ func targetName(forProductName name: String, suffix: String? = nil) -> String {
return "\(name)\(suffix)-product"
}

#if canImport(SwiftBuild)

import enum SwiftBuild.ProjectModel

// MARK: - PIF GUID Helpers
Expand Down Expand Up @@ -1216,4 +1214,3 @@ extension UserDefaults {
}
}

#endif
3 changes: 0 additions & 3 deletions Sources/SwiftBuildSupport/PackagePIFBuilder+Plugins.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ import enum Basics.Sandbox
import struct Basics.AbsolutePath
import struct Basics.SourceControlURL

#if canImport(SwiftBuild)

import enum SwiftBuild.ProjectModel

extension PackagePIFBuilder {
Expand Down Expand Up @@ -136,4 +134,3 @@ extension PackagePIFBuilder {
}
}

#endif
4 changes: 0 additions & 4 deletions Sources/SwiftBuildSupport/PackagePIFBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ import struct PackageGraph.ModulesGraph
import struct PackageGraph.ResolvedModule
import struct PackageGraph.ResolvedPackage

#if canImport(SwiftBuild)

import enum SwiftBuild.ProjectModel

typealias GUID = SwiftBuild.ProjectModel.GUID
Expand Down Expand Up @@ -668,5 +666,3 @@ extension PackagePIFBuilder.LinkedPackageBinary {
}
}
}

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ import class PackageModel.SystemLibraryModule
import struct PackageGraph.ResolvedModule
import struct PackageGraph.ResolvedPackage

#if canImport(SwiftBuild)

import enum SwiftBuild.ProjectModel

/// Extension to create PIF **modules** for a given package.
Expand Down Expand Up @@ -884,5 +882,3 @@ extension PackagePIFProjectBuilder {
self.builtModulesAndProducts.append(systemModule)
}
}

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ import struct PackageGraph.ResolvedModule
import struct PackageGraph.ResolvedPackage
import struct PackageGraph.ResolvedProduct

#if canImport(SwiftBuild)

import enum SwiftBuild.ProjectModel

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

#endif
3 changes: 0 additions & 3 deletions Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ import struct PackageGraph.ResolvedPackage
import struct PackageLoading.FileRuleDescription
import struct PackageLoading.TargetSourcesBuilder

#if canImport(SwiftBuild)

import struct SwiftBuild.Pair
import enum SwiftBuild.ProjectModel
import struct SwiftBuild.SwiftBuildFileType
Expand Down Expand Up @@ -549,4 +547,3 @@ struct PackagePIFProjectBuilder {
}
}

#endif
15 changes: 1 addition & 14 deletions Sources/SwiftBuildSupport/SwiftBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,10 @@ import func TSCBasic.withTemporaryFile

import enum TSCUtility.Diagnostics

#if canImport(SwiftBuild)
import Foundation
import SWBBuildService
import SwiftBuild
#endif

#if canImport(SwiftBuild)

struct SessionFailedError: Error {
var error: Error
Expand Down Expand Up @@ -155,7 +152,6 @@ private final class PlanningOperationDelegate: SWBPlanningOperationDelegate, Sen
.deferred
}
}
#endif

public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
private let buildParameters: BuildParameters
Expand Down Expand Up @@ -232,7 +228,6 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
}

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

try await startSWBuildOperation(pifTargetName: subset.pifTargetName)

#else
fatalError("Swift Build support is not linked in.")
#endif

}

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

Expand Down Expand Up @@ -511,7 +503,6 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
return pifBuilder
}
}
#endif

public func cancel(deadline: DispatchTime) throws {}

Expand Down Expand Up @@ -545,8 +536,6 @@ extension Basics.Diagnostic.Severity {
}
}

#if canImport(SwiftBuild)

fileprivate extension SwiftBuild.SwiftBuildMessage.DiagnosticInfo.Location {
var userDescription: String? {
switch self {
Expand All @@ -573,5 +562,3 @@ fileprivate extension SwiftBuild.SwiftBuildMessage.DiagnosticInfo.Location {
}
}
}

#endif
4 changes: 0 additions & 4 deletions Tests/CommandsTests/BuildCommandTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -942,10 +942,6 @@ class BuildCommandSwiftBuildTests: BuildCommandTestCases {
override func testBuildSystemDefaultSettings() async throws {
try XCTSkipIfWorkingDirectoryUnsupported()

if ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] != nil {
throw XCTSkip("SWIFTPM_NO_SWBUILD_DEPENDENCY is set so skipping because SwiftPM doesn't have the swift-build capability built inside.")
}

try await super.testBuildSystemDefaultSettings()
}

Expand Down
8 changes: 0 additions & 8 deletions Tests/CommandsTests/TestCommandTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -632,18 +632,10 @@ class TestCommandSwiftBuildTests: TestCommandTestCase {
}

override func testFatalErrorDisplayedCorrectNumberOfTimesWhenSingleXCTestHasFatalErrorInBuildCompilation() async throws {
guard ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil else {
throw XCTSkip("Skipping test because SwiftBuild is not linked in.")
}

try await super.testFatalErrorDisplayedCorrectNumberOfTimesWhenSingleXCTestHasFatalErrorInBuildCompilation()
}

override func testListWithSkipBuildAndNoBuildArtifacts() async throws {
guard ProcessInfo.processInfo.environment["SWIFTPM_NO_SWBUILD_DEPENDENCY"] == nil else {
throw XCTSkip("Skipping test because SwiftBuild is not linked in.")
}

try await super.testListWithSkipBuildAndNoBuildArtifacts()
}

Expand Down
14 changes: 14 additions & 0 deletions Utilities/bootstrap
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ def parse_global_args(args):
args.source_dirs["swift-certificates"] = os.path.join(args.project_root, "..", "swift-certificates")
args.source_dirs["swift-asn1"] = os.path.join(args.project_root, "..", "swift-asn1")
args.source_dirs["swift-syntax"] = os.path.join(args.project_root, "..", "swift-syntax")
args.source_dirs["swift-build"] = os.path.join(args.project_root, "..", "swift-build")
args.source_root = os.path.join(args.project_root, "Sources")

if platform.system() == 'Darwin':
Expand Down Expand Up @@ -442,6 +443,16 @@ def build(args):
build_dependency(args, "swift-certificates",
["-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules")])
swift_build_cmake_flags = [
get_llbuild_cmake_arg(args),
"-DSwiftSystem_DIR=" + os.path.join(args.build_dirs["swift-system"], "cmake/modules"),
"-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
"-DTSC_DIR=" + os.path.join(args.build_dirs["tsc"], "cmake/modules"),
"-DArgumentParser_DIR=" + os.path.join(args.build_dirs["swift-argument-parser"], "cmake/modules"),
"-DSwiftDriver_DIR=" + os.path.join(args.build_dirs["swift-driver"], "cmake/modules"),
]
build_dependency(args, "swift-build", swift_build_cmake_flags)
build_swiftpm_with_cmake(args)

build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
Expand Down Expand Up @@ -718,6 +729,7 @@ def build_swiftpm_with_cmake(args):
"-DSwiftCrypto_DIR=" + os.path.join(args.build_dirs["swift-crypto"], "cmake/modules"),
"-DSwiftASN1_DIR=" + os.path.join(args.build_dirs["swift-asn1"], "cmake/modules"),
"-DSwiftCertificates_DIR=" + os.path.join(args.build_dirs["swift-certificates"], "cmake/modules"),
"-DSwiftBuild_DIR=" + os.path.join(args.build_dirs["swift-build"], "cmake/modules"),
"-DSWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE=" + args.source_dirs["swift-syntax"],
]

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

# rpaths for compatibility libraries
for lib_path in get_swift_backdeploy_library_paths(args):
Expand Down Expand Up @@ -875,6 +888,7 @@ def get_swiftpm_env_cmd(args):
os.path.join(args.build_dirs["swift-collections"], "lib"),
os.path.join(args.build_dirs["swift-asn1"], "lib"),
os.path.join(args.build_dirs["swift-certificates"], "lib"),
os.path.join(args.build_dirs["swift-build"], "lib"),
]

if platform.system() == 'Darwin':
Expand Down