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

Returns a new instance of NativeTargetFinder.

Parameters:

  • projects (Array<Xcodeproj::Project>)
  • build_configuration_name (String)


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>

Parameters:

  • projects (Array<Xcodeproj::Project>)

Returns:



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>

Parameters:

  • target (Xcodeproj::Project::Object::PBXAbstractTarget)

Returns:

  • (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

Parameters:

  • dependency (Xcodeproj::Project::Object::PBXTargetDependency)

Returns:



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

Parameters:

  • file (Xcodeproj::Project::Object::PBXBuildFile)

Returns:



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

Parameters:

  • product_name (String)

Returns:



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>

Parameters:

  • platform_name (String)

Returns:



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