PHP 提供了一套非常靈活的自動構建系統(automatic build system),它把所有的模組均放在 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 指令碼。 預設情況下的的 config.m4 檔案如例 3-1 所示,看起來可能會稍嫌複雜:
例3.1 預設的 config.m4 檔案
dnl $Id: build.xml,v 1.1 2005/08/21 16:27:06 goba 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 檔案(現在毫無疑問是熟悉 M4 檔案的大好時機),那麼就可能會有點糊塗。但是別擔心,其實非常簡單。
注意:凡是帶有 dnl 首碼的都是注釋,注釋是不被解析的。
config.m4 檔案負責在配置時解析configure 的命令列選項。這就是說它將檢查所需的外部檔案並且要做一些類似配置與安裝的任務。
預設的設定檔將會在 configure 指令碼中產生兩個配置指令:–with-my_module 和 –enable-my_module。當需要引用外部檔案時使用第一個選項(就像用 –with-apache 指令來引用 Apache 的目錄一樣)。第二個選項可以讓使用者簡單的決定是否要啟用該擴充。不管你使用哪一個指令,你都應該注釋掉另外一個。也就是說,如果你使用了–enable-my_module,那就應該去掉–with-my_module。反之亦然。
預設情況下,通過 ext_skel 建立的 config.m4 都能接受指令,並且會自動啟用該擴充。啟用該擴充是通過 PHP_EXTENSION 這個宏進行的。如果你要改變一下預設的情況,想讓使用者明確的使用 –enable-my_module 或 –with-my_module 指令來把擴充包含在 PHP 二進位檔案當中,那麼將 “if test "$PHP_MY_MODULE" != "no"”改為“if test "$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 命令。