From 04b8f2bc3b89df6e6edef2e45c8a848f3fef7382 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 09:40:02 +0100 Subject: [PATCH 1/6] Work around permission problem on Github Actions It is not reproducible locally. --- recipes/unpack/50-install-msys-packages.rake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recipes/unpack/50-install-msys-packages.rake b/recipes/unpack/50-install-msys-packages.rake index 99cd31a7..1ce9197a 100644 --- a/recipes/unpack/50-install-msys-packages.rake +++ b/recipes/unpack/50-install-msys-packages.rake @@ -25,5 +25,9 @@ file ruby_exe => [self.repo_added] do rescue => err $stderr.puts "ignoring error while adjusting permissions: #{err} (#{err.class})" end - touch ruby_exe + # Fails on Windows-on-Arm on Github with: + # Errno::EACCES: Permission denied @ utime_failed - recipes/unpack/ruby-head-arm-ucrt/clangarm64/bin/ruby.exe (Errno::EACCES) + unless ENV["GITHUB_ACTIONS"] == "true" && ENV["RUNNER_ARCH"] == "ARM64" + touch ruby_exe + end end From edc6305f7b924ff9335d41508e784d04680acaea Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 09:40:49 +0100 Subject: [PATCH 2/6] Remove gcc from testgem dependencies gcc is not yet available for mingw-w64-clang-aarch64 --- test/helper/testgem/testgem.gemspec | 2 +- test/helper/testgem/testgem2.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/helper/testgem/testgem.gemspec b/test/helper/testgem/testgem.gemspec index 2bd0ab3e..534febe0 100644 --- a/test/helper/testgem/testgem.gemspec +++ b/test/helper/testgem/testgem.gemspec @@ -14,5 +14,5 @@ Gem::Specification.new do |s| s.executables = ["testgem-exe"] s.required_ruby_version = '>= 2.1.0' s.metadata['msys2_dependencies'] = 'ed>=1.0' - s.metadata['msys2_mingw_dependencies'] = 'libguess>=1.0 gcc>=8.0' + s.metadata['msys2_mingw_dependencies'] = 'libguess>=1.0' end diff --git a/test/helper/testgem/testgem2.gemspec b/test/helper/testgem/testgem2.gemspec index 50647ec1..e6be5d7f 100644 --- a/test/helper/testgem/testgem2.gemspec +++ b/test/helper/testgem/testgem2.gemspec @@ -11,5 +11,5 @@ Gem::Specification.new do |s| s.license = 'BSD-3-Clause' s.require_paths << 'lib' s.required_ruby_version = '>= 2.1.0' - s.metadata['msys2_mingw_dependencies'] = 'libidn2 gcc>=8.0' + s.metadata['msys2_mingw_dependencies'] = 'libidn2' end From 38603e0bc2cb17f2574706b5f9567fdde840b880 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 19:22:25 +0100 Subject: [PATCH 3/6] Adjust tests for Windows on Arm --- test/ruby_installer/test_module.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/ruby_installer/test_module.rb b/test/ruby_installer/test_module.rb index b8a0032a..ab017d34 100644 --- a/test/ruby_installer/test_module.rb +++ b/test/ruby_installer/test_module.rb @@ -74,6 +74,7 @@ def test_enable_msys_apps_with_msys_installed when "x64-mingw32" then "MINGW64" when "x64-mingw-ucrt" then "UCRT64" when "i386-mingw32" then "MINGW32" + when "aarch64-mingw-ucrt" then "CLANGARM64" end assert_equal msystem, ENV['MSYSTEM'], "enable_msys_apps should set MSYSTEM according to RUBY_PLATFORM" assert_match(/./, ENV['LANG'], "enable_msys_apps should set LANG") @@ -135,6 +136,8 @@ def test_iterate_msys_paths assert_equal( min_paths, paths & min_paths ) end + LIBCPP_DLL = RUBY_PLATFORM =~ /aarch64/ ? "libc++" : "libstdc++-6" + def test_enable_dll_search_paths_with_msys_installed skip unless File.directory?(msys_path) remove_mingwdir @@ -143,12 +146,12 @@ def test_enable_dll_search_paths_with_msys_installed # Double calling shouldn't matter RubyInstaller::Runtime.enable_dll_search_paths RubyInstaller::Runtime.enable_dll_search_paths - Fiddle.dlopen("libstdc++-6").close + Fiddle.dlopen(LIBCPP_DLL).close remove_mingwdir # PATH based DLL search makes reliable anti-pattern impossible unless ENV['RI_FORCE_PATH_FOR_DLL'] == '1' assert_raises(Fiddle::DLError) do - Fiddle.dlopen("libstdc++-6").close + Fiddle.dlopen(LIBCPP_DLL).close end end @@ -162,7 +165,7 @@ def test_enable_dll_search_paths_without_msys_installed RubyInstaller::Runtime.enable_dll_search_paths unless ENV['RI_FORCE_PATH_FOR_DLL'] == '1' # PATH based DLL search makes reliable anti-pattern impossible assert_raises(Fiddle::DLError, "enable_dll_search_paths should succeed, but without effect") do - Fiddle.dlopen("libstdc++-6").close + Fiddle.dlopen(LIBCPP_DLL).close end end end From ea5d2379537eed604663fbce0fea3e16d4aa32fe Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 19:59:28 +0100 Subject: [PATCH 4/6] CI: Run build for aarch64-mingw-ucrt on ARM hosts and enable tests on that platform. --- .github/workflows/ci.yml | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc591d88..e7bd365d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,53 +19,69 @@ jobs: arch: "x86-msvcrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_4_7 + runon: windows-latest - target_ruby: "3.4.7" arch: "x64-ucrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_4_7 + runon: windows-latest - target_ruby: "3.4.7" arch: "arm-ucrt" - build_ruby: "3.3.9/x64" + build_ruby: "3.4.7/x64" run_mri_spec: v3_4_7 + runon: windows-11-arm - target_ruby: "3.3.10" arch: "x86-msvcrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_3_10 + runon: windows-latest - target_ruby: "3.3.10" arch: "x64-ucrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_3_10 + runon: windows-latest - target_ruby: "3.2.9" arch: "x86-msvcrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_2_9 + runon: windows-latest - target_ruby: "3.2.9" arch: "x64-ucrt" build_ruby: "3.3.9/x64" run_mri_spec: v3_2_9 + runon: windows-latest - target_ruby: "head" arch: "x64-ucrt" build_ruby: "3.3.9/x64" run_mri_spec: master + runon: windows-latest - target_ruby: "head" arch: "x86-msvcrt" build_ruby: "3.3.9/x64" run_mri_spec: master + runon: windows-latest - target_ruby: "head" arch: "arm-ucrt" build_ruby: "3.3.9/x64" run_mri_spec: master + runon: windows-latest - runs-on: windows-latest + - target_ruby: "head" + arch: "arm-ucrt" + build_ruby: "3.4.7/x64" + run_mri_spec: master + runon: windows-11-arm + + runs-on: ${{ matrix.runon }} env: arch: ${{ matrix.arch }} target_ruby: ${{ matrix.target_ruby }} @@ -85,6 +101,15 @@ jobs: - name: fetch tag annotations run: git fetch --force --tags + - name: Install base ruby + if: matrix.arch == 'arm-ucrt' + shell: powershell + run: | + $(new-object net.webclient).DownloadFile("https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.4.7-1/rubyinstaller-devkit-3.4.7-1-x64.exe", "$pwd/ruby-setup.exe") + cmd /c ruby-setup.exe /verysilent /currentuser /dir=C:/hostedtoolcache/windows/Ruby/${{ matrix.build_ruby }} + New-Item -Path c:/msys64 -ItemType Junction -Value C:/hostedtoolcache/windows/Ruby/${{ matrix.build_ruby }}/msys64 + ridk install 1 3 + - run: ruby --version - name: extract GIT_REF_TAG shell: cmd @@ -113,7 +138,7 @@ jobs: run: gem install bundler --conservative --no-doc - name: Install alternative ruby - if: matrix.arch == 'x64-msvcrt' || matrix.arch == 'x64-ucrt' + if: matrix.arch == 'x64-msvcrt' || matrix.arch == 'x64-ucrt' || matrix.arch == 'arm-ucrt' shell: powershell run: | $(new-object net.webclient).DownloadFile("https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.7-1/rubyinstaller-3.0.7-1-x86.exe", "$pwd/ruby-setup.exe") @@ -173,7 +198,6 @@ jobs: - name: Activate the environment variables set by the installer # but exclude git's /usr/bin, because it conflicts with one RubyInstaller test. - if: matrix.arch != 'arm-ucrt' shell: powershell run: | $env:PATH = [Environment]::GetEnvironmentVariable("PATH","Machine") -replace ";C:\\Program Files\\Git\\usr\\bin" -replace ";C:\\Ruby193\\bin" @@ -199,7 +223,6 @@ jobs: run: ridk exec sh -c "mkdir -pv ~" - name: Install dependent gems - if: matrix.arch != 'arm-ucrt' shell: cmd run: | IF "%target_ruby%" LSS "2.6" ( gem update --system && gem install bundler --force ) @@ -216,7 +239,6 @@ jobs: run: ridk exec sh -c "pacman --noconfirm --sync --needed ${MINGW_PACKAGE_PREFIX}-gcc-libs" - name: Run all tests against the new installed Ruby - if: matrix.arch != 'arm-ucrt' shell: cmd run: | chcp 437 @@ -235,7 +257,6 @@ jobs: rake release:appveyor_upload -- packages/ri/recipes/installer-inno/%DEPLOY_TAG%*.exe packages/ri/recipes/archive-7z/%DEPLOY_TAG%*.7z packages/ri-msys/recipes/installer-inno/ruby*-%target_ruby%*.exe - name: Run the Ruby Spec Suite - if: matrix.arch != 'arm-ucrt' shell: pwsh run: | # Actions uses UTF8, causes test failures, similar to normal OS setup @@ -250,7 +271,6 @@ jobs: } - name: Run the MRI copy of Ruby Spec Suite - if: matrix.arch != 'arm-ucrt' shell: pwsh run: | # Actions uses UTF8, causes test failures, similar to normal OS setup From 97d066402579b10b047f88e8281b0a9e54c70b46 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 21:01:05 +0100 Subject: [PATCH 5/6] CI: Update build rubies --- .github/workflows/ci.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7bd365d..9c907b9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,12 +69,6 @@ jobs: run_mri_spec: master runon: windows-latest - - target_ruby: "head" - arch: "arm-ucrt" - build_ruby: "3.3.9/x64" - run_mri_spec: master - runon: windows-latest - - target_ruby: "head" arch: "arm-ucrt" build_ruby: "3.4.7/x64" @@ -110,7 +104,9 @@ jobs: New-Item -Path c:/msys64 -ItemType Junction -Value C:/hostedtoolcache/windows/Ruby/${{ matrix.build_ruby }}/msys64 ridk install 1 3 - - run: ruby --version + - run: | + dir C:/hostedtoolcache/windows/Ruby/ + ruby --version - name: extract GIT_REF_TAG shell: cmd run: ruby -e 'ENV["GITHUB_REF"].sub(/refs\/tags\/(.*)/){ puts "GIT_REF_TAG="+$1 }' >>%GITHUB_ENV% From 2e32bf6416eb8a2f618956d6694925ac165e3c73 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 7 Nov 2025 21:20:41 +0100 Subject: [PATCH 6/6] Development of ruby-4.0.0 started https://github.com/ruby/ruby/commit/6d81969b475262aba251e99b518181bdf7c5a523 --- packages/ri-msys/Rakefile | 4 ++-- packages/ri/Rakefile | 4 ++-- recipes/sandbox/10-define-variables.rake | 2 +- recipes/sandbox/rubyinstaller-head-arm-ucrt.files | 4 ++-- recipes/sandbox/rubyinstaller-head-x64-msvcrt.files | 4 ++-- recipes/sandbox/rubyinstaller-head-x64-ucrt.files | 4 ++-- recipes/sandbox/rubyinstaller-head-x86-msvcrt.files | 4 ++-- recipes/sandbox/rubyinstaller-head.files | 12 ++++++------ 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/ri-msys/Rakefile b/packages/ri-msys/Rakefile index ac357c22..cfa8528e 100644 --- a/packages/ri-msys/Rakefile +++ b/packages/ri-msys/Rakefile @@ -11,8 +11,8 @@ class RubyPackage < RubyInstaller::Build::Openstruct self.rubyver, self.pkgrel = packagever.split("-", 2) self.packagename = "rubyinstaller-devkit" - self.rubyver2 = packagever=='head' ? "3.5" : rubyver[ /^\d+\.\d+/ ] - self.rubylibver = packagever=='head' ? "#{rubyver2}.0+4" : "#{rubyver2}.0" + self.rubyver2 = packagever=='head' ? "4.0" : rubyver[ /^\d+\.\d+/ ] + self.rubylibver = packagever=='head' ? "#{rubyver2}.0+0" : "#{rubyver2}.0" case arch when 'x64-ucrt' diff --git a/packages/ri/Rakefile b/packages/ri/Rakefile index f60f6dfb..7cfe2fb2 100644 --- a/packages/ri/Rakefile +++ b/packages/ri/Rakefile @@ -11,8 +11,8 @@ class RubyPackage < RubyInstaller::Build::Openstruct self.rubyver, self.pkgrel = packagever.split("-", 2) self.packagename = "rubyinstaller" - self.rubyver2 = packagever=='head' ? "3.5" : rubyver[ /^\d+\.\d+/ ] - self.rubylibver = packagever=='head' ? "#{rubyver2}.0+4" : "#{rubyver2}.0" + self.rubyver2 = packagever=='head' ? "4.0" : rubyver[ /^\d+\.\d+/ ] + self.rubylibver = packagever=='head' ? "#{rubyver2}.0+0" : "#{rubyver2}.0" case arch when 'x64-ucrt' diff --git a/recipes/sandbox/10-define-variables.rake b/recipes/sandbox/10-define-variables.rake index 8dcb58c2..74dc1eff 100644 --- a/recipes/sandbox/10-define-variables.rake +++ b/recipes/sandbox/10-define-variables.rake @@ -14,6 +14,6 @@ end self.fiddle_so_path = case when package.rubyver2 == "3.4" "lib/ruby/#{package.rubylibver}/#{package.ruby_arch}/fiddle.so" - when package.rubyver2 == "3.5" + when package.rubyver2 == "4.0" "lib/ruby/gems/#{package.rubylibver}/extensions/#{package.ruby_arch.sub(/i.86-mingw/, "x86-mingw")}/#{package.rubylibver}/fiddle-1.1.8/fiddle.so" end diff --git a/recipes/sandbox/rubyinstaller-head-arm-ucrt.files b/recipes/sandbox/rubyinstaller-head-arm-ucrt.files index 7558aaf3..536f8077 100644 --- a/recipes/sandbox/rubyinstaller-head-arm-ucrt.files +++ b/recipes/sandbox/rubyinstaller-head-arm-ucrt.files @@ -1,4 +1,4 @@ bin/libcrypto-3.dll bin/libssl-3.dll -bin/aarch64-ucrt-ruby350.dll -lib/libaarch64-ucrt-ruby350.dll.a +bin/aarch64-ucrt-ruby400.dll +lib/libaarch64-ucrt-ruby400.dll.a diff --git a/recipes/sandbox/rubyinstaller-head-x64-msvcrt.files b/recipes/sandbox/rubyinstaller-head-x64-msvcrt.files index ff792ff9..20ea30f4 100644 --- a/recipes/sandbox/rubyinstaller-head-x64-msvcrt.files +++ b/recipes/sandbox/rubyinstaller-head-x64-msvcrt.files @@ -1,5 +1,5 @@ bin/libcrypto-3-x64.dll bin/libgcc_s_seh-1.dll bin/libssl-3-x64.dll -bin/x64-msvcrt-ruby350.dll -lib/libx64-msvcrt-ruby350.dll.a +bin/x64-msvcrt-ruby400.dll +lib/libx64-msvcrt-ruby400.dll.a diff --git a/recipes/sandbox/rubyinstaller-head-x64-ucrt.files b/recipes/sandbox/rubyinstaller-head-x64-ucrt.files index d729f206..04693ef3 100644 --- a/recipes/sandbox/rubyinstaller-head-x64-ucrt.files +++ b/recipes/sandbox/rubyinstaller-head-x64-ucrt.files @@ -1,5 +1,5 @@ bin/libcrypto-3-x64.dll bin/libgcc_s_seh-1.dll bin/libssl-3-x64.dll -bin/x64-ucrt-ruby350.dll -lib/libx64-ucrt-ruby350.dll.a +bin/x64-ucrt-ruby400.dll +lib/libx64-ucrt-ruby400.dll.a diff --git a/recipes/sandbox/rubyinstaller-head-x86-msvcrt.files b/recipes/sandbox/rubyinstaller-head-x86-msvcrt.files index d28eadf5..8c62f571 100644 --- a/recipes/sandbox/rubyinstaller-head-x86-msvcrt.files +++ b/recipes/sandbox/rubyinstaller-head-x86-msvcrt.files @@ -1,5 +1,5 @@ bin/libcrypto-3.dll bin/libgcc_s_dw2-1.dll bin/libssl-3.dll -bin/msvcrt-ruby350.dll -lib/libmsvcrt-ruby350.dll.a +bin/msvcrt-ruby400.dll +lib/libmsvcrt-ruby400.dll.a diff --git a/recipes/sandbox/rubyinstaller-head.files b/recipes/sandbox/rubyinstaller-head.files index 7d823152..80fb30d3 100644 --- a/recipes/sandbox/rubyinstaller-head.files +++ b/recipes/sandbox/rubyinstaller-head.files @@ -27,11 +27,11 @@ bin/libyaml-0-2.dll bin/ruby.exe bin/rubyw.exe bin/zlib1.dll -include/ruby-3.5.0+4 -lib/pkgconfig/ruby-3.5.pc -lib/ruby/3.5.0+4 -lib/ruby/gems/3.5.0+4 -lib/ruby/site_ruby/3.5.0+4 -lib/ruby/vendor_ruby/3.5.0+4 +include/ruby-4.0.0+0 +lib/pkgconfig/ruby-4.0.pc +lib/ruby/4.0.0+0 +lib/ruby/gems/4.0.0+0 +lib/ruby/site_ruby/4.0.0+0 +lib/ruby/vendor_ruby/4.0.0+0 share/doc/ruby/html/ share/ri/