PHP マニュアル
前のページ | 第 46章Zend API: PHP のコアをハックする | 次のページ

# PHP の自動ビルドシステム

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 マクロについては、後で詳細に説明します。 この段階では、デフォルトのファイルを使用することにします。

前のページ | ホーム | 次のページ
ソース配置 | 上に戻る | 拡張モジュールの作成