Class: Pod::AggregateTarget
- 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
-
#client_root ⇒ Pathname
readonly
The folder where the client is stored used for computing the relative paths.
-
#pod_targets ⇒ Array<PodTarget>
readonly
The dependencies for this target.
-
#search_paths_aggregate_targets ⇒ Array<AggregateTarget>
readonly
The aggregate targets whose pods this target must be able to import, but will not directly link against.
-
#target_definition ⇒ TargetDefinition
readonly
The target definition of the Podfile that generated this target.
-
#user_project ⇒ Xcodeproj::Project
readonly
The user project that this target will integrate as identified by the analyzer.
-
#user_target_uuids ⇒ Array<String>
readonly
The list of the UUIDs of the user targets that will be integrated by this target as identified by the analyzer.
-
#xcconfigs ⇒ Hash<String, Xcodeproj::Config>
readonly
Map from configuration name to configuration file for the target.
Attributes inherited from Target
#application_extension_api_only, #archs, #host_requires_frameworks, #platform, #sandbox, #user_build_configurations
Support files collapse
-
#acknowledgements_basepath ⇒ Pathname
The absolute path of acknowledgements file.
-
#check_manifest_lock_script_output_file_path ⇒ String
The output file path fo the check manifest lock script.
-
#copy_resources_script_input_files_path(configuration) ⇒ Pathname
The absolute path of the copy resources script input file list.
-
#copy_resources_script_input_files_relative_path ⇒ String
The path of the copy resources script input file list relative to the root of the Pods project.
-
#copy_resources_script_output_files_path(configuration) ⇒ Pathname
The absolute path of the copy resources script output file list.
-
#copy_resources_script_output_files_relative_path ⇒ String
The path of the copy resources script output file list relative to the root of the Pods project.
-
#copy_resources_script_path ⇒ Pathname
The absolute path of the copy resources script.
-
#copy_resources_script_relative_path ⇒ String
The path of the copy resources script relative to the root of the Pods project.
-
#embed_frameworks_script_input_files_path(configuration) ⇒ Pathname
The absolute path of the embed frameworks script input file list.
-
#embed_frameworks_script_input_files_relative_path ⇒ String
The path of the embed frameworks script input file list relative to the root of the Pods project.
-
#embed_frameworks_script_output_files_path(configuration) ⇒ Pathname
The absolute path of the embed frameworks script output file list.
-
#embed_frameworks_script_output_files_relative_path ⇒ String
The path of the embed frameworks script output file list relative to the root of the Pods project.
-
#embed_frameworks_script_path ⇒ Pathname
The absolute path of the embed frameworks script.
-
#embed_frameworks_script_relative_path ⇒ String
The path of the embed frameworks relative to the root of the Pods project.
-
#podfile_dir_relative_path ⇒ String
The path of the Podfile directory relative to the root of the user project.
-
#relative_pods_root ⇒ String
The xcconfig path of the root from the `$(SRCROOT)` variable of the user's project.
-
#relative_pods_root_path ⇒ Pathname
The relative path of the Pods directory from user project's directory.
-
#xcconfig_relative_path(config_name) ⇒ String
The path of the xcconfig file relative to the root of the user project.
Instance Method Summary collapse
-
#bridge_support_file ⇒ Pathname
The path of the bridge support file relative to the sandbox or `nil` if bridge support is disabled.
- #build_settings(configuration_name = nil) ⇒ Object
-
#framework_paths_by_config ⇒ Hash{String => Array<FrameworkPaths>}
The vendored dynamic artifacts and framework target input and output paths grouped by config.
-
#includes_frameworks? ⇒ Boolean
Whether the target contains framework to be embedded into the user target.
-
#includes_resources? ⇒ Boolean
Whether the target contains any resources.
-
#initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration, build_type: Target::BuildType.infer_from_spec(nil, :host_requires_frameworks => host_requires_frameworks)) ⇒ AggregateTarget
constructor
Initialize a new instance.
-
#label ⇒ String
The label for the target.
-
#library? ⇒ Boolean
True if the user_target refers to a library (framework, static or dynamic lib).
-
#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.
-
#pod_targets_for_build_configuration(build_configuration) ⇒ Array<PodTarget>
The pod targets for the given build configuration.
-
#podfile ⇒ Podfile
The podfile which declares the dependency.
-
#requires_host_target? ⇒ Boolean
True if the user_target's pods are for an extension and must be embedded in a host, target, otherwise false.
-
#resource_paths_by_config ⇒ Hash{String => Array<String>}
Uniqued Resources grouped by config.
-
#spec_consumers ⇒ Array<Specification::Consumer>
The consumers of the Pod.
-
#specs ⇒ Array<Specification>
The specifications used by this aggregate target.
-
#specs_by_build_configuration ⇒ Hash{Symbol => Array<Specification>}
The pod targets for each build configuration.
-
#user_project_path ⇒ Pathname
The path of the user project that this target will integrate as identified by the analyzer.
-
#user_targets ⇒ Array<PBXNativeTarget>
List all user targets that will be integrated by this #target.
-
#uses_swift? ⇒ Boolean
Whether the target uses Swift code.
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, #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, host_requires_frameworks, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration, build_type: Target::BuildType.infer_from_spec(nil, :host_requires_frameworks => host_requires_frameworks)) ⇒ AggregateTarget
Initialize a new instance
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 70 def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration, build_type: Target::BuildType.infer_from_spec(nil, :host_requires_frameworks => host_requires_frameworks)) super(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, :build_type => build_type) 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_root ⇒ Pathname (readonly)
23 24 25 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 23 def client_root @client_root end |
#pod_targets ⇒ Array<PodTarget> (readonly)
49 50 51 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 49 def pod_targets @pod_targets end |
#search_paths_aggregate_targets ⇒ Array<AggregateTarget> (readonly)
54 55 56 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 54 def search_paths_aggregate_targets @search_paths_aggregate_targets end |
#target_definition ⇒ TargetDefinition (readonly)
16 17 18 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 16 def target_definition @target_definition end |
#user_project ⇒ Xcodeproj::Project (readonly)
28 29 30 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 28 def user_project @user_project end |
#user_target_uuids ⇒ Array<String> (readonly)
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.
36 37 38 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 36 def user_target_uuids @user_target_uuids end |
#xcconfigs ⇒ Hash<String, Xcodeproj::Config> (readonly)
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
45 46 47 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 45 def xcconfigs @xcconfigs end |
Instance Method Details
#acknowledgements_basepath ⇒ Pathname
The acknowledgements generators add the extension according to the file type.
Returns The absolute path of acknowledgements file.
287 288 289 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 287 def acknowledgements_basepath support_files_dir + "#{label}-acknowledgements" end |
#bridge_support_file ⇒ Pathname
274 275 276 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 274 def bridge_support_file bridge_support_path.relative_path_from(sandbox.root) if podfile.generate_bridge_support? end |
#build_settings(configuration_name = nil) ⇒ Object
105 106 107 108 109 110 111 112 113 |
# 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 ⇒ String
337 338 339 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 337 def check_manifest_lock_script_output_file_path "$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt" end |
#copy_resources_script_input_files_path(configuration) ⇒ Pathname
301 302 303 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 301 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 ⇒ String
382 383 384 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 382 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
309 310 311 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 309 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 ⇒ String
389 390 391 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 389 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 ⇒ Pathname
293 294 295 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 293 def copy_resources_script_path support_files_dir + "#{label}-resources.sh" end |
#copy_resources_script_relative_path ⇒ String
375 376 377 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 375 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
323 324 325 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 323 def (configuration) support_files_dir + "#{label}-frameworks-#{configuration}-input-files.xcfilelist" end |
#embed_frameworks_script_input_files_relative_path ⇒ String
403 404 405 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 403 def "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_input_files_path('${CONFIGURATION}'))}" end |
#embed_frameworks_script_output_files_path(configuration) ⇒ Pathname
331 332 333 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 331 def (configuration) support_files_dir + "#{label}-frameworks-#{configuration}-output-files.xcfilelist" end |
#embed_frameworks_script_output_files_relative_path ⇒ String
410 411 412 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 410 def "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_output_files_path('${CONFIGURATION}'))}" end |
#embed_frameworks_script_path ⇒ Pathname
315 316 317 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 315 def support_files_dir + "#{label}-frameworks.sh" end |
#embed_frameworks_script_relative_path ⇒ String
396 397 398 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 396 def "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_path)}" end |
#framework_paths_by_config ⇒ Hash{String => Array<FrameworkPaths>}
238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 238 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
231 232 233 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 231 def includes_frameworks? !framework_paths_by_config.each_value.all?(&:empty?) end |
#includes_resources? ⇒ Boolean
224 225 226 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 224 def includes_resources? !resource_paths_by_config.each_value.all?(&:empty?) end |
#label ⇒ String
149 150 151 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 149 def label target_definition.label.to_s end |
#library? ⇒ Boolean
118 119 120 121 122 123 124 125 126 127 |
# 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) ⇒ AggregateTarget
Merges this aggregate target with additional pod targets that are part of embedded aggregate targets.
94 95 96 97 98 99 100 101 102 103 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 94 def () merged = @pod_targets_for_build_configuration.merge() do |_, before, after| (before + after).uniq end AggregateTarget.new(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, merged, :build_type => build_type).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>
188 189 190 |
# 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 ⇒ Podfile
155 156 157 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 155 def podfile target_definition.podfile end |
#podfile_dir_relative_path ⇒ String
357 358 359 360 361 362 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 357 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 |
#relative_pods_root ⇒ String
350 351 352 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 350 def relative_pods_root "${SRCROOT}/#{relative_pods_root_path}" end |
#relative_pods_root_path ⇒ Pathname
343 344 345 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 343 def relative_pods_root_path sandbox.root.relative_path_from(client_root) end |
#requires_host_target? ⇒ Boolean
133 134 135 136 137 138 139 140 141 142 143 144 145 |
# 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 ⇒ Hash{String => Array<String>}
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 254 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_consumers ⇒ Array<Specification::Consumer>
212 213 214 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 212 def spec_consumers specs.map { |spec| spec.consumer(platform) } end |
#specs ⇒ Array<Specification>
194 195 196 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 194 def specs pod_targets.flat_map(&:specs) end |
#specs_by_build_configuration ⇒ Hash{Symbol => Array<Specification>}
201 202 203 204 205 206 207 208 |
# 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 ⇒ Pathname
162 163 164 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 162 def user_project_path user_project.path if user_project end |
#user_targets ⇒ Array<PBXNativeTarget>
List all user targets that will be integrated by this #target.
170 171 172 173 174 175 176 177 178 179 180 |
# 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? ⇒ Boolean
218 219 220 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 218 def uses_swift? pod_targets.any?(&:uses_swift?) end |
#xcconfig_relative_path(config_name) ⇒ String
368 369 370 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 368 def xcconfig_relative_path(config_name) xcconfig_path(config_name).relative_path_from(client_root).to_s end |