Class: Pod::AggregateTarget

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

Overview

Stores the information relative to the target used to cluster the targets of the single Pods. The client targets will then depend on this one.

Constant Summary collapse

EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES =

Product types where the product's frameworks must be embedded in a host target

[:app_extension, :framework, :static_library, :messages_extension,
:watch_extension, :xpc_service].freeze

Constants inherited from Target

Target::DEFAULT_BUILD_CONFIGURATIONS, Target::DEFAULT_NAME, Target::DEFAULT_VERSION

Instance Attribute Summary collapse

Attributes inherited from Target

#application_extension_api_only, #archs, #platform, #sandbox, #user_build_configurations

Support files collapse

Instance Method Summary collapse

Methods inherited from Target

#bridge_support_path, #build_as_dynamic?, #build_as_dynamic_framework?, #build_as_dynamic_library?, #build_as_framework?, #build_as_library?, #build_as_static?, #build_as_static_framework?, #build_as_static_library?, #dummy_source_path, #framework_name, #info_plist_entries, #info_plist_path, #inspect, #mark_application_extension_api_only, #module_map_path, #module_map_path_to_write, #name, #prepare_artifacts_script_path, #product_basename, #product_module_name, #product_name, #product_type, #requires_frameworks?, #static_framework?, #static_library_name, #support_files_dir, #umbrella_header_path, #umbrella_header_path_to_write, #version, #xcconfig_path

Constructor Details

#initialize(sandbox, build_type, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration) ⇒ AggregateTarget

Initialize a new instance


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

def initialize(sandbox, build_type, user_build_configurations, archs, platform, target_definition, client_root,
               user_project, user_target_uuids, pod_targets_for_build_configuration)
  super(sandbox, build_type, user_build_configurations, archs, platform)
  raise "Can't initialize an AggregateTarget without a TargetDefinition!" if target_definition.nil?
  raise "Can't initialize an AggregateTarget with an abstract TargetDefinition!" if target_definition.abstract?
  @target_definition = target_definition
  @client_root = client_root
  @user_project = user_project
  @user_target_uuids = user_target_uuids
  @pod_targets_for_build_configuration = pod_targets_for_build_configuration
  @pod_targets = pod_targets_for_build_configuration.values.flatten.uniq
  @search_paths_aggregate_targets = []
  @xcconfigs = {}
end

Instance Attribute Details

#client_rootPathname (readonly)


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

def client_root
  @client_root
end

#pod_targetsArray<PodTarget> (readonly)


50
51
52
# File 'lib/cocoapods/target/aggregate_target.rb', line 50

def pod_targets
  @pod_targets
end

#search_paths_aggregate_targetsArray<AggregateTarget> (readonly)


55
56
57
# File 'lib/cocoapods/target/aggregate_target.rb', line 55

def search_paths_aggregate_targets
  @search_paths_aggregate_targets
end

#target_definitionTargetDefinition (readonly)


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

def target_definition
  @target_definition
end

#user_projectXcodeproj::Project (readonly)


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

def user_project
  @user_project
end

#user_target_uuidsArray<String> (readonly)

Note:

The target instances are not stored to prevent editing different instances.

Returns the list of the UUIDs of the user targets that will be integrated by this target as identified by the analyzer.


37
38
39
# File 'lib/cocoapods/target/aggregate_target.rb', line 37

def user_target_uuids
  @user_target_uuids
end

#xcconfigsHash<String, Xcodeproj::Config> (readonly)

Note:

The configurations are generated by the TargetInstaller and used by UserProjectIntegrator to check for any overridden values.

Returns Map from configuration name to configuration file for the target.


46
47
48
# File 'lib/cocoapods/target/aggregate_target.rb', line 46

def xcconfigs
  @xcconfigs
end

Instance Method Details

#acknowledgements_basepathPathname

Note:

The acknowledgements generators add the extension according to the file type.

Returns The absolute path of acknowledgements file.


310
311
312
# File 'lib/cocoapods/target/aggregate_target.rb', line 310

def acknowledgements_basepath
  support_files_dir + "#{label}-acknowledgements"
end

#bridge_support_filePathname


297
298
299
# File 'lib/cocoapods/target/aggregate_target.rb', line 297

def bridge_support_file
  bridge_support_path.relative_path_from(sandbox.root) if podfile.generate_bridge_support?
end

#build_settings(configuration_name = nil) ⇒ Object


104
105
106
107
108
109
110
111
112
# File 'lib/cocoapods/target/aggregate_target.rb', line 104

def build_settings(configuration_name = nil)
  if configuration_name
    @build_settings[configuration_name] ||
      raise(ArgumentError, "#{self} does not contain a build setting for the #{configuration_name.inspect} configuration, only #{@build_settings.keys.inspect}")
  else
    @build_settings.each_value.first ||
      raise(ArgumentError, "#{self} does not contain any build settings")
  end
end

#check_manifest_lock_script_output_file_pathString


376
377
378
# File 'lib/cocoapods/target/aggregate_target.rb', line 376

def check_manifest_lock_script_output_file_path
  "$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt"
end

#copy_resources_script_input_files_path(configuration) ⇒ Pathname


330
331
332
# File 'lib/cocoapods/target/aggregate_target.rb', line 330

def copy_resources_script_input_files_path(configuration)
  support_files_dir + "#{label}-resources-#{configuration}-input-files.xcfilelist"
end

#copy_resources_script_input_files_relative_pathString


421
422
423
# File 'lib/cocoapods/target/aggregate_target.rb', line 421

def copy_resources_script_input_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_input_files_path('${CONFIGURATION}'))}"
end

#copy_resources_script_output_files_path(configuration) ⇒ Pathname


338
339
340
# File 'lib/cocoapods/target/aggregate_target.rb', line 338

def copy_resources_script_output_files_path(configuration)
  support_files_dir + "#{label}-resources-#{configuration}-output-files.xcfilelist"
end

#copy_resources_script_output_files_relative_pathString


428
429
430
# File 'lib/cocoapods/target/aggregate_target.rb', line 428

def copy_resources_script_output_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_output_files_path('${CONFIGURATION}'))}"
end

#copy_resources_script_pathPathname


316
317
318
# File 'lib/cocoapods/target/aggregate_target.rb', line 316

def copy_resources_script_path
  support_files_dir + "#{label}-resources.sh"
end

#copy_resources_script_relative_pathString


414
415
416
# File 'lib/cocoapods/target/aggregate_target.rb', line 414

def copy_resources_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_path)}"
end

#embed_frameworks_script_input_files_path(configuration) ⇒ Pathname


346
347
348
# File 'lib/cocoapods/target/aggregate_target.rb', line 346

def embed_frameworks_script_input_files_path(configuration)
  support_files_dir + "#{label}-frameworks-#{configuration}-input-files.xcfilelist"
end

#embed_frameworks_script_input_files_relative_pathString


442
443
444
# File 'lib/cocoapods/target/aggregate_target.rb', line 442

def embed_frameworks_script_input_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_input_files_path('${CONFIGURATION}'))}"
end

#embed_frameworks_script_output_files_path(configuration) ⇒ Pathname


354
355
356
# File 'lib/cocoapods/target/aggregate_target.rb', line 354

def embed_frameworks_script_output_files_path(configuration)
  support_files_dir + "#{label}-frameworks-#{configuration}-output-files.xcfilelist"
end

#embed_frameworks_script_output_files_relative_pathString


449
450
451
# File 'lib/cocoapods/target/aggregate_target.rb', line 449

def embed_frameworks_script_output_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_output_files_path('${CONFIGURATION}'))}"
end

#embed_frameworks_script_pathPathname


322
323
324
# File 'lib/cocoapods/target/aggregate_target.rb', line 322

def embed_frameworks_script_path
  support_files_dir + "#{label}-frameworks.sh"
end

#embed_frameworks_script_relative_pathString


435
436
437
# File 'lib/cocoapods/target/aggregate_target.rb', line 435

def embed_frameworks_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_path)}"
end

#framework_paths_by_configHash{String => Array<FrameworkPaths>}


244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/cocoapods/target/aggregate_target.rb', line 244

def framework_paths_by_config
  @framework_paths_by_config ||= begin
    framework_paths_by_config = {}
    user_build_configurations.each_key do |config|
      relevant_pod_targets = pod_targets_for_build_configuration(config)
      framework_paths_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
        library_specs = pod_target.library_specs.map(&:name)
        pod_target.framework_paths.values_at(*library_specs).flatten.compact.uniq
      end
    end
    framework_paths_by_config
  end
end

#includes_frameworks?Boolean


230
231
232
# File 'lib/cocoapods/target/aggregate_target.rb', line 230

def includes_frameworks?
  !framework_paths_by_config.each_value.all?(&:empty?)
end

#includes_resources?Boolean


223
224
225
# File 'lib/cocoapods/target/aggregate_target.rb', line 223

def includes_resources?
  !resource_paths_by_config.each_value.all?(&:empty?)
end

#includes_xcframeworks?Boolean


237
238
239
# File 'lib/cocoapods/target/aggregate_target.rb', line 237

def includes_xcframeworks?
  !xcframeworks_by_config.each_value.all?(&:empty?)
end

#labelString


148
149
150
# File 'lib/cocoapods/target/aggregate_target.rb', line 148

def label
  target_definition.label.to_s
end

#library?Boolean


117
118
119
120
121
122
123
124
125
126
# File 'lib/cocoapods/target/aggregate_target.rb', line 117

def library?  # Without a user_project, we can't say for sure
  # that this is a library

  return false if user_project.nil?
  symbol_types = user_targets.map(&:symbol_type).uniq
  unless symbol_types.count == 1
    raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}."
  end
  [:framework, :dynamic_library, :static_library].include? symbol_types.first
end

#merge_embedded_pod_targets(embedded_pod_targets_for_build_configuration) ⇒ AggregateTarget

Merges this aggregate target with additional pod targets that are part of embedded aggregate targets.


93
94
95
96
97
98
99
100
101
102
# File 'lib/cocoapods/target/aggregate_target.rb', line 93

def merge_embedded_pod_targets(embedded_pod_targets_for_build_configuration)
  merged = @pod_targets_for_build_configuration.merge(embedded_pod_targets_for_build_configuration) do |_, before, after|
    (before + after).uniq
  end
  AggregateTarget.new(sandbox, build_type, user_build_configurations, archs, platform,
                      target_definition, client_root, user_project, user_target_uuids, merged).tap do |aggregate_target|
    aggregate_target.search_paths_aggregate_targets.concat(search_paths_aggregate_targets).freeze
    aggregate_target.mark_application_extension_api_only if application_extension_api_only
  end
end

#pod_targets_for_build_configuration(build_configuration) ⇒ Array<PodTarget>


187
188
189
# File 'lib/cocoapods/target/aggregate_target.rb', line 187

def pod_targets_for_build_configuration(build_configuration)
  @pod_targets_for_build_configuration[build_configuration] || []
end

#podfilePodfile


154
155
156
# File 'lib/cocoapods/target/aggregate_target.rb', line 154

def podfile
  target_definition.podfile
end

#podfile_dir_relative_pathString


396
397
398
399
400
401
# File 'lib/cocoapods/target/aggregate_target.rb', line 396

def podfile_dir_relative_path
  podfile_path = target_definition.podfile.defined_in_file
  return "${SRCROOT}/#{podfile_path.relative_path_from(client_root).dirname}" unless podfile_path.nil?  # Fallback to the standard path if the Podfile is not represented by a file.

  '${PODS_ROOT}/..'
end

#prepare_artifacts_script_input_files_path(configuration) ⇒ Pathname


362
363
364
# File 'lib/cocoapods/target/aggregate_target.rb', line 362

def prepare_artifacts_script_input_files_path(configuration)
  support_files_dir + "#{label}-artifacts-#{configuration}-input-files.xcfilelist"
end

#prepare_artifacts_script_input_files_relative_pathString


463
464
465
# File 'lib/cocoapods/target/aggregate_target.rb', line 463

def prepare_artifacts_script_input_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_input_files_path('${CONFIGURATION}'))}"
end

#prepare_artifacts_script_output_files_path(configuration) ⇒ Pathname


370
371
372
# File 'lib/cocoapods/target/aggregate_target.rb', line 370

def prepare_artifacts_script_output_files_path(configuration)
  support_files_dir + "#{label}-artifacts-#{configuration}-output-files.xcfilelist"
end

#prepare_artifacts_script_output_files_relative_pathString


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

def prepare_artifacts_script_output_files_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_output_files_path('${CONFIGURATION}'))}"
end

#prepare_artifacts_script_relative_pathString


456
457
458
# File 'lib/cocoapods/target/aggregate_target.rb', line 456

def prepare_artifacts_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_path)}"
end

#relative_pods_rootString


389
390
391
# File 'lib/cocoapods/target/aggregate_target.rb', line 389

def relative_pods_root
  "${SRCROOT}/#{relative_pods_root_path}"
end

#relative_pods_root_pathPathname


382
383
384
# File 'lib/cocoapods/target/aggregate_target.rb', line 382

def relative_pods_root_path
  sandbox.root.relative_path_from(client_root)
end

#requires_host_target?Boolean


132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/cocoapods/target/aggregate_target.rb', line 132

def requires_host_target?  # If we don't have a user_project, then we can't
  # glean any info about how this target is going to
  # be integrated, so return false since we can't know
  # for sure that this target refers to an extension
  # target that would require a host target

  return false if user_project.nil?
  symbol_types = user_targets.map(&:symbol_type).uniq
  unless symbol_types.count == 1
    raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}."
  end
  EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES.include?(symbol_types[0])
end

#resource_paths_by_configHash{String => Array<String>}


277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/cocoapods/target/aggregate_target.rb', line 277

def resource_paths_by_config
  @resource_paths_by_config ||= begin
    relevant_pod_targets = pod_targets.reject do |pod_target|
      pod_target.should_build? && pod_target.build_as_dynamic_framework?
    end
    user_build_configurations.each_key.each_with_object({}) do |config, resources_by_config|
      targets = relevant_pod_targets & pod_targets_for_build_configuration(config)
      resources_by_config[config] = targets.flat_map do |pod_target|
        library_specs = pod_target.library_specs.map(&:name)
        resource_paths = pod_target.resource_paths.values_at(*library_specs).flatten
        resource_paths << bridge_support_file
        resource_paths.compact.uniq
      end
    end
  end
end

#spec_consumersArray<Specification::Consumer>


211
212
213
# File 'lib/cocoapods/target/aggregate_target.rb', line 211

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

#specsArray<Specification>


193
194
195
# File 'lib/cocoapods/target/aggregate_target.rb', line 193

def specs
  pod_targets.flat_map(&:specs)
end

#specs_by_build_configurationHash{Symbol => Array<Specification>}


200
201
202
203
204
205
206
207
# File 'lib/cocoapods/target/aggregate_target.rb', line 200

def specs_by_build_configuration
  result = {}
  user_build_configurations.each_key do |build_configuration|
    result[build_configuration] = pod_targets_for_build_configuration(build_configuration).
      flat_map(&:specs)
  end
  result
end

#user_project_pathPathname


161
162
163
# File 'lib/cocoapods/target/aggregate_target.rb', line 161

def user_project_path
  user_project.path if user_project
end

#user_targetsArray<PBXNativeTarget>

List all user targets that will be integrated by this #target.


169
170
171
172
173
174
175
176
177
178
179
# File 'lib/cocoapods/target/aggregate_target.rb', line 169

def user_targets
  return [] unless user_project
  user_target_uuids.map do |uuid|
    native_target = user_project.objects_by_uuid[uuid]
    unless native_target
      raise Informative, '[Bug] Unable to find the target with ' \
        "the `#{uuid}` UUID for the `#{self}` integration library"
    end
    native_target
  end
end

#uses_swift?Boolean


217
218
219
# File 'lib/cocoapods/target/aggregate_target.rb', line 217

def uses_swift?
  pod_targets.any?(&:uses_swift?)
end

#xcconfig_relative_path(config_name) ⇒ String


407
408
409
# File 'lib/cocoapods/target/aggregate_target.rb', line 407

def xcconfig_relative_path(config_name)
  xcconfig_path(config_name).relative_path_from(client_root).to_s
end

#xcframeworks_by_configHash{String => Array<Xcode::XCFramework>}


261
262
263
264
265
266
267
268
269
270
271
272
273
# File 'lib/cocoapods/target/aggregate_target.rb', line 261

def xcframeworks_by_config
  @xcframeworks_by_config ||= begin
    xcframeworks_by_config = {}
    user_build_configurations.each_key do |config|
      relevant_pod_targets = pod_targets_for_build_configuration(config)
      xcframeworks_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
        library_specs = pod_target.library_specs.map(&:name)
        pod_target.xcframeworks.values_at(*library_specs).flatten.compact.uniq
      end
    end
    xcframeworks_by_config
  end
end