cocoapods 1.10.0.rc.1 → 1.11.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 +237 -4
- data/README.md +11 -11
- data/lib/cocoapods/command/outdated.rb +12 -1
- data/lib/cocoapods/command/repo/push.rb +17 -0
- data/lib/cocoapods/command/spec.rb +18 -9
- data/lib/cocoapods/command/spec/cat.rb +3 -1
- data/lib/cocoapods/command/spec/lint.rb +1 -1
- data/lib/cocoapods/command/spec/which.rb +3 -1
- data/lib/cocoapods/config.rb +1 -1
- data/lib/cocoapods/downloader.rb +4 -2
- data/lib/cocoapods/downloader/cache.rb +95 -6
- data/lib/cocoapods/external_sources/podspec_source.rb +1 -1
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements.rb +1 -1
- data/lib/cocoapods/generator/app_target_helper.rb +7 -3
- data/lib/cocoapods/generator/copy_dsyms_script.rb +4 -4
- data/lib/cocoapods/generator/copy_xcframework_script.rb +4 -29
- data/lib/cocoapods/generator/embed_frameworks_script.rb +2 -1
- data/lib/cocoapods/generator/script_phase_constants.rb +1 -0
- data/lib/cocoapods/installer.rb +52 -4
- data/lib/cocoapods/installer/analyzer.rb +12 -8
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +31 -4
- data/lib/cocoapods/installer/podfile_validator.rb +2 -2
- data/lib/cocoapods/installer/pre_integrate_hooks_context.rb +9 -0
- data/lib/cocoapods/installer/project_cache/project_cache_analyzer.rb +9 -2
- data/lib/cocoapods/installer/project_cache/project_installation_cache.rb +15 -2
- data/lib/cocoapods/installer/project_cache/target_cache_key.rb +3 -3
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +106 -5
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +1 -1
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +15 -4
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +25 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb +6 -19
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +75 -59
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +48 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +2 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +2 -5
- data/lib/cocoapods/resolver.rb +4 -4
- data/lib/cocoapods/sandbox/file_accessor.rb +51 -10
- data/lib/cocoapods/sandbox/headers_store.rb +3 -1
- data/lib/cocoapods/sandbox/path_list.rb +1 -1
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +1 -1
- data/lib/cocoapods/sources_manager.rb +14 -8
- data/lib/cocoapods/target.rb +1 -1
- data/lib/cocoapods/target/aggregate_target.rb +23 -1
- data/lib/cocoapods/target/build_settings.rb +56 -22
- data/lib/cocoapods/target/pod_target.rb +47 -22
- data/lib/cocoapods/user_interface.rb +4 -0
- data/lib/cocoapods/validator.rb +25 -5
- data/lib/cocoapods/version_metadata.rb +1 -1
- data/lib/cocoapods/xcode/xcframework.rb +8 -3
- data/lib/cocoapods/xcode/xcframework/xcframework_slice.rb +10 -1
- metadata +28 -21
@@ -6,6 +6,9 @@ module Pod
|
|
6
6
|
# specifications in the Pods project.
|
7
7
|
#
|
8
8
|
class FileReferencesInstaller
|
9
|
+
# Regex for extracting the region portion of a localized file path. Ex. `Resources/en.lproj` --> `en`
|
10
|
+
LOCALIZATION_REGION_FILEPATTERN_REGEX = /(\/|^)(?<region>[^\/]*?)\.lproj(\/|$)/
|
11
|
+
|
9
12
|
# @return [Sandbox] The sandbox of the installation.
|
10
13
|
#
|
11
14
|
attr_reader :sandbox
|
@@ -126,8 +129,9 @@ module Pod
|
|
126
129
|
#
|
127
130
|
def add_resources
|
128
131
|
UI.message '- Adding resources' do
|
129
|
-
add_file_accessors_paths_to_pods_group(:resources, :resources, true)
|
130
|
-
add_file_accessors_paths_to_pods_group(:resource_bundle_files, :resources, true)
|
132
|
+
refs = add_file_accessors_paths_to_pods_group(:resources, :resources, true)
|
133
|
+
refs.concat add_file_accessors_paths_to_pods_group(:resource_bundle_files, :resources, true)
|
134
|
+
add_known_regions(refs)
|
131
135
|
end
|
132
136
|
end
|
133
137
|
|
@@ -207,20 +211,20 @@ module Pod
|
|
207
211
|
# Whether organizing a local pod's files in subgroups inside
|
208
212
|
# the pod's group is allowed.
|
209
213
|
#
|
210
|
-
# @return [
|
214
|
+
# @return [Array<PBXFileReference>] the added file references
|
211
215
|
#
|
212
216
|
def add_file_accessors_paths_to_pods_group(file_accessor_key, group_key = nil, reflect_file_system_structure = false)
|
213
|
-
file_accessors.
|
217
|
+
file_accessors.flat_map do |file_accessor|
|
214
218
|
paths = file_accessor.send(file_accessor_key)
|
215
219
|
paths = allowable_project_paths(paths)
|
216
|
-
next if paths.empty?
|
220
|
+
next [] if paths.empty?
|
217
221
|
|
218
222
|
pod_name = file_accessor.spec.name
|
219
223
|
preserve_pod_file_structure_flag = (sandbox.local?(pod_name) || preserve_pod_file_structure) && reflect_file_system_structure
|
220
224
|
base_path = preserve_pod_file_structure_flag ? common_path(paths) : nil
|
221
225
|
actual_group_key = preserve_pod_file_structure_flag ? nil : group_key
|
222
226
|
group = pods_project.group_for_spec(pod_name, actual_group_key)
|
223
|
-
paths.
|
227
|
+
paths.map do |path|
|
224
228
|
pods_project.add_file_reference(path, group, preserve_pod_file_structure_flag, base_path)
|
225
229
|
end
|
226
230
|
end
|
@@ -302,6 +306,21 @@ module Pod
|
|
302
306
|
return result unless result.to_s == '' || result.to_s == '/'
|
303
307
|
end
|
304
308
|
|
309
|
+
# Adds the known localization regions to the root of the project
|
310
|
+
#
|
311
|
+
# @param [Array<PBXFileReferences>] file_references the resource file references
|
312
|
+
#
|
313
|
+
def add_known_regions(file_references)
|
314
|
+
pattern = LOCALIZATION_REGION_FILEPATTERN_REGEX
|
315
|
+
regions = file_references.map do |ref|
|
316
|
+
if (match = ref.path.to_s.match(pattern))
|
317
|
+
match[:region]
|
318
|
+
end
|
319
|
+
end.compact
|
320
|
+
|
321
|
+
pods_project.root_object.known_regions = (pods_project.root_object.known_regions | regions).sort
|
322
|
+
end
|
323
|
+
|
305
324
|
#-----------------------------------------------------------------------#
|
306
325
|
end
|
307
326
|
end
|
data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb
CHANGED
@@ -36,25 +36,24 @@ module Pod
|
|
36
36
|
pod_target = pod_target_installation_result.target
|
37
37
|
native_target = pod_target_installation_result.native_target
|
38
38
|
project = native_target.project
|
39
|
-
frameworks_group = project.frameworks_group
|
40
39
|
|
41
40
|
# First, wire up all resource bundles.
|
42
41
|
wire_resource_bundle_targets(pod_target_installation_result.resource_bundle_targets,
|
43
42
|
native_target, pod_target)
|
44
43
|
# Wire up all dependencies to this pod target, if any.
|
45
44
|
wire_target_dependencies(pod_target, native_target, project, pod_target_installation_results,
|
46
|
-
metadata_cache
|
45
|
+
metadata_cache)
|
47
46
|
|
48
47
|
# Wire up test native targets.
|
49
48
|
unless pod_target_installation_result.test_native_targets.empty?
|
50
49
|
wire_test_native_targets(pod_target, pod_target_installation_result, pod_target_installation_results,
|
51
|
-
project,
|
50
|
+
project, metadata_cache)
|
52
51
|
end
|
53
52
|
|
54
53
|
# Wire up app native targets.
|
55
54
|
unless pod_target_installation_result.app_native_targets.empty?
|
56
55
|
wire_app_native_targets(pod_target, pod_target_installation_result, pod_target_installation_results,
|
57
|
-
project,
|
56
|
+
project, metadata_cache)
|
58
57
|
end
|
59
58
|
end
|
60
59
|
end
|
@@ -70,8 +69,7 @@ module Pod
|
|
70
69
|
end
|
71
70
|
end
|
72
71
|
|
73
|
-
def wire_target_dependencies(pod_target, native_target, project,
|
74
|
-
pod_target_installation_results, metadata_cache, frameworks_group)
|
72
|
+
def wire_target_dependencies(pod_target, native_target, project, pod_target_installation_results, metadata_cache)
|
75
73
|
dependent_targets = pod_target.dependent_targets
|
76
74
|
dependent_targets.each do |dependent_target|
|
77
75
|
is_local = sandbox.local?(dependent_target.pod_name)
|
@@ -81,7 +79,6 @@ module Pod
|
|
81
79
|
project.add_pod_subproject(dependent_project, is_local)
|
82
80
|
end
|
83
81
|
native_target.add_dependency(installation_result.native_target)
|
84
|
-
add_framework_file_reference_to_native_target(native_target, pod_target, dependent_target, frameworks_group)
|
85
82
|
else
|
86
83
|
# Hit the cache
|
87
84
|
cached_dependency = metadata_cache.target_label_by_metadata[dependent_target.label]
|
@@ -91,7 +88,7 @@ module Pod
|
|
91
88
|
end
|
92
89
|
end
|
93
90
|
|
94
|
-
def wire_test_native_targets(pod_target, installation_result, pod_target_installation_results, project,
|
91
|
+
def wire_test_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache)
|
95
92
|
installation_result.test_specs_by_native_target.each do |test_native_target, test_spec|
|
96
93
|
resource_bundle_native_targets = installation_result.test_resource_bundle_targets[test_spec.name] || []
|
97
94
|
resource_bundle_native_targets.each do |test_resource_bundle_target|
|
@@ -107,7 +104,6 @@ module Pod
|
|
107
104
|
project.add_pod_subproject(dependent_test_project, is_local)
|
108
105
|
end
|
109
106
|
test_native_target.add_dependency(dependency_installation_result.native_target)
|
110
|
-
add_framework_file_reference_to_native_target(test_native_target, pod_target, test_dependent_target, frameworks_group)
|
111
107
|
else
|
112
108
|
# Hit the cache
|
113
109
|
cached_dependency = metadata_cache.target_label_by_metadata[test_dependent_target.label]
|
@@ -162,7 +158,7 @@ module Pod
|
|
162
158
|
end
|
163
159
|
end
|
164
160
|
|
165
|
-
def wire_app_native_targets(pod_target, installation_result, pod_target_installation_results, project,
|
161
|
+
def wire_app_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache)
|
166
162
|
installation_result.app_specs_by_native_target.each do |app_native_target, app_spec|
|
167
163
|
resource_bundle_native_targets = installation_result.app_resource_bundle_targets[app_spec.name] || []
|
168
164
|
resource_bundle_native_targets.each do |app_resource_bundle_target|
|
@@ -184,7 +180,6 @@ module Pod
|
|
184
180
|
project.add_pod_subproject(dependency_project, is_local)
|
185
181
|
end
|
186
182
|
app_native_target.add_dependency(dependency_installation_result.native_target)
|
187
|
-
add_framework_file_reference_to_native_target(app_native_target, pod_target, app_dependent_target, frameworks_group)
|
188
183
|
else
|
189
184
|
# Hit the cache
|
190
185
|
cached_dependency = metadata_cache.target_label_by_metadata[app_dependent_target.label]
|
@@ -194,14 +189,6 @@ module Pod
|
|
194
189
|
end
|
195
190
|
end
|
196
191
|
end
|
197
|
-
|
198
|
-
def add_framework_file_reference_to_native_target(native_target, pod_target, dependent_target, frameworks_group)
|
199
|
-
if pod_target.should_build? && pod_target.build_as_dynamic? && dependent_target.should_build?
|
200
|
-
product_ref = frameworks_group.files.find { |f| f.path == dependent_target.product_name } ||
|
201
|
-
frameworks_group.new_product_ref_for_target(dependent_target.product_basename, dependent_target.product_type)
|
202
|
-
native_target.frameworks_build_phase.add_file_reference(product_ref, true)
|
203
|
-
end
|
204
|
-
end
|
205
192
|
end
|
206
193
|
end
|
207
194
|
end
|
@@ -43,18 +43,14 @@ module Pod
|
|
43
43
|
test_file_accessors = target.file_accessors.select { |fa| fa.spec.test_specification? }
|
44
44
|
app_file_accessors = target.file_accessors.select { |fa| fa.spec.app_specification? }
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
create_xcconfig_file(native_target, resource_bundle_targets)
|
54
|
-
return TargetInstallationResult.new(target, native_target, resource_bundle_targets)
|
55
|
-
end
|
46
|
+
native_target = if target.should_build?
|
47
|
+
add_target
|
48
|
+
else
|
49
|
+
# For targets that should not be built (e.g. pre-built vendored frameworks etc), we add a placeholder
|
50
|
+
# PBXAggregateTarget that will be used to wire up dependencies later.
|
51
|
+
add_placeholder_target
|
52
|
+
end
|
56
53
|
|
57
|
-
native_target = add_target
|
58
54
|
resource_bundle_targets = add_resources_bundle_targets(library_file_accessors).values.flatten
|
59
55
|
|
60
56
|
test_native_targets = add_test_targets
|
@@ -65,8 +61,10 @@ module Pod
|
|
65
61
|
app_resource_bundle_targets = add_resources_bundle_targets(app_file_accessors)
|
66
62
|
|
67
63
|
add_files_to_build_phases(native_target, test_native_targets, app_native_targets)
|
68
|
-
|
69
|
-
|
64
|
+
targets_to_validate = test_native_targets + app_native_targets.values
|
65
|
+
targets_to_validate << native_target if target.should_build?
|
66
|
+
validate_targets_contain_sources(targets_to_validate)
|
67
|
+
validate_xcframeworks if target.should_build?
|
70
68
|
|
71
69
|
create_copy_xcframeworks_script unless target.xcframeworks.values.all?(&:empty?)
|
72
70
|
|
@@ -74,7 +72,7 @@ module Pod
|
|
74
72
|
create_test_xcconfig_files(test_native_targets, test_resource_bundle_targets)
|
75
73
|
create_app_xcconfig_files(app_native_targets, app_resource_bundle_targets)
|
76
74
|
|
77
|
-
if target.defines_module?
|
75
|
+
if target.should_build? && target.defines_module? && !skip_modulemap?(target.library_specs)
|
78
76
|
create_module_map(native_target) do |generator|
|
79
77
|
generator.headers.concat module_map_additional_headers
|
80
78
|
end
|
@@ -99,20 +97,21 @@ module Pod
|
|
99
97
|
end
|
100
98
|
end
|
101
99
|
|
102
|
-
if target.build_as_framework?
|
100
|
+
if target.should_build? && target.build_as_framework?
|
103
101
|
unless skip_info_plist?(native_target)
|
104
|
-
create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform,
|
102
|
+
create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform,
|
103
|
+
:additional_entries => target.info_plist_entries)
|
105
104
|
end
|
106
105
|
create_build_phase_to_symlink_header_folders(native_target)
|
107
106
|
end
|
108
107
|
|
109
|
-
if target.build_as_library? && target.uses_swift?
|
108
|
+
if target.should_build? && target.build_as_library? && target.uses_swift?
|
110
109
|
add_swift_library_compatibility_header_phase(native_target)
|
111
110
|
end
|
112
111
|
|
113
112
|
project_directory = project.path.dirname
|
114
113
|
|
115
|
-
|
114
|
+
if target.should_build? && !skip_pch?(target.library_specs)
|
116
115
|
path = target.prefix_header_path
|
117
116
|
create_prefix_header(path, library_file_accessors, target.platform, native_target, project_directory)
|
118
117
|
add_file_to_support_group(path)
|
@@ -135,7 +134,7 @@ module Pod
|
|
135
134
|
add_file_to_support_group(path)
|
136
135
|
end
|
137
136
|
end
|
138
|
-
create_dummy_source(native_target)
|
137
|
+
create_dummy_source(native_target) if target.should_build?
|
139
138
|
create_copy_dsyms_script
|
140
139
|
clean_support_files_temp_dir
|
141
140
|
TargetInstallationResult.new(target, native_target, resource_bundle_targets,
|
@@ -191,6 +190,10 @@ module Pod
|
|
191
190
|
specs.any? { |spec| spec.root.prefix_header_file.is_a?(FalseClass) }
|
192
191
|
end
|
193
192
|
|
193
|
+
def skip_modulemap?(specs)
|
194
|
+
specs.any? { |spec| spec.module_map.is_a?(FalseClass) }
|
195
|
+
end
|
196
|
+
|
194
197
|
# True if info.plist generation should be skipped
|
195
198
|
#
|
196
199
|
# @param [PXNativeTarget] native_target
|
@@ -264,10 +267,10 @@ module Pod
|
|
264
267
|
# @yield_param [Array<PBXFileReference>} The filtered resource file references to be installed
|
265
268
|
# in the compile sources phase.
|
266
269
|
#
|
267
|
-
# @note Core Data model directories (.xcdatamodeld)
|
268
|
-
# `Copy Resources` build phase like all other resources,
|
269
|
-
# compile correctly in either the resources or compile phase. In
|
270
|
-
# versions of xcode, there's an exception for data models that generate
|
270
|
+
# @note Core Data model directories (.xcdatamodeld) and RealityKit projects (.rcproject)
|
271
|
+
# used to be added to the `Copy Resources` build phase like all other resources,
|
272
|
+
# since they would compile correctly in either the resources or compile phase. In
|
273
|
+
# recent versions of xcode, there's an exception for data models that generate
|
271
274
|
# headers. These need to be added to the compile sources phase of a real
|
272
275
|
# target for the headers to be built in time for code in the target to
|
273
276
|
# use them. These kinds of models generally break when added to resource
|
@@ -287,7 +290,7 @@ module Pod
|
|
287
290
|
|
288
291
|
ref
|
289
292
|
end.compact.uniq
|
290
|
-
compile_phase_matcher = lambda { |ref| !(ref.path =~ /.*\.xcdatamodeld/i).nil? }
|
293
|
+
compile_phase_matcher = lambda { |ref| !(ref.path =~ /.*\.(xcdatamodeld|rcproject)/i).nil? }
|
291
294
|
compile_phase_refs, resources_phase_refs = file_references.partition(&compile_phase_matcher)
|
292
295
|
yield compile_phase_refs, resources_phase_refs
|
293
296
|
end
|
@@ -307,21 +310,26 @@ module Pod
|
|
307
310
|
#
|
308
311
|
# @return [void]
|
309
312
|
#
|
310
|
-
def add_files_to_build_phases(
|
313
|
+
def add_files_to_build_phases(library_native_target, test_native_targets, app_native_targets)
|
311
314
|
target.file_accessors.each do |file_accessor|
|
312
315
|
consumer = file_accessor.spec_consumer
|
313
316
|
|
314
317
|
native_target = case consumer.spec.spec_type
|
315
318
|
when :library
|
316
|
-
|
319
|
+
library_native_target
|
317
320
|
when :test
|
318
321
|
test_native_target_from_spec(consumer.spec, test_native_targets)
|
319
322
|
when :app
|
320
323
|
app_native_targets[consumer.spec]
|
324
|
+
else
|
325
|
+
raise ArgumentError, "Unknown spec type #{consumer.spec.spec_type}."
|
321
326
|
end
|
322
327
|
|
328
|
+
next if native_target.is_a?(Xcodeproj::Project::Object::PBXAggregateTarget)
|
329
|
+
|
323
330
|
headers = file_accessor.headers
|
324
331
|
public_headers = file_accessor.public_headers.map(&:realpath)
|
332
|
+
project_headers = file_accessor.project_headers.map(&:realpath)
|
325
333
|
private_headers = file_accessor.private_headers.map(&:realpath)
|
326
334
|
other_source_files = file_accessor.other_source_files
|
327
335
|
|
@@ -344,7 +352,7 @@ module Pod
|
|
344
352
|
|
345
353
|
header_file_refs = project_file_references_array(headers, 'header')
|
346
354
|
native_target.add_file_references(header_file_refs) do |build_file|
|
347
|
-
add_header(file_accessor, build_file, public_headers, private_headers, native_target)
|
355
|
+
add_header(file_accessor, build_file, public_headers, project_headers, private_headers, native_target)
|
348
356
|
end
|
349
357
|
|
350
358
|
other_file_refs = project_file_references_array(other_source_files, 'other source')
|
@@ -356,7 +364,10 @@ module Pod
|
|
356
364
|
native_target.add_file_references(compile_phase_refs, nil)
|
357
365
|
|
358
366
|
if target.build_as_static_framework? && consumer.spec.library_specification?
|
359
|
-
resource_phase_refs = resource_phase_refs.select
|
367
|
+
resource_phase_refs = resource_phase_refs.select do |ref|
|
368
|
+
filename = ref.name || ref.path
|
369
|
+
Target.resource_extension_compilable?(File.extname(filename))
|
370
|
+
end
|
360
371
|
end
|
361
372
|
|
362
373
|
native_target.add_resources(resource_phase_refs)
|
@@ -377,9 +388,11 @@ module Pod
|
|
377
388
|
name = target.test_target_label(test_spec)
|
378
389
|
platform_name = target.platform.name
|
379
390
|
language = target.uses_swift_for_spec?(test_spec) ? :swift : :objc
|
391
|
+
product_basename = target.product_basename_for_spec(test_spec)
|
392
|
+
embedded_content_contains_swift = target.dependent_targets_for_test_spec(test_spec).any?(&:uses_swift?)
|
380
393
|
test_native_target = project.new_target(product_type, name, platform_name,
|
381
394
|
target.deployment_target_for_non_library_spec(test_spec), nil,
|
382
|
-
language)
|
395
|
+
language, product_basename)
|
383
396
|
test_native_target.product_reference.name = name
|
384
397
|
|
385
398
|
target.user_build_configurations.each do |bc_name, type|
|
@@ -408,7 +421,14 @@ module Pod
|
|
408
421
|
configuration.build_settings['CODE_SIGNING_ALLOWED'] = 'YES'
|
409
422
|
end
|
410
423
|
# For macOS we do not code sign the XCTest bundle because we do not code sign the frameworks either.
|
411
|
-
|
424
|
+
if target.platform == :osx
|
425
|
+
configuration.build_settings['CODE_SIGN_IDENTITY'] = ''
|
426
|
+
elsif target.platform == :ios
|
427
|
+
configuration.build_settings['CODE_SIGN_IDENTITY'] = 'iPhone Developer'
|
428
|
+
end
|
429
|
+
# Ensure swift stdlib gets copied in if needed, even when the target contains no swift files,
|
430
|
+
# because a dependency uses swift
|
431
|
+
configuration.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES' if embedded_content_contains_swift
|
412
432
|
end
|
413
433
|
|
414
434
|
remove_pod_target_xcconfig_overrides_from_target(target.test_spec_build_settings_by_config[test_spec.name], test_native_target)
|
@@ -459,10 +479,12 @@ module Pod
|
|
459
479
|
info_plist_entries = spec_consumer.info_plist
|
460
480
|
resources = target.file_accessors.find { |fa| fa.spec == app_spec }.resources
|
461
481
|
add_launchscreen_storyboard = resources.none? { |resource| resource.basename.to_s == 'LaunchScreen.storyboard' } && platform.name == :ios
|
482
|
+
embedded_content_contains_swift = target.dependent_targets_for_app_spec(app_spec).any?(&:uses_swift?)
|
462
483
|
app_native_target = AppHostInstaller.new(sandbox, project, platform, subspec_name, spec_name,
|
463
484
|
app_target_label, :add_main => false,
|
464
485
|
:add_launchscreen_storyboard => add_launchscreen_storyboard,
|
465
|
-
:info_plist_entries => info_plist_entries
|
486
|
+
:info_plist_entries => info_plist_entries,
|
487
|
+
:product_basename => target.product_basename_for_spec(app_spec)).install!
|
466
488
|
|
467
489
|
app_native_target.product_reference.name = app_target_label
|
468
490
|
target.user_build_configurations.each do |bc_name, type|
|
@@ -501,6 +523,9 @@ module Pod
|
|
501
523
|
configuration.build_settings.delete('CODE_SIGN_IDENTITY[sdk=iphoneos*]')
|
502
524
|
configuration.build_settings.delete('CODE_SIGN_IDENTITY[sdk=watchos*]')
|
503
525
|
end
|
526
|
+
# Ensure swift stdlib gets copied in if needed, even when the target contains no swift files,
|
527
|
+
# because a dependency uses swift
|
528
|
+
configuration.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES' if embedded_content_contains_swift
|
504
529
|
end
|
505
530
|
|
506
531
|
remove_pod_target_xcconfig_overrides_from_target(target.app_spec_build_settings_by_config[app_spec.name], app_native_target)
|
@@ -544,12 +569,8 @@ module Pod
|
|
544
569
|
file_accessors.each_with_object({}) do |file_accessor, hash|
|
545
570
|
hash[file_accessor.spec.name] = file_accessor.resource_bundles.map do |bundle_name, paths|
|
546
571
|
label = target.resources_bundle_target_label(bundle_name)
|
547
|
-
resource_bundle_target = project.new_resources_bundle(label, file_accessor.spec_consumer.platform_name)
|
548
|
-
resource_bundle_target.product_reference.
|
549
|
-
bundle_file_name = "#{bundle_name}.bundle"
|
550
|
-
bundle_product.name = bundle_file_name
|
551
|
-
end
|
552
|
-
|
572
|
+
resource_bundle_target = project.new_resources_bundle(label, file_accessor.spec_consumer.platform_name, nil, bundle_name)
|
573
|
+
resource_bundle_target.product_reference.name = label
|
553
574
|
contains_compile_phase_refs = add_resources_to_target(paths, resource_bundle_target)
|
554
575
|
|
555
576
|
target.user_build_configurations.each do |bc_name, type|
|
@@ -651,10 +672,6 @@ module Pod
|
|
651
672
|
scoped_test_resource_bundle_targets = test_resource_bundle_targets[test_spec.name]
|
652
673
|
apply_xcconfig_file_ref_to_targets([test_native_target] + scoped_test_resource_bundle_targets, test_xcconfig_file_ref, names)
|
653
674
|
end
|
654
|
-
|
655
|
-
test_native_target.build_configurations.each do |test_native_target_bc|
|
656
|
-
test_target_swift_debug_hack(test_spec, test_native_target_bc)
|
657
|
-
end
|
658
675
|
end
|
659
676
|
end
|
660
677
|
|
@@ -833,20 +850,8 @@ module Pod
|
|
833
850
|
add_file_to_support_group(path)
|
834
851
|
end
|
835
852
|
|
836
|
-
# Manually add `libswiftSwiftOnoneSupport.dylib` as it seems there is an issue with tests that do not include it for Debug configurations.
|
837
|
-
# Possibly related to Swift module optimization.
|
838
|
-
#
|
839
|
-
# @return [void]
|
840
|
-
#
|
841
|
-
def test_target_swift_debug_hack(test_spec, test_target_bc)
|
842
|
-
return unless test_target_bc.debug?
|
843
|
-
return unless target.dependent_targets_for_test_spec(test_spec).any?(&:uses_swift?)
|
844
|
-
ldflags = test_target_bc.build_settings['OTHER_LDFLAGS'] ||= '$(inherited)'
|
845
|
-
ldflags << ' -lswiftSwiftOnoneSupport'
|
846
|
-
end
|
847
|
-
|
848
853
|
# Creates a build phase which links the versioned header folders
|
849
|
-
# of the OS X into the framework bundle's root
|
854
|
+
# of the OS X framework into the framework bundle's root directory.
|
850
855
|
# This is only necessary because the way how headers are copied
|
851
856
|
# via custom copy file build phases in combination with
|
852
857
|
# header_mappings_dir interferes with xcodebuild's expectations
|
@@ -858,11 +863,16 @@ module Pod
|
|
858
863
|
# @return [void]
|
859
864
|
#
|
860
865
|
def create_build_phase_to_symlink_header_folders(native_target)
|
861
|
-
|
866
|
+
# This is required on iOS for Catalyst, which uses macOS framework layouts
|
867
|
+
return unless (target.platform.name == :osx || target.platform.name == :ios) && any_header_mapping_dirs?
|
862
868
|
|
863
869
|
build_phase = native_target.new_shell_script_build_phase('Create Symlinks to Header Folders')
|
864
870
|
build_phase.shell_script = <<-eos.strip_heredoc
|
865
871
|
cd "$CONFIGURATION_BUILD_DIR/$WRAPPER_NAME" || exit 1
|
872
|
+
if [ ! -d Versions ]; then
|
873
|
+
# Not a versioned framework, so no need to do anything
|
874
|
+
exit 0
|
875
|
+
fi
|
866
876
|
|
867
877
|
public_path="${PUBLIC_HEADERS_FOLDER_PATH\#\$CONTENTS_FOLDER_PATH/}"
|
868
878
|
if [ ! -f "$public_path" ]; then
|
@@ -989,7 +999,7 @@ module Pod
|
|
989
999
|
end
|
990
1000
|
|
991
1001
|
def create_umbrella_header(native_target)
|
992
|
-
|
1002
|
+
super(native_target) unless custom_module_map
|
993
1003
|
end
|
994
1004
|
|
995
1005
|
def custom_module_map
|
@@ -1026,12 +1036,14 @@ module Pod
|
|
1026
1036
|
end
|
1027
1037
|
end
|
1028
1038
|
|
1029
|
-
def add_header(file_accessor, build_file, public_headers, private_headers, native_target)
|
1039
|
+
def add_header(file_accessor, build_file, public_headers, project_headers, private_headers, native_target)
|
1030
1040
|
file_ref = build_file.file_ref
|
1031
1041
|
acl = if !target.build_as_framework? # Headers are already rooted at ${PODS_ROOT}/Headers/P*/[pod]/...
|
1032
1042
|
'Project'
|
1033
1043
|
elsif public_headers.include?(file_ref.real_path)
|
1034
1044
|
'Public'
|
1045
|
+
elsif project_headers.include?(file_ref.real_path)
|
1046
|
+
'Project'
|
1035
1047
|
elsif private_headers.include?(file_ref.real_path)
|
1036
1048
|
'Private'
|
1037
1049
|
else
|
@@ -1187,7 +1199,11 @@ module Pod
|
|
1187
1199
|
def dsym_paths(target)
|
1188
1200
|
dsym_paths = target.framework_paths.values.flatten.reject { |fmwk_path| fmwk_path.dsym_path.nil? }.map(&:dsym_path)
|
1189
1201
|
dsym_paths.concat(target.xcframeworks.values.flatten.flat_map { |xcframework| xcframework_dsyms(xcframework.path) })
|
1190
|
-
dsym_paths
|
1202
|
+
dsym_paths.map do |dsym_path|
|
1203
|
+
dsym_pathname = Pathname(dsym_path)
|
1204
|
+
dsym_path = "${PODS_ROOT}/#{dsym_pathname.relative_path_from(target.sandbox.root)}" unless dsym_pathname.relative?
|
1205
|
+
dsym_path
|
1206
|
+
end
|
1191
1207
|
end
|
1192
1208
|
|
1193
1209
|
# @param [PodTarget] target the target to be installed
|
@@ -1197,7 +1213,7 @@ module Pod
|
|
1197
1213
|
def bcsymbolmap_paths(target)
|
1198
1214
|
target.framework_paths.values.flatten.reject do |fmwk_path|
|
1199
1215
|
fmwk_path.bcsymbolmap_paths.nil?
|
1200
|
-
end.flat_map(&:bcsymbolmap_paths)
|
1216
|
+
end.flat_map(&:bcsymbolmap_paths).uniq
|
1201
1217
|
end
|
1202
1218
|
|
1203
1219
|
# @param [Pathname] xcframework_path
|