Php/MkRpmExtension

Материал из ALT Linux Wiki
< Php

Инструкция по сборке модулей 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-mbstring
  • php8.2-memcache
  • php8.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_version
  • Release: = %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