From 004fe0b142f168560e9b103fe38ac9ffcc115a60 Mon Sep 17 00:00:00 2001 From: dearblue Date: Thu, 11 Sep 2025 22:53:03 +0900 Subject: [PATCH] Set up all GEMS before mruby core tasks definition Until now, GEMs dependent on GEMs described in the build configuration file were loaded and set up after mruby core tasks were defined. This caused an issue where, if C++ exceptions were enabled later by a dependent GEM, the necessary tasks for mruby core were not defined. fixed https://github.com/mruby/mruby/issues/6615 --- Rakefile | 5 +++++ lib/mruby/gem.rb | 17 ++++++++++++++++- tasks/mrbgems.rake | 2 -- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index 4422f9688..5d8ba4945 100644 --- a/Rakefile +++ b/Rakefile @@ -17,6 +17,11 @@ require "mruby/build" MRUBY_CONFIG = MRuby::Build.mruby_config_path load MRUBY_CONFIG +# set up all gems +MRuby.each_target do + gems.setup(self) if enable_gems? +end + # load basic rules MRuby.each_target do |build| build.define_rules diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index 619621e7b..a11c9feda 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -401,7 +401,16 @@ module MRuby end end - def generate_gem_table build + def setup(build) + gemset = nil + begin + gemset_prev = gemset + self.each(&:setup) + gemset = self.setup_dependencies(build).keys.sort + end until gemset == gemset_prev + end + + def setup_dependencies(build) gem_table = each_with_object({}) { |spec, h| h[spec.name] = spec } default_gems = {} @@ -424,6 +433,12 @@ module MRuby end end + gem_table + end + + def generate_gem_table(build) + gem_table = setup_dependencies(build) + each do |g| g.dependencies.each do |dep| name = dep[:gem] diff --git a/tasks/mrbgems.rake b/tasks/mrbgems.rake index 272d476e6..291bea615 100644 --- a/tasks/mrbgems.rake +++ b/tasks/mrbgems.rake @@ -2,8 +2,6 @@ MRuby.each_target do active_gems_txt = "#{build_dir}/mrbgems/active_gems.txt" if enable_gems? - # set up all gems - gems.each(&:setup) gems.check self # loader all gems