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
をを、読み込まれている。