Class: Pod::PodTarget

Inherits:
Target
  • Object
show all
Defined in:
lib/cocoapods/target/pod_target.rb

Overview

Stores the information relative to the target used to compile a single Pod. A pod can have one or more activated spec/subspecs.

Instance Attribute Summary collapse

Attributes inherited from Target

#archs, #host_requires_frameworks, #native_target, #sandbox, #user_build_configurations

Instance Method Summary collapse

Methods inherited from Target

#bridge_support_path, #dummy_source_path, #framework_name, #info_plist_path, #inspect, #module_map_path, #name, #prefix_header_path, #product_basename, #product_name, #product_type, #requires_frameworks?, #static_library_name, #support_files_dir, #umbrella_header_path, #xcconfig_path

Constructor Details

#initialize(specs, target_definitions, sandbox, scope_suffix = nil) ⇒ PodTarget

Returns a new instance of PodTarget

Parameters:

  • specs (Array<Specification>)

    @see #specs

  • target_definitions (Array<TargetDefinition>)

    @see #target_definitions

  • sandbox (Sandbox)

    @see #sandbox

  • scope_suffix (String) (defaults to: nil)

    @see #scope_suffix



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/cocoapods/target/pod_target.rb', line 46

def initialize(specs, target_definitions, sandbox, scope_suffix = nil)
  raise "Can't initialize a PodTarget without specs!" if specs.nil? || specs.empty?
  raise "Can't initialize a PodTarget without TargetDefinition!" if target_definitions.nil? || target_definitions.empty?
  raise "Can't initialize a PodTarget with only abstract TargetDefinitions" if target_definitions.all?(&:abstract?)
  raise "Can't initialize a PodTarget with an empty string scope suffix!" if scope_suffix == ''
  super()
  @specs = specs
  @target_definitions = target_definitions
  @sandbox = sandbox
  @scope_suffix = scope_suffix
  @build_headers  = Sandbox::HeadersStore.new(sandbox, 'Private')
  @file_accessors = []
  @resource_bundle_targets = []
  @test_resource_bundle_targets = []
  @test_native_targets = []
  @dependent_targets = []
  @test_dependent_targets = []
  @build_config_cache = {}
end

Instance Attribute Details

#build_headersHeadersStore (readonly)

Returns the header directory for the target.

Returns:

  • (HeadersStore)

    the header directory for the target.



17
18
19
# File 'lib/cocoapods/target/pod_target.rb', line 17

def build_headers
  @build_headers
end

#dependent_targetsArray<PodTarget>

Returns the targets that this target has a dependency upon.

Returns:

  • (Array<PodTarget>)

    the targets that this target has a dependency upon.



29
30
31
# File 'lib/cocoapods/target/pod_target.rb', line 29

def dependent_targets
  @dependent_targets
end

#file_accessorsArray<Sandbox::FileAccessor>

Returns the file accessors for the specifications of this target.

Returns:



147
148
149
# File 'lib/cocoapods/target/pod_target.rb', line 147

def file_accessors
  @file_accessors
end

#platformPlatform

Note:

The deployment target for the pod target is the maximum of all the deployment targets for the current platform of the target (or the minimum required to support the current installation strategy, if higher).

Returns the platform for this target.

Returns:

  • (Platform)

    the platform for this target.



111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/cocoapods/target/pod_target.rb', line 111

def platform
  @platform ||= begin
    platform_name = target_definitions.first.platform.name
    default = Podfile::TargetDefinition::PLATFORM_DEFAULTS[platform_name]
    deployment_target = specs.map do |spec|
      Version.new(spec.deployment_target(platform_name) || default)
    end.max
    if platform_name == :ios && requires_frameworks?
      minimum = Version.new('8.0')
      deployment_target = [deployment_target, minimum].max
    end
    Platform.new(platform_name, deployment_target)
  end
end

#resource_bundle_targetsArray<PBXNativeTarget> (readonly)

Returns the resource bundle targets belonging to this target.

Returns:

  • (Array<PBXNativeTarget>)

    the resource bundle targets belonging to this target.



151
152
153
# File 'lib/cocoapods/target/pod_target.rb', line 151

def resource_bundle_targets
  @resource_bundle_targets
end

#scope_suffixString (readonly)

Note:

This affects the value returned by #configuration_build_dir and accessors relying on this as #build_product_path.

Returns used as suffix in the label

Returns:

  • (String)

    used as suffix in the label



24
25
26
# File 'lib/cocoapods/target/pod_target.rb', line 24

def scope_suffix
  @scope_suffix
end

#specsArray<Specification> (readonly)

Returns the spec and subspecs for the target.

Returns:

  • (Array<Specification>)

    the spec and subspecs for the target.



8
9
10
# File 'lib/cocoapods/target/pod_target.rb', line 8

def specs
  @specs
end

#target_definitionsArray<TargetDefinition> (readonly)

Returns the target definitions of the Podfile that generated this target.

Returns:

  • (Array<TargetDefinition>)

    the target definitions of the Podfile that generated this target.



13
14
15
# File 'lib/cocoapods/target/pod_target.rb', line 13

def target_definitions
  @target_definitions
end

#test_dependent_targetsArray<PodTarget>

Returns the targets that this target has a test dependency upon.

Returns:

  • (Array<PodTarget>)

    the targets that this target has a test dependency upon.



34
35
36
# File 'lib/cocoapods/target/pod_target.rb', line 34

def test_dependent_targets
  @test_dependent_targets
end

#test_native_targetsObject

return [Array<PBXNativeTarget>] the test target generated in the Pods project for

this library or `nil` if there is no test target created.


39
40
41
# File 'lib/cocoapods/target/pod_target.rb', line 39

def test_native_targets
  @test_native_targets
end

#test_resource_bundle_targetsArray<PBXNativeTarget> (readonly)

Returns the resource bundle test targets belonging to this target.

Returns:

  • (Array<PBXNativeTarget>)

    the resource bundle test targets belonging to this target.



155
156
157
# File 'lib/cocoapods/target/pod_target.rb', line 155

def test_resource_bundle_targets
  @test_resource_bundle_targets
end

Instance Method Details

#all_test_dependent_targetsArray<PodTarget>

Returns the canonical list of test dependent targets this target has a dependency upon. This includes the parent target as well as its transitive dependencies.

Returns:

  • (Array<PodTarget>)

    the canonical list of test dependent targets this target has a dependency upon. This includes the parent target as well as its transitive dependencies.



391
392
393
# File 'lib/cocoapods/target/pod_target.rb', line 391

def all_test_dependent_targets
  [self, *recursive_dependent_targets, *recursive_test_dependent_targets].uniq
end

#build_product_path(dir = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE) ⇒ String

Returns The absolute path to the build product

Parameters:

  • dir (String) (defaults to: Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE)

    @see #configuration_build_dir

Returns:

  • (String)

    The absolute path to the build product



470
471
472
# File 'lib/cocoapods/target/pod_target.rb', line 470

def build_product_path(dir = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE)
  "#{configuration_build_dir(dir)}/#{product_name}"
end

#configuration_build_dir(dir = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE) ⇒ String

Returns The absolute path to the configuration build dir

Parameters:

  • dir (String) (defaults to: Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE)

    The directory (which might be a variable) relative to which the returned path should be. This must be used if the $CONFIGURATION_BUILD_DIR is modified.

Returns:

  • (String)

    The absolute path to the configuration build dir



461
462
463
# File 'lib/cocoapods/target/pod_target.rb', line 461

def configuration_build_dir(dir = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE)
  "#{dir}/#{label}"
end

#contains_test_specifications?Boolean

Returns Whether the target has any tests specifications.

Returns:

  • (Boolean)

    Whether the target has any tests specifications.



190
191
192
# File 'lib/cocoapods/target/pod_target.rb', line 190

def contains_test_specifications?
  specs.any?(&:test_specification?)
end

#copy_resources_script_path_for_test_type(test_type) ⇒ Pathname

Returns The absolute path of the copy resources script for the given test type.

Parameters:

  • test_type (Symbol)

    The test type this embed frameworks script path is for.

Returns:

  • (Pathname)

    The absolute path of the copy resources script for the given test type.



332
333
334
# File 'lib/cocoapods/target/pod_target.rb', line 332

def copy_resources_script_path_for_test_type(test_type)
  support_files_dir + "#{test_target_label(test_type)}-resources.sh"
end

#dependenciesArray<String>

Returns The names of the Pods on which this target depends.

Returns:

  • (Array<String>)

    The names of the Pods on which this target depends.



348
349
350
351
352
# File 'lib/cocoapods/target/pod_target.rb', line 348

def dependencies
  spec_consumers.flat_map do |consumer|
    consumer.dependencies.map { |dep| Specification.root_name(dep.name) }
  end.uniq
end

#embed_frameworks_script_path_for_test_type(test_type) ⇒ Pathname

Returns The absolute path of the embed frameworks script for the given test type.

Parameters:

  • test_type (Symbol)

    The test type this embed frameworks script path is for.

Returns:

  • (Pathname)

    The absolute path of the embed frameworks script for the given test type.



341
342
343
# File 'lib/cocoapods/target/pod_target.rb', line 341

def embed_frameworks_script_path_for_test_type(test_type)
  support_files_dir + "#{test_target_label(test_type)}-frameworks.sh"
end

#framework_pathsArray<Hash{Symbol => [String]}>

Returns The vendored and non vendored framework paths this target depends upon.

Returns:

  • (Array<Hash{Symbol => [String]}>)

    The vendored and non vendored framework paths this target depends upon.



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/cocoapods/target/pod_target.rb', line 203

def framework_paths
  @framework_paths ||= begin
    frameworks = []
    file_accessors.flat_map(&:vendored_dynamic_artifacts).map do |framework_path|
      relative_path_to_sandbox = framework_path.relative_path_from(sandbox.root)
      framework = { :name => framework_path.basename.to_s,
                    :input_path => "${PODS_ROOT}/#{relative_path_to_sandbox}",
                    :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{framework_path.basename}" }
      # Until this can be configured, assume the dSYM file uses the file name as the framework.
      # See https://github.com/CocoaPods/CocoaPods/issues/1698
      dsym_name = "#{framework_path.basename}.dSYM"
      dsym_path = Pathname.new("#{framework_path.dirname}/#{dsym_name}")
      if dsym_path.exist?
        framework[:dsym_name] = dsym_name
        framework[:dsym_input_path] = "${PODS_ROOT}/#{relative_path_to_sandbox}.dSYM"
        framework[:dsym_output_path] = "${DWARF_DSYM_FOLDER_PATH}/#{dsym_name}"
      end
      frameworks << framework
    end
    if should_build? && requires_frameworks?
      frameworks << { :name => product_name,
                      :input_path => build_product_path('${BUILT_PRODUCTS_DIR}'),
                      :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{product_name}" }
    end
    frameworks
  end
end

#include_in_build_config?(target_definition, configuration_name) ⇒ Boolean

Checks if the target should be included in the build configuration with the given name of a given target definition.

Parameters:

  • target_definition (TargetDefinition)

    The target definition to check.

  • configuration_name (String)

    The name of the build configuration.

Returns:

  • (Boolean)


404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# File 'lib/cocoapods/target/pod_target.rb', line 404

def include_in_build_config?(target_definition, configuration_name)
  key = [target_definition.label, configuration_name]
  if @build_config_cache.key?(key)
    return @build_config_cache[key]
  end

  whitelists = target_definition_dependencies(target_definition).map do |dependency|
    target_definition.pod_whitelisted_for_configuration?(dependency.name, configuration_name)
  end.uniq

  if whitelists.empty?
    @build_config_cache[key] = true
    true
  elsif whitelists.count == 1
    @build_config_cache[key] = whitelists.first
    whitelists.first
  else
    raise Informative, "The subspecs of `#{pod_name}` are linked to " \
      "different build configurations for the `#{target_definition}` " \
      'target. CocoaPods does not currently support subspecs across ' \
      'different build configurations.'
  end
end

#inhibit_warnings?Bool

Checks if warnings should be inhibited for this pod.

Returns:

  • (Bool)


432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
# File 'lib/cocoapods/target/pod_target.rb', line 432

def inhibit_warnings?
  return @inhibit_warnings if defined? @inhibit_warnings
  whitelists = target_definitions.map do |target_definition|
    target_definition.inhibits_warnings_for_pod?(root_spec.name)
  end.uniq

  if whitelists.empty?
    @inhibit_warnings = false
    false
  elsif whitelists.count == 1
    @inhibit_warnings = whitelists.first
    whitelists.first
  else
    UI.warn "The pod `#{pod_name}` is linked to different targets " \
      "(#{target_definitions.map(&:label)}), which contain different " \
      'settings to inhibit warnings. CocoaPods does not currently ' \
      'support different settings and will fall back to your preference ' \
      'set in the root target definition.'
    podfile.root_target_definitions.first.inhibits_warnings_for_pod?(root_spec.name)
  end
end

#labelString

Returns the label for the target.

Returns:

  • (String)

    the label for the target.



90
91
92
93
94
95
96
# File 'lib/cocoapods/target/pod_target.rb', line 90

def label
  if scope_suffix.nil? || scope_suffix[0] == '.'
    "#{root_spec.name}#{scope_suffix}"
  else
    "#{root_spec.name}-#{scope_suffix}"
  end
end

#native_target_for_spec(spec) ⇒ PBXNativeTarget

Returns the corresponding native target to use based on the provided specification. This is used to figure out whether to add a source file into the library native target or any of the test native targets.

Parameters:

  • spec (Specification)

    The specifcation to base from in order to find the native target.

Returns:

  • (PBXNativeTarget)

    the native target to use or `nil` if none is found.



256
257
258
259
260
261
# File 'lib/cocoapods/target/pod_target.rb', line 256

def native_target_for_spec(spec)
  return native_target unless spec.test_specification?
  test_native_targets.find do |native_target|
    native_target.symbol_type == product_type_for_test_type(spec.test_type)
  end
end

#pod_nameString

Returns The name of the Pod that this target refers to.

Returns:

  • (String)

    The name of the Pod that this target refers to.



305
306
307
# File 'lib/cocoapods/target/pod_target.rb', line 305

def pod_name
  root_spec.name
end

#pod_target_srcrootString

Returns The source path of the root for this target relative to `$(PODS_ROOT)`

Returns:

  • (String)

    The source path of the root for this target relative to `$(PODS_ROOT)`



476
477
478
# File 'lib/cocoapods/target/pod_target.rb', line 476

def pod_target_srcroot
  "${PODS_ROOT}/#{sandbox.pod_dir(pod_name).relative_path_from(sandbox.root)}"
end

#podfilePodfile

Returns The podfile which declares the dependency.

Returns:

  • (Podfile)

    The podfile which declares the dependency.



132
133
134
# File 'lib/cocoapods/target/pod_target.rb', line 132

def podfile
  target_definitions.first.podfile
end

#product_module_nameString

Returns The name to use for the source code module constructed for this target, and which will be used to import the module in implementation source files.

Returns:

  • (String)

    The name to use for the source code module constructed for this target, and which will be used to import the module in implementation source files.



140
141
142
# File 'lib/cocoapods/target/pod_target.rb', line 140

def product_module_name
  root_spec.module_name
end

#product_type_for_test_type(test_type) ⇒ Symbol

Returns the corresponding native product type to use given the test type. This is primarily used when creating the native targets in order to produce the correct test bundle target based on the type of tests included.

Parameters:

  • test_type (Symbol)

    The test type to map to provided by the test specification DSL.

Returns:

  • (Symbol)

    The native product type to use.



272
273
274
275
276
277
278
279
# File 'lib/cocoapods/target/pod_target.rb', line 272

def product_type_for_test_type(test_type)
  case test_type
  when :unit
    :unit_test_bundle
  else
    raise Informative, "Unknown test type `#{test_type}`."
  end
end

#recursive_dependent_targetsArray<PodTarget>

Returns the recursive targets that this target has a dependency upon.

Returns:

  • (Array<PodTarget>)

    the recursive targets that this target has a dependency upon.



357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/cocoapods/target/pod_target.rb', line 357

def recursive_dependent_targets
  @recursive_dependent_targets ||= begin
    targets = dependent_targets.clone

    targets.each do |target|
      target.dependent_targets.each do |t|
        targets.push(t) unless t == self || targets.include?(t)
      end
    end

    targets
  end
end

#recursive_test_dependent_targetsArray<PodTarget>

Returns the recursive targets that this target has a test dependency upon.

Returns:

  • (Array<PodTarget>)

    the recursive targets that this target has a test dependency upon.



374
375
376
377
378
379
380
381
382
383
384
385
386
# File 'lib/cocoapods/target/pod_target.rb', line 374

def recursive_test_dependent_targets
  @recursive_test_dependent_targets ||= begin
    targets = test_dependent_targets.clone

    targets.each do |target|
      target.test_dependent_targets.each do |t|
        targets.push(t) unless t == self || targets.include?(t)
      end
    end

    targets
  end
end

#resource_pathsArray<String>

Returns The resource and resource bundle paths this target depends upon.

Returns:

  • (Array<String>)

    The resource and resource bundle paths this target depends upon.



233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/cocoapods/target/pod_target.rb', line 233

def resource_paths
  @resource_paths ||= begin
    resource_paths = file_accessors.flat_map do |accessor|
      accessor.resources.flat_map { |res| "${PODS_ROOT}/#{res.relative_path_from(sandbox.project.path.dirname)}" }
    end
    resource_bundles = file_accessors.flat_map do |accessor|
      prefix = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE
      prefix = configuration_build_dir unless accessor.spec.test_specification?
      accessor.resource_bundles.keys.map { |name| "#{prefix}/#{name.shellescape}.bundle" }
    end
    resource_paths + resource_bundles
  end
end

#resources_bundle_target_label(bundle_name) ⇒ String

Returns The derived name of the resource bundle target.

Parameters:

  • bundle_name (String)

    The name of the bundle product, which is given by the spec.

Returns:

  • (String)

    The derived name of the resource bundle target.



314
315
316
# File 'lib/cocoapods/target/pod_target.rb', line 314

def resources_bundle_target_label(bundle_name)
  "#{label}-#{bundle_name}"
end

#root_specSpecification

Returns The root specification for the target.

Returns:



299
300
301
# File 'lib/cocoapods/target/pod_target.rb', line 299

def root_spec
  specs.first.root
end

#scoped(cache = {}) ⇒ Array<PodTarget>

Returns a scoped copy for each target definition.

Parameters:

  • cache (Hash{Array => PodTarget}) (defaults to: {})

    the cached PodTarget for a previously scoped (specs, target_definition)

Returns:

  • (Array<PodTarget>)

    a scoped copy for each target definition.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/cocoapods/target/pod_target.rb', line 70

def scoped(cache = {})
  target_definitions.map do |target_definition|
    cache_key = [specs, target_definition]
    if cache[cache_key]
      cache[cache_key]
    else
      target = PodTarget.new(specs, [target_definition], sandbox, target_definition.label)
      target.file_accessors = file_accessors
      target.user_build_configurations = user_build_configurations
      target.native_target = native_target
      target.archs = archs
      target.dependent_targets = dependent_targets.flat_map { |pt| pt.scoped(cache) }.select { |pt| pt.target_definitions == [target_definition] }
      target.host_requires_frameworks = host_requires_frameworks
      cache[cache_key] = target
    end
  end
end

#should_build?Bool

A target should not be build if it has no source files.

Returns:

  • (Bool)

    Whether or not this target should be build.



161
162
163
164
165
166
167
168
# File 'lib/cocoapods/target/pod_target.rb', line 161

def should_build?
  return @should_build if defined? @should_build
  @should_build = begin
    source_files = file_accessors.flat_map(&:source_files)
    source_files -= file_accessors.flat_map(&:headers)
    !source_files.empty?
  end
end

#spec_consumersArray<Specification::Consumer>

Returns the specification consumers for the target.

Returns:

  • (Array<Specification::Consumer>)

    the specification consumers for the target.



173
174
175
# File 'lib/cocoapods/target/pod_target.rb', line 173

def spec_consumers
  specs.map { |spec| spec.consumer(platform) }
end

#supported_test_typesArray<Symbol>

Returns All of the test supported types within this target.

Returns:

  • (Array<Symbol>)

    All of the test supported types within this target.



196
197
198
# File 'lib/cocoapods/target/pod_target.rb', line 196

def supported_test_types
  specs.select(&:test_specification?).map(&:test_type).uniq
end

#swift_versionString

Returns the Swift version for the target.

Returns:

  • (String)

    the Swift version for the target.



100
101
102
# File 'lib/cocoapods/target/pod_target.rb', line 100

def swift_version
  target_definitions.map(&:swift_version).compact.uniq.first
end

#test_target_label(test_type) ⇒ String

Returns The derived name of the test target.

Parameters:

  • test_type (Symbol)

    The test type to use for producing the test label.

Returns:

  • (String)

    The derived name of the test target.



323
324
325
# File 'lib/cocoapods/target/pod_target.rb', line 323

def test_target_label(test_type)
  "#{label}-#{test_type.capitalize}-Tests"
end

#test_type_for_product_type(product_type) ⇒ Symbol

Returns the corresponding test type given the product type.

Parameters:

  • product_type (Symbol)

    The product type to map to a test type.

Returns:

  • (Symbol)

    The native product type to use.



288
289
290
291
292
293
294
295
# File 'lib/cocoapods/target/pod_target.rb', line 288

def test_type_for_product_type(product_type)
  case product_type
  when :unit_test_bundle
    :unit
  else
    raise Informative, "Unknown product type `#{product_type}`."
  end
end

#uses_swift?Boolean

Returns Whether the target uses Swift code.

Returns:

  • (Boolean)

    Whether the target uses Swift code.



179
180
181
182
183
184
185
186
# File 'lib/cocoapods/target/pod_target.rb', line 179

def uses_swift?
  return @uses_swift if defined? @uses_swift
  @uses_swift = begin
    file_accessors.any? do |file_accessor|
      file_accessor.source_files.any? { |sf| sf.extname == '.swift' }
    end
  end
end