class XcodeArchiveCache::BuildGraph::Builder
Constants
- ALL_NODES
Attributes
build_settings_loader[RW]
@return [XcodeArchiveCache::BuildSettings::Loader]
native_target_finder[RW]
@return [XcodeArchive::BuildGraph::NativeTargetFinder]
sha_calculator[RW]
@return [XcodeArchiveCache::BuildGraph::NodeShaCalculator]
Public Class Methods
new(native_target_finder, build_settings_loader)
click to toggle source
@param [XcodeArchiveCache::Xcodebuild::Executor] xcodebuild_executor
# File lib/build_graph/builder.rb, line 9 def initialize(native_target_finder, build_settings_loader) @build_settings_loader = build_settings_loader @native_target_finder = native_target_finder @sha_calculator = NodeShaCalculator.new end
Public Instance Methods
build_graph(dependent_target, dependency_target)
click to toggle source
@param [Xcodeproj::Project::Object::PBXNativeTarget] dependency_target
@return [Graph]
# File lib/build_graph/builder.rb, line 19 def build_graph(dependent_target, dependency_target) native_target_finder.set_platform_name_filter(dependency_target.platform_name) graph = Graph.new(dependency_target.project) add_to_graph(dependency_target, graph, true) load_settings(graph, dependent_target) calculate_shas(graph) graph end
Private Instance Methods
add_to_graph(target, graph, is_root, target_stack = [])
click to toggle source
@param [Xcodeproj::Project::Object::PBXNativeTarget] target @param [Graph] graph @param [Boolean] is_root @param [Array<String>] target_stack
Stack of native target display names at this level of traverse
@return [Node] new or existing node
# File lib/build_graph/builder.rb, line 54 def add_to_graph(target, graph, is_root, target_stack = []) debug("traversing #{target.display_name}") unless target raise ArgumentError.new, "Target is required" end display_name = target.display_name if target_stack.include?(display_name) target_stack.push(display_name) raise XcodeArchiveCache::Informative, "Circular dependency detected: #{target_stack.join(" -> ")}" end node = ALL_NODES.select {|node| node.native_target.uuid == target.uuid && node.native_target.project == target.project}.first if node debug("already traversed this one") unless graph.nodes.include?(node) nodes_to_add = node.subgraph.select {|subgraph_node| !graph.nodes.include?(subgraph_node)} graph.add_multiple_nodes(nodes_to_add) end return node else debug("adding new node") node = Node.new(display_name, target, is_root) graph.nodes.push(node) ALL_NODES.push(node) end dependencies = [] target_stack.push(display_name) deduplicated_targets = native_target_finder.find_native_dependencies(target) debug("dependency targets: #{deduplicated_targets.map(&:display_name)}") deduplicated_targets.each do |dependency_target| dependency_node = add_to_graph(dependency_target, graph, false, target_stack) unless dependency_node.dependent.include?(node) debug("adding #{node.name} as dependent to #{dependency_node.name}") dependency_node.dependent.push(node) end unless dependencies.include?(dependency_node) debug("adding #{dependency_node.name} as dependency to #{node.name}") dependencies.push(dependency_node) end end target_stack.pop node.dependencies.push(*dependencies) debug("done with #{target.display_name}") node end
calculate_shas(graph)
click to toggle source
@param [XcodeArchiveCache::BuildGraph::Graph] graph
# File lib/build_graph/builder.rb, line 112 def calculate_shas(graph) graph.nodes.each do |node| debug("calculating sha for #{node.name}") sha_calculator.calculate(node) debug("sha calculated for #{node.name}: #{node.sha}") end end
get_settings(target)
click to toggle source
@param [Xcodeproj::Project::Object::PBXNativeTarget] target
# File lib/build_graph/builder.rb, line 140 def get_settings(target) info("getting settings for #{target.display_name}") build_settings = build_settings_loader.get_settings(target.project.path, target.display_name) unless build_settings raise XcodeArchiveCache::Informative, "No build settings loaded for #{target.display_name}" end build_settings end
load_settings(graph, dependent_target)
click to toggle source
@param [XcodeArchiveCache::BuildGraph::Graph] graph @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target
# File lib/build_graph/builder.rb, line 123 def load_settings(graph, dependent_target) project_paths = graph.nodes .map {|node| node.native_target} .push(dependent_target) .map {|target| target.project.path} .sort .uniq info("loading settings for #{project_paths.length} projects") build_settings_loader.load_settings(project_paths) graph.dependent_build_settings = get_settings(dependent_target) graph.nodes.each {|node| node.build_settings = get_settings(node.native_target)} end