cocoapods 0.5.1 → 0.6.0.rc1
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.
- data/CHANGELOG.md +229 -2
- data/README.md +50 -20
- data/bin/pod +3 -2
- data/lib/cocoapods.rb +23 -9
- data/lib/cocoapods/command.rb +71 -30
- data/lib/cocoapods/command/error_report.rb +102 -0
- data/lib/cocoapods/command/install.rb +27 -19
- data/lib/cocoapods/command/list.rb +51 -8
- data/lib/cocoapods/command/presenter.rb +61 -0
- data/lib/cocoapods/command/presenter/cocoa_pod.rb +123 -0
- data/lib/cocoapods/command/push.rb +102 -0
- data/lib/cocoapods/command/repo.rb +70 -14
- data/lib/cocoapods/command/search.rb +7 -10
- data/lib/cocoapods/command/setup.rb +76 -15
- data/lib/cocoapods/command/spec.rb +581 -97
- data/lib/cocoapods/config.rb +23 -26
- data/lib/cocoapods/dependency.rb +86 -40
- data/lib/cocoapods/downloader.rb +30 -18
- data/lib/cocoapods/downloader/git.rb +125 -15
- data/lib/cocoapods/downloader/http.rb +73 -0
- data/lib/cocoapods/downloader/mercurial.rb +3 -9
- data/lib/cocoapods/downloader/subversion.rb +3 -9
- data/lib/cocoapods/executable.rb +26 -3
- data/lib/cocoapods/generator/acknowledgements.rb +37 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +38 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +63 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +8 -4
- data/lib/cocoapods/generator/documentation.rb +99 -0
- data/lib/cocoapods/generator/dummy_source.rb +14 -0
- data/lib/cocoapods/installer.rb +140 -109
- data/lib/cocoapods/installer/target_installer.rb +78 -83
- data/lib/cocoapods/installer/user_project_integrator.rb +162 -0
- data/lib/cocoapods/local_pod.rb +240 -0
- data/lib/cocoapods/platform.rb +41 -18
- data/lib/cocoapods/podfile.rb +234 -21
- data/lib/cocoapods/project.rb +67 -0
- data/lib/cocoapods/resolver.rb +62 -32
- data/lib/cocoapods/sandbox.rb +63 -0
- data/lib/cocoapods/source.rb +42 -20
- data/lib/cocoapods/specification.rb +294 -271
- data/lib/cocoapods/specification/set.rb +10 -28
- data/lib/cocoapods/specification/statistics.rb +112 -0
- metadata +124 -11
- data/lib/cocoapods/xcodeproj_pods.rb +0 -111
data/lib/cocoapods/podfile.rb
CHANGED
@@ -1,26 +1,149 @@
|
|
1
1
|
module Pod
|
2
2
|
class Podfile
|
3
|
+
class UserProject
|
4
|
+
include Config::Mixin
|
5
|
+
|
6
|
+
DEFAULT_BUILD_CONFIGURATIONS = { 'Debug' => :debug, 'Release' => :release }.freeze
|
7
|
+
|
8
|
+
def initialize(path = nil, build_configurations = {})
|
9
|
+
self.path = path if path
|
10
|
+
@build_configurations = build_configurations.merge(DEFAULT_BUILD_CONFIGURATIONS)
|
11
|
+
end
|
12
|
+
|
13
|
+
def path=(path)
|
14
|
+
path = path.to_s
|
15
|
+
@path = Pathname.new(File.extname(path) == '.xcodeproj' ? path : "#{path}.xcodeproj")
|
16
|
+
@path = config.project_root + @path unless @path.absolute?
|
17
|
+
@path
|
18
|
+
end
|
19
|
+
|
20
|
+
def path
|
21
|
+
if @path
|
22
|
+
@path
|
23
|
+
else
|
24
|
+
xcodeprojs = config.project_root.glob('*.xcodeproj')
|
25
|
+
if xcodeprojs.size == 1
|
26
|
+
@path = xcodeprojs.first
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def project
|
32
|
+
Xcodeproj::Project.new(path) if path && path.exist?
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_configurations
|
36
|
+
if project
|
37
|
+
project.build_configurations.map(&:name).inject({}) do |hash, name|
|
38
|
+
hash[name] = :release; hash
|
39
|
+
end.merge(@build_configurations)
|
40
|
+
else
|
41
|
+
@build_configurations
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
3
46
|
class TargetDefinition
|
4
|
-
|
47
|
+
include Config::Mixin
|
5
48
|
|
6
|
-
|
7
|
-
|
49
|
+
attr_reader :name, :target_dependencies
|
50
|
+
|
51
|
+
attr_accessor :user_project, :link_with, :platform, :parent, :exclusive
|
52
|
+
|
53
|
+
def initialize(name, options = {})
|
54
|
+
@name, @target_dependencies = name, []
|
55
|
+
@parent, @exclusive = options.values_at(:parent, :exclusive)
|
8
56
|
end
|
9
57
|
|
10
|
-
|
58
|
+
# A target is automatically `exclusive` if the `platform` does not match
|
59
|
+
# the parent's `platform`.
|
60
|
+
def exclusive
|
61
|
+
if @exclusive.nil?
|
62
|
+
if @platform.nil?
|
63
|
+
false
|
64
|
+
else
|
65
|
+
@parent.platform != @platform
|
66
|
+
end
|
67
|
+
else
|
68
|
+
@exclusive
|
69
|
+
end
|
70
|
+
end
|
71
|
+
alias_method :exclusive?, :exclusive
|
72
|
+
|
73
|
+
def user_project
|
74
|
+
@user_project || @parent.user_project
|
75
|
+
end
|
76
|
+
|
77
|
+
def link_with=(targets)
|
78
|
+
@link_with = targets.is_a?(Array) ? targets : [targets]
|
79
|
+
end
|
80
|
+
|
81
|
+
def platform
|
82
|
+
@platform || (@parent.platform if @parent)
|
83
|
+
end
|
84
|
+
|
85
|
+
def label
|
11
86
|
if name == :default
|
12
87
|
"Pods"
|
13
|
-
elsif
|
14
|
-
"#{@parent.lib_name}-#{name}"
|
15
|
-
else
|
88
|
+
elsif exclusive?
|
16
89
|
"Pods-#{name}"
|
90
|
+
else
|
91
|
+
"#{@parent.label}-#{name}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def acknowledgements_path
|
96
|
+
config.project_pods_root + "#{label}-Acknowledgements"
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns a path, which is relative to the project_root, relative to the
|
100
|
+
# `$(SRCROOT)` of the user's project.
|
101
|
+
def relative_to_srcroot(path)
|
102
|
+
if user_project.path.nil?
|
103
|
+
# TODO this is not in the right place
|
104
|
+
raise Informative, "[!] Unable to find an Xcode project to integrate".red if config.integrate_targets
|
105
|
+
path
|
106
|
+
else
|
107
|
+
(config.project_root + path).relative_path_from(user_project.path.dirname)
|
17
108
|
end
|
18
109
|
end
|
19
110
|
|
111
|
+
def relative_pods_root
|
112
|
+
"${SRCROOT}/#{relative_to_srcroot "Pods"}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def lib_name
|
116
|
+
"lib#{label}.a"
|
117
|
+
end
|
118
|
+
|
119
|
+
def xcconfig_name
|
120
|
+
"#{label}.xcconfig"
|
121
|
+
end
|
122
|
+
|
123
|
+
def xcconfig_relative_path
|
124
|
+
relative_to_srcroot("Pods/#{xcconfig_name}").to_s
|
125
|
+
end
|
126
|
+
|
127
|
+
def copy_resources_script_name
|
128
|
+
"#{label}-resources.sh"
|
129
|
+
end
|
130
|
+
|
131
|
+
def copy_resources_script_relative_path
|
132
|
+
"${SRCROOT}/#{relative_to_srcroot("Pods/#{copy_resources_script_name}")}"
|
133
|
+
end
|
134
|
+
|
135
|
+
def prefix_header_name
|
136
|
+
"#{label}-prefix.pch"
|
137
|
+
end
|
138
|
+
|
139
|
+
def bridge_support_name
|
140
|
+
"#{label}.bridgesupport"
|
141
|
+
end
|
142
|
+
|
20
143
|
# Returns *all* dependencies of this target, not only the target specific
|
21
144
|
# ones in `target_dependencies`.
|
22
145
|
def dependencies
|
23
|
-
@target_dependencies + (
|
146
|
+
@target_dependencies + (exclusive? ? [] : @parent.dependencies)
|
24
147
|
end
|
25
148
|
|
26
149
|
def empty?
|
@@ -40,7 +163,9 @@ module Pod
|
|
40
163
|
include Config::Mixin
|
41
164
|
|
42
165
|
def initialize(&block)
|
43
|
-
@
|
166
|
+
@target_definition = TargetDefinition.new(:default, :exclusive => true)
|
167
|
+
@target_definition.user_project = UserProject.new
|
168
|
+
@target_definitions = { :default => @target_definition }
|
44
169
|
instance_eval(&block)
|
45
170
|
end
|
46
171
|
|
@@ -55,8 +180,73 @@ module Pod
|
|
55
180
|
# platform :ios, :deployment_target => "4.0"
|
56
181
|
#
|
57
182
|
# If the deployment target requires it (< 4.3), armv6 will be added to ARCHS.
|
58
|
-
|
59
|
-
|
183
|
+
#
|
184
|
+
def platform(platform, options={})
|
185
|
+
@target_definition.platform = Platform.new(platform, options)
|
186
|
+
end
|
187
|
+
|
188
|
+
# Specifies the Xcode workspace that should contain all the projects.
|
189
|
+
#
|
190
|
+
# If no explicit Xcode workspace is specified and only **one** project exists
|
191
|
+
# in the same directory as the Podfile, then the name of that project is used
|
192
|
+
# as the workspace’s name.
|
193
|
+
#
|
194
|
+
# @example
|
195
|
+
#
|
196
|
+
# workspace 'MyWorkspace'
|
197
|
+
#
|
198
|
+
def workspace(path = nil)
|
199
|
+
if path
|
200
|
+
@workspace = config.project_root + (File.extname(path) == '.xcworkspace' ? path : "#{path}.xcworkspace")
|
201
|
+
elsif @workspace
|
202
|
+
@workspace
|
203
|
+
else
|
204
|
+
projects = @target_definitions.map { |_, td| td.user_project.path }.uniq
|
205
|
+
if projects.size == 1 && (xcodeproj = @target_definitions[:default].user_project.path)
|
206
|
+
config.project_root + "#{xcodeproj.basename('.xcodeproj')}.xcworkspace"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Specifies the Xcode project that contains the target that the Pods library
|
212
|
+
# should be linked with.
|
213
|
+
#
|
214
|
+
# If no explicit project is specified, it will use the Xcode project of the
|
215
|
+
# parent target. If none of the target definitions specify an explicit project
|
216
|
+
# and there is only **one** project in the same directory as the Podfile then
|
217
|
+
# that project will be used.
|
218
|
+
#
|
219
|
+
# @example
|
220
|
+
#
|
221
|
+
# # Look for target to link with in an Xcode project called ‘MyProject.xcodeproj’.
|
222
|
+
# xcodeproj 'MyProject'
|
223
|
+
#
|
224
|
+
# target :test do
|
225
|
+
# # This Pods library links with a target in another project.
|
226
|
+
# xcodeproj 'TestProject'
|
227
|
+
# end
|
228
|
+
#
|
229
|
+
def xcodeproj(path, build_configurations = {})
|
230
|
+
@target_definition.user_project = UserProject.new(path, build_configurations)
|
231
|
+
end
|
232
|
+
|
233
|
+
# Specifies the target(s) in the user’s project that this Pods library
|
234
|
+
# should be linked in.
|
235
|
+
#
|
236
|
+
# If no explicit target is specified, then the Pods target will be linked
|
237
|
+
# with the first target in your project. So if you only have one target you
|
238
|
+
# do not need to specify the target to link with.
|
239
|
+
#
|
240
|
+
# @example
|
241
|
+
#
|
242
|
+
# # Link with a target called ‘MyApp’ (in the user's project).
|
243
|
+
# link_with 'MyApp'
|
244
|
+
#
|
245
|
+
# # Link with the targets in the user’s project called ‘MyApp’ and ‘MyOtherApp’.
|
246
|
+
# link_with ['MyApp', 'MyOtherApp']
|
247
|
+
#
|
248
|
+
def link_with(targets)
|
249
|
+
@target_definition.link_with = targets
|
60
250
|
end
|
61
251
|
|
62
252
|
# Specifies a dependency of the project.
|
@@ -156,8 +346,8 @@ module Pod
|
|
156
346
|
@target_definition.target_dependencies << Dependency.new(*name_and_version_requirements, &block)
|
157
347
|
end
|
158
348
|
|
159
|
-
# Specifies that a BridgeSupport metadata should be generated from
|
160
|
-
# headers of all installed Pods.
|
349
|
+
# Specifies that a BridgeSupport metadata document should be generated from
|
350
|
+
# the headers of all installed Pods.
|
161
351
|
#
|
162
352
|
# This is for scripting languages such as MacRuby, Nu, and JSCocoa, which use
|
163
353
|
# it to bridge types, functions, etc better.
|
@@ -193,7 +383,8 @@ module Pod
|
|
193
383
|
# dependency (JSONKit).
|
194
384
|
def target(name, options = {})
|
195
385
|
parent = @target_definition
|
196
|
-
|
386
|
+
options[:parent] = parent
|
387
|
+
@target_definitions[name] = @target_definition = TargetDefinition.new(name, options)
|
197
388
|
yield
|
198
389
|
ensure
|
199
390
|
@target_definition = parent
|
@@ -206,8 +397,8 @@ module Pod
|
|
206
397
|
#
|
207
398
|
# post_install do |installer|
|
208
399
|
# installer.project.targets.each do |target|
|
209
|
-
# target.
|
210
|
-
# config.
|
400
|
+
# target.build_configurations.each do |config|
|
401
|
+
# config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported'
|
211
402
|
# end
|
212
403
|
# end
|
213
404
|
# end
|
@@ -215,6 +406,19 @@ module Pod
|
|
215
406
|
@post_install_callback = block
|
216
407
|
end
|
217
408
|
|
409
|
+
# Specifies that the -fobjc-arc flag should be added to the OTHER_LD_FLAGS.
|
410
|
+
#
|
411
|
+
# This is used as a workaround for a compiler bug with non-ARC projects.
|
412
|
+
# (see https://github.com/CocoaPods/CocoaPods/issues/142)
|
413
|
+
#
|
414
|
+
# This was originally done automatically but libtool as of Xcode 4.3.2 no
|
415
|
+
# longer seems to support the -fobjc-arc flag. Therefore it now has to be
|
416
|
+
# enabled explicitly using this method.
|
417
|
+
#
|
418
|
+
# This may be removed in a future release.
|
419
|
+
def set_arc_compatibility_flag!
|
420
|
+
@set_arc_compatibility_flag = true
|
421
|
+
end
|
218
422
|
|
219
423
|
# Not attributes
|
220
424
|
|
@@ -226,7 +430,7 @@ module Pod
|
|
226
430
|
attr_reader :target_definitions
|
227
431
|
|
228
432
|
def dependencies
|
229
|
-
@target_definitions.values.map(&:target_dependencies).flatten
|
433
|
+
@target_definitions.values.map(&:target_dependencies).flatten.uniq
|
230
434
|
end
|
231
435
|
|
232
436
|
def dependency_by_top_level_spec_name(name)
|
@@ -237,15 +441,24 @@ module Pod
|
|
237
441
|
@generate_bridge_support
|
238
442
|
end
|
239
443
|
|
444
|
+
def set_arc_compatibility_flag?
|
445
|
+
@set_arc_compatibility_flag
|
446
|
+
end
|
447
|
+
|
448
|
+
def user_build_configurations
|
449
|
+
configs_array = @target_definitions.values.map { |td| td.user_project.build_configurations }
|
450
|
+
configs_array.inject({}) { |hash, config| hash.merge(config) }
|
451
|
+
end
|
452
|
+
|
240
453
|
def post_install!(installer)
|
241
454
|
@post_install_callback.call(installer) if @post_install_callback
|
242
455
|
end
|
243
456
|
|
244
457
|
def validate!
|
245
|
-
lines = []
|
246
|
-
lines << "* the `platform` attribute should be either `:osx` or `:ios`" unless @platform && [:osx, :ios].include?(@platform.name)
|
247
|
-
lines << "* no dependencies were specified, which is, well, kinda pointless" if dependencies.empty?
|
248
|
-
raise(Informative, (["The Podfile at `#{@defined_in_file}' is invalid:"] + lines).join("\n")) unless lines.empty?
|
458
|
+
#lines = []
|
459
|
+
#lines << "* the `platform` attribute should be either `:osx` or `:ios`" unless @platform && [:osx, :ios].include?(@platform.name)
|
460
|
+
#lines << "* no dependencies were specified, which is, well, kinda pointless" if dependencies.empty?
|
461
|
+
#raise(Informative, (["The Podfile at `#{@defined_in_file}' is invalid:"] + lines).join("\n")) unless lines.empty?
|
249
462
|
end
|
250
463
|
end
|
251
464
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'xcodeproj/project'
|
2
|
+
require 'xcodeproj/project/object/build_phase'
|
3
|
+
|
4
|
+
Xcodeproj::Project::Object::PBXCopyFilesBuildPhase.instance_eval do
|
5
|
+
def self.new_pod_dir(project, pod_name, path)
|
6
|
+
new(project, nil, {
|
7
|
+
"dstPath" => "Pods/#{path}",
|
8
|
+
"name" => "Copy #{pod_name} Public Headers",
|
9
|
+
})
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Pod
|
14
|
+
class Project < Xcodeproj::Project
|
15
|
+
def initialize(*)
|
16
|
+
super
|
17
|
+
main_group << groups.new('name' => 'Pods')
|
18
|
+
@user_build_configurations = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def user_build_configurations=(user_build_configurations)
|
22
|
+
@user_build_configurations = user_build_configurations
|
23
|
+
# The configurations at the top level only need to exist, they don't hold
|
24
|
+
# any build settings themselves, that's left to `add_pod_target`.
|
25
|
+
user_build_configurations.each do |name, _|
|
26
|
+
unless build_configurations.map(&:name).include?(name)
|
27
|
+
build_configurations.new('name' => name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Shortcut access to the `Pods' PBXGroup.
|
33
|
+
def pods
|
34
|
+
groups.find { |g| g.name == 'Pods' } || groups.new({ 'name' => 'Pods' })
|
35
|
+
end
|
36
|
+
|
37
|
+
# Adds a group as child to the `Pods' group.
|
38
|
+
def add_pod_group(name)
|
39
|
+
pods.groups.new('name' => name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_pod_target(name, platform)
|
43
|
+
target = targets.new_static_library(platform.name, name)
|
44
|
+
|
45
|
+
settings = {}
|
46
|
+
if platform.requires_legacy_ios_archs?
|
47
|
+
settings['ARCHS'] = "armv6 armv7"
|
48
|
+
end
|
49
|
+
if platform == :ios && platform.deployment_target
|
50
|
+
settings['IPHONEOS_DEPLOYMENT_TARGET'] = platform.deployment_target.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
target.build_settings('Debug').merge!(settings)
|
54
|
+
target.build_settings('Release').merge!(settings)
|
55
|
+
|
56
|
+
@user_build_configurations.each do |name, type|
|
57
|
+
unless target.build_configurations.map(&:name).include?(name)
|
58
|
+
config = target.build_configurations.new('name' => name)
|
59
|
+
# Copy the settings from either the Debug or the Release configuration.
|
60
|
+
config.build_settings = target.build_settings(type.to_s.capitalize).merge(settings)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
target
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/cocoapods/resolver.rb
CHANGED
@@ -1,51 +1,81 @@
|
|
1
|
+
require 'colored'
|
2
|
+
|
1
3
|
module Pod
|
2
4
|
class Resolver
|
3
|
-
|
4
|
-
|
5
|
+
include Config::Mixin
|
6
|
+
|
7
|
+
attr_reader :podfile, :sandbox
|
8
|
+
attr_accessor :cached_sets, :cached_sources
|
9
|
+
|
10
|
+
def initialize(podfile, sandbox)
|
11
|
+
@podfile = podfile
|
12
|
+
@sandbox = sandbox
|
13
|
+
@cached_sets = {}
|
14
|
+
@cached_sources = Source::Aggregate.new
|
15
|
+
@log_indent = 0;
|
5
16
|
end
|
6
17
|
|
7
18
|
def resolve
|
8
|
-
@
|
9
|
-
|
10
|
-
|
19
|
+
@specs = {}
|
20
|
+
targets_and_specs = {}
|
21
|
+
|
22
|
+
@podfile.target_definitions.values.each do |target_definition|
|
23
|
+
puts "\nResolving dependencies for target `#{target_definition.name}' (#{target_definition.platform})".green if config.verbose?
|
24
|
+
@loaded_specs = []
|
25
|
+
find_dependency_specs(@podfile, target_definition.dependencies, target_definition)
|
26
|
+
targets_and_specs[target_definition] = @specs.values_at(*@loaded_specs).sort_by(&:name)
|
27
|
+
end
|
28
|
+
|
29
|
+
@specs.values.sort_by(&:name)
|
30
|
+
targets_and_specs
|
11
31
|
end
|
12
32
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def find_cached_set(dependency, platform)
|
36
|
+
set_name = dependency.name.split('/').first
|
37
|
+
@cached_sets[set_name] ||= begin
|
38
|
+
if dependency.specification
|
39
|
+
Specification::Set::External.new(dependency.specification)
|
40
|
+
elsif external_source = dependency.external_source
|
41
|
+
# The platform isn't actually being used by the LocalPod instance
|
42
|
+
# that's being used behind the scenes, but passing it anyways for
|
43
|
+
# completeness sake.
|
44
|
+
specification = external_source.specification_from_sandbox(@sandbox, platform)
|
45
|
+
set = Specification::Set::External.new(specification)
|
22
46
|
if dependency.subspec_dependency?
|
23
|
-
|
47
|
+
@cached_sets[dependency.top_level_spec_name] ||= set
|
24
48
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@loaded_spec_names << spec.name
|
29
|
-
@specs << spec
|
30
|
-
@sets << set unless @sets.include?(set)
|
31
|
-
|
32
|
-
find_dependency_sets(spec)
|
49
|
+
set
|
50
|
+
else
|
51
|
+
@cached_sources.search(dependency)
|
33
52
|
end
|
34
53
|
end
|
35
54
|
end
|
36
55
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
56
|
+
def find_dependency_specs(dependent_specification, dependencies, target_definition)
|
57
|
+
@log_indent += 1
|
58
|
+
dependencies.each do |dependency|
|
59
|
+
puts ' ' * @log_indent + "- #{dependency}" if config.verbose?
|
60
|
+
set = find_cached_set(dependency, target_definition.platform)
|
61
|
+
set.required_by(dependent_specification)
|
62
|
+
# Ensure we don't resolve the same spec twice for one target
|
63
|
+
unless @loaded_specs.include?(dependency.name)
|
64
|
+
spec = set.specification_by_name(dependency.name)
|
65
|
+
@loaded_specs << spec.name
|
66
|
+
@specs[spec.name] = spec
|
67
|
+
spec.activate_platform(target_definition.platform)
|
68
|
+
# And recursively load the dependencies of the spec.
|
69
|
+
find_dependency_specs(spec, spec.dependencies, target_definition) if spec.dependencies
|
70
|
+
end
|
71
|
+
validate_platform!(spec || @specs[dependency.name], target_definition)
|
42
72
|
end
|
73
|
+
@log_indent -= 1
|
43
74
|
end
|
44
75
|
|
45
|
-
def validate_platform!(spec)
|
46
|
-
unless spec.
|
47
|
-
raise Informative, "The platform
|
48
|
-
"does not match that of #{spec} (:#{spec.platform})"
|
76
|
+
def validate_platform!(spec, target)
|
77
|
+
unless spec.available_platforms.any? { |platform| target.platform.supports?(platform) }
|
78
|
+
raise Informative, "[!] The platform of the target `#{target.name}' (#{target.platform}) is not compatible with `#{spec}' which has a minimun requirement of #{spec.available_platforms.join(' - ')}.".red
|
49
79
|
end
|
50
80
|
end
|
51
81
|
end
|