Mac OSX をYosemiteにしたら自作CGIが動かないでござるの巻

タイトル通りなのですが、まず、localhostのファイルにアクセスすると、そもそもhttpデーモンが動いていない。
Mavericksにupdateしたときは、一応はApacheは動いていたのだが。。。

で、他所でも言われている通り、またOSのアップデート時にhttpd.confを書き換えられていた。
Apacheが2.2から2.4.9へと大幅にバージョンアップしたせいで、アクセスの許可/不許可の書き方が変わってしまっているかららしい、とのことでhttpd.confを書き換えてみたのですが、そもそもApacheが立ち上がらない。

%apachectl -t

を実行すると、mod_perl.soが開けない! と怒られた。
確かに、本当にmod_perl.soはなかった。
ということで、mod_perlのソースをダウンロードして、

%perl Makefile.pl

と打ち込むと、

Reading Makefile.PL args from @ARGV
   MP_CCOPTS = -std=gnu89
MP_APXS unspecified, using /usr/sbin/apxs

no conflicting prior mod_perl version found - good.
Configuring Apache/2.2.24 mod_perl/2.0.8 Perl/v5.18.2
[  error] '/usr/sbin/apxs -q MPM_NAME' failed:
[  error] apxs:Error: Invalid query string `MPM_NAME'.
[  error] Failed to obtain the MPM name.

というエラーが出て止まってしまう。
まずもって、Apacheのバージョンがおかしい。
確認のため、

%httpd -V

と入れると、

Server version: Apache/2.4.9 (Unix)
Server built:   Sep  9 2014 14:48:20
Server's Module Magic Number: 20120211:31
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)

ですよねぇ〜ってなる。
おまけで、MPM_NAMEに入るべき値が"prefork"だということが分かる。

で、色々調べると、なんと、mod_perlの現在の正式リリース版(ver.2.0.8)は、Apache 2.4系に未対応だと判明。
そりゃ、Appleもベータ版のmod_perlを付けるわけにはいかんかったのだろうとお察しする。

う〜ん。仕方ないけど、今日は解散!!

2015.2/1 追記

さすがに不便なので、SVNで開発版のmod_perlを入れることにしました。
MOD_PerlのSVNをチェックアウト。

%svn co https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0

なんか聞かれるけど、Temporaryですと返答。

%cd mod_perl-2.0
%perl Makefile.PL MP_CCOPTS=-std=gnu89

MP_APXS unspecified, using /usr/sbin/apxs

no conflicting prior mod_perl version found - good.
Configuring Apache/2.4.9 mod_perl/2.0.9dev Perl/v5.18.2

ふむ、良い感じ。
続けて、makeすると

modperl_constants.c:1545:30: error: use of undeclared identifier 'APR_ENOKEY'

というエラーが出て止まってしまった。
調べたところ、これを回避するパッチがあるらしい。
この"0008-workaround-APR_ENOKEY-not-found.patch"を、mod_perl-2.0において、

%patch ./src/modules/perl/modperl_apache_includes.h < 0008-workaround-APR_ENOKEY-not-found.patch

を実行して、

%make clean
%perl Makefile.PL MP_CCOPTS=-std=gnu89
%make

と再度makeしたところ、

[warning] mod_perl dso library will be built as mod_perl.so
[warning] You'll need to add the following to httpd.conf:
[warning] 
[warning]   LoadModule perl_module modules/mod_perl.so
[warning] 
[warning] depending on your build, mod_perl might not live in
[warning] the modules/ directory.

[warning] Check the results of
[warning] 
[warning]   $ /usr/sbin/apxs -q LIBEXECDIR
[warning] 
[warning] and adjust the LoadModule directive accordingly.

どうやら成功したらしいので、インストール。

%sudo make install

それから、httpd.confを、mod_perl.soをロードするように書き換え(上記 Warning 参照)た後、httpd.conf のテスト。

%apachectl -t

httpd: Syntax error on line 171 of /private/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_perl.so into server: dlopen(/usr/libexec/apache2/mod_perl.so, 10): Symbol not found: _modperl_handler_anon_add\n  Referenced from: /usr/libexec/apache2/mod_perl.so\n  Expected in: flat namespace\n in /usr/libexec/apache2/mod_perl.so

これは、もしかして。。。

%file mod_perl.so 
mod_perl.so: Mach-O universal binary with 2 architectures
mod_perl.so (for architecture x86_64):	Mach-O 64-bit bundle x86_64
mod_perl.so (for architecture i386):	Mach-O bundle i386

%file /usr/sbin/httpd
/usr/sbin/httpd: Mach-O 64-bit executable x86_64

アーキテクチャのアンマッチのようだ。i386アーキテクチャコンパイルを外す必要がある。

%sudo make uninstall
%make clean
%export ARCHFLAGS="-arch x86_64"
%export CFLAGS="-arch x86_64"
%perl Makefile.PL MP_CCOPTS=-std=gnu89
%make
%sudo make install
%apachectl -t

Syntax OK

今度は OKなので、Apacheを再起動。

%sudo apachectl -k restart

で、

[mpm_prefork:notice] : Apache/2.4.9 (Unix) PHP/5.5.14 OpenSSL/0.9.8za mod_perl/2.0.9dev Perl/v5.18.2 configured -- resuming normal operations

と、無事起動しました。

で、次に、Libapreq2をインストールします。

%tar libapreq2-2.13.tar.gz
%cd libapreq2-2.13
%perl Makefile.PL
%make

とすると、

Can't locate ExtUtils/XSBuilder/ParseSource.pm in @INC (you may need to install the ExtUtils::XSBuilder::ParseSource module) (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Library/Perl/Updates/5.18.2/darwin-thread-multi-2level /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at Makefile.PL line 22.
BEGIN failed--compilation aborted at Makefile.PL line 22.

というエラーでストップしました。ExtUtils::XSBuilder::ParseSourceをインストールする必要があると言っているので、

%cpan ExtUtils::XSBuilder::ParseSource

を実行。

%make clean
%make

で、無事、make終了。

%sudo make install

を実行すると、

ld: library not found for -lapreq2
clang: error: linker command failed with exit code 1 (use -v to see invocation)

というエラーが発生。これは以前も見たエラーでした。
/System//Library/Perl/5.18/darwin-thread-multi-2level/Config_heavy.pl の

1276 : my $_archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64 -arch i386';

1276 : my $_archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64';

に書き換えて、

%cd ..
%sudo rm -rf libapreq2-2.13
%tar libapreq2-2.13.tar.gz
%cd libapreq2-2.13
%perl Makefile.PL
%make
%sudo make install

しかし、同じエラーが出ます。

%file ./glue/perl/xs/APR/Request/Apache2/Apache2.o
Apache2.o: Mach-O 64-bit object x86_64

%file /usr/lib/libapreq2.3.8.0.dylib
libapreq2.3.8.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64

う〜ん。分からん。お手上げです。。。

まあ、それ以前に make test で Fail 判定だったので、今回は諦めます。。。