LINUX.ORG.RU

Сборка deb-пакетов, часть 3


0

1

Подумал, что раз уж я решил попробовать себя вв роли мейнтейнера, лучше написать в Development, может тут я смогу наконец-то получить ответы на свои вопросы. Ниже ссылки на мои предыдущие темы в General, где я также пытался обсудить вопрос сборки deb-пакета:
http://www.linux.org.ru/forum/general/5401371 - часть 1
http://www.linux.org.ru/forum/general/5479028 - часть 2

В этот раз не буду задавать много вопросов, наоборот начну с простого: самые основные инструменты make, dh-make и debhelper и самая простая программа.
Итак, насколько я понимаю, начинать процесс сборки пакета надо с dh_make. dh_make создаёт скелет будущего пакета (но никакой компилятор не вызывает как я раньше заблуждался), выражается это созданием каталога debian, в котором создаются служебные файлы, необходимые для создания пакета. Главные из этих файлов: control - служебная информация пакета; rules - сценарий для создания пакета, исполняемый. dh_make следует выполнять в каталоге с именем вида <название>-<версия>, в этом случае название и версия пакета будут автоматически прописаны в debian/control.
Второе действие - это редактирование debian/rules.

Теперь практика плюс все вопросы и непонятки. В качестве программы на которой буду учиться выбирается LogJam, клиент для отправки записей в Живой Журнал.
Получаю и распаковываю исходники:

$ wget --directory-prefix=/tmp http://logjam.danga.com/download/logjam-4.5.3.tar.bz2
$ tar --extract --file=/tmp/logjam-4.5.3.tar.bz2 --directory=/usr/src --bzip
$ cd /usr/src/logjam-4.5.3
Конфигурирую и компилирую:
/usr/src/logjam-4.5.3$ ./configure --prefix=/usr
/usr/src/logjam-4.5.3$ make
Конфигурирование и компиляция проходят нормально - значит все компоненты необходимые для сборки в каталоге присутствуют. Но наша цель - собрать пакет, а не засорять систему, поэтому очищаю рабочий каталог и заново распаковываю исходники:
/usr/src/logjam-4.5.3$ cd ..
/usr/src$ rm -Rf logjam-4.5.3
/usr/src$ tar --extract --file=/tmp/logjam-4.5.3.tar.bz2 --directory=/usr/src --bzip
/usr/src$ cd logjam-4.5.3
Теперь запускаю dh_make:
/usr/src/logjam-4.5.3$ dh_make -e sunny0sergey@gmail.com --createorig

Type of package: single binary, multiple binary, library, kernel module or cdbs?
 [s/m/l/k/b] s

Maintainer name : SUNNY-iskatel
Email-Address   : sunny0sergey@gmail.com 
Date            : Mon, 08 Nov 2010 23:08:47 +0300
Package Name    : logjam
Version         : 4.5.3
License         : blank
Using dpatch    : no
Type of Package : Single
Hit <enter> to confirm: 
Done. Please edit the files in the debian/ subdirectory now. logjam
uses a configure script, so you probably don't have to edit the Makefiles.
debian/rules у меня получился таким:
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1


# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
CROSS= --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
else
CROSS= --build $(DEB_BUILD_GNU_TYPE)
endif



config.status: configure
	dh_testdir
	# Add here commands to configure the package.
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
	cp -f /usr/share/misc/config.sub config.sub
endif
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
	cp -f /usr/share/misc/config.guess config.guess
endif
	./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs"


build: build-stamp

build-stamp:  config.status 
	dh_testdir

	# Add here commands to compile the package.
	$(MAKE)
	#docbook-to-man debian/logjam.sgml > logjam.1

	touch $@

clean: 
	dh_testdir
	dh_testroot
	rm -f build-stamp 

	# Add here commands to clean up after the build process.
	[ ! -f Makefile ] || $(MAKE) distclean
	rm -f config.sub config.guess

	dh_clean 

install: build
	dh_testdir
	dh_testroot
	dh_clean -k 
	dh_installdirs

	# Add here commands to install the package into debian/logjam.
	$(MAKE) DESTDIR=$(CURDIR)/debian/logjam install


# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
	dh_testdir
	dh_testroot
	dh_installchangelogs ChangeLog
	dh_installdocs
	dh_installexamples
#	dh_install
#	dh_installmenu
#	dh_installdebconf	
#	dh_installlogrotate
#	dh_installemacsen
#	dh_installpam
#	dh_installmime
#	dh_python
#	dh_installinit
#	dh_installcron
#	dh_installinfo
	dh_installman
	dh_link
	dh_strip
	dh_compress
	dh_fixperms
#	dh_perl
#	dh_makeshlibs
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install
Теперь буду думать что тут редактировать. Вот почитал тут инструкцию по make-файлам, немного стал разбирать что тут написано. Я так понимаю, что процесс сборки будет состоять из этапов: build, clean, install, binary и для каждого этапа нужно прописать команды. Ну, команду для для конфигурирования я вижу:
./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
А вот где команда для компиляции. Я так понимаю я должен вручную прописать «make -f Makefile» после строки «build: build-stamp»
Но я не понимаю: для чего нужен этап clean, что за dh_testdir вызывается в каждом этапе и что за закоментированные строчки.

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

★★★★★

> А вот где команда для компиляции.
$(MAKE)

elipse ★★★ ()

I want to ride my bicycle

apt-cache policy logjam                                            :)
logjam:
  Установлен: (отсутствует)
  Кандидат:   4.5.3-6
  Таблица версий:
     4.5.3-6 0
        500 http://ftp.corbina.net/pub/Linux/debian/ sid/main i386 Packages
lazyklimm ★★★★★ ()
Ответ на: комментарий от elipse

dh_installexamples:

dh_installexamples demo/* - добавит в пакет примеры из demo

dh_compress -Xexamples - запрет сжатия примеров указанных в dh_installexamples

ошибки построения пакета будут видны по запуску debuild и с последующим автоматическим запуском lintian.

что за dh_testdir вызывается в каждом этапе и что за закоментированные строчки.


man dh_testdir

elipse ★★★ ()

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

Fischer ()
Ответ на: комментарий от Fischer

>где найти удобную графическую утилиту, которая максимально упрощает жизнь сборщику пакетов?

Где-где... в п^Hвенде

Led ★★★☆☆ ()

где найти удобную графическую утилиту, которая максимально упрощает жизнь сборщику пакетов?


Зачем? Нужно не жизнь упростить, а наоборот вникнуть в основы. Я не стал задавать много вопросов как в предыдущих темах, потому что подумал, что сначала надо разобраться с основами: make, dh-make, debhelper, а уж потом браться за всё остальное. А реально интересуюсь гораздо большем. Ведь программы, компилируемые с помощью configure+make это самое простое, а ведь ещё есть: cmake, scons, библиотеки, демоны, проприетарные программы. Я сейчас не решаюсь установить некоторые необходимые для меня программы, потому что не знаю как их дебианизировать. Как, например сделать пакет из vmware? А как сделать пакет из какого-нибудь расширения Мозиллы? А как собрать саму Мозиллу из ванильных исходников?

Сборка программ - это то к чему рано или поздно приходит любой линуксойд, такова ИМХО специфика этой операционной системы.

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

Вранье. Эндюзеру ни пакеты ни сборки нафиг не надо :)

Jetty ★★★★★ ()

> Но я не понимаю: для чего нужен этап clean

не обязательно у тебя пакет с первого раза соберется, скорее всего ты будешь изменения вносить в control, changelog и прочие файлы, или опции для компиляции добавлять, так вот, чтобы весь сборочный мусор не попадал в diff или debian.tar.gz, нужно очищать дерево сборки перед сборкой сырцового пакета

по командам dh_* смотри man

а вообще, ты вот выбрал single binary, а дебиан сейчас мигрирует по возможности на cdbs, так что как разберешься, переходи на нее, но там поизучать придется

dt1 ★★ ()
Ответ на: комментарий от dt1

dt1 писал

по командам dh_* смотри man

а вообще, ты вот выбрал single binary, а дебиан сейчас мигрирует по возможности на cdbs, так что как разберешься, переходи на нее, но там поизучать придется

Ну я так и думал, что в руководства пошлют, а не на пальцах объяснять будут. Ну да ладно, поразгрызаю.

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

Type of package: single binary, multiple binary, library, kernel module or cdbs?

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

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

а чего объяснять то, если тебе большая часть из этого пока, а может и вообще, не нужна?

ты лучше спрашивай что-то конкретное

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

в зависимости от того, что ты выберешь, будут по-разному сгенерированы файлы из каталога debian, в частности rules

и вообще, у тебя пакет то собирается? все команды для сборки вроде прописаны

dt1 ★★ ()
Ответ на: комментарий от dt1

и вообще, у тебя пакет то собирается? все команды для сборки вроде прописаны

Сейчас подредактировал информацию в debian/control и попробовал запустить «dpkg-buildpackage -rfakeroot» Что-то не получилось. Много сообщений, последние из них:

dh_testdir
dh_testroot
dh_installchangelogs ChangeLog
dh_installdocs
dh_installexamples
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps
dpkg-shlibdeps: предупреждение: зависимости от libatk-1.0.so.0 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libm.so.6 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от librt.so.1 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libpthread.so.0 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libdl.so.2 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libcairo.so.2 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libgmodule-2.0.so.0 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dpkg-shlibdeps: предупреждение: зависимости от libpangocairo-1.0.so.0 можно избежать, если "debian/logjam/usr/bin/logjam" не будет бесполезно слинкована с ней (не используется ни одного её символа).
dh_gencontrol
dpkg-gencontrol: ошибка: должен быть указан пакет, так как в управляющей информации их несколько ()
dh_gencontrol: command returned error code 65280
make: *** [binary-arch] Ошибка 1
dpkg-buildpackage: сбой: fakeroot debian/rules binary возвратил код ошибки 2

sunny1983 ★★★★★ ()
Ответ на: комментарий от elipse

$(MAKE)

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

dh_testdir
dh_testroot
dh_installchangelogs ChangeLog
dh_installdocs
dh_installexamples
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb

Усложняем ситуацию. Если программа конфигурируется через autogen.sh+configure значит следует прописать autogen.sh перед configure. Если через cmake, то configure заменяется на cmake. А что с копированием файлов config.sub и config.guess, они в случае cmake понадобятся? Для чего вообще они нужны? А как быть с программами, компилируемыми при помощи scons? Там наверное другой алгоритм упаковки нужен будет?

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

> А что с копированием файлов config.sub и config.guess, они в случае cmake понадобятся?

нет, они для autotools

А как быть с программами, компилируемыми при помощи scons? Там наверное другой алгоритм упаковки нужен будет?

не упаковки, а сборки, dh_make по идее автоматом выберет, что нужно

dt1 ★★ ()
Ответ на: комментарий от dt1

dt1 писал

что у тебя в debian/control?

Source: logjam
Section: x11
Priority: extra
Maintainer: Искатель <sunny0sergey@gmail.com>
Standards-Version: 3.7.3
Package: logjam
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Клиент для отправки сообщений в Живой Журнал
sunny1983 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.