Class: XcodeArchiveCache::BuildGraph::NativeTargetFinder
- Inherits:
-
Object
- Object
- XcodeArchiveCache::BuildGraph::NativeTargetFinder
- Defined in:
- lib/build_graph/native_target_finder.rb
Instance Method Summary collapse
- #extract_targets(projects) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
- #find_all_dependencies(target) ⇒ Array<Xcodeproj::Project::Object::PBXAbstractTarget>
- #find_any_for_dependency(dependency) ⇒ Object
- #find_for_dependency(dependency) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
- #find_for_file(file) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
- #find_for_product_name(product_name) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
- #find_native_dependencies(target) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
-
#initialize(projects, build_configuration_name) ⇒ NativeTargetFinder
constructor
A new instance of NativeTargetFinder.
- #set_platform_name_filter(platform_name) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
Constructor Details
#initialize(projects, build_configuration_name) ⇒ NativeTargetFinder
Returns a new instance of NativeTargetFinder.
8 9 10 11 12 13 14 |
# File 'lib/build_graph/native_target_finder.rb', line 8 def initialize(projects, build_configuration_name) @all_targets = extract_targets(projects) @build_configuration_name = build_configuration_name @interpolator = XcodeArchiveCache::BuildSettings::StringInterpolator.new setup_product_name_to_target_mapping end |
Instance Method Details
#extract_targets(projects) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
20 21 22 23 24 25 26 27 28 29 |
# File 'lib/build_graph/native_target_finder.rb', line 20 def extract_targets(projects) projects .map {|project| unnest(project)} .flatten .sort_by(&:path) .inject([]) {|unique, current| unique.last && unique.last.path == current.path ? unique : unique + [current]} .map(&:native_targets) .flatten .select {|target| !target.test_target_type?} end |
#find_all_dependencies(target) ⇒ Array<Xcodeproj::Project::Object::PBXAbstractTarget>
55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/build_graph/native_target_finder.rb', line 55 def find_all_dependencies(target) direct_dependencies = target .dependencies .map {|dependency| find_any_for_dependency(dependency)} linked_dependencies = [] if target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget) linked_dependencies = find_linked_dependencies(target) end join(direct_dependencies, linked_dependencies) end |
#find_any_for_dependency(dependency) ⇒ Object
78 79 80 81 |
# File 'lib/build_graph/native_target_finder.rb', line 78 def find_any_for_dependency(dependency) target = dependency.target ? dependency.target : dependency.target_proxy.proxied_object target && target.platform_name == platform_name ? target : nil end |
#find_for_dependency(dependency) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
72 73 74 75 76 |
# File 'lib/build_graph/native_target_finder.rb', line 72 def find_for_dependency(dependency) # targets from embedded projects are proxied target = find_any_for_dependency(dependency) target.is_a?(Xcodeproj::Project::Object::PBXNativeTarget) ? target : nil end |
#find_for_file(file) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/build_graph/native_target_finder.rb', line 87 def find_for_file(file) if file.file_ref.is_a?(Xcodeproj::Project::Object::PBXReferenceProxy) product_reference_uuid = file.file_ref.remote_ref.remote_global_id_string target = find_with_product_ref_uuid(product_reference_uuid) if target == nil project = file.file_ref.remote_ref.container_portal_object target = find_in_project(project, product_reference_uuid) # allow all targets from this project # to be linked to that exact project # # otherwise, injection will operate on different Xcodeproj::Project objects # resulting to only the last target being actually removed # @all_targets += extract_targets([project]) end if target == nil raise XcodeArchiveCache::Informative, "Target for #{file.file_ref.path} not found" end target elsif file.file_ref.is_a?(Xcodeproj::Project::Object::PBXFileReference) # products of sibling project targets are added as PBXFileReferences targets = find_with_product_path(file.file_ref.path) if targets.length > 1 raise XcodeArchiveCache::Informative, "Found more than one target with product #{File.basename(file.file_ref.path)} in:\n#{targets.map(&:project)}" end targets.first end end |
#find_for_product_name(product_name) ⇒ Xcodeproj::Project::Object::PBXNativeTarget
124 125 126 127 128 129 130 131 132 |
# File 'lib/build_graph/native_target_finder.rb', line 124 def find_for_product_name(product_name) canonical = all_targets .select {|native_target| native_target.name == product_name || native_target.product_reference.display_name == product_name || native_target.product_reference.path == product_name } .first parsed = @product_name_to_target[product_name] canonical ? canonical : parsed end |
#find_native_dependencies(target) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
43 44 45 46 47 48 49 |
# File 'lib/build_graph/native_target_finder.rb', line 43 def find_native_dependencies(target) direct_dependencies = target .dependencies .map {|dependency| find_for_dependency(dependency)} linked_dependencies = find_linked_dependencies(target) join(direct_dependencies, linked_dependencies) end |
#set_platform_name_filter(platform_name) ⇒ Array<Xcodeproj::Project::Object::PBXNativeTarget>
35 36 37 |
# File 'lib/build_graph/native_target_finder.rb', line 35 def set_platform_name_filter(platform_name) @platform_name = platform_name end |