Compare commits

...
Author SHA1 Message Date
Charles Oliver Nutter
573f87a93b
Merge pull request #2653 from headius/jruby-10.0.8.0-10.1.3.0
JRuby 10.0.8.0
2026-11-05 16:11:03 -06:00
Charles Oliver Nutter
3943d26446 JRuby 10.0.8.0 2026-11-05 16:06:53 -06:00
Hiroshi SHIBATA
cd54d2c33d
Merge pull request #2652 from sferik/jruby_10.1.3.0
Add JRuby 10.1.3.0
2026-11-06 06:03:31 +09:00
Erik Berlin
efb9c19a56
Add JRuby 10.1.3.0 2026-11-05 12:04:42 -08:00
Hiroshi SHIBATA
4ef3159f94
Merge pull request #2651 from rbenv/claude/openssl-1-0-serial-make-df0834
Build OpenSSL 1.0 without parallel make
2026-11-02 07:14:39 +09:00
Hiroshi SHIBATA
6c959eabd8 Build OpenSSL 1.0 without parallel make
Two `ar` runs into libcrypto.a can overlap under make -j and drop each other's objects, which breaks every Ruby 2.3 and older build on the ubuntu-26.04 runners. The `-j 1` that used to prevent this stopped taking effect when 3a4d3fb0 moved MAKE_OPTS after the package options, and 6663720f removed it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 06:12:04 +09:00
Benoit Daloze
b84455fe38
Merge pull request #2650 from eregon/gcc15-ruby27
Put -std=gnu17 on CC for Ruby 2.7 too, its configure ignores cflags
2026-10-31 21:20:43 +01:00
Benoit Daloze
091a117c6f Put -std=gnu17 on CC for Ruby 2.7 too, its configure ignores cflags
The configure script of Ruby 2.7.8 is generated by Autoconf 2.71, which
runs AC_PROG_CC (setting CFLAGS=-g -O2) before Ruby's own
`test -z "${CFLAGS+set}"` check, so the cflags configure variable is
silently ignored and Ruby 2.7 was still compiled as C23 on GCC 15.
Ruby 3.0+ unset CFLAGS again in that case, and the tarballs of 2.0 to
2.5 ship an Autoconf 2.69 configure which runs the check first.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-31 21:15:46 +01:00
Benoit Daloze
1123436bc9
Merge pull request #2649 from eregon/gcc15-old-rubies
Build Ruby < 3.2 with GCC 15 everywhere, not only on Fedora
2026-10-31 20:51:07 +01:00
Benoit Daloze
13e8b39e0b Build Ruby < 3.2 with GCC 15 everywhere, not only on Fedora
GCC 15 defaults to C23, which Ruby < 3.2 can't compile as. Detect the
GCC version instead of the OS, so that e.g. Ubuntu 26.04 is handled too.

The flag keeps going through the cflags configure variable, except for
Ruby 2.6 where it goes on CC, because its MJIT header check runs a bare
$(CC) and would otherwise fail.

Ported from https://github.com/ruby/ruby-builder/pull/31

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-31 20:38:49 +01:00
5 changed files with 271 additions and 19 deletions

View file

@ -208,16 +208,24 @@ is_freebsd() {
[ "$(uname -s)" = "FreeBSD" ]
}
is_fedora() {
[ -r /etc/os-release ] || return 1
# shellcheck disable=SC1091
source /etc/os-release
# Treat Aurora, Bazzite, BlueFin, uCore, and other Fedora variants as "fedora".
if [[ "${ID_LIKE:-$ID}" != "fedora" || ( $# -gt 0 && "${VERSION_ID%%.*}" -lt "$1") ]]; then
return 1
# The C compiler that Ruby's configure picks: $CC, otherwise gcc if available, otherwise cc.
c_compiler() {
if [ -n "$CC" ]; then
echo "$CC"
elif command -v gcc >/dev/null; then
echo gcc
else
echo cc
fi
}
# Prints the major version of GCC, or nothing if the given C compiler is not GCC (e.g. Clang).
gcc_major_version() {
# shellcheck disable=SC2086
$1 -E -dM - </dev/null 2>/dev/null |
awk '/^#define __clang__ /{clang=1} /^#define __GNUC__ /{gnuc=$3} END{if (!clang) print gnuc}'
}
freebsd_package_prefix() {
local package="$1"
pkg info --prefix "$package" 2>/dev/null | cut -wf2
@ -735,24 +743,37 @@ build_package_standard() {
fi
fi
local cc_override extra_cflags
if [ -z "$CC" ] && is_mac 1010; then
cc_override=clang
elif [[ "$package_var_name" = "RUBY" && "$ruby_semver" -lt 30200 ]]; then
local cc gcc_version
cc="$(c_compiler)"
gcc_version="$(gcc_major_version "$cc")"
if [ "${gcc_version:-0}" -ge 15 ]; then
# GCC 15 changed the default C mode from gnu17 to gnu23: https://gcc.gnu.org/gcc-15/changes.html#c
# Ruby < 3.2 can't compile as C23, where `()` in a declaration means `(void)`.
extra_cflags="-std=gnu17"
fi
if [[ -n "$extra_cflags" && "$ruby_semver" -ge 20600 && "$ruby_semver" -lt 20800 ]]; then
# Ruby 2.6 checks its MJIT header with a bare $(CC), and the configure script of Ruby 2.7
# (generated by Autoconf 2.71) silently ignores cflags, so the flags go on CC for those.
cc_override="$cc $extra_cflags"
extra_cflags=
fi
fi
( if [ "${CFLAGS+defined}" ] || [ "${!PACKAGE_CFLAGS+defined}" ]; then
export CFLAGS="$CFLAGS ${!PACKAGE_CFLAGS}"
fi
if [ -z "$CC" ] && is_mac 1010; then
export CC=clang
elif [[ "$package_var_name" = "RUBY" && "$ruby_semver" -lt 30200 ]] && is_fedora 42; then
# Fedora 42+ has updated to GCC v15. GCC v15 changed the default
# mode from gnu17 to gnu23: https://gcc.gnu.org/gcc-15/changes.html#c
#
# Ruby < 3.2 can't compile on GCC v15 in the default mode of gnu23.
#
# TODO: Consider changing this to check for GCC v15 specifically
# rather than inspecting the OS itself.
if [ -n "$cc_override" ]; then
export CC="$cc_override"
fi
if [ -n "$extra_cflags" ]; then
# Use the cflags configure variable, which Ruby's configure appends to
# its default optflags/debugflags/warnflags, unlike CFLAGS which would
# override them and notably lose the -O3, producing a -O0 Ruby.
export cflags="-std=gnu17 $cflags"
export cflags="$extra_cflags${cflags:+ $cflags}"
fi
if [ "$package_var_name" = "RUBY" ] && is_mac && ! is_mac 2700; then
# The macOS 27 SDK declares dup3() and pipe2() as available since macOS 27.0.
@ -1297,6 +1318,10 @@ build_package_openssl() {
# Disable SSLv2 and Kerberos on older OpenSSL
[[ "$1" != openssl-1.0.* ]] || package_option openssl configure no-ssl2 no-krb5
# OpenSSL 1.0 can't be built in parallel, as two `ar` runs may create libcrypto.a at once and drop each other's objects.
# OPENSSL_MAKE_OPTS goes after MAKE_OPTS on the make command line, and a user's OPENSSL_MAKE_OPTS still goes after this.
[[ "$1" != openssl-1.0.* ]] || local OPENSSL_MAKE_OPTS="-j 1${OPENSSL_MAKE_OPTS:+ $OPENSSL_MAKE_OPTS}"
# Skip building OpenSSL docs, which is slow.
local make_target="install_sw install_ssldirs"
[[ "$1" != openssl-1.0.* ]] || make_target="install_sw" # OpenSSL 1.0 does not have `install_ssldirs`

View file

@ -0,0 +1,2 @@
require_java 21
install_package "jruby-10.0.8.0" "https://repo1.maven.org/maven2/org/jruby/jruby-dist/10.0.8.0/jruby-dist-10.0.8.0-bin.tar.gz#e33cd86d198d695bd67dc867daf4c31bced385a9f138a00c47f7c12aa1f4e789" jruby

View file

@ -0,0 +1,2 @@
require_java 21
install_package "jruby-10.1.3.0" "https://repo1.maven.org/maven2/org/jruby/jruby-dist/10.1.3.0/jruby-dist-10.1.3.0-bin.tar.gz#3d76fe1fce6aa9f56fd7efb1015a9db95a0aa6f95fe9ec868f9e75d9ddc1871c" jruby

View file

@ -477,6 +477,32 @@ make install
OUT
}
@test "bundled OpenSSL 1.0 is built without parallel make" {
cached_tarball "openssl-1.0.2u" config
mkdir -p "${TMP}/ssl/certs"
touch "${TMP}/ssl/cert.pem"
stub_repeated uname '-s : echo Linux'
stub openssl "version -d : echo 'OPENSSLDIR: \"${TMP}/ssl\"'"
stub_make_install "install_sw"
mkdir -p "$INSTALL_ROOT"/openssl/ssl # OPENSSLDIR
run_inline_definition <<DEF
install_package "openssl-1.0.2u" "https://www.openssl.org/source/openssl-1.0.2u.tar.gz" openssl
DEF
assert_success
unstub uname
unstub make
assert_build_log <<OUT
openssl-1.0.2u: [--prefix=${INSTALL_ROOT}/openssl,--openssldir=${INSTALL_ROOT}/openssl/ssl,--libdir=lib,zlib-dynamic,no-ssl3,shared,-Wl,-rpath,${INSTALL_ROOT}/openssl/lib,no-ssl2,no-krb5]
make -j 2 -j 1
make install_sw
OUT
}
@test "install bundled OpenSSL on macOS" {
cached_tarball "openssl-1.1.1w" config
cached_tarball "ruby-3.2.0" configure

View file

@ -117,3 +117,200 @@ OUT
unstub brew
unstub make
}
# Stubs a Linux host with a ./configure that logs CC
stub_linux_build() {
mkdir -p "$INSTALL_ROOT"
cd "$INSTALL_ROOT" || return 1
stub_repeated uname '-s : echo Linux'
stub_repeated brew 'false'
# shellcheck disable=SC2016
stub_repeated make 'echo "make $(inspect_args "$@")" >> build.log'
cat > ./configure <<CON
#!${BASH}
echo ./configure "\$@" > build.log
echo CC=\${CC-unset} >> build.log
echo cflags=\${cflags-unset} >> build.log
CON
chmod +x ./configure
}
unstub_linux_build() {
unstub uname
unstub brew
unstub make
}
# Stubs the given C compiler (default: gcc) to report the given preprocessor defines
stub_cc() {
stub_repeated "${2:-gcc}" "-E -dM - : printf '%s\n' $1"
}
@test "GCC 15 compiles Ruby < 3.2 as gnu17" {
stub_linux_build
stub_cc '"#define __GNUC__ 15"'
run_inline_definition <<DEF
build_package_standard ruby-3.1.7
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=unset
cflags=-std=gnu17
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}
@test "GCC 15 compiles Ruby 2.6 as gnu17 via CC" {
stub_linux_build
stub_cc '"#define __GNUC__ 15"'
run_inline_definition <<DEF
build_package_standard ruby-2.6.10
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=gcc -std=gnu17
cflags=unset
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}
@test "GCC 15 compiles Ruby 2.7 as gnu17 via CC" {
stub_linux_build
stub_cc '"#define __GNUC__ 15"'
run_inline_definition <<DEF
build_package_standard ruby-2.7.8
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=gcc -std=gnu17
cflags=unset
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}
@test "GCC 15 compiles Ruby <= 2.2 as gnu17" {
stub_linux_build
stub_cc '"#define __GNUC__ 15"'
run_inline_definition <<DEF
build_package_standard ruby-2.2.10
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT
CC=unset
cflags=-std=gnu17
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}
@test "GCC 15 adds -std=gnu17 to a custom CC for Ruby 2.6" {
stub_linux_build
stub_cc '"#define __GNUC__ 15"' gcc-15
export CC=gcc-15
run_inline_definition <<DEF
build_package_standard ruby-2.6.10
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=gcc-15 -std=gnu17
cflags=unset
make -j 2
make install
OUT
unstub gcc-15
unstub_linux_build
}
@test "the C compiler is not probed for Ruby 3.2+" {
stub_linux_build
run_inline_definition <<DEF
build_package_standard ruby-3.2.0
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=unset
cflags=unset
make -j 2
make install
OUT
unstub_linux_build
}
@test "GCC 14 adds no flags for Ruby >= 2.3" {
stub_linux_build
stub_cc '"#define __GNUC__ 14"'
run_inline_definition <<DEF
build_package_standard ruby-3.1.7
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=unset
cflags=unset
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}
@test "Clang masquerading as gcc gets no flags" {
stub_linux_build
stub_cc '"#define __clang__ 1" "#define __GNUC__ 15"'
run_inline_definition <<DEF
build_package_standard ruby-3.1.7
DEF
assert_success
run cat build.log
assert_output <<OUT
./configure --prefix=$INSTALL_ROOT --with-ext=openssl,psych,+
CC=unset
cflags=unset
make -j 2
make install
OUT
unstub gcc
unstub_linux_build
}