mirror of
https://github.com/rbenv/ruby-build.git
synced 2026-11-09 23:59:18 -05:00
Compare commits
5 changed files with 19 additions and 271 deletions
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue