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

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,101 @@
1
+ module Pod
2
+ class Installer
3
+ class Xcode
4
+ class PodsProjectGenerator
5
+ # This class is responsible for integrating a pod target. This includes integrating
6
+ # the test targets included by each pod target.
7
+ #
8
+ class PodTargetIntegrator
9
+ # @return [PodTarget] the target that should be integrated.
10
+ #
11
+ attr_reader :target
12
+
13
+ # Init a new PodTargetIntegrator.
14
+ #
15
+ # @param [PodTarget] target @see #target
16
+ #
17
+ def initialize(target)
18
+ @target = target
19
+ end
20
+
21
+ # Integrates the pod target.
22
+ #
23
+ # @return [void]
24
+ #
25
+ def integrate!
26
+ UI.section(integration_message) do
27
+ target.test_specs_by_native_target.each do |native_target, test_specs|
28
+ add_embed_frameworks_script_phase(native_target)
29
+ add_copy_resources_script_phase(native_target)
30
+ UserProjectIntegrator::TargetIntegrator.create_or_update_user_script_phases(script_phases_for_specs(test_specs), native_target)
31
+ end
32
+ specs = target.specs.reject(&:test_specification?)
33
+ UserProjectIntegrator::TargetIntegrator.create_or_update_user_script_phases(script_phases_for_specs(specs), target.native_target)
34
+ end
35
+ end
36
+
37
+ # @return [String] a string representation suitable for debugging.
38
+ #
39
+ def inspect
40
+ "#<#{self.class} for target `#{target.label}'>"
41
+ end
42
+
43
+ private
44
+
45
+ # @!group Integration steps
46
+ #---------------------------------------------------------------------#
47
+
48
+ # Find or create a 'Copy Pods Resources' build phase
49
+ #
50
+ # @return [void]
51
+ #
52
+ def add_copy_resources_script_phase(native_target)
53
+ test_type = target.test_type_for_product_type(native_target.symbol_type)
54
+ script_path = "${PODS_ROOT}/#{target.copy_resources_script_path_for_test_type(test_type).relative_path_from(target.sandbox.root)}"
55
+ resource_paths = target.all_test_dependent_targets.flat_map(&:resource_paths)
56
+ input_paths = []
57
+ output_paths = []
58
+ unless resource_paths.empty?
59
+ input_paths = [script_path, *resource_paths.flatten.uniq]
60
+ output_paths = ['${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}']
61
+ end
62
+ UserProjectIntegrator::TargetIntegrator.add_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
63
+ end
64
+
65
+ # Find or create a 'Embed Pods Frameworks' Copy Files Build Phase
66
+ #
67
+ # @return [void]
68
+ #
69
+ def add_embed_frameworks_script_phase(native_target)
70
+ test_type = target.test_type_for_product_type(native_target.symbol_type)
71
+ script_path = "${PODS_ROOT}/#{target.embed_frameworks_script_path_for_test_type(test_type).relative_path_from(target.sandbox.root)}"
72
+ framework_paths = target.all_test_dependent_targets.flat_map(&:framework_paths)
73
+ input_paths = []
74
+ output_paths = []
75
+ unless framework_paths.empty?
76
+ input_paths = [script_path, *framework_paths.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
77
+ output_paths = framework_paths.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact
78
+ end
79
+ UserProjectIntegrator::TargetIntegrator.add_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
80
+ end
81
+
82
+ # @return [String] the message that should be displayed for the target
83
+ # integration.
84
+ #
85
+ def integration_message
86
+ "Integrating target `#{target.name}`"
87
+ end
88
+
89
+ # @param [Array<Specification] specs
90
+ # the specs to return script phrases from.
91
+ #
92
+ # @return [Array<Hash<Symbol=>String>] an array of all combined script phases from the specs.
93
+ #
94
+ def script_phases_for_specs(specs)
95
+ specs.map { |spec| spec.consumer(target.platform) }.map(&:script_phases).flatten
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -136,12 +136,26 @@ module Pod
136
136
 
137
137
  # Creates the Info.plist file which sets public framework attributes
138
138
  #
139
+ # @param [Pathname] path
140
+ # the path to save the generated Info.plist file.
141
+ #
142
+ # @param [PBXNativeTarget] native_target
143
+ # the native target to link the generated Info.plist file into.
144
+ #
145
+ # @param [Version] version
146
+ # the version to use for when generating this Info.plist file.
147
+ #
148
+ # @param [Platform] platform
149
+ # the platform to use for when generating this Info.plist file.
150
+ #
151
+ # @param [Symbol] bundle_package_type
152
+ # the CFBundlePackageType of the target this Info.plist file is for.
153
+ #
139
154
  # @return [void]
140
155
  #
141
- def create_info_plist_file
142
- path = target.info_plist_path
156
+ def create_info_plist_file(path, native_target, version, platform, bundle_package_type = :fmwk)
143
157
  UI.message "- Generating Info.plist file at #{UI.path(path)}" do
144
- generator = Generator::InfoPlistFile.new(target)
158
+ generator = Generator::InfoPlistFile.new(version, platform, bundle_package_type)
145
159
  update_changed_file(generator, path)
146
160
  add_file_to_support_group(path)
147
161
 
@@ -6,6 +6,8 @@ module Pod
6
6
  # This class is used to represent both the targets and their libraries.
7
7
  #
8
8
  class Target
9
+ DEFAULT_VERSION = '1.0.0'.freeze
10
+
9
11
  # @return [Sandbox] The sandbox where the Pods should be installed.
10
12
  #
11
13
  attr_reader :sandbox
@@ -93,7 +95,7 @@ module Pod
93
95
  # @return [Boolean] Whether the target should build a static framework.
94
96
  #
95
97
  def static_framework?
96
- !is_a?(Pod::AggregateTarget) && specs.any? && specs.all?(&:static_framework)
98
+ !is_a?(Pod::AggregateTarget) && specs.any? && specs.flat_map(&:root).all?(&:static_framework)
97
99
  end
98
100
 
99
101
  #-------------------------------------------------------------------------#
@@ -156,12 +158,6 @@ module Pod
156
158
  support_files_dir + "#{label}.modulemap"
157
159
  end
158
160
 
159
- # @return [Pathname] the absolute path of the prefix header file.
160
- #
161
- def prefix_header_path
162
- support_files_dir + "#{label}-prefix.pch"
163
- end
164
-
165
161
  # @return [Pathname] the absolute path of the bridge support file.
166
162
  #
167
163
  def bridge_support_path
@@ -180,6 +176,12 @@ module Pod
180
176
  support_files_dir + "#{label}-dummy.m"
181
177
  end
182
178
 
179
+ # @return [String] The version associated with this target
180
+ #
181
+ def version
182
+ DEFAULT_VERSION
183
+ end
184
+
183
185
  #-------------------------------------------------------------------------#
184
186
 
185
187
  private
@@ -205,7 +205,7 @@ module Pod
205
205
  def resource_paths_by_config
206
206
  @resource_paths_by_config ||= begin
207
207
  relevant_pod_targets = pod_targets.reject do |pod_target|
208
- pod_target.should_build? && pod_target.requires_frameworks?
208
+ pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework?
209
209
  end
210
210
  user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
211
211
  resources_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
@@ -163,7 +163,7 @@ module Pod
163
163
  @should_build = begin
164
164
  source_files = file_accessors.flat_map(&:source_files)
165
165
  source_files -= file_accessors.flat_map(&:headers)
166
- !source_files.empty?
166
+ !source_files.empty? || contains_script_phases?
167
167
  end
168
168
  end
169
169
 
@@ -185,16 +185,47 @@ module Pod
185
185
  end
186
186
  end
187
187
 
188
+ # @return [Array<Hash{Symbol=>String}>] An array of hashes where each hash represents a single script phase.
189
+ #
190
+ def script_phases
191
+ spec_consumers.map(&:script_phases).flatten
192
+ end
193
+
194
+ # @return [Boolean] Whether the target contains any script phases.
195
+ #
196
+ def contains_script_phases?
197
+ !script_phases.empty?
198
+ end
199
+
200
+ # @return [Hash{Array => Specification}] a hash where the keys are the test native targets and the value
201
+ # an array of all the test specs associated with this native target.
202
+ #
203
+ def test_specs_by_native_target
204
+ test_specs.group_by { |test_spec| native_target_for_spec(test_spec) }
205
+ end
206
+
188
207
  # @return [Boolean] Whether the target has any tests specifications.
189
208
  #
190
209
  def contains_test_specifications?
191
210
  specs.any?(&:test_specification?)
192
211
  end
193
212
 
213
+ # @return [Array<Specification>] All of the test specs within this target.
214
+ #
215
+ def test_specs
216
+ specs.select(&:test_specification?)
217
+ end
218
+
219
+ # @return [Array<Specification>] All of the non test specs within this target.
220
+ #
221
+ def non_test_specs
222
+ specs.reject(&:test_specification?)
223
+ end
224
+
194
225
  # @return [Array<Symbol>] All of the test supported types within this target.
195
226
  #
196
227
  def supported_test_types
197
- specs.select(&:test_specification?).map(&:test_type).uniq
228
+ test_specs.map(&:test_type).uniq
198
229
  end
199
230
 
200
231
  # Returns the framework paths associated with this target. By default all paths include the framework paths
@@ -207,36 +238,35 @@ module Pod
207
238
  # this target depends upon.
208
239
  #
209
240
  def framework_paths(include_test_spec_paths = true)
210
- @framework_paths ||= Hash.new do |h, key|
211
- h[key] = begin
212
- accessors = file_accessors
213
- accessors = accessors.reject { |a| a.spec.test_specification? } unless include_test_spec_paths
214
- frameworks = []
215
- accessors.flat_map(&:vendored_dynamic_artifacts).map do |framework_path|
216
- relative_path_to_sandbox = framework_path.relative_path_from(sandbox.root)
217
- framework = { :name => framework_path.basename.to_s,
218
- :input_path => "${PODS_ROOT}/#{relative_path_to_sandbox}",
219
- :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{framework_path.basename}" }
220
- # Until this can be configured, assume the dSYM file uses the file name as the framework.
221
- # See https://github.com/CocoaPods/CocoaPods/issues/1698
222
- dsym_name = "#{framework_path.basename}.dSYM"
223
- dsym_path = Pathname.new("#{framework_path.dirname}/#{dsym_name}")
224
- if dsym_path.exist?
225
- framework[:dsym_name] = dsym_name
226
- framework[:dsym_input_path] = "${PODS_ROOT}/#{relative_path_to_sandbox}.dSYM"
227
- framework[:dsym_output_path] = "${DWARF_DSYM_FOLDER_PATH}/#{dsym_name}"
228
- end
229
- frameworks << framework
241
+ @framework_paths ||= {}
242
+ return @framework_paths[include_test_spec_paths] if @framework_paths.key?(include_test_spec_paths)
243
+ @framework_paths[include_test_spec_paths] = begin
244
+ accessors = file_accessors
245
+ accessors = accessors.reject { |a| a.spec.test_specification? } unless include_test_spec_paths
246
+ frameworks = []
247
+ accessors.flat_map(&:vendored_dynamic_artifacts).map do |framework_path|
248
+ relative_path_to_sandbox = framework_path.relative_path_from(sandbox.root)
249
+ framework = { :name => framework_path.basename.to_s,
250
+ :input_path => "${PODS_ROOT}/#{relative_path_to_sandbox}",
251
+ :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{framework_path.basename}" }
252
+ # Until this can be configured, assume the dSYM file uses the file name as the framework.
253
+ # See https://github.com/CocoaPods/CocoaPods/issues/1698
254
+ dsym_name = "#{framework_path.basename}.dSYM"
255
+ dsym_path = Pathname.new("#{framework_path.dirname}/#{dsym_name}")
256
+ if dsym_path.exist?
257
+ framework[:dsym_name] = dsym_name
258
+ framework[:dsym_input_path] = "${PODS_ROOT}/#{relative_path_to_sandbox}.dSYM"
259
+ framework[:dsym_output_path] = "${DWARF_DSYM_FOLDER_PATH}/#{dsym_name}"
230
260
  end
231
- if should_build? && requires_frameworks? && !static_framework?
232
- frameworks << { :name => product_name,
233
- :input_path => build_product_path('${BUILT_PRODUCTS_DIR}'),
234
- :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{product_name}" }
235
- end
236
- frameworks
261
+ frameworks << framework
262
+ end
263
+ if should_build? && requires_frameworks? && !static_framework?
264
+ frameworks << { :name => product_name,
265
+ :input_path => build_product_path('${BUILT_PRODUCTS_DIR}'),
266
+ :output_path => "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{product_name}" }
237
267
  end
268
+ frameworks
238
269
  end
239
- @framework_paths[include_test_spec_paths]
240
270
  end
241
271
 
242
272
  # Returns the resource paths associated with this target. By default all paths include the resource paths
@@ -248,22 +278,21 @@ module Pod
248
278
  # @return [Array<String>] The resource and resource bundle paths this target depends upon.
249
279
  #
250
280
  def resource_paths(include_test_spec_paths = true)
251
- @resource_paths ||= Hash.new do |h, key|
252
- h[key] = begin
253
- accessors = file_accessors
254
- accessors = accessors.reject { |a| a.spec.test_specification? } unless include_test_spec_paths
255
- resource_paths = accessors.flat_map do |accessor|
256
- accessor.resources.flat_map { |res| "${PODS_ROOT}/#{res.relative_path_from(sandbox.project.path.dirname)}" }
257
- end
258
- resource_bundles = accessors.flat_map do |accessor|
259
- prefix = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE
260
- prefix = configuration_build_dir unless accessor.spec.test_specification?
261
- accessor.resource_bundles.keys.map { |name| "#{prefix}/#{name.shellescape}.bundle" }
262
- end
263
- resource_paths + resource_bundles
281
+ @resource_paths ||= {}
282
+ return @resource_paths[include_test_spec_paths] if @resource_paths.key?(include_test_spec_paths)
283
+ @resource_paths[include_test_spec_paths] = begin
284
+ accessors = file_accessors
285
+ accessors = accessors.reject { |a| a.spec.test_specification? } unless include_test_spec_paths
286
+ resource_paths = accessors.flat_map do |accessor|
287
+ accessor.resources.flat_map { |res| "${PODS_ROOT}/#{res.relative_path_from(sandbox.project.path.dirname)}" }
264
288
  end
289
+ resource_bundles = accessors.flat_map do |accessor|
290
+ prefix = Generator::XCConfig::XCConfigHelper::CONFIGURATION_BUILD_DIR_VARIABLE
291
+ prefix = configuration_build_dir unless accessor.spec.test_specification?
292
+ accessor.resource_bundles.keys.map { |name| "#{prefix}/#{name.shellescape}.bundle" }
293
+ end
294
+ resource_paths + resource_bundles
265
295
  end
266
- @resource_paths[include_test_spec_paths]
267
296
  end
268
297
 
269
298
  # Returns the corresponding native target to use based on the provided specification.
@@ -346,6 +375,15 @@ module Pod
346
375
  "#{label}-#{test_type.capitalize}-Tests"
347
376
  end
348
377
 
378
+ # @param [Symbol] test_type
379
+ # The test type to use for producing the test label.
380
+ #
381
+ # @return [String] The label of the app host label to use given the platform and test type.
382
+ #
383
+ def app_host_label(test_type)
384
+ "AppHost-#{Platform.string_name(platform.symbolic_name)}-#{test_type.capitalize}-Tests"
385
+ end
386
+
349
387
  # @param [Symbol] test_type
350
388
  # The test type this embed frameworks script path is for.
351
389
  #
@@ -364,6 +402,21 @@ module Pod
364
402
  support_files_dir + "#{test_target_label(test_type)}-frameworks.sh"
365
403
  end
366
404
 
405
+ # @return [Pathname] the absolute path of the prefix header file.
406
+ #
407
+ def prefix_header_path
408
+ support_files_dir + "#{label}-prefix.pch"
409
+ end
410
+
411
+ # @param [Symbol] test_type
412
+ # The test type prefix header path is for.
413
+ #
414
+ # @return [Pathname] the absolute path of the prefix header file for the given test type.
415
+ #
416
+ def prefix_header_path_for_test_type(test_type)
417
+ support_files_dir + "#{test_target_label(test_type)}-prefix.pch"
418
+ end
419
+
367
420
  # @return [Array<String>] The names of the Pods on which this target
368
421
  # depends.
369
422
  #
@@ -499,6 +552,13 @@ module Pod
499
552
  "${PODS_ROOT}/#{sandbox.pod_dir(pod_name).relative_path_from(sandbox.root)}"
500
553
  end
501
554
 
555
+ # @return [String] The version associated with this target
556
+ #
557
+ def version
558
+ version = root_spec.version
559
+ [version.major, version.minor, version.patch].join('.')
560
+ end
561
+
502
562
  private
503
563
 
504
564
  # @param [TargetDefinition] target_definition
@@ -16,7 +16,7 @@ module Pod
16
16
 
17
17
  # The default version of Swift to use when linting pods
18
18
  #
19
- DEFAULT_SWIFT_VERSION = '3.0'.freeze
19
+ DEFAULT_SWIFT_VERSION = '3.2'.freeze
20
20
 
21
21
  # @return [Specification::Linter] the linter instance from CocoaPods
22
22
  # Core.
@@ -256,7 +256,7 @@ module Pod
256
256
  # @return [String] the SWIFT_VERSION to use for validation.
257
257
  #
258
258
  def swift_version
259
- return @swift_version if defined?(@swift_version)
259
+ return @swift_version unless @swift_version.nil?
260
260
  if version = dot_swift_version
261
261
  @swift_version = version
262
262
  else
@@ -277,11 +277,10 @@ module Pod
277
277
  swift_version_path.read.strip
278
278
  end
279
279
 
280
- # @return [String] A string representing the Swift version used during linting
281
- # or nil, if Swift was not used.
280
+ # @return [Boolean] Whether any of the pod targets part of this validator use Swift or not.
282
281
  #
283
- def used_swift_version
284
- swift_version if @installer.pod_targets.any?(&:uses_swift?)
282
+ def uses_swift?
283
+ @installer.pod_targets.any?(&:uses_swift?)
285
284
  end
286
285
 
287
286
  #-------------------------------------------------------------------------#
@@ -318,7 +317,7 @@ module Pod
318
317
  download_pod
319
318
  check_file_patterns
320
319
  install_pod
321
- validate_dot_swift_version
320
+ validate_swift_version
322
321
  add_app_project_import
323
322
  validate_vendored_dynamic_frameworks
324
323
  build_pod
@@ -394,14 +393,21 @@ module Pod
394
393
  validate_url(spec.documentation_url) if spec.documentation_url
395
394
  end
396
395
 
397
- def validate_dot_swift_version
398
- if !used_swift_version.nil? && @swift_version.nil?
396
+ # Performs validation for which version of Swift is used during validation.
397
+ #
398
+ # The user will be warned that the default version of Swift was used if the following things are true:
399
+ # - The project uses Swift at all
400
+ # - The user did not supply a Swift version via a parameter
401
+ # - There is no `.swift-version` file present either.
402
+ #
403
+ def validate_swift_version
404
+ if uses_swift? && @swift_version.nil? && dot_swift_version.nil?
399
405
  warning(:swift_version,
400
- 'The validator for Swift projects uses ' \
401
- 'Swift 3.0 by default, if you are using a different version of ' \
402
- 'swift you can use a `.swift-version` file to set the version for ' \
403
- "your Pod. For example to use Swift 2.3, run: \n" \
404
- ' `echo "2.3" > .swift-version`')
406
+ 'The validator used ' \
407
+ "Swift #{DEFAULT_SWIFT_VERSION} by default because no Swift version was specified. " \
408
+ 'If you want to use a different version of Swift during validation, then either use the `--swift-version` parameter ' \
409
+ 'or use a `.swift-version` file to set the version of Swift to use for ' \
410
+ 'your Pod. For example to use Swift 4.0, run: `echo "4.0" > .swift-version`.')
405
411
  end
406
412
  end
407
413
 
@@ -439,71 +445,24 @@ module Pod
439
445
 
440
446
  def create_app_project
441
447
  app_project = Xcodeproj::Project.new(validation_dir + 'App.xcodeproj')
442
- app_project.new_target(:application, 'App', consumer.platform_name, deployment_target)
448
+ Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name, deployment_target)
443
449
  app_project.save
444
450
  app_project.recreate_user_schemes
445
451
  end
446
452
 
447
453
  def add_app_project_import
448
454
  app_project = Xcodeproj::Project.open(validation_dir + 'App.xcodeproj')
449
- pod_target = @installer.pod_targets.find { |pt| pt.pod_name == spec.root.name }
450
-
451
- source_file = write_app_import_source_file(pod_target)
452
- source_file_ref = app_project.new_group('App', 'App').new_file(source_file)
453
455
  app_target = app_project.targets.first
454
- app_target.add_file_references([source_file_ref])
455
- add_swift_version(app_target)
456
- add_xctest(app_target) if @installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
456
+ pod_target = @installer.pod_targets.find { |pt| pt.pod_name == spec.root.name }
457
+ Pod::Generator::AppTargetHelper.add_app_project_import(app_project, app_target, pod_target, consumer.platform_name, use_frameworks)
458
+ Pod::Generator::AppTargetHelper.add_swift_version(app_target, swift_version)
459
+ Pod::Generator::AppTargetHelper.add_xctest_search_paths(app_target) if @installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
457
460
  app_project.save
458
461
  Xcodeproj::XCScheme.share_scheme(app_project.path, 'App')
459
462
  # Share the pods xcscheme only if it exists. For pre-built vendored pods there is no xcscheme generated.
460
463
  Xcodeproj::XCScheme.share_scheme(@installer.pods_project.path, pod_target.label) if shares_pod_target_xcscheme?(pod_target)
461
464
  end
462
465
 
463
- def add_swift_version(app_target)
464
- app_target.build_configurations.each do |configuration|
465
- configuration.build_settings['SWIFT_VERSION'] = swift_version
466
- end
467
- end
468
-
469
- def add_xctest(app_target)
470
- app_target.build_configurations.each do |configuration|
471
- search_paths = configuration.build_settings['FRAMEWORK_SEARCH_PATHS'] ||= '$(inherited)'
472
- search_paths << ' "$(PLATFORM_DIR)/Developer/Library/Frameworks"'
473
- end
474
- end
475
-
476
- def write_app_import_source_file(pod_target)
477
- language = pod_target.uses_swift? ? :swift : :objc
478
-
479
- if language == :swift
480
- source_file = validation_dir.+('App/main.swift')
481
- source_file.parent.mkpath
482
- import_statement = use_frameworks && pod_target.should_build? ? "import #{pod_target.product_module_name}\n" : ''
483
- source_file.open('w') { |f| f << import_statement }
484
- else
485
- source_file = validation_dir.+('App/main.m')
486
- source_file.parent.mkpath
487
- import_statement = if use_frameworks && pod_target.should_build?
488
- "@import #{pod_target.product_module_name};\n"
489
- else
490
- header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
491
- if pod_target.sandbox.public_headers.root.+(header_name).file?
492
- "#import <#{header_name}>\n"
493
- else
494
- ''
495
- end
496
- end
497
- source_file.open('w') do |f|
498
- f << "@import Foundation;\n"
499
- f << "@import UIKit;\n" if consumer.platform_name == :ios || consumer.platform_name == :tvos
500
- f << "@import Cocoa;\n" if consumer.platform_name == :osx
501
- f << "#{import_statement}int main() {}\n"
502
- end
503
- end
504
- source_file
505
- end
506
-
507
466
  # It creates a podfile in memory and builds a library containing the pod
508
467
  # for all available platforms with xcodebuild.
509
468
  #