\chapter{Изграждане на дистрибуцията и средства за контрол}
        
\section{Packaging - \textit{Debian official maintainer's way}}

\subsection{Бързо запознаване с \texttt{hello} и \texttt{hello-debhelper}}

Целта на този процес е да се организира изграждането на сорс и бинарни 
пакети, които да бъдат обработвани от инструментите за пакетиране, инсталиране, 
премахване и преконфигуриране. Целта е в системата да има установен ред и правила 
при изпълнението на тези дейности с което наистина ще държим нещата под наш 
контрол, независимо колко е голяма инсталираното от системата, 
знаейки какво е инсталирано, как е инсталирано, с чисто премахване или 
надграждане на нещо вече инсталирано. \texttt{Debian} е известен с легендарните си 
способности за чисто инсталиране и надграждане на пакетите на системата. В тази глава 
ще се постараем да обясним къде е генезиса на всичко това и то да не изглежда просто 
като легенда, а като рутинна практика при всекидневното използване на системата. 
Като реален пример може да се посочи десктопа на един от авторите който е система 
първоначално инсталирана преди около 5 години (към момента на писане на тази глава). 
Системата разбира се е подложена на всекидневни упгрейди, инсталации на нови пакети или 
тяхното премахване и други по-необичайни дейности, при които проблеми може и да има, 
но те са решими. През повечето време системата изглежда като току-що инсталирана. Чиста. 
Разбира се, това съвсем не значи, че в някой директории като \texttt{/usr/local/} и в 
домашните директории на потребителите не може да се води война от инсталиране и премахване 
на каквото ви душа иска. Напротив, това не е територия на системата и е изцяло на вашата 
воля, какво ще правите там. Е, с глупави и опасни програми не си губете времето, внимавайте 
какво инсталирате и къде особено когато използвате суперпотребителя \texttt{root}. 
Научете \texttt{Debian} отвътре за да подчините и експлоатирате възможностите му за 
вашите потребителски цели.

\begin{itemize}

\item За да разберем какво съдържа един дебиански пакет, вземаме кой да е 
такъв и пробваме командите \texttt{dpkg-deb -x} и \texttt{dpkg-deb -е} върху него. 

\item За да разберем какво представлява изходния код на един дебиански пакет, 
вземаме изходния код на пакета \deb{hello}, поглеждаме набързо \texttt{.dsc} файла, 
а останалите два файла разпакетираш по два начина:
	\begin{itemize}
	\item с \texttt{dpkg-source} 
	\item ръчно с \texttt{tar} и \texttt{patch}
	\end{itemize}

\item Разглеждаме съдържанието на директорията \texttt{debian} в изходния код на пакета 
\deb{hello}. Ползваме \hlink{Debian Policy Manual}{http://wwww.debian.org/doc/debian-policy/} 
като справочник или това е в пакета \deb{debian-policy}.

\item Когато нещата станат ясни, правиме същото с пакета \deb{hello-debhelper}, използвайки
\man{debhelper}{7} като справочник. Имайте на предвид, че \deb{debhelper} улеснява значително 
създаването на дебиански пакети автоматизирайки извършването на много рутинни и повтарящи се дейности.

\item През свободното време четем: 
	\begin{itemize}
	\item \hlink{Debian Policy Manual}{http://wwww.debian.org/doc/debian-policy/}
	\item \hlink{Debian Developer's Reference}{http://wwww.debian.org/doc/debian-policy/}
	\item \hlink{Debian New Maintainer' Guide}{http://www.debian.org/doc/maint-guide/}
	\end{itemize}

\item Вземаме програмата която искаме да пакетираме и копираме в изходния й код директорията 
\texttt{debian} от пакета \deb{hello-debhelper}, като пригодяваме нещата за да генерираме
нашия \texttt{deb}-пакет. Следващия път няма да използваме \deb{hello-debhelper}, а някой вече 
съществуващ изготвен от нас пакет.

\item Когато разберем какво значи \textbf{Intend To Package}, изпращаме \textbf{ITP} съобщение, 
за да не би някой друг да реши да пакетира същата програма и да си дублирате усилията. Ако
все още не сме одобрени за \texttt{upload} в официалното хранилище, можем да използваме
\hlink{Mentors Public Package Repository}{http://mentors.debian.net}
\end{itemize}

\subsection{Същото с \texttt{dh-make} и \texttt{devscripts}}

\begin{itemize}
\item Начално дебианизиране с инструмента \man{dh\_make}{8} от пакета \deb{dh-make}
\begin{verbatim}
dh_make -e your.maintainer@address -f ../program-1.2.3.tar.gz
\end{verbatim}
\item Цикъл на поддръжка с инструментите от пакета \deb{devscripts}
\begin{itemize}
\item Влизаме в сорс директорията на пакета
\item Правим промени по файловете
\item Документиране на промените с: \texttt{dch -i "I changed this"}
\item Компилираме изпълнявайки: \texttt{debuild}. Ако се върне грешка, 
се връщаме пак към промяна на файловете. Също така можем да стартираме 
компилацията със съответната част на \texttt{debian/rules} (като 
\texttt{debian/rules build binary patch unpatch и т.н.} каквото има предвидено)
\item Проверяваме дали пакета е в норми с: \texttt{debc}
\item Инсталираме пакета за да го изтестваме лично с: \texttt{debi} 
\item Ако всичко е наред издаваме пакета с: \texttt{debrelease}
\end{itemize}
\end{itemize}

\subsection{По-дълги обяснения}

На практика, след като се установи, че даден софтуер си заслужава да се
включи в официалния архив от пакети на Debian, се изготвя
\textit{debian source package}, който включва \textit{upstream source}
и директорията с \textit{maintainer scripts}. От този \textit{debian
  source package} след това се получават \textit{debian binary
  packages} (\textit{deb-файлове}) за различните хардуерни
архитектури, като се отчита и фактът, че има и такъв софтуер, който не
е пригоден или предвиден за всички хардуерни архитектури, а само за
една или няколко. Обикновено за получаването на базовите или начални
версии на maintainer scripts за \texttt{debian/} се използват 
Perl-скриптовете от пакета \deb{debhelper}, след което се донастройват
специфичните за пакета неща. В крайна сметка се създава унифицирано
управление на процеса по конфигуриране на сорса, компилация, свързване
и евентуално последващо конфигуриране и преконфигуриране на софтуера
за различните хардуерни архитектури. Разбира се, \textit{maintainer
  scripts} не изместват стандартните \textit{GNU devel tools}, а
работейки преди или над тях, ги използват по подходящ начин.
Естествено, в крайна сметка се извикват стандартните \textit{GNU devel
  tools} чрез файла \texttt{debian/rules}, който се явява стандартен
файл за програмата \texttt{make}, само че не е именуван като
\texttt{Makefile}, а започващ с \textit{shebang} (\texttt{\#!}) ред в
началото си, указващ пътя до \texttt{make}. Използват се още доста
файлове в \textit{maintainer scripts} и пример за това как точно
стават нещата, е даден в \hlink{\textbf{Debian New Maintainers'
  Guide}}{http://www.debian.org/doc/maint-guide/}. Едно доста добро 
  обяснение като за начало би бил документът на IBM -  
\hlink{\textit{Learn how to build easy-to-distribute packages for Debian users}}{http://www-106.ibm.com/developerworks/linux/library/l-debpkg.html?ca=dgr-lnxw01DebianLinux}.

\subsection{Примерни стъпки за преминаване към нова upstream версия}

Обикновено всеки сам си избира подход в тези случаи, но един примерен такъв може да 
се бъде състои от следните стъпки. Официалната документация по въпроса е 
\hlink{част от Debian Policy}{http://www.debian.org/doc/maint-guide/ch-update.en.html\#s-newupstream}.

\begin{itemize}

\item 1. Прочита се upstream changelog, NEWS или каквато документация може да са 
издали с технята нова версия.

\item 2. Изпълнява се \textbf{diff -urN} между старите и новите upstream сорсове 
за да се придобие представа за промените, къде точно е активно работено и следователно 
може да изникнат нови бъгове.

\item 3. Портва се старото Debian packaging към новата upstream версия.  Основно това 
включва прилагането на \textbf{diff.gz} от стария пакет към новия и инкрементирането на 
\textbf{debian/changelog}. Инструменти като \man{uupdate}{1} и \man{dch}{1} автоматизират 
този процес. Може да поддържате пакетните файлове в някое Source Control Management хранилище 
като например \deb{subversion}, при което може да изпълните \textbf{svn merge}.

\item 4. Ако някой \texttt{patch} или \texttt{merge} не се приложе чисто, инспектирате 
ситуацията за да определите какво точно се обърква (разглеждате \texttt{.rej} файловете). 
Най-често проблема е, че даден \texttt{patch} който прилагате към сорса е бил интегриран
upstream и вече няма нужда да се прилага.

\item 5. Ако са направени промени в build системата ( предполага се, че ще ги научите от
стъпки 1. и 2.) внасяте необходимите промени в \textbf{debian/rules} за съответните команди 
и в \textbf{debian/control} build dependencies.

\item 6. Компилирате новия пакет с \textbf{fakeroot debian/rules binary}, \textbf{debuild}
или в \textbf{pbuilder chroot}.

\item 7. Уверявате се, че пакета се е компилирал коректно.

\item 8. Използвате \man{lintian}{1} за да се хванат грубите нарушения на Debian Policy.

\item 9. Изпълнявате \textbf{debdiff old-package.change new-package.change}. Уверявате се, че
няма излишни и липсващи файлове или други нежелани промени.

\item 10. Проверявате съдържанието на \textbf{debc new-package.changes} за да се уверите, че
няма празни файлове.

\item 11. Инсталирате новия пакет. Уверявате се, че се инстлира и надгражда коректно и, че
работи нормално. Ако пакета използва не много тривиални pre, post, inst, rm скриптове се
убедете, че работят правилно.

\item 12. Проверявате дали има оправени бъгове за затваряне в \hlink{Debian Bug Tracking
System}{http://bugs.debian.org} и ги затваряте в \textbf{debian/changelog}.

\item 13. Проверявате чистотата на \textbf{diff.gz} файла изпълнявайки 
\textbf{interdiff -z old-package.diff.gz new-package.diff.gz} и се убеждавате, че няма
нежелани промени както и излишни файлове.

\item 14. Проверявате съдържанието на \textbf{.changes} файла за да се уверите, че
upload-вате в правилната дистрибуция, съответните бъгове за затваряне за изброени в полето
\textbf{Closes:}, полетата \textbf{Maintainer:} и \textbf{Changed-By:} съвпадат и файла е
подписан.

\item 15. Ако междувременно се налага да се направят промени за да се коригира нещо в пакетирането
повторете стъпките от 6 до 13 докато изчистите нещата.

\end{itemize}

\subsection{Инструменти улесняващи пакетирането}

Ще обясним накратко кои пакети и кои програми идващи с тях обикновено 
се използват при този процес. Тук ще дадем само някои насоки, което не 
изключва прочитането на \man{man}{1} страниците на програмите и документацията 
в директориите \texttt{/usr/share/doc/име\_на\_пакет/}. Имайте предвид, че 
постоянно могат да се появяват такива, но възлагайте на тях само рутинната част по 
създаването на файловете необходими за пакетиране, след което лично се убедете 
в тяхното съдържание и нанесете съответните корекции, така щото сорс пакета 
който създавате да се получат съответните бинарни пакети (\man{deb}{5}) в 
съответствие с всички правила и норми. Процеса може да бъде много прост и 
рутинен, но и много сложен и необичаен, всичко зависи от това какъв сорс 
пакетирате и как точно сте решили да го направите.

\subsubsection{Пакета \deb{dh-make}} 
Съдържа програмата \man{dh\_make}{8}, която се използва 
за първоначалното създаване на директорията \texttt{debian} и файловете в нея. 
С други думи спестява ви тази рутинна дейност, но задължително трябва да разгледате 
файловете и да внесете необходимите промени за точно този сорс пакет който дебианизирате.
Дотук вече трябва да сте добили представа как се борави с debian \texttt{binary packages} 
(или \man{deb}{5}). Нека видим как се получават те. Захващаме се да разберем какво има и в 
\texttt{debian source packages}. Само да напомним, че без да сте прочели 
\hlink{Debian New Maintainer's Guide}{http://www.debian.org/doc/maint-guide/}, още достъпен 
и като пакет \deb{maint-guide}, или поне да сте прехвърлили с поглед
\hlink{стария му превод}{http://debian.gabrovo.com/docs/maint-guide/},
ще ви е доста трудно да разберете за какво ще се говори в следващата глава.
Пакетът \deb{dh-make} съдържа скрипта \man{dh\_make}{8}, който
генерира debian source package от \textit{regular source code archive}
(или \textit{upstream sources}), подготвя \texttt{control}-файловете,
както и предоставя примерна конфигурация за \man{debhelper}{1}
инструментите, за която конфигурация обикновено е необходимо само
малко донастройка, за за да пасне за конкретния случай.  Или с други
думи, \deb{dh-make} се използва за създаване на скелета или общия вид
на debian source package, след което може да доредактирате файловете в
директория \texttt{debian/} както намерите за добре.  По-опитните
maintainers могат и без него, но силно се препоръчва да се използва от
начинаещите потребители, при което по-лесно и бързо ще свикнат с
процеса на конфигуриране на debian source packages.  Използва се
например така:

\begin{verbatim}
# cd program-source-directory
# dh_make -e your.maint@address -f ../programname-x.y.z.tar.gz
\end{verbatim}

Разбира се, ще отговорите на няколко въпроса, като дали това ще е
single или multiple binary packages, библиотеки и прочее. За повече се
обърнете към \hlink{Debian New Maintainer's
  Guige}{http://www.debian.org/doc/maint-guide}, главата First Steps,
т. 2.4 Initial Debianization.

\subsubsection{Пакета \deb{debhelper}}
Съдържа колекция от мощни \texttt{Perl} скриптове които 
можете да извиквате от \texttt{debian/rules}, който обикновено е файл за 
програмата \man{make}{1}, както и от други скриптове като
\texttt{.preinst,.postinst,.prerm,.postrm}. Скриптовете са много, просто изпълнете: 
\texttt{dpkg -L denhelper} за да ги видите.
Скриптовете \texttt{dh\_*} от пакета \deb{debhelper} се извикват от
maintainer scripts в debian source packages, и по точно от файла
\texttt{debian/rules}.  Използват се за автоматизиране на процедурите
по построяването на debian binary packages, а именно, като инсталиране
на определени файлове в дадения пакет, компресиране, установяване на
съответните права и собственост, интегриране с debian menu system и
много други.  Повечето debian source packages използват скриптовете на
\deb{debhelper} като част от техния build процес.


Ето и какви Perl скриптове се съдържат във версия 4.0.2 на пакета
\deb{debhelper}. За да ги листнем, изпълняваме:

\begin{verbatim}
$ dpkg -L debhelper | grep usr/bin
\end{verbatim}
% $

Следват кратки обяснения за скриптовете от пакета \deb{debhelper}:

\begin{itemize}
  
\item \man{dh\_builddeb}{1}: извиква \man{dpkg}{8} да билдва пакети.
  
\item \man{dh\_clean}{1}: почиства build директорията на пакета.
  
\item \man{dh\_compress}{1}: компресира файлове и оправя символните
  връзки в билд директорията на пакета.
  
\item \man{dh\_fixperms}{1}: оправя правата на файловете в билд
  директорията на пакета.
  
\item \man{dh\_gencontrol}{1}: генерира и инсталира
  \texttt{control}-файла в билд директорията на пакета.
  
\item \man{dh\_install}{1}: инсталира файлове, които не се нуждаят от
  специална обработка в билд директорията на пакета. За някои
  по-специални файлове са предвидени и по-специални скриптове.
  
\item \man{dh\_installchangelogs}{1}: инсталира
  \texttt{changelog}-файловете в билд директорията на пакета
  
\item \man{dh\_installcron}{1}: инсталира \deb{cron} скриптове в
  \texttt{etc/cron.*}
  
\item \man{dh\_installdeb}{1}: в \texttt{DEBIAN} директорията
  инсталира файловете:
        
  \begin{itemize}
  \item \texttt{package.postinst} 
  \item \texttt{package.preinst}
  \item \texttt{package.postrm}
  \item \texttt{package.prerm}
  \item \texttt{package.shlibs}
  \item \texttt{package.conffiles}
  \end{itemize}
  
\item \man{dh\_installdebconf}{1}: инсталира файловете,
  използвани от \man{debconf}{7} в билд директорията на пакета.
  
\item \man{dh\_installdirs}{1}: създава поддиректориите в билд
  директорията на пакета.
  
\item \man{dh\_installdocs}{1}: инсталира документацията в билд
  директорията на пакета.
  
\item \man{dh\_installemacsen}{1}: за някои пакети е възможно или е
  необходимо да се извършва byte-compiling по време на инсталацията.
  Такъв пример е Emacs (е то оставаше точно пък той да не е ;-). Ако
  вашият пакет се нуждае подобна функционалност, точно този
  \texttt{dh\_*}-скрипт ще извикате от файла \texttt{debian/rules}.
  
\item \man{dh\_installexamples}{1}: инсталира examples файловете в
  билд директорията на пакета, или по-точно в
  \texttt{usr/share/doc/\textit{пакет}/examples}. Файлът
  \texttt{debian/packages.examples} може да съдържа списък с други
  файлове, които да бъдат инсталирани.
  
\item \man{dh\_installinfo}{1}: инсталира info-файловете.  Файлът
  \texttt{debian/packages.info} може да съдържа списък с други
  файлове, които да бъдат инсталирани.
  
\item \man{dh\_installinit}{1}: инсталира init-скриптове в билд
  директорията на пакета.
  
\item \man{dh\_installlogrotate}{1}: инсталира конфигурационните
  файлове за \deb{logrotate}
  
\item \man{dh\_installman}{1}: инсталира man-файловете. Файлът
  \texttt{debian/packages.manpages} може да съдържа списък с други
  файлове, които да бъдат инсталирани
  
\item \man{dh\_installmanpages}{1}: това е стария аналог на предната
  команда, вместо него използвайте \man{dh\_installman}{1}
  
\item \man{dh\_installmenu}{1}: инсталира debian menu файловете в билд
  директорията на пакета. Автоматично генерира \texttt{postinst} и
  \texttt{postrm}, необходими да взаимодействат в пакета \deb{menu}.
  Ако има файл \texttt{debian/package.menu}, то той се инсталира в
  \texttt{usr/lib/menu/package} в билд директорията на пакета (това е
  debian menu файлът, \man{menufile}{5L}). Ако има файл
  \texttt{debian/package.menu-method}, то той се инсталира в
  \texttt{etc/menu-methods/\textit{пакет}} в билд директорията на
  пакета.  Tова е debian menu method файл. За повече информация вижте
  \man{update-menus}{1}.
  
\item \man{dh\_installmime}{1}: инсталира MIME-файловете в билд
  директорията на пакета. Ако има файл \texttt{debian/package.mime},
  то той се инсталира в \texttt{usr/lib/mime/packages/\textit{пакет}}
  в билд директорията на пакета.
  
\item \man{dh\_installmodules}{1}: регистрира kernel-модули
  посредством \deb{modutils}. Ако има файл
  \texttt{debian/package.modules}, то той ще бъде инсталиран в
  \texttt{etc/modutils/\textit{пакет}}
  
\item \man{dh\_installpam}{1}: инсталира файловете за поддръжка на
  PAM. Ако има файл \texttt{debian/package.pam}, то той ще бъде
  инсталиран като \texttt{etc/pam.d/\textit{пакет}}.
  
\item \man{dh\_installwm}{1}: регистрира window manager.  Файлът
  \texttt{debian/package.wm} може да съдържа списък с други прозоречни
  манежери.
  
\item \man{dh\_installxaw}{1}: инсталира конфигурационните файлове на
  Xaw wrappers в билд директорията на пакета. Ако има файл
  \texttt{debian/package.xaw}, то той ще бъде инсталиран в
  \texttt{usr/lib/xaw-wrappers/config/\textit{пакет}} в билд
  директорията на пакета.

\item \man{dh\_installxfonts}{1}: регистрира шрифтовете за X
  
\item \man{dh\_link}{1}: създава символни връзки в билд директорията
  на пакета
  
\item \man{dh\_listpackages}{1}: листва binary packages, за които ще
  се използва \deb{debhelper}

\item \man{dh\_makeshlibs}{1}: генерира shlibs-файл

\item \man{dh\_md5sums}{1}: генерира \texttt{DEBIAN/md5sums} файл.
  
\item \man{dh\_movefiles}{1}: файлът \texttt{debian/package.files}
  съдържа списък с файловете, които да бъдат преместени от
  \texttt{debian/tmp} в \texttt{subpackages}. Използвайте
  \man{dh\_install}{1}, която напълно я замества, като може и доста
  други работи.
  
\item \man{dh\_perl}{1}: генерира зависимостите на Perl скриптовете
  вкл. и Perl модулите, от които зависят
  
\item \man{dh\_shlibdeps}{1}: генерира зависимостите за споделените
  библиотеки (много яка проверка)
  
\item \man{dh\_strip}{1}: стрипва или премахва дебъг символите от
  изпълнимите и библиотечните файлове, за да се намали размера им
  
\item \man{dh\_suidregister}{1}: не ползвайте този скрипт! Оставен е
  само за обратна съвместимост. Вместо него използвайте
  \man{dpkg-statoverride}{8}.
  
\item \man{dh\_testdir}{1}: тества директорията преди да се билдва
  пакета. Проверява за наличието на \texttt{debian/control}, както и
  за някой други основни файлове.
  
\item \man{dh\_testroot}{1}: проверява за това дали пакетът се билдва
  от потребителя \texttt{root}. За справка \man{fakeroot}{1}.
  
\item \man{dh\_testversion}{1}: не ползвайте този скрипт! Проверява
  дали е инсталирана правилната версия на пакета \deb{debhelper}.
  Вместо него се използват dependencies и conflicts от
  \texttt{control} файла.
  
\item \man{dh\_undocumented}{1}: създава символна връзка към
  \texttt{undocumented.7.gz}. В случай, че пакетът няма \textit{man}
  страница, разбира се.

\end{itemize}

Разбира се, не при всички debian source packages ще се извикват всички
\texttt{dh\_*} скриптове. Това ще зависи от съответния пакет, както и
от решенията на maintainer-а. Най-добре ще е първо да изчетете добре
man-стрaниците за тези скриптове, както и четенето на самите скриптове
(Perl) не пречи, разбира се. Вземете, например, сорса на MPlayer от
CVS или някое негово издание и разгледайте файла \texttt{debian/rules}
за това какви \texttt{dh\_*} скриптове се извикват от него. Същото
можете да направите и с който и да е debian source package, включен в
официалния Debian архив. Другото, което е добре да направите, е да
разгледате самия \deb{debhelper} като debian source package, и по
специално неговата директория \texttt{debian/} и естествено
Perl-скриптовете, които предоставя. Изпълняваме:

\begin{verbatim}
# apt-get source debhelper
\end{verbatim}

\subsubsection{Пакета \deb{debconf}, \deb{debconf-utils}, \deb{po-debconf}} 
Унифициран начин пакетите да задават въпроси на потребители при първоначално 
инсталиране, последващо преконфигуриране и премахване. 

\subsubsection{Пакета \deb{devscripts}} 
Съвременният начин. \texttt{zless /usr/share/doc/devscripts/README.gz}
Предвиден е да облекчи живота на Debian package maintainers. Съдържа следните 
скриптове, като dependencies/recommendations са показани в счупените скоби:

\begin{itemize}
 
\item \man{bts}{1}: Команда за комуникиране с Bug Tracking System
  [\deb{www-browser}, \deb{mailx}]
 
\item \man{dch}{1}, \man{debchange}{1}: Автоматично добавя entries към
  \texttt{debian/changelog} файловете
 
\item \man{debclean}{1}: Пречиства (purge) a Debian source tree
  [\deb{fakeroot}]
 
\item \man{debuild}{1}: Wrapper за билдване на пакети без да е
  необходимо да се изпълнява \texttt{su} или да се мисли как да се
  стартира \man{dpkg}{8} да билдва, използвайки \man{fakeroot}{1}. Също
  така се оправя с общите проблеми на средата, umask и т.н.
  [\deb{fakeroot}, \deb{lintian}, \deb{gnupg}]
 
\item \man{debdiff}{1}: Сравнява две версии на Debian package, за да
  привери за добавени или премахнати файлове [\deb{wdiff},
  \deb{patchutils}]
 
\item \man{debpkg}{1}: Dpkg wrapper за менажиране и тестове на пакети
  без \texttt{su} [\deb{perl-suid}]
 
\item \man{debi}{1}, \man{debc}{1}: скриптове за инсталиране на пакети
  и извличане на тяхното съдържание
 
\item \man{debit}{1}: скрипт за инсталиране на пакети и тестването им
  с debian-test [\deb{debian-test}]
 
\item \man{debrelease}{1}: Wrapper за \deb{dupload} или \deb{dput}
  [\deb{dupload} | \deb{dput}, \deb{ssh}]
 
\item \man{dscverify}{1}: Проверка целостта на Debian package от
  файловете \texttt{.changes} или \texttt{.dsc} [\deb{gnupg},
  \texttt{debian-keyring}, \texttt{libdigest-md5-perl}]
 
\item \man{debsign}{1}, \man{debrsign}{1}: подписване на двойката
  файлове \texttt{.changes}/\texttt{.dsc} без да необходима останалата
  част от пакета; двойката файлове може да се подписва отдалечено или
  да се изтеглят файловете и да се подпишат локално [\deb{gnupg},
  \deb{debian-keyring}, \deb{ssh}]
 
\item \man{dpkg-depcheck}{1}, \man{dpkg-genbuilddeps}{1}: Определя
  използваните пакети по време на build на даден Debian package;
  удобен за определяне на \texttt{Build-Depends} в \texttt{control}
  файла [\deb{build-essential}, \deb{strace}]
 
\item \man{grep-excuses}{1}: \man{grep}{1} на файла
  \texttt{update\_excuses.html} за дадени пакети [\deb{libwww-perl}]
 
\item \man{mergechanges}{1}: merge на \texttt{.changes} файловете от
  пакет, който е билднат за друга хардуерна архитектура
 
\item \man{plotchangelog}{1}: показва графика на данните от
  \texttt{changelog} файла [\deb{libtimedate-perl}, \deb{gnuplot}]
 
\item \man{uupdate}{1}: интегрира upstream промените в debian source
  package [\deb{patch}]
 
\item \man{uscan}{1}: сканира upstream сайтовете за нови издания. Също
  така са включени и няколко примерни mail filters за филтриране на
  пощата от пощенските списъци на Debian чрез \deb{exim},
  \deb{procmail} и др.  [\deb{libwww-perl}]

\end{itemize}


\subsubsection{Пакета \deb{debmake}}
Старият начин. Това е още един от пакетите, предназначени за
разработка и поддръжка на Debian source packages. Но този пакет се
използва все по-рядко.

\begin{itemize}
  
\item \man{deb-make}{1L}: генерира debian source package от upstream
  source код. Настройва файловете control. Предоставя примерна
  конфигурация за debstd, която в повечето случаи е използваема с
  минимална нужда от доредактиране
  
\item \man{debstd}{1L} разполага със следните възможности:
        
  \begin{itemize}
  \item автоматизира компресирането и инсталирането на документацията
  \item генерира multiple binaries от един-единствен debian source
    package
  \item генерира maintainer scripts и ги инсталира на подходящите
    места с подходящите права.
  \item може да модифицира много от debian config files чрез
    генериране на подходящи maintainer scripts.
  \item извиква \man{dpkg-shlibdeps}{1} за всички ELF binaries и
    генерира коректен shlibs файл за дадените библиотеки автоматично.
  \item проверява symlinks за manpages / documentation и пренасочва в
    случай, че е необходимо.  
  \end{itemize}
  
\end{itemize}

\subsubsection{Пакета \deb{dpatch}, \deb{patchutils}, \deb{dh-kpatches}}

\subsubsection{Пакета \deb{cdbs}}

\subsubsection{Пакета \deb{cvs-buildpackage}}

\subsubsection{Пакета \deb{svn-buildpackage}}

\subsubsection{Пакета \deb{arch-buildpackage}}

\subsubsection{Пакета \deb{tla-buildpackage}}


\subsection{Инструменти за проверка и контрол}

\subsubsection{Пакета \deb{linda}}

\subsubsection{Пакета \deb{lintian}}

\subsubsection{Пакета \deb{debian-test}}

\subsubsection{Пакета \deb{debbugs}}

\subsubsection{Пакета \deb{reportbug}}


\subsection{Примерни програми за пакетиране}

FIXME: да се започне и довърши step-by-step пример за:

\begin{itemize}
\item \hlink{http://mironcho.sf.net}{http://mironcho.sf.net}
\item \hlink{http://bebocd.sf.net}{http://bebocd.sf.net}
\item \hlink{http://opensource.netuser.cc/sgmixer/}{http://opensource.netuser.cc/sgmixer/}
\item \hlink{http://biona.sf.net}{http://biona.sf.net}
\item \hlink{http://netacct-mysql.gabrovo.com}{http://netacct-mysql.gabrovo.com} (upstream debianized)
\end{itemize}

Примерни apt хранилища с binary и source пакети:

\begin{itemize}
\item \hlink{http://danchev.fccf.net/debian/}{http://danchev.fccf.net/debian/}
\item \hlink{http://ftp.logos-bg.net/debian/}{http://ftp.logos-bg.net/debian/}
\end{itemize}
