深入php核心四(自動構建系統)

來源:互聯網
上載者:User

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 命令。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.