From feca90ceab0a5716cfe87b79b5ad7d91e16f72ad Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 16 Oct 2025 18:20:32 +0900 Subject: [PATCH] hal: fix selection to use toolchain instead of RUBY_PLATFORM when building with MSVC on Windows, RUBY_PLATFORM (from the Ruby installation running rake) may indicate "mingw" if Ruby was installed via RubyInstaller, causing incorrect selection of POSIX HALs instead of Windows HALs. fixed by checking spec.build.primary_toolchain first: - if toolchain is "visualcpp", select Windows HALs - otherwise fall through to existing platform checks this ensures MSVC builds use hal-win-* gems even when Ruby itself was installed with MinGW. affected gems: - mruby-dir - mruby-io - mruby-socket - mruby-task Co-authored-by: Claude --- mrbgems/mruby-dir/mrbgem.rake | 3 +++ mrbgems/mruby-io/mrbgem.rake | 9 ++++++--- mrbgems/mruby-socket/mrbgem.rake | 9 +++++++-- mrbgems/mruby-task/mrbgem.rake | 9 +++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-dir/mrbgem.rake b/mrbgems/mruby-dir/mrbgem.rake index 537b7ffa2..e1ae90bf3 100644 --- a/mrbgems/mruby-dir/mrbgem.rake +++ b/mrbgems/mruby-dir/mrbgem.rake @@ -9,6 +9,9 @@ MRuby::Gem::Specification.new('mruby-dir') do |spec| # MinGW provides POSIX compatibility, so use hal-posix-dir suggested_hal = if ENV['MRUBY_DIR_HAL'] ENV['MRUBY_DIR_HAL'] + elsif spec.build.primary_toolchain == 'visualcpp' + # Visual C++ on Windows - use native Windows HAL + 'hal-win-dir' elsif RUBY_PLATFORM =~ /linux|darwin|bsd|mingw/ || (spec.build.kind_of?(MRuby::CrossBuild) && spec.build.host_target =~ /mingw/) || spec.cc.command.to_s =~ /mingw/ diff --git a/mrbgems/mruby-io/mrbgem.rake b/mrbgems/mruby-io/mrbgem.rake index 9f9ce4838..fa3c5a9b1 100644 --- a/mrbgems/mruby-io/mrbgem.rake +++ b/mrbgems/mruby-io/mrbgem.rake @@ -11,9 +11,12 @@ MRuby::Gem::Specification.new('mruby-io') do |spec| spec.build.gems.one? { |g| g.name =~ /^hal-.*-io$/ } or begin # No HAL found - determine appropriate error message or auto-load # MinGW provides POSIX compatibility, so use hal-posix-io - suggested_hal = if RUBY_PLATFORM =~ /linux|darwin|bsd|mingw/ || - (spec.build.kind_of?(MRuby::CrossBuild) && spec.build.host_target =~ /mingw/) || - spec.cc.command.to_s =~ /mingw/ + suggested_hal = if spec.build.primary_toolchain == 'visualcpp' + # Visual C++ on Windows - use native Windows HAL + 'hal-win-io' + elsif RUBY_PLATFORM =~ /linux|darwin|bsd|mingw/ || + (spec.build.kind_of?(MRuby::CrossBuild) && spec.build.host_target =~ /mingw/) || + spec.cc.command.to_s =~ /mingw/ 'hal-posix-io' elsif spec.for_windows? 'hal-win-io' diff --git a/mrbgems/mruby-socket/mrbgem.rake b/mrbgems/mruby-socket/mrbgem.rake index 0702f5e0d..3f383e793 100644 --- a/mrbgems/mruby-socket/mrbgem.rake +++ b/mrbgems/mruby-socket/mrbgem.rake @@ -13,10 +13,15 @@ MRuby::Gem::Specification.new('mruby-socket') do |spec| # HAL gems must be explicitly specified in build config (recommended) or via auto-selection below spec.build.gems.one? { |g| g.name =~ /^hal-.*-socket$/ } or begin # No HAL found - determine appropriate error message or auto-load - suggested_hal = if spec.for_windows? + suggested_hal = if spec.build.primary_toolchain == 'visualcpp' + # Visual C++ on Windows - use native Windows HAL 'hal-win-socket' - elsif RUBY_PLATFORM =~ /linux|darwin|bsd/ + elsif RUBY_PLATFORM =~ /linux|darwin|bsd|mingw/ || + (spec.build.kind_of?(MRuby::CrossBuild) && spec.build.host_target =~ /mingw/) || + spec.cc.command.to_s =~ /mingw/ 'hal-posix-socket' + elsif spec.for_windows? + 'hal-win-socket' else nil end diff --git a/mrbgems/mruby-task/mrbgem.rake b/mrbgems/mruby-task/mrbgem.rake index b82351ce2..e14a8c9d6 100644 --- a/mrbgems/mruby-task/mrbgem.rake +++ b/mrbgems/mruby-task/mrbgem.rake @@ -10,10 +10,15 @@ MRuby::Gem::Specification.new('mruby-task') do |spec| # HAL gems must be explicitly specified in build config (recommended) or via auto-selection below spec.build.gems.one? { |g| g.name =~ /^hal-.*-task$/ } or begin # No HAL found - determine appropriate error message or auto-load - suggested_hal = if spec.for_windows? + suggested_hal = if spec.build.primary_toolchain == 'visualcpp' + # Visual C++ on Windows - use native Windows HAL 'hal-win-task' - elsif RUBY_PLATFORM =~ /linux|darwin|bsd/ + elsif RUBY_PLATFORM =~ /linux|darwin|bsd|mingw/ || + (spec.build.kind_of?(MRuby::CrossBuild) && spec.build.host_target =~ /mingw/) || + spec.cc.command.to_s =~ /mingw/ 'hal-posix-task' + elsif spec.for_windows? + 'hal-win-task' else nil end