Skip to content

Commit 6b67443

Browse files
authored
Un-Revert "[Build] Free BuildPlan from BuildTriple" (#7883)
Reverts #7882 The CI problem associated with this revert actually stems from swift-foundation hard-coding a path that is no longer valid because some tests in `FoundationEssentialsTests` test macros which means that xctest bundle is going to be built for `host` and get `-tool` suffix for its resources directory. Using non-prefixed directory was incorrect because it's not related to the bundle that would actually be run.
1 parent 5e22d1b commit 6b67443

21 files changed

+497
-139
lines changed

Sources/Basics/Collections/IdentifiableSet.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public struct IdentifiableSet<Element: Identifiable>: Collection {
4242
Index(storageIndex: self.storage.elements.endIndex)
4343
}
4444

45+
public var values: some Sequence<Element> {
46+
self.storage.values
47+
}
48+
4549
public subscript(position: Index) -> Element {
4650
self.storage.elements[position.storageIndex].value
4751
}

Sources/Build/BuildDescription/ClangModuleBuildDescription.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public final class ClangModuleBuildDescription {
4242
/// The build parameters.
4343
let buildParameters: BuildParameters
4444

45+
/// The destination for while this module is built.
46+
public var destination: BuildParameters.Destination {
47+
self.buildParameters.destination
48+
}
49+
4550
/// The build environment.
4651
var buildEnvironment: BuildEnvironment {
4752
buildParameters.buildEnvironment
@@ -521,3 +526,17 @@ public final class ClangModuleBuildDescription {
521526
)
522527
}
523528
}
529+
530+
extension ClangModuleBuildDescription {
531+
package func dependencies(
532+
using plan: BuildPlan
533+
) -> [ModuleBuildDescription.Dependency] {
534+
ModuleBuildDescription.clang(self).dependencies(using: plan)
535+
}
536+
537+
package func recursiveDependencies(
538+
using plan: BuildPlan
539+
) -> [ModuleBuildDescription.Dependency] {
540+
ModuleBuildDescription.clang(self).recursiveDependencies(using: plan)
541+
}
542+
}

Sources/Build/BuildDescription/ModuleBuildDescription.swift

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import Basics
1414
import struct PackageGraph.ResolvedModule
1515
import struct PackageGraph.ResolvedPackage
16+
import struct PackageGraph.ResolvedProduct
1617
import struct PackageModel.Resource
1718
import struct PackageModel.ToolsVersion
1819
import struct SPMBuildCore.BuildToolPluginInvocationResult
@@ -121,6 +122,15 @@ public enum ModuleBuildDescription: SPMBuildCore.ModuleBuildDescription {
121122
}
122123
}
123124

125+
var destination: BuildParameters.Destination {
126+
switch self {
127+
case .swift(let buildDescription):
128+
buildDescription.destination
129+
case .clang(let buildDescription):
130+
buildDescription.destination
131+
}
132+
}
133+
124134
var toolsVersion: ToolsVersion {
125135
switch self {
126136
case .swift(let buildDescription):
@@ -139,3 +149,47 @@ public enum ModuleBuildDescription: SPMBuildCore.ModuleBuildDescription {
139149
}
140150
}
141151
}
152+
153+
extension ModuleBuildDescription: Identifiable {
154+
public struct ID: Hashable {
155+
let moduleID: ResolvedModule.ID
156+
let destination: BuildParameters.Destination
157+
}
158+
159+
public var id: ID {
160+
ID(moduleID: self.module.id, destination: self.destination)
161+
}
162+
}
163+
164+
extension ModuleBuildDescription {
165+
package enum Dependency {
166+
/// Not all of the modules and products have build descriptions
167+
case product(ResolvedProduct, ProductBuildDescription?)
168+
case module(ResolvedModule, ModuleBuildDescription?)
169+
}
170+
171+
package func dependencies(using plan: BuildPlan) -> [Dependency] {
172+
self.module
173+
.dependencies(satisfying: self.buildParameters.buildEnvironment)
174+
.map {
175+
switch $0 {
176+
case .product(let product, _):
177+
let productDescription = plan.description(for: product, context: self.destination)
178+
return .product(product, productDescription)
179+
case .module(let module, _):
180+
let moduleDescription = plan.description(for: module, context: self.destination)
181+
return .module(module, moduleDescription)
182+
}
183+
}
184+
}
185+
186+
package func recursiveDependencies(using plan: BuildPlan) -> [Dependency] {
187+
var dependencies: [Dependency] = []
188+
plan.traverseDependencies(of: self) { product, _, description in
189+
dependencies.append(.product(product, description))
190+
} onModule: { module, _, description in
191+
dependencies.append(.module(module, description))
192+
}
193+
return dependencies
194+
}
195+
}

Sources/Build/BuildDescription/ProductBuildDescription.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public final class ProductBuildDescription: SPMBuildCore.ProductBuildDescription
3737
/// The build parameters.
3838
public let buildParameters: BuildParameters
3939

40+
/// The destination for while this product is built.
41+
public var destination: BuildParameters.Destination {
42+
self.buildParameters.destination
43+
}
44+
4045
/// All object files to link into this product.
4146
///
4247
// Computed during build planning.
@@ -397,6 +402,17 @@ public final class ProductBuildDescription: SPMBuildCore.ProductBuildDescription
397402
}
398403
}
399404

405+
extension ProductBuildDescription: Identifiable {
406+
public struct ID: Hashable {
407+
let productID: ResolvedProduct.ID
408+
let destination: BuildParameters.Destination
409+
}
410+
411+
public var id: ID {
412+
ID(productID: self.product.id, destination: self.destination)
413+
}
414+
}
415+
400416
extension SortedArray where Element == AbsolutePath {
401417
public static func +=<S: Sequence>(lhs: inout SortedArray, rhs: S) where S.Iterator.Element == AbsolutePath {
402418
lhs.insert(contentsOf: rhs)

Sources/Build/BuildDescription/SwiftModuleBuildDescription.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public final class SwiftModuleBuildDescription {
4949
/// The build parameters for this target.
5050
let buildParameters: BuildParameters
5151

52+
/// The destination for while this module is built.
53+
public var destination: BuildParameters.Destination {
54+
self.buildParameters.destination
55+
}
56+
5257
/// The build parameters for the macro dependencies of this target.
5358
let macroBuildParameters: BuildParameters
5459

@@ -983,3 +988,17 @@ public final class SwiftModuleBuildDescription {
983988
return arguments
984989
}
985990
}
991+
992+
extension SwiftModuleBuildDescription {
993+
package func dependencies(
994+
using plan: BuildPlan
995+
) -> [ModuleBuildDescription.Dependency] {
996+
ModuleBuildDescription.swift(self).dependencies(using: plan)
997+
}
998+
999+
package func recursiveDependencies(
1000+
using plan: BuildPlan
1001+
) -> [ModuleBuildDescription.Dependency] {
1002+
ModuleBuildDescription.swift(self).recursiveDependencies(using: plan)
1003+
}
1004+
}

Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,30 +32,36 @@ extension LLBuildManifestBuilder {
3232
inputs.append(resourcesNode)
3333
}
3434

35-
func addStaticTargetInputs(_ target: ResolvedModule) {
36-
if case .swift(let desc)? = self.plan.targetMap[target.id], target.type == .library {
35+
func addStaticTargetInputs(_ description: ModuleBuildDescription?) {
36+
if case .swift(let desc) = description, desc.target.type == .library {
3737
inputs.append(file: desc.moduleOutputPath)
3838
}
3939
}
4040

41-
for dependency in target.target.dependencies(satisfying: target.buildEnvironment) {
41+
for dependency in target.dependencies(using: self.plan) {
4242
switch dependency {
43-
case .module(let target, _):
44-
addStaticTargetInputs(target)
43+
case .module(_, let description):
44+
addStaticTargetInputs(description)
4545

46-
case .product(let product, _):
46+
case .product(let product, let productDescription):
4747
switch product.type {
4848
case .executable, .snippet, .library(.dynamic), .macro:
49-
guard let planProduct = plan.productMap[product.id] else {
50-
throw InternalError("unknown product \(product)")
49+
guard let productDescription else {
50+
throw InternalError("No build description for product: \(product)")
5151
}
5252
// Establish a dependency on binary of the product.
53-
let binary = try planProduct.binaryPath
54-
inputs.append(file: binary)
53+
try inputs.append(file: productDescription.binaryPath)
5554

5655
case .library(.automatic), .library(.static), .plugin:
57-
for target in product.modules {
58-
addStaticTargetInputs(target)
56+
for module in product.modules {
57+
guard let dependencyDescription = self.plan.description(
58+
for: module,
59+
context: product.type == .plugin ? .host : target.destination
60+
) else
61+
{
62+
throw InternalError("unknown module: \(module)")
63+
}
64+
addStaticTargetInputs(dependencyDescription)
5965
}
6066
case .test:
6167
break

0 commit comments

Comments
 (0)