cocoapods 1.5.2 → 1.6.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.
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
@@ -1,32 +1,113 @@
1
+ require 'cocoapods/target/framework_paths'
2
+
1
3
  module Pod
2
4
  # Stores the information relative to the target used to cluster the targets
3
5
  # of the single Pods. The client targets will then depend on this one.
4
6
  #
5
7
  class AggregateTarget < Target
8
+ # Product types where the product's frameworks must be embedded in a host target
9
+ #
10
+ EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES = [:app_extension, :framework, :static_library, :messages_extension, :watch_extension, :xpc_service].freeze
11
+
6
12
  # @return [TargetDefinition] the target definition of the Podfile that
7
13
  # generated this target.
14
+ #
8
15
  attr_reader :target_definition
9
16
 
10
- # Product types where the product's frameworks must be embedded in a host target
17
+ # @return [Pathname] the folder where the client is stored used for
18
+ # computing the relative paths. If integrating it should be the
19
+ # folder where the user project is stored, otherwise it should
20
+ # be the installation root.
11
21
  #
12
- EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES = [:app_extension, :framework, :static_library, :messages_extension, :watch_extension, :xpc_service].freeze
22
+ attr_reader :client_root
13
23
 
14
- # Initialize a new instance
24
+ # @return [Xcodeproj::Project] the user project that this target will
25
+ # integrate as identified by the analyzer.
26
+ #
27
+ attr_reader :user_project
28
+
29
+ # @return [Array<String>] the list of the UUIDs of the user targets that
30
+ # will be integrated by this target as identified by the analyzer.
31
+ #
32
+ # @note The target instances are not stored to prevent editing different
33
+ # instances.
34
+ #
35
+ attr_reader :user_target_uuids
36
+
37
+ # @return [Hash<String, Xcodeproj::Config>] Map from configuration name to
38
+ # configuration file for the target
39
+ #
40
+ # @note The configurations are generated by the {TargetInstaller} and
41
+ # used by {UserProjectIntegrator} to check for any overridden
42
+ # values.
43
+ #
44
+ attr_reader :xcconfigs
45
+
46
+ # @return [Array<PodTarget>] The dependencies for this target.
47
+ #
48
+ attr_reader :pod_targets
49
+
50
+ # @return [Array<AggregateTarget>] The aggregate targets whose pods this
51
+ # target must be able to import, but will not directly link against.
15
52
  #
16
- # @param [TargetDefinition] target_definition @see target_definition
17
- # @param [Sandbox] sandbox @see sandbox
53
+ attr_reader :search_paths_aggregate_targets
54
+
55
+ # Initialize a new instance
18
56
  #
19
- def initialize(target_definition, sandbox)
20
- raise "Can't initialize an AggregateTarget with an abstract TargetDefinition" if target_definition.abstract?
21
- super()
57
+ # @param [Sandbox] sandbox @see Target#sandbox
58
+ # @param [Boolean] host_requires_frameworks @see Target#host_requires_frameworks
59
+ # @param [Hash{String=>Symbol}] user_build_configurations @see Target#user_build_configurations
60
+ # @param [Array<String>] archs @see Target#archs
61
+ # @param [Platform] platform @see #Target#platform
62
+ # @param [TargetDefinition] target_definition @see #target_definition
63
+ # @param [Pathname] client_root @see #client_root
64
+ # @param [Xcodeproj::Project] user_project @see #user_project
65
+ # @param [Array<String>] user_target_uuids @see #user_target_uuids
66
+ # @param [Hash{String=>Array<PodTarget>}] pod_targets_for_build_configuration @see #pod_targets_for_build_configuration
67
+ #
68
+ def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition,
69
+ client_root, user_project, user_target_uuids, pod_targets_for_build_configuration)
70
+ super(sandbox, host_requires_frameworks, user_build_configurations, archs, platform)
71
+ raise "Can't initialize an AggregateTarget without a TargetDefinition!" if target_definition.nil?
72
+ raise "Can't initialize an AggregateTarget with an abstract TargetDefinition!" if target_definition.abstract?
22
73
  @target_definition = target_definition
23
- @sandbox = sandbox
24
- @pod_targets = []
74
+ @client_root = client_root
75
+ @user_project = user_project
76
+ @user_target_uuids = user_target_uuids
77
+ @pod_targets_for_build_configuration = pod_targets_for_build_configuration
78
+ @pod_targets = pod_targets_for_build_configuration.values.flatten.uniq
25
79
  @search_paths_aggregate_targets = []
26
- @file_accessors = []
27
80
  @xcconfigs = {}
28
81
  end
29
82
 
83
+ # Merges this aggregate target with additional pod targets that are part of embedded aggregate targets.
84
+ #
85
+ # @param [Hash{String=>Array<PodTarget>}] embedded_pod_targets_for_build_configuration
86
+ # The pod targets to merge with.
87
+ #
88
+ # @return [AggregateTarget] a new instance of this aggregate target with additional pod targets to be used from
89
+ # pod targets of embedded aggregate targets.
90
+ #
91
+ def merge_embedded_pod_targets(embedded_pod_targets_for_build_configuration)
92
+ merged = @pod_targets_for_build_configuration.merge(embedded_pod_targets_for_build_configuration) do |_, before, after|
93
+ (before + after).uniq
94
+ end
95
+ AggregateTarget.new(sandbox, host_requires_frameworks, user_build_configurations, archs, platform,
96
+ target_definition, client_root, user_project, user_target_uuids, merged).tap do |aggregate_target|
97
+ aggregate_target.search_paths_aggregate_targets.concat(search_paths_aggregate_targets).freeze
98
+ end
99
+ end
100
+
101
+ def build_settings(configuration_name = nil)
102
+ if configuration_name
103
+ @build_settings[configuration_name] ||
104
+ raise(ArgumentError, "#{self} does not contain a build setting for the #{configuration_name.inspect} configuration, only #{@build_settings.keys.inspect}")
105
+ else
106
+ @build_settings.each_value.first ||
107
+ raise(ArgumentError, "#{self} does not contain any build settings")
108
+ end
109
+ end
110
+
30
111
  # @return [Boolean] True if the user_target refers to a
31
112
  # library (framework, static or dynamic lib).
32
113
  #
@@ -61,38 +142,12 @@ module Pod
61
142
  target_definition.label.to_s
62
143
  end
63
144
 
64
- # @return [String] the name to use for the source code module constructed
65
- # for this target, and which will be used to import the module in
66
- # implementation source files.
67
- #
68
- def product_module_name
69
- c99ext_identifier(label)
70
- end
71
-
72
- # @return [Platform] the platform for this target.
73
- #
74
- def platform
75
- @platform ||= target_definition.platform
76
- end
77
-
78
145
  # @return [Podfile] The podfile which declares the dependency
79
146
  #
80
147
  def podfile
81
148
  target_definition.podfile
82
149
  end
83
150
 
84
- # @return [Pathname] the folder where the client is stored used for
85
- # computing the relative paths. If integrating it should be the
86
- # folder where the user project is stored, otherwise it should
87
- # be the installation root.
88
- #
89
- attr_accessor :client_root
90
-
91
- # @return [Xcodeproj::Project] the user project that this target will
92
- # integrate as identified by the analyzer.
93
- #
94
- attr_accessor :user_project
95
-
96
151
  # @return [Pathname] the path of the user project that this target will
97
152
  # integrate as identified by the analyzer.
98
153
  #
@@ -100,14 +155,6 @@ module Pod
100
155
  user_project.path if user_project
101
156
  end
102
157
 
103
- # @return [Array<String>] the list of the UUIDs of the user targets that
104
- # will be integrated by this target as identified by the analyzer.
105
- #
106
- # @note The target instances are not stored to prevent editing different
107
- # instances.
108
- #
109
- attr_accessor :user_target_uuids
110
-
111
158
  # List all user targets that will be integrated by this #target.
112
159
  #
113
160
  # @return [Array<PBXNativeTarget>]
@@ -124,24 +171,6 @@ module Pod
124
171
  end
125
172
  end
126
173
 
127
- # @return [Hash<String, Xcodeproj::Config>] Map from configuration name to
128
- # configuration file for the target
129
- #
130
- # @note The configurations are generated by the {TargetInstaller} and
131
- # used by {UserProjectIntegrator} to check for any overridden
132
- # values.
133
- #
134
- attr_reader :xcconfigs
135
-
136
- # @return [Array<PodTarget>] The dependencies for this target.
137
- #
138
- attr_accessor :pod_targets
139
-
140
- # @return [Array<AggregateTarget>] The aggregate targets whose pods this
141
- # target must be able to import, but will not directly link against.
142
- #
143
- attr_reader :search_paths_aggregate_targets
144
-
145
174
  # @param [String] build_configuration The build configuration for which the
146
175
  # the pod targets should be returned.
147
176
  #
@@ -149,14 +178,7 @@ module Pod
149
178
  # configuration.
150
179
  #
151
180
  def pod_targets_for_build_configuration(build_configuration)
152
- @pod_targets_for_build_configuration ||= {}
153
- @pod_targets_for_build_configuration[build_configuration] ||= pod_targets.select do |pod_target|
154
- pod_target.include_in_build_config?(target_definition, build_configuration)
155
- end
156
- end
157
-
158
- def pod_targets_to_link
159
- @pod_targets_to_link ||= pod_targets.to_set - search_paths_aggregate_targets.flat_map(&:pod_targets)
181
+ @pod_targets_for_build_configuration[build_configuration] || []
160
182
  end
161
183
 
162
184
  # @return [Array<Specification>] The specifications used by this aggregate target.
@@ -189,7 +211,20 @@ module Pod
189
211
  pod_targets.any?(&:uses_swift?)
190
212
  end
191
213
 
192
- # @return [Hash{String => Array<Hash{Symbol => [String]}>}] The vendored dynamic artifacts and framework target
214
+ # @return [Boolean] Whether the target contains any resources
215
+ #
216
+ def includes_resources?
217
+ !resource_paths_by_config.values.all?(&:empty?)
218
+ end
219
+
220
+ # @return [Boolean] Whether the target contains framework to be embedded into
221
+ # the user target
222
+ #
223
+ def includes_frameworks?
224
+ !framework_paths_by_config.values.all?(&:empty?)
225
+ end
226
+
227
+ # @return [Hash{String => Array<FrameworkPaths>}] The vendored dynamic artifacts and framework target
193
228
  # input and output paths grouped by config
194
229
  #
195
230
  def framework_paths_by_config
@@ -197,7 +232,10 @@ module Pod
197
232
  framework_paths_by_config = {}
198
233
  user_build_configurations.keys.each do |config|
199
234
  relevant_pod_targets = pod_targets_for_build_configuration(config)
200
- framework_paths_by_config[config] = relevant_pod_targets.flat_map { |pt| pt.framework_paths(false) }
235
+ framework_paths_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
236
+ non_test_specs = pod_target.non_test_specs.map(&:name)
237
+ pod_target.framework_paths.values_at(*non_test_specs).flatten.compact.uniq
238
+ end
201
239
  end
202
240
  framework_paths_by_config
203
241
  end
@@ -211,8 +249,12 @@ module Pod
211
249
  pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework?
212
250
  end
213
251
  user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
214
- resources_by_config[config] = (relevant_pod_targets & pod_targets_for_build_configuration(config)).flat_map do |pod_target|
215
- (pod_target.resource_paths(false) + [bridge_support_file].compact).uniq
252
+ targets = relevant_pod_targets & pod_targets_for_build_configuration(config)
253
+ resources_by_config[config] = targets.flat_map do |pod_target|
254
+ non_test_specs = pod_target.non_test_specs.map(&:name)
255
+ resource_paths = pod_target.resource_paths.values_at(*non_test_specs).flatten
256
+ resource_paths << bridge_support_file
257
+ resource_paths.compact.uniq
216
258
  end
217
259
  end
218
260
  end
@@ -256,11 +298,17 @@ module Pod
256
298
  "$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt"
257
299
  end
258
300
 
301
+ # @return [Pathname] The relative path of the Pods directory from user project's directory.
302
+ #
303
+ def relative_pods_root_path
304
+ sandbox.root.relative_path_from(client_root)
305
+ end
306
+
259
307
  # @return [String] The xcconfig path of the root from the `$(SRCROOT)`
260
308
  # variable of the user's project.
261
309
  #
262
310
  def relative_pods_root
263
- "${SRCROOT}/#{sandbox.root.relative_path_from(client_root)}"
311
+ "${SRCROOT}/#{relative_pods_root_path}"
264
312
  end
265
313
 
266
314
  # @return [String] The path of the Podfile directory relative to the
@@ -278,21 +326,21 @@ module Pod
278
326
  # the user project.
279
327
  #
280
328
  def xcconfig_relative_path(config_name)
281
- relative_to_srcroot(xcconfig_path(config_name)).to_s
329
+ xcconfig_path(config_name).relative_path_from(client_root).to_s
282
330
  end
283
331
 
284
332
  # @return [String] The path of the copy resources script relative to the
285
- # root of the user project.
333
+ # root of the Pods project.
286
334
  #
287
335
  def copy_resources_script_relative_path
288
- "${SRCROOT}/#{relative_to_srcroot(copy_resources_script_path)}"
336
+ "${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_path)}"
289
337
  end
290
338
 
291
339
  # @return [String] The path of the embed frameworks relative to the
292
- # root of the user project.
340
+ # root of the Pods project.
293
341
  #
294
342
  def embed_frameworks_script_relative_path
295
- "${SRCROOT}/#{relative_to_srcroot(embed_frameworks_script_path)}"
343
+ "${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_path)}"
296
344
  end
297
345
 
298
346
  private
@@ -300,16 +348,26 @@ module Pod
300
348
  # @!group Private Helpers
301
349
  #-------------------------------------------------------------------------#
302
350
 
303
- # Computes the relative path of a sandboxed file from the `$(SRCROOT)`
304
- # variable of the user's project.
351
+ # Computes the relative path of a sandboxed file from the `$(PODS_ROOT)`
352
+ # variable of the Pods's project.
305
353
  #
306
354
  # @param [Pathname] path
307
355
  # A relative path from the root of the sandbox.
308
356
  #
309
357
  # @return [String] The computed path.
310
358
  #
311
- def relative_to_srcroot(path)
312
- path.relative_path_from(client_root).to_s
359
+ def relative_to_pods_root(path)
360
+ path.relative_path_from(sandbox.root).to_s
361
+ end
362
+
363
+ def create_build_settings
364
+ settings = {}
365
+
366
+ user_build_configurations.each_key do |configuration_name|
367
+ settings[configuration_name] = BuildSettings::AggregateTargetSettings.new(self, configuration_name)
368
+ end
369
+
370
+ settings
313
371
  end
314
372
  end
315
373
  end