xcocoapods 1.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +6303 -0
- data/LICENSE +28 -0
- data/README.md +80 -0
- data/bin/pod +56 -0
- data/bin/sandbox-pod +168 -0
- data/lib/cocoapods.rb +73 -0
- data/lib/cocoapods/command.rb +175 -0
- data/lib/cocoapods/command/cache.rb +28 -0
- data/lib/cocoapods/command/cache/clean.rb +90 -0
- data/lib/cocoapods/command/cache/list.rb +69 -0
- data/lib/cocoapods/command/env.rb +66 -0
- data/lib/cocoapods/command/init.rb +128 -0
- data/lib/cocoapods/command/install.rb +45 -0
- data/lib/cocoapods/command/ipc.rb +19 -0
- data/lib/cocoapods/command/ipc/list.rb +40 -0
- data/lib/cocoapods/command/ipc/podfile.rb +31 -0
- data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
- data/lib/cocoapods/command/ipc/repl.rb +51 -0
- data/lib/cocoapods/command/ipc/spec.rb +29 -0
- data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
- data/lib/cocoapods/command/lib.rb +11 -0
- data/lib/cocoapods/command/lib/create.rb +105 -0
- data/lib/cocoapods/command/lib/lint.rb +121 -0
- data/lib/cocoapods/command/list.rb +39 -0
- data/lib/cocoapods/command/options/project_directory.rb +36 -0
- data/lib/cocoapods/command/options/repo_update.rb +34 -0
- data/lib/cocoapods/command/outdated.rb +140 -0
- data/lib/cocoapods/command/repo.rb +29 -0
- data/lib/cocoapods/command/repo/add.rb +103 -0
- data/lib/cocoapods/command/repo/lint.rb +82 -0
- data/lib/cocoapods/command/repo/list.rb +93 -0
- data/lib/cocoapods/command/repo/push.rb +281 -0
- data/lib/cocoapods/command/repo/remove.rb +36 -0
- data/lib/cocoapods/command/repo/update.rb +28 -0
- data/lib/cocoapods/command/setup.rb +103 -0
- data/lib/cocoapods/command/spec.rb +112 -0
- data/lib/cocoapods/command/spec/cat.rb +51 -0
- data/lib/cocoapods/command/spec/create.rb +283 -0
- data/lib/cocoapods/command/spec/edit.rb +87 -0
- data/lib/cocoapods/command/spec/env_spec.rb +53 -0
- data/lib/cocoapods/command/spec/lint.rb +137 -0
- data/lib/cocoapods/command/spec/which.rb +43 -0
- data/lib/cocoapods/command/update.rb +101 -0
- data/lib/cocoapods/config.rb +347 -0
- data/lib/cocoapods/core_overrides.rb +1 -0
- data/lib/cocoapods/downloader.rb +190 -0
- data/lib/cocoapods/downloader/cache.rb +233 -0
- data/lib/cocoapods/downloader/request.rb +86 -0
- data/lib/cocoapods/downloader/response.rb +16 -0
- data/lib/cocoapods/executable.rb +222 -0
- data/lib/cocoapods/external_sources.rb +57 -0
- data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
- data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
- data/lib/cocoapods/external_sources/path_source.rb +55 -0
- data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
- data/lib/cocoapods/gem_version.rb +5 -0
- data/lib/cocoapods/generator/acknowledgements.rb +107 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
- data/lib/cocoapods/generator/app_target_helper.rb +244 -0
- data/lib/cocoapods/generator/bridge_support.rb +22 -0
- data/lib/cocoapods/generator/constant.rb +19 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
- data/lib/cocoapods/generator/dummy_source.rb +31 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
- data/lib/cocoapods/generator/header.rb +103 -0
- data/lib/cocoapods/generator/info_plist_file.rb +116 -0
- data/lib/cocoapods/generator/module_map.rb +99 -0
- data/lib/cocoapods/generator/prefix_header.rb +60 -0
- data/lib/cocoapods/generator/umbrella_header.rb +46 -0
- data/lib/cocoapods/hooks_manager.rb +132 -0
- data/lib/cocoapods/installer.rb +703 -0
- data/lib/cocoapods/installer/analyzer.rb +972 -0
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
- data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
- data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
- data/lib/cocoapods/installer/installation_options.rb +158 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
- data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
- data/lib/cocoapods/installer/podfile_validator.rb +139 -0
- data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
- data/lib/cocoapods/installer/xcode.rb +8 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
- data/lib/cocoapods/open-uri.rb +33 -0
- data/lib/cocoapods/project.rb +414 -0
- data/lib/cocoapods/resolver.rb +585 -0
- data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
- data/lib/cocoapods/sandbox.rb +404 -0
- data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
- data/lib/cocoapods/sandbox/headers_store.rb +146 -0
- data/lib/cocoapods/sandbox/path_list.rb +220 -0
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
- data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
- data/lib/cocoapods/sources_manager.rb +157 -0
- data/lib/cocoapods/target.rb +261 -0
- data/lib/cocoapods/target/aggregate_target.rb +338 -0
- data/lib/cocoapods/target/build_settings.rb +1075 -0
- data/lib/cocoapods/target/pod_target.rb +559 -0
- data/lib/cocoapods/user_interface.rb +459 -0
- data/lib/cocoapods/user_interface/error_report.rb +187 -0
- data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
- data/lib/cocoapods/validator.rb +981 -0
- metadata +533 -0
@@ -0,0 +1,261 @@
|
|
1
|
+
require 'cocoapods/target/build_settings'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
# Model class which describes a Pods target.
|
5
|
+
#
|
6
|
+
# The Target class stores and provides the information necessary for
|
7
|
+
# working with a target in the Podfile and its dependent libraries.
|
8
|
+
# This class is used to represent both the targets and their libraries.
|
9
|
+
#
|
10
|
+
class Target
|
11
|
+
DEFAULT_VERSION = '1.0.0'.freeze
|
12
|
+
DEFAULT_NAME = 'Default'.freeze
|
13
|
+
DEFAULT_BUILD_CONFIGURATIONS = { 'Release' => :release, 'Debug' => :debug }.freeze
|
14
|
+
|
15
|
+
# @return [Sandbox] The sandbox where the Pods should be installed.
|
16
|
+
#
|
17
|
+
attr_reader :sandbox
|
18
|
+
|
19
|
+
# @return [Boolean] Whether the target needs to be implemented as a framework.
|
20
|
+
# Computed by analyzer.
|
21
|
+
#
|
22
|
+
attr_reader :host_requires_frameworks
|
23
|
+
alias_method :host_requires_frameworks?, :host_requires_frameworks
|
24
|
+
|
25
|
+
# @return [Hash{String=>Symbol}] A hash representing the user build
|
26
|
+
# configurations where each key corresponds to the name of a
|
27
|
+
# configuration and its value to its type (`:debug` or `:release`).
|
28
|
+
#
|
29
|
+
attr_reader :user_build_configurations
|
30
|
+
|
31
|
+
# @return [Array<String>] The value for the ARCHS build setting.
|
32
|
+
#
|
33
|
+
attr_reader :archs
|
34
|
+
|
35
|
+
# @return [Platform] the platform of this target.
|
36
|
+
#
|
37
|
+
attr_reader :platform
|
38
|
+
|
39
|
+
# @return [BuildSettings] the build settings for this target.
|
40
|
+
#
|
41
|
+
attr_reader :build_settings
|
42
|
+
|
43
|
+
# Initialize a new target
|
44
|
+
#
|
45
|
+
# @param [Sandbox] sandbox @see #sandbox
|
46
|
+
# @param [Boolean] host_requires_frameworks @see #host_requires_frameworks
|
47
|
+
# @param [Hash{String=>Symbol}] user_build_configurations @see #user_build_configurations
|
48
|
+
# @param [Array<String>] archs @see #archs
|
49
|
+
# @param [Platform] platform @see #platform
|
50
|
+
#
|
51
|
+
def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform)
|
52
|
+
@sandbox = sandbox
|
53
|
+
@host_requires_frameworks = host_requires_frameworks
|
54
|
+
@user_build_configurations = user_build_configurations
|
55
|
+
@archs = archs
|
56
|
+
@platform = platform
|
57
|
+
|
58
|
+
@build_settings = create_build_settings
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [String] the name of the library.
|
62
|
+
#
|
63
|
+
def name
|
64
|
+
label
|
65
|
+
end
|
66
|
+
|
67
|
+
alias to_s name
|
68
|
+
|
69
|
+
# @return [String] the label for the target.
|
70
|
+
#
|
71
|
+
def label
|
72
|
+
DEFAULT_NAME
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [String] The version associated with this target
|
76
|
+
#
|
77
|
+
def version
|
78
|
+
DEFAULT_VERSION
|
79
|
+
end
|
80
|
+
|
81
|
+
# @return [Boolean] Whether the target uses Swift code
|
82
|
+
#
|
83
|
+
def uses_swift?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Boolean] Whether the target should build a static framework.
|
88
|
+
#
|
89
|
+
def static_framework?
|
90
|
+
false
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [String] the name to use for the source code module constructed
|
94
|
+
# for this target, and which will be used to import the module in
|
95
|
+
# implementation source files.
|
96
|
+
#
|
97
|
+
def product_module_name
|
98
|
+
c99ext_identifier(label)
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [String] the name of the product.
|
102
|
+
#
|
103
|
+
def product_name
|
104
|
+
if requires_frameworks?
|
105
|
+
framework_name
|
106
|
+
else
|
107
|
+
static_library_name
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# @return [String] the name of the product excluding the file extension or
|
112
|
+
# a product type specific prefix, depends on #requires_frameworks?
|
113
|
+
# and #product_module_name or #label.
|
114
|
+
#
|
115
|
+
def product_basename
|
116
|
+
if requires_frameworks?
|
117
|
+
product_module_name
|
118
|
+
else
|
119
|
+
label
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [String] the name of the framework, depends on #label.
|
124
|
+
#
|
125
|
+
# @note This may not depend on #requires_frameworks? indirectly as it is
|
126
|
+
# used for migration.
|
127
|
+
#
|
128
|
+
def framework_name
|
129
|
+
"#{product_module_name}.framework"
|
130
|
+
end
|
131
|
+
|
132
|
+
# @return [String] the name of the library, depends on #label.
|
133
|
+
#
|
134
|
+
# @note This may not depend on #requires_frameworks? indirectly as it is
|
135
|
+
# used for migration.
|
136
|
+
#
|
137
|
+
def static_library_name
|
138
|
+
"lib#{label}.a"
|
139
|
+
end
|
140
|
+
|
141
|
+
# @return [Symbol] either :framework or :static_library, depends on
|
142
|
+
# #requires_frameworks?.
|
143
|
+
#
|
144
|
+
def product_type
|
145
|
+
requires_frameworks? ? :framework : :static_library
|
146
|
+
end
|
147
|
+
|
148
|
+
# @return [String] A string suitable for debugging.
|
149
|
+
#
|
150
|
+
def inspect
|
151
|
+
"<#{self.class} name=#{name} >"
|
152
|
+
end
|
153
|
+
|
154
|
+
#-------------------------------------------------------------------------#
|
155
|
+
|
156
|
+
# @!group Framework support
|
157
|
+
|
158
|
+
# @return [Boolean] whether the generated target needs to be implemented
|
159
|
+
# as a framework
|
160
|
+
#
|
161
|
+
def requires_frameworks?
|
162
|
+
host_requires_frameworks? || false
|
163
|
+
end
|
164
|
+
|
165
|
+
#-------------------------------------------------------------------------#
|
166
|
+
|
167
|
+
# @!group Support files
|
168
|
+
|
169
|
+
# @return [Pathname] the folder where to store the support files of this
|
170
|
+
# library.
|
171
|
+
#
|
172
|
+
def support_files_dir
|
173
|
+
sandbox.target_support_files_dir(name)
|
174
|
+
end
|
175
|
+
|
176
|
+
# @param [String] variant
|
177
|
+
# The variant of the xcconfig. Used to differentiate build
|
178
|
+
# configurations.
|
179
|
+
#
|
180
|
+
# @return [Pathname] the absolute path of the xcconfig file.
|
181
|
+
#
|
182
|
+
def xcconfig_path(variant = nil)
|
183
|
+
if variant
|
184
|
+
support_files_dir + "#{label}.#{variant.gsub(File::SEPARATOR, '-').downcase}.xcconfig"
|
185
|
+
else
|
186
|
+
support_files_dir + "#{label}.xcconfig"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# @return [Pathname] the absolute path of the header file which contains
|
191
|
+
# the exported foundation constants with framework version
|
192
|
+
# information and all headers, which should been exported in the
|
193
|
+
# module map.
|
194
|
+
#
|
195
|
+
def umbrella_header_path
|
196
|
+
module_map_path.parent + "#{label}-umbrella.h"
|
197
|
+
end
|
198
|
+
|
199
|
+
def umbrella_header_path_to_write
|
200
|
+
module_map_path_to_write.parent + "#{label}-umbrella.h"
|
201
|
+
end
|
202
|
+
|
203
|
+
# @return [Pathname] the absolute path of the LLVM module map file that
|
204
|
+
# defines the module structure for the compiler.
|
205
|
+
#
|
206
|
+
def module_map_path
|
207
|
+
module_map_path_to_write
|
208
|
+
end
|
209
|
+
|
210
|
+
# @!private
|
211
|
+
#
|
212
|
+
# @return [Pathname] the absolute path of the module map file that
|
213
|
+
# CocoaPods writes. This can be different from `module_map_path`
|
214
|
+
# if the module map gets symlinked.
|
215
|
+
#
|
216
|
+
def module_map_path_to_write
|
217
|
+
basename = "#{label}.modulemap"
|
218
|
+
support_files_dir + basename
|
219
|
+
end
|
220
|
+
|
221
|
+
# @return [Pathname] the absolute path of the bridge support file.
|
222
|
+
#
|
223
|
+
def bridge_support_path
|
224
|
+
support_files_dir + "#{label}.bridgesupport"
|
225
|
+
end
|
226
|
+
|
227
|
+
# @return [Pathname] the absolute path of the Info.plist file.
|
228
|
+
#
|
229
|
+
def info_plist_path
|
230
|
+
support_files_dir + "#{label}-Info.plist"
|
231
|
+
end
|
232
|
+
|
233
|
+
# @return [Pathname] the path of the dummy source generated by CocoaPods
|
234
|
+
#
|
235
|
+
def dummy_source_path
|
236
|
+
support_files_dir + "#{label}-dummy.m"
|
237
|
+
end
|
238
|
+
|
239
|
+
#-------------------------------------------------------------------------#
|
240
|
+
|
241
|
+
private
|
242
|
+
|
243
|
+
# Transforms the given string into a valid +identifier+ after C99ext
|
244
|
+
# standard, so that it can be used in source code where escaping of
|
245
|
+
# ambiguous characters is not applicable.
|
246
|
+
#
|
247
|
+
# @param [String] name
|
248
|
+
# any name, which may contain leading numbers, spaces or invalid
|
249
|
+
# characters.
|
250
|
+
#
|
251
|
+
# @return [String]
|
252
|
+
#
|
253
|
+
def c99ext_identifier(name)
|
254
|
+
name.gsub(/^([0-9])/, '_\1').gsub(/[^a-zA-Z0-9_]/, '_')
|
255
|
+
end
|
256
|
+
|
257
|
+
def create_build_settings
|
258
|
+
BuildSettings.new(self)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
@@ -0,0 +1,338 @@
|
|
1
|
+
module Pod
|
2
|
+
# Stores the information relative to the target used to cluster the targets
|
3
|
+
# of the single Pods. The client targets will then depend on this one.
|
4
|
+
#
|
5
|
+
class AggregateTarget < Target
|
6
|
+
# Product types where the product's frameworks must be embedded in a host target
|
7
|
+
#
|
8
|
+
EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES = [:app_extension, :framework, :static_library, :messages_extension, :watch_extension, :xpc_service].freeze
|
9
|
+
|
10
|
+
# @return [TargetDefinition] the target definition of the Podfile that
|
11
|
+
# generated this target.
|
12
|
+
#
|
13
|
+
attr_reader :target_definition
|
14
|
+
|
15
|
+
# @return [Pathname] the folder where the client is stored used for
|
16
|
+
# computing the relative paths. If integrating it should be the
|
17
|
+
# folder where the user project is stored, otherwise it should
|
18
|
+
# be the installation root.
|
19
|
+
#
|
20
|
+
attr_reader :client_root
|
21
|
+
|
22
|
+
# @return [Xcodeproj::Project] the user project that this target will
|
23
|
+
# integrate as identified by the analyzer.
|
24
|
+
#
|
25
|
+
attr_reader :user_project
|
26
|
+
|
27
|
+
# @return [Array<String>] the list of the UUIDs of the user targets that
|
28
|
+
# will be integrated by this target as identified by the analyzer.
|
29
|
+
#
|
30
|
+
# @note The target instances are not stored to prevent editing different
|
31
|
+
# instances.
|
32
|
+
#
|
33
|
+
attr_reader :user_target_uuids
|
34
|
+
|
35
|
+
# @return [Hash<String, Xcodeproj::Config>] Map from configuration name to
|
36
|
+
# configuration file for the target
|
37
|
+
#
|
38
|
+
# @note The configurations are generated by the {TargetInstaller} and
|
39
|
+
# used by {UserProjectIntegrator} to check for any overridden
|
40
|
+
# values.
|
41
|
+
#
|
42
|
+
attr_reader :xcconfigs
|
43
|
+
|
44
|
+
# @return [Array<PodTarget>] The dependencies for this target.
|
45
|
+
#
|
46
|
+
attr_accessor :pod_targets
|
47
|
+
|
48
|
+
# @return [Array<AggregateTarget>] The aggregate targets whose pods this
|
49
|
+
# target must be able to import, but will not directly link against.
|
50
|
+
#
|
51
|
+
attr_reader :search_paths_aggregate_targets
|
52
|
+
|
53
|
+
# Initialize a new instance
|
54
|
+
#
|
55
|
+
# @param [Sandbox] sandbox @see Target#sandbox
|
56
|
+
# @param [Boolean] host_requires_frameworks @see Target#host_requires_frameworks
|
57
|
+
# @param [Hash{String=>Symbol}] user_build_configurations @see Target#user_build_configurations
|
58
|
+
# @param [Array<String>] archs @see Target#archs
|
59
|
+
# @param [Platform] platform @see #Target#platform
|
60
|
+
# @param [TargetDefinition] target_definition @see #target_definition
|
61
|
+
# @param [Pathname] client_root @see #client_root
|
62
|
+
# @param [Xcodeproj::Project] user_project @see #user_project
|
63
|
+
# @param [Array<String>] user_target_uuids @see #user_target_uuids
|
64
|
+
# @param [Array<PodTarget>] pod_targets_for_build_configuration @see #pod_targets_for_build_configuration
|
65
|
+
#
|
66
|
+
def initialize(sandbox, host_requires_frameworks, user_build_configurations, archs, platform, target_definition,
|
67
|
+
client_root, user_project, user_target_uuids, pod_targets_for_build_configuration)
|
68
|
+
super(sandbox, host_requires_frameworks, user_build_configurations, archs, platform)
|
69
|
+
raise "Can't initialize an AggregateTarget without a TargetDefinition!" if target_definition.nil?
|
70
|
+
raise "Can't initialize an AggregateTarget with an abstract TargetDefinition!" if target_definition.abstract?
|
71
|
+
@target_definition = target_definition
|
72
|
+
@client_root = client_root
|
73
|
+
@user_project = user_project
|
74
|
+
@user_target_uuids = user_target_uuids
|
75
|
+
@pod_targets_for_build_configuration = pod_targets_for_build_configuration
|
76
|
+
@pod_targets = pod_targets_for_build_configuration.values.flatten.uniq
|
77
|
+
@search_paths_aggregate_targets = []
|
78
|
+
@xcconfigs = {}
|
79
|
+
end
|
80
|
+
|
81
|
+
def build_settings(configuration_name = nil)
|
82
|
+
if configuration_name
|
83
|
+
@build_settings[configuration_name] ||
|
84
|
+
raise(ArgumentError, "#{self} does not contain a build setting for the #{configuration_name.inspect} configuration, only #{@build_settings.keys.inspect}")
|
85
|
+
else
|
86
|
+
@build_settings.each_value.first ||
|
87
|
+
raise(ArgumentError, "#{self} does not contain any build settings")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [Boolean] True if the user_target refers to a
|
92
|
+
# library (framework, static or dynamic lib).
|
93
|
+
#
|
94
|
+
def library?
|
95
|
+
# Without a user_project, we can't say for sure
|
96
|
+
# that this is a library
|
97
|
+
return false if user_project.nil?
|
98
|
+
symbol_types = user_targets.map(&:symbol_type).uniq
|
99
|
+
raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}." unless symbol_types.count == 1
|
100
|
+
[:framework, :dynamic_library, :static_library].include? symbol_types.first
|
101
|
+
end
|
102
|
+
|
103
|
+
# @return [Boolean] True if the user_target's pods are
|
104
|
+
# for an extension and must be embedded in a host,
|
105
|
+
# target, otherwise false.
|
106
|
+
#
|
107
|
+
def requires_host_target?
|
108
|
+
# If we don't have a user_project, then we can't
|
109
|
+
# glean any info about how this target is going to
|
110
|
+
# be integrated, so return false since we can't know
|
111
|
+
# for sure that this target refers to an extension
|
112
|
+
# target that would require a host target
|
113
|
+
return false if user_project.nil?
|
114
|
+
symbol_types = user_targets.map(&:symbol_type).uniq
|
115
|
+
raise ArgumentError, "Expected single kind of user_target for #{name}. Found #{symbol_types.join(', ')}." unless symbol_types.count == 1
|
116
|
+
EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES.include?(symbol_types[0])
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [String] the label for the target.
|
120
|
+
#
|
121
|
+
def label
|
122
|
+
target_definition.label.to_s
|
123
|
+
end
|
124
|
+
|
125
|
+
# @return [Podfile] The podfile which declares the dependency
|
126
|
+
#
|
127
|
+
def podfile
|
128
|
+
target_definition.podfile
|
129
|
+
end
|
130
|
+
|
131
|
+
# @return [Pathname] the path of the user project that this target will
|
132
|
+
# integrate as identified by the analyzer.
|
133
|
+
#
|
134
|
+
def user_project_path
|
135
|
+
user_project.path if user_project
|
136
|
+
end
|
137
|
+
|
138
|
+
# List all user targets that will be integrated by this #target.
|
139
|
+
#
|
140
|
+
# @return [Array<PBXNativeTarget>]
|
141
|
+
#
|
142
|
+
def user_targets
|
143
|
+
return [] unless user_project
|
144
|
+
user_target_uuids.map do |uuid|
|
145
|
+
native_target = user_project.objects_by_uuid[uuid]
|
146
|
+
unless native_target
|
147
|
+
raise Informative, '[Bug] Unable to find the target with ' \
|
148
|
+
"the `#{uuid}` UUID for the `#{self}` integration library"
|
149
|
+
end
|
150
|
+
native_target
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# @param [String] build_configuration The build configuration for which the
|
155
|
+
# the pod targets should be returned.
|
156
|
+
#
|
157
|
+
# @return [Array<PodTarget>] the pod targets for the given build
|
158
|
+
# configuration.
|
159
|
+
#
|
160
|
+
def pod_targets_for_build_configuration(build_configuration)
|
161
|
+
@pod_targets_for_build_configuration[build_configuration] || []
|
162
|
+
end
|
163
|
+
|
164
|
+
# @return [Array<Specification>] The specifications used by this aggregate target.
|
165
|
+
#
|
166
|
+
def specs
|
167
|
+
pod_targets.flat_map(&:specs)
|
168
|
+
end
|
169
|
+
|
170
|
+
# @return [Hash{Symbol => Array<Specification>}] The pod targets for each
|
171
|
+
# build configuration.
|
172
|
+
#
|
173
|
+
def specs_by_build_configuration
|
174
|
+
result = {}
|
175
|
+
user_build_configurations.keys.each do |build_configuration|
|
176
|
+
result[build_configuration] = pod_targets_for_build_configuration(build_configuration).
|
177
|
+
flat_map(&:specs)
|
178
|
+
end
|
179
|
+
result
|
180
|
+
end
|
181
|
+
|
182
|
+
# @return [Array<Specification::Consumer>] The consumers of the Pod.
|
183
|
+
#
|
184
|
+
def spec_consumers
|
185
|
+
specs.map { |spec| spec.consumer(platform) }
|
186
|
+
end
|
187
|
+
|
188
|
+
# @return [Boolean] Whether the target uses Swift code
|
189
|
+
#
|
190
|
+
def uses_swift?
|
191
|
+
pod_targets.any?(&:uses_swift?)
|
192
|
+
end
|
193
|
+
|
194
|
+
# @return [Hash{String => Array<Hash{Symbol => [String]}>}] The vendored dynamic artifacts and framework target
|
195
|
+
# input and output paths grouped by config
|
196
|
+
#
|
197
|
+
def framework_paths_by_config
|
198
|
+
@framework_paths_by_config ||= begin
|
199
|
+
framework_paths_by_config = {}
|
200
|
+
user_build_configurations.keys.each do |config|
|
201
|
+
relevant_pod_targets = pod_targets_for_build_configuration(config)
|
202
|
+
framework_paths_by_config[config] = relevant_pod_targets.flat_map do |pod_target|
|
203
|
+
non_test_specs = pod_target.non_test_specs.map(&:name)
|
204
|
+
pod_target.framework_paths.values_at(*non_test_specs).flatten.compact.uniq
|
205
|
+
end
|
206
|
+
end
|
207
|
+
framework_paths_by_config
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# @return [Hash{String => Array<String>}] Uniqued Resources grouped by config
|
212
|
+
#
|
213
|
+
def resource_paths_by_config
|
214
|
+
@resource_paths_by_config ||= begin
|
215
|
+
relevant_pod_targets = pod_targets.reject do |pod_target|
|
216
|
+
pod_target.should_build? && pod_target.requires_frameworks? && !pod_target.static_framework?
|
217
|
+
end
|
218
|
+
user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
|
219
|
+
resources_by_config[config] = (relevant_pod_targets & pod_targets_for_build_configuration(config)).flat_map do |pod_target|
|
220
|
+
non_test_specs = pod_target.non_test_specs.map(&:name)
|
221
|
+
resource_paths = pod_target.resource_paths.values_at(*non_test_specs).flatten.compact
|
222
|
+
(resource_paths + [bridge_support_file].compact).uniq
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# @return [Pathname] the path of the bridge support file relative to the
|
229
|
+
# sandbox or `nil` if bridge support is disabled.
|
230
|
+
#
|
231
|
+
def bridge_support_file
|
232
|
+
bridge_support_path.relative_path_from(sandbox.root) if podfile.generate_bridge_support?
|
233
|
+
end
|
234
|
+
|
235
|
+
#-------------------------------------------------------------------------#
|
236
|
+
|
237
|
+
# @!group Support files
|
238
|
+
|
239
|
+
# @return [Pathname] The absolute path of acknowledgements file.
|
240
|
+
#
|
241
|
+
# @note The acknowledgements generators add the extension according to
|
242
|
+
# the file type.
|
243
|
+
#
|
244
|
+
def acknowledgements_basepath
|
245
|
+
support_files_dir + "#{label}-acknowledgements"
|
246
|
+
end
|
247
|
+
|
248
|
+
# @return [Pathname] The absolute path of the copy resources script.
|
249
|
+
#
|
250
|
+
def copy_resources_script_path
|
251
|
+
support_files_dir + "#{label}-resources.sh"
|
252
|
+
end
|
253
|
+
|
254
|
+
# @return [Pathname] The absolute path of the embed frameworks script.
|
255
|
+
#
|
256
|
+
def embed_frameworks_script_path
|
257
|
+
support_files_dir + "#{label}-frameworks.sh"
|
258
|
+
end
|
259
|
+
|
260
|
+
# @return [String] The output file path fo the check manifest lock script.
|
261
|
+
#
|
262
|
+
def check_manifest_lock_script_output_file_path
|
263
|
+
"$(DERIVED_FILE_DIR)/#{label}-checkManifestLockResult.txt"
|
264
|
+
end
|
265
|
+
|
266
|
+
# @return [Pathname] The relative path of the Pods directory from user project's directory.
|
267
|
+
#
|
268
|
+
def relative_pods_root_path
|
269
|
+
sandbox.root.relative_path_from(client_root)
|
270
|
+
end
|
271
|
+
|
272
|
+
# @return [String] The xcconfig path of the root from the `$(SRCROOT)`
|
273
|
+
# variable of the user's project.
|
274
|
+
#
|
275
|
+
def relative_pods_root
|
276
|
+
"${SRCROOT}/#{relative_pods_root_path}"
|
277
|
+
end
|
278
|
+
|
279
|
+
# @return [String] The path of the Podfile directory relative to the
|
280
|
+
# root of the user project.
|
281
|
+
#
|
282
|
+
def podfile_dir_relative_path
|
283
|
+
podfile_path = target_definition.podfile.defined_in_file
|
284
|
+
return "${SRCROOT}/#{podfile_path.relative_path_from(client_root).dirname}" unless podfile_path.nil?
|
285
|
+
# Fallback to the standard path if the Podfile is not represented by a file.
|
286
|
+
'${PODS_ROOT}/..'
|
287
|
+
end
|
288
|
+
|
289
|
+
# @param [String] config_name The build configuration name to get the xcconfig for
|
290
|
+
# @return [String] The path of the xcconfig file relative to the root of
|
291
|
+
# the user project.
|
292
|
+
#
|
293
|
+
def xcconfig_relative_path(config_name)
|
294
|
+
xcconfig_path(config_name).relative_path_from(client_root).to_s
|
295
|
+
end
|
296
|
+
|
297
|
+
# @return [String] The path of the copy resources script relative to the
|
298
|
+
# root of the Pods project.
|
299
|
+
#
|
300
|
+
def copy_resources_script_relative_path
|
301
|
+
"${PODS_ROOT}/#{relative_to_pods_root(copy_resources_script_path)}"
|
302
|
+
end
|
303
|
+
|
304
|
+
# @return [String] The path of the embed frameworks relative to the
|
305
|
+
# root of the Pods project.
|
306
|
+
#
|
307
|
+
def embed_frameworks_script_relative_path
|
308
|
+
"${PODS_ROOT}/#{relative_to_pods_root(embed_frameworks_script_path)}"
|
309
|
+
end
|
310
|
+
|
311
|
+
private
|
312
|
+
|
313
|
+
# @!group Private Helpers
|
314
|
+
#-------------------------------------------------------------------------#
|
315
|
+
|
316
|
+
# Computes the relative path of a sandboxed file from the `$(PODS_ROOT)`
|
317
|
+
# variable of the Pods's project.
|
318
|
+
#
|
319
|
+
# @param [Pathname] path
|
320
|
+
# A relative path from the root of the sandbox.
|
321
|
+
#
|
322
|
+
# @return [String] The computed path.
|
323
|
+
#
|
324
|
+
def relative_to_pods_root(path)
|
325
|
+
path.relative_path_from(sandbox.root).to_s
|
326
|
+
end
|
327
|
+
|
328
|
+
def create_build_settings
|
329
|
+
settings = {}
|
330
|
+
|
331
|
+
user_build_configurations.each_key do |configuration_name|
|
332
|
+
settings[configuration_name] = BuildSettings::AggregateTargetSettings.new(self, configuration_name)
|
333
|
+
end
|
334
|
+
|
335
|
+
settings
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|