strawberry perl に DB_File モジュールをインストールする方法
会社のえろい人に Windows で ActivePerl 使っている時点で負け。Strawberry Perl にスイッチしろって言われてから Strawberry Perl を愛用しています。Windows なのに ppm じゃなくて cpan 使ってモジュールを管理できるのがすごく自然な感じです。
もう ActivePerl には戻れません。
なんと言っても gcc 環境がくっついてくるので XS 系のモジュールもコンパイルできちゃうのが素晴らしいです。nmake.exe をダウンロードしてきて、あーだこーだとコンパイルできなくて悩まなくてすみます。コンパイルに失敗してもコマンドプロンプトを立ち上げて、いつものように、ちょこちょこっといじって手動でインストールを続行したりもできます。
がっ!・・・DB_File がなんだかうまく入らないことに気がつきました。ちょこちょこっとぐぐったらすぐに情報がでてきましたが、備忘録としてインストールメモ晒しておきます。
まず参考にしたのは Install DB File on Strawberry Perl - Win32 Perl Wiki っていうページ。ってかこのページの手順にそってやればよいだけですが、英語なので、以下の記述は日本語化してみたって感じです。
インストール手順は以下の通り
- Oracle - Berkeley DB 4.6.21 のインストール
- Berkeley DB 4.6.21 の include フォルダを c:\strawberry\c\include\db 内にコピー
- Berkeley DB 4.6.21 の lib\libdb46.lib を c:\strawberry\c\lib\libdb.a としてコピー
- c:\strawberry\c\include\db\db.h の修正
- DB_File をあれこれして手動でインストールする
Oracle - Berkeley DB 4.6.21 のインストール
現時点では Berkeley DB 4.7.25 だけど最新のヤツだとコンパイルが失敗するので 4.6.21 を使う必要があります。 http://www.oracle.com/technology/software/products/berkeley-db/db/index.html から 4.6.21 をダウンロードします。下記のリンクの部分がそうです。ダウンロードしたらインストール。まぁデフォルトのままでインストールして問題ないと思います。
DB_File をインストールする前準備
- C:\strawberry\c\include 配下に db ディレクトリを作成。
- C:\Program Files\Oracle\Berkeley DB 4.6.21\include 配下のファイルを全て C:\strawberry\c\include\db 配下にコピーする。
- C:\Program Files\Oracle\Berkeley DB 4.6.21\lib\libdb46.lib を C:\strawberry\c\lib\libdb.a としてコピーする。
- C:\strawberry\c\include\db\db.h の118行目と131行目を以下の赤文字のように修正する。
typedef u_int64_t uintmax_t; #ifdef _WIN64 typedef u_int64_t uintptr_t; #else //typedef u_int32_t uintptr_t; #endif /* * Windows defines off_t to long (i.e., 32 bits). We need to pass 64-bit * file offsets, so we declare our own. */ #define off_t __db_off_t typedef int64_t off_t; typedef int pid_t; #ifdef _WIN64 typedef int64_t ssize_t; #else //typedef int32_t ssize_t; #endif
CPAN で DB_File をインストール → 必ず失敗する。
- コマンドプロンプトを立ち上げ、cpan と入力して cpan-shell を起動する。
- cpan> install DB_File
DB_File をインストールするが、必ず失敗する。以下インストール失敗時のログ。cpan> install DB_File Database was generated on Tue, 22 Jul 2008 19:45:00 GMT Running install for module 'DB_File' Running make for P/PM/PMQS/DB_File-1.817.tar.gz Checksum for C:\strawberry\cpan\sources\authors\id\P\PM\PMQS\DB_File-1.817.tar.g z ok Scanning cache C:\strawberry\cpan\build for sizes ............................................................................DONE CPAN.pm: Going to build P/PM/PMQS/DB_File-1.817.tar.gz Parsing config.in... Looks Good. Checking if your kit is complete... Looks good Writing Makefile for DB_File cp DB_File.pm blib\lib\DB_File.pm AutoSplitting blib\lib\DB_File.pm (blib\lib\auto\DB_File) gcc -c -IC:\strawberry\c\include -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_ IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\usr\lib\CORE" -D_ NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t version.c version.c:30:16: db.h: No such file or directory dmake.EXE: Error code 129, while making 'version.o' PMQS/DB_File-1.817.tar.gz C:\strawberry\c\bin\dmake.EXE -- NOT OK Running make test Can't test without successful make Running make install Make had returned bad status, install seems impossible Failed during this command: PMQS/DB_File-1.817.tar.gz : make NO
- cpan を exit する。
config.in を修正して DB_File を手動で dmake してインストール
- コマンドプロンプトから C:\strawberry\cpan\build 配下にある DB_File-1.817 へ移動。
- config.in をメモ帳なりで開いて、下の方に赤文字部分を追記する。
#DBNAME = -ldb-2.4.10 INCLUDE = \strawberry\c\include\db LIB = \strawberry\c\lib DBNAME = -ldb # end of file config.in
- いつもの手順で手動でインストールする。以下インストールログです。赤文字の部分が入力部分です。
C:\strawberry\cpan\build\DB_File-1.817-gFYkna>perl Makefile.PL Parsing config.in... Looks Good. Checking if your kit is complete... Looks good Writing Makefile for DB_File C:\strawberry\cpan\build\DB_File-1.817-gFYkna>dmake cp DB_File.pm blib\lib\DB_File.pm AutoSplitting blib\lib\DB_File.pm (blib\lib\auto\DB_File) gcc -c -I\strawberry\c\include\db -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry\perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_i nt32_t version.c C:\strawberry\perl\bin\perl.exe C:\strawberry\perl\lib\ExtUtils\xsubpp -noprototypes -typemap C:\strawberry\perl\lib\ExtUtils\typemap -typemap typemap DB_File.xs > DB_File.xsc && C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e mv DB_File.xsc DB_File.c gcc -c -I\strawberry\c\include\db -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry\perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_i nt32_t DB_File.c Running Mkbootstrap for DB_File () C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e chmod 644 DB_File.bs C:\strawberry\perl\bin\perl.exe -MExtUtils::Mksymlists \ -e "Mksymlists('NAME'=>\"DB_File\", 'DLBASE' => 'DB_File', 'DL_FUNCS' => { }, 'FUNCLIST' => [], 'IMPORTS' => { }, 'DL_VARS' => []);" dlltool --def DB_File.def --output-exp dll.exp g++ -o blib\arch\auto\DB_File\DB_File.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"c:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" version.o DB_File.o -Wl,--image-base,0x2d2e0000 C:\strawberry\perl\lib\CORE\libperl58.a \strawberry\c\lib\libdb.a \strawberry\c\lib\libmsvcrt.a \strawberry\c\lib\l ibmoldname.a \strawberry\c\lib\libkernel32.a \strawberry\c\lib\libuser32.a \strawberry\c\lib\libgdi32.a \strawberry\c\lib\libwinspool.a \strawberry\c\lib\libcomdlg32.a \strawberry\c\lib\libadvapi32.a \strawberry\c\lib\libshell32.a \strawberry\c\lib\libole32.a \strawberry\c\lib\liboleaut32.a \strawbe rry\c\lib\libnetapi32.a \strawberry\c\lib\libuuid.a \strawberry\c\lib\libws2_32.a \strawberry\c\lib\libmpr.a \strawberry\c\lib\libwinmm.a \strawberry\c\lib\libversion.a \strawberry\c\lib\libodbc32.a \strawberry\c\lib\libodbccp32.a dll.exp dlltool --def DB_File.def --base-file dll.base --output-exp dll.exp g++ -o blib\arch\auto\DB_File\DB_File.dll -mdll -s -L"c:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" version.o DB_File.o -Wl,--image-base,0x2d2e0000 C:\strawberry\perl\lib\CORE\libperl58.a \strawberry\c\lib\libdb.a \strawberry\c\lib\libmsvcrt.a \strawberry\c\lib\libmoldname.a \strawberry\c\li b\libkernel32.a \strawberry\c\lib\libuser32.a \strawberry\c\lib\libgdi32.a \strawberry\c\lib\libwinspool.a \strawberry\c\lib\libcomdlg32.a \strawberry\c\lib\libadvapi32.a \strawberry\c\lib\libshell32.a \strawberry\c\lib\libole32.a \strawberry\c\lib\liboleaut32.a \strawberry\c\lib\libnetapi32.a \stra wberry\c\lib\libuuid.a \strawberry\c\lib\libws2_32.a \strawberry\c\lib\libmpr.a \strawberry\c\lib\libwinmm.a \strawberry\c\lib\libversion.a \strawberry\c\lib\libodbc32.a \strawberry\c\lib\libodbccp32.a dll.exp C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e chmod 755 blib\arch\auto\DB_File\DB_File.dll C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e cp DB_File.bs blib\arch\auto\DB_File\DB_File.bs C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e chmod 644 blib\arch\auto\DB_File\DB_File.bs C:\strawberry\cpan\build\DB_File-1.817-gFYkna>dmake test C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.t t/db-btree....ok t/db-hash.....ok t/db-recno....ok t/pod.........ok All tests successful. Files=4, Tests=568, 13 wallclock secs ( 0.16 usr + 0.05 sys = 0.20 CPU) Result: PASS C:\strawberry\cpan\build\DB_File-1.817-gFYkna>dmake install Files found in blib\arch: installing files in blib\lib into architecture dependent library tree Installing C:\strawberry\perl\lib\auto\DB_File\DB_File.bs Installing C:\strawberry\perl\lib\auto\DB_File\DB_File.dll Installing C:\strawberry\perl\lib\DB_File.pm Installing C:\strawberry\perl\lib\auto\DB_File\autosplit.ix Writing c:\strawberry\perl\lib\auto\DB_File\.packlist Appending installation info to c:\strawberry\perl\lib/perllocal.pod
以上で Strawberry Perl に DB_File モジュールをインストールすることができました。DB_File がインストールされてないと、Cache::File とか使えないのでいろいろ不便ですからね。Cache::FileCache を使えば良いんですけどね。
あっ、ちなみに Strawberry Perl は 5.10 系の 5.8 系の2種類がありますが、5.10 系の方が間違いありません。実際にどっちも試しましたが、5.10 系の方がすんなりと cpan でインストールできるものが多いです。ってか、標準でインストールされているモジュールも多いし。
自分以外の周りの人は ActivePerl 5.8 系なので XS 系のモジュールをコンパイルして他の人に配布してあげるために、あえて 5.8 系をインストールし直しての利用です。お陰で苦しめます。w
コメントやシェアをお願いします!
drk
http://kawa.at.webry.info/200810/article_1.html の事ですよね。気になってます。
k.daiba
5.10なんすが,ずっと動かしてると突然死することがありました.正規表現処理にメモリリークがあるとかないとかって話があるみたです.