cocoapods 1.9.2 → 1.10.0
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 +235 -6
- data/README.md +2 -1
- data/lib/cocoapods.rb +3 -1
- data/lib/cocoapods/command.rb +12 -2
- data/lib/cocoapods/command/lib/lint.rb +12 -3
- data/lib/cocoapods/command/repo/push.rb +1 -1
- data/lib/cocoapods/command/repo/update.rb +11 -0
- data/lib/cocoapods/command/spec/lint.rb +12 -3
- data/lib/cocoapods/config.rb +17 -0
- data/lib/cocoapods/downloader/cache.rb +2 -2
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/app_target_helper.rb +10 -2
- data/lib/cocoapods/generator/copy_dsyms_script.rb +56 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +2 -14
- data/lib/cocoapods/generator/copy_xcframework_script.rb +245 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +125 -212
- data/lib/cocoapods/generator/script_phase_constants.rb +99 -0
- data/lib/cocoapods/installer.rb +70 -3
- data/lib/cocoapods/installer/analyzer.rb +17 -8
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +1 -1
- data/lib/cocoapods/installer/base_install_hooks_context.rb +135 -0
- data/lib/cocoapods/installer/installation_options.rb +5 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +2 -1
- data/lib/cocoapods/installer/post_install_hooks_context.rb +1 -127
- data/lib/cocoapods/installer/post_integrate_hooks_context.rb +9 -0
- data/lib/cocoapods/installer/project_cache/project_metadata_cache.rb +4 -0
- data/lib/cocoapods/installer/sandbox_dir_cleaner.rb +2 -1
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +132 -111
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +45 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +13 -27
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +5 -1
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +2 -1
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb +8 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +180 -59
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +61 -30
- data/lib/cocoapods/installer/xcode/pods_project_generator/project_generator.rb +3 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +5 -7
- data/lib/cocoapods/installer/xcode/pods_project_generator_result.rb +19 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +1 -1
- data/lib/cocoapods/sources_manager.rb +2 -1
- data/lib/cocoapods/target.rb +44 -2
- data/lib/cocoapods/target/aggregate_target.rb +35 -0
- data/lib/cocoapods/target/build_settings.rb +94 -18
- data/lib/cocoapods/target/pod_target.rb +85 -11
- data/lib/cocoapods/user_interface/error_report.rb +1 -1
- data/lib/cocoapods/user_interface/inspector_reporter.rb +3 -10
- data/lib/cocoapods/validator.rb +37 -11
- data/lib/cocoapods/xcode/framework_paths.rb +1 -1
- data/lib/cocoapods/xcode/xcframework.rb +17 -4
- data/lib/cocoapods/xcode/xcframework/xcframework_slice.rb +81 -3
- metadata +31 -53
- data/lib/cocoapods/generator/prepare_artifacts_script.rb +0 -257
@@ -32,11 +32,12 @@ module Pod
|
|
32
32
|
def integrate!
|
33
33
|
UI.section(integration_message) do
|
34
34
|
target_installation_result.non_library_specs_by_native_target.each do |native_target, spec|
|
35
|
-
add_prepare_artifacts_script_phase(native_target, spec)
|
36
35
|
add_embed_frameworks_script_phase(native_target, spec)
|
37
36
|
add_copy_resources_script_phase(native_target, spec)
|
38
37
|
UserProjectIntegrator::TargetIntegrator.create_or_update_user_script_phases(script_phases_for_specs(spec), native_target)
|
39
38
|
end
|
39
|
+
add_copy_dsyms_script_phase(target_installation_result.native_target)
|
40
|
+
add_copy_xcframeworks_script_phase(target_installation_result.native_target)
|
40
41
|
UserProjectIntegrator::TargetIntegrator.create_or_update_user_script_phases(script_phases_for_specs(target.library_specs), target_installation_result.native_target)
|
41
42
|
end
|
42
43
|
end
|
@@ -138,15 +139,12 @@ module Pod
|
|
138
139
|
input_file_list_path = target.embed_frameworks_script_input_files_path_for_spec(spec)
|
139
140
|
input_file_list_relative_path = "${PODS_ROOT}/#{input_file_list_path.relative_path_from(target.sandbox.root)}"
|
140
141
|
input_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(input_file_list_path, input_file_list_relative_path)
|
141
|
-
|
142
|
-
framework_paths.each do |path|
|
143
|
-
input_paths.concat(path.all_paths)
|
144
|
-
end
|
142
|
+
input_paths_by_config[input_paths_key] = [script_path] + UserProjectIntegrator::TargetIntegrator.embed_frameworks_input_paths(framework_paths, [])
|
145
143
|
|
146
144
|
output_file_list_path = target.embed_frameworks_script_output_files_path_for_spec(spec)
|
147
145
|
output_file_list_relative_path = "${PODS_ROOT}/#{output_file_list_path.relative_path_from(target.sandbox.root)}"
|
148
146
|
output_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(output_file_list_path, output_file_list_relative_path)
|
149
|
-
output_paths_by_config[output_paths_key] = UserProjectIntegrator::TargetIntegrator.
|
147
|
+
output_paths_by_config[output_paths_key] = UserProjectIntegrator::TargetIntegrator.embed_frameworks_output_paths(framework_paths, [])
|
150
148
|
end
|
151
149
|
|
152
150
|
if framework_paths.empty?
|
@@ -162,34 +160,18 @@ module Pod
|
|
162
160
|
# @param [PBXNativeTarget] native_target
|
163
161
|
# the native target for which to add the prepare artifacts script
|
164
162
|
#
|
165
|
-
# @param [Pod::Specification] spec
|
166
|
-
# the specification to integrate
|
167
|
-
#
|
168
163
|
# @return [void]
|
169
164
|
#
|
170
|
-
def
|
171
|
-
script_path = "${PODS_ROOT}/#{target.
|
165
|
+
def add_copy_xcframeworks_script_phase(native_target)
|
166
|
+
script_path = "${PODS_ROOT}/#{target.copy_xcframeworks_script_path.relative_path_from(target.sandbox.root)}"
|
172
167
|
|
173
168
|
input_paths_by_config = {}
|
174
169
|
output_paths_by_config = {}
|
175
170
|
|
176
|
-
|
177
|
-
target.dependent_targets_for_test_spec(spec)
|
178
|
-
else
|
179
|
-
target.dependent_targets_for_app_spec(spec)
|
180
|
-
end
|
181
|
-
host_target_spec_names = target.app_host_dependent_targets_for_spec(spec).flat_map do |pt|
|
182
|
-
pt.specs.map(&:name)
|
183
|
-
end.uniq
|
184
|
-
xcframeworks = dependent_targets.flat_map do |dependent_target|
|
185
|
-
spec_paths_to_include = dependent_target.library_specs.map(&:name)
|
186
|
-
spec_paths_to_include -= host_target_spec_names
|
187
|
-
spec_paths_to_include << spec.name if dependent_target == target
|
188
|
-
dependent_target.xcframeworks.values_at(*spec_paths_to_include).flatten.compact
|
189
|
-
end.uniq
|
171
|
+
xcframeworks = target.xcframeworks.values.flatten
|
190
172
|
|
191
173
|
if use_input_output_paths? && !xcframeworks.empty?
|
192
|
-
input_file_list_path = target.
|
174
|
+
input_file_list_path = target.copy_xcframeworks_script_input_files_path
|
193
175
|
input_file_list_relative_path = "${PODS_ROOT}/#{input_file_list_path.relative_path_from(target.sandbox.root)}"
|
194
176
|
input_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(input_file_list_path, input_file_list_relative_path)
|
195
177
|
input_paths = input_paths_by_config[input_paths_key] = [script_path]
|
@@ -197,20 +179,69 @@ module Pod
|
|
197
179
|
framework_paths = xcframeworks.map { |xcf| "${PODS_ROOT}/#{xcf.path.relative_path_from(target.sandbox.root)}" }
|
198
180
|
input_paths.concat framework_paths
|
199
181
|
|
200
|
-
output_file_list_path = target.
|
182
|
+
output_file_list_path = target.copy_xcframeworks_script_output_files_path
|
201
183
|
output_file_list_relative_path = "${PODS_ROOT}/#{output_file_list_path.relative_path_from(target.sandbox.root)}"
|
202
184
|
output_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(output_file_list_path, output_file_list_relative_path)
|
203
|
-
output_paths_by_config[output_paths_key] =
|
185
|
+
output_paths_by_config[output_paths_key] = xcframeworks.map do |xcf|
|
186
|
+
"#{Target::BuildSettings::XCFRAMEWORKS_BUILD_DIR_VARIABLE}/#{xcf.name}"
|
187
|
+
end
|
204
188
|
end
|
205
189
|
|
206
190
|
if xcframeworks.empty?
|
207
|
-
UserProjectIntegrator::TargetIntegrator.
|
191
|
+
UserProjectIntegrator::TargetIntegrator.remove_copy_xcframeworks_script_phase_from_target(native_target)
|
208
192
|
else
|
209
|
-
UserProjectIntegrator::TargetIntegrator.
|
193
|
+
UserProjectIntegrator::TargetIntegrator.create_or_update_copy_xcframeworks_script_phase_to_target(
|
210
194
|
native_target, script_path, input_paths_by_config, output_paths_by_config)
|
211
195
|
end
|
212
196
|
end
|
213
197
|
|
198
|
+
# Adds a script phase that copies and strips dSYMs that are part of this target. Note this only deals with
|
199
|
+
# vendored dSYMs.
|
200
|
+
#
|
201
|
+
# @param [PBXNativeTarget] native_target
|
202
|
+
# the native target for which to add the the copy dSYM files build phase.
|
203
|
+
#
|
204
|
+
# @return [void]
|
205
|
+
#
|
206
|
+
def add_copy_dsyms_script_phase(native_target)
|
207
|
+
script_path = "${PODS_ROOT}/#{target.copy_dsyms_script_path.relative_path_from(target.sandbox.root)}"
|
208
|
+
dsym_paths = PodTargetInstaller.dsym_paths(target)
|
209
|
+
bcsymbolmap_paths = PodTargetInstaller.bcsymbolmap_paths(target)
|
210
|
+
|
211
|
+
if dsym_paths.empty? && bcsymbolmap_paths.empty?
|
212
|
+
script_phase = native_target.shell_script_build_phases.find do |bp|
|
213
|
+
bp.name && bp.name.end_with?(UserProjectIntegrator::TargetIntegrator::COPY_DSYM_FILES_PHASE_NAME)
|
214
|
+
end
|
215
|
+
native_target.build_phases.delete(script_phase) if script_phase.present?
|
216
|
+
return
|
217
|
+
end
|
218
|
+
|
219
|
+
phase_name = UserProjectIntegrator::TargetIntegrator::BUILD_PHASE_PREFIX + UserProjectIntegrator::TargetIntegrator::COPY_DSYM_FILES_PHASE_NAME
|
220
|
+
phase = UserProjectIntegrator::TargetIntegrator.create_or_update_shell_script_build_phase(native_target, phase_name)
|
221
|
+
phase.shell_script = %("#{script_path}"\n)
|
222
|
+
|
223
|
+
input_paths_by_config = {}
|
224
|
+
output_paths_by_config = {}
|
225
|
+
if use_input_output_paths?
|
226
|
+
input_file_list_path = target.copy_dsyms_script_input_files_path
|
227
|
+
input_file_list_relative_path = "${PODS_ROOT}/#{input_file_list_path.relative_path_from(target.sandbox.root)}"
|
228
|
+
input_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(input_file_list_path, input_file_list_relative_path)
|
229
|
+
input_paths = input_paths_by_config[input_paths_key] = []
|
230
|
+
input_paths.concat([dsym_paths, *bcsymbolmap_paths].flatten.compact)
|
231
|
+
|
232
|
+
output_file_list_path = target.copy_dsyms_script_output_files_path
|
233
|
+
output_file_list_relative_path = "${PODS_ROOT}/#{output_file_list_path.relative_path_from(target.sandbox.root)}"
|
234
|
+
output_paths_key = UserProjectIntegrator::TargetIntegrator::XCFileListConfigKey.new(output_file_list_path, output_file_list_relative_path)
|
235
|
+
output_paths = output_paths_by_config[output_paths_key] = []
|
236
|
+
|
237
|
+
dsym_output_paths = dsym_paths.map { |dsym_path| "${DWARF_DSYM_FOLDER_PATH}/#{File.basename(dsym_path)}" }
|
238
|
+
bcsymbolmap_output_paths = bcsymbolmap_paths.map { |bcsymbolmap_path| "${DWARF_DSYM_FOLDER_PATH}/#{File.basename(bcsymbolmap_path)}" }
|
239
|
+
output_paths.concat([dsym_output_paths, *bcsymbolmap_output_paths].flatten.compact)
|
240
|
+
end
|
241
|
+
|
242
|
+
UserProjectIntegrator::TargetIntegrator.set_input_output_paths(phase, input_paths_by_config, output_paths_by_config)
|
243
|
+
end
|
244
|
+
|
214
245
|
# @return [String] the message that should be displayed for the target
|
215
246
|
# integration.
|
216
247
|
#
|
@@ -30,7 +30,7 @@ module Pod
|
|
30
30
|
#
|
31
31
|
attr_reader :platforms
|
32
32
|
|
33
|
-
# @return [
|
33
|
+
# @return [Integer] Object version for the Xcode project.
|
34
34
|
#
|
35
35
|
attr_reader :object_version
|
36
36
|
|
@@ -50,7 +50,7 @@ module Pod
|
|
50
50
|
# @param [Array<PodTarget>] pod_targets @see #pod_targets
|
51
51
|
# @param [Hash{String=>Symbol}] build_configurations @see #build_configurations
|
52
52
|
# @param [Array<Platform>] platforms @see #platforms
|
53
|
-
# @param [
|
53
|
+
# @param [Integer] object_version @see #object_version
|
54
54
|
# @param [String] podfile_path @see #podfile_path
|
55
55
|
#
|
56
56
|
def initialize(sandbox, path, pod_targets, build_configurations, platforms,
|
@@ -110,6 +110,7 @@ module Pod
|
|
110
110
|
build_configuration.build_settings['TVOS_DEPLOYMENT_TARGET'] = tvos_deployment_target.to_s if tvos_deployment_target
|
111
111
|
build_configuration.build_settings['STRIP_INSTALLED_PRODUCT'] = 'NO'
|
112
112
|
build_configuration.build_settings['CLANG_ENABLE_OBJC_ARC'] = 'YES'
|
113
|
+
build_configuration.build_settings['CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED'] = 'YES'
|
113
114
|
end
|
114
115
|
end
|
115
116
|
end
|
@@ -38,7 +38,7 @@ module Pod
|
|
38
38
|
#
|
39
39
|
attr_reader :test_app_host_targets
|
40
40
|
|
41
|
-
# @return [
|
41
|
+
# @return [Hash{Specification => PBXNativeTarget}] app_native_targets
|
42
42
|
# The app native targets that were produced for this target. Can be empty if there were no app
|
43
43
|
# native targets created (e.g. no app specs present).
|
44
44
|
#
|
@@ -58,12 +58,12 @@ module Pod
|
|
58
58
|
# @param [Array<PBXNativeTarget>] test_native_targets @see #test_native_targets
|
59
59
|
# @param [Hash{String=>Array<PBXNativeTarget>}] test_resource_bundle_targets @see #test_resource_bundle_targets
|
60
60
|
# @param [Array<PBXNativeTarget>] test_app_host_targets @see #test_app_host_targets
|
61
|
-
# @param [
|
61
|
+
# @param [Hash{Specification => PBXNativeTarget}] app_native_targets @see #app_native_targets
|
62
62
|
# @param [Hash{String=>Array<PBXNativeTarget>}] app_resource_bundle_targets @see #app_resource_bundle_targets
|
63
63
|
#
|
64
64
|
def initialize(target, native_target, resource_bundle_targets = [], test_native_targets = [],
|
65
65
|
test_resource_bundle_targets = {}, test_app_host_targets = [],
|
66
|
-
app_native_targets =
|
66
|
+
app_native_targets = {}, app_resource_bundle_targets = {})
|
67
67
|
@target = target
|
68
68
|
@native_target = native_target
|
69
69
|
@resource_bundle_targets = resource_bundle_targets
|
@@ -115,7 +115,7 @@ module Pod
|
|
115
115
|
# @return [PBXNativeTarget] the app host target with the given target label.
|
116
116
|
#
|
117
117
|
def app_host_target_labelled(label)
|
118
|
-
app_native_targets.find do |app_native_target|
|
118
|
+
app_native_targets.values.find do |app_native_target|
|
119
119
|
app_native_target.name == label
|
120
120
|
end || test_app_host_targets.find do |app_native_target|
|
121
121
|
app_native_target.name == label
|
@@ -131,9 +131,7 @@ module Pod
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def app_native_target_from_spec(spec)
|
134
|
-
app_native_targets
|
135
|
-
app_native_target.name == target.app_target_label(spec)
|
136
|
-
end
|
134
|
+
app_native_targets[spec]
|
137
135
|
end
|
138
136
|
end
|
139
137
|
end
|
@@ -28,6 +28,25 @@ module Pod
|
|
28
28
|
@projects_by_pod_targets = projects_by_pod_targets
|
29
29
|
@target_installation_results = target_installation_results
|
30
30
|
end
|
31
|
+
|
32
|
+
# @param [Pod::Specification] spec
|
33
|
+
# A spec which was included in the generated project
|
34
|
+
#
|
35
|
+
# @return [Xcodeproj::PBXNativeTarget] the native target for the spec
|
36
|
+
#
|
37
|
+
def native_target_for_spec(spec)
|
38
|
+
installation_results_by_spec[spec.root].native_target_for_spec(spec)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def installation_results_by_spec
|
44
|
+
@target_installation_results_by_spec ||= begin
|
45
|
+
target_installation_results.pod_target_installation_results.values.each_with_object({}) do |installation_results, hash|
|
46
|
+
hash[installation_results.target.root_spec] = installation_results
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
31
50
|
end
|
32
51
|
end
|
33
52
|
end
|
@@ -115,7 +115,7 @@ module Pod
|
|
115
115
|
target_errors = swift_target_definitions.map(&error_message_for_target_definition).to_sentence
|
116
116
|
"- `#{swift_pod_target.name}` is integrated by multiple targets that use a different Swift version: #{target_errors}."
|
117
117
|
end
|
118
|
-
elsif swift_pod_target.swift_version.empty?
|
118
|
+
elsif !swift_pod_target.swift_version.nil? && swift_pod_target.swift_version.empty?
|
119
119
|
"- `#{swift_pod_target.name}` does not specify a Swift version (#{swift_pod_target.spec_swift_versions.map { |v| "`#{v}`" }.to_sentence}) " \
|
120
120
|
"that is satisfied by any of targets (#{swift_pod_target.target_definitions.map { |td| "`#{td.name}`" }.to_sentence}) integrating it."
|
121
121
|
end
|
@@ -2,7 +2,6 @@ require 'cocoapods-core/source'
|
|
2
2
|
require 'netrc'
|
3
3
|
require 'set'
|
4
4
|
require 'rest'
|
5
|
-
require 'typhoeus'
|
6
5
|
require 'yaml'
|
7
6
|
|
8
7
|
module Pod
|
@@ -72,6 +71,8 @@ module Pod
|
|
72
71
|
#
|
73
72
|
def cdn_url?(url)
|
74
73
|
if url =~ %r{^https?:\/\/}
|
74
|
+
require 'typhoeus'
|
75
|
+
|
75
76
|
response = Typhoeus.get(url + '/CocoaPods-version.yml', :netrc_file => Netrc.default_path, :netrc => :optional)
|
76
77
|
response.code == 200 && begin
|
77
78
|
response_hash = YAML.load(response.body) # rubocop:disable Security/YAMLLoad
|
data/lib/cocoapods/target.rb
CHANGED
@@ -43,6 +43,11 @@ module Pod
|
|
43
43
|
#
|
44
44
|
attr_reader :application_extension_api_only
|
45
45
|
|
46
|
+
# @return [Boolean] whether the target must be compiled with Swift's library
|
47
|
+
# evolution support, necessary for XCFrameworks.
|
48
|
+
#
|
49
|
+
attr_reader :build_library_for_distribution
|
50
|
+
|
46
51
|
# Initialize a new target
|
47
52
|
#
|
48
53
|
# @param [Sandbox] sandbox @see #sandbox
|
@@ -59,6 +64,7 @@ module Pod
|
|
59
64
|
@build_type = build_type
|
60
65
|
|
61
66
|
@application_extension_api_only = false
|
67
|
+
@build_library_for_distribution = false
|
62
68
|
@build_settings = create_build_settings
|
63
69
|
end
|
64
70
|
|
@@ -298,19 +304,55 @@ module Pod
|
|
298
304
|
support_files_dir + "#{label}-dummy.m"
|
299
305
|
end
|
300
306
|
|
301
|
-
#
|
302
|
-
#
|
307
|
+
# Mark the target as extension-only.
|
308
|
+
# Translates to APPLICATION_EXTENSION_API_ONLY = YES in the build settings.
|
303
309
|
#
|
304
310
|
def mark_application_extension_api_only
|
305
311
|
@application_extension_api_only = true
|
306
312
|
end
|
307
313
|
|
314
|
+
# Compiles the target with Swift's library evolution support, necessary to
|
315
|
+
# build XCFrameworks.
|
316
|
+
# Translates to BUILD_LIBRARY_FOR_DISTRIBUTION = YES in the build settings.
|
317
|
+
#
|
318
|
+
def mark_build_library_for_distribution
|
319
|
+
@build_library_for_distribution = true
|
320
|
+
end
|
321
|
+
|
308
322
|
# @return [Pathname] The absolute path of the prepare artifacts script.
|
309
323
|
#
|
324
|
+
# @deprecated
|
325
|
+
#
|
326
|
+
# @todo Remove in 2.0
|
327
|
+
#
|
310
328
|
def prepare_artifacts_script_path
|
311
329
|
support_files_dir + "#{label}-artifacts.sh"
|
312
330
|
end
|
313
331
|
|
332
|
+
# Returns an extension in the target that corresponds to the
|
333
|
+
# resource's input extension.
|
334
|
+
#
|
335
|
+
# @param [String] input_extension
|
336
|
+
# The input extension to map to.
|
337
|
+
#
|
338
|
+
# @return [String] The output extension.
|
339
|
+
#
|
340
|
+
def self.output_extension_for_resource(input_extension)
|
341
|
+
case input_extension
|
342
|
+
when '.storyboard' then '.storyboardc'
|
343
|
+
when '.xib' then '.nib'
|
344
|
+
when '.xcdatamodel' then '.mom'
|
345
|
+
when '.xcdatamodeld' then '.momd'
|
346
|
+
when '.xcmappingmodel' then '.cdm'
|
347
|
+
when '.xcassets' then '.car'
|
348
|
+
else input_extension
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def self.resource_extension_compilable?(input_extension)
|
353
|
+
output_extension_for_resource(input_extension) != input_extension
|
354
|
+
end
|
355
|
+
|
314
356
|
#-------------------------------------------------------------------------#
|
315
357
|
|
316
358
|
private
|
@@ -98,6 +98,7 @@ module Pod
|
|
98
98
|
target_definition, client_root, user_project, user_target_uuids, merged).tap do |aggregate_target|
|
99
99
|
aggregate_target.search_paths_aggregate_targets.concat(search_paths_aggregate_targets).freeze
|
100
100
|
aggregate_target.mark_application_extension_api_only if application_extension_api_only
|
101
|
+
aggregate_target.mark_build_library_for_distribution if build_library_for_distribution
|
101
102
|
end
|
102
103
|
end
|
103
104
|
|
@@ -284,6 +285,20 @@ module Pod
|
|
284
285
|
resources_by_config[config] = targets.flat_map do |pod_target|
|
285
286
|
library_specs = pod_target.library_specs.map(&:name)
|
286
287
|
resource_paths = pod_target.resource_paths.values_at(*library_specs).flatten
|
288
|
+
|
289
|
+
if pod_target.build_as_static_framework?
|
290
|
+
built_product_dir = Pathname.new(pod_target.build_product_path('${BUILT_PRODUCTS_DIR}'))
|
291
|
+
resource_paths = resource_paths.map do |resource_path|
|
292
|
+
extname = File.extname(resource_path)
|
293
|
+
if self.class.resource_extension_compilable?(extname)
|
294
|
+
output_extname = self.class.output_extension_for_resource(extname)
|
295
|
+
built_product_dir.join(File.basename(resource_path, extname)).sub_ext(output_extname).to_s
|
296
|
+
else
|
297
|
+
resource_path
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
287
302
|
resource_paths << bridge_support_file
|
288
303
|
resource_paths.compact.uniq
|
289
304
|
end
|
@@ -359,6 +374,10 @@ module Pod
|
|
359
374
|
#
|
360
375
|
# @return [Pathname] The absolute path of the prepare artifacts script input file list.
|
361
376
|
#
|
377
|
+
# @deprecated
|
378
|
+
#
|
379
|
+
# @todo Remove in 2.0
|
380
|
+
#
|
362
381
|
def prepare_artifacts_script_input_files_path(configuration)
|
363
382
|
support_files_dir + "#{label}-artifacts-#{configuration}-input-files.xcfilelist"
|
364
383
|
end
|
@@ -367,6 +386,10 @@ module Pod
|
|
367
386
|
#
|
368
387
|
# @return [Pathname] The absolute path of the prepare artifacts script output file list.
|
369
388
|
#
|
389
|
+
# @deprecated
|
390
|
+
#
|
391
|
+
# @todo Remove in 2.0
|
392
|
+
#
|
370
393
|
def prepare_artifacts_script_output_files_path(configuration)
|
371
394
|
support_files_dir + "#{label}-artifacts-#{configuration}-output-files.xcfilelist"
|
372
395
|
end
|
@@ -453,6 +476,10 @@ module Pod
|
|
453
476
|
# @return [String] The path of the prepare artifacts script relative to the
|
454
477
|
# root of the Pods project.
|
455
478
|
#
|
479
|
+
# @deprecated
|
480
|
+
#
|
481
|
+
# @todo Remove in 2.0
|
482
|
+
#
|
456
483
|
def prepare_artifacts_script_relative_path
|
457
484
|
"${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_path)}"
|
458
485
|
end
|
@@ -460,6 +487,10 @@ module Pod
|
|
460
487
|
# @return [String] The path of the prepare artifacts script input file list
|
461
488
|
# relative to the root of the Pods project.
|
462
489
|
#
|
490
|
+
# @deprecated
|
491
|
+
#
|
492
|
+
# @todo Remove in 2.0
|
493
|
+
#
|
463
494
|
def prepare_artifacts_script_input_files_relative_path
|
464
495
|
"${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_input_files_path('${CONFIGURATION}'))}"
|
465
496
|
end
|
@@ -467,6 +498,10 @@ module Pod
|
|
467
498
|
# @return [String] The path of the prepare artifacts script output file list
|
468
499
|
# relative to the root of the Pods project.
|
469
500
|
#
|
501
|
+
# @deprecated
|
502
|
+
#
|
503
|
+
# @todo Remove in 2.0
|
504
|
+
#
|
470
505
|
def prepare_artifacts_script_output_files_relative_path
|
471
506
|
"${PODS_ROOT}/#{relative_to_pods_root(prepare_artifacts_script_output_files_path('${CONFIGURATION}'))}"
|
472
507
|
end
|
@@ -43,7 +43,13 @@ module Pod
|
|
43
43
|
# @return [String]
|
44
44
|
# The variable for the configuration build directory used when building pod targets.
|
45
45
|
#
|
46
|
-
CONFIGURATION_BUILD_DIR_VARIABLE = '${PODS_CONFIGURATION_BUILD_DIR}'
|
46
|
+
CONFIGURATION_BUILD_DIR_VARIABLE = '${PODS_CONFIGURATION_BUILD_DIR}'
|
47
|
+
|
48
|
+
# @return [String]
|
49
|
+
# The variable for the configuration intermediate frameworks directory used for building pod targets
|
50
|
+
# that contain vendored xcframeworks.
|
51
|
+
#
|
52
|
+
XCFRAMEWORKS_BUILD_DIR_VARIABLE = '${PODS_XCFRAMEWORKS_BUILD_DIR}'
|
47
53
|
|
48
54
|
#-------------------------------------------------------------------------#
|
49
55
|
|
@@ -95,7 +101,7 @@ module Pod
|
|
95
101
|
from_search_paths_aggregate_targets: false, from_pod_targets_to_link: false,
|
96
102
|
&implementation)
|
97
103
|
|
98
|
-
memoized_key = "#{self}##{method_name}"
|
104
|
+
memoized_key = "#{self}##{method_name}"
|
99
105
|
|
100
106
|
(@build_settings_names ||= Set.new) << method_name.to_s.upcase if build_setting
|
101
107
|
|
@@ -134,6 +140,14 @@ module Pod
|
|
134
140
|
end
|
135
141
|
private_class_method :define_build_settings_method
|
136
142
|
|
143
|
+
# @param [XCFramework] xcframework the xcframework thats slice will be copied to the intermediates dir
|
144
|
+
#
|
145
|
+
# @return [String] the path to the directory containing the xcframework slice
|
146
|
+
#
|
147
|
+
def self.xcframework_intermediate_dir(xcframework)
|
148
|
+
"#{XCFRAMEWORKS_BUILD_DIR_VARIABLE}/#{xcframework.name}"
|
149
|
+
end
|
150
|
+
|
137
151
|
class << self
|
138
152
|
#-------------------------------------------------------------------------#
|
139
153
|
|
@@ -204,6 +218,10 @@ module Pod
|
|
204
218
|
'${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)'
|
205
219
|
end
|
206
220
|
|
221
|
+
define_build_settings_method :pods_xcframeworks_build_dir, :build_setting => true do
|
222
|
+
'$(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates'
|
223
|
+
end
|
224
|
+
|
207
225
|
# @return [String]
|
208
226
|
define_build_settings_method :use_recursive_script_inputs_in_script_phases, :build_setting => true do
|
209
227
|
'YES'
|
@@ -314,6 +332,13 @@ module Pod
|
|
314
332
|
false
|
315
333
|
end
|
316
334
|
|
335
|
+
# Xcode 12 turns on this warning by default which is problematic for CocoaPods-generated
|
336
|
+
# imports which use double-quoted paths.
|
337
|
+
# @return [Boolean]
|
338
|
+
define_build_settings_method :clang_warn_quoted_include_in_framework_header, :build_setting => true do
|
339
|
+
'NO'
|
340
|
+
end
|
341
|
+
|
317
342
|
# @return [Array<String>]
|
318
343
|
# the `LD_RUNPATH_SEARCH_PATHS` needed for dynamically linking the {#target}
|
319
344
|
#
|
@@ -475,6 +500,14 @@ module Pod
|
|
475
500
|
pod_targets - subset_targets
|
476
501
|
end
|
477
502
|
|
503
|
+
# @param [Pathname,String] path the path to the xcframework bundle
|
504
|
+
#
|
505
|
+
# @return [Xcode::XCFramework] the xcframework at the given path
|
506
|
+
#
|
507
|
+
def load_xcframework(path)
|
508
|
+
Xcode::XCFramework.new(path)
|
509
|
+
end
|
510
|
+
|
478
511
|
# A subclass that generates build settings for a {PodTarget}
|
479
512
|
class PodTargetSettings < BuildSettings
|
480
513
|
#-------------------------------------------------------------------------#
|
@@ -576,10 +609,13 @@ module Pod
|
|
576
609
|
frameworks.concat consumer_frameworks
|
577
610
|
if library_xcconfig?
|
578
611
|
# We know that this library target is being built dynamically based
|
579
|
-
# on the guard above, so include any vendored static frameworks.
|
612
|
+
# on the guard above, so include any vendored static frameworks and vendored xcframeworks.
|
580
613
|
if target.should_build?
|
581
614
|
frameworks.concat vendored_static_frameworks.map { |l| File.basename(l, '.framework') }
|
582
|
-
frameworks.concat vendored_xcframeworks.
|
615
|
+
frameworks.concat vendored_xcframeworks.
|
616
|
+
select { |xcf| xcf.build_type.static_framework? }.
|
617
|
+
map(&:name).
|
618
|
+
uniq
|
583
619
|
end
|
584
620
|
# Also include any vendored dynamic frameworks of dependencies.
|
585
621
|
frameworks.concat dependent_targets.reject(&:should_build?).flat_map { |pt| pt.build_settings[@configuration].dynamic_frameworks_to_import }
|
@@ -596,7 +632,7 @@ module Pod
|
|
596
632
|
static_frameworks_to_import.concat vendored_static_frameworks.map { |f| File.basename(f, '.framework') } unless target.should_build? && target.build_as_dynamic?
|
597
633
|
unless target.should_build? && target.build_as_dynamic?
|
598
634
|
static_frameworks_to_import.concat vendored_xcframeworks.
|
599
|
-
select
|
635
|
+
select { |xcf| xcf.build_type.static_framework? }.
|
600
636
|
map(&:name).
|
601
637
|
uniq
|
602
638
|
end
|
@@ -608,7 +644,7 @@ module Pod
|
|
608
644
|
define_build_settings_method :dynamic_frameworks_to_import, :memoized => true do
|
609
645
|
dynamic_frameworks_to_import = vendored_dynamic_frameworks.map { |f| File.basename(f, '.framework') }
|
610
646
|
dynamic_frameworks_to_import.concat vendored_xcframeworks.
|
611
|
-
select
|
647
|
+
select { |xcf| xcf.build_type.dynamic_framework? }.
|
612
648
|
map(&:name).
|
613
649
|
uniq
|
614
650
|
dynamic_frameworks_to_import << target.product_basename if target.should_build? && target.build_as_dynamic_framework?
|
@@ -656,12 +692,11 @@ module Pod
|
|
656
692
|
search_paths.concat file_accessors.
|
657
693
|
flat_map(&:vendored_frameworks).
|
658
694
|
map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
flat_map { |slice| File.join '${PODS_ROOT}', slice.path.dirname.relative_path_from(target.sandbox.root) }
|
695
|
+
xcframework_intermediates = vendored_xcframeworks.
|
696
|
+
select { |xcf| xcf.build_type.framework? }.
|
697
|
+
map { |xcf| BuildSettings.xcframework_intermediate_dir(xcf) }.
|
698
|
+
uniq
|
699
|
+
search_paths.concat xcframework_intermediates
|
665
700
|
search_paths
|
666
701
|
end
|
667
702
|
|
@@ -686,7 +721,7 @@ module Pod
|
|
686
721
|
|
687
722
|
# @return [Array<Xcode::XCFramework>]
|
688
723
|
define_build_settings_method :vendored_xcframeworks, :memoized => true do
|
689
|
-
file_accessors.flat_map(&:vendored_xcframeworks).map { |path|
|
724
|
+
file_accessors.flat_map(&:vendored_xcframeworks).map { |path| load_xcframework(path) }
|
690
725
|
end
|
691
726
|
|
692
727
|
# @return [Array<String>]
|
@@ -707,7 +742,7 @@ module Pod
|
|
707
742
|
# @return [Array<String>]
|
708
743
|
#
|
709
744
|
def linker_names_from_libraries(libraries)
|
710
|
-
libraries.map { |l| File.basename(l,
|
745
|
+
libraries.map { |l| File.basename(l, File.extname(l)).sub(/\Alib/, '') }
|
711
746
|
end
|
712
747
|
|
713
748
|
# @return [Array<String>]
|
@@ -718,6 +753,11 @@ module Pod
|
|
718
753
|
if non_library_xcconfig? || target.build_as_dynamic?
|
719
754
|
libraries.concat linker_names_from_libraries(vendored_static_libraries)
|
720
755
|
libraries.concat libraries_to_import
|
756
|
+
xcframework_libraries = vendored_xcframeworks.
|
757
|
+
select { |xcf| xcf.build_type.static_library? }.
|
758
|
+
flat_map { |xcf| linker_names_from_libraries([xcf.slices.first.binary_path]) }.
|
759
|
+
uniq
|
760
|
+
libraries.concat xcframework_libraries
|
721
761
|
end
|
722
762
|
if non_library_xcconfig?
|
723
763
|
libraries.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].dynamic_libraries_to_import }
|
@@ -729,7 +769,14 @@ module Pod
|
|
729
769
|
# @return [Array<String>]
|
730
770
|
define_build_settings_method :static_libraries_to_import, :memoized => true do
|
731
771
|
static_libraries_to_import = []
|
732
|
-
|
772
|
+
unless target.should_build? && target.build_as_dynamic?
|
773
|
+
static_libraries_to_import.concat linker_names_from_libraries(vendored_static_libraries)
|
774
|
+
xcframework_libraries = vendored_xcframeworks.
|
775
|
+
select { |xcf| xcf.build_type.static_library? }.
|
776
|
+
flat_map { |xcf| linker_names_from_libraries([xcf.slices.first.binary_path]) }.
|
777
|
+
uniq
|
778
|
+
static_libraries_to_import.concat linker_names_from_libraries(xcframework_libraries)
|
779
|
+
end
|
733
780
|
static_libraries_to_import << target.product_basename if target.should_build? && target.build_as_static_library?
|
734
781
|
static_libraries_to_import
|
735
782
|
end
|
@@ -775,12 +822,20 @@ module Pod
|
|
775
822
|
|
776
823
|
# @return [Array<String>]
|
777
824
|
define_build_settings_method :vendored_static_library_search_paths, :memoized => true do
|
778
|
-
vendored_static_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
|
825
|
+
paths = vendored_static_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
|
826
|
+
paths.concat vendored_xcframeworks.
|
827
|
+
select { |xcf| xcf.build_type.static_library? }.
|
828
|
+
map { |xcf| BuildSettings.xcframework_intermediate_dir(xcf) }
|
829
|
+
paths
|
779
830
|
end
|
780
831
|
|
781
832
|
# @return [Array<String>]
|
782
833
|
define_build_settings_method :vendored_dynamic_library_search_paths, :memoized => true do
|
783
|
-
vendored_dynamic_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
|
834
|
+
paths = vendored_dynamic_libraries.map { |f| File.join '${PODS_ROOT}', f.dirname.relative_path_from(target.sandbox.root) }
|
835
|
+
paths.concat vendored_xcframeworks.
|
836
|
+
select { |xcf| xcf.build_type.dynamic_library? }.
|
837
|
+
map { |xcf| BuildSettings.xcframework_intermediate_dir(xcf) }
|
838
|
+
paths
|
784
839
|
end
|
785
840
|
|
786
841
|
# @return [Array<String>]
|
@@ -816,7 +871,16 @@ module Pod
|
|
816
871
|
|
817
872
|
# @return [Array<String>]
|
818
873
|
define_build_settings_method :header_search_paths, :build_setting => true, :memoized => true, :sorted => true do
|
819
|
-
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)
|
874
|
+
paths = 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)
|
875
|
+
|
876
|
+
dependent_vendored_xcframeworks = []
|
877
|
+
dependent_vendored_xcframeworks.concat vendored_xcframeworks
|
878
|
+
dependent_vendored_xcframeworks.concat dependent_targets.flat_map { |pt| pt.build_settings[@configuration].vendored_xcframeworks }
|
879
|
+
paths.concat dependent_vendored_xcframeworks.
|
880
|
+
select { |xcf| xcf.build_type.static_library? }.
|
881
|
+
map { |xcf| "#{BuildSettings.xcframework_intermediate_dir(xcf)}/Headers" }.
|
882
|
+
compact
|
883
|
+
paths
|
820
884
|
end
|
821
885
|
|
822
886
|
# @return [Array<String>]
|
@@ -912,6 +976,11 @@ module Pod
|
|
912
976
|
target.application_extension_api_only ? 'YES' : nil
|
913
977
|
end
|
914
978
|
|
979
|
+
# @return [String]
|
980
|
+
define_build_settings_method :build_library_for_distribution, :build_setting => true, :memoized => true do
|
981
|
+
target.build_library_for_distribution ? 'YES' : nil
|
982
|
+
end
|
983
|
+
|
915
984
|
#-------------------------------------------------------------------------#
|
916
985
|
|
917
986
|
# @!group Target Properties
|
@@ -1098,6 +1167,13 @@ module Pod
|
|
1098
1167
|
select { |pt| pt.build_as_framework? && pt.should_build? }.
|
1099
1168
|
map { |pt| pt.build_settings[@configuration].framework_header_search_path }
|
1100
1169
|
|
1170
|
+
xcframework_library_headers = pod_targets.flat_map { |pt| pt.build_settings[@configuration].vendored_xcframeworks }.
|
1171
|
+
select { |xcf| xcf.build_type.static_library? }.
|
1172
|
+
map { |xcf| "#{BuildSettings.xcframework_intermediate_dir(xcf)}/Headers" }.
|
1173
|
+
compact
|
1174
|
+
|
1175
|
+
paths.concat xcframework_library_headers
|
1176
|
+
|
1101
1177
|
paths.concat target.search_paths_aggregate_targets.flat_map { |at| at.build_settings(configuration_name).header_search_paths }
|
1102
1178
|
|
1103
1179
|
paths
|