PHP 4.0 предлагает чрезвычайно гибкую систему автоматического построения/build.
Все модули находятся в поддиректории ext.
Помимо своих собственных ресурсов, каждый модуль состоит из файла M4 (например, см.
http://www.gnu.org/manual/m4/html_mono/m4.htm)
о конфигурации и файле Makefile.in), который отвечает за компиляцию (результаты работы autoconf и automake;
см. http://sourceware.cygnus.com/autoconf/autoconf.htm
и http://sourceware.cygnus.com/automake/automake.htm).
Оба файла генерируются автоматически вместе с .cvsignore небольшим скриптом оболочки под названием
ext_skel, который находится в директории ext. В качестве аргумента он принимает имя создаваемого модуля. Скрипт затем
создаёт директорию с тем же именем и соответствующие файлы config.m4 и Makefile.in.
Пошагово этот процесс выглядит так:
root@dev:/usr/local/src/php4/ext > ./ext_skel my_module
Creating directory
Creating basic files: config.m4 Makefile.in .cvsignore [done].
To use your new extension, you will have to execute the following steps:
$ cd ..
$ ./buildconf
$ ./configure (your extension is automatically enabled)
$ vi ext/my_module/my_module.c
$ make
Repeat the last two steps as often as necessary. |
Эта инструкция создаёт вышеупомянутые файлы. Для того чтобы включить новый
модель в процесс автоматической конфигурации и построения,
вы должны запустить buildconf, который регенерирует скрипт configure путём поиска в директории
ext и включения всех найденных файлов config.m4.
Наконец, запуск configure разбирает все опции конфигурации и генерирует makefile на основе этих опций и
опций, специфицированных в Makefile.in.
В Листинге 9.1 показан сгенерированный Makefile.in:
Рисунок 28-1. Листинг 9.1. Файл Makefile.in по умолчанию.
# $Id: Extending_Zend_Build.xml,v 1.1 2002/01/09 12:16:30 derick Exp $
LTLIBRARY_NAME = libmy_module.la
LTLIBRARY_SOURCES = my_module.c
LTLIBRARY_SHARED_NAME = my_module.la
include $(top_srcdir)/build/dynlib.mk |
Тут мало что можно сказать: Он содержит имена входного и выходного файлов. Вы
можете также специфицировать build-инструкции для других файлов, если ваш
модуль строится из нескольких исходных файлов.
Файл config.m4 по умолчанию, показанный в Листинге 9.2, немного сложнее:
Рисунок 28-2. Листинг 9.2. Файл config.m4 по умолчанию.
dnl $Id: Extending_Zend_Build.xml,v 1.1 2002/01/09 12:16:30 derick Exp $
dnl config.m4 for extension my_module
dnl don't forget to call PHP_EXTENSION(my_module)
dnl If your extension references something external, use with:
PHP_ARG_WITH(my_module, for my_module support,
dnl Make sure that the comment is aligned:
[ --with-my_module Include my_module support])
dnl Otherwise use enable:
PHP_ARG_ENABLE(my_module, whether to enable my_module support,
dnl Make sure that the comment is aligned:
[ --enable-my_module Enable my_module support])
if test "$PHP_MY_MODULE" != "no"; then
dnl Action..
PHP_EXTENSION(my_module, $ext_shared)
fi |
Если вы плохо знакомы с M4-файлами (теперь самое время познакомиться с ними
получше), всё это может вызвать некоторое замешательство; но в
действительности всё довольно просто.
- Примечание: всё с префиксом dnl считается комментарием и не разбирается.
Файл config.m4 отвечает за разбор опций командной строки, передаваемых в configure
на этапе конфигурирования. Это означает, что он должен проверять наличие
требуемых внешних файлов и выполнять схожие задачи по конфигурированию и установке.
Файл по умолчанию создаёт две директивы конфигурирования в скрипте configure:
--with-my_module и --enable-my_module.
Используйте первую опцию при обращении к внешним файлам (как с директивой --with-apache, которая обращается к директории Apache).
Используйте вторую опцию, когда пользователь должен просто решить, включать ли
ваше расширение. Независимо от используемой опции вы должны раскомментировать
другую опцию, ненужную; то есть, если вы используете --enable-my_module, вы должны удалить поддержку
--with-my_module, и наоборот. По умолчанию файл config.m4, созданный скриптом
ext_skel, принимает обе директивы и автоматически включает ваше расширение. Включение
расширения выполняется путём использования макроса PHP_EXTENSION. Для изменения поведения по умолчанию и подключения вашего модуля в
исполняемый PHP, когда это нужно пользователю (явно специфицируя --enable-my_module или
--with-my_module), измените test for $PHP_MY_MODULE на == "yes":
if test "$PHP_MY_MODULE" == "yes"; then
dnl Action..
PHP_EXTENSION(my_module, $ext_shared)
fi |
Это может потребовать от вас использования --enable-my_module
каждый раз при реконфигурировании и рекомпиляции PHP.
- Примечание: не забывайте запускать
|