Создание пакетов с модулями Python3
Python3 - современная линейка версий языка и интерпретатора Python, вот уже несколько лет усиленно вытесняющая Python2. Поскольку многие проекты все еще ориентируются на Python2, то для многих модулей Python в РОСЕ предусмотрено два варианта - для Python2 и Python3. Оформляются эти "варианты" как отдельные пакеты - обычно python-foo содержит модуль foo для Python2, а python3-foo - foo для Python3.
Если в репозитории уже есть пакет python-foo, то можно достаточно быстро создать на его основе python3-foo. Для этого ищем проект для python-foo в группе import на ABF - и клонируем его в свой репозиторий в ABF под именем python3-foo (с помощью кнопки «Fork»).
Далее клонируем git-репозиторий проекта на локальную машину, переключаемся на ветку Git с названием "rosa2016.1" и переименовываем spec-файл python-foo.spec в python3-foo.spec. Для верности, обрабатываем этот файл инструментом spec-cleaner. Выглядит это в командной строке примерно так:
$ abf get <your_abf_login>/python3-foo -b rosa2016.1 $ cd python3-foo $ git mv python-foo.spec python3-foo.spec $ spec-cleaner python3-foo.spec
После чего внутри файла python3-foo прочесываем поля BuildRequires, Requiers, Suggest и Conflicts на предмет наличия там строк, начинающихся с «python-» или «pythonegg». Такие вхождения меняем на python3- и python3egg соответственно. Т.е. такие вот строки:
BuildRequires: python-devel Requires: pythonegg(setuptools)
Должны преобразоваться в такие:
BuildRequires: python3-devel Requires: python3egg(setuptools)
Теперь смотрим на секции %build, %install и %check (если есть) и заменяем там вызов команды python на вызов python3.
Наконец, смотрим на секцию %files и заменяем макросы, начинающиеся на %{py_, соответствующими макросами, начинающимися на %{py3_. Например, такая строка:
%{py_platsitedir}/%{module}/foo.py*
должна превратиться в такую:
%{py3_platsitedir}/%{module}/foo.py*
Такую замену макросов %{py_ надо сделать и в других местах spec-файла, если эти макросы там вдруг встретятся.
Теперь получившийся пакет надо собрать. Для этого сначала надо установить пакеты, которые требуются для его сборки (прописаны в BuildRequires). Для этого внутри директории python3-foo выполняем команду:
$ urpmi python3-foo.spec
Если вам сообщат, что зависимости не могут быть установлены, т. к. не хватает пакета python3-bar, то вам надо сначала собрать python3-bar, а уже потом возвращаться к python3-foo.
Если все ok, то извлекаем с ABF необходимые для сборки файлы и запускаем саму сборку с помощью rpmbuild:
$ abf fetch $ rpmbuild -bb python3-foo.spec
В идеале, все должно собраться сразу. Часто могут возникать проблемы из-за того, что где-то забыли поменять «python» на «python3» или «py» на «py3». Иногда встречаются и специфические для python3 ошибки, так что если за разумное время пакет собрать не удалось, лучше обратиться к разработчикам РОСЫ.
Получившийся в результате пакет необходимо попробовать установить с помощью urpmi:
$ urpmi –test ~/rpmbuild/RPMS/<pkg_arch>/python3-foo-<version>.rpm
Здесь <pkg_arch> может принимать значение i586, x86_64 или noarch – это зависит от архитектуры вашей системы и от того, помечен ли пакет как независимый от архитектуры (это определяется наличием конструкции "BuildArch: noarch" в spec-файле). Посмотрите на вывод rpmbuild – он выводит пути к собранным пакетам. Если urpmi сообщит, что не может установить зависимость типа python3-pad, то вам нужно также озаботиться созданием пакета python3-pad. Для сборки python3-foo он не нужен, но вот для его работы понадобится.
Наконец, неплохо бы убедиться в работоспособности полученного модуля - хотя бы написать небольшой скрипт на python3, импортирующий этот модуль.