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