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>
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
#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_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_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<Hash{Symbol => [String]}>}
The vendored dynamic artifacts and framework target input and output paths grouped by config.
-
#initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition, client_root, user_project, user_target_uuids, pod_targets_for_build_configuration) ⇒ 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).
-
#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, #dummy_source_path, #framework_name, #info_plist_path, #inspect, #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) ⇒ AggregateTarget
Initialize a new instance
66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 66 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) super(sandbox, host_requires_frameworks, 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_root ⇒ Pathname (readonly)
Returns 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.
20 21 22 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 20 def client_root @client_root end |
#pod_targets ⇒ Array<PodTarget>
Returns The dependencies for this target.
46 47 48 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 46 def pod_targets @pod_targets end |
#search_paths_aggregate_targets ⇒ Array<AggregateTarget> (readonly)
Returns The aggregate targets whose pods this target must be able to import, but will not directly link against.
51 52 53 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 51 def search_paths_aggregate_targets @search_paths_aggregate_targets end |
#target_definition ⇒ TargetDefinition (readonly)
Returns the target definition of the Podfile that generated this target.
13 14 15 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 13 def target_definition @target_definition end |
#user_project ⇒ Xcodeproj::Project (readonly)
Returns the user project that this target will integrate as identified by the analyzer.
25 26 27 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 25 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.
33 34 35 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 33 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.
42 43 44 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 42 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.
244 245 246 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 244 def acknowledgements_basepath support_files_dir + "#{label}-acknowledgements" end |
#bridge_support_file ⇒ Pathname
Returns the path of the bridge support file relative to the sandbox or ‘nil` if bridge support is disabled.
231 232 233 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 231 def bridge_support_file bridge_support_path.relative_path_from(sandbox.root) if podfile.generate_bridge_support? end |
#build_settings(configuration_name = nil) ⇒ Object
81 82 83 84 85 86 87 88 89 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 81 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
Returns The output file path fo the check manifest lock script.
262 263 264 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 262 def check_manifest_lock_script_output_file_path "$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt" end |
#copy_resources_script_path ⇒ Pathname
Returns The absolute path of the copy resources script.
250 251 252 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 250 def copy_resources_script_path support_files_dir + "#{label}-resources.sh" end |
#copy_resources_script_relative_path ⇒ String
Returns The path of the copy resources script relative to the root of the Pods project.
300 301 302 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 300 def copy_resources_script_relative_path "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_path)}" end |
#embed_frameworks_script_path ⇒ Pathname
Returns The absolute path of the embed frameworks script.
256 257 258 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 256 def support_files_dir + "#{label}-frameworks.sh" end |
#embed_frameworks_script_relative_path ⇒ String
Returns The path of the embed frameworks relative to the root of the Pods project.
307 308 309 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 307 def "${PODS_ROOT}/#{relative_to_pods_root()}" end |
#framework_paths_by_config ⇒ Hash{String => Array<Hash{Symbol => [String]}>}
Returns The vendored dynamic artifacts and framework target input and output paths grouped by config.
197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 197 def framework_paths_by_config @framework_paths_by_config ||= begin framework_paths_by_config = {} user_build_configurations.keys.each do |config| relevant_pod_targets = pod_targets_for_build_configuration(config) framework_paths_by_config[config] = relevant_pod_targets.flat_map do |pod_target| non_test_specs = pod_target.non_test_specs.map(&:name) pod_target.framework_paths.values_at(*non_test_specs).flatten.compact.uniq end end framework_paths_by_config end end |
#label ⇒ String
Returns the label for the target.
121 122 123 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 121 def label target_definition.label.to_s end |
#library? ⇒ Boolean
Returns True if the user_target refers to a library (framework, static or dynamic lib).
94 95 96 97 98 99 100 101 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 94 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 raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}." unless symbol_types.count == 1 [:framework, :dynamic_library, :static_library].include? symbol_types.first end |
#pod_targets_for_build_configuration(build_configuration) ⇒ Array<PodTarget>
Returns the pod targets for the given build configuration.
160 161 162 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 160 def pod_targets_for_build_configuration(build_configuration) @pod_targets_for_build_configuration[build_configuration] || [] end |
#podfile ⇒ Podfile
Returns The podfile which declares the dependency.
127 128 129 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 127 def podfile target_definition.podfile end |
#podfile_dir_relative_path ⇒ String
Returns The path of the Podfile directory relative to the root of the user project.
282 283 284 285 286 287 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 282 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
Returns The xcconfig path of the root from the ‘$(SRCROOT)` variable of the user’s project.
275 276 277 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 275 def relative_pods_root "${SRCROOT}/#{relative_pods_root_path}" end |
#relative_pods_root_path ⇒ Pathname
Returns The relative path of the Pods directory from user project’s directory.
268 269 270 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 268 def relative_pods_root_path sandbox.root.relative_path_from(client_root) end |
#requires_host_target? ⇒ Boolean
Returns True if the user_target’s pods are for an extension and must be embedded in a host, target, otherwise false.
107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 107 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 raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}." unless symbol_types.count == 1 EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES.include?(symbol_types[0]) end |
#resource_paths_by_config ⇒ Hash{String => Array<String>}
Returns Uniqued Resources grouped by config.
213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 213 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.requires_frameworks? && !pod_target.static_framework? end user_build_configurations.keys.each_with_object({}) do |config, resources_by_config| resources_by_config[config] = (relevant_pod_targets & pod_targets_for_build_configuration(config)).flat_map do |pod_target| non_test_specs = pod_target.non_test_specs.map(&:name) resource_paths = pod_target.resource_paths.values_at(*non_test_specs).flatten.compact (resource_paths + [bridge_support_file].compact).uniq end end end end |
#spec_consumers ⇒ Array<Specification::Consumer>
Returns The consumers of the Pod.
184 185 186 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 184 def spec_consumers specs.map { |spec| spec.consumer(platform) } end |
#specs ⇒ Array<Specification>
Returns The specifications used by this aggregate target.
166 167 168 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 166 def specs pod_targets.flat_map(&:specs) end |
#specs_by_build_configuration ⇒ Hash{Symbol => Array<Specification>}
Returns The pod targets for each build configuration.
173 174 175 176 177 178 179 180 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 173 def specs_by_build_configuration result = {} user_build_configurations.keys.each do |build_configuration| result[build_configuration] = pod_targets_for_build_configuration(build_configuration). flat_map(&:specs) end result end |
#user_project_path ⇒ Pathname
Returns the path of the user project that this target will integrate as identified by the analyzer.
134 135 136 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 134 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.
142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 142 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
Returns Whether the target uses Swift code.
190 191 192 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 190 def uses_swift? pod_targets.any?(&:uses_swift?) end |
#xcconfig_relative_path(config_name) ⇒ String
Returns The path of the xcconfig file relative to the root of the user project.
293 294 295 |
# File 'lib/cocoapods/target/aggregate_target.rb', line 293 def xcconfig_relative_path(config_name) xcconfig_path(config_name).relative_path_from(client_root).to_s end |