Compare commits

..
5 changed files with 19 additions and 271 deletions

View file

@ -208,24 +208,16 @@ is_freebsd() {
[ "$(uname -s)" = "FreeBSD" ] [ "$(uname -s)" = "FreeBSD" ]
} }
# The C compiler that Ruby's configure picks: $CC, otherwise gcc if available, otherwise cc. is_fedora() {
c_compiler() { [ -r /etc/os-release ] || return 1
if [ -n "$CC" ]; then # shellcheck disable=SC1091
echo "$CC" source /etc/os-release
elif command -v gcc >/dev/null; then # Treat Aurora, Bazzite, BlueFin, uCore, and other Fedora variants as "fedora".
echo gcc if [[ "${ID_LIKE:-$ID}" != "fedora" || ( $# -gt 0 && "${VERSION_ID%%.*}" -lt "$1") ]]; then
else return 1
echo cc
fi 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() { freebsd_package_prefix() {
local package="$1" local package="$1"
pkg info --prefix "$package" 2>/dev/null | cut -wf2 pkg info --prefix "$package" 2>/dev/null | cut -wf2
@ -743,37 +735,24 @@ build_package_standard() {
fi fi
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 ( if [ "${CFLAGS+defined}" ] || [ "${!PACKAGE_CFLAGS+defined}" ]; then
export CFLAGS="$CFLAGS ${!PACKAGE_CFLAGS}" export CFLAGS="$CFLAGS ${!PACKAGE_CFLAGS}"
fi fi
if [ -n "$cc_override" ]; then if [ -z "$CC" ] && is_mac 1010; then
export CC="$cc_override" export CC=clang
fi elif [[ "$package_var_name" = "RUBY" && "$ruby_semver" -lt 30200 ]] && is_fedora 42; then
if [ -n "$extra_cflags" ]; 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.
# Use the cflags configure variable, which Ruby's configure appends to # Use the cflags configure variable, which Ruby's configure appends to
# its default optflags/debugflags/warnflags, unlike CFLAGS which would # its default optflags/debugflags/warnflags, unlike CFLAGS which would
# override them and notably lose the -O3, producing a -O0 Ruby. # override them and notably lose the -O3, producing a -O0 Ruby.
export cflags="$extra_cflags${cflags:+ $cflags}" export cflags="-std=gnu17 $cflags"
fi fi
if [ "$package_var_name" = "RUBY" ] && is_mac && ! is_mac 2700; then 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. # The macOS 27 SDK declares dup3() and pipe2() as available since macOS 27.0.
@ -1318,10 +1297,6 @@ build_package_openssl() {
# Disable SSLv2 and Kerberos on older OpenSSL # Disable SSLv2 and Kerberos on older OpenSSL
[[ "$1" != openssl-1.0.* ]] || package_option openssl configure no-ssl2 no-krb5 [[ "$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. # Skip building OpenSSL docs, which is slow.
local make_target="install_sw install_ssldirs" local make_target="install_sw install_ssldirs"
[[ "$1" != openssl-1.0.* ]] || make_target="install_sw" # OpenSSL 1.0 does not have `install_ssldirs` [[ "$1" != openssl-1.0.* ]] || make_target="install_sw" # OpenSSL 1.0 does not have `install_ssldirs`

View file

@ -1,2 +0,0 @@
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

@ -1,2 +0,0 @@
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,32 +477,6 @@ make install
OUT 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" { @test "install bundled OpenSSL on macOS" {
cached_tarball "openssl-1.1.1w" config cached_tarball "openssl-1.1.1w" config
cached_tarball "ruby-3.2.0" configure cached_tarball "ruby-3.2.0" configure

View file

@ -117,200 +117,3 @@ OUT
unstub brew unstub brew
unstub make 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
}