[devel] RFC: Правильная схема построения питон-модулей

Alexey Morozov =?iso-8859-1?q?alex_=CE=C1_idisys=2Eiae=2Ensk=2Esu?=
Чт Фев 12 05:24:55 MSK 2004


Я тут слегка доработал схему сборки. Основные цели, которых пытался добиться:

	* лёгкая сборка для "основной" версии питона
	* минимум изменений в спек-файл
	* возможность собрать модуль для строго указанной версии питон,
	  неконфликтующий по имени с "основным"
	* контроль за типичными ошибками (сборка под несуществующий питон,
	  попытка одновременной сборки под несколько версий)

Что получилось на выходе:

	* "типичный спек файл" (на примере pyserial)
	* файл макросов, который необходимо положить в /etc/rpm/macros.d/python,
	  и который должен принадлежать какому-нибудь python-common
	* сборка осуществляется либо через
		rpmbuild -ba pyserial.spec
	  либо через
	  	rpmbuild -ba pyserial.spec --with python<package_version>
	  например
	  	rpmbuild -ba pyserial.spec --with python22

Особенности поведения (требуется доработка):
	* макросы %version и %release должны быть определены в
	  момент вызова %setup_python_module
	* имя пакета должно определяться после вызова %setup_python_module
	  через %packagename

Чего добиться не удалось:

	* возможности инкрементального подключения новых версий питон,
	  допустимые версии просто забиты в текст макрофайла
	* какая-то засада с макросом %error: про ошибку пишет, сборку не
	  прекращает. Приходится выдумывать "ужасные методы"


P.S. Brainfuck - фигня! Программирование на макроязыке RPM <censored>
мозги почище всяких брэйнфаков!

Как в макрофайле создать список неизвестной заранее длины а потом по нему
проитерироваться я так и не понял. И эта черная магия с экспандом в
экспанде. Я так и не понял, почему в одном случае обязательно надо делать
вложенные экспанды, а в другом и так проканывает.
----------- следующая часть -----------
# for an unknown reason %%error macro doesn't lead to immediate immediate abort
# so we use BuildConflicts below as a headshot :-/

%check_python_version_internal() \
%{expand: %{expand:%%{?_with_python%{2}:%%{?__python_package_version:%%%%{error:Only one python version can be selected at a time}}}}} \
%(echo %{expand:%%{?_with_python%{2}:%%{?__python_package_version:BuildConflicts: python = %{1}}}}) \
%(echo %{expand:%%{?_with_python%{2}:BuildPreReq: python = %{1}}}) \
%(echo %{expand:%%{?_with_python%{2}:Requires: python = %{1}}}) \
%{expand: %{expand:%%{?_with_python%{2}:%%%%global __python %(which python%1 2>/dev/null || echo `which python`)}}} \
%{expand: %{expand:%%{?_with_python%{2}:%%%%global __python_package_version %2}}}

%check_python_version() \
%{expand: %%check_python_version_internal %{1} %(echo %1 | sed -e 's/\\.//g')}

%setup_python_module()	\
%check_python_version 2.2 \
%check_python_version 2.4 \
%check_python_version 2.3 \
%{expand: %%{!?__python_package_version:%%global __python_package_version %%(echo %%__python_version | sed -e 's/\\.//g')}} \
%{expand: %%global modulename %{1}} \
%{expand: %%global packagename python%__python_package_version-%{1}} \
%(echo Provides: python-%1 = %version-%release)

----------- следующая часть -----------
# -*- coding: utf-8 -*-
%define	version	2.0
%define release alt2

%setup_python_module pyserial

Summary: Serial port access for python
Summary(ru_RU.UTF-8): Доступ к последовательному порту из python
Name: %packagename
Version: %version
Release: %release
Source: %modulename-%version.zip
License: Python
Group: Development/Python
Prefix: %_prefix
Url: http://pyserial.sf.net


# Automatically added by buildreq on Wed Jan 14 2004
BuildRequires: unzip

%description
This module capsulates the access for the serial port. It provides
backends for standard Python running on Windows, Linux, BSD (possibly
any POSIX compilant system) and Jython. The module automaticaly
selects the appropriate backend.

This module is built for python %__python_version

%description -l ru_RU.UTF-8
С помощью этого модуля можно работать с последовательным портом в
стандартном Python, запущенном на Windows, Linux, BSD (возможно, любой
POSIX-совместимой системе) или Jython. Модуль автоматически выбирает
подходящий для данной системы механизм доступа.

Этот модуль собран для Python версии %__python_version

%package -n python-%modulename-doc
Summary: %modulename documentation and example programs
Summary(ru_RU.UTF-8): Документация по API и примеры программ для %modulename
Group: Development/Python
Prefix: %_prefix
Requires: python-%modulename = %version
%description -n  python-%modulename-doc
%modulename provides portable way to access serial ports in various
systems. Install python-%modulename-doc if you need API documentation
and examples for this module

%description -n  python-%modulename-doc -l ru_RU.UTF-8
%modulename предоставляет унифицированный доступ к последовательному
порту в разных системах. Установите python-%modulename-doc, если Вам
требуется документация по API и примеры программирования с
использованием данного модуля.

%prep
%setup -q -n %modulename-%version

%build
mkdir -p buildroot

# Unfortunately build and install steps should be done at once
# because otherwise .pyo files won't get into INSTALLED_FILES
# record

CFLAGS="%optflags" %__python setup.py \
	install --optimize=2 \
		--root=`pwd`/buildroot \
		--record=INSTALLED_FILES
%install

cp -pr buildroot %buildroot/

unset RPM_PYTHON

%files -f INSTALLED_FILES
%doc changes.txt readme.txt

%files -n python-%modulename-doc
%doc examples


%changelog
* Wed Jan 14 2004 Alexey Morozov <morozov на altlinux.org> 2.0-alt1
- Initial build for ALT Linux


Подробная информация о списке рассылки Devel