環境
- OS: Ubuntu 26.04 (x86_64)
内容
Ubuntu 26.04で rbenv install 2.6.10 を実行したところ、エラーでインストールできなかった。
いろいろビルドパラメーター変えることでインストール成功した。
とりあえずの解決策
export CFLAGS="-std=gnu11 -Wno-error=incompatible-pointer-types" export RUBY_CONFIGURE_OPTS="--disable-jit-support" rbenv install 2.6.10
以下詳しい話
エラー1
compile.c:618:6: error: too many arguments to function '(VALUE (*)(void))ifunc->func'; expected 0, have 3
原因
GCC 15 はデフォルトで C23 モード(-std=gnu23)を使用する。C23 では、引数なしの関数ポインタ宣言 VALUE (*func)() が VALUE (*func)(void)(引数ゼロ)として解釈される。
これは C11 以前の「引数の型を指定しない」という意味とは異なる。
Ruby 2.6.x の内部では ANYARGS マクロ(C では空に展開される)を使って関数ポインタを宣言しており、それを 3 引数で呼び出しているため、GCC 15 がエラーを出す。
// internal.h struct vm_ifunc { VALUE (*func)(ANYARGS); // C では VALUE (*func)() に展開される ... }; // compile.c (*ifunc->func)(iseq, ret, ifunc->data); // 3引数で呼び出し → C23 でエラー
解決策
-std=gnu11 を指定し、C11 の挙動(() は引数不定)でコンパイルする。
export CFLAGS="-std=gnu11"
エラー2
/tmp/xxxxxx.h:8954:30: error: passing argument 2 of 'rb_hash_foreach' from incompatible pointer type [-Wincompatible-pointer-types] make: *** [uncommon.mk:233: rb_mjit_min_header-2.6.10.h] Error 1
原因
Ruby 2.6 が導入した MJIT(Method-based JIT)は、ビルド時に Ruby 本体のヘッダファイルを GCC でコンパイルして最小ヘッダを生成する。このコンパイルでも同様に古い関数ポインタ型の不一致が発生し、GCC 15 がエラーにする。
解決策
MJIT サポートごと無効化する。RUBY_CONFIGURE_OPTS を使うことで、OpenSSL のビルドには影響を与えずに Ruby の configure にだけオプションを渡せる。
CONFIGURE_OPTS を使うと OpenSSL のビルドにも --disable-jit-support が渡されてしまい、別のエラーが発生する。必ず RUBY_CONFIGURE_OPTS を使うこと。
export RUBY_CONFIGURE_OPTS="--disable-jit-support"