cocoapods 1.4.0.beta.1 → 1.4.0.beta.2

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.
@@ -63,8 +63,8 @@ module Pod
63
63
 
64
64
  # Configures the given Xcconfig
65
65
  #
66
- # @param [AggregateTarget] aggregate_target
67
- # The aggregate target, may be nil.
66
+ # @param [Target] target
67
+ # The root target, may be nil.
68
68
  #
69
69
  # @param [PodTarget] pod_target
70
70
  # The pod target, which holds the list of +Spec::FileAccessor+.
@@ -72,27 +72,30 @@ module Pod
72
72
  # @param [Xcodeproj::Config] xcconfig
73
73
  # The xcconfig to edit.
74
74
  #
75
+ # @param [Boolean] include_ld_flags
76
+ # Indicates whether or not to generate ld flags in addition to compile flags
77
+ #
75
78
  # @return [void]
76
79
  #
77
- def self.add_settings_for_file_accessors_of_target(aggregate_target, pod_target, xcconfig)
80
+ def self.add_settings_for_file_accessors_of_target(target, pod_target, xcconfig, include_ld_flags = true)
78
81
  pod_target.file_accessors.each do |file_accessor|
79
- if aggregate_target.nil? || !file_accessor.spec.test_specification?
80
- XCConfigHelper.add_spec_build_settings_to_xcconfig(file_accessor.spec_consumer, xcconfig)
81
- XCConfigHelper.add_static_dependency_build_settings(aggregate_target, pod_target, xcconfig, file_accessor)
82
+ if target.nil? || !file_accessor.spec.test_specification?
83
+ XCConfigHelper.add_spec_build_settings_to_xcconfig(file_accessor.spec_consumer, xcconfig) if include_ld_flags
84
+ XCConfigHelper.add_static_dependency_build_settings(target, pod_target, xcconfig, file_accessor, include_ld_flags)
82
85
  end
83
86
  end
84
- XCConfigHelper.add_dynamic_dependency_build_settings(aggregate_target, pod_target, xcconfig)
87
+ XCConfigHelper.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags)
85
88
  if pod_target.requires_frameworks?
86
89
  pod_target.dependent_targets.each do |dependent_target|
87
- XCConfigHelper.add_dynamic_dependency_build_settings(aggregate_target, dependent_target, xcconfig)
90
+ XCConfigHelper.add_dynamic_dependency_build_settings(target, dependent_target, xcconfig, include_ld_flags)
88
91
  end
89
92
  end
90
93
  end
91
94
 
92
95
  # Adds build settings for static vendored frameworks and libraries.
93
96
  #
94
- # @param [AggregateTarget] aggregate_target
95
- # The aggregate target, may be nil.
97
+ # @param [Target] target
98
+ # The root target, may be nil.
96
99
  #
97
100
  # @param [PodTarget] pod_target
98
101
  # The pod target, which holds the list of +Spec::FileAccessor+.
@@ -103,16 +106,18 @@ module Pod
103
106
  # @param [Spec::FileAccessor] file_accessor
104
107
  # The file accessor, which holds the list of static frameworks.
105
108
  #
109
+ # @param [Boolean] include_ld_flags
110
+ # Indicates whether or not to generate ld flags in addition to compile flags
111
+ #
106
112
  # @return [void]
107
113
  #
108
- def self.add_static_dependency_build_settings(aggregate_target, pod_target, xcconfig, file_accessor)
109
- if aggregate_target.nil? || !file_accessor.spec.test_specification?
114
+ def self.add_static_dependency_build_settings(target, pod_target, xcconfig, file_accessor, include_ld_flags)
115
+ if target.nil? || !file_accessor.spec.test_specification?
116
+ adds_other_ldflags = include_ld_flags && XCConfigHelper.links_dependency?(target, pod_target)
110
117
  file_accessor.vendored_static_frameworks.each do |vendored_static_framework|
111
- adds_other_ldflags = XCConfigHelper.links_dependency?(aggregate_target, pod_target)
112
118
  XCConfigHelper.add_framework_build_settings(vendored_static_framework, xcconfig, pod_target.sandbox.root, adds_other_ldflags)
113
119
  end
114
120
  file_accessor.vendored_static_libraries.each do |vendored_static_library|
115
- adds_other_ldflags = XCConfigHelper.links_dependency?(aggregate_target, pod_target)
116
121
  XCConfigHelper.add_library_build_settings(vendored_static_library, xcconfig, pod_target.sandbox.root, adds_other_ldflags)
117
122
  end
118
123
  end
@@ -136,8 +141,8 @@ module Pod
136
141
 
137
142
  # Adds build settings for dynamic vendored frameworks and libraries.
138
143
  #
139
- # @param [AggregateTarget] aggregate_target
140
- # The aggregate target, may be nil.
144
+ # @param [Target] target
145
+ # The root target, may be nil.
141
146
  #
142
147
  # @param [PodTarget] pod_target
143
148
  # The pod target, which holds the list of +Spec::FileAccessor+.
@@ -145,16 +150,19 @@ module Pod
145
150
  # @param [Xcodeproj::Config] xcconfig
146
151
  # The xcconfig to edit.
147
152
  #
153
+ # @param [Boolean] include_ld_flags
154
+ # Indicates whether or not to generate ld flags in addition to compile flags
155
+ #
148
156
  # @return [void]
149
157
  #
150
- def self.add_dynamic_dependency_build_settings(aggregate_target, pod_target, xcconfig)
158
+ def self.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags)
151
159
  pod_target.file_accessors.each do |file_accessor|
152
- if aggregate_target.nil? || !file_accessor.spec.test_specification?
160
+ if target.nil? || !file_accessor.spec.test_specification?
153
161
  file_accessor.vendored_dynamic_frameworks.each do |vendored_dynamic_framework|
154
- XCConfigHelper.add_framework_build_settings(vendored_dynamic_framework, xcconfig, pod_target.sandbox.root)
162
+ XCConfigHelper.add_framework_build_settings(vendored_dynamic_framework, xcconfig, pod_target.sandbox.root, include_ld_flags)
155
163
  end
156
164
  file_accessor.vendored_dynamic_libraries.each do |vendored_dynamic_library|
157
- XCConfigHelper.add_library_build_settings(vendored_dynamic_library, xcconfig, pod_target.sandbox.root)
165
+ XCConfigHelper.add_library_build_settings(vendored_dynamic_library, xcconfig, pod_target.sandbox.root, include_ld_flags)
158
166
  end
159
167
  end
160
168
  end
@@ -190,15 +198,18 @@ module Pod
190
198
  # @param [Pathname] sandbox_root
191
199
  # The path retrieved from Sandbox#root.
192
200
  #
201
+ # @param [Boolean] include_ld_flags
202
+ # Indicates whether or not to generate ld flags in addition to compile flags
203
+ #
193
204
  # @return [void]
194
205
  #
195
- def self.add_framework_build_settings(framework_path, xcconfig, sandbox_root, include_other_ldflags = true)
206
+ def self.add_framework_build_settings(framework_path, xcconfig, sandbox_root, include_ld_flags = true)
196
207
  name = File.basename(framework_path, '.framework')
197
208
  dirname = '${PODS_ROOT}/' + framework_path.dirname.relative_path_from(sandbox_root).to_s
198
209
  build_settings = {
199
210
  'FRAMEWORK_SEARCH_PATHS' => quote([dirname]),
200
211
  }
201
- build_settings['OTHER_LDFLAGS'] = "-framework #{name}" if include_other_ldflags
212
+ build_settings['OTHER_LDFLAGS'] = "-framework #{name}" if include_ld_flags
202
213
  xcconfig.merge!(build_settings)
203
214
  end
204
215
 
@@ -214,16 +225,19 @@ module Pod
214
225
  # @param [Pathname] sandbox_root
215
226
  # The path retrieved from Sandbox#root.
216
227
  #
228
+ # @param [Boolean] include_ld_flags
229
+ # Indicates whether or not to generate ld flags in addition to compile flags
230
+ #
217
231
  # @return [void]
218
232
  #
219
- def self.add_library_build_settings(library_path, xcconfig, sandbox_root, include_other_ldflags = true)
233
+ def self.add_library_build_settings(library_path, xcconfig, sandbox_root, include_ld_flags = true)
220
234
  extension = File.extname(library_path)
221
235
  name = File.basename(library_path, extension).sub(/\Alib/, '')
222
236
  dirname = '${PODS_ROOT}/' + library_path.dirname.relative_path_from(sandbox_root).to_s
223
237
  build_settings = {
224
238
  'LIBRARY_SEARCH_PATHS' => quote([dirname]),
225
239
  }
226
- build_settings['OTHER_LDFLAGS'] = "-l#{name}" if include_other_ldflags
240
+ build_settings['OTHER_LDFLAGS'] = "-l#{name}" if include_ld_flags
227
241
  xcconfig.merge!(build_settings)
228
242
  end
229
243
 
@@ -350,25 +364,28 @@ module Pod
350
364
  # Add custom build settings and required build settings to link to
351
365
  # vendored libraries and frameworks.
352
366
  #
353
- # @param [AggregateTarget] aggregate_target
354
- # The aggregate target, may be nil.
367
+ # @param [Target] target
368
+ # The root target, may be nil.
355
369
  #
356
- # @param [Array<PodTarget] pod_targets
357
- # The pod targets to add the vendored build settings for.
370
+ # @param [Array<PodTarget] dep_targets
371
+ # The dependency targets to add the vendored build settings for.
358
372
  #
359
373
  # @param [Xcodeproj::Config] xcconfig
360
374
  # The xcconfig to edit.
361
375
  #
376
+ # @param [Boolean] include_ld_flags
377
+ # Indicates whether or not to generate ld flags in addition to compile flags
378
+ #
362
379
  # @note
363
380
  # In case of generated pod targets, which require frameworks, the
364
381
  # vendored frameworks and libraries are already linked statically
365
382
  # into the framework binary and must not be linked again to the
366
383
  # user target.
367
384
  #
368
- def self.generate_vendored_build_settings(aggregate_target, pod_targets, xcconfig)
369
- pod_targets.each do |pod_target|
370
- unless pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework?
371
- XCConfigHelper.add_settings_for_file_accessors_of_target(aggregate_target, pod_target, xcconfig)
385
+ def self.generate_vendored_build_settings(target, dep_targets, xcconfig, include_ld_flags = true)
386
+ dep_targets.each do |dep_target|
387
+ unless dep_target.should_build? && dep_target.requires_frameworks? && !dep_target.static_framework?
388
+ XCConfigHelper.add_settings_for_file_accessors_of_target(target, dep_target, xcconfig, include_ld_flags)
372
389
  end
373
390
  end
374
391
  end
@@ -355,7 +355,7 @@ module Pod
355
355
  end
356
356
 
357
357
  # Install the Pods. If the resolver indicated that a Pod should be
358
- # installed and it exits, it is removed an then reinstalled. In any case if
358
+ # installed and it exits, it is removed and then reinstalled. In any case if
359
359
  # the Pod doesn't exits it is installed.
360
360
  #
361
361
  # @return [void]
@@ -423,6 +423,7 @@ module Pod
423
423
  unlock_pod_sources
424
424
  run_plugins_post_install_hooks
425
425
  warn_for_deprecations
426
+ warn_for_installed_script_phases
426
427
  lock_pod_sources
427
428
  print_post_install_message
428
429
  end
@@ -523,6 +524,24 @@ module Pod
523
524
  end
524
525
  end
525
526
 
527
+ # Prints a warning for any pods that included script phases
528
+ #
529
+ # @return [void]
530
+ #
531
+ def warn_for_installed_script_phases
532
+ pods_to_install = sandbox_state.added | sandbox_state.changed
533
+ pod_targets.each do |pod_target|
534
+ spec = pod_target.root_spec
535
+ if pods_to_install.include?(spec.name)
536
+ script_phase_count = pod_target.script_phases.count
537
+ unless script_phase_count.zero?
538
+ UI.warn "#{spec.name} has added #{pod_target.script_phases.count} #{'script phase'.pluralize(script_phase_count)}. " \
539
+ 'Please inspect before executing a build. See `https://guides.cocoapods.org/syntax/podspec.html#script_phases` for more information.'
540
+ end
541
+ end
542
+ end
543
+ end
544
+
526
545
  # Writes the Podfile and the lock files.
527
546
  #
528
547
  # @todo Pass the checkout options to the Lockfile.
@@ -626,19 +645,6 @@ module Pod
626
645
 
627
646
  #-------------------------------------------------------------------------#
628
647
 
629
- public
630
-
631
- # @return [Array<Library>] The targets of the development pods generated by
632
- # the installation process.
633
- #
634
- def development_pod_targets
635
- pod_targets.select do |pod_target|
636
- sandbox.development_pods.keys.include?(pod_target.pod_name)
637
- end
638
- end
639
-
640
- #-------------------------------------------------------------------------#
641
-
642
648
  private
643
649
 
644
650
  # @!group Private helpers
@@ -147,6 +147,49 @@ module Pod
147
147
  end
148
148
  end
149
149
  end
150
+
151
+ # Updates all target script phases for the current target, including creating or updating, deleting
152
+ # and re-ordering.
153
+ #
154
+ # @return [void]
155
+ #
156
+ def create_or_update_user_script_phases(script_phases, native_target)
157
+ script_phase_names = script_phases.map { |k| k[:name] }
158
+ # Delete script phases no longer present in the target definition.
159
+ native_target_script_phases = native_target.shell_script_build_phases.select { |bp| !bp.name.nil? && bp.name.start_with?(USER_BUILD_PHASE_PREFIX) }
160
+ native_target_script_phases.each do |script_phase|
161
+ script_phase_name_without_prefix = script_phase.name.sub(USER_BUILD_PHASE_PREFIX, '')
162
+ unless script_phase_names.include?(script_phase_name_without_prefix)
163
+ native_target.build_phases.delete(script_phase)
164
+ end
165
+ end
166
+ # Create or update the ones that are expected to be.
167
+ script_phases.each do |td_script_phase|
168
+ name_with_prefix = USER_BUILD_PHASE_PREFIX + td_script_phase[:name]
169
+ phase = TargetIntegrator.create_or_update_build_phase(native_target, name_with_prefix)
170
+ phase.shell_script = td_script_phase[:script]
171
+ phase.shell_path = td_script_phase[:shell_path] if td_script_phase.key?(:shell_path)
172
+ phase.input_paths = td_script_phase[:input_files] if td_script_phase.key?(:input_files)
173
+ phase.output_paths = td_script_phase[:output_files] if td_script_phase.key?(:output_files)
174
+ phase.show_env_vars_in_log = td_script_phase[:show_env_vars_in_log] ? '1' : '0' if td_script_phase.key?(:show_env_vars_in_log)
175
+
176
+ execution_position = td_script_phase[:execution_position]
177
+ unless execution_position == :any
178
+ compile_build_phase_index = native_target.build_phases.index do |bp|
179
+ bp.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
180
+ end
181
+ unless compile_build_phase_index.nil?
182
+ script_phase_index = native_target.build_phases.index do |bp|
183
+ bp.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) && !bp.name.nil? && bp.name == name_with_prefix
184
+ end
185
+ if (execution_position == :before_compile && script_phase_index > compile_build_phase_index) ||
186
+ (execution_position == :after_compile && script_phase_index < compile_build_phase_index)
187
+ native_target.build_phases.move_from(script_phase_index, compile_build_phase_index)
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
150
193
  end
151
194
 
152
195
  # Integrates the user project targets. Only the targets that do **not**
@@ -164,7 +207,7 @@ module Pod
164
207
  remove_embed_frameworks_script_phase_from_embedded_targets
165
208
  add_copy_resources_script_phase
166
209
  add_check_manifest_lock_script_phase
167
- update_target_script_phases
210
+ add_user_script_phases
168
211
  end
169
212
  end
170
213
 
@@ -265,38 +308,9 @@ module Pod
265
308
  #
266
309
  # @return [void]
267
310
  #
268
- def update_target_script_phases
269
- target_definition_script_phases = target.target_definition.script_phases
270
- target_definition_script_phase_names = target_definition_script_phases.map { |k| k[:name] }
311
+ def add_user_script_phases
271
312
  native_targets.each do |native_target|
272
- # Delete script phases no longer present in the target definition.
273
- native_target_script_phases = native_target.shell_script_build_phases.select { |bp| !bp.name.nil? && bp.name.start_with?(USER_BUILD_PHASE_PREFIX) }
274
- native_target_script_phases.each do |script_phase|
275
- script_phase_name_without_prefix = script_phase.name.sub(USER_BUILD_PHASE_PREFIX, '')
276
- unless target_definition_script_phase_names.include?(script_phase_name_without_prefix)
277
- native_target.build_phases.delete(script_phase)
278
- end
279
- end
280
-
281
- # Create or update the ones that are expected to be.
282
- target_definition_script_phases.each do |td_script_phase|
283
- phase = TargetIntegrator.create_or_update_build_phase(native_target, USER_BUILD_PHASE_PREFIX + td_script_phase[:name])
284
- phase.shell_script = td_script_phase[:script]
285
- phase.shell_path = td_script_phase[:shell_path] if td_script_phase.key?(:shell_path)
286
- phase.input_paths = td_script_phase[:input_files] if td_script_phase.key?(:input_files)
287
- phase.output_paths = td_script_phase[:output_files] if td_script_phase.key?(:output_files)
288
- phase.show_env_vars_in_log = td_script_phase[:show_env_vars_in_log] ? '1' : '0' if td_script_phase.key?(:show_env_vars_in_log)
289
- end
290
-
291
- # Move script phases to their correct index if the order has changed.
292
- offset = native_target.build_phases.count - target_definition_script_phases.count
293
- target_definition_script_phases.each_with_index do |td_script_phase, index|
294
- current_index = native_target.build_phases.index do |bp|
295
- bp.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) && bp.name.sub(USER_BUILD_PHASE_PREFIX, '') == td_script_phase[:name]
296
- end
297
- expected_index = offset + index
298
- native_target.build_phases.insert(expected_index, native_target.build_phases.delete_at(current_index)) if current_index != expected_index
299
- end
313
+ TargetIntegrator.create_or_update_user_script_phases(target.target_definition.script_phases, native_target)
300
314
  end
301
315
  end
302
316
 
@@ -4,7 +4,7 @@ module Pod
4
4
  # The {PodsProjectGenerator} handles generation of the 'Pods/Pods.xcodeproj'
5
5
  #
6
6
  class PodsProjectGenerator
7
- require 'cocoapods/installer/pods_project_integrator/pod_target_integrator'
7
+ require 'cocoapods/installer/xcode/pods_project_generator/pod_target_integrator'
8
8
  require 'cocoapods/installer/xcode/pods_project_generator/target_installer'
9
9
  require 'cocoapods/installer/xcode/pods_project_generator/pod_target_installer'
10
10
  require 'cocoapods/installer/xcode/pods_project_generator/file_references_installer'
@@ -63,7 +63,7 @@ module Pod
63
63
  prepare
64
64
  install_file_references
65
65
  install_libraries
66
- integrate_test_targets
66
+ integrate_targets
67
67
  set_target_dependencies
68
68
  end
69
69
 
@@ -124,6 +124,8 @@ module Pod
124
124
  analysis_result.all_user_build_configurations.each do |name, type|
125
125
  @project.add_build_configuration(name, type)
126
126
  end
127
+ # Reset symroot just in case the user has added a new build configuration other than 'Debug' or 'Release'.
128
+ @project.symroot = Pod::Project::LEGACY_BUILD_ROOT
127
129
 
128
130
  pod_names = pod_targets.map(&:pod_name).uniq
129
131
  pod_names.each do |pod_name|
@@ -177,12 +179,12 @@ module Pod
177
179
  end
178
180
  end
179
181
 
180
- def integrate_test_targets
181
- pod_targets_with_test_targets = pod_targets.reject { |pt| pt.test_native_targets.empty? }
182
- unless pod_targets_with_test_targets.empty?
183
- UI.message '- Integrating test targets' do
184
- pod_targets_with_test_targets.each do |pod_target|
185
- Pod::Installer::PodTargetIntegrator.new(pod_target).integrate!
182
+ def integrate_targets
183
+ pod_targets_to_integrate = pod_targets.select { |pt| !pt.test_native_targets.empty? || pt.contains_script_phases? }
184
+ unless pod_targets_to_integrate.empty?
185
+ UI.message '- Integrating targets' do
186
+ pod_targets_to_integrate.each do |pod_target|
187
+ PodTargetIntegrator.new(pod_target).integrate!
186
188
  end
187
189
  end
188
190
  end
@@ -227,10 +229,11 @@ module Pod
227
229
  aggregate_target.native_target.add_dependency(pod_target.native_target)
228
230
  configure_app_extension_api_only_for_target(pod_target) if is_app_extension
229
231
 
232
+ add_dependent_targets_to_native_target(pod_target.dependent_targets,
233
+ pod_target.native_target, is_app_extension,
234
+ pod_target.requires_frameworks? && !pod_target.static_framework?,
235
+ frameworks_group)
230
236
  unless pod_target.static_framework?
231
- add_dependent_targets_to_native_target(pod_target.dependent_targets,
232
- pod_target.native_target, is_app_extension,
233
- pod_target.requires_frameworks?, frameworks_group)
234
237
  add_pod_target_test_dependencies(pod_target, frameworks_group)
235
238
  end
236
239
  end
@@ -285,11 +288,16 @@ module Pod
285
288
 
286
289
  def add_pod_target_test_dependencies(pod_target, frameworks_group)
287
290
  test_dependent_targets = pod_target.all_test_dependent_targets
288
- pod_target.test_native_targets.each do |test_native_target|
291
+ pod_target.test_specs_by_native_target.each do |test_native_target, test_specs|
289
292
  test_dependent_targets.reject(&:should_build?).each do |test_dependent_target|
290
293
  add_resource_bundles_to_native_target(test_dependent_target, test_native_target)
291
294
  end
292
295
  add_dependent_targets_to_native_target(test_dependent_targets, test_native_target, false, pod_target.requires_frameworks?, frameworks_group)
296
+ test_spec_consumers = test_specs.map { |test_spec| test_spec.consumer(pod_target.platform) }
297
+ if test_spec_consumers.any?(&:requires_app_host?)
298
+ app_host_target = project.targets.find { |t| t.name == pod_target.app_host_label(test_specs.first.test_type) }
299
+ test_native_target.add_dependency(app_host_target)
300
+ end
293
301
  end
294
302
  end
295
303
 
@@ -17,7 +17,7 @@ module Pod
17
17
  create_support_files_group
18
18
  create_xcconfig_file
19
19
  if target.requires_frameworks?
20
- create_info_plist_file
20
+ create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
21
21
  create_module_map
22
22
  create_umbrella_header
23
23
  end
@@ -19,14 +19,17 @@ module Pod
19
19
  UI.message "- Installing target `#{target.name}` #{target.platform}" do
20
20
  add_target
21
21
  create_support_files_dir
22
- add_test_targets if target.contains_test_specifications?
22
+ if target.contains_test_specifications?
23
+ add_test_targets
24
+ add_test_app_host_targets
25
+ end
23
26
  add_resources_bundle_targets
24
27
  add_files_to_build_phases
25
28
  create_xcconfig_file
26
29
  create_test_xcconfig_files if target.contains_test_specifications?
27
30
  if target.requires_frameworks?
28
31
  unless target.static_framework?
29
- create_info_plist_file
32
+ create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
30
33
  end
31
34
  create_module_map
32
35
  create_umbrella_header do |generator|
@@ -45,13 +48,33 @@ module Pod
45
48
  create_build_phase_to_move_static_framework_archive
46
49
  end
47
50
  end
48
- create_prefix_header
51
+ unless skip_pch?(target.non_test_specs)
52
+ path = target.prefix_header_path
53
+ file_accessors = target.file_accessors.reject { |f| f.spec.test_specification? }
54
+ create_prefix_header(path, file_accessors, target.platform, [native_target])
55
+ end
56
+ unless skip_pch?(target.test_specs)
57
+ target.supported_test_types.each do |test_type|
58
+ path = target.prefix_header_path_for_test_type(test_type)
59
+ file_accessors = target.file_accessors.select { |f| f.spec.test_specification? }
60
+ create_prefix_header(path, file_accessors, target.platform, target.test_native_targets)
61
+ end
62
+ end
49
63
  create_dummy_source
50
64
  end
51
65
  end
52
66
 
53
67
  private
54
68
 
69
+ # @param [Array<Specification>] specs
70
+ # the specs to check against whether `.pch` generation should be skipped or not.
71
+ #
72
+ # @return [Boolean] Whether the target should build a pch file.
73
+ #
74
+ def skip_pch?(specs)
75
+ specs.any? { |spec| spec.prefix_header_file.is_a?(FalseClass) }
76
+ end
77
+
55
78
  # Remove the default headers folder path settings for static library pod
56
79
  # targets.
57
80
  #
@@ -172,6 +195,43 @@ module Pod
172
195
  end
173
196
  end
174
197
 
198
+ # Adds the test app host targets for the library to the Pods project with the
199
+ # appropriate build configurations.
200
+ #
201
+ # @return [void]
202
+ #
203
+ def add_test_app_host_targets
204
+ target.test_specs.each do |test_spec|
205
+ next unless test_spec.consumer(target.platform).requires_app_host?
206
+ name = target.app_host_label(test_spec.test_type)
207
+ platform_name = target.platform.name
208
+ app_host_target = project.targets.find { |t| t.name == name }
209
+ if app_host_target.nil?
210
+ app_host_target = Pod::Generator::AppTargetHelper.add_app_target(project, platform_name, deployment_target, name)
211
+ app_host_target.build_configurations.each do |configuration|
212
+ configuration.build_settings.merge!(custom_build_settings)
213
+ configuration.build_settings['PRODUCT_NAME'] = name
214
+ configuration.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}'
215
+ configuration.build_settings['CODE_SIGN_IDENTITY'] = '' if target.platform == :osx
216
+ end
217
+ Pod::Generator::AppTargetHelper.add_app_host_main_file(project, app_host_target, platform_name, name)
218
+ app_host_info_plist_path = project.path.dirname.+("#{name}/Info.plist")
219
+ create_info_plist_file(app_host_info_plist_path, app_host_target, '1.0.0', target.platform, :appl)
220
+ end
221
+ # Wire all test native targets with the app host.
222
+ native_test_target = target.native_target_for_spec(test_spec)
223
+ native_test_target.build_configurations.each do |configuration|
224
+ test_host = "$(BUILT_PRODUCTS_DIR)/#{name}.app/"
225
+ test_host << 'Contents/MacOS/' if target.platform == :osx
226
+ test_host << name.to_s
227
+ configuration.build_settings['TEST_HOST'] = test_host
228
+ end
229
+ target_attributes = project.root_object.attributes['TargetAttributes'] || {}
230
+ target_attributes[native_test_target.uuid.to_s] = { 'TestTargetID' => app_host_target.uuid.to_s }
231
+ project.root_object.attributes['TargetAttributes'] = target_attributes
232
+ end
233
+ end
234
+
175
235
  # Adds the test targets for the library to the Pods project with the
176
236
  # appropriate build configurations.
177
237
  #
@@ -201,6 +261,8 @@ module Pod
201
261
  configuration.build_settings['PRODUCT_NAME'] = name
202
262
  # We must codesign iOS XCTest bundles that contain binary frameworks to allow them to be launchable in the simulator
203
263
  configuration.build_settings['CODE_SIGNING_REQUIRED'] = 'YES' unless target.platform == :osx
264
+ # For macOS we do not code sign the XCTest bundle because we do not code sign the frameworks either.
265
+ configuration.build_settings['CODE_SIGN_IDENTITY'] = '' if target.platform == :osx
204
266
  end
205
267
 
206
268
  # Test native targets also need frameworks and resources to be copied over to their xctest bundle.
@@ -259,7 +321,7 @@ module Pod
259
321
  path = target.info_plist_path
260
322
  path.dirname.mkdir unless path.dirname.exist?
261
323
  info_plist_path = path.dirname + "ResourceBundle-#{bundle_name}-#{path.basename}"
262
- generator = Generator::InfoPlistFile.new(target, :bundle_package_type => :bndl)
324
+ generator = Generator::InfoPlistFile.new(target.version, target.platform, :bndl)
263
325
  update_changed_file(generator, info_plist_path)
264
326
  add_file_to_support_group(info_plist_path)
265
327
 
@@ -407,6 +469,8 @@ module Pod
407
469
  mkdir -p "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules"
408
470
  cp "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}"
409
471
  cp "${MODULEMAP_FILE}" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules/module.modulemap"
472
+ # If there's a .swiftmodule, copy it into the framework's Modules folder
473
+ cp -r "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}".swiftmodule "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules/" 2>/dev/null || :
410
474
  eos
411
475
  end
412
476
 
@@ -414,17 +478,30 @@ module Pod
414
478
  # to the platform of the target. This file also include any prefix header
415
479
  # content reported by the specification of the pods.
416
480
  #
481
+ # @param [Pathname] path
482
+ # the path to generate the prefix header for.
483
+ #
484
+ # @param [Array<Sandbox::FileAccessor>] file_accessors
485
+ # the file accessors to use for this prefix header that point to a path of a prefix header.
486
+ #
487
+ # @param [Platform] platform
488
+ # the platform to use for this prefix header.
489
+ #
490
+ # @param [Array<PBXNativetarget>] native_targets
491
+ # the native targets on which the prefix header should be configured for.
492
+ #
417
493
  # @return [void]
418
494
  #
419
- def create_prefix_header
420
- path = target.prefix_header_path
421
- generator = Generator::PrefixHeader.new(target.file_accessors, target.platform)
495
+ def create_prefix_header(path, file_accessors, platform, native_targets)
496
+ generator = Generator::PrefixHeader.new(file_accessors, platform)
422
497
  update_changed_file(generator, path)
423
498
  add_file_to_support_group(path)
424
499
 
425
- native_target.build_configurations.each do |c|
426
- relative_path = path.relative_path_from(project.path.dirname)
427
- c.build_settings['GCC_PREFIX_HEADER'] = relative_path.to_s
500
+ native_targets.each do |native_target|
501
+ native_target.build_configurations.each do |c|
502
+ relative_path = path.relative_path_from(project.path.dirname)
503
+ c.build_settings['GCC_PREFIX_HEADER'] = relative_path.to_s
504
+ end
428
505
  end
429
506
  end
430
507
 
@@ -433,7 +510,7 @@ module Pod
433
510
  :osx => Version.new('10.8'),
434
511
  :watchos => Version.new('2.0'),
435
512
  :tvos => Version.new('9.0'),
436
- }
513
+ }.freeze
437
514
 
438
515
  # Returns the compiler flags for the source files of the given specification.
439
516
  #