xcocoapods 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|