Система Автоматического Построения PHP
Глава 28. Система автоматического построения PHP
PHP 4.0 предлагает чрезвычайно гибкую систему автоматического построения/build. Все модули находятся в поддиректории ext. Помимо своих собственных ресурсов, каждый модуль состоит из файла M4 (например, см. http://www.gnu.org/manual/m4/html_mono/m4.php) о конфигурации и файле Makefile.in), который отвечает за компиляцию (результаты работы autoconf и automake; см. http://sourceware.cygnus.com/autoconf/autoconf.php и http://sourceware.cygnus.com/automake/automake.php).
Оба файла генерируются автоматически вместе с .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.
- Примечание: не забывайте запускать buildconf каждый раз при изменении config.m4!
Далее в этой главе мы обсудим детали работы макросов M4, доступных вашим скриптам конфигурирования. Пока же мы просто используем файлы по умолчанию. Все примеры исходников на CD-ROM работают с файлами config.m4. Для включения их процесс построения PHP, просто скопируйте директории исходников в вашу директорию ext РНР, запустите buildconf, а затем подключите сэмплы необходимых модулей путём использования соответствующих директив--enable-* совместно с configure.