Ubuntuでphpをビルドできた

Apache2やMySQLはパッケージでインストールして、phpだけ手動でビルド、というのが今の自分のスタイルなんですが、これをUbuntuでやろうとして苦戦したのでメモ。phpを入れる環境はUbuntu7.04 + Apache2.2.3。phpのconfigureは以下の設定です。

./configure --prefix=/opt/php \
--with-apxs2=/usr/bin/X11/apxs2 \
--enable-pcntl \
--enable-zend-multibyte \
--enable-mbstring \
--enable-mbregex \
--enable-soap \
--with-pear=/opt/php/share/pear \
--without-sqlite \
--without-pdo-sqlite

■php5.2.3のmakeに挫折

まず、普通にphp5.2.3をダウンロードしてきてコンパイルしてみると、configureは通るもののmakeが通らない。

ext/standard/.libs/info.o: In function `php_info_print_table_header':
/home/ryo/src/php-5.2.3/ext/standard/info.c:854: undefined reference to `ts_resource_ex'
ext/standard/.libs/info.o: In function `php_info_print_table_row_internal':
/home/ryo/src/php-5.2.3/ext/standard/info.c:898: undefined reference to `ts_resource_ex'
ext/standard/.libs/info.o: In function `php_print_gpcse_array':
/home/ryo/src/php-5.2.3/ext/standard/info.c:133: undefined reference to `executor_globals_id'
ext/standard/.libs/info.o: In function `php_info_write_wrapper':
/home/ryo/src/php-5.2.3/ext/standard/info.c:67: undefined reference to `ts_resource_ex'
ext/standard/.libs/info.o: In function `php_print_info':
/home/ryo/src/php-5.2.3/ext/standard/info.c:722: undefined reference to `executor_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:725: undefined reference to `executor_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:728: undefined reference to `executor_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:731: undefined reference to `executor_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:655: undefined reference to `sapi_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:443: undefined reference to `sapi_globals_id'
/home/ryo/src/php-5.2.3/ext/standard/info.c:634: undefined reference to `sapi_globals_id'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] エラー 1

てな感じのエラーで終了。結局原因は分からず。

■php5.2.2で再挑戦

次はphp5.2.2で再挑戦。makeしたらライブラリが足りないらしく、sudo apt-get install flexしたら通るようになった。これで解決と思ったら、今度はmake installが通らない。何やら、/etc/apache2/httpd.confの書き換えに失敗して止まってるらしい。いや、そもそもhttpd.conf無いんですけど。aptで入れたらapache2.confになってます先生。

そこで、やっつけでapache2.confをhttpd.confにコピーしてみるも失敗。

Installing PHP SAPI module:       apache2handler
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' libphp5.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp libphp5.la /usr/lib/apache2/modules/
cp .libs/libphp5.so /usr/lib/apache2/modules/libphp5.so
cp .libs/libphp5.lai /usr/lib/apache2/modules/libphp5.la
libtool: install: warning: remember to run `libtool --finish /home/ryo/src/php-5.2.2/libs'
chmod 644 /usr/lib/apache2/modules/libphp5.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
make: *** [install-sapi] エラー 1

phpをmake installするとhttpd.confに自動でLoadModuleの設定とかを書き込んでくれるんですが、それに失敗している模様。UbuntuDebian系は皆そうなのかな?)では、各種モジュールの読み込みはメインのconfファイルではなくmods-enabled/以下に各モジュールを読み込むファイルを配置する形を採っています。なので、httpd.confにはLoadModuleの記述が一切無く、付け足す場所が分からないようです。そこで、httpd.confの適当な所に

LoadModule hoge hoge.so

というダミーの行を入れてmake installすると、無事インストール完了。httpd.confは削除して、phpのモジュール読み込みは別途指定します。

■mod_phpApacheに組み込む

ビルドに失敗して一時的にaptで入れていた時の設定ファイルが残っていたので、それを流用します。/etc/apache2/mods-available/のphp5.confとphp5.loadのシンボリックリンクを/etc/apache2/mods-enabled/に張ります。それぞれの内容はこんな感じ。

php5.conf
<IfModule mod_php5.c>
    AddType application/x-httpd-php .php .phtml .php3
    AddType application/x-httpd-php-source .phps
</IfModule>
php5.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

これで、Apacheを起動すると無事、ビルドしたphpが組み込まれました。次はMySQLだ。