cocoapods 1.0.1 → 1.1.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +107 -0
  3. data/lib/cocoapods/command.rb +1 -0
  4. data/lib/cocoapods/command/repo/push.rb +26 -5
  5. data/lib/cocoapods/command/setup.rb +2 -1
  6. data/lib/cocoapods/downloader.rb +20 -0
  7. data/lib/cocoapods/downloader/cache.rb +1 -0
  8. data/lib/cocoapods/gem_version.rb +1 -1
  9. data/lib/cocoapods/generator/acknowledgements/plist.rb +1 -0
  10. data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +9 -2
  11. data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +5 -4
  12. data/lib/cocoapods/installer.rb +41 -205
  13. data/lib/cocoapods/installer/analyzer.rb +65 -1
  14. data/lib/cocoapods/installer/analyzer/pod_variant.rb +9 -3
  15. data/lib/cocoapods/installer/analyzer/target_inspector.rb +24 -0
  16. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +23 -6
  17. data/lib/cocoapods/installer/xcode.rb +7 -0
  18. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +265 -0
  19. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +202 -0
  20. data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +314 -0
  21. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +397 -0
  22. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +214 -0
  23. data/lib/cocoapods/resolver.rb +1 -2
  24. data/lib/cocoapods/target/aggregate_target.rb +19 -0
  25. data/lib/cocoapods/target/pod_target.rb +15 -2
  26. data/lib/cocoapods/user_interface.rb +6 -1
  27. data/lib/cocoapods/user_interface/error_report.rb +7 -0
  28. data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
  29. data/lib/cocoapods/validator.rb +15 -7
  30. metadata +42 -19
  31. data/lib/cocoapods/installer/file_references_installer.rb +0 -310
  32. data/lib/cocoapods/installer/target_installer.rb +0 -210
  33. data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +0 -191
  34. data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +0 -389
@@ -226,6 +226,61 @@ module Pod
226
226
 
227
227
  private
228
228
 
229
+ # Copies the pod_targets of any of the app embedded aggregate targets into
230
+ # their potential host aggregate target, if that potential host aggregate target's
231
+ # user_target hosts any of the app embedded aggregate targets' user_targets
232
+ #
233
+ # @param [AggregateTarget] aggregate_target the aggregate target whose user_target
234
+ # might host one or more of the embedded aggregate targets' user_targets
235
+ #
236
+ # @param [Array<AggregateTarget>] embedded_aggregate_targets the aggregate targets
237
+ # representing the embedded targets to be integrated
238
+ #
239
+ def copy_embedded_target_pod_targets_to_host(aggregate_target, embedded_aggregate_targets)
240
+ return if aggregate_target.requires_host_target?
241
+ # Get the uuids of the aggregate_target's user_targets' embedded targets if any
242
+ embedded_uuids = Set.new(aggregate_target.user_targets.map do |target|
243
+ aggregate_target.user_project.embedded_targets_in_native_target(target).map(&:uuid)
244
+ end.flatten)
245
+ return if embedded_uuids.empty?
246
+ embedded_aggregate_targets.each do |embedded_target|
247
+ next unless embedded_target.user_targets.map(&:uuid).any? do |embedded_uuid|
248
+ embedded_uuids.include? embedded_uuid
249
+ end
250
+ raise Informative, "#{aggregate_target.name} must call use_frameworks! because it is hosting an embedded target that calls use_frameworks!." unless aggregate_target.requires_frameworks?
251
+ pod_target_names = aggregate_target.pod_targets.map(&:name)
252
+ # This embedded target is hosted by the aggregate target's user_target; copy over the non-duplicate pod_targets
253
+ aggregate_target.pod_targets = aggregate_target.pod_targets + embedded_target.pod_targets.select do |pod_target|
254
+ !pod_target_names.include? pod_target.name
255
+ end
256
+ end
257
+ end
258
+
259
+ # Raises an error if there are embedded targets in the Podfile, but
260
+ # their host targets have not been declared in the Podfile
261
+ #
262
+ # @param [Array<AggregateTarget>] aggregate_targets the generated
263
+ # aggregate targets
264
+ #
265
+ # @param [Array<AggregateTarget>] embedded_aggregate_targets the aggregate targets
266
+ # representing the embedded targets to be integrated
267
+ #
268
+ def verify_host_targets_in_podfile(aggregate_targets, embedded_aggregate_targets)
269
+ aggregate_target_uuids = Set.new aggregate_targets.map(&:user_targets).flatten.map(&:uuid)
270
+ embedded_targets_missing_hosts = []
271
+ embedded_aggregate_targets.each do |target|
272
+ host_uuids = target.user_targets.map do |user_target|
273
+ target.user_project.host_targets_for_embedded_target(user_target).map(&:uuid)
274
+ end.flatten
275
+ embedded_targets_missing_hosts << target unless host_uuids.any? do |uuid|
276
+ aggregate_target_uuids.include? uuid
277
+ end
278
+ end
279
+ unless embedded_targets_missing_hosts.empty?
280
+ raise Informative, "Unable to find host target for #{embedded_targets_missing_hosts.map(&:name).join(', ')}. Please add the host targets for the embedded targets to the Podfile."
281
+ end
282
+ end
283
+
229
284
  # Creates the models that represent the targets generated by CocoaPods.
230
285
  #
231
286
  # @return [Array<AggregateTarget>]
@@ -236,6 +291,14 @@ module Pod
236
291
  aggregate_targets = specs_by_target.keys.map do |target_definition|
237
292
  generate_target(target_definition, pod_targets)
238
293
  end
294
+ if installation_options.integrate_targets?
295
+ # Copy embedded target pods that cannot have their pods embedded as frameworks to their host targets
296
+ embedded_targets = aggregate_targets.select(&:requires_host_target?).select(&:requires_frameworks?)
297
+ verify_host_targets_in_podfile(aggregate_targets, embedded_targets)
298
+ aggregate_targets.each do |target|
299
+ copy_embedded_target_pod_targets_to_host(target, embedded_targets)
300
+ end
301
+ end
239
302
  aggregate_targets.each do |target|
240
303
  target.search_paths_aggregate_targets = aggregate_targets.select do |aggregate_target|
241
304
  target.target_definition.targets_to_inherit_search_paths.include?(aggregate_target.target_definition)
@@ -277,6 +340,7 @@ module Pod
277
340
  target.pod_targets = pod_targets.select do |pod_target|
278
341
  pod_target.target_definitions.include?(target_definition)
279
342
  end
343
+
280
344
  target
281
345
  end
282
346
 
@@ -294,7 +358,7 @@ module Pod
294
358
  distinct_targets = specs_by_target.each_with_object({}) do |dependency, hash|
295
359
  target_definition, dependent_specs = *dependency
296
360
  dependent_specs.group_by(&:root).each do |root_spec, specs|
297
- pod_variant = PodVariant.new(specs, target_definition.platform, target_definition.uses_frameworks?)
361
+ pod_variant = PodVariant.new(specs, target_definition.platform, target_definition.uses_frameworks?, target_definition.swift_version)
298
362
  hash[root_spec] ||= {}
299
363
  (hash[root_spec][pod_variant] ||= []) << target_definition
300
364
  end
@@ -16,6 +16,10 @@ module Pod
16
16
  attr_accessor :requires_frameworks
17
17
  alias_method :requires_frameworks?, :requires_frameworks
18
18
 
19
+ # @return [String] the Swift version
20
+ #
21
+ attr_accessor :swift_version
22
+
19
23
  # @return [Specification] the root specification
20
24
  #
21
25
  def root_spec
@@ -28,10 +32,11 @@ module Pod
28
32
  # @param [Platform] platform @see #platform
29
33
  # @param [Bool] requires_frameworks @see #requires_frameworks?
30
34
  #
31
- def initialize(specs, platform, requires_frameworks = false)
35
+ def initialize(specs, platform, requires_frameworks = false, swift_version = nil)
32
36
  self.specs = specs
33
37
  self.platform = platform
34
38
  self.requires_frameworks = requires_frameworks
39
+ self.swift_version = swift_version
35
40
  end
36
41
 
37
42
  # @return [Bool] whether the {PodVariant} is equal to another taking all
@@ -41,7 +46,8 @@ module Pod
41
46
  self.class == other.class &&
42
47
  specs == other.specs &&
43
48
  platform == other.platform &&
44
- requires_frameworks == other.requires_frameworks
49
+ requires_frameworks == other.requires_frameworks &&
50
+ swift_version == other.swift_version
45
51
  end
46
52
  alias_method :eql?, :==
47
53
 
@@ -51,7 +57,7 @@ module Pod
51
57
  #
52
58
  # @!visibility private
53
59
  def hash
54
- [specs, platform, requires_frameworks].hash
60
+ [specs, platform, requires_frameworks, swift_version].hash
55
61
  end
56
62
  end
57
63
  end
@@ -44,6 +44,7 @@ module Pod
44
44
  result.platform = compute_platform(targets)
45
45
  result.archs = compute_archs(targets)
46
46
  result.project = user_project
47
+ result.target_definition.swift_version = compute_swift_version_from_targets(targets)
47
48
  result
48
49
  end
49
50
 
@@ -205,6 +206,29 @@ module Pod
205
206
  end
206
207
  end
207
208
  end
209
+
210
+ # Compute the Swift version for the target build configurations. If more
211
+ # than one Swift version is defined for a given target, then it will raise.
212
+ #
213
+ # @param [Array<PBXNativeTarget>] targets
214
+ # the targets that are checked for Swift versions.
215
+ #
216
+ # @return [String] the targets Swift version or nil
217
+ #
218
+ def compute_swift_version_from_targets(targets)
219
+ versions = targets.flat_map(&:build_configurations).
220
+ flat_map { |config| config.build_settings['SWIFT_VERSION'] }.
221
+ compact.
222
+ uniq
223
+ case versions.count
224
+ when 0
225
+ nil
226
+ when 1
227
+ versions.first
228
+ else
229
+ raise Informative, 'There may only be up to 1 unique SWIFT_VERSION per target.'
230
+ end
231
+ end
208
232
  end
209
233
  end
210
234
  end
@@ -20,7 +20,10 @@ module Pod
20
20
  # @return [Array<Symbol>] the symbol types, which require that the pod
21
21
  # frameworks are embedded in the output directory / product bundle.
22
22
  #
23
- EMBED_FRAMEWORK_TARGET_TYPES = [:application, :unit_test_bundle, :app_extension, :watch_extension, :watch2_extension].freeze
23
+ # @note This does not include :app_extension or :watch_extension because
24
+ # these types must have their frameworks embedded in their host targets
25
+ #
26
+ EMBED_FRAMEWORK_TARGET_TYPES = [:application, :unit_test_bundle, :ui_test_bundle, :watch2_extension].freeze
24
27
 
25
28
  # @return [String] the name of the embed frameworks phase
26
29
  #
@@ -54,6 +57,7 @@ module Pod
54
57
 
55
58
  add_pods_library
56
59
  add_embed_frameworks_script_phase
60
+ remove_embed_frameworks_script_phase_from_embedded_targets
57
61
  add_copy_resources_script_phase
58
62
  add_check_manifest_lock_script_phase
59
63
  end
@@ -110,6 +114,20 @@ module Pod
110
114
  end
111
115
  end
112
116
 
117
+ # Removes the embed frameworks build phase from embedded targets
118
+ #
119
+ # @note Older versions of CocoaPods would add this build phase to embedded
120
+ # targets. They should be removed on upgrade because embedded targets
121
+ # will have their frameworks embedded in their host targets.
122
+ #
123
+ def remove_embed_frameworks_script_phase_from_embedded_targets
124
+ native_targets.each do |native_target|
125
+ if AggregateTarget::EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES.include? native_target.symbol_type
126
+ remove_embed_frameworks_script_phase(native_target)
127
+ end
128
+ end
129
+ end
130
+
113
131
  def add_embed_frameworks_script_phase_to_target(native_target)
114
132
  phase = create_or_update_build_phase(native_target, EMBED_FRAMEWORK_PHASE_NAME)
115
133
  script_path = target.embed_frameworks_script_relative_path
@@ -121,7 +139,7 @@ module Pod
121
139
  # @param [PBXNativeTarget] native_target
122
140
  #
123
141
  def remove_embed_frameworks_script_phase(native_target)
124
- embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name == EMBED_FRAMEWORK_PHASE_NAME }
142
+ embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name && bp.name.end_with?(EMBED_FRAMEWORK_PHASE_NAME) }
125
143
  return unless embed_build_phase.present?
126
144
  native_target.build_phases.delete(embed_build_phase)
127
145
  end
@@ -157,10 +175,9 @@ module Pod
157
175
  native_target.build_phases.unshift(phase).uniq! unless native_target.build_phases.first == phase
158
176
  phase.shell_script = <<-SH.strip_heredoc
159
177
  diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
160
- if [[ $? != 0 ]] ; then
161
- cat << EOM
162
- error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
163
- EOM
178
+ if [ $? != 0 ] ; then
179
+ # print error to STDERR
180
+ echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
164
181
  exit 1
165
182
  fi
166
183
  SH
@@ -0,0 +1,7 @@
1
+ module Pod
2
+ class Installer
3
+ class Xcode
4
+ autoload :PodsProjectGenerator, 'cocoapods/installer/xcode/pods_project_generator'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,265 @@
1
+ module Pod
2
+ class Installer
3
+ class Xcode
4
+ # The {PodsProjectGenerator} handles generation of the 'Pods/Pods.xcodeproj'
5
+ #
6
+ class PodsProjectGenerator
7
+ require 'cocoapods/installer/xcode/pods_project_generator/target_installer'
8
+ require 'cocoapods/installer/xcode/pods_project_generator/pod_target_installer'
9
+ require 'cocoapods/installer/xcode/pods_project_generator/file_references_installer'
10
+ require 'cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer'
11
+
12
+ # @return [Pod::Project] the `Pods/Pods.xcodeproj` project.
13
+ #
14
+ attr_reader :project
15
+
16
+ # @return [Array<AggregateTarget>] The model representations of an
17
+ # aggregation of pod targets generated for a target definition
18
+ # in the Podfile.
19
+ #
20
+ attr_reader :aggregate_targets
21
+
22
+ # @return [Sandbox] The sandbox where the Pods should be installed.
23
+ #
24
+ attr_reader :sandbox
25
+
26
+ # @return [Array<PodTarget>] The model representations of pod targets.
27
+ #
28
+ attr_reader :pod_targets
29
+
30
+ # @return [Analyzer] the analyzer which provides the information about what
31
+ # needs to be installed.
32
+ #
33
+ attr_reader :analysis_result
34
+
35
+ # @return [InstallationOptions] the installation options from the Podfile.
36
+ #
37
+ attr_reader :installation_options
38
+
39
+ # @return [Config] the global CocoaPods configuration.
40
+ #
41
+ attr_reader :config
42
+
43
+ # Initialize a new instance
44
+ #
45
+ # @param [Array<AggregateTarget>] aggregate_targets @see aggregate_targets
46
+ # @param [Sandbox] sandbox @see sandbox
47
+ # @param [Array<PodTarget>] pod_targets @see pod_targets
48
+ # @param [Analyzer] analysis_result @see analysis_result
49
+ # @param [InstallationOptions] installation_options @see installation_options
50
+ # @param [Config] config @see config
51
+ #
52
+ def initialize(aggregate_targets, sandbox, pod_targets, analysis_result, installation_options, config)
53
+ @aggregate_targets = aggregate_targets
54
+ @sandbox = sandbox
55
+ @pod_targets = pod_targets
56
+ @analysis_result = analysis_result
57
+ @installation_options = installation_options
58
+ @config = config
59
+ end
60
+
61
+ def generate!
62
+ prepare
63
+ install_file_references
64
+ install_libraries
65
+ set_target_dependencies
66
+ end
67
+
68
+ def write
69
+ UI.message "- Writing Xcode project file to #{UI.path sandbox.project_path}" do
70
+ project.pods.remove_from_project if project.pods.empty?
71
+ project.development_pods.remove_from_project if project.development_pods.empty?
72
+ project.sort(:groups_position => :below)
73
+ if installation_options.deterministic_uuids?
74
+ UI.message('- Generating deterministic UUIDs') { project.predictabilize_uuids }
75
+ end
76
+ project.recreate_user_schemes(false)
77
+ project.save
78
+ end
79
+ end
80
+
81
+ # Shares schemes of development Pods.
82
+ #
83
+ # @return [void]
84
+ #
85
+ def share_development_pod_schemes
86
+ development_pod_targets.select(&:should_build?).each do |pod_target|
87
+ next unless share_scheme_for_development_pod?(pod_target.pod_name)
88
+ Xcodeproj::XCScheme.share_scheme(project.path, pod_target.label)
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ def create_project
95
+ if object_version = aggregate_targets.map(&:user_project).compact.map { |p| p.object_version.to_i }.min
96
+ Pod::Project.new(sandbox.project_path, false, object_version)
97
+ else
98
+ Pod::Project.new(sandbox.project_path)
99
+ end
100
+ end
101
+
102
+ # Creates the Pods project from scratch if it doesn't exists.
103
+ #
104
+ # @return [void]
105
+ #
106
+ # @todo Clean and modify the project if it exists.
107
+ #
108
+ def prepare
109
+ UI.message '- Creating Pods project' do
110
+ @project = create_project
111
+ analysis_result.all_user_build_configurations.each do |name, type|
112
+ @project.add_build_configuration(name, type)
113
+ end
114
+
115
+ pod_names = pod_targets.map(&:pod_name).uniq
116
+ pod_names.each do |pod_name|
117
+ local = sandbox.local?(pod_name)
118
+ path = sandbox.pod_dir(pod_name)
119
+ was_absolute = sandbox.local_path_was_absolute?(pod_name)
120
+ @project.add_pod_group(pod_name, path, local, was_absolute)
121
+ end
122
+
123
+ if config.podfile_path
124
+ @project.add_podfile(config.podfile_path)
125
+ end
126
+
127
+ sandbox.project = @project
128
+ platforms = aggregate_targets.map(&:platform)
129
+ osx_deployment_target = platforms.select { |p| p.name == :osx }.map(&:deployment_target).min
130
+ ios_deployment_target = platforms.select { |p| p.name == :ios }.map(&:deployment_target).min
131
+ watchos_deployment_target = platforms.select { |p| p.name == :watchos }.map(&:deployment_target).min
132
+ tvos_deployment_target = platforms.select { |p| p.name == :tvos }.map(&:deployment_target).min
133
+ @project.build_configurations.each do |build_configuration|
134
+ build_configuration.build_settings['MACOSX_DEPLOYMENT_TARGET'] = osx_deployment_target.to_s if osx_deployment_target
135
+ build_configuration.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = ios_deployment_target.to_s if ios_deployment_target
136
+ build_configuration.build_settings['WATCHOS_DEPLOYMENT_TARGET'] = watchos_deployment_target.to_s if watchos_deployment_target
137
+ build_configuration.build_settings['TVOS_DEPLOYMENT_TARGET'] = tvos_deployment_target.to_s if tvos_deployment_target
138
+ build_configuration.build_settings['STRIP_INSTALLED_PRODUCT'] = 'NO'
139
+ build_configuration.build_settings['CLANG_ENABLE_OBJC_ARC'] = 'YES'
140
+ build_configuration.build_settings['CODE_SIGNING_REQUIRED'] = 'NO'
141
+ build_configuration.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = 'NO_SIGNING/'
142
+ end
143
+ end
144
+ end
145
+
146
+ def install_file_references
147
+ installer = FileReferencesInstaller.new(sandbox, pod_targets, project)
148
+ installer.install!
149
+ end
150
+
151
+ def install_libraries
152
+ UI.message '- Installing targets' do
153
+ pod_targets.sort_by(&:name).each do |pod_target|
154
+ target_installer = PodTargetInstaller.new(sandbox, pod_target)
155
+ target_installer.install!
156
+ end
157
+
158
+ aggregate_targets.sort_by(&:name).each do |target|
159
+ target_installer = AggregateTargetInstaller.new(sandbox, target)
160
+ target_installer.install!
161
+ end
162
+
163
+ add_system_framework_dependencies
164
+ end
165
+ end
166
+
167
+ def add_system_framework_dependencies
168
+ # @TODO: Add Specs
169
+ pod_targets.sort_by(&:name).each do |pod_target|
170
+ pod_target.file_accessors.each do |file_accessor|
171
+ file_accessor.spec_consumer.frameworks.each do |framework|
172
+ if pod_target.should_build?
173
+ pod_target.native_target.add_system_framework(framework)
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ # Adds a target dependency for each pod spec to each aggregate target and
181
+ # links the pod targets among each other.
182
+ #
183
+ # @return [void]
184
+ #
185
+ def set_target_dependencies
186
+ frameworks_group = project.frameworks_group
187
+ aggregate_targets.each do |aggregate_target|
188
+ is_app_extension = !(aggregate_target.user_targets.map(&:symbol_type) &
189
+ [:app_extension, :watch_extension, :watch2_extension, :tv_extension, :messages_extension]).empty?
190
+ is_app_extension ||= aggregate_target.user_targets.any? { |ut| ut.common_resolved_build_setting('APPLICATION_EXTENSION_API_ONLY') == 'YES' }
191
+
192
+ aggregate_target.pod_targets.each do |pod_target|
193
+ configure_app_extension_api_only_for_target(aggregate_target) if is_app_extension
194
+
195
+ unless pod_target.should_build?
196
+ pod_target.resource_bundle_targets.each do |resource_bundle_target|
197
+ aggregate_target.native_target.add_dependency(resource_bundle_target)
198
+ end
199
+
200
+ next
201
+ end
202
+
203
+ aggregate_target.native_target.add_dependency(pod_target.native_target)
204
+ configure_app_extension_api_only_for_target(pod_target) if is_app_extension
205
+
206
+ pod_target.dependent_targets.each do |pod_dependency_target|
207
+ next unless pod_dependency_target.should_build?
208
+ pod_target.native_target.add_dependency(pod_dependency_target.native_target)
209
+ configure_app_extension_api_only_for_target(pod_dependency_target) if is_app_extension
210
+
211
+ if pod_target.requires_frameworks?
212
+ product_ref = frameworks_group.files.find { |f| f.path == pod_dependency_target.product_name } ||
213
+ frameworks_group.new_product_ref_for_target(pod_dependency_target.product_basename, pod_dependency_target.product_type)
214
+ pod_target.native_target.frameworks_build_phase.add_file_reference(product_ref, true)
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
220
+
221
+ # @param [String] pod The root name of the development pod.
222
+ #
223
+ # @return [Bool] whether the scheme for the given development pod should be
224
+ # shared.
225
+ #
226
+ def share_scheme_for_development_pod?(pod)
227
+ case dev_pods_to_share = installation_options.share_schemes_for_development_pods
228
+ when TrueClass, FalseClass, NilClass
229
+ dev_pods_to_share
230
+ when Array
231
+ dev_pods_to_share.any? { |dev_pod| dev_pod === pod } # rubocop:disable Style/CaseEquality
232
+ else
233
+ raise Informative, 'Unable to handle share_schemes_for_development_pods ' \
234
+ "being set to #{dev_pods_to_share.inspect} -- please set it to true, " \
235
+ 'false, or an array of pods to share schemes for.'
236
+ end
237
+ end
238
+
239
+ # @return [Array<Library>] The targets of the development pods generated by
240
+ # the installation process.
241
+ #
242
+ def development_pod_targets
243
+ pod_targets.select do |pod_target|
244
+ sandbox.development_pods.keys.include?(pod_target.pod_name)
245
+ end
246
+ end
247
+
248
+ #------------------------------------------------------------------------#
249
+
250
+ # @! group Private Helpers
251
+
252
+ private
253
+
254
+ # Sets the APPLICATION_EXTENSION_API_ONLY build setting to YES for all
255
+ # configurations of the given target
256
+ #
257
+ def configure_app_extension_api_only_for_target(target)
258
+ target.native_target.build_configurations.each do |config|
259
+ config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES'
260
+ end
261
+ end
262
+ end
263
+ end
264
+ end
265
+ end