メッセージ

2014年06月20日の記事

2014/06/20(金)再度 FreeBSD10.0 で clang 環境構築検証(3) ~ mod_perl2.0.9 は Apache 2.4対応

2017/10/12 17:31 サーバ運営・管理
mod_perlは、2.0.9 から Apache 2.4 対応になるようです。
つい最近の 6/12 に Apache2.4 対応のコードが本流にまとめられたようなので、早速入手してみました。正式提供ではないので、開発元から、subversion で取得するしか入手方法がありません。
〔入手方法〕
svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk ローカルdir
問題なく、 Apache 2.4.9 に組み込まれ、動作するようです。
20140619.JPG
# Windows 対応でリリースが1年以上遅延している模様・・・

mod_perl 2.0.9-dev は、ソースコードの修正が2箇所必要です。
○1つ目
ERROR from evaluation of Apache-Reload/Makefile.PL:
Use of uninitialized value in substitution (s///) at
Apache-Test/lib/Apache/TestRun.pm line 1100.
このエラーはかなり前から出ていて、一向に対処されないのですが、
以下のようないつもの暫定対処で対応です。
(Apache-Test/lib/Apache/TestRun.pm 1100行目付近)
    while (my($k, $v) = each %args) {
+     if (defined $v) {
        $v =~ s/\|/\\|/g;
        $body .= "\n\$Apache::TestConfig::Argv{'$k'} = q|$v|;\n";
+     }
    }
(2013/09/26(木)の拙作記事 Apache 2.4.6 + mod_perl2 でも紹介済み)

○2つ目
コンパイルが順調に進んでいるかのように思えるところで、最終段階(オブジェクトファイルリンク処理)で、
/usr/local/src/mod_perl-2.0.9-dev/src/modules/perl/mod_perl.a(mod_perl.o):
In function `modperl_startup':
mod_perl.c:(.text+0xe6): undefined reference to `modperl_io_apache_init'

/usr/local/src/mod_perl-2.0.9-dev/src/modules/perl/modperl_io_apache.h:37:16:
 warning: inline function
      'modperl_io_apache_init' is not defined [-Wundefined-inline]
MP_INLINE void modperl_io_apache_init(pTHX);
               ^
mod_perl.c:252:5: note: used here
    modperl_io_apache_init(aTHX);
のようなメッセージがかなり大量に出て、エラー終了してしまいます。
これは clang 環境固有のもので、gcc 環境では出ません。

原因はやや難しい話ですが、 __inline__ 属性を与えているC言語関数の取り扱いの問題になります。
__inline__ 属性を与えた場合、 clang ではコンパイル時の最適化処理途上でその属性を適用しないと決めたときに、外部シンボルとして登録しない仕様のため、リンクすると「シンボルが見当たりません」的な不可 解なエラーになるということです。

こちらの後半のほうに簡単な説明があります → [C++11対応記念] clang/LLVMのインストールとGMPを使って円周率ベンチ。 〔ぞうさんの何でもノート〕

具体的には、__inline__ 属性を外してしまうことで対処してしまいます。
(src/modules/perl/modperl_common_util.h 22行目付近)
-  #ifdef MP_DEBUG
+  // #ifdef MP_DEBUG
   #define MP_INLINE
-  #else
-  #define MP_INLINE APR_INLINE
-  #endif
+  // #else
+  // #define MP_INLINE APR_INLINE
+  // #endif
この件は、バグ報告したほうがいいかも・・・ですね。
当方は英語がダメダメなので、他力本願で誰かお願い・・・というところですが。。

これらの対処を行ってから、コンパイルを行うことで、問題なく Apache 2.4.9 + mod_perl 2.0.9-dev 環境が構築できます。