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 環境が構築できます。

2014/06/19(木)再度 FreeBSD10.0 で clang 環境構築検証(2)

2017/10/12 17:28 サーバ運営・管理
OpenLDAP 2.4.39 と PHP 5.5.13 の configfure スクリプトは、FreeBSD 10 上では、基本的に誤認識します。具体的には、
『共有ライブラリ .so が作成されない』
という現象になります。

原因は、FreeBSD 10.x を configure スクリプト側で FreeBSD 1.x と認識することにあります。
こちらがズバリです → FreeBSD 10-Releaseで共有ライブラリが生成されない問題 解決
PHP 5.5.13 の場合は、上記で示しているとおり、
sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak aclocal.m4 configure /build/libtool.m4
として、FreeBSD 10.x を FreeBSD 1.x として取り違えないようにすることでこの問題はあっさり回避できます。

また、OpenLDAP 2.4.39 の場合は、
sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak aclocal.m4 build/openldap.m4
sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak contrib/ldapc++/aclocal.m4
とやれば、同様にこの問題は回避されます。

ですが、これは gcc 環境では、どういうわけか出たり出なかったりで、正直今までよく判っていなかったというのが真相。。orz
前回は、PHP5.5 の .so ファイルを手動で作ったし、、

PHP 5.5.13 の場合、これでも いざ configure を実行すると、

checking for DB4 major version... Header contains different version

と出て、途中で止まってしまう場合がある。

これは、FreeBSD ports にて BerkeleyDB をインストールした場合に、ディレクトリ構成が、configure スクリプトが意図していない構造であるのが原因です。
この問題を解決するために、configure スクリプトに下記の追加を行います。
(BerkeleyDB 4.8.30 を ports でインストールした場合・31,287行目付近~)
     elif test -f "$i/include/db4.8/db.h"; then
       THIS_PREFIX=$i
       THIS_INCLUDE=$i/include/db4.8/db.h
       break
+    elif test -f "$i/include/db48/db.h"; then
+      THIS_PREFIX=$i
+      THIS_INCLUDE=$i/include/db48/db.h
+      break
     elif test -f "$i/include/db4.7/db.h"; then
       THIS_PREFIX=$i
       THIS_INCLUDE=$i/include/db4.7/db.h
       break

これらの対策をコンパイル前に講じることが、現時点でのリリースバージョンでは必要です。

2014/06/18(水)再度 FreeBSD10.0 で clang 環境構築検証(1)

2017/10/12 17:27 サーバ運営・管理
以前、こんな記事こんな記事 で、clang 環境構築検証した記事をもっともらしく載せましたが、実は旧環境が温存された状態。
したがって、検証の質としては低いのです。

20140617.JPG
ということで、今度は FreeBSD 10.0 をクリーンインストールしてやってみました。
今回から、BerkeleyDB 4.8.30 をPorts から入れることにしました。

特に問題が無かった(従来と同じ手順にて構築出来る)のは
・SpamAssassin 3.4.0
・ProFTPD 1.3.5
・PostgreSQL 9.3.4

BerkeleyDB 4.8.30 を Ports からインストールしたために手順の変更が必要なのは
・Courier-Authentication Library 0.66.1
・Maildrop 2.7.1
・dovecot 2.2.13

構築環境が FreeBSD10 に対応していないため、ソースコードなどの変更が必要なのは
・OpenLDAP 2.4.39
・mod_perl 2.0.9-dev
・Apache 2.4.9
・PHP 5.5.13
・postfix 2.11.1

といった状況になりました。

FreeBSD10 にて、BerkelayDB をports からインストールした場合、そのディレクトリ構成が標準と異なりますので、Ports以外でアプリケーションをソースコードから構築する際、環境変数でその旨をコンパイラに教 え込む必要があります。

具体的には、アプリケーションのうち、ソースコードから構築する際、configure スクリプトを最初に実行させるタイプのものは、環境変数 CPPFLAGS に include ファイルパスを列挙する必要があります。こんな感じです:
setenv CPPFLAGS '-I/usr/local/include -I/usr/local/include/db48 -I/usr/include'
また、Courier-Authentication Library 0.66.1 と maildrop 2.7.1 は、環境変数 LIBS に -lssl を指定する必要があります。こんな感じ:
setenv LIBS -lssl
こうしないと、どういうわけか、SSL ライブラリがまともにリンクできず、コンパイルが見かけ上成功してように見えても実際は失敗していた、という羽目になります。