mirror of
https://github.com/yonaskolb/XcodeGen.git
synced 2026-03-18 20:02:25 +00:00
Fix getAllCarthageDependencies for aggregate targets
This commit is contained in:
@@ -910,37 +910,45 @@ public class PBXProjGenerator {
|
||||
return "\(carthagePath)/\(platformName)"
|
||||
}
|
||||
|
||||
func getAllCarthageDependencies(target: Target) -> [Dependency] {
|
||||
func getAllCarthageDependencies(target topLevelTarget: Target) -> [Dependency] {
|
||||
// this is used to resolve cyclical target dependencies
|
||||
var visitedTargets: Set<String> = []
|
||||
var frameworks: [String: Dependency] = [:]
|
||||
|
||||
var queue: [Target] = [target]
|
||||
var queue: [ProjectTarget] = [topLevelTarget]
|
||||
while !queue.isEmpty {
|
||||
let target = queue.removeFirst()
|
||||
if visitedTargets.contains(target.name) {
|
||||
let projectTarget = queue.removeFirst()
|
||||
if visitedTargets.contains(projectTarget.name) {
|
||||
continue
|
||||
}
|
||||
|
||||
for dependency in target.dependencies {
|
||||
// don't overwrite frameworks, to allow top level ones to rule
|
||||
if frameworks.contains(reference: dependency.reference) {
|
||||
continue
|
||||
}
|
||||
|
||||
switch dependency.type {
|
||||
case .carthage:
|
||||
frameworks[dependency.reference] = dependency
|
||||
case .target:
|
||||
if let target = project.getTarget(dependency.reference) {
|
||||
queue.append(target)
|
||||
|
||||
if let target = projectTarget as? Target {
|
||||
for dependency in target.dependencies {
|
||||
// don't overwrite frameworks, to allow top level ones to rule
|
||||
if frameworks.contains(reference: dependency.reference) {
|
||||
continue
|
||||
}
|
||||
|
||||
switch dependency.type {
|
||||
case .carthage:
|
||||
frameworks[dependency.reference] = dependency
|
||||
case .target:
|
||||
if let projectTarget = project.getProjectTarget(dependency.reference) {
|
||||
queue.append(projectTarget)
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
} else if let aggregateTarget = projectTarget as? AggregateTarget {
|
||||
for dependencyName in aggregateTarget.targets {
|
||||
if let projectTarget = project.getProjectTarget(dependencyName) {
|
||||
queue.append(projectTarget)
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
visitedTargets.update(with: target.name)
|
||||
visitedTargets.update(with: projectTarget.name)
|
||||
}
|
||||
|
||||
return frameworks.sorted(by: { $0.key < $1.key }).map { $0.value }
|
||||
|
||||
Reference in New Issue
Block a user