% This file was generated with po4a. Translate the source file.
%
\documentclass[10pt,final]{beamer}
\mode<presentation> \usetheme{debian}

\usepackage{debiantutorial.ru} \usepackage[russian]{babel}

\hypersetup{bookmarks}
\title{Руководство по созданию пакетов Debian}
\author[]{Лукас Нуссбаум\\{\small\texttt{packaging-tutorial@packages.debian.org}}}

\date{\footnotesize version 0.29 -- 2021-11-03} 

\begin{document}


\frame{\titlepage}

\begin{frame}{Об этом руководстве}
  \begin{itemize}
  \item Цель: \textbf{сообщить вам то, что вам действительно нужно знать о создании
пакетов Debian}
    \begin{itemize}
      \hbr
    \item Изменение существующих пакетов
      \hbr
    \item Создание ваших собственных пакетов
	    \hbr
    \item Взаимодействие с сообществом Debian
      \hbr
    \item Становимся продвинутым пользователем Debian
    \end{itemize}
    \br
  \item Освещает большинство важных моментов, но не полно
    \begin{itemize}
    \item Вам будет необходимо прочитать дополнительную документацию
    \end{itemize}
    \br
  \item Большая часть изложения применима к производным от Debian дистрибутивам
    \begin{itemize}
      \hbr
    \item Включая и Ubuntu
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{План}
  \tableofcontents[hideallsubsections]
\end{frame}

\section{Введение}

\subsection{Debian}

\begin{frame}{Debian}
	\begin{itemize}
		\item \textbf{Дистрибутив GNU/Linux}
			\br
		\item Первый крупный дистрибутив, разрабатываемый ``открыто в духе GNU''
			\br
		\item \textbf{Некоммерческий}, создан совместно более чем 1,000 добровольцами
			\br
		\item 3 основных особенности
			\begin{itemize}
				\item \textbf{Качество} -- культура технического совершенства\\ {\small\sl Мы
выпускаем очередную версию, только когда она готова}
					\hbr
				\item \textbf{Свобода} -- разработчики и пользователи связаны \textsl{Общественным
договором}\\ Продвигаем культуру Свободного ПО с 1993 года
					\hbr
				\item \textbf{Независимость} -- нет (ни одной) компаний, опекающих Debian\\ 
Открытый процесс принятия решений (\textsl{управление тех, кто делает} +
\textsl{демократия})
			\end{itemize}
                        \br
                \item \textbf{Любительский} дистрибутив в лучшем смысле этого слова: создаётся
ради него самого
	\end{itemize}
\end{frame}

\subsection{Пакеты Debian}
\begin{frame}{Пакеты Debian}
\begin{itemize}
\item Файлы \textbf{.deb} (двоичные пакеты)
	\br
\item Очень мощный и удобный способ распространения ПО пользователям
	\br
\item Один из двух наиболее распространённых форматов пакетов (наряду с RPM)
	\br
\item Универсален
	\begin{itemize}
		\item 30,000 двоичных пакетов в Debian\\ $\rightarrow$ для большей части
доступного свободного ПО создан пакет Debian!
			\hbr
		\item 12 переносов (архитектур), включая переносы на отличное от Linux ядро (Hurd;
kFreeBSD)
			\hbr
		\item Используется 120 ответвлениями от дистрибутива Debian
	\end{itemize}
\end{itemize}
\end{frame}


\subsection{Формат пакетов deb}

\begin{frame}[fragile=singleslide]{Формат пакетов deb}
  \begin{itemize}
  \item Файл \texttt{.deb}: архив \texttt{ar}
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
$ ar tv wget_1.12-2.1_i386.deb
rw-r--r-- 0/0      4 Sep  5 15:43 2010 debian-binary
rw-r--r-- 0/0   2403 Sep  5 15:43 2010 control.tar.gz
rw-r--r-- 0/0 751613 Sep  5 15:43 2010 data.tar.gz
    \end{lstlisting} \begin{itemize}
    \item \texttt{debian-binary}: версия формата файла deb,
\texttt{"2.0\textbackslash{}n"}
    \item \texttt{control.tar.gz}: метаданные о пакете\\ {\small
\texttt{\textbf{control}, md5sums, (pre|post)(rm|inst), triggers, shlibs},
\ldots}
    \item \texttt{data.tar.gz}: файлы данных пакета
    \end{itemize}
    \br
  \item Можно создавать файлы \texttt{.deb} вручную\\ {\footnotesize
\url{http://tldp.org/HOWTO/html\_single/Debian-Binary-Package-Building-HOWTO/}}
    \br
  \item Но большинство пользователей этого не делают
  \end{itemize}
  \br
  \centerline{\textbf{Настоящее руководство: создание пакетов Debian способом Debian}}
\end{frame}

\subsection{Инструменты, которые вам потребуются}
\begin{frame}{Инструменты, которые вам потребуются}
  \begin{itemize}
  \item Доступ к системе Debian (или Ubuntu) с правами суперпользователя
    \br
  \item Некоторые пакеты:
    \begin{itemize}
    \item \textbf{build-essential}: имеет зависимости от пакетов, которые, как это
предполагается, доступны на машине разработчика (не нужно указывать их в
поле \texttt{Build-Depends:} управляющего файла вашего пакета)
      \begin{itemize}
      \item включает зависимость от \textbf{dpkg-dev}, который содержит базовые
инструменты Debian для создания пакетов
      \end{itemize}
      \hbr
    \item \textbf{devscripts}: содержит множество полезных сценариев для
сопровождающих Debian
    \end{itemize}
  \end{itemize}

  \br
  Множество других инструментов, которые также будут упомянуты в дальнейшем,
такие как \textbf{debhelper}, \textbf{cdbs}, \textbf{quilt},
\textbf{pbuilder}, \textbf{sbuild}, \textbf{lintian},
\textbf{svn-buildpackage}, \textbf{git-buildpackage}, \ldots\\ Установите
их, если они вам нужны.
\end{frame}

\subsection{Общая структура работы над созданием пакета}
\begin{frame}{Общая структура работы над созданием пакета}
  \begin{center}
    \begin{tikzpicture}[
      node1/.style={shape=rectangle,draw=rouge,fill=debianbackgroundblue,thick},
      arr/.style={very thick}, command/.style={text=rouge,font=\ttfamily}, ]
      
      \node[node1] (www) at (0, 0) {Веб}; \node[node1] (us) at (2.5, 0) {исходный
код основной ветки разработки}; \node[node1] (da) at (-2.5, 0) {зеркало
Debian}; \node[node1] (sp) at (0, -2) {пакет с исходным кодом};
\draw[arr,<-,dashed,thick] (sp) -- (2.5,-2) node[right=0cm,text
width=2.98cm,text centered,font=\small\sl] {большая часть ручной работы};
\node[node1] (bin) at (0, -4) {один или несколько двоичных пакетов};
\draw[arr,<-,dashed,thick] (bin) -- (3.5,-4) node[right,text
centered,font=\small\ttfamily\sl] {.deb\normalfont}; \draw[arr,->] (us) --
(sp) node[pos=0.5,right,command] {dh\_make}; \draw[arr,->] (da) -- (sp)
node[pos=0.5,left,command] {apt-get source}; \draw[arr,->] (www) -- (sp)
node[pos=0.5,left,command] {dget}; \draw[arr,->] (sp) -- (bin)
node[pos=0.5,right,text width=6cm] {\textttc{debuild} (сборка и тестирование
при помощи \textttc{lintian}) или \textttc{dpkg-buildpackage}};
\draw[arr,->] (bin) -- (1,-6) node[pos=0.5,right] {установка
(\textttc{debi})}; \draw[transparent] (bin) -- (-1,-6)
node[pos=0.5,left,opaque] {загрузка (\textttc{dput})}; \draw[arr,->,rounded
corners] (bin) -- (-1,-6) -- (-4.5,-6) -- (-4.5,0) -- (da);
\useasboundingbox (-4,-6) rectangle (6,0); \end{tikzpicture}
  \end{center}
\end{frame}

\subsection{Пересборка dash}
\begin{frame}{Пример: пересборка dash}
\begin{enumerate}
\item Установите пакеты, необходимые для сборки dash, а также devscripts\\ 
{\texttt{sudo apt-get build-dep dash}\\ (требуются строки \texttt{deb-src} в
\texttt{/etc/apt/sources.list})}\\ {\texttt{sudo apt-get install
-{}-no-install-recommends devscripts fakeroot}}
  \hbr
\item Создайте рабочий каталог, и перейдите в него:\\ \texttt{mkdir
/tmp/debian-tutorial ; cd /tmp/debian-tutorial}
  \hbr
\item Загрузите пакет с исходным кодом \texttt{dash}\\ \texttt{apt-get source
dash}\\ {\small (Для этого требуются строки \texttt{deb-src} в вашем файле
\texttt{/etc/apt/sources.list})}
  \hbr
\item Соберите пакет\\ {\texttt{cd dash-*\\ debuild -us -uc}} ~~~(\texttt{-us -uc}
отключают подписывание пакета с помощью GPG)

  \hbr
\item Проверьте, что всё работает
	\begin{itemize}
		\item  В родительском каталоге присутствуют новые файлы \texttt{.deb}
	\end{itemize}
    \hbr
\item Посмотрите каталог \texttt{debian/}
	\begin{itemize}
		\item Здесь и осуществляется работа по созданию пакетов
	\end{itemize}
\end{enumerate}
\end{frame}

\section{Создание пакетов с исходным кодом}
\subsection{Базовые знания о пакетах с исходным кодом}
\begin{frame}{Пакет с исходным кодом}
  \begin{itemize}
  \item Один пакет с исходным кодом может создавать несколько двоичных пакетов\\ 
{\small напр., исходный код \texttt{\bfseries libtar} создаёт двоичные
пакеты \texttt{\bfseries libtar0} и \texttt{\bfseries libtar-dev}} \hbr
  \item Два вида пакетов: (если не уверены, используйте non-native)
    \begin{itemize}
      \small
    \item Пакеты native: обычно это ПО, специфичное для Debian (\textsl{dpkg},
\textsl{apt})
    \item Пакеты non-native: ПО, разрабатываемое за пределами Debian
    \end{itemize}
    \hbr
  \item Основной файл: \texttt{.dsc} (метаданные)
    \hbr
  \item Другие файлы, зависящие от версии формата исходного кода
    \begin{itemize}
    \item 1.0 или 3.0 (native): \texttt{package\_version.tar.gz}
      \hbr
    \item 1.0 (non-native):
      \begin{itemize}
      \item \texttt{pkg\_ver.orig.tar.gz}: исходный код основной ветки разработки
      \item \texttt{pkg\_debver.diff.gz}: заплата для добавления специфичных для Debian
изменений
      \end{itemize}
      \hbr
    \item 3.0 (quilt):
      \begin{itemize}
      \item \texttt{pkg\_ver.orig.tar.gz}: исходный код основной ветки разработки
      \item \texttt{pkg\_debver.debian.tar.gz}: tarball с изменениями Debian
      \end{itemize}
    \end{itemize}
  \end{itemize}
  \hbr
  (Детали см. в \texttt{dpkg-source(1)})
\end{frame}

\begin{frame}[fragile=singleslide]{Пример пакета с исходным кодом (wget\_1.12-2.1.dsc)}
  \begin{lstlisting}[basicstyle=\ttfamily\small]
Format: 3.0 (quilt)
Source: wget
Binary: wget
Architecture: any
Version: 1.12-2.1
Maintainer: Noel Kothe <noel@debian.org>
Homepage: http://www.gnu.org/software/wget/
Standards-Version: 3.8.4
Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
 libssl-dev (>= 0.9.8), dpatch, info2man
Checksums-Sha1: 
 50d4ed2441e67[..]1ee0e94248 2464747 wget_1.12.orig.tar.gz
 d4c1c8bbe431d[..]dd7cef3611 48308 wget_1.12-2.1.debian.tar.gz
Checksums-Sha256: 
 7578ed0974e12[..]dcba65b572 2464747 wget_1.12.orig.tar.gz
 1e9b0c4c00eae[..]89c402ad78 48308 wget_1.12-2.1.debian.tar.gz
Files: 
 141461b9c04e4[..]9d1f2abf83 2464747 wget_1.12.orig.tar.gz
 e93123c934e3c[..]2f380278c2 48308 wget_1.12-2.1.debian.tar.gz
\end{lstlisting}
\end{frame}

\subsection{Получение пакетов с исходным кодом}
\begin{frame}{Получение существующего пакета с исходным кодом}
  \begin{itemize}
  \item Из архива Debian:
    \begin{itemize}
    \item \texttt{apt-get source \textsl{пакет}}
    \item \texttt{apt-get source \textsl{пакет=версия}}
    \item \texttt{apt-get source \textsl{пакет/выпуск}}
    \end{itemize}
    (Требуются строки \texttt{deb-src} в \texttt{sources.list})
    \br
  \item Из Интернет:
    \begin{itemize}
    \item \texttt{dget \textsl{адрес.dsc}}
    \item \texttt{dget
http://snapshot.debian.org/archive/debian-archive/\\20090802T004153Z/debian/dists/bo/main/source/web/\\ 
wget\_1.4.4-6.dsc}\\ (\href{http://snapshot.debian.org/}{\ttfamily
snapshot.d.o} предоставляет все пакеты из Debian с 2005 года)
    \end{itemize}
    \br
  \item Из (объявленной) системы контроля версий:
    \begin{itemize}
    \item \texttt{debcheckout \textsl{пакет}}
    \end{itemize}
    \br
  \item Когда пакет будет загружен, разверните его с помощью \texttt{dpkg-source -x
\textsl{файл.dsc}}
  \end{itemize}
\end{frame}

\subsection{Создание простого пакета с исходным кодом}
\begin{frame}{Создание простого пакета с исходным кодом}
  \begin{itemize}
  \item Загрузите исходный код основной ветки разработки\\ (\textsl{исходный код
основной ветки разработки} = исходный код от исходных разработчиков ПО)
    \hbr
  \item Переименуйте его в
\texttt{<\textsl{пакет\_с\_исходным\_кодом}>\_<\textsl{версия\_основной\_ветки}>.orig.tar.gz}\\ 
(пример: \texttt{simgrid\_3.6.orig.tar.gz})
    \hbr
  \item Разверните его
    \hbr
  \item Переименуйте каталог в
\texttt{<\textsl{пакет\_с\_исходным\_кодом}>-<\textsl{версия\_основной\_ветки}>}\\ 
(пример: \texttt{simgrid-3.6})
    \hbr
  \item \texttt{cd
\texttt{<\textsl{пакет\_с\_исходным\_кодом}>-<\textsl{версия\_основной\_ветки}>}
\&\& dh\_make}\\ (из пакета \textbf{dh-make})
    \hbr
  \item Для \texttt{dh\_make} имеются некоторые альтернативы для конкретных наборов
пакетов: \textbf{dh-make-perl}, \textbf{dh-make-php}, \ldots \hbr
  \item Будет создан каталог \texttt{debian/} с множеством файлов в нём
  \end{itemize}
\end{frame}

\subsection{Файлы в debian/}
\begin{frame}{Файлы в debian/}
  Вся работа по созданию пакетов должна осуществляться путём изменения файлов
в \texttt{debian/}
  \hbr
  \begin{itemize}
  \item Основные файлы:
    \begin{itemize}
    \item \textbf{control} -- метаданные о пакете (зависимости и т.д.)
    \item \textbf{rules} -- определяет то, как собирать пакет
    \item \textbf{copyright} -- информация об авторских правах для данного пакета
    \item \textbf{changelog} -- история пакета Debian
    \end{itemize}
    \hbr
  \item Другие файлы:
    \begin{itemize}
    \item compat
    \item watch
    \item цели dh\_install* \\ {\small *.dirs, *.docs, *.manpages, \ldots}
    \item сценарии сопровождающего\\ {\small *.postinst, *.prerm, \ldots}
    \item source/format
    \item patches/ -- если вам нужно изменить исходный код основной ветки
    \end{itemize}
    \hbr
  \item Некоторые файлы используют формат на основе RFC 822 (почтовые заголовки)
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/changelog}
  \begin{itemize}
  \item Содержит список изменений пакета Debian
  \item Содержит текущую версию пакета
  \begin{center}
    \begin{tikzpicture}
	    \draw (0,0) node[above right] {\large 1.2.1.1-5}; \draw
[decorate,decoration={brace}] (2,0) -- (1.45,0) node[at start,below,text
width=1.6cm,text centered] {\small Debian-ревизия}; \draw
[decorate,decoration={brace}] (1.4,0) -- (0,0) node[midway,below,text
width=1.6cm,text centered] { \small Основная версия};
\end{tikzpicture}
\end{center}


	  \item Редактируется вручную или с помощью \textttc{dch}
  \begin{itemize}
	  \item Создать запись об изменении для нового выпуска: \textttc{dch -i}
  \end{itemize}
  \item Специальный формат для автоматического закрытия ошибок Debian или Ubuntu\\ 
Debian: \texttt{Closes:~\#595268}; Ubuntu: \texttt{LP:~\#616929}
  \item Устанавливается как
\texttt{/usr/share/doc/\textit{package}/changelog.Debian.gz}
  \end{itemize}
  \seprule
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
mpich2 (1.2.1.1-5) unstable; urgency=low

  * Use /usr/bin/python instead of /usr/bin/python2.5. Allow
    to drop dependency on python2.5.  Closes: #595268
  * Make /usr/bin/mpdroot setuid. This is the default after
    the installation of mpich2 from source, too. LP: #616929
    + Add corresponding lintian override.

 -- Lucas Nussbaum <lucas@debian.org>  Wed, 15 Sep 2010 18:13:44 +0200
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/control}
  \hbr
  \begin{itemize}
  \item Метаданные пакета
    \begin{itemize}
    \item Для самого пакета с исходным кодом
    \item Для каждого двоичного пакета, собираемого из исходного кода
    \end{itemize}
    \hbr
  \item Имя, раздел, приоритет, сопровождающий, загружающие, сборочные зависимости,
зависимости, описание, домашняя страница, \ldots \hbr
  \item Документация: Политика Debian, глава 5\\ 
\url{https://www.debian.org/doc/debian-policy/ch-controlfields}
  \end{itemize}
  \seprule
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
Source: wget
Section: web
Priority: important
Maintainer: Noel Kothe <noel@debian.org>
Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
 libssl-dev (>= 0.9.8), dpatch, info2man
Standards-Version: 3.8.4
Homepage: http://www.gnu.org/software/wget/

Package: wget
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: retrieves files from the web
 Wget is a network utility to retrieve files from the Web
\end{lstlisting}
\end{frame}

\begin{frame}{Архитектура: все или какие-то}
  Два типа двоичных пакетов
  \hbr
  \begin{itemize}
  \item Пакеты с разным содержимым на каждой архитектуре Debian
    \begin{itemize}
    \item Пример: программа на C
    \item \texttt{Architecture:\ any} в \texttt{debian/control}
      \begin{itemize}
      \item Либо, если она работает только на некоторых архитектурах:\\ 
\texttt{Architecture:\ amd64 i386 ia64 hurd-i386}
      \end{itemize}
    \item buildd.debian.org: собирает для вас все остальные архитектуры при загрузке
    \item Имеет имя \texttt{\textsl{пакет}\_\textsl{версия}\_\textsl{архитектура}.deb}
    \end{itemize}
    \br
  \item Пакеты с одним и тем же содержимым на всех архитектурах
    \begin{itemize}
    \item Пример: библиотека Perl
    \item \texttt{Architecture:\ all} в \texttt{debian/control}
    \item Имеет имя \texttt{\textsl{пакет}\_\textsl{версия}\_\textbf{all}.deb}
    \end{itemize}
  \end{itemize}
  \br
  Пакет с исходным кодом может создавать двоичные пакеты и с
\texttt{Architecture:\ какая-то}, и с \texttt{Architecture:\ all}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/rules}
  \hbr
  \begin{itemize}
  \item Makefile
    \br
  \item Интерфейс, используемый для сборки пакетов Debian
    \br
  \item Документирован в Политике Debian, глава 4.8\\ {\small
\url{https://www.debian.org/doc/debian-policy/ch-source\#s-debianrules}}
    \br
  \item Требуемые цели:
    \begin{itemize}
    \item \texttt{build, build-arch, build-indep}: должны выполнить все настройки и
компиляцию
      \hbr
    \item \texttt{binary, binary-arch, binary-indep}: сборка двоичных пакетов
      \begin{itemize}
      \item \texttt{dpkg-buildpackage} вызовет \texttt{binary} для сборки всех пакетов,
либо \texttt{binary-arch} для сборки \texttt{Architecture:~какая-то} пакетов
      \end{itemize}
      \hbr
    \item \texttt{clean}: очищает каталог с исходным кодом
    \end{itemize}
  \end{itemize}
\end{frame}

\subsection{Утилиты, упрощающие создание пакетов}
\begin{frame}{Утилиты, упрощающие создание пакетов -- debhelper}
  \begin{itemize}
  \item Вы можете добавить код оболочки напрямую в \texttt{debian/rules}
  \item Лучше всего (используется большинством пакетов): использовать
\textsl{утилиту, упрощающую создание пакетов}
  \item Наиболее популярен: \textbf{debhelper} (используется в 98\% пакетов)
  \item Цели:
    \begin{itemize}
    \item Решить общие задачи стандартными средствами, для всех пакетов
    \item Исправить ряд ошибок при создании пакетов, для всех пакетов
    \end{itemize}{\footnotesize dh\_installdirs, dh\_installchangelogs, dh\_installdocs,
dh\_install, dh\_installdebconf, dh\_installinit, dh\_link, dh\_strip,
dh\_compress, dh\_fixperms, dh\_perl, dh\_makeshlibs, dh\_installdeb,
dh\_shlibdeps, dh\_gencontrol, dh\_md5sums, dh\_builddeb, \ldots}
    \begin{itemize}
    \item Вызывается из \texttt{debian/rules}
    \item Настройка через параметры команды или файлы в \texttt{debian/}
    \end{itemize}{\footnotesize \ttfamily \textsl{пакет}.docs, \textsl{пакет}.examples,
\textsl{пакет}.install, \textsl{пакет}.manpages, \ldots} \hbr
  \item Сторонние утилиты для ряда пакетов: \textbf{python-support},
\textbf{dh\_ocaml}, \ldots \hbr
  \item \texttt{debian/compat}: Debhelper compatibility version
	  \begin{itemize}
		  \item Defines precise behaviour of dh\_*
		  \item New syntax: \texttt{Build-Depends: debhelper-compat (= 13)}
	  \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/rules, использующий debhelper (1/2)}
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
#!/usr/bin/make -f

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

build: 
        $(MAKE)
        #docbook-to-man debian/packagename.sgml > packagename.1

clean: 
        dh_testdir
        dh_testroot
        rm -f build-stamp configure-stamp
        $(MAKE) clean
        dh_clean 

install: build
        dh_testdir
        dh_testroot
        dh_clean -k 
        dh_installdirs
        # Add here commands to install the package into debian/packagename.
        $(MAKE) DESTDIR=$(CURDIR)/debian/packagename install
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/rules, использующий debhelper (2/2)}
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]

# Build architecture-independent files here.
binary-indep: build install

# Build architecture-dependent files here.
binary-arch: build install
        dh_testdir
        dh_testroot
        dh_installchangelogs 
        dh_installdocs
        dh_installexamples
        dh_install
        dh_installman
        dh_link
        dh_strip
        dh_compress
        dh_fixperms
        dh_installdeb
        dh_shlibdeps
        dh_gencontrol
        dh_md5sums
        dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{CDBS}
  \hbr
  \begin{itemize}
  \item С debhelper всё равно остаётся много лишней работы
    \hbr
  \item Второпорядковые утилиты с большей функциональностью
    \begin{itemize}
    \item Напр., сборка с \texttt{./configure \&\& make \&\& make install} или CMake
    \end{itemize}
    \hbr
  \item CDBS:
    \begin{itemize}
    \item Представлен в 2005 году, основан на продвинутой магии \textsl{GNU make}
    \item Документация: \texttt{/usr/share/doc/cdbs/}
    \item Поддержка Perl, Python, Ruby, GNOME, KDE, Java, Haskell, \ldots
    \item Но некоторым она не нравится:
      \begin{itemize}
      \item Иногда трудно настраивать сборку пакетов:\\ "\textsl{лабиринт make-файлов и
переменных окружения}"
      \item Медленнее, чем обычный debhelper (множество бесполезных вызовов
\texttt{dh\_*})
      \end{itemize}
    \end{itemize}
  \end{itemize}
  \seprule
      \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk

# add an action after the build
build/mypackage::
    /bin/bash debian/scripts/foo.sh
      \end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{Dh (также известный как Debhelper 7, либо dh7)}
  \begin{itemize}
  \item Представлен в 2008 году как \textsl{убийца CDBS}
    \hbr
  \item Команда \textbf{dh}, вызывающая \texttt{dh\_*}
    \hbr
  \item Простой файл \textsl{debian/rules}, содержащий только список отклонений
    \hbr
  \item Проще настраивать, чем CDBS
    \hbr
  \item Документация: справочные страницы (\texttt{debhelper(7)}, \texttt{dh(1)}) +
слайды с выступления на DebConf9\\ 
\url{http://kitenet.net/~joey/talks/debhelper/debhelper-slides.pdf}
  \end{itemize}
  \seprule
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
#!/usr/bin/make -f
%:
    dh $@

override_dh_auto_configure:
     dh_auto_configure -- --with-kitchen-sink

override_dh_auto_build:
     make world

    \end{lstlisting}
\end{frame}

\begin{frame}{Классический debhelper против CDBS и dh}
  \hbr
  \begin{itemize}
  \item Доля использования:\\ Классический debhelper: 15\% \hskip 1em CDBS: 15\%
\hskip 1em dh: 68\%
    \hbr
  \item Что мне изучать?
    \begin{itemize}
    \item Вероятно, всё по чуть-чуть
    \item Вам нужно знать debhelper для использования dh и CDBS
    \item Вам может потребоваться изменить пакеты CDBS
    \end{itemize}
    \hbr
  \item Что использовать для нового пакета?
    \begin{itemize}
	    \item \textbf{dh} (единственное решение с увеличивающейся долей использования)
	    \item See \url{https://trends.debian.net/\#build-systems}
    \end{itemize}
  \end{itemize}
  
  \hbr


\end{frame}

\section{Сборка и тестирование пакетов}
\subsection{Сборка пакетов}
\begin{frame}{Сборка пакетов}
  \begin{itemize}
  \item \textttc{apt-get build-dep мой\_пакет}\\ Устанавливает зависимости для
сборки (\textsl{build-dependencies}) (для пакета, уже включённого в
Debian)\\ Либо \textttc{mk-build-deps -ir} (для пакета, который пока не
загружен)
    
    \br
  \item \textttc{debuild}: сборка, тестирование с помощью \texttt{lintian}, подпись
GPG
    \br
  \item Также можно вызвать \textttc{dpkg-buildpackage} напрямую
    \begin{itemize}
    \item Обычно с помощью \texttt{dpkg-buildpackage -us -uc}
    \end{itemize}
    \br
  \item Лучше собирать пакеты в чистом минимальном окружении
    \begin{itemize}
    \item \textttc{pbuilder} -- утилита, облегчающая сборку пакетов в
\textsl{chroot}\\ Хорошая документация:
\url{https://wiki.ubuntu.com/PbuilderHowto}\\ (оптимизация:
\textttc{cowbuilder} \textttc{ccache} \textttc{distcc})
      \hbr
    \item \textttc{schroot} и \textttc{sbuild}: используются в службах сборки Debian\\ 
(не так просты как \texttt{pbuilder}, но позволяют делать снимки LVM\\ см.:
\url{https://help.ubuntu.com/community/SbuildLVMHowto} )
    \end{itemize}
    \br
  \item Создаёт файлы \texttt{.deb} и файл \texttt{.changes}
    \begin{itemize}
    \item \texttt{.changes}: описывает, что было собрано; для загрузки пакета
    \end{itemize}
  \end{itemize}
\end{frame}
\subsection{Установка и тестирование пакетов}
\begin{frame}{Установка и тестирование пакетов}
  \begin{itemize}
  \item Установить пакет локально: \textttc{debi} (будет использовать
\texttt{.changes} для того, чтобы определить, что устанавливать) \br
  \item Список содержимого пакета: \texttt{{\color{rouge}debc}
../мой\_пакет<TAB>.changes} \br
  \item Сравнить пакет с предыдущей версией:\\ \texttt{{\color{rouge}debdiff}
../мой\_пакет\_1\_*.changes ../мой\_пакет\_2\_*.changes}\\ или сравнить с
исходным кодом:\\ \texttt{{\color{rouge}debdiff} ../мой\_пакет\_1\_*.dsc
../мой\_пакет\_2\_*.dsc}\\
    \br
  \item Проверить пакет с помощью \texttt{lintian} (статический анализатор):\\ 
\texttt{{\color{rouge}lintian} ../мой\_пакет<TAB>.changes}\\ \texttt{lintian
-i}: выдаёт дополнительную информацию об ошибках \\ \texttt{lintian -EviIL
+pedantic}: показывает больше проблем\br
  \item Загрузить пакет в Debian (\textttc{dput}) (требуется настройка) \br
  \item Управлять частным архивом Debian с помощью \textttc{reprepro} или
\\textttc{aptly}\\ Документация:
\url{https://wiki.debian.org/HowToSetupADebianRepository}
  \end{itemize}
\end{frame}
\section{Практика 1: изменение пакета grep}
\begin{frame}{Практика 1: изменение пакета grep}
  \begin{enumerate}
  \item Перейдите по адресу \url{http://ftp.debian.org/debian/pool/main/g/grep/} и
загрузите версию 2.12-2 пакета
    \begin{itemize}
		   \item Если пакет с исходным кодом не распаковывается автоматически, распакуйте его
с помощью \texttt{dpkg-source~-x~grep\_*.dsc}
    \end{itemize}

  \item Посмотрите файлы в \texttt{debian/}.
    \begin{itemize}
    \item 		Сколько двоичных пакетов создаётся этим пакетом?
    \item 		Какая утилита для создания пакетов используется?
    \end{itemize}
    \hbr
  \item Соберите пакет
    \hbr
  \item Мы собираемся изменить пакет. Добавьте запись в журнал изменений и увеличьте
номер версии.
    \hbr
  \item Теперь отключите поддержку регулярных выражений Perl (perl-regexp) (это
опция \texttt{./configure})
    \hbr
  \item Соберите пакет заново
    \hbr
  \item Сравните оригинальный и новый пакеты с помощью debdiff
    \hbr
  \item Установите собранный заново пакет
  \end{enumerate}
\end{frame}

\section{Продвинутые темы в сборке пакетов}
\subsection{debian/copyright}
\begin{frame}[fragile=singleslide]{debian/copyright}
  \hbr
  \begin{itemize}
  \item Авторское право и лицензионная информация для исходного кода и создания
пакета
  \item Традиционно записывается в виде текстового файла
  \item Новый машиночитаемый формат:
{\small\url{https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/}}
  \end{itemize}
  \seprule
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: X Solitaire
Source: ftp://ftp.example.com/pub/games

Files: *
Copyright: Copyright 1998 John Doe <jdoe@example.com>
License: GPL-2+
 This program is free software; you can redistribute it
 [...]
 .
 On Debian systems, the full text of the GNU General Public
 License version 2 can be found in the file
 `/usr/share/common-licenses/GPL-2'.

Files: debian/*
Copyright: Copyright 1998 Jane Smith <jsmith@example.net>
License:
 [LICENSE TEXT]
\end{lstlisting}
\end{frame}



\subsection{Изменение исходного кода основной ветки разработки}
\begin{frame}{Изменение исходного кода основной ветки разработки}
  Зачастую требуется:
  \begin{itemize}
  \item Исправить ошибки или добавить изменения, специфичные для Debian
    \hbr
  \item Перенести исправления из более нового выпуска основной ветки
  \end{itemize}
  \br
  Несколько методов, чтобы сделать это:
  \begin{itemize}
  \item Изменение файлов напрямую
    \begin{itemize}
    \item Просто
    \item Нет возможность отследить и задокументировать изменения
    \end{itemize}
    \hbr
  \item Использование систем заплат
    \begin{itemize}
    \item Упрощает внесение ваших изменений в основную ветку
    \item Помогает делиться исправлениями с производными дистрибутивами
    \item Больше внимания изменениям\\ \url{http://patch-tracker.debian.org/} (в
настоящее время выключен)
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{Системы заплат}
  \begin{itemize}
  \item Принцип: изменения сохраняются в виде заплат в \texttt{debian/patches/}
    \br
  \item Применяются или не применяются во время сборки
    \br
  \item В прошлом: несколько реализаций -- \textsl{simple-patchsys} (\textsl{cdbs}),
\textsl{dpatch}, \textbf{\textsl{quilt}}
    \begin{itemize}
  \item Каждая поддерживает две цели \texttt{debian/rules}:
    \begin{itemize}
    \item \texttt{debian/rules patch}: применяет все заплаты
    \item \texttt{debian/rules unpatch}: отменяет все заплаты
    \end{itemize}
	  \hbr
  \item Дополнительная документация: \url{https://wiki.debian.org/debian/patches}
  \end{itemize}
  \br
  \item \textbf{Новый формат пакетов с исходным кодом со встроенной системой заплат: 3.0
(quilt)}
  \begin{itemize}
  \item Рекомендуемое решение
	  \hbr
  \item You need to learn \textsl{quilt}\\ 
\url{https://perl-team.pages.debian.net/howto/quilt.html}
    \hbr
  \item Независимый от системы заплат инструмент в \texttt{devscripts}:
\texttt{edit-patch}
  \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Документирование заплат}
  \begin{itemize}
	  \item Стандартные заголовки в начале заплаты
    \br
  \item Документированы в DEP-3 - Руководство по тегам заплат\\ 
\url{http://dep.debian.net/deps/dep3/}
  \end{itemize}
  \vfill
\seprule
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
Description: Fix widget frobnication speeds
 Frobnicating widgets too quickly tended to cause explosions.
Forwarded: http://lists.example.com/2010/03/1234.html
Author: John Doe <johndoe-guest@users.alioth.debian.org>
Applied-Upstream: 1.2, http://bzr.foo.com/frobnicator/revision/123
Last-Update: 2010-03-29

--- a/src/widgets.c
+++ b/src/widgets.c
@@ -101,9 +101,6 @@ struct {
\end{lstlisting}
\end{frame}

\subsection{Сделать что-то во время установки или удаления}
\begin{frame}{Сделать что-то во время установки или удаления}
  \begin{itemize}
  \item Иногда недостаточно просто распаковать пакет
    \hbr
  \item Создать/удалить системных пользователей, запустить/остановить службы,
обработать \textsl{альтернативы}
    \hbr
  \item Осуществляется в \textsl{сценариях сопровождающего}\\ \texttt{preinst,
postinst, prerm, postrm}
    \begin{itemize}
	    \item  Части общих действий могут быть созданы при помощи debhelper
    \end{itemize}
    \hbr
  \item Документация:
    \begin{itemize}
    \item Руководство по политике Debian, глава 6\\ {\footnotesize
\url{https://www.debian.org/doc/debian-policy/ch-maintainerscripts}}
      
      \hbr
    \item Справочник разработчика Debian, глава 6.4\\ {\scriptsize
\url{https://www.debian.org/doc/developers-reference/best-pkging-practices.html}}
      \hbr
    \item {\footnotesize
\url{https://people.debian.org/~srivasta/MaintainerScripts.html}}
    \end{itemize}
    \br
  \item Приглашение пользователя
    \begin{itemize}
    \item Должно осуществляться с помощью \textbf{debconf}
      \hbr
    \item Документация: \texttt{debconf-devel(7)} (пакет \texttt{debconf-doc})
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Отслеживание версий основной ветки}
  \begin{itemize}
  \item В файле \texttt{debian/watch} укажите где искать (см. \texttt{uscan(1)})
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
version=3

http://tmrc.mit.edu/mirror/twisted/Twisted/(\d\.\d)/ \
  Twisted-([\d\.]*)\.tar\.bz2
    \end{lstlisting}
    \br
  \item There are automated trackers of new upstream versions, that notify the
maintainer on various dashboards including \url{https://tracker.debian.org/}
and \url{https://udd.debian.org/dmd/}
    \br
  \item \texttt{uscan}: запустить ручную проверку
    \br
  \item \texttt{uupdate}: попытаться обновить ваш пакет до самой последней версии
основной ветки разработки
  \end{itemize}
\end{frame}

\subsection{Создание пакетов в системе контроля версий (SVN, Git)}
\begin{frame}[fragile=singleslide]{Создание пакетов в системе контроля версий}
  \begin{itemize}
  \item Инструменты, помогающие управлять ветками и тегам вашей работы по созданию
пакетов:\\ \texttt{svn-buildpackage}, \texttt{git-buildpackage}
    \hbr
  \item Пример: \texttt{git-buildpackage}
    \begin{itemize}
    \item Ветка \texttt{upstream} для отслеживания основной ветки с тегами
\texttt{upstream/\textsl{version}}
    \item Ветка \texttt{master} отслеживает пакет Debian
    \item Теги \texttt{debian/\textsl{version}} для каждой загрузки
    \item Ветка \texttt{pristine-tar} для сборки tarball из основной ветки
    \end{itemize}
    Doc:
\url{http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.html}
    \hbr
  \item Поля \texttt{Vcs-*} в \texttt{debian/control} для определения репозитория
	  \begin{itemize}
		\item \url{https://wiki.debian.org/Salsa}
	\end{itemize}
\end{itemize}
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Vcs-Browser: https://salsa.debian.org/debian/devscripts
Vcs-Git: https://salsa.debian.org/debian/devscripts.git
  \end{lstlisting}
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Vcs-Browser: https://salsa.debian.org/perl-team/modules/packages/libwww-perl
Vcs-Git: https://salsa.debian.org/perl-team/modules/packages/libwww-perl.git
  \end{lstlisting}
  \begin{itemize}
  \item Интерфейс, независящий от системы контроля версий: \texttt{debcheckout},
\texttt{debcommit}, \texttt{debrelease}\\
    \begin{itemize}
	    \item     \texttt{debcheckout grep} $\rightarrow$ выгружает пакет с исходным кодом из
Git
    \end{itemize}
\end{itemize}
\end{frame}

\subsection{Обратный перенос пакетов}
\begin{frame}{Обратный перенос пакетов}
  \begin{itemize}
  \item Цель: использовать более новую версию пакета на старой системе\\ напр.,
использовать \textsl{mutt} из Debian \textsl{unstable} на Debian
\textsl{stable}
	\br
  \item Общая идея:
	  \begin{itemize}
		\item Взять пакет с исходным кодом из Debian unstable
		\hbr
		\item Изменить его так, чтобы он собирался и нормально работал в Debian stable
		\begin{itemize}
			\item Иногда тривиально (изменения не требуются)
			\item Иногда сложно
			\item Иногда невозможно (много недоступных зависимостей)
		\end{itemize}
	\end{itemize}
	\br
   \item Некоторые обратные переносы предоставляются и поддерживаются Проектом
Debian\\ \url{http://backports.debian.org/}
\end{itemize}
\end{frame}



\section{Сопровождение пакетов в Debian}
\subsection{Debian archive and suites}
\begin{frame}{Debian archive and suites}
  \begin{center}
	  \resizebox{\textwidth}{!}{
    \begin{tikzpicture}[
	    people/.style={shape=ellipse,draw,thick},
      suite/.style={shape=rectangle,draw},
	    devel/.style={fill=red!30!white},
	    test/.style={fill=orange!30!white},
	    prod/.style={fill=green!30!white,node distance=2cm},
	    internal/.style={},
	    old/.style={fill=gray!30!white},
	    veryold/.style={fill=gray!70!white},
      arr/.style={very thick},
	    uploads/.style={decorate,decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}},
	    migrations/.style={};
	    command/.style={text=rouge,font=\ttfamily},
	    legend/.style={font=\small}
	    ]
      
      \draw node[suite,prod] (sec) {security}; \draw node[suite,prod,right=of sec]
(su) {stable-updates}; \draw node[suite,prod,right=of su] (st) {stable};
\draw node[suite,old,node distance=0.3cm,below=of st] (os) {oldstable};
\draw node[suite,veryold,node distance=0.3cm,below=of os] (ar)
{archive.d.o}; \draw node[suite,prod,right=of st] (bp) {backports}; \draw
node[suite,test] (spu) at ($(su) + (-0.6,2.5)$) {stable-proposed-updates};
\draw node[suite,internal] (sn) at ($(st) + (-1.8,1.4)$) {stable-new}; \draw
node[suite,test,node distance=1.5cm,above=of st] (te) {testing}; \draw
node[suite,devel,above=of te] (sid) {unstable}; \draw node[suite,devel]
(exp) at ($(sid) + (2.5,0.5)$) {experimental}; \draw node[suite,devel] (tpu)
at ($(te)!0.5!(sid) + (2.5,0)$) {testing-proposed-updates}; \draw
node[people,above=of sid] (dd) {developer}; \draw node[people,node
distance=3cm,left=of dd] (secteam) {security team}; \draw[arr,uploads,->]
(dd) -- (sid); \draw[arr,uploads,->] (dd) -- (exp);
\draw[arr,uploads,->,bend right=8] (dd) to (tpu); \draw[arr,uploads,->]
(secteam) -- (sid); \draw[arr,uploads,->] (secteam) -- (sec);
\draw[arr,uploads,->] (dd) to (spu); \draw[arr,uploads,->] plot [smooth,
tension=0.75] coordinates { (dd.east) ($(exp.north east)+(0.1,0.1)$)
($(tpu.east)+(0.2,0)$)  ($(bp.north east) + (-0.4,0)$) };
\draw[arr,migrations,->] (tpu) -- (te); \draw[arr,migrations,->] (sid) --
(te); \draw[arr,migrations,->] (te) -- (st) node
[midway,align=left,midway,right,font=\footnotesize] {stable\\ release};
\draw[arr,migrations,->] (sec) -- (sn); \draw[arr,migrations,->] (sn) to
node [pos=0.2] (spulabel) {} (st); \draw
node[font=\footnotesize,align=right] at ($(spulabel) + (-0.4,-0.45)$)
{stable \\ point \\ release}; \draw[arr,migrations,->] (spu) to (sn);
\draw[arr,migrations,->] (spu) -- (su); \draw[arr,migrations,->] (st) --
(os); \draw[arr,migrations,->] (os) -- (ar); \coordinate (legend) at
(-2,-1); \draw[arr,uploads,->] (legend) -- ($(legend) + (0.7,0)$) node
[right,legend] {package uploads}; \coordinate[node distance=1.1em,below=of
legend] (legend2); \draw[arr,migrations,->] (legend2) -- ($(legend2) +
(0.7,0)$) node [right,legend] {package migrations between suites};
\coordinate[node distance=1.5em,below=of legend2] (legend3); \draw
node[right,suite,devel,legend] (ldev) at (legend3) {development}; \draw
node[node distance=0.1cm,right=of ldev,suite,test,legend] (ltest) {test};
\draw node[node distance=0.1cm,right=of ltest,suite,internal,legend] (lint)
{internal}; \draw node[node distance=0.1cm,right=of lint,suite,prod,legend]
(lprod) {production}; \draw ($(legend.north west) + (-0.1,0.25)$) rectangle
($(lprod.south east) + (0.1,-0.1)$); \draw
node[font=\bf,red!70!white,align=center] (tnext) at ($(te.east) + (2,-0.1)$)
{preparation of \\ next release}; \draw
node[font=\bf,green!70!black,align=center] (tsrm) at ($(sec.north east) +
(1,1)$) {stable\\release\\management}; \pgfdeclarelayer{background}
\pgfdeclarelayer{foreground} \pgfsetlayers{background,main,foreground}
\begin{pgfonlayer}{background}
	    \fill[red!10!white] plot [smooth cycle,tension=0.55] coordinates {
($(sid.north west) + (-0.1,0.1)$) ($(exp.north east)+(0.1,0.1)$)
($(tpu.south east)+(0.1,-0.1)$) ($(tnext.south) + (0.6,0)$) ($(te.south
west) + (0.1,-0.1)$)  }; \fill[green!10!white] plot [smooth
cycle,tension=0.55] coordinates { ($(spu.north west) + (-0.1,0.1)$)
($(spu.north east)+(0.1,0.1)$) ($(sn.north east)+(0.1,0.1)$) ($(st.north
east) + (0.1,0.5)$) ($(bp.north east) + (0.1,0.1)$)  ($(bp.south east) +
(0.1,-0.1)$) ($(sec.south west) + (-0.1,-0.1)$)  };
\end{pgfonlayer}

    \end{tikzpicture}
	  }
  \end{center}
	\begin{flushright}
		\tiny Based on graph by Antoine
Beaupr\'e. \url{https://salsa.debian.org/debian/package-cycle}~~~~~~~~~~~~
	\end{flushright}
\end{frame}

\begin{frame}{Suites for development}
		\begin{itemize}
			\item New versions of packages are uploaded to \textbf{unstable} (\textbf{sid})
				\hbr
			\item Packages migrate from \textbf{unstable} to \textbf{testing} based on several
criterias (e.g. has been in unstable for 10 days, and no regressions)
				\hbr
			\item New packages can also be uploaded to:
				\begin{itemize}
					\item \textbf{experimental} (for more \textsl{experimental} packages, such as when
the new version is not ready to replace the one currently in unstable)
						\hhbr
					\item \textbf{testing-proposed-updates}, to update the version in \textbf{testing}
without going through \textbf{unstable} (this is rarely used)
				\end{itemize}
		\end{itemize}
\end{frame}

\begin{frame}{Freezing and releasing}
	\begin{itemize}
					\item At some point during the release cycle, the release team decides to
\textsl{freeze} testing: automatic migrations from \textbf{unstable} to
\textbf{testing} are stopped, and replaced by manual review
						\br
		\item When the release team considers \textbf{testing} to be ready for release:
			\begin{itemize}
				\item The \textbf{testing} suite becomes the new \textbf{stable} suite
					\hhbr
				\item Similarly, the old \textbf{stable} becomes \textbf{oldstable}
					\hhbr
				\item Unsupported releases are moved to \texttt{archive.debian.org}
			\end{itemize}
			\br
		\item See \url{https://release.debian.org/}
	\end{itemize}
\end{frame}

\begin{frame}{Stable release suites and management}
	\begin{itemize}
		\item Several suites are used to provide stable release packages:
			\hhbr
			\begin{itemize}
				\item \textbf{stable}: the main suite
					\hbr
				\item \textbf{security} updates suite provided on \texttt{security.debian.org},
used by the security team. Updates are announced on the
\texttt{debian-security-announce} mailing list
					\hbr
				\item \textbf{stable-updates}: updates that are not security related, but that
should urgently be installed (without waiting for the next point release):
antivirus databases, timezone-related packages, etc. Announced on the
\texttt{debian-stable-announce} mailing list
					\hbr
				\item \textbf{backports}: new upstream versions, based on the version in
\textbf{testing}
			\end{itemize}
			\hbr
		\item The \textbf{stable} suite is updated every few months by \textsl{stable
point releases} (that include only bug fixes)
			\hhbr
			\begin{itemize}
				\item Packages targetting the next stable point release are uploaded to
\textbf{stable-proposed-updates} and reviewed by the release team
			\end{itemize}
			\hbr
		\item The \textbf{oldstable} release has the same set of suites
	\end{itemize}
\end{frame}

\subsection{Несколько способов внести вклад в Debian}
\begin{frame}{Несколько способов внести вклад в Debian}
  \begin{itemize}
  \item \textbf{Худший} способ участия:
    \begin{enumerate}
    \item Создать пакет для вашего собственного приложения
    \item Добавить его в Debian
    \item Исчезнуть
    \end{enumerate}
    \br
  \item \textbf{Лучшие} способы участия:
	  \begin{itemize}
		  \item Подключиться к работе команд по созданию пакетов
    \begin{itemize}
    \item Многие команды концентрируются на наборах пакетов, им нужна помощь
    \item Список доступен по адресу \url{https://wiki.debian.org/Teams}
    \item Отличный способ научиться у более опытных участников
    \end{itemize}
    \br
\item Усыновление существующих несопровождаемых пакетов (\textsl{осиротевших
пакетов})
    \br
  \item Привнести в Debian новое ПО
    \begin{itemize}
    \item Пожалуйста, только если оно достаточно интересно/полезно
    \item Существуют ли какие-либо альтернативы для которых уже созданы пакеты Debian?
    \end{itemize}
  \end{itemize}

  \end{itemize}
\end{frame}

\subsection{Усыновление осиротевших пакетов}
\begin{frame}{Усыновление осиротевших пакетов}
      \hbr
  \begin{itemize}
    \item В Debian много несопровождаемых пакетов
    \hbr
  \item Полный список + процесс: \url{https://www.debian.org/devel/wnpp/}
    \hbr
  \item Установлены на вашей машине: \texttt{wnpp-alert}\\ Или лучше:
\texttt{how-can-i-help}
    \hbr
  \item Различные состояния:
    \begin{itemize}
		    \small
    \item \textbf{O}rphaned (осиротевший): пакет не сопровождается\\ Усыновите его
      \hbr
    \item \textbf{RFA}: \textbf{R}equest \textbf{F}or \textbf{A}dopter (Требуется
усыновитель)\\ Сопровождающий ищет усыновителя, но пока продолжает
работать\\ Усыновите его. Обратитесь к текущему сопровождающему
      \hbr
    \item \textbf{ITA}: \textbf{I}ntent \textbf{T}o \textbf{A}dopt (Собираюсь
усыновить)\\ Кто-то намерен усыновить пакет\\ Помогите ему!
      \hbr
    \item \textbf{RFH}: \textbf{R}equest \textbf{F}or \textbf{H}elp (Запрос о
помощи)\\ Сопровождающий ищет помощь
    \end{itemize}
    \hbr
  \item Ряд несопровождаемых пакетов ещё не обнаружен \arr не осиротели
    \hbr
  \item Спрашивайте на \texttt{debian-qa@lists.debian.org} \\ или в
\texttt{\#debian-qa} на \texttt{irc.debian.org}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Усыновление пакета: пример}
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
From: You <you@yourdomain>
To: 640454@bugs.debian.org, control@bugs.debian.org
Cc: Francois Marier <francois@debian.org>
Subject: ITA: verbiste -- French conjugator

retitle 640454 ITA: verbiste -- French conjugator
owner 640454 !
thanks

Hi,

I am using verbiste and I am willing to take care of the package.

Cheers,

You
\end{lstlisting}

\begin{itemize}
\item Считается вежливым, если вы свяжитесь с предыдущим сопровождающим (особенно,
если пакет имеет статус RFA и пока не осиротел)
\item Хорошо бы связаться с проектом основной ветки разработки
\end{itemize}
\end{frame}

\subsection{Добавление в Debian вашего пакета}
\begin{frame}{Добавление в Debian вашего пакета}
\begin{itemize}
\item Для добавления вашего пакета в Debian вам не нужно иметь официальный статус
	\begin{enumerate}
		\item Отправьте \textbf{ITP} отчет (\textbf{I}ntent \textbf{T}o \textbf{P}ackage
(Намерен создать пакет)) при помощи \texttt{reportbug wnpp}
			\hbr
		\item Подготовьте пакет с исходным кодом
			\hbr
		\item Найдите разработчика Debian, который будет спонсировать ваш пакет
	\end{enumerate}
\br
\item Официальный статус (когда вы уже являетесь опытным сопровождающим пакетов):
	\begin{itemize}
		\item \textbf{Сопровождающий Debian (DM):}\\ Право на загрузку собственных
пакетов\\ См. \url{https://wiki.debian.org/DebianMaintainer}
			\hbr
		\item \textbf{Разработчик Debian (DD):}\\ Член Проекта Debian; может голосовать и
загружать любой пакет
	\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{Что проверить прежде чем просить о спонсорстве}
\begin{itemize}
	\item Debian обращает \textbf{большое внимание на качество}
\hbr
\item Обычно, \textbf{спонсоров сложно найти, и они заняты}
\begin{itemize}
\item До того, как просить о спонсорстве, убедитесь, что ваш пакет готов
\end{itemize}
\hbr
\item Что проверить:
\begin{itemize}
\item Избегайте отсутствующих зависимостей для сборки: убедитесь, что ваш пакет
нормально собирается в чистом \textsl{sid} \textsl{chroot}
\begin{itemize}
\item Рекомендуется использовать \texttt{pbuilder}
\end{itemize}
\hbr
\item Проверьте ваш пакет с помощью \texttt{lintian -EviIL +pedantic}
\begin{itemize}
\item Ошибки должны быть исправлены, все остальные проблемы тоже следует устранить
\end{itemize}
\hbr
\item Конечно, хорошенько протестируйте ваш пакет
\end{itemize}
\hbr
\item Если у вас возникли сомнения, попросите помощи
\end{itemize}
\end{frame}

\subsection{Где искать помощь?}
\begin{frame}{Где искать помощь?}
	\hbr
  Помощь, которая вам потребуется:
  \begin{itemize}
  \item Советы и ответы на вопросы, отзывы о коде
  \item Спонсирование ваших загрузок, когда ваш пакет будет готов
  \end{itemize}
  \hbr
  Вы можете получить помощь от:
  \begin{itemize}
	  \item \textbf{Других членов команды по созданию пакетов}
    \begin{itemize}
    \item Список команд: \url{https://wiki.debian.org/Teams}
    \end{itemize}
    \hbr
  \item \textbf{Группы наставников Debian} (если ваш пакет не подходит ни для одной
группы)
    \begin{itemize}
    \item \url{https://wiki.debian.org/DebianMentorsFaq}
    \item Список рассылки: \url{debian-mentors@lists.debian.org}\\ {\small (так же
хороший способ случайно чему-то научиться)}
    \item IRC: \texttt{\#debian-mentors} на \texttt{irc.debian.org}
    \item \url{http://mentors.debian.net/}
    \item Документация: \url{http://mentors.debian.net/intro-maintainers}
    \end{itemize}
    \hbr
  \item \textbf{Локализованные списки рассылки} (получите помощь на вашем языке)
    \begin{itemize}
  \item \texttt{debian-devel-\{french,italian,portuguese,spanish\}@lists.d.o}
  \item Полный список: \url{https://lists.debian.org/devel.html}
  \item Или пользовательские списки: \url{https://lists.debian.org/users.html}
  \end{itemize}
  \end{itemize}
\end{frame}

\subsection{Дополнительная документация}
\begin{frame}{Дополнительная документация}
  \begin{itemize}
  \item Уголок разработчика Debian\\ \url{https://www.debian.org/devel/}\\ {\small
Ссылки на множество ресурсов о разработке Debian}
    \hbr
  \item Guide for Debian Maintainers\\ 
\url{https://www.debian.org/doc/manuals/debmake-doc/}
    \hbr
  \item Справочник разработчика Debian\\ 
\url{https://www.debian.org/doc/developers-reference/}\\ {\small По большей
части о процедурах Debian, но также о некоторых лучших практиках создания
пакетов (часть 6)}
    \hbr
  \item Политика Debian\\ \url{https://www.debian.org/doc/debian-policy/}\\
    
    {\small \begin{itemize} \item \small Все требования, которые должен
выполнять всякий пакет \item \small Определяет политики для Perl, Java,
Python, \ldots \end{itemize}}
    \hbr
    
  \item Руководство по созданию пакетов Ubuntu\\ 
\url{https://packaging.ubuntu.com/html/}
  \end{itemize}
\end{frame}

\subsection{Панели Debian для сопровождающих}
\begin{frame}{Панели Debian для сопровождающих}
  \begin{itemize}
	  \item \textbf{Фокус на пакетах с исходным кодом}:
\url{https://tracker.debian.org/dpkg}
    \br
  \item \textbf{Фокус на сопровождающем/команде}: Обзор пакетов разработчика
(DDPO)\\ 
\url{https://qa.debian.org/developer.php?login=pkg-ruby-extras-maintainers@lists.alioth.debian.org}
    \br
  \item \textbf{Фокус на списке задач}: Панель сопровождающего Debian (DMD)\\ 
\url{https://udd.debian.org/dmd/}
  \end{itemize}
\end{frame}

\begin{frame}{Использование системы отслеживания ошибок (BTS)}
\begin{itemize}
\item Уникальный способ управления ошибками
\begin{itemize}
\item Веб-интерфейс для просмотра ошибок
\item Интерфейс электронной почты для изменения ошибок
\end{itemize}
\hbr
\item Добавление информации к ошибкам:
	\begin{itemize}
		\item Напишите на \texttt{123456@bugs.debian.org} (не включает отправителя ошибки,
вам нужно добавить \texttt{123456-submitter@bugs.debian.org})
	\end{itemize}
\hbr
\item Изменение статуса ошибки:
\begin{itemize}
\item Отправьте команды на \texttt{control@bugs.debian.org}
\item Интерфейс командной строки: команда \texttt{bts} в \texttt{devscripts}
\item Документация: \url{https://www.debian.org/Bugs/server-control}
\end{itemize}
\hbr
\item Отправка отчётов об ошибках: используйте \texttt{reportbug}
\begin{itemize}
\item Обычно используется с локальным почтовым сервером: install \texttt{ssmtp}
или \texttt{nullmailer}
\item Либо используйте \texttt{reportbug -\@-template}, затем отправьте (вручную)
по адресу \texttt{submit@bugs.debian.org}
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{Использование BTS: примеры}
\begin{itemize}
\item Отправка сообщения ошибке и приславшему эту ошибку:\\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822\#10}
\hbr
\item Отметка тегом и изменение серьёзности:\\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680227\#10}
\hbr
\item Переназначение, изменение серьёзности, изменение заголовка \ldots: \\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822\#93}
\begin{itemize}
	\item \texttt{notfound}, \texttt{found}, \texttt{notfixed}, \texttt{fixed} для
\textbf{version-tracking} \\ 
См. \url{https://wiki.debian.org/HowtoUseBTS\#Version\_tracking}
\end{itemize}
\hbr
\item Использование пользовательских тегов:
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=42;bug=642267}\\ 
См. \url{https://wiki.debian.org/bugs.debian.org/usertags}
\hbr
\item Документация по BTS:
\begin{itemize}
\item \url{https://www.debian.org/Bugs/}
\item \url{https://wiki.debian.org/HowtoUseBTS}
\end{itemize}
\end{itemize}
\end{frame}

\subsection{Больше заинтересованы в Ubuntu?}
\begin{frame}{Больше заинтересованы в Ubuntu?}
  \begin{itemize}
  \item В случае Ubuntu в основном обрабатываются расхождения с Debian
    \br
  \item Не фокусирует внимание на конкретных пакетах\\ Сотрудничает с командами
Debian
    \br
  \item Обычно рекомендуется загружать новые пакеты сначала в Debian\\ 
\url{https://wiki.ubuntu.com/UbuntuDevelopment/NewPackages}
    \br
  \item Вероятно, лучше:
    \begin{itemize}
    \item Принять участие в команде Debian и действовать в качестве моста с Ubuntu
      \hbr
    \item Помогать уменьшить расхождения, сортировать ошибки в Launchpad
      \hbr
    \item Вам могут помочь многие инструменты Debian:
      \begin{itemize}
      \item Колонка Ubuntu в обзоре пакетов для разработчика
      \item Бокс Ubuntu в системе отслеживания пакетов
      \item Получайте почту об ошибках от Launchpad через PTS
      \end{itemize}
    \end{itemize}
  \end{itemize}
\end{frame}

\section{Заключение}
\subsection{Заключение}
\begin{frame}{Заключение}
  \begin{itemize}
  \item Теперь у вас имеется полный обзор процесса создания пакетов Debian
    \br
  \item Но вам нужно ознакомиться с дополнительной документацией
    \br
  \item Лучшие практики эволюционировали на протяжении нескольких лет
    \begin{itemize}
    \item Если вы не уверены, используйте утилиту для создания пакетов \textbf{dh}, а
также формат \textbf{3.0 (quilt)}
    \end{itemize}
  \end{itemize}
  \vfill
  \centerline{\large Обратная связь: \textbf{packaging-tutorial@packages.debian.org}}
\end{frame}

\subsection{Правовые вопросы}
\begin{frame}{Правовые вопросы}

  Copyright \copyright 2011--2019 Лукас Нуссбаум -- lucas@debian.org
  \br

  {\small \textbf{This document is free software}: you can redistribute it
and/or modify it under either (at your option): \hbr \begin{itemize} \item
The terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.\\ \url{http://www.gnu.org/licenses/gpl.html} \br \item
The terms of the Creative Commons Attribution-ShareAlike 3.0 Unported
License.\\ \url{http://creativecommons.org/licenses/by-sa/3.0/}
\end{itemize} }
\end{frame}

\subsection{Принять участие в развитии этого руководства}
\begin{frame}{Принять участие в развитии этого руководства}
	\begin{itemize}
		\item Принять участие:
			\begin{itemize}
				\item{\small \texttt{apt-get source packaging-tutorial}}
					\hbr
				\item  {\small \texttt{debcheckout packaging-tutorial}}
					\hbr
				\item  {\small \texttt{git clone\\ 
https://salsa.debian.org/debian/packaging-tutorial.git}}
					\hbr
				\item {\small \url{https://salsa.debian.org/debian/packaging-tutorial}}
					\hbr
				\item {\small Открытые ошибки: \url{bugs.debian.org/src:packaging-tutorial}}
			\end{itemize}
			\br
		\item Обратная связь:
			\begin{itemize}
				\item \href{mailto:packaging-tutorial@packages.debian.org}{\textbf{\texttt{mailto:packaging-tutorial@packages.debian.org}}}
				\begin{itemize}
					\item{\small Что следует добавить в это руководство?}
				\item {\small Что следует улучшить?}
				\end{itemize}
					\hbr
				\item{\small \texttt{reportbug packaging-tutorial}}
			\end{itemize}
	\end{itemize}
\end{frame}

\section{Дополнительные практические задания}

\subsection{Практика 2: создание пакета GNUjump}
\begin{frame}{Практика 2: создание пакета GNUjump}
	\begin{enumerate}
		\item Загрузите GNUjump 1.0.8 по адресу
\url{http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
			\br
		\item Создайте для него пакет Debian
			\begin{itemize}
				\item Установите зависимости для сборки, чтобы вы смогли собрать пакет
				\item Исправьте ошибки
				\item Получите простой работающий пакет
				\item Закончите заполнение \texttt{debian/control} и других файлов
			\end{itemize}
			\br
		\item Наслаждайтесь
	\end{enumerate}
\centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
\end{frame}

\begin{frame}[fragile=singleslide]{Практика 2: создание пакета GNUjump (подсказки)}
	\begin{itemize}
		\item Для получения базового работающего пакета используйте команду:
\texttt{dh\_make}
		\item Создать пакет с исходным кодом формата \textsl{1.0} проще, чем формат
\textsl{3.0 (quilt)} (измените формат в \texttt{debian/source/format})
		\item Для поиска отсутствующих сборочных зависимостей, определите отсутствующий
файл, а затем используйте \texttt{apt-file} для того, чтобы найти
отсутствующий пакет
		\item Если вы столкнулись со следующей ошибкой:
\begin{lstlisting}[basicstyle=\ttfamily\tiny]
/usr/bin/ld: SDL_rotozoom.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:376: recipe for target 'gnujump' failed
\end{lstlisting}
			вам следует добавить \texttt{-lm} в строку с командой вызова компоновщика:\\ 
Отредактируйте \texttt{src/Makefile.am} и замените
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
					на
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
				Затем запустите \texttt{autoreconf -i}
	\end{itemize}
\end{frame}

\subsection{Практика 3: создание пакета библиотеки Java}
\begin{frame}{Практика 3: создание пакета библиотеки Java}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Java:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Java}
      \hbr
		\item \url{https://wiki.debian.org/Java/Packaging}
      \hbr
		\item \url{https://www.debian.org/doc/packaging-manuals/java-policy/}
      \hbr
		\item \texttt{/usr/share/doc/javahelper/tutorial.txt.gz}
		\end{itemize}
		\br
	\item Загрузите IRClib по адресу \url{http://moepii.sourceforge.net/}
		\br
	\item Создайте пакет
\end{enumerate}
\end{frame}

\subsection{Практика 4: создание пакета с gem-пакетом Ruby}
\begin{frame}{Практика 4: создание пакета с gem-пакетом Ruby}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Ruby:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby/Packaging}
      \hbr
		\item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (in the \texttt{gem2deb} package)
		\end{itemize}
		\hbr
	\item Создайте простой Debian пакет с исходным кодом из \texttt{peach} gem:\\ 
\texttt{gem2deb peach}
	\hbr
	\item Улучшите его так, чтобы он стал правильным пакетом Debian
\end{enumerate}
\end{frame}

\subsection{Практика 5: создание пакета с модулем Perl}
\begin{frame}[fragile=singleslide]{Практика 5: создание пакета с модулем Perl}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Perl:\\
		\begin{itemize}
		\item \url{https://perl-team.pages.debian.net}
      \hbr
		\item \url{https://wiki.debian.org/Teams/DebianPerlGroup}
      \hbr
		\item \texttt{dh-make-perl(1)}, \texttt{dpt(1)} (in the \texttt{pkg-perl-tools}
package)
		\end{itemize}
		\hbr
	\item Создайте простой Debian пакет с исходным кодом из \texttt{Acme} CPAN:\\ 
\verb|dh-make-perl --cpan Acme|
	\hbr
	\item Улучшите его так, чтобы он стал правильным пакетом Debian
\end{enumerate}
\end{frame}

\section{Ответы на практические задания}

\begin{frame}
	\begin{center}
		\LARGE Ответы на\\[0.5em] практические задания
	\end{center}
\end{frame}


\subsection{Практика 1: изменение пакета grep}

\begin{frame}{Практика 1: изменение пакета grep}
\begin{enumerate}
  \item Перейдите по адресу \url{http://ftp.debian.org/debian/pool/main/g/grep/} и
загрузите версию 2.12-2 пакета

	\item Посмотрите файлы в \texttt{debian/}.
		\begin{itemize}
			\item 		Сколько двоичных пакетов создаётся этим пакетом?
			\item 		Какая утилита для создания пакетов используется?
		\end{itemize}
    \hbr
	\item Соберите пакет
    \hbr
	\item Мы собираемся изменить пакет. Добавьте запись в журнал изменений и увеличьте
номер версии.
    \hbr
	\item Теперь отключите поддержку регулярных выражений Perl (perl-regexp) (это
опция \texttt{./configure})
    \hbr
	\item Соберите пакет заново
    \hbr
	\item Сравните оригинальный и новый пакеты с помощью debdiff
    \hbr
	\item Установите собранный заново пакет
\end{enumerate}
\end{frame}

\begin{frame}{Загрузка исходного кода}
\begin{enumerate}
  \item Перейдите по адресу \url{http://ftp.debian.org/debian/pool/main/g/grep/} и
загрузите версию 2.12-2 пакета
\end{enumerate}
\begin{itemize}
	\item Используйте dget для загрузки файла \texttt{.dsc}:\\ {\small \texttt{dget
http://cdn.debian.net/debian/pool/main/g/grep/grep\_2.12-2.dsc}}
		\hbr
	\item If you have \texttt{deb-src} for a Debian release that has \texttt{grep}
version 2.12-2 (find out on \url{https://tracker.debian.org/grep}), you can
use: \texttt{apt-get source grep=2.12-2}\\ or \texttt{apt-get source
grep/release} (e.g. \texttt{grep/stable})\\ or, if you feel lucky:
\texttt{apt-get source grep}
	\hbr
	\item Пакет с исходным кодом \texttt{grep} содержит три файла:
		\begin{itemize}
			\item \texttt{grep\_2.12-2.dsc}
			\item \texttt{grep\_2.12-2.debian.tar.bz2}
			\item \texttt{grep\_2.12.orig.tar.bz2}
		\end{itemize}
		Это обычный формат "3.0 (quilt)".
	\hbr
\item Если это необходимо, распакуйте исходный код при помощи\\ 
\texttt{dpkg-source -x grep\_2.12-2.dsc}
\end{itemize}
\end{frame}

\begin{frame}{Осматриваем и собираем пакет}
	\begin{enumerate}
			\setcounter{enumi}{1}
	\item Look at the files in \texttt{debian/}
		\begin{itemize}
			\item 		Сколько двоичных пакетов создаётся этим пакетом?
			\item 		Какая утилита для создания пакетов используется?
		\end{itemize}
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item Согласно \texttt{debian/control}, этот пакет создаёт только один двоичный
пакет, а именно \texttt{grep}.
			\hbr
		\item Согласно \texttt{debian/rules}, этот пакет представляет собой типичный пакет
для \textsl{классического} debhelper, без использования \textsl{CDBS} или
\textsl{dh}. Можно видеть различные вызовы команд \texttt{dh\_*} в
\texttt{debian/rules}.
	\end{itemize}
	\hbr
	\begin{enumerate}
			\setcounter{enumi}{2}

		\item Соберите пакет
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item Используйте \texttt{apt-get build-dep grep} для загрузки сборочных
зависимостей
		\item Далее, \texttt{debuild} или \texttt{dpkg-buildpackage -us -uc} (Занимает 1
минуту)
	\end{itemize}
\end{frame}

\begin{frame}{Редактирование журнала изменений}
	\begin{enumerate}
			\setcounter{enumi}{3}

	\item Мы собираемся изменить пакет. Добавьте запись в журнал изменений и увеличьте
номер версии.
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item \texttt{debian/changelog} является текстовым файлом. Можно отредактировать
его и добавить новую запись вручную.
	\hbr
		\item Либо можно использовать \texttt{dch -i}, который добавит запись и откроет
редактор
	\hbr
		\item Имя и адрес электронной почты могут быть определены при помощи переменных
окружения \texttt{DEBFULLNAME} и \texttt{DEBEMAIL}
	\hbr
		\item После этого соберите пакет заново: будет собрана новая версия пакета
	\hbr
		\item Присвоение версий пакетам описывается в разделе 5.6.12 Политики Debian\\ 
\url{https://www.debian.org/doc/debian-policy/ch-controlfields}
	\end{itemize}
\end{frame}

\begin{frame}{Отключение регулярных выражений Perl}
	\begin{enumerate}
			\setcounter{enumi}{4}

	\item Теперь отключите поддержку регулярных выражений Perl (perl-regexp) (это
опция \texttt{./configure})
	\item Соберите пакет заново
	\end{enumerate}
	\hbr
	\begin{itemize}
	  \item Посмотрите \texttt{./configure -{}-help}: опция для отключения регулярных
выражений Perl -- \texttt{-{}-disable-perl-regexp}
	\hbr
		\item Откройте для редактирования \texttt{debian/rules} и найдите строку
\texttt{./configure}
	\hbr
		\item Добавьте \texttt{-{}-disable-perl-regexp}
	\hbr
		\item Соберите заново при помощи \texttt{debuild} или \texttt{dpkg-buildpackage
-us -uc}
	\end{itemize}
\end{frame}

\begin{frame}{Сравнение и тестирование пакетов}
	\begin{enumerate}
			\setcounter{enumi}{6}

	\item Сравните оригинальный и новый пакеты с помощью debdiff
	\item Установите собранный заново пакет
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item Сравните двоичные пакеты: \texttt{debdiff ../*changes}
	\hbr
		\item Сравните пакеты с исходным кодом: \texttt{debdiff ../*dsc}
	\hbr
		\item Установите заново собранный пакет: \texttt{debi}\\ Или \texttt{dpkg -i
../grep\_<TAB>}
	\hbr
		\item \texttt{grep -P foo} больше не работает!
	\end{itemize}
\br
Переустановите предыдущую версию пакета:
\begin{itemize}
	\item \texttt{apt-get install -{}-reinstall grep=2.6.3-3} \textit{(= предыдущая
версия)}
\end{itemize}
\end{frame}

\subsection{Практика 2: создание пакета GNUjump}
\begin{frame}{Практика 2: создание пакета GNUjump}
\begin{enumerate}
	\item Загрузите GNUjump 1.0.8 по адресу
\url{http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
		\br
	\item Создайте для него пакет Debian
		\begin{itemize}
			\item Установите зависимости для сборки, чтобы вы смогли собрать пакет
			\item Получите простой работающий пакет
			\item Закончите заполнение \texttt{debian/control} и других файлов
		\end{itemize}
		\br
	\item Наслаждайтесь
\end{enumerate}
\centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots}
\begin{itemize}
	\item \texttt{wget http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
		\hbr
	\item \texttt{mv gnujump-1.0.8.tar.gz gnujump\_1.0.8.orig.tar.gz}
		\hbr
	\item \texttt{tar xf gnujump\_1.0.8.orig.tar.gz}
		\hbr
	\item \texttt{cd gnujump-1.0.8/}
		\hbr
	\item \texttt{dh\_make -f ../gnujump-1.0.8.tar.gz}
	\begin{itemize}
		\item \small Тип пакета: один двоичный (сейчас)
	\end{itemize}
\end{itemize}
\begin{lstlisting}[basicstyle=\ttfamily\small]
gnujump-1.0.8$ ls debian/
changelog           gnujump.default.ex   preinst.ex
compat              gnujump.doc-base.EX  prerm.ex
control             init.d.ex            README.Debian
copyright           manpage.1.ex         README.source
docs                manpage.sgml.ex      rules
emacsen-install.ex  manpage.xml.ex       source
emacsen-remove.ex   menu.ex              watch.ex
emacsen-startup.ex  postinst.ex
gnujump.cron.d.ex   postrm.ex
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (2)}
\begin{itemize}
	\item Посмотрите \texttt{debian/changelog}, \texttt{debian/rules},
\texttt{debian/control}\\ (заполняются автоматически при помощи
\textbf{dh\_make})
		\hbr
	\item В \texttt{debian/control}:\\ \texttt{Build-Depends: debhelper (>= 7.0.50~),
autotools-dev}\\ Приведён список \textsl{сборочных зависимостей} = пакетов,
необходимых для сборки пакета
		\hbr
	\item Попробуйте собрать пакет как есть с помощью \texttt{debuild} (используя
магию \textbf{dh})
		\begin{itemize}
			\item Добавляйте сборочные зависимости, пока он не будет собираться
			\item Подсказка: используйте \texttt{apt-cache search} и \texttt{apt-file}, чтобы
найти пакеты
			\item Пример:
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
checking for sdl-config... no
checking for SDL - version >= 1.2.0... no
[...]
configure: error: *** SDL version 1.2.0 not found!
\end{lstlisting}
$\rightarrow$ Добавьте \textbf{libsdl1.2-dev} в поле Build-Depends и
установите этот пакет.
		\hbr
	\item Лучше: используйте \textbf{pbuilder} для сборки в чистом окружении
		\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (3)}
	\begin{itemize}
		\item Требуются следюущие сборочные зависимости: \texttt{libsdl1.2-dev,
libsdl-image1.2-dev, libsdl-mixer1.2-dev}

		\item Далее, скорее всего вы столкнётесь с другой ошибкой:
	\end{itemize}
	\begin{lstlisting}[basicstyle=\ttfamily\tiny]
	/usr/bin/ld: SDL_rotozoom.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
	//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
	collect2: error: ld returned 1 exit status
	Makefile:376: recipe for target 'gnujump' failed
	\end{lstlisting}
	\begin{itemize}
		\item Эта проблема вызвана bitrot: gnujump не был настроен в соответствии с
изменениями компоновщика.
		\item Если вы используете формат исходного кода версии \textbf{1.0}, вы можете
напрямую изменять исходный код основной ветки разработки.
			\begin{itemize}
				\item Отредактируйте \texttt{src/Makefile.am} и замените
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
					на
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
				\item Затем запустите \texttt{autoreconf -i}
			\end{itemize}
	\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (4)}
\begin{itemize}
	\item Если вы используете формат исходного кода версии \textbf{3.0 (quilt)}, то
используйте \texttt{quilt} для создания
заплаты. (См. \url{https://wiki.debian.org/UsingQuilt})
\begin{itemize}
\item \texttt{export QUILT\_PATCHES=debian/patches}
\item \texttt{mkdir debian/patches}\\ \texttt{quilt new linker-fixes.patch}\\ 
\texttt{quilt add src/Makefile.am}\\
\hbr
\item Отредактируйте \texttt{src/Makefile.am} и замените
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
на
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
\hbr
\item \texttt{quilt refresh}
	\hbr
	\item Поскольку \texttt{src/Makefile.am} был изменён, во время сборки следует
вызвать autoreconf. Чтобы сделать это автоматически с помощью \texttt{dh},
измените вызов \texttt{dh} в \texttt{debian/rules} с \texttt{dh \$\@
-{}-with autotools-dev}\\ на \texttt{dh \$\@ -{}-with autotools-dev -{}-with
autoreconf}
		\hbr
\end{itemize}
\end{itemize}
\end{frame}


\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (5)}
\begin{itemize}
	\item Теперь сборка пакета должена завершаться корректно.
		\hbr
	\item Используйте \texttt{debc} для получения списка содержимого созданного пакета
и \texttt{debi} для его установки и тестирования.
		\hbr
	\item Протестируйте пакет при помощи \texttt{lintian}
		\begin{itemize}
			\item Хотя это не является строгим требованием, рекомендуется, чтобы пакеты,
загружаемые в Debian были \textsl{lintian-clean}
		\hbr
			\item Дополнительные проблемы могут быть просмотрены при помощи \texttt{lintian
-EviIL +pedantic}
		\hbr
			\item Несколько подсказок:
				\begin{itemize}
					\item Удалите ненужные вам файлы в \texttt{debian/}
		\hbr
					\item Заполните \texttt{debian/control}
						\hbr
					\item Установите выполняемые файлы в \texttt{/usr/games}, изменив
\texttt{dh\_auto\_configure}
		\hbr
					\item Используйте флаги \textsl{hardening} компилятора для увеличения
безопасности.\\ См. \url{https://wiki.debian.org/Hardening}
				\end{itemize}
		\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{Шаг за шагом\ldots (6)}
		\begin{itemize}
	\item Сравните ваш пакет с пакетом в Debian:
		\begin{itemize}
			\item Это выделит файлы с данными во второй пакет, который одинаков для всех
архитектур ($\rightarrow$ сохраняет место в архиве Debian)
				\hbr
			\item Это установит файл .desktop (для меню GNOME/KDE), а также интегрирует в меню
Debian
				\hbr
			\item Это исправит несколько небольших проблем при использовании заплат
		\end{itemize}
\end{itemize}
\end{frame}

\subsection{Практика 3: создание пакета библиотеки Java}
\begin{frame}{Практика 3: создание пакета библиотеки Java}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Java:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Java}
      \hbr
		\item \url{https://wiki.debian.org/Java/Packaging}
      \hbr
		\item \url{https://www.debian.org/doc/packaging-manuals/java-policy/}
      \hbr
		\item \texttt{/usr/share/doc/javahelper/tutorial.txt.gz}
		\end{itemize}
		\br
	\item Загрузите IRClib по адресу \url{http://moepii.sourceforge.net/}
		\br
	\item Создайте пакет
\end{enumerate}
\end{frame}

\begin{frame}{Шаг за шагом\ldots}
\begin{itemize}
	\item \texttt{apt-get install javahelper}
		\hbr
	\item Создайте простой пакет с исходным кодом: \texttt{jh\_makepkg}
		\begin{itemize}
			\item Библиотека
			\item Нет
			\item Свободный компилятор/время выполнения по умолчанию
		\end{itemize}
		\hbr
	\item Посмотрите и исправьте \texttt{debian/*}
		\hbr
	\item \texttt{dpkg-buildpackage -us -uc} или \texttt{debuild}
		\hbr
	\item \texttt{lintian}, \texttt{debc} и т.д.
		\hbr
	\item Сравните ваш результат с пакетом с исходным кодом \texttt{libirclib-java}
\end{itemize}
\end{frame}

\subsection{Практика 4: создание пакета с gem-пакетом Ruby}
\begin{frame}{Практика 4: создание пакета с gem-пакетом Ruby}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Ruby:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby/Packaging}
      \hbr
		\item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (in the \texttt{gem2deb} package)
		\end{itemize}
		\hbr
	\item Создайте простой Debian пакет с исходным кодом из \texttt{peach} gem:\\ 
\texttt{gem2deb peach}
	\hbr
	\item Улучшите его так, чтобы он стал правильным пакетом Debian
\end{enumerate}
\end{frame}

\begin{frame}{Шаг за шагом\ldots}
\texttt{gem2deb peach}:
\begin{itemize}
\item Загрузите gem-пакет с rubygems.org
\item Создаёт подходящий архив .orig.tar.gz, и распаковывает его
\item Инициализирует пакет Debian с исходным кодом на основе метаданных gem-пакета
	\begin{itemize}
		\item Имеет имя \texttt{ruby-\textsl{имя\_gem}}
	\end{itemize}
\item Пытается собрать двоичных пакет Debian (это может не сработать)
\end{itemize}
\br
\texttt{dh\_ruby} (включён в \textsl{gem2deb}) выполняет специфичные для
Ruby задачи:
\begin{itemize}
	\item Собирает расширения C для каждой версии Ruby
	\item Копирует файлы в их каталоги назначения
	\item Обновляет shebang-и в исполняемых сценариях
	\item Запускает тесты, определённые в \texttt{debian/ruby-tests.rb},
\texttt{debian/ruby-tests.rake} или \texttt{debian/ruby-test-files.yaml}, а
также другие проверки
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (2)}
Улучшить созданный пакет:
\begin{itemize}
	\item Запустите \texttt{debclean} для очистки дерева исходного кода. Посмотрите
\texttt{debian/}.
		\hbr
	\item \texttt{changelog} и \texttt{compat} должны быть верны
		\hbr
	\item Отредактируйте \texttt{debian/control}: улучшите \texttt{Description}
		\hbr
	\item Напишите правильный файл \texttt{copyright} на основе файлов из основной
ветки разработки
		\hbr
	\item Соберите пакет
		\hbr
	\item Сравните ваш пакет с пакетом \texttt{ruby-peach} в архиве Debian
\end{itemize}
\end{frame}

\subsection{Практика 5: создание пакета с модулем Perl}
\begin{frame}[fragile=singleslide]{Практика 5: создание пакета с модулем Perl}
\begin{enumerate}
	\item Просмотрите документацию о создании пакетов Perl:\\
		\begin{itemize}
		\item \url{https://perl-team.pages.debian.net}
      \hbr
		\item \url{https://wiki.debian.org/Teams/DebianPerlGroup}
      \hbr
		\item \texttt{dh-make-perl(1)}, \texttt{dpt(1)} (in the \texttt{pkg-perl-tools}
package)
		\end{itemize}
		\hbr
	\item Создайте простой Debian пакет с исходным кодом из \texttt{Acme} CPAN:\\ 
\verb|dh-make-perl --cpan Acme|
	\hbr
	\item Улучшите его так, чтобы он стал правильным пакетом Debian
\end{enumerate}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots}
\verb|dh-make-perl --cpan Acme|:
\begin{itemize}
\item Загрузите tarball с CPAN
\item Создаёт подходящий архив .orig.tar.gz и распаковывает его
\item Инициализирует пакет Debian с исходным кодом на основе метаданных
дистрибутива
	\begin{itemize}
		\item Имеет имя \texttt{lib\textsl{distname}-perl}
	\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{Шаг за шагом\ldots (2)}
Улучшить созданный пакет:
\begin{itemize}
	\item \texttt{debian/changelog}, \texttt{debian/compat},
\texttt{debian/libacme-perl.docs} и \texttt{debian/watch} должны быть
правильными
		\hbr
	\item Отредактируйте \texttt{debian/control}: улучшите \texttt{Description} и
удалите шаблон снизу
		\hbr
	\item Отредактируйте \texttt{debian/copyright}: удалите шаблон сверху, добавьте
годы действия авторского права в строку \texttt{Files:\hspace{0.3em}*}
\end{itemize}
\end{frame}

\end{document}
