class Pod::AggregateTarget

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.

Constants

EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES

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

Attributes

client_root[R]

@return [Pathname] the folder where the client is stored used for

computing the relative paths. If integrating it should be the
folder where the user project is stored, otherwise it should
be the installation root.
pod_targets[R]

@return [Array<PodTarget>] The dependencies for this target.

search_paths_aggregate_targets[R]

@return [Array<AggregateTarget>] The aggregate targets whose pods this

target must be able to import, but will not directly link against.
target_definition[R]

@return [TargetDefinition] the target definition of the Podfile that

generated this target.
user_project[R]

@return [Xcodeproj::Project] the user project that this target will

integrate as identified by the analyzer.
user_target_uuids[R]

@return [Array<String>] the list of the UUIDs of the user targets that

will be integrated by this target as identified by the analyzer.

@note The target instances are not stored to prevent editing different

instances.
xcconfigs[R]

@return [Hash<String, Xcodeproj::Config>] Map from configuration name to

configuration file for the target

@note The configurations are generated by the {TargetInstaller} and

used by {UserProjectIntegrator} to check for any overridden
values.

Public Class Methods

new(sandbox, build_type, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration) click to toggle source

Initialize a new instance

@param [Sandbox] sandbox @see Target#sandbox @param [BuildType] build_type @see Target#build_type @param [Hash{String=>Symbol}] user_build_configurations @see Target#user_build_configurations @param [Array<String>] archs @see Target#archs @param [Platform] platform @see #Target#platform @param [TargetDefinition] target_definition @see target_definition @param [Pathname] client_root @see client_root @param [Xcodeproj::Project] user_project @see user_project @param [Array<String>] user_target_uuids @see user_target_uuids @param [Hash{String=>Array<PodTarget>}] pod_targets_for_build_configuration @see pod_targets_for_build_configuration

Calls superclass method Pod::Target::new
# 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

Public Instance Methods

acknowledgements_basepath() click to toggle source

@return [Pathname] The absolute path of acknowledgements file.

@note The acknowledgements generators add the extension according to

the file type.
# File lib/cocoapods/target/aggregate_target.rb, line 347
def acknowledgements_basepath
  support_files_dir + "#{label}-acknowledgements"
end
bridge_support_file() click to toggle source

@return [Pathname] the path of the bridge support file relative to the

sandbox or `nil` if bridge support is disabled.
# File lib/cocoapods/target/aggregate_target.rb, line 334
def bridge_support_file
  bridge_support_path.relative_path_from(sandbox.root) if podfile.generate_bridge_support?
end
build_settings(configuration_name = nil) click to toggle source
# File lib/cocoapods/target/aggregate_target.rb, line 105
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_path() click to toggle source

@return [String] The output file path fo the check manifest lock script.

# File lib/cocoapods/target/aggregate_target.rb, line 421
def check_manifest_lock_script_output_file_path
  "$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt"
end
copy_resources_script_input_files_path(configuration) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the copy resources script input file list.

# File lib/cocoapods/target/aggregate_target.rb, line 367
def copy_resources_script_input_files_path(configuration)
  support_files_dir + "#{label}-resources-#{configuration}-input-files.xcfilelist"
end
copy_resources_script_input_files_relative_path() click to toggle source

@return [String] The path of the copy resources script input file list

relative to the root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 466
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) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the copy resources script output file list.

# File lib/cocoapods/target/aggregate_target.rb, line 375
def copy_resources_script_output_files_path(configuration)
  support_files_dir + "#{label}-resources-#{configuration}-output-files.xcfilelist"
end
copy_resources_script_output_files_relative_path() click to toggle source

@return [String] The path of the copy resources script output file list

relative to the root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 473
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_path() click to toggle source

@return [Pathname] The absolute path of the copy resources script.

# File lib/cocoapods/target/aggregate_target.rb, line 353
def copy_resources_script_path
  support_files_dir + "#{label}-resources.sh"
end
copy_resources_script_relative_path() click to toggle source

@return [String] The path of the copy resources script relative to the

root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 459
def copy_resources_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_path)}"
end
embed_frameworks_script_input_files_path(configuration) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the embed frameworks script input file list.

# File lib/cocoapods/target/aggregate_target.rb, line 383
def embed_frameworks_script_input_files_path(configuration)
  support_files_dir + "#{label}-frameworks-#{configuration}-input-files.xcfilelist"
end
embed_frameworks_script_input_files_relative_path() click to toggle source

@return [String] The path of the embed frameworks script input file list

relative to the root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 487
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) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the embed frameworks script output file list.

# File lib/cocoapods/target/aggregate_target.rb, line 391
def embed_frameworks_script_output_files_path(configuration)
  support_files_dir + "#{label}-frameworks-#{configuration}-output-files.xcfilelist"
end
embed_frameworks_script_output_files_relative_path() click to toggle source

@return [String] The path of the embed frameworks script output file list

relative to the root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 494
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_path() click to toggle source

@return [Pathname] The absolute path of the embed frameworks script.

# File lib/cocoapods/target/aggregate_target.rb, line 359
def embed_frameworks_script_path
  support_files_dir + "#{label}-frameworks.sh"
end
embed_frameworks_script_relative_path() click to toggle source

@return [String] The path of the embed frameworks relative to the

root of the Pods project.
# File lib/cocoapods/target/aggregate_target.rb, line 480
def embed_frameworks_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_path)}"
end
framework_paths_by_config() click to toggle source

@return [Hash{String => Array<FrameworkPaths>}] The vendored dynamic artifacts and framework target

input and output paths grouped by config
# File lib/cocoapods/target/aggregate_target.rb, line 251
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?() click to toggle source

@return [Boolean] Whether the target contains frameworks to be embedded into

the user target
# File lib/cocoapods/target/aggregate_target.rb, line 237
def includes_frameworks?
  !framework_paths_by_config.each_value.all?(&:empty?)
end
includes_on_demand_resources?() click to toggle source

@return [Boolean] Whether the target contains any on demand resources

# File lib/cocoapods/target/aggregate_target.rb, line 230
def includes_on_demand_resources?
  !on_demand_resources.empty?
end
includes_resources?() click to toggle source

@return [Boolean] Whether the target contains any resources

# File lib/cocoapods/target/aggregate_target.rb, line 224
def includes_resources?
  !resource_paths_by_config.each_value.all?(&:empty?)
end
includes_xcframeworks?() click to toggle source

@return [Boolean] Whether the target contains xcframeworks to be embedded into

the user target
# File lib/cocoapods/target/aggregate_target.rb, line 244
def includes_xcframeworks?
  !xcframeworks_by_config.each_value.all?(&:empty?)
end
label() click to toggle source

@return [String] the label for the target.

# File lib/cocoapods/target/aggregate_target.rb, line 149
def label
  target_definition.label.to_s
end
library?() click to toggle source

@return [Boolean] True if the user_target refers to a

library (framework, static or dynamic lib).
# File lib/cocoapods/target/aggregate_target.rb, line 118
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) click to toggle source

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

@param [Hash{String=>Array<PodTarget>}] embedded_pod_targets_for_build_configuration

The pod targets to merge with.

@return [AggregateTarget] a new instance of this aggregate target with additional pod targets to be used from

pod targets of embedded aggregate targets.
# 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
    aggregate_target.mark_build_library_for_distribution if build_library_for_distribution
  end
end
on_demand_resources() click to toggle source

@return [Array<Pathname>] Uniqued On Demand Resources for this target.

@note On Demand Resources are not separated by config as they are integrated directly into the users target via the resources build phase.

# File lib/cocoapods/target/aggregate_target.rb, line 287
def on_demand_resources
  @on_demand_resources ||= begin
    pod_targets.flat_map do |pod_target|
      library_file_accessors = pod_target.file_accessors.select { |fa| fa.spec.library_specification? }
      library_file_accessors.flat_map(&:on_demand_resources_files)
    end.uniq
  end
end
pod_targets_for_build_configuration(build_configuration) click to toggle source

@param [String] build_configuration The build configuration for which the

the pod targets should be returned.

@return [Array<PodTarget>] the pod targets for the given build

configuration.
# File lib/cocoapods/target/aggregate_target.rb, line 188
def pod_targets_for_build_configuration(build_configuration)
  @pod_targets_for_build_configuration[build_configuration] || []
end
podfile() click to toggle source

@return [Podfile] The podfile which declares the dependency

# File lib/cocoapods/target/aggregate_target.rb, line 155
def podfile
  target_definition.podfile
end
podfile_dir_relative_path() click to toggle source

@return [String] The path of the Podfile directory relative to the

root of the user project.
# File lib/cocoapods/target/aggregate_target.rb, line 441
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) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the prepare artifacts script input file list.

@deprecated

@todo Remove in 2.0

# File lib/cocoapods/target/aggregate_target.rb, line 403
def prepare_artifacts_script_input_files_path(configuration)
  support_files_dir + "#{label}-artifacts-#{configuration}-input-files.xcfilelist"
end
prepare_artifacts_script_input_files_relative_path() click to toggle source

@return [String] The path of the prepare artifacts script input file list

relative to the root of the Pods project.

@deprecated

@todo Remove in 2.0

# File lib/cocoapods/target/aggregate_target.rb, line 516
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) click to toggle source

@param [String] configuration the configuration this path is for.

@return [Pathname] The absolute path of the prepare artifacts script output file list.

@deprecated

@todo Remove in 2.0

# File lib/cocoapods/target/aggregate_target.rb, line 415
def prepare_artifacts_script_output_files_path(configuration)
  support_files_dir + "#{label}-artifacts-#{configuration}-output-files.xcfilelist"
end
prepare_artifacts_script_output_files_relative_path() click to toggle source

@return [String] The path of the prepare artifacts script output file list

relative to the root of the Pods project.

@deprecated

@todo Remove in 2.0

# File lib/cocoapods/target/aggregate_target.rb, line 527
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_path() click to toggle source

@return [String] The path of the prepare artifacts script relative to the

root of the Pods project.

@deprecated

@todo Remove in 2.0

# File lib/cocoapods/target/aggregate_target.rb, line 505
def prepare_artifacts_script_relative_path
  "${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_path)}"
end
relative_pods_root() click to toggle source

@return [String] The xcconfig path of the root from the `$(SRCROOT)`

variable of the user's project.
# File lib/cocoapods/target/aggregate_target.rb, line 434
def relative_pods_root
  "${SRCROOT}/#{relative_pods_root_path}"
end
relative_pods_root_path() click to toggle source

@return [Pathname] The relative path of the Pods directory from user project's directory.

# File lib/cocoapods/target/aggregate_target.rb, line 427
def relative_pods_root_path
  sandbox.root.relative_path_from(client_root)
end
requires_host_target?() click to toggle source

@return [Boolean] True if the user_target's pods are

for an extension and must be embedded in a host,
target, otherwise false.
# File lib/cocoapods/target/aggregate_target.rb, line 133
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_config() click to toggle source

@return [Hash{String => Array<String>}] Uniqued Resources grouped by config

# File lib/cocoapods/target/aggregate_target.rb, line 298
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

        if pod_target.build_as_static_framework?
          built_product_dir = Pathname.new(pod_target.build_product_path('${BUILT_PRODUCTS_DIR}'))
          resource_paths = resource_paths.map do |resource_path|
            extname = File.extname(resource_path)
            if self.class.resource_extension_compilable?(extname)
              output_extname = self.class.output_extension_for_resource(extname)
              output_path_components = Pathname(resource_path).each_filename.select { |component| File.extname(component) == '.lproj' }
              output_path_components << File.basename(resource_path)
              built_product_dir.join(*output_path_components).sub_ext(output_extname).to_s
            else
              resource_path
            end
          end
        end

        resource_paths << bridge_support_file
        resource_paths.compact.uniq
      end
    end
  end
end
spec_consumers() click to toggle source

@return [Array<Specification::Consumer>] The consumers of the Pod.

# File lib/cocoapods/target/aggregate_target.rb, line 212
def spec_consumers
  specs.map { |spec| spec.consumer(platform) }
end
specs() click to toggle source

@return [Array<Specification>] The specifications used by this aggregate target.

# File lib/cocoapods/target/aggregate_target.rb, line 194
def specs
  pod_targets.flat_map(&:specs)
end
specs_by_build_configuration() click to toggle source

@return [Hash{Symbol => Array<Specification>}] The pod targets for each

build configuration.
# File lib/cocoapods/target/aggregate_target.rb, line 201
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_path() click to toggle source

@return [Pathname] the path of the user project that this target will

integrate as identified by the analyzer.
# File lib/cocoapods/target/aggregate_target.rb, line 162
def user_project_path
  user_project.path if user_project
end
user_targets() click to toggle source

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

@return [Array<PBXNativeTarget>]

# File lib/cocoapods/target/aggregate_target.rb, line 170
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?() click to toggle source

@return [Boolean] Whether the target uses Swift code

# File lib/cocoapods/target/aggregate_target.rb, line 218
def uses_swift?
  pod_targets.any?(&:uses_swift?)
end
xcconfig_relative_path(config_name) click to toggle source

@param [String] config_name The build configuration name to get the xcconfig for @return [String] The path of the xcconfig file relative to the root of

the user project.
# File lib/cocoapods/target/aggregate_target.rb, line 452
def xcconfig_relative_path(config_name)
  xcconfig_path(config_name).relative_path_from(client_root).to_s
end
xcframeworks_by_config() click to toggle source

@return [Hash{String => Array<Xcode::XCFramework>}] The vendored dynamic artifacts and framework target

input and output paths grouped by config
# File lib/cocoapods/target/aggregate_target.rb, line 268
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

Private Instance Methods

create_build_settings() click to toggle source
# File lib/cocoapods/target/aggregate_target.rb, line 548
def create_build_settings
  settings = {}

  user_build_configurations.each do |configuration_name, configuration|
    settings[configuration_name] = BuildSettings::AggregateTargetSettings.new(self, configuration_name, :configuration => configuration)
  end

  settings
end
relative_to_pods_root(path) click to toggle source

Computes the relative path of a sandboxed file from the `$(PODS_ROOT)` variable of the Pods's project.

@param [Pathname] path

A relative path from the root of the sandbox.

@return [String] The computed path.

# File lib/cocoapods/target/aggregate_target.rb, line 544
def relative_to_pods_root(path)
  path.relative_path_from(sandbox.root).to_s
end