cocoapods 1.5.3 → 1.6.0.beta.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +200 -0
- data/lib/cocoapods.rb +0 -1
- data/lib/cocoapods/command/init.rb +1 -1
- data/lib/cocoapods/command/install.rb +7 -0
- data/lib/cocoapods/command/lib/lint.rb +8 -1
- data/lib/cocoapods/command/outdated.rb +2 -7
- data/lib/cocoapods/command/repo/add.rb +1 -1
- data/lib/cocoapods/command/repo/list.rb +1 -1
- data/lib/cocoapods/command/repo/push.rb +17 -12
- data/lib/cocoapods/command/repo/remove.rb +1 -1
- data/lib/cocoapods/command/repo/update.rb +1 -1
- data/lib/cocoapods/command/setup.rb +1 -1
- data/lib/cocoapods/command/spec/create.rb +39 -39
- data/lib/cocoapods/command/spec/lint.rb +8 -1
- data/lib/cocoapods/config.rb +13 -2
- data/lib/cocoapods/downloader/cache.rb +1 -1
- data/lib/cocoapods/executable.rb +2 -2
- data/lib/cocoapods/external_sources.rb +7 -4
- data/lib/cocoapods/external_sources/abstract_external_source.rb +23 -13
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +6 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +11 -0
- data/lib/cocoapods/generator/app_target_helper.rb +102 -16
- data/lib/cocoapods/generator/copy_resources_script.rb +6 -0
- data/lib/cocoapods/generator/dummy_source.rb +14 -5
- data/lib/cocoapods/generator/embed_frameworks_script.rb +13 -2
- data/lib/cocoapods/generator/header.rb +1 -1
- data/lib/cocoapods/generator/info_plist_file.rb +12 -4
- data/lib/cocoapods/generator/prefix_header.rb +2 -2
- data/lib/cocoapods/hooks_manager.rb +28 -17
- data/lib/cocoapods/installer.rb +103 -42
- data/lib/cocoapods/installer/analyzer.rb +362 -277
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +52 -22
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +9 -6
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +4 -5
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +3 -14
- data/lib/cocoapods/installer/analyzer/specs_state.rb +28 -4
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +24 -16
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +17 -11
- data/lib/cocoapods/installer/pod_source_installer.rb +31 -43
- data/lib/cocoapods/installer/post_install_hooks_context.rb +71 -46
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +22 -13
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +3 -1
- data/lib/cocoapods/installer/user_project_integrator.rb +0 -2
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +38 -28
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +44 -11
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +129 -119
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +25 -16
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +95 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +12 -45
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +277 -169
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +31 -24
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +93 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +60 -69
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +72 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +15 -9
- data/lib/cocoapods/project.rb +14 -14
- data/lib/cocoapods/resolver.rb +38 -50
- data/lib/cocoapods/sandbox.rb +22 -38
- data/lib/cocoapods/sandbox/file_accessor.rb +11 -6
- data/lib/cocoapods/sandbox/headers_store.rb +9 -8
- data/lib/cocoapods/sandbox/path_list.rb +5 -8
- data/lib/cocoapods/sources_manager.rb +1 -1
- data/lib/cocoapods/target.rb +92 -37
- data/lib/cocoapods/target/aggregate_target.rb +140 -84
- data/lib/cocoapods/target/build_settings.rb +1076 -0
- data/lib/cocoapods/target/pod_target.rb +198 -294
- data/lib/cocoapods/user_interface.rb +5 -0
- data/lib/cocoapods/validator.rb +133 -41
- metadata +18 -18
- data/lib/cocoapods/generator/xcconfig.rb +0 -13
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +0 -260
- data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +0 -87
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +0 -558
@@ -4,22 +4,36 @@ module Pod
|
|
4
4
|
# the context of the installer.
|
5
5
|
#
|
6
6
|
class PostInstallHooksContext
|
7
|
-
# @return [
|
7
|
+
# @return [Sandbox] The Sandbox for the project.
|
8
8
|
#
|
9
|
-
|
9
|
+
attr_reader :sandbox
|
10
10
|
|
11
|
-
# @return [
|
11
|
+
# @return [String] The path to the sandbox root (`Pods` directory).
|
12
12
|
#
|
13
|
-
|
13
|
+
attr_reader :sandbox_root
|
14
14
|
|
15
|
-
# @return [
|
15
|
+
# @return [Xcodeproj::Project] The Pods Xcode project.
|
16
16
|
#
|
17
|
-
|
17
|
+
attr_reader :pods_project
|
18
18
|
|
19
19
|
# @return [Array<UmbrellaTargetDescription>] The list of
|
20
20
|
# the CocoaPods umbrella targets generated by the installer.
|
21
21
|
#
|
22
|
-
|
22
|
+
attr_reader :umbrella_targets
|
23
|
+
|
24
|
+
# Initialize a new instance
|
25
|
+
#
|
26
|
+
# @param [Sandbox] sandbox see #sandbox
|
27
|
+
# @param [String] sandbox_root see #sandbox_root
|
28
|
+
# @param [Xcodeproj::Project] pods_project see #pods_project
|
29
|
+
# @param [Array<UmbrellaTargetDescription>] umbrella_targets see #umbrella_targets
|
30
|
+
#
|
31
|
+
def initialize(sandbox, sandbox_root, pods_project, umbrella_targets)
|
32
|
+
@sandbox = sandbox
|
33
|
+
@sandbox_root = sandbox_root
|
34
|
+
@pods_project = pods_project
|
35
|
+
@umbrella_targets = umbrella_targets
|
36
|
+
end
|
23
37
|
|
24
38
|
# @return [PostInstallHooksContext] Convenience class generator method
|
25
39
|
#
|
@@ -34,24 +48,17 @@ module Pod
|
|
34
48
|
# static context.
|
35
49
|
#
|
36
50
|
def self.generate(sandbox, aggregate_targets)
|
37
|
-
umbrella_targets_descriptions =
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
desc.cocoapods_target_label = umbrella.label
|
46
|
-
umbrella_targets_descriptions << desc
|
51
|
+
umbrella_targets_descriptions = aggregate_targets.map do |umbrella|
|
52
|
+
user_project = umbrella.user_project
|
53
|
+
user_targets = umbrella.user_targets
|
54
|
+
specs = umbrella.specs
|
55
|
+
platform_name = umbrella.platform.name
|
56
|
+
platform_deployment_target = umbrella.platform.deployment_target.to_s
|
57
|
+
cocoapods_target_label = umbrella.label
|
58
|
+
UmbrellaTargetDescription.new(user_project, user_targets, specs, platform_name, platform_deployment_target, cocoapods_target_label)
|
47
59
|
end
|
48
60
|
|
49
|
-
|
50
|
-
result.sandbox_root = sandbox.root.to_s
|
51
|
-
result.pods_project = sandbox.project
|
52
|
-
result.sandbox = sandbox
|
53
|
-
result.umbrella_targets = umbrella_targets_descriptions
|
54
|
-
result
|
61
|
+
new(sandbox, sandbox.root.to_s, sandbox.project, umbrella_targets_descriptions)
|
55
62
|
end
|
56
63
|
|
57
64
|
# Pure data class which describes and umbrella target.
|
@@ -60,7 +67,47 @@ module Pod
|
|
60
67
|
# @return [Xcodeproj::Project] The user project into which this target
|
61
68
|
# is integrated.
|
62
69
|
#
|
63
|
-
|
70
|
+
attr_reader :user_project
|
71
|
+
|
72
|
+
# @return [Array<PBXNativeTarget>]
|
73
|
+
# The list of user targets integrated by this umbrella target.
|
74
|
+
#
|
75
|
+
attr_reader :user_targets
|
76
|
+
|
77
|
+
# @return [Array<Specification>] The list of the
|
78
|
+
# specifications of the target.
|
79
|
+
#
|
80
|
+
attr_reader :specs
|
81
|
+
|
82
|
+
# @return [Symbol] The platform (either `:ios`, `:watchos`, `:tvos`, or `:osx`).
|
83
|
+
#
|
84
|
+
attr_reader :platform_name
|
85
|
+
|
86
|
+
# @return [String] The deployment target.
|
87
|
+
#
|
88
|
+
attr_reader :platform_deployment_target
|
89
|
+
|
90
|
+
# @return [String] The label for the target.
|
91
|
+
#
|
92
|
+
attr_reader :cocoapods_target_label
|
93
|
+
|
94
|
+
# Initialize a new instance
|
95
|
+
#
|
96
|
+
# @param [Xcodeproj::Project] user_project see #user_project
|
97
|
+
# @param [Array<PBXNativeTarget>] user_targets see #user_targets
|
98
|
+
# @param [Array<Specification>] specs see #specs
|
99
|
+
# @param [Symbol] platform_name see #platform_name
|
100
|
+
# @param [String] platform_deployment_target see #platform_deployment_target
|
101
|
+
# @param [String] cocoapods_target_label see #cocoapods_target_label
|
102
|
+
#
|
103
|
+
def initialize(user_project, user_targets, specs, platform_name, platform_deployment_target, cocoapods_target_label)
|
104
|
+
@user_project = user_project
|
105
|
+
@user_targets = user_targets
|
106
|
+
@specs = specs
|
107
|
+
@platform_name = platform_name
|
108
|
+
@platform_deployment_target = platform_deployment_target
|
109
|
+
@cocoapods_target_label = cocoapods_target_label
|
110
|
+
end
|
64
111
|
|
65
112
|
# @return [String] The path of the user project
|
66
113
|
# integrated by this target.
|
@@ -69,11 +116,6 @@ module Pod
|
|
69
116
|
user_project.path if user_project
|
70
117
|
end
|
71
118
|
|
72
|
-
# @return [Array<PBXNativeTarget>]
|
73
|
-
# The list of user targets integrated by this umbrella target.
|
74
|
-
#
|
75
|
-
attr_accessor :user_targets
|
76
|
-
|
77
119
|
# @return [Array<String>] The list of the UUIDs of the
|
78
120
|
# user targets integrated by this umbrella
|
79
121
|
# target. They can be used to find the
|
@@ -84,23 +126,6 @@ module Pod
|
|
84
126
|
def user_target_uuids
|
85
127
|
user_targets.map(&:uuid)
|
86
128
|
end
|
87
|
-
|
88
|
-
# @return [Array<Specification>] The list of the
|
89
|
-
# specifications of the target.
|
90
|
-
#
|
91
|
-
attr_accessor :specs
|
92
|
-
|
93
|
-
# @return [Symbol] The platform (either `:ios`, `:watchos`, `:tvos`, or `:osx`).
|
94
|
-
#
|
95
|
-
attr_accessor :platform_name
|
96
|
-
|
97
|
-
# @return [String] The deployment target.
|
98
|
-
#
|
99
|
-
attr_accessor :platform_deployment_target
|
100
|
-
|
101
|
-
# @return [String] The label for the target.
|
102
|
-
#
|
103
|
-
attr_accessor :cocoapods_target_label
|
104
129
|
end
|
105
130
|
end
|
106
131
|
end
|
@@ -4,21 +4,35 @@ module Pod
|
|
4
4
|
# the context of the installer before analysis has been completed.
|
5
5
|
#
|
6
6
|
class PreInstallHooksContext
|
7
|
-
# @return [String] The path to the sandbox root (`Pods` directory).
|
8
|
-
#
|
9
|
-
attr_accessor :sandbox_root
|
10
|
-
|
11
7
|
# @return [Podfile] The Podfile for the project.
|
12
8
|
#
|
13
|
-
|
9
|
+
attr_reader :podfile
|
14
10
|
|
15
11
|
# @return [Sandbox] The Sandbox for the project.
|
16
12
|
#
|
17
|
-
|
13
|
+
attr_reader :sandbox
|
14
|
+
|
15
|
+
# @return [String] The path to the sandbox root (`Pods` directory).
|
16
|
+
#
|
17
|
+
attr_reader :sandbox_root
|
18
18
|
|
19
19
|
# @return [Lockfile] The Lockfile for the project.
|
20
20
|
#
|
21
|
-
|
21
|
+
attr_reader :lockfile
|
22
|
+
|
23
|
+
# Initialize a new instance
|
24
|
+
#
|
25
|
+
# @param [Sandbox] sandbox see #sandbox
|
26
|
+
# @param [String] sandbox_root see #sandbox_root
|
27
|
+
# @param [Podfile] podfile see #podfile
|
28
|
+
# @param [Lockfile] lockfile see #lockfile
|
29
|
+
#
|
30
|
+
def initialize(podfile, sandbox, sandbox_root, lockfile)
|
31
|
+
@podfile = podfile
|
32
|
+
@sandbox = sandbox
|
33
|
+
@sandbox_root = sandbox_root
|
34
|
+
@lockfile = lockfile
|
35
|
+
end
|
22
36
|
|
23
37
|
# @param [Sandbox] sandbox see {#sandbox}
|
24
38
|
#
|
@@ -30,12 +44,7 @@ module Pod
|
|
30
44
|
# static context.
|
31
45
|
#
|
32
46
|
def self.generate(sandbox, podfile, lockfile)
|
33
|
-
|
34
|
-
result.podfile = podfile
|
35
|
-
result.sandbox = sandbox
|
36
|
-
result.sandbox_root = sandbox.root.to_s
|
37
|
-
result.lockfile = lockfile
|
38
|
-
result
|
47
|
+
new(podfile, sandbox, sandbox.root.to_s, lockfile)
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
@@ -44,8 +44,6 @@ module Pod
|
|
44
44
|
# @param [Pathname] installation_root @see #installation_root
|
45
45
|
# @param [Array<AggregateTarget>] targets @see #targets
|
46
46
|
#
|
47
|
-
# @todo Too many initialization arguments
|
48
|
-
#
|
49
47
|
def initialize(podfile, sandbox, installation_root, targets)
|
50
48
|
@podfile = podfile
|
51
49
|
@sandbox = sandbox
|
@@ -162,7 +162,7 @@ module Pod
|
|
162
162
|
#
|
163
163
|
def create_or_update_user_script_phases(script_phases, native_target)
|
164
164
|
script_phase_names = script_phases.map { |k| k[:name] }
|
165
|
-
# Delete script phases no longer present in the target
|
165
|
+
# Delete script phases no longer present in the target.
|
166
166
|
native_target_script_phases = native_target.shell_script_build_phases.select { |bp| !bp.name.nil? && bp.name.start_with?(USER_BUILD_PHASE_PREFIX) }
|
167
167
|
native_target_script_phases.each do |script_phase|
|
168
168
|
script_phase_name_without_prefix = script_phase.name.sub(USER_BUILD_PHASE_PREFIX, '')
|
@@ -171,16 +171,16 @@ module Pod
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
# Create or update the ones that are expected to be.
|
174
|
-
script_phases.each do |
|
175
|
-
name_with_prefix = USER_BUILD_PHASE_PREFIX +
|
174
|
+
script_phases.each do |script_phase|
|
175
|
+
name_with_prefix = USER_BUILD_PHASE_PREFIX + script_phase[:name]
|
176
176
|
phase = TargetIntegrator.create_or_update_build_phase(native_target, name_with_prefix)
|
177
|
-
phase.shell_script =
|
178
|
-
phase.shell_path =
|
179
|
-
phase.input_paths =
|
180
|
-
phase.output_paths =
|
181
|
-
phase.show_env_vars_in_log =
|
177
|
+
phase.shell_script = script_phase[:script]
|
178
|
+
phase.shell_path = script_phase[:shell_path] if script_phase.key?(:shell_path)
|
179
|
+
phase.input_paths = script_phase[:input_files] if script_phase.key?(:input_files)
|
180
|
+
phase.output_paths = script_phase[:output_files] if script_phase.key?(:output_files)
|
181
|
+
phase.show_env_vars_in_log = script_phase[:show_env_vars_in_log] ? '1' : '0' if script_phase.key?(:show_env_vars_in_log)
|
182
182
|
|
183
|
-
execution_position =
|
183
|
+
execution_position = script_phase[:execution_position]
|
184
184
|
unless execution_position == :any
|
185
185
|
compile_build_phase_index = native_target.build_phases.index do |bp|
|
186
186
|
bp.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
|
@@ -321,18 +321,24 @@ module Pod
|
|
321
321
|
# @return [void]
|
322
322
|
#
|
323
323
|
def add_copy_resources_script_phase
|
324
|
-
|
325
|
-
|
326
|
-
resource_paths_by_config = target.resource_paths_by_config
|
327
|
-
if resource_paths_by_config.values.all?(&:empty?)
|
324
|
+
unless target.includes_resources?
|
325
|
+
native_targets.each do |native_target|
|
328
326
|
TargetIntegrator.remove_copy_resources_script_phase_from_target(native_target)
|
329
|
-
else
|
330
|
-
resource_paths_flattened = resource_paths_by_config.values.flatten.uniq
|
331
|
-
input_paths = [target.copy_resources_script_relative_path, *resource_paths_flattened]
|
332
|
-
output_paths = TargetIntegrator.resource_output_paths(resource_paths_flattened)
|
333
|
-
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
334
|
-
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
335
327
|
end
|
328
|
+
return
|
329
|
+
end
|
330
|
+
|
331
|
+
script_path = target.copy_resources_script_relative_path
|
332
|
+
resource_paths_by_config = target.resource_paths_by_config
|
333
|
+
resource_paths_flattened = resource_paths_by_config.values.flatten.uniq
|
334
|
+
input_paths = [target.copy_resources_script_relative_path, *resource_paths_flattened]
|
335
|
+
output_paths = TargetIntegrator.resource_output_paths(resource_paths_flattened)
|
336
|
+
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
337
|
+
|
338
|
+
native_targets.each do |native_target|
|
339
|
+
# Static library targets cannot include resources. Skip this phase from being added instead.
|
340
|
+
next if native_target.symbol_type == :static_library
|
341
|
+
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
336
342
|
end
|
337
343
|
end
|
338
344
|
|
@@ -356,17 +362,21 @@ module Pod
|
|
356
362
|
# @return [void]
|
357
363
|
#
|
358
364
|
def add_embed_frameworks_script_phase
|
359
|
-
|
360
|
-
|
361
|
-
framework_paths_by_config = target.framework_paths_by_config.values.flatten.uniq
|
362
|
-
if framework_paths_by_config.all?(&:empty?)
|
365
|
+
unless target.includes_frameworks?
|
366
|
+
native_targets_to_embed_in.each do |native_target|
|
363
367
|
TargetIntegrator.remove_embed_frameworks_script_phase_from_target(native_target)
|
364
|
-
else
|
365
|
-
input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
|
366
|
-
output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact.uniq
|
367
|
-
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
368
|
-
TargetIntegrator.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
369
368
|
end
|
369
|
+
return
|
370
|
+
end
|
371
|
+
|
372
|
+
script_path = target.embed_frameworks_script_relative_path
|
373
|
+
framework_paths_by_config = target.framework_paths_by_config.values.flatten.uniq
|
374
|
+
input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
|
375
|
+
output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact.uniq
|
376
|
+
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
377
|
+
|
378
|
+
native_targets_to_embed_in.each do |native_target|
|
379
|
+
TargetIntegrator.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
370
380
|
end
|
371
381
|
end
|
372
382
|
|
data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb
CHANGED
@@ -42,19 +42,14 @@ module Pod
|
|
42
42
|
# The build configuration.
|
43
43
|
#
|
44
44
|
def self.set_target_xcconfig(pod_bundle, target, config)
|
45
|
-
|
46
|
-
|
47
|
-
file_ref = group.files.find { |f| f.path == path }
|
48
|
-
existing = config.base_configuration_reference
|
45
|
+
file_ref = create_xcconfig_ref(pod_bundle, config)
|
46
|
+
path = file_ref.path
|
49
47
|
|
50
|
-
|
51
|
-
file_ref ||= group.new_file(path)
|
52
|
-
config.base_configuration_reference = file_ref
|
53
|
-
end
|
48
|
+
existing = config.base_configuration_reference
|
54
49
|
|
55
50
|
if existing && existing != file_ref
|
56
51
|
if existing.real_path.to_path.start_with?(pod_bundle.sandbox.root.to_path << '/')
|
57
|
-
|
52
|
+
config.base_configuration_reference = file_ref
|
58
53
|
elsif !xcconfig_includes_target_xcconfig?(config.base_configuration_reference, path)
|
59
54
|
unless existing_config_is_identical_to_pod_config?(existing.real_path, pod_bundle.xcconfig_path(config.name))
|
60
55
|
UI.warn 'CocoaPods did not set the base configuration of your ' \
|
@@ -66,7 +61,7 @@ module Pod
|
|
66
61
|
end
|
67
62
|
end
|
68
63
|
elsif config.base_configuration_reference.nil? || file_ref.nil?
|
69
|
-
|
64
|
+
config.base_configuration_reference = file_ref
|
70
65
|
end
|
71
66
|
end
|
72
67
|
|
@@ -97,7 +92,7 @@ module Pod
|
|
97
92
|
]
|
98
93
|
message = "The `#{target.name} [#{config.name}]` " \
|
99
94
|
"target overrides the `#{key}` build setting defined in " \
|
100
|
-
"`#{pod_bundle.xcconfig_relative_path(config.name)}'. " \
|
95
|
+
"`#{pod_bundle.pod_bundle.xcconfig_relative_path(config.name)}'. " \
|
101
96
|
'This can lead to problems with the CocoaPods installation'
|
102
97
|
UI.warn(message, actions)
|
103
98
|
end
|
@@ -139,6 +134,44 @@ module Pod
|
|
139
134
|
def self.existing_config_is_identical_to_pod_config?(existing_config_path, pod_config_path)
|
140
135
|
existing_config_path.file? && (!pod_config_path.file? || FileUtils.compare_file(existing_config_path, pod_config_path))
|
141
136
|
end
|
137
|
+
|
138
|
+
# Creates a file reference to the xcconfig generated by
|
139
|
+
# CocoaPods (if needed).
|
140
|
+
# If the Pods group not exists, create the group and set
|
141
|
+
# the location to the `Pods` directory.
|
142
|
+
# If the file reference exists, the location is different
|
143
|
+
# with the xcconfig's path and the symlink target paths
|
144
|
+
# are different, we will update the location.
|
145
|
+
#
|
146
|
+
# @param [Target::AggregateTarget] pod_bundle
|
147
|
+
# The Pods bundle.
|
148
|
+
#
|
149
|
+
# @param [Xcodeproj::XCBuildConfiguration] config
|
150
|
+
# The build configuration.
|
151
|
+
#
|
152
|
+
# @return [PBXFileReference] the xcconfig reference.
|
153
|
+
#
|
154
|
+
def self.create_xcconfig_ref(pod_bundle, config)
|
155
|
+
# Xcode root group's path is absolute, we must get the relative path of the sandbox to the user project
|
156
|
+
group_path = pod_bundle.relative_pods_root_path
|
157
|
+
group = config.project['Pods'] || config.project.new_group('Pods', group_path)
|
158
|
+
|
159
|
+
# support user custom paths of Pods group and xcconfigs files.
|
160
|
+
group_path = Pathname.new(group.real_path)
|
161
|
+
xcconfig_path = Pathname.new(pod_bundle.xcconfig_path(config.name))
|
162
|
+
path = xcconfig_path.relative_path_from(group_path)
|
163
|
+
|
164
|
+
filename = path.basename.to_s
|
165
|
+
file_ref = group.files.find { |f| f.display_name == filename }
|
166
|
+
if file_ref && file_ref.path != path
|
167
|
+
file_ref_path = Pathname.new(file_ref.real_path)
|
168
|
+
if !file_ref_path.exist? || !xcconfig_path.exist? || file_ref_path.realpath != xcconfig_path.realpath
|
169
|
+
file_ref.path = path.to_s
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
file_ref || group.new_file(path.to_s)
|
174
|
+
end
|
142
175
|
end
|
143
176
|
end
|
144
177
|
end
|
@@ -4,12 +4,18 @@ module Pod
|
|
4
4
|
# The {PodsProjectGenerator} handles generation of the 'Pods/Pods.xcodeproj'
|
5
5
|
#
|
6
6
|
class PodsProjectGenerator
|
7
|
+
require 'cocoapods/installer/xcode/pods_project_generator/target_installer_helper'
|
7
8
|
require 'cocoapods/installer/xcode/pods_project_generator/pod_target_integrator'
|
8
9
|
require 'cocoapods/installer/xcode/pods_project_generator/target_installer'
|
10
|
+
require 'cocoapods/installer/xcode/pods_project_generator/target_installation_result'
|
9
11
|
require 'cocoapods/installer/xcode/pods_project_generator/pod_target_installer'
|
10
12
|
require 'cocoapods/installer/xcode/pods_project_generator/file_references_installer'
|
11
13
|
require 'cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer'
|
12
14
|
|
15
|
+
# @return [Sandbox] The sandbox where the Pods should be installed.
|
16
|
+
#
|
17
|
+
attr_reader :sandbox
|
18
|
+
|
13
19
|
# @return [Pod::Project] the `Pods/Pods.xcodeproj` project.
|
14
20
|
#
|
15
21
|
attr_reader :project
|
@@ -20,10 +26,6 @@ module Pod
|
|
20
26
|
#
|
21
27
|
attr_reader :aggregate_targets
|
22
28
|
|
23
|
-
# @return [Sandbox] The sandbox where the Pods should be installed.
|
24
|
-
#
|
25
|
-
attr_reader :sandbox
|
26
|
-
|
27
29
|
# @return [Array<PodTarget>] The model representations of pod targets.
|
28
30
|
#
|
29
31
|
attr_reader :pod_targets
|
@@ -43,16 +45,16 @@ module Pod
|
|
43
45
|
|
44
46
|
# Initialize a new instance
|
45
47
|
#
|
46
|
-
# @param [
|
47
|
-
# @param [
|
48
|
-
# @param [Array<PodTarget>] pod_targets @see pod_targets
|
49
|
-
# @param [Analyzer] analysis_result @see analysis_result
|
50
|
-
# @param [InstallationOptions] installation_options @see installation_options
|
51
|
-
# @param [Config] config @see config
|
48
|
+
# @param [Sandbox] sandbox @see #sandbox
|
49
|
+
# @param [Array<AggregateTarget>] aggregate_targets @see #aggregate_targets
|
50
|
+
# @param [Array<PodTarget>] pod_targets @see #pod_targets
|
51
|
+
# @param [Analyzer] analysis_result @see #analysis_result
|
52
|
+
# @param [InstallationOptions] installation_options @see #installation_options
|
53
|
+
# @param [Config] config @see #config
|
52
54
|
#
|
53
|
-
def initialize(
|
54
|
-
@aggregate_targets = aggregate_targets
|
55
|
+
def initialize(sandbox, aggregate_targets, pod_targets, analysis_result, installation_options, config)
|
55
56
|
@sandbox = sandbox
|
57
|
+
@aggregate_targets = aggregate_targets
|
56
58
|
@pod_targets = pod_targets
|
57
59
|
@analysis_result = analysis_result
|
58
60
|
@installation_options = installation_options
|
@@ -62,9 +64,10 @@ module Pod
|
|
62
64
|
def generate!
|
63
65
|
prepare
|
64
66
|
install_file_references
|
65
|
-
|
66
|
-
integrate_targets
|
67
|
-
|
67
|
+
@target_installation_results = install_targets
|
68
|
+
integrate_targets(@target_installation_results.pod_target_installation_results)
|
69
|
+
wire_target_dependencies(@target_installation_results)
|
70
|
+
@target_installation_results
|
68
71
|
end
|
69
72
|
|
70
73
|
def write
|
@@ -76,11 +79,19 @@ module Pod
|
|
76
79
|
UI.message('- Generating deterministic UUIDs') { project.predictabilize_uuids }
|
77
80
|
end
|
78
81
|
library_product_types = [:framework, :dynamic_library, :static_library]
|
82
|
+
|
83
|
+
pod_target_installation_results = @target_installation_results.pod_target_installation_results
|
84
|
+
results_by_native_target = Hash[pod_target_installation_results.map do |_, result|
|
85
|
+
[result.native_target, result]
|
86
|
+
end]
|
79
87
|
project.recreate_user_schemes(false) do |scheme, target|
|
88
|
+
next unless target.respond_to?(:symbol_type)
|
80
89
|
next unless library_product_types.include? target.symbol_type
|
81
|
-
|
82
|
-
next
|
83
|
-
|
90
|
+
installation_result = results_by_native_target[target]
|
91
|
+
next unless installation_result
|
92
|
+
installation_result.test_native_targets.each do |test_native_target|
|
93
|
+
scheme.add_test_target(test_native_target)
|
94
|
+
end
|
84
95
|
end
|
85
96
|
project.save
|
86
97
|
end
|
@@ -95,8 +106,8 @@ module Pod
|
|
95
106
|
next unless share_scheme_for_development_pod?(pod_target.pod_name)
|
96
107
|
Xcodeproj::XCScheme.share_scheme(project.path, pod_target.label)
|
97
108
|
if pod_target.contains_test_specifications?
|
98
|
-
pod_target.
|
99
|
-
Xcodeproj::XCScheme.share_scheme(project.path, pod_target.test_target_label(
|
109
|
+
pod_target.test_specs.each do |test_spec|
|
110
|
+
Xcodeproj::XCScheme.share_scheme(project.path, pod_target.test_target_label(test_spec))
|
100
111
|
end
|
101
112
|
end
|
102
113
|
end
|
@@ -104,6 +115,8 @@ module Pod
|
|
104
115
|
|
105
116
|
private
|
106
117
|
|
118
|
+
InstallationResults = Struct.new(:pod_target_installation_results, :aggregate_target_installation_results)
|
119
|
+
|
107
120
|
def create_project
|
108
121
|
if object_version = aggregate_targets.map(&:user_project).compact.map { |p| p.object_version.to_i }.min
|
109
122
|
Pod::Project.new(sandbox.project_path, false, object_version)
|
@@ -163,49 +176,59 @@ module Pod
|
|
163
176
|
installer.install!
|
164
177
|
end
|
165
178
|
|
166
|
-
def
|
179
|
+
def install_targets
|
167
180
|
UI.message '- Installing targets' do
|
168
181
|
umbrella_headers_by_dir = pod_targets.map do |pod_target|
|
169
182
|
next unless pod_target.should_build? && pod_target.defines_module?
|
170
183
|
pod_target.umbrella_header_path
|
171
184
|
end.compact.group_by(&:dirname)
|
172
185
|
|
173
|
-
pod_targets.sort_by(&:name).
|
174
|
-
|
175
|
-
target_installer
|
176
|
-
target_installer.install!
|
177
|
-
end
|
186
|
+
pod_target_installation_results = Hash[pod_targets.sort_by(&:name).map do |pod_target|
|
187
|
+
umbrella_headers_in_header_dir = umbrella_headers_by_dir[pod_target.module_map_path.dirname]
|
188
|
+
target_installer = PodTargetInstaller.new(sandbox, @project, pod_target, umbrella_headers_in_header_dir)
|
189
|
+
[pod_target.name, target_installer.install!]
|
190
|
+
end]
|
178
191
|
|
179
|
-
|
180
|
-
|
181
|
-
|
192
|
+
# Hook up system framework dependencies for the pod targets that were just installed.
|
193
|
+
pod_target_installation_result_values = pod_target_installation_results.values.compact
|
194
|
+
unless pod_target_installation_result_values.empty?
|
195
|
+
add_system_framework_dependencies(pod_target_installation_result_values)
|
182
196
|
end
|
183
197
|
|
184
|
-
|
198
|
+
aggregate_target_installation_results = Hash[aggregate_targets.sort_by(&:name).map do |target|
|
199
|
+
target_installer = AggregateTargetInstaller.new(sandbox, @project, target)
|
200
|
+
[target.name, target_installer.install!]
|
201
|
+
end]
|
202
|
+
|
203
|
+
InstallationResults.new(pod_target_installation_results, aggregate_target_installation_results)
|
185
204
|
end
|
186
205
|
end
|
187
206
|
|
188
|
-
def integrate_targets
|
189
|
-
|
190
|
-
|
207
|
+
def integrate_targets(pod_target_installation_results)
|
208
|
+
pod_installations_to_integrate = pod_target_installation_results.values.select do |pod_target_installation_result|
|
209
|
+
pod_target = pod_target_installation_result.target
|
210
|
+
!pod_target_installation_result.test_native_targets.empty? || pod_target.contains_script_phases?
|
211
|
+
end
|
212
|
+
unless pod_installations_to_integrate.empty?
|
191
213
|
UI.message '- Integrating targets' do
|
192
|
-
|
193
|
-
PodTargetIntegrator.new(
|
214
|
+
pod_installations_to_integrate.each do |pod_target_installation_result|
|
215
|
+
PodTargetIntegrator.new(pod_target_installation_result).integrate!
|
194
216
|
end
|
195
217
|
end
|
196
218
|
end
|
197
219
|
end
|
198
220
|
|
199
|
-
def add_system_framework_dependencies
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
221
|
+
def add_system_framework_dependencies(pod_target_installation_results)
|
222
|
+
sorted_installation_results = pod_target_installation_results.sort_by do |pod_target_installation_result|
|
223
|
+
pod_target_installation_result.target.name
|
224
|
+
end
|
225
|
+
sorted_installation_results.each do |target_installation_result|
|
226
|
+
pod_target = target_installation_result.target
|
227
|
+
next unless pod_target.should_build?
|
228
|
+
next if !pod_target.requires_frameworks? || pod_target.static_framework?
|
229
|
+
pod_target.file_accessors.each do |file_accessor|
|
230
|
+
native_target = target_installation_result.native_target_for_spec(file_accessor.spec)
|
231
|
+
add_system_frameworks_to_native_target(native_target, file_accessor)
|
209
232
|
end
|
210
233
|
end
|
211
234
|
end
|
@@ -213,53 +236,70 @@ module Pod
|
|
213
236
|
# Adds a target dependency for each pod spec to each aggregate target and
|
214
237
|
# links the pod targets among each other.
|
215
238
|
#
|
239
|
+
# @param [Array[Hash{String=>TargetInstallationResult}]] target_installation_results
|
240
|
+
# the installation results that were produced when all targets were installed. This includes
|
241
|
+
# pod target installation results and aggregate target installation results.
|
242
|
+
#
|
216
243
|
# @return [void]
|
217
244
|
#
|
218
|
-
def
|
245
|
+
def wire_target_dependencies(target_installation_results)
|
219
246
|
frameworks_group = project.frameworks_group
|
220
|
-
|
221
|
-
|
247
|
+
pod_target_installation_results_hash = target_installation_results.pod_target_installation_results
|
248
|
+
aggregate_target_installation_results_hash = target_installation_results.aggregate_target_installation_results
|
249
|
+
|
250
|
+
# Wire up aggregate targets
|
251
|
+
aggregate_target_installation_results_hash.values.each do |aggregate_target_installation_result|
|
252
|
+
aggregate_target = aggregate_target_installation_result.target
|
253
|
+
aggregate_native_target = aggregate_target_installation_result.native_target
|
222
254
|
is_app_extension = !(aggregate_target.user_targets.map(&:symbol_type) &
|
223
|
-
|
255
|
+
[:app_extension, :watch_extension, :watch2_extension, :tv_extension, :messages_extension]).empty?
|
224
256
|
is_app_extension ||= aggregate_target.user_targets.any? { |ut| ut.common_resolved_build_setting('APPLICATION_EXTENSION_API_ONLY') == 'YES' }
|
225
|
-
|
257
|
+
configure_app_extension_api_only_to_native_target(aggregate_native_target) if is_app_extension
|
258
|
+
# Wire up dependencies that are part of inherit search paths for this aggregate target.
|
226
259
|
aggregate_target.search_paths_aggregate_targets.each do |search_paths_target|
|
227
|
-
|
260
|
+
aggregate_native_target.add_dependency(aggregate_target_installation_results_hash[search_paths_target.name].native_target)
|
228
261
|
end
|
229
|
-
|
262
|
+
# Wire up all pod target dependencies to aggregate target.
|
230
263
|
aggregate_target.pod_targets.each do |pod_target|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
add_pod_target_test_dependencies(pod_target, frameworks_group)
|
237
|
-
next
|
238
|
-
end
|
239
|
-
|
240
|
-
aggregate_target.native_target.add_dependency(pod_target.native_target)
|
241
|
-
configure_app_extension_api_only_for_target(pod_target) if is_app_extension
|
264
|
+
pod_target_native_target = pod_target_installation_results_hash[pod_target.name].native_target
|
265
|
+
aggregate_native_target.add_dependency(pod_target_native_target)
|
266
|
+
configure_app_extension_api_only_to_native_target(pod_target_native_target) if is_app_extension
|
267
|
+
end
|
268
|
+
end
|
242
269
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
270
|
+
# Wire up pod targets
|
271
|
+
pod_target_installation_results_hash.values.each do |pod_target_installation_result|
|
272
|
+
pod_target = pod_target_installation_result.target
|
273
|
+
native_target = pod_target_installation_result.native_target
|
274
|
+
# First, wire up all resource bundles.
|
275
|
+
pod_target_installation_result.resource_bundle_targets.each do |resource_bundle_target|
|
276
|
+
native_target.add_dependency(resource_bundle_target)
|
277
|
+
if pod_target.requires_frameworks? && pod_target.should_build?
|
278
|
+
native_target.add_resources([resource_bundle_target.product_reference])
|
249
279
|
end
|
250
280
|
end
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
next
|
281
|
+
# Wire up all dependencies to this pod target, if any.
|
282
|
+
dependent_targets = pod_target.dependent_targets
|
283
|
+
dependent_targets.each do |dependent_target|
|
284
|
+
native_target.add_dependency(pod_target_installation_results_hash[dependent_target.name].native_target)
|
285
|
+
add_framework_file_reference_to_native_target(native_target, pod_target, dependent_target, frameworks_group)
|
257
286
|
end
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
287
|
+
# Wire up test native targets.
|
288
|
+
unless pod_target_installation_result.test_native_targets.empty?
|
289
|
+
pod_target_installation_result.test_specs_by_native_target.each do |test_native_target, test_specs|
|
290
|
+
test_dependent_targets = test_specs.flat_map { |s| pod_target.test_dependent_targets_by_spec_name[s.name] }.compact.unshift(pod_target).uniq
|
291
|
+
test_dependent_targets.each do |test_dependent_target|
|
292
|
+
dependency_installation_result = pod_target_installation_results_hash[test_dependent_target.name]
|
293
|
+
resource_bundle_native_targets = dependency_installation_result.test_resource_bundle_targets[test_specs.first.name]
|
294
|
+
unless resource_bundle_native_targets.nil?
|
295
|
+
resource_bundle_native_targets.each do |test_resource_bundle_target|
|
296
|
+
test_native_target.add_dependency(test_resource_bundle_target)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
test_native_target.add_dependency(dependency_installation_result.native_target)
|
300
|
+
add_framework_file_reference_to_native_target(test_native_target, pod_target, test_dependent_target, frameworks_group)
|
301
|
+
end
|
302
|
+
end
|
263
303
|
end
|
264
304
|
end
|
265
305
|
end
|
@@ -295,55 +335,25 @@ module Pod
|
|
295
335
|
|
296
336
|
# @! group Private Helpers
|
297
337
|
|
298
|
-
|
299
|
-
|
300
|
-
def add_pod_target_test_dependencies(pod_target, frameworks_group)
|
301
|
-
test_dependent_targets = pod_target.all_dependent_targets
|
302
|
-
pod_target.test_specs_by_native_target.each do |test_native_target, test_specs|
|
303
|
-
test_dependent_targets.reject(&:should_build?).each do |test_dependent_target|
|
304
|
-
add_resource_bundles_to_native_target(test_dependent_target, test_native_target)
|
305
|
-
end
|
306
|
-
add_dependent_targets_to_native_target(test_dependent_targets, test_native_target, false, pod_target.requires_frameworks?, frameworks_group)
|
307
|
-
test_spec_consumers = test_specs.map { |test_spec| test_spec.consumer(pod_target.platform) }
|
308
|
-
if test_spec_consumers.any?(&:requires_app_host?)
|
309
|
-
app_host_target = project.targets.find { |t| t.name == pod_target.app_host_label(test_specs.first.test_type) }
|
310
|
-
test_native_target.add_dependency(app_host_target)
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
def add_dependent_targets_to_native_target(dependent_targets, native_target, is_app_extension, requires_frameworks, frameworks_group)
|
316
|
-
dependent_targets.each do |pod_dependency_target|
|
317
|
-
next unless pod_dependency_target.should_build?
|
318
|
-
native_target.add_dependency(pod_dependency_target.native_target)
|
319
|
-
configure_app_extension_api_only_for_target(pod_dependency_target) if is_app_extension
|
320
|
-
|
321
|
-
if requires_frameworks
|
322
|
-
product_ref = frameworks_group.files.find { |f| f.path == pod_dependency_target.product_name } ||
|
323
|
-
frameworks_group.new_product_ref_for_target(pod_dependency_target.product_basename, pod_dependency_target.product_type)
|
324
|
-
native_target.frameworks_build_phase.add_file_reference(product_ref, true)
|
325
|
-
end
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
def add_system_frameworks_to_native_target(file_accessor, native_target)
|
338
|
+
def add_system_frameworks_to_native_target(native_target, file_accessor)
|
330
339
|
file_accessor.spec_consumer.frameworks.each do |framework|
|
331
340
|
native_target.add_system_framework(framework)
|
332
341
|
end
|
333
342
|
end
|
334
343
|
|
335
|
-
def
|
336
|
-
|
337
|
-
|
338
|
-
|
344
|
+
def add_framework_file_reference_to_native_target(native_target, pod_target, dependent_target, frameworks_group)
|
345
|
+
if pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework? && dependent_target.should_build?
|
346
|
+
product_ref = frameworks_group.files.find { |f| f.path == dependent_target.product_name } ||
|
347
|
+
frameworks_group.new_product_ref_for_target(dependent_target.product_basename, dependent_target.product_type)
|
348
|
+
native_target.frameworks_build_phase.add_file_reference(product_ref, true)
|
339
349
|
end
|
340
350
|
end
|
341
351
|
|
342
352
|
# Sets the APPLICATION_EXTENSION_API_ONLY build setting to YES for all
|
343
|
-
# configurations of the given target
|
353
|
+
# configurations of the given native target.
|
344
354
|
#
|
345
|
-
def
|
346
|
-
|
355
|
+
def configure_app_extension_api_only_to_native_target(native_target)
|
356
|
+
native_target.build_configurations.each do |config|
|
347
357
|
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES'
|
348
358
|
end
|
349
359
|
end
|