summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tasks/mrbgem_spec.rake25
-rw-r--r--tasks/mrbgems.rake2
2 files changed, 24 insertions, 3 deletions
diff --git a/tasks/mrbgem_spec.rake b/tasks/mrbgem_spec.rake
index 1a399be73..ffcf79032 100644
--- a/tasks/mrbgem_spec.rake
+++ b/tasks/mrbgem_spec.rake
@@ -94,9 +94,10 @@ module MRuby
end
def add_dependency(name, *requirements)
+ default_gem = requirements.last.kind_of?(Hash) ? requirements.pop : nil
requirements = ['>= 0.0.0'] if requirements.empty?
requirements.flatten!
- @dependencies << {:gem => name, :requirements => requirements}
+ @dependencies << {:gem => name, :requirements => requirements, :default => default_gem}
end
def self.bin=(bin)
@@ -282,9 +283,29 @@ module MRuby
@ary.empty?
end
- def check
+ def check(build)
gem_table = @ary.reduce({}) { |res,v| res[v.name] = v; res }
+ default_gems = []
+ each do |g|
+ g.dependencies.each do |dep|
+ default_gems << dep if dep[:default] and not gem_table.key? dep[:gem]
+ end
+ end
+
+ until default_gems.empty?
+ def_gem = default_gems.pop
+
+ spec = build.gem def_gem[:default]
+ fail "Invalid gem name: #{spec.name} (Expected: #{def_gem[:gem]})" if spec.name != def_gem[:gem]
+ spec.setup
+
+ spec.dependencies.each do |dep|
+ default_gems << dep if dep[:default] and not gem_table.key? dep[:gem]
+ end
+ gem_table[spec.name] = spec
+ end
+
each do |g|
g.dependencies.each do |dep|
name = dep[:gem]
diff --git a/tasks/mrbgems.rake b/tasks/mrbgems.rake
index d8f56f88e..b57f318e0 100644
--- a/tasks/mrbgems.rake
+++ b/tasks/mrbgems.rake
@@ -2,7 +2,7 @@ MRuby.each_target do
if enable_gems?
# set up all gems
gems.each(&:setup)
- gems.check
+ gems.check self
# loader all gems
self.libmruby << objfile("#{build_dir}/mrbgems/gem_init")