25 января, 2012

Сборка deb-пакета на примере swftools

Иногда нужной программы (или нужной версии программы) не оказывается в репозитории и приходится ставить её самостоятельно. Ставить через 'make install' вариант плохой, даже если ставить в домашнюю директорию, или /usr/local - через некоторое время понимаешь, управлять софтом в этой «помойке» не представляется возможным. Ранее мне приходилось пользоваться утилитами alien и checkinstall, но в этот раз потребовалось собрать свежие SWFTools в пакет с корректно указанными зависимостями.

Процесс оказался несколько дольше, чем я предпологал, в основном из-за необходимости патча на сборочные скрипты. Во-первых кто-то забыл дописать к цели clear удаление бинарника swfrender, что крайне «не нравилось» dpkg-buildpackage. Во-вторых система сборки «клала с прибором» на переменную DESTDIR, из-за чего install пытался писать файлы туда, куда пускаю только суперпользователя. Обе проблемы решил патч, приведённый ниже.

diff -rupN swftools-0.9.1.orig/avi2swf/Makefile.in swftools-0.9.1/avi2swf/Makefile.in
--- swftools-0.9.1.orig/avi2swf/Makefile.in     2009-08-05 14:21:22.000000000 +0400
+++ swftools-0.9.1/avi2swf/Makefile.in  2012-01-11 15:56:16.000000000 +0400
@@ -25,8 +25,8 @@ avi2swf$(E): avi2swf.$(O) v2swf.$(O) vid
        $(STRIP) avi2swf$(E)
 
 install:
-       $(mkinstalldirs) $(bindir)
-       $(mkinstalldirs) $(man1dir)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
        @file=avi2swf;$(INSTALL_BIN);$(INSTALL_MAN1)
        
 uninstall:
diff -rupN swftools-0.9.1.orig/lib/pdf/Makefile.in swftools-0.9.1/lib/pdf/Makefile.in
--- swftools-0.9.1.orig/lib/pdf/Makefile.in     2010-06-06 06:38:42.000000000 +0400
+++ swftools-0.9.1/lib/pdf/Makefile.in  2012-01-11 15:56:16.000000000 +0400
@@ -195,7 +195,7 @@ gfx2gfx$(E): $(XPDFOK) ../../src/gfx2gfx
        $(LL) $(CPPFLAGS) -g ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) -o gfx2gfx$(E) $(LIBS)
 
 install:
-       $(mkinstalldirs) $(bindir)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
        @for file in pdfinfo pdftoppm pdftotext; do if test -f $$file;then $(INSTALL_BIN);fi;done
 
 uninstall:
diff -rupN swftools-0.9.1.orig/Makefile.common.in swftools-0.9.1/Makefile.common.in
--- swftools-0.9.1.orig/Makefile.common.in      2010-04-03 23:34:42.000000000 +0400
+++ swftools-0.9.1/Makefile.common.in   2012-01-11 15:56:16.000000000 +0400
@@ -59,7 +59,7 @@ datadir = @datadir@
 libdir = @libdir@
 includedir = @includedir@
 sysconfdir = @sysconfdir@
-pkgdatadir = $(datadir)/@PACKAGE@
+pkgdatadir = $(DESTDIR)$(datadir)/@PACKAGE@
 
 # man pages
 mandir = @mandir@
@@ -67,10 +67,10 @@ man1dir = $(mandir)/man1
 
 # ------------------- defines -------------------------
 
-INSTALL_BIN = echo installing $$file to $(bindir);$(INSTALL_PROGRAM) $$file $(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`
-UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(bindir)/$$ff;rm -f $(bindir)/$$ff
-INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(man1dir)/$$inst
-UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(man1dir)/$$inst"; rm -f $(man1dir)/$$inst
+INSTALL_BIN = echo installing $$file to $(DESTDIR)$(bindir);$(INSTALL_PROGRAM) $$file $(DESTDIR)$(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`
+UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(DESTDIR)$(bindir)/$$ff;rm -f $(DESTDIR)$(bindir)/$$ff
+INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(DESTDIR)$(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(DESTDIR)$(man1dir)/$$inst
+UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(DESTDIR)$(man1dir)/$$inst"; rm -f $(DESTDIR)$(man1dir)/$$inst
 
 #%.o: %.c
 #      $(C) $< -o $@
diff -rupN swftools-0.9.1.orig/src/Makefile.in swftools-0.9.1/src/Makefile.in
--- swftools-0.9.1.orig/src/Makefile.in 2010-04-03 23:34:42.000000000 +0400
+++ swftools-0.9.1/src/Makefile.in      2012-01-11 15:56:16.000000000 +0400
@@ -129,8 +129,8 @@ swfc$(E): parser.$(O) swfc.$(O) swfc-fee
        $(STRIP) $@
 
 install:
-       $(mkinstalldirs) $(bindir)
-       $(mkinstalldirs) $(man1dir)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
        @for file in $(programs) $(opt_programs); do if test -f $$file;then $(INSTALL_BIN);$(INSTALL_MAN1);fi;done
        
 uninstall:
@@ -138,9 +138,9 @@ uninstall:
 
 clean:  
        rm -f *.o *.obj *.lo *.la *~ gmon.out
-       rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx
-       @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe
-       @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E)
+       rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx swfrender
+       @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe swfrender.exe
+       @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E) swfrender$(E)
 
 doc:
        perl ../parsedoc.pl wav2swf.doc

ИМХО, собирать лучше в свежеустановленной системе. При установке кроме базовой системы и ssh-сервера можно ничего не выбирать. После того, как система для сборки готова, ставим нужные для сборки пакеты:

sudo apt-get install autoconf automake libtool autotools-dev fakeroot dh-make

На начальном этапе можно задать e-mail майнтейнера, то есть наш:

export DEBEMAIL=anton@geekhere.com

Хотя особого смысла в этом не вижу, всё равно придётся править debian/control. Создадим каталог для сборки:

mkdir build/swftools/0.9.1/
cd build/swftools/0.9.1/

Путь особого сакрального смысла не имеет, заметил её в одном из HOWTO, которые просматривал перед сборкой, понравилась. Скачиваем исходные коды, сразу присваиваем им имя, которое ожидает dpkg-buildpackage

wget http://www.swftools.org/swftools-0.9.1.tar.gz -O swftools_0.9.1.orig.tar.gz

Распакуем исходники:

tar zxvf swftools_0.9.1.orig.tar.gz

Накатываем патч, описанный выше:

patch -p0 < 0.9.1_deb.patch
Создаём конфигурационные файлы будущего пакета:
cd swftools-0.9.1/
dh_make

Тут нам нужно навести лоск, поправив файлы в директории debian. Наш пакет ну будет содержать pre-install, post-install и т.д. скриптов, поэтому достаточно отредактировать файл debian/control. Заполним пункты Homepage и Description. Можно собирать пакет!

dpkg-buildpackage -rfakeroot

Всё, пакет готов и находится каталогом выше (../swftools_0.9.1-1_amd64.deb )

Потратив время на создание патча я задумался, нельзя ли было пойти более простым путём? Действительно, собрать пакет с checkinstall несколько проще:

sudo apt-get install checkinstall
cd swftools-0.9.1/
./configure --prefix=/usr
make
sudo checkinstall -D -y --pkgname=swftools --pkgversion=0.9.1

Патчить исходники не надо - это плюс, зависимости у пакета не прописаны - это минус. Ну что же, посмотри что внутри пакета:

dpkg --extract swftools_0.9.1-1_amd64.deb swftools_0.9.1-1_amd64
dpkg --control swftools_0.9.1-1_amd64.deb swftools_0.9.1-1_amd64/DEBIAN

Список библиотек, от которых зависит swftool получить довольно просто:

$ ldd swftools_0.9.1-1_amd64/usr/bin/* | sed 's,.*[[:space:]]\(/[^ ]*\).*,\1,g ; /^[^/]/d' | \
    xargs -L1 dpkg -S | sed 's/:.*//g' | sort -u | xargs dpkg -l | egrep '^ii'
dpkg: файл /lib64/ld-linux-x86-64.so.2 не найден.
                    -//-
ii  libc6                               2.11.2-10                    Embedded GNU C Library: Shared libraries
ii  libfreetype6                        2.4.2-2.1+squeeze3           FreeType 2 font engine, shared library files
ii  libgcc1                             1:4.4.5-8                    GCC support library
ii  libgif4                             4.1.6-9                      library for GIF images (library)
ii  libjpeg8                            8b-1                         The Independent JPEG Group's JPEG runtime library
ii  libstdc++6                          4.4.5-8                      The GNU Standard C++ Library v3
ii  zlib1g                              1:1.2.3.4.dfsg-3             compression library - runtime

На ld-linux-x86-64.so.2 можно не обращать внимания. Для сравнения зависимости, которые сгенерил dpkg-buildpackage: libc6 (>= 2.7), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libgif4 (>= 4.1.4), libjpeg8, libstdc++6 (>= 4.1.1), zlib1g (>= 1:1.1.4) Можно отредактировать swftools_0.9.1-1_amd64/DEBIAN/control и собрать пакет обратно:

dpkg-deb --build swftools_0.9.1-1_amd64 swftools_0.9.1-1_amd64.deb

Полезные ссылки:
Подробнее о файле control (en)
Внутреннее устройство пакетов Debian (ru)

Комментариев нет:

Отправка комментария