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