Skip to content

Commit 10cf4ea

Browse files
committed
Avoid redundant traversal when computing static transitive dependencies
Each target's static transitive linked dependencies were computed by running transitiveClosure once per direct dependency. Whenever several direct dependencies reached the same subgraph, that subgraph was traversed once for each of them, which was redundant work that did not affect the result. Seed a single transitiveClosure with all direct dependencies at once so each node is visited only once. The resulting set of dependencies is unchanged.
1 parent c88a6fb commit 10cf4ea

1 file changed

Lines changed: 7 additions & 9 deletions

File tree

Sources/SWBTaskConstruction/ProductPlanning/ProductPlan.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -561,15 +561,13 @@ package final class GlobalProductPlan: GlobalTargetInfoProvider
561561
}
562562

563563
let linkedDependencies: [LinkedDependency] = linkageGraph.dependencies(of: configuredTarget).map { .direct($0) }
564-
let transitiveStaticDependencies: [LinkedDependency] = linkedDependencies.flatMap { origin in
565-
transitiveClosure([origin.target]) {
566-
let settings = planRequest.buildRequestContext.getCachedSettings($0.parameters, target: $0.target)
567-
guard !Self.dynamicMachOTypes.contains(settings.globalScope.evaluate(BuiltinMacros.MACH_O_TYPE)) else {
568-
return []
569-
}
570-
return linkageGraph.dependencies(of: $0)
571-
}.0.map { .staticTransitive($0) }
572-
}
564+
let transitiveStaticDependencies: [LinkedDependency] = transitiveClosure(linkedDependencies.map(\.target)) {
565+
let settings = planRequest.buildRequestContext.getCachedSettings($0.parameters, target: $0.target)
566+
guard !Self.dynamicMachOTypes.contains(settings.globalScope.evaluate(BuiltinMacros.MACH_O_TYPE)) else {
567+
return []
568+
}
569+
return linkageGraph.dependencies(of: $0)
570+
}.0.map { .staticTransitive($0) }
573571

574572
directlyLinkedDependenciesByTarget[configuredTarget] = OrderedSet(linkedDependencies + transitiveStaticDependencies + (bundleLoaderByTarget[configuredTarget].map { [.bundleLoader($0)] } ?? []))
575573
impartedBuildPropertiesByTarget[configuredTarget] = dependencies.compactMap { $0.getImpartedBuildProperties(using: planRequest) }

0 commit comments

Comments
 (0)