The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Руководство по сборке и бэкпортированию deb пакетов (debian packet backport apt linux)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: debian, packet, backport, apt, linux,  (найти похожие документы)
From: GQ <http://gq.net.ru>; Date: Sun, 16 Feb 2008 17:02:14 +0000 (UTC) Subject: Руководство по сборке и бэкпортированию deb пакетов Оригинал: http://gq.net.ru/2007/03/16/building-deb-packages/ В связи с упомянутой в комментариях к этой статье задачей "Как правильно собрать/сбэкпортить пакет" решил описать свое решение. Disclamer Если Вам показалась интересной эта статья и, в особенности, если что-то показалось неясным, обратите внимание на соответствующую страницу в DebianWiki. Шаг 0. Сурцовый пакет Во-первых, предположим, что у нас уже есть сурцовый пакет. Получается он обычно из репозитория deb-src командой $ apt-get source <имя пакета> Если у вас несколько репозиториев, то вытащена будет самая свежая версия пакета, если требуется какая-то конкретная, то можно указать ее после имени через знак = Кстати, чтобы узнать список версий в доступных репозиториях, можно использовать команду $ apt-cache policy <имя пакета> Правда она показывает информацию о бинарных пакетах, но, например, в репозиториях Debian всегда можно вытащить аналогичные сурцовые пакеты. Если вы тащите пакеты откуда-то вне репозитория, или не хотите подключать ради этого сурцовый репозиторий, то достаточно скачать файлы * <имя пакета>_<версия>.orig.tar.gz * <имя пакета>_<версия>.diff.gz * <имя пакета>_<версия>.dsc После этого надо распаковать этот сурцовый пакет командой $dpkg-source -x <имя пакета&>_<версия>.dsc Получится каталог <имя пакета>-<версия_upstream> Есливы скачали пакет из репозитория командой apt-get, а он не распаковался сам, значит вам надо поставить пакет dpkg-dev в котором содержится утилита dpkg-source. Шаг 1. Исправление версии Этот шаг не обязателен, но если вы соберете пакет с такой-же версией, что и в официальном репозитории, то во-первых, по версии пакета будет сложно определить бэкпорт это или нет, а во-вторых, при дальнейшем апгрейде у вас может остаться сбэкпорченный пакет, потому что его версия будет совпадать с версией в репозитории. Да и вообще, нехорошо это, когда 2 разных сборки пакета имеют одну и ту же версию. При бэкпорте обычно добавляют в конец версии что-то вроде ~backport1, так как по правилам сравнения версий в системе apt "<версия>~<строка>" всегда меньшн чем просто "<версия>". Переходим в каталог <имя пакета>-<версия_upstream> и говорим в нем dch -i Откроется редактор файла changelog, в котором необходимо указать правильную версию (то есть версия такая же, как в предыдущей записе + волшебное ~backport1). Ну и описать изменения вроде "* Backport to Sarge". Если команды dch у вас нет (она из пакета devscripts), то можно отредактировать файл debian/changelog руками (читай редактором), добавив секцию для новой версии. Шаг 2a. Сборка Осталось малое - собрать пакет. В простом случае, когда мы собираем для себя, можно просто поставить в рабочую систему все сборочные зависимости (или руками, посмотрев Build-depends в debian/control, или командой apt-get build-dep) . Достаточно часто бывает ситуация, что в build-depends указаны версии пакетов, старше тех, чтол имеются в текущей системе. Иногда (особенно в случае, когда требуется более старшая версия debhelper), достаточно просто понизить требования в файле debian/control, а иногда придется вначале сбэкпортить (или скачать и поставить уже сбэкпорченный пакет) необходимую для сборки библиотеку. Кстати, для сборки необходимы помимо пакетов, указанных в build-depend еще и все пакеты, которые устанавливаются с пакетом build-essential - make, fakeroot, gcc, g++ и прочие. Так что лучше не забыть поставить этот пакет. Теперь, находясь во все том же каталоге <имя пакета>-<версия upstream>, говорим dpkg-buildpackage -rfakeroot И вуаля, через некоторое время, каталогом выше лежит заветный файлик <имя пакета>-<версия>_i386.deb Если конечно, у вас удовлетворены все зависимости, стоят пакеты dpkg-deb, fakeroot, g++ и не произошло еще каких ошибок. Шаг 2б. Правильная сборка На самом деле, для того, чтобы собрать пакет правильно, его надо собирать в минимальной системе, где стоят только build-essential и зависимости этого пакета. Тогда, во-первых, не будет никаких накладок из-за того, что у вас в системе стоят некоторые пакеты вообще неизвестно откуда и непонятно каких версий (и в итоге в зависимостях у бинарного пакета могут оказаться пакеты версий, отсутствующих в том дистрибутиве, под который вы хотите собрать пакет), а во-вторых, вы избежите накладок (крайне редких, но все же), когда установленный лишний пакет как-то (читай негативно и не всегда очевидно) влияет на сборку. В качестве решения подойдет chroot с чистым окружением... Испугались? Все уже украдено до нас. Ставим пакет pbuilder и используем его возможности. Подробное описание поищите в гугле. Можно пойти еще дальше и использовать cowbuilder из пакета cowdancer - это аналог pbuilder, только образ сборочной системы он хранит не в tar.gz а в развернутом виде, а при сборке копирует этот образ с использованием техники copy-on-write, что ускоряет сборку. Шаг 2б.1. Настройка cowbuilder cowbuilder является надстройкой над pbuilder, поэтому надо вначале поколдовать над /etc/pbuilderrc. BUILDPLACE=/var/cache/pbuilder/build/ USEPROC=yes USEDEVPTS=yes USEDEVFS=no BUILDRESULT=/var/cache/pbuilder/result/ #у меня кэширующий apt-cacher, пожтому я отключил кэширование пакетов внутри pbu ilder #APTCACHE="/var/cache/pbuilder/aptcache/" APTCACHE="" REMOVEPACKAGES="" HOOKDIR="" export DEBIAN_FRONTEND="noninteractive" DEBEMAIL="Alexander GQ Gerasiov < gq@cs.msu.su >" BUILDSOURCEROOTCMD="fakeroot" PBUILDERROOTCMD="sudo" DEBBUILDOPTS="" APTCONFDIR="" BUILDUSERID=1000 BUILDUSERNAME=gq export LOGNAME=gq BINDMOUNTS="" unset DEBOOTSTRAPOPTS export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin" export SHELL=/bin/bash DEBOOTSTRAP="cdebootstrap" PKGNAME_LOGFILE_EXTENTION="_$(dpkg --print-architecture).build" Я тут выкинул вообще те параметры, которые ни на что не влияют, вроде бы этого должно быть достаточно. Шаг 2б.2. Создание чистых образов систем Далее я содал образы для sarge и etch, командой вроде debootstrap sarge /var/cache/pbuilder/base.sarge/ Зашел в созданное окружение командой cowbuilder --login --save-after-login --basepath /var/cache/pbuilder/base.sarge Задал нужные мне репозитории в /etc/apt/sourses.list, удалил ненужные пакеты, поставил build-essential и cowdancer (версию для Sarge можно взять в моем репозитории для Sarge). С Ubuntu дело оказалось несколько сложнее, cdebootstap не умеет собирать образы для нее, а debootstap умеет только собирать образы для breezy, так что мне пришлось для создания образов edgy и dapper ставить при помощи debootstrap образ breezy, заходить в него "cowbuilder -login" и делать внутри "aptitude dist-upgrade" до нужного мне дистрибутива. Но в целом задача решаема. Итак у меня есть несколько образов в /var/cache/pbuilder/: * base.dapper * base.edgy * base.etch * base.experimental * base.sarge Шаг 2б.3 Сборка пакета в чистом окружении Как теперь собрать пакет в нужном окружении. Вначале из нашего каталога <имя пакета>-<версия апстрим> с измененной версией и поправленными build-depends собираем сурцовый пакет новой версии: dpkg-buildpackade -rfakeroot -S Переходим каталогом выше, где собрался файлик <имя пакета>_<версия>.dsc (где версия, это уже наша версия с "~backport") и говорим pbuild --dist sarge <имя пакета>_<версия>.dsc Если произошла ошибка (например из-за проблем с зависимостями), то возвращаемся к шагу 1 и исправляем ошибки. Если все прошло нормально, то собранные пакеты окажутся в каталоге /var/cache/pbuilder/results. Вот собственно и все. Для обновления образов (особенно актуально для testing) я использую команду pbuild --dist etch --update Ну и собственно сам мой скриптик. Автоматизируй это Так как в последнее время все чаще мне приходится делать однообразную задачу бэкпорта пакетов под 4 дистрибутива (оригинальный пакет для Debian Unstable надо сбэкпортить для Lenny, Etch и трёх Ubuntu), написал небольшой скриптик, который не требует от меня вообще никаких ручных действий при бэкпорте: backport.

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, pkh (??), 19:15, 29/05/2008 [ответить]  
  • +/
    А не мог бы показать сборку deb пакета на конкретном примере. Например:
    http://jusst.de/hg/mantis/archive/tip.tar.bz2
     
     
  • 2, GQ (?), 14:38, 30/06/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Всё уже украдено до нас:
    http://www.debian.org/doc/maint-guide/
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру