cocoapods 1.4.0 → 1.5.0.beta.1
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 +4 -4
- data/CHANGELOG.md +149 -0
- data/lib/cocoapods.rb +1 -0
- data/lib/cocoapods/command/outdated.rb +2 -2
- data/lib/cocoapods/command/repo/push.rb +5 -0
- data/lib/cocoapods/command/update.rb +21 -5
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements.rb +6 -3
- data/lib/cocoapods/generator/constant.rb +19 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +15 -3
- data/lib/cocoapods/generator/embed_frameworks_script.rb +11 -2
- data/lib/cocoapods/generator/module_map.rb +56 -5
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +19 -13
- data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +4 -6
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +25 -2
- data/lib/cocoapods/installer.rb +17 -8
- data/lib/cocoapods/installer/analyzer.rb +48 -38
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +11 -0
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +7 -6
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +8 -8
- data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +3 -3
- data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +16 -16
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +7 -11
- data/lib/cocoapods/installer/pod_source_installer.rb +2 -3
- data/lib/cocoapods/installer/podfile_validator.rb +11 -10
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +72 -28
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +8 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +9 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +32 -24
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +97 -54
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +9 -11
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +4 -9
- data/lib/cocoapods/installer/xcode/target_validator.rb +32 -18
- data/lib/cocoapods/project.rb +32 -17
- data/lib/cocoapods/resolver.rb +59 -31
- data/lib/cocoapods/resolver/lazy_specification.rb +28 -18
- data/lib/cocoapods/sandbox.rb +2 -4
- data/lib/cocoapods/sandbox/file_accessor.rb +25 -9
- data/lib/cocoapods/sandbox/headers_store.rb +31 -6
- data/lib/cocoapods/sandbox/path_list.rb +36 -46
- data/lib/cocoapods/target.rb +7 -4
- data/lib/cocoapods/target/aggregate_target.rb +10 -8
- data/lib/cocoapods/target/pod_target.rb +87 -20
- data/lib/cocoapods/user_interface/error_report.rb +1 -1
- data/lib/cocoapods/user_interface/inspector_reporter.rb +4 -4
- data/lib/cocoapods/validator.rb +40 -29
- metadata +11 -9
data/lib/cocoapods/sandbox.rb
CHANGED
@@ -57,7 +57,7 @@ module Pod
|
|
57
57
|
def initialize(root)
|
58
58
|
FileUtils.mkdir_p(root)
|
59
59
|
@root = Pathname.new(root).realpath
|
60
|
-
@public_headers = HeadersStore.new(self, 'Public')
|
60
|
+
@public_headers = HeadersStore.new(self, 'Public', :public)
|
61
61
|
@predownloaded_pods = []
|
62
62
|
@checkout_sources = {}
|
63
63
|
@development_pods = {}
|
@@ -389,9 +389,7 @@ module Pod
|
|
389
389
|
#
|
390
390
|
def local_podspec(name)
|
391
391
|
root_name = Specification.root_name(name)
|
392
|
-
|
393
|
-
Pathname.new(path)
|
394
|
-
end
|
392
|
+
development_pods[root_name]
|
395
393
|
end
|
396
394
|
|
397
395
|
#-------------------------------------------------------------------------#
|
@@ -196,9 +196,9 @@ module Pod
|
|
196
196
|
# shipped with the Pod.
|
197
197
|
#
|
198
198
|
def vendored_frameworks_headers
|
199
|
-
vendored_frameworks.
|
199
|
+
vendored_frameworks.flat_map do |framework|
|
200
200
|
self.class.vendored_frameworks_headers(framework)
|
201
|
-
end.
|
201
|
+
end.uniq
|
202
202
|
end
|
203
203
|
|
204
204
|
# @return [Array<Pathname>] The paths of the library bundles that come
|
@@ -278,11 +278,7 @@ module Pod
|
|
278
278
|
# specification or auto-detected.
|
279
279
|
#
|
280
280
|
def license
|
281
|
-
|
282
|
-
path_list.root + file
|
283
|
-
else
|
284
|
-
path_list.glob([GLOB_PATTERNS[:license]]).first
|
285
|
-
end
|
281
|
+
spec_license || path_list.glob([GLOB_PATTERNS[:license]]).first
|
286
282
|
end
|
287
283
|
|
288
284
|
# @return [Pathname, Nil] The path of the custom module map file of the
|
@@ -305,17 +301,37 @@ module Pod
|
|
305
301
|
path_list.glob([GLOB_PATTERNS[:docs]])
|
306
302
|
end
|
307
303
|
|
304
|
+
# @return [Pathname] The path of the license file specified in the
|
305
|
+
# specification, if it exists
|
306
|
+
#
|
307
|
+
def spec_license
|
308
|
+
if file = spec_consumer.license[:file]
|
309
|
+
absolute_path = root + file
|
310
|
+
absolute_path if File.exist?(absolute_path)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
308
314
|
# @return [Array<Pathname>] Paths to include for local pods to assist in development
|
309
315
|
#
|
310
316
|
def developer_files
|
311
317
|
podspecs = specs
|
312
318
|
result = [module_map, prefix_header]
|
319
|
+
|
320
|
+
if license_path = spec_consumer.license[:file]
|
321
|
+
license_path = root + license_path
|
322
|
+
unless File.exist?(license_path)
|
323
|
+
UI.warn "A license was specified in podspec `#{spec.name}` but the file does not exist - #{license_path}"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
313
327
|
if podspecs.size <= 1
|
314
328
|
result += [license, readme, podspecs, docs]
|
315
329
|
else
|
330
|
+
# Manually add non-globbing files since there are multiple podspecs in the same folder
|
316
331
|
result << podspec_file
|
317
|
-
if
|
318
|
-
|
332
|
+
if license_file = spec_license
|
333
|
+
absolute_path = root + license_file
|
334
|
+
result << absolute_path if File.exist?(absolute_path)
|
319
335
|
end
|
320
336
|
end
|
321
337
|
result.compact.flatten.sort
|
@@ -4,6 +4,8 @@ module Pod
|
|
4
4
|
# the header search paths.
|
5
5
|
#
|
6
6
|
class HeadersStore
|
7
|
+
SEARCH_PATHS_KEY = Struct.new(:platform_name, :target_name, :use_modular_headers)
|
8
|
+
|
7
9
|
# @return [Pathname] the absolute path of this header directory.
|
8
10
|
#
|
9
11
|
def root
|
@@ -20,25 +22,48 @@ module Pod
|
|
20
22
|
# the relative path to the sandbox root and hence to the Pods
|
21
23
|
# project.
|
22
24
|
#
|
23
|
-
|
25
|
+
# @param [Symbol] visibility_scope
|
26
|
+
# the header visibility scope to use in this store. Can be `:private` or `:public`.
|
27
|
+
#
|
28
|
+
def initialize(sandbox, relative_path, visibility_scope)
|
24
29
|
@sandbox = sandbox
|
25
30
|
@relative_path = relative_path
|
26
31
|
@search_paths = []
|
32
|
+
@search_paths_cache = {}
|
33
|
+
@visibility_scope = visibility_scope
|
27
34
|
end
|
28
35
|
|
29
36
|
# @param [Platform] platform
|
30
37
|
# the platform for which the header search paths should be
|
31
|
-
# returned
|
38
|
+
# returned.
|
39
|
+
#
|
40
|
+
# @param [String] target_name
|
41
|
+
# the target for which the header search paths should be
|
42
|
+
# returned. Can be `nil` in which case all headers that match the platform
|
43
|
+
# will be returned.
|
44
|
+
#
|
45
|
+
# @param [Boolean] use_modular_headers
|
46
|
+
# whether the search paths generated should use modular (stricter) style.
|
32
47
|
#
|
33
48
|
# @return [Array<String>] All the search paths of the header directory in
|
34
49
|
# xcconfig format. The paths are specified relative to the pods
|
35
50
|
# root with the `${PODS_ROOT}` variable.
|
36
51
|
#
|
37
|
-
def search_paths(platform)
|
38
|
-
|
39
|
-
|
52
|
+
def search_paths(platform, target_name = nil, use_modular_headers = false)
|
53
|
+
key = SEARCH_PATHS_KEY.new(platform.name, target_name, use_modular_headers)
|
54
|
+
return @search_paths_cache[key] if @search_paths_cache.key?(key)
|
55
|
+
search_paths = @search_paths.select do |entry|
|
56
|
+
matches_platform = entry[:platform] == platform.name
|
57
|
+
matches_target = target_name.nil? || (entry[:path].basename.to_s == target_name)
|
58
|
+
matches_platform && matches_target
|
59
|
+
end
|
40
60
|
headers_dir = root.relative_path_from(sandbox.root).dirname
|
41
|
-
[
|
61
|
+
@search_paths_cache[key] = search_paths.flat_map do |entry|
|
62
|
+
paths = []
|
63
|
+
paths << "${PODS_ROOT}/#{headers_dir}/#{@relative_path}" if !use_modular_headers || @visibility_scope == :public
|
64
|
+
paths << "${PODS_ROOT}/#{headers_dir}/#{entry[:path]}" if !use_modular_headers || @visibility_scope == :private
|
65
|
+
paths
|
66
|
+
end.uniq
|
42
67
|
end
|
43
68
|
|
44
69
|
# Removes the directory as it is regenerated from scratch during each
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/multibyte/unicode'
|
2
|
+
require 'find'
|
2
3
|
|
3
4
|
module Pod
|
4
5
|
class Sandbox
|
@@ -50,23 +51,23 @@ module Pod
|
|
50
51
|
unless root.exist?
|
51
52
|
raise Informative, "Attempt to read non existent folder `#{root}`."
|
52
53
|
end
|
53
|
-
escaped_root = escape_path_for_glob(root)
|
54
|
-
|
55
|
-
absolute_paths = Pathname.glob(escaped_root + '**/*', File::FNM_DOTMATCH).lazy
|
56
|
-
dirs_and_files = absolute_paths.reject { |path| path.basename.to_s =~ /^\.\.?$/ }
|
57
|
-
dirs, files = dirs_and_files.partition { |path| File.directory?(path) }
|
58
54
|
|
55
|
+
dirs = []
|
56
|
+
files = []
|
59
57
|
root_length = root.cleanpath.to_s.length + File::SEPARATOR.length
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
58
|
+
Find.find(root.to_s) do |f|
|
59
|
+
directory = File.directory?(f)
|
60
|
+
f = f.slice(root_length, f.length - root_length)
|
61
|
+
next if f.nil?
|
62
|
+
|
63
|
+
(directory ? dirs : files) << f
|
66
64
|
end
|
67
65
|
|
68
|
-
|
69
|
-
|
66
|
+
dirs.sort_by!(&:upcase)
|
67
|
+
files.sort_by!(&:upcase)
|
68
|
+
|
69
|
+
@dirs = dirs
|
70
|
+
@files = files
|
70
71
|
@glob_cache = {}
|
71
72
|
end
|
72
73
|
|
@@ -87,7 +88,7 @@ module Pod
|
|
87
88
|
# @return [Array<Pathname>]
|
88
89
|
#
|
89
90
|
def glob(patterns, options = {})
|
90
|
-
relative_glob(patterns, options).map { |p| root
|
91
|
+
relative_glob(patterns, options).map { |p| root.join(p) }
|
91
92
|
end
|
92
93
|
|
93
94
|
# The list of relative paths that are case insensitively matched by a
|
@@ -127,19 +128,27 @@ module Pod
|
|
127
128
|
else
|
128
129
|
full_list = files
|
129
130
|
end
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
131
|
+
patterns_array = Array(patterns)
|
132
|
+
exact_matches = (full_list & patterns_array).to_set
|
133
|
+
|
134
|
+
unless patterns_array.empty?
|
135
|
+
list = patterns_array.flat_map do |pattern|
|
136
|
+
if exact_matches.include?(pattern)
|
137
|
+
pattern
|
138
|
+
else
|
139
|
+
if directory?(pattern) && dir_pattern
|
140
|
+
pattern += '/' unless pattern.end_with?('/')
|
141
|
+
pattern += dir_pattern
|
142
|
+
end
|
143
|
+
expanded_patterns = dir_glob_equivalent_patterns(pattern)
|
144
|
+
full_list.select do |path|
|
145
|
+
expanded_patterns.any? do |p|
|
146
|
+
File.fnmatch(p, path, File::FNM_CASEFOLD | File::FNM_PATHNAME)
|
147
|
+
end
|
148
|
+
end
|
140
149
|
end
|
141
150
|
end
|
142
|
-
end
|
151
|
+
end
|
143
152
|
|
144
153
|
list = list.map { |path| Pathname.new(path) }
|
145
154
|
if exclude_patterns
|
@@ -198,35 +207,16 @@ module Pod
|
|
198
207
|
else
|
199
208
|
patterns = [pattern]
|
200
209
|
values_by_set.each do |set, values|
|
201
|
-
patterns = patterns.
|
210
|
+
patterns = patterns.flat_map do |old_pattern|
|
202
211
|
values.map do |value|
|
203
212
|
old_pattern.gsub(set, value)
|
204
213
|
end
|
205
|
-
end
|
214
|
+
end
|
206
215
|
end
|
207
216
|
patterns
|
208
217
|
end
|
209
218
|
end
|
210
219
|
|
211
|
-
# Escapes the glob metacharacters from a given path so it can used in
|
212
|
-
# Dir#glob and similar methods.
|
213
|
-
#
|
214
|
-
# @note See CocoaPods/CocoaPods#862.
|
215
|
-
#
|
216
|
-
# @param [String, Pathname] path
|
217
|
-
# The path to escape.
|
218
|
-
#
|
219
|
-
# @return [Pathname] The escaped path.
|
220
|
-
#
|
221
|
-
def escape_path_for_glob(path)
|
222
|
-
result = path.to_s
|
223
|
-
characters_to_escape = ['[', ']', '{', '}', '?', '*']
|
224
|
-
characters_to_escape.each do |character|
|
225
|
-
result.gsub!(character, "\\#{character}")
|
226
|
-
end
|
227
|
-
Pathname.new(result)
|
228
|
-
end
|
229
|
-
|
230
220
|
#-----------------------------------------------------------------------#
|
231
221
|
end
|
232
222
|
end
|
data/lib/cocoapods/target.rb
CHANGED
@@ -74,7 +74,7 @@ module Pod
|
|
74
74
|
# #requires_frameworks?.
|
75
75
|
#
|
76
76
|
def product_type
|
77
|
-
requires_frameworks?
|
77
|
+
requires_frameworks? ? :framework : :static_library
|
78
78
|
end
|
79
79
|
|
80
80
|
# @return [String] A string suitable for debugging.
|
@@ -95,7 +95,9 @@ module Pod
|
|
95
95
|
# @return [Boolean] Whether the target should build a static framework.
|
96
96
|
#
|
97
97
|
def static_framework?
|
98
|
-
|
98
|
+
return if is_a?(Pod::AggregateTarget)
|
99
|
+
return if specs.empty?
|
100
|
+
specs.all? { |spec| spec.root.static_framework }
|
99
101
|
end
|
100
102
|
|
101
103
|
#-------------------------------------------------------------------------#
|
@@ -148,14 +150,15 @@ module Pod
|
|
148
150
|
# module map.
|
149
151
|
#
|
150
152
|
def umbrella_header_path
|
151
|
-
|
153
|
+
module_map_path.parent + "#{label}-umbrella.h"
|
152
154
|
end
|
153
155
|
|
154
156
|
# @return [Pathname] the absolute path of the LLVM module map file that
|
155
157
|
# defines the module structure for the compiler.
|
156
158
|
#
|
157
159
|
def module_map_path
|
158
|
-
|
160
|
+
basename = "#{label}.modulemap"
|
161
|
+
support_files_dir + basename
|
159
162
|
end
|
160
163
|
|
161
164
|
# @return [Pathname] the absolute path of the bridge support file.
|
@@ -140,7 +140,7 @@ module Pod
|
|
140
140
|
# @return [Array<AggregateTarget>] The aggregate targets whose pods this
|
141
141
|
# target must be able to import, but will not directly link against.
|
142
142
|
#
|
143
|
-
|
143
|
+
attr_reader :search_paths_aggregate_targets
|
144
144
|
|
145
145
|
# @param [String] build_configuration The build configuration for which the
|
146
146
|
# the pod targets should be returned.
|
@@ -149,15 +149,20 @@ module Pod
|
|
149
149
|
# configuration.
|
150
150
|
#
|
151
151
|
def pod_targets_for_build_configuration(build_configuration)
|
152
|
-
|
152
|
+
@pod_targets_for_build_configuration ||= {}
|
153
|
+
@pod_targets_for_build_configuration[build_configuration] ||= pod_targets.select do |pod_target|
|
153
154
|
pod_target.include_in_build_config?(target_definition, build_configuration)
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
158
|
+
def pod_targets_to_link
|
159
|
+
@pod_targets_to_link ||= pod_targets.to_set - search_paths_aggregate_targets.flat_map(&:pod_targets)
|
160
|
+
end
|
161
|
+
|
157
162
|
# @return [Array<Specification>] The specifications used by this aggregate target.
|
158
163
|
#
|
159
164
|
def specs
|
160
|
-
pod_targets.
|
165
|
+
pod_targets.flat_map(&:specs)
|
161
166
|
end
|
162
167
|
|
163
168
|
# @return [Hash{Symbol => Array<Specification>}] The pod targets for each
|
@@ -191,9 +196,7 @@ module Pod
|
|
191
196
|
@framework_paths_by_config ||= begin
|
192
197
|
framework_paths_by_config = {}
|
193
198
|
user_build_configurations.keys.each do |config|
|
194
|
-
relevant_pod_targets =
|
195
|
-
pod_target.include_in_build_config?(target_definition, config)
|
196
|
-
end
|
199
|
+
relevant_pod_targets = pod_targets_for_build_configuration(config)
|
197
200
|
framework_paths_by_config[config] = relevant_pod_targets.flat_map { |pt| pt.framework_paths(false) }
|
198
201
|
end
|
199
202
|
framework_paths_by_config
|
@@ -208,8 +211,7 @@ module Pod
|
|
208
211
|
pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework?
|
209
212
|
end
|
210
213
|
user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
|
211
|
-
resources_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
|
212
|
-
next [] unless pod_target.include_in_build_config?(target_definition, config)
|
214
|
+
resources_by_config[config] = (relevant_pod_targets & pod_targets_for_build_configuration(config)).flat_map do |pod_target|
|
213
215
|
(pod_target.resource_paths(false) + [bridge_support_file].compact).uniq
|
214
216
|
end
|
215
217
|
end
|
@@ -49,11 +49,12 @@ module Pod
|
|
49
49
|
raise "Can't initialize a PodTarget with only abstract TargetDefinitions" if target_definitions.all?(&:abstract?)
|
50
50
|
raise "Can't initialize a PodTarget with an empty string scope suffix!" if scope_suffix == ''
|
51
51
|
super()
|
52
|
-
@specs = specs
|
52
|
+
@specs = specs.dup.freeze
|
53
|
+
@test_specs, @non_test_specs = @specs.partition(&:test_specification?)
|
53
54
|
@target_definitions = target_definitions
|
54
55
|
@sandbox = sandbox
|
55
56
|
@scope_suffix = scope_suffix
|
56
|
-
@build_headers = Sandbox::HeadersStore.new(sandbox, 'Private')
|
57
|
+
@build_headers = Sandbox::HeadersStore.new(sandbox, 'Private', :private)
|
57
58
|
@file_accessors = []
|
58
59
|
@resource_bundle_targets = []
|
59
60
|
@test_resource_bundle_targets = []
|
@@ -162,17 +163,18 @@ module Pod
|
|
162
163
|
# to this target.
|
163
164
|
attr_reader :test_resource_bundle_targets
|
164
165
|
|
165
|
-
# @return [Bool] Whether or not this target should be
|
166
|
+
# @return [Bool] Whether or not this target should be built.
|
166
167
|
#
|
167
|
-
# A target should not be
|
168
|
+
# A target should not be built if it has no source files.
|
168
169
|
#
|
169
170
|
def should_build?
|
170
171
|
return @should_build if defined? @should_build
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
172
|
+
|
173
|
+
return @should_build = true if contains_script_phases?
|
174
|
+
|
175
|
+
source_files = file_accessors.flat_map(&:source_files)
|
176
|
+
source_files -= file_accessors.flat_map(&:headers)
|
177
|
+
@should_build = !source_files.empty?
|
176
178
|
end
|
177
179
|
|
178
180
|
# @return [Array<Specification::Consumer>] the specification consumers for
|
@@ -193,10 +195,24 @@ module Pod
|
|
193
195
|
end
|
194
196
|
end
|
195
197
|
|
198
|
+
# @return [Boolean] Whether the target defines a "module"
|
199
|
+
# (and thus will need a module map and umbrella header).
|
200
|
+
#
|
201
|
+
# @note Static library targets can temporarily opt in to this behavior by setting
|
202
|
+
# `DEFINES_MODULE = YES` in their specification's `pod_target_xcconfig`.
|
203
|
+
#
|
204
|
+
def defines_module?
|
205
|
+
return @defines_module if defined?(@defines_module)
|
206
|
+
return @defines_module = true if uses_swift? || requires_frameworks?
|
207
|
+
return @defines_module = true if target_definitions.any? { |td| td.build_pod_as_module?(pod_name) }
|
208
|
+
|
209
|
+
@defines_module = non_test_specs.any? { |s| s.consumer(platform).pod_target_xcconfig['DEFINES_MODULE'] == 'YES' }
|
210
|
+
end
|
211
|
+
|
196
212
|
# @return [Array<Hash{Symbol=>String}>] An array of hashes where each hash represents a single script phase.
|
197
213
|
#
|
198
214
|
def script_phases
|
199
|
-
spec_consumers.
|
215
|
+
spec_consumers.flat_map(&:script_phases)
|
200
216
|
end
|
201
217
|
|
202
218
|
# @return [Boolean] Whether the target contains any script phases.
|
@@ -215,20 +231,16 @@ module Pod
|
|
215
231
|
# @return [Boolean] Whether the target has any tests specifications.
|
216
232
|
#
|
217
233
|
def contains_test_specifications?
|
218
|
-
|
234
|
+
!test_specs.empty?
|
219
235
|
end
|
220
236
|
|
221
237
|
# @return [Array<Specification>] All of the test specs within this target.
|
222
238
|
#
|
223
|
-
|
224
|
-
specs.select(&:test_specification?)
|
225
|
-
end
|
239
|
+
attr_reader :test_specs
|
226
240
|
|
227
|
-
# @return [Array<Specification>] All of the
|
241
|
+
# @return [Array<Specification>] All of the specs within this target that are not test specs.
|
228
242
|
#
|
229
|
-
|
230
|
-
specs.reject(&:test_specification?)
|
231
|
-
end
|
243
|
+
attr_reader :non_test_specs
|
232
244
|
|
233
245
|
# @return [Array<Symbol>] All of the test supported types within this target.
|
234
246
|
#
|
@@ -365,6 +377,20 @@ module Pod
|
|
365
377
|
root_spec.name
|
366
378
|
end
|
367
379
|
|
380
|
+
# @return [Pathname] the absolute path of the LLVM module map file that
|
381
|
+
# defines the module structure for the compiler.
|
382
|
+
#
|
383
|
+
def module_map_path
|
384
|
+
basename = "#{label}.modulemap"
|
385
|
+
if requires_frameworks?
|
386
|
+
super
|
387
|
+
elsif file_accessors.any?(&:module_map)
|
388
|
+
build_headers.root + product_module_name + basename
|
389
|
+
else
|
390
|
+
sandbox.public_headers.root + product_module_name + basename
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
368
394
|
# @param [String] bundle_name
|
369
395
|
# The name of the bundle product, which is given by the +spec+.
|
370
396
|
#
|
@@ -410,6 +436,15 @@ module Pod
|
|
410
436
|
support_files_dir + "#{test_target_label(test_type)}-frameworks.sh"
|
411
437
|
end
|
412
438
|
|
439
|
+
# @param [Symbol] test_type
|
440
|
+
# The test type this Info.plist path is for.
|
441
|
+
#
|
442
|
+
# @return [Pathname] The absolute path of the Info.plist for the given test type.
|
443
|
+
#
|
444
|
+
def info_plist_path_for_test_type(test_type)
|
445
|
+
support_files_dir + "#{test_target_label(test_type)}-Info.plist"
|
446
|
+
end
|
447
|
+
|
413
448
|
# @return [Pathname] the absolute path of the prefix header file.
|
414
449
|
#
|
415
450
|
def prefix_header_path
|
@@ -496,10 +531,8 @@ module Pod
|
|
496
531
|
|
497
532
|
if whitelists.empty?
|
498
533
|
@build_config_cache[key] = true
|
499
|
-
true
|
500
534
|
elsif whitelists.count == 1
|
501
535
|
@build_config_cache[key] = whitelists.first
|
502
|
-
whitelists.first
|
503
536
|
else
|
504
537
|
raise Informative, "The subspecs of `#{pod_name}` are linked to " \
|
505
538
|
"different build configurations for the `#{target_definition}` " \
|
@@ -567,6 +600,40 @@ module Pod
|
|
567
600
|
[version.major, version.minor, version.patch].join('.')
|
568
601
|
end
|
569
602
|
|
603
|
+
# @param [Boolean] include_test_dependent_targets
|
604
|
+
# whether to include header search paths for test dependent targets
|
605
|
+
#
|
606
|
+
# @return [Array<String>] The set of header search paths this target uses.
|
607
|
+
#
|
608
|
+
def header_search_paths(include_test_dependent_targets = false)
|
609
|
+
header_search_paths = []
|
610
|
+
header_search_paths.concat(build_headers.search_paths(platform, nil, uses_modular_headers?))
|
611
|
+
header_search_paths.concat(sandbox.public_headers.search_paths(platform, pod_name, uses_modular_headers?))
|
612
|
+
dependent_targets = recursive_dependent_targets
|
613
|
+
dependent_targets += recursive_test_dependent_targets if include_test_dependent_targets
|
614
|
+
dependent_targets.each do |dependent_target|
|
615
|
+
header_search_paths.concat(sandbox.public_headers.search_paths(platform, dependent_target.pod_name, defines_module? && dependent_target.uses_modular_headers?(false)))
|
616
|
+
end
|
617
|
+
header_search_paths.uniq
|
618
|
+
end
|
619
|
+
|
620
|
+
protected
|
621
|
+
|
622
|
+
# Returns whether the pod target should use modular headers.
|
623
|
+
#
|
624
|
+
# @param [Boolean] only_if_defines_modules
|
625
|
+
# whether the use of modular headers should require the target to define a module
|
626
|
+
#
|
627
|
+
# @note This must return false when a pod has a `header_mappings_dir`,
|
628
|
+
# as that allows the spec to completely customize the header structure, and
|
629
|
+
# therefore it might not be expecting the module name to be prepended
|
630
|
+
# to imports at all.
|
631
|
+
#
|
632
|
+
def uses_modular_headers?(only_if_defines_modules = true)
|
633
|
+
return false if only_if_defines_modules && !defines_module?
|
634
|
+
spec_consumers.none?(&:header_mappings_dir)
|
635
|
+
end
|
636
|
+
|
570
637
|
private
|
571
638
|
|
572
639
|
# @param [TargetDefinition] target_definition
|