M1 Max Macbook Proにrbenv経由でRubyをインストールしようとしたところ、エラーが発生してインストールできませんでした。
この原因調査と対応にほぼ丸一日時間を費やしてしまったので、戒めも込めて記事にすることにしました。 誰かのお役に立てれば幸いです。
readlineでエラーが発生している
rbenv経由でRuby 3.1.0をインストールしようとしたら以下のエラーで失敗になってしまいました。
Downloading ruby-3.1.0.tar.gz... -> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz Installing ruby-3.1.0... ruby-build: using readline from homebrew BUILD FAILED (macOS 12.2.1 using ruby-build 20220218) Inspect or clean up the working tree at /var/folders/t3/xx1z7jpj0zbfj_rwd9jh8bm00000gn/T/ruby-build.20220323144141.55529.x88PvV Results logged to /var/folders/t3/xx1z7jpj0zbfj_rwd9jh8bm00000gn/T/ruby-build.20220323144141.55529.log Last 10 log lines: compiling ossl_x509ext.c compiling ossl_x509name.c compiling ossl_x509req.c compiling ossl_x509revoked.c compiling ossl_x509store.c linking shared-object psych.bundle linking shared-object date_core.bundle installing default openssl libraries linking shared-object openssl.bundle make: *** [build-ext] Error 2
Results logged to /var/folders/t3/xx1z7jpj0zbfj_rwd9jh8bm00000gn/T/ruby-build.20220323144141.55529.log
と記載があるように、まずはログを確認してみます。
compiling readline.c compiling ossl_cipher.c linking shared-object objspace.bundle compiling psych_emitter.c readline.c:1903:37: error: use of undeclared identifier 'username_completion_function'; did you mean 'rl_username_completion_function'? rl_username_completion_function); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rl_username_completion_function readline.c:79:42: note: expanded from macro 'rl_username_completion_function' # define rl_username_completion_function username_completion_function ^ /usr/local/opt/readline/include/readline/readline.h:485:14: note: 'rl_username_completion_function' declared here extern char *rl_username_completion_function PARAMS((const char *, int)); ^ compiling psych_parser.c 1 error generated. make[2]: *** [readline.o] Error 1 make[1]: *** [ext/readline/all] Error 2 make[1]: *** Waiting for unfinished jobs....
ログにはmake[2]: *** [readline.o] Error 1
と出力されていますので、readlineでエラーが発生していることが確認できます。
make[1]: *** [ext/readline/all] Error 2
やrl_username_completion_function
などの文言も気になります。
使用されているreadlineに問題がありそう
- m1 mac rbenv install
- BUILD FAILED (macOS 12.2.1 using ruby-build 20220218)
- rbenv readline m1 mac
- "rl_username_completion_function"
等の文言で検索してヒットした記事を参考にしたところ、以下のようなコマンドでインストールするのが有効だと分かりました。
RUBY_CONFIGURE_OPTS=--with-readline-dir="$(brew --prefix readline)" rbenv install 3.1.0
このコマンドではhomebrew経由でインストールされているreadlineを使用してrubyをインストールするというオプションを指定しています。
今回のようなエラーの場合、ほとんどのケースではこのコマンドを実行することで無事にインストールできるかと思います。
しかしながら私の環境では、このインストール方法を用いても依然として同様のエラーが発生してしましました。
homebrew自体に問題がありそう
エラーログをよく確認してみるとruby-build: using readline from homebrew
と出力されていますので、すでにhomebrew経由でreadlineを使用していたということが確認できました。
ということはhomebrewでインストールされているreadline自体に問題がありそうだと考えました。
brew update readline
を実行してみても特に変化はありません。
改めて記事を検索していたところ、この記事にヒントが有りました。
Building Ruby 3 on Mac M1 ARM — brandur.org
readlineの向き先としてhomebrewにインストールされているモジュールを使用するオプションを指定するのですが、Rosetta版のとARM版とでhomebrewのインストール先が違うという点でした。
確認してみると、私のmac上にはRosetta版がインストールされていました。
homebrewをアンインストールして、改めてARM版のhomebrewをインストールしたところ、Rubyのインストールが正常に行われました。
結論
私の場合、ARM版のhomebrewがインストールされておらず、コンパイルに失敗するというのが原因でした。
思い返してみるとintel Macから移行アシスタントを使用してM1 Macの環境構築をしていました。その際、あまり意識せずにRossetaの使用確認を許可したのだと思われます。
移行後はDocker環境で動かすことがほとんどでしたので、homebrewを使用する機会が今の今まで訪れず、ようやく問題が露呈されたということになります。
ひとまず一件落着です。