[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Вопросы по созданию пакета.



Вроде сделал.
Вопросы появились (которые вспомнил).
Внутри описания.
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


Reply to: