Techioz Blog

Ruby で make install を実行中に RVM エラーが発生する

概要

Ruby 2.7.2 のインストール中に次のエラーが発生します。

Error running '__rvm_make -j10',
please read /Users/rifa.fauzi/.rvm/log/1692949367_ruby-2.7.2/make.log

There has been an error while running make. Halting the installation.

make.log ファイルを確認すると、次のようなエラーが発生しました。

    CFLAGS = -w -ggdb3 -Wno-error=implicit-function-declaration -std=gnu99  -fno-common -pipe 
compiling error.c
compiling regerror.c
./miniruby -I./lib -I. -I.ext/common  ./tool/transform_mjit_header.rb "gcc  -w -ggdb3 -Wno-error=implicit-function-declaration -std=gnu99  -fno-common -pipe " rb_mjit_header.h .ext/include/arm64-darwin22/rb_mjit_min_header-2.7.2.h
compiling dataerror.c
ossl_pkey_rsa.c:942:5: error: use of undeclared identifier 'RSA_SSLV23_PADDING'
1 error generated.
make[2]: *** [ossl_pkey_rsa.o] Error 1
make[1]: *** [ext/openssl/all] Error 2
make: *** [build-ext] Error 2

参考までに、RVM (rvm install 2.7.2) を使用して Ruby をインストールしました。 https://rvm.io/rvm/security#alternatives

すでにエラーについてグーグルで調べていますが、まだ解決策が見つかりません。

解決策

openssl 3 は多くのアプリに必要であるため、Ruby に影響を与えずに適切なバージョンを見つける方法を示したいとします。

brew install [email protected]
PKG_CONFIG_PATH=$(brew --prefix [email protected])/lib/pkgconfig rvm install 2.7.2

これが最悪の理由は、UNIX システムで C ライブラリを探す方法が 2 つあるためです。標準名を試すか、ヘッダー ファイル (コンパイラへの -I フラグ) とライブラリ パス (コンパイラへの -L フラグ) の両方へのパスを指定します。成功するために必要なパスは 2 つあり、バージョンが一致しない場合は、比較的わかりにくいあらゆる種類のエラーが発生する可能性があるため、誰かが pkg-config というスクリプトを発明しました。これを実行すると、pkg-config –libs openssl が表示されます。最後に openssl をリンクするためのフラグを指定し、pkg-config –cflags openssl は openssl を使用するソース ファイルをコンパイルするためのフラグを指定します。

Ruby の –with-openssl-dir は、最初にディレクトリを設定します。手動で -L と -I をコンパイラに設定します。少し古いやり方で、pkg-config 以前に行われる一般的な方法です。私の知る限り、それは autoconf から始まり、ruby はその宿題をコピーしました。すべて順調です。

openssl 拡張機能の extconf.rb は、「Windows の場合はこれを試し、pkgconfig ファイルがある場合はそれを使用し、そうでない場合は –with-openssl-dir フラグを使用して、いつもの場所を試してみて、何かうまくいくといいのですが」

そして、そこでは pkgconfig が最初に来ていることに気づくかもしれません。したがって、openssl に pkgconfig がある場合、 with flag は何も行いません。

openssl 1.1で追加されたと思います。

したがって、1.0 がメインの openssl である場合は正常に動作します。 1.1がメインのときは問題なく動作しました。 openssl 2 と 3 が登場すると、1.1 の pkgconfig ファイルはプライベートの homebrew ディレクトリに隠蔽されました。

–with-openssl-dir フラグは有効ですが、openssl に pkgconfig がある場合は実際には何も行いません。

したがって、pkg-config が受け入れる環境変数を持つ正しい pkgconfig を強制的に使用すると、ruby extconf.rb は正しい openssl を見つけます。

次のように、それがどのように影響するかを確認できます。

:; pkg-config --cflags openssl
-I/opt/homebrew/Cellar/openssl@3/3.2.0/include

:; PKG_CONFIG_PATH=$(brew --prefix [email protected])/lib/pkgconfig pkg-config --cflags openssl
-I/opt/homebrew/Cellar/[email protected]/1.1.1w/include