Class: XcodeArchiveCache::BuildGraph::NativeTargetFinder

Inherits:
Object
  • Object
show all
Defined in:
lib/build_graph/native_target_finder.rb

Instance Method Summary collapse

Constructor Details

#initialize(projects, build_configuration_name) ⇒ 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}
    .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