Skip to content

Commit 3144d7b

Browse files
authored
Merge pull request #803 from hamishknight/desc-golf-6.2
[6.2] Only check `isTargetSuitableForPlatformForIndex` for workspace description
2 parents da52352 + 6964828 commit 3144d7b

File tree

6 files changed

+230
-372
lines changed

6 files changed

+230
-372
lines changed

Sources/SWBCore/DependencyResolution.swift

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -623,26 +623,20 @@ extension SpecializationParameters {
623623

624624
/// Determines whether a target should be configured for the given platform in the index arena.
625625
///
626-
/// The arena is used for two purposes:
627-
/// 1. To retrieve settings for a given target
628-
/// 2. To produce products of source dependencies for compilation purposes (it does not produce binaries)
626+
/// When building a workspace build description, we configure for all possible platforms. As such,
627+
/// we want to avoid unnecessarily configuring targets for unsupported platforms. When building a
628+
/// target or package description, we are only configuring for a single platform and can therefore
629+
/// avoid this check since we assume any dependency will necessary.
629630
///
630-
/// Thus, in general if a target doesn't support a platform, we don't want to configure it for that platform. If a
631-
/// dependency is not supported for the platform of the dependent, presumably the dependent will not be able
632-
/// to use its products for compilation purposes, since the source products will be put in a different platform
633-
/// directory and/or they will not be usable by the dependent (e.g. the module will not be importable from a
634-
/// different platform). If the dependency was intended to be usable from that platform for compilation purposes,
635-
/// it would be a supported platform.
636-
///
637-
/// There's an exception for this for a dependent host tool, which are required for compilation and must therefore
638-
/// be configured (and registered as a dependency) regardless.
639-
nonisolated func isTargetSuitableForPlatformForIndex(_ target: Target, parameters: BuildParameters, imposedParameters: SpecializationParameters?, dependencies: OrderedSet<ConfiguredTarget>? = nil) -> Bool {
640-
if !buildRequest.enableIndexBuildArena {
641-
return true
642-
}
643-
644-
// Host tools case, always supported we'll override the parameters with that of the host regardless.
645-
if target.isHostBuildTool || dependencies?.contains(where: { $0.target.isHostBuildTool }) == true {
631+
/// Note there's an exception for this for host build tools, which are required for compilation
632+
/// and must therefore be configured (and registered as a dependency) regardless
633+
nonisolated func isTargetSuitableForPlatformForIndex(_ target: Target, parameters: BuildParameters, imposedParameters: SpecializationParameters?) -> Bool {
634+
guard buildRequest.buildsIndexWorkspaceDescription else { return true }
635+
636+
// Host tools case, always supported since we'll override the parameters with that of the
637+
// host regardless. Any dependencies will have the host platform imposed on them through
638+
// `imposedParameters`.
639+
if target.isHostBuildTool {
646640
return true
647641
}
648642

Sources/SWBCore/LinkageDependencyResolver.swift

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ actor LinkageDependencyResolver {
111111
if Task.isCancelled { return }
112112
let configuredTarget = topLevelTargetsToDiscover[i]
113113
let imposedParameters = resolver.specializationParameters(configuredTarget, workspaceContext: workspaceContext, buildRequest: buildRequest, buildRequestContext: buildRequestContext)
114-
let dependenciesOnPath = LinkageDependencies()
115-
await linkageDependencies(for: configuredTarget, imposedParameters: imposedParameters, dependenciesOnPath: dependenciesOnPath)
114+
await linkageDependencies(for: configuredTarget, imposedParameters: imposedParameters)
116115
}
117116
}
118117

@@ -130,7 +129,7 @@ actor LinkageDependencyResolver {
130129
private var dependenciesPerTarget = [ConfiguredTarget: [ResolvedTargetDependency]]()
131130
private var visitedDiscoveredTargets = Set<ConfiguredTarget>()
132131

133-
private func linkageDependencies(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?, dependenciesOnPath: LinkageDependencies) async {
132+
private func linkageDependencies(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?) async {
134133
// Track that we have visited this target.
135134
let visited = !visitedDiscoveredTargets.insert(configuredTarget).inserted
136135

@@ -156,7 +155,7 @@ actor LinkageDependencyResolver {
156155
return nil
157156
}
158157
let buildParameters = resolver.buildParametersByTarget[target] ?? configuredTarget.parameters
159-
if await !resolver.isTargetSuitableForPlatformForIndex(target, parameters: buildParameters, imposedParameters: imposedParameters, dependencies: dependenciesOnPath.path) {
158+
if await !resolver.isTargetSuitableForPlatformForIndex(target, parameters: buildParameters, imposedParameters: imposedParameters) {
160159
return nil
161160
}
162161
let effectiveImposedParameters = imposedParameters?.effectiveParameters(target: configuredTarget, dependency: ConfiguredTarget(parameters: buildParameters, target: target), dependencyResolver: resolver)
@@ -184,7 +183,7 @@ actor LinkageDependencyResolver {
184183
} else {
185184
imposedParametersForDependency = resolver.specializationParameters(dependency.target, workspaceContext: workspaceContext, buildRequest: buildRequest, buildRequestContext: buildRequestContext)
186185
}
187-
await self.linkageDependencies(for: dependency.target, imposedParameters: imposedParametersForDependency, dependenciesOnPath: dependenciesOnPath)
186+
await self.linkageDependencies(for: dependency.target, imposedParameters: imposedParametersForDependency)
188187
}
189188
}
190189

@@ -605,7 +604,3 @@ private extension Path {
605604
return basenameWithoutSuffix.nilIfEmpty
606605
}
607606
}
608-
609-
fileprivate actor LinkageDependencies {
610-
var path: OrderedSet<ConfiguredTarget> = []
611-
}

Sources/SWBCore/TargetDependencyResolver.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ fileprivate extension TargetDependencyResolver {
680680
}
681681

682682
// Add the discovered info.
683-
let discoveredInfo = await computeDiscoveredTargetInfo(for: configuredTarget, imposedParameters: imposedParameters, dependencyPath: nil, resolver: resolver)
683+
let discoveredInfo = await computeDiscoveredTargetInfo(for: configuredTarget, imposedParameters: imposedParameters, resolver: resolver)
684684
discoveredTargets[configuredTarget] = discoveredInfo
685685

686686
// If we have no dependencies, we are done.
@@ -742,7 +742,7 @@ fileprivate extension TargetDependencyResolver {
742742
discoveredInfo = info
743743
} else {
744744
if resolver.makeAggregateTargetsTransparentForSpecialization {
745-
discoveredInfo = await computeDiscoveredTargetInfo(for: configuredTarget, imposedParameters: imposedParameters, dependencyPath: dependencyPath, resolver: resolver)
745+
discoveredInfo = await computeDiscoveredTargetInfo(for: configuredTarget, imposedParameters: imposedParameters, resolver: resolver)
746746
} else {
747747
var immediateDependencies = [ResolvedTargetDependency]()
748748
var packageProductDependencies = [PackageProductTarget]()
@@ -820,14 +820,14 @@ fileprivate extension TargetDependencyResolver {
820820
}
821821

822822
/// Discover the info for a configured target with the given imposed parameters.
823-
private func computeDiscoveredTargetInfo(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?, dependencyPath: OrderedSet<ConfiguredTarget>?, resolver: isolated DependencyResolver) async -> DiscoveredTargetInfo {
823+
private func computeDiscoveredTargetInfo(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?, resolver: isolated DependencyResolver) async -> DiscoveredTargetInfo {
824824
var immediateDependencies = [ResolvedTargetDependency]()
825825
var packageProductDependencies = [PackageProductTarget]()
826826
for dependency in resolver.explicitDependencies(for: configuredTarget) {
827827
if let asPackageProduct = dependency as? PackageProductTarget {
828828
packageProductDependencies.append(asPackageProduct)
829829
} else {
830-
if !resolver.isTargetSuitableForPlatformForIndex(dependency, parameters: configuredTarget.parameters, imposedParameters: imposedParameters, dependencies: dependencyPath) {
830+
if !resolver.isTargetSuitableForPlatformForIndex(dependency, parameters: configuredTarget.parameters, imposedParameters: imposedParameters) {
831831
continue
832832
}
833833

Sources/SWBTestSupport/BuildOperationTester.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,6 +1650,7 @@ package final class BuildOperationTester {
16501650
/// Construct 'prepare' index build operation, and test the result.
16511651
package func checkIndexBuild<T>(
16521652
prepareTargets: [String],
1653+
buildTargets: [any TestTarget]? = nil,
16531654
workspaceOperation: Bool = true,
16541655
runDestination: RunDestinationInfo? = nil,
16551656
persistent: Bool = false,
@@ -1658,6 +1659,7 @@ package final class BuildOperationTester {
16581659
) async throws -> T {
16591660
let buildRequest = try Self.buildRequestForIndexOperation(
16601661
workspace: workspace,
1662+
buildTargets: buildTargets,
16611663
prepareTargets: prepareTargets,
16621664
workspaceOperation: workspaceOperation,
16631665
runDestination: runDestination,

0 commit comments

Comments
 (0)