cocoapods 1.5.2 → 1.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +365 -1
  3. data/bin/pod +1 -1
  4. data/lib/cocoapods/command/cache/clean.rb +1 -1
  5. data/lib/cocoapods/command/init.rb +4 -2
  6. data/lib/cocoapods/command/install.rb +7 -0
  7. data/lib/cocoapods/command/lib/lint.rb +8 -1
  8. data/lib/cocoapods/command/outdated.rb +4 -9
  9. data/lib/cocoapods/command/repo/add.rb +1 -1
  10. data/lib/cocoapods/command/repo/list.rb +1 -1
  11. data/lib/cocoapods/command/repo/push.rb +17 -12
  12. data/lib/cocoapods/command/repo/remove.rb +1 -1
  13. data/lib/cocoapods/command/repo/update.rb +1 -1
  14. data/lib/cocoapods/command/setup.rb +1 -1
  15. data/lib/cocoapods/command/spec/create.rb +39 -39
  16. data/lib/cocoapods/command/spec/lint.rb +8 -1
  17. data/lib/cocoapods/command.rb +3 -1
  18. data/lib/cocoapods/config.rb +13 -2
  19. data/lib/cocoapods/downloader/cache.rb +1 -1
  20. data/lib/cocoapods/executable.rb +3 -3
  21. data/lib/cocoapods/external_sources/abstract_external_source.rb +23 -13
  22. data/lib/cocoapods/external_sources.rb +7 -4
  23. data/lib/cocoapods/gem_version.rb +1 -1
  24. data/lib/cocoapods/generator/acknowledgements/markdown.rb +6 -0
  25. data/lib/cocoapods/generator/acknowledgements/plist.rb +13 -2
  26. data/lib/cocoapods/generator/app_target_helper.rb +141 -17
  27. data/lib/cocoapods/generator/copy_resources_script.rb +14 -3
  28. data/lib/cocoapods/generator/dummy_source.rb +14 -5
  29. data/lib/cocoapods/generator/embed_frameworks_script.rb +37 -20
  30. data/lib/cocoapods/generator/header.rb +1 -1
  31. data/lib/cocoapods/generator/info_plist_file.rb +12 -4
  32. data/lib/cocoapods/generator/prefix_header.rb +2 -2
  33. data/lib/cocoapods/hooks_manager.rb +28 -17
  34. data/lib/cocoapods/installer/analyzer/analysis_result.rb +52 -22
  35. data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +14 -6
  36. data/lib/cocoapods/installer/analyzer/pod_variant.rb +4 -5
  37. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +3 -14
  38. data/lib/cocoapods/installer/analyzer/specs_state.rb +28 -4
  39. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +27 -14
  40. data/lib/cocoapods/installer/analyzer/target_inspector.rb +17 -11
  41. data/lib/cocoapods/installer/analyzer.rb +391 -284
  42. data/lib/cocoapods/installer/installation_options.rb +2 -0
  43. data/lib/cocoapods/installer/pod_source_installer.rb +31 -43
  44. data/lib/cocoapods/installer/post_install_hooks_context.rb +72 -47
  45. data/lib/cocoapods/installer/pre_install_hooks_context.rb +22 -13
  46. data/lib/cocoapods/installer/source_provider_hooks_context.rb +3 -1
  47. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +44 -11
  48. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +69 -29
  49. data/lib/cocoapods/installer/user_project_integrator.rb +6 -4
  50. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +25 -16
  51. data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +104 -0
  52. data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +23 -50
  53. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +296 -177
  54. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +51 -33
  55. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +93 -0
  56. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +62 -69
  57. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +72 -0
  58. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +130 -122
  59. data/lib/cocoapods/installer/xcode/target_validator.rb +15 -9
  60. data/lib/cocoapods/installer.rb +140 -63
  61. data/lib/cocoapods/project.rb +16 -14
  62. data/lib/cocoapods/resolver/resolver_specification.rb +41 -0
  63. data/lib/cocoapods/resolver.rb +79 -98
  64. data/lib/cocoapods/sandbox/file_accessor.rb +11 -6
  65. data/lib/cocoapods/sandbox/headers_store.rb +9 -8
  66. data/lib/cocoapods/sandbox/path_list.rb +5 -8
  67. data/lib/cocoapods/sandbox.rb +31 -43
  68. data/lib/cocoapods/sources_manager.rb +1 -1
  69. data/lib/cocoapods/target/aggregate_target.rb +143 -85
  70. data/lib/cocoapods/target/build_settings.rb +1124 -0
  71. data/lib/cocoapods/target/framework_paths.rb +36 -0
  72. data/lib/cocoapods/target/pod_target.rb +198 -295
  73. data/lib/cocoapods/target.rb +92 -37
  74. data/lib/cocoapods/user_interface.rb +5 -0
  75. data/lib/cocoapods/validator.rb +149 -44
  76. data/lib/cocoapods.rb +0 -1
  77. metadata +31 -23
  78. data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +0 -260
  79. data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +0 -87
  80. data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +0 -558
  81. data/lib/cocoapods/generator/xcconfig.rb +0 -13
@@ -0,0 +1,1124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pod
4
+ class Target
5
+ # @since 1.5.0
6
+ class BuildSettings
7
+ #-------------------------------------------------------------------------#
8
+
9
+ # @!group Constants
10
+
11
+ # @return [Set<String>]
12
+ # The build settings that should be treated as arrays, rather than strings.
13
+ #
14
+ PLURAL_SETTINGS = %w(
15
+ ALTERNATE_PERMISSIONS_FILES
16
+ ARCHS
17
+ BUILD_VARIANTS
18
+ EXCLUDED_SOURCE_FILE_NAMES
19
+ FRAMEWORK_SEARCH_PATHS
20
+ GCC_PREPROCESSOR_DEFINITIONS
21
+ GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS
22
+ HEADER_SEARCH_PATHS
23
+ INFOPLIST_PREPROCESSOR_DEFINITIONS
24
+ LD_RUNPATH_SEARCH_PATHS
25
+ LIBRARY_SEARCH_PATHS
26
+ OTHER_CFLAGS
27
+ OTHER_CPLUSPLUSFLAGS
28
+ OTHER_LDFLAGS
29
+ OTHER_SWIFT_FLAGS
30
+ REZ_SEARCH_PATHS
31
+ SECTORDER_FLAGS
32
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS
33
+ SWIFT_INCLUDE_PATHS
34
+ WARNING_CFLAGS
35
+ WARNING_LDFLAGS
36
+ ).to_set.freeze
37
+
38
+ # @return [String]
39
+ # The variable for the configuration build directory used when building pod targets.
40
+ #
41
+ CONFIGURATION_BUILD_DIR_VARIABLE = '${PODS_CONFIGURATION_BUILD_DIR}'.freeze
42
+
43
+ #-------------------------------------------------------------------------#
44
+
45
+ # @!group DSL
46
+
47
+ # Creates a method that calculates a part of the build settings for the {#target}.
48
+ #
49
+ # @!visibility private
50
+ #
51
+ # @param [Symbol,String] method_name
52
+ # The name of the method to define
53
+ #
54
+ # @param [Boolean] build_setting
55
+ # Whether the method name should be added (upcased) to {.build_setting_names}
56
+ #
57
+ # @param [Boolean] memoized
58
+ # Whether the method should be memoized
59
+ #
60
+ # @param [Boolean] sorted
61
+ # Whether the return value should be sorted
62
+ #
63
+ # @param [Boolean] uniqued
64
+ # Whether the return value should be uniqued
65
+ #
66
+ # @param [Boolean] compacted
67
+ # Whether the return value should be compacted
68
+ #
69
+ # @param [Boolean] frozen
70
+ # Whether the return value should be frozen
71
+ #
72
+ # @param [Boolean, Symbol] from_search_paths_aggregate_targets
73
+ # If truthy, the method from {Aggregate} that should be used to concatenate build settings from
74
+ # {::Pod::AggregateTarget#search_paths_aggregate_target}
75
+ #
76
+ # @param [Symbol] from_pod_targets_to_link
77
+ # If truthy, the `_to_import` values from `BuildSettings#pod_targets_to_link` will be concatenated
78
+ #
79
+ # @param [Block] implementation
80
+ #
81
+ # @macro [attach] define_build_settings_method
82
+ # @!method $1
83
+ #
84
+ # The `$1` build setting for the {#target}.
85
+ #
86
+ # The return value from this method will be: `${1--1}`.
87
+ #
88
+ def self.define_build_settings_method(method_name, build_setting: false,
89
+ memoized: false, sorted: false, uniqued: false, compacted: false, frozen: true,
90
+ from_search_paths_aggregate_targets: false, from_pod_targets_to_link: false,
91
+ &implementation)
92
+
93
+ memoized_key = "#{self}##{method_name}".freeze
94
+
95
+ (@build_settings_names ||= Set.new) << method_name.to_s.upcase if build_setting
96
+
97
+ raw_method_name = :"_raw_#{method_name}"
98
+ define_method(raw_method_name, &implementation)
99
+ private(raw_method_name)
100
+
101
+ dup_before_freeze = frozen && (from_pod_targets_to_link || from_search_paths_aggregate_targets || uniqued || sorted)
102
+
103
+ define_method(method_name) do
104
+ if memoized
105
+ retval = @__memoized.fetch(memoized_key, :not_found)
106
+ return retval if :not_found != retval
107
+ end
108
+
109
+ retval = send(raw_method_name)
110
+ if retval.nil?
111
+ @__memoized[memoized_key] = retval if memoized
112
+ return
113
+ end
114
+
115
+ retval = retval.dup if dup_before_freeze && retval.frozen?
116
+
117
+ retval.concat(pod_targets_to_link.flat_map { |pod_target| pod_target.build_settings.public_send("#{method_name}_to_import") }) if from_pod_targets_to_link
118
+ retval.concat(search_paths_aggregate_target_pod_target_build_settings.flat_map(&from_search_paths_aggregate_targets)) if from_search_paths_aggregate_targets
119
+
120
+ retval.compact! if compacted
121
+ retval.uniq! if uniqued
122
+ retval.sort! if sorted
123
+ retval.freeze if frozen
124
+
125
+ @__memoized[memoized_key] = retval if memoized
126
+
127
+ retval
128
+ end
129
+ end
130
+ private_class_method :define_build_settings_method
131
+
132
+ class << self
133
+ #-------------------------------------------------------------------------#
134
+
135
+ # @!group Public API
136
+
137
+ # @return [Set<String>] a set of all the build settings names that will
138
+ # be present in the #xcconfig
139
+ #
140
+ attr_reader :build_settings_names
141
+ end
142
+
143
+ #-------------------------------------------------------------------------#
144
+
145
+ # @!group Public API
146
+
147
+ # @return [Target]
148
+ # The target this build settings object is generating build settings for
149
+ #
150
+ attr_reader :target
151
+
152
+ # Initialize a new instance
153
+ #
154
+ # @param [Target] target
155
+ # see {#target}
156
+ #
157
+ def initialize(target)
158
+ @target = target
159
+ @__memoized = {}
160
+ end
161
+
162
+ def initialize_copy(other)
163
+ super
164
+ @__memoized = {}
165
+ end
166
+
167
+ # @return [Xcodeproj::Config]
168
+ define_build_settings_method :xcconfig, :memoized => true do
169
+ settings = add_inherited_to_plural(to_h)
170
+ Xcodeproj::Config.new(settings)
171
+ end
172
+
173
+ alias generate xcconfig
174
+
175
+ # Saves the generated xcconfig to the given path
176
+ #
177
+ # @return [Xcodeproj::Config]
178
+ #
179
+ # @see #xcconfig
180
+ #
181
+ # @param [String,Pathname] path
182
+ # The path the xcconfig will be saved to
183
+ #
184
+ def save_as(path)
185
+ xcconfig.save_as(path)
186
+ end
187
+
188
+ #-------------------------------------------------------------------------#
189
+
190
+ # @!group Paths
191
+
192
+ # @return [String]
193
+ define_build_settings_method :pods_build_dir, :build_setting => true do
194
+ '${BUILD_DIR}'
195
+ end
196
+
197
+ # @return [String]
198
+ define_build_settings_method :pods_configuration_build_dir, :build_setting => true do
199
+ '${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)'
200
+ end
201
+
202
+ #-------------------------------------------------------------------------#
203
+
204
+ # @!group Code Signing
205
+
206
+ # @return [String]
207
+ define_build_settings_method :code_sign_identity, :build_setting => true do
208
+ return unless target.requires_frameworks?
209
+ return unless target.platform.to_sym == :osx
210
+ ''
211
+ end
212
+
213
+ #-------------------------------------------------------------------------#
214
+
215
+ # @!group Frameworks
216
+
217
+ # @return [Array<String>]
218
+ define_build_settings_method :frameworks do
219
+ []
220
+ end
221
+
222
+ # @return [Array<String>]
223
+ define_build_settings_method :weak_frameworks do
224
+ []
225
+ end
226
+
227
+ # @return [Array<String>]
228
+ define_build_settings_method :framework_search_paths, :build_setting => true, :memoized => true do
229
+ framework_search_paths_to_import_developer_frameworks(frameworks)
230
+ end
231
+
232
+ # @param [Array<String>] frameworks
233
+ # The list of framework names
234
+ #
235
+ # @return [Array<String>]
236
+ # the `FRAMEWORK_SEARCH_PATHS` needed to import developer frameworks
237
+ def framework_search_paths_to_import_developer_frameworks(frameworks)
238
+ if frameworks.include?('XCTest') || frameworks.include?('SenTestingKit')
239
+ %w[ $(PLATFORM_DIR)/Developer/Library/Frameworks ]
240
+ else
241
+ []
242
+ end
243
+ end
244
+
245
+ #-------------------------------------------------------------------------#
246
+
247
+ # @!group Libraries
248
+
249
+ # @return [Array<String>]
250
+ define_build_settings_method :libraries do
251
+ []
252
+ end
253
+
254
+ #-------------------------------------------------------------------------#
255
+
256
+ # @!group Clang
257
+
258
+ # @return [Array<String>]
259
+ define_build_settings_method :gcc_preprocessor_definitions, :build_setting => true do
260
+ %w( COCOAPODS=1 )
261
+ end
262
+
263
+ # @return [Array<String>]
264
+ define_build_settings_method :other_cflags, :build_setting => true, :memoized => true do
265
+ module_map_files.map { |f| "-fmodule-map-file=#{f}" }
266
+ end
267
+
268
+ # @return [Array<String>]
269
+ define_build_settings_method :module_map_files do
270
+ []
271
+ end
272
+
273
+ #-------------------------------------------------------------------------#
274
+
275
+ # @!group Swift
276
+
277
+ # @return [Boolean]
278
+ # Whether `OTHER_SWIFT_FLAGS` should be generated when the target
279
+ # does not use swift.
280
+ #
281
+ def other_swift_flags_without_swift?
282
+ false
283
+ end
284
+
285
+ # @return [Array<String>]
286
+ define_build_settings_method :other_swift_flags, :build_setting => true, :memoized => true do
287
+ return unless target.uses_swift? || other_swift_flags_without_swift?
288
+ flags = %w(-D COCOAPODS)
289
+ flags.concat module_map_files.flat_map { |f| ['-Xcc', "-fmodule-map-file=#{f}"] }
290
+ flags
291
+ end
292
+
293
+ #-------------------------------------------------------------------------#
294
+
295
+ # @!group Linking
296
+
297
+ # @return [Boolean]
298
+ define_build_settings_method :requires_objc_linker_flag? do
299
+ false
300
+ end
301
+
302
+ # @return [Boolean]
303
+ define_build_settings_method :requires_fobjc_arc? do
304
+ false
305
+ end
306
+
307
+ # @return [Array<String>]
308
+ # the `LD_RUNPATH_SEARCH_PATHS` needed for dynamically linking the {#target}
309
+ #
310
+ # @param [Boolean] requires_host_target
311
+ #
312
+ # @param [Boolean] test_bundle
313
+ #
314
+ def _ld_runpath_search_paths(requires_host_target: false, test_bundle: false)
315
+ if target.platform.symbolic_name == :osx
316
+ ["'@executable_path/../Frameworks'",
317
+ test_bundle ? "'@loader_path/../Frameworks'" : "'@loader_path/Frameworks'"]
318
+ else
319
+ paths = [
320
+ "'@executable_path/Frameworks'",
321
+ "'@loader_path/Frameworks'",
322
+ ]
323
+ paths << "'@executable_path/../../Frameworks'" if requires_host_target
324
+ paths
325
+ end
326
+ end
327
+ private :_ld_runpath_search_paths
328
+
329
+ # @return [Array<String>]
330
+ define_build_settings_method :other_ldflags, :build_setting => true, :memoized => true do
331
+ ld_flags = []
332
+ ld_flags << '-ObjC' if requires_objc_linker_flag?
333
+ if requires_fobjc_arc?
334
+ ld_flags << '-fobjc-arc'
335
+ end
336
+ libraries.each { |l| ld_flags << %(-l"#{l}") }
337
+ frameworks.each { |f| ld_flags << '-framework' << %("#{f}") }
338
+ weak_frameworks.each { |f| ld_flags << '-weak_framework' << %("#{f}") }
339
+ ld_flags
340
+ end
341
+
342
+ #-------------------------------------------------------------------------#
343
+
344
+ # @!group Private Methods
345
+
346
+ private
347
+
348
+ # @return [Hash<String => String|Array<String>>]
349
+ def to_h
350
+ hash = {}
351
+ self.class.build_settings_names.sort.each do |setting|
352
+ hash[setting] = public_send(setting.downcase)
353
+ end
354
+ hash
355
+ end
356
+
357
+ # @return [Hash<String => String>]
358
+ def add_inherited_to_plural(hash)
359
+ Hash[hash.map do |key, value|
360
+ next [key, '$(inherited)'] if value.nil?
361
+ if PLURAL_SETTINGS.include?(key)
362
+ raise ArgumentError, "#{key} is a plural setting, cannot have #{value.inspect} as its value" unless value.is_a? Array
363
+
364
+ value = "$(inherited) #{quote_array(value)}"
365
+ else
366
+ raise ArgumentError, "#{key} is not a plural setting, cannot have #{value.inspect} as its value" unless value.is_a? String
367
+ end
368
+
369
+ [key, value]
370
+ end]
371
+ end
372
+
373
+ # @return [Array<String>]
374
+ #
375
+ # @param [Array<String>] array
376
+ #
377
+ def quote_array(array)
378
+ array.map do |element|
379
+ case element
380
+ when /\A([\w-]+?)=(.+)\z/
381
+ key = Regexp.last_match(1)
382
+ value = Regexp.last_match(2)
383
+ value = %("#{value}") if value =~ /[^\w\d]/
384
+ %(#{key}=#{value})
385
+ when /[\$\[\]\ ]/
386
+ %("#{element}")
387
+ else
388
+ element
389
+ end
390
+ end.join(' ')
391
+ end
392
+
393
+ # @param [Hash] xcconfig_values_by_consumer_by_key
394
+ #
395
+ # @param [#to_s] attribute
396
+ # The name of the attribute being merged
397
+ #
398
+ # @return [Hash<String, String>]
399
+ #
400
+ def merged_xcconfigs(xcconfig_values_by_consumer_by_key, attribute)
401
+ xcconfig_values_by_consumer_by_key.each_with_object({}) do |(key, values_by_consumer), xcconfig|
402
+ uniq_values = values_by_consumer.values.uniq
403
+ values_are_bools = uniq_values.all? { |v| v =~ /\A(yes|no)\z/i }
404
+ if values_are_bools
405
+ # Boolean build settings
406
+ if uniq_values.count > 1
407
+ UI.warn "Can't merge #{attribute} for pod targets: " \
408
+ "#{values_by_consumer.keys.map(&:name)}. Boolean build " \
409
+ "setting #{key} has different values."
410
+ else
411
+ xcconfig[key] = uniq_values.first
412
+ end
413
+ elsif PLURAL_SETTINGS.include? key
414
+ # Plural build settings
415
+ xcconfig[key] = uniq_values.join(' ')
416
+ elsif uniq_values.count > 1
417
+ # Singular build settings
418
+ UI.warn "Can't merge #{attribute} for pod targets: " \
419
+ "#{values_by_consumer.keys.map(&:name)}. Singular build " \
420
+ "setting #{key} has different values."
421
+ else
422
+ xcconfig[key] = uniq_values.first
423
+ end
424
+ end
425
+ end
426
+
427
+ # Filters out pod targets whose `specs` are a subset of
428
+ # another target's.
429
+ #
430
+ # @param [Array<PodTarget>] pod_targets
431
+ #
432
+ # @return [Array<PodTarget>]
433
+ #
434
+ def select_maximal_pod_targets(pod_targets)
435
+ subset_targets = []
436
+ pod_targets.uniq.combination(2) do |a, b|
437
+ if (a.specs - b.specs).empty?
438
+ subset_targets << a
439
+ elsif (b.specs - a.specs).empty?
440
+ subset_targets << b
441
+ end
442
+ end
443
+ pod_targets - subset_targets
444
+ end
445
+
446
+ # A subclass that generates build settings for a {PodTarget}
447
+ class PodTargetSettings < BuildSettings
448
+ #-------------------------------------------------------------------------#
449
+
450
+ # @!group Public API
451
+
452
+ # @see BuildSettings.build_settings_names
453
+ def self.build_settings_names
454
+ @build_settings_names | BuildSettings.build_settings_names
455
+ end
456
+
457
+ # @return [Boolean]
458
+ # whether settings are being generated for a test bundle
459
+ #
460
+ attr_reader :test_xcconfig
461
+ alias test_xcconfig? test_xcconfig
462
+
463
+ # @return [Specification]
464
+ # The test specification these build settings are for or `nil`.
465
+ #
466
+ attr_reader :test_spec
467
+
468
+ # Initializes a new instance
469
+ #
470
+ # @param [PodTarget] target
471
+ # see {#target}
472
+ #
473
+ # @param [Specification] test_spec
474
+ # see {#test_spec}
475
+ #
476
+ def initialize(target, test_spec = nil)
477
+ super(target)
478
+ @test_spec = test_spec
479
+ @test_xcconfig = !test_spec.nil?
480
+ end
481
+
482
+ # @return [Xcodeproj::Xconfig]
483
+ define_build_settings_method :xcconfig, :memoized => true do
484
+ xcconfig = super()
485
+ xcconfig.merge(merged_pod_target_xcconfigs)
486
+ end
487
+
488
+ #-------------------------------------------------------------------------#
489
+
490
+ # @!group Paths
491
+
492
+ # @return [String]
493
+ define_build_settings_method :pods_root, :build_setting => true do
494
+ '${SRCROOT}'
495
+ end
496
+
497
+ # @return [String]
498
+ define_build_settings_method :pods_target_srcroot, :build_setting => true do
499
+ target.pod_target_srcroot
500
+ end
501
+
502
+ #-------------------------------------------------------------------------#
503
+
504
+ # @!group Frameworks
505
+
506
+ # @return [Array<String>]
507
+ define_build_settings_method :consumer_frameworks, :memoized => true do
508
+ spec_consumers.flat_map(&:frameworks)
509
+ end
510
+
511
+ # @return [Array<String>]
512
+ define_build_settings_method :frameworks, :memoized => true, :sorted => true, :uniqued => true do
513
+ return [] if (!target.requires_frameworks? || target.static_framework?) && !test_xcconfig?
514
+
515
+ frameworks = []
516
+ frameworks.concat consumer_frameworks
517
+ if test_xcconfig? || (target.should_build? && target.requires_frameworks? && !target.static_framework?)
518
+ frameworks.concat vendored_static_frameworks.map { |l| File.basename(l, '.framework') }
519
+ end
520
+ if test_xcconfig?
521
+ frameworks.concat vendored_dynamic_frameworks.map { |l| File.basename(l, '.framework') }
522
+ frameworks.concat dependent_targets.flat_map { |pt| pt.build_settings.frameworks_to_import }
523
+ end
524
+ frameworks
525
+ end
526
+
527
+ # @return [Array<String>]
528
+ define_build_settings_method :static_frameworks_to_import, :memoized => true do
529
+ static_frameworks_to_import = []
530
+ static_frameworks_to_import.concat vendored_static_frameworks.map { |f| File.basename(f, '.framework') } unless target.should_build? && target.requires_frameworks? && !target.static_framework?
531
+ static_frameworks_to_import << target.product_basename if target.should_build? && target.requires_frameworks? && target.static_framework?
532
+ static_frameworks_to_import
533
+ end
534
+
535
+ # @return [Array<String>]
536
+ define_build_settings_method :dynamic_frameworks_to_import, :memoized => true do
537
+ dynamic_frameworks_to_import = vendored_dynamic_frameworks.map { |f| File.basename(f, '.framework') }
538
+ dynamic_frameworks_to_import << target.product_basename if target.should_build? && target.requires_frameworks? && !target.static_framework?
539
+ dynamic_frameworks_to_import.concat consumer_frameworks
540
+ dynamic_frameworks_to_import
541
+ end
542
+
543
+ # @return [Array<String>]
544
+ define_build_settings_method :weak_frameworks, :memoized => true, :sorted => true, :uniqued => true do
545
+ return [] if (!target.requires_frameworks? || target.static_framework?) && !test_xcconfig?
546
+
547
+ weak_frameworks = spec_consumers.flat_map(&:weak_frameworks)
548
+ weak_frameworks.concat dependent_targets.flat_map { |pt| pt.build_settings.weak_frameworks_to_import }
549
+ weak_frameworks
550
+ end
551
+
552
+ # @return [Array<String>]
553
+ define_build_settings_method :frameworks_to_import, :memoized => true, :sorted => true, :uniqued => true do
554
+ static_frameworks_to_import + dynamic_frameworks_to_import
555
+ end
556
+
557
+ # @return [Array<String>]
558
+ define_build_settings_method :weak_frameworks_to_import, :memoized => true, :sorted => true, :uniqued => true do
559
+ spec_consumers.flat_map(&:weak_frameworks)
560
+ end
561
+
562
+ # @return [Array<String>]
563
+ define_build_settings_method :framework_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
564
+ paths = super().dup
565
+ paths.concat dependent_targets.flat_map { |t| t.build_settings.framework_search_paths_to_import }
566
+ paths.concat framework_search_paths_to_import
567
+ paths.delete(target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)) unless test_xcconfig?
568
+ paths
569
+ end
570
+
571
+ # @return [String]
572
+ define_build_settings_method :framework_header_search_path, :memoized => true do
573
+ return unless target.requires_frameworks?
574
+ "#{target.build_product_path}/Headers"
575
+ end
576
+
577
+ # @return [Array<String>]
578
+ define_build_settings_method :vendored_framework_search_paths, :memoized => true do
579
+ file_accessors.flat_map(&:vendored_frameworks).map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
580
+ end
581
+
582
+ # @return [Array<String>]
583
+ define_build_settings_method :framework_search_paths_to_import, :memoized => true do
584
+ paths = framework_search_paths_to_import_developer_frameworks(consumer_frameworks)
585
+ paths.concat vendored_framework_search_paths
586
+ return paths unless target.requires_frameworks? && target.should_build?
587
+
588
+ paths + [target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)]
589
+ end
590
+
591
+ # @return [Array<String>]
592
+ define_build_settings_method :vendored_static_frameworks, :memoized => true do
593
+ file_accessors.flat_map(&:vendored_static_frameworks)
594
+ end
595
+
596
+ # @return [Array<String>]
597
+ define_build_settings_method :vendored_dynamic_frameworks, :memoized => true do
598
+ file_accessors.flat_map(&:vendored_dynamic_frameworks)
599
+ end
600
+
601
+ #-------------------------------------------------------------------------#
602
+
603
+ # @!group Libraries
604
+
605
+ # Converts array of library path references to just the names to use
606
+ # link each library, e.g. from '/path/to/libSomething.a' to 'Something'
607
+ #
608
+ # @param [Array<String>] libraries
609
+ #
610
+ # @return [Array<String>]
611
+ #
612
+ def linker_names_from_libraries(libraries)
613
+ libraries.map { |l| File.basename(l, l.extname).sub(/\Alib/, '') }
614
+ end
615
+
616
+ # @return [Array<String>]
617
+ define_build_settings_method :libraries, :memoized => true, :sorted => true, :uniqued => true do
618
+ return [] if (!target.requires_frameworks? || target.static_framework?) && !test_xcconfig?
619
+
620
+ libraries = []
621
+ if test_xcconfig? || target.requires_frameworks? && !target.static_framework?
622
+ libraries.concat linker_names_from_libraries(vendored_static_libraries)
623
+ libraries.concat libraries_to_import
624
+ end
625
+ if test_xcconfig?
626
+ libraries.concat dependent_targets.flat_map { |pt| pt.build_settings.dynamic_libraries_to_import }
627
+ libraries.concat dependent_targets.flat_map { |pt| pt.build_settings.static_libraries_to_import }
628
+ end
629
+ libraries
630
+ end
631
+
632
+ # @return [Array<String>]
633
+ define_build_settings_method :static_libraries_to_import, :memoized => true do
634
+ static_libraries_to_import = []
635
+ unless target.should_build? && target.requires_frameworks? && !target.static_framework?
636
+ static_libraries_to_import.concat linker_names_from_libraries(vendored_static_libraries)
637
+ end
638
+ static_libraries_to_import << target.product_basename if target.should_build? && !target.requires_frameworks?
639
+ static_libraries_to_import
640
+ end
641
+
642
+ # @return [Array<String>]
643
+ define_build_settings_method :dynamic_libraries_to_import, :memoized => true do
644
+ linker_names_from_libraries(vendored_dynamic_libraries) +
645
+ spec_consumers.flat_map(&:libraries)
646
+ end
647
+
648
+ # @return [Array<String>]
649
+ define_build_settings_method :libraries_to_import, :memoized => true, :sorted => true, :uniqued => true do
650
+ static_libraries_to_import + dynamic_libraries_to_import
651
+ end
652
+
653
+ # @return [Array<String>]
654
+ define_build_settings_method :library_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
655
+ return [] if (!target.requires_frameworks? || target.static_framework?) && !test_xcconfig?
656
+
657
+ vendored = library_search_paths_to_import.dup
658
+ vendored.concat dependent_targets.flat_map { |t| t.build_settings.vendored_dynamic_library_search_paths }
659
+ if test_xcconfig?
660
+ vendored.concat dependent_targets.flat_map { |t| t.build_settings.library_search_paths_to_import }
661
+ else
662
+ vendored.delete(target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE))
663
+ end
664
+ vendored
665
+ end
666
+
667
+ # @return [Array<String>]
668
+ define_build_settings_method :vendored_static_libraries, :memoized => true do
669
+ file_accessors.flat_map(&:vendored_static_libraries)
670
+ end
671
+
672
+ # @return [Array<String>]
673
+ define_build_settings_method :vendored_dynamic_libraries, :memoized => true do
674
+ file_accessors.flat_map(&:vendored_dynamic_libraries)
675
+ end
676
+
677
+ # @return [Array<String>]
678
+ define_build_settings_method :vendored_static_library_search_paths, :memoized => true do
679
+ vendored_static_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
680
+ end
681
+
682
+ # @return [Array<String>]
683
+ define_build_settings_method :vendored_dynamic_library_search_paths, :memoized => true do
684
+ vendored_dynamic_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
685
+ end
686
+
687
+ # @return [Array<String>]
688
+ define_build_settings_method :library_search_paths_to_import, :memoized => true do
689
+ vendored_library_search_paths = vendored_static_library_search_paths + vendored_dynamic_library_search_paths
690
+ return vendored_library_search_paths if target.requires_frameworks? || !target.should_build?
691
+
692
+ vendored_library_search_paths << target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
693
+ end
694
+
695
+ #-------------------------------------------------------------------------#
696
+
697
+ # @!group Clang
698
+
699
+ # @return [Array<String>]
700
+ define_build_settings_method :module_map_files, :memoized => true do
701
+ dependent_targets.map { |t| t.build_settings.module_map_file_to_import }.compact.sort
702
+ end
703
+
704
+ # @return [Array<String>]
705
+ define_build_settings_method :module_map_file_to_import, :memoized => true do
706
+ return unless target.should_build?
707
+ return if target.requires_frameworks?
708
+ return unless target.defines_module?
709
+
710
+ if target.uses_swift?
711
+ # for swift, we have a custom build phase that copies in the module map, appending the .Swift module
712
+ "${PODS_CONFIGURATION_BUILD_DIR}/#{target.label}/#{target.product_module_name}.modulemap"
713
+ else
714
+ "${PODS_ROOT}/#{target.module_map_path.relative_path_from(target.sandbox.root)}"
715
+ end
716
+ end
717
+
718
+ # @return [Array<String>]
719
+ define_build_settings_method :header_search_paths, :build_setting => true, :memoized => true, :sorted => true do
720
+ target.header_search_paths(:include_dependent_targets_for_test_spec => test_spec)
721
+ end
722
+
723
+ # @return [Array<String>]
724
+ define_build_settings_method :public_header_search_paths, :memoized => true, :sorted => true do
725
+ target.header_search_paths(:include_dependent_targets_for_test_spec => test_xcconfig?, :include_private_headers => false)
726
+ end
727
+
728
+ #-------------------------------------------------------------------------#
729
+
730
+ # @!group Swift
731
+
732
+ # @return [Array<String>]
733
+ define_build_settings_method :other_swift_flags, :build_setting => true, :memoized => true do
734
+ return unless target.uses_swift?
735
+ flags = super()
736
+ flags << '-suppress-warnings' if target.inhibit_warnings?
737
+ if !target.requires_frameworks? && target.defines_module? && !test_xcconfig?
738
+ flags.concat %w( -import-underlying-module -Xcc -fmodule-map-file=${SRCROOT}/${MODULEMAP_FILE} )
739
+ end
740
+ flags
741
+ end
742
+
743
+ # @return [Array<String>]
744
+ define_build_settings_method :swift_include_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
745
+ paths = dependent_targets.flat_map { |t| t.build_settings.swift_include_paths_to_import }
746
+ paths.concat swift_include_paths_to_import if test_xcconfig?
747
+ paths
748
+ end
749
+
750
+ # @return [Array<String>]
751
+ define_build_settings_method :swift_include_paths_to_import, :memoized => true do
752
+ return [] unless target.uses_swift? && !target.requires_frameworks?
753
+
754
+ [target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)]
755
+ end
756
+
757
+ #-------------------------------------------------------------------------#
758
+
759
+ # @!group Linking
760
+
761
+ # @return [Boolean] whether the `-ObjC` linker flag is required.
762
+ #
763
+ # @note this is only true when generating build settings for a test bundle
764
+ #
765
+ def requires_objc_linker_flag?
766
+ test_xcconfig?
767
+ end
768
+
769
+ # @return [Boolean] whether the `-fobjc-arc` linker flag is required.
770
+ #
771
+ define_build_settings_method :requires_fobjc_arc?, :memoized => true do
772
+ target.podfile.set_arc_compatibility_flag? &&
773
+ file_accessors.any? { |fa| fa.spec_consumer.requires_arc? }
774
+ end
775
+
776
+ # @return [Array<String>]
777
+ define_build_settings_method :ld_runpath_search_paths, :build_setting => true, :memoized => true do
778
+ return unless test_xcconfig?
779
+ _ld_runpath_search_paths(:test_bundle => true)
780
+ end
781
+
782
+ #-------------------------------------------------------------------------#
783
+
784
+ # @!group Packaging
785
+
786
+ # @return [String]
787
+ define_build_settings_method :skip_install, :build_setting => true do
788
+ 'YES'
789
+ end
790
+
791
+ # @return [String]
792
+ define_build_settings_method :product_bundle_identifier, :build_setting => true do
793
+ 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}'
794
+ end
795
+
796
+ # @return [String]
797
+ define_build_settings_method :configuration_build_dir, :build_setting => true, :memoized => true do
798
+ return if test_xcconfig?
799
+ target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
800
+ end
801
+
802
+ #-------------------------------------------------------------------------#
803
+
804
+ # @!group Target Properties
805
+
806
+ # @return [Array<PodTarget>]
807
+ define_build_settings_method :dependent_targets, :memoized => true do
808
+ select_maximal_pod_targets(
809
+ if test_xcconfig?
810
+ target.dependent_targets_for_test_spec(test_spec)
811
+ else
812
+ target.recursive_dependent_targets
813
+ end,
814
+ )
815
+ end
816
+
817
+ # Returns the +pod_target_xcconfig+ for the pod target and its spec
818
+ # consumers grouped by keys
819
+ #
820
+ # @return [Hash{String,Hash{Target,String}]
821
+ #
822
+ def pod_target_xcconfig_values_by_consumer_by_key
823
+ spec_consumers.each_with_object({}) do |spec_consumer, hash|
824
+ spec_consumer.pod_target_xcconfig.each do |k, v|
825
+ (hash[k] ||= {})[spec_consumer] = v
826
+ end
827
+ end
828
+ end
829
+
830
+ # Merges the +pod_target_xcconfig+ for all pod targets into a
831
+ # single hash and warns on conflicting definitions.
832
+ #
833
+ # @return [Hash{String, String}]
834
+ #
835
+ define_build_settings_method :merged_pod_target_xcconfigs, :memoized => true do
836
+ merged_xcconfigs(pod_target_xcconfig_values_by_consumer_by_key, :pod_target_xcconfig)
837
+ end
838
+
839
+ # @return [Array<Sandbox::FileAccessor>]
840
+ define_build_settings_method :file_accessors, :memoized => true do
841
+ target.file_accessors.select { |fa| fa.spec.test_specification? == test_xcconfig? }
842
+ end
843
+
844
+ # @return [Array<Specification::Consumer>]
845
+ define_build_settings_method :spec_consumers, :memoized => true do
846
+ target.spec_consumers.select { |c| c.spec.test_specification? == test_xcconfig? }
847
+ end
848
+
849
+ #-------------------------------------------------------------------------#
850
+ end
851
+
852
+ # A subclass that generates build settings for a `PodTarget`
853
+ class AggregateTargetSettings < BuildSettings
854
+ #-------------------------------------------------------------------------#
855
+
856
+ # @!group Public API
857
+
858
+ # @see BuildSettings.build_settings_names
859
+ def self.build_settings_names
860
+ @build_settings_names | BuildSettings.build_settings_names
861
+ end
862
+
863
+ # @return [String]
864
+ # The build configuration these settings will be used for
865
+ attr_reader :configuration_name
866
+
867
+ # Intializes a new instance
868
+ #
869
+ # @param [AggregateTarget] target
870
+ # see {#target}
871
+ #
872
+ # @param [String] configuration_name
873
+ # see {#configuration_name}
874
+ #
875
+ def initialize(target, configuration_name)
876
+ super(target)
877
+ @configuration_name = configuration_name
878
+ end
879
+
880
+ # @return [Xcodeproj::Config] xcconfig
881
+ define_build_settings_method :xcconfig, :memoized => true do
882
+ xcconfig = super()
883
+ xcconfig.merge(merged_user_target_xcconfigs)
884
+ end
885
+
886
+ #-------------------------------------------------------------------------#
887
+
888
+ # @!group Paths
889
+
890
+ # @return [String]
891
+ define_build_settings_method :pods_podfile_dir_path, :build_setting => true, :memoized => true do
892
+ target.podfile_dir_relative_path
893
+ end
894
+
895
+ # @return [String]
896
+ define_build_settings_method :pods_root, :build_setting => true, :memoized => true do
897
+ target.relative_pods_root
898
+ end
899
+
900
+ #-------------------------------------------------------------------------#
901
+
902
+ # @!group Frameworks
903
+
904
+ # @return [Array<String>]
905
+ define_build_settings_method :frameworks, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :dynamic_frameworks_to_import do
906
+ []
907
+ end
908
+
909
+ # @return [Array<String>]
910
+ define_build_settings_method :weak_frameworks, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :weak_frameworks do
911
+ []
912
+ end
913
+
914
+ # @return [Array<String>]
915
+ define_build_settings_method :framework_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :framework_search_paths_to_import do
916
+ []
917
+ end
918
+
919
+ #-------------------------------------------------------------------------#
920
+
921
+ # @!group Libraries
922
+
923
+ # @return [Array<String>]
924
+ define_build_settings_method :libraries, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :dynamic_libraries_to_import do
925
+ []
926
+ end
927
+
928
+ # @return [Array<String>]
929
+ define_build_settings_method :library_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :vendored_dynamic_library_search_paths do
930
+ []
931
+ end
932
+
933
+ #-------------------------------------------------------------------------#
934
+
935
+ # @!group Clang
936
+
937
+ # @return [Array<String>]
938
+ define_build_settings_method :header_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
939
+ paths = []
940
+
941
+ if !target.requires_frameworks? || !pod_targets.all?(&:should_build?)
942
+ paths.concat target.sandbox.public_headers.search_paths(target.platform)
943
+ end
944
+
945
+ # Make frameworks headers discoverable with any syntax (quotes,
946
+ # brackets, @import, etc.)
947
+ paths.concat pod_targets.
948
+ select { |pt| pt.requires_frameworks? && pt.should_build? }.
949
+ map { |pt| pt.build_settings.framework_header_search_path }
950
+
951
+ paths.concat target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).header_search_paths }
952
+
953
+ paths
954
+ end
955
+
956
+ # @return [Array<String>]
957
+ define_build_settings_method :other_cflags, :build_setting => true, :memoized => true do
958
+ flags = super()
959
+
960
+ pod_targets_inhibiting_warnings = pod_targets.select(&:inhibit_warnings?)
961
+
962
+ silenced_headers = []
963
+ silenced_frameworks = []
964
+ pod_targets_inhibiting_warnings.each do |pt|
965
+ if pt.requires_frameworks? && pt.should_build?
966
+ silenced_headers.append pt.build_settings.framework_header_search_path
967
+ else
968
+ silenced_headers.concat pt.build_settings.public_header_search_paths
969
+ end
970
+ silenced_frameworks.concat pt.build_settings.framework_search_paths_to_import
971
+ end
972
+
973
+ flags += silenced_headers.uniq.flat_map { |p| ['-isystem', p] }
974
+ flags += silenced_frameworks.uniq.flat_map { |p| ['-iframework', p] }
975
+
976
+ flags
977
+ end
978
+
979
+ # @return [Array<String>]
980
+ define_build_settings_method :module_map_files, :memoized => true, :sorted => true, :uniqued => true, :compacted => true, :from_search_paths_aggregate_targets => :module_map_file_to_import do
981
+ pod_targets.map { |t| t.build_settings.module_map_file_to_import }
982
+ end
983
+
984
+ #-------------------------------------------------------------------------#
985
+
986
+ # @!group Swift
987
+
988
+ # @see BuildSettings#other_swift_flags_without_swift?
989
+ def other_swift_flags_without_swift?
990
+ module_map_files.any?
991
+ end
992
+
993
+ # @return [Array<String>]
994
+ define_build_settings_method :swift_include_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true, :from_pod_targets_to_link => true, :from_search_paths_aggregate_targets => :swift_include_paths_to_import do
995
+ []
996
+ end
997
+
998
+ # @return [String]
999
+ define_build_settings_method :always_embed_swift_standard_libraries, :build_setting => true, :memoized => true do
1000
+ return unless must_embed_swift?
1001
+ return if target_swift_version < EMBED_STANDARD_LIBRARIES_MINIMUM_VERSION
1002
+
1003
+ 'YES'
1004
+ end
1005
+
1006
+ # @return [String]
1007
+ define_build_settings_method :embedded_content_contains_swift, :build_setting => true, :memoized => true do
1008
+ return unless must_embed_swift?
1009
+ return if target_swift_version >= EMBED_STANDARD_LIBRARIES_MINIMUM_VERSION
1010
+
1011
+ 'YES'
1012
+ end
1013
+
1014
+ # @return [Boolean]
1015
+ define_build_settings_method :must_embed_swift?, :memoized => true do
1016
+ !target.requires_host_target? && pod_targets.any?(&:uses_swift?)
1017
+ end
1018
+
1019
+ #-------------------------------------------------------------------------#
1020
+
1021
+ # @!group Linking
1022
+
1023
+ # @return [Array<String>]
1024
+ define_build_settings_method :ld_runpath_search_paths, :build_setting => true, :memoized => true, :uniqued => true do
1025
+ return unless target.requires_frameworks? || any_vendored_dynamic_artifacts?
1026
+ symbol_type = target.user_targets.map(&:symbol_type).uniq.first
1027
+ test_bundle = symbol_type == :octest_bundle || symbol_type == :unit_test_bundle || symbol_type == :ui_test_bundle
1028
+ _ld_runpath_search_paths(:requires_host_target => target.requires_host_target?, :test_bundle => test_bundle)
1029
+ end
1030
+
1031
+ # @return [Boolean]
1032
+ define_build_settings_method :any_vendored_dynamic_artifacts?, :memoized => true do
1033
+ pod_targets.any? do |pt|
1034
+ pt.file_accessors.any? do |fa|
1035
+ fa.vendored_dynamic_artifacts.any?
1036
+ end
1037
+ end
1038
+ end
1039
+
1040
+ # @return [Boolean]
1041
+ define_build_settings_method :requires_objc_linker_flag?, :memoized => true do
1042
+ !target.requires_frameworks? ||
1043
+ pod_targets.any?(&:static_framework?) ||
1044
+ pod_targets.flat_map(&:file_accessors).any? { |fa| !fa.vendored_static_artifacts.empty? }
1045
+ end
1046
+
1047
+ # @return [Boolean]
1048
+ define_build_settings_method :requires_fobjc_arc?, :memoized => true do
1049
+ target.podfile.set_arc_compatibility_flag? &&
1050
+ target.spec_consumers.any?(&:requires_arc?)
1051
+ end
1052
+
1053
+ #-------------------------------------------------------------------------#
1054
+
1055
+ # @!group Target Properties
1056
+
1057
+ # @return [Version] the SWIFT_VERSION of the target being integrated
1058
+ #
1059
+ define_build_settings_method :target_swift_version, :memoized => true, :frozen => false do
1060
+ swift_version = target.target_definition.swift_version
1061
+ swift_version = nil if swift_version.blank?
1062
+ Version.new(swift_version)
1063
+ end
1064
+
1065
+ EMBED_STANDARD_LIBRARIES_MINIMUM_VERSION = Version.new('2.3')
1066
+ private_constant :EMBED_STANDARD_LIBRARIES_MINIMUM_VERSION
1067
+
1068
+ # Returns the {PodTarget}s which are active for the current
1069
+ # configuration name.
1070
+ #
1071
+ # @return [Array<PodTarget>]
1072
+ #
1073
+ define_build_settings_method :pod_targets, :memoized => true do
1074
+ target.pod_targets_for_build_configuration(configuration_name)
1075
+ end
1076
+
1077
+ # @return [Array<PodTarget>]
1078
+ define_build_settings_method :pod_targets_to_link, :memoized => true do
1079
+ pod_targets -
1080
+ target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).pod_targets_to_link }
1081
+ end
1082
+
1083
+ # @return [Array<PodTarget>]
1084
+ define_build_settings_method :search_paths_aggregate_target_pod_target_build_settings, :memoized => true, :uniqued => true do
1085
+ pod_targets = target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).pod_targets }
1086
+ pod_targets = select_maximal_pod_targets(pod_targets)
1087
+ pod_targets.flat_map(&:build_settings)
1088
+ end
1089
+
1090
+ # Returns the +user_target_xcconfig+ for all pod targets and their spec
1091
+ # consumers grouped by keys
1092
+ #
1093
+ # @return [Hash{String,Hash{Target,String}]
1094
+ #
1095
+ def user_target_xcconfig_values_by_consumer_by_key
1096
+ targets = (pod_targets + target.search_paths_aggregate_targets.flat_map(&:pod_targets)).uniq
1097
+ targets.each_with_object({}) do |target, hash|
1098
+ target.spec_consumers.each do |spec_consumer|
1099
+ spec_consumer.user_target_xcconfig.each do |k, v|
1100
+ # TODO: Need to decide how we are going to ensure settings like these
1101
+ # are always excluded from the user's project.
1102
+ #
1103
+ # See https://github.com/CocoaPods/CocoaPods/issues/1216
1104
+ next if k == 'USE_HEADERMAP'
1105
+ (hash[k] ||= {})[spec_consumer] = v
1106
+ end
1107
+ end
1108
+ end
1109
+ end
1110
+
1111
+ # Merges the +user_target_xcconfig+ for all pod targets into a
1112
+ # single hash and warns on conflicting definitions.
1113
+ #
1114
+ # @return [Hash{String, String}]
1115
+ #
1116
+ define_build_settings_method :merged_user_target_xcconfigs, :memoized => true do
1117
+ merged_xcconfigs(user_target_xcconfig_values_by_consumer_by_key, :user_target_xcconfig)
1118
+ end
1119
+
1120
+ #-------------------------------------------------------------------------#
1121
+ end
1122
+ end
1123
+ end
1124
+ end