Commit d14e6c70 authored by Samuel E. Giddins's avatar Samuel E. Giddins

[Resolver] Take supported platforms into account when resolving

parent e9ef020c
...@@ -37,6 +37,7 @@ module Pod ...@@ -37,6 +37,7 @@ module Pod
@podfile = podfile @podfile = podfile
@locked_dependencies = locked_dependencies @locked_dependencies = locked_dependencies
@sources = Array(sources) @sources = Array(sources)
@platforms_by_dependency = Hash.new { |h, k| h[k] = [] }
end end
#-------------------------------------------------------------------------# #-------------------------------------------------------------------------#
...@@ -52,7 +53,11 @@ module Pod ...@@ -52,7 +53,11 @@ module Pod
# definition. # definition.
# #
def resolve def resolve
dependencies = podfile.target_definition_list.map(&:dependencies).flatten dependencies = podfile.target_definition_list.flat_map do |target|
target.dependencies.each do |dep|
@platforms_by_dependency[dep] << target.platform
end
end
@cached_sets = {} @cached_sets = {}
@activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies) @activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies)
specs_by_target.tap do |specs_by_target| specs_by_target.tap do |specs_by_target|
...@@ -181,7 +186,7 @@ module Pod ...@@ -181,7 +186,7 @@ module Pod
requirement_satisfied && !( requirement_satisfied && !(
spec.version.prerelease? && spec.version.prerelease? &&
existing_vertices.flat_map(&:requirements).none? { |r| r.prerelease? || r.external_source || r.head? } existing_vertices.flat_map(&:requirements).none? { |r| r.prerelease? || r.external_source || r.head? }
) ) && plat?(activated, requirement, spec)
end end
# Sort dependencies so that the ones that are easiest to resolve are first. # Sort dependencies so that the ones that are easiest to resolve are first.
...@@ -395,6 +400,17 @@ module Pod ...@@ -395,6 +400,17 @@ module Pod
raise Informative, error.message raise Informative, error.message
end end
def plat?(dg, req, spec)
inc = ->(vert) {
pred = vert.predecessors
pred + pred.map(&inc).reduce(Set.new, &:&) << vert
}
v = dg.vertex_named(req.name)
all_inc = inc[v]
platforms_to_satisfy = all_inc.map(&:requirements).flat_map { |r| @platforms_by_dependency[r] }
platforms_to_satisfy.all? { |pts| spec.available_platforms.any? { |p| pts.supports?(p) } }
end
# Returns the target-appropriate nodes that are `successors` of `node`, # Returns the target-appropriate nodes that are `successors` of `node`,
# rejecting those that are scoped by target platform and have incompatible # rejecting those that are scoped by target platform and have incompatible
# targets. # targets.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment