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

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

Instance Attribute Summary collapse

Attributes inherited from Target

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

Support files collapse

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(target_definition, sandbox) ⇒ AggregateTarget

Initialize a new instance



19
20
21
22
23
24
25
26
27
28
# File 'lib/cocoapods/target/aggregate_target.rb', line 19

def initialize(target_definition, sandbox)
  raise "Can't initialize an AggregateTarget with an abstract TargetDefinition" if target_definition.abstract?
  super()
  @target_definition = target_definition
  @sandbox = sandbox
  @pod_targets = []
  @search_paths_aggregate_targets = []
  @file_accessors = []
  @xcconfigs = {}
end

Instance Attribute Details

#client_rootPathname



89
90
91
# File 'lib/cocoapods/target/aggregate_target.rb', line 89

def client_root
  @client_root
end

#pod_targetsArray<PodTarget>



138
139
140
# File 'lib/cocoapods/target/aggregate_target.rb', line 138

def pod_targets
  @pod_targets
end

#search_paths_aggregate_targetsArray<AggregateTarget>



143
144
145
# File 'lib/cocoapods/target/aggregate_target.rb', line 143

def search_paths_aggregate_targets
  @search_paths_aggregate_targets
end

#target_definitionTargetDefinition (readonly)



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

def target_definition
  @target_definition
end

#user_projectXcodeproj::Project



94
95
96
# File 'lib/cocoapods/target/aggregate_target.rb', line 94

def user_project
  @user_project
end

#user_target_uuidsArray<String>

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.



109
110
111
# File 'lib/cocoapods/target/aggregate_target.rb', line 109

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



134
135
136
# File 'lib/cocoapods/target/aggregate_target.rb', line 134

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.



235
236
237
# File 'lib/cocoapods/target/aggregate_target.rb', line 235

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

#bridge_support_filePathname



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

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

#check_manifest_lock_script_output_file_pathString



253
254
255
# File 'lib/cocoapods/target/aggregate_target.rb', line 253

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

#copy_resources_script_pathPathname



241
242
243
# File 'lib/cocoapods/target/aggregate_target.rb', line 241

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

#copy_resources_script_relative_pathString



285
286
287
# File 'lib/cocoapods/target/aggregate_target.rb', line 285

def copy_resources_script_relative_path
  "${SRCROOT}/#{relative_to_srcroot(copy_resources_script_path)}"
end

#embed_frameworks_script_pathPathname



247
248
249
# File 'lib/cocoapods/target/aggregate_target.rb', line 247

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

#embed_frameworks_script_relative_pathString



292
293
294
# File 'lib/cocoapods/target/aggregate_target.rb', line 292

def embed_frameworks_script_relative_path
  "${SRCROOT}/#{relative_to_srcroot(embed_frameworks_script_path)}"
end

#framework_paths_by_configHash{String => Array<Hash{Symbol => [String]}>}



190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/cocoapods/target/aggregate_target.rb', line 190

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.select do |pod_target|
        pod_target.include_in_build_config?(target_definition, config)
      end
      framework_paths_by_config[config] = relevant_pod_targets.flat_map(&:framework_paths)
    end
    framework_paths_by_config
  end
end

#labelString



60
61
62
# File 'lib/cocoapods/target/aggregate_target.rb', line 60

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).

Raises:

  • (ArgumentError)


33
34
35
36
37
38
39
40
# File 'lib/cocoapods/target/aggregate_target.rb', line 33

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

#platformPlatform



74
75
76
# File 'lib/cocoapods/target/aggregate_target.rb', line 74

def platform
  @platform ||= target_definition.platform
end

#pod_targets_for_build_configuration(build_configuration) ⇒ Array<PodTarget>



151
152
153
154
155
# File 'lib/cocoapods/target/aggregate_target.rb', line 151

def pod_targets_for_build_configuration(build_configuration)
  pod_targets.select do |pod_target|
    pod_target.include_in_build_config?(target_definition, build_configuration)
  end
end

#podfilePodfile



80
81
82
# File 'lib/cocoapods/target/aggregate_target.rb', line 80

def podfile
  target_definition.podfile
end

#podfile_dir_relative_pathString



267
268
269
270
271
272
# File 'lib/cocoapods/target/aggregate_target.rb', line 267

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

#product_module_nameString



68
69
70
# File 'lib/cocoapods/target/aggregate_target.rb', line 68

def product_module_name
  c99ext_identifier(label)
end

#relative_pods_rootString



260
261
262
# File 'lib/cocoapods/target/aggregate_target.rb', line 260

def relative_pods_root
  "${SRCROOT}/#{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.

Raises:

  • (ArgumentError)


46
47
48
49
50
51
52
53
54
55
56
# File 'lib/cocoapods/target/aggregate_target.rb', line 46

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_configHash{String => Array<String>}



205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/cocoapods/target/aggregate_target.rb', line 205

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?
    end
    user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
      resources_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
        next [] unless pod_target.include_in_build_config?(target_definition, config)
        (pod_target.resource_paths + [bridge_support_file].compact).uniq
      end
    end
  end
end

#spec_consumersArray<Specification::Consumer>



177
178
179
# File 'lib/cocoapods/target/aggregate_target.rb', line 177

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

#specsArray<Specification>



159
160
161
# File 'lib/cocoapods/target/aggregate_target.rb', line 159

def specs
  pod_targets.map(&:specs).flatten
end

#specs_by_build_configurationHash{Symbol => Array<Specification>}



166
167
168
169
170
171
172
173
# File 'lib/cocoapods/target/aggregate_target.rb', line 166

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_pathPathname



99
100
101
# File 'lib/cocoapods/target/aggregate_target.rb', line 99

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.



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

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



183
184
185
# File 'lib/cocoapods/target/aggregate_target.rb', line 183

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

#xcconfig_relative_path(config_name) ⇒ String



278
279
280
# File 'lib/cocoapods/target/aggregate_target.rb', line 278

def xcconfig_relative_path(config_name)
  relative_to_srcroot(xcconfig_path(config_name)).to_s
end