Php/MkRpmExtension
Инструкция по сборке модулей PHP для ALT Linux
Цель
Обеспечить единообразную сборку и упаковку модулей PHP для ALT Linux:
- bundled extensions — модули из дерева PHP (ext/*);
- external extensions — модули из внешних репозиториев (PECL, GitHub и т.п.).
Инструкция задаёт правила именования пакетов, использования макросов, размещения файлов, тестирования, changelog и интеграции с системой.
Общие правила
Подстановки specsubst и макросы
- В spec-файле допускается ровно одно использование
@phpver@:
BuildRequires(pre): rpm-build-php@phpver@-version
- Все остальные поля (Name, Version, Release, пути, флаги) должны использовать макросы, предоставляемые пакетом
rpm-build-php@phpver@-version.
Пример макросов (php8.2):
%php_name php8.2 %_php_version 8.2.29 %php_release alt1 %_php_release_version 29 %_php_major 8 %_php_minor 2 %_php_suffix 8.2
Именование пакетов
- Имя исходного и бинарного пакета всегда строго:
php<MAJOR.MINOR>-<имя_модуля>
Примеры:
php8.4-mbstringphp8.2-memcachephp8.3-imagick
Именование specfile
- Имя specfile всегда строго должно иметь имя php-<имя модуля>.spec
Для specfile нельзя использовать имя файла, содержащее версию php, т.к. один и тот же spec будет использоваться для сборки пакета под разные версии php
Общая схема сборки
- Источники: Source0, Source1 (ini), Source2 (params.sh).
phpize,%configure,%php_make,%php_make_install.- Установка ini и params.sh в
%php_extconf/%php_extension. - Запуск
make testв %check. - Подключение/отключение модуля выполняется через filetrigger пакета PHP.
Файл правил Gear
В репозитории должен быть .gear-rules (или .gear/rules):
- Для bundled:
copy: *.ini copy: *.sh specsubst: phpver
- Для external:
tar: @version@:. name=php-<ext>-@version@ spec: .gear/php-<ext>.spec copy: .gear/*.ini copy: .gear/*.sh copy?: .gear/*.patch specsubst: phpver
Вспомогательные файлы
php-<ext>.ini: минимальный ini-файл, пример для модуля zip
extension=zip.so
php-<ext>-params.sh: параметры для скрипта установки, пример для модуля zip
file_ini=zip.ini
exceptions=
Файлы копируются в %php_extconf/%php_extension.
Локальная сборка пакета в hasher
Для проверки локальной сборки можно явно указать версию PHP через настройку git в локальном репозитории.
Необходимо задать переменную gear.specsubst.phpver в формате MAJOR.MINOR.
Например, чтобы собрать пакет для PHP 8.4, выполните:
git config gear.specsubst.phpver 8.4
Создание тэга для сборки на girar
Для отправки пакета на сборку в girar необходимо создать git-тег особого формата, включающего значение specsubst.
Самый удобный способ — воспользоваться утилитой gear-create-tag с опцией --specsubst.
Например, для модуля php-swoole под PHP 8.2 команда будет такой:
gear-create-tag --specsubst=phpver=8.2 -m php8.2-swoole-6.0.1-alt2 -n php8.2-swoole-6.0.1-alt2
Имя тэга должно содержать:
- имя итогового исходного пакета (например,
php8.2-swoole); - версию пакета (например,
6.0.1); - релиз без автогенератора версии PHP (например,
alt2).
ACL на изменение пакета в репозитории
- ACL на изменение пакета в репозитории должен позволять вносить в него изменения сопровождающему php, т.к. при каждой сборке новой минорной версии php требуется обновление содержимого пакета (через specsubst). На момент написания этой инструкции php сопровождал @rider
Bundled extensions
Версионирование
Version:=%php_versionRelease:=%php_release
Changelog
Шаблонный:
* %(date "+%%a %%b %%d %%Y") %{?package_signer:%package_signer}%{!?package_signer:%packager} %version-%release
- Rebuild with php-%version-%release
External extensions
Источники
- Всегда собираются из git апстрима (Gear поверх апстримного репозитория).
Source0=php-<ext>-<version>.tar- Дополнительно могут быть патчи (
copy?: .gear/*.patch).
Тег VCS
- В spec обязателен тег
VCS:с URL апстримного git-репозитория (пример для модуля php-imagick):
VCS: https://github.com/Imagick/imagick
Версионирование
Version:= версия апстрима (например, 3.8.0, 8.2).Release:=alt%php_version.%php_releaseилиalt1.%_php_release_version.- Допустимо использование
Epoch:при смене схемы версионирования.
Changelog
- Шаблонная запись для rebuild под текущую ветку PHP:
* %(date "+%%a %%b %%d %%Y") %{?package_signer:%package_signer}%{!?package_signer:%packager} %version-%release
- Rebuild with php-devel = %php_version-%php_release
- Исторические записи для апстримных обновлений:
* Wed May 07 2025 John Doe <j.doe@example.org> 1:3.8.0-alt1
- 3.7.0 -> 3.8.0
- built from upstream git
Сборка и тесты
- Возможны дополнительные BuildRequires на сервисы (например, memcached).
- Допустимо удаление заведомо проблемных тестов (
rm -f tests/*.phpt). - Остальная сборка аналогична bundled.
Filetrigger
В пакетах модулей не используются %post / %preun. Подключение конфигурации обеспечивается через filetrigger из пакета php<версия>.
Пример для пакета php8.4: (/usr/lib/rpm/89-php8.4.filetrigger):
#!/bin/sh
LC_ALL=C grep -Eqs '^/etc/php/8.4/.*/php.d|^/usr/lib64/php/8.4.11/extensions' || exit 0
if [ -x /usr/share/php/scripts/php_postin.sh ]; then
export php_servicedir=/usr/share/php/8.4/service
export php_sysconfdir=/etc/php/8.4
export php_extconf=/usr/share/php/8.4/extconf
/usr/share/php/scripts/php_postin.sh ||:
fi
Чек-лист мейнтейнера
- Имя исходного и бинарного пакета =
php<MAJOR.MINOR>-<module>. - В
BuildRequires(pre):естьrpm-build-php@phpver@-version. @phpver@используется только в BuildRequires(pre).- Для bundled:
Version=%php_version,Release=%php_release. - Для external:
Version= апстрим,Release=alt%php_version.%php_release. - Для external указан
VCS:с апстримным git. - Пути и флаги через макросы (
%_php_version,%_php_suffix,%php_extdir,%php_extconf). - ini и params.sh присутствуют и копируются в
%php_extconf/%php_extension. - Тесты запускаются в %check.
- Подключение модуля работает через filetrigger.
- Changelog соответствует типу модуля (шаблонный rebuild + история для external).
Эталонные шаблоны
Bundled (php8.4-foo.spec)
%define php_extension foo
Name: php%_php_suffix-%php_extension
Version: %php_version
Release: %php_release
Summary: Foo extension for PHP
Group: System/Servers
License: PHP-3.01
Source1: php-%php_extension.ini
Source2: php-%php_extension-params.sh
BuildRequires(pre): rpm-build-php@phpver@-version
BuildRequires: php-devel = %php_version
%description
The %name package provides Foo support for PHP.
%prep
%setup -T -c
cp -pr %php_extsrcdir/%php_extension/* .
%build
phpize
%add_optflags -fPIC -L%_libdir
export LDFLAGS=-lphp-%_php_version
%configure --with-php-config=%_bindir/php-config --with-%php_extension
%php_make
%install
%php_make_install
install -D -m 0644 %SOURCE1 %buildroot/%php_extconf/%php_extension/config
install -D -m 0644 %SOURCE2 %buildroot/%php_extconf/%php_extension/params
%check
NO_INTERACTION=1 make test
%files
%php_extconf/%php_extension
%php_extdir/*
%doc CREDITS
%changelog
* %(date "+%%a %%b %%d %%Y") %{?package_signer:%package_signer}%{!?package_signer:%packager} %version-%release
- rebuilt with php-%version-%release
External (php8.4-bar.spec)
%define php_extension bar
Name: php%_php_suffix-%php_extension
Version: 2.1.0
Release: alt%php_version.%php_release
Summary: Bar extension for PHP
Group: System/Servers
License: PHP-3.0
URL: https://github.com/example/bar
VCS: https://github.com/example/bar
Source0: php-%php_extension-%version.tar
Source1: php-%php_extension.ini
Source2: php-%php_extension-params.sh
BuildRequires(pre): rpm-build-php@phpver@-version
BuildRequires: php-devel = %php_version
BuildRequires: libbar-devel
%description
Bar is an external PHP extension that provides ...
%prep
%setup -n php-%php_extension-%version
%build
phpize
export LDFLAGS=-lphp-%_php_version
%configure --enable-bar
%php_make
%install
%php_make_install
install -D -m 0644 %SOURCE1 %buildroot/%php_extconf/%php_extension/config
install -D -m 0644 %SOURCE2 %buildroot/%php_extconf/%php_extension/params
%check
NO_INTERACTION=1 make test
%files
%php_extconf/%php_extension
%php_extdir/*
%doc CREDITS README
%changelog
* %(date "+%%a %%b %%d %%Y") %{?package_signer:%package_signer}%{!?package_signer:%packager} %version-%release
- rebuilt with php-devel = %php_version-%php_release
* Wed May 07 2025 John Doe <j.doe@example.org> 2.1.0-alt1
- 2.0.0 -> 2.1.0
- built from upstream git