From cb14920bd627c30bd16d8d2517f2b142828f85f2 Mon Sep 17 00:00:00 2001 From: Mikel Olasagasti Uranga Date: Sun, 12 Oct 2025 22:03:48 +0200 Subject: [PATCH 01/22] Support RHEL 9+/Fedora 34+ CA bundle path Detect /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem used in modern RHEL and Fedora systems. Also improve the error message when no system CA bundle is found. Signed-off-by: Mikel Olasagasti Uranga --- bin/ruby-build | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bin/ruby-build b/bin/ruby-build index 9067e572..32bfea22 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -1274,6 +1274,11 @@ build_package_openssl() { # Extract root certs from the system keychain in .pem format. security find-certificate -a -p /Library/Keychains/System.keychain > "$pem_file" security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file" + elif [ -e /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]; then # RHEL 9+, Fedora 34+ + # See https://fedoraproject.org/wiki/Changes/droppingOfCertPemFile + rm -rf "$OPENSSLDIR/certs" "$pem_file" + ln -s /etc/pki/ca-trust/extracted/pem/ "$OPENSSLDIR/certs" + ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem "$pem_file" elif [ -e /etc/pki/tls/cert.pem ]; then # RedHat # See https://github.com/rubygems/rubygems/issues/2415#issuecomment-509806259 rm -rf "$OPENSSLDIR/certs" "$pem_file" @@ -1293,7 +1298,10 @@ build_package_openssl() { ln -snf "$SYSTEM_OPENSSLDIR/certs" "$OPENSSLDIR/certs" fi else - echo "Could not find OpenSSL certificates" >&2 + { colorize 1 "ERROR" + echo "Could not find OpenSSL certificates on this system." + echo "You may need to install the 'ca-certificates' package or 'openssl' for your distribution." + } >&2 exit 1 fi } From 7858b1231d2d8390544e971a4f3476dc8b68d87f Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 26 Mar 2026 12:38:50 +0900 Subject: [PATCH 02/22] Fix OpenSSL version requirement in update-cruby for Ruby 4.x Ruby >= 4.0 requires OpenSSL >= 1.1.1, but the script hardcoded needs_openssl:1.0.2-3.x.x for all versions. Add version-based condition to use needs_openssl:1.1.1-3.x.x for Ruby 4.x and later. Ref: https://github.com/rbenv/ruby-build/pull/2608 Co-Authored-By: Claude Opus 4.6 (1M context) --- script/update-cruby | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/script/update-cruby b/script/update-cruby index f53486ff..bc65a50f 100755 --- a/script/update-cruby +++ b/script/update-cruby @@ -36,7 +36,14 @@ else exit 1 fi +major_version=$(echo ${version} | cut -d '.' -f 1) +if [ "$major_version" -ge 4 ]; then + needs_openssl="needs_openssl:1.1.1-3.x.x" +else + needs_openssl="needs_openssl:1.0.2-3.x.x" +fi + cat > "$file" < Date: Thu, 26 Mar 2026 13:46:30 +0100 Subject: [PATCH 03/22] Darwin-x86_64 is no longer supported on TruffleRuby * See https://github.com/truffleruby/truffleruby/issues/4011 --- script/update-truffleruby | 4 ---- share/ruby-build/truffleruby+graalvm-dev | 3 --- share/ruby-build/truffleruby-dev | 3 --- 3 files changed, 10 deletions(-) diff --git a/script/update-truffleruby b/script/update-truffleruby index 4b5a5de3..2161bb40 100755 --- a/script/update-truffleruby +++ b/script/update-truffleruby @@ -35,10 +35,6 @@ Linux-aarch64) EOS add_platform "linux-aarch64" cat >> "$file" <> "$file" < Date: Thu, 26 Mar 2026 23:58:29 +0000 Subject: [PATCH 04/22] Added 3.2.11 with OpenSSL 3.0.19 --- share/ruby-build/3.2.11 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 share/ruby-build/3.2.11 diff --git a/share/ruby-build/3.2.11 b/share/ruby-build/3.2.11 new file mode 100644 index 00000000..3004b411 --- /dev/null +++ b/share/ruby-build/3.2.11 @@ -0,0 +1,2 @@ +install_package "openssl-3.0.19" "https://github.com/openssl/openssl/releases/download/openssl-3.0.19/openssl-3.0.19.tar.gz#fa5a4143b8aae18be53ef2f3caf29a2e0747430b8bc74d32d88335b94ab63072" openssl --if needs_openssl:1.0.2-3.x.x +install_package "ruby-3.2.11" "https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.tar.gz#b3eeabd6636f334531db3ffdc3229eb05e524740e6c84fdc043720573cf2f8b2" enable_shared standard From d099da05144d9f703c27cadd7b710f35f15dfadb Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Fri, 27 Mar 2026 09:13:23 +0900 Subject: [PATCH 05/22] ruby-build 20260327 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index db70ab66..480973f6 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -16,7 +16,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260326" +RUBY_BUILD_VERSION="20260327" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 7737ecc5..0cad7c5a 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -4,10 +4,10 @@ .\" Generator: Asciidoctor 2.0.26 .\" Date: 2024-09-24 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260326 +.\" Source: ruby-build 20260327 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-24" "ruby\-build 20260326" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2024-09-24" "ruby\-build 20260327" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From 0bdc2c78d0d05bb1678c85d71e57330a3332af55 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 6 Apr 2026 13:28:14 -0500 Subject: [PATCH 06/22] Add JRuby 10.0.5.0 --- share/ruby-build/jruby-10.0.5.0 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 share/ruby-build/jruby-10.0.5.0 diff --git a/share/ruby-build/jruby-10.0.5.0 b/share/ruby-build/jruby-10.0.5.0 new file mode 100644 index 00000000..61d6f03d --- /dev/null +++ b/share/ruby-build/jruby-10.0.5.0 @@ -0,0 +1,2 @@ +require_java 21 +install_package "jruby-10.0.5.0" "https://repo1.maven.org/maven2/org/jruby/jruby-dist/10.0.5.0/jruby-dist-10.0.5.0-bin.tar.gz#6b3aa0340bd60a2b131e12490bb498c45359d9c91e477f5760c3aa18e37d1988" jruby From d27dd19c245734fa6d482e826784295a4600899e Mon Sep 17 00:00:00 2001 From: HASUMI Hitoshi Date: Mon, 9 Feb 2026 14:33:30 +0900 Subject: [PATCH 07/22] Add PicoRuby 3.4.2 with new r2p2 executable This commit adds PicoRuby 3.4.2 and introduces a new artifacts: r2p2. Version numbering context: PicoRuby's version numbers are aligned with mruby's VM code specification compatibility. Version 3.4 indicates compatibility with mruby 3.4 VM code format, or RITE0300. Version 3.4.2 indicates minor bug fix in PicoRuby. Build artifact changes: Starting from version 3.4.2, PicoRuby has replaced the irb executable with r2p2 executable(POSIX version of PicoRuby shell system including IRB). The new build produces three executables: - picoruby: main Ruby interpreter - picorbc: Ruby bytecode compiler - r2p2: interactive REPL (replaces picoirb) Implementation: - Added conditional symlink logic in `build_package_picoruby()`: symlinks picoirb as irb if present - If there's no picoirb in artifacts, symlink for irb is not created - Added picoruby-3.4.2 definition file --- bin/ruby-build | 4 +++- share/ruby-build/picoruby-3.4.2 | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 share/ruby-build/picoruby-3.4.2 diff --git a/bin/ruby-build b/bin/ruby-build index 480973f6..6de5c479 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -885,7 +885,9 @@ build_package_picoruby() { mkdir -p "$PREFIX_PATH" cp -fR build/host/* include "$PREFIX_PATH" ln -fs picoruby "$PREFIX_PATH/bin/ruby" - ln -fs picoirb "$PREFIX_PATH/bin/irb" + if [ -f build/host/bin/picoirb ]; then + ln -fs picoirb "$PREFIX_PATH/bin/irb" + fi } build_package_jruby() { diff --git a/share/ruby-build/picoruby-3.4.2 b/share/ruby-build/picoruby-3.4.2 new file mode 100644 index 00000000..27572678 --- /dev/null +++ b/share/ruby-build/picoruby-3.4.2 @@ -0,0 +1 @@ +install_package "picoruby-3.4.2" "https://github.com/picoruby/picoruby/releases/download/3.4.2/picoruby-3.4.2.tar.gz#75a7dded2b2dff443a80e3bb8075ccf2fe7b77282f8a8a69689fc700b51d61f3" picoruby From 79f3ddb562df7ae3ec437b3a2fb1e0d3641002b0 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 12 Apr 2026 14:09:19 +0200 Subject: [PATCH 08/22] Darwin-x86_64 is no longer supported on TruffleRuby * See https://github.com/truffleruby/truffleruby/issues/4011 --- script/update-truffleruby-graalvm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/script/update-truffleruby-graalvm b/script/update-truffleruby-graalvm index 8c59518a..e1e90868 100755 --- a/script/update-truffleruby-graalvm +++ b/script/update-truffleruby-graalvm @@ -35,10 +35,6 @@ Linux-aarch64) EOS add_platform "linux-aarch64" cat >> "$file" <> "$file" < Date: Sun, 12 Apr 2026 14:10:22 +0200 Subject: [PATCH 09/22] Add TruffleRuby and TruffleRuby GraalVM 34.0.0 --- share/ruby-build/truffleruby+graalvm-34.0.0 | 16 ++++++++++++++++ share/ruby-build/truffleruby-34.0.0 | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 share/ruby-build/truffleruby+graalvm-34.0.0 create mode 100644 share/ruby-build/truffleruby-34.0.0 diff --git a/share/ruby-build/truffleruby+graalvm-34.0.0 b/share/ruby-build/truffleruby+graalvm-34.0.0 new file mode 100644 index 00000000..fbfd5960 --- /dev/null +++ b/share/ruby-build/truffleruby+graalvm-34.0.0 @@ -0,0 +1,16 @@ +platform="$(uname -s)-$(uname -m)" +case $platform in +Linux-x86_64) + install_package "truffleruby+graalvm-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-jvm-34.0.0-linux-amd64.tar.gz#58fbc7dda89368d330211ec6782f8c43c04cbfc19fc81cb3b0e545fa03dd4562" truffleruby + ;; +Linux-aarch64) + install_package "truffleruby+graalvm-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-jvm-34.0.0-linux-aarch64.tar.gz#d35412c9ed08c834f81a1aabe3278aa371682be9cbf1becbf3302f0b85619522" truffleruby + ;; +Darwin-arm64) + install_package "truffleruby+graalvm-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-jvm-34.0.0-macos-aarch64.tar.gz#17b934df517c8311c9d31248c779c0651f3ffe068a614996d7f32dd746106678" truffleruby + ;; +*) + colorize 1 "Unsupported platform: $platform" + return 1 + ;; +esac diff --git a/share/ruby-build/truffleruby-34.0.0 b/share/ruby-build/truffleruby-34.0.0 new file mode 100644 index 00000000..5368f744 --- /dev/null +++ b/share/ruby-build/truffleruby-34.0.0 @@ -0,0 +1,16 @@ +platform="$(uname -s)-$(uname -m)" +case $platform in +Linux-x86_64) + install_package "truffleruby-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-34.0.0-linux-amd64.tar.gz#cd3dd1af0c6e63511527ec535a56522f9951950dbb1cb349f5845d9d432a5cc3" truffleruby + ;; +Linux-aarch64) + install_package "truffleruby-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-34.0.0-linux-aarch64.tar.gz#5736f6278d36ed962e6f317996624676d0d95e9f2a37a5e03f6dd317f4e0b190" truffleruby + ;; +Darwin-arm64) + install_package "truffleruby-34.0.0" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.0/truffleruby-34.0.0-macos-aarch64.tar.gz#1140797470447a17760d19972404d9903fdcc8d638b3d1f55a0d0c8a18e693b9" truffleruby + ;; +*) + colorize 1 "Unsupported platform: $platform" + return 1 + ;; +esac From 90b52b26b784d3fdc587cfabae55f3feedd5028b Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 12 Apr 2026 14:18:21 +0200 Subject: [PATCH 10/22] ruby-build 20260412 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index 480973f6..d086b656 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -16,7 +16,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260327" +RUBY_BUILD_VERSION="20260412" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 0cad7c5a..e6f3b80e 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2024-09-24 +.\" Date: 2024-09-23 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260327 +.\" Source: ruby-build 20260412 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-24" "ruby\-build 20260327" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2024-09-23" "ruby\-build 20260412" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From 68a0d76e1407abaa54fe55bc9ae9da42dbfd52f3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 21 Apr 2026 09:03:17 +0000 Subject: [PATCH 11/22] Added 4.0.3 with OpenSSL 3.0.20 --- share/ruby-build/4.0.3 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 share/ruby-build/4.0.3 diff --git a/share/ruby-build/4.0.3 b/share/ruby-build/4.0.3 new file mode 100644 index 00000000..bfd32e01 --- /dev/null +++ b/share/ruby-build/4.0.3 @@ -0,0 +1,2 @@ +install_package "openssl-3.0.20" "https://github.com/openssl/openssl/releases/download/openssl-3.0.20/openssl-3.0.20.tar.gz#c80a01dfc70ece4dc21168932c37739042d404d46ccc81a5986dd75314ecda6f" openssl --if needs_openssl:1.1.1-3.x.x +install_package "ruby-4.0.3" "https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.3.tar.gz#77964acc370d5c8375b9502e5ba6c13c03ef91ab9eb9f521c84fb42b9c9a6b0f" enable_shared standard From c11e9861639c19c044a5b17b09a5e255e66268e4 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Tue, 21 Apr 2026 22:45:19 +0900 Subject: [PATCH 12/22] Add JRuby 10.1.0.0 --- share/ruby-build/jruby-10.1.0.0 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 share/ruby-build/jruby-10.1.0.0 diff --git a/share/ruby-build/jruby-10.1.0.0 b/share/ruby-build/jruby-10.1.0.0 new file mode 100644 index 00000000..0b06b7a9 --- /dev/null +++ b/share/ruby-build/jruby-10.1.0.0 @@ -0,0 +1,2 @@ +require_java 21 +install_package "jruby-10.1.0.0" "https://repo1.maven.org/maven2/org/jruby/jruby-dist/10.1.0.0/jruby-dist-10.1.0.0-bin.tar.gz#9c14a0ce81f3a312fd98c415986982132e91d36b12cb8d74a3dfdae93fe984ac" jruby From 1c4ddb5320fe513d2e63332586fde6bc5a0da2ee Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 22 Apr 2026 10:15:49 +0900 Subject: [PATCH 13/22] ruby-build 20260422 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index 08811561..accf526a 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -16,7 +16,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260412" +RUBY_BUILD_VERSION="20260422" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index e6f3b80e..c5a9b365 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2024-09-23 +.\" Date: 2024-09-24 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260412 +.\" Source: ruby-build 20260422 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-23" "ruby\-build 20260412" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2024-09-24" "ruby\-build 20260422" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From 9e2a72a666065deca164d8219cced80d0c0cd19f Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 26 Apr 2026 23:32:02 +0200 Subject: [PATCH 14/22] Add TruffleRuby and TruffleRuby GraalVM 34.0.1 --- share/ruby-build/truffleruby+graalvm-34.0.1 | 16 ++++++++++++++++ share/ruby-build/truffleruby-34.0.1 | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 share/ruby-build/truffleruby+graalvm-34.0.1 create mode 100644 share/ruby-build/truffleruby-34.0.1 diff --git a/share/ruby-build/truffleruby+graalvm-34.0.1 b/share/ruby-build/truffleruby+graalvm-34.0.1 new file mode 100644 index 00000000..67357685 --- /dev/null +++ b/share/ruby-build/truffleruby+graalvm-34.0.1 @@ -0,0 +1,16 @@ +platform="$(uname -s)-$(uname -m)" +case $platform in +Linux-x86_64) + install_package "truffleruby+graalvm-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-jvm-34.0.1-linux-amd64.tar.gz#2fb0ad7964f635cdf47a9b1a238aaa377d1eb18ddd12c0846d525f7b82fac525" truffleruby + ;; +Linux-aarch64) + install_package "truffleruby+graalvm-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-jvm-34.0.1-linux-aarch64.tar.gz#f72d631d265cb6b2cac87169203eee4bfd3a61e75b8d7fd3cc8f383b8b701854" truffleruby + ;; +Darwin-arm64) + install_package "truffleruby+graalvm-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-jvm-34.0.1-macos-aarch64.tar.gz#1d14a4186e718a3f52682a771b9796c594ddf664c2eb9d24dba1abff7d973fd3" truffleruby + ;; +*) + colorize 1 "Unsupported platform: $platform" + return 1 + ;; +esac diff --git a/share/ruby-build/truffleruby-34.0.1 b/share/ruby-build/truffleruby-34.0.1 new file mode 100644 index 00000000..13c329fa --- /dev/null +++ b/share/ruby-build/truffleruby-34.0.1 @@ -0,0 +1,16 @@ +platform="$(uname -s)-$(uname -m)" +case $platform in +Linux-x86_64) + install_package "truffleruby-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-34.0.1-linux-amd64.tar.gz#15fb3c5bb6d2917a2e5d08497f62586d262cddd65c9d251f098f6b568b33a8f7" truffleruby + ;; +Linux-aarch64) + install_package "truffleruby-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-34.0.1-linux-aarch64.tar.gz#10ed8310addb41782d92ce44e1ec9b2865b65f1c8d7c4ce489d6e84854d0bca5" truffleruby + ;; +Darwin-arm64) + install_package "truffleruby-34.0.1" "https://github.com/truffleruby/truffleruby/releases/download/graal-34.0.1/truffleruby-34.0.1-macos-aarch64.tar.gz#7a1404751b88aa49686e0787eafc9695d67ac3925d9d2bfdb881a4e5258842f3" truffleruby + ;; +*) + colorize 1 "Unsupported platform: $platform" + return 1 + ;; +esac From f723aa7bf027dc714784bc8de421248565e66649 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 26 Apr 2026 23:37:45 +0200 Subject: [PATCH 15/22] ruby-build 20260426 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index accf526a..68a46af5 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -16,7 +16,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260422" +RUBY_BUILD_VERSION="20260426" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index c5a9b365..3c1bb8f1 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2024-09-24 +.\" Date: 2024-09-23 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260422 +.\" Source: ruby-build 20260426 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-24" "ruby\-build 20260422" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2024-09-23" "ruby\-build 20260426" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From 20abbb0618fd0ca1c2be946170d82fe01b74b65a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 29 Apr 2026 17:18:23 +0200 Subject: [PATCH 16/22] Add mruby-4.0.0 --- share/ruby-build/mruby-4.0.0 | 1 + 1 file changed, 1 insertion(+) create mode 100644 share/ruby-build/mruby-4.0.0 diff --git a/share/ruby-build/mruby-4.0.0 b/share/ruby-build/mruby-4.0.0 new file mode 100644 index 00000000..a493bb5e --- /dev/null +++ b/share/ruby-build/mruby-4.0.0 @@ -0,0 +1 @@ +install_package "mruby-4.0.0" "https://github.com/mruby/mruby/archive/4.0.0.tar.gz#e2ea271dbed14e9f2b33df773ae447b747dbc242ce2675022c0a57efea85a7b4" mruby From 92d57fdbb64cb45e0b7e1ca2369e8bd8d004986e Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 1 May 2026 12:25:11 +0200 Subject: [PATCH 17/22] Support building with version prefix (#2610) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support building with version prefix Commonly in CI pipelines and other scripts, users may want to install the latest from a specific series, e.g. `3.4` or `jruby-10.0`. ```bash $ bin/ruby-build 3.4 /tmp/3.4 ... Downloading ruby-3.4.9.tar.gz... $ bin/ruby-build 4.0 /tmp/4.0 ... Downloading ruby-4.0.2.tar.gz... ``` Also support `--resolve`: ```bash $ bin/ruby-build --resolve 3.4 3.4.9 ``` * Improve version name resolution from prefix - `ruby-build --resolve` now prints canonical definition names, always stripping the "ruby-" prefix from output (e.g. "ruby-3.4" => "3.4.9"). - Fix sorting versions so that "jruby" correctly resolves to "jruby-10.x" instead of to "jruby-9.x". - Support bare "ruby" argument to select the latest CRuby version, since that was already possible for "jruby", "mruby", et al. - Case-normalize version inputs so that arguments like "JRuby" or "TruffleRuby" resolve to their lowercase definitions. - Simplify definition file lookup: all code paths now go through resolve_version. - Restore the named-pipe + `--dir` check to correctly abort early. - Update README and man page: bump Ruby version numbers in examples, add Ruby implementations section, document the `--resolve` option. * Clarify what ruby-build considers to be "latest" Ruby version * Print usage error message if `--resolve` wasn't passed an argument --------- Co-authored-by: Mislav Marohnić --- README.md | 36 ++++++++- bin/rbenv-install | 8 +- bin/ruby-build | 90 ++++++++++++++++------- share/man/man1/ruby-build.1 | 121 ++++++++++++++++++++++++++++--- share/man/man1/ruby-build.1.adoc | 57 ++++++++++++--- test/build.bats | 24 ++++++ test/definitions.bats | 95 ++++++++++++++++++++++++ test/rbenv.bats | 22 +++--- 8 files changed, 394 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index c0a3f16c..7581776e 100644 --- a/README.md +++ b/README.md @@ -42,11 +42,13 @@ PREFIX=/usr/local ./ruby-build-*/install.sh # As a standalone program $ ruby-build --list # lists latest stable releases for each Ruby $ ruby-build --definitions # lists all definitions, including outdated ones -$ ruby-build 3.2.2 ~/.rubies/ruby-3.2.2 # installs Ruby 3.2.2 -$ ruby-build -d ruby-3.2.2 ~/.rubies # alternate form for the previous example +$ ruby-build 3.4.9 ~/.rubies/ruby-3.4.9 # installs Ruby 3.4.9 +$ ruby-build -d ruby-3.4.9 ~/.rubies # alternate form for the previous example +$ ruby-build -d ruby-3.4 ~/.rubies # installs latest Ruby 3.4.x # As an rbenv plugin -$ rbenv install 3.2.2 # installs Ruby 3.2.2 to ~/.rbenv/versions/3.2.2 +$ rbenv install 3.4.9 # installs Ruby 3.4.9 to ~/.rbenv/versions/3.4.9 +$ rbenv install 3 # installs latest Ruby 3.x ``` > [!WARNING] @@ -61,6 +63,28 @@ Basically, what ruby-build does when installing a Ruby version is this: Depending on the context, ruby-build does a little bit more than the above: for example, it will try to link Ruby to the appropriate OpenSSL version, even if that means downloading and compiling OpenSSL itself; it will discover and link to Homebrew-installed instances of some libraries like libyaml and readline, etc. +### Ruby versions + +When listing "latest" Ruby versions, such as in `ruby-build --list` output, ruby-build only knows of Ruby versions that are bundled with this project. That means that when a new Ruby version comes out, ruby-build will not know about it immediately— you will have to upgrade ruby-build before you can use it to install the new Ruby version. This is because ruby-build bundles [definition files](#custom-build-definitions) for each individual Ruby version. + +If it's important to you that your installer tool always consults remote resources to download the list of latest Ruby versions (without having to upgrade the tool itself), check out [ruby-install][] as an alternative to ruby-build. + +### Ruby implementations + +ruby-build ships with definitions for the following Ruby implementations, denoted by version prefixes in the `ruby-build --list` output: + +- [CRuby][]: listed in ruby-build as unprefixed version numbers in the `X.Y.Z` format. This is the main Ruby implementation that most people use and is also historically known as "MRI". ruby-build allows adding the `ruby-` prefix to CRuby version numbers for compatibility with other version managers. + +- `jruby`: [JRuby][] is a high-performance Ruby implementation with real threading built on top of the Java virtual machine (JVM). + +- `mruby`: [mruby][] is a lightweight, embeddable Ruby implementation for microcontrollers. + +- `picoruby`: [PicoRuby][] is an alternative mruby implementation for one-chip microcontrollers. + +- `truffleruby`: The Native standalone distribution of [TruffleRuby][], an implementation of Ruby on top of GraalVM's Truffle framework. + +- `truffleruby+graalvm`: The JVM standalone distribution of TruffleRuby. + ### Advanced Usage #### Custom Build Definitions @@ -197,3 +221,9 @@ Be sure to include the full build log for build failures. [wiki]: https://github.com/rbenv/ruby-build/wiki [build-env]: https://github.com/rbenv/ruby-build/wiki#suggested-build-environment [issue tracker]: https://github.com/rbenv/ruby-build/issues + [cruby]: https://www.ruby-lang.org/ + [truffleruby]: https://truffleruby.dev/ + [picoruby]: https://github.com/picoruby/picoruby#readme + [mruby]: https://mruby.org/ + [jruby]: https://www.jruby.org/ + [ruby-install]: https://github.com/postmodern/ruby-install#readme diff --git a/bin/rbenv-install b/bin/rbenv-install index b5f47800..017daaa4 100755 --- a/bin/rbenv-install +++ b/bin/rbenv-install @@ -134,8 +134,6 @@ done [ "${#ARGUMENTS[@]}" -le 1 ] || usage 1 >&2 -unset VERSION_NAME - # The first argument contains the definition to install. If the # argument is missing, try to install whatever local app-specific # version is specified by rbenv. Show usage instructions if a local @@ -144,6 +142,12 @@ DEFINITION="${ARGUMENTS[0]}" [ -n "$DEFINITION" ] || DEFINITION="$(rbenv-local 2>/dev/null || true)" [ -n "$DEFINITION" ] || usage 1 >&2 +if VERSION_NAME="$(ruby-build --resolve "$DEFINITION")"; then + DEFINITION="$VERSION_NAME" +else + unset VERSION_NAME +fi + # Define `before_install` and `after_install` functions that allow # plugin hooks to register a string of code for execution before or # after the installation process. diff --git a/bin/ruby-build b/bin/ruby-build index 68a46af5..b1e937eb 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -2,10 +2,12 @@ # # Usage: ruby-build [-dvpk] [-- ] # ruby-build {--list|--definitions} +# ruby-build --resolve # ruby-build --version # # -l, --list List latest stable releases for each Ruby # --definitions List all local definitions, including outdated ones +# --resolve Print the latest stable definition name matching a version prefix # --version Show version of ruby-build # # -d, --dir Install the Ruby in / instead of @@ -1411,6 +1413,36 @@ list_maintained_versions() { } | extract_latest_versions | sort_versions | uniq } +# resolve a version prefix to the exact version name for which exists a +# definition file. Example: "ruby-3" => "3.4.9" +resolve_version() { + local version="${1#ruby-}" + + # Look for an exact match first. + for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do + if [ -f "${DEFINITION_DIR}/${version}" ]; then + echo "$version" + return 0 + fi + done + + local grep_pattern="${version%.}" + if [ "$grep_pattern" = "ruby" ]; then + # Special case to select the latest CRuby. + grep_pattern="[0-9]" + else + grep_pattern="$(tr 'A-Z' 'a-z' <<<"${grep_pattern//./\\.}")" + fi + + version=$(list_definitions | \ + grep -e "^${grep_pattern}[-.]" | \ + grep -v -e '-rc[0-9]*$' -e '-preview[0-9]*$' -e '-dev$' | \ + tail -n 1) + + [ -n "$version" ] || return 1 + echo "$version" +} + extract_latest_versions() { # sort in this function looks redundunt but it is necessary # rbx-3.99 appears latest unless the sort @@ -1453,6 +1485,14 @@ for option in "${OPTIONS[@]}"; do "l" | "list") EARLY_EXIT=list_maintained_versions ;; + "resolve") + if [ "${#ARGUMENTS[*]}" -eq 1 ]; then + EARLY_EXIT=resolve_version + else + echo "ruby-build: '--resolve' needs an argument" >&2 + EARLY_EXIT=usage_error + fi + ;; "d" | "dir") APPEND_DEFINITION_TO_PREFIX=true ;; @@ -1503,12 +1543,9 @@ if [ "${#EXTRA_ARGUMENTS[@]}" -gt 0 ]; then RUBY_CONFIGURE_OPTS_ARRAY=("${EXTRA_ARGUMENTS[@]}") fi -if [ "$APPEND_DEFINITION_TO_PREFIX" = "true" ]; then - if [ -p "$DEFINITION_PATH" ]; then - echo "ruby-build: using named pipes in combination with \`--dir' is not possible" >&2 - EARLY_EXIT=usage_error - fi - PREFIX_PATH="$PREFIX_PATH/$(basename "$DEFINITION_PATH")" +if [[ "$APPEND_DEFINITION_TO_PREFIX" = "true" && -p "$DEFINITION_PATH" ]]; then + echo "ruby-build: using named pipes in combination with \`--dir' is not possible" >&2 + EARLY_EXIT=usage_error fi case "$EARLY_EXIT" in @@ -1521,6 +1558,10 @@ version | list_definitions | list_maintained_versions ) "$EARLY_EXIT" exit 0 ;; +resolve_version ) + resolve_version "${ARGUMENTS[0]}" || exit 1 + exit 0 + ;; usage_error ) echo >&2 usage 1 >&2 @@ -1533,30 +1574,29 @@ usage_error ) ;; esac +VERSION_NAME_PREFIX="" + # expand the argument to full path of the definition file if [[ ! -f "$DEFINITION_PATH" && ! -p "$DEFINITION_PATH" ]]; then - for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do - if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then - DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" - break - fi - done - - # If the given definition is like ruby-X.Y.Z, search again with X.Y.Z - if [[ "$DEFINITION_PATH" =~ ^ruby-[0-9] ]]; then - DEFINITION_PATH="${DEFINITION_PATH#ruby-}" - for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do - if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then - DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" - break - fi - done - fi - - if [ ! -f "$DEFINITION_PATH" ]; then + if ! VERSION_NAME="$(resolve_version "$DEFINITION_PATH")"; then echo "ruby-build: definition not found: ${DEFINITION_PATH}" >&2 exit 2 fi + + if [[ $DEFINITION_PATH == ruby-* && $VERSION_NAME != ruby-* ]]; then + VERSION_NAME_PREFIX="ruby-" + fi + + for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do + if [ -f "${DEFINITION_DIR}/${VERSION_NAME}" ]; then + DEFINITION_PATH="${DEFINITION_DIR}/${VERSION_NAME}" + break + fi + done +fi + +if [ "$APPEND_DEFINITION_TO_PREFIX" = "true" ]; then + PREFIX_PATH="$PREFIX_PATH/${VERSION_NAME_PREFIX}$(basename "$DEFINITION_PATH")" fi # normalize the argument diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 3c1bb8f1..14d965ec 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2024-09-23 +.\" Date: 2026-05-01 .\" Manual: ruby-build Manual .\" Source: ruby-build 20260426 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-23" "ruby\-build 20260426" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2026-05-01" "ruby\-build 20260426" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 @@ -35,15 +35,14 @@ ruby\-build [\-dvpk] \fI\fP \fI\fP [\-\- \fI\fP +.br ruby\-build \-\-version .SH "DESCRIPTION" .sp ruby\-build downloads, compiles, and installs a Ruby version named by the \fIdefinition\fP argument into the location specified by \fIprefix\fP. .sp -The \fIdefinition\fP argument can optionally start with "ruby\-", in which case -it resolves to a CRuby that matches the version number that follows. -.sp The \fIdefinition\fP argument can be a path to a file on disk, in which case it is sourced into ruby\-build as a bash script. .sp @@ -53,6 +52,91 @@ will get forwarded to the \f(CR./configure\fP invocation. By default, all compile output is redirected to a log file at \f(CR$TMPDIR/ruby\-build.*.log\fP. Activate the verbose mode to skip the log file and print everything to standard streams. +.SH "RUBY VERSIONS" +.sp +When listing "latest" Ruby versions, such as in \f(CR\-\-list\fP output, +ruby\-build only knows of Ruby versions that are bundled with this project. +That means that when a new Ruby version comes out, ruby\-build will not +know about it immediately; you will have to upgrade ruby\-build before you +can use it to install the new Ruby version. +.SH "RUBY IMPLEMENTATIONS" +.sp +ruby\-build ships with definitions for the following Ruby implementations: +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +CRuby, also known as "MRI": denoted by version numbers in form of "X.Y.Z". +This is the main Ruby implementation that most people use. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"jruby": High\-performance Ruby implementation with real threading built +on top of the Java virtual machine (JVM). +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"mruby": Lightweight Ruby for microcontrollers. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"picoruby": Alternative mruby implementation for one\-chip microcontrollers. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"truffleruby": The Native standalone distribution of TruffleRuby, an +implementation of Ruby on top of GraalVM\(cqs Truffle framework. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"truffleruby+graalvm": The JVM standalone distribution of TruffleRuby. +.RE +.sp +The \fIdefinition\fP argument may optionally start with "ruby\-", in which case +it resolves to a CRuby that matches the version number that follows. The +\fIdefinition\fP argument may also be a name of one of the alternative Ruby +implementations, in which case the latest version of that implementation +will be installed. .SH "OPTIONS" .sp \fB\-l, \-\-list\fP @@ -65,6 +149,11 @@ List latest stable releases for each Ruby List all local definitions, including outdated ones .RE .sp +\fB\-\-resolve\fP +.RS 4 +Print the definition name of the latest stable Ruby version matching the \fIversion\fP argument +.RE +.sp \fB\-\-version\fP .RS 4 Show version of ruby\-build @@ -106,27 +195,37 @@ Install a Ruby version while tweaking some configuration options: .if n .RS 4 .nf .fam C -$ ruby\-build 3.2.2 /path/to/destination \-\- \-\-disable\-install\-doc \-\-with\-openssl\-dir=/opt/openssl +$ ruby\-build 3.4.9 /path/to/destination \-\- \-\-disable\-install\-doc \-\-with\-openssl\-dir=/opt/openssl .fam .fi .if n .RE .sp -Install a Ruby version to \f(CR~/.rubies/ruby\-3.2.2\fP: +Install a Ruby version to \f(CR~/.rubies/ruby\-3.4.9\fP: .sp .if n .RS 4 .nf .fam C -$ ruby\-build \-\-dir ruby\-3.2.2 ~/.rubies +$ ruby\-build \-\-dir ruby\-3.4.9 ~/.rubies .fam .fi .if n .RE .sp -Install a Ruby version to \f(CR~/.rbenv/versions/3.3.5\fP: +Install the latest Ruby 3.x version to \f(CR~/.rubies/ruby\-3.x.y\fP: .sp .if n .RS 4 .nf .fam C -$ ruby\-build \-\-dir 3.3.5 ~/.rbenv/versions +$ ruby\-build \-\-dir ruby\-3 ~/.rubies +.fam +.fi +.if n .RE +.sp +Install a Ruby version to \f(CR~/.rbenv/versions/3.3.11\fP: +.sp +.if n .RS 4 +.nf +.fam C +$ ruby\-build \-\-dir 3.3.11 ~/.rbenv/versions .fam .fi .if n .RE @@ -136,7 +235,7 @@ Usage as rbenv plugin, accomplishes the same as the previous example: .if n .RS 4 .nf .fam C -$ rbenv install 3.3.5 +$ rbenv install 3.3.11 .fam .fi .if n .RE diff --git a/share/man/man1/ruby-build.1.adoc b/share/man/man1/ruby-build.1.adoc index b579296e..3ee361a0 100644 --- a/share/man/man1/ruby-build.1.adoc +++ b/share/man/man1/ruby-build.1.adoc @@ -13,6 +13,7 @@ ruby-build - Download, compile, and install a version of Ruby ruby-build [-dvpk] __ __ [-- __...] + ruby-build {--list|--definitions} + +ruby-build --resolve __ + ruby-build --version == Description @@ -20,9 +21,6 @@ ruby-build --version ruby-build downloads, compiles, and installs a Ruby version named by the _definition_ argument into the location specified by _prefix_. -The _definition_ argument can optionally start with "ruby-", in which case -it resolves to a CRuby that matches the version number that follows. - The _definition_ argument can be a path to a file on disk, in which case it is sourced into ruby-build as a bash script. @@ -33,6 +31,39 @@ By default, all compile output is redirected to a log file at `$TMPDIR/ruby-build.*.log`. Activate the verbose mode to skip the log file and print everything to standard streams. +== Ruby versions + +When listing "latest" Ruby versions, such as in `--list` output, +ruby-build only knows of Ruby versions that are bundled with this project. +That means that when a new Ruby version comes out, ruby-build will not +know about it immediately; you will have to upgrade ruby-build before you +can use it to install the new Ruby version. + +== Ruby implementations + +ruby-build ships with definitions for the following Ruby implementations: + +- CRuby, also known as "MRI": denoted by version numbers in form of "X.Y.Z". + This is the main Ruby implementation that most people use. + +- "jruby": High-performance Ruby implementation with real threading built + on top of the Java virtual machine (JVM). + +- "mruby": Lightweight Ruby for microcontrollers. + +- "picoruby": Alternative mruby implementation for one-chip microcontrollers. + +- "truffleruby": The Native standalone distribution of TruffleRuby, an + implementation of Ruby on top of GraalVM's Truffle framework. + +- "truffleruby+graalvm": The JVM standalone distribution of TruffleRuby. + +The _definition_ argument may optionally start with "ruby-", in which case +it resolves to a CRuby that matches the version number that follows. The +_definition_ argument may also be a name of one of the alternative Ruby +implementations, in which case the latest version of that implementation +will be installed. + == Options *-l, --list*:: @@ -41,6 +72,9 @@ and print everything to standard streams. *--definitions*:: List all local definitions, including outdated ones +*--resolve*:: + Print the definition name of the latest stable Ruby version matching the _version_ argument + *--version*:: Show version of ruby-build @@ -66,22 +100,27 @@ and print everything to standard streams. Install a Ruby version while tweaking some configuration options: ---- -$ ruby-build 3.2.2 /path/to/destination -- --disable-install-doc --with-openssl-dir=/opt/openssl +$ ruby-build 3.4.9 /path/to/destination -- --disable-install-doc --with-openssl-dir=/opt/openssl ---- -Install a Ruby version to `~/.rubies/ruby-3.2.2`: +Install a Ruby version to `~/.rubies/ruby-3.4.9`: ---- -$ ruby-build --dir ruby-3.2.2 ~/.rubies +$ ruby-build --dir ruby-3.4.9 ~/.rubies ---- -Install a Ruby version to `~/.rbenv/versions/3.3.5`: +Install the latest Ruby 3.x version to `~/.rubies/ruby-3.x.y`: ---- -$ ruby-build --dir 3.3.5 ~/.rbenv/versions +$ ruby-build --dir ruby-3 ~/.rubies +---- + +Install a Ruby version to `~/.rbenv/versions/3.3.11`: +---- +$ ruby-build --dir 3.3.11 ~/.rbenv/versions ---- Usage as rbenv plugin, accomplishes the same as the previous example: ---- -$ rbenv install 3.3.5 +$ rbenv install 3.3.11 ---- == Environment Variables diff --git a/test/build.bats b/test/build.bats index 87a253d7..4a867845 100755 --- a/test/build.bats +++ b/test/build.bats @@ -787,6 +787,30 @@ make install OUT } +@test "nested install destination with ruby prefix and version prefix" { + cached_tarball "ruby-3.2.45" configure + + stub_repeated brew false + stub_make_install + + mkdir -p "$TMP"/definitions + cat > "$TMP"/definitions/3.2.45 < "${TMP}/definitions/1.8.6" + echo false > "${TMP}/definitions/1.9.3" + echo true > "${TMP}/definitions/1.9.10" + echo false > "${TMP}/definitions/1.90.0" + echo false > "${TMP}/definitions/2.0.0" + + run bin/ruby-build "1.9" "${TMP}/install" + assert_success "" +} + +@test "resolve failure" { + run bin/ruby-build --resolve "doesntexist" + assert_failure "" +} + +@test "resolve definition by version prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/1.8.6" + touch "${TMP}/definitions/1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "1.9" + assert_success "1.9.10" +} + +@test "resolve definition by exact match" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/3.2.1" + + run bin/ruby-build --resolve "3.2.1" + assert_success "3.2.1" +} + +@test "resolve definition by exact match and ruby prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/3.2.1" + + run bin/ruby-build --resolve "ruby-3.2.1" + assert_success "3.2.1" +} + +@test "resolve definition with ruby prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/1.8.6" + touch "${TMP}/definitions/1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "ruby-1.9" + assert_success "1.9.10" +} + +@test "resolve definition by implementation name" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/fooruby-1.8.6" + touch "${TMP}/definitions/fooruby-1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "FooRuby" + assert_success "fooruby-1.9.3" +} + +@test "resolve definition by implementation name and version" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/foo-1.8.6" + touch "${TMP}/definitions/foo-1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "foo-1.8" + assert_success "foo-1.8.6" +} + @test "installing nonexistent definition" { run ruby-build "nonexistent" "${TMP}/install" assert [ "$status" -eq 2 ] diff --git a/test/rbenv.bats b/test/rbenv.bats index 2f52961a..e5bea4c8 100644 --- a/test/rbenv.bats +++ b/test/rbenv.bats @@ -16,7 +16,7 @@ stub_ruby_build() { } @test "install proper" { - stub_ruby_build 'echo ruby-build "$@"' + stub_ruby_build 'echo 2.1.2' 'echo ruby-build "$@"' run rbenv-install 2.1.2 assert_success "ruby-build 2.1.2 ${RBENV_ROOT}/versions/2.1.2" @@ -27,7 +27,7 @@ stub_ruby_build() { } @test "install with flags" { - stub_ruby_build 'echo "ruby-build $(inspect_args "$@")"' + stub_ruby_build 'echo 2.1.2' 'echo "ruby-build $(inspect_args "$@")"' run rbenv-install -kpv 2.1.2 -- --with-configure-opt="hello world" assert_success "ruby-build --keep --verbose --patch 2.1.2 ${RBENV_ROOT}/versions/2.1.2 -- \"--with-configure-opt=hello world\"" @@ -39,7 +39,7 @@ stub_ruby_build() { @test "suggest running rbenv global after install" { rm -rf "$RBENV_ROOT/version" - stub_ruby_build 'echo ruby-build "$@"' + stub_ruby_build 'echo 2.1.2' 'echo ruby-build "$@"' run rbenv-install 2.1.2 assert_success <&2 && exit 2' \ + stub_ruby_build 'exit 1' \ + 'echo ERROR >&2 && exit 2' \ "--definitions : echo 1.8.7 1.9.3-p0 1.9.3-p194 2.1.2 | tr ' ' $'\\n'" run rbenv-install 1.9.3 @@ -127,10 +128,11 @@ OUT @test "Homebrew upgrade instructions" { stub brew "--prefix : echo '${BATS_TEST_DIRNAME%/*}'" - stub_ruby_build 'echo ERROR >&2 && exit 2' \ + stub_ruby_build 'exit 1' \ + 'echo ERROR >&2 && exit 2' \ "--definitions : true" - run rbenv-install 1.9.3 + run rbenv-install 1.9.10 assert_failure assert_output < Date: Fri, 1 May 2026 12:26:22 +0200 Subject: [PATCH 18/22] ruby-build 20260501 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index b1e937eb..004225a4 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -18,7 +18,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260426" +RUBY_BUILD_VERSION="20260501" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 14d965ec..000464e7 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -4,10 +4,10 @@ .\" Generator: Asciidoctor 2.0.26 .\" Date: 2026-05-01 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260426 +.\" Source: ruby-build 20260501 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2026-05-01" "ruby\-build 20260426" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2026-05-01" "ruby\-build 20260501" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From e98dffb562d295356eb1233a8c111c47d37c9bca Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Sun, 3 May 2026 06:57:49 +0900 Subject: [PATCH 19/22] Fix definition lookup for ruby-prefixed names like `ruby-dev` `resolve_version` strips the leading `ruby-` from its argument and then only looks for the stripped form in the definitions directory. For canonical definitions whose filename retains the `ruby-` prefix (currently `ruby-dev`) the exact-match step searches for `dev`, which does not exist, and the grep fallback's `^dev[-.]` anchor also misses the `ruby-dev` line in the definitions list. Result: `ruby-build ruby-dev` reports "definition not found" even though the file is shipped. Try the original (unstripped) argument first in the exact-match loop, then fall back to the stripped form. Numeric-version inputs (`ruby-3.4.9`, `3.4`, `ruby-3.4`) and other implementations (`mruby-dev`, `jruby-dev`) are unaffected because their existing code paths still match. Regression introduced in #2610. --- bin/ruby-build | 4 ++++ test/definitions.bats | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/bin/ruby-build b/bin/ruby-build index 004225a4..b0a2b7e0 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -1420,6 +1420,10 @@ resolve_version() { # Look for an exact match first. for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do + if [ -f "${DEFINITION_DIR}/$1" ]; then + echo "$1" + return 0 + fi if [ -f "${DEFINITION_DIR}/${version}" ]; then echo "$version" return 0 diff --git a/test/definitions.bats b/test/definitions.bats index c507d79b..5bd7283b 100644 --- a/test/definitions.bats +++ b/test/definitions.bats @@ -113,6 +113,16 @@ NUM_DEFINITIONS="$(ls "$BATS_TEST_DIRNAME"/../share/ruby-build | wc -l)" assert_success "3.2.1" } +@test "resolve definition by exact match for ruby-prefixed name" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/ruby-dev" + + run bin/ruby-build --resolve "ruby-dev" + assert_success "ruby-dev" +} + @test "resolve definition with ruby prefix" { export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" mkdir -p "${TMP}/definitions" From 17c061e067e43578ebe4c8be7825fe28aedea7c1 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 3 May 2026 16:14:36 +0200 Subject: [PATCH 20/22] ruby-build 20260503 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index b0a2b7e0..95682d22 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -18,7 +18,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260501" +RUBY_BUILD_VERSION="20260503" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 000464e7..ffcd8d49 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2026-05-01 +.\" Date: 2026-05-03 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260501 +.\" Source: ruby-build 20260503 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2026-05-01" "ruby\-build 20260501" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2026-05-03" "ruby\-build 20260503" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 From 60d0948d0666e615b5e9f9583784b5f7718ff175 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Mon, 11 May 2026 21:27:21 +0000 Subject: [PATCH 21/22] Added 4.0.4 with OpenSSL 3.0.20 --- share/ruby-build/4.0.4 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 share/ruby-build/4.0.4 diff --git a/share/ruby-build/4.0.4 b/share/ruby-build/4.0.4 new file mode 100644 index 00000000..33de3159 --- /dev/null +++ b/share/ruby-build/4.0.4 @@ -0,0 +1,2 @@ +install_package "openssl-3.0.20" "https://github.com/openssl/openssl/releases/download/openssl-3.0.20/openssl-3.0.20.tar.gz#c80a01dfc70ece4dc21168932c37739042d404d46ccc81a5986dd75314ecda6f" openssl --if needs_openssl:1.1.1-3.x.x +install_package "ruby-4.0.4" "https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.4.tar.gz#f35f6edfa3dabb3f723f9d0cf1906c6512ae77f4e412ab1e68cc6e91d230fa80" enable_shared standard From 7e6d7f165330bc49ba4a1184da74c20662ce9e1b Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 12 May 2026 09:31:59 +0900 Subject: [PATCH 22/22] ruby-build 20260512 --- bin/ruby-build | 2 +- share/man/man1/ruby-build.1 | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/ruby-build b/bin/ruby-build index 95682d22..bcd505d2 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -18,7 +18,7 @@ # -6, --ipv6 Resolve names to IPv6 addresses only # -RUBY_BUILD_VERSION="20260503" +RUBY_BUILD_VERSION="20260512" OLDIFS="$IFS" diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index ffcd8d49..a215747d 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2026-05-03 +.\" Date: 2026-05-07 .\" Manual: ruby-build Manual -.\" Source: ruby-build 20260503 +.\" Source: ruby-build 20260512 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2026-05-03" "ruby\-build 20260503" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2026-05-07" "ruby\-build 20260512" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0