|
何を突然思い立ったか、Visual C++ Express EditionでPHPをbuildできるかどうか試してみたいという衝動に駆られ、試行錯誤しながらやってみた結果をまとめました。
もうずいぶん前になってしまいますが、2005/12/15に無償のVisual C++としてExpress EditionがMicrosoftからりリースされました。まあ、リリースされたときから「同じVCならPHPをbuildできるんじゃないか」と漠然と思っていたのですが、なかなか重い腰が上がらず。。。(^^; で、最近ふと思い立って色々ハマり、ようやくまとめられる状態になました。
基本的な手順はPHPマニュアルの「新しいビルドシステムを使用して PHP をビルドする [PHP >=5 のみ]」にあるとおりですが、Express Editionだとちょっと違ったりしています。
1.今回の環境
今回インストールを行った環境です。今回は、PHP本体とサードパーティー製PHP拡張であるeAcceleratorをbuildしてみました。
- Windows 2000 Professional+SP4
- Visual C++ 2005 Express Edition
- Microsoft Platform SDK for Windows Server 2003 R2
- Apache2.0.59/2.2.3
- PHP5.1.6/PHP5.2.0
- eAccelerator0.9.5
2.VC++ Express EditionとPlatform SDKのインストール
最初に言っておきますが、この工程がむちゃくちゃ時間がかかりました。今回は両者ともisoファイル(CDイメージ)をダウンロードし、CD-Rに焼いてインストールしました。ダウンロードするURLは、それぞれ以下の通りです。
CD-Rに焼いたら、インストールを行います。基本的にすべてインストールする方が無難と思います。今回はインストール先を
としましたので、それぞれのインストールディレクトリは
- D:\Program Files\Microsoft Visual Studio 8
- D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2
となっています。
3.Apacheのインストール
PHPと連携させるために、インストールしておきます。今回は2.0.59と2.2.3のmsi版をダウンロード・インストールしました。インストールディレクトリは2.0.59、2.2.3それぞれ
- D:\Program Files\Apache Group
- D:\Program Files\Apache Software Foundation
です。
4.作業用ディレクトリの作成
今回は
として用意しました。
5.win32build.zipとbindlib_w32.zipの取得
PHPマニュアルにもあるように、Windowsでのbuildにはwin32build.zipとbindlib_w32.zipが必要になります。PHPマニュアルのリンク先からダウンロードし、作業用ディレクトリ下に展開します。ただし、bindlib_w32.zipは親ディレクトリが作成されないので、
を作成し、そこに展開しました。
6.PHPソースの取得と展開
当然ですが、PHPのソースもダウンロード・展開しておきます。今回は5.1.6と5.2.0のtar.gz版をダウンロードし、作業ディレクトリ下に展開しました。展開先ディレクトリはそれぞれ
- D:\work\dev\php-5.1.6
- D:\work\dev\php-5.2.0
となります。
この時点で、D:\work\devディレクトリ下は次のようになっているはずです。
7.resolv.lib のビルド
PHPマニュアルにあるように、resolv.libをbuildします。まずは、マニュアルの指示通り、bindlib_w32\bindlib.dswファイルをダブルクリックします。すると、
とダイアログが表示されるので、「すべてはい」ボタンを押下します。
次に、メニューの[ツール]-[オプション]を選択し、インクルードファイルの参照先を追加します。追加するディレクトリは、
-
D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include
です。
続けて、Release版をbuildするよう、ツールバーのプルダウンを変更します。
そして、メニューの[ビルド]-[ソリューションのビルド]を選択し、buildを実行します。
実行する直前に、変更を保存するためのダイアログが表示されるので、適宜保存しておきます。
buildが完了すると、直下のReleaseディレクトリにresolv.libファイルが作成されているはずです。
これをPHPマニュアルのとおり、win32build\libディレクトリにある同名のファイルに上書きコピーします。今回は、念のためバックアップを取りました。
8.まずはApache2.0との連係
それでは早速Apache2.0との連係を行うPHPをbuildしてみましょう。まずは必要なインクルードファイルとライブラリをwin32buildディレクトリ以下にコピーします。Apache2の場合、win32buildディレクトリ直下にapache2ディレクトリを作成し、その下にApache2のインストールディレクトリ下にあるinclude・libの各ディレクトリをディレクトリごとコピーします。
ここでコマンドプロンプトを開き、phpのソースディレクトリに移動し、次のコマンド群を実行します。
>"D:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
>"D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\SetEnv.Cmd"
>set path=%path%;D:\work\dev\win32build\bin
>set include=%include%;D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc
>buildconf.bat
>cscript /nologo configure.js --enable-apache2handler --without-libxml --without-xml
--enable-zend-multibyte --disable-calendar --disable-odbc --without-pdo-odbc
>nmake
最初の4行はbuildするための各種環境変数の設定です。buildconf.batはUNIX・Linux環境でのautoconfに相当し、configureスクリプト(正確にはconfigure.js)を生成します。次の行がconfigureスクリプトの実行です。オプションは改行していますが、実際は一行です。今回は、XML系・カレンダー・ODBC系を無効にしています。理由は、それらをbuildするためのヘッダファイルやライブラリがないためです。最後のnmakeコマンドでコンパイルを実行します。
また、他のconfigureオプションは、--helpを付けてconfigure.jsを実行すると一覧が表示されます。参考までに、PHP5.1.6の場合はこんな感じです。
無事コンパイルが終了すると、最後に
:
>SAPI sapi\cli build complete
>
と表示されます。また、直下のRelease_TSディレクトリにdllが生成されているはずです。dllが生成されていれば、httpd.confを書き換えてphpinfoを表示してみましょう。
●httpd.confへの追加分
LoadModule php5_module "D:/work/dev/php-5.1.6/Release_TS/php5apache2.dll"
PHPIniDir "D:/work/dev/php-5.1.6/Release_TS/"
AddType application/x-httpd-php .php
今回は、同じ手順でPHP5.1.6・5.2.0共にbuild・phpinfoの表示ともうまくいきました。
9.楽に多くの拡張をbuildする
先ほどはconfigureオプションをほとんど付けませんでしたが、理由はヘッダファイルやライブラリがないためbuildするからです。といっても、一からかき集めてくるのも何なので、ある程度のライブラリが集まったwin32buildがあれば便利ですねぇ。
ということで、たまたま見つけました :-)
というか、上のエントリとその次のエントリを見て、やる気が出てきたというか。。。上のコメント欄に書かれているzip.zipがそれです。コメントを書いているPierreさんって、PHP本家のコア開発者の方と思います。
では、早速取得して展開します。。。が、このファイル、44.4MBもありますので展開にかなり時間がかかります。展開する場合、D:\work直下に展開してください。理由は。。。このzipファイル、devディレクトリを作成し、その下にwin32buildに相当するphp_buildディレクトリを作成するためです。
ということで、展開した直後は次のようなディレクトリ構成になっているはずです。
展開後、resolv.libファイルをphp_build\libにコピーするのをお忘れなく。
では、zip.zipを使ってbuildしてみましょう。先ほどのコマンドプロンプトが開いたままであれば、一度コンパイルしたファイルを削除し、再度buildconf.batを実行します。こうすることで、win32buildではなく、php_buildディレクトリ側を見てくれるようになります。
>nmake clean
>buildconf.bat
さて、configureオプションですが、ここでは可能な限りすべてのオプションを有効にする「--enable-snapshot-build」を使います。これは、PHP本家で配布されているWin32版バイナリでも使われているオプションです。なお、カレンダーとODBCは無効にしたままです。なお、オプションは改行していますが、実際は一行です。また、「--enable-snapshot-build」には「--enable-zend-multibyte」は含まれません。別途指定が必要です。
>cscript /nologo configure.js --enable-snapshot-build --with-gd=shared
--enable-zend-multibyte --disable-calendar --disable-odbc
--without-pdo-odbc
>nmake
で、コンパイルですが、今度はターゲットとして「snap」を指定してnmakeを実行します。
>nmake snap
無事コンパイルが終了すると、直下のRelease_TS\php-5.x.xディレクトリ(x.xはバージョンによって変わる)に配布用のファイル群が生成されているはずです。こちらでも、httpd.confを書き換えてphpinfoを表示してみましょう。今回は「--enable-snapshot-build」を指定しているため、PHP5.2.0ではApache2Filter版やApache2.2用のdllも作成されます。
●httpd.confへの追加分(Apache2Filter版の場合)
LoadModule php5_module "D:/work/dev/php-5.2.0/Release_TS/php-5.2.0/php5apache2_2_filter.dll"
AddOutputFilter PHP .php
●httpd.confへの追加分(Apache2.2Handler版の場合)
LoadModule php5_module "D:/work/dev/php-5.2.0/Release_TS/php-5.2.0/php5apache2_2.dll"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
今回も同じ手順でPHP5.1.6・5.2.0共にApache2Handler版・Apache2Filter版のbuild・phpinfoの表示ともうまくいきました。。。が、残念ながら両方ともmbstringはbuildに失敗してしまいました。この辺は、もうちょっと突っ込みたいなぁ。
10.ついでにeAcceleratorでもbuildしてみる
言わずと知れたeAcceleratorですが、build手順としては「phpizeがなかった頃の拡張モジュールのインストール手順」みたいな感じで、PHPのソースツリーのextディレクトリ直下にeAcceleratorのソースを展開し、buildconf.bat・configure・nmakeする、といった具合です。ただし、展開したときのディレクトリ名を「eaccelerator-0.9.5」から「eaccelerator」に変更しておく必要があります。nmake時に「-」が引っかかってエラーになります。
また、configureオプションに「--enable-snapshot-build」を指定している場合、eAcceleratorを有効にするためには「--disable-eloader」を指定します。「--enable-eaccelerator」は「--enable-snapshot-build」を付けると自動的に有効になりますが、「--enable-eloader」と同時に指定することができないためです。
ちなみ、PHP5.1.6の場合のconfigureオプションはこんな感じになります。
PHPをbuildした環境が残っている(nmake cleanしていない)場合の手順をまとめると以下のようになります。残っていない場合、nmake snapとします。なお、configureオプションは改行していますが、実際は一行です。
>buildconf.bat
>cscript /nologo configure.js --enable-snapshot-build --with-gd=shared
--enable-zend-multibyte --disable-calendar --disable-odbc
--without-pdo-odbc
--disable-eloader
>nmake php_eaccelerator.dll
:
EXT eaccelerator build complete
>
buildが終わったら、Release_TSディレクトリに作成されたphp_eaccelerator.dllをRelease_TS\php-5.x.x\extディレクトリにコピーし、php.iniに以下のような設定を追加します。
short_open_tag = On
extension_dir = "D:/work/dev/php-5.x.x/Release_TS/php-5.x.x/ext/"
extension=php_eaccelerator.dll
eaccelerator.allowed_admin_path = "/"
>
そして、eAcceleratorのソースツリーにあるcontrol.phpをブラウザからアクセスするディレクトリにコピーして、ブラウザからアクセスしてみましょう。BASIC認証のユーザーID・パスワードは、control.phpに記載されています。
折角なので、buildしたeAcceleratorのdllを置いておきます。当然、無保証です ;-)。
11.とりあえずのまとめ
Visual C++ 2005 Express Editionを使ったbuildをやってみましたが、コマンドプロンプトの使い勝手は別として、Linux環境と極端な違いはないように思います。「配布されてるバイナリを使えば良いじゃん」というのはそうなんですが、パッチ当てたバージョンを使いたいとか、バイナリで配布されていないPHP拡張を使いたいとか、自分で拡張作ったんでWin32版も配布したいとか、まあ、知ってて損はないかなぁ、と思います。
ちなみに、今回初めてVC++使いました ;-) どうも、この手のツールは使い方覚えるのが億劫なので。。。
|