mirror of
https://github.com/rbenv/ruby-build.git
synced 2026-11-09 15:49:20 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
573f87a93b |
||
|
|
3943d26446 | ||
|
|
cd54d2c33d |
||
|
|
efb9c19a56 |
||
|
|
4ef3159f94 |
||
|
|
6c959eabd8 | ||
|
|
b84455fe38 |
||
|
|
091a117c6f | ||
|
|
1123436bc9 |
||
|
|
13e8b39e0b |
5 changed files with 271 additions and 19 deletions
|
|
@ -208,16 +208,24 @@ is_freebsd() {
|
||||||
[ "$(uname -s)" = "FreeBSD" ]
|
[ "$(uname -s)" = "FreeBSD" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
is_fedora() {
|
# The C compiler that Ruby's configure picks: $CC, otherwise gcc if available, otherwise cc.
|
||||||
[ -r /etc/os-release ] || return 1
|
c_compiler() {
|
||||||
# shellcheck disable=SC1091
|
if [ -n "$CC" ]; then
|
||||||
source /etc/os-release
|
echo "$CC"
|
||||||
# Treat Aurora, Bazzite, BlueFin, uCore, and other Fedora variants as "fedora".
|
elif command -v gcc >/dev/null; then
|
||||||
if [[ "${ID_LIKE:-$ID}" != "fedora" || ( $# -gt 0 && "${VERSION_ID%%.*}" -lt "$1") ]]; then
|
echo gcc
|
||||||
return 1
|
else
|
||||||
|
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
|
||||||
|
|
@ -735,24 +743,37 @@ 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 [ -z "$CC" ] && is_mac 1010; then
|
if [ -n "$cc_override" ]; then
|
||||||
export CC=clang
|
export CC="$cc_override"
|
||||||
elif [[ "$package_var_name" = "RUBY" && "$ruby_semver" -lt 30200 ]] && is_fedora 42; then
|
fi
|
||||||
# Fedora 42+ has updated to GCC v15. GCC v15 changed the default
|
if [ -n "$extra_cflags" ]; then
|
||||||
# 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="-std=gnu17 $cflags"
|
export cflags="$extra_cflags${cflags:+ $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.
|
||||||
|
|
@ -1297,6 +1318,10 @@ 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`
|
||||||
|
|
|
||||||
2
share/ruby-build/jruby-10.0.8.0
Normal file
2
share/ruby-build/jruby-10.0.8.0
Normal 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
|
||||||
2
share/ruby-build/jruby-10.1.3.0
Normal file
2
share/ruby-build/jruby-10.1.3.0
Normal 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
|
||||||
|
|
@ -477,6 +477,32 @@ 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,3 +117,200 @@ 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