cocoapods 1.8.4 → 1.9.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +69 -1
  3. data/lib/cocoapods.rb +1 -0
  4. data/lib/cocoapods/command/setup.rb +1 -0
  5. data/lib/cocoapods/executable.rb +1 -1
  6. data/lib/cocoapods/gem_version.rb +1 -1
  7. data/lib/cocoapods/generator/embed_frameworks_script.rb +36 -6
  8. data/lib/cocoapods/generator/prepare_artifacts_script.rb +244 -0
  9. data/lib/cocoapods/installer.rb +6 -5
  10. data/lib/cocoapods/installer/analyzer.rb +137 -59
  11. data/lib/cocoapods/installer/analyzer/pod_variant.rb +27 -12
  12. data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +11 -2
  13. data/lib/cocoapods/installer/project_cache/project_cache_analyzer.rb +10 -2
  14. data/lib/cocoapods/installer/project_cache/project_installation_cache.rb +15 -2
  15. data/lib/cocoapods/installer/project_cache/target_cache_key.rb +7 -5
  16. data/lib/cocoapods/installer/user_project_integrator.rb +1 -10
  17. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +100 -19
  18. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +3 -0
  19. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +29 -4
  20. data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +7 -2
  21. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +106 -45
  22. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +68 -1
  23. data/lib/cocoapods/installer/xcode/pods_project_generator/pods_project_writer.rb +29 -14
  24. data/lib/cocoapods/sandbox/file_accessor.rb +32 -21
  25. data/lib/cocoapods/sources_manager.rb +9 -2
  26. data/lib/cocoapods/target.rb +11 -14
  27. data/lib/cocoapods/target/aggregate_target.rb +78 -18
  28. data/lib/cocoapods/target/build_settings.rb +64 -31
  29. data/lib/cocoapods/target/pod_target.rb +236 -87
  30. data/lib/cocoapods/user_interface/error_report.rb +14 -4
  31. data/lib/cocoapods/validator.rb +2 -0
  32. data/lib/cocoapods/xcode.rb +7 -0
  33. data/lib/cocoapods/{target → xcode}/framework_paths.rb +14 -1
  34. data/lib/cocoapods/xcode/linkage_analyzer.rb +22 -0
  35. data/lib/cocoapods/xcode/xcframework.rb +81 -0
  36. data/lib/cocoapods/xcode/xcframework/xcframework_slice.rb +51 -0
  37. metadata +12 -8
  38. data/lib/cocoapods/target/build_type.rb +0 -139
@@ -119,7 +119,7 @@ module Pod
119
119
 
120
120
  retval = retval.dup if dup_before_freeze && retval.frozen?
121
121
 
122
- retval.concat(pod_targets_to_link.flat_map { |pod_target| pod_target.build_settings.public_send("#{method_name}_to_import") }) if from_pod_targets_to_link
122
+ retval.concat(pod_targets_to_link.flat_map { |pod_target| pod_target.build_settings_for_spec(pod_target.root_spec, :configuration => configuration_name).public_send("#{method_name}_to_import") }) if from_pod_targets_to_link
123
123
  retval.concat(search_paths_aggregate_target_pod_target_build_settings.flat_map(&from_search_paths_aggregate_targets)) if from_search_paths_aggregate_targets
124
124
 
125
125
  retval.compact! if compacted
@@ -515,7 +515,10 @@ module Pod
515
515
  # @param [Specification] non_library_spec
516
516
  # see {#non_library_spec}
517
517
  #
518
- def initialize(target, non_library_spec = nil)
518
+ # @param [Symbol] configuration
519
+ # see {#configuration}
520
+ #
521
+ def initialize(target, non_library_spec = nil, configuration: nil)
519
522
  super(target)
520
523
  if @non_library_spec = non_library_spec
521
524
  @test_xcconfig = non_library_spec.test_specification?
@@ -527,6 +530,7 @@ module Pod
527
530
  @xcconfig_spec_type = :library
528
531
  @library_xcconfig = true
529
532
  end
533
+ (@configuration = configuration) || raise("No configuration for #{self}.")
530
534
  end
531
535
 
532
536
  # @return [Xcodeproj::Xconfig]
@@ -567,11 +571,14 @@ module Pod
567
571
  if library_xcconfig?
568
572
  # We know that this library target is being built dynamically based
569
573
  # on the guard above, so include any vendored static frameworks.
570
- frameworks.concat vendored_static_frameworks.map { |l| File.basename(l, '.framework') } if target.should_build?
574
+ if target.should_build?
575
+ frameworks.concat vendored_static_frameworks.map { |l| File.basename(l, '.framework') }
576
+ frameworks.concat vendored_xcframeworks.map(&:name)
577
+ end
571
578
  # Also include any vendored dynamic frameworks of dependencies.
572
- frameworks.concat dependent_targets.reject(&:should_build?).flat_map { |pt| pt.build_settings.dynamic_frameworks_to_import }
579
+ frameworks.concat dependent_targets.reject(&:should_build?).flat_map { |pt| pt.build_settings[@configuration].dynamic_frameworks_to_import }
573
580
  else
574
- frameworks.concat dependent_targets_to_link.flat_map { |pt| pt.build_settings.frameworks_to_import }
581
+ frameworks.concat dependent_targets_to_link.flat_map { |pt| pt.build_settings[@configuration].frameworks_to_import }
575
582
  end
576
583
 
577
584
  frameworks
@@ -581,6 +588,12 @@ module Pod
581
588
  define_build_settings_method :static_frameworks_to_import, :memoized => true do
582
589
  static_frameworks_to_import = []
583
590
  static_frameworks_to_import.concat vendored_static_frameworks.map { |f| File.basename(f, '.framework') } unless target.should_build? && target.build_as_dynamic?
591
+ unless target.should_build? && target.build_as_dynamic?
592
+ static_frameworks_to_import.concat vendored_xcframeworks.
593
+ select(&:includes_static_slices?).
594
+ map(&:name).
595
+ uniq
596
+ end
584
597
  static_frameworks_to_import << target.product_basename if target.should_build? && target.build_as_static_framework?
585
598
  static_frameworks_to_import
586
599
  end
@@ -588,6 +601,10 @@ module Pod
588
601
  # @return [Array<String>]
589
602
  define_build_settings_method :dynamic_frameworks_to_import, :memoized => true do
590
603
  dynamic_frameworks_to_import = vendored_dynamic_frameworks.map { |f| File.basename(f, '.framework') }
604
+ dynamic_frameworks_to_import.concat vendored_xcframeworks.
605
+ select(&:includes_dynamic_slices?).
606
+ map(&:name).
607
+ uniq
591
608
  dynamic_frameworks_to_import << target.product_basename if target.should_build? && target.build_as_dynamic_framework?
592
609
  dynamic_frameworks_to_import.concat consumer_frameworks
593
610
  dynamic_frameworks_to_import
@@ -598,7 +615,7 @@ module Pod
598
615
  return [] if target.build_as_static? && library_xcconfig?
599
616
 
600
617
  weak_frameworks = spec_consumers.flat_map(&:weak_frameworks)
601
- weak_frameworks.concat dependent_targets.flat_map { |pt| pt.build_settings.weak_frameworks_to_import }
618
+ weak_frameworks.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].weak_frameworks_to_import }
602
619
  weak_frameworks
603
620
  end
604
621
 
@@ -615,7 +632,7 @@ module Pod
615
632
  # @return [Array<String>]
616
633
  define_build_settings_method :framework_search_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
617
634
  paths = super().dup
618
- paths.concat dependent_targets.flat_map { |t| t.build_settings.framework_search_paths_to_import }
635
+ paths.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].framework_search_paths_to_import }
619
636
  paths.concat framework_search_paths_to_import
620
637
  paths.delete(target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)) if library_xcconfig?
621
638
  paths
@@ -629,7 +646,17 @@ module Pod
629
646
 
630
647
  # @return [Array<String>]
631
648
  define_build_settings_method :vendored_framework_search_paths, :memoized => true do
632
- file_accessors.flat_map(&:vendored_frameworks).map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
649
+ search_paths = []
650
+ search_paths.concat file_accessors.
651
+ flat_map(&:vendored_frameworks).
652
+ map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
653
+ # Include each slice in the framework search paths.
654
+ # Xcode will not search inside an .xcframework for headers within each slice
655
+ search_paths.concat vendored_xcframeworks.
656
+ flat_map(&:slices).
657
+ select { |slice| slice.platform.symbolic_name == target.platform.symbolic_name }.
658
+ flat_map { |slice| File.join '${PODS_ROOT}', slice.path.dirname.relative_path_from(target.sandbox.root) }
659
+ search_paths
633
660
  end
634
661
 
635
662
  # @return [Array<String>]
@@ -651,6 +678,11 @@ module Pod
651
678
  file_accessors.flat_map(&:vendored_dynamic_frameworks)
652
679
  end
653
680
 
681
+ # @return [Array<Xcode::XCFramework>]
682
+ define_build_settings_method :vendored_xcframeworks, :memoized => true do
683
+ file_accessors.flat_map(&:vendored_xcframeworks).map { |path| Xcode::XCFramework.new(path) }
684
+ end
685
+
654
686
  #-------------------------------------------------------------------------#
655
687
 
656
688
  # @!group Libraries
@@ -676,8 +708,8 @@ module Pod
676
708
  libraries.concat libraries_to_import
677
709
  end
678
710
  if non_library_xcconfig?
679
- libraries.concat dependent_targets.flat_map { |pt| pt.build_settings.dynamic_libraries_to_import }
680
- libraries.concat dependent_targets_to_link.flat_map { |pt| pt.build_settings.static_libraries_to_import }
711
+ libraries.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].dynamic_libraries_to_import }
712
+ libraries.concat dependent_targets_to_link.flat_map { |pt| pt.build_settings[@configuration].static_libraries_to_import }
681
713
  end
682
714
  libraries
683
715
  end
@@ -708,11 +740,11 @@ module Pod
708
740
  return [] if library_xcconfig? && target.build_as_static?
709
741
 
710
742
  vendored = library_search_paths_to_import.dup
711
- vendored.concat dependent_targets.flat_map { |t| t.build_settings.vendored_dynamic_library_search_paths }
743
+ vendored.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].vendored_dynamic_library_search_paths }
712
744
  if library_xcconfig?
713
745
  vendored.delete(target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE))
714
746
  else
715
- vendored.concat(dependent_targets.flat_map { |t| t.build_settings.library_search_paths_to_import })
747
+ vendored.concat(dependent_targets.flat_map { |pt| pt.build_settings[@configuration].library_search_paths_to_import })
716
748
  end
717
749
  vendored
718
750
  end
@@ -751,7 +783,7 @@ module Pod
751
783
 
752
784
  # @return [Array<String>]
753
785
  define_build_settings_method :module_map_files, :memoized => true do
754
- dependent_targets.map { |t| t.build_settings.module_map_file_to_import }.compact.sort
786
+ dependent_targets.map { |pt| pt.build_settings[@configuration].module_map_file_to_import }.compact.sort
755
787
  end
756
788
 
757
789
  # @return [Array<String>]
@@ -770,12 +802,12 @@ module Pod
770
802
 
771
803
  # @return [Array<String>]
772
804
  define_build_settings_method :header_search_paths, :build_setting => true, :memoized => true, :sorted => true do
773
- target.header_search_paths(:include_dependent_targets_for_test_spec => test_xcconfig? && non_library_spec, :include_dependent_targets_for_app_spec => app_xcconfig? && non_library_spec)
805
+ target.header_search_paths(:include_dependent_targets_for_test_spec => test_xcconfig? && non_library_spec, :include_dependent_targets_for_app_spec => app_xcconfig? && non_library_spec, :configuration => @configuration)
774
806
  end
775
807
 
776
808
  # @return [Array<String>]
777
809
  define_build_settings_method :public_header_search_paths, :memoized => true, :sorted => true do
778
- target.header_search_paths(:include_dependent_targets_for_test_spec => test_xcconfig? && non_library_spec, :include_dependent_targets_for_app_spec => app_xcconfig? && non_library_spec, :include_private_headers => false)
810
+ target.header_search_paths(:include_dependent_targets_for_test_spec => test_xcconfig? && non_library_spec, :include_dependent_targets_for_app_spec => app_xcconfig? && non_library_spec, :include_private_headers => false, :configuration => @configuration)
779
811
  end
780
812
 
781
813
  #-------------------------------------------------------------------------#
@@ -803,7 +835,7 @@ module Pod
803
835
 
804
836
  # @return [Array<String>]
805
837
  define_build_settings_method :swift_include_paths, :build_setting => true, :memoized => true, :sorted => true, :uniqued => true do
806
- paths = dependent_targets.flat_map { |t| t.build_settings.swift_include_paths_to_import }
838
+ paths = dependent_targets.flat_map { |pt| pt.build_settings[@configuration].swift_include_paths_to_import }
807
839
  paths.concat swift_include_paths_to_import if non_library_xcconfig?
808
840
  paths
809
841
  end
@@ -873,11 +905,11 @@ module Pod
873
905
  define_build_settings_method :dependent_targets, :memoized => true do
874
906
  select_maximal_pod_targets(
875
907
  if test_xcconfig?
876
- target.dependent_targets_for_test_spec(non_library_spec)
908
+ target.dependent_targets_for_test_spec(non_library_spec, :configuration => @configuration)
877
909
  elsif app_xcconfig?
878
- target.dependent_targets_for_app_spec(non_library_spec)
910
+ target.dependent_targets_for_app_spec(non_library_spec, :configuration => @configuration)
879
911
  else
880
- target.recursive_dependent_targets
912
+ target.recursive_dependent_targets(:configuration => @configuration)
881
913
  end,
882
914
  )
883
915
  end
@@ -886,7 +918,7 @@ module Pod
886
918
  define_build_settings_method :dependent_targets_to_link, :memoized => true do
887
919
  if test_xcconfig?
888
920
  # we're embedding into an app defined by an app spec
889
- host_targets = target.app_host_dependent_targets_for_spec(non_library_spec)
921
+ host_targets = target.app_host_dependent_targets_for_spec(non_library_spec, :configuration => @configuration)
890
922
  dependent_targets - host_targets
891
923
  else
892
924
  dependent_targets
@@ -913,7 +945,7 @@ module Pod
913
945
  #
914
946
  define_build_settings_method :merged_pod_target_xcconfigs, :memoized => true do
915
947
  merged_xcconfigs(pod_target_xcconfig_values_by_consumer_by_key, :pod_target_xcconfig,
916
- :overriding => non_library_xcconfig? ? target.build_settings.merged_pod_target_xcconfigs : {})
948
+ :overriding => non_library_xcconfig? ? target.build_settings[@configuration].merged_pod_target_xcconfigs : {})
917
949
  end
918
950
 
919
951
  # @return [Array<Sandbox::FileAccessor>]
@@ -948,21 +980,22 @@ module Pod
948
980
  @build_settings_names | BuildSettings.build_settings_names
949
981
  end
950
982
 
951
- # @return [String]
983
+ # @return [Symbol]
952
984
  # The build configuration these settings will be used for
953
985
  attr_reader :configuration_name
954
986
 
955
- # Intializes a new instance
987
+ # Initializes a new instance
956
988
  #
957
989
  # @param [AggregateTarget] target
958
990
  # see {#target}
959
991
  #
960
- # @param [String] configuration_name
992
+ # @param [Symbol] configuration_name
961
993
  # see {#configuration_name}
962
994
  #
963
- def initialize(target, configuration_name)
995
+ def initialize(target, configuration_name, configuration: nil)
964
996
  super(target)
965
997
  @configuration_name = configuration_name
998
+ (@configuration = configuration) || raise("No configuration for #{self}.")
966
999
  end
967
1000
 
968
1001
  # @return [Xcodeproj::Config] xcconfig
@@ -1034,7 +1067,7 @@ module Pod
1034
1067
  # brackets, @import, etc.)
1035
1068
  paths.concat pod_targets.
1036
1069
  select { |pt| pt.build_as_framework? && pt.should_build? }.
1037
- map { |pt| pt.build_settings.framework_header_search_path }
1070
+ map { |pt| pt.build_settings[@configuration].framework_header_search_path }
1038
1071
 
1039
1072
  paths.concat target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).header_search_paths }
1040
1073
 
@@ -1051,11 +1084,11 @@ module Pod
1051
1084
  silenced_frameworks = []
1052
1085
  pod_targets_inhibiting_warnings.each do |pt|
1053
1086
  if pt.build_as_framework? && pt.should_build?
1054
- silenced_headers.append pt.build_settings.framework_header_search_path
1087
+ silenced_headers.append pt.build_settings[@configuration].framework_header_search_path
1055
1088
  else
1056
- silenced_headers.concat pt.build_settings.public_header_search_paths
1089
+ silenced_headers.concat pt.build_settings[@configuration].public_header_search_paths
1057
1090
  end
1058
- silenced_frameworks.concat pt.build_settings.framework_search_paths_to_import
1091
+ silenced_frameworks.concat pt.build_settings[@configuration].framework_search_paths_to_import
1059
1092
  end
1060
1093
 
1061
1094
  flags += silenced_headers.uniq.flat_map { |p| ['-isystem', p] }
@@ -1066,7 +1099,7 @@ module Pod
1066
1099
 
1067
1100
  # @return [Array<String>]
1068
1101
  define_build_settings_method :module_map_files, :memoized => true, :sorted => true, :uniqued => true, :compacted => true, :from_search_paths_aggregate_targets => :module_map_file_to_import do
1069
- pod_targets.map { |t| t.build_settings.module_map_file_to_import }
1102
+ pod_targets.map { |pt| pt.build_settings[@configuration].module_map_file_to_import }
1070
1103
  end
1071
1104
 
1072
1105
  #-------------------------------------------------------------------------#
@@ -1180,7 +1213,7 @@ module Pod
1180
1213
  define_build_settings_method :search_paths_aggregate_target_pod_target_build_settings, :memoized => true, :uniqued => true do
1181
1214
  pod_targets = target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).pod_targets }
1182
1215
  pod_targets = select_maximal_pod_targets(pod_targets)
1183
- pod_targets.flat_map(&:build_settings)
1216
+ pod_targets.map { |pt| pt.build_settings[@configuration] }
1184
1217
  end
1185
1218
 
1186
1219
  # Returns the +user_target_xcconfig+ for all pod targets and their spec
@@ -1,4 +1,5 @@
1
- require 'cocoapods/target/framework_paths'
1
+ require 'cocoapods/xcode/framework_paths'
2
+ require 'cocoapods/xcode/xcframework'
2
3
 
3
4
  module Pod
4
5
  # Stores the information relative to the target used to compile a single Pod.
@@ -48,15 +49,59 @@ module Pod
48
49
  # @return [Array<PodTarget>] the targets that this target has a dependency
49
50
  # upon.
50
51
  #
51
- attr_accessor :dependent_targets
52
+ attr_reader :dependent_targets
53
+ attr_reader :dependent_targets_by_config
54
+
55
+ # @deprecated
56
+ def dependent_targets=(dependent_targets)
57
+ @dependent_targets = dependent_targets
58
+ @dependent_targets_by_config = { :debug => dependent_targets, :release => dependent_targets }
59
+ end
60
+
61
+ def dependent_targets_by_config=(dependent_targets_by_config)
62
+ @dependent_targets_by_config = dependent_targets_by_config
63
+ @dependent_targets = dependent_targets_by_config.each_value.reduce([], &:|)
64
+ end
52
65
 
53
66
  # @return [Hash{String=>Array<PodTarget>}] all target dependencies by test spec name.
54
67
  #
55
- attr_accessor :test_dependent_targets_by_spec_name
68
+ attr_reader :test_dependent_targets_by_spec_name
69
+ attr_reader :test_dependent_targets_by_spec_name_by_config
70
+
71
+ # @deprecated
72
+ def test_dependent_targets_by_spec_name=(test_dependent_targets_by_spec_name)
73
+ @test_dependent_targets_by_spec_name = test_dependent_targets_by_spec_name
74
+ @test_dependent_targets_by_spec_name_by_config = Hash[test_dependent_targets_by_spec_name.map do |k, v|
75
+ [k, { :debug => v, :release => v }]
76
+ end]
77
+ end
78
+
79
+ def test_dependent_targets_by_spec_name_by_config=(test_dependent_targets_by_spec_name_by_config)
80
+ @test_dependent_targets_by_spec_name_by_config = test_dependent_targets_by_spec_name_by_config
81
+ @test_dependent_targets_by_spec_name = Hash[test_dependent_targets_by_spec_name_by_config.map do |k, v|
82
+ [k, v.each_value.reduce(Set.new, &:|).to_a]
83
+ end]
84
+ end
56
85
 
57
86
  # @return [Hash{String=>Array<PodTarget>}] all target dependencies by app spec name.
58
87
  #
59
- attr_accessor :app_dependent_targets_by_spec_name
88
+ attr_reader :app_dependent_targets_by_spec_name
89
+ attr_reader :app_dependent_targets_by_spec_name_by_config
90
+
91
+ # @deprecated
92
+ def app_dependent_targets_by_spec_name=(app_dependent_targets_by_spec_name)
93
+ @app_dependent_targets_by_spec_name = app_dependent_targets_by_spec_name
94
+ @app_dependent_targets_by_spec_name_by_config = Hash[app_dependent_targets_by_spec_name.map do |k, v|
95
+ [k, { :debug => v, :release => v }]
96
+ end]
97
+ end
98
+
99
+ def app_dependent_targets_by_spec_name_by_config=(app_dependent_targets_by_spec_name_by_config)
100
+ @app_dependent_targets_by_spec_name_by_config = app_dependent_targets_by_spec_name_by_config
101
+ @app_dependent_targets_by_spec_name = Hash[app_dependent_targets_by_spec_name_by_config.map do |k, v|
102
+ [k, v.each_value.reduce(Set.new, &:|).to_a]
103
+ end]
104
+ end
60
105
 
61
106
  # @return [Hash{String => (Specification,PodTarget)}] tuples of app specs and pod targets by test spec name.
62
107
  #
@@ -65,15 +110,21 @@ module Pod
65
110
  # @return [Hash{String => BuildSettings}] the test spec build settings for this target.
66
111
  #
67
112
  attr_reader :test_spec_build_settings
113
+ attr_reader :test_spec_build_settings_by_config
68
114
 
69
115
  # @return [Hash{String => BuildSettings}] the app spec build settings for this target.
70
116
  #
71
117
  attr_reader :app_spec_build_settings
118
+ attr_reader :app_spec_build_settings_by_config
119
+
120
+ # @return [String] the Swift version for this target.
121
+ #
122
+ attr_reader :swift_version
72
123
 
73
124
  # Initialize a new instance
74
125
  #
75
126
  # @param [Sandbox] sandbox @see Target#sandbox
76
- # @param [Boolean] host_requires_frameworks @see Target#host_requires_frameworks
127
+ # @param [BuildType] build_type @see Target#build_type
77
128
  # @param [Hash{String=>Symbol}] user_build_configurations @see Target#user_build_configurations
78
129
  # @param [Array<String>] archs @see Target#archs
79
130
  # @param [Platform] platform @see Target#platform
@@ -81,12 +132,11 @@ module Pod
81
132
  # @param [Array<TargetDefinition>] target_definitions @see #target_definitions
82
133
  # @param [Array<Sandbox::FileAccessor>] file_accessors @see #file_accessors
83
134
  # @param [String] scope_suffix @see #scope_suffix
84
- # @param [Target::BuildType] build_type @see #build_type
135
+ # @param [String] swift_version @see #swift_version
85
136
  #
86
- def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, specs,
87
- target_definitions, file_accessors = [], scope_suffix = nil,
88
- build_type: Target::BuildType.infer_from_spec(specs.first, :host_requires_frameworks => host_requires_frameworks))
89
- super(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, :build_type => build_type)
137
+ def initialize(sandbox, build_type, user_build_configurations, archs, platform, specs, target_definitions,
138
+ file_accessors = [], scope_suffix = nil, swift_version = nil)
139
+ super(sandbox, build_type, user_build_configurations, archs, platform)
90
140
  raise "Can't initialize a PodTarget without specs!" if specs.nil? || specs.empty?
91
141
  raise "Can't initialize a PodTarget without TargetDefinition!" if target_definitions.nil? || target_definitions.empty?
92
142
  raise "Can't initialize a PodTarget with an empty string scope suffix!" if scope_suffix == ''
@@ -94,18 +144,19 @@ module Pod
94
144
  @target_definitions = target_definitions
95
145
  @file_accessors = file_accessors
96
146
  @scope_suffix = scope_suffix
147
+ @swift_version = swift_version
97
148
  all_specs_by_type = @specs.group_by(&:spec_type)
98
149
  @library_specs = all_specs_by_type[:library] || []
99
150
  @test_specs = all_specs_by_type[:test] || []
100
151
  @app_specs = all_specs_by_type[:app] || []
101
152
  @build_headers = Sandbox::HeadersStore.new(sandbox, 'Private', :private)
102
- @dependent_targets = []
103
- @test_dependent_targets_by_spec_name = {}
104
- @app_dependent_targets_by_spec_name = {}
153
+ self.dependent_targets = []
154
+ self.test_dependent_targets_by_spec_name = Hash[test_specs.map { |ts| [ts.name, []] }]
155
+ self.app_dependent_targets_by_spec_name = Hash[app_specs.map { |as| [as.name, []] }]
105
156
  @test_app_hosts_by_spec_name = {}
106
157
  @build_config_cache = {}
107
- @test_spec_build_settings = create_test_build_settings
108
- @app_spec_build_settings = create_app_build_settings
158
+ @test_spec_build_settings_by_config = create_test_build_settings_by_config
159
+ @app_spec_build_settings_by_config = create_app_build_settings_by_config
109
160
  end
110
161
 
111
162
  # Scopes the current target based on the existing pod targets within the cache.
@@ -119,21 +170,20 @@ module Pod
119
170
  target_definitions.map do |target_definition|
120
171
  cache_key = [specs, target_definition]
121
172
  cache[cache_key] ||= begin
122
- target = PodTarget.new(sandbox, host_requires_frameworks, user_build_configurations, archs, platform,
123
- specs, [target_definition], file_accessors, target_definition.label,
124
- :build_type => build_type)
173
+ target = PodTarget.new(sandbox, build_type, user_build_configurations, archs, platform, specs,
174
+ [target_definition], file_accessors, target_definition.label)
125
175
  scope_dependent_targets = ->(dependent_targets) do
126
176
  dependent_targets.flat_map do |pod_target|
127
177
  pod_target.scoped(cache).select { |pt| pt.target_definitions == [target_definition] }
128
178
  end
129
179
  end
130
180
 
131
- target.dependent_targets = scope_dependent_targets[dependent_targets]
132
- target.test_dependent_targets_by_spec_name = Hash[test_dependent_targets_by_spec_name.map do |spec_name, test_pod_targets|
133
- [spec_name, scope_dependent_targets[test_pod_targets]]
181
+ target.dependent_targets_by_config = Hash[dependent_targets_by_config.map { |k, v| [k, scope_dependent_targets[v]] }]
182
+ target.test_dependent_targets_by_spec_name_by_config = Hash[test_dependent_targets_by_spec_name_by_config.map do |spec_name, test_pod_targets_by_config|
183
+ [spec_name, Hash[test_pod_targets_by_config.map { |k, v| [k, scope_dependent_targets[v]] }]]
134
184
  end]
135
- target.app_dependent_targets_by_spec_name = Hash[app_dependent_targets_by_spec_name.map do |spec_name, app_pod_targets|
136
- [spec_name, scope_dependent_targets[app_pod_targets]]
185
+ target.app_dependent_targets_by_spec_name_by_config = Hash[app_dependent_targets_by_spec_name_by_config.map do |spec_name, app_pod_targets_by_config|
186
+ [spec_name, Hash[app_pod_targets_by_config.map { |k, v| [k, scope_dependent_targets[v]] }]]
137
187
  end]
138
188
  target.test_app_hosts_by_spec_name = Hash[test_app_hosts_by_spec_name.map do |spec_name, (app_host_spec, app_pod_target)|
139
189
  [spec_name, [app_host_spec, app_pod_target.scoped(cache).find { |pt| pt.target_definitions == [target_definition] }]]
@@ -187,32 +237,6 @@ module Pod
187
237
  end]
188
238
  end
189
239
 
190
- # @return [String] the Swift version for the target. If the pod author has provided a set of Swift versions
191
- # supported by their pod then the max Swift version across all of target definitions is chosen, unless
192
- # a target definition specifies explicit requirements for supported Swift versions. Otherwise the Swift
193
- # version is derived by the target definitions that integrate this pod as long as they are the same.
194
- #
195
- def swift_version
196
- @swift_version ||= begin
197
- if spec_swift_versions.empty?
198
- target_definition_swift_version
199
- else
200
- spec_swift_versions.sort.reverse_each.find do |swift_version|
201
- target_definitions.all? do |td|
202
- td.supports_swift_version?(swift_version)
203
- end
204
- end.to_s
205
- end
206
- end
207
- end
208
-
209
- # @return [String] the Swift version derived from the target definitions that integrate this pod. This is used for
210
- # legacy reasons and only if the pod author has not specified the Swift versions their pod supports.
211
- #
212
- def target_definition_swift_version
213
- target_definitions.map(&:swift_version).compact.uniq.first
214
- end
215
-
216
240
  # @return [Array<Version>] the Swift versions supported. Might be empty if the author has not
217
241
  # specified any versions, most likely due to legacy reasons.
218
242
  #
@@ -355,7 +379,7 @@ module Pod
355
379
  !app_specs.empty?
356
380
  end
357
381
 
358
- # @return [Hash{String=>Array<FrameworkPaths>}] The vendored and non vendored framework paths this target
382
+ # @return [Hash{String=>Array<Xcode::FrameworkPaths>}] The vendored and non vendored framework paths this target
359
383
  # depends upon keyed by spec name. For the root spec and subspecs the framework path of the target itself
360
384
  # is included.
361
385
  #
@@ -381,10 +405,24 @@ module Pod
381
405
  end
382
406
  end
383
407
  end
384
- FrameworkPaths.new(framework_source, dsym_source, bcsymbolmap_paths)
408
+ Xcode::FrameworkPaths.new(framework_source, dsym_source, bcsymbolmap_paths)
385
409
  end
386
410
  if file_accessor.spec.library_specification? && should_build? && build_as_dynamic_framework?
387
- frameworks << FrameworkPaths.new(build_product_path('${BUILT_PRODUCTS_DIR}'))
411
+ frameworks << Xcode::FrameworkPaths.new(build_product_path('${BUILT_PRODUCTS_DIR}'))
412
+ end
413
+ hash[file_accessor.spec.name] = frameworks
414
+ end
415
+ end
416
+ end
417
+
418
+ # @return [Hash{String=>Array<Xcode::XCFramework>}] The vendored xcframeworks this target
419
+ # depends upon keyed by spec name.
420
+ #
421
+ def xcframeworks
422
+ @xcframeworks ||= begin
423
+ file_accessors.each_with_object({}) do |file_accessor, hash|
424
+ frameworks = file_accessor.vendored_xcframeworks.map do |framework_path|
425
+ Xcode::XCFramework.new(framework_path)
388
426
  end
389
427
  hash[file_accessor.spec.name] = frameworks
390
428
  end
@@ -556,16 +594,19 @@ module Pod
556
594
  # @param [Specification] spec
557
595
  # the spec to return app host dependencies for
558
596
  #
597
+ # @param [String] configuration
598
+ # the configuration to retrieve the app host dependent targets for.
599
+ #
559
600
  # @return [Array<PodTarget>] the app host dependent targets for the given spec.
560
601
  #
561
- def app_host_dependent_targets_for_spec(spec)
602
+ def app_host_dependent_targets_for_spec(spec, configuration: nil)
562
603
  return [] unless spec.test_specification? && spec.consumer(platform).test_type == :unit
563
604
  app_host_info = test_app_hosts_by_spec_name[spec.name]
564
605
  if app_host_info.nil?
565
606
  []
566
607
  else
567
608
  app_spec, app_target = *app_host_info
568
- app_target.dependent_targets_for_app_spec(app_spec)
609
+ app_target.dependent_targets_for_app_spec(app_spec, :configuration => configuration)
569
610
  end
570
611
  end
571
612
 
@@ -643,6 +684,33 @@ module Pod
643
684
  support_files_dir + "#{non_library_spec_label(spec)}-frameworks-output-files.xcfilelist"
644
685
  end
645
686
 
687
+ # @param [Specification] spec
688
+ # The spec this script path is for.
689
+ #
690
+ # @return [Pathname] The absolute path of the prepare artifacts script for the given spec.
691
+ #
692
+ def prepare_artifacts_script_path_for_spec(spec)
693
+ support_files_dir + "#{non_library_spec_label(spec)}-artifacts.sh"
694
+ end
695
+
696
+ # @param [Specification] spec
697
+ # The spec this script path is for.
698
+ #
699
+ # @return [Pathname] The absolute path of the prepare artifacts script input file list for the given spec.
700
+ #
701
+ def prepare_artifacts_script_input_files_path_for_spec(spec)
702
+ support_files_dir + "#{non_library_spec_label(spec)}-artifacts-input-files.xcfilelist"
703
+ end
704
+
705
+ # @param [Specification] spec
706
+ # The spec this script path is for.
707
+ #
708
+ # @return [Pathname] The absolute path of the prepare artifacts script output file list for the given spec.
709
+ #
710
+ def prepare_artifacts_script_output_files_path_for_spec(spec)
711
+ support_files_dir + "#{non_library_spec_label(spec)}-artifacts-output-files.xcfilelist"
712
+ end
713
+
646
714
  # @param [Specification] spec
647
715
  # The spec this Info.plist path is for.
648
716
  #
@@ -670,16 +738,32 @@ module Pod
670
738
  end.uniq
671
739
  end
672
740
 
673
- # @return [Array<PodTarget>] the recursive targets that this target has a
674
- # dependency upon.
741
+ # Returns all dependent targets of this target. If a configuration is passed then the list can be scoped to a given
742
+ # configuration.
743
+ #
744
+ # @param [String] configuration
745
+ # The configuration to return the dependent targets for or `nil` if all configurations should be included.
675
746
  #
676
- def recursive_dependent_targets
677
- @recursive_dependent_targets ||= _add_recursive_dependent_targets(Set.new).delete(self).to_a
747
+ # @return [Array<PodTarget>] the recursive targets that this target has a dependency upon.
748
+ #
749
+ def recursive_dependent_targets(configuration: nil)
750
+ @recursive_dependent_targets ||= begin
751
+ hash = Hash[config_variants.map do |config|
752
+ [config, _add_recursive_dependent_targets(Set.new, :configuration => config).delete(self).to_a.freeze]
753
+ end]
754
+ hash[nil] = hash.each_value.reduce(Set.new, &:|).to_a
755
+ hash
756
+ end
757
+ @recursive_dependent_targets.fetch(configuration) { raise ArgumentError, "No configuration #{configuration} for #{self}, known configurations are #{@recursive_dependent_targets.keys}" }
678
758
  end
679
759
 
680
- def _add_recursive_dependent_targets(set)
760
+ def _add_recursive_dependent_targets(set, configuration: nil)
761
+ if defined?(@recursive_dependent_targets)
762
+ return set.merge(@recursive_dependent_targets[configuration])
763
+ end
764
+ dependent_targets = configuration ? dependent_targets_by_config[configuration] : self.dependent_targets
681
765
  dependent_targets.each do |target|
682
- target._add_recursive_dependent_targets(set) if set.add?(target)
766
+ target._add_recursive_dependent_targets(set, :configuration => configuration) if set.add?(target)
683
767
  end
684
768
 
685
769
  set
@@ -689,20 +773,31 @@ module Pod
689
773
  # @param [Specification] test_spec
690
774
  # the test spec to scope dependencies for
691
775
  #
776
+ # @param [String] configuration
777
+ # the configuration to retrieve the test dependent targets for.
778
+ #
692
779
  # @return [Array<PodTarget>] the recursive targets that this target has a
693
780
  # test dependency upon.
694
781
  #
695
- def recursive_test_dependent_targets(test_spec)
782
+ def recursive_test_dependent_targets(test_spec, configuration: nil)
696
783
  @recursive_test_dependent_targets ||= {}
697
- @recursive_test_dependent_targets[test_spec] ||= _add_recursive_test_dependent_targets(test_spec, Set.new).to_a
784
+ @recursive_test_dependent_targets[test_spec] ||= begin
785
+ hash = Hash[config_variants.map do |config|
786
+ [config, _add_recursive_test_dependent_targets(test_spec, Set.new, :configuration => config).to_a.freeze]
787
+ end]
788
+ hash[nil] = hash.each_value.reduce(Set.new, &:|).to_a.freeze
789
+ hash
790
+ end
791
+ @recursive_test_dependent_targets[test_spec][configuration]
698
792
  end
699
793
 
700
- def _add_recursive_test_dependent_targets(test_spec, set)
794
+ def _add_recursive_test_dependent_targets(test_spec, set, configuration: nil)
701
795
  raise ArgumentError, 'Must give a test spec' unless test_spec
702
- return unless dependent_targets = test_dependent_targets_by_spec_name[test_spec.name]
796
+ dependent_targets = configuration ? test_dependent_targets_by_spec_name_by_config[test_spec.name][configuration] : test_dependent_targets_by_spec_name[test_spec.name]
797
+ raise ArgumentError, "Unable to find deps for #{test_spec} for config #{configuration.inspect} (out of #{test_dependent_targets_by_spec_name_by_config.inspect})" unless dependent_targets
703
798
 
704
799
  dependent_targets.each do |target|
705
- target._add_recursive_dependent_targets(set) if set.add?(target)
800
+ target._add_recursive_dependent_targets(set, :configuration => configuration) if set.add?(target)
706
801
  end
707
802
 
708
803
  set
@@ -712,30 +807,44 @@ module Pod
712
807
  # @param [Specification] test_spec
713
808
  # the test spec to scope dependencies for
714
809
  #
810
+ # @param [String] configuration
811
+ # the configuration to retrieve the test dependent targets for.
812
+ #
715
813
  # @return [Array<PodTarget>] the canonical list of dependent targets this target has a dependency upon.
716
814
  # This list includes the target itself as well as its recursive dependent and test dependent targets.
717
815
  #
718
- def dependent_targets_for_test_spec(test_spec)
719
- [self, *recursive_dependent_targets, *recursive_test_dependent_targets(test_spec)].uniq
816
+ def dependent_targets_for_test_spec(test_spec, configuration: nil)
817
+ [self, *recursive_dependent_targets(:configuration => configuration), *recursive_test_dependent_targets(test_spec, :configuration => configuration)].uniq
720
818
  end
721
819
 
722
820
  # @param [Specification] app_spec
723
821
  # the app spec to scope dependencies for
724
822
  #
823
+ # @param [String] configuration
824
+ # the configuration to retrieve the app dependent targets for.
825
+ #
725
826
  # @return [Array<PodTarget>] the recursive targets that this target has a
726
827
  # app dependency upon.
727
828
  #
728
- def recursive_app_dependent_targets(app_spec)
829
+ def recursive_app_dependent_targets(app_spec, configuration: nil)
729
830
  @recursive_app_dependent_targets ||= {}
730
- @recursive_app_dependent_targets[app_spec] ||= _add_recursive_app_dependent_targets(app_spec, Set.new).to_a
831
+ @recursive_app_dependent_targets[app_spec] ||= begin
832
+ hash = Hash[config_variants.map do |config|
833
+ [config, _add_recursive_app_dependent_targets(app_spec, Set.new, :configuration => config).to_a.freeze]
834
+ end]
835
+ hash[nil] = hash.each_value.reduce(Set.new, &:|).to_a.freeze
836
+ hash
837
+ end
838
+ @recursive_app_dependent_targets[app_spec][configuration]
731
839
  end
732
840
 
733
- def _add_recursive_app_dependent_targets(app_spec, set)
841
+ def _add_recursive_app_dependent_targets(app_spec, set, configuration: nil)
734
842
  raise ArgumentError, 'Must give a app spec' unless app_spec
735
- return unless dependent_targets = app_dependent_targets_by_spec_name[app_spec.name]
843
+ dependent_targets = configuration ? app_dependent_targets_by_spec_name_by_config[app_spec.name][configuration] : app_dependent_targets_by_spec_name[app_spec.name]
844
+ raise ArgumentError, "Unable to find deps for #{app_spec} for config #{configuration.inspect} #{app_dependent_targets_by_spec_name_by_config.inspect}" unless dependent_targets
736
845
 
737
846
  dependent_targets.each do |target|
738
- target._add_recursive_dependent_targets(set) if set.add?(target)
847
+ target._add_recursive_dependent_targets(set, :configuration => configuration) if set.add?(target)
739
848
  end
740
849
 
741
850
  set
@@ -745,11 +854,14 @@ module Pod
745
854
  # @param [Specification] app_spec
746
855
  # the app spec to scope dependencies for
747
856
  #
857
+ # @param [String] configuration
858
+ # the configuration to retrieve the app dependent targets for.
859
+ #
748
860
  # @return [Array<PodTarget>] the canonical list of dependent targets this target has a dependency upon.
749
861
  # This list includes the target itself as well as its recursive dependent and app dependent targets.
750
862
  #
751
- def dependent_targets_for_app_spec(app_spec)
752
- [self, *recursive_dependent_targets, *recursive_app_dependent_targets(app_spec)].uniq
863
+ def dependent_targets_for_app_spec(app_spec, configuration: nil)
864
+ [self, *recursive_dependent_targets(:configuration => configuration), *recursive_app_dependent_targets(app_spec, :configuration => configuration)].uniq
753
865
  end
754
866
 
755
867
  # Checks if warnings should be inhibited for this pod.
@@ -821,33 +933,56 @@ module Pod
821
933
  # whether to include header search paths for private headers of this
822
934
  # target
823
935
  #
936
+ # @param [String] configuration
937
+ # the configuration to return header search paths for or `nil` for all configurations.
938
+ #
824
939
  # @return [Array<String>] The set of header search paths this target uses.
825
940
  #
826
- def header_search_paths(include_dependent_targets_for_test_spec: nil, include_dependent_targets_for_app_spec: nil, include_private_headers: true)
941
+ def header_search_paths(include_dependent_targets_for_test_spec: nil, include_dependent_targets_for_app_spec: nil,
942
+ include_private_headers: true, configuration: nil)
827
943
  header_search_paths = []
828
944
  header_search_paths.concat(build_headers.search_paths(platform, nil, false)) if include_private_headers
829
945
  header_search_paths.concat(sandbox.public_headers.search_paths(platform, pod_name, uses_modular_headers?))
830
- dependent_targets = recursive_dependent_targets
831
- dependent_targets += recursive_test_dependent_targets(include_dependent_targets_for_test_spec) if include_dependent_targets_for_test_spec
832
- dependent_targets += recursive_app_dependent_targets(include_dependent_targets_for_app_spec) if include_dependent_targets_for_app_spec
946
+ dependent_targets = recursive_dependent_targets(:configuration => configuration)
947
+ if include_dependent_targets_for_test_spec
948
+ dependent_targets += recursive_test_dependent_targets(include_dependent_targets_for_test_spec, :configuration => configuration)
949
+ end
950
+ if include_dependent_targets_for_app_spec
951
+ dependent_targets += recursive_app_dependent_targets(include_dependent_targets_for_app_spec, :configuration => configuration)
952
+ end
833
953
  dependent_targets.uniq.each do |dependent_target|
834
954
  header_search_paths.concat(sandbox.public_headers.search_paths(platform, dependent_target.pod_name, defines_module? && dependent_target.uses_modular_headers?(false)))
835
955
  end
836
956
  header_search_paths.uniq
837
957
  end
838
958
 
839
- # @param [Specification] spec
959
+ # @param [Specification] spec the specification to return build settings for.
960
+ #
961
+ # @param [String] configuration the configuration to scope the build settings.
840
962
  #
841
963
  # @return [BuildSettings::PodTargetSettings] The build settings for the given spec
842
964
  #
843
- def build_settings_for_spec(spec)
965
+ def build_settings_for_spec(spec, configuration: nil)
966
+ raise ArgumentError, 'Must give configuration' unless configuration
967
+ configuration = user_build_configurations[configuration] if user_build_configurations.key?(configuration)
968
+ build_settings_by_config_for_spec(spec)[configuration] || raise(ArgumentError, "No build settings for #{spec} (configuration #{configuration.inspect}) (known configurations #{config_variants})")
969
+ end
970
+
971
+ def build_settings_by_config_for_spec(spec)
844
972
  case spec.spec_type
845
- when :test then test_spec_build_settings[spec.name]
846
- when :app then app_spec_build_settings[spec.name]
973
+ when :test then test_spec_build_settings_by_config[spec.name]
974
+ when :app then app_spec_build_settings_by_config[spec.name]
847
975
  else build_settings
848
976
  end || raise(ArgumentError, "No build settings for #{spec}")
849
977
  end
850
978
 
979
+ def user_config_names_by_config_type
980
+ user_build_configurations.each_with_object({}) do |(user, type), hash|
981
+ hash[type] ||= []
982
+ hash[type] << user
983
+ end.each_value(&:freeze).freeze
984
+ end
985
+
851
986
  protected
852
987
 
853
988
  # Returns whether the pod target should use modular headers.
@@ -867,19 +1002,33 @@ module Pod
867
1002
 
868
1003
  private
869
1004
 
1005
+ def config_variants
1006
+ if user_build_configurations.empty?
1007
+ %i(debug release)
1008
+ else
1009
+ user_build_configurations.values.uniq
1010
+ end
1011
+ end
1012
+
870
1013
  def create_build_settings
871
- BuildSettings::PodTargetSettings.new(self)
1014
+ Hash[config_variants.map do |config|
1015
+ [config, BuildSettings::PodTargetSettings.new(self, nil, :configuration => config)]
1016
+ end]
872
1017
  end
873
1018
 
874
- def create_test_build_settings
1019
+ def create_test_build_settings_by_config
875
1020
  Hash[test_specs.map do |test_spec|
876
- [test_spec.name, BuildSettings::PodTargetSettings.new(self, test_spec)]
1021
+ [test_spec.name, Hash[config_variants.map do |config|
1022
+ [config, BuildSettings::PodTargetSettings.new(self, test_spec, :configuration => config)]
1023
+ end]]
877
1024
  end]
878
1025
  end
879
1026
 
880
- def create_app_build_settings
1027
+ def create_app_build_settings_by_config
881
1028
  Hash[app_specs.map do |app_spec|
882
- [app_spec.name, BuildSettings::PodTargetSettings.new(self, app_spec)]
1029
+ [app_spec.name, Hash[config_variants.map do |config|
1030
+ [config, BuildSettings::PodTargetSettings.new(self, app_spec, :configuration => config)]
1031
+ end]]
883
1032
  end]
884
1033
  end
885
1034