rbenv をつかって ruby を管理しており、v3(v3.1.3~、v3.2.0~)をインストールしたところ以下のようなエラーが出て困っている人向けの記事です。
compiling miniinit.c
In file included from vm_core.h:164:0,
from iseq.h:14,
from mini_builtin.c:3,
from miniinit.c:51:
thread_pthread.h:109:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'struct'
RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
^
In file included from iseq.h:14:0,
from mini_builtin.c:3,
from miniinit.c:51:
vm_core.h: In function 'rb_current_execution_context':
vm_core.h:1865:34: error: 'ruby_current_ec' undeclared (first use in this function)
rb_execution_context_t *ec = ruby_current_ec;
^
vm_core.h:1865:34: note: each undeclared identifier is reported only once for each function it appears in
miniinit.c: At top level:
cc1: warning: unrecognized command line option "-Wno-tautological-compare" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-self-assign" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-parentheses-equality" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-constant-logical-operand" [enabled by default]
cc1: warning: unrecognized command line option "-Wno-cast-function-type" [enabled by default]
make: *** [miniinit.o] Error 1
gcc を新しいものにすれば解決するようですが、環境がそれをゆるさらない人もいるかもしれません(わたしがそうでした、許されないってほど強いものではないですが…)
https://github.com/overleo/ruby322patch
ここにパッチを用意したのでこれを使ってインストールすれば解決するはず。
rbenv install --patch 3.2.2 < ruby32_bugfix.patch
あとはどうやってこのパッチを作ったか、です。
なぜコンパイル時にエラーが出るのか
https://ml.ruby-lang.org/mailman3/hyperkitty/list/ruby-core@ml.ruby-lang.org/thread/Q4Y44DVL3FIBNZ3WFIACLED46C75LXPU/
こちらにバグレポートが上がっていますが、autoconf が -std=gnu11
を追加し、古い gcc では通らなくなるようです。
3.2.x ではこの対処のための変更が追加されているようにも見えますがなぜか同様のエラーでコンパイルできない…。
Ruby 3.3.0-preview1 をためしてみた
コンパイルが通る。
つかり 3.3.0-preview1 までの変更でなにかが変わったはず…。ということでそのコミットを頑張って探しました。
該当コミットをパッチにする
https://github.com/ruby/ruby/commit/96d1acfdf6c6b42f2029f44d5b5920961d6efa92
これです。
git format-patch -1 f99af43
該当コミットをパッチ形式にして github にあげたものが、この手順で作成したものです。
以上。