Rbenv ビルドに失敗しました (ruby-build 20230717-7-gf170c16 を使用した Raspbian 11)
概要
ラズベリーパイ 4 に Ruby 3.2.2 をインストールしようとしています。 GitHub リポジトリ、git clone メソッドを使用してすべての手順を実行しましたが、rbenv install 3.2.2 に到達すると、ARM 関連と思われるエラーが表示されます。それはこう言っています:
ログ
pi@raspberrypi:~ $ rbenv install 3.2.2
To follow progress, use 'tail -f /tmp/ruby-build.20230804022323.9672.log' or pass --verbose
Downloading ruby-3.2.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
Installing ruby-3.2.2...
BUILD FAILED (Raspbian 11 using ruby-build 20230717-7-gf170c16)
Inspect or clean up the working tree at /tmp/ruby-build.20230804022323.9672.8D2OlO
Results logged to /tmp/ruby-build.20230804022323.9672.log
Last 10 log lines:
coroutine/arm64/Context.S:56: Error: bad instruction `ldp x21,x22,[sp,0x50]'
coroutine/arm64/Context.S:57: Error: bad instruction `ldp x23,x24,[sp,0x60]'
coroutine/arm64/Context.S:58: Error: bad instruction `ldp x25,x26,[sp,0x70]'
coroutine/arm64/Context.S:59: Error: bad instruction `ldp x27,x28,[sp,0x80]'
coroutine/arm64/Context.S:60: Error: bad instruction `ldp x29,x30,[sp,0x90]'
coroutine/arm64/Context.S:63: Error: ARM register expected -- `ldr x4,[sp,0xa0]'
coroutine/arm64/Context.S:66: Error: shift expression expected -- `add sp,sp,0xb0'
coroutine/arm64/Context.S:69: Error: bad instruction `ret x4'
make: *** [Makefile:468: coroutine/arm64/Context.o] Error 1
make: *** Waiting for unfinished jobs....
それは、aarch64 (私が使用しているもの) に armv7 をインストールしようとすることに関係があることがわかりました。そこで、それに関連することをいくつか調べたところ、次のような情報が得られました。
ユーザービルド
pi@raspberrypi:~ $ uname -m
aarch64
ツールチェーン
pi@raspberrypi:~ $ gcc -v
...
Target: arm-linux-gnueabihf
...
ツールチェーンがシステム パスにあることを確認しました
pi@raspberrypi:~ $ which arm-linux-gnueabihf-gcc
/usr/bin/arm-linux-gnueabihf-gcc
これらの情報を確認したので、次のようにインストールしてみました。
pi@raspberrypi1:~ $ CC=arm-linux-gnueabihf-gcc rbenv install 3.2.2
To follow progress, use 'tail -f /tmp/ruby-build.20230804035531.14026.log' or pass --verbose
Downloading ruby-3.2.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
Installing ruby-3.2.2...
BUILD FAILED (Raspbian 11 using ruby-build 20230717-7-gf170c16)
Inspect or clean up the working tree at /tmp/ruby-build.20230804035531.14026.Mf7gAz
Results logged to /tmp/ruby-build.20230804035531.14026.log
Last 10 log lines:
coroutine/arm64/Context.S:56: Error: bad instruction `ldp x21,x22,[sp,0x50]'
coroutine/arm64/Context.S:57: Error: bad instruction `ldp x23,x24,[sp,0x60]'
coroutine/arm64/Context.S:58: Error: bad instruction `ldp x25,x26,[sp,0x70]'
coroutine/arm64/Context.S:59: Error: bad instruction `ldp x27,x28,[sp,0x80]'
coroutine/arm64/Context.S:60: Error: bad instruction `ldp x29,x30,[sp,0x90]'
coroutine/arm64/Context.S:63: Error: ARM register expected -- `ldr x4,[sp,0xa0]'
coroutine/arm64/Context.S:66: Error: shift expression expected -- `add sp,sp,0xb0'
coroutine/arm64/Context.S:69: Error: bad instruction `ret x4'
make: *** [Makefile:468: coroutine/arm64/Context.o] Error 1
make: *** Waiting for unfinished jobs....
それが失敗したら、次のような別の方法を試しました。
pi@raspberrypi:~ $ export CC=arm-linux-gnueabihf-gcc
pi@raspberrypi:~ $ rbenv install 3.2.2
To follow progress, use 'tail -f /tmp/ruby-build.20230804040854.7501.log' or pass --verbose
Downloading ruby-3.2.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
Installing ruby-3.2.2...
BUILD FAILED (Raspbian 11 using ruby-build 20230717-7-gf170c16)
Inspect or clean up the working tree at /tmp/ruby-build.20230804040854.7501.FKpHuL
Results logged to /tmp/ruby-build.20230804040854.7501.log
Last 10 log lines:
coroutine/arm64/Context.S:56: Error: bad instruction `ldp x21,x22,[sp,0x50]'
coroutine/arm64/Context.S:57: Error: bad instruction `ldp x23,x24,[sp,0x60]'
coroutine/arm64/Context.S:58: Error: bad instruction `ldp x25,x26,[sp,0x70]'
coroutine/arm64/Context.S:59: Error: bad instruction `ldp x27,x28,[sp,0x80]'
coroutine/arm64/Context.S:60: Error: bad instruction `ldp x29,x30,[sp,0x90]'
coroutine/arm64/Context.S:63: Error: ARM register expected -- `ldr x4,[sp,0xa0]'
coroutine/arm64/Context.S:66: Error: shift expression expected -- `add sp,sp,0xb0'
coroutine/arm64/Context.S:69: Error: bad instruction `ret x4'
make: *** [Makefile:468: coroutine/arm64/Context.o] Error 1
make: *** Waiting for unfinished jobs....
それも失敗し、rbenvを使用してRubyをインストールする方法がわかりません。
解決策
おそらく 64 ビット カーネル上で 32 ビット ユーザーランドを実行しており、ビルド スクリプトは uname -a から間違ったアーキテクチャを選択します。アーチを明示的に 32 ビットに設定すると、ビルド スクリプトが正しいものを選択します。
setarch armv7l bash # child shell now reports 32bit arch
rbenv install 3.2.2 # in the child shell
明示的なアーチ設定は、インストール自体にのみ必要です。