cygportでapreq2?

泣きながら、MOD_Perlを再ビルドしました。
連休だし、夜はこれから。
というわけで、やっと本命、libapreq2だ

$cygport libapreq2-2.08-2.cygport download
$cygport libapreq2-2.08-2.cygport prep

 までは良かったが、compileすると

/bin/sh ../../libtool --tag=CC --mode=link gcc  -g -O2 -pipe  -fno-strict-aliasing   -o mod_apreq2.la -rpath `/usr/sbin/apxs2 -q LIBEXECDIR` -export-dynamic -module -avoid-version `/usr/src/libapreq2-2.08-2/build/apreq2-config --link-libtool --libs`  /usr/lib/libapr-1.la /usr/lib/libaprutil-1.la handle.lo filter.lo -no-undefined -shrext
libtool: link: the `-shrext' option requires an argument
make[2]: *** [mod_apreq2.la] Error 1

 libtoolの引数"-shrext"の後に、パラメーターが無いと言っているらしい。
libtool/libtoolの呼び出しによると
「システム標準の共有ライブラリに対するファイル名の拡張子を"引数名"に置換します」とのこと。
Makefileをいろいろ探したが、"-shrext"という文字列はどこにも無かった。
"-shrext"は意外なところにあった。
libapreq2-2.08-2.cygportの中である。

cygmake \
	mod_apreq2_la_LIBADD="-no-undefined -shrext ${APACHE_MOD_SHREXT} ${LIBHTTPD}" \
	OTHERLDFLAGS="${B}/module/apache2/.libs/mod_apreq2.dll.a ${APXS_LIBEXECDIR}/mod_perl.dll.a"

 *.cygportがMakefileをハイジャックしていたのだ。
libapreq2-2.08-2.cygportの過去ログを見ると、昔はApacheのヴァージョンで"${APACHE_MOD_SHREXT}"の値を".dll"にするか".so"にするかを決めるロジックがあったのだが、「libapreq2はApache2でしか使えないのだから、".so"で統一!」みたいな変更の時に、"${APACHE_MOD_SHREXT}"を決めるロジックが消えてしまい、"${APACHE_MOD_SHREXT}"が空のままになってしまって、"-shrext"の後に何も付かないのだ。
"${APACHE_MOD_SHREXT}"を".so"に書き換え、再コンパイル
しかし、同じlinkコマンドで、libtoolはようやくlinkコマンドを実行してくれるも、エラーの嵐

In function `apreq_post_init':undefined reference to `_ap_add_version_component'
In function `apreq_filter_prefetch':undefined reference to `_ap_log_rerror'
.....

 みたいなのが山のように出る。
それらはどこにあるのか。

$ nm -o /lib/*.a |grep "_ap_add_version_component"
libhttpd2core.dll.a:d000164.o:00000000 T _ap_add_version_component

 libhttpd2core.dll.aへのリンクが漏れているのだ。
これの対処法は、libhttpd2core.laを追加するのだが、これでやっと、libapreq2-2.08-2.cygportの中の"${LIBHTTPD}"が何だったのかがわかった。libhttpd2core.laの事だったのだ。
つまり、

cygmake \
	mod_apreq2_la_LIBADD="-no-undefined -shrext .so /lib/libhttpd2core.la" \
	OTHERLDFLAGS="${B}/module/apache2/.libs/mod_apreq2.dll.a ${APXS_LIBEXECDIR}/mod_perl.dll.a"

 ということだったのだ。
libhttpd2core.laはテキストファイルで、中にライブラリーの依存関係が書かれている。

# Libraries that this one depends upon.
dependency_libs=' -L/usr/lib /usr/lib/libaprutil-1.la /usr/lib/libdb-4.2.la /usr/lib/libexpat.la (後略)'

 と書かれているので、体裁を整えるために、cygwinのseup.exeで、libdb-4.2をインストールしておく。
これで、このlink工程はパスして、無事(?)mod_apreq2.soを手に入れた。
のだが、本来の目的は、あくまでApache2::Requestのビルドです。
で、またエラーが
Typemapがconvert出来ないというwarningは、ちゃんとビルド出来ている人でも出るwarningらしいので無視していいが、このエラーは致命的である。

g++-4  --shared  -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--stack,8388608 -Wl,--enable-auto-image-base -L/usr/local/lib -fstack-protector Apache2.o
 /usr/src/libapreq2-2.08-2/build/module/apache2/.libs/mod_apreq2.dll.a /mod_perl.dll.a -o ../../../../blib/arch/auto/APR/Request/Apache2/Apache2.dll    \
          /usr/lib/perl5/5.10/i686-cygwin/CORE/cygperl5_10.dll -L/usr/src/libapreq2-2.08-2/build/library/.libs -lapreq2 -L/usr/lib -laprutil-1 -L/usr/lib -lapr-1 -lldap -llber -ldb-4.5 -lgdbm -lexpat -liconv -lcrypt         \

g++-4: /mod_perl.dll.a: No such file or directory

 確かに、正しいパスは"/lib/mod_perl.dll.a"なのであるが、どこで定義されているのか。
どのMakefileにも"mod_perl"の文字列はなかった。
あっ!またlibapreq2-2.08-2.cygportの中だ!
そう、"${APXS_LIBEXECDIR}"の値が"/lib"なのだ。
結局、

cygmake \
	mod_apreq2_la_LIBADD="-no-undefined -shrext .so /lib/libhttpd2core.la" \
	OTHERLDFLAGS="${B}/module/apache2/.libs/mod_apreq2.dll.a /lib/mod_perl.dll.a"

 になるのだ。
これで、コンパイルは成功(?)したみたいで、installする。
といっても、また、"/usr/src/libapreq2-2.08-2/inst/"にinstallするのでmvしないといけない。。。
で、/inst/etc/の中に2つのシェルスクリプトがあった。
シェルスクリプトと言っても、
#! /usr/sh はないし、何のコメント行も無い。それぞれ1行だけ書かれている

/inst/etc/preremove/libapreq2.sh 内
  /usr/sbin/apxs2 -e -A -n apreq /usr/lib/apache2/mod_apreq2.so

/inst/etc/postinstall/libapreq2.sh 内
  /usr/sbin/apxs2 -e -a -n apreq /usr/lib/apache2/mod_apreq2.so

 どちらも同じファイル名というのが、センスを疑うし、preremoveのほうのコマンドも、mod_apreq2を追加するコマンドである。
"-a"のほうが、"apreq"という名前で追加され、"-A"のほうが"#apreq"で追加されるらしい。
"-a"のほうで追加。
で、httpd.confを編集しようとしたところ、

LoadModule apreq_module    lib/apache2/mod_apreq2.so

 と、既に追加されていた。
"/usr/sbin/apachectl2 -t"してみて"Syntax OK"だったので、Apache2起動。error_logには

[notice] Apache/2.2.6 (Unix) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8o mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations

をを、読み込まれている。