Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

rbenv: Ruby 3.0.xのビルドがbinutilsでエラーになった

しょうもないところで詰まりました。

現象

macOS Big Sur環境でrbenv install 3.0.2rbenv install 3.0.1を実行すると以下のエラーが発生しました。rbenv install 2.7.4rbenv install 2.6.8ではなぜか発生しませんでした。

$ rbenv install 3.0.2
Downloading ruby-3.0.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.2.tar.gz
Installing ruby-3.0.2...
ruby-build: using readline from homebrew

BUILD FAILED (macOS 11.4 using ruby-build 20210707-4-gebdcf0c)

Inspect or clean up the working tree at /var/folders/3x/sfj972cx6vnddfqpk5yv36m00000gn/T/ruby-build.20210708152635.35557.WWeFzy
Results logged to /var/folders/3x/sfj972cx6vnddfqpk5yv36m00000gn/T/ruby-build.20210708152635.35557.log

Last 10 log lines:
compiling rb_str_dup.c
installing default date_core libraries
installing digest libraries
compiling set_len.c
linking shared-object digest.bundle
linking shared-object etc.bundle
linking shared-object dbm.bundle
linking shared-object -test-/string.bundle
linking shared-object date_core.bundle
make: *** [build-ext] Error 2

メッセージに表示されたログファイルを開くと以下のようにbigdecimal.cのビルドがコケていました。

# 略
In file included from bigdecimal.c:13:
./bigdecimal.h:122:1: error: redefinition of 'rb_array_const_ptr'
rb_array_const_ptr(VALUE a)
^
../.././include/ruby/internal/core/rarray.h:184:1: note: previous definition is here
rb_array_const_ptr(VALUE a)
^
In file included from bigdecimal.c:13:
./bigdecimal.h:139:1: error: static declaration of 'rb_sym2str' follows non-static declaration
rb_sym2str(VALUE sym)
^
../.././include/ruby/internal/symbol.h:63:7: note: previous declaration is here
VALUE rb_sym2str(VALUE);
      ^
bigdecimal.c:108:1: error: static declaration of 'rb_rational_num' follows non-static declaration
rb_rational_num(VALUE rat)
^
../.././include/ruby/internal/intern/rational.h:39:7: note: previous declaration is here
VALUE rb_rational_num(VALUE rat);
      ^
bigdecimal.c:120:1: error: static declaration of 'rb_rational_den' follows non-static declaration
rb_rational_den(VALUE rat)
^
../.././include/ruby/internal/intern/rational.h:40:7: note: previous declaration is here
VALUE rb_rational_den(VALUE rat);
      ^
bigdecimal.c:132:1: error: static declaration of 'rb_complex_real' follows non-static declaration
rb_complex_real(VALUE cmp)
^
../.././include/ruby/internal/intern/complex.h:38:7: note: previous declaration is here
VALUE rb_complex_real(VALUE z);
      ^
bigdecimal.c:144:1: error: static declaration of 'rb_complex_imag' follows non-static declaration
linking shared-object -test-/tracepoint.bundle
rb_complex_imag(VALUE cmp)
^
../.././include/ruby/internal/intern/complex.h:39:7: note: previous declaration is here
VALUE rb_complex_imag(VALUE z);
      ^
# 略

1. Command Line Toolsが最新であることを確認する

よくある原因は、MacのCommand Line Toolsが古くなっているというものだそうです。Command Line Toolsのインストール/アンインストール方法はちょくちょく変わっていましたが、現在は以下のようにコマンドラインでできるようになっています。

参考: 3.0.0-preview2 install failed (Mac OS X 10.15.7 using ruby-build 20201210) · Issue #1505 · rbenv/ruby-build

# issue #1505 #issuecomment-752274233より
$ sudo rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install
$ sudo xcode-select -s /Library/Developer/CommandLineTools

しかし自分の場合は、これを行っても引き続きエラーになりました。

2. binutilsとcoreutilsをチェックする

さらに調べてみると、少し前に何かの都合で自分がHomebrewでインストールしたbinutilsとcoreutilsが怪しそうです。

.profileで以下をコメントアウトしてからbashに再ログインしました。

# ~/.profile
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

export LDFLAGS="-L/usr/local/opt/binutils/lib"
export CPPFLAGS="-I/usr/local/opt/binutils/include"
export PATH="/usr/local/opt/binutils/bin:$PATH"

今度はrbenv install 3.0.2で3.0.2のインストールに成功しました!

$ rbenv install 3.0.2
Downloading ruby-3.0.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.2.tar.gz
Installing ruby-3.0.2...
ruby-build: using readline from homebrew
Installed ruby-3.0.2 to /Users/hachi8833/.anyenv/envs/rbenv/versions/3.0.2

後で切り分けてみると、原因はbinutilsの方でした。

さしあたってどちらも使っていないので、brew uninstall binutils coreutils; brew cleanupを実行してbinutilsとcoreutilsを削除しました。

関連記事

Bash: .bashrcと.bash_profileの違いを今度こそ理解する


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。