Вроде сделал.
Вопросы появились (которые вспомнил).
Внутри описания.
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 artiomsoft@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. <artiomsoft@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. <artiomsoft@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.o.v@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>>
Attachment:
rhvoice_0.3-1.debian.tar.gz
Description: GNU Zip compressed data