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