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" ]
|
||||
}
|
||||
|
||||
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`
|
||||
|
|
|
|||
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
|
||||
}
|
||||
|
||||
@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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue