<!doctype debiandoc system>

<debiandoc>

<book>

<titlepag>
   <title>Руководство начинающего разработчика Debian</title>

   <author>Josip Rodin <email>jrodin@jagor.srce.hr</email></author>
   <author>Перевод: Михаил Соболев, <email>mss@transas.com</email></author>
   <author>Перевод: Алексей Выскубов, <email>alexey@pepper.spb.ru</email></author>

   <version>версия 0.97 от 27 сентября 1999 года.</version>

   <copyright>
   <copyrightsummary>Copyright &copy; 1998, 1999 Josip Rodin.</copyrightsummary>

   <p>This document may used under the terms of any fully DFSG compliant
   license, preferably GNU General Public License version 2+.

   <p>With permission of their authors, I have used and modified portions
   of these two documents:

   <p>Making a Debian Package (AKA the Debmake Manual), copyright &copy;
   1997 Jaldhar Vyas <email>jaldhar@debian.org</email>.

   <p>The New-Maintainer's Debian Packaging Howto, copyright &copy; 1997
   Will Lowe <email>lowe@debian.org</email>.
   </copyright>

</titlepag>

<toc sect>

<chapt id="start">Getting started &laquo;The Right Way&raquo;

<p>Этот документ описывает процесс создания пакетов для Debian GNU/Linux.  В этом руководстве мы
пытаемся следовать римской поговорке <em>Longum iter est per preaecepta, breve et efficax per
exempla!</em> (It's a long way by the rules, but short and efficient with examples!).

<p>Одна из сильных, по сравнению с другими дистрибутивами, сторон Debian GNU/Linux &mdash; это
система управления пакетами.  Несмотря на то, что для Debian уже существует очень много пакетов,
может случиться так, что вам понадобится установить программу, для которой не существует
соответствующего пакета.  Это может заставить вас задуматься как вам создать свой собственный
пакет. :)  Да, вам понадобятся некоторые знания о программировании под Unix, но ни в коем случае
вы не обязаны быть гуру.

<sect id="needprogs">Программы, которые вам понадобятся

<p>Сначала вы должны убедиться, что все необходимые для работы пакеты установлены (это можно сделать
при помощи программы <manref name="dpkg" section="8"> (например, &lsquo;dpkg -i <var>имя
пакет</var>&rsquo;) или при помощи одной из программ <prgn>dselect</prgn> или <prgn>apt</prgn>).  На
момент написания этого документа официальной стабильной версией был выпуск 2.1
(&lsquo;slink&rsquo;), а выпуск 2.2 (&lsquo;potato&rsquo;) только создавался.  Поэтому большинство
пакетов, упомянутых здесь, взяты из &lsquo;potato&rsquo;.

<p>Нижеперечисленные пакеты пакеты присутствуют в стандартной поставке Debian 2.1, что означает, что
скорее всего они уже установлены на вашей машине.  Несмотря на это, мы рекомендуем вам при помощи
команды &lsquo;dpkg -s <var>имя-пакета</var>&rsquo; проверить, что они установлены.

<taglist>
    <tag><package>binutils</package>
    <item>Программы, входящие в этот пакет, позволяют работать с объектными файлами &mdash;
    файлы, из которых &laquo;собираются&raquo; программы. (см. &lsquo;info binutils&rsquo;)

    <tag><package>cpp</package>
    <item>Препроцессор языка C. (см. <manref name="cpp" section="1">)

    <tag><package>cpio</package>
    <item>Программа архивирования, как, например, <prgn>tar</prgn> или <prgn>zip</prgn>. (см.
    <manref name="cpio" section="1">)

    <tag><package>dpkg-dev</package>
    <item>Этот пакет содержит все утилиты, необходимые для распаковки, создания и загрузки исходных
    пакетов Debian.  В этом же пакете находятся &laquo;Руководство по созданию пакетов&raquo;
    (packaging) и &laquo;Руководство по внутреннему устройству программ из пакета
    <package>dpkg</package>&raquo;.  (см. <manref name="dpkg-source" section="1">)

    <tag><package>file</package>
    <item>Эта полезная программа позволяет определить тип файла.  (см. <manref name="file" section="1">)

    <tag><package>fileutils</package>
    <item>Основные утилиты Linux, например, <prgn>ls</prgn>, <prgn>chmod</prgn>, <prgn>rm</prgn> и
    другие.  (см. &lsquo;info --file /usr/info/fileutils.info.gz&rsquo;)

    <tag><package>gcc</package>
    <item>Компилятор языка C от GNU. Большинство программ Linux написаны на языке C. Однако если
    ваша программа написана на каком-то другом языке программирования, например, C++, Fortran,
    Pascal, и другм, вы должны установить соответствующий пакет (соответственно <package>g++</package>,
    <package>g77</package>, <package>gpc</package> или другой).  (см. <manref name="gcc"
    section="1">, <manref name="g++" section="1">, <manref name="g77" section="1">, <manref
    name="gpc" section="1">)

    <tag><package>libc6-dev</package>
    <item>Библиотека языка C и файлы заголовков, необходимые программе <prgn>gcc</prgn>.  Несмотря
    на то, что некоторые программы все еще рекомендуют и/или используют libc5, мы рекомендуем вам
    использовать новую версию (libc6).  (см. &lsquo;info libc&rsquo;)

    <tag><package>make</package>
    <item>Обычно создание программы состоит из нескольких шагов, которые необходимо выполнять в
    определенном порядке.  Вместо того, чтобы вводить одни и те же команды снова и снова, вы можете
    воспользоваться этой программой для автоматизации всего процесса.  В некоторых случаях следует
    использовать утилиты <prgn>imake</prgn> и <prgn>xmkmf</prgn> (они позволяют создавать
    make-файлы из файлов специального вида).  Многие современные программы создают сценарий
    <file>configure</file> и make-файлы при помощи утилит <prgn>autoconf</prgn> и
    <prgn>automake</prgn>, поэтому вам также могут понадобиться эти утилиты (см. &lsquo;info
    make&rsquo;, <manref name="imake" section="1">, <manref name="xmkmf" section="1">, <manref
    name="autoconf" section="1">, <manref name="automake" section="1">).

    <tag><package>patch</package>
    <item>Эта очень полезная программа изменяет исходный файл в соответствии со списком различий
    между файлами, полученным при помощи программы <prgn>diff</prgn> (см. <manref name="patch"
    section="1">).

    <tag><package>perl5-5.005</package>
    <item>Perl &mdash; один из наиболее используемых интерпретируемых языков в Un*x-системах.  Его
    часто называют &ldquo;Unix's Swiss Army Chainsaw&rdquo; (Универсальная пила) (см. <manref
    name="perl" section="1">).
</taglist>

<p>Из раздела devel вам могут понадобиться следующие пакеты:<taglist>
    <tag><package>dh-make</package>
    <tag><package>debhelper</package>
    <item>Программа <prgn>dh_make</prgn> необходима для создания скелета будущего пакета.  При этом
    в получающихся управляющих файлах будут использованы программы из пакета
    <package>debhelper</package>.  При создании пакетов вовсе не обязательно использовать эти
    программы, но мы <em>очень</em> рекомендуем их начинающим разработчикам.  Они позволяют сильно
    упростить процесс создания и поддержки пакетов (см. <manref name="dh_make" section="1">, <manref
    name="debhelper" section="1">, <file>/usr/share/doc/debhelper/README</file>).

    <tag><package>devscripts</package>
    <item>Этот пакет содержит несколько простых и полезных, но не являющихся необходимыми для
    создания пакетов, сценариев (см. <file>/usr/share/doc/devscripts/README.gz</file>).

    <tag><package>fakeroot</package>
    <item>Эта утилита позволит вам создавать пакеты, не пользуясь привилегиями (которые необходимы
    на некоторых этапах) пользователя root (см. <manref name="fakeroot" section="1">).

    <tag><package>lintian</package>
    <item>Эта программа предназначена для проверки пакетов. Она позволяет убедиться, что при
    создании пакетане было допущено ни одной из &laquo;стандартных&raquo; ошибок (см. <manref
    name="lintian" section="1">, <file>/usr/share/doc/lintian/lintian.html/index.html</file>).
</taglist>

<p>И, наконец, вам следует установить <em>очень важные</em> пакеты из раздела doc:<taglist>
    <tag><package>debian-policy</package>
    <item>Этот пакет содержит описание структуры архива, разнообразных моментов, связанных с
    построением операционной системы, &laquo;Стандарт иерархии файловой системы&raquo;.  Также (что
    для вас важнее всего) пакет содержит требования, которым должен удовлетворять пакет Debian,
    для того, чтобы он мог быть включен в дистрибутив (см.
    <file>/usr/share/doc/debian-policy/policy.html/index.html</file>).

    <tag><package>developers-reference</package>
    <item>Данный пакет содержит информацию для разработчика пакетов, не относящуюся непосредственно
    к техническим вопросам создания пакетов. В частности, вы найдете здесь информацию о структуре
    архивап, о том, как переименовываь пакеты, как переводить пакеты в &laquo;брошенное&raquo;
    <comment editor="Alexey Vyskubov"><p>:-)</p></comment> состояние, как начать поддержку
    &laquo;брошенного&raquo; пакета, как обновление пакета может быть произведено не его
    разработчиком, как работать с ошибками в пакетах, когда и как обновлять пакеты и т.п.  (см.
    <file>/usr/share/doc/developers-reference/developers-reference.html/index.html</file>).

    <tag><package>packaging-manual</package>
    <item>Здесь вы найдете описание технических вопросов создания двоичных пакетов и пакетов с
    исходными текстами (см. <file>/usr/share/doc/packaging-manual/packaging.html/index.html</file>).
</taglist>

<p>Вам также понадобится (для создания цифровой подписи к пакету) программа зашифрования &mdash;
либо PGP (пакеты <package>pgp-*</package>), либо GPG (пакет <package>gnupg</package>).  Это особенно
важно, если вы хотите предоставлять ваш пакет другим людям (вне всякого сомнения, вы будете делать
это после того, как ваша работа будет включена в дистрибутив Debian).  Однако, в силу несколько
странного экспортного законодательства США, вы не можете загрузить необходимые программы
зашифрования с ближайшего зеркала Debian.  Несмотря на это, Debian предоставляет эти пакеты через
сервер, физически находящийся в стране, отличной от США, и называемый <url name="non-US.debian.org"
id="ftp://non-us.debian.org/debian-non-US/">.  На вашем зеркале вы можете найти файл
<file>README.non-US</file>, который описывает как вы можете найти ближайшее зеркало этого сервера.

<p>Перед началом работы над созданием пакета мы рекомендуем вам прочитать документация на все
программы, которые вы будете использовать.  Это может сначала показаться излишеством, но потом вы
будете <em>очень</em> рады, что прислушались к нашему совету&hellip;

<p><em>Внимание:</em> Пакет <package>debmake</package> содержит программы, аналогичные по
функциональности программам, входящим в пакет <package>dh-make</package>.  К сожалению, описание
пакета <package>debmake</package> <strong>не приводится</strong> в этом документе.  Вы можете найти
дополнительную информацию на странице <url name="the Debmake manual"
id="http://www.debian.org/~jaldhar/">.

<sect id="otherinfo">Прочая информация

<p>Вы можете создавать пакеты двух типов: двоичные пакеты и пакеты с исходными текстами.  Последние
содержат код, который позволяет скомпилировать программу и создать пакет.  Двоичные пакеты содержат
только скомпилированную программу.  Пожалуйста, не путайте исходные тексты программы и пакет с
исходными текстами.

<p>Debian использует термин <em>сопровождающий</em> либо <em>разработчик пакета</em> (maintainer)
для человека, который создает пакеты, <em>автор</em> (author) для человека, который создал
программу, и <em>активный автор</em> (upstream maintainer) для человека, осуществляющего работу над
программой в настоящий момент времени.  Обычно автор и активный автор являются одним и тем же
человеком (а иногда тот же человек выступает и в роли сопровождающего).  Если вы создали программу и
хотите, чтобы ее включили в Debian, вы можете сделать это, подав соответствующее заявление.

<p>Для того, чтобы ваш пакет попал в следующий выпуск Debian (почему бы и нет, если программа полезна?), вы
должны стать официальным разработчиком Debian.  Этот процесс описан в &laquo;Руководстве
разработчика&raquo;.  Пожалуйста, прочитайте этот документ.

<chapt id="first">Первые шаги

<p>Так как на страницах <url name="Уголок разработчика"
id="http://www.debian.org/devel/"> нет недостаточно четкой информации о том, где и как новые разработчики
должны начинать свою работу, ниже мы попытаемся объяснить каждый (что может показаться излишним)
шажок и помочь вам создать первый пакет, что позволит вам получить некий опыт для создания
последующих пакетов.

<sect id="choose">Выберите программу

<p>При выборе пакета, над которым вы собираетесь работать, вы должны иметь в виду следующие
моменты:<list>
    <item>проверьте существует ли данный пакет в дистрибутиве.  Если вы используете
    &lsquo;стабильный&rsquo; выпуск, лучше всего будет посетить страницу <url name="Поиск пакетов"
    id="http://www.debian.org/distrib/packages.html">.  Если же вы используете
    <strong>текущий</strong> &lsquo;нестабильный&rsquo; выпуск, для проверки лучше использовать
    следующие команды:
<example>
  dpkg -s название_программы
  dpkg -l '*название_программы*'
</example>

    <item>Посмотрите в списке <url name="Будущие и требующие работы пакеты"
    id="http://www.debian.org/doc/prospective-packages.html"> и архивах списка рассылки debian-devel
    &mdash; не работает ли уже кто-нибудь над этим пакетом.  Если работа уже ведется, но вы
    действительно хотите работать над этим же пакетом, свяжитесь с текущим разработчиком.  Если же
    не против создания другого пакета, поищите другую интересную программу, над которой еще никто не
    работает.

    <item>Пакет должен содержать программу.  Не пытайтесь пока создавать пакеты для библиотек.</item>

    <item>У программы <strong>обязательно</strong> должна быть лицензия.  Желательно, чтобы она
    позволяла квалифицировать данную программу как свободно распространяемую в соответствии с <url
    name="Debian Free Software Guidelines"
    id="http://www.debian.org/social_contract.html#guidelines">.  Если лицензия не соответствует
    каким-либо пунктам этих правил, вы все равно можете включить ваш пакет в один из разделов
    &lsquo;contrib&rsquo; или &lsquo;non-free&rsquo;.  Если вы не уверены, в какой раздел данный
    пакет должен быть помещен, спросите в списке рассылки
    <email>debian-legal@lists.debian.org</email>.</item>

    <item>Программа <strong>не должна</strong> требовать режима setuid root, а еще лучше &mdash;
    вообще не требовать режима доступа setuid или setgid.</item>

    <item>Программа не должна быть демоном или чем-то, что должно быть помещено в каталоги
    <file>*/sbin</file>.</item>

    <item>Программа должна быть хорошо документирована или, по крайней мере, понятна (всем).</item>

    <item>Вы должны связаться с авторами программы, чтобы убедиться, что они не против создания
    пакета с их программой.  Возможность консультироваться с авторами программы по поводу тех или
    иных моментов обычно очень важна, поэтому лучше не пытайтесь создавать пакеты для
    неподдерживаемых программ.</item>

    <item>И, наконец, программа должна использоваться вами в течение некоторого времени, чтобы вы
    могли быть уверены, что она работает.</item>
</list>

<p>Разумеется, все перечисленное &mdash; это всего лишь меры безопасности, которые спасут вас от
разъяренных пользователей, если вы сделали что-то не так в ftp-демоне&hellip;  Как только вы
приобретете определенный опыт, вы сможете создавать любые пакеты &mdash; но помните, что даже
опытные разработчики, если у них есть какие-то сомнения, обращаются за помощью в список рассылки
debian-devel.  Подписчики этого списка рассылки всегда рады помочь.

<p>Дополнительную информацию вы можете найти в &laquo;Руководстве разработчика&raquo;.

<sect id="getsrc">Возьмите программу и попробуйте ее

<p>Итак, первое, что вы должны сделать &mdash; это найти и загрузить исходные тексты программы.
Скорее всего, у вас уже есть исходные тексты, которые вы взяли с домашней странички автора.
Исходные тексты программ для Linux обычно предоставляются в виде архива в формате tar-gzip, имеют
расширение <file>.tar.gz</file> (или <file>.tgz</file>).  Внутри архива обычно находится каталог
<var>программа</var>-<var>версия</var>,в котором находятся все файлы исходных текстов програмы.  Если
исходные тексты выбранной вами программы поставляются в другом виде (например, имя файла
оканчивается на <file>.Z</file> или <file>.zip</file>), распакуйте его соответствующими средствами
или спросите в списке рассылки debian-mentors, если вы не знаете как это правильно сделать
(подсказка: выполните команду &lsquo;file <var>архив.расширение</var>&rsquo;).

<p>Для примера мы будем использовать программу &lsquo;gentoo&rsquo; &mdash; менеджер файлов для X11,
использующий библиотеку GTK+. Заметьте, что для этой программы уже создан пакет и он постоянно
обновляется.

<p>В каталоге <file>/usr/local/src</file> создайте подкаталог с именем, соответствующем названию
вашей программы (<file>/usr/local/src/gentoo</file> в нашем примере).  Поместите загруженный архив в
этот каталог и распакуйте его при помощи команды &lsquo;tar -xzf gentoo-0.9.12.tar.gz&rsquo;. Этот
процесс может занять значительное время, но ничего не выведет на экран (разве что возникнут
какие-нибудь ошибки; в этом случае вы должны попытаться загрузить этот архив еще раз и проверить
действительно ли это tar-gzip-архив).  В результате вы получите подкаталог
<file>gentoo-0.9.12</file> в текущем каталоге (<file>/usr/local/src/gentoo</file>), а в этом
подкаталоге &mdash; исходные тексты программы

<p>Перейдите в этот каталог и <strong>внимательно</strong> прочитайте имеющуюся информацию.
Обычно полезными оказываются файлы <file>README*</file>, <file>INSTALL*</file>, <file>*.lsm</file> и
<file>*.html</file>.  Здесь вы найдете инструкции, которые позволят вам правильно скомпилировать и
установить программу (скорее всего в каталог <file>/usr/local/bin</file>).

<p>Дальнейшая последовательность действий будет зависеть от конкртной программы. Однако современные
программы обычно поставляются со сценарием <prgn>configure</prgn>, который позволяет получить
параметры, необходимые для компиляции программы в вашей системе (также производится проверка, что в
вашей системе компиляция данной программы вообще возможна). После настройки (выполните команду
&lsquo;./configure&rsquo;) вы можете скомпилировать вашу программу при помощи команды
&lsquo;make&rsquo;, а затем установить ее при помощи команды &lsquo;make install&rsquo;.

<p>Итак, скомпилируйте программу, установите ее и попробуйте ее запустить, чтобы убедиться, что она
правильно работает и ничто другое не было испорчено.

<sect id="naming">Перед запуском программы <prgn>dh_make</prgn>

<p>Для того, чтобы правильно построить программу, вы должны поместить исходные тексты программы в
каталог <var>название пакета</var>-<var>версия</var>.  Как вы видите, исходные тексты программы
<prgn>gentoo</prgn> уже находятся в каталоге с правильным именем.  Возможно, для вашей программы
придется делать что-то специальное.  Убедитесь, что название каталога содержит буквы только нижнего
регистра.  Если название состоит из больше, чем одного слова, попробуйте сократить его или создать
какую-нибудь аббревиатуру<footnote>Я не совсем понимаю, зачем это может понадобится. <em>Прим.
переводчика</em>.</footnote>.  Например, если название программы &ldquo;John's little editor for
X&rdquo;, название пакета может быть <package>johnledx</package>, <package>jle4x</package> или
что-нибудь, что вам покажется подходящим.  Мы рекомендуем не превышать длину в 15 символов в
названии пакета.

<p>Вам также необходимо знать точную версию программы (эта информация будет использована в версии
пакета).  Если программа нумеруется не как X.Y.Z, а датой, вы можете использовать эту дату,
приписав перед ней &ldquo;0.0.&rdquo; (на всякий случай, вдруг когда-нибудь авторы программы решать
выпустить версию 1.0).  Таким образом, если программа была выпущена 19-го декабря 1999 года, вы
можете указать 0.0.19981219 в качестве версии.  Версии некоторых программ вообще никак не
нумеруются.  В таком случае мы рекомендуем вам связаться с авторами программы и выяснить, не
используют ли они какую-нибудь другую схему отслеживания версий.

<sect id="dh_make">Запуск программы <prgn>dh_make</prgn>

<p>Перейдите в каталог, в котором находятся исходные тексты программы и выполните команду

<example>
  dh_make -e ваш@электронный.адрес
</example>

<p>Разумеется, вы должны заменить <var>ваш@электронный.адрес</var> на ваш реальный адрес, который
будет использован в различных служебных файлах пакета (<file>debian/changelog</file>,
<file>debian/control</file>, &hellip;).

<p>Теперь от вас понадобится дополнительная информация. Вы должны указать тип пакета, который вы
собираетесь создать. В случае программы <prgn>gentoo</prgn> мы хотим создать один пакет, содержащий
программу (single binary package), поэтому мы выберем первый пункт, нажав на клавишу
&lsquo;s&rsquo;.  Проверьте информацию, выведенную на экран и, если все правильно, нажмите на
клавишу Enter.  Так как для вас это первый пакет, мы не рекомендуем вам создавать проект,
позволяющий построить сразу несколько пакетов (multi-binary package), или проект, содержащий
библиотеку.

<p>Помните, что вам необходимо запускать программу <prgn>dh_make</prgn> <strong>только один
раз</strong>.  Если вы попытаетесь запустить ее еще раз, она может сработать неправильно.  Это также
означает, что для создания новой версии пакета, вы должны использовать другой подход.  Это описано
позже.

<chapt id="modify">Изменение исходных текстов

<p>После того, как программа <prgn>dh_make</prgn> закончит свою работу, а вы внесли необходимые
изменения в файл <file>Makefile</file>, вы можете выполнить команду &lsquo;cd ..&rsquo; и увидеть,
что был создан новый каталог с именем <file>gentoo-0.9.12.orig</file>.  В этом каталоге находятся
оригинальные файлы, которые должны оставаться неизменными.  Каталог <file>gentoo-0.9.12</file> также
присутствует и именно здесь вы должны производить все свои изменения.

<p>Обычно программы устанавливаются в каталог <file>/usr/local</file>.  Пакеты, входящие в состав
Debian, не должны использовать этот каталог, поскольку он зарезервирован для системного
администратора (или пользователей).  Это означает, что вы обязательно должны посмотреть на
содержимое файла <file>Makefile</file>.  В этом файле (для подробной информации см.  <manref
name="make" section="1">) находятся команды, позволяющие автоматизировать процесс построения данной
программы.  Подробно об этом файле мы говорим в <ref id="rules">.

<p>Мы не можем охватить <em>все</em> проблемы, с которыми вы можете столкнуться, но все-таки мы
попытались перечислить те из них, с которыми вы, скорее всего, столкнетесь.

<sect id="destdir">Установка в необходимый каталог

<p>В большинстве случаев, программы устанавливаются в существующую иерархию каталогов вашей системы
таким образом, чтобы исполняемый файл попал в один из каталогов, указанных в переменной среды $PATH,
а файлы документации и страницы Руководства оказываются в стандартных местах.  Вы должны убедиться,
что операция установки выполняется правильно, но при этом вы должны сделать так, чтобы все
необходимые файлы могли быть установлены во временный каталог, который будет создан в каталоге
<file>debian/</file> (обычно этот временный каталог называется <file>debian/tmp</file>), это
позволит стандартным программам разработчика построить результирующий пакет.  Все, что находится в
этом временном каталоге, появится в системе пользователя при установке вашего пакета.  Единственное
отличие состоит в том, что программа <prgn>dpkg</prgn> будет устанавливать эти файлы по отношению к
корневому каталогу.

<p>Вообще говоря, вам нужно установить программу в каталог <file>debian/tmp</file>, но при этом она
должна себя правильно вести, если ее поместить в корневой каталог, то есть, если установить пакет.
Если процесс построения использует программы <prgn>GNU autoconf</prgn>, то программа
<prgn>dh_make</prgn> добавит необходимые команды с тем, чтобы необходимое действие выполнялось
автоматически, а вы можете пропустить данный раздел.  В других случаях вам, скорее всего,
понадобится просмотреть и поправить <prgn>make</prgn>-файлы.

<p>Вот, например, соответствующая часть файла <file>Makefile</file> программы
<prgn>gentoo</prgn><footnote>Комментарии в файле <file>Makefile</file> были тоже переведены.
<em>Прим. переводчика</em></footnote>:

<example>
  # Куда поместить исполняемые файлы по команде 'make install'?
  BIN     = /usr/local/bin
  # Куда поместить значки по команде 'make install'? Внимание: если вы
  # поменяете это значение, при старте программа gentoo может не найти
  # этих значков.  Вам придется поменять значение параметра 'путь к значкам'
  # (в окне настроек страничка "Пути").
  ICONS   = /usr/local/lib/gentoo/
</example>

<p>Прежде всего вы должны добавить две строчки, которые говорят:

<example>
  # Добавлено для Debian GNU/Linux.
  DESTDIR =
</example>

так как процесс построения требует что-то подобное (об этом позже).

<p>В файле <file>Makefile</file> был указан каталог, куда будет установлена программа.  Вам
необходимо заменить ту строчку на:

<example>
  # Куда поместить исполняемые файлы по команде 'make install'?
  BIN     = $(DESTDIR)/usr/X11R6/bin
</example>

<p>Вы можете спросить &laquo;почему в этот каталог, а не в какой-нибудь другой?&raquo;  Потому что
существуют определенные правила, говорящие куда должны быть установлены программы.  Об этом можно
почитать в стандарте &laquo;Иерархии файловой системы&raquo; (см.
<file>/usr/share/doc/debian-policy/fhs/</file>).  Поэтому мы должны устанавливать программу в каталог
<file>/usr/X11R6/bin</file> вместо каталога <file>/usr/local/bin</file>, а страницу Руководства (в
нашем случае она отсутствует, но так как для большинства программ они существуют, мы создадим ее
позже) в каталог <file>/usr/share/man/man1</file>, а не в каталог <file>/usr/local/man/man1</file>.

<p>Следующий шаг несколько сложнее.  Если вы произведете следующее изменение:

<example>
  ICONS   = $(DESTDIR)/usr/share/gentoo/
</example>

что соответствует стандарту, вам придется изменить исходные тексты программы.  Но где и что искать?
Вы можете попробовать выполнить команду:

<example>
  grep -n usr/local/lib *.[ch]
</example>

(ее нужно выполнить в каждом каталоге, в котором присутствуют файлы с расширением <file>.c</file>
или <file>.h</file>).  Программа <prgn>grep</prgn> выведет названия файлов и номера строк, в которых
присутствует &lsquo;usr/local/lib&rsquo;.  Теперь измените в этих строчках
&lsquo;usr/local/lib&rsquo; на &lsquo;usr/share&rsquo; &mdash; и готово.  Только будьте внимательны
и не измените что-нибудь другое, особенно, если вы не слишком много знаете о программировании на
языке C. :-)

<p>Теперь вам нужно найти цель &lsquo;install&rsquo; (поищите в файле <file>Makefile</file> строчку,
содержащую &lsquo;install:&rsquo;) и переименуйте все ссылки на каталоги, не использующие
переменные, описанные в начале файла.  В нашем случае, мы несколько улучшим то, что было.  Если
раньше было:

<example>
  # ----------------------------------------- Установка

  # Для того, чтобы выполнить это, вы должны иметь права пользователя root!
  install:        gentoo-target
                  install ./gentoo $(BIN)
                  install icons $(ICONS)
                  install gentoorc-example $(HOME)/.gentoorc
</example>

<p>После необходимого изменения, он будет выглядеть так:

<example>
  # ----------------------------------------- Установка

  # Для того, чтобы выполнить это, вы должны иметь права пользователя root!
  install:        gentoo-target
                  install -d $(BIN) $(ICONS) $(DESTDIR)/etc
                  install ./gentoo $(BIN)
                  install -m644 icons/* $(ICONS)
                  install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
                  install -d $(DESTDIR)/usr/share/doc/gentoo/html
                  cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
</example>

<p>Внимательный читатель заметит, что мы поменяли &lsquo;gentoo&rsquo; на
&lsquo;gentoo-target&rsquo; в строчке, где указано &lsquo;install:&rsquo;. Это называется
исправлением ошибки. :-)

<p>Каждый раз, когда вы вносите изменения, не связанные непосредственно с созданием пакета Debian,
обязательно отправьте их авторам программы с тем, чтобы они могли быть включены в следующий выпуск
программы.

<sect id="nolibs">Проблемы с библиотеками

<p>Существует общая проблема: библиотеки обычно различаются на разных платформах.  Например, файл
<file>Makefile</file> может содержать ссылки на библиотеки, которые недоступны в Debian.  В этом
случае вы должны попытаться попробовать заменить библиотеку, служащую тем же самым целям, но уже
присутствующую в Debian.  Наилучший способ &mdash; это попробовать закоментировать (<em>не
удалять!</em>) строки, содержащие такие библиотеки (возможно, сообщения об ошибках помогут вам
разобраться с тем, как можно разрешить эту проблему).

<p>То есть, если в вашем файле <file>Makefile</file> присутствует строка, похожая на эту (а программа
не компилируется):

<example>
  LIBS = -lcurses -lчто-то -lчто-то-еще
</example>

<p>Попробуйте заменить ее на такую строчку (и, возможно, все заработает):

<example>
  LIBS = -lncurses -lsomething -lsomethingelse
  #LIBS = -lcurses -lsomething -lsomethingelse
</example>

<chapt id="crules">Файлы <file>debian/control</file> и <file>debian/rules</file>

<p>В каталоге <file>gentoo-0.9.12</file> появился новый подкаталог &mdash; <file>debian</file>, в
котором есть несколько файлов.  Эти файлы определяют поведение пакета.  Наиболее важные из них
&mdash; это файлы <file>control</file> и <file>rules</file>.

<sect id="control">Файл <file>control</file>

<p>Этот файл содержит информацию, которая используется программами <prgn>dpkg</prgn> и
<prgn>dselect</prgn> (а также другими) для работы c пакетами.  Вот, например, файл
<file>control</file>, который был создан программой <prgn>dh_make</prgn>.

<example>
  1  Source: gentoo
  2  Section: unknown
  3  Priority: optional
  4  Maintainer: Josip Rodin &lt;jrodin@jagor.srce.hr&gt;
  5  Standards-Version: 3.0.1
  6
  7  Package: gentoo
  8  Architecture: any
  9  Depends: ${shlibs:Depends}
 10  Description: &lt;insert up to 60 chars description&gt;
 11  &lt;insert long description, indented with spaces&gt;
</example>

(номера строк добавлены)

<p>Строки 1-5 представляют собой управляющую информацию для пакета, содержащего исходные тексты, где
строка 1 &mdash; его название.

<p>Строка 2 &mdash; это название раздела, к которому относится данный пакет.  Как, возможно, вы уже
заметили, Debian разбит на несколько разделов: раздел main (основной) содержит свободное программное
обеспечение, non-free (не-свободное) содержит пакеты, которые не совсем отвечают определению
свободного программного обеспечения, и contib, где находятся пакеты, которые, являясь свободным
программным обеспечением, зависят от не-свободного программного обесепеченя.  В каждом разделе
существуют логические подразделы, определяющие что пакет из данного подраздела делает.  Таким
образом, существует раздел &lsquo;admin&rsquo;, где находятся программы администрирования, раздел
&lsquo;base&rsquo; &mdash; для основных пакетов, раздел &lsquo;devel&rsquo; содержит инструменты
разработки программного обеспечения, &lsquo;doc&rsquo; &mdash; документацию, &lsquo;libs&rsquo;
&mdash; библиотеки, &lsquo;mail&rsquo; &mdash; почтовых сервером и программ чтения почты,
&lsquo;net&rsquo; &mdash; для сетевых приложений, &lsquo;x11&rsquo; &mdash; программ, работающих под
X Window System, и много много других.

<p>В нашем случае мы должны указать &lsquo;x11&rsquo;.

<p>В строке 3 мы должны указать, насколько важен данный пакет.  Значения полей <tt>Section</tt> и
<tt>Priority</tt> пока используется только программой <prgn>dselect</prgn>, которая позволяет
пользователю сортировать по значениям этих полей, они также могут (и, скорее всего, будут) замещены
сопровождающими ftp-сервер. Документ &laquo;Policy Manual&raquo; подробно описывает, чем нужно
руководствоваться при выборе значений для этих полей.

<p>В нашем случае мы оставим значение этого поля равным &lsquo;optional&rsquo;.

<p>В строке 4 указано имя и адрес разработчика пакета.

<p>Строка 5 &mdash; это версия документа &laquo;Debian Policy&raquo;, стандартам которого следует
данный пакет (две основные версии пакета <package>debian-policy</package>).

<p>В строке 7 указано имя двоичного пакета.

<p>В строке 8 указана архитектура процессора, для которого был скомпилирован двоичный пакет.  Мы
можем оставить в качестве значения &lsquo;any&rsquo;, так как программа <manref
name="dpkg-gencontrol" section="1"> поместит в это поле значение, соответствующее процессору машины,
на которой компилировался пакет (см. в &laquo;Руководстве разработчика&raquo; объяснение понятия
&lsquo;перенос пакета&rsquo;).

<p>Одна из самых полезных возможностей системы управления пакетами Debian приведена в строке 9.
Пакеты могут зависеть друг от друга различным образом.  Помимо зависимости <tt>Depends</tt>,
существуют также зависимости <tt>Recommends</tt>, <tt>Suggests</tt>, <tt>Pre-Depends</tt>,
<tt>Conflicts</tt>, <tt>Provides</tt>, и <tt>Replaces</tt> .

<p>Программы управления пакетами (такие как <prgn>dpkg</prgn>, <prgn>dselect</prgn> или
<prgn>apt</prgn>) обычно одинаковым образом обрабатывают эти зависимости. Мы попытались дать
объяснение тем случаям, когда поведение различается.  (см. <manref name="dpkg" section="8">, <manref
name="dselect" section="8">, <manref name="apt" section="8">, <manref name="console-apt"
section="8">, <manref name="gnome-apt" section="8">)

<p>Ниже приведено описание того, что означает каждый тип зависимости:<taglist>
    <tag><tt>Depends</tt></tag>
    <item>Данный пакет не может быть установлен, если пакеты, указанные в списке зависимостей
    <tt>Depends</tt>, также установлены. Используйте этот тип зависимости, если ваша программа
    гарантировано не будет работать (или вызовет какие-нибудь серьезные проблемы), если
    соответствующий пакет не установлен.</item>

    <tag><tt>Recommends</tt></tag>
    <item>Программа <prgn>dselect</prgn> не установит ваш пакет, если пакеты, указанные в списке
    зависимостей <tt>Recommends</tt>, не установлены.  Однако программы <prgn>dpkg</prgn> и
    <prgn>apt-get</prgn> должны позволить сделать это.  Используйте данный тип зависимостей для
    пакетов, которые бы не использовались вместе с вашим пакетом только в <em>нестандартных</em>
    случаях.</item>

    <tag><tt>Suggests</tt>
    <item>Когда пользователь устанавливает ваш пакет, программа <prgn>dselect</prgn> предложит ему
    также установить пакеты, перечисленные в списке зависимостей <tt>Suggests</tt>.  Программы
    <prgn>dpkg</prgn> и <prgn>apt</prgn> этого делать не будут.  Используйте данный тип зависимостей
    для пакетов, которые могут расширить функциональность вашего пакета, и, таким образом, увеличить
    его полезность.</item>

    <tag><tt>Pre-Depends</tt>
    <item>Данный тип зависимостей строже, чем зависимости типа <tt>Depends</tt>.  Данный пакет не
    будет установлен, если пакеты, указанные в списке зависимостей <tt>Pre-Depends</tt>, уже не
    установлены или <em>не настроены</em>.  Используйте этот тип зависимостей <strong>очень</strong>
    скупо и только после обсуждения в списке рассылки debian-devel.  Другими словами, не используйте
    его никогда! :-)</item>

    <tag><tt>Conflicts</tt>
    <item>Данный пакет не будет установлен пока пакеты, перечисленные в списке зависимостей
    <tt>Conflicts</tt>, не удалены из системы.</item>

    <tag><tt>Provides</tt>
    <item>В случае, когда для какого-то типа пакетов существуют несколько альтернатив, вводятся так
    называемый <em>виртуальные</em> пакеты.  Полный список виртуальных пакетов приведен в файле
    <file>/usr/share/doc/debian-policy/virtual-package-names-list.text.gz</file>.  Вы должны
    использовать данный тип зависимостей, если ваша программа реализует функциональность
    существующего виртуального пакета.</item>

    <tag><tt>Replaces</tt>
    <item>Используйте данный тип зависимостей в случае, когда ваш пакет заменяет файлы из другого
    пакета, или же полностью заменяет другой пакет (в этом случае, вы должны использовать также
    зависимость типа <tt>Conflicts:</tt>).  Тогда файлы из указанного пакета будут удалены перед
    установкой вашего.</item>
</taglist>

<p>Формат этих полей одинаков: это список имен пакетов, разделенных запятой.  Здесь также могут быть
указаны списки имен альтернативных пакетов, разделенных вертикальной чертой <tt>|</tt>.  Для каждого
пакета в списке вы можете ограничить допустимость указанного пакета по версии.  Версии указываются в
круглых скобках после имени пакета и должны состоять из символа сравнения, за которым следует номер
версии.  Допустимыми символами сравнения являются: <tt>&lt;&lt;</tt>, <tt>&lt;=</tt>, <tt>=</tt>,
<tt>&gt;=</tt>, и <tt>&gt;&gt;</tt> для &ldquo;строго раньше чем&rdquo;, &ldquo;раньше или
равно&rdquo;, &ldquo;в точности равно&rdquo;, &ldquo;равно или позже&rdquo; и &ldquo;строго позже
чем&rdquo; соответственно.

<p>Последнее, что мы хотели бы здесь показать, это $(shlibs:Depends).  Данная конструкция позволяет
программе <manref name="dh_shlibdeps" section="1"> (см. позже) заполнить данное поле названиями
пакетов разделяемых библиотек &mdash; например, <package>libc6</package> или
<package>xlib6g</package> &mdash; которыми пользуется ваша программа.  Таким образом, вы можете их
не указывать.  В нашем случае, мы оставляем строку 9 так как она есть.

<p>Мы добавим строчку (которая станет строкой номер 10) со списком зависимостей типа
<tt>Suggest</tt>.  Здесь мы (пока только) укажем пакет <package>file</package> так как мы можем
использовать некоторые из возможностей предоставляемых данным пакетом.

<p>Строка 11 &mdash; это короткое описание.  У большинства людей ширина экрана составляет 80
колонок, поэтому мы рекомендуем вам не превышать этот предел.  Здесь мы напишем &ldquo;A fully GUI
configurable GTK+ file manager&rdquo;.

<p>В строке 12 мы укажем длинное (более полное) описание пакета.  В первой колонке должен быть
пробел.  Пустых строк не должно быть.  Если вам необходимо поместить в описание пустую строку,
поместите после пробела (!) символ &lsquo;.&rsquo; (точка).  После описания не должно быть
больше одной пустой строки.

<p>Вот обновленный файл <file>control</file>:

<example>
  1  Source: gentoo
  2  Section: x11
  3  Priority: optional
  4  Maintainer: Josip Rodin &lt;jrodin@jagor.srce.hr&gt;
  5  Standards-Version: 3.0.1
  6
  7  Package: gentoo
  8  Architecture: any
  9  Depends: ${shlibs:Depends}
 10  Suggests: file
 11  Description: A fully GUI configurable GTK+ file manager
 12   gentoo is a file manager for Linux written from scratch in pure C. It
 13   uses the GTK+ toolkit for all of its interface needs. gentoo provides
 14   100% GUI configurability; no need to edit config files by hand and re-
 15   start the program. gentoo supports identifying the type of various
 16   files (using extension, regular expressions, or the 'file' command),
 17   and can display files of different types with different colors and icons.
 18   .
 19   gentoo borrows some of its look and feel from the classic Amiga file
 20   manager "Directory OPUS" (written by Jonathan Potter).
</example>

(номера строк добавлены)

<sect id="rules">Файл <file>rules</file>

<p>Теперь вернемся в каталог <file>debian</file> и взглянем на файл <file>rules</file>, который
используется программой <manref name="dpkg-buildpackage" section="1"> для создания пакета.  Обычно
это просто еще один управляющий файл для программы <prgn>make</prgn>.  Только он отличается от того,
что предлагается вместе с исходными текстами.

<p>Каждый файл <file>rules</file>, как и любой другой <file>Makefile</file>, содержит правила,
определяющие как необходимо выполнять те или иные действия.  Правила состоят из имени цели, имен
файлов, и названий действий, которые необходимо выполнить (например, &lsquo;build:&rsquo; или
&lsquo;install:&rsquo;).  Правила, которые вы хотите выполнить, должны быть указаны в командной
строке (например, &lsquo;rules build&rsquo; или &lsquo;rules install&rsquo;).  После имени цели вы
можете указать имя другой цели, название программы или файла, от которых зависит данная цель.  Затем
вы можете указать произвольной количество команд (первым символом в строке с командой должен быть
символ табуляции!), пустая строка завершает правило<footnote>Если я не ошибаюсь, то правило
завершается при нахождении названия следующей цели. <em>Прим. переводчика</em></footnote>
Комментарии начинаются с символа диеза (&lsquo;#&rsquo;) и идут до конца строки.  Вы можете
обращаться к правилам либо из других правил, либо из командной строки &lsquo;debian/rules
clean&rsquo;).

<p>Возможное недопонимание должно уйти, после того, как вы посмотрите на содержимое файла
<file>rules</file>, который был создан программой <prgn>dh_make</prgn>. Вы также должны прочитать
документацию к программе <prgn>make</prgn>.

<example>
  1  #!/usr/bin/make -f
  2  # Made with the aid of dh_make, by Craig Small
  3  # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
  4  # Some lines taken from debmake, by Christoph Lameter.
  5
  6  # Uncomment this to turn on verbose mode.
  7  #export DH_VERBOSE=1
  8
  9  build: build-stamp
 10  build-stamp:
 11 	dh_testdir
 12 
 13 
 14 	# Add here commands to compile the package.
 15 	$(MAKE)
 16 
 17 	touch build-stamp
 18 
 19  clean:
 20 	dh_testdir
 21 	dh_testroot
 22 	rm -f build-stamp install-stamp
 23 
 24 	# Add here commands to clean up after the build process.
 25 	-$(MAKE) clean
 26 
 27 	dh_clean
 28 
 29  install: install-stamp
 30  install-stamp: build-stamp
 31 	dh_testdir
 32 	dh_testroot
 33 	dh_clean -k
 34 	dh_installdirs
 35 
 36 	# Add here commands to install the package into debian/tmp.
 37 	$(MAKE) install DESTDIR=`pwd`/debian/tmp
 38 
 39 	touch install-stamp
 40 
 41  # Build architecture-independent files here.
 42  binary-indep: build install
 43  # We have nothing to do by default.
 44 
 45  # Build architecture-dependent files here.
 46  binary-arch: build install
 47  #	dh_testversion
 48 	dh_testdir
 49 	dh_testroot
 50 	dh_installdocs
 51 	dh_installexamples
 52 	dh_installmenu
 53  #	dh_installemacsen
 54  #	dh_installinit
 55 	dh_installcron
 56 	dh_installmanpages
 57  #	dh_undocumented
 58 	dh_installchangelogs
 59 	dh_strip
 60 	dh_compress
 61 	dh_fixperms
 62 	dh_suidregister
 63 	dh_installdeb
 64 	dh_shlibdeps
 65 	dh_gencontrol
 66  #	dh_makeshlibs
 67 	dh_md5sums
 68 	dh_builddeb
 69 
 70  source diff:
 71 	@echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
 72 
 73  binary: binary-indep binary-arch
 74  .PHONY: build clean binary-indep binary-arch binary
</example>

(номера строк добавлены)

<p>Скорее всего, вы уже знакомы с форматом строки 1.  Такая строка означает, что данный файл должен
обрабатываться программой <prgn>make</prgn>.  Пустые строчки игнорируются, строки, начинающиеся с
символа диез (&lsquo;#&rsquo;), являются комментариями и также игнорируются.

<p>Строки с 9-й по 17-ую описывают правило &lsquo;build&rsquo; (и подчиненной правило
&lsquo;build-stamp&rsquo;), которое выполняет <file>Makefile</file>, идущий вместе с программой, и
который позволяет скомпилировать программу.

<p>Очень редко получается так, чтобы все сразу правильно работало, поэтому правило
&lsquo;clean&rsquo;, описанное в строка 18-26, помогает удалить все ненужные рабочие файлы неудачных
попыток.

<p>Процесс установки &mdash; правило &lsquo;install&rsquo; &mdash; начинается в строке 29.  В строке
34 создаются все необходимые подкаталоги в каталоге <file>debian</file>.  В строке выполняется цель
&lsquo;install&rsquo; из файла исходного файла <file>Makefile</file> &mdash; установка происходит в
каталог <file>debian/tmp</file> &mdash; вот зачем мы использовали переменную DESTDIR для указания
корневого каталога при установке программы.

<p>Как указано в комментарии, правило &lsquo;binary-indep&rsquo; в строках 41-43 используется для
построения платформо-независимых пакетов, но в нашем примере такие отстутвуют.

<p>Следующее правило &mdash; &lsquo;binary-arch&rsquo; (строки 46-68) &mdash; использует несколько
небольших утилит из пакета <package>debhelper</package>, которые выполняют действия, необходимые для
того, чтобы ваш пакет удовлетворял требованиям Debian.

<p>Названия команд начинаются с <file>dh_</file>, здесь мы приводим список команд и описание того,
что они делают:<taglist>
    <tag><manref name="dh_testdir" section="1">
    <item>проверяет, что вы находитесь в правильном каталоге
    (<file>/usr/local/gentoo/gentoo-0.9.12/</file>);
    <tag><manref name="dh_testroot" section="1">
    <item>проверяет, что вы обладаете необходимыми привилегиями (пользователя root);
    <tag><manref name="dh_installdirs" section="1">
    <item>создает каталоге, перечисленные в файле directories <file>dirs</file> (в нашем примере
    этот файл не существует);
    <tag><manref name="dh_installdocs" section="1">
    <item>копирует документацию в каталог <file>debian/tmp/usr/share/doc/gentoo</file>;
    <tag><manref name="dh_installmenu" section="1">
    <item>копирует файл <file>menu</file> в каталог <file>debian/tmp/usr/lib/menu/gentoo</file>;
    <tag><manref name="dh_installmanpages" section="1">
    <item>копирует страницы руководства; <!-- and links them correctly -->
    <tag><manref name="dh_installchangelogs" section="1">
    <item>копирует журналы изменений в каталог <file>debian/tmp/usr/share/doc/gentoo</file>;
    <tag><manref name="dh_installinit" section="1">
    <item>copies init.d script [doesn't exist here],
    <tag><manref name="dh_installcron" section="1">
    <item>копирует файл <file>crontab</file> в каталог <file>debian/tmp/etc/cron.*</file> (в нашем
    примере этот файл не существует);
    <tag><manref name="dh_installexamples" section="1">
    <item>копирует файлы примеров в каталог <file>debian/tmp/usr/share/doc/gentoo/examples</file> (в
    нашем примере этот файл не существует);
    <tag><manref name="dh_strip" section="1">
    <item>удаляет отладочную информацию из исполняемых файлов, что позволяет сделать их меньше;
    <tag><manref name="dh_compress" section="1">
    <item>сжимает страницы Руководства и файлы документации программой <prgn>gzip</prgn>, если
    размер соответствующего файла превышает 4 Кбайт;
    <tag><manref name="dh_fixperms" section="1">
    <item>проверяет и поправляет права доступа в каталоге <file>debian/tmp</file>;
    <tag><manref name="dh_suidregister" section="1">
    <item>для каждой setuid-программы производит необходимые действия для регистрации при помощи
    программы <manref name="suidregister" section="8"> (в нашем примере этот файл не существует);
    <tag><manref name="dh_installdeb" section="1">
    <item>копирует управляющие файлы пакета в каталог <file>debian/tmp/DEBIAN</file>;
    <tag><manref name="dh_shlibdeps" section="1">
    <item>определяет зависимости для исполняемых файлов;
    <tag><manref name="dh_gencontrol" section="1">
    <item>создает и устанавливает файл <file>control</file>;
    <tag><manref name="dh_makeshlibs" section="1">
    <item>создает файл <file>shlibs</file> (в нашем примере этот файл не существует);
    <tag><manref name="dh_md5sums" section="1">
    <item>вычисляет MD5-суммы;
    <tag><manref name="dh_builddeb" section="1">
    <item>собственно строит пакет.
</taglist>

<p>Каждый из <prgn>dh_*</prgn> сценариев описан в собственной странице Руководства, поэтому
дополнительную информацию вам следует искать там.  Здесь описаны не все сценарии, включенные в пакет
<package>debhelper</package>, и если вам понадобится что-то еще, почитайте документацию к этому
пакету (возможно, необходимый сценарий уже существует).

<p>Строки 70-74 содержат необходимые заклинания, о которых вы можете прочитать в документации по
программе <prgn>make</prgn>.  Сейчас вы можете о них просто забыть.

<p>Важно помнить, что файл <file>rules</file>, созданный программой <prgn>dh_make</prgn>, должен
рассматриваться не более, чем рекомендации.  Он будет правильно работать для простых пакетов; в
случае же более сложных не бойтесь добавлять или удалять из него что-то, что необходимо вам для
решения своих задач.  Это в частности относится к правилу &lsquo;binary-arch&rsquo;, где вы должны
закоментировать строки, в которых вы не нуждаетесь.  В нашем случае мы закоментировали строки 47,
53, 54, 57 и 66.  Единственное, что вы не должны менять, это названия правил, так как они должны
называться именно таким образом, что, в частности, требуется &laquo;Руководством по созданию
пакетов&raquo;.

<p>Разумеется кое-что нужно сделать и в нашем примере: в строке 58 было добавлено
&lsquo;FIXES&rsquo;, так как это и есть название журнала изменений.  Для дополнительной информации,
читайте страницы Руководства для используемых программы <prgn>dh_*</prgn>.

<chapt id="dother">Другие файлы в каталоге <file>debian/</file>

<sect id="copyright">Файл <file>copyright</file>

<p>Этот файл содержит информацию об авторских правах на пакет.  Документ &laquo;Политика
Debian&raquo; диктует не формат этого файла, но его содержание (см. раздел 6.5).  Вот как выглядит
файл, созданный программой <prgn>dh_make</prgn>:

<example>
  1  This package was debianized by Josip Rodin &lt;jrodin@jagor.srce.hr&gt; on
  2  Wed, 11 Nov 1998 21:02:14 +0100.
  3
  4  It was downloaded from &lt;fill in ftp site&gt;
  5
  6  Upstream Author(s): &lt;put author(s) name and email here&gt;
  7
  8  Copyright:
  9
 10  &lt;Must follow here&gt;
</example>

(номера строк добавлены)

<p>В этот файл необходимо добавить: место (ftp- или web-сервер), где вы взяли исходные пакет;
информацию об авторских правах (включите полную информацию).  Если лицензионное соглашение &mdash;
это одно из популярных &ldquo;свободных&rdquo; лицензий (например, GNU GPL, GNU LGPL, BSD или
Artistic), вы можете просто сослаться на соответствующий файл в каталоге
<file>/usr/share/common-licenses/</file>, который существует в каждой системе Debian.  Программа
<prgn>gentoo</prgn> лицензирована в соответствии с GNU General Public License, поэтому измененный
файл <file>copyright</file> будет выглядеть таким образом:

<example>
  1  This package was debianized by Josip Rodin &lt;jrodin@jagor.srce.hr&gt; on
  2  Wed, 11 Nov 1998 21:02:14 +0100.
  3
  4  It was downloaded from: ftp://ftp.obsession.se/gentoo/
  5
  6  Upstream author: Emil Brink &lt;emil@obsession.se&gt;
  7
  8  This software is copyright (c) 1998-99 by Emil Brink, Obsession
  9  Development.
 10 
 11  You are free to distribute this software under the terms of
 12  the GNU General Public License.
 13  On Debian systems, the complete text of the GNU General Public
 14  License can be found in /usr/share/common-licenses/GPL file.
</example>

(номера строк добавлены)

<sect id="readdeb">Файл <file>README.Debian</file>

<p>Любая дополнительная информация или различия между программой в вашем пакете и исходной
программой должны быть описаны в файле <file>README.Debian</file>.  Программ <prgn>dh_make</prgn>
создает такой файл:

<example>
  gentoo for Debian
  ----------------------

  &lt;possible notes regarding this package - if none, delete this file&gt;

  Josip Rodin &lt;jrodin@jagor.srce.hr&gt;, Wed, 11 Nov 1998 21:02:14 +0100
</example>

<p>Так как в нашем примере нам нечего поместить в этот файл, мы его удалим.

<sect id="changelog">Файл <file>changelog</file>

<p>Это обязательный файл, имеющий специальный формат (описан в &laquo;Руководстве по созданию
пакетов&raquo; (раздел 3.2.3)).  Этот файл используется программой <prgn>dpkg</prgn> и другими для
получения информации о версии, ревизии, разделе, и срочности для вашего пакета.

<p>Он также важен и для вас, так как регистрировать все изменения очень помогает в последствии.  Он
также поможет людям, загрузившим ваш пакет, сразу понять, что именно изменилось в вашем пакете.
После установки пакета, этот файл будет доступен как
<file>/usr/share/doc/gentoo/changelog.Debian.gz</file>.

<p>Программа <prgn>dh_make</prgn> создала такой файл:

<example>
  1  gentoo (0.9.12-1) unstable; urgency=low
  2
  3   * Initial Release.
  4
  5  -- Josip Rodin &lt;jrodin@jagor.srce.hr&gt; Wed, 11 Nov 1998 21:02:14 +0100
  6
  7  Local variables:
  8  mode: debian-changelog
  9  End:
</example>

(номера строк добавлены)

<p>В первой строке указаны название пакета, версия программы, ревизия пакета, раздел, и срочность.
Имя должно совпадать с названием пакета с исходными текстами.  Раздел должен быть
&lsquo;unstable&rsquo; (нестабильный) или &lsquo;experimental&rsquo; (экспериментальный).  Срочность
не должна заменяться на что-либо большее, чем &lsquo;low&rsquo; (низкая). :-)

<p>Строки 3-5 суть запись в журнале, это то, где вы регистрируете все сделанные над пакетом
изменения (это не изменения сделанные авторами программы &mdash; для регистрации этих изменений
используется отдельный файл, созданный авторами программы, и который устанавливается как
<file>/usr/share/doc/gentoo/changelog.gz</file>).  Новые строки должны включаться
<strong>перед</strong> строкой, которая начинается с символа звездочка (&lsquo;*&rsquo;).  Программа
<prgn>dch</prgn> упростит вам работу, вы также можете использовать программу <prgn>emacs</prgn>
(строки 7-9 содержат информацию специально для нее).  Либо вы можете воспользоваться любым текстовым
редактором.  В результате у вас должно получиться что-то подобное:

<example>
  1  gentoo (0.9.12-1) unstable; urgency=low
  2
  3   * Initial Release.
  4   * This is my first Debian package.
  5   * Adjusted the Makefile to fix $DESTDIR problems.
  6
  7  -- Josip Rodin &lt;jrodin@jagor.srce.hr&gt; Wed, 11 Nov 1998 21:02:14 +0100
  8
  9  Local variables:
 10   mode: debian-changelog
 11  End:
</example>

(номера строк добавлены)

<p>Когда вы выпускаете новую версию пакета, вы должны увеличить номер версии пакета.  Вы можете
сделать это с помощью команды &lsquo;dch -v <var>версия</var>-<var>ревизия</var>&rsquo;, а затем
добавить комментарии при помощи вашего любимого текстового редактора.  Совет: как получить дату в
необходимом формате?  Используйте команду &lsquo;822-date&rsquo; или команду &lsquo;date -R&rsquo;

<p>Информация о новой версии добавляется в начало файла <file>changelog</file>.  Вот как может
выглядеть этот файл после изменений:

<example>
  1  gentoo (0.9.12-2) unstable; urgency=low
  2
  3   * Fixed a glitch in the menu file.
  4
  5  -- Josip Rodin &lt;jrodin@jagor.srce.hr&gt; Wed, 11 Nov 1998 22:15:39 +0100
  6
  7  gentoo (0.9.12-1) unstable; urgency=low
  8
  9   * Initial Release.
 10   * This is my first Debian package.
 11   * Adjusted the Makefile to fix $DESTDIR problems.
 12 
 13  -- Josip Rodin &lt;jrodin@jagor.srce.hr&gt; Wed, 11 Nov 1998 21:02:14 +0100
 14 
 15  Local variables:
 16  mode: debian-changelog
 17  End:
</example>

(номера строк добавлены)

<sect id="conffiles">Файл <file>conffiles</file>

<p>Одна из самых неприятных (и раздражающих) вещей, которая может случиться, это когда после того,
как вы потратили очень много времени и усилий на то, чтобы настроить программу, а при очередном
обновлении все ваши настройки исчезли.  Debian предлагает решение этой проблемы, через специальный
механизм работы с конфигурационными файлами: все конфигурационные файлы должны быть помечены как
таковые, это позволит при обновлении проверить не изменились ли данные файлы, и, если они
изменились, спросить у вас, нужно ли заменить старые конфигурационные файлы теми, что пришли в новом
пакете.  Для того, чтобы это сделать это, вы должны в файле <file>conffiles</file> указать
<strong>полные</strong> пути к каждому конфигурационному файлу (обычно они находятся в каталоге
<file>/etc</file>).  Одни файл в одной строчке.

<p>У программы <prgn>gentoo</prgn> есть только один конфигурационный файл &mdash;
<file>/etc/gentoorc</file> &mdash; и мы укажем его в файле <file>conffiles</file>.  Если у вашей
программы нет конфигурационных файлов, вам этот файл не нужен.

<sect id="dirs">Файл <file>dirs</file>

<p>Этот файл содержит названия каталогов, которые необходимы, но которые ну создаются командой
установки программы (&lsquo;make install&rsquo;).

<p>По умолчанию, он содержит следующие строки:

<example>
  usr/bin
  usr/sbin
</example>

<p>Заметьте, что начальный символ &lsquo;косая черта&rsquo; отсутствует.  В нашем случае, необходимо
изменить этот файл следующим образом:

<example>
  usr/X11R6/bin
  usr/X11R6/man/man1
</example>

но эти каталоги создаются командой &lsquo;make install&rsquo;, поэтому нам этот файл не нужен и мы
можем его легко удалить.

<sect id="manpage">Файл <file>manpage.1.ex</file>

<p>Файлы, имеющие расширение <file>.ex</file>, представляют собой примеры тех дополнительных файлов,
которые вам могут понадобится.  Для того, чтобы воспользоваться ими, удалите расширение
<file>.ex</file>.  Если вы не собираетесь их использовать, просто удалите их!

<p>Для вашей программа должна присутствовать страница Руководства.  Если ее нет, вы должны заполнить
шаблон <file>manpage.1.ex</file>.  Краткое описание того, как создавать страницы Руководства,
смотрите в <manref name="man" section="7">.  Не забудьте переименовать этот файл, чтобы его имя
соответствовало имени программы, а расширение &mdash; разделу Руководства, в который должна попасть
данная страница.  Вот короткий список разделов:

<example>
Раздел |     Описание              |     Примечание
  1     Команды пользователя         Программы и сценарии
  2     Системные вызовы             Функции, предоставляемые ядром   
  3     Библиотечные вызовы          Функции, предоставляемые различными
                                     библиотеками
  4     Специальные файлы            Обычно файлы в каталоге /dev
  5     Форматы файлов               Например, формат файла /etc/passwd
  6     Игры                         Или другие развлекательный программы
  7     Макро пакеты                 Например, макросы пакета man
  8     Системное администрирование   Программы, которые обычно запускаются
                                     только пользователем root
  9     Kernel routines              Нестандартные вызовы и информация о
                                     внутреннем строении
</example>

<p>Таким образом, страница Руководства для программы <prgn>gentoo</prgn> должна называться
<file>gentoo.1</file>, or <file>gentoo.1x</file>, так как это программа.  В исходных текстах
страница Руководства отсутствовала, поэтому нам пришлось написать собственную, используя информацию
из файла примера и документации к программе.

<sect id="menu">Файл <file>menu.ex</file>

<p>Пользователи X Window System обычно используют диспетчеры окон, которые поддерживают меню
программ.  Если у них установлен пакет <package>menu</package>, им станет доступным набор
стандартных меню для каждой установленной программы.  Это не является обязательным с точки зрения
&laquo;Политики Debian&raquo;, но обычно пользователи с удовольствием используют данную возможность.
Мы можем добавить меню для программы <prgn>gentoo</prgn>, соответствующим образом подправив данный
файл.  Вот, что создала программа <prgn>dh_make</prgn>:

<example>
  ?package(gentoo):needs=X11|text|vc|wm section=Apps/see-menu-manual\
    title="gentoo" command="/usr/bin/gentoo"
</example>

<p>Значение первого поля указывает тип интерфейса, требуемого для программы (например, текст (text)
или X11).  Затем перечислены путь в меню, где должна появиться соответствующая запись.  Актуальный
список разделов доступен в как
<file>/usr/share/doc/debian-policy/menu-policy.html/ch2.html#s2.1</file>.  Третье поле &mdash;
название программы.  Четвертое &mdash; название файла со значком для программ (или отсутствует, если
значка нет).  Пятое &mdash; текст, который появится в меню.  И, наконец, шестое &mdash; команда,
которая запускает программу.

<p>В нашем случае, данный файл будет выглядеть так:

<example>
  ?package(gentoo):needs=X11 section=Apps/Misc \
    title="Gentoo" command="/usr/X11R6/bin/gentoo"
</example>

<p>Для дополнительной информации смотрите <manref name="menufile" section="5">, <manref
name="update-menus" section="1"> и <file>/usr/share/doc/debian-policy/menu-policy.html/</file>.

<sect id="watch">Файл <file>watch.ex</file>

<p>Данный файл может быть использован программами <manref name="uscan" section="1"> и <manref
name="uupdate" section="1"> (они предоставляются пакетом <package>devscripts</package>) для
отслеживания серверов, откуда вы загрузили исходные тексты программы.  Вот, например, что находится
в этом файле в пакете <package>gentoo</package>:

<example>
  # watch control file for uscan
  # Site                  Directory       Pattern                 Version Script
  ftp.obsession.se        /gentoo         gentoo-(.*)\.tar\.gz    debian  uupdate
</example>

<p>Совет: подсоединитесь к Интернету и попробуйте запустить программу <prgn>uscan</prgn>, находясь в
каталоге программы <em>после</em> того, как вы создали этот файл.  И прочитайте документацию на эту
программу!

<sect id="maintscripts">Файлы <file>postinst.ex</file>, <file>preinst.ex</file>, <file>postrm.ex</file>, <file>prerm.ex</file>

<p>Эти файлы называются служебными сценариями.  Возможно, пока вам следует избегать создания данных
сценариев, так как они имеют тенденцию усложняться со временем.  Подробную информацию вы можете
найти в &laquo;Руководстве по созданию пакетов&raquo;, также просмотрите файлы примеров, созданные
программой <prgn>dh_make</prgn>.

<p>Теперь все должно быть готово к построению пакета.

<chapt id="final">Завершающие шаги

<sect id="build">Строим пакет

<p>Перейдите в основной каталог программы (<file>/usr/local/src/gentoo/gentoo-0.9.12/</file>) и
выполните команду:

<example>
  dpkg-buildpackage -rfakeroot
</example>

<p>Эта команды сделает все, что необходимо.  Все, что вам необходимо будет сделать, это ввести
фразу-пароль для вашего секретного PGP-ключа.  Дважды!  После того, как команда завершит свою
работу, в каталоге <file>/usr/local/gentoo</file> следующие файлы:<taglist>
    <tag><file>gentoo_0.9.12-1_i386.deb</file>
    <item>это результат вашей работы &mdash; двоичный пакет.  Вы можете воспользоваться программой
    <prgn>dpkg</prgn> или <prgn>dselect</prgn> для того, чтобы установить его (а затем и удалить)
    как любой другой каталог.

    <tag><file>gentoo_0.9.12.orig.tar.gz</file>
    <item>Этот файл содержит оригинальные исходные тексты программы.  Они необходимо для того, чтобы
    если кто-нибудь захочет перекомпилировать ваш пакет, мог это сделать.  Или же, если они не
    используют систему управления пакетами Debian, но хотят загрузить исходные тексты программы и
    скомпилировать ее.

    <tag><file>gentoo_0.9.12-1.dsc</file>
    <item>Этот файл содержит краткое описание исходных файлов для пакета.  Этот файл создается с
    использованием информации из файла <file>gentoo-0.9.12/debian/control</file> и необходим для
    распаковки исходных текстов командой <manref name="dpkg-source" section="1">.  Содержимое этого
    файла имеет вашу цифровую подпись, что позволяет другим людям удостовериться, что именно вы
    создали его.

    <tag><file>gentoo_0.9.12-1.diff.gz</file>
    <item>Этот файл содержит (в формате &lsquo;unified diff&rsquo;) все изменения, которые вам
    понадобилось сделать с исходными текстами.  Он был создал и используется программой <manref
    name="dpkg-source" section="1">.

    <tag><file>gentoo_0.9.12-1_i386.changes</file>
    <item>Этот файл описывает изменения, сделанные в данной версии пакета по сравнению с предыдущей
    версией.  Он используется программами поддержки ftp-архива Debian для помещения пакетов (как
    двоичных так и содержащих исходные тексты) в архив.  Он содержит как информацию из файла
    <file>gentoo-0.9.12/debian/changelog</file> так и из файла <file>.dsc</file>.

    <p>По мере того, как вы будете работать над вашим пакетом, вы можете добавлять новую
    функциональность или просто поменять его поведение.  Люди, загружающие ваш пакет могут
    сразу увидеть в этом файле, что именно изменилось.  Длинные строки цифр &mdash; это md5-суммы
    всех перечисленных файлов.  Человек, которые загрузил ваши файлы, может проверить их при помощи
    программы <manref name="md5sum" section="1"> и, если значения контрольных сумм не совпадает, он
    точно будет знать, что это не те файлы, что создали вы (могла произойти ошибка при загрузке
    либо же кто-то &ldquo;поправил&rdquo; их).  Этот файл также имеет цифровую подпись содержимого с
    тем, чтобы люди имели большую уверенность, что он был создан вами.
</taglist>

<sect id="errcheck">Поиск ошибок в пакете

<p>Запустите программу <manref name="lintian" section="1"> на файл <file>.changes</file>; эта
программа проверит пакет на наличие стандартных ошибок.  Команда выглядит так:

<example>
  lintian -i gentoo_0.9.12-1_i386.changes
</example>

<p>Если окажется, что какие-то ошибки присутствуют (это все строки, начинающиеся с <tt>E:</tt>),
внимательно прочитайте объяснение (строки, начинающиеся с <tt>N:</tt>), исправьте ошибки и
попробуйте снова построить пакет.  Если вы увидели только строки, начинающиеся с <tt>W:</tt>
(предупреждения), то вы можете быть уверены, что ваш пакет, скорее всего, правилен (но, разумеется,
требует дополнительной работы).

<p>Проверьте содержимое пакета при помощи менеджера файлов (например, <manref name="mc"
section="1">) или распакуйте его во временный каталог при помощи программы <manref name="dpkg-deb"
section="1">.

<p>Теперь установите свой пакет. Попробуйте установить его на машинах, отличной от той, на
которой вы создавали ваш пакет, и тщательно проследите, что отсутствуют какие бы то ни было
предупреждения или ошибки во время установки и при запуске программы.

<p>Позже, когда вы будет создавать новую версию пакета, для того, чтобы убедиться, что обновление
будет происходить без ошибок, вы должны проверить следующее:<list>
    <item>попробуйте обновить предыдущую версию пакета (а также версию, включенную в последний
    выпуск Debian);
    <item>попробуйте back again,
    <item>установите пакет как новый (в систему, в которой отсутвуют предыдущие версии пакета);
    <item>удалите его, установите заново, и, наконец, вычистите его.
</list>

<sect id="upload">Загрузка вашего пакета

<p>Теперь, когда вы тщательно оттестировали свой пакет, настало время загрузить все необходимые
файлы на сервер master.debian.org.  Для этого вы должны воспользоваться программой <manref
name="dupload" section="1">.  Сначала вы должны создать конфигурационный файл
<file>~/.dupload.conf</file>. Поместите в него что-нибудь похожее на:

<example>
  package config;
  $default_host = "master";

  $cfg{master}{"method"} = "scpb";
  $cfg{master}{"login"} = "joy";
  $cfg{master}{"visibleuser"} = "jrodin";
  $cfg{master}{"visiblename"} = "jagor.srce.hr";
  $cfg{master}{"fullname"} = "Josip Rodin";

  $cfg{non-us}{"method"} = "scpb";
  $cfg{non-us}{"login"} = "joy";
  $cfg{non-us}{"visibleuser"} = "jrodin";
  $cfg{non-us}{"visiblename"} = "jagor.srce.hr";
  $cfg{non-us}{"fullname"} = "Josip Rodin";

  1;
</example>

<p>Разумеется, измените информацию обо мне на вашу, для этого прочитайте страницу Руководства
<manref name="dupload.conf" section="5">, что позволит вам понять, что означает каждый параметр.

<p>Теперь подсоединитесь к вашему Интернет-провайдеру, перейдите в каталог
<file>/usr/local/src/gentoo</file> и выполните команду:

<example>
  dupload --to master gentoo_0.9.12-1_i386.changes
</example>

<p>Программа <prgn>dupload</prgn> попросит ввести ваш пароль на машине master.debian.org, загрузит
пакеты и пошлет, если необходимо, информацию о загруженных файлах в список рассылки
<email>debian-devel-changes@lists.debian.org</email>.

<p>Если вы живете в Европе, вы можете воспользоваться другой машиной для загрузки ваших пакетов.
Для дополнительной информации смотрите <manref name="dupload" section="1">, <manref
name="dupload.conf" section="5"> и &laquo;Руководство разработчика&raquo;.

<sect id="whereishelp">Где искать помощь

<p>Прежде всего (перед тем, как задавать свой вопрос в одном из форумов!), пожалуйста, прочитайте
документацию (RTFM!). Это включает документацию в каталогах <file>/usr/share/doc/dpkg</file>,
<file>/usr/share/doc/debian</file>, <file>/usr/share/doc/package/*</file>, а также страницы
Руководства и или info-страницы для всех упомянутых в этой статье программ.  Если вы получили
сообщение об ошибке (да, да, настоящее сообщение об ошибке!), это означает, что настало время
посетить <url name="Debian Bug Tracking System" id="http://www.debian.org/Bugs/"> и ознакомиться с
необходимой документацией.  Это позволит вам эффективно работать с сообщениями об ошибках.

<p>Подписавшись на список рассылки <url name="Debian Mentors"
id="mailto:debian-mentors@lists.debian.org">, вы можете попросить помощи у опытных разработчиков
Debian.  Для того, чтобы подписаться на этот список рассылки, пошлите письмо по адресу
<email>debian-mentors-request@lists.debian.org</email>, указав слово &lsquo;subscribe&rsquo; в поле
темы письма.

<p>Если у вас остались вопросы, задайте их в список рассылки разработчиков Debian по адресу
<email>debian-devel@lists.debian.org</email>. Вы можете подписаться на него, послав письмо по адресу
<email>debian-devel-request@lists.debian.org</email>, в теме которого будет слово 'subscribe'.
Если вы уже стали разработчиком Debian, вам следует подписаться на него в любом случае.

<p>Даже если все правильно работало, настало время молиться.  Почему?  Потому что через несколько
часов или дней пользователи по всему миру начнут использовать ваш пакет, и, если вы допустили
какую-нибудь <em>критическую</em> ошибку, многочисленные расстроенные пользователи Debian начнут
наполнять ваш почтовый ящик злобными письмами&hellip;  Шутка, шутка. :-)

<p>Расслабьтесь и приготовьтесь к получению сообщений об ошибках, так как много чего еще нужно
сделать для того, чтобы пакет полностью соответствовал политике Debian (еще раз, прочитайте
<em>полную документацию</em>).  Успеха!

</book>

</debiandoc>

<!--
    vim:tw=100
  -->
