Skip to content

Commit c2a6449

Browse files
authored
Only check isTargetSuitableForPlatformForIndex for workspace description (#671)
* [test] NFC: Factor out `withHostToolsPackages` Factor out the creation of the common package dependencies between these two tests. * [test] Parameterize two host tools index tests Use Swift Testing parameterization to test different run destinations. * [test] Set `SDKROOT: auto` at project level for `withHostToolsPackages` This better matches what we actually generate for packages. Also set all available platforms as supported. * [test] Add same-package host tool dependency to `withHostToolsPackages` This exposes the issue where `isTargetSuitableForPlatformForIndex` returns `false` in the target and package build. Also change `testHostToolsAndDependenciesAreBuiltDuringIndexingPreparationForPackage` to use a dependency package and test both the target and package build descriptions. * Only check `isTargetSuitableForPlatformForIndex` for workspace description For the package and target build description we can end up incorrectly dropping build tool dependencies since not all clients pass in the correct dependency information. It's not clear that we actually gain much from doing this check for the target and package build descriptions though, its primary purpose is to avoid configuring unsupported targets in the workspace build description where we try to configure for all available platforms. As such, switch to only checking for the workspace build description. Note we don't encounter this issue in the workspace case since there we override the build parameters for host build tools to always build for the host platform. rdar://152012769 * Remove dependency check from `isTargetSuitableForPlatformForIndex` This gets applied pretty inconsistently, only 1 client actually passes the correct dependency information. We ought to be able to rely on the host platform being imposed for the workspace build description, so it shouldn't be necessary.
1 parent 0c0eb26 commit c2a6449

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
@@ -122,8 +122,7 @@ actor LinkageDependencyResolver {
122122
if Task.isCancelled { return }
123123
let configuredTarget = topLevelTargetsToDiscover[i]
124124
let imposedParameters = resolver.specializationParameters(configuredTarget, workspaceContext: workspaceContext, buildRequest: buildRequest, buildRequestContext: buildRequestContext)
125-
let dependenciesOnPath = LinkageDependencies()
126-
await linkageDependencies(for: configuredTarget, imposedParameters: imposedParameters, dependenciesOnPath: dependenciesOnPath)
125+
await linkageDependencies(for: configuredTarget, imposedParameters: imposedParameters)
127126
}
128127
}
129128

@@ -141,7 +140,7 @@ actor LinkageDependencyResolver {
141140
private var dependenciesPerTarget = [ConfiguredTarget: [ResolvedTargetDependency]]()
142141
private var visitedDiscoveredTargets = Set<ConfiguredTarget>()
143142

144-
private func linkageDependencies(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?, dependenciesOnPath: LinkageDependencies) async {
143+
private func linkageDependencies(for configuredTarget: ConfiguredTarget, imposedParameters: SpecializationParameters?) async {
145144
// Track that we have visited this target.
146145
let visited = !visitedDiscoveredTargets.insert(configuredTarget).inserted
147146

@@ -167,7 +166,7 @@ actor LinkageDependencyResolver {
167166
return nil
168167
}
169168
let buildParameters = resolver.buildParametersByTarget[target] ?? configuredTarget.parameters
170-
if await !resolver.isTargetSuitableForPlatformForIndex(target, parameters: buildParameters, imposedParameters: imposedParameters, dependencies: dependenciesOnPath.path) {
169+
if await !resolver.isTargetSuitableForPlatformForIndex(target, parameters: buildParameters, imposedParameters: imposedParameters) {
171170
return nil
172171
}
173172
let effectiveImposedParameters = imposedParameters?.effectiveParameters(target: configuredTarget, dependency: ConfiguredTarget(parameters: buildParameters, target: target), dependencyResolver: resolver)
@@ -195,7 +194,7 @@ actor LinkageDependencyResolver {
195194
} else {
196195
imposedParametersForDependency = resolver.specializationParameters(dependency.target, workspaceContext: workspaceContext, buildRequest: buildRequest, buildRequestContext: buildRequestContext)
197196
}
198-
await self.linkageDependencies(for: dependency.target, imposedParameters: imposedParametersForDependency, dependenciesOnPath: dependenciesOnPath)
197+
await self.linkageDependencies(for: dependency.target, imposedParameters: imposedParametersForDependency)
199198
}
200199
}
201200

@@ -657,7 +656,3 @@ private extension Path {
657656
return basenameWithoutSuffix.nilIfEmpty
658657
}
659658
}
660-
661-
fileprivate actor LinkageDependencies {
662-
var path: OrderedSet<ConfiguredTarget> = []
663-
}

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
@@ -1553,6 +1553,7 @@ package final class BuildOperationTester {
15531553
/// Construct 'prepare' index build operation, and test the result.
15541554
package func checkIndexBuild<T>(
15551555
prepareTargets: [String],
1556+
buildTargets: [any TestTarget]? = nil,
15561557
workspaceOperation: Bool = true,
15571558
runDestination: RunDestinationInfo? = nil,
15581559
persistent: Bool = false,
@@ -1561,6 +1562,7 @@ package final class BuildOperationTester {
15611562
) async throws -> T {
15621563
let buildRequest = try Self.buildRequestForIndexOperation(
15631564
workspace: workspace,
1565+
buildTargets: buildTargets,
15641566
prepareTargets: prepareTargets,
15651567
workspaceOperation: workspaceOperation,
15661568
runDestination: runDestination,

0 commit comments

Comments
 (0)