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 っていうページ。ってかこのページの手順にそってやればよいだけですが、英語なので、以下の記述は日本語化してみたって感じです。

インストール手順は以下の通り

  1. Oracle - Berkeley DB 4.6.21 のインストール
  2. Berkeley DB 4.6.21 の include フォルダを c:\strawberry\c\include\db 内にコピー
  3. Berkeley DB 4.6.21 の lib\libdb46.lib を c:\strawberry\c\lib\libdb.a としてコピー
  4. c:\strawberry\c\include\db\db.h の修正
  5. 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 をダウンロードします。下記のリンクの部分がそうです。

Berkeley DB 4.6.21.msi Windows installer, with AES encryption (16.1M)

ダウンロードしたらインストール。まぁデフォルトのままでインストールして問題ないと思います。

DB_File をインストールする前準備

  1. C:\strawberry\c\include 配下に db ディレクトリを作成。
  2. C:\Program Files\Oracle\Berkeley DB 4.6.21\include 配下のファイルを全て C:\strawberry\c\include\db 配下にコピーする。
  3. C:\Program Files\Oracle\Berkeley DB 4.6.21\lib\libdb46.lib を C:\strawberry\c\lib\libdb.a としてコピーする。
  4. 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 をインストール → 必ず失敗する。

  1. コマンドプロンプトを立ち上げ、cpan と入力して cpan-shell を起動する。
  2. 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
    
  3. cpan を exit する。

config.in を修正して DB_File を手動で dmake してインストール

  1. コマンドプロンプトから C:\strawberry\cpan\build 配下にある DB_File-1.817 へ移動。
  2. config.in をメモ帳なりで開いて、下の方に赤文字部分を追記する。
    #DBNAME = -ldb-2.4.10
    INCLUDE = \strawberry\c\include\db
    LIB     = \strawberry\c\lib
    DBNAME  = -ldb
    
    # end of file config.in
    
  3. いつもの手順で手動でインストールする。以下インストールログです。赤文字の部分が入力部分です。
    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

- スポンサーリンク -