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の設定とかを書き込んでくれるんですが、それに失敗している模様。Ubuntu(Debian系は皆そうなのかな?)では、各種モジュールの読み込みはメインのconfファイルではなくmods-enabled/以下に各モジュールを読み込むファイルを配置する形を採っています。なので、httpd.confにはLoadModuleの記述が一切無く、付け足す場所が分からないようです。そこで、httpd.confの適当な所に
LoadModule hoge hoge.so
というダミーの行を入れてmake installすると、無事インストール完了。httpd.confは削除して、phpのモジュール読み込みは別途指定します。
■mod_phpをApacheに組み込む
ビルドに失敗して一時的に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>