行動すれば次の現実

テック中心の個人ブログ

M1 Macbook Proにrbenv経由でRubyをインストールしようとしたらエラーになってハマった

f:id:furu07yu:20220324164425p:plain 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 2rl_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を使用する機会が今の今まで訪れず、ようやく問題が露呈されたということになります。

ひとまず一件落着です。