cocoapods 1.7.5 → 1.8.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +175 -11
- data/LICENSE +13 -8
- data/README.md +2 -1
- data/lib/cocoapods/command/init.rb +18 -16
- data/lib/cocoapods/command/install.rb +2 -1
- data/lib/cocoapods/command/lib/create.rb +1 -2
- data/lib/cocoapods/command/lib/lint.rb +12 -11
- data/lib/cocoapods/command/repo/add.rb +2 -2
- data/lib/cocoapods/command/repo/list.rb +7 -5
- data/lib/cocoapods/command/repo/push.rb +15 -12
- data/lib/cocoapods/command/setup.rb +2 -88
- data/lib/cocoapods/command/spec/lint.rb +10 -9
- data/lib/cocoapods/command/update.rb +5 -4
- data/lib/cocoapods/config.rb +9 -8
- data/lib/cocoapods/external_sources/path_source.rb +1 -1
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/embed_frameworks_script.rb +1 -1
- data/lib/cocoapods/generator/info_plist_file.rb +2 -2
- data/lib/cocoapods/installer.rb +32 -12
- data/lib/cocoapods/installer/analyzer.rb +132 -97
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +6 -8
- data/lib/cocoapods/installer/installation_options.rb +4 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +17 -1
- data/lib/cocoapods/installer/podfile_validator.rb +26 -6
- data/lib/cocoapods/installer/project_cache/project_cache_analyzer.rb +37 -27
- data/lib/cocoapods/installer/project_cache/project_cache_version.rb +1 -1
- data/lib/cocoapods/installer/project_cache/project_installation_cache.rb +3 -3
- data/lib/cocoapods/installer/project_cache/project_metadata_cache.rb +12 -6
- data/lib/cocoapods/installer/project_cache/target_cache_key.rb +32 -8
- data/lib/cocoapods/installer/project_cache/target_metadata.rb +6 -2
- data/lib/cocoapods/installer/sandbox_dir_cleaner.rb +12 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +1 -1
- data/lib/cocoapods/installer/xcode/multi_pods_project_generator.rb +3 -1
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_dependency_installer.rb +2 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +18 -3
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb +53 -11
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +92 -60
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +66 -50
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +12 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +6 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +2 -2
- data/lib/cocoapods/installer/xcode/target_validator.rb +30 -14
- data/lib/cocoapods/native_target_extension.rb +11 -5
- data/lib/cocoapods/open-uri.rb +1 -1
- data/lib/cocoapods/project.rb +13 -7
- data/lib/cocoapods/resolver.rb +63 -53
- data/lib/cocoapods/resolver/lazy_specification.rb +14 -5
- data/lib/cocoapods/sandbox.rb +35 -2
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +3 -4
- data/lib/cocoapods/sources_manager.rb +72 -43
- data/lib/cocoapods/target.rb +7 -1
- data/lib/cocoapods/target/aggregate_target.rb +13 -8
- data/lib/cocoapods/target/build_settings.rb +33 -10
- data/lib/cocoapods/target/pod_target.rb +114 -30
- data/lib/cocoapods/user_interface/error_report.rb +9 -5
- data/lib/cocoapods/validator.rb +55 -11
- data/lib/cocoapods/version_metadata.rb +14 -1
- metadata +6 -7
- data/lib/cocoapods/command/spec/env_spec.rb +0 -53
@@ -59,6 +59,10 @@ module Pod
|
|
59
59
|
#
|
60
60
|
attr_reader :installation_options
|
61
61
|
|
62
|
+
# @return [Source::Manager] the sources manager to use when resolving dependencies
|
63
|
+
#
|
64
|
+
attr_reader :sources_manager
|
65
|
+
|
62
66
|
# Initialize a new instance
|
63
67
|
#
|
64
68
|
# @param [Sandbox] sandbox @see #sandbox
|
@@ -67,9 +71,10 @@ module Pod
|
|
67
71
|
# @param [Array<Source>] plugin_sources @see #plugin_sources
|
68
72
|
# @param [Boolean] has_dependencies @see #has_dependencies
|
69
73
|
# @param [Hash, Boolean, nil] pods_to_update @see #pods_to_update
|
74
|
+
# @param [Source::Manager] sources_manager @see #sources_manager
|
70
75
|
#
|
71
76
|
def initialize(sandbox, podfile, lockfile = nil, plugin_sources = nil, has_dependencies = true,
|
72
|
-
pods_to_update = false)
|
77
|
+
pods_to_update = false, sources_manager = Source::Manager.new(config.repos_dir))
|
73
78
|
@sandbox = sandbox
|
74
79
|
@podfile = podfile
|
75
80
|
@lockfile = lockfile
|
@@ -78,6 +83,7 @@ module Pod
|
|
78
83
|
@pods_to_update = pods_to_update
|
79
84
|
@installation_options = podfile.installation_options
|
80
85
|
@podfile_dependency_cache = PodfileDependencyCache.from_podfile(podfile)
|
86
|
+
@sources_manager = sources_manager
|
81
87
|
@result = nil
|
82
88
|
end
|
83
89
|
|
@@ -117,9 +123,8 @@ module Pod
|
|
117
123
|
locked_dependencies = generate_version_locking_dependencies(podfile_state)
|
118
124
|
resolver_specs_by_target = resolve_dependencies(locked_dependencies)
|
119
125
|
validate_platforms(resolver_specs_by_target)
|
120
|
-
specifications
|
121
|
-
|
122
|
-
pod_targets = calculate_pod_targets(targets)
|
126
|
+
specifications = generate_specifications(resolver_specs_by_target)
|
127
|
+
aggregate_targets, pod_targets = generate_targets(resolver_specs_by_target, target_inspections)
|
123
128
|
sandbox_state = generate_sandbox_state(specifications)
|
124
129
|
specs_by_target = resolver_specs_by_target.each_with_object({}) do |rspecs_by_target, hash|
|
125
130
|
hash[rspecs_by_target[0]] = rspecs_by_target[1].map(&:spec)
|
@@ -129,17 +134,17 @@ module Pod
|
|
129
134
|
end]
|
130
135
|
sources.each { |s| specs_by_source[s] ||= [] }
|
131
136
|
@result = AnalysisResult.new(podfile_state, specs_by_target, specs_by_source, specifications, sandbox_state,
|
132
|
-
|
137
|
+
aggregate_targets, pod_targets, @podfile_dependency_cache)
|
133
138
|
end
|
134
139
|
|
135
140
|
# Updates the git source repositories.
|
136
141
|
#
|
137
142
|
def update_repositories
|
138
143
|
sources.each do |source|
|
139
|
-
if source.
|
140
|
-
|
144
|
+
if source.updateable?
|
145
|
+
sources_manager.update(source.name, true)
|
141
146
|
else
|
142
|
-
UI.message "Skipping `#{source.name}` update because the repository is not
|
147
|
+
UI.message "Skipping `#{source.name}` update because the repository is not an updateable repository."
|
143
148
|
end
|
144
149
|
end
|
145
150
|
@specs_updated = true
|
@@ -164,16 +169,19 @@ module Pod
|
|
164
169
|
if all_dependencies_have_sources
|
165
170
|
sources = dependency_sources
|
166
171
|
elsif has_dependencies? && sources.empty? && plugin_sources.empty?
|
167
|
-
sources = [
|
172
|
+
sources = [Pod::TrunkSource::TRUNK_REPO_URL] + dependency_sources
|
168
173
|
else
|
169
174
|
sources += dependency_sources
|
170
175
|
end
|
171
176
|
|
172
177
|
result = sources.uniq.map do |source_url|
|
173
|
-
|
178
|
+
sources_manager.find_or_create_source_with_url(source_url)
|
174
179
|
end
|
175
180
|
unless plugin_sources.empty?
|
176
181
|
result.insert(0, *plugin_sources)
|
182
|
+
plugin_sources.each do |source|
|
183
|
+
sources_manager.add_source(source)
|
184
|
+
end
|
177
185
|
end
|
178
186
|
result
|
179
187
|
end
|
@@ -299,7 +307,7 @@ module Pod
|
|
299
307
|
host_target_uuids = Set.new(aggregate_target.user_project.host_targets_for_embedded_target(embedded_user_target).map(&:uuid))
|
300
308
|
!aggregate_user_target_uuids.intersection(host_target_uuids).empty?
|
301
309
|
end
|
302
|
-
embedded_aggregate_target.user_build_configurations.
|
310
|
+
embedded_aggregate_target.user_build_configurations.each_key do |configuration_name|
|
303
311
|
pod_target_names = Set.new(aggregate_target.pod_targets_for_build_configuration(configuration_name).map(&:name))
|
304
312
|
embedded_pod_targets = embedded_aggregate_target.pod_targets_for_build_configuration(configuration_name).select do |pod_target|
|
305
313
|
if !pod_target_names.include?(pod_target.name) &&
|
@@ -326,11 +334,16 @@ module Pod
|
|
326
334
|
#
|
327
335
|
def analyze_host_targets_in_podfile(aggregate_targets, embedded_aggregate_targets)
|
328
336
|
target_definitions_by_uuid = {}
|
337
|
+
cli_host_with_frameworks = []
|
338
|
+
cli_product_type = 'com.apple.product-type.tool'
|
329
339
|
# Collect aggregate target definitions by uuid to later lookup host target
|
330
340
|
# definitions and verify their compatiblity with their embedded targets
|
331
341
|
aggregate_targets.each do |target|
|
332
|
-
target.user_targets.
|
333
|
-
target_definitions_by_uuid[uuid] = target.target_definition
|
342
|
+
target.user_targets.each do |user_target|
|
343
|
+
target_definitions_by_uuid[user_target.uuid] = target.target_definition
|
344
|
+
if user_target.product_type == cli_product_type
|
345
|
+
cli_host_with_frameworks << user_target
|
346
|
+
end
|
334
347
|
end
|
335
348
|
end
|
336
349
|
aggregate_target_user_projects = aggregate_targets.map(&:user_project)
|
@@ -338,9 +351,8 @@ module Pod
|
|
338
351
|
host_uuid_to_embedded_target_definitions = {}
|
339
352
|
# Search all of the known user projects for each embedded target's hosts
|
340
353
|
embedded_aggregate_targets.each do |target|
|
341
|
-
host_uuids =
|
342
|
-
|
343
|
-
host_uuids += user_project.host_targets_for_embedded_target(user_target).map(&:uuid)
|
354
|
+
host_uuids = aggregate_target_user_projects.product(target.user_targets).flat_map do |user_project, user_target|
|
355
|
+
user_project.host_targets_for_embedded_target(user_target).map(&:uuid)
|
344
356
|
end
|
345
357
|
# For each host, keep track of its embedded target definitions
|
346
358
|
# to later verify each embedded target's compatiblity with its host,
|
@@ -356,6 +368,12 @@ module Pod
|
|
356
368
|
end
|
357
369
|
end
|
358
370
|
|
371
|
+
unless cli_host_with_frameworks.empty?
|
372
|
+
UI.warn "The Podfile contains command line tool target(s) (#{cli_host_with_frameworks.map(&:name).to_sentence}) which are attempting to integrate dynamic frameworks." \
|
373
|
+
"\n" \
|
374
|
+
'This may not behave as expected, because command line tools are usually distributed as a single binary and cannot contain their own dynamic frameworks.'
|
375
|
+
end
|
376
|
+
|
359
377
|
unless embedded_targets_missing_hosts.empty?
|
360
378
|
embedded_targets_missing_hosts_product_types = Set.new embedded_targets_missing_hosts.flat_map(&:user_targets).map(&:symbol_type)
|
361
379
|
target_names = embedded_targets_missing_hosts.map do |target|
|
@@ -404,13 +422,15 @@ module Pod
|
|
404
422
|
# @param [Array<TargetInspection>] target_inspections
|
405
423
|
# the user target inspections used to construct the aggregate and pod targets.
|
406
424
|
#
|
407
|
-
# @return [Array<AggregateTarget>] the list of aggregate targets generated
|
425
|
+
# @return [(Array<AggregateTarget>, Array<PodTarget>)] the list of aggregate targets generated,
|
426
|
+
# and the list of pod targets generated.
|
408
427
|
#
|
409
|
-
def
|
410
|
-
resolver_specs_by_target = resolver_specs_by_target.reject { |td, _| td.abstract? }
|
428
|
+
def generate_targets(resolver_specs_by_target, target_inspections)
|
429
|
+
resolver_specs_by_target = resolver_specs_by_target.reject { |td, _| td.abstract? && !td.platform }
|
411
430
|
pod_targets = generate_pod_targets(resolver_specs_by_target, target_inspections)
|
412
|
-
|
413
|
-
|
431
|
+
pod_targets_by_target_definition = group_pod_targets_by_target_definition(pod_targets, resolver_specs_by_target)
|
432
|
+
aggregate_targets = resolver_specs_by_target.keys.reject(&:abstract?).map do |target_definition|
|
433
|
+
generate_aggregate_target(target_definition, target_inspections, pod_targets_by_target_definition)
|
414
434
|
end
|
415
435
|
aggregate_targets.each do |target|
|
416
436
|
search_paths_aggregate_targets = aggregate_targets.select do |aggregate_target|
|
@@ -438,7 +458,7 @@ module Pod
|
|
438
458
|
aggregate_target.merge_embedded_pod_targets(embedded_pod_targets)
|
439
459
|
end
|
440
460
|
end
|
441
|
-
aggregate_targets
|
461
|
+
[aggregate_targets, pod_targets]
|
442
462
|
end
|
443
463
|
|
444
464
|
# Setup the aggregate target for a single user target
|
@@ -449,18 +469,15 @@ module Pod
|
|
449
469
|
# @param [Hash{TargetDefinition => TargetInspectionResult}] target_inspections
|
450
470
|
# the user target inspections used to construct the aggregate and pod targets.
|
451
471
|
#
|
452
|
-
# @param [Array<PodTarget>]
|
453
|
-
# the pod targets
|
454
|
-
#
|
455
|
-
# @param [Hash{Podfile::TargetDefinition => Array<ResolvedSpecification>}] resolver_specs_by_target
|
456
|
-
# the resolved specifications grouped by target.
|
472
|
+
# @param [Hash{Podfile::TargetDefinition => Array<PodTarget>}] pod_targets_by_target_definition
|
473
|
+
# the pod targets grouped by target.
|
457
474
|
#
|
458
475
|
# @return [AggregateTarget]
|
459
476
|
#
|
460
|
-
def generate_aggregate_target(target_definition, target_inspections,
|
477
|
+
def generate_aggregate_target(target_definition, target_inspections, pod_targets_by_target_definition)
|
461
478
|
if installation_options.integrate_targets?
|
462
479
|
target_inspection = target_inspections[target_definition]
|
463
|
-
raise "missing inspection
|
480
|
+
raise "missing inspection for #{target_definition.inspect}" unless target_inspection
|
464
481
|
target_requires_64_bit = Analyzer.requires_64_bit_archs?(target_definition.platform, target_inspection.project.object_version)
|
465
482
|
user_project = target_inspection.project
|
466
483
|
client_root = target_inspection.client_root
|
@@ -477,8 +494,7 @@ module Pod
|
|
477
494
|
end
|
478
495
|
platform = target_definition.platform
|
479
496
|
build_configurations = user_build_configurations.keys.concat(target_definition.all_whitelisted_configurations).uniq
|
480
|
-
pod_targets_for_build_configuration = filter_pod_targets_for_target_definition(target_definition,
|
481
|
-
resolver_specs_by_target,
|
497
|
+
pod_targets_for_build_configuration = filter_pod_targets_for_target_definition(target_definition, pod_targets_by_target_definition,
|
482
498
|
build_configurations)
|
483
499
|
|
484
500
|
build_type = target_definition.uses_frameworks? ? Target::BuildType.static_framework : Target::BuildType.static_library
|
@@ -487,21 +503,25 @@ module Pod
|
|
487
503
|
pod_targets_for_build_configuration, :build_type => build_type)
|
488
504
|
end
|
489
505
|
|
490
|
-
#
|
506
|
+
# Returns a filtered list of pod targets that should or should not be part of the target definition. Pod targets
|
507
|
+
# used by tests only are filtered.
|
508
|
+
#
|
509
|
+
# @return [Hash{TargetDefinition => Array<PodTarget>}]
|
491
510
|
#
|
492
|
-
def
|
493
|
-
|
494
|
-
|
495
|
-
pod_target.
|
496
|
-
pod_target
|
511
|
+
def group_pod_targets_by_target_definition(pod_targets, resolver_specs_by_target)
|
512
|
+
pod_targets_by_target_definition = Hash.new { |h, td| h[td] = [] }
|
513
|
+
pod_targets.each do |pod_target|
|
514
|
+
pod_target.target_definitions.each do |td|
|
515
|
+
pod_targets_by_target_definition[td] << pod_target
|
497
516
|
end
|
498
517
|
end
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
518
|
+
resolver_specs_by_target.each do |td, resolver_specs|
|
519
|
+
specs_by_pod_name = resolver_specs.group_by { |s| s.root.name }
|
520
|
+
specs_by_pod_name.reject! { |_, specs| specs.all?(&:used_by_non_library_targets_only?) }
|
521
|
+
pod_targets_by_target_definition[td].keep_if { |pod_target| specs_by_pod_name.key?(pod_target.pod_name) }
|
503
522
|
end
|
504
|
-
|
523
|
+
|
524
|
+
pod_targets_by_target_definition
|
505
525
|
end
|
506
526
|
|
507
527
|
# Returns a filtered list of pod targets that should or should not be part of the target definition. Pod targets
|
@@ -510,11 +530,8 @@ module Pod
|
|
510
530
|
# @param [TargetDefinition] target_definition
|
511
531
|
# the target definition to use as the base for filtering
|
512
532
|
#
|
513
|
-
# @param
|
514
|
-
#
|
515
|
-
#
|
516
|
-
# @param [Hash{Podfile::TargetDefinition => Array<ResolvedSpecification>}] resolver_specs_by_target
|
517
|
-
# the resolved specifications grouped by target.
|
533
|
+
# @param [Hash{Podfile::TargetDefinition => Array<PodTarget>}] pod_targets_by_target_definition
|
534
|
+
# the pod targets grouped by target.
|
518
535
|
#
|
519
536
|
# @param [Array<String>] build_configurations
|
520
537
|
# The list of all build configurations the targets will be built for.
|
@@ -522,16 +539,11 @@ module Pod
|
|
522
539
|
# @return [Hash<String => Array<PodTarget>>]
|
523
540
|
# the filtered list of pod targets, grouped by build configuration.
|
524
541
|
#
|
525
|
-
def filter_pod_targets_for_target_definition(target_definition,
|
542
|
+
def filter_pod_targets_for_target_definition(target_definition, pod_targets_by_target_definition, build_configurations)
|
526
543
|
pod_targets_by_build_config = Hash.new([].freeze)
|
527
544
|
build_configurations.each { |config| pod_targets_by_build_config[config] = [] }
|
528
545
|
|
529
|
-
|
530
|
-
next unless pod_target.target_definitions.include?(target_definition)
|
531
|
-
next unless resolver_specs_by_target[target_definition].any? do |resolver_spec|
|
532
|
-
!resolver_spec.used_by_non_library_targets_only? && pod_target.specs.include?(resolver_spec.spec)
|
533
|
-
end
|
534
|
-
|
546
|
+
pod_targets_by_target_definition[target_definition].each do |pod_target|
|
535
547
|
pod_name = pod_target.pod_name
|
536
548
|
|
537
549
|
dependencies = @podfile_dependency_cache.target_definition_dependencies(target_definition).select do |dependency|
|
@@ -593,33 +605,17 @@ module Pod
|
|
593
605
|
end
|
594
606
|
|
595
607
|
pod_targets = distinct_targets.flat_map do |_root, target_definitions_by_variant|
|
608
|
+
target_definitions_by_variant.each_value do |target_definitions|
|
609
|
+
target_definitions.reject!(&:abstract?) unless target_definitions.all?(&:abstract?)
|
610
|
+
end
|
596
611
|
suffixes = PodVariantSet.new(target_definitions_by_variant.keys).scope_suffixes
|
597
612
|
target_definitions_by_variant.map do |variant, target_definitions|
|
598
613
|
generate_pod_target(target_definitions, target_inspections, variant.specs + variant.test_specs + variant.app_specs, :build_type => variant.build_type, :scope_suffix => suffixes[variant])
|
599
614
|
end
|
600
615
|
end
|
601
616
|
|
602
|
-
pod_targets_by_name = pod_targets.group_by(&:pod_name).each_with_object({}) do |(name, values), hash|
|
603
|
-
# Sort the target by the number of activated subspecs, so that
|
604
|
-
# we prefer a minimal target as transitive dependency.
|
605
|
-
hash[name] = values.sort_by { |pt| pt.specs.count }
|
606
|
-
end
|
607
617
|
all_specs = resolver_specs_by_target.values.flatten.map(&:spec).uniq.group_by(&:name)
|
608
|
-
pod_targets
|
609
|
-
dependencies = dependencies_for_specs(target.library_specs.to_set, target.platform, all_specs.dup).group_by(&:root)
|
610
|
-
target.dependent_targets = filter_dependencies(dependencies, pod_targets_by_name, target)
|
611
|
-
target.test_dependent_targets_by_spec_name = target.test_specs.each_with_object({}) do |test_spec, hash|
|
612
|
-
test_dependencies = dependencies_for_specs([test_spec], target.platform, all_specs).group_by(&:root)
|
613
|
-
test_dependencies.delete_if { |k| dependencies.key? k }
|
614
|
-
hash[test_spec.name] = filter_dependencies(test_dependencies, pod_targets_by_name, target)
|
615
|
-
end
|
616
|
-
|
617
|
-
target.app_dependent_targets_by_spec_name = target.app_specs.each_with_object({}) do |app_spec, hash|
|
618
|
-
app_dependencies = dependencies_for_specs([app_spec], target.platform, all_specs).group_by(&:root)
|
619
|
-
app_dependencies.delete_if { |k| dependencies.key? k }
|
620
|
-
hash[app_spec.name] = filter_dependencies(app_dependencies, pod_targets_by_name, target)
|
621
|
-
end
|
622
|
-
end
|
618
|
+
compute_pod_target_dependencies(pod_targets, all_specs)
|
623
619
|
else
|
624
620
|
dedupe_cache = {}
|
625
621
|
resolver_specs_by_target.flat_map do |target_definition, specs|
|
@@ -629,21 +625,48 @@ module Pod
|
|
629
625
|
generate_pod_target([target_definition], target_inspections, pod_specs.map(&:spec), :build_type => target_type).scoped(dedupe_cache)
|
630
626
|
end
|
631
627
|
|
632
|
-
pod_targets.
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
628
|
+
compute_pod_target_dependencies(pod_targets, specs.map(&:spec).group_by(&:name))
|
629
|
+
end
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
# Compute the dependencies for the set of pod targets.
|
634
|
+
#
|
635
|
+
# @param [Array<PodTarget>] pod_targets
|
636
|
+
# pod targets.
|
637
|
+
#
|
638
|
+
# @param [Hash{String => Array<Specification>}] all_specs
|
639
|
+
# specifications grouped by name.
|
640
|
+
#
|
641
|
+
# @return [Array<PodTarget>]
|
642
|
+
#
|
643
|
+
def compute_pod_target_dependencies(pod_targets, all_specs)
|
644
|
+
pod_targets_by_name = pod_targets.group_by(&:pod_name).each_with_object({}) do |(name, values), hash|
|
645
|
+
# Sort the target by the number of activated subspecs, so that
|
646
|
+
# we prefer a minimal target as transitive dependency.
|
647
|
+
hash[name] = values.sort_by { |pt| pt.specs.count }
|
648
|
+
end
|
649
|
+
|
650
|
+
pod_targets.each do |target|
|
651
|
+
dependencies = dependencies_for_specs(target.library_specs.to_set, target.platform, all_specs).group_by(&:root)
|
652
|
+
target.dependent_targets = filter_dependencies(dependencies, pod_targets_by_name, target)
|
653
|
+
target.test_dependent_targets_by_spec_name = target.test_specs.each_with_object({}) do |test_spec, hash|
|
654
|
+
test_dependencies = dependencies_for_specs([test_spec], target.platform, all_specs).group_by(&:root)
|
655
|
+
test_dependencies.delete_if { |k, _| dependencies.key? k }
|
656
|
+
hash[test_spec.name] = filter_dependencies(test_dependencies, pod_targets_by_name, target)
|
657
|
+
end
|
658
|
+
|
659
|
+
target.app_dependent_targets_by_spec_name = target.app_specs.each_with_object({}) do |app_spec, hash|
|
660
|
+
app_dependencies = dependencies_for_specs([app_spec], target.platform, all_specs).group_by(&:root)
|
661
|
+
app_dependencies.delete_if { |k, _| dependencies.key? k }
|
662
|
+
hash[app_spec.name] = filter_dependencies(app_dependencies, pod_targets_by_name, target)
|
663
|
+
end
|
664
|
+
|
665
|
+
target.test_app_hosts_by_spec_name = target.test_specs.each_with_object({}) do |test_spec, hash|
|
666
|
+
next unless app_host_name = test_spec.consumer(target.platform).app_host_name
|
667
|
+
app_host_spec = pod_targets_by_name[Specification.root_name(app_host_name)].flat_map(&:app_specs).find { |pt| pt.name == app_host_name }
|
668
|
+
app_host_dependencies = { app_host_spec.root => [app_host_spec] }
|
669
|
+
hash[test_spec.name] = [app_host_spec, filter_dependencies(app_host_dependencies, pod_targets_by_name, target).first]
|
647
670
|
end
|
648
671
|
end
|
649
672
|
end
|
@@ -683,6 +706,13 @@ module Pod
|
|
683
706
|
specs.each do |s|
|
684
707
|
s.dependencies(platform).each do |dep|
|
685
708
|
all_specs[dep.name].each do |spec|
|
709
|
+
if spec.non_library_specification?
|
710
|
+
if s.test_specification? && spec.name == s.consumer(platform).app_host_name && spec.app_specification?
|
711
|
+
# This needs to be handled separately, since we _don't_ want to treat this as a "normal" dependency
|
712
|
+
next
|
713
|
+
end
|
714
|
+
raise Informative, "#{s} depends upon `#{spec}`, which is a `#{spec.spec_type}` spec."
|
715
|
+
end
|
686
716
|
dependent_specs << spec
|
687
717
|
end
|
688
718
|
end
|
@@ -708,10 +738,10 @@ module Pod
|
|
708
738
|
# @return [PodTarget]
|
709
739
|
#
|
710
740
|
def generate_pod_target(target_definitions, target_inspections, specs, scope_suffix: nil, build_type: nil)
|
711
|
-
|
741
|
+
target_inspections = target_inspections.select { |t, _| target_definitions.include?(t) }.values
|
742
|
+
object_version = target_inspections.map { |ti| ti.project.object_version }.min
|
712
743
|
target_requires_64_bit = target_definitions.all? { |td| Analyzer.requires_64_bit_archs?(td.platform, object_version) }
|
713
|
-
if
|
714
|
-
target_inspections = target_inspections.select { |t, _| target_definitions.include?(t) }.values
|
744
|
+
if !target_inspections.empty?
|
715
745
|
user_build_configurations = target_inspections.map(&:build_configurations).reduce({}, &:merge)
|
716
746
|
archs = if target_requires_64_bit
|
717
747
|
['$(ARCHS_STANDARD_64_BIT)']
|
@@ -719,7 +749,7 @@ module Pod
|
|
719
749
|
target_inspections.flat_map(&:archs).compact.uniq.sort
|
720
750
|
end
|
721
751
|
else
|
722
|
-
user_build_configurations =
|
752
|
+
user_build_configurations = Target::DEFAULT_BUILD_CONFIGURATIONS
|
723
753
|
archs = target_requires_64_bit ? ['$(ARCHS_STANDARD_64_BIT)'] : []
|
724
754
|
end
|
725
755
|
host_requires_frameworks = target_definitions.any?(&:uses_frameworks?)
|
@@ -748,7 +778,11 @@ module Pod
|
|
748
778
|
end
|
749
779
|
end
|
750
780
|
|
751
|
-
# Calculates and returns the platform to use for the given list
|
781
|
+
# Calculates and returns the platform to use for the given list specs and target definitions.
|
782
|
+
#
|
783
|
+
# @note The platform is only determined by all library specs and ignores non library ones. Subspecs are always
|
784
|
+
# integrated in the same target as the root spec therefore the max deployment target is always returned
|
785
|
+
# across the specs passed.
|
752
786
|
#
|
753
787
|
# @param [Array<Specification>] specs
|
754
788
|
# the specs to inspect and calculate the platform for.
|
@@ -762,10 +796,11 @@ module Pod
|
|
762
796
|
# @return [Platform]
|
763
797
|
#
|
764
798
|
def determine_platform(specs, target_definitions, host_requires_frameworks)
|
799
|
+
library_specs = specs.select(&:library_specification?)
|
765
800
|
platform_name = target_definitions.first.platform.name
|
766
801
|
default = Podfile::TargetDefinition::PLATFORM_DEFAULTS[platform_name]
|
767
|
-
deployment_target =
|
768
|
-
Version.new(
|
802
|
+
deployment_target = library_specs.map do |library_spec|
|
803
|
+
Version.new(library_spec.deployment_target(platform_name) || default)
|
769
804
|
end.max
|
770
805
|
if platform_name == :ios && host_requires_frameworks
|
771
806
|
minimum = Version.new('8.0')
|
@@ -935,7 +970,7 @@ module Pod
|
|
935
970
|
|
936
971
|
resolver_specs_by_target = nil
|
937
972
|
UI.section "Resolving dependencies of #{UI.path(podfile.defined_in_file) || 'Podfile'}" do
|
938
|
-
resolver = Pod::Resolver.new(sandbox, podfile, locked_dependencies, sources, @specs_updated)
|
973
|
+
resolver = Pod::Resolver.new(sandbox, podfile, locked_dependencies, sources, @specs_updated, :sources_manager => sources_manager)
|
939
974
|
resolver_specs_by_target = resolver.resolve
|
940
975
|
resolver_specs_by_target.values.flatten(1).map(&:spec).each(&:validate_cocoapods_version)
|
941
976
|
end
|
@@ -105,7 +105,7 @@ module Pod
|
|
105
105
|
target = native_targets.find { |t| t.name == target_definition.name.to_s }
|
106
106
|
unless target
|
107
107
|
found = native_targets.map { |t| "`#{t.name}`" }.to_sentence
|
108
|
-
raise Informative, "Unable to find a target named `#{target_definition.name}`, did find #{found}."
|
108
|
+
raise Informative, "Unable to find a target named `#{target_definition.name}` in project `#{Pathname(user_project.path).basename}`, did find #{found}."
|
109
109
|
end
|
110
110
|
[target]
|
111
111
|
end
|
@@ -156,7 +156,7 @@ module Pod
|
|
156
156
|
"Unable to determine the platform for the `#{target_definition.name}` target."
|
157
157
|
end
|
158
158
|
|
159
|
-
UI.warn "Automatically assigning platform `#{name}` with version `#{deployment_target}` " \
|
159
|
+
UI.warn "Automatically assigning platform `#{Platform.string_name(name)}` with version `#{deployment_target}` " \
|
160
160
|
"on target `#{target_definition.name}` because no platform was specified. " \
|
161
161
|
"Please specify a platform for this target in your Podfile. See `#{PLATFORM_INFO_URL}`."
|
162
162
|
|
@@ -218,14 +218,12 @@ module Pod
|
|
218
218
|
#
|
219
219
|
def compute_swift_version_from_targets(targets)
|
220
220
|
versions_to_targets = targets.inject({}) do |memo, target|
|
221
|
-
# User project may have an xcconfig that specifies the `SWIFT_VERSION`.
|
222
|
-
# that
|
221
|
+
# User project may have an xcconfig that specifies the `SWIFT_VERSION`.
|
222
|
+
# Xcodeproj handles that xcconfig either not being set or the file not being present on disk.
|
223
|
+
# After the first integration the xcconfig set is most probably
|
223
224
|
# the one that was generated from CocoaPods. See https://github.com/CocoaPods/CocoaPods/issues/7731 for
|
224
225
|
# more details.
|
225
|
-
|
226
|
-
!bc.base_configuration_reference.nil? && File.exist?(bc.base_configuration_reference.real_path)
|
227
|
-
end
|
228
|
-
versions = target.resolved_build_setting('SWIFT_VERSION', resolve_against_xcconfig).values
|
226
|
+
versions = target.resolved_build_setting('SWIFT_VERSION', true).values
|
229
227
|
versions.each do |version|
|
230
228
|
memo[version] = [] if memo[version].nil?
|
231
229
|
memo[version] << target.name unless memo[version].include? target.name
|