Вроде сделал. Вопросы появились (которые вспомнил). Внутри описания. Source-пакет приложил. Вроде стало похоже на что-то. Хотя, наверняка где-то накосячил. :-| Но lintian почти не ругается...
<<Создание пакета для RHVoice. Сначала загружаю исходники с репозитория: git clone git://github.com/Olga-Yakovleva/RHVoice.git rhv_src Программа собирается через scons. Устанавливаю scons и необходимые сборочные зависимости: # apt-get install scons libsox-dev libunistring-dev flite1-dev libiconv-hook-dev expat В принципе, не нужно: # apt-get install libsonic-dev Если есть желание, посмотреть зависимости возможно, выполнив команду: $ dpkg-depcheck -a scons Будет пакет соберётся и в конце выдано большое количество пакетов. Большая часть, наверняка уже имеется в системе. Пытаюсь собрать для проверки: $ cd rhv_src $ scons Собрал с библиотекой, поэтому её надо подгружать перед запуском, иначе будет ругаться, что не найдена: $ export LD_PRELOAD=$PWD/build/linux2/lib/libRHVoice.so Система выводит обычный wav на стандартный вывод. Проигрываю через ALSA. $ echo "Проверка синтеза речи."|build/linux2/bin/RHVoice -d $PWD/data -c $PWD/config/ -W Elena |aplay $ echo "Проверка синтеза речи."|build/linux2/bin/RHVoice -d $PWD/data -c $PWD/config/ -W Aleksandr |aplay Всё заработало. Удаляю LD_PRELOAD и сборочный каталог: $ LD_PRELOAD= $ rm -rf build Получаю версию: $ RHV=$(sed -n 's/.*"package_version"\W*,\W*"Package version"\W*,\W*"\(.*\)".*/\1/p' SConstruct) Я собирал пакет для версии 0.3: $ echo "$RHV" Должен выдать "0.3" Создаю архив с исходниками. Формат названия пакета: <имя>-<версия> $ cd .. $ mv rhv_src rhvoice-$RHV dh_make --create-orig использовать нельзя, потому что он не удаляет каталог GIT-а. Поэтому есть два варианта. Один через tar: $ fakeroot tar --exclude-vcs -cf - rhvoice-$RHV| gzip - > rhvoice_$RHV.orig.tar.gz Второй, более правильный, но менее универсальный, через git archive (подсказал Andrey Rahmatullin из #debian-russian): $ fakeroot git archive --format=tgz -o ../rhvoice_$RHV.orig.tar.gz HEAD Менее универсальный он потому, что работает только с GIT. К тому же, в созданном архиве остаётся кое-какой "мусор" от GIT (файлы .gitignore, к примеру, не удаляются). Я сделал через git-archive. Проведу подготовительные действия. Для создания патчей использую quilt, как указано в debian-maint guide. Изменяю настройки quilt, создавая файл quiltrc: $ cd .. $ cat <<EOF > quiltrc d=. ; while [ ! -d \$d/debian -a \`readlink -e \$d\` != / ]; do d=\$d/..; done if [ -d \$d/debian ] && [ -z \$QUILT_PATCHES ]; then # если в пакетируемом дереве Debian не задана \$QUILT_PATCHES QUILT_PATCHES="debian/patches" QUILT_PATCH_OPTS="--reject-format=unified" QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto" QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index" QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33" if ! [ -d \$d/debian/patches ]; then mkdir \$d/debian/patches; fi fi EOF Файл с настройками взят отсюда: http://www.debian.org/doc/manuals/maint-guide/modify.ru.html Для более полного описания опций стоит почитать man quilt. Но мне это делать лень, поэтому довольствуюсь тем, что есть в maint-guide. Создаю алиас для quilt: $ alias dquilt="quilt --quiltrc=${PWD}/quiltrc" Приступаю непосредственно к созданию пакета. Создаю структуру пакета: $ cd rhvoice-$RHV $ dh_make -s -e artioms...@yandex.ru -f ../rhvoice_$RHV.orig.tar.gz Исправляю и перенастраиваю пакет. Все изменения в "родных" исходниках должны быть оформлены патчем. Сначала создам каталог, в котором система пакетов ищет патчи, при установке. $ mkdir debian/patches В debian/patches/series находится список патчей, которые будут применены в порядке сверху вниз. Quilt автоматически создаст этот файл и добавит туда патч. Править вручную ничего не надо. Создаю патч для файла настроек 1. Добавляю сам патч. $ dquilt new 00-config.patch 2. Добавляю, исправляемый файл (ФАЙЛОВ МОЖЕТ БЫТЬ НЕСКОЛЬКО?) $ dquilt add config/RHVoice.conf 3. Вношу изменения в файл: $ sed -i '{ s/.*stress_marker=.*/stress_marker=`/ }; { s/.*libsonic/libsonic/g }; {s/.*\(min_sonic[^=]*\).*/\1=0.5/}; { s/\(.*sonic.*\)=no/\1=yes/};' config/RHVoice.conf Здесь я немного изменяю настройки: включаю библиотеку sonic и расстановку ударений через апостроф. Тоже самое возможно сделать руками, без sed, но, в данном случае, так нагляднее. 4. Наконец создаю патч, который будет записан в debian/patches/00-config.patch: $ dquilt refresh 5. Теперь к патчу нужно добавить описание: $ dquilt header --dep3 -a <<EOF Title: Change configuration file DEP: 3 State: ACCEPTED Date: $(date +%Y-%m-%d) Abstract: 1. Enable sonic library; 2. Add accent symbol '\`'; 3. Tune synthesys for women voice. Author: Artiom N. <artioms...@yandex.ru> EOF Все поля описаны здесь: http://dep.debian.net/deps/dep3/ Того, что добавлено, вполне хватит. Ключ --dep3 включает новый формат описания DEP3, содержащий дополнительные поля. На этом создание патча завершено. Проверить или изменить то, что получилось возможно, выполнив dquilt header -e . Добавляю ещё один патч, по аналогии. Название каталогов программы имеет заглавные буквы. Исправляю в SConstruct. $ dquilt new 01-change-name-register.patch $ dquilt add SConstruct $ sed -i 's/\(env_args\["package_name"\]="\)RHVoice"/\1rhvoice"/' SConstruct $ dquilt refresh $ dquilt header --dep3 -a <<EOF Title: Change program name register DEP: 3 State: ACCEPTED Date: $(date +%Y-%m-%d) Abstract: Change name from RHVoice to rhvoice. Author: Artiom N. <artioms...@yandex.ru> EOF Замечу, что quilt будет работать с последним добавленным патчем. Чтобы выбрать патч нужно задать его имя после команды. Например: dquilt refresh 00-config.patch . Содержимое поля Abstract и Description должно начинаться с пробела. Точка - пустая строка. Изменяю управляющие файлы пакета Имеется всего четыре обязательных файла: 1. control - содержит сведения о майнтайнере, описание, сайт и прочее; 2. changelog; 3. copyright; 4. rules. === debian/control Устанавливаю правильные секцию и приоритет: Source: rhvoice Section: sound Priority: optional Приоритет возможно также назначить extra, если пакет будет с чем-то конфликтовать. (ВАЖНО ЛИ ЭТО, НА ЧТО ПОВЛИЯЕТ?). В поле Build-Depends надо прописать сборочные зависимости пакета: Build-Depends: debhelper (>= 8.0.0), libsox-dev, libunistring-dev, flite1-dev, libiconv-hook-dev, scons, expat Строка Depends определяет установочные зависимости. Мне нужны билиотеки sonic, libsox, libunistring, libflite и libiconv-hook (НАДО ЛИ ИЛИ ДОСТАТОЧНО ${shlibs:Depends}?): Depends: ${shlibs:Depends}, ${misc:Depends}, libsox, libunistring, libflite, libiconv-hook Виртуальных пакетов данный пакет не предоставляет, поскольку его нету в списке: http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt Да и вообще: в репозитории нету. :-) Поэтому, поле Provides не трогаю. Помимо этого, я заменяю описание пакета, добавляю сайт программы, автора и прочее. К примеру, поля Web страницы, адрес репозитория и адрес Web интерфейса GIT для RHVoice: Homepage: https://github.com/Olga-Yakovleva/RHVoice Vcs-Git: git://github.com/Olga-Yakovleva/RHVoice.git Vcs-Browser: https://github.com/Olga-Yakovleva/RHVoice Web страницы у проекта нет, поэтому я поставил вместо неё, адрес Web интерфейса репозитория. === debian/copyright Тут содержится информация о лицензии. У RHVoice лицензия GPL v.3. Это я и отмечаю: Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: rhvoice Source: git://github.com/Olga-Yakovleva/RHVoice.git Files: * Copyright: 2012 Yakovleva Olga <yakovleva....@gmail.com> License: GPL v.3 Далее должен идти её текст, но мне лень разбираться. Оставил, как есть. В принципе, ни на что это не влияет. === debian/changelog Я поменял строчку * Initial Release, убрав всё, что после "release". Это первая редакция. Больше ничего делать тут не нужно. Версию дистрибьютива стоит отавить unstable, как советует руководство. === debian/rules В rules заменяю цели сборки, чтобы собиралось, используя scons. Флаги сборки получаю командой, о которой написано в README: $ scons -h Заменяю префиксы на штатные для Debian: build: dh_testdir # dh_testroot scons prefix=/usr sysconfdir=/etc Затем, покопавшись в корневом SConstruct, нахожу переменную DESTDIR, которая используется при установке: override_dh_auto_install: dh_testdir dh_testroot scons DESTDIR=$(DESTDIR) install # Fucking scons doesn't create links... #!!! (Как сделать нормальное создание ссылок? При установке в /tmp/dir/ scons их создаёт, а при установке сюда - нет. Почему?) ln -s /usr/lib/libRHVoice.so.0.0.0 $(DESTDIR)/usr/lib/libRHVoice.so ln -s /usr/lib/libRHVoice.so.0.0.0 $(DESTDIR)/usr/lib/libRHVoice.so.0 dh_installdirs Меняю dh_auto_clean (мне надо только удалить каталог сборки): override_dh_auto_clean: # dh_testdir # dh_auto_clean # dh_clean rm -rf build rm site_scons/site_tools/installer.pyc Тонкая настройка На этом все необходимые файлы изменены. Теперь изменяю прочие файлы в debian, которые не являются обязательными. README.Debian - дополнительная информация и различия между оригинальным и модифицированным исходным кодом. Сюда пишу, что я поменял и добавил. В debian/dirs находятся каталоги, используемые пакетом, но не устанавливаемые по каким-то причинам системой установки программы (типа make install и подобными). Поскольку всё, что устанавливается автоматически, отслеживается пакетной системой (конкретно dh_installdeb), мне сюда ничего добавлять не нужно. Требуется ручное добавление тогда, когда по каким-то причинам программа использует каталоги, не создаваемые автоматически, при её установке (предусмотренной автором, например по make install). В debian/conffiles конфиги, идущие вместе с пакетом: etc/rhvoice/RHVoice.conf Аналогично: всё автоматически отслеживается пакетной системой. Добавлять ничего не нужно. Crontab Пишу crontab: $ cat > debian/rhvoice.cron.hourly <<EOF #!/bin/sh # # Regular cron jobs for the rhvoice package. Say time every hour. # SCRIPT=/usr/bin/RHV_saytime [ -x "\$SCRIPT" ] && "\$SCRIPT" EOF Впоследствии я добавлю скрипт, который будет проговаривать время. Тут я его запускаю каждый час. docs В файл debian/docs я добавляю запись о файле INSTALL, в котором имеется некоторая дополнительная информация о использовании программы, но автоматически пакетной системой файлы с таким именем не добавляются. $ echo INSTALL >> debian/docs Теперь добавляю init скрипт для запуска RHVoice, как демона, при загрузке. Хотя руководство и не рекомендует создавать службы, в крайнем случае, её возможно выключить. Правлю debian/init.d.ex. Затем, изменяю название: $ mv debian/init.d.ex debian/rhvoice.init Добавлю несколько своих скриптов в пакет. Все дополнительные данные должны находиться в каталоге debian. Там я создам свой каталог: $ mkdir -p debian/user_data/scripts После чего, скопирую туда всё, что хочу добавить в пакет. Сейчас я добавлю, честно слитый с Интернет шелл-скрипт, проговаривающий время. Он был сделан для Festival, но вполне сносно работает и с RHVoice. Скрипт я скопировал в debian/user_data/scripts под названием RHV_saytime. Теперь этот скрипт надо установить, при установке пакета. Для этого я добавлю его имя в файл debian/install: $ echo "debian/user_data/scripts/RHV_saytime usr/bin" >> debian/install Теперь добавлю несколько словарей (у меня они уже были установлены): $ mkdir debian/user_data/dicts $ cp cp /etc/rhvoice/dicts/*rhvoice*.txt debian/user_data/dicts/ $ for i in debian/user_data/dicts/* ; do echo "$i etc/rhvoice/dicts"; done >> debian/install Первое поле - что устанавливать, второе - куда. MAN Увы, автор программы не создала страницы справочного руководства... Мне тоже лень её писать, но стандарт требует. Для создания страницы я воспользуюсь генератором страниц из справки. $ apt-get install help2man У меня уже был установлен RHVoice, так что: $ help2man -N RHVoice -N означает не добавлять ссылку на Info. Увы, сгенерированная справка оставляет желать лучшего. Делаю так: $ help2man RHVoice| awk 'BEGIN { IFS=" "; } /^\\.*/ { printf("%s %s\n.TP\n", $1, $2); for (i = 3; i <= NF; i++) printf("%s ", $i); printf("\n.TP\n"); next; } { print; }' > debian/RHVoice.1 Затем, правлю man вручную. И добавляю в список man-страниц: $ echo "debian/RHVoice.man" >> debian/rhvoice.manpages Добавляю меню Здесь описаны все пункты: http://www.debian.org/doc/packaging-manuals/menu-policy/ch2.html#s2.1 Изменяю файл debian/menu.ex, записывая в него следующее: ?package(rhvoice):needs="text" section="Applications/Sound"\ title="RH Voice" command="/usr/bin/RHVoice" И перименовываю: $ mv debian/menu.ex debian/menu Файл слежения watch Служит для отслеживания изменения исходников программой uscan. КАК НАСТРОИТЬ ДЛЯ ИСПОЛЬЗОВАНИЯ С GIT? Удаляю лишнее: $ rm debian/{emacsen-*,*.cron.d.ex,manpage.*.ex,watch.ex,rhvoice.default.ex,rhvoice.doc-base.EX,post*.ex,pre*.ex} Наконец, создаю пакет: $ dpkg-buildpackage -rfakeroot -uc -us Опция -rfakeroot необязательна, поскольку она используется по умолчанию. Но я оставил. На всякий случай и как "дань традиции". %-) -us и -uc используются для того, чтобы не было ругани из-за невозможности подписать пакет. Проверяю пакет, используя lintian, и устраняю ошибки: $ lintian|lintian-info|less Исправляю всё, что указано, как E и, желательно, большую часть W. Lintian нужно обязательно запускать после пересборки. Когда, ошибки исправлены, снова пересобираю пакет и запускаю lintian. И так, пока не будет исправлено всё, что возможно. Проверяю содержимое: $ cd .. $ dpkg -c rhvoice_0.3-1_amd64.deb Всё прекрасно. Чищу за собой: $ unalias dquilt $ rm quiltrc И устанавливаю: dpkg -i rhvoice_0.3-1_amd64.deb>>
rhvoice_0.3-1.debian.tar.gz
Description: GNU Zip compressed data