DBD::mysqlをMSVC6でコンパイルする

DBD::mysqlの新版が出ていたのでちょろっと試してみたのですが、いくつか落とし穴があるのでメモっておきます。

MySQL ABの公式見解は「ActiveStateのリポジトリに入ってるんだからおとなしくそれ使っとけ」のようなので、以下はなんでも自分でコンパイルしないと気が済まない人向けということで。

1) MySQLの公式サイトからMySQL 4.1のソースを落としてくる

多くの人が使っているであろうバイナリはVC7(以降)でコンパイルされているので不可。ページ最下段にあるWindows用のソースを落とす。

カレントの5.0系ないし5.1系を落としたい誘惑にかられるかもしれませんが、少なくとも5.0.27のソースにはVC6で宣言されていない(u)intptr_tを使っている箇所があるのでひとまず敬遠するのが無難。いちおうVC6でも読めるワークスペースはあるのでたまたま混入しただけかもしれませんが、MySQLではもうVC6でのコンパイルテストはしていないようなので今後対応されるかどうかは不明。

2) ソースを解凍したら、mysql.dswを開いて設定を変える

アクティブな構成を「mysqlclient - Win32 Release」に変更。メニューの「プロジェクト」→「設定」でmysqlclientとzlibの「C/C++」→「コード生成」→「使用するランタイムライブラリ」を「マルチスレッド」から「マルチスレッド(DLL)」に変更する。

#これを忘れると、最後DBD::mysqlとリンクする段になって__pctypeやら___mb_cur_maxやらが未解決ですと怒られるはめになる。

3) mysqlclient.libをビルド

4) DBD::mysqlを持ってくる

CPAN経由なり、tarballをそのまま落としてくるなり。

5) Makefile.PLを修正

598行目あたりに

my @dirs = ($^O =~ /mswin32/i) ? qw(C:) : qw(/usr/local /usr /opt);

とかいうのがあるので、C:ではなく、mysqlコンパイルしたディレクトリに変更する。長くてイヤなら、.(カレントディレクトリ)にしておいて、コンパイルしたMySQLのライブラリとヘッダファイルをカレント以下の適当なディレクトリにコピーしてしまうという手もある。要するにふだん使っているであろうC:\MySQL以下のライブラリを読みにいかないように、ということ。

6) perl Makefile.PL "--libs=-L(ライブラリの場所) -lmysqlclient -lzlib"

ライブラリの指定を毎回書くのが面倒ならMakefile.PLの該当箇所を変更しておく。

7) nmake→nmake test→nmake install

あとは普通に入るはずですが、4.0時点では

dbdimp.c(4323) : warning C4700: 値が割り当てられていないローカルな変数 'slen' に対して参照が行われました。

とか

mysql.xs(572) : warning C4013: 関数 'mysql_st_next_results' は定義されていません。int 型の値を返す外部関数と見なします。
mysql.xs(721) : warning C4013: 関数 'is_prefix' は定義されていません。int 型の値を返す外部関数と見なします。
mysql.xs(272) : warning C4700: 値が割り当てられていないローカルな変数 'slen' に対して参照が行われました。

とか、コンパイル時にいやなことを言ってくるのでそのうち修正版が出るんでないかという気もする。

なんにしてもActivePerlがVC6前提なので、VC7前提のMySQLを使うなら自前でPerlコンパイルするか、Strawberry Perlとかに切り替えるとかした方がいいのかも。とりあえず上記の形式でコンパイルしたものはppm.tcool.orgの方にあげておきますが、不具合出るようでしたらご一報くださいませ。