Иногда нужной программы (или нужной версии программы) не оказывается в репозитории и приходится ставить её самостоятельно. Ставить через '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)
Комментариев нет:
Отправить комментарий