sonyps4.ru

Учимся собирать deb-пакеты. Примеры сборка deb пакета из исходников Создание deb пакета из исходников

Создаём список пакетов:

$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz
Может быть, нам будет выведено сообщение типа:

Dpkg-scanpackages: warning: Packages in archive but missing from override file: dpkg-scanpackages: warning: fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero dpkg-scanpackages: info: Wrote 8 entries to output Packages file.
Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:

строчкой типа:

Deb file:///home/имя_пользователя/zips/virensdebianrepository ./
Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:

Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор Sublime Text 2 (отличная инструкция там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:
# apt-get install sublimetext

Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: sublimetext 0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded. Need to get 0 B/11.4 MB of archives. After this operation, 17.4 MB of additional disk space will be used. WARNING: The following packages cannot be authenticated! sublimetext Install these packages without verification ? Y Selecting previously deselected package sublimetext. (Reading database ... 247813 files and directories currently installed.) Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ... Setting up sublimetext (2.0.2) ... Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)

Заключение

Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с документацией и руководствами . Ещё можно воспользоваться программой , которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.

Отдельное спасибо тов. brainstream , который указал на баг в посте с отрисовкой окружения PRE. Такое бывает, когда доверяешь хаскельным поделкам вроде pandoc:-)

Да, если есть что добавить - пишите в комментариях, но учтите, что пост - именно на скорую руку, без нужды перечитывать фолианты Debian Packaging Guidelines и прочую квантовую физику.

Анонимный комментирует...

Ошибка у вас в тексте:
"Теперь, для того, чтобы установить Skype достаточно сделать:

# apt-get install sublimetext "

Анонимный комментирует...

Распаковывать пакеты можно через dpkg-deb:
$ dpkg-deb -x что.deb куда/

Анонимный комментирует...

Всегда использовал dpkg -e и dpkg -x для полной распаковки пакета и быстрой правки файлов или зависимостей в контрольных файлах. А так же использовал checkinstall вместо make install для создания пакета при компиляции чего либо. Мне кажется эти утилиты стоит упомянуть.

virens комментирует...

Сборка пакетов из исходников в Debian - это от лукавого! Я сейчас припомню свой опыт:

1. В deb-пакете должны быть прописаны майнтейнер и прочая чепуха, без которой (сюрприз-сюрприз!) пакет не соберется.

2. Вы собрали, установили и думаете, что на этом всё? Не тут-то было, добрый aptitude может снести пакет ко всем чертям при установке чего-то другого. Вам знакомо такое чувство: как? где? что? я же уже ставил этот пакет!!! Ну вот такой он aptitude - весь из себя православный, а значит, патриархальный и вольнодумства не позволяющий.

3. Поэтому срочно необходим маневр: aptitude hold package. "Что, хорошо держится? А теперь будьте любезны - отлепите!" (с) Поскольку с этого момента aptitude будет ругаться, что он не в состоянии разрулить зависимости, не снеся вашего пакета.

4. На этом нервы мои сдали... И я открыл для себя Gentoo, а мои волосы снова стали мягкими и шелковистыми!

virens комментирует...

@iv_vl комментирует...
И я открыл для себя Gentoo, а мои волосы...
Наглый пиар Генты?! В моём бложике??? Нет пути! ;-)

1. В deb-пакете должны быть прописаны майнтейнер и прочая чепуха
Стандартное policy - надо же знать, кому дать в морду за сломанный пакет:-) И потом, это всяко лучше того бедлама, который творится в RPM-ных федорах и зюзях.

2. Вы собрали, установили и думаете, что на этом всё? Не тут-то было, добрый aptitude может снести пакет ко всем чертям при установке чего-то другого.
Только если ты ставишь пакет старой версии - например, у меня стоит hold на IceWM, который я поставил из Lenny (придурок-майнтейнер запихнул в Squeeze айс с отломанным треем). Аптитуда тебя предупредит перед подобными манёврами, если что.

3. Поэтому срочно необходим маневр: aptitude hold package.... aptitude будет ругаться, что он не в состоянии разрулить зависимости
Это ложь и провокация: только если ты не влепил hold на что-нибудь типа gcc или glibc, нормально оно разруливать зависимости будет. В отличие от RPM-ов, которые любят сдаваться сразу в стиле "Ну не шмогла я, не шмогла" :-)

Проблемы с разруливанием зависимостей могут быть, это факт, но это лучше, чем жарить яичницу с беконом на процессоре в ожидании конца конпеляния гентой свежего KDE...

4. На этом нервы мои сдали...
Как-то ты быстро сдулся. Кстати, а как дела с зависимостями в генте? Как вы там живёте-то с конпелянием на каждый чих?
Я это...не троллинга ради.... народ интересуется.

iv_vl

deb-файл представляет собой архив в формате ar , содержащий установочные файлы программы, информацию о программе, а также скрипты (командные файлы), выполняемые до и после установки и удаления программы (наличие скриптов не является обязательным - они могут и не входить в состав пакета).

Формат файла deb описывается в man-справке (man pages) deb(5) - эта справка выводится, если в терминале набрать команду man deb. Также в Интернете есть немало страниц, содержащих эту информацию - достаточно набрать в строке поиска deb(5), чтобы найти их. Здесь это руководство не приводится, так как в официальном руководстве для разработчиков Debian, в справке по формату пакетов (которое на момент написания этого руководства находилось по адресу http://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html) написано, что формат пакетов может изменяться, а потому для работы с ними рекомендуестя использовать утилиту dpkg-deb. Справку по работе с утилитой dpkg-deb можно получить, набрав в терминале команду man dpkg-deb.

Работа программы GUI-deb как раз и заключается в создании директории, содержащей необходимые данные, и запуске программы dpkg-deb с указанием ей этой директории и других нужных параметров.

Правильная директория, нужная для создания установочного пакета программой dpkg-deb, должна, прежде всего, содержать вложенную директорию "DEBIAN". В этой директории должны находиться все данные, не копируемые в систему, а используемые непосредственно программами для работы с пакетами - информация о пакете, выполняемые до и после установки скрпиты и т.п. Никакие файлы, содержащиеся в директории DEBIAN, при установке пакета не попадут в файловую систему компьютера, на который устанавливается пакет.

Вне директории "DEBIAN" содержатся те файлы, которые будут скопированы в файловую систему компьютера, на который будет устанавливаться пакет. Файлы должны располагаться в тех директориях, в которые они будут помещаться при установке пакета. То есть, внутри директории, создаваемой для dpkg-deb, должна создаваться копия нужных нам частей файловой системы - так, как если бы эта директория являлась для неё корнем ("/"). То есть, допустим, если имя директории, на основе которой будет создаваться пакет - "~/TMP_DEBS/MyProgram", и нужно, чтобы при установке в файловой системе в директорию "/usr/share/pixmaps" записывался файл "MyProgram.png" - надо в директории "~/TMP_DEBS/MyProgram" создать директорию "usr", в ней - директорию "share", внутри "share" - директорию "pixmaps", и уже в директорию "pixmaps" поместить файл "MyProgram.png". В итоге, полный путь к файлу будет "~/TMP_DEBS/MyProgram/usr/share/pixmaps/MyProgram.png". При создании пакета часть директории "~/TMP_DEBS/MyProgram" будет обрезана, и при установке файл "MyProgram.png" как раз и попадёт по нужному адресу "/usr/share/pixmaps". Таким образом, нужные директории надо создать для каждого файла.

После создания директории остаётся только запустить dpkg-deb, передав нужные параметры. Самые необходимые для сборки пакетов параметры dpkg-deb описываются в разделе "Параметры командной строки для утилиты dpkg-deb" . В случае отсутствия ошибок в файле control, установочный пакет будет создан.

Я описывал сборку программы из исходного кода, а также создание простенького deb-пакета. В этот раз я хочу подробнее остановиться на их создании. Это руководство не претендует на звание инструкции для разработчики или сопровождающего, потому в конце я дам ссылки на подробные руководства от разработчиков Debian .

Способов создания deb-пакета довольно много. Я не буду здесь описывать крупные системы сборки, которые используются на сборочных серверах, ибо большинству это не нужно. Я опишу два наиболее простых способа создания своего пакета. Первым делом, нам нужно установить кое-какие инструменты для работы:

sudo apt-get install build-essential git automake devscripts make libtool fakeroot automake autotools-dev

Далее нужно создать цифровой ключ. Этот шаг не обязателен, но если вы планируете распространять свои пакеты, будет крайне мудрым решением подписать их своим ключом. Это позволит пользователю, скачавшему ваш пакет, удостовериться что именно вы его создали. Для создания ключа можно воспользовать графическими утилитами (Seahorse , Kgpg ) либо в терминале:

DEBEMAIL="ваш E-Mail который вы указали при создании ключа"
DEBFULLNAME="Ваше имя (или псевдоним)"
export DEBEMAIL DEBFULLNAME

Это позволит автоматически добавлять вашу цифровую подпись при подписании пакетов. Далее нам необходим архив с исходным кодом. Пример я буду проводить простой, так как в зависимости от сложности программы, необходима дополнительная настройка (создание постинсталяционных скриптов, правил сборки и т.д.). Предположим у нас есть архив с исходным кодом программы "Myprogramm" - myprogramm_1.0.tar.gz . Распакуем его в домашнюю директорию (или любую где вам удобнее). Обратите внимание: каталог после распаковки должен иметь имя myprogramm-1.0 . Название и через дефис - номер версии. Теперь откроем терминал и выполним:

cd ~/myprogramm-1.0
dh_make --createorig

Мы перешли в каталог с исходным кодом и создали архив с ним и базовую дебианизацию. После второй команды выведится сообщение, где нужно выбрать тип пакета: s (single, одиночный), m (multiple, несколько пакетов), l (library, библиотека), k (kernel module, модуль ядра). В нашем случае это s. Теперь нам нужно немного всё настроить. Перейдите в каталог /myprogramm-1.0/debian и откройте файл control в любом текстовом редакторе. Это главный файл для сборки пакета. В нём указывается вся основная информация. Он имеет примерно такой вид:

Source: myprogramm
Section: admin
Priority: optional
Maintainer: Aleksey Samoilov
Build-Depends: debhelper (>= 5)
Standards-Version: 3.9.6
Homepage: http://www.example.com

Package: myprogramm
Architecture: all
Depends: ${shlib:Depends}, ${misc:Depends}
Section: admin
Priority: optional
Description: My new programm
My programm is a simple example to build your own deb-package

Пошли по порядку. В первой секции указывается имя пакета с исходным кодом. Далее секция ПО (в данном случае admin). Затем приоритет (опционально), имя сопровождающего и его E-Mail (то есть ваше), сборочные зависимости (пакеты необходимые для сборки), версия стандарта (на данный момент 3.9.7), далее идёт имя пакета после сборки, архитектура для которой он собирается (all означает все поддерживаемые архитектуры), секция ПО, приоритет, краткое описание и полное описание. Так как пример у нас простой, для начала этого хватит. Вы также можете открыть файл copyright и указать там своё имя и E-Mail. В файле Changelog находится список изменений каждой версии данного ПО. Так как это первая сборка, то нужно указать что это First Release, а также закрыть некий баг (отсутствие данного пакета в репозитории). Номер бага можно написать от балды. Если вы пересобираете пакет, то сперва измените его версию командой dch -i Файлы в каталоге debian с расширениями .ex - это примеры. При сборке более сложных пакетов, будут нужны и эти дополнительные файлы. Это к примеру послеустановочные скрипты (postinst ), файл, проверяющий наличие новой версии тарболла с исходным кодом (watch ) и так далее. Файл rules - это мейкфайл, правила для сборки пакета. Для простых программ его можно не менять, в остальных случаях - необходима его правка, для указания параметров сборки, или установки иконок. Много чего.

Теперь, когда вы заполнили файл control, можно приступать к сборке. Для этого находясь в каталоге с исходным кодом, выполните команду debuild . Система проведёт конфигурацию, скомпилирует программу, запакует в пакет, выполнит проверку на распространённые ошибки при дэбианизации и попросит дважды ввести пароль для вашего ключа (если вы его не создавали, то ничего не будет). Теперь в каталоге уровнем выше (в нашем случае в домашней директории), вы увидите несколько файлов, среди которых искомый deb-пакет. Теперь его можно установить командой sudo dpkg -i myprogramm-1.0-1.deb или в графическом менеджере Gdebi.

Вот таким образом можно собрать простой пакет. Но что делать, если вы не хотите засорять систему кучей сборочных зависимостей? Более того, при сборке некоторых пакетов, могут быть использованы некоторые изменённые файлы. К примеру более новые версии библиотек, если вы обновили систему из бэкпортов, или различные изменения в конфигах. На подобные случаи можно воспользоваться виртуальной машиной, контейнером или использовать специальный инструмент под названием pbulder. Pbuilder - это инструмент для создания чистого окружения, в котором находится только то, что необходимо для сборки. Система при этом не засоряется ненужными файлами, а сборка программы происходит в лабораторных условиях. Устанавливаем:

sudo apt install pbuilder

Я приведу пример своего конфига, с помощью которого можно будет собирать пакеты не только под разные релизы Debian, но и Ubuntu.

sudo nano /etc/pbuilderrc

Вставляем следующее содержимое:

STABLE_CODENAME="stable"
OLDSTABLE_CODENAME="oldstable"
DEBIAN_SUITES=($UNSTABLE_CODENAME, $TESTING_CODENAME, $STABLE_CODENAME $STABLE_BACKPORTS_SUITE $OLDSTABLE_CODENAME
"sid" "stretch" "jessie" "wheezy")
UBUNTU_SUITES=("precise" "trusty" "xenial")
UBUNTU_MIRROR="mirror.yandex.ru"
DEBIAN_MIRROR="mirror.yandex.ru"
: ${DIST:="$(lsb_release --short --codename)"}
: ${ARCH:="$(dpkg --print-architecture)"}

NAME="$DIST"
if [ -n "${ARCH}" ]; then
NAME="$NAME-$ARCH"
# следующая строчка нужна для того чтобы собирать под разные архитектуры
DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}")
fi

BASETGZ="/home/sunderland93/pbuilder/$NAME-base.tgz"
DISTRIBUTION="$DIST"
BUILDRESULT="/home/sunderland93/pbuilder/$DIST/result/"
APTCACHE="/home/sunderland93/pbuilder/$NAME/aptcache/"
BUILDPLACE="/home/sunderland93/pbuilder/build/"
if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then
MIRRORSITE="http://$DEBIAN_MIRROR/debian/"
COMPONENTS="main contrib non-free"
elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then
MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/"
COMPONENTS="main restricted universe multiverse"
else
echo "Неизвестный дистрибутив: @DIST"
exit 1
fi

export DPKG_GENSYMBOLS_CHECK_LEVEL=4
USE_PDEBUILD_INTERNAL=yes

Замените sunderland93 на своё имя в системе. Таким образом, мы сможем собирать пакеты для Debian 7, 8, testing и unstable, а также под Ubuntu 12.04, 14.04 и 16.04. Скачанные для сборки зависимости будут лежать в pbuilder/имя дистрибутива/aptcache . Это кстати очень полезно - у нас будет базовый архив, который не будет засорён левыми зависимостями и весить несколько гигабайт. И окружение будет готовиться индивидуально для каждой программы. Можно и вшить эти зависимости в базовый архив, но я не рекомендую это делать. Теперь давайте создадим базовый архив, содержащий чистое окружение для сборки. Для примера возьмём Debian 8 64-bit:

sudo DIST=jessie ARCH=amd64 pbuilder --create

Начнётся процесс создания архива. После того, как он будет готов, можно приступать к сборке программы. Для этого открываем терминал, переходим в каталог с исходным кодом, и выполняем:

sudo DIST=jessie ARCH=amd64 pdebuild

И ждём. Скачанные пакеты будут закешированны, и в следующий раз уже не буду качаться. После сборки, готовый deb-пакет появится в каталоге pbuilder/jessie/result . Вот и всё.

Зачастую некоторый пакет имеется в ветках unstable и experimental , однако его нет в ветках stable /testing . Программу поставить очень хочется, а обновлять полсистемы страшновато или нежелательно.

Для таких случаев есть замечательный ресурс backports.org , однако его использование во многом похоже на прямое использование веток unstable и иногда доставляет бОльшие проблемы из-за периодически возникающих конфликтов между backports и unstable.

В большинстве случаев установить пакет из unstable и experimental можно, используя пересборку пакета в своем окружении. Делается это довольно несложно, и данное руководство предназначено для того, чтобы помочь начинающему пользователю в этом вопросе. Для примера мы разберем вариант с установкой пакета fluxbox из experimental -ветки.

Установим инструменты для сборки:

#aptitude install devscripts

Gpg-ключ и выполним экспорт некоторых переменных окружения, связанных с ним:

export [email protected] export DEBFULLNAME="yourfullname" export [email protected]

Настройка apt-get

Прежде всего, нам необходимо настроить apt-get на работу с src-репозитариями Debian. Для этого добавьте в Ваш файл /etc/apt/sources.list следующие строки:

deb-src http://ftp.debian.org/debian testing main contrib non-free deb-src http://ftp.debian.org/debian sid main contrib non-free deb-src http://ftp.debian.org/debian experimental main contrib non-free

Зеркало пакетов, разумеется, можете выбрать любое - то, которым наиболее часто пользуетесь. После изменения файла /etc/apt/sources.list сделайте традиционный

#apt-get update

Немного теории

Что представляет собой src-пакет в системе Debian?

Src-пакет для debian - это исходные тексты программы, которые любезно предоставлены автором под той или иной лицензией, дополненные несколькими скриптами (которые предоставлены сопровождающим пакета), обеспечивающими сборку пакета.

Все скрипты, файлы и т.п., относящиеся к сборке пакета в системе Debian, традиционно располагаются в подкаталоге debian/ вместе с исходными текстами.

Src-пакет Debian обычно состоит из нескольких файлов:

    package-version.dsc - текстовый файл, включающий в себя перечень остальных необходимых файлов;

    package-version.orig.tar.gz - архив с исходными текстами программы;

    package-version.diff.gz - патч на архив с исходными текстами программы, добавляющий в них вышеупомянутый каталог debian/, а так же, возможно, содержащий исправления внесенные в исходные тексты сопровождающим.

Примечание : Некоторые включают каталог debian/ прямо в архив с исходными кодами. Это в основном касается программ разработанных специально для Debian. В таком случае вместо файлов .orig.tar.gz и .diff.gz будет один файл package-version.tar.gz .

Получение и распаковка пакета с исходными текстами

$ apt-get source package

для нашего случая с fluxbox это будет выглядеть так:

$ apt-get source fluxbox Чтение списков пакетов... Готово Построение дерева зависимостей... Готово Нужно загрузить 1033kB архивов с исходными текстами. Получено:1 http://ftp.debian.org experimental/main fluxbox 0.9.15.1+1.0rc2-1 (dsc) Получено:2 http://ftp.debian.org experimental/main fluxbox 0.9.15.1+1.0rc2-1 (tar) Получено:3 http://ftp.debian.org experimental/main fluxbox 0.9.15.1+1.0rc2-1 (diff) Получено 1033kB за 1m38s (10,5kB/c) gpg: Signature made Втр 04 Июл 2006 17:05:39 MSD using DSA key ID E160649A gpg: Can"t check signature: public key not found dpkg-source: extracting fluxbox in fluxbox-0.9.15.1+1.0rc2 dpkg-source: unpacking fluxbox_0.9.15.1+1.0rc2.orig.tar.gz dpkg-source: applying ./fluxbox_0.9.15.1+1.0rc2-1.diff.gz

Чтобы узнать список версий в доступных репозиториях, можно использовать команду

$ apt-cache policy <имя пакета>

В результате этого действия, как видно из приведенного выше лога, были скачаны нужные файлы с зеркала (которое мы прописали в /etc/apt/sources.list ) и произведена распаковка исходников и наложение патча в .diff.gz .

Данную операцию необязательно было проделывать с помощью apt-get , можно было пойти на страничку пакета , скачать файлы по ссылке Downloads (внизу страницы) и распаковать командой

$ dpkg-source -x fluxbox_0.9.15.1+1.0rc2-1.dsc

Также можно использовать утилиту dget, которая скачает весь пакет и сразу распакует исходники:

dget www.path.to/fluxbox_0.9.15.1+1.0rc2-1.dsc

Немного об устройстве каталога debian/

Все действия по сборке пакетов выполняются из каталога с исходными текстами, который получился при распаковке src-архива. В этом каталоге расположен и каталог debian/.

В данном каталоге нас прежде всего будут интересовать два файла:

    debian/rules - этот скрипт осуществляет собственно сборку пакета (и представляет собой обычный Makefile);

    debian/control - этот текстовый файл снабдит нас некоторой информацией, которая нам понадобится ниже;

Прежде всего в последнем файле нас интересует одна строка, для нашего пакета fluxbox она выглядит так:

    Build-Depends: libx11-dev, libxext-dev, libxft-dev, libxinerama-dev, libxpm-dev, libxrandr-dev, x-dev, libxt-dev, debhelper (>=4.1.0), libxft-dev, libx11-dev, libxext-dev, libxft-dev, libxinerama-dev, libxpm-dev, libxrandr-dev, x-dev, libimlib2-dev, libgtk2.0-dev, cdbs

как видим это просто список пакетов которые необходимы нам при сборке.

Зависимости для сборки

Это может оказаться как самый простой вопрос, так и самый сложный. Ситуация состоит в следующем. Сопровождающий пакета, как правило, является человеком, хорошо разбирающимся во внутреннем устройстве Debian, поэтому сопровождающие зачастую раньше других переходят на использование testing/unstable веток. Кроме того, аплоад пакетов в Debian происходит прежде всего в unstable, а потому сопровождающий часто оттестировал сборку своего пакета только под testing/unstable. Довольно редко авторы программ указывают версионные зависимости для своих детищ, поэтому не всегда удаётся проставить правильные версии, и они могут быть как завышены, так и занижены. Выяснять, с какой версией той или иной библиотеки перестанет собираться программа занимает много времени и сил, а зачастую и не очень нужно.

Установка зависимостей для сборки

Простой случай: все получилось с первого раза

Если у Вас apt-get настроен так, как было указано выше, то в большинстве случаев установка зависимостей может быть сделана одной командой:

# apt-get build-dep fluxbox

Для рассматриваемого нами пакета fluxbox все необходимое будет установлено без проблем, и можно переходить к разделу (ниже) Сборка пакета .

Требуемые зависимости отсутствуют в моем дистрибутиве

Здесь возможны два варианта.

    Вариант, дающий 100%-й результат, но, возможно, требующий проделать больше работы: просматриваем строку Build-Depends , о которой речь шла выше, и смотрим, какие библиотеки или утилиты отсутствуют в нашем дистрибутиве. Как правило, их перечень не такой большой чтобы испугать настойчивого человека (одна-две). Собираем эти библиотеки или утилиты по этому хауту (рекурсивно;)).

    В случае если в строке Build-Depends указана какая-то отсутствующая в нашем дистрибутиве версия пакета, то можно попробовать понизить требования сопровождающего, отредактировав файл debian/control . Попробуйте уменьшить номер версии требуемой библиотеки или утилиты, указанный сопровождающим, на тот что у Вас имеется. Перед тем как двигаться по этой пути, проглядите каталог с исходными текстами на наличие файлов INSTALL или README. В этих файлах авторы программы иногда описывают зависимости своего детища и если уж автор программы указал версионную зависимость, то скорее всего попытка ее понизить ни к чему не приведет.

Для того чтобы узнать, что еще не установлено для сборки пакета, запустите утилиту dpkg-checkbuilddeps в каталоге с исходными текстами. Эта утилита выведет список того что требуется для сборки, но еще не установлено в Вашей системе. Для перехода к следующему шагу Вам необходимо добиться того чтобы утилита dpkg-checkbuilddeps не выдавала сообщений о неудовлетворенных зависимостях. Можете попробовать собрать неудовлетворенную зависимость или понизить требования к номеру версии или покомбинировать эти два варианта.

Сборка пакета

Простая сборка

Итак, все что необходимо нам для сборки, установлено. Осталось, собственно, собрать пакет. Для этого нам понадобится утилитка fakeroot , установите ее, если она у Вас еще не установлена.

Переходим в каталог с распакованным src-пакетом и даем команду:

  • $ dch -i

Отдельно надо рассмотреть вопрос о том, какую версию указывать в changelog.

  • Это не должна быть версия, встречающаяся в официальном репозитории (чтобы не создавать путаницы)
  • Если вы делаете просто бэкпорт, то версия должна быть младше той версии, на основе которой собран пакет (чтобы не возникло проблем, когда этот пакет попадет в testing, затем в stable и вы попробуете сделать dist-upgrade). Добавьте строку ~backports1 к номеру версии в таком случае. Позже, если в репозитариях окажется пакет с таким же номером версии, то ваша система произведет его обновление. Цифра 1 в данном случае может означать номер Вашей сборки, а слово backports может быть заменено на любое другое, которое будет более информативным.

Исходя из этого, правильным будет добавить к версии -какаятострока1 , если вы что-то существенно дорабатывали, или ~какаятострока1 , если делали бэкпорт.

$ fakeroot ./debian/rules binary или $ dpkg-buildpackage -rfakeroot или #debuild

В результате будет в родительском каталоге собран двоичный пакет, ради которого затевалась вся катавасия.

Проблемы на этом шаге могли возникнуть только в двух случаях:

  • Вы что-то не (так) сделали на предыдущих шагах (например, понизили зависимость, а реально этого делать было нельзя);
  • Вы наткнулись на ошибку в src-пакете. Такое тоже иногда случается. Бывает, что пакеты не собираются, например, из за "неверно" установленного umask . Вообще, сборка пакетов от umask зависеть не должна, но этот баг почему-то довольно часто встречается в Debian.

Вернитесь на несколько шагов назад и повторите попытку.

Если есть только архив с исходниками

Итак, у нас есть только fluxbox-0.9.15.tar.bz2. Обычно выполняюncz следующие действия: Предварительно подготавливаю рабочую директорию:

mkdir ~/src/fluxbox mkdir ~/src/fluxbox/0.9.15 cd ~/src/fluxbox/0.9.15 wget "http://<путь до файла>" (можно конечно и просто через браузер скачать но обычно так быстрее)

Получаем файл fluxbox-0.9.15.tar.bz2. Немного забегая вперёд, обработаем файл программой gzip.

bunzip2 fluxbox-0.9.15.tar.bz2 gzip fluxbox-0.9.15.tar

Получим fluxbox-0.9.15.tar.gz, переименуем:

mv fluxbox-0.9.15.tar.gz fluxbox_0.9.15.orig.tar.gz

(т.е. разделили имя и версию подчёркиванием и после версии добавили слово orig: fluxbox_0.9.15.orig.tar.gz) Теперь распаковываем его (но ни в коем случае не удаляем!):

tar zxvf ./fluxbox_0.9.15.orig.tar.gz cd fluxbox-0.9.15

Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию! Ниже будем считать директорию ~/src/fluxbox/0.9.15/fluxbox-0.9.15 корневой директорией исходников. Далее выполняем «черновую» сборку. Т.е. делаем, как обычно

./configure --prefix=/usr && make

(но не устанавливаем!) Если конфигурируется со всеми нужными опциями и собирается в бинарный файл, значит осталось только дебианизировать.

Если есть только deb-пакет

Распаковываем пакет в папку /tmp/program/

$ dpkg -x program*.deb /tmp/program

Чтобы распаковать информацию о пакете, нужно выполнить:

mkdir /tmp/program/DEBIAN $ dpkg -e program*.deb /tmp/program/DEBIAN

Теперь можно делать изменения. Чтобы снова собрать пакет, делаем следующее:

$ dpkg - b /tmp/program program-new*.deb

Дебианизация

Cмысл всей этой процедуры - создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами). Для этого, в корне исходных текстов (~/src/fluxbox/0.9.15/fluxbox-0.9.15), выполним:

dh_make Type of package: single binary, multiple binary, library, kernel module or cdbs? s Maintainer name: Frank Email-Address: [email protected] Date: Wen, 20 Mai 2011 12:40:33 +0200 Package Name: fluxbox Version: 0.9.15 License: GPLv3 Type of Package: Single Hit to confirm:

Здесь мы указываем сформировать пакет для одиночного бинарного файла. Если бы мы не переименовали архив, то получили бы следующее сообщение:

Could not find fluxbox_0.9.15.orig.tar.gz Either specify an alternate file to use with -f, or add --createorig to create one.

В таком случае советую прервать dh_make (Ctrl+C) и переименовать архив, как описано выше. Но мы с вами молодцы и всё у нас прошло без ошибок - появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение.ex) с примерами на все случаи жизни. Будем считать, что программа у нас простая, обычно ни один из этих файлов не нужен. Первым делом нужно добавить описание программы в файле debian/control :

Description:

Вместо и (без угловых кавычек) нужно вписать описание,что это за программа. Именно эти сведения увидит пользователь, когда посмотрит описание пакета в synaptic"е. Второй момент - это поправить файл debian/rules в секции binary-arch: нужно раскомментировать(т.е. убрать # в начале строки)

  • dh_install

без этого мы получим пустой пакет. Обычно этих настроек достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share. Теперь, соберём пакет:

dpkg-buildpackage -rfakeroot

в директории выше, т.е. в ~/src/fluxbox/0.9.15, мы получим файлы:

cd .. ls -1 fluxbox_0.9.15-1.diff.gz fluxbox_0.9.15-1_i386.changes fluxbox_0.9.15-1_i386.deb fluxbox_0.9.15.orig.tar.gz

Установка пакета

После того, как пакет собран, его осталось установить командой:

dpkg -i имя_пакета.deb

Или включить его в состав собственного репозитария. Это уже базовые вещи в системе Debian, поэтому их описание наведено в других статьях вики.

Сборка с созданием чистых образов систем

На самом деле, для того, чтобы собрать пакет правильно, его надо собирать в минимальной системе, где стоят только build-essential и зависимости этого пакета. Тогда, во-первых, не будет никаких накладок из-за того, что у вас в системе стоят некоторые пакеты вообще неизвестно откуда и непонятно каких версий (и в итоге в зависимостях у бинарного пакета могут оказаться пакеты версий, отсутствующих в том дистрибутиве, под который вы хотите собрать пакет), а во-вторых, вы избежите накладок (крайне редких, но все же), когда установленный лишний пакет как-то (читай негативно и не всегда очевидно) влияет на сборку.

В качестве решения подойдет chroot с чистым окружением… Испугались? Все уже украдено до нас.

Сборка пакета в системе pbuilder

Довольно неплохо упрощает данный процесс интерактивная программа pbuilder . Установите пакет pbuilder , затем откройте на редактирование /etc/pbuilderrc и пропишите адрес Вашего любимого репозитория.

Выполните команды:

# pbuilder update # pbuilder create --distribution """sarge"""

система готова к употреблению.

Вместо имени sarge подставьте название Вашего дистрибутива.

теперь чтобы собрать пакет для выбранного дистрибутива дайте команду:

# pbuilder build package-version.dsc

Будут автоматически проделаны все описанные выше шаги, при этом все пакеты требуемые для сборки скачиваются и устанавливаются во временный каталог, поэтому система не "замусоривается" лишними пакетами. Правда, проблему с зависимостями для сборки всё равно придется решать, однако последовательно пройти по всем зависимостям с данным инструментом не представляет особого труда. Почитайте документацию на этот замечательный пакет и узнайте об остальных его возможностях.

Сборка пакета в системе cowbuilder

сowbuilder является из пакета cowdancer – это аналог pbuilder, только образ сборочной системы он хранит не в tar.gz а в развернутом виде, а при сборке копирует этот образ с использованием техники copy-on-write, что ускоряет сборку.

Пример конфига /etc/pbuilderrc:

BUILDPLACE=/var/cache/pbuilder/build/ USEPROC=yes USEDEVPTS=yes USEDEVFS=no BUILDRESULT=/var/cache/pbuilder/result/ #у меня кэширующий apt-cacher, пожтому я отключил кэширование пакетов внутри pbuilder #APTCACHE="/var/cache/pbuilder/aptcache/" APTCACHE="" REMOVEPACKAGES="" HOOKDIR="" export DEBIAN_FRONTEND="noninteractive" DEBEMAIL="Alexander GQ Gerasiov < [email protected] >" 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"

Создать образ системы можно и без использования конфига:

# cowbuilder --create --distribution sid --architecture i386

Теперь логинимся в чистую систему:

# cowbuilder --login --save # aptitude install devscripts

Виход из окружения стандартен, собраные пакеты искать в /var/cache/pbuilder.

exit или Сtrl+D

Сборка пакета в чистом окружении

Как теперь собрать пакет в нужном окружении. Вначале из нашего каталога <имя пакета>-<версия апстрим> с измененной версией и поправленными build-depends собираем сурцовый пакет новой версии:

dpkg-buildpackade -rfakeroot -S

Переходим каталогом выше, где собрался файлик <имя пакета>_<версия>.dsc (где версия, это уже наша версия с “~backport”) и говорим

pbuild --dist sarge <имя пакета>_<версия>.dsc

Если произошла ошибка (например из-за проблем с зависимостями), то возвращаемся к шагу 1 и исправляем ошибки. Если все прошло нормально, то собранные пакеты окажутся в каталоге /var/cache/pbuilder/results. Вот собственно и все.

Для обновления образов (особенно актуально для testing) я использую команду

pbuild --dist etch --update

Пример скрипта автоматизации: || ||

Пример скрипта автоматизации для нескольких релизов: || ||

Удаление зависимостей для сборки

Для этого можно использовать deborphan :

$ deborphan или $ deborphan -guess-dev или сразу удалить: # deborphan -guess-dev | xargs apt-get remove -purge -y

или же скриптом(проверено PavloRudyj):

# aptitude markauto $(apt-cache showsrc PACKAGE_NAME | grep Build-Depends | perl -p -e "s/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g")

Go прекрасный язык. Одна из его супер-сил - это возможность собирать все в один бинарник. А это очень удобно, вы можете везде таскать этот файл и использовать на любой машине. Но хочется иметь возможность устанавливать нашу программу простым способом.

С помощью deb пакетов довольно просто можно организовать деплой на ваши сервера. При этом у вас будет версионирование и все такое. Я чаще всего использую ubuntu, поэтому речь будет именно о deb пакетах, которые можно установить/удалить с помощью утилит apt .

Что же нужно сделать, для создания своего репозитория с пакетами? Можно воспользоваться тем же launchpad.net , например. Но, последнее время, он не очень развивается и выглядит ненадежно. К тому же, его удобно использовать для своих не коммерческих разработок, но использовать его для дистрибуции корпоративного ПО будет проблематично.

Подойдем к проблеме с другой стороны. Во первых, нам нужно собирать deb пакеты, а это очень просто сделать самим с помощью утилиты dpkg-deb . Во-вторых, нам нужно где-то эти пакеты размещать, и для этого мы воспользуемся супер простым

Сборка пакетов

Для всех своих проектов я использую . Структура проекта выглядит примерно так:

Project/ |- bin/ | |- project |- src/ | |- github.com/ | |- 4gophers/ | |- project/ | |- main.go |- vendor/

Когда я запускаю gb build , то все бинарники собираются в папке bin . Таким образом, все что нам нужно - это просто добавить спецификацию нашего будущего deb пакета прям в папку с проектом:

Mkdir project/DEBIAN touch project/DEBIAN/control

В результате будет такая структура:

Project/ |- DEBIAN/ | |- control |- bin/ | |- project |- src/ |- vendor/

В файле control нужно указать информацию о нашем пакете. Не забывайте про пустую последнюю строку:

Package: project Priority: optional Section: devel Installed-Size: 100 Maintainer: Ivan Ivanov Architecture: i386 Version: 1.0 Depends: libc6 (>= 2.1) Description: Short description here Long description here

  • Package - имя вашего пакета
  • Priority - приоритет пакета (optional, extra, standard, important, required) для обычных программ лучше ставить optional
  • Section - раздел к которому относится данный пакет (admin, base, comm, contrib, devel, doc, editors, electronics, embedded, games, gnome, graphics, hamradio, interpreters, kde, libs, libdevel, mail, math, misc, net, news, non-free, oldlibs, otherosfs, perl, python, science, shells, sound, tex, text, utils, web, x11)
  • Installed-Size - размер файлов пакета в килобайтах
  • Maintainer - имя и email создателя пакета
  • Architecture - архитектура процессора, для которой предназначен пакет (i386, amd64, all, source, all)
  • Version - версия пакета
  • Depends - в данном поле необходимо указать имена пакетов, от которых зависит ваш пакет (например, библиотеки)
  • Description - в первой строке пишем короткое описание пакета, в остальных более подробно

Все что находится в папке project попадет в пакет. И папка bin тоже. В этой папке лежит наш бинарный файл, который нужно установить. Чтобы ваши файлы оказались в нужной директории на компьютере пользователя, нужно создать соответствующую структуру каталогов внутри вашей папки с проектом.

Стоит отметить, что такой подход к созданию deb пакетов не самый правильный. Конечно, в нашем случае мы осознанно идем на этот шаг, но вам нужно понимать, что в deb пакет попадет все содержимое папки project , в том числе папки src , vendor и так далее. Конечно, можно скопировать файлы в другую папку, и даже написать скрипт для этого, но все уже придумано до нас. Более правильный способ - это использовать утилиты dh_make и dpkg-buildpackage .

Теперь можно собирать пакет. Для этого на уровень выше выполним команду:

Dpkg-deb -z8 -Zgzip --build project

На уровень выше будет создан файл project.deb , который можно устанавливать с помощью команды:

Sudo dpkg -i project.deb

Свой репозиторий пакетов

Теперь переходим к самому интересному. Как же нам распространять наши пакеты? Запустим свой сервер репозиториев, конечно же. А для этого воспользуемся сервером apt репозиториев deb-simple .

Это действительно простой сервер, который устанавливается всего одной командой:

Go get github.com/esell/deb-simple

Если go не установлен на той машине, где вы собираетесь запустить сервер с репозиториями, то вы можете собрать бинарник локально и просто скопировать его. Кроме этого, можно использовать docker.

Затем нужно запустить сервер. Это можно сделать с помощью docker, но мне больше нравится использовать supervisord . Вот пример моей конфигурации сервиса:

Command=/home/user/go1.5/bin/deb-simple directory=/home/user/deb-simple/ autorestart=true stdout_logfile=none

Тут важно указать путь к бинарнику(command) и рабочую папку(directory), в которой мы разместим наш конфиг.

Сервер deb-simple поддерживает https, но пока нам это не нужно. Для репозиториев нужно создать папку repo . Наш конфиг conf.json будет выглядит так:

{ "listenPort" : "9090", "rootRepoPath" : "/home/user/deb-simple/repo", "supportedArch" : ["all","i386","amd64"], "enableSSL" : false, "SSLcert" : "server.crt", "SSLkey" : "server.key" }

Чтобы загрузить пакет в свой репозиторий, нужно воспользоваться HTTP API самого сервиса:

Curl -XPOST "http://localhost:9090/upload?arch=amd64" -F "[email protected]"

Точно так же для удаления:

Curl -XDELETE "http://localhost:9090/delete" -d "{"filename":"project.deb","arch":"amd64"}"

Нам осталось добавить наш сервер репозиториев к списку в /etc/apt/source.list.d/ . Можно создать отдельный файл с содержимым:

Deb http://my-hostname:9090/ stable main

Теперь запускайте sudo apt-get update и устанавливайте свои программы сколько душе угодно.



Загрузка...