PHP 4 には、非常に柔軟な自動ビルドシステムがあります。
すべてのモジュールは、ext
ディレクトリ以下に配置されています。各モジュールは、
モジュール自身のソースに加えて config.m4 というファイルを持っています。
これは拡張モジュールの設定用のファイルです
(http://www.gnu.org/software/m4/manual/m4.html
を参照ください)。
これらの全てのファイルの雛形および .cvsignore
は、ext ディレクトリ内にある
ext_skel というシェルスクリプトで作成できます。
作成したいモジュールの名前を、スクリプトの引数として渡します。
このスクリプトは引数と同じ名前のディレクトリを作成し、
適切な雛形ファイルを作成します。
順を追って見ていくと、この手順は次のようになります。
:~/cvs/php4/ext:> ./ext_skel --extname=my_module
Creating directory my_module
Creating basic files: config.m4 .cvsignore my_module.c php_my_module.h CREDITS EXPERIMENTAL tests/001.phpt my_module.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/my_module/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-my_module
5. $ make
6. $ ./php -f ext/my_module/my_module.php
7. $ vi ext/my_module/my_module.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/my_module/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary. |
この手順により、先ほど説明したファイルが作成されます。
新しく作成したモジュールを自動ビルドシステムに組み込むには、
buildconf を実行しなければなりません。
これは、
ext ディレクトリ内を検索し、
見つかった全ての
config.m4
ファイルをもとにして
configure
スクリプトを再作成します。
例46-1 に示すデフォルトの
config.m4 は、すこし複雑です。
例 46-1. デフォルトの config.m4 dnl $Id: build.xml,v 1.1 2006/05/05 05:28:26 takagi Exp $
dnl config.m4 for extension my_module
dnl Comments in this file start with the string 'dnl'.
dnl Remove where necessary. This file will not work
dnl without editing.
dnl If your extension references something external, use with:
dnl PHP_ARG_WITH(my_module, for my_module support,
dnl Make sure that the comment is aligned:
dnl [ --with-my_module Include my_module support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,
dnl Make sure that the comment is aligned:
dnl [ --enable-my_module Enable my_module support])
if test "$PHP_MY_MODULE" != "no"; then
dnl Write more examples of tests here...
dnl # --with-my_module -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
dnl SEARCH_FOR="/include/my_module.h" # you most likely want to change this
dnl if test -r $PHP_MY_MODULE/; then # path given as parameter
dnl MY_MODULE_DIR=$PHP_MY_MODULE
dnl else # search default path list
dnl AC_MSG_CHECKING([for my_module files in default path])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl MY_MODULE_DIR=$i
dnl AC_MSG_RESULT(found in $i)
dnl fi
dnl done
dnl fi
dnl
dnl if test -z "$MY_MODULE_DIR"; then
dnl AC_MSG_RESULT([not found])
dnl AC_MSG_ERROR([Please reinstall the my_module distribution])
dnl fi
dnl # --with-my_module -> add include path
dnl PHP_ADD_INCLUDE($MY_MODULE_DIR/include)
dnl # --with-my_module -> chech for lib and symbol presence
dnl LIBNAME=my_module # you may want to change this
dnl LIBSYMBOL=my_module # you most likely want to change this
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $MY_MODULE_DIR/lib, MY_MODULE_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_MY_MODULELIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([wrong my_module lib version or lib not found])
dnl ],[
dnl -L$MY_MODULE_DIR/lib -lm -ldl
dnl ])
dnl
dnl PHP_SUBST(MY_MODULE_SHARED_LIBADD)
PHP_NEW_EXTENSION(my_module, my_module.c, $ext_shared)
fi |
|
もし M4 ファイルにあまりなじみがないのなら
(この機会に覚えてしまいましょう)、最初はこの例が難しく感じられるかもしれません。
しかし、実際はこれはとても簡単なものです。
注意:
dnl で始まる行はすべてコメントであり、パースされません。
config.m4 ファイルの役割は、
configure に渡されたコマンドラインオプションを
パースすることです。つまり、
必要な外部ファイルを読み込んで同じような設定タスクを行わなければならないということです。
デフォルトのファイルは、
configure スクリプトのオプションとして
2 つの設定ディレクティブ
--with-my_module および
--enable-my_module を作成します。
外部のファイルを参照している場合 (例えば
--with-apache ディレクティブが
Apache のディレクトリを参照しているように)
は最初のオプションを使用します。
拡張モジュールを有効にするかどうかを指定させるだけの場合には
2 番目のオプションを使用します。どちらを使用するかを決めたら、
使用しないほうを削除しなければなりません。つまり、
もし --enable-my_module を使用するのなら
--with-my_module のサポートを削除しなければなりません。
逆もまた同様です。
デフォルトでは、ext_skel
が作成した config.m4 ファイルは
両方のディレクティブを受けつけ、自動的に拡張モジュールを有効にします。
拡張モジュールを有効にする作業は、PHP_EXTENSION
マクロで行われます。ユーザが (--enable-my_module
あるいは --with-my_module を明示的に指定して)、
モジュールを組み込むように指示した場合にのみ
PHP バイナリにモジュールを組み込むように変更するには、
$PHP_MY_MODULE のチェックを == "yes"
に変更します。
if test "$PHP_MY_MODULE" == "yes"; then dnl
Action.. PHP_EXTENSION(my_module, $ext_shared)
fi |
こうすると、PHP を再コンパイルするたびに
--enable-my_module
を使用しなければならなくなります。
注意:
config.m4 を変更した後は、常に
buildconf を実行してください!
設定スクリプトで使用可能な M4 マクロについては、後で詳細に説明します。
この段階では、デフォルトのファイルを使用することにします。