cocoapods 1.9.2 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|