xcocoapods 1.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +6303 -0
- data/LICENSE +28 -0
- data/README.md +80 -0
- data/bin/pod +56 -0
- data/bin/sandbox-pod +168 -0
- data/lib/cocoapods.rb +73 -0
- data/lib/cocoapods/command.rb +175 -0
- data/lib/cocoapods/command/cache.rb +28 -0
- data/lib/cocoapods/command/cache/clean.rb +90 -0
- data/lib/cocoapods/command/cache/list.rb +69 -0
- data/lib/cocoapods/command/env.rb +66 -0
- data/lib/cocoapods/command/init.rb +128 -0
- data/lib/cocoapods/command/install.rb +45 -0
- data/lib/cocoapods/command/ipc.rb +19 -0
- data/lib/cocoapods/command/ipc/list.rb +40 -0
- data/lib/cocoapods/command/ipc/podfile.rb +31 -0
- data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
- data/lib/cocoapods/command/ipc/repl.rb +51 -0
- data/lib/cocoapods/command/ipc/spec.rb +29 -0
- data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
- data/lib/cocoapods/command/lib.rb +11 -0
- data/lib/cocoapods/command/lib/create.rb +105 -0
- data/lib/cocoapods/command/lib/lint.rb +121 -0
- data/lib/cocoapods/command/list.rb +39 -0
- data/lib/cocoapods/command/options/project_directory.rb +36 -0
- data/lib/cocoapods/command/options/repo_update.rb +34 -0
- data/lib/cocoapods/command/outdated.rb +140 -0
- data/lib/cocoapods/command/repo.rb +29 -0
- data/lib/cocoapods/command/repo/add.rb +103 -0
- data/lib/cocoapods/command/repo/lint.rb +82 -0
- data/lib/cocoapods/command/repo/list.rb +93 -0
- data/lib/cocoapods/command/repo/push.rb +281 -0
- data/lib/cocoapods/command/repo/remove.rb +36 -0
- data/lib/cocoapods/command/repo/update.rb +28 -0
- data/lib/cocoapods/command/setup.rb +103 -0
- data/lib/cocoapods/command/spec.rb +112 -0
- data/lib/cocoapods/command/spec/cat.rb +51 -0
- data/lib/cocoapods/command/spec/create.rb +283 -0
- data/lib/cocoapods/command/spec/edit.rb +87 -0
- data/lib/cocoapods/command/spec/env_spec.rb +53 -0
- data/lib/cocoapods/command/spec/lint.rb +137 -0
- data/lib/cocoapods/command/spec/which.rb +43 -0
- data/lib/cocoapods/command/update.rb +101 -0
- data/lib/cocoapods/config.rb +347 -0
- data/lib/cocoapods/core_overrides.rb +1 -0
- data/lib/cocoapods/downloader.rb +190 -0
- data/lib/cocoapods/downloader/cache.rb +233 -0
- data/lib/cocoapods/downloader/request.rb +86 -0
- data/lib/cocoapods/downloader/response.rb +16 -0
- data/lib/cocoapods/executable.rb +222 -0
- data/lib/cocoapods/external_sources.rb +57 -0
- data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
- data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
- data/lib/cocoapods/external_sources/path_source.rb +55 -0
- data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
- data/lib/cocoapods/gem_version.rb +5 -0
- data/lib/cocoapods/generator/acknowledgements.rb +107 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
- data/lib/cocoapods/generator/app_target_helper.rb +244 -0
- data/lib/cocoapods/generator/bridge_support.rb +22 -0
- data/lib/cocoapods/generator/constant.rb +19 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
- data/lib/cocoapods/generator/dummy_source.rb +31 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
- data/lib/cocoapods/generator/header.rb +103 -0
- data/lib/cocoapods/generator/info_plist_file.rb +116 -0
- data/lib/cocoapods/generator/module_map.rb +99 -0
- data/lib/cocoapods/generator/prefix_header.rb +60 -0
- data/lib/cocoapods/generator/umbrella_header.rb +46 -0
- data/lib/cocoapods/hooks_manager.rb +132 -0
- data/lib/cocoapods/installer.rb +703 -0
- data/lib/cocoapods/installer/analyzer.rb +972 -0
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
- data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
- data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
- data/lib/cocoapods/installer/installation_options.rb +158 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
- data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
- data/lib/cocoapods/installer/podfile_validator.rb +139 -0
- data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
- data/lib/cocoapods/installer/xcode.rb +8 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
- data/lib/cocoapods/open-uri.rb +33 -0
- data/lib/cocoapods/project.rb +414 -0
- data/lib/cocoapods/resolver.rb +585 -0
- data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
- data/lib/cocoapods/sandbox.rb +404 -0
- data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
- data/lib/cocoapods/sandbox/headers_store.rb +146 -0
- data/lib/cocoapods/sandbox/path_list.rb +220 -0
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
- data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
- data/lib/cocoapods/sources_manager.rb +157 -0
- data/lib/cocoapods/target.rb +261 -0
- data/lib/cocoapods/target/aggregate_target.rb +338 -0
- data/lib/cocoapods/target/build_settings.rb +1075 -0
- data/lib/cocoapods/target/pod_target.rb +559 -0
- data/lib/cocoapods/user_interface.rb +459 -0
- data/lib/cocoapods/user_interface/error_report.rb +187 -0
- data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
- data/lib/cocoapods/validator.rb +981 -0
- metadata +533 -0
@@ -0,0 +1,559 @@
|
|
1
|
+
module Pod
|
2
|
+
# Stores the information relative to the target used to compile a single Pod.
|
3
|
+
# A pod can have one or more activated spec, subspecs and test specs.
|
4
|
+
#
|
5
|
+
class PodTarget < Target
|
6
|
+
# @return [Array<Specification>] the spec, subspecs and test specs of the target.
|
7
|
+
#
|
8
|
+
attr_reader :specs
|
9
|
+
|
10
|
+
# @return [Array<Specification>] All of the test specs within this target.
|
11
|
+
# Subset of #specs.
|
12
|
+
#
|
13
|
+
attr_reader :test_specs
|
14
|
+
|
15
|
+
# @return [Array<Specification>] All of the specs within this target that are not test specs.
|
16
|
+
# Subset of #specs.
|
17
|
+
#
|
18
|
+
attr_reader :non_test_specs
|
19
|
+
|
20
|
+
# @return [Array<TargetDefinition>] the target definitions of the Podfile
|
21
|
+
# that generated this target.
|
22
|
+
#
|
23
|
+
attr_reader :target_definitions
|
24
|
+
|
25
|
+
# @return [Array<Sandbox::FileAccessor>] the file accessors for the
|
26
|
+
# specifications of this target.
|
27
|
+
#
|
28
|
+
attr_reader :file_accessors
|
29
|
+
|
30
|
+
# @return [String] the suffix used for this target when deduplicated. May be `nil`.
|
31
|
+
#
|
32
|
+
# @note This affects the value returned by #configuration_build_dir
|
33
|
+
# and accessors relying on this as #build_product_path.
|
34
|
+
#
|
35
|
+
attr_reader :scope_suffix
|
36
|
+
|
37
|
+
# @return [HeadersStore] the header directory for the target.
|
38
|
+
#
|
39
|
+
attr_reader :build_headers
|
40
|
+
|
41
|
+
# @return [Array<PodTarget>] the targets that this target has a dependency
|
42
|
+
# upon.
|
43
|
+
#
|
44
|
+
attr_accessor :dependent_targets
|
45
|
+
|
46
|
+
# @return [Hash{String=>Array<PodTarget>}] all target dependencies by test spec name.
|
47
|
+
#
|
48
|
+
attr_accessor :test_dependent_targets_by_spec_name
|
49
|
+
|
50
|
+
# Initialize a new instance
|
51
|
+
#
|
52
|
+
# @param [Sandbox] sandbox @see Target#sandbox
|
53
|
+
# @param [Boolean] host_requires_frameworks @see Target#host_requires_frameworks
|
54
|
+
# @param [Hash{String=>Symbol}] user_build_configurations @see Target#user_build_configurations
|
55
|
+
# @param [Array<String>] archs @see Target#archs
|
56
|
+
# @param [Platform] platform @see Target#platform
|
57
|
+
# @param [Array<TargetDefinition>] target_definitions @see #target_definitions
|
58
|
+
# @param [Array<Sandbox::FileAccessor>] file_accessors @see #file_accessors
|
59
|
+
# @param [String] scope_suffix @see #scope_suffix
|
60
|
+
#
|
61
|
+
def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, specs,
|
62
|
+
target_definitions, file_accessors = [], scope_suffix = nil)
|
63
|
+
super(sandbox, host_requires_frameworks, user_build_configurations, archs, platform)
|
64
|
+
raise "Can't initialize a PodTarget without specs!" if specs.nil? || specs.empty?
|
65
|
+
raise "Can't initialize a PodTarget without TargetDefinition!" if target_definitions.nil? || target_definitions.empty?
|
66
|
+
raise "Can't initialize a PodTarget with only abstract TargetDefinitions!" if target_definitions.all?(&:abstract?)
|
67
|
+
raise "Can't initialize a PodTarget with an empty string scope suffix!" if scope_suffix == ''
|
68
|
+
@specs = specs.dup.freeze
|
69
|
+
@target_definitions = target_definitions
|
70
|
+
@file_accessors = file_accessors
|
71
|
+
@scope_suffix = scope_suffix
|
72
|
+
@test_specs, @non_test_specs = @specs.partition(&:test_specification?)
|
73
|
+
@build_headers = Sandbox::HeadersStore.new(sandbox, 'Private', :private)
|
74
|
+
@dependent_targets = []
|
75
|
+
@test_dependent_targets_by_spec_name = {}
|
76
|
+
@build_config_cache = {}
|
77
|
+
end
|
78
|
+
|
79
|
+
# Scopes the current target based on the existing pod targets within the cache.
|
80
|
+
#
|
81
|
+
# @param [Hash{Array => PodTarget}] cache
|
82
|
+
# the cached target for a previously scoped target.
|
83
|
+
#
|
84
|
+
# @return [Array<PodTarget>] a scoped copy for each target definition.
|
85
|
+
#
|
86
|
+
def scoped(cache = {})
|
87
|
+
target_definitions.map do |target_definition|
|
88
|
+
cache_key = [specs, target_definition]
|
89
|
+
if cache[cache_key]
|
90
|
+
cache[cache_key]
|
91
|
+
else
|
92
|
+
target = PodTarget.new(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, specs, [target_definition], file_accessors, target_definition.label)
|
93
|
+
target.dependent_targets = dependent_targets.flat_map { |pt| pt.scoped(cache) }.select { |pt| pt.target_definitions == [target_definition] }
|
94
|
+
target.test_dependent_targets_by_spec_name = Hash[test_dependent_targets_by_spec_name.map do |spec_name, test_pod_targets|
|
95
|
+
scoped_test_pod_targets = test_pod_targets.flat_map do |test_pod_target|
|
96
|
+
test_pod_target.scoped(cache).select { |pt| pt.target_definitions == [target_definition] }
|
97
|
+
end
|
98
|
+
[spec_name, scoped_test_pod_targets]
|
99
|
+
end]
|
100
|
+
cache[cache_key] = target
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [String] the label for the target.
|
106
|
+
#
|
107
|
+
def label
|
108
|
+
if scope_suffix.nil? || scope_suffix[0] == '.'
|
109
|
+
"#{root_spec.name}#{scope_suffix}"
|
110
|
+
else
|
111
|
+
"#{root_spec.name}-#{scope_suffix}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# @return [String] the Swift version for the target. If the pod author has provided a swift version
|
116
|
+
# then that is the one returned, otherwise the Swift version is determined by the user
|
117
|
+
# targets that include this pod target.
|
118
|
+
#
|
119
|
+
def swift_version
|
120
|
+
spec_swift_version || target_definitions.map(&:swift_version).compact.uniq.first
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [String] the Swift version within the root spec. Might be `nil` if none is set.
|
124
|
+
#
|
125
|
+
def spec_swift_version
|
126
|
+
root_spec.swift_version
|
127
|
+
end
|
128
|
+
|
129
|
+
# @return [Podfile] The podfile which declares the dependency.
|
130
|
+
#
|
131
|
+
def podfile
|
132
|
+
target_definitions.first.podfile
|
133
|
+
end
|
134
|
+
|
135
|
+
# @return [String] The name to use for the source code module constructed
|
136
|
+
# for this target, and which will be used to import the module in
|
137
|
+
# implementation source files.
|
138
|
+
#
|
139
|
+
def product_module_name
|
140
|
+
root_spec.module_name
|
141
|
+
end
|
142
|
+
|
143
|
+
# @return [Bool] Whether or not this target should be built.
|
144
|
+
#
|
145
|
+
# A target should not be built if it has no source files.
|
146
|
+
#
|
147
|
+
def should_build?
|
148
|
+
return @should_build if defined? @should_build
|
149
|
+
accessors = file_accessors.reject { |fa| fa.spec.test_specification? }
|
150
|
+
source_files = accessors.flat_map(&:source_files)
|
151
|
+
source_files -= accessors.flat_map(&:headers)
|
152
|
+
@should_build = !source_files.empty?
|
153
|
+
end
|
154
|
+
|
155
|
+
# @return [Array<Specification::Consumer>] the specification consumers for
|
156
|
+
# the target.
|
157
|
+
#
|
158
|
+
def spec_consumers
|
159
|
+
specs.map { |spec| spec.consumer(platform) }
|
160
|
+
end
|
161
|
+
|
162
|
+
# @return [Array<Specification::Consumer>] the test specification consumers for
|
163
|
+
# the target.
|
164
|
+
#
|
165
|
+
def test_spec_consumers
|
166
|
+
test_specs.map { |test_spec| test_spec.consumer(platform) }
|
167
|
+
end
|
168
|
+
|
169
|
+
# @return [Boolean] Whether the target uses Swift code.
|
170
|
+
#
|
171
|
+
def uses_swift?
|
172
|
+
return @uses_swift if defined? @uses_swift
|
173
|
+
@uses_swift = begin
|
174
|
+
file_accessors.reject { |a| a.spec.test_specification? }.any? do |file_accessor|
|
175
|
+
file_accessor.source_files.any? { |sf| sf.extname == '.swift' }
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Checks whether a particular test type uses Swift or not.
|
181
|
+
#
|
182
|
+
# @param [Symbol] test_type
|
183
|
+
# The test type to check whether it uses Swift or not.
|
184
|
+
#
|
185
|
+
# @return [Boolean] Whether the target uses Swift code in the specified test type.
|
186
|
+
#
|
187
|
+
def uses_swift_for_test_type?(test_type)
|
188
|
+
@uses_swift_for_test_type ||= {}
|
189
|
+
return @uses_swift_for_test_type[test_type] if @uses_swift_for_test_type.key?(test_type)
|
190
|
+
@uses_swift_for_test_type[test_type] = begin
|
191
|
+
file_accessors.select { |a| a.spec.test_specification? && a.spec.test_type == test_type }.any? do |file_accessor|
|
192
|
+
file_accessor.source_files.any? { |sf| sf.extname == '.swift' }
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# @return [Boolean] Whether the target should build a static framework.
|
198
|
+
#
|
199
|
+
def static_framework?
|
200
|
+
requires_frameworks? && root_spec.static_framework
|
201
|
+
end
|
202
|
+
|
203
|
+
# @return [Boolean] Whether the target defines a "module"
|
204
|
+
# (and thus will need a module map and umbrella header).
|
205
|
+
#
|
206
|
+
# @note Static library targets can temporarily opt in to this behavior by setting
|
207
|
+
# `DEFINES_MODULE = YES` in their specification's `pod_target_xcconfig`.
|
208
|
+
#
|
209
|
+
def defines_module?
|
210
|
+
return @defines_module if defined?(@defines_module)
|
211
|
+
return @defines_module = true if uses_swift? || requires_frameworks?
|
212
|
+
return @defines_module = true if target_definitions.all? { |td| td.build_pod_as_module?(pod_name) }
|
213
|
+
|
214
|
+
@defines_module = non_test_specs.any? { |s| s.consumer(platform).pod_target_xcconfig['DEFINES_MODULE'] == 'YES' }
|
215
|
+
end
|
216
|
+
|
217
|
+
# @return [Array<Hash{Symbol=>String}>] An array of hashes where each hash represents a single script phase.
|
218
|
+
#
|
219
|
+
def script_phases
|
220
|
+
spec_consumers.flat_map(&:script_phases)
|
221
|
+
end
|
222
|
+
|
223
|
+
# @return [Boolean] Whether the target contains any script phases.
|
224
|
+
#
|
225
|
+
def contains_script_phases?
|
226
|
+
!script_phases.empty?
|
227
|
+
end
|
228
|
+
|
229
|
+
# @return [Boolean] Whether the target has any tests specifications.
|
230
|
+
#
|
231
|
+
def contains_test_specifications?
|
232
|
+
!test_specs.empty?
|
233
|
+
end
|
234
|
+
|
235
|
+
# @return [Array<Symbol>] All of the test supported types within this target.
|
236
|
+
#
|
237
|
+
def supported_test_types
|
238
|
+
test_specs.map(&:test_type).uniq
|
239
|
+
end
|
240
|
+
|
241
|
+
# @return [Hash{String=>Array<Hash{Symbol=>String}>}] The vendored and non vendored framework paths this target
|
242
|
+
# depends upon keyed by spec name. For the root spec and subspecs the framework path of the target itself
|
243
|
+
# is included.
|
244
|
+
#
|
245
|
+
def framework_paths
|
246
|
+
@framework_paths ||= begin
|
247
|
+
file_accessors.each_with_object({}) do |file_accessor, hash|
|
248
|
+
frameworks = []
|
249
|
+
file_accessor.vendored_dynamic_artifacts.map do |framework_path|
|
250
|
+
relative_path_to_sandbox = framework_path.relative_path_from(sandbox.root)
|
251
|
+
framework = { :name => framework_path.basename.to_s,
|
252
|
+
:input_path => "${PODS_ROOT}/#{relative_path_to_sandbox}",
|
253
|
+
:output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{framework_path.basename}" }
|
254
|
+
# Until this can be configured, assume the dSYM file uses the file name as the framework.
|
255
|
+
# See https://github.com/CocoaPods/CocoaPods/issues/1698
|
256
|
+
dsym_name = "#{framework_path.basename}.dSYM"
|
257
|
+
dsym_path = Pathname.new("#{framework_path.dirname}/#{dsym_name}")
|
258
|
+
if dsym_path.exist?
|
259
|
+
framework[:dsym_name] = dsym_name
|
260
|
+
framework[:dsym_input_path] = "${PODS_ROOT}/#{relative_path_to_sandbox}.dSYM"
|
261
|
+
framework[:dsym_output_path] = "${DWARF_DSYM_FOLDER_PATH}/#{dsym_name}"
|
262
|
+
end
|
263
|
+
frameworks << framework
|
264
|
+
end
|
265
|
+
if !file_accessor.spec.test_specification? && should_build? && requires_frameworks? && !static_framework?
|
266
|
+
frameworks << { :name => product_name,
|
267
|
+
:input_path => build_product_path('${BUILT_PRODUCTS_DIR}'),
|
268
|
+
:output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{product_name}" }
|
269
|
+
end
|
270
|
+
hash[file_accessor.spec.name] = frameworks
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
# @return [Hash{String=>Array<String>}] The resource and resource bundle paths this target depends upon keyed by
|
276
|
+
# spec name.
|
277
|
+
#
|
278
|
+
def resource_paths
|
279
|
+
@resource_paths ||= begin
|
280
|
+
file_accessors.each_with_object({}) do |file_accessor, hash|
|
281
|
+
resource_paths = file_accessor.resources.map { |res| "${PODS_ROOT}/#{res.relative_path_from(sandbox.project.path.dirname)}" }
|
282
|
+
prefix = Pod::Target::BuildSettings::CONFIGURATION_BUILD_DIR_VARIABLE
|
283
|
+
prefix = configuration_build_dir unless file_accessor.spec.test_specification?
|
284
|
+
resource_bundle_paths = file_accessor.resource_bundles.keys.map { |name| "#{prefix}/#{name.shellescape}.bundle" }
|
285
|
+
hash[file_accessor.spec.name] = resource_paths + resource_bundle_paths
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
# Returns the corresponding native product type to use given the test type.
|
291
|
+
# This is primarily used when creating the native targets in order to produce the correct test bundle target
|
292
|
+
# based on the type of tests included.
|
293
|
+
#
|
294
|
+
# @param [Symbol] test_type
|
295
|
+
# The test type to map to provided by the test specification DSL.
|
296
|
+
#
|
297
|
+
# @return [Symbol] The native product type to use.
|
298
|
+
#
|
299
|
+
def product_type_for_test_type(test_type)
|
300
|
+
case test_type
|
301
|
+
when :unit
|
302
|
+
:unit_test_bundle
|
303
|
+
else
|
304
|
+
raise Informative, "Unknown test type `#{test_type}`."
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
# Returns the corresponding test type given the product type.
|
309
|
+
#
|
310
|
+
# @param [Symbol] product_type
|
311
|
+
# The product type to map to a test type.
|
312
|
+
#
|
313
|
+
# @return [Symbol] The native product type to use.
|
314
|
+
#
|
315
|
+
def test_type_for_product_type(product_type)
|
316
|
+
case product_type
|
317
|
+
when :unit_test_bundle
|
318
|
+
:unit
|
319
|
+
else
|
320
|
+
raise Informative, "Unknown product type `#{product_type}`."
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
# @return [Specification] The root specification for the target.
|
325
|
+
#
|
326
|
+
def root_spec
|
327
|
+
specs.first.root
|
328
|
+
end
|
329
|
+
|
330
|
+
# @return [String] The name of the Pod that this target refers to.
|
331
|
+
#
|
332
|
+
def pod_name
|
333
|
+
root_spec.name
|
334
|
+
end
|
335
|
+
|
336
|
+
# @return [Pathname] the absolute path of the LLVM module map file that
|
337
|
+
# defines the module structure for the compiler.
|
338
|
+
#
|
339
|
+
def module_map_path
|
340
|
+
basename = "#{label}.modulemap"
|
341
|
+
if requires_frameworks?
|
342
|
+
super
|
343
|
+
elsif file_accessors.any?(&:module_map)
|
344
|
+
build_headers.root + product_module_name + basename
|
345
|
+
else
|
346
|
+
sandbox.public_headers.root + product_module_name + basename
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
# @param [String] bundle_name
|
351
|
+
# The name of the bundle product, which is given by the +spec+.
|
352
|
+
#
|
353
|
+
# @return [String] The derived name of the resource bundle target.
|
354
|
+
#
|
355
|
+
def resources_bundle_target_label(bundle_name)
|
356
|
+
"#{label}-#{bundle_name}"
|
357
|
+
end
|
358
|
+
|
359
|
+
# @param [Symbol] test_type
|
360
|
+
# The test type to use for producing the test label.
|
361
|
+
#
|
362
|
+
# @return [String] The derived name of the test target.
|
363
|
+
#
|
364
|
+
def test_target_label(test_type)
|
365
|
+
"#{label}-#{test_type.capitalize}-Tests"
|
366
|
+
end
|
367
|
+
|
368
|
+
# @param [Symbol] test_type
|
369
|
+
# The test type this embed frameworks script path is for.
|
370
|
+
#
|
371
|
+
# @return [Pathname] The absolute path of the copy resources script for the given test type.
|
372
|
+
#
|
373
|
+
def copy_resources_script_path_for_test_type(test_type)
|
374
|
+
support_files_dir + "#{test_target_label(test_type)}-resources.sh"
|
375
|
+
end
|
376
|
+
|
377
|
+
# @param [Symbol] test_type
|
378
|
+
# The test type this embed frameworks script path is for.
|
379
|
+
#
|
380
|
+
# @return [Pathname] The absolute path of the embed frameworks script for the given test type.
|
381
|
+
#
|
382
|
+
def embed_frameworks_script_path_for_test_type(test_type)
|
383
|
+
support_files_dir + "#{test_target_label(test_type)}-frameworks.sh"
|
384
|
+
end
|
385
|
+
|
386
|
+
# @param [Symbol] test_type
|
387
|
+
# The test type this Info.plist path is for.
|
388
|
+
#
|
389
|
+
# @return [Pathname] The absolute path of the Info.plist for the given test type.
|
390
|
+
#
|
391
|
+
def info_plist_path_for_test_type(test_type)
|
392
|
+
support_files_dir + "#{test_target_label(test_type)}-Info.plist"
|
393
|
+
end
|
394
|
+
|
395
|
+
# @return [Pathname] the absolute path of the prefix header file.
|
396
|
+
#
|
397
|
+
def prefix_header_path
|
398
|
+
support_files_dir + "#{label}-prefix.pch"
|
399
|
+
end
|
400
|
+
|
401
|
+
# @param [Symbol] test_type
|
402
|
+
# The test type prefix header path is for.
|
403
|
+
#
|
404
|
+
# @return [Pathname] the absolute path of the prefix header file for the given test type.
|
405
|
+
#
|
406
|
+
def prefix_header_path_for_test_type(test_type)
|
407
|
+
support_files_dir + "#{test_target_label(test_type)}-prefix.pch"
|
408
|
+
end
|
409
|
+
|
410
|
+
# @return [Array<String>] The names of the Pods on which this target
|
411
|
+
# depends.
|
412
|
+
#
|
413
|
+
def dependencies
|
414
|
+
spec_consumers.flat_map do |consumer|
|
415
|
+
consumer.dependencies.map { |dep| Specification.root_name(dep.name) }
|
416
|
+
end.uniq
|
417
|
+
end
|
418
|
+
|
419
|
+
# @return [Array<PodTarget>] the recursive targets that this target has a
|
420
|
+
# dependency upon.
|
421
|
+
#
|
422
|
+
def recursive_dependent_targets
|
423
|
+
@recursive_dependent_targets ||= _add_recursive_dependent_targets(Set.new).delete(self).to_a
|
424
|
+
end
|
425
|
+
|
426
|
+
def _add_recursive_dependent_targets(set)
|
427
|
+
dependent_targets.each do |target|
|
428
|
+
target._add_recursive_dependent_targets(set) if set.add?(target)
|
429
|
+
end
|
430
|
+
|
431
|
+
set
|
432
|
+
end
|
433
|
+
protected :_add_recursive_dependent_targets
|
434
|
+
|
435
|
+
# @return [Array<PodTarget>] the recursive targets that this target has a
|
436
|
+
# test dependency upon.
|
437
|
+
#
|
438
|
+
def recursive_test_dependent_targets
|
439
|
+
@recursive_test_dependent_targets ||= _add_recursive_test_dependent_targets(Set.new).to_a
|
440
|
+
end
|
441
|
+
|
442
|
+
def _add_recursive_test_dependent_targets(set)
|
443
|
+
test_dependent_targets_by_spec_name.each_value do |dependent_targets|
|
444
|
+
dependent_targets.each do |target|
|
445
|
+
target._add_recursive_dependent_targets(set) if set.add?(target)
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
set
|
450
|
+
end
|
451
|
+
private :_add_recursive_test_dependent_targets
|
452
|
+
|
453
|
+
# @return [Array<PodTarget>] the canonical list of dependent targets this target has a dependency upon.
|
454
|
+
# This list includes the target itself as well as its recursive dependent and test dependent targets.
|
455
|
+
#
|
456
|
+
def all_dependent_targets
|
457
|
+
[self, *recursive_dependent_targets, *recursive_test_dependent_targets].uniq
|
458
|
+
end
|
459
|
+
|
460
|
+
# Checks if warnings should be inhibited for this pod.
|
461
|
+
#
|
462
|
+
# @return [Bool]
|
463
|
+
#
|
464
|
+
def inhibit_warnings?
|
465
|
+
return @inhibit_warnings if defined? @inhibit_warnings
|
466
|
+
whitelists = target_definitions.map do |target_definition|
|
467
|
+
target_definition.inhibits_warnings_for_pod?(root_spec.name)
|
468
|
+
end.uniq
|
469
|
+
|
470
|
+
if whitelists.empty?
|
471
|
+
@inhibit_warnings = false
|
472
|
+
false
|
473
|
+
elsif whitelists.count == 1
|
474
|
+
@inhibit_warnings = whitelists.first
|
475
|
+
whitelists.first
|
476
|
+
else
|
477
|
+
UI.warn "The pod `#{pod_name}` is linked to different targets " \
|
478
|
+
"(#{target_definitions.map(&:label)}), which contain different " \
|
479
|
+
'settings to inhibit warnings. CocoaPods does not currently ' \
|
480
|
+
'support different settings and will fall back to your preference ' \
|
481
|
+
'set in the root target definition.'
|
482
|
+
podfile.root_target_definitions.first.inhibits_warnings_for_pod?(root_spec.name)
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
# @param [String] dir
|
487
|
+
# The directory (which might be a variable) relative to which
|
488
|
+
# the returned path should be. This must be used if the
|
489
|
+
# $CONFIGURATION_BUILD_DIR is modified.
|
490
|
+
#
|
491
|
+
# @return [String] The absolute path to the configuration build dir
|
492
|
+
#
|
493
|
+
def configuration_build_dir(dir = BuildSettings::CONFIGURATION_BUILD_DIR_VARIABLE)
|
494
|
+
"#{dir}/#{label}"
|
495
|
+
end
|
496
|
+
|
497
|
+
# @param [String] dir
|
498
|
+
# @see #configuration_build_dir
|
499
|
+
#
|
500
|
+
# @return [String] The absolute path to the build product
|
501
|
+
#
|
502
|
+
def build_product_path(dir = BuildSettings::CONFIGURATION_BUILD_DIR_VARIABLE)
|
503
|
+
"#{configuration_build_dir(dir)}/#{product_name}"
|
504
|
+
end
|
505
|
+
|
506
|
+
# @return [String] The source path of the root for this target relative to `$(PODS_ROOT)`
|
507
|
+
#
|
508
|
+
def pod_target_srcroot
|
509
|
+
"${PODS_ROOT}/#{sandbox.pod_dir(pod_name).relative_path_from(sandbox.root)}"
|
510
|
+
end
|
511
|
+
|
512
|
+
# @return [String] The version associated with this target
|
513
|
+
#
|
514
|
+
def version
|
515
|
+
version = root_spec.version
|
516
|
+
[version.major, version.minor, version.patch].join('.')
|
517
|
+
end
|
518
|
+
|
519
|
+
# @param [Boolean] include_test_dependent_targets
|
520
|
+
# whether to include header search paths for test dependent targets
|
521
|
+
#
|
522
|
+
# @return [Array<String>] The set of header search paths this target uses.
|
523
|
+
#
|
524
|
+
def header_search_paths(include_test_dependent_targets = false)
|
525
|
+
header_search_paths = []
|
526
|
+
header_search_paths.concat(build_headers.search_paths(platform, nil, false))
|
527
|
+
header_search_paths.concat(sandbox.public_headers.search_paths(platform, pod_name, uses_modular_headers?))
|
528
|
+
dependent_targets = recursive_dependent_targets
|
529
|
+
dependent_targets += recursive_test_dependent_targets if include_test_dependent_targets
|
530
|
+
dependent_targets.uniq.each do |dependent_target|
|
531
|
+
header_search_paths.concat(sandbox.public_headers.search_paths(platform, dependent_target.pod_name, defines_module? && dependent_target.uses_modular_headers?(false)))
|
532
|
+
end
|
533
|
+
header_search_paths.uniq
|
534
|
+
end
|
535
|
+
|
536
|
+
protected
|
537
|
+
|
538
|
+
# Returns whether the pod target should use modular headers.
|
539
|
+
#
|
540
|
+
# @param [Boolean] only_if_defines_modules
|
541
|
+
# whether the use of modular headers should require the target to define a module
|
542
|
+
#
|
543
|
+
# @note This must return false when a pod has a `header_mappings_dir` or `header_dir`,
|
544
|
+
# as that allows the spec to customize the header structure, and
|
545
|
+
# therefore it might not be expecting the module name to be prepended
|
546
|
+
# to imports at all.
|
547
|
+
#
|
548
|
+
def uses_modular_headers?(only_if_defines_modules = true)
|
549
|
+
return false if only_if_defines_modules && !defines_module?
|
550
|
+
spec_consumers.none?(&:header_mappings_dir) && spec_consumers.none?(&:header_dir)
|
551
|
+
end
|
552
|
+
|
553
|
+
private
|
554
|
+
|
555
|
+
def create_build_settings
|
556
|
+
BuildSettings::PodTargetSettings.new(self)
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|