Ruby-1.8.7_p160 openssl編
さて、続いてはopensslだ。まずは失敗したテスト結果を見てみよう。
3) Failure: test_client_auth(OpenSSL::TestSSL) [./openssl/test_ssl.rb:216:in `test_client_auth' ./openssl/test_ssl.rb:129:in `call' ./openssl/test_ssl.rb:129:in `start_server' ./openssl/test_ssl.rb:215:in `test_client_auth']: <OpenSSL::SSL::SSLError> exception expected but was Class: <Errno::ECONNRESET> Message: <"\212\371\221\266\202\314\220\332\221\261\202\315\203\212\203\202\201[\203g \203z\203X\203g\202\311\213\255\220\247\22 3I\202\311\220\330\222f\202\263\202\352\202\334\202\265\202\275\201B - SSL_connect"> ---Backtrace--- ./openssl/test_ssl.rb:219:in `connect' ./openssl/test_ssl.rb:219:in `test_client_auth' ./openssl/test_ssl.rb:216:in `test_client_auth' ./openssl/test_ssl.rb:129:in `call' ./openssl/test_ssl.rb:129:in `start_server' ./openssl/test_ssl.rb:215:in `test_client_auth' ---------------
メッセージが化けていて全く読めないが、errno※に対応するクラスからして接続先からのリセット(接続の切断)だろう。
※WindowsのGetLastErrorと同じように直近で発生したエラーの情報に対応したクラス。これもUNIXでは当たり前だが、そのことが明記されていないことが多く(UNIXではerrnoは知ってて当たり前だから?)理解に苦しんだ部分だ。
取り敢えず最新のソースコードでビルドをし直してみよう。
OpenSSL for Windows
- ActivePerlインストール
本コンポーネントのConfigureとMakeにはperl実行モジュールが必要だ。いろいろあると思うがWindowsの場合はTcl同様にActiveStateのActivePerlをインストールしてしまうのが一番簡単だろう。
ActivePerl/ActiveState
インストールするとperlモジュールへのパスが通るので、perlスクリプトが実行可能になる。
- configure
perlをインストールしたので早速Configureを実行する。オプションはREADMEを参考にして設定した。
E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl Configure VC-WIN32 --prefix=e:\openssl -D_WIN32_WINNT=0x0600 Configuring for VC-WIN32 : : Configured for VC-WIN32.
- Makefile作成
Configureが終わればMakeFileを作成して実際にnmakeを実行するだけだ。
E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>ms\do_ms E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mkfiles.pl 1>MINFO E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mk1mf.pl no-asm VC-WIN32 1>ms\nt.mak E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl util\mk1mf.pl dll no-asm VC-WIN32 1>ms\ntdll.mak : :
- nmake実行
これもREADMEのまま。
E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>nmake -f ms\ntdll.mak : : cl /Fotmp32dll\cversion.obj -Iinc32 -Itmp32dll /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -D_WIN32_WINNT=0x0600 -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -D_WINDLL -DOPENSSL_BUILD_SHLIBCRYPTO -DMK1MF_BUILD -DMK1MF_PLATFORM_VC_WIN32 -c .\crypto\cversion.c cversion.c .\crypto\cversion.c(105) : error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。 .\crypto\cversion.c(105) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。 NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : リターン コード '0x2' Stop.
なんでコンパイルが通らないソースがあるんだ?? と憤りながらソースコードを見ると
- cversion.c
const char *SSLeay_version(int t) : : 102 if (t == SSLEAY_DIR) 103 { 104 #ifdef OPENSSLDIR 105 return "OPENSSLDIR: \"" OPENSSLDIR "\""; 106 #else 107 return "OPENSSLDIR: N/A"; 108 #endif 109 }
これか。Win32ではテストしていないのかな。取り敢えず以下のように修正して再コンパイル。
105 return "OPENSSLDIR: \" OPENSSLDIR \"";
それっ。
: cl /Fotmp32dll\x509_def.obj -Iinc32 -Itmp32dll /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -D_WIN32_WINNT=0x0600 -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -D_WINDLL -DOPENSSL_BUILD_SHLIBCRYPTO -c .\crypto\x509\x509_def.c x509_def.c .\crypto\x509\x509_def.c(65) : error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。 .\crypto\x509\x509_def.c(65) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。 .\crypto\x509\x509_def.c(68) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。 .\crypto\x509\x509_def.c(71) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。 .\crypto\x509\x509_def.c(74) : warning C4129: 'o' : エスケープ シーケンスとして正しく認識されませんでした。 NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : リターン コード '0x2' Stop.
またか。使用されているマクロを調べるとConfigureで作成したヘッダに問題があるようだ。
- opensslconf.h
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) #define ENGINESDIR "e:\openssl/lib/engines" #define OPENSSLDIR "e:\openssl/ssl" #endif #endif
よくあるWindowsとUNIXのファイルセパレータ問題か。Configure時の指定をし直して再実行。
E:\ruby_build_image\openssl-0.9.8h\src\openssl\0.9.8h\openssl-0.9.8h>perl Configure VC-WIN32 --prefix=e:/openssl -D_WIN32_WINNT=0x0600 Configuring for VC-WIN32 : Configured for VC-WIN32.
コンパイルが通ったのでインストールする。
nmake -f ms\ntdll.mak install
これでSxSでMSVCR80.DLLを参照するバイナリを含む成果物がe:\openssl下に出来た。
E:\OpenSSL | +---bin | libeay32.dll | openssl.exe | ssleay32.dll | +--include | +-- openssl | |ヘッダ群 | | | +--lib | libeay32.lib | ssleay32.lib
さて、あとはいつも通り成果物をext\opensslディレクトリに置いてRubyの拡張ライブラリィをビルドしよう。
長くなったので、続きは次回。