|
Автоматическое определение зависимостей, описание использования
Автоматическое определение зависимостей для модулей и программ на языке
"Python" допускает разбиение пакетов на отдельные компоненты,
обеспечивая возможность контроля полноты установки среды.
Определение зависимостей основано на нахождении в модулях конструкций с
оператором import и использование его параметров для построения
зависимостей. Запись зависимости имеет вид:
<ЗАВИСИМОСТЬ> :== "Python" <ВЕРСИЯ> "(" <МОДУЛЬ> { "." <МОДУЛЬ>} ")"
<ВЕРСИЯ> :== <ГОЛОВНАЯ ВЕРСИЯ> "." <ПОДВЕРСИЯ>
(Под версией подразумевается номер версии интерпретатора "Python")
<МОДУЛЬ> -- имя импортируемого модуля.
Использование зависимостей на подмодули в настоящий момент не
поддерживается, хотя в ограниченном виде такая поддержка появится в
ближайшем будущем.
Хотя в подавляющем большинстве случаев достаточно настроек по умолчанию,
поиск зависимостей позволяет указать ряд параметров настройки:
%set_python_req_method "strict" | "slight"
По умолчанию используется значение "slight", в этом случае
находятся операторы import в безусловно-достижимом коде, не
экранированном ловушками "try". Для языка python это
представляется наиболее предпочтительной практикой, так как
подавляющее большнство модулей используют автоконфигурирование
на этапе выполнения и содержат многочиленые операторы import в
различных ветвях выполнения, пораждающие ненужные, и, зачастую,
взпимоисключающие, зависимости.
Если такие "условные" зависиости нужны, то их можно указать явно
(в вышеописанном формате) или использовать значение "strict" для
этого параметра, тогда поиск зависимостей найдет все зависимости
пакета.
%add_python_req_skip <МОДУЛЬ> [ <МОДУЛЬ> ]
Автоматический поиск зависимостей иногда (особенно, при
использовании метода "strict") находит лишние зависимости,
избавится от которых можно перечислив названия требуемых модулей
в этом операторе.
Существует процесс, парный к поиску зависимостей - определение
предоставляемых модулей. Предоставляемые модули ищутся на пути импорта
модулей (PYTHONPATH) и включают в себя файлы
*py, *so.
%add_python_lib_path <КАТАЛОГ> [ <КАТАЛОГ> ]
Иногда, модули используются программными пакетами (например,
Zope), использующими дополнительные каталоги для размещения
модулей. Такие каталоги можно указать с помощью параметра
add_python_lib_path.
Включение и выключение определения зависимостей происводится командами
AutoReq, AutoProv (параметр python).
Байт-компилятор, описание использовани
Байт-компилятор предназначен для компиляции модулей PYTHON при сборке
RPM и может использоваться совместно с distutils или вместо них.
Необходимость использования байт-компилятора после установки с distutils
объясняется размещение модулей при установки в ином месте, по сравнению
с использованном при сборке пакета.
Байт-компилятор вызывается автоматически на последней стадии сборки RPM
(явно вызывать его не надо) и компилирует все файлы *py, попавшие в
установочный путь PYTHON, кроме исполнямых файлов, иные скомпилированные
файлы удаляются. Это поведение байт-компилятора может быть
модифицировано указанием спциальных макросов в спеке:
%set_python_compile_method ALL | ALREADY | BOTH
Метод отборки модулей для компиляции:
ALL -- компиляция всех модулей;
ALREADY -- компиляция ранее скомпилированных модулей (т.е.
если существует some.pyc, то будет выполнена его
перекомпиляция);
BOTH -- компиляция, если существует хотя бы один из
результатов компиляции с разными типами оптимизации
(т.е. если существует some.pyc, то будет выполнена
перекомпиляция его и файла some.pyo);
%add_python_compile_exclude <ПУТЬ>
Исключить из перекомпиляции указанный путь (по умолчанию
исключается /usr/share/doc);
%add_python_compile_include <ПУТЬ>
Добавить к каталогам, задействуемым в перекомпиляции, указанный
путь (по умолчанию используется /usr/lib);
%define _python_compile_deep <INT>
Глубина просмотра каталогов при перекомпиляции, по умолчанию
используется 20 (этого значения может не хватать для некоторых
пакетов Zope & egenix);
%define _python_compile_skip_x <INT>
Если значение 1 (это умолчание), то исключать из перекомпиляции
исходники с установленным x-битом;
%define _python_compile_clean <INT>
Если значение 1 (это умолчание), то стирать файлы pyo & pyc, не
являющиеся результатом текущей байт-компиляции.
Байт-компилятор может быть использован независимо, управление им
осуществляется ключами командной строки, которые лучше посмотреть в
исходнике (это не является рекомендуемым способом использования, поэтому
вести специальную документацию лень).
Distutils
Стандартный модуль DistUtils языка "Python" позволяет выполнять сборку
пакетов на основании специального файла с мета-информацией (setup.py).
Таким образом может выполнятся сборка пакетов различных типов для
различных операционных систем.
Модуль rpm-build-python устанавилвает ряд специальных файлов,
дополняющих список поддерживаемых систем дистрибутивом "AltLinux":
команда
python setup.py bdist_altrpm
позволяет собрать пакет, примерно соответствующий текущей python-полиси
AltLinux.
Несоответствия обусловлены отчасти ограничениями, присущими DistUtils,
но в больщей степени - моей личной ленью: можно рассматривать это как
альфа-версию.
На сегодняшний день реально полезным применением может быть
использование distutils для создания спецификации _нового_ модуля и ее
последующего редактирования руками. Это может быть сделано командой:
python setup.py bdist_altrpm --daedalus --spec-only
Указание ключа --daedalus включает в спек специальные проверки на то,
что модуль собирается для экспериментального репозиторея daedalus, если
это так, сборка модуля включае ряд экспериментальных возможностей.
Макросы для сборки модулей "Python", описание использвания
setup_python_module <имя_модуля>
Функция, инициирующая спек. Должна указываться в начале спека
для инициализации параметров сборки. К моменту вызова функции должны
быть определены переменные version & release.
Проверить указанные ключа сборки --with pythonXY и/или with
--python_auto, и установить сборочные зависимости пакета.
Если при сборке было указан ключ --with pythonX.Y, то определить
переменную __python_package_version, равную <версии_с_точкой>, и
внести кляузу
BuildPreReq: python = X.Y
в пакет.
В случае одновременного использования двух разных ключей --with
pythonX.Y инициируется аварийная остановка сборки
Кроме того, определяет переменные packagename и __python_package_version
(в зависимости от ключей и прочих параметров сборки).
setup_python_module_loose <имя_модуля>
Альтернатива setup_python_module, не использующая генерацию .rpmreq
файла и не выполняющая проверку его наличия.
|