Как собрать пакет Debian / Ubuntu из исходников?

117

У меня есть исходный код программы (взят из cvs / svn / git / ...), и я хотел бы создать для него пакет Debian / Ubuntu. Пакет присутствует в репозиториях, но:

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

Как это сделать проще всего? Меня беспокоит пара вещей

  • Как я могу проверить, правильно ли я указал все зависимости? (Я могу получить некоторые подсказки, посмотрев, от чего зависела более старая версия, но могли быть добавлены новые зависимости.)
  • Как я могу запретить системе обновлений устанавливать старую версию в репо при обновлении?
  • Как я могу предотвратить установку системой более новой версии (когда она отсутствует), перезаписывающей мой пользовательский пакет?
Рышард Шопа
источник
Похоже на AU: askubuntu.com/questions/28372/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

78

вы можете использовать специальный пакет «checkinstall» для всех пакетов, которых еще нет даже в debian / ubuntu.

Вы можете использовать "uupdate" ( apt-get install devscripts) для сборки пакета из исходного кода с существующими исходными кодами debian:

Пример для libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc
Павел Госьцицкий
источник
Спасибо! Я только что использовал это для переноса Subversion 1.6.6 на установку Ubuntu, в которой в качестве последней доступной версии используется только 1.6.5, и она работала безупречно. Сэкономил мне несколько часов возиться! :)
Карлос Виллела
Не могли бы вы подробнее рассказать об этих командах? Где libdrm-2.3.1именно? Также откуда libdrm-2.4.1.tar.gzвзялось (мое первоначальное предположение состоит в том, что это скомпилированный двоичный файл приложения, которое мы хотим упаковать в deb, но заменяющий существующую версию, это правильно?)
Уиллер
Если вы получили сообщение об ошибке You must put some 'source' URIs in your sources.list, раскомментируйте строки deb-src в вашем/etc/apt/sources.list
Christian
27

Во-первых, вопрос заголовка: если каталог debian уже существует, перейдите в исходный каталог (каталог, содержащий каталог debian) и вызовите dpkg-buildpackage. Мне нравится запускать его со следующими параметрами:

dpkg-buildpackage -us -uc -nc

что означает не подписывать результат и не чистить.

Как я могу проверить, правильно ли я указал все зависимости?

Получение зависимостей - черное искусство. «Официальный» способ проверки зависимости сборки - это сборка пакета с использованием только базовой системы, «необходимых для сборки» пакетов и указанных вами зависимостей сборки. Не знаю общего ответа для обычных зависимостей, просто войдите :)

Как я могу запретить системе обновлений устанавливать старую версию в репо при обновлении? Как я могу предотвратить установку системой более новой версии (когда она отсутствует), перезаписывающей мой пользовательский пакет?

Мои знания об этом могут быть устаревшими, но для решения обоих вопросов: используйте dpkg --set-selections. Предполагая, что nullidentd был тем пакетом, который вы хотели оставить, запустите от имени root

echo 'nullidentd hold' | dpkg --set-selections

В качестве альтернативы, поскольку вы строите из исходного кода, вы можете использовать эпоху, чтобы установить номер версии искусственно высоким и никогда больше не беспокоиться. Чтобы использовать эпоху, добавьте новую запись в файл debian / changelog и поставьте 99: перед номером версии. Учитывая мой пример с nullidentd, первая строка вашего обновленного журнала изменений будет гласить:

nullidentd (99:1.0-4) unstable; urgency=low

Ссылка Бернарда хороша, особенно если вам нужно создать каталог debian самостоятельно - также полезны ссылка для разработчиков и общая страница ресурсов . Ссылка Адама тоже выглядит неплохо, но я с ней не знаком.

Даниэль Бунгерт
источник
1
«dpkg --set-selections» по-прежнему работает, но в наши дни лучшим методом будет «aptitude hold nullidentd».
Марк Бейкер,
6

Для того, что вы хотите сделать, вы, вероятно, захотите использовать исходный код debian diff, поэтому ваш пакет похож на официальный, за исключением используемой исходной версии. Вы можете загрузить исходный код с сайта packages.debian.org или получить его вместе с .dsc и исходным архивом с помощью «apt-get source».

Затем вы распаковываете новую версию исходного кода, переходите в этот каталог и применяете загруженный файл diff, выполнив

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

Затем внесите необходимые изменения в параметры компиляции и соберите пакет, выполнив

dpkg-buildpackage -rfakeroot -us -uc
Марк Бейкер
источник
3
  • поместите каталог "debian" из исходного пакета в исходный каталог
  • используйте " dch " для обновления версии пакета
  • используйте "debuild" для сборки пакета
zowers
источник
2

Я считаю, что это «библия» пакета Debian.

Что ж, это руководство нового сопровождающего Debian, поэтому многое из него неприменимо, но оно охватывает то, что и где.

Бернард
источник
1

Вот руководство по созданию пакета Debian.

В основном вам необходимо:

  1. Настройте структуру папок
  2. Создать контрольный файл
  3. При желании можно создавать сценарии postinst или prerm
  4. Запустите dpkg-deb

Обычно я делаю все это в моем Makefile, поэтому могу просто набрать make, чтобы выплюнуть двоичный файл и упаковать его за один раз.

Адам Пирс
источник
1

Как я могу проверить, правильно ли я указал все зависимости?

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

thiton
источник
1

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

apt-get build-dep

Это устанавливает зависимости. Для этого вам нужны строки sources в вашем sources.list:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

Если вы переносите пакеты из тестирования в стабильную версию, имейте в виду, что зависимости могли измениться. Команда apt-get build-deb устанавливает зависимости для исходных пакетов в вашем текущем репозитории.

Но, конечно, dpkg-buildpackage -us -uc покажет вам все неустановленные зависимости.

Если вы хотите чаще компилировать, используйте cowbuilder.

apt-get install cowbuilder

Затем создайте область сборки:

sudo DIST = сжатие ARCH = amd64 cowbuilder --create

Затем скомпилируйте пакет с исходным кодом:

apt-get source cowsay

# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

Посмотрите, куда ковбилдер кладет получившийся пакет.

Удачи!

Аллард Хув
источник