FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Windows用PHP拡張モジュールを最短でビルドする方法

現在,「LL言語用PDF帳票ツール Field Reports」をWindowsへ移植しているのですが,Windows環境でPHP拡張モジュールをビルドする方法として断片的な情報しか見つからなくて苦労しました。
試行錯誤してなんとかビルド手順が確立できたので,わかったことをまとめておきます。

基礎知識

コンパイラ

基本的に,拡張モジュールをビルドする時は,PHPの実行モジュールをビルドした時と同じ環境でビルドする必要があるようです。
PHP起動時にチェックをしているようで,異なったビルド環境で作られた拡張モジュールを使おうとするとエラーとなりロードできません。
以下の条件をそろえる必要があるようです。

ちなみに,PHP公式サイトで配布されているWindows用バイナリモジュールは,PHP5.2がVisual Studio 6.0で,PHP5.3がVisual Studio 2008でビルドされていました。
PHP拡張モジュールをバイナリ配布するには,Visual Studio 6.0とVisual Studio 2008でビルドする必要がありそうです。

Windows版にはphpizeコマンドがない

Linux等のUnix系OSでの作成手順は,【PHP/C】PHP extension で Hello World! - 不動産に興味を持ち始めたWebエンジニアのメモ帳などを参照していただきたいのですが,標準的なビルド手順で必ず出てくる“phpize”コマンドがWindows版では用意されていません。
代わりに,ソースツリーのトップにある“buildconf.bat”コマンドを使えばよいと思われますが,任意のディレクトリに拡張モジュールのソースを展開して開発することは考慮されていないようです。

拡張モジュールのプログラミング

この記事では,Windowsで空の拡張モジュールを作成してビルドするまでの手順を扱っています。
拡張モジュールの中身のプログラミングについては,実例で学ぶPHP拡張モジュールの作り方|gihyo.jp … 技術評論社などを参照してください。

準備

Visual Studio

Visual Studio 6.0は中古で入手するしかないので,まずはVisual Studio 2008でPHP5.3用のモジュールを作成しました。

Visual Studio 2008 Express Editionはまだ入手できるようです。下記のマイクロソフトのサイトからダウンロードしてインストールしました。

http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

PHPの実行モジュール

PHP公式サイトからWindows用バイナリモジュールをダウンロードして展開します。

http://windows.php.net/download/

ここでは,展開したファイルを“C:\php”に置いたものとします。

PHPのソース

PHP公式サイトからPHPのソース一式をダウンロードします。

http://www.php.net/downloads.php

ここでは,展開したソースを“C:\php-src”に置いたものとします。

ビルド手順

コマンドプロンプトを開く

「スタート」メニューから「Visual Studio Tools/Visual Studio 2008 コマンドプロンプト」を選択し,コマンドプロンプト・ウインドウを開きます。
以後の作業は,このコマンドプロンプト上で行います。

スケルトンの作成

拡張モジュールのソースが展開されているディレクトリに移動し,PHPで記述されたスケルトン作成コマンドを実行します。

     > cd C:\php-src\ext
     > php ext_skel_win32.php --extname=test

ここでは,モジュール名を“test”としました。

config.w32ファイルの編集

作成されたディレクトリの中にある“config.w32”ファイルをテキストエディタで編集します。

// $Id$
// vim:ft=javascript

// If your extension references something external, use ARG_WITH
// ARG_WITH("test", "for test support", "no");

// Otherwise, use ARG_ENABLE
// ARG_ENABLE("test", "enable test support", "no");

if (PHP_TEST != "no") {
     EXTENSION("test", "test");
}

コメント部分を編集してARG_WITHの行かARG_ENABLEのどちらかの行を有効にします。
この行を有効にすると,後で実行するconfigureコマンドで“--enable-test”や“--with-test”オプションが選択できるようになります。今回は拡張モジュールのビルドだけが目的なので,一見無駄な作業ですが,編集しないとconfigureコマンドが動かないのでやはり編集する必要があります。
なお,ARG_ENABLEの行の先頭のコメントだけ削除して済ませようとするとconfigureコマンドが解析に失敗するので,以下の例のように余分なコメントはバッサリ削除します。

// $Id$
// vim:ft=javascript

ARG_ENABLE("test", "enable test support", "no");

if (PHP_TEST != "no") {
     EXTENSION("test", "test");
}
configureコマンドの実行

ソースツリーのトップへ移って,以下のコマンドを実行します。

> cd C:\php-src
> buildconf
> configure

これで,コンパイルに必要なヘッダファイル“main/config.w32.h”が作成されます。

コンパイル

“C:\php-src\ext\test\test.dsp”ファイルをVisual Studio 2008で開きます。
.dspファイルはVisual Studio 6.0形式のプロジェクトファイルなので,2008形式のプロジェクトに変換する必要があります。

ビルド構成メニューで「Release_TS」を選択し,プロジェクトをビルドします。

おそらく以下のようなエラーが発生すると思いますので,プロジェクトのプロパティダイアログを開いて「構成プロパティ/リンカ/全般」の「追加のライブラリ ディレクトリ」に「C:\php\dev」を追加します(もしくは,php5ts.libを参照できる場所にコピーします)。

LINK : fatal error LNK1181: 入力ファイル 'php5ts.lib' を開けません。

こんどは,ビルドが成功するはずです。
「C:\php-src\Release_TS\php_test.dll」が作成されました。

ノンスレッドセーフ モジュールのビルド

デフォルトで作成されるのは,スレッドセーフの拡張モジュールになります。

ノンスレッドセーフのモジュールをビルドする場合は,

  • プリプロセッサの定義」プロパティから“ZTS=1”の定義を削除します。
  • 「リンカ/入力/追加依存ファイル」で“php5ts.lib”を“php5.lib”に変更します。