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
@@ -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