From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Sat, 21 Feb 2004 21:25:33 +0300 From: Mikhail Zabaluev To: Alexey Morozov Subject: Re: [devel] Q: Python packaging howto Message-ID: <20040221182533.GB14716@av1046.comex.ru> Mail-Followup-To: Mikhail Zabaluev , Alexey Morozov , devel@altlinux.ru, cray@neural.ru References: <20040220120041.GA2684@av1046.comex.ru> <20040221113726.GB29390@pyro.hopawar.private.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="oLBj+sq0vYjzfsbl" Content-Disposition: inline In-Reply-To: <20040221113726.GB29390@pyro.hopawar.private.net> User-Agent: Mutt/1.4.2.1i Cc: devel@altlinux.ru, cray@neural.ru X-BeenThere: devel@altlinux.ru X-Mailman-Version: 2.1.4 Precedence: list Reply-To: ALT Devel discussion list List-Id: ALT Devel discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Feb 2004 18:25:35 -0000 Archived-At: List-Archive: List-Post: --oLBj+sq0vYjzfsbl Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit Hello Alexey, On Sat, Feb 21, 2004 at 05:37:26PM +0600, Alexey Morozov wrote: > > В аттачменте файл python, который, по-хорошему, идет в python-common > и пример спек файла. Собирать при помощи > > rpmbuild -ba pyserial.spec > > На выходе будет python-pyserial-*.rpm, причем, бинарные rpm привязаны к > текущей (вероятно, 2.3) версии python. Если нужна сборка под какой-либо > конкретный питон, то > > rpmbuild -ba pyserial.spec --with pythonXY > > на выходе будут получаться > > pythonXY-pyserial...rpm Мне не нравится идея, что основное имя (то, которое принимает .src.rpm) зависит от ключей сборки. На самом-то деле исходный пакет от этого не зависит. Может быть, лучше для Name: оставить имя модуля, без всяких python*-, а для объявления бинарного пакета предусмотреть макросы? Впрочем, это будет не очень удобно, если макрос для объявления бинарного пакета не будет автоматически копировать %description основного пакета. Я не знаю, можно ли это сделать в rpm. Есть ещё такая радикальная идея: бинарный пакет может именоваться и по-человечески, именем tarball'а, но предоставлять также имя, привязанное к версии ABI python. При этом могут использоваться скобочные схемы, например: python-abi(%modulename) = %__python_version После этого корректное прописывание зависимостей между пакетами модулей останется предметом policy. > в данный момент, в качестве XY может использоваться 22, 23 и (задел на > будущее) 24. К сожалению, я не придумал, как можно сделать это место > полностью универсальным. > > Зависимости на пакеты с другими модулями python надо прописывать как > > Requires: python%__python_package_version- > > Могу оформить все это дело в виде отдельного макроса. Предложения по > наименованию принимаются. Помимо изложенного выше предложения, есть такой вариант: %{python_versioned_name anotherModule} а также %__python_packagename python%__python_package_version > Данные макросы никак не затрагивают эту область. То есть, метод > сборки и упаковки определяется исключительно пэкеджером. Единственное > условие - делать в конце %install unset RPM_PYTHON, чтобы исключить > скорее всего нежелательную (повторную) байт-компиляцию. Хотя, конечно, > сейчас этот самый RPM_PYTHON, по-хорошему, будет указывать именно на ту > версию питона, для которой собирается пакет (даже если идет сборка по > умолчанию) Насколько я понимаю, компиляция после %install необходима только для тех скриптов, которые не используют схему установки из distutils с опцией --root. Если так, то да, лучше её отключить. По идее, нужно добиться, чтобы RPM_PYTHON была установлена правильно во всех случаях. Как насчёт %set_python_version по примеру autoconf/automake/libtool? Тогда /usr/bin/python из python-common запустит требуемую версию или контролируемый альтернативами /usr/bin/python-default. Этот же трюк позволит избавиться от --with-pythonXY и таинственного макроса setup_python_module: тем, кто захочет зафиксировать версию python в своей сборке, достаточно будет вставить %set_python_version X.Y в spec. > У меня есть идея оформить стандартные действия при инсталляции макросами, > аналогичными %perl_vendor_build/%perl_vendor_install, которые бы покрывали > основные нужды сборщиков (при использовании distutils). Вероятно, сегодня > ближе к вечеру это будет сделано. Скорее всего, по умолчанию будут > паковаться только .pyo, но, надеюсь :-), будет возможность, во-первых, > собрать [отдельный] пакет с .py, а, во-вторых, переключиться на > использование .pyc. Достаточно определить макрос для уровня оптимизации, %python_optlevel, и использовать его в опции --optimize (с разумным fallback'ом). > Дополнительные замечания по поводу сборки: > > в данной схеме есть один, как мне кажется, недочет. Если некто > пересобирает модуль вида pythonXY-pyModule-K.L.M-altN.src.rpm, не > указывая --with pythonXY, то на выходе он получает модуль, привязанный к > ТЕКУЩЕЙ версии питона, а не к версии X.Y. Имена и зависимости пакетов > изменяются соответственно (то есть, будет > python-pyModule-K.L.M-altN.i586.rpm, зависящий от python, запускаемого > как /usr/bin/python). Мне кажется, бинарный пакет с модулем должен всегда быть привязан к конкретной версии python ABI, коль скоро он содержит байт-код под этот ABI. Точно так же, нет смысла в общем имени каталога /usr/lib/python > %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/ Не увидел проблем при использовании обычной схемы: %build CFLAGS="$RPM_OPT_FLAGS" python setup.py build %install python setup.py install \ --optimize=%python_optlevel \ --root=$RPM_BUILD_ROOT \ --record=INSTALLED_FILES .pyo и .pyc исправно попадают в INSTALLED_FILES. Проверял, правда, только на 2.3. P.S. Залил в Sisyphus python-doc версии 2.3.3. Было бы неплохо, если бы maintainer Python своевременно обновлял также и этот пакет. Там можно прочитать о хорошем способе генерации начального .spec для модуля: python setup.py bdist_rpm --spec-only Я думаю, об этом стоит написать в HOWTO. А может быть, даже подправить шаблон для .spec'а для того, чтобы он получался сразу готовым к употреблению. -- Stay tuned, MhZ JID: mhz@altlinux.org ___________ Daemon escaped from pentagram --oLBj+sq0vYjzfsbl Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAN6KdTKqCuNPJlLgRApZEAJ99T5OqW2CEVXQ+AM2Ym2PEcsH1JwCeKrLF o8jEe/2IQ4m8fCwbL+FJexA= =7Y6a -----END PGP SIGNATURE----- --oLBj+sq0vYjzfsbl--