Whitespace fixes after PH split.

This commit is contained in:
Sergey Kandaurov 2014-07-12 14:08:49 +00:00
parent 63c96f9f37
commit 8cc7166d97
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=45256
17 changed files with 11401 additions and 11080 deletions

View file

@ -7,67 +7,70 @@
Original revision: r43844
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices">
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink=
"http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices">
<title>Приложения</title>
<title>Приложения</title>
<sect1 xml:id="uses-values">
<sect1 xml:id="uses-values">
<title>Значения <varname>USES</varname></title>
<table>
<title>úÎÁÞÅÎÉÑ <varname>USES</varname></title>
<table>
<title>Значения <varname>USES</varname></title>
<tgroup cols="3">
<thead>
<row>
<entry>Наименование</entry>
<entry>Аргументы</entry>
<entry>Описание</entry>
</row>
</thead>
<tgroup cols="3">
<thead>
<row>
<entry>Наименование</entry>
<entry>Аргументы</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody valign="top">
&values.uses;
</tbody>
</tgroup>
</table>
</sect1>
<tbody valign="top">
&values.uses;
</tbody>
</tgroup>
</table>
</sect1>
<sect1 xml:id="freebsd-versions">
<sect1 xml:id="freebsd-versions">
<title>Значения <literal>__FreeBSD_version</literal></title>
<para>Ниже для справки приводится перечень значений
<literal>__FreeBSD_version</literal> в виде, который определён
в <link
xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para>
<table frame="none">
<title>úÎÁÞÅÎÉÑ <literal>__FreeBSD_version</literal></title>
<para>Ниже для справки приводится перечень значений
<literal>__FreeBSD_version</literal> в виде, который определён в
<link xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para>
<tgroup cols="3">
<thead>
<row>
<entry>Значение</entry>
<entry>Дата</entry>
<entry>Релиз</entry>
</row>
</thead>
<table frame="none">
<title>Значения <literal>__FreeBSD_version</literal></title>
<tgroup cols="3">
<thead>
<row>
<entry>Значение</entry>
<entry>Дата</entry>
<entry>Релиз</entry>
</row>
</thead>
<tbody>
&values.versions;
</tbody>
</tgroup>
</table>
<note>
<para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как
<quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой принцип
использовался год и месяц, но мы решили изменить его на более
однозначную систему нумерации старший/младший, начиная с версии
2.2. Это объясняется тем, что параллельная разработка в нескольких
ветках делает непрактичным идентификацию релизов просто по их
реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит
заботиться о старых версиях -CURRENT; они перечислены здесь просто
в информационных целях.</para>
</note>
</sect1>
</chapter>
<tbody>
&values.versions;
</tbody>
</tgroup>
</table>
<note>
<para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как
<quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой
принцип использовался год и месяц, но мы решили изменить его
на более однозначную систему нумерации старший/младший,
начиная с версии 2.2. Это объясняется тем, что параллельная
разработка в нескольких ветках делает непрактичным
идентификацию релизов просто по их реальным датам выпуска.
Если вы сейчас делаете порт, вам не стоит заботиться о старых
версиях -CURRENT; они перечислены здесь просто в
информационных целях.</para>
</note>
</sect1>
</chapter>

View file

@ -7,149 +7,161 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="keeping-up">
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink=
"http://www.w3.org/1999/xlink" version="5.0" xml:id="keeping-up">
<title>Актуализация</title>
<title>Актуализация</title>
<para>Коллекция Портов &os; постоянно изменяется. Здесь находится
некоторая информация о том, как поддерживать её в актуальном
состоянии.</para>
<para>Коллекция Портов &os; постоянно изменяется. Здесь находится
некоторая информация о том, как поддерживать её в актуальном
состоянии.</para>
<sect1 xml:id="freshports">
<title>FreshPorts</title>
<sect1 xml:id="freshports">
<title>FreshPorts</title>
<para>Самым простым способом отслеживать уже произошедшие обновления
является подписка на <link xlink:href="http://www.FreshPorts.org/">
FreshPorts</link>. Для мониторинга вы можете выбрать несколько
портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь,
потому что они будут получать уведомления не только о собственных
изменениях, но и об изменениях, сделанных любым другим коммиттером
&os;. (Это часто необходимо для синхронизации с изменениями на более
низком технологическом уровне&mdash;хотя более корректным было бы
получение предупреждений от тех, кто вносит подобные изменения,
иногда этот этап пропускается или он просто непрактичен. Кроме того,
в некоторых случаях изменения по своей природе весьма незначительны.
Мы полагаем, что любой разработчик в таких ситуациях будет
руководствоваться здравым смыслом).</para>
<para>Самым простым способом отслеживать уже произошедшие
обновления является подписка на <link xlink:href=
"http://www.FreshPorts.org/">FreshPorts</link>. Для
мониторинга вы можете выбрать несколько портов. Мейнтейнерам
настоятельно рекомендуется подписаться здесь, потому что они
будут получать уведомления не только о собственных изменениях,
но и об изменениях, сделанных любым другим коммиттером &os;.
(Это часто необходимо для синхронизации с изменениями на более
низком технологическом уровне&mdash;хотя более корректным было
бы получение предупреждений от тех, кто вносит подобные
изменения, иногда этот этап пропускается или он просто
непрактичен. Кроме того, в некоторых случаях изменения по
своей природе весьма незначительны. Мы полагаем, что любой
разработчик в таких ситуациях будет руководствоваться здравым
смыслом).</para>
<para>Если вы хотите использовать FreshPorts, то вам нужна только
учётная запись. Если регистрационный адрес вашей электронной почты
будет иметь вид <literal>@FreeBSD.org</literal>, то справа на
Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто
уже получил учётную запись FreshPorts, но не использовал собственный
адрес электронной почты <literal>@FreeBSD.org</literal>, достаточно
сменить адрес на <literal>@FreeBSD.org</literal>, подписаться, а
затем сменить его обратно.</para>
<para>Если вы хотите использовать FreshPorts, то вам нужна только
учётная запись. Если регистрационный адрес вашей электронной
почты будет иметь вид <literal>@FreeBSD.org</literal>, то
справа на Web-страницах вы увидите дополнительную ссылку. Для
тех из вас, кто уже получил учётную запись FreshPorts, но не
использовал собственный адрес электронной почты
<literal>@FreeBSD.org</literal>, достаточно сменить адрес на
<literal>@FreeBSD.org</literal>, подписаться, а затем сменить
его обратно.</para>
<para>Во FreshPorts имеется также функция проверки правильности,
которая автоматически проверяет каждое изменение, внесённое в дерево
портов &os;. Если вы подпишетесь на эту услугу, то будете
оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке
внесённых вами изменений.</para>
</sect1>
<para>Во FreshPorts имеется также функция проверки правильности,
которая автоматически проверяет каждое изменение, внесённое в
дерево портов &os;. Если вы подпишетесь на эту услугу, то
будете оповещаться обо всех ошибках, обнаруженных FreshPorts
при проверке внесённых вами изменений.</para>
</sect1>
<sect1 xml:id="svnweb">
<title>Web-интерфейс к хранилищу исходных текстов</title>
<sect1 xml:id="svnweb">
<title>Web-интерфейс к хранилищу исходных текстов</title>
<para>Файлы в хранилище исходных текстов можно просматривать при помощи
Web-интерфейса. Изменения, которые касаются в целом всей системы
портов, теперь документируются в файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</link>.
Изменения, касающиеся отдельных портов, отражаются теперь в
файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</link>.
Однако однозначный ответ на любой вопрос можно найти, только
прочитав исходных код <link xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</link>
и связанных с ним файлов.</para>
</sect1>
<para>Файлы в хранилище исходных текстов можно просматривать при
помощи Web-интерфейса. Изменения, которые касаются в целом
всей системы портов, теперь документируются в файле <link
xlink:href="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</link>.
Изменения, касающиеся отдельных портов, отражаются теперь в
файле <link
xlink:href="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</link>.
Однако однозначный ответ на любой вопрос можно найти, только
прочитав исходных код <link
xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</link>
и связанных с ним файлов.</para>
</sect1>
<sect1 xml:id="ports-mailing-list">
<title>Список рассылки &os;, посвящённый портам</title>
<sect1 xml:id="ports-mailing-list">
<title>Список рассылки &os;, посвящённый портам</title>
<para>Если вы поддерживаете порты, то должны следить за &a.ports;.
О важных изменениях, отражающихся на работе портов, будет сообщаться
здесь, а затем они переносятся в <filename>CHANGES</filename>.</para>
<para>Если вы поддерживаете порты, то должны следить за
&a.ports;. О важных изменениях, отражающихся на работе портов,
будет сообщаться здесь, а затем они переносятся в
<filename>CHANGES</filename>.</para>
<para>Если данный список рассылки слишком загружен сообщениями,
вы можете отслеживать &a.ports-announce.name;, который модерируется
и не является местом для дискуссий.</para>
</sect1>
<para>Если данный список рассылки слишком загружен сообщениями,
вы можете отслеживать &a.ports-announce.name;, который
модерируется и не является местом для дискуссий.</para>
</sect1>
<sect1 xml:id="build-cluster">
<title>Кластер построения портов &os;</title>
<sect1 xml:id="build-cluster">
<title>Кластер построения портов &os;</title>
<para>Одной из наименее известных сильных сторон &os; является тот
факт, что для непрерывного построения Коллекции Портов для каждого
из основных релизов ОС для каждой архитектуры уровня поддержки
Tier-1 выделен целый кластер машин.</para>
<para>Одной из наименее известных сильных сторон &os; является
тот факт, что для непрерывного построения Коллекции Портов для
каждого из основных релизов ОС для каждой архитектуры уровня
поддержки Tier-1 выделен целый кластер машин.</para>
<para>Отдельные порты собираются, если они специально не помечены как
<varname>IGNORE</varname>. Для портов, помеченных как
<varname>BROKEN</varname>, попытки будут продолжены для того,
чтобы увидеть, если основная проблема была решена. (Это сделано
через использование переменной <varname>TRYBROKEN</varname> для
<filename>Makefile</filename> порта.)</para>
<para>Отдельные порты собираются, если они специально не помечены
как <varname>IGNORE</varname>. Для портов, помеченных как
<varname>BROKEN</varname>, попытки будут продолжены для того,
чтобы увидеть, если основная проблема была решена. (Это
сделано через использование переменной
<varname>TRYBROKEN</varname> для <filename>Makefile</filename>
порта.)</para>
</sect1>
</sect1>
<sect1 xml:id="distfile-survey">
<title>Portscout: сканер дистрибутивных файлов портов
&os;</title>
<sect1 xml:id="distfile-survey">
<title>Portscout: сканер дистрибутивных файлов портов &os;</title>
<para>Кластер построения выделен для выполнения самого последнего
релиза каждого из портов, дистрибутивные файлы которых уже были
сгружены. Однако из-за постоянных изменений в Internet
дистрибутивные файлы могут быстро исчезать. <link
xlink:href="http://portscout.FreeBSD.org">Portscout</link>,
средство сканирования дистрибутивных файлов &os; пытается
опросить каждый из сайтов, доступных для сгрузки каждого из
портов, для определения того, доступны ли ещё дистрибутивные
файлы. <application>Portscout</application> может готовить
отчёты в <acronym>HTML</acronym> и рассылать электронные письма
об имеющихся обновлениях для портов тем, кто это запрашивает.
Мейнтейнеры периодически запрашивают наличие изменений, либо
вручную, либо используя ленту <acronym>RSS</acronym>.</para>
<para>Кластер построения выделен для выполнения самого последнего
релиза каждого из портов, дистрибутивные файлы которых уже были
сгружены. Однако из-за постоянных изменений в Internet
дистрибутивные файлы могут быстро исчезать. <link xlink:href="http://portscout.FreeBSD.org">Portscout</link>, средство
сканирования дистрибутивных файлов &os; пытается опросить
каждый из сайтов, доступных для сгрузки каждого из портов,
для определения того, доступны ли ещё дистрибутивные файлы.
<application>Portscout</application> может готовить отчёты
в <acronym>HTML</acronym> и рассылать электронные письма об
имеющихся обновлениях для портов тем, кто это запрашивает.
Мейнтейнеры периодически запрашивают наличие изменений, либо
вручную, либо используя ленту <acronym>RSS</acronym>.</para>
<para>Главная страница <application>Portscout</application>
отображает email мейнтейнера порта, количество портов, за
которые ответственен мейнтейнер, количество портов с новыми
дистрибутивными файлами и процент устаревших портов. Функция
поиска выполняет поиск мейнтейнера по адресу электронной почты
и позволяет выбирать между всеми портами или только
устаревшими.</para>
<para>Главная страница <application>Portscout</application>
отображает email мейнтейнера порта, количество портов, за
которые ответственен мейнтейнер, количество портов с новыми
дистрибутивными файлами и процент устаревших портов. Функция
поиска выполняет поиск мейнтейнера по адресу электронной почты
и позволяет выбирать между всеми портами или только
устаревшими.</para>
<para>При щелчке по адресу электронной почты мейнтейнера
отображается список всех его портов, разделённых по категориям,
вместе с текущим номером версии, информацией о наличии новой
версии, временем последнего обновления порта и временем его
последней проверки. Функция поиска на этой странице позволяет
пользователю выполнять поиск конкретного порта.</para>
<para>При щелчке по адресу электронной почты мейнтейнера
отображается список всех его портов, разделённых по категориям,
вместе с текущим номером версии, информацией о наличии новой
версии, временем последнего обновления порта и временем его
последней проверки. Функция поиска на этой странице позволяет
пользователю выполнять поиск конкретного порта.</para>
<para>По щелчку на название порта в списке отображается информация
о порте <link
xlink:href="http://freshports.org">FreshPorts</link>.</para>
</sect1>
<para>По щелчку на название порта в списке отображается информация
о порте <link xlink:href="http://freshports.org">FreshPorts</link>.</para>
</sect1>
<sect1 xml:id="portsmon">
<title>Система мониторинга портов &os;</title>
<sect1 xml:id="portsmon">
<title>Система мониторинга портов &os;</title>
<para>Другим полезным ресурсом является <link
xlink:href="http://portsmon.FreeBSD.org">Система мониторинга
портов &os;</link> (известная также как
<literal>portsmon</literal>). Система представляет собой базу
данных, обрабатывающую информацию из нескольких источников и
позволяющую просматривать их при помощи Web-интерфейса. На
данный момент задействованы база сообщений об ошибках (PR),
протоколы ошибок кластера построения и отдельные файлы из
коллекции портов. В будущем в этот список будет добавлена
система проверки дистрибутивных файлов и другие ресурсы.</para>
<para>Другим полезным ресурсом является
<link xlink:href="http://portsmon.FreeBSD.org">Система мониторинга
портов &os;</link> (известная также как <literal>portsmon</literal>).
Система представляет собой базу данных, обрабатывающую информацию из
нескольких источников и позволяющую просматривать их при помощи
Web-интерфейса. На данный момент задействованы база сообщений об
ошибках (PR), протоколы ошибок кластера построения и отдельные файлы
из коллекции портов. В будущем в этот список будет добавлена система
проверки дистрибутивных файлов и другие ресурсы.</para>
<para>Для начала вы можете просмотреть всю информацию о некотором порте
при помощи средства <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Обзор
отдельного порта</link>.</para>
<para>На момент написания это единственный доступный ресурс, который
для имени порта ставит в соответствие записи PR GNATS.
(Отправители PR не всегда добавляют в название имя порта, хотя
мы предпочитаем, чтобы они это делали.) Таким образом,
<literal>portsmon</literal> это хорошее место для начала, если вы
хотите найти присланные PR и/или ошибки построения для существующего
порта; либо поискать, был ли уже прислан новый порт, который вы
подумывали создать сами.</para>
</sect1>
</chapter>
<para>Для начала вы можете просмотреть всю информацию о некотором
порте при помощи средства <link
xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Обзор
отдельного порта</link>.</para>
<para>На момент написания это единственный доступный ресурс,
который для имени порта ставит в соответствие записи PR GNATS.
(Отправители PR не всегда добавляют в название имя порта, хотя
мы предпочитаем, чтобы они это делали.) Таким образом,
<literal>portsmon</literal> это хорошее место для начала, если
вы хотите найти присланные PR и/или ошибки построения для
существующего порта; либо поискать, был ли уже прислан новый
порт, который вы подумывали создать сами.</para>
</sect1>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -7,41 +7,46 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="own-port">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="own-port">
<title>Как самому сделать новый порт</title>
<title>Как самому сделать новый порт</title>
<para>Итак, вы интересуетесь, как создать собственный порт или
обновить существующий? Великолепно!</para>
<para>Итак, вы интересуетесь, как создать собственный порт или
обновить существующий? Великолепно!</para>
<para>Ниже находятся некоторые указания по созданию нового порта для
&os;. Если вы хотите обновить существующий порт, вы должны
прочесть их, а затем <xref linkend="port-upgrading"/>.</para>
<para>Ниже находятся некоторые указания по созданию нового порта
для &os;. Если вы хотите обновить существующий порт, вы должны
прочесть их, а затем <xref linkend="port-upgrading"/>.</para>
<para>Если этот документ недостаточно подробен, вы должны обратиться к
файлу <filename>/usr/ports/Mk/bsd.port.mk</filename>, который
включается в make-файл каждого порта. Он хорошо прокомментирован, и
даже если вы не занимаетесь хакингом make-файлов каждодневно, из него
вы сможете узнать много нового. Кроме того, конкретные вопросы можно
задать, послав письмо на адрес &a.ports;.</para>
<para>Если этот документ недостаточно подробен, вы должны
обратиться к файлу
<filename>/usr/ports/Mk/bsd.port.mk</filename>, который
включается в make-файл каждого порта. Он хорошо
прокомментирован, и даже если вы не занимаетесь хакингом
make-файлов каждодневно, из него вы сможете узнать много нового.
Кроме того, конкретные вопросы можно задать, послав письмо на
адрес &a.ports;.</para>
<note>
<para>Только часть переменных
(<varname><replaceable>VAR</replaceable></varname>), которые могут быть
переопределены, описаны в этом документе. Большинство (если не все)
описаны в начале файла <filename>/usr/ports/Mk/bsd.port.mk</filename>;
остальные, скорее всего, тоже там описаны. Заметьте, что
в этом файле используется нестандартная настройка шага табуляции:
<application>Emacs</application> и <application>Vim</application>
должны распознать это при загрузке файла. Как &man.vi.1;,
так и &man.ex.1; могут быть настроены на использование
правильного значения выдачей команды <command>:set tabstop=4</command>
после загрузки файла.</para>
</note>
<para>
Ищете, с чего бы начать попроще? Посмотрите на <link xlink:href="http://wiki.freebsd.org/WantedPorts">перечень запрошенных
портов</link>, есть ли там такие, над которыми вы можете работать.
</para>
</chapter>
<note>
<para>Только часть переменных
(<varname><replaceable>VAR</replaceable></varname>), которые
могут быть переопределены, описаны в этом документе.
Большинство (если не все) описаны в начале файла
<filename>/usr/ports/Mk/bsd.port.mk</filename>; остальные,
скорее всего, тоже там описаны. Заметьте, что в этом файле
используется нестандартная настройка шага табуляции:
<application>Emacs</application> и
<application>Vim</application> должны распознать это при
загрузке файла. Как &man.vi.1;, так и &man.ex.1; могут быть
настроены на использование правильного значения выдачей команды
<command>:set tabstop=4</command> после загрузки файла.</para>
</note>
<para>
Ищете, с чего бы начать попроще? Посмотрите на <link
xlink:href="http://wiki.freebsd.org/WantedPorts">перечень
запрошенных портов</link>, есть ли там такие, над которыми вы
можете работать.</para>
</chapter>

View file

@ -7,198 +7,207 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="pkg-files">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="pkg-files">
<title>Файлы <filename>pkg-*</filename></title>
<title>Файлы <filename>pkg-*</filename></title>
<para>åÓÔØ ÎÅÓËÏÌØËÏ ÐÒÉ£ÍÏ× ÒÁÂÏÔÙ Ó ÆÁÊÌÁÍÉ
<filename>pkg-*</filename>, которые мы ещё не
описали, но они иногда могут быть очень кстати.</para>
<filename>pkg-*</filename>, которые мы ещё не описали, но они
иногда могут быть очень кстати.</para>
<sect1 xml:id="porting-message">
<title><filename>pkg-message</filename></title>
<sect1 xml:id="porting-message">
<title><filename>pkg-message</filename></title>
<para>Если вам нужно вывести сообщение для человека, устанавливающего
приложение, то вы можете поместить сообщение в файл
<filename>pkg-message</filename>. Эта возможность часто оказывается
полезной для вывода дополнительных шагов установки, которые нужно
предпринять после выполнения команды <command>pkg install</command>,
или для вывода информации о лицензировании.</para>
<para>Если вам нужно вывести сообщение для человека,
устанавливающего приложение, то вы можете поместить сообщение в
файл <filename>pkg-message</filename>. Эта возможность часто
оказывается полезной для вывода дополнительных шагов установки,
которые нужно предпринять после выполнения команды
<command>pkg install</command>, или для вывода информации о
лицензировании.</para>
<para>Если должны выводиться некоторые строки о knobs времени построения
или предупреждения, используйте <varname>ECHO_MSG</varname>. Файл
<filename>pkg-message</filename> только для послеустановочных шагов.
Также следует иметь в виду различие между <varname>ECHO_MSG</varname>
и <varname>ECHO_CMD</varname>. Первое предназначено для вывода на
экран информационного текста, а второе для конвейера команд:</para>
<para>Если должны выводиться некоторые строки о knobs времени
построения или предупреждения, используйте
<varname>ECHO_MSG</varname>. Файл
<filename>pkg-message</filename> только для послеустановочных
шагов. Также следует иметь в виду различие между
<varname>ECHO_MSG</varname> и <varname>ECHO_CMD</varname>.
Первое предназначено для вывода на экран информационного
текста, а второе для конвейера команд:</para>
<programlisting>update-etc-shells:
<programlisting>update-etc-shells:
@${ECHO_MSG} "updating /etc/shells"
@${CP} /etc/shells /etc/shells.bak
@( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \
${ECHO_CMD} ${PREFIX}/bin/bash) &gt;/etc/shells
@${RM} /etc/shells.bak</programlisting>
<note>
<para>Файл <filename>pkg-message</filename> не нужно добавлять в
<filename>pkg-plist</filename>.</para>
</note>
</sect1>
<note>
<para>Файл <filename>pkg-message</filename> не нужно добавлять в
<filename>pkg-plist</filename>.</para>
</note>
</sect1>
<sect1 xml:id="pkg-install">
<title><filename>pkg-install</filename></title>
<sect1 xml:id="pkg-install">
<title><filename>pkg-install</filename></title>
<para>Если при установке бинарного пакета по команде
<command>pkg add</command> или <command>pkg install</command>
вашему порту нужно выполнить какие-то команды, то вы можете
это сделать с помощью скрипта <filename>pkg-install</filename>.
Этот скрипт будет автоматически добавлен к пакету и будет
дважды запускаться командой <command>pkg</command>: первый раз
в виде <literal>&dollar;{SH} pkg-install &dollar;{PKGNAME}
PRE-INSTALL</literal>, а второй раз как
<literal>&dollar;{SH} {PKGNAME} POST-INSTALL</literal>.
Для распознавания того, в каком режиме запущен скрипт, можно
использовать параметр <literal>&dollar;2</literal>. Переменная
окружения <envar>PKG_PREFIX</envar> будет принимать значение,
соответствующее каталогу, в который устанавливается пакет.</para>
<para>Если при установке бинарного пакета по команде
<command>pkg add</command> или <command>pkg install</command>
вашему порту нужно выполнить какие-то команды, то вы можете это
сделать с помощью скрипта <filename>pkg-install</filename>.
Этот скрипт будет автоматически добавлен к пакету и будет
дважды запускаться командой <command>pkg</command>: первый раз
в виде <literal>&dollar;{SH} pkg-install &dollar;{PKGNAME}
PRE-INSTALL</literal>, а второй раз как
<literal>&dollar;{SH} {PKGNAME} POST-INSTALL</literal>. Для
распознавания того, в каком режиме запущен скрипт, можно
использовать параметр <literal>&dollar;2</literal>. Переменная
окружения <envar>PKG_PREFIX</envar> будет принимать значение,
соответствующее каталогу, в который устанавливается
пакет.</para>
<note>
<para>Этот скрипт не запускается автоматически, если вы
устанавливаете порт командой <command>make install</command>.
Если же вам действительно необходимо его запустить, то запустите
его явно из файла <filename>Makefile</filename> порта строкой
вида <literal>PKG_PREFIX=&dollar;{PREFIX} &dollar;{SH} &dollar;
{PKGINSTALL}&dollar;{PKGNAME} PRE-INSTALL</literal>.</para>
</note>
</sect1>
<note>
<para>Этот скрипт не запускается автоматически, если вы
устанавливаете порт командой <command>make install</command>.
Если же вам действительно необходимо его запустить, то
запустите его явно из файла <filename>Makefile</filename>
порта строкой вида <literal>PKG_PREFIX=&dollar;{PREFIX}
&dollar;{SH} &dollar; {PKGINSTALL}&dollar;{PKGNAME}
PRE-INSTALL</literal>.</para>
</note>
</sect1>
<sect1 xml:id="pkg-deinstall">
<title><filename>pkg-deinstall</filename></title>
<sect1 xml:id="pkg-deinstall">
<title><filename>pkg-deinstall</filename></title>
<para>Этот скрипт вызывается при удалении пакета.</para>
<para>Этот скрипт вызывается при удалении пакета.</para>
<para>Этот скрипт будет дважды запускаться командой
<command>pkg delete</command>.
Первый раз как <literal>&dollar;{SH} pkg-deinstall
&dollar;{PKGNAME} DEINSTALL</literal>, а второй раз как
<literal>&dollar;{SH} pkg-deinstall &dollar;{PKGNAME}
POST-DEINSTALL</literal>.</para>
</sect1>
<para>Этот скрипт будет дважды запускаться командой
<command>pkg delete</command>. Первый раз как
<literal>&dollar;{SH} pkg-deinstall &dollar;{PKGNAME}
DEINSTALL</literal>, а второй раз как <literal>&dollar;{SH}
pkg-deinstall &dollar;{PKGNAME}
POST-DEINSTALL</literal>.</para>
</sect1>
<sect1 xml:id="pkg-names">
<title xml:id="porting-pkgfiles">Изменение имён файлов
<filename>pkg-*</filename></title>
<sect1 xml:id="pkg-names">
<title xml:id="porting-pkgfiles">Изменение имён файлов
<filename>pkg-*</filename></title>
<para>Все имена файлов
<filename>pkg-*</filename>
определяются с помощью переменных, так что вы можете изменить их,
если это нужно, в вашем файле <filename>Makefile</filename>. Это
особенно полезно, если вы используете одни и те же файлы
<filename>pkg-*</filename>
совместно между несколькими портами или
пишете в один из вышеперечисленных файлов (в главе о <link linkend="porting-wrkdir">записи в каталоги, отличные от
<varname>WRKDIR</varname></link> объяснено, почему не рекомендуется
осуществлять запись непосредственно в файлы
<filename>pkg-*</filename>.</para>
<para>Все имена файлов <filename>pkg-*</filename> определяются с
помощью переменных, так что вы можете изменить их, если это
нужно, в вашем файле <filename>Makefile</filename>. Это
особенно полезно, если вы используете одни и те же файлы
<filename>pkg-*</filename> совместно между несколькими портами
или пишете в один из вышеперечисленных файлов (в главе о <link
linkend="porting-wrkdir">записи в каталоги, отличные от
<varname>WRKDIR</varname></link> объяснено, почему не
рекомендуется осуществлять запись непосредственно в файлы
<filename>pkg-*</filename>.</para>
<para>Вот список имён переменных и их значений по умолчанию. (Значение
<varname>PKGDIR</varname> по умолчанию равно
<varname>${MASTERDIR}</varname>.)</para>
<para>Вот список имён переменных и их значений по умолчанию.
(Значение <varname>PKGDIR</varname> по умолчанию равно
<varname>${MASTERDIR}</varname>.)</para>
<informaltable frame="none" pgwide="0">
<tgroup cols="2">
<thead>
<row>
<entry>Переменная</entry>
<informaltable frame="none" pgwide="0">
<tgroup cols="2">
<thead>
<row>
<entry>Переменная</entry>
<entry>Значение по умолчанию</entry>
</row>
</thead>
<entry>Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>DESCR</varname></entry>
<entry><literal>${PKGDIR}/pkg-descr</literal></entry>
</row>
<tbody>
<row>
<entry><varname>DESCR</varname></entry>
<entry><literal>${PKGDIR}/pkg-descr</literal></entry>
</row>
<row>
<entry><varname>PLIST</varname></entry>
<entry><literal>${PKGDIR}/pkg-plist</literal></entry>
</row>
<row>
<entry><varname>PLIST</varname></entry>
<entry><literal>${PKGDIR}/pkg-plist</literal></entry>
</row>
<row>
<entry><varname>PKGINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
</row>
<row>
<entry><varname>PKGINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
</row>
<row>
<entry><varname>PKGDEINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-deinstall</literal></entry>
</row>
<row>
<entry><varname>PKGMESSAGE</varname></entry>
<entry><literal>${PKGDIR}/pkg-message</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<row>
<entry><varname>PKGMESSAGE</varname></entry>
<entry><literal>${PKGDIR}/pkg-message</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Пожалуйста, изменяйте значения этих переменных, а не
переопределяйте <varname>PKG_ARGS</varname>. Если вы измените
значение переменных <varname>PKG_ARGS</varname>, то эти файлы при
установке из порта будут установлены в каталог
<filename>/var/db/pkg</filename> некорректно.</para>
</sect1>
<para>Пожалуйста, изменяйте значения этих переменных, а не
переопределяйте <varname>PKG_ARGS</varname>. Если вы измените
значение переменных <varname>PKG_ARGS</varname>, то эти файлы
при установке из порта будут установлены в каталог
<filename>/var/db/pkg</filename> некорректно.</para>
</sect1>
<sect1 xml:id="using-sub-files">
<title>Использование <varname>SUB_FILES</varname> и
<varname>SUB_LIST</varname></title>
<sect1 xml:id="using-sub-files">
<title>Использование <varname>SUB_FILES</varname> и
<varname>SUB_LIST</varname></title>
<para>Переменные <varname>SUB_FILES</varname> и
<varname>SUB_LIST</varname> подходят для задания в файлах порта
динамических значений, таких как <varname>PREFIX</varname> установки
в <filename>pkg-message</filename>.</para>
<para>Переменные <varname>SUB_FILES</varname> и
<varname>SUB_LIST</varname> подходят для задания в файлах порта
динамических значений, таких как <varname>PREFIX</varname>
установки в <filename>pkg-message</filename>.</para>
<para>В переменной <varname>SUB_FILES</varname> указывается перечень
файлов для автоматического изменения. Каждый
<replaceable>file</replaceable> из перечня <varname>SUB_FILES</varname>
обязан иметь соответствующий
<filename>file.in</filename>,
присутствующий в <varname>FILESDIR</varname>. Измененная версия
будет создана в <varname>WRKDIR</varname>. Файлы, определенные в
качестве значения <varname>USE_RC_SUBR</varname> (или устаревшего
<varname>USE_RCORDER</varname>), автоматически добавляются в
<varname>SUB_FILES</varname>. Для файлов
<filename>pkg-message</filename>, <filename>pkg-install</filename>
и <filename>pkg-deinstall</filename>
устанавливается соответствующая переменная Makefile, указывающая на
обработанную версию.</para>
<para>В переменной <varname>SUB_FILES</varname> указывается
перечень файлов для автоматического изменения. Каждый
<replaceable>file</replaceable> из перечня
<varname>SUB_FILES</varname> обязан иметь соответствующий
<filename>file.in</filename>, присутствующий в
<varname>FILESDIR</varname>. Измененная версия будет создана в
<varname>WRKDIR</varname>. Файлы, определенные в качестве
значения <varname>USE_RC_SUBR</varname> (или устаревшего
<varname>USE_RCORDER</varname>), автоматически добавляются в
<varname>SUB_FILES</varname>. Для файлов
<filename>pkg-message</filename>,
<filename>pkg-install</filename> и
<filename>pkg-deinstall</filename> устанавливается
соответствующая переменная Makefile, указывающая на
обработанную версию.</para>
<para>Переменная <varname>SUB_LIST</varname> содержит перечень пар
<literal>VAR=VALUE</literal>. В каждом файле из
<varname>SUB_FILES</varname> для каждой пары будет произведена
замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>.
Некоторые общие пары определяются автоматически:
<varname>PREFIX</varname>, <varname>LOCALBASE</varname>,
<varname>DATADIR</varname>,
<varname>DOCSDIR</varname>, <varname>EXAMPLESDIR</varname>,
<varname>WWWDIR</varname> и <varname>ETCDIR</varname>.
Любая строка, начинающаяся с <literal>@comment</literal>, будет
удалена из конечного файла после подстановки переменной.</para>
<para>Переменная <varname>SUB_LIST</varname> содержит перечень
пар <literal>VAR=VALUE</literal>. В каждом файле из
<varname>SUB_FILES</varname> для каждой пары будет произведена
замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>.
Некоторые общие пары определяются автоматически:
<varname>PREFIX</varname>, <varname>LOCALBASE</varname>,
<varname>DATADIR</varname>, <varname>DOCSDIR</varname>,
<varname>EXAMPLESDIR</varname>, <varname>WWWDIR</varname> и
<varname>ETCDIR</varname>. Любая строка, начинающаяся с
<literal>@comment</literal>, будет удалена из конечного файла
после подстановки переменной.</para>
<para>В следующем примере в <filename>pkg-message</filename>
будет сделана замена <literal>%%ARCH%%</literal> на системную
архитектуру:</para>
<para>В следующем примере в <filename>pkg-message</filename>
будет сделана замена <literal>%%ARCH%%</literal> на системную
архитектуру:</para>
<programlisting>SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}</programlisting>
<programlisting>SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}</programlisting>
<para>Обратите внимание, что в этом примере в <varname>FILESDIR</varname>
обязательно существование файла <filename>pkg-message.in</filename>.
</para>
<para>Обратите внимание, что в этом примере в
<varname>FILESDIR</varname> обязательно существование файла
<filename>pkg-message.in</filename>.</para>
<para>Пример хорошего <filename>pkg-message.in</filename>:</para>
<para>Пример хорошего <filename>pkg-message.in</filename>:</para>
<programlisting>Now it's time to configure this package.
<programlisting>Now it is time to configure this package.
Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.</programlisting>
</sect1>
</chapter>
</sect1>
</chapter>

View file

@ -7,278 +7,292 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="plist">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="plist">
<title>Продвинутые практики <filename>pkg-plist</filename></title>
<sect1 xml:id="plist-sub">
<title>Изменение содержимого <filename>pkg-plist</filename> в зависимости
от make-переменных</title>
<title>Продвинутые практики <filename>pkg-plist</filename></title>
<para>Некоторые порты, в частности, порты <literal>p5-</literal>, должны
менять содержимое своих файлов <filename>pkg-plist</filename> в
зависимости от того, с какими параметрами они были отконфигурированы
(или в зависимости от версии языка <literal>perl</literal> в случае
портов <literal>p5-</literal>). Чтобы облегчить этот
процесс, любые вхождения ключевых слов <literal>%%OSREL%%</literal>,
<literal>%%PERL_VER%%</literal> и <literal>%%PERL_VERSION%%</literal>
в файле <filename>pkg-plist</filename> будут заменяться соответствующими
значениями. Значением <literal>%%OSREL%%</literal> является номер
версии операционной системы (например, <literal>4.9</literal>).
<literal>%%PERL_VERSION%%</literal> и <literal>%%PERL_VER%%</literal>
обозначают полный номер версии <command>perl</command> (например,
<literal>5.8.9</literal>). Некоторые
другие <literal>%%VARS%%</literal>, имеющие
отношение к файлам документации порта, описаны в <link linkend="install-documentation">соответствующем разделе</link>.</para>
<sect1 xml:id="plist-sub">
<title>Изменение содержимого <filename>pkg-plist</filename> в
зависимости от make-переменных</title>
<para>Если вам нужно сделать другие подстановки, вы можете указать в
переменной <varname>PLIST_SUB</varname> список пар
<literal>VAR=VALUE</literal>,
и все вхождения <literal>%%VAR%%</literal>
в файле <filename>pkg-plist</filename> будут заменяться на значение
<replaceable>VALUE</replaceable>.</para>
<para>Некоторые порты, в частности, порты <literal>p5-</literal>,
должны менять содержимое своих файлов
<filename>pkg-plist</filename> в зависимости от того, с какими
параметрами они были отконфигурированы (или в зависимости от
версии языка <literal>perl</literal> в случае портов
<literal>p5-</literal>). Чтобы облегчить этот процесс, любые
вхождения ключевых слов <literal>%%OSREL%%</literal>,
<literal>%%PERL_VER%%</literal> и
<literal>%%PERL_VERSION%%</literal> в файле
<filename>pkg-plist</filename> будут заменяться
соответствующими значениями. Значением
<literal>%%OSREL%%</literal> является номер версии операционной
системы (например, <literal>4.9</literal>).
<literal>%%PERL_VERSION%%</literal> и
<literal>%%PERL_VER%%</literal> обозначают полный номер версии
<command>perl</command> (например, <literal>5.8.9</literal>).
Некоторые другие <literal>%%VARS%%</literal>, имеющие отношение
к файлам документации порта, описаны в <link
linkend="install-documentation">соответствующем
разделе</link>.</para>
<para>Например, если у вас имеется порт, который устанавливает много
файлов в каталог, зависящий от версии, вы можете задать нечто
типа</para>
<para>Если вам нужно сделать другие подстановки, вы можете
указать в переменной <varname>PLIST_SUB</varname> список пар
<literal>VAR=VALUE</literal>, и все вхождения
<literal>%%VAR%%</literal> в файле
<filename>pkg-plist</filename> будут заменяться на значение
<replaceable>VALUE</replaceable>.</para>
<programlisting>OCTAVE_VERSION= 2.0.13
<para>Например, если у вас имеется порт, который устанавливает
много файлов в каталог, зависящий от версии, вы можете задать
нечто типа</para>
<programlisting>OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting>
<para>в файле <filename>Makefile</filename> и использовать
<literal>%%OCTAVE_VERSION%%</literal> везде, где нужно указать
номер версии в файле <filename>pkg-plist</filename>. Таким образом,
при обновлении порта вам не нужно будет менять десятки (а в некоторых
случаях и сотни) строк в файле <filename>pkg-plist</filename>.</para>
<para>в файле <filename>Makefile</filename> и использовать
<literal>%%OCTAVE_VERSION%%</literal> везде, где нужно указать
номер версии в файле <filename>pkg-plist</filename>. Таким
образом, при обновлении порта вам не нужно будет менять десятки
(а в некоторых случаях и сотни) строк в файле
<filename>pkg-plist</filename>.</para>
<para>Если ваш порт устанавливает файлы в соответствии с установленными
в порту опциями, то обычным способом управления является добавление
префиксов <literal>%%TAG%%</literal> для строк
<filename>pkg-plist</filename> с добавлением этого
<literal>TAG</literal> в переменную <varname>PLIST_SUB</varname>
внутри <filename>Makefile</filename> со специальным значением
<literal>@comment</literal>, которое указывает пакетным инструментам
игнорировать эти строки:</para>
<para>Если ваш порт устанавливает файлы в соответствии с
установленными в порту опциями, то обычным способом управления
является добавление префиксов <literal>%%TAG%%</literal> для
строк <filename>pkg-plist</filename> с добавлением этого
<literal>TAG</literal> в переменную
<varname>PLIST_SUB</varname> внутри
<filename>Makefile</filename> со специальным значением
<literal>@comment</literal>, которое указывает пакетным
инструментам игнорировать эти строки:</para>
<programlisting>.if defined(WITH_X11)
<programlisting>.if defined(WITH_X11)
PLIST_SUB+= X11=""
.else
PLIST_SUB+= X11="@comment "
.endif</programlisting>
<para>и в самом <filename>pkg-plist</filename>:</para>
<para>и в самом <filename>pkg-plist</filename>:</para>
<programlisting>%%X11%%bin/foo-gui</programlisting>
<programlisting>%%X11%%bin/foo-gui</programlisting>
<para>Эта подстановка будет сделана
между выполнением целей <buildtarget>pre-install</buildtarget> и
<buildtarget>do-install</buildtarget>, посредством чтения файла
<filename>PLIST</filename> и записью в файл
<filename>TMPPLIST</filename>
(по умолчанию это файл
<filename>WRKDIR/.PLIST.mktmp</filename>). Так
что если ваш порт строит <filename>PLIST</filename> на лету, делайте
это во время или до выполнения цели
<buildtarget>pre-install</buildtarget>. Кроме того, если вашему порту
требуется отредактировать получающийся файл, делайте это в цели
<buildtarget>post-install</buildtarget> изменением файла
<filename>TMPPLIST</filename>.</para>
<para>Эта подстановка будет сделана между выполнением целей
<buildtarget>pre-install</buildtarget> и
<buildtarget>do-install</buildtarget>, посредством чтения файла
<filename>PLIST</filename> и записью в файл
<filename>TMPPLIST</filename> (по умолчанию это файл
<filename>WRKDIR/.PLIST.mktmp</filename>). Так что если ваш
порт строит <filename>PLIST</filename> на лету, делайте это во
время или до выполнения цели
<buildtarget>pre-install</buildtarget>. Кроме того, если
вашему порту требуется отредактировать получающийся файл,
делайте это в цели <buildtarget>post-install</buildtarget>
изменением файла <filename>TMPPLIST</filename>.</para>
<para>Другой способ изменения списка сборки порта основан на
определении значений переменных <varname>PLIST_FILES</varname>,
<varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname>.
Каждое из них рассматривается как перечень путей для записи в
<filename>TMPPLIST</filename> содержимого
<filename>PLIST</filename>. Имена, перечисленные
в <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname>
и <varname>PLIST_DIRSTRY</varname> подвергаются подстановке
<literal>%%VAR%%</literal>, как описано
выше. За исключением этого, имена из <varname>PLIST_FILES</varname>
будут появляться в окончательном варианте перечня сборки без
изменений, тогда как <literal>@dirrm</literal> и
<literal>@dirrmtry</literal> будут соответственно предшествовать
именам из <varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname>. Для того чтобы изменения
вступили в силу, <varname>PLIST_FILES</varname>,
<varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname>
должны задаваться до того, как будет
записываться <filename>TMPPLIST</filename>, то
есть в цели <buildtarget>pre-install</buildtarget> или ещё
раньше.</para>
</sect1>
<para>Другой способ изменения списка сборки порта основан на
определении значений переменных <varname>PLIST_FILES</varname>,
<varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname>. Каждое из них
рассматривается как перечень путей для записи в
<filename>TMPPLIST</filename> содержимого
<filename>PLIST</filename>. Имена, перечисленные в
<varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname> подвергаются подстановке
<literal>%%VAR%%</literal>, как описано выше. За исключением
этого, имена из <varname>PLIST_FILES</varname> будут появляться
в окончательном варианте перечня сборки без изменений, тогда
как <literal>@dirrm</literal> и <literal>@dirrmtry</literal>
будут соответственно предшествовать именам из
<varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname>. Для того чтобы изменения
вступили в силу, <varname>PLIST_FILES</varname>,
<varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname> должны задаваться до того, как
будет записываться <filename>TMPPLIST</filename>, то есть в
цели <buildtarget>pre-install</buildtarget> или ещё
раньше.</para>
</sect1>
<sect1 xml:id="plist-cleaning">
<title>Пустые каталоги</title>
<sect1 xml:id="plist-cleaning">
<title>Пустые каталоги</title>
<sect2 xml:id="plist-dir-cleaning">
<title>Очистка пустых каталогов</title>
<sect2 xml:id="plist-dir-cleaning">
<title>Очистка пустых каталогов</title>
<para>Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это
достигается добавлением строк <literal>@dirrm</literal> для всех
каталогов, которые создаются этим портом. Вам нужно удалить
подкаталоги до того, как вы сможете удалить родительские
каталоги.</para>
<para>Заставьте ваш порты удалять пустые каталоги при удалении.
Обычно это достигается добавлением строк
<literal>@dirrm</literal> для всех каталогов, которые
создаются этим портом. Вам нужно удалить подкаталоги до
того, как вы сможете удалить родительские каталоги.</para>
<programlisting>
:
<programlisting> :
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
</programlisting>
@dirrm lib/X11/oneko</programlisting>
<para>Однако, иногда <literal>@dirrm</literal> будет выдавать ошибки,
потому что другие порты используют тот же самый подкаталог. Вы
можете использовать <literal>@dirrmtry</literal> для удаления
только пустых каталогов без выдачи предупреждений.</para>
<para>Однако, иногда <literal>@dirrm</literal> будет выдавать
ошибки, потому что другие порты используют тот же самый
подкаталог. Вы можете использовать
<literal>@dirrmtry</literal> для удаления только пустых
каталогов без выдачи предупреждений.</para>
<programlisting>@dirrmtry share/doc/gimp</programlisting>
<para>Эта команда не выведет никаких сообщений об ошибках и не вызовет
аварийного завершения работы <command>pkg delete</command>
(см. &man.pkg-delete.8;), даже если
каталог <filename>${PREFIX}/share/doc/gimp</filename>
<para>Эта команда не выведет никаких сообщений об ошибках и не
вызовет аварийного завершения работы
<command>pkg delete</command> (см. &man.pkg-delete.8;), даже
если каталог <filename>${PREFIX}/share/doc/gimp</filename>
ÎÅ ÐÕÓÔ ÉÚ-ÚÁ ÔÏÇÏ, ÞÔÏ ÄÒÕÇÉÅ ÐÏÒÔÙ ÕÓÔÁÎÏ×ÉÌÉ ÓÀÄÁ ËÁËÉÅ-ÔÏ
ÆÁÊÌÙ.</para>
</sect2>
</sect2>
<sect2 xml:id="plist-dir-empty">
<title>Создание пустых каталогов</title>
<sect2 xml:id="plist-dir-empty">
<title>Создание пустых каталогов</title>
<para>Пустым каталогам, создаваемым во время установки порта, нужно
особое внимание. Они не будут созданы при установке пакета, потому
что пакеты содержат только файлы, а <command>pkg add</command>
и <command>pkg install</command> создают для них
каталоги по мере надобности. Чтобы убедиться, что пустой каталог
создается при установке пакета, добавьте эту строку в
<filename>pkg-plist</filename> перед соответствующей строкой
<literal>@dirrm</literal>:</para>
<para>Пустым каталогам, создаваемым во время установки порта,
нужно особое внимание. Они не будут созданы при установке
пакета, потому что пакеты содержат только файлы, а
<command>pkg add</command> и <command>pkg install</command>
создают для них каталоги по мере надобности. Чтобы
убедиться, что пустой каталог создается при установке пакета,
добавьте эту строку в <filename>pkg-plist</filename> перед
соответствующей строкой <literal>@dirrm</literal>:</para>
<programlisting>@exec mkdir -p %D/share/foo/templates</programlisting>
</sect2>
<programlisting>@exec mkdir -p %D/share/foo/templates</programlisting>
</sect2>
</sect1>
</sect1>
<sect1 xml:id="plist-config">
<title>Конфигурационные файлы</title>
<sect1 xml:id="plist-config">
<title>Конфигурационные файлы</title>
<para>Если ваш порт устанавливает конфигурационные файлы в
каталог <filename>PREFIX/etc</filename> (или куда-то еще),
<emphasis>не</emphasis> делайте их простого перечисления в
файле <filename>pkg-plist</filename>. Это приведёт к тому, что
по команде <command>pkg delete</command> или при новой
установке файлы, тщательно отредактированные и настроенные
пользователем, будут уничтожены.</para>
<para>Если ваш порт устанавливает конфигурационные файлы в каталог
<filename>PREFIX/etc</filename> (или куда-то еще),
<emphasis>не</emphasis> делайте их простого перечисления в файле
<filename>pkg-plist</filename>. Это приведёт к тому, что по команде
<command>pkg delete</command> или при новой установке файлы,
тщательно отредактированные и настроенные пользователем, будут
уничтожены.</para>
<para>Вместо этого установите файл(ы) с примерами с расширением
<filename>filename.sample</filename>. Затем скопируйте файл с
примером на место настоящего файла конфигурации, если таковой
ещё не существует. При деинсталляции удаляйте файл
конфигурации только в том случае, если он идентичен файлу с
расширением <filename>.sample</filename>. Вам нужно управлять
этим в <filename>Makefile</filename> и в
<filename>pkg-plist</filename> (для установки из
пакета).</para>
<para>Вместо этого установите файл(ы) с примерами с расширением
<filename>filename.sample</filename>.
Затем скопируйте файл с примером на место настоящего файла
конфигурации, если таковой ещё не существует. При деинсталляции
удаляйте файл конфигурации только в том случае, если он идентичен
файлу с расширением <filename>.sample</filename>. Вам
нужно управлять этим в <filename>Makefile</filename> и в
<filename>pkg-plist</filename> (для установки из пакета).</para>
<para>Пример части <filename>Makefile</filename>:</para>
<para>Пример части <filename>Makefile</filename>:</para>
<programlisting>post-install:
<programlisting>post-install:
@if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
${CP} -p ${PREFIX}/etc/orbit.conf.sample ${STAGEDIR}${PREFIX}/etc/orbit.conf ; \
fi</programlisting>
<para>Добавьте по три строки в <filename>pkg-plist</filename> для
каждого конфигурационного файла, как показано ниже:</para>
<para>Добавьте по три строки в <filename>pkg-plist</filename> для
каждого конфигурационного файла, как показано ниже:</para>
<programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
<programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
etc/orbit.conf.sample
@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi</programlisting>
<para>Данные строки являются упорядоченными. На этапе удаления
файл с примером сравнивается с рабочим конфигурационным файлом.
Полное совпадение означает отсутствие каких-либо изменений в
рабочем файле со стороны пользователя, и следовательно этот файл
может быть безопасно удалён. Так как файл с примером всё ещё
должен существовать для сравнения, строка <literal>@unexec</literal>
следует перед именем файла с примером конфигурации. На этапе
установки, если рабочий файл конфигурации отсутствует, он
копируется из файла с примером. Файл с примером обязательно
должен быть установлен до операции копирования, поэтому строка
<literal>@exec</literal> следует после имени файла с примером
конфигурации.</para>
<para>Данные строки являются упорядоченными. На этапе удаления
файл с примером сравнивается с рабочим конфигурационным файлом.
Полное совпадение означает отсутствие каких-либо изменений в
рабочем файле со стороны пользователя, и следовательно этот
файл может быть безопасно удалён. Так как файл с примером всё
ещё должен существовать для сравнения, строка
<literal>@unexec</literal> следует перед именем файла с
примером конфигурации. На этапе установки, если рабочий файл
конфигурации отсутствует, он копируется из файла с примером.
Файл с примером обязательно должен быть установлен до операции
копирования, поэтому строка <literal>@exec</literal> следует
после имени файла с примером конфигурации.</para>
<para>Для получения дополнительного отладочного вывода на экран
можно временно удалить параметр <literal>-s</literal> из команды
&man.cmp.1;.</para>
<para>Для получения дополнительного отладочного вывода на экран
можно временно удалить параметр <literal>-s</literal> из
команды &man.cmp.1;.</para>
<para>Для получения дополнительной инфорации по использованию
<literal>%D</literal> и прочих маркеров подстановки обратитесь
к странице Справочника &man.pkg-create.8;.</para>
<para>Для получения дополнительной инфорации по использованию
<literal>%D</literal> и прочих маркеров подстановки обратитесь
к странице Справочника &man.pkg-create.8;.</para>
<para>Если существует действительно стоящая причина не устанавливать
рабочий файл конфигурации по умолчанию, уберите строку
<literal>@exec</literal> из <filename>pkg-plist</filename> и
добавьте <link linkend="porting-message">сообщение</link>,
указывающее на то, что пользователь обязан скопировать и
отредактировать этот файл перед тем, как программное обеспечение
начнёт работать.</para>
</sect1>
<para>Если существует действительно стоящая причина не
устанавливать рабочий файл конфигурации по умолчанию, уберите
строку <literal>@exec</literal> из
<filename>pkg-plist</filename> и добавьте <link
linkend="porting-message">сообщение</link>, указывающее на
то, что пользователь обязан скопировать и отредактировать этот
файл перед тем, как программное обеспечение начнёт
работать.</para>
</sect1>
<sect1 xml:id="plist-dynamic">
<title>Динамический или статический список упаковки</title>
<sect1 xml:id="plist-dynamic">
<title>Динамический или статический список упаковки</title>
<para><emphasis>Статический список упаковки</emphasis> &mdash; это список
упаковки, который доступен в Коллекции Портов или как файл
<filename>pkg-plist</filename> (с подстановкой переменных или без
неё), или как встроенный в <filename>Makefile</filename> посредством
<varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname>
и <varname>PLIST_DIRSTRY</varname>.
Даже если содержимое является автоматически порождаемым при помощи
инструмента или в результате выполнения цели в Makefile
<emphasis>до</emphasis> включения в Коллекцию Портов коммиттером,
то список всё ещё будет считаться статическим, поскольку его
можно узнать без необходимости скачивания или компиляции
дистрибутива.</para>
<para><emphasis>Статический список упаковки</emphasis> &mdash;
это список упаковки, который доступен в Коллекции Портов или
как файл <filename>pkg-plist</filename> (с подстановкой
переменных или без неё), или как встроенный в
<filename>Makefile</filename> посредством
<varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> и
<varname>PLIST_DIRSTRY</varname>. Даже если содержимое
является автоматически порождаемым при помощи инструмента или в
результате выполнения цели в Makefile <emphasis>до</emphasis>
включения в Коллекцию Портов коммиттером, то список всё ещё
будет считаться статическим, поскольку его можно узнать без
необходимости скачивания или компиляции дистрибутива.</para>
<para><emphasis>Динамический список упаковки</emphasis> это список
упаковки, который получается во время компиляции порта и строится
на основе устанавливаемых файлов и каталогов. Узнать такой список
невозможно до того, как исходный код портируемого приложения
будет скачен и скомпилирован, или после запуска
<literal>make clean</literal>.</para>
<para><emphasis>Динамический список упаковки</emphasis> это
список упаковки, который получается во время компиляции порта и
строится на основе устанавливаемых файлов и каталогов. Узнать
такой список невозможно до того, как исходный код портируемого
приложения будет скачен и скомпилирован, или после запуска
<literal>make clean</literal>.</para>
<para>Хотя использование динамических список упаковки не запрещено,
сопровождающие должны использовать статические списки упаковки
везде, где это возможно, поскольку это позволяет пользователям
выполнять &man.grep.1; по доступным портам для обнаружения, например,
который порт устанавливает определенный файл. Динамические списки
должны быть использованы в основном для сложных портов, для которых
изменения в списке упаковки кардинальным образом основаны на
необязательных возможностях порта (и, таким образом, делая
сопровождение статических списков упаковки невозможным), или портов,
которые изменяют список упаковки на основе версии используемого
им программного обеспечения (например, порты, которые порождают
документы при помощи <application>Javadoc</application>).</para>
</sect1>
<para>Хотя использование динамических список упаковки не
запрещено, сопровождающие должны использовать статические
списки упаковки везде, где это возможно, поскольку это
позволяет пользователям выполнять &man.grep.1; по доступным
портам для обнаружения, например, который порт устанавливает
определенный файл. Динамические списки должны быть
использованы в основном для сложных портов, для которых
изменения в списке упаковки кардинальным образом основаны на
необязательных возможностях порта (и, таким образом, делая
сопровождение статических списков упаковки невозможным), или
портов, которые изменяют список упаковки на основе версии
используемого им программного обеспечения (например, порты,
которые порождают документы при помощи
<application>Javadoc</application>).</para>
</sect1>
<sect1 xml:id="plist-autoplist">
<title>á×ÔÏÍÁÔÉÞÅÓËÏÅ ÓÏÚÄÁÎÉÅ ÓÐÉÓËÁ ÕÐÁËÏ×ËÉ</title>
<para>ðÅÒ×ÙÍ ÄÅÌÏÍ ÕÂÅÄÉÔÅÓØ, ÞÔÏ ×ÁÛ ÐÏÒÔ ÐÒÁËÔÉÞÅÓËÉ ÐÏÌÎÏÓÔØÀ
завершён и осталось создать только <filename>pkg-plist</filename>.
После этого вы можете запустить <command>make makeplist</command>
для автоматического создания <filename>pkg-plist</filename>.
Содержимое этого файла должно быть дважды перепроверено.</para>
завершён и осталось создать только
<filename>pkg-plist</filename>. После этого вы можете
запустить <command>make makeplist</command> для автоматического
создания <filename>pkg-plist</filename>. Содержимое этого
файла должно быть дважды перепроверено.</para>
<para>ðÏÌØÚÏ×ÁÔÅÌØÓËÉÅ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ ÄÏÌÖÎÙ ÂÙÔØ ÕÄÁÌÅÎÙ
или быть установлены как
<filename>filename.sample</filename>.
Файл <filename>info/dir</filename> включать в список не нужно, но
должны быть добавлены соответствующие строчки
<filename>install-info</filename>, так, как это описано в разделе о <link linkend="makefile-info">файлах в формате info</link>. Все
библиотеки, устанавливаемые портом, должны быть перечислены так, как
это описано в разделе о <link linkend="porting-shlibs">динамических библиотеках</link>.</para>
или быть установлены как <filename>filename.sample</filename>.
Файл <filename>info/dir</filename> включать в список не нужно,
но должны быть добавлены соответствующие строчки
<filename>install-info</filename>, так, как это описано в
разделе о <link
linkend="makefile-info">файлах в формате info</link>. Все
библиотеки, устанавливаемые портом, должны быть перечислены
так, как это описано в разделе о <link
linkend="porting-shlibs">динамических
библиотеках</link>.</para>
</sect1>
</chapter>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -7,21 +7,24 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="porting-samplem">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="porting-samplem">
<title>Примерный <filename>Makefile</filename></title>
<title>Примерный <filename>Makefile</filename></title>
<para>Вот примерный <filename>Makefile</filename>, который можно
использовать при создании нового порта. Обязательно удалите все
дополнительные комментарии (те, которые в скобках)!</para>
<para>Вот примерный <filename>Makefile</filename>, который можно
использовать при создании нового порта. Обязательно удалите все
дополнительные комментарии (те, которые в скобках)!</para>
<para>Вам рекомендуется следовать этому формату (соблюдая порядок
следования переменных, пустые строки между разделами, и так далее).
Этот формат разработан для того, чтобы важная информация была легко
найдена. Мы рекомендуем вам воспользоваться утилитой <link linkend="porting-portlint">portlint</link> для проверки файла
<filename>Makefile</filename>.</para>
<para>Вам рекомендуется следовать этому формату (соблюдая порядок
следования переменных, пустые строки между разделами, и так
далее). Этот формат разработан для того, чтобы важная информация
была легко найдена. Мы рекомендуем вам воспользоваться утилитой
<link linkend="porting-portlint">portlint</link> для проверки
файла <filename>Makefile</filename>.</para>
<programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.]
<programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.]
# Created by: Satoshi Asami &lt;asami@FreeBSD.org&gt;
[Необязательная строка <emphasis>Created by:</emphasis> содержит имя
человека, создавшего первоначальную версию порта. Следует отметить,
@ -41,56 +44,56 @@
PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.
Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,
EXTRACT_ONLY.]
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
[не забывайте про завершающую косую черту ("/")!
если вы не используете макросы MASTER_SITE_*]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
[задайте это, если исходный код поставляется не в виде
стандартного файла ".tar.gz"]
EXTRACT_SUFX= .tar.Z
EXTRACT_SUFX= .tar.Z
[секция патчей -- может быть пустой]
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
[сопровождающий; *обязательное поле*! Это человек, который добровольно
занимается обновлениями порта и неисправностями при построении, и которому
пользователь может направлять вопросы и сообщения об ошибках. Для
сохранения как можно более высокого качества Коллекции Портов мы больше
не принимаем новые порты, назначенные на "ports@FreeBSD.org".]
MAINTAINER= asami@FreeBSD.org
COMMENT= DVI Previewer for the X Window System
MAINTAINER= asami@FreeBSD.org
COMMENT= DVI Previewer for the X Window System
[зависимости -- могут быть пустыми]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме
тех, что перечислены выше]
[Если порт задает вопросы во время этапов настройки, построения,
установки...]
IS_INTERACTIVE= yes
IS_INTERACTIVE= yes
[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]
WRKSRC= ${WRKDIR}/xdvi-new
WRKSRC= ${WRKDIR}/xdvi-new
[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не
придется изменять эту переменную]
PATCH_DIST_STRIP= -p1
PATCH_DIST_STRIP= -p1
[Если порт требует скрипта "configure", генерируемого GNU-версией программы
autoconf]
GNU_CONFIGURE= yes
GNU_CONFIGURE= yes
[Если для построения порту требуется GNU-версия утилиты make, а не
/usr/bin/make...]
USES= gmake
USES= gmake
[Если это приложение X и требует запуска "xmkmf -a"...]
USES= imake
USES= imake
[и так далее]
[В правилах ниже используются нестандартные переменные]
MY_FAVORITE_RESPONSE= "yeah, right"
MY_FAVORITE_RESPONSE= "yeah, right"
[теперь специальные правила, в порядке их вызова]
pre-fetch:
@ -104,7 +107,5 @@ pre-install:
[и, наконец, эпилог]
.include &lt;bsd.port.mk&gt;
</programlisting>
</chapter>
.include &lt;bsd.port.mk&gt;</programlisting>
</chapter>

View file

@ -7,19 +7,20 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="why-port">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="why-port">
<title>Введение</title>
<title>Введение</title>
<para>Коллекция портов &os; является способом, используемым
практически каждым для установки приложений ("портов") на &os;.
Как и почти всё остальное во &os;, эта система в основном является
добровольно поддерживаемым начинанием. Важно иметь это в виду при
чтении данного документа.</para>
<para>Во &os; каждый может прислать новый порт либо изъявить желание
поддерживать существующий порт, если его никто ещё никто не
поддерживает&mdash;вам не нужно иметь никаких особых привилегий на
внесение изменений, чтобы это делать.</para>
</chapter>
<para>Коллекция портов &os; является способом, используемым
практически каждым для установки приложений ("портов") на &os;.
Как и почти всё остальное во &os;, эта система в основном
является добровольно поддерживаемым начинанием. Важно иметь это
в виду при чтении данного документа.</para>
<para>Во &os; каждый может прислать новый порт либо изъявить
желание поддерживать существующий порт, если его никто ещё никто
не поддерживает&mdash;вам не нужно иметь никаких особых
привилегий на внесение изменений, чтобы это делать.</para>
</chapter>

View file

@ -7,150 +7,155 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="quick-porting">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="quick-porting">
<title>Быстрое портирование</title>
<title>Быстрое портирование</title>
<para>В этом разделе описано, как создать новый порт на скорую руку.
Во многих случаях этого бывает не достаточно, так что вам нужно будет
прочитать документ дальше.</para>
<para>В этом разделе описано, как создать новый порт на скорую
руку. Во многих случаях этого бывает не достаточно, так что вам
нужно будет прочитать документ дальше.</para>
<para>Во-первых, скачайте оригинальный tar-файл и поместите его в каталог
<varname>DISTDIR</varname>, который по умолчанию есть не что иное, как
<filename>/usr/ports/distfiles</filename>.</para>
<para>Во-первых, скачайте оригинальный tar-файл и поместите его в
каталог <varname>DISTDIR</varname>, который по умолчанию есть не
что иное, как <filename>/usr/ports/distfiles</filename>.</para>
<note>
<para>Здесь предполагается, что программное обеспечение компилируется
без проблем как есть, то есть для работы приложения на вашей системе
&os; не потребовалось абсолютно никаких изменений. Если
требовалось что-то изменить, то вам придется обратиться также и к
следующему разделу.</para>
</note>
<note>
<para>Здесь предполагается, что программное обеспечение
компилируется без проблем как есть, то есть для работы
приложения на вашей системе &os; не потребовалось абсолютно
никаких изменений. Если требовалось что-то изменить, то вам
придется обратиться также и к следующему разделу.</para>
</note>
<note>
<para>Перед началом портирования рекомендуется установить
переменную &man.make.1; <varname>DEVELOPER</varname> в
<filename>/etc/make.conf</filename>.</para>
<note>
<para>Перед началом портирования рекомендуется установить
переменную &man.make.1; <varname>DEVELOPER</varname> в
<filename>/etc/make.conf</filename>.</para>
<screen>&prompt.root; <userinput>echo DEVELOPER=yes >> /etc/make.conf</userinput></screen>
<screen>&prompt.root; <userinput>echo DEVELOPER=yes >> /etc/make.conf</userinput></screen>
<para>Эта настройка включает <quote>режим разработчика</quote>,
в котором отображаются предупреждения при использовании
устаревших конструкций и задействуются некоторые дополнительные
проверки при вызове команды <command>make</command>.</para>
</note>
<para>Эта настройка включает <quote>режим разработчика</quote>, в
котором отображаются предупреждения при использовании
устаревших конструкций и задействуются некоторые дополнительные
проверки при вызове команды <command>make</command>.</para>
</note>
<sect1 xml:id="porting-makefile">
<title>Создание файла <filename>Makefile</filename></title>
<sect1 xml:id="porting-makefile">
<title>Создание файла <filename>Makefile</filename></title>
<para>Минимальный <filename>Makefile</filename> будет выглядеть
примерно так:</para>
<para>Минимальный <filename>Makefile</filename> будет выглядеть
примерно так:</para>
<programlisting># &dollar;FreeBSD&dollar;
<programlisting># &dollar;FreeBSD&dollar;
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= youremail@example.com
COMMENT= Cat chasing a mouse all over the screen
MAINTAINER= youremail@example.com
COMMENT= Cat chasing a mouse all over the screen
.include &lt;bsd.port.mk&gt;</programlisting>
<note>
<para>В некоторых случаях в заголовке
<filename>Makefile</filename> существующего порта могут
содержаться дополнительные строки, такие как название порта и
дата его создания. Эта дополнительная информация была
объявлена устаревшей и находится в процессе удаления.</para>
</note>
<para>Посмотрим, сможете ли вы его понять. Не обращайте внимание
на содержимое строчки
<literal>&dollar;FreeBSD&dollar;</literal>, она будет заполнена
автоматически системой <application>Subversion</application>,
когда порт будет импортирован в наше дерево портов. Вы можете
найти более подробный пример в разделе <link
linkend="porting-samplem">пример Makefile</link>.</para>
</sect1>
<sect1 xml:id="porting-desc">
<title>Создание информационных файлов</title>
<para>Имеется два информационных файла, которые требуются для
любого порта, вне зависимости от того, является ли он пакетом
или нет. Это <filename>pkg-descr</filename> и
<filename>pkg-plist</filename>. Префикс
<filename>pkg-</filename> отличает их от других файлов.</para>
<sect2>
<title><filename>pkg-descr</filename></title>
<para>Это более подробное краткое описание порта. От одного до
нескольких абзацев, кратко описывающих, что представляет
собой порт, будет достаточно.</para>
<note>
<para>В некоторых случаях в заголовке <filename>Makefile</filename>
существующего порта могут содержаться дополнительные строки,
такие как название порта и дата его создания.
Эта дополнительная информация была объявлена устаревшей
и находится в процессе удаления.</para>
<para>Это <emphasis>не</emphasis> руководство и не
подробнейшее описание того, как использовать или
компилировать порт! <emphasis>Пожалуйста, будьте
внимательны при копировании текста из
<filename>README</filename> или страниц справочника
</emphasis>; слишком часто они не являются кратким
описанием порта или имеют неудобный формат (например,
страницы справочника выровнены пробелами, что особенно
плохо смотрится с моноширинными шрифтами).</para>
</note>
<para>Посмотрим, сможете ли вы его понять. Не обращайте внимание на
содержимое строчки <literal>&dollar;FreeBSD&dollar;</literal>, она
будет заполнена автоматически системой
<application>Subversion</application>, когда порт будет
импортирован в наше дерево портов. Вы можете найти более подробный
пример в разделе <link linkend="porting-samplem">пример
Makefile</link>.</para>
</sect1>
<para>Хорошо составленный <filename>pkg-descr</filename>
описывает порт достаточно полно, чтобы пользователю не
приходилось сверяться с документацией или посещать вебсайт
для понимания того, что делает данное программное
обеспечение, чем оно может быть полезно или какие хорошие
функции у него имеются. Упоминание про определённые
требования, такие как используемый графический
инструментарий, тяжёлые зависимости, окружение для запуска
или используемый язык программирования помогут пользователям
определиться, будет ли этот порт для них работать.</para>
<sect1 xml:id="porting-desc">
<title>Создание информационных файлов</title>
<para>Включите сюда URL официальной домашней страницы Интернет.
Перед <emphasis>одним</emphasis> из сайтов (выберите
основной) добавьте <literal>WWW:</literal> (с последующим
единичным пробелом) для того, чтобы вспомогательные утилиты
работали правильно. Если URI является корнем сайта или
каталогом, то значение должно быть дополнено косой
чертой.</para>
<para>Имеется два информационных файла, которые требуются для любого
порта, вне зависимости от того, является ли он пакетом или нет. Это
<filename>pkg-descr</filename> и <filename>pkg-plist</filename>.
Префикс <filename>pkg-</filename> отличает их от других файлов.</para>
<note>
<para>Если указанная для порта веб-страница не доступна,
попытайтесь сперва поискать, был ли официальный сайт
перемещён, переименован или размещён в другом месте.</para>
</note>
<sect2>
<title><filename>pkg-descr</filename></title>
<para>Следующий пример показывает, как должен выглядеть ваш
<filename>pkg-descr</filename>:</para>
<para>Это более подробное краткое описание порта. От одного до
нескольких абзацев, кратко описывающих, что представляет собой
порт, будет достаточно.</para>
<note>
<para>Это <emphasis>не</emphasis> руководство и не подробнейшее
описание того, как использовать или компилировать порт!
<emphasis>Пожалуйста, будьте внимательны при копировании текста
из <filename>README</filename> или страниц
справочника</emphasis>; слишком часто они не являются кратким
описанием порта или имеют неудобный формат (например, страницы
справочника выровнены пробелами, что особенно плохо
смотрится с моноширинными шрифтами).</para>
</note>
<para>Хорошо составленный <filename>pkg-descr</filename>
описывает порт достаточно полно, чтобы пользователю не
приходилось сверяться с документацией или посещать вебсайт
для понимания того, что делает данное программное обеспечение,
чем оно может быть полезно или какие хорошие функции у него
имеются. Упоминание про определённые требования, такие как
используемый графический инструментарий, тяжёлые зависимости,
окружение для запуска или используемый язык программирования
помогут пользователям определиться, будет ли этот порт для
них работать.</para>
<para>Включите сюда URL официальной домашней страницы Интернет.
Перед <emphasis>одним</emphasis> из сайтов (выберите основной)
добавьте <literal>WWW:</literal> (с последующим единичным
пробелом) для того, чтобы вспомогательные утилиты работали
правильно. Если URI является корнем сайта или каталогом,
то значение должно быть дополнено косой чертой.</para>
<note>
<para>Если указанная для порта веб-страница не доступна,
попытайтесь сперва поискать, был ли официальный сайт
перемещён, переименован или размещён в другом месте.</para>
</note>
<para>Следующий пример показывает, как должен выглядеть ваш
<filename>pkg-descr</filename>:</para>
<programlisting>This is a port of oneko, in which a cat chases a poor mouse all over
<programlisting>This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(etc.)
WWW: http://www.oneko.org/</programlisting>
</sect2>
</sect2>
<sect2>
<title><filename>pkg-plist</filename></title>
<sect2>
<title><filename>pkg-plist</filename></title>
<para>Здесь перечисляются все файлы, устанавливаемые портом. Его
также называют <quote>списком для упаковки</quote>, потому что
пакет генерируется упаковкой файлов, которые здесь указаны.
Имена путей указываются относительно установочного префикса
(обычно <filename>/usr/local</filename>).
Если порт во время установки создает каталоги, убедитесь,
что добавлены строки <literal>@dirrm</literal> для удаления
каталогов при удалении пакета.</para>
<para>Здесь перечисляются все файлы, устанавливаемые портом.
Его также называют <quote>списком для упаковки</quote>,
потому что пакет генерируется упаковкой файлов, которые здесь
указаны. Имена путей указываются относительно установочного
префикса (обычно <filename>/usr/local</filename>). Если порт
во время установки создает каталоги, убедитесь, что добавлены
строки <literal>@dirrm</literal> для удаления каталогов при
удалении пакета.</para>
<para>Вот маленький пример:</para>
<para>Вот маленький пример:</para>
<programlisting>bin/oneko
<programlisting>bin/oneko
man/man1/oneko.1.gz
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
@ -158,250 +163,258 @@ lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko</programlisting>
<para>Обратитесь к странице справочной системы по команде
&man.pkg-create.8; с подробным описанием формата списка
упаковки.</para>
<note>
<para>Рекомендуется, чтобы имена файлов в этом списке были
отсортированы в алфавитном порядке. Это позволит значительно
облегчить сверку изменений при обновлении порта.</para>
</note>
<note>
<para>Создание списка упаковки вручную может оказаться весьма
трудоёмкой задачей. Если порт устанавливает большое количество
файлов, раздел об <link linkend="plist-autoplist">автоматическом построении списка
упаковки</link> может помочь сэкономить время.</para>
</note>
<para>Существует только одно исключение, когда у порта может
отсутствовать <filename>pkg-plist</filename>. Если порт
устанавливает лишь несколько файлов, а возможно, и каталогов, то
они могут быть перечислены в переменных
<varname>PLIST_FILES</varname> и <varname>PLIST_DIRS</varname>,
соответственно, внутри файла <filename>Makefile</filename> порта.
К примеру, мы можем обойтись без файла
<filename>pkg-plist</filename> у приведённого выше порта
<filename>oneko</filename>, добавив следующие строки в
<filename>Makefile</filename>:</para>
<programlisting>PLIST_FILES= bin/oneko \
man/man1/oneko.1.gz \
lib/X11/app-defaults/Oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
PLIST_DIRS= lib/X11/oneko</programlisting>
<para>Конечно, переменная <varname>PLIST_DIRS</varname> не должна
задаваться, если порт не устанавливает никаких каталогов.</para>
<note>
<para>Несколько портов могут совместно использовать общий
каталог. В этом случае <varname>PLIST_DIRS</varname>
следует заменить на <varname>PLIST_DIRSTRY</varname>, так
чтобы каталог удалялся только если он пуст, а иначе
игнорировался. Использование <varname>PLIST_DIRS</varname>
и <varname>PLIST_DIRSTRY</varname> аналогично
<literal>@dirrm</literal> и <literal>@dirrmtry</literal>
в <filename>pkg-plist</filename>, описание которых
входит в <xref linkend="plist-dir-cleaning"/>.</para>
</note>
<para>Обратной стороной такого способа перечисления файлов и
каталогов порта является невозможность использования
последовательностей команд, описанных в &man.pkg-create.8;.
Поэтому он подходит для простых портов, что делает их ещё более
простыми. Одновременно с этим положительным моментом является
уменьшение количества файлов в коллекции портов. Пожалуйста,
подумайте над использованием этой техники, прежде чем создавать
<filename>pkg-plist</filename>.</para>
<para>Далее мы увидим, как можно использовать файлы
<filename>pkg-plist</filename> и <varname>PLIST_FILES</varname>
выполнения <link linkend="plist">более сложных
задач</link>.</para>
</sect2>
</sect1>
<sect1 xml:id="porting-checksum">
<title>Создание файла с контрольной суммой</title>
<para>Просто введите команду <command>make makesum</command>.
Правила утилиты make автоматически сгенерируют файл
<filename>distinfo</filename>.</para>
<para>Если у извлекаемого файла регулярно меняется контрольная
сумма и вы не сомневаетесь в надежности источника (т.е. он получен
из CD производителя, либо ежедневно обновляется документация), то вы
должны указать эти файлы в переменной <varname>IGNOREFILES</varname>.
Тогда контрольная сумма при выполнении <command>make makesum</command>
для этого файла создаваться не будет, а вместо этого для него будет
установлено значение <literal>IGNORE</literal>.</para>
</sect1>
<sect1 xml:id="porting-testing">
<title>Тестирование порта</title>
<para>Вы должны удостовериться, что правила построения порта выполняют
именно то, что вы хотите, включая создание пакета для порта. Вот
те важные вещи, которые вы должны проверить.</para>
<itemizedlist>
<listitem>
<para><filename>pkg-plist</filename> не содержит ничего сверх того,
что устанавливается портом</para>
</listitem>
<listitem>
<para><filename>pkg-plist</filename> содержит абсолютно все, что
устанавливается портом</para>
</listitem>
<listitem>
<para>Порт может быть установлен с помощью
указания цели <buildtarget>install</buildtarget>. Это
позволяет убедиться в правильной работе сценария
установки.</para>
</listitem>
<listitem>
<para>Порт может быть правильным образом удалён с помощью
указания цели <buildtarget>deinstall</buildtarget>. Это
позволяет убедиться в правильной работе сценария
удаления.</para>
</listitem>
<listitem>
<para>Следует убедиться, что <command>make package</command>
можно запустить из-под обычного пользователя (то есть,
не из-под <systemitem class="username">root</systemitem>).
Если это не так, в <filename>Makefile</filename> порта
должно быть добавлено <literal>NEED_ROOT=yes</literal>.</para>
</listitem>
</itemizedlist>
<procedure>
<title>Рекомендуемый порядок проверки</title>
<step>
<para><command>make stage</command></para>
</step>
<step>
<para><command>make check-orphans</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
<step>
<para><command>make install</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>pkg add package-filename</command></para>
</step>
<step>
<para><command>make package</command> (из-под
пользователя)</para>
</step>
</procedure>
<para>Убедитесь, что на любом из этапов не выдается никаких
предупреждений.</para>
<para>Основательное автоматизированное тестирование может быть
выполнено при помощи
<package role="port">ports-mgmt/tinderbox</package> или
<package role="port">ports-mgmt/poudriere</package> из Коллекции
Портов. Эти приложения используют <literal>jails</literal>,
в которых проверяются все перечисленные выше этапы без
изменения состояния основной системы.</para>
</sect1>
<sect1 xml:id="porting-portlint">
<title>Проверка вашего порта утилитой
<command>portlint</command></title>
<para>Будьте добры, пользуйтесь утилитой <command>portlint</command>
для проверки того, что ваш порт соответствует нашим рекомендациям.
Программа <package role="port">ports-mgmt/portlint</package>
является частью Коллекции
Портов. В частности, вы можете захотеть проверить, правильно ли
сформирован файл <link linkend="porting-samplem">Makefile</link> и
соответствующим ли образом именован <link linkend="porting-pkgname">пакет</link>.</para>
</sect1>
<sect1 xml:id="porting-submitting">
<title>Посылка нового порта</title>
<para>Перед посылкой нового порта прочитайте раздел о том, что
<link linkend="porting-dads">можно и нельзя</link> делать.</para>
<para>Когда вы наконец довольны своим первым портом, единственное,
что осталось сделать, это включить его в основное дерево портов
&os; и осчастливить этим всех остальных. Нам не нужен ни
каталог <filename>work</filename>, ни пакет
<filename>pkgname.tgz</filename>, так что удалите их прямо
сейчас.</para>
<para>Затем получите файл &man.shar.1;. Предполагая, что порт
называется oneko, перейдите в каталог выше, где находится
каталог <literal>oneko</literal>, и наберите:
<command>shar `find oneko` &gt; oneko.shar</command></para>
<para>Включите <filename>oneko.shar</filename> в сообщение об
ошибке и пошлите его с помощью &man.send-pr.1;. Обратитесь к
разделу <link
xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">
Сообщения об ошибках и общие замечания</link> для получения
подробной информации о &man.send-pr.1;).</para>
<para>Укажите в сообщении категорию <literal>ports</literal> и
класс <literal>change-request</literal>.
<emphasis>Не</emphasis> указывайте, что сообщение имеет статус
<literal>confidential</literal>! Добавьте краткое описание
программы в поле <quote>Description</quote> отправляемого PR
(например, содержимое <varname>COMMENT</varname> в сокращённом
варианте) и сам файл в виде архива <filename>.shar</filename>
в поле <quote>Fix</quote>.</para>
<para>Обратитесь к странице справочной системы по команде
&man.pkg-create.8; с подробным описанием формата списка
упаковки.</para>
<note>
<para>Хорошее описание в заголовке сообщения о проблеме
значительно облегчает работу коммиттеров портов. Для новых
портов мы предпочитаем нечто вроде <quote>New port:
&lt;категория&gt;/&lt;название порта&gt; &lt;краткое
описание порта&gt;</quote>. Следование этой схеме
упрощает и ускоряет начало работы по добавлению нового
<para>Рекомендуется, чтобы имена файлов в этом списке были
отсортированы в алфавитном порядке. Это позволит
значительно облегчить сверку изменений при обновлении
ÐÏÒÔÁ.</para>
</note>
<para>Повторим ещё раз, что <emphasis>не нужно включать ни оригинальный
файл с дистрибутивом, ни каталог <filename>work</filename>,
ни пакет, построенный вами командой
<command>make package</command></emphasis>; для новых портов
используйте &man.shar.1;, но не &man.diff.1;.</para>
<note>
<para>Создание списка упаковки вручную может оказаться весьма
трудоёмкой задачей. Если порт устанавливает большое
количество файлов, раздел об <link
linkend="plist-autoplist">автоматическом построении
списка упаковки</link> может помочь сэкономить
время.</para>
</note>
<para>После отправки порта, пожалуйста, потерпите. Время,
необходимое для включения нового порта во &os;, может занимать
от нескольких дней до нескольких месяцев. <link
xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
Здесь</link> можно увидеть список ожидающих PR для портов.</para>
<para>Существует только одно исключение, когда у порта может
отсутствовать <filename>pkg-plist</filename>. Если порт
устанавливает лишь несколько файлов, а возможно, и каталогов,
то они могут быть перечислены в переменных
<varname>PLIST_FILES</varname> и
<varname>PLIST_DIRS</varname>, соответственно, внутри файла
<filename>Makefile</filename> порта. К примеру, мы можем
обойтись без файла <filename>pkg-plist</filename> у
приведённого выше порта <filename>oneko</filename>, добавив
следующие строки в <filename>Makefile</filename>:</para>
<para>После рассмотрения нового порта мы при необходимости вам
ответим, а затем включим порт в наше дерево. Ваше имя также
будет добавлено в список <link
xlink:href="&url.articles.contributors;/contrib-additional.html">
Дополнительных контрибуторов проекта &os;</link> и другие
файлы.</para>
</sect1>
</chapter>
<programlisting>PLIST_FILES= bin/oneko \
man/man1/oneko.1.gz \
lib/X11/app-defaults/Oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
PLIST_DIRS= lib/X11/oneko</programlisting>
<para>Конечно, переменная <varname>PLIST_DIRS</varname> не
должна задаваться, если порт не устанавливает никаких
каталогов.</para>
<note>
<para>Несколько портов могут совместно использовать общий
каталог. В этом случае <varname>PLIST_DIRS</varname>
следует заменить на <varname>PLIST_DIRSTRY</varname>, так
чтобы каталог удалялся только если он пуст, а иначе
игнорировался. Использование <varname>PLIST_DIRS</varname>
и <varname>PLIST_DIRSTRY</varname> аналогично
<literal>@dirrm</literal> и <literal>@dirrmtry</literal> в
<filename>pkg-plist</filename>, описание которых входит в
<xref linkend="plist-dir-cleaning"/>.</para>
</note>
<para>Обратной стороной такого способа перечисления файлов и
каталогов порта является невозможность использования
последовательностей команд, описанных в &man.pkg-create.8;.
Поэтому он подходит для простых портов, что делает их ещё
более простыми. Одновременно с этим положительным моментом
является уменьшение количества файлов в коллекции портов.
Пожалуйста, подумайте над использованием этой техники, прежде
чем создавать <filename>pkg-plist</filename>.</para>
<para>Далее мы увидим, как можно использовать файлы
<filename>pkg-plist</filename> и
<varname>PLIST_FILES</varname> выполнения <link
linkend="plist">более сложных задач</link>.</para>
</sect2>
</sect1>
<sect1 xml:id="porting-checksum">
<title>Создание файла с контрольной суммой</title>
<para>Просто введите команду <command>make makesum</command>.
Правила утилиты make автоматически сгенерируют файл
<filename>distinfo</filename>.</para>
<para>Если у извлекаемого файла регулярно меняется контрольная
сумма и вы не сомневаетесь в надежности источника (т.е. он
получен из CD производителя, либо ежедневно обновляется
документация), то вы должны указать эти файлы в переменной
<varname>IGNOREFILES</varname>. Тогда контрольная сумма при
выполнении <command>make makesum</command> для этого файла
создаваться не будет, а вместо этого для него будет установлено
значение <literal>IGNORE</literal>.</para>
</sect1>
<sect1 xml:id="porting-testing">
<title>Тестирование порта</title>
<para>Вы должны удостовериться, что правила построения порта
выполняют именно то, что вы хотите, включая создание пакета для
порта. Вот те важные вещи, которые вы должны проверить.</para>
<itemizedlist>
<listitem>
<para><filename>pkg-plist</filename> не содержит ничего сверх
того, что устанавливается портом</para>
</listitem>
<listitem>
<para><filename>pkg-plist</filename> содержит абсолютно все,
что устанавливается портом</para>
</listitem>
<listitem>
<para>Порт может быть установлен с помощью указания цели
<buildtarget>install</buildtarget>. Это позволяет
убедиться в правильной работе сценария установки.</para>
</listitem>
<listitem>
<para>Порт может быть правильным образом удалён с помощью
указания цели <buildtarget>deinstall</buildtarget>. Это
позволяет убедиться в правильной работе сценария
удаления.</para>
</listitem>
<listitem>
<para>Следует убедиться, что <command>make package</command>
можно запустить из-под обычного пользователя (то есть, не
из-под <systemitem class="username">root</systemitem>).
Если это не так, в <filename>Makefile</filename> порта
должно быть добавлено
<literal>NEED_ROOT=yes</literal>.</para>
</listitem>
</itemizedlist>
<procedure>
<title>Рекомендуемый порядок проверки</title>
<step>
<para><command>make stage</command></para>
</step>
<step>
<para><command>make check-orphans</command></para>
</step>
<step>
<para><command>make package</command></para>
</step>
<step>
<para><command>make install</command></para>
</step>
<step>
<para><command>make deinstall</command></para>
</step>
<step>
<para><command>pkg add package-filename</command></para>
</step>
<step>
<para><command>make package</command> (из-под
пользователя)</para>
</step>
</procedure>
<para>Убедитесь, что на любом из этапов не выдается никаких
предупреждений.</para>
<para>Основательное автоматизированное тестирование может быть
выполнено при помощи <package
role="port">ports-mgmt/tinderbox</package> или <package
role="port">ports-mgmt/poudriere</package> из Коллекции
Портов. Эти приложения используют <literal>jails</literal>,
в которых проверяются все перечисленные выше этапы без
изменения состояния основной системы.</para>
</sect1>
<sect1 xml:id="porting-portlint">
<title>Проверка вашего порта утилитой
<command>portlint</command></title>
<para>Будьте добры, пользуйтесь утилитой
<command>portlint</command> для проверки того, что ваш порт
соответствует нашим рекомендациям. Программа <package
role="port">ports-mgmt/portlint</package> является частью
Коллекции Портов. В частности, вы можете захотеть проверить,
правильно ли сформирован файл <link
linkend="porting-samplem">Makefile</link> и соответствующим
ли образом именован <link
linkend="porting-pkgname">пакет</link>.</para>
</sect1>
<sect1 xml:id="porting-submitting">
<title>Посылка нового порта</title>
<para>Перед посылкой нового порта прочитайте раздел о том, что
<link linkend="porting-dads">можно и нельзя</link>
делать.</para>
<para>Когда вы наконец довольны своим первым портом,
единственное, что осталось сделать, это включить его в основное
дерево портов &os; и осчастливить этим всех остальных. Нам не
нужен ни каталог <filename>work</filename>, ни пакет
<filename>pkgname.tgz</filename>, так что удалите их прямо
сейчас.</para>
<para>Затем получите файл &man.shar.1;. Предполагая, что порт
называется oneko, перейдите в каталог выше, где находится
каталог <literal>oneko</literal>, и наберите:
<command>shar `find oneko` &gt; oneko.shar</command></para>
<para>Включите <filename>oneko.shar</filename> в сообщение об
ошибке и пошлите его с помощью &man.send-pr.1;. Обратитесь к
разделу <link
xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">Сообщения
об ошибках и общие замечания</link> для получения подробной
информации о &man.send-pr.1;).</para>
<para>Укажите в сообщении категорию <literal>ports</literal> и
класс <literal>change-request</literal>.
<emphasis>Не</emphasis> указывайте, что сообщение имеет статус
<literal>confidential</literal>! Добавьте краткое описание
программы в поле <quote>Description</quote> отправляемого PR
(например, содержимое <varname>COMMENT</varname> в сокращённом
варианте) и сам файл в виде архива <filename>.shar</filename> в
поле <quote>Fix</quote>.</para>
<note>
<para>Хорошее описание в заголовке сообщения о проблеме
значительно облегчает работу коммиттеров портов. Для новых
портов мы предпочитаем нечто вроде <quote>New port:
&lt;категория&gt;/&lt;название порта&gt; &lt;краткое
описание порта&gt;</quote>. Следование этой схеме упрощает
и ускоряет начало работы по добавлению нового порта.</para>
</note>
<para>Повторим ещё раз, что <emphasis>не нужно включать ни
оригинальный файл с дистрибутивом, ни каталог
<filename>work</filename>, ни пакет, построенный вами
командой <command>make package</command></emphasis>; для
новых портов используйте &man.shar.1;, но не
&man.diff.1;.</para>
<para>После отправки порта, пожалуйста, потерпите. Время,
необходимое для включения нового порта во &os;, может занимать
от нескольких дней до нескольких месяцев. <link
xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
Здесь</link> можно увидеть список ожидающих PR для
портов.</para>
<para>После рассмотрения нового порта мы при необходимости вам
ответим, а затем включим порт в наше дерево. Ваше имя также
будет добавлено в список <link
xlink:href="&url.articles.contributors;/contrib-additional.html">
Дополнительных контрибуторов проекта &os;</link> и другие
файлы.</para>
</sect1>
</chapter>

View file

@ -7,157 +7,165 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="security">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="security">
<title>Безопасность портов</title>
<title>Безопасность портов</title>
<sect1 xml:id="security-intro">
<title>Почему безопасность так важна</title>
<sect1 xml:id="security-intro">
<title>Почему безопасность так важна</title>
<para>Ошибки в программном обеспечении появляются случайно. Возможно,
самые опасные из них те, что создают уязвимости безопасности. С
технической точки зрения подобные уязвимости должны быть закрыты
путем исправления вызывающих их ошибок. Тем не менее, политики
обработки несущественных ошибок и уязвимостей очень различаются.
</para>
<para>Ошибки в программном обеспечении появляются случайно.
Возможно, самые опасные из них те, что создают уязвимости
безопасности. С технической точки зрения подобные уязвимости
должны быть закрыты путем исправления вызывающих их ошибок.
Тем не менее, политики обработки несущественных ошибок и
уязвимостей очень различаются.</para>
<para>Обычная небольшая ошибка затрагивает только тех пользователей,
которые задействуют некоторые комбинации настроек, активирующие эту
ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую
версию программного обеспечения, свободного от ошибки, но большинство
пользователей не посчитают нужным сразу же произвести обновление,
поскольку эта ошибка никогда у них не проявлялась. Критическая
ошибка, которая может приводить к потере данных, представляет
серьезную проблему. Тем не менее, предусмотрительные пользователи
знают, что большинство возможных происшествий, и среди них программные
ошибки, скорее всего приводят к потере данных, поэтому они выполняют
резервное копирование важных данных; дополнительно, критическая
ошибка будет обнаружена очень скоро.</para>
<para>Обычная небольшая ошибка затрагивает только тех
пользователей, которые задействуют некоторые комбинации
настроек, активирующие эту ошибку. Разработчик в конечном
счете выпустит патч, а зачтем новую версию программного
обеспечения, свободного от ошибки, но большинство пользователей
не посчитают нужным сразу же произвести обновление, поскольку
эта ошибка никогда у них не проявлялась. Критическая ошибка,
которая может приводить к потере данных, представляет серьезную
проблему. Тем не менее, предусмотрительные пользователи знают,
что большинство возможных происшествий, и среди них программные
ошибки, скорее всего приводят к потере данных, поэтому они
выполняют резервное копирование важных данных; дополнительно,
критическая ошибка будет обнаружена очень скоро.</para>
<para>С уязвимостью безопасности всё иначе. Во-первых, она может
сохраняться необнаруженной целые годы, потому что чаще всего не
вызывает ошибок в работе. Во-вторых, компания злоумышленников
может использовать ее для получения неавторизованного доступа к
уязвимой системе, уничтожить или подменить важные данные; в худшем
случае пользователь даже не заметит нанесенный урон. В-третьих,
взлом уязвимой системы часто упрощает задачу проникновения атакующих
в другие системы, которые не могут быть скомпрометированы иначе.
Таким образом, устранение уязвимости как таковой недостаточно:
следует разослать всем заинтересованным уведомления в наиболее
понятной и исчерпывающей форме, что позволит оценить риск и
предпринять подходящие меры.</para>
</sect1>
<para>С уязвимостью безопасности всё иначе. Во-первых, она может
сохраняться необнаруженной целые годы, потому что чаще всего не
вызывает ошибок в работе. Во-вторых, компания злоумышленников
может использовать ее для получения неавторизованного доступа к
уязвимой системе, уничтожить или подменить важные данные; в
худшем случае пользователь даже не заметит нанесенный урон.
В-третьих, взлом уязвимой системы часто упрощает задачу
проникновения атакующих в другие системы, которые не могут быть
скомпрометированы иначе. Таким образом, устранение уязвимости
как таковой недостаточно: следует разослать всем
заинтересованным уведомления в наиболее понятной и
исчерпывающей форме, что позволит оценить риск и предпринять
подходящие меры.</para>
</sect1>
<sect1 xml:id="security-fix">
<title>Исправление уязвимостей безопасности</title>
<sect1 xml:id="security-fix">
<title>Исправление уязвимостей безопасности</title>
<para>Что касается портов и пакетов, уязвимость безопасности
изначально может появиться в исходном дистрибутиве или файлах
порта. В первом случае, разработчик исходного программного
обеспечения скорее всего сразу же выпустит патч или новую версию,
и вам лишь понадобится сразу обновить порт в соответствии с
исправлением автора. Если исправление по какой-то причине
задерживается, вам следует либо <link linkend="dads-noinstall">пометить
порт как <varname>FORBIDDEN</varname></link>, либо добавить в порт
ваш собственный патч. В случае уязвимости порта просто исправьте
этот порт как можно скорее. В любом случае нужно следовать
<link linkend="port-upgrading">стандартной процедуре отправки вашего
изменения</link>, если вы не обладаете правами на коммит изменения
непосредственно в дерево портов.</para>
<para>Что касается портов и пакетов, уязвимость безопасности
изначально может появиться в исходном дистрибутиве или файлах
порта. В первом случае, разработчик исходного программного
обеспечения скорее всего сразу же выпустит патч или новую
версию, и вам лишь понадобится сразу обновить порт в
соответствии с исправлением автора. Если исправление по
какой-то причине задерживается, вам следует либо <link
linkend="dads-noinstall">пометить порт как
<varname>FORBIDDEN</varname></link>, либо добавить в порт ваш
собственный патч. В случае уязвимости порта просто исправьте
этот порт как можно скорее. В любом случае нужно следовать
<link linkend="port-upgrading">стандартной процедуре отправки
вашего изменения</link>, если вы не обладаете правами на
коммит изменения непосредственно в дерево портов.</para>
<important>
<para>Быть коммиттером портов недостаточно для коммита произвольного
порта. Помните, что обычно у портов есть сопровождающие, мнение
которых вы должны учитывать.</para>
</important>
<important>
<para>Быть коммиттером портов недостаточно для коммита
произвольного порта. Помните, что обычно у портов есть
сопровождающие, мнение которых вы должны учитывать.</para>
</important>
<para>Пожалуйста, убедитесь, что ревизия порта после закрытия
уязвимости увеличена. Вот как пользователи, обновляющие
установленные пакеты на постоянной основе, увидят, что им нужно
запустить обновление. Кроме того, новый пакет будет собран и
распространен через FTP и WWW зеркала, замещая уязвимый.
Если в процессе исправления уязвимости не было изменено значение
<varname>PORTVERSION</varname>, то должно быть увеличено значение
<varname>PORTREVISION</varname>. Вам следует увеличить значение
<varname>PORTREVISION</varname> после добавления в порт файла с
патчем, но не когда вы обновили порт до последней версии
программного обеспечения, попутно затронув при этом
<varname>PORTVERSION</varname>. За дальнейшей информацией
обращайтесь к
<link linkend="makefile-naming-revepoch">соответствующему
<para>Пожалуйста, убедитесь, что ревизия порта после закрытия
уязвимости увеличена. Вот как пользователи, обновляющие
установленные пакеты на постоянной основе, увидят, что им нужно
запустить обновление. Кроме того, новый пакет будет собран и
распространен через FTP и WWW зеркала, замещая уязвимый. Если
в процессе исправления уязвимости не было изменено значение
<varname>PORTVERSION</varname>, то должно быть увеличено
значение <varname>PORTREVISION</varname>. Вам следует
увеличить значение <varname>PORTREVISION</varname> после
добавления в порт файла с патчем, но не когда вы обновили порт
до последней версии программного обеспечения, попутно затронув
при этом <varname>PORTVERSION</varname>. За дальнейшей
информацией обращайтесь к <link
linkend="makefile-naming-revepoch">соответствующему
ÒÁÚÄÅÌÕ</link>.</para>
</sect1>
</sect1>
<sect1 xml:id="security-notify">
<title>Обеспечение сообщества информацией</title>
<sect1 xml:id="security-notify">
<title>Обеспечение сообщества информацией</title>
<sect2 xml:id="security-notify-vuxml-db">
<title>База данных VuXML</title>
<sect2 xml:id="security-notify-vuxml-db">
<title>База данных VuXML</title>
<para>Очень важным и первостепенным шагом при действии как можно
раньше после раскрытия уязвимости является уведомление сообщества
пользователей порта об опасности. Такие уведомления служат двум
целям. Во-первых, в случае действительно серьезной угрозы, будет
посоветовано применить мгновенное воздействие. Например, остановить
затрагиваемый сетевой сервис или даже удалить порт целиком,
пока уязвимость не будет устранена. Во-вторых, масса
пользователей имеет тенденцию обновлять установленные пакеты только от
случая к случаю. Из уведомления они узнают, что
<emphasis>должны</emphasis> обновить пакет без промедления сразу
же после появления исправленной версии.</para>
<para>Очень важным и первостепенным шагом при действии как
можно раньше после раскрытия уязвимости является уведомление
сообщества пользователей порта об опасности. Такие
уведомления служат двум целям. Во-первых, в случае
действительно серьезной угрозы, будет посоветовано применить
мгновенное воздействие. Например, остановить затрагиваемый
сетевой сервис или даже удалить порт целиком, пока уязвимость
не будет устранена. Во-вторых, масса пользователей имеет
тенденцию обновлять установленные пакеты только от случая к
случаю. Из уведомления они узнают, что
<emphasis>должны</emphasis> обновить пакет без промедления
сразу же после появления исправленной версии.</para>
<para>Учитывая огромное число портов в дереве, невозможно по
каждому случаю выпускать бюллетень безопасности без создания
флуда и потери внимания сообщества к моменту появления
действительно серьезных причин. Поэтому уязвимости безопасности,
обнаруженные в портах, записываются в
<link xlink:href="http://vuxml.freebsd.org/">базу данных
&os; VuXML</link>.
Члены Команды Офицеров Безопасности также отслеживают её на
предмет появления вопросов, требующих их вмешательства.</para>
<para>Учитывая огромное число портов в дереве, невозможно по
каждому случаю выпускать бюллетень безопасности без создания
флуда и потери внимания сообщества к моменту появления
действительно серьезных причин. Поэтому уязвимости
безопасности, обнаруженные в портах, записываются в <link
xlink:href="http://vuxml.freebsd.org/">базу данных &os;
VuXML</link>. Члены Команды Офицеров Безопасности также
отслеживают её на предмет появления вопросов, требующих их
вмешательства.</para>
<para>Если вы обладаете правами коммиттера, вы можете сам обновить
базу данных VuXML. Так вы поможете Команде Офицеров Безопасности
и своевременно пошлете ценную информацию сообществу. Тем не
менее, если вы не являетесь коммиттером или верите, что нашли
исключительно серьезную уязвимость, то не
задумываясь свяжитесь с Командой Офицеров Безопасности напрямую
как это описано на странице
<link xlink:href="http://www.freebsd.org/security/#how">информационной
<para>Если вы обладаете правами коммиттера, вы можете сам
обновить базу данных VuXML. Так вы поможете Команде Офицеров
Безопасности и своевременно пошлете ценную информацию
сообществу. Тем не менее, если вы не являетесь коммиттером
или верите, что нашли исключительно серьезную уязвимость, то
не задумываясь свяжитесь с Командой Офицеров Безопасности
напрямую как это описано на странице <link
xlink:href="http://www.freebsd.org/security/#how">информационной
ÂÅÚÏÐÁÓÎÏÓÔÉ &os;</link>.</para>
<para>База данных VuXML является документом <acronym>XML</acronym>.
Его исходный файл <filename>vuln.xml</filename> содержится
прямо внутри порта <package role="port">security/vuxml</package>.
Следовательно, полное имя пути к файлу будет
<filename>PORTSDIR/security/vuxml/vuln.xml</filename>.
Каждый раз, при обнаружении вами в порте уязвимости безопасности
добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML,
лучшее, что вы можете сделать, это найти существующую запись,
подпадающую под ваш случай, затем скопировать ее и использовать
в качестве шаблона.</para>
</sect2>
<para>База данных VuXML является документом
<acronym>XML</acronym>. Его исходный файл
<filename>vuln.xml</filename> содержится прямо внутри порта
<package role="port">security/vuxml</package>.
Следовательно, полное имя пути к файлу будет
<filename>PORTSDIR/security/vuxml/vuln.xml</filename>.
Каждый раз, при обнаружении вами в порте уязвимости
безопасности добавьте об этом запись в этот файл. Пока вы не
знакомы с VuXML, лучшее, что вы можете сделать, это найти
существующую запись, подпадающую под ваш случай, затем
скопировать ее и использовать в качестве шаблона.</para>
</sect2>
<sect2 xml:id="security-notify-vuxml-intro">
<title>Короткое вступление в VuXML</title>
<sect2 xml:id="security-notify-vuxml-intro">
<title>Короткое вступление в VuXML</title>
<para>В совокупности <acronym>XML</acronym> является очень
сложным форматом, и его описание выходит далеко за рамки
этой книги. Тем не менее, для достижения основного понимания
структуры записи VuXML вам понадобится всего лишь понять теги.
Имена тегов XML обрамляются в угловые скобки. Каждый открывающий
&lt;tag&gt; должен иметь совпадающий закрывающий &lt;/tag&gt;.
Теги могут быть вложенными. При вложенности внутренние теги
должны быть закрыты до закрытия внешних. Существует иерархия
тегов, т.е. более сложные правила вкладывания тегов. Это
похоже на HTML. Основное отличие в расширяемости XML,
т.е. в определении собственных тегов. Из-за своей характерной
структуры XML придает форму разрозненным данным. В частности,
XML подходит для разметки описаний уязвимостей безопасности.</para>
<para>В совокупности <acronym>XML</acronym> является очень
сложным форматом, и его описание выходит далеко за рамки этой
книги. Тем не менее, для достижения основного понимания
структуры записи VuXML вам понадобится всего лишь понять
теги. Имена тегов XML обрамляются в угловые скобки. Каждый
открывающий &lt;tag&gt; должен иметь совпадающий закрывающий
&lt;/tag&gt;. Теги могут быть вложенными. При вложенности
внутренние теги должны быть закрыты до закрытия внешних.
Существует иерархия тегов, т.е. более сложные правила
вкладывания тегов. Это похоже на HTML. Основное отличие в
расширяемости XML, т.е. в определении собственных тегов.
Из-за своей характерной структуры XML придает форму
разрозненным данным. В частности, XML подходит для разметки
описаний уязвимостей безопасности.</para>
<para>Теперь рассмотрим настоящую запись VuXML:</para>
<para>Теперь рассмотрим настоящую запись VuXML:</para>
<programlisting>&lt;vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"&gt; <co xml:id="co-vx-vid"/>
<programlisting>&lt;vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"&gt; <co xml:id="co-vx-vid"/>
&lt;topic&gt;Several vulnerabilities found in Foo&lt;/topic&gt; <co xml:id="co-vx-top"/>
&lt;affects&gt;
&lt;package&gt;
@ -206,281 +214,296 @@
&lt;/dates&gt;
&lt;/vuln&gt;</programlisting>
<para>Имена тегов должны быть самодокументируемыми, чтобы мы
сфокусировались только на полях, нужных нам для заполнения:</para>
<para>Имена тегов должны быть самодокументируемыми, чтобы мы
сфокусировались только на полях, нужных нам для
заполнения:</para>
<calloutlist>
<callout arearefs="co-vx-vid">
<para>Это тег верхнего уровня записи VuXML. У него есть
обязательный атрибут <literal>vid</literal>, указывающий на
универсальный уникальный идентификатор (UUID) для этой записи
(в кавычках). Вы должны формировать UUID для каждой новой
записи VuXML (и не забудьте заменить ее для шаблона UUID,
если вы не пишете запись с нуля). Для получения VuXML UUID
вы можете использовать &man.uuidgen.1;.</para>
</callout>
<calloutlist>
<callout arearefs="co-vx-vid">
<para>Это тег верхнего уровня записи VuXML. У него есть
обязательный атрибут <literal>vid</literal>, указывающий
на универсальный уникальный идентификатор (UUID) для этой
записи (в кавычках). Вы должны формировать UUID для
каждой новой записи VuXML (и не забудьте заменить ее для
шаблона UUID, если вы не пишете запись с нуля). Для
получения VuXML UUID вы можете использовать
&man.uuidgen.1;.</para>
</callout>
<callout arearefs="co-vx-top">
<para>Однострочное описание найденной проблемы.</para>
</callout>
<callout arearefs="co-vx-top">
<para>Однострочное описание найденной проблемы.</para>
</callout>
<callout arearefs="co-vx-nam">
<para>Здесь перечислены имена затронутых пакетов.
Может быть дано несколько имен, поскольку некоторые пакеты
могут быть основаны на одном главном порте или программном
продукте. Сюда можно включить стабильную ветвь и ветвь
разработки, локализованные версии и подчиненные порты,
зависящие от различного выбора важных вариантов конфигурации,
указанных на этапе построения.</para>
<callout arearefs="co-vx-nam">
<para>Здесь перечислены имена затронутых пакетов. Может
быть дано несколько имен, поскольку некоторые пакеты
могут быть основаны на одном главном порте или
программном продукте. Сюда можно включить стабильную
ветвь и ветвь разработки, локализованные версии и
подчиненные порты, зависящие от различного выбора важных
вариантов конфигурации, указанных на этапе
построения.</para>
<important>
<para>Поиск всех подобных пакетов при написании записи VuXML
входит в зону вашей ответственности. Имейте в виду, что
<literal>make search name=foo</literal> это ваш друг.
Первичные точки для поиска следующие:</para>
<important>
<para>Поиск всех подобных пакетов при написании записи
VuXML входит в зону вашей ответственности. Имейте в
виду, что <literal>make search name=foo</literal> это
ваш друг. Первичные точки для поиска следующие:</para>
<itemizedlist>
<listitem>
<para>вариант <filename>foo-devel</filename> для порта
<filename>foo</filename>;</para>
</listitem>
<itemizedlist>
<listitem>
<para>вариант <filename>foo-devel</filename> для
порта <filename>foo</filename>;</para>
</listitem>
<listitem>
<para>другие варианты с суффиксами вида
<literal>-a4</literal> (для пакетов, связанных с печатью),
<literal>-without-gui</literal> (для пакетов с
отключенной поддержкой X), или подобных;</para>
</listitem>
<listitem>
<para>другие варианты с суффиксами вида
<literal>-a4</literal> (для пакетов, связанных с
печатью), <literal>-without-gui</literal> (для
пакетов с отключенной поддержкой X), или
подобных;</para>
</listitem>
<listitem>
<para><literal>jp-</literal>, <literal>ru-</literal>,
<literal>zh-</literal> и другие возможные локализованные
варианты в соответствующих национальных категориях
коллекции портов.</para>
</listitem>
</itemizedlist>
</important>
</callout>
<listitem>
<para><literal>jp-</literal>, <literal>ru-</literal>,
<literal>zh-</literal> и другие возможные
локализованные варианты в соответствующих
национальных категориях коллекции портов.</para>
</listitem>
</itemizedlist>
</important>
</callout>
<callout arearefs="co-vx-rng">
<para>Здесь указаны затронутые версии пакета(-ов) как один или
более диапазонов с использованием комбинации элементов
<literal>&lt;lt&gt;</literal>, <literal>&lt;le&gt;</literal>,
<literal>&lt;eq&gt;</literal>, <literal>&lt;ge&gt;</literal>,
и <literal>&lt;gt&gt;</literal>. Диапазоны внесённых версий
не должны пересекаться.</para>
<callout arearefs="co-vx-rng">
<para>Здесь указаны затронутые версии пакета(-ов) как один
или более диапазонов с использованием комбинации
элементов <literal>&lt;lt&gt;</literal>,
<literal>&lt;le&gt;</literal>,
<literal>&lt;eq&gt;</literal>,
<literal>&lt;ge&gt;</literal>, и
<literal>&lt;gt&gt;</literal>. Диапазоны внесённых
версий не должны пересекаться.</para>
<para>В спецификации диапазонов <literal>*</literal> (звёздочка)
означает наименьший номер версии. В частности,
<literal>2.*</literal> меньше, чем <literal>2.a</literal>.
Поэтому звездочка может быть использована в диапазоне для
совпадения со всеми возможными <literal>alpha</literal>,
<literal>beta</literal> и <literal>RC</literal> версиями.
Как вариант,
<literal>&lt;ge&gt;2.*&lt;/ge&gt;&lt;lt&gt;3.*&lt;/lt&gt;</literal>
выборочно совпадет с версией <literal>2.x</literal>, а
<literal>&lt;ge&gt;2.0&lt;/ge&gt;&lt;lt&gt;3.0&lt;/lt&gt;</literal>
- нет, поскольку последнее не включает
<literal>2.r3</literal> и совпадает с <literal>3.b</literal>.
</para>
<para>В спецификации диапазонов <literal>*</literal>
(звёздочка) означает наименьший номер версии. В
частности, <literal>2.*</literal> меньше, чем
<literal>2.a</literal>. Поэтому звездочка может быть
использована в диапазоне для совпадения со всеми
возможными <literal>alpha</literal>,
<literal>beta</literal> и <literal>RC</literal> версиями.
Как вариант,
<literal>&lt;ge&gt;2.*&lt;/ge&gt;&lt;lt&gt;3.*&lt;/lt&gt;</literal>
выборочно совпадет с версией <literal>2.x</literal>, а
<literal>&lt;ge&gt;2.0&lt;/ge&gt;&lt;lt&gt;3.0&lt;/lt&gt;</literal>
- нет, поскольку последнее не включает
<literal>2.r3</literal> и совпадает с
<literal>3.b</literal>.</para>
<para>Пример выше указывает, что к затронутым относятся версии с
<literal>1.6</literal> до <literal>1.9</literal> включительно,
версии <literal>2.x</literal> до <literal>2.4_1</literal> и
версия <literal>3.0b1</literal>.</para>
</callout>
<para>Пример выше указывает, что к затронутым относятся
версии с <literal>1.6</literal> до <literal>1.9</literal>
включительно, версии <literal>2.x</literal> до
<literal>2.4_1</literal> и версия
<literal>3.0b1</literal>.</para>
</callout>
<callout arearefs="co-vx-nm2">
<para>Некоторые связанные группы пакетов (в конечном счете, порты)
могут быть указаны в разделе <literal>&lt;affected&gt;</literal>.
Это можно использовать, если некоторые программные продукты
(скажем, FooBar, FreeBar and OpenBar) являются производными
от общей кодовой базы и всё еще совместно используют её ошибки
и уязвимости. Имейте в виду отличие от перечисления
множественных имён в одном разделе &lt;package&gt;.</para>
</callout>
<callout arearefs="co-vx-nm2">
<para>Некоторые связанные группы пакетов (в конечном счете,
порты) могут быть указаны в разделе
<literal>&lt;affected&gt;</literal>. Это можно
использовать, если некоторые программные продукты
(скажем, FooBar, FreeBar and OpenBar) являются
производными от общей кодовой базы и всё еще совместно
используют её ошибки и уязвимости. Имейте в виду отличие
от перечисления множественных имён в одном разделе
&lt;package&gt;.</para>
</callout>
<callout arearefs="co-vx-epo">
<para>Диапазоны версий должны учитывать
<varname>PORTEPOCH</varname> и <varname>PORTREVISION</varname>,
если это применимо. Пожалуйста, помните, что в соответствии
с правилами сравнения строк версия с ненулевым значением
<varname>PORTEPOCH</varname> выше, чем любая версия без
<varname>PORTEPOCH</varname>, например, <literal>3.0,1</literal>
выше, чем <literal>3.1</literal> или даже <literal>8.9</literal>.
</para>
</callout>
<callout arearefs="co-vx-epo">
<para>Диапазоны версий должны учитывать
<varname>PORTEPOCH</varname> и
<varname>PORTREVISION</varname>, если это применимо.
Пожалуйста, помните, что в соответствии с правилами
сравнения строк версия с ненулевым значением
<varname>PORTEPOCH</varname> выше, чем любая версия без
<varname>PORTEPOCH</varname>, например,
<literal>3.0,1</literal> выше, чем <literal>3.1</literal>
или даже <literal>8.9</literal>.</para>
</callout>
<callout arearefs="co-vx-bdy">
<para>Сводная информация о проблеме. В этом поле
используется XHTML. По крайней мере, должны быть обрамляющие
<literal>&lt;p&gt;</literal> и <literal>&lt;/p&gt;</literal>.
Может быть использована более сложная разметка, но только в
целях аккуратности и ясности: без эстетства, пожалуйста.
</para>
</callout>
<callout arearefs="co-vx-bdy">
<para>Сводная информация о проблеме. В этом поле
используется XHTML. По крайней мере, должны быть
обрамляющие <literal>&lt;p&gt;</literal> и
<literal>&lt;/p&gt;</literal>. Может быть использована
более сложная разметка, но только в целях аккуратности и
ясности: без эстетства, пожалуйста.</para>
</callout>
<callout arearefs="co-vx-ref">
<para>Этот раздел содержит ссылки на имеющие отношение документы.
Приветствуется как можно большее количество ссылок.</para>
</callout>
<callout arearefs="co-vx-ref">
<para>Этот раздел содержит ссылки на имеющие отношение
документы. Приветствуется как можно большее количество
ссылок.</para>
</callout>
<callout arearefs="co-vx-fsa">
<para>Это
<link xlink:href="http://www.freebsd.org/security/#adv">бюллетень
<callout arearefs="co-vx-fsa">
<para>Это <link
xlink:href="http://www.freebsd.org/security/#adv">бюллетень
ÂÅÚÏÐÁÓÎÏÓÔÉ &os;</link>.</para>
</callout>
</callout>
<callout arearefs="co-vx-fpr">
<para>Это
<link xlink:href="http://www.freebsd.org/support.html#gnats">сообщение
<callout arearefs="co-vx-fpr">
<para>Это <link
xlink:href="http://www.freebsd.org/support.html#gnats">сообщение
ÏÂ ÏÛÉÂËÅ &os;</link>.</para>
</callout>
</callout>
<callout arearefs="co-vx-cve">
<para>Идентификатор
<link xlink:href="http://www.cve.mitre.org/">MITRE
<callout arearefs="co-vx-cve">
<para>Идентификатор <link
xlink:href="http://www.cve.mitre.org/">MITRE
CVE</link>.</para>
</callout>
</callout>
<callout arearefs="co-vx-bid">
<para>Это
<link xlink:href="http://www.securityfocus.com/bid">SecurityFocus
<callout arearefs="co-vx-bid">
<para>Это <link
xlink:href="http://www.securityfocus.com/bid">SecurityFocus
Bug ID</link>.</para>
</callout>
</callout>
<callout arearefs="co-vx-cts">
<para>Бюллетень безопасности
<link xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-cts">
<para>Бюллетень безопасности <link
xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-ctv">
<para>Примечание к уязвимости
<link xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-ctv">
<para>Примечание к уязвимости <link
xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-ucs">
<para>Уведомление системы Cyber Security Alert
<link xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-ucs">
<para>Уведомление системы Cyber Security Alert <link
xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-uct">
<para>Уведомление системы Technical Cyber Security Alert
<link xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-uct">
<para>Уведомление системы Technical Cyber Security Alert
<link
xlink:href="http://www.cert.org/">US-CERT</link>.</para>
</callout>
<callout arearefs="co-vx-mls">
<para>URL к архивному сообщению в списке рассылки.
Атрибут <literal>msgid</literal> является необязательным
и может указывать на message ID сообщения.</para>
</callout>
<callout arearefs="co-vx-mls">
<para>URL к архивному сообщению в списке рассылки. Атрибут
<literal>msgid</literal> является необязательным и может
указывать на message ID сообщения.</para>
</callout>
<callout arearefs="co-vx-url">
<para>Основной URL. Должен быть использован в случае, если
не подходит ни одна из категорий источника.</para>
</callout>
<callout arearefs="co-vx-url">
<para>Основной URL. Должен быть использован в случае, если
не подходит ни одна из категорий источника.</para>
</callout>
<callout arearefs="co-vx-dsc">
<para>Дата последнего изменения любой информации данной записи
(<replaceable>YYYY-MM-DD</replaceable>). Новые записи не
должны включать это поле. Поле должно быть добавлено после
редактирования существующей записи.</para>
</callout>
</calloutlist>
</sect2>
<callout arearefs="co-vx-dsc">
<para>Дата последнего изменения любой информации данной
записи (<replaceable>YYYY-MM-DD</replaceable>). Новые
записи не должны включать это поле. Поле должно быть
добавлено после редактирования существующей
записи.</para>
</callout>
</calloutlist>
</sect2>
<sect2 xml:id="security-notify-vuxml-testing">
<title>Тестирование ваших изменений в базе данных VuXML</title>
<sect2 xml:id="security-notify-vuxml-testing">
<title>Тестирование ваших изменений в базе данных VuXML</title>
<para>Предположим, что вы только что написали или заполнили запись
об уязвимости в пакете <literal>clamav</literal>, которая была
исправлена в версии <literal>0.65_7</literal>.</para>
<para>Предположим, что вы только что написали или заполнили
запись об уязвимости в пакете <literal>clamav</literal>,
которая была исправлена в версии
<literal>0.65_7</literal>.</para>
<para>Прежде всего, вам нужно <emphasis>установить</emphasis>
последние версии портов
<package role="port">ports-mgmt/portaudit</package>,
<package role="port">ports-mgmt/portaudit-db</package> и
<package role="port">security/vuxml</package>.</para>
<para>Прежде всего, вам нужно <emphasis>установить</emphasis>
последние версии портов
<package role="port">ports-mgmt/portaudit</package>,
<package role="port">ports-mgmt/portaudit-db</package> и
<package role="port">security/vuxml</package>.</para>
<note>
<para>Для запуска <command>packaudit</command> вы должны обладать
правами на запись в
<filename>DATABASEDIR</filename>; как правило,
это <filename>/var/db/portaudit</filename>.</para>
<note>
<para>Для запуска <command>packaudit</command> вы должны
обладать правами на запись в
<filename>DATABASEDIR</filename>; как правило, это
<filename>/var/db/portaudit</filename>.</para>
<para>Для использования другого каталога присвойте переменной
окружения <filename>DATABASEDIR</filename>
другой путь.</para>
<para>Для использования другого каталога присвойте переменной
окружения <filename>DATABASEDIR</filename> другой
путь.</para>
<para>Если вы работаете в каталоге, отличном от
<filename>${PORTSDIR}/security/vuxml</filename>, присвойте
переменной окружения
<filename>VUXMLDIR</filename> путь к каталогу,
в котором находится <filename>vuln.xml</filename>.</para>
</note>
<para>Если вы работаете в каталоге, отличном от
<filename>${PORTSDIR}/security/vuxml</filename>, присвойте
переменной окружения <filename>VUXMLDIR</filename> путь к
каталогу, в котором находится
<filename>vuln.xml</filename>.</para>
</note>
<para>Во-первых, проверьте, нет ли уже записи об этой уязвимости.
Если такая запись есть, она совпадёт с предыдущей версией
пакета <literal>0.65_6</literal>:</para>
<para>Во-первых, проверьте, нет ли уже записи об этой
уязвимости. Если такая запись есть, она совпадёт с
предыдущей версией пакета <literal>0.65_6</literal>:</para>
<screen>&prompt.user; <userinput>packaudit</userinput>
<screen>&prompt.user; <userinput>packaudit</userinput>
&prompt.user; <userinput>portaudit clamav-0.65_6</userinput></screen>
<para>Если ничего не найдено, значит вы получили зеленый свет для
добавления новой записи для этой уязвимости.</para>
<para>Если ничего не найдено, значит вы получили зеленый свет
для добавления новой записи для этой уязвимости.</para>
<screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput>
<screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput>
&prompt.user; <userinput>make newentry</userinput></screen>
<para>Когда вы закончите, проверьте синтаксис и форматирование.</para>
<para>Когда вы закончите, проверьте синтаксис и
форматирование.</para>
<screen>&prompt.user; <userinput>make validate</userinput></screen>
<screen>&prompt.user; <userinput>make validate</userinput></screen>
<note>
<para>Вам понадобится установить по крайней мере один из следующих
пакетов: <package role="port">textproc/libxml2</package>,
<package role="port">textproc/jade</package>.</para>
</note>
<note>
<para>Вам понадобится установить по крайней мере один из
следующих пакетов:
<package role="port">textproc/libxml2</package>,
<package role="port">textproc/jade</package>.</para>
</note>
<para>Теперь выполните перепостроение базы данных
<command>portaudit</command> из файла VuXML:</para>
<para>Теперь выполните перепостроение базы данных
<command>portaudit</command> из файла VuXML:</para>
<screen>&prompt.user; <userinput>packaudit</userinput></screen>
<screen>&prompt.user; <userinput>packaudit</userinput></screen>
<para>Чтобы убедиться, что раздел <literal>&lt;affected&gt;</literal>
в вашей записи совпадает с правильными пакетами, выполните
следующую команду:</para>
<para>Чтобы убедиться, что раздел
<literal>&lt;affected&gt;</literal> в вашей записи совпадает
с правильными пакетами, выполните следующую команду:</para>
<screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen>
<screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen>
<note>
<para>Для лучшего понимания синтаксиса этой команды обращайтесь
к &man.portaudit.1;.</para>
</note>
<note>
<para>Для лучшего понимания синтаксиса этой команды
обращайтесь к &man.portaudit.1;.</para>
</note>
<para>Убедитесь, что ваша запись не производит ложных совпадений
в выводе.</para>
<para>Убедитесь, что ваша запись не производит ложных
совпадений в выводе.</para>
<para>Теперь проверьте, совпадает ли ваша запись с нужными версиями
пакета:</para>
<para>Теперь проверьте, совпадает ли ваша запись с нужными
версиями пакета:</para>
<screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput>
<screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput>
Affected package: clamav-0.65_6 (matched by clamav&lt;0.65_7)
Type of problem: clamav remote denial-of-service.
Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html&gt;
1 problem(s) found.</screen>
<para>Первая версия должна совпасть, а последняя
нет.</para>
<para>Первая версия должна совпасть, а последняя нет.</para>
<para>В заключение проверьте, что веб-страница, сформированная из
базы данных VuXML, выглядит как положено:</para>
<para>В заключение проверьте, что веб-страница, сформированная
из базы данных VuXML, выглядит как положено:</para>
<screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput>
<screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput>
&prompt.user; <userinput>packaudit</userinput>
&prompt.user; <userinput>lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html</userinput></screen>
</sect2>
</sect1>
</chapter>
</sect2>
</sect1>
</chapter>

View file

@ -7,428 +7,441 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="slow-porting">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="slow-porting">
<title>Медленное портирование</title>
<title>Медленное портирование</title>
<para>Итак, все оказалось не так уж и просто, и порт потребовал
некоторых модификаций для того, чтобы заставить его работать. В этом
разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он
работал с нашей системой портов.</para>
<para>Итак, все оказалось не так уж и просто, и порт потребовал
некоторых модификаций для того, чтобы заставить его работать. В
этом разделе мы расскажем, шаг за шагом, как его модифицировать,
чтобы он работал с нашей системой портов.</para>
<sect1 xml:id="slow-work">
<title>Как всё это работает</title>
<sect1 xml:id="slow-work">
<title>Как всё это работает</title>
<para>Во-первых, когда пользователь дает в своем каталоге с портом
команду <command>make</command>, происходит целая череда событий.
Во время чтения этого текста может оказаться полезным иметь файл
<filename>bsd.port.mk</filename> открытым в другом окне, что сильно
поможет в их понимании.</para>
<para>Во-первых, когда пользователь дает в своем каталоге с
портом команду <command>make</command>, происходит целая череда
событий. Во время чтения этого текста может оказаться полезным
иметь файл <filename>bsd.port.mk</filename> открытым в другом
окне, что сильно поможет в их понимании.</para>
<para>Но не волнуйтесь сильно, если вы не до конца понимаете, что
делается в <filename>bsd.port.mk</filename>, не так уж много людей
его понимает... <!-- smiley --><emphasis>:-&gt;</emphasis></para>
<para>Но не волнуйтесь сильно, если вы не до конца понимаете, что
делается в <filename>bsd.port.mk</filename>, не так уж много
людей его понимает... <emphasis>:-&gt;</emphasis></para>
<procedure>
<step>
<para>Запускается цель <buildtarget>fetch</buildtarget>. Цель
<buildtarget>fetch</buildtarget> отвечает за то, что архив исходных
текстов имеется в наличии локально в каталоге
<varname>DISTDIR</varname>. Если цель
<buildtarget>fetch</buildtarget> не может найти требуемые файлы в
каталоге <varname>DISTDIR</varname>, то они будут искаться по
указателю URL <varname>MASTER_SITES</varname>, который
устанавливается в Makefile, а также на наших FTP зеркалах,
куда мы по возможности помещаем дистрибутивные файлы для архива.
Затем она попытается сгрузить указанный файл с помощью
<varname>FETCH</varname>, полагая, что запрашивающая машина имеет
прямое подключение к Интернет. Если файл скачается удачно, то
он будет помещен в каталог <varname>DISTDIR</varname> для
последующего использования и обработки.</para>
</step>
<procedure>
<step>
<para>Запускается цель <buildtarget>fetch</buildtarget>.
Цель <buildtarget>fetch</buildtarget> отвечает за то, что
архив исходных текстов имеется в наличии локально в
каталоге <varname>DISTDIR</varname>. Если цель
<buildtarget>fetch</buildtarget> не может найти требуемые
файлы в каталоге <varname>DISTDIR</varname>, то они будут
искаться по указателю URL <varname>MASTER_SITES</varname>,
который устанавливается в Makefile, а также на наших FTP
зеркалах, куда мы по возможности помещаем дистрибутивные
файлы для архива. Затем она попытается сгрузить указанный
файл с помощью <varname>FETCH</varname>, полагая, что
запрашивающая машина имеет прямое подключение к Интернет.
Если файл скачается удачно, то он будет помещен в каталог
<varname>DISTDIR</varname> для последующего использования и
обработки.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>extract</buildtarget>. Она ищет
дистрибутивный файл порта (как правило, tar-архив
<command>gzip</command>) в
каталоге <varname>DISTDIR</varname> и распаковывает его во
временный каталог, задаваемый переменной
<varname>WRKDIR</varname> (по умолчанию
<filename>work</filename>).</para>
</step>
<step>
<para>Выполняется цель <buildtarget>extract</buildtarget>.
Она ищет дистрибутивный файл порта (как правило, tar-архив
<command>gzip</command>) в каталоге
<varname>DISTDIR</varname> и распаковывает его во временный
каталог, задаваемый переменной <varname>WRKDIR</varname>
(по умолчанию <filename>work</filename>).</para>
</step>
<step>
<para>Выполняется цель <buildtarget>patch</buildtarget>. Во-первых,
применяются все патчи, заданные переменной
<varname>PATCHFILES</varname>. Во-вторых, если какие-либо файлы с
патчами, носящие имена
<filename>patch-*</filename>, имеются в
подкаталоге <varname>PATCHDIR</varname> (по умолчанию это каталог
<filename>files</filename>), то они применяются в этот момент в
алфавитном порядке.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>patch</buildtarget>.
Во-первых, применяются все патчи, заданные переменной
<varname>PATCHFILES</varname>. Во-вторых, если какие-либо
файлы с патчами, носящие имена
<filename>patch-*</filename>, имеются в подкаталоге
<varname>PATCHDIR</varname> (по умолчанию это каталог
<filename>files</filename>), то они применяются в этот
момент в алфавитном порядке.</para>
</step>
<step>
<para>Запускается цель <buildtarget>configure</buildtarget>. Здесь
может выполняться любая из многих различных вещей.</para>
<step>
<para>Запускается цель <buildtarget>configure</buildtarget>.
Здесь может выполняться любая из многих различных
вещей.</para>
<orderedlist>
<listitem>
<para>Если существует скрипт
<filename>scripts/configure</filename>, то он запускается.
</para>
</listitem>
<orderedlist>
<listitem>
<para>Если существует скрипт
<filename>scripts/configure</filename>, то он
запускается.</para>
</listitem>
<listitem>
<para>Если задана переменная <varname>HAS_CONFIGURE</varname>
или <varname>GNU_CONFIGURE</varname>, то запускается скрипт
<filename>WRKSRC/configure</filename>.
</para>
</listitem>
</orderedlist>
</step>
<listitem>
<para>Если задана переменная
<varname>HAS_CONFIGURE</varname> или
<varname>GNU_CONFIGURE</varname>, то запускается скрипт
<filename>WRKSRC/configure</filename>.</para>
</listitem>
</orderedlist>
</step>
<step>
<para>Выполняется цель <buildtarget>build</buildtarget>. Она
отвечает за переход в собственный рабочий каталог порта
(<varname>WRKSRC</varname>) и его построение.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>build</buildtarget>. Она
отвечает за переход в собственный рабочий каталог порта
(<varname>WRKSRC</varname>) и его построение.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>stage</buildtarget>.
Конечный набор построенных файлов помещается во временный
каталог (<varname>STAGEDIR</varname>, смотрите
<xref linkend="staging"/>). Иерархия этого
каталога отражает иерархию каталогов системы, в которую
данный пакет будет устанавливаться.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>stage</buildtarget>.
Конечный набор построенных файлов помещается во временный
каталог (<varname>STAGEDIR</varname>, смотрите <xref
linkend="staging"/>). Иерархия этого каталога отражает
иерархию каталогов системы, в которую данный пакет будет
устанавливаться.</para>
</step>
<step>
<para>Выполняется цель <buildtarget>install</buildtarget>.
В систему копируются файлы, перечисленные в pkg-plist
порта.</para>
</step>
</procedure>
<step>
<para>Выполняется цель <buildtarget>install</buildtarget>.
В систему копируются файлы, перечисленные в pkg-plist
порта.</para>
</step>
</procedure>
<para>Выше перечислены стандартные действия. Кроме того, вы сами
можете определить цели
<buildtarget>pre-<replaceable>что-то</replaceable></buildtarget> или
<buildtarget>post-<replaceable>что-то</replaceable></buildtarget>,
или создать скрипты с такими именами в подкаталоге
<filename>scripts</filename>, и они будут запущены до или после
выполнения действий по умолчанию.</para>
<para>Выше перечислены стандартные действия. Кроме того, вы сами
можете определить цели
<buildtarget>pre-<replaceable>что-то</replaceable></buildtarget>
или
<buildtarget>post-<replaceable>что-то</replaceable></buildtarget>,
или создать скрипты с такими именами в подкаталоге
<filename>scripts</filename>, и они будут запущены до или после
выполнения действий по умолчанию.</para>
<para>Например, если у вас есть цель
<buildtarget>post-extract</buildtarget>, определённая в вашем файле
<filename>Makefile</filename> и файл <filename>pre-build</filename> в
подкаталоге
<filename>scripts</filename>, то после выполнения обычных действий по
распаковке, будет вызвана цель <buildtarget>post-extract</buildtarget>
а скрипт <filename>pre-build</filename> будет выполнен перед
запуском стандартных правил построения. Рекомендуется использовать
цели из <filename>Makefile</filename>, если действия достаточно
просты, потому что в дальнейшем будет проще определить, какие
нестандартные действия требует порт.</para>
<para>Например, если у вас есть цель
<buildtarget>post-extract</buildtarget>, определённая в вашем
файле <filename>Makefile</filename> и файл
<filename>pre-build</filename> в подкаталоге
<filename>scripts</filename>, то после выполнения обычных
действий по распаковке, будет вызвана цель
<buildtarget>post-extract</buildtarget> а скрипт
<filename>pre-build</filename> будет выполнен перед запуском
стандартных правил построения. Рекомендуется использовать цели
из <filename>Makefile</filename>, если действия достаточно
просты, потому что в дальнейшем будет проще определить, какие
нестандартные действия требует порт.</para>
<para>Действия по умолчанию выполняются целями
<buildtarget>do-<replaceable>что-то</replaceable></buildtarget> из
<filename>bsd.port.mk</filename>. Например, команды для
распаковки порта находятся в цели
<buildtarget>do-extract</buildtarget>. Если вам не хватает цели по
умолчанию, вы можете ее исправить, переопределив цель
<buildtarget>do-<replaceable>something</replaceable></buildtarget>
в вашем файле <filename>Makefile</filename>.</para>
<para>Действия по умолчанию выполняются целями
<buildtarget>do-<replaceable>что-то</replaceable></buildtarget>
из <filename>bsd.port.mk</filename>. Например, команды для
распаковки порта находятся в цели
<buildtarget>do-extract</buildtarget>. Если вам не хватает
цели по умолчанию, вы можете ее исправить, переопределив цель
<buildtarget>do-<replaceable>something</replaceable></buildtarget>
в вашем файле <filename>Makefile</filename>.</para>
<note>
<para><quote>Основные</quote> цели (к примеру,
<buildtarget>extract</buildtarget>, <buildtarget>configure</buildtarget>
и так далее) не делают ничего больше,
чем проверяют успешность завершения всех предыдущих шагов и
вызывают настоящие цели или скрипты, и их не нужно менять. Если
вам нужно изменить распаковку, исправляйте
<buildtarget>do-extract</buildtarget>, но никогда не меняйте способ
работы <buildtarget>extract</buildtarget>! Кроме того, цель
<buildtarget>post-deinstall</buildtarget> является недействительной
и не выполняется инфраструктурой портов.</para>
</note>
<note>
<para><quote>Основные</quote> цели (к примеру,
<buildtarget>extract</buildtarget>,
<buildtarget>configure</buildtarget> и так далее) не делают
ничего больше, чем проверяют успешность завершения всех
предыдущих шагов и вызывают настоящие цели или скрипты, и их
не нужно менять. Если вам нужно изменить распаковку,
исправляйте <buildtarget>do-extract</buildtarget>, но никогда
не меняйте способ работы <buildtarget>extract</buildtarget>!
Кроме того, цель <buildtarget>post-deinstall</buildtarget>
является недействительной и не выполняется инфраструктурой
портов.</para>
</note>
<para>Теперь, когда вы представляете, что происходит, когда
пользователь набирает команду <command>make install</command>,
давайте пройдемся
через шаги, рекомендуемые для создания настоящего порта.</para>
</sect1>
<para>Теперь, когда вы представляете, что происходит, когда
пользователь набирает команду <command>make install</command>,
давайте пройдемся через шаги, рекомендуемые для создания
настоящего порта.</para>
</sect1>
<sect1 xml:id="slow-sources">
<title>Получение исходного кода</title>
<sect1 xml:id="slow-sources">
<title>Получение исходного кода</title>
<para>Получите оригинальные исходные тексты (обычно) в виде
упакованного tar-архива
(<filename>foo.tar.gz</filename> или
<filename>foo.tar.bz2</filename>)
и скопируйте его в каталог <varname>DISTDIR</varname>. Всегда
используйте исходные тексты <emphasis>основной ветки
разработки</emphasis> везде, где это возможно.</para>
<para>Получите оригинальные исходные тексты (обычно) в виде
упакованного tar-архива (<filename>foo.tar.gz</filename> или
<filename>foo.tar.bz2</filename>) и скопируйте его в каталог
<varname>DISTDIR</varname>. Всегда используйте исходные тексты
<emphasis>основной ветки разработки</emphasis> везде, где это
возможно.</para>
<para>Вам потребуется задать значение переменной
<varname>MASTER_SITES</varname> так, чтобы оно указывало на
местоположение оригинального tar-архива. В файле
<filename>bsd.sites.mk</filename> вы найдёте краткие обозначения
для большинства популярных сайтов. Пожалуйста, используйте эти
сайты&mdash;и соответствующие определения&mdash;везде, где это
возможно, чтобы избежать проблем повторения одной и той же информации
в базе источников. Так как эти сайты со временем меняются, для
всех причастных поддержка становится настоящим кошмаром.</para>
<para>Вам потребуется задать значение переменной
<varname>MASTER_SITES</varname> так, чтобы оно указывало на
местоположение оригинального tar-архива. В файле
<filename>bsd.sites.mk</filename> вы найдёте краткие
обозначения для большинства популярных сайтов. Пожалуйста,
используйте эти сайты&mdash;и соответствующие
определения&mdash;везде, где это возможно, чтобы избежать
проблем повторения одной и той же информации в базе источников.
Так как эти сайты со временем меняются, для всех причастных
поддержка становится настоящим кошмаром.</para>
<para>Если вы не можете найти FTP/HTTP сайт с хорошим подключением к
сети, или находите только сайты, которые имеют раздражающе
нестандартные форматы, то можете захотеть поместить копию на надежный
сервер FTP или HTTP, который вам доступен (например, ваша домашняя
страница).</para>
<para>Если вы не можете найти FTP/HTTP сайт с хорошим
подключением к сети, или находите только сайты, которые имеют
раздражающе нестандартные форматы, то можете захотеть поместить
копию на надежный сервер FTP или HTTP, который вам доступен
(например, ваша домашняя страница).</para>
<para>Если вы не можете найти доступного и надёжного места для
помещения дистрибутивного файла, то мы сами сможем разместить его на
сервере <systemitem>ftp.FreeBSD.org</systemitem>; однако это наименее
рекомендуемое решение. Дистрибутивный файл должен
быть помещён в каталог <filename>~/public_distfiles/</filename>
одного из пользователей машины <systemitem>freefall</systemitem>. Попросите
того, кто коммиттил ваш порт, сделать это. Этот человек также задаст
переменной <varname>MASTER_SITES</varname> значение
<varname>MASTER_SITE_LOCAL</varname>, а в переменной
<varname>MASTER_SITE_SUBDIR</varname> укажет своё имя пользователя
с машины <systemitem>freefall</systemitem>.</para>
<para>Если вы не можете найти доступного и надёжного места для
помещения дистрибутивного файла, то мы сами сможем разместить
его на сервере <systemitem>ftp.FreeBSD.org</systemitem>; однако
это наименее рекомендуемое решение. Дистрибутивный файл должен
быть помещён в каталог <filename>~/public_distfiles/</filename>
одного из пользователей машины
<systemitem>freefall</systemitem>. Попросите того, кто
коммиттил ваш порт, сделать это. Этот человек также задаст
переменной <varname>MASTER_SITES</varname> значение
<varname>MASTER_SITE_LOCAL</varname>, а в переменной
<varname>MASTER_SITE_SUBDIR</varname> укажет своё имя
пользователя с машины <systemitem>freefall</systemitem>.</para>
<para>Если дистрибутивные файлы вашего порта постоянно меняются по
неизвестным причинам без изменения версий со стороны автора, остаётся
только поместить дистрибутив на вашу домашнюю Web-страницу и указать
её первой в списке <varname>MASTER_SITES</varname>. Если можете,
попытайтесь договориться с автором порта об этом; это действительно
помогает в достижении некоторого управления исходным кодом.
Размещение собственной версии поможет избежать появления ошибок у
пользователей типа <errorname>checksum mismatch</errorname>, а
также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер.
Также, если у порта имеется только один основной сервер, то
рекомендуется поместить архивную копию на свой сайт и указать его в
списке <varname>MASTER_SITES</varname> вторым.</para>
<para>Если дистрибутивные файлы вашего порта постоянно меняются
по неизвестным причинам без изменения версий со стороны автора,
остаётся только поместить дистрибутив на вашу домашнюю
Web-страницу и указать её первой в списке
<varname>MASTER_SITES</varname>. Если можете, попытайтесь
договориться с автором порта об этом; это действительно
помогает в достижении некоторого управления исходным кодом.
Размещение собственной версии поможет избежать появления ошибок
у пользователей типа <errorname>checksum mismatch</errorname>,
а также уменьшит нагрузку на людей, сопровождающих наш
FTP-сервер. Также, если у порта имеется только один основной
сервер, то рекомендуется поместить архивную копию на свой сайт
и указать его в списке <varname>MASTER_SITES</varname>
вторым.</para>
<para>Если вашему порту требуются дополнительные `патчи', доступные
в Интернет, скачайте также и их, поместив в каталог
<varname>DISTDIR</varname>. Не волнуйтесь, если они находятся не
на том же сайте, откуда взят дистрибутивный архив, мы умеем
обрабатывать такие ситуации (смотрите описание <link linkend="porting-patchfiles">PATCHFILES</link> ниже).</para>
</sect1>
<para>Если вашему порту требуются дополнительные `патчи',
доступные в Интернет, скачайте также и их, поместив в каталог
<varname>DISTDIR</varname>. Не волнуйтесь, если они находятся
не на том же сайте, откуда взят дистрибутивный архив, мы умеем
обрабатывать такие ситуации (смотрите описание <link
linkend="porting-patchfiles">PATCHFILES</link> ниже).</para>
</sect1>
<sect1 xml:id="slow-modifying">
<title>Модификация порта</title>
<sect1 xml:id="slow-modifying">
<title>Модификация порта</title>
<para>Распакуйте копию дистрибутивного файла в отдельный каталог и
внесите изменения, которые необходимы для того, чтобы порт
компилировался нормально в текущей версии &os;.
<emphasis>Тщательно отслеживайте</emphasis> все, что вы делаете,
этот процесс вам предстоит автоматизировать. Все, включая удаление,
добавление или модификацию в файлах должны будут выполняться
автоматически с помощью скриптов или файлов патчей, когда вы
завершите работу над портом.</para>
<para>Распакуйте копию дистрибутивного файла в отдельный каталог
и внесите изменения, которые необходимы для того, чтобы порт
компилировался нормально в текущей версии &os;.
<emphasis>Тщательно отслеживайте</emphasis> все, что вы
делаете, этот процесс вам предстоит автоматизировать. Все,
включая удаление, добавление или модификацию в файлах должны
будут выполняться автоматически с помощью скриптов или файлов
патчей, когда вы завершите работу над портом.</para>
<para>Если вашему порту во время компиляции, установки и настройки
требуется довольно много взаимодействовать с пользователем, то
посмотрите на один из классических скриптов
<application>Configure</application> Лэрри Уолла (Larry Wall) и
сделайте сами что-либо подобное. Предназначение новой коллекции
портов - это сделать каждое приложение в стиле
<quote>plug-and-play</quote> настолько, насколько это вообще возможно
для конечного пользователя при минимальном использовании дискового
пространства.</para>
<para>Если вашему порту во время компиляции, установки и
настройки требуется довольно много взаимодействовать с
пользователем, то посмотрите на один из классических скриптов
<application>Configure</application> Лэрри Уолла (Larry Wall) и
сделайте сами что-либо подобное. Предназначение новой
коллекции портов - это сделать каждое приложение в стиле
<quote>plug-and-play</quote> настолько, насколько это вообще
возможно для конечного пользователя при минимальном
использовании дискового пространства.</para>
<note>
<para>Если явно не указано обратное, то патчи, скрипты и другие
файлы, которые вы создали и предоставили для Коллекции Портов
&os;, неявно подпадают под стандартные условия лицензии
BSD.</para>
</note>
</sect1>
<note>
<para>Если явно не указано обратное, то патчи, скрипты и другие
файлы, которые вы создали и предоставили для Коллекции Портов
&os;, неявно подпадают под стандартные условия лицензии
BSD.</para>
</note>
</sect1>
<sect1 xml:id="slow-patch">
<title>Создание патчей</title>
<sect1 xml:id="slow-patch">
<title>Создание патчей</title>
<para>Файлы, которые добавлялись или изменялись в процессе создания
порта, могут быть выявлены программой &man.diff.1;,
а результат работы этой программы может быть в дальнейшем передан
программе &man.patch.1;. Такое действие с обычным файлом
подразумевает сохранение копии файла с первоначальным содержимым
перед внесением каких-либо изменений.</para>
<para>Файлы, которые добавлялись или изменялись в процессе
создания порта, могут быть выявлены программой &man.diff.1;, а
результат работы этой программы может быть в дальнейшем передан
программе &man.patch.1;. Такое действие с обычным файлом
подразумевает сохранение копии файла с первоначальным
содержимым перед внесением каких-либо изменений.</para>
<screen>&prompt.user; <userinput>cp <replaceable>file</replaceable> <replaceable>file</replaceable>.orig</userinput></screen>
<screen>&prompt.user; <userinput>cp <replaceable>file</replaceable> <replaceable>file</replaceable>.orig</userinput></screen>
<para>Патчи сохраняются в виде файлов с именем
<filename>patch-*</filename>, где
<replaceable>*</replaceable> обозначает путь к файлу,
к которому применяется патч, такой как
<filename>patch-Imakefile</filename> или
<filename>patch-src-config.h</filename>.</para>
<para>Патчи сохраняются в виде файлов с именем
<filename>patch-*</filename>, где <replaceable>*</replaceable>
обозначает путь к файлу, к которому применяется патч, такой как
<filename>patch-Imakefile</filename> или
<filename>patch-src-config.h</filename>.</para>
<para>После того как файл был изменён, используется &man.diff.1;
для получения разницы между первоначальной и изменённой
версиями. Параметр <option>-u</option> указывает &man.diff.1;
выводить разницу в <quote>унифицированном</quote> формате,
который также является предпочтительным.</para>
<para>После того как файл был изменён, используется &man.diff.1;
для получения разницы между первоначальной и изменённой
версиями. Параметр <option>-u</option> указывает &man.diff.1;
выводить разницу в <quote>унифицированном</quote> формате,
который также является предпочтительным.</para>
<screen>&prompt.user; <userinput>diff -u <replaceable>file</replaceable>.orig <replaceable>file</replaceable> &gt; patch-<replaceable>pathname-file</replaceable></userinput></screen>
<screen>&prompt.user; <userinput>diff -u <replaceable>file</replaceable>.orig <replaceable>file</replaceable> &gt; patch-<replaceable>pathname-file</replaceable></userinput></screen>
<para>Для порождении патчей для новых добавляемых файлов
используется параметр <option>-N</option>, который заставляет
&man.diff.1; трактовать несуществующие прежде файлы как если
бы они существовали, но имели пустое содержимое:</para>
<para>Для порождении патчей для новых добавляемых файлов
используется параметр <option>-N</option>, который заставляет
&man.diff.1; трактовать несуществующие прежде файлы как если бы
они существовали, но имели пустое содержимое:</para>
<screen>&prompt.user; <userinput>diff -u -N <replaceable>newfile</replaceable>.orig <replaceable>newfile</replaceable> &gt; patch-<replaceable>pathname-newfile</replaceable></userinput></screen>
<screen>&prompt.user; <userinput>diff -u -N <replaceable>newfile</replaceable>.orig <replaceable>newfile</replaceable> &gt; patch-<replaceable>pathname-newfile</replaceable></userinput></screen>
<para>Файлы с патчами помещаются в
каталоге <varname>PATCHDIR</varname>
(как правило, это <filename class="directory">files/</filename>),
откуда они будут взяты автоматически. Все патчи обязаны быть сделаны
относительно каталога <varname>WRKSRC</varname> (как правило,
это каталог, в который распаковывается исходный архив и где будет
выполняться построение). Для упрощения внесения изменений и
обновлений избегайте наличия более чем одного патча для
одного и того же файла (например, патчей
<filename>patch-file</filename> и <filename>patch-file2</filename>,
оба меняющих файл <filename>WRKSRC/foobar.c</filename>).
Обратите внимание, что если путь к изменяемому файлу содержит символ
подчеркивания (<literal>_</literal>), то патч должен содержать в своем
имени два подчеркивания вместо одного. Например, для применения патча
на файл с именем <filename>src/freeglut_joystick.c</filename>
соответствующий патч следует назвать
<filename>patch-src-freeglut__joystick.c</filename>.</para>
<para>Файлы с патчами помещаются в каталоге
<varname>PATCHDIR</varname> (как правило, это <filename
class="directory">files/</filename>), откуда они будут взяты
автоматически. Все патчи обязаны быть сделаны относительно
каталога <varname>WRKSRC</varname> (как правило, это каталог, в
который распаковывается исходный архив и где будет выполняться
построение). Для упрощения внесения изменений и обновлений
избегайте наличия более чем одного патча для одного и того же
файла (например, патчей <filename>patch-file</filename> и
<filename>patch-file2</filename>, оба меняющих файл
<filename>WRKSRC/foobar.c</filename>). Обратите внимание, что
если путь к изменяемому файлу содержит символ подчеркивания
(<literal>_</literal>), то патч должен содержать в своем имени
два подчеркивания вместо одного. Например, для применения
патча на файл с именем
<filename>src/freeglut_joystick.c</filename> соответствующий
патч следует назвать
<filename>patch-src-freeglut__joystick.c</filename>.</para>
<para>Пожалуйста, используйте для именования патчей только символы
<literal>[-+._a-zA-Z0-9]</literal>. Не используйте любые другие
символы, кроме этих. Не называйте патчи как
<filename>patch-aa</filename> или <filename>patch-ab</filename>,
всегда ссылайтесь на путь и название файла в названиях самих
патчей.</para>
<para>Пожалуйста, используйте для именования патчей только
символы <literal>[-+._a-zA-Z0-9]</literal>. Не используйте
любые другие символы, кроме этих. Не называйте патчи как
<filename>patch-aa</filename> или
<filename>patch-ab</filename>, всегда ссылайтесь на путь и
название файла в названиях самих патчей.</para>
<para>Существует альтернативный упрощённый способ создания
патчей для существующих файлов. Первые шаги те же самые:
создание копии неизменённого файла с расширением
<filename>.orig</filename> и внесение изменений. После этого
используйте <command>make makepatch</command>, чтобы обновить
файлы с патчами в каталоге <filename>files</filename> данного
порта.</para>
<para>Существует альтернативный упрощённый способ создания патчей
для существующих файлов. Первые шаги те же самые: создание
копии неизменённого файла с расширением
<filename>.orig</filename> и внесение изменений. После этого
используйте <command>make makepatch</command>, чтобы обновить
файлы с патчами в каталоге <filename>files</filename> данного
порта.</para>
<para>Не помещайте строки RCS в патчи.
<application>Subversion</application> будет изменять их при
помещении файлов в дерево портов, и когда мы будем их оттуда
извлекать, они будут уже другие, поэтому применение патчей
окончится неудачей. Строчки RCS предваряются знаком доллара
(<literal>&dollar;</literal>), и обычно начинаются с
<literal>&dollar;Id</literal> или
<literal>&dollar;RCS</literal>.</para>
<para>Не помещайте строки RCS в патчи.
<application>Subversion</application> будет изменять их при
помещении файлов в дерево портов, и когда мы будем их оттуда
извлекать, они будут уже другие, поэтому применение патчей
окончится неудачей. Строчки RCS предваряются знаком доллара
(<literal>&dollar;</literal>), и обычно начинаются с
<literal>&dollar;Id</literal> или
<literal>&dollar;RCS</literal>.</para>
<para>Использование параметра рекурсии (<option>-r</option>) с командой
&man.diff.1; для генерации патчей - это хорошо, но всё же,
пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в
отсутствии ненужного мусора. В частности, diff-разниц между двумя
резервными копиями файлов, файлы <filename>Makefile</filename>, когда
как порт использует <command>Imake</command> или
GNU-версию программы <command>configure</command>, и так далее,
не нужны, и должны быть удалены. Если было необходимо
отредактировать файл <filename>configure.in</filename> и
запустить <command>autoconf</command> для перегенерации
<command>configure</command>, не нужно включать файлы diff для
<command>configure</command> (они частенько вырастают до нескольких
тысяч строк!). Вместо этого задайте
<literal>USE_AUTOTOOLS=autoconf:261</literal> и
включите diff-файл для <filename>configure.in</filename>.</para>
<para>Использование параметра рекурсии (<option>-r</option>) с
командой &man.diff.1; для генерации патчей - это хорошо, но всё
же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться
в отсутствии ненужного мусора. В частности, diff-разниц между
двумя резервными копиями файлов, файлы
<filename>Makefile</filename>, когда как порт использует
<command>Imake</command> или GNU-версию программы
<command>configure</command>, и так далее, не нужны, и должны
быть удалены. Если было необходимо отредактировать файл
<filename>configure.in</filename> и запустить
<command>autoconf</command> для перегенерации
<command>configure</command>, не нужно включать файлы diff для
<command>configure</command> (они частенько вырастают до
нескольких тысяч строк!). Вместо этого задайте
<literal>USE_AUTOTOOLS=autoconf:261</literal> и включите
diff-файл для <filename>configure.in</filename>.</para>
<para>Старайтесь минимизировать в патчах объём
нефункциональных изменений с пустыми символами. В мире Открытого
Исходного Кода является распространенным совместное использование
проектами больших объемов кодовой базы, но с различными стилями
и правилами отступов. При копировании работающей функциональной
части из одного проекта для исправления похожей области в другом,
будьте аккуратны, пожалуйста: получаемый однострочный патч
может указаться полон нефункциональных изменений. Это не только
увеличивает размер репозитория <application>Subversion</application>,
но также усложняет поиск того,
что конкретно вызвало проблему и что вообще поменялось.</para>
<para>Старайтесь минимизировать в патчах объём нефункциональных
изменений с пустыми символами. В мире Открытого Исходного Кода
является распространенным совместное использование проектами
больших объемов кодовой базы, но с различными стилями и
правилами отступов. При копировании работающей функциональной
части из одного проекта для исправления похожей области в
другом, будьте аккуратны, пожалуйста: получаемый однострочный
патч может указаться полон нефункциональных изменений. Это не
только увеличивает размер репозитория
<application>Subversion</application>, но также усложняет поиск
того, что конкретно вызвало проблему и что вообще
поменялось.</para>
<para>Если нужно удалить файл, сделайте это при выполнении цели
<buildtarget>post-extract</buildtarget>, вместо того чтобы
оформлять это как часть патча.</para>
<para>Если нужно удалить файл, сделайте это при выполнении цели
<buildtarget>post-extract</buildtarget>, вместо того чтобы
оформлять это как часть патча.</para>
<para>Простые перемещения могут быть выполнены непосредственно из
<filename>Makefile</filename> порта с использованием &man.sed.1; в
режиме in-place. Это удобно, когда при изменении используется
значение переменной:</para>
<para>Простые перемещения могут быть выполнены непосредственно из
<filename>Makefile</filename> порта с использованием
&man.sed.1; в режиме in-place. Это удобно, когда при изменении
используется значение переменной:</para>
<programlisting>post-patch:
<programlisting>post-patch:
@${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README</programlisting>
<para>Довольно часто в исходных файлах портируемого программного
обеспечения используется конвенция CR/LF. Это может стать
причиной проблем с дальнейшей упаковкой, предупреждениями
компилятора или выполнением скриптов (таких как
<literal>/bin/sh^M not found</literal>). Для быстрого
преобразования всех файлов из CR/LF просто в LF добавьте
в <filename>Makefile</filename> порта эту запись:</para>
<para>Довольно часто в исходных файлах портируемого программного
обеспечения используется конвенция CR/LF. Это может стать
причиной проблем с дальнейшей упаковкой, предупреждениями
компилятора или выполнением скриптов (таких как
<literal>/bin/sh^M not found</literal>). Для быстрого
преобразования всех файлов из CR/LF просто в LF добавьте в
<filename>Makefile</filename> порта эту запись:</para>
<programlisting>USES= dos2unix</programlisting>
<programlisting>USES= dos2unix</programlisting>
<para>Может быть задан точный список преобразуемых файлов:</para>
<para>Может быть задан точный список преобразуемых файлов:</para>
<programlisting>USES= dos2unix
<programlisting>USES= dos2unix
DOS2UNIX_FILES= util.c util.h</programlisting>
<para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы
преобразовать группу файлов в разных подкаталогах.
Его параметром является регулярное выражение, совместимое с
&man.find.1;. Подробнее о формате в &man.re.format.7;.
Такой вариант удобен для преобразования всех файлов заданного
расширения. Для примера, преобразуем все исходные файлы,
не затрагивая двоичные файлы:</para>
<para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы
преобразовать группу файлов в разных подкаталогах. Его
параметром является регулярное выражение, совместимое с
&man.find.1;. Подробнее о формате в &man.re.format.7;. Такой
вариант удобен для преобразования всех файлов заданного
расширения. Для примера, преобразуем все исходные файлы, не
затрагивая двоичные файлы:</para>
<programlisting>USES= dos2unix
<programlisting>USES= dos2unix
DOS2UNIX_REGEX= .*\.([ch]|cpp)</programlisting>
<para>Другим вариантом является использование
<varname>DOS2UNIX_GLOB</varname>, который вызывает
<command>find</command> для каждого из перечисленных в нём
элементов.</para>
<para>Другим вариантом является использование
<varname>DOS2UNIX_GLOB</varname>, который вызывает
<command>find</command> для каждого из перечисленных в нём
элементов.</para>
<programlisting>USES= dos2unix
<programlisting>USES= dos2unix
DOS2UNIX_GLOB= *.c *.cpp *.h</programlisting>
</sect1>
</sect1>
<sect1 xml:id="slow-configure">
<title>Конфигурирование</title>
<sect1 xml:id="slow-configure">
<title>Конфигурирование</title>
<para>Поместите все дополнительные команды, требуемые для настройки,
в ваш скрипт <filename>configure</filename> и сохраните его в
подкаталоге <filename>scripts</filename>. Как отмечено выше, вы
можете сделать это целями в файле <filename>Makefile</filename>
и/или скриптами с именами <filename>pre-configure</filename> или
<filename>post-configure</filename>.</para>
</sect1>
<para>Поместите все дополнительные команды, требуемые для
настройки, в ваш скрипт <filename>configure</filename> и
сохраните его в подкаталоге <filename>scripts</filename>. Как
отмечено выше, вы можете сделать это целями в файле
<filename>Makefile</filename> и/или скриптами с именами
<filename>pre-configure</filename> или
<filename>post-configure</filename>.</para>
</sect1>
<sect1 xml:id="slow-user-input">
<title>Обработка пользовательского ввода</title>
<sect1 xml:id="slow-user-input">
<title>Обработка пользовательского ввода</title>
<para>Если для построения, конфигурации или установки вашего порта
требуется некоторый ввод со стороны пользователя, то вы должны задать
переменную <varname>IS_INTERACTIVE</varname> в вашем файле
<filename>Makefile</filename>. В случае <quote>ночного
построения</quote> это позволит пропустить
ваш порт, если пользователь в своем окружении задал переменную
<envar>BATCH</envar> (и если пользователь установил переменную
<envar>INTERACTIVE</envar>, то будут строиться
<emphasis>только</emphasis> порты, которые требуют взаимодействия
с пользователем. Это сэкономит значительное количество времени на
части машин, которые постоянно строят порты (смотрите ниже).</para>
<para>При наличии разумных ответов на задаваемые вопросы, подходящих по
умолчанию, также рекомендуется проверять переменную
<varname>PACKAGE_BUILDING</varname> и выключать интерактивный скрипт,
если он есть. Это позволит нам строить пакеты для помещения на
компакт-диски и FTP-серверы.</para>
</sect1>
</chapter>
<para>Если для построения, конфигурации или установки вашего
порта требуется некоторый ввод со стороны пользователя, то вы
должны задать переменную <varname>IS_INTERACTIVE</varname> в
вашем файле <filename>Makefile</filename>. В случае
<quote>ночного построения</quote> это позволит пропустить ваш
порт, если пользователь в своем окружении задал переменную
<envar>BATCH</envar> (и если пользователь установил переменную
<envar>INTERACTIVE</envar>, то будут строиться
<emphasis>только</emphasis> порты, которые требуют
взаимодействия с пользователем. Это сэкономит значительное
количество времени на части машин, которые постоянно строят
порты (смотрите ниже).</para>
<para>При наличии разумных ответов на задаваемые вопросы,
подходящих по умолчанию, также рекомендуется проверять
переменную <varname>PACKAGE_BUILDING</varname> и выключать
интерактивный скрипт, если он есть. Это позволит нам строить
пакеты для помещения на компакт-диски и FTP-серверы.</para>
</sect1>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -7,191 +7,208 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="testing">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="testing">
<title>Тестирование вашего порта</title>
<title>Тестирование вашего порта</title>
<sect1 xml:id="make-describe">
<title>Запуск <command>make describe</command></title>
<sect1 xml:id="make-describe">
<title>Запуск <command>make describe</command></title>
<para>Некоторые утилиты &os; для сопровождения портов, например,
&man.portupgrade.1;, опираются на базу данных с именем
<filename>/usr/ports/INDEX</filename>, в которой отслеживаются такие
характеристики портов, как их зависимости. Файл
<filename>INDEX</filename> создаётся при помощи
<filename>ports/Makefile</filename> верхнего уровня по команде
<command>make index</command>, спускающейся в подкаталог каждого
порта и выполняющей в нём <command>make describe</command>. Таким
образом, если выполнение <command>make describe</command> с
каким-либо портом завершится неудачно, то никому не удастся создать
<filename>INDEX</filename>, при этом много людей вскоре станут
несчастны.</para>
<para>Некоторые утилиты &os; для сопровождения портов, например,
&man.portupgrade.1;, опираются на базу данных с именем
<filename>/usr/ports/INDEX</filename>, в которой отслеживаются
такие характеристики портов, как их зависимости. Файл
<filename>INDEX</filename> создаётся при помощи
<filename>ports/Makefile</filename> верхнего уровня по команде
<command>make index</command>, спускающейся в подкаталог
каждого порта и выполняющей в нём <command>make
describe</command>. Таким образом, если выполнение
<command>make describe</command> с каким-либо портом завершится
неудачно, то никому не удастся создать
<filename>INDEX</filename>, при этом много людей вскоре станут
несчастны.</para>
<note>
<para>Возможность генерировать этот файл очень важна вне зависимости
от того, какие параметры присутствуют в
<filename>make.conf</filename>, поэтому, пожалуйста, избегайте,
таких вещей, как использование декларации
<literal>.error</literal>, когда (к примеру) требования к
зависимости не было удовлетворено. (Смотрите
<xref linkend="dads-dot-error"/>.)</para>
</note>
<note>
<para>Возможность генерировать этот файл очень важна вне
зависимости от того, какие параметры присутствуют в
<filename>make.conf</filename>, поэтому, пожалуйста,
избегайте, таких вещей, как использование декларации
<literal>.error</literal>, когда (к примеру) требования к
зависимости не было удовлетворено. (Смотрите
<xref linkend="dads-dot-error"/>.)</para>
</note>
<para>Если команда <command>make describe</command> выдаёт строчку, а
не ошибку, то для вас это пройдёт безболезненно. Обратитесь к файлу
<filename>bsd.port.mk</filename>, чтобы выяснить значение выдаваемых
строк.</para>
<para>Если <command>make describe</command> выдаёт строчку, а не
ошибку, то для вас это пройдёт безболезненно. Обратитесь к
файлу <filename>bsd.port.mk</filename>, чтобы выяснить значение
выдаваемых строк.</para>
<para>Заметьте также, что запуск последней версии
<command>portlint</command> (как указано в следующем разделе)
приведёт к автоматическому запуску команды
<command>make describe</command>.</para>
</sect1>
<para>Заметьте также, что запуск последней версии
<command>portlint</command> (как указано в следующем разделе)
приведёт к автоматическому запуску команды
<command>make describe</command>.</para>
</sect1>
<sect1 xml:id="testing-portlint">
<title>Portlint</title>
<sect1 xml:id="testing-portlint">
<title>Portlint</title>
<para>Проверьте свою работу командой <link linkend="porting-portlint"><command>portlint</command></link>
перед тем, как её отослать или перенести в дерево портов.
<command>portlint</command> предупреждает вас о многих
распространённых ошибках, как функциональных, так и стилистических.
Для нового (или скопированного внутри хранилища) порта самым
подходящим является запуск <command>portlint -A</command>; для
уже существующего порта достаточно будет запустить
<command>portlint -C</command>.</para>
<para>Проверьте свою работу командой <link
linkend="porting-portlint"><command>portlint</command></link>
перед тем, как её отослать или перенести в дерево портов.
<command>portlint</command> предупреждает вас о многих
распространённых ошибках, как функциональных, так и
стилистических. Для нового (или скопированного внутри
хранилища) порта самым подходящим является запуск
<command>portlint -A</command>; для уже существующего порта
достаточно будет запустить
<command>portlint -C</command>.</para>
<para>Так как для обнаружения ошибок <command>portlint</command>
использует эвристические методы, то им могут выдаваться и ошибочные
предупреждения. Кроме того, время от времени нечто, отмечаемое как
некорректность, из-за ограничений механизма создания портов не может
быть сделано никак иначе. Если вы сомневаетесь, то лучше всего
спросить в &a.ports;.</para>
</sect1>
<para>Так как для обнаружения ошибок <command>portlint</command>
использует эвристические методы, то им могут выдаваться и
ошибочные предупреждения. Кроме того, время от времени нечто,
отмечаемое как некорректность, из-за ограничений механизма
создания портов не может быть сделано никак иначе. Если вы
сомневаетесь, то лучше всего спросить в &a.ports;.</para>
</sect1>
<sect1 xml:id="testing-porttools">
<title>Port Tools</title>
<sect1 xml:id="testing-porttools">
<title>Port Tools</title>
<para>Программа <package role="port">ports-mgmt/porttools</package>
входит в состав Коллекции Портов.</para>
<para>Программа <package
role="port">ports-mgmt/porttools</package> входит в состав
Коллекции Портов.</para>
<para><command>port</command> является сценарием переднего плана,
который может упростить вам задачу тестирования. Если вы хотите
проверить новый порт или обновить существующий, то вы можете
использовать <command>port test</command> для проверки вашего порта,
включая проверку <link linkend="testing-portlint"><command>portlint</command></link>. Эта
команда также находит и отображает любые файлы, которые невключенные
в <filename>pkg-plist</filename>. Смотрите следующий пример:</para>
<para><command>port</command> является сценарием переднего плана,
который может упростить вам задачу тестирования. Если вы
хотите проверить новый порт или обновить существующий, то вы
можете использовать <command>port test</command> для проверки
вашего порта, включая проверку <link
linkend="testing-portlint"><command>portlint</command></link>.
Эта команда также находит и отображает любые файлы, которые
невключенные в <filename>pkg-plist</filename>. Смотрите
следующий пример:</para>
<screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen>
</sect1>
<screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen>
</sect1>
<sect1 xml:id="porting-prefix">
<title><varname>PREFIX</varname> и <varname>DESTDIR</varname></title>
<sect1 xml:id="porting-prefix">
<title><varname>PREFIX</varname> и
<varname>DESTDIR</varname></title>
<para>Переменная <varname>PREFIX</varname> определяет, куда будет
установлен порт. По умолчанию это <filename>/usr/local</filename>,
но может меняться пользователем на собственный путь, такой как
<filename>/opt</filename>. В вашем порту значение этой переменной
должно учитываться.</para>
<para>Переменная <varname>PREFIX</varname> определяет, куда будет
установлен порт. По умолчанию это
<filename>/usr/local</filename>, но может меняться
пользователем на собственный путь, такой как
<filename>/opt</filename>. В вашем порту значение этой
переменной должно учитываться.</para>
<para>Если пользователь установил переменную <varname>DESTDIR</varname>,
то она определяет полное альтернативное окружение, обычно, это jail
или установленная система, смонтированная в месте, отличном от
<filename>/</filename>. На самом деле порт устанавливается в
<filename>DESTDIR/PREFIX</filename>
и регистрируется в базе данных пакетов в
<filename>DESTDIR/var/db/pkg</filename>.
Поскольку управление <varname>DESTDIR</varname> производится
автоматически инфраструктурой портов с помощью &man.chroot.8;, вам
не нужны никакие изменения или проявление особой осторожности
при написании <varname>DESTDIR</varname>-совместимых портов.</para>
<para>Если пользователь установил переменную
<varname>DESTDIR</varname>, то она определяет полное
альтернативное окружение, обычно, это jail или установленная
система, смонтированная в месте, отличном от
<filename>/</filename>. На самом деле порт устанавливается в
<filename>DESTDIR/PREFIX</filename> и регистрируется в базе
данных пакетов в <filename>DESTDIR/var/db/pkg</filename>.
Поскольку управление <varname>DESTDIR</varname> производится
автоматически инфраструктурой портов с помощью &man.chroot.8;,
вам не нужны никакие изменения или проявление особой
осторожности при написании портов, совместымых с
<varname>DESTDIR</varname>.</para>
<para>Значение переменной <varname>PREFIX</varname> будет установлено
в <varname>LOCALBASE</varname> (по умолчанию
<filename>/usr/local</filename>). Если
задана переменная <varname>USE_LINUX_PREFIX</varname>, то
<varname>PREFIX</varname> примет значение <varname>LINUXBASE</varname>
(по умолчанию <filename>/compat/linux</filename>).</para>
<para>Значение переменной <varname>PREFIX</varname> будет
установлено в <varname>LOCALBASE</varname> (по умолчанию
<filename>/usr/local</filename>). Если задана переменная
<varname>USE_LINUX_PREFIX</varname>, то
<varname>PREFIX</varname> примет значение
<varname>LINUXBASE</varname> (по умолчанию
<filename>/compat/linux</filename>).</para>
<para>Избегание явно прописываемых путей <filename>/usr/local</filename>
в исходном коде сделает порт гораздо более гибким и способным
удовлетворить потребности других серверов. Часто этого можно
добиться простой заменой строк <filename>/usr/local</filename>
в различных файлах <filename>Makefile</filename> внутри порта на
<literal>&dollar;{PREFIX}</literal>. Эта переменная
автоматически передаётся далее на каждом этапе построения и
установки.</para>
<para>Избегание явно прописываемых путей
<filename>/usr/local</filename> в исходном коде сделает порт
гораздо более гибким и способным удовлетворить потребности
других серверов. Часто этого можно добиться простой заменой
строк <filename>/usr/local</filename> в различных файлах
<filename>Makefile</filename> внутри порта на
<literal>&dollar;{PREFIX}</literal>. Эта переменная
автоматически передаётся далее на каждом этапе построения и
установки.</para>
<para>Проверьте, что ваше приложение не устанавливает чего-либо в
каталог <filename>/usr/local</filename> вместо
<varname>PREFIX</varname>. Наличие явно указанных путей можно быстро
проверить следующим образом:</para>
<para>Проверьте, что ваше приложение не устанавливает чего-либо в
каталог <filename>/usr/local</filename> вместо
<varname>PREFIX</varname>. Наличие явно указанных путей можно
быстро проверить следующим образом:</para>
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<para>Если что-то было установлено за пределами
<varname>PREFIX</varname>, то процесс создания пакета сообщит об
отсутствии файлов.</para>
<para>Если что-то было установлено за пределами
<varname>PREFIX</varname>, то процесс создания пакета сообщит
об отсутствии файлов.</para>
<para>Это также стоит проверить с использованием поддержки
каталога сборки (смотрите <xref linkend="staging"/>):</para>
<para>Это также стоит проверить с использованием поддержки
каталога сборки (смотрите <xref linkend="staging"/>):</para>
<screen>&prompt.root; <userinput>make stage &amp;&amp; make check-orphans &amp;&amp; make package</userinput></screen>
<screen>&prompt.root; <userinput>make stage &amp;&amp; make check-orphans &amp;&amp; make package</userinput></screen>
<para>Эти проверки не найдут явно указанных путей внутри файлов порта
и не проверят корректность использования <varname>LOCALBASE</varname>
в качестве ссылки на файлы из других портов. Порт, временно
установленный в <filename>/var/tmp/`make -V PORTNAME`</filename>,
следует проверять на работоспособность, чтобы убедиться в отсутствии
проблем с путями.</para>
<para>Эти проверки не найдут явно указанных путей внутри файлов
порта и не проверят корректность использования
<varname>LOCALBASE</varname> в качестве ссылки на файлы из
других портов. Порт, временно установленный в
<filename>/var/tmp/`make -V PORTNAME`</filename>, следует
проверять на работоспособность, чтобы убедиться в отсутствии
проблем с путями.</para>
<para>Переменная <varname>PREFIX</varname> не должна задаваться явно в
файле <filename>Makefile</filename> порта. Пользователи при установке
порта могут задать в <varname>PREFIX</varname> свое собственное
место, и порт должен учитывать это значение.</para>
<para>Переменная <varname>PREFIX</varname> не должна задаваться
явно в файле <filename>Makefile</filename> порта. Пользователи
при установке порта могут задать в <varname>PREFIX</varname>
свое собственное место, и порт должен учитывать это
значение.</para>
<para>Обратитесь к программам/файлам из других портов с
переменными, перечисленными выше, без указания явных маршрутов.
Например, если ваш порт требует, чтобы макрос <literal>PAGER</literal>
являлся полным путем утилиты <command>less</command>, не используйте
строковый путь <filename>/usr/local/bin/less</filename>. Вместо
этого используйте <literal>&dollar;{LOCALBASE}</literal>:</para>
<para>Обратитесь к программам/файлам из других портов с
переменными, перечисленными выше, без указания явных маршрутов.
Например, если ваш порт требует, чтобы макрос
<literal>PAGER</literal> являлся полным путем утилиты
<command>less</command>, не используйте строковый путь
<filename>/usr/local/bin/less</filename>. Вместо этого
используйте <literal>&dollar;{LOCALBASE}</literal>:</para>
<programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>
<programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>
<para>Путь с использованием <varname>LOCALBASE</varname> имеет больше
шансов оставаться работоспособным, если системный администратор
переместил всё дерево <filename>/usr/local</filename> куда-то в другое
место.</para>
</sect1>
<para>Путь с использованием <varname>LOCALBASE</varname> имеет
больше шансов оставаться работоспособным, если системный
администратор переместил всё дерево
<filename>/usr/local</filename> куда-то в другое место.</para>
</sect1>
<sect1 xml:id="testing-tinderbox">
<title>Tinderbox</title>
<sect1 xml:id="testing-tinderbox">
<title>Tinderbox</title>
<para>Если вы алчный контрибутор портов, то вы можете захотеть
взглянуть на <application>Tinderbox</application>. Это мощная
система построения и тестирования портов.
<application>Tinderbox</application> можно установить, используя
порт <package role="port">ports-mgmt/tinderbox</package>.
Обязательно прочитайте поставляемую документацию, поскольку
конфигурация не является тривиальной.</para>
<para>Если вы алчный контрибутор портов, то вы можете захотеть
взглянуть на <application>Tinderbox</application>. Это мощная
система построения и тестирования портов.
<application>Tinderbox</application> можно установить,
используя порт <package
role="port">ports-mgmt/tinderbox</package>. Обязательно
прочитайте поставляемую документацию, поскольку конфигурация не
является тривиальной.</para>
<para>Для получения подробностей посетите
<link xlink:href="http://tinderbox.marcuscom.com/">вебсайт Tinderbox</link>.</para>
</sect1>
<para>Для получения подробностей посетите <link
xlink:href="http://tinderbox.marcuscom.com/">вебсайт
Tinderbox</link>.</para>
</sect1>
<sect1 xml:id="testing-poudriere">
<title>Poudriere</title>
<sect1 xml:id="testing-poudriere">
<title>Poudriere</title>
<para>Если вы контрибутор портов, подумайте об установке
<application>poudriere</application>. Это мощная система
для построения и тестирования портов.
<application>Poudriere</application> можно установить из
<package role="port">ports-mgmt/poudriere</package>.</para>
<para>Для получения подробной информации посетите <link
xlink:href="http://fossil.etoilebsd.net/poudriere">вебсайт
Poudriere</link>.</para>
</sect1>
</chapter>
<para>Если вы контрибутор портов, подумайте об установке
<application>poudriere</application>. Это мощная система для
построения и тестирования портов.
<application>Poudriere</application> можно установить из
<package role="port">ports-mgmt/poudriere</package>.</para>
<para>Для получения подробной информации посетите <link
xlink:href="http://fossil.etoilebsd.net/poudriere">вебсайт
Poudriere</link>.</para>
</sect1>
</chapter>

View file

@ -7,294 +7,305 @@
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="port-upgrading">
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="port-upgrading">
<title>Обновление отдельного порта</title>
<title>Обновление отдельного порта</title>
<para>Если вы заметите, что ваш порт устарел по сравнению с последней
авторской версией, первым делом вы должны получить самую
последнюю версия порта. Вы можете найти их в каталоге
<filename>ports/ports-current</filename> на зеркальных FTP-серверах &os;.
Однако если вы работаете с достаточно большим количеством портов,
наверное, будет проще использовать
<application>Subversion</application> или &man.portsnap.8; для
поддержания всей коллекции портов в актуальном состоянии, как это
описано в <link xlink:href="&url.books.handbook;/ports-using.html">
Руководстве</link>. К тому же это даст возможность отслеживать все
зависимости портов.</para>
<para>Если вы заметите, что ваш порт устарел по сравнению с
последней авторской версией, первым делом вы должны получить
самую последнюю версия порта. Вы можете найти их в каталоге
<filename>ports/ports-current</filename> на зеркальных
FTP-серверах &os;. Однако если вы работаете с достаточно большим
количеством портов, наверное, будет проще использовать
<application>Subversion</application> или &man.portsnap.8; для
поддержания всей коллекции портов в актуальном состоянии, как это
описано в <link
xlink:href="&url.books.handbook;/ports-using.html">Руководстве</link>.
К тому же это даст возможность отслеживать все зависимости
портов.</para>
<para>На следующем шаге необходимо выяснить, нет ожидает ли уже это
обновление своей очереди. Для этого у вас есть две возможности.
Существует интерфейс к <link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе
данных сообщений о проблемах FreeBSD (PR)</link> (известной также как
<literal>GNATS</literal>) с поисковыми возможностями. Выберите из
выпадающего списка <literal>ports</literal> и введите название
порта.</para>
<para>На следующем шаге необходимо выяснить, нет ожидает ли уже это
обновление своей очереди. Для этого у вас есть две возможности.
Существует интерфейс к <link
xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе
данных сообщений о проблемах FreeBSD (PR)</link> (известной
также как <literal>GNATS</literal>) с поисковыми возможностями.
Выберите из выпадающего списка <literal>ports</literal> и введите
название порта.</para>
<para>Однако иногда люди забывают поместить название порта в поле
Synopsis в точном виде. В таком случае вы можете воспользоваться
<link linkend="portsmon">Системой мониторинга портов &os;</link>
(которая известна также как
<literal>portsmon</literal>). В рамках этой системы делается попытка
классифицировать PR, касающиеся портов, по имени порта. Для поиска
PR, относящихся к определённому порту, используйте механизм <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Просмотра
<para>Однако иногда люди забывают поместить название порта в поле
Synopsis в точном виде. В таком случае вы можете воспользоваться
<link linkend="portsmon">Системой мониторинга портов &os;</link>
(которая известна также как <literal>portsmon</literal>). В
рамках этой системы делается попытка классифицировать PR,
касающиеся портов, по имени порта. Для поиска PR, относящихся к
определённому порту, используйте механизм <link
xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Просмотра
ÐÏ ÏÄÎÏÍÕ ÐÏÒÔÕ</link>.</para>
<para>Если таких отложенных PR не существует, то на следующем этапе
следует послать сообщение электронной почты человеку, поддерживающему
порт, который выдаётся по команде <command>make maintainer</command>.
Этот человек может уже работать над обновлением, или иметь
причину не обновлять порт прямо сейчас (например, из-за проблем со
стабильностью функционирования новой версии);
вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые
порты перечисляются с адресом сопровождающего
<literal>ports@FreeBSD.org</literal>, который является всего лишь
адресом общего списка рассылки, так что отправка туда сообщений,
скорее всего, в данном случае не поможет.</para>
<para>Если таких отложенных PR не существует, то на следующем этапе
следует послать сообщение электронной почты человеку,
поддерживающему порт, который выдаётся по команде <command>make
maintainer</command>. Этот человек может уже работать над
обновлением, или иметь причину не обновлять порт прямо сейчас
(например, из-за проблем со стабильностью функционирования новой
версии); вам нет нужды дублировать их работу. Заметьте, что
неподдерживаемые порты перечисляются с адресом сопровождающего
<literal>ports@FreeBSD.org</literal>, который является всего лишь
адресом общего списка рассылки, так что отправка туда сообщений,
скорее всего, в данном случае не поможет.</para>
<para>Если сопровождающий просит вас выполнить обновление, либо
сопровождающий отсутствует, то у вас появляется шанс помочь &os;,
приготовив обновление самим! Пожалуйста, делайте это с использованием
команды &man.diff.1; в основной системе.</para>
<para>Если сопровождающий просит вас выполнить обновление, либо
сопровождающий отсутствует, то у вас появляется шанс помочь &os;,
приготовив обновление самим! Пожалуйста, делайте это с
использованием команды &man.diff.1; в основной системе.</para>
<para>Чтобы создать подходящий <command>diff</command> для одного патча,
скопируйте файл, который нужно пропатчить, в
<replaceable>something.orig</replaceable>, сохраните ваши изменения в
<replaceable>something</replaceable>, а затем создайте ваше патч:</para>
<para>Чтобы создать подходящий <command>diff</command> для одного
патча, скопируйте файл, который нужно пропатчить, в
<replaceable>something.orig</replaceable>, сохраните ваши
изменения в <replaceable>something</replaceable>, а затем
создайте ваше патч:</para>
<informalexample>
<screen>&prompt.user; <userinput>diff -u something.orig something &gt; something.diff</userinput></screen>
</informalexample>
<informalexample>
<screen>&prompt.user; <userinput>diff -u something.orig something &gt; something.diff</userinput></screen>
</informalexample>
<para>В противном случае, вам следует воспользоваться методом
<command>svn diff</command> (<xref linkend="svn-diff"/>), либо
скопировать содержимое порта в
отдельный каталог и применить результат рекурсивной команды &man.diff.1;
между новым и старым каталогами порта (например, если каталог с
модифицированным портом называется <filename>superedit</filename>,
а оригинальный, совпадающий с находящимся в нашем дереве портов,
<filename>superedit.bak</filename>, то сохраните результат выполнения
команды <command>diff -ruN superedit.bak superedit</command>).
Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры
портов обычно предпочитают унифицированный формат. Отметьте
использование опции <literal>-N</literal>&mdash;это одобряемый способ
заставить diff корректно работать в случае добавления новых файлов или
удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста,
проверьте его, чтобы убедиться в значимости всех внесённых
изменений. (В частности, убедитесь, что вы очистили рабочие каталоги
командой <command>make clean</command>).</para>
<para>В противном случае, вам следует воспользоваться методом
<command>svn diff</command> (<xref linkend="svn-diff"/>), либо
скопировать содержимое порта в отдельный каталог и применить
результат рекурсивной команды &man.diff.1; между новым и старым
каталогами порта (например, если каталог с модифицированным
портом называется <filename>superedit</filename>, а оригинальный,
совпадающий с находящимся в нашем дереве портов,
<filename>superedit.bak</filename>, то сохраните результат
выполнения команды <command>diff -ruN superedit.bak
superedit</command>). Подойдёт как унифицированный, так и
контекстный дифф, однако коммиттеры портов обычно предпочитают
унифицированный формат. Отметьте использование опции
<literal>-N</literal>&mdash;это одобряемый способ заставить diff
корректно работать в случае добавления новых файлов или удаления
старых. Перед тем, как посылать нам diff-файл, пожалуйста,
проверьте его, чтобы убедиться в значимости всех внесённых
изменений. (В частности, убедитесь, что вы очистили рабочие
каталоги командой <command>make clean</command>).</para>
<para>Для упрощения повторяющихся операций с файлами заплаток
вы можете воспользоваться скриптом
<filename>/usr/ports/Tools/scripts/patchtool.py</filename>. Перед тем,
как его запускать, пожалуйста, прочтите
<filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para>
<para>Для упрощения повторяющихся операций с файлами заплаток вы
можете воспользоваться скриптом
<filename>/usr/ports/Tools/scripts/patchtool.py</filename>.
Перед тем, как его запускать, пожалуйста, прочтите
<filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para>
<para>Если порт никем не поддерживается, а вы активно его используете,
пожалуйста, подумайте над тем, чтобы добровольно стать его
сопровождающим. Во &os; имеется более 4000 портов без поддержки, и это
как раз та область, где всегда нужны добровольцы. (Детальное описание
обязанностей сопровождающего можно найти в разделе в <link xlink:href="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">
Руководстве Разработчика</link>.)</para>
<para>Если порт никем не поддерживается, а вы активно его
используете, пожалуйста, подумайте над тем, чтобы добровольно
стать его сопровождающим. Во &os; имеется более 4000 портов без
поддержки, и это как раз та область, где всегда нужны
добровольцы. (Детальное описание обязанностей сопровождающего
можно найти в разделе <link
xlink:href="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">Руководства
Разработчика</link>.)</para>
<para>Лучше всего послать нам diff-файл, включив его в посылку по команде
&man.send-pr.1; (категория <literal>ports</literal>). Если вы
сопровождаете порт,
обязательно поместите текст <literal>[maintainer update]</literal> в
начале строки описания и задайте в поле <quote>Class</quote>
вашего PR строчку <literal>maintainer-update</literal>.
В противном случае в поле <quote>Class</quote> вашего PR должно быть
указано <literal>change-request</literal>. Будьте добры, в сообщении
отметьте все добавленные или удалённые файлы, так как они будут
непосредственно указаны &man.svn.1; при выполнении операции коммита.
Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте
утилитой uuencode; в противном случае просто включите его как есть
в PR.</para>
<para>Лучше всего послать нам diff-файл, включив его в посылку по
команде &man.send-pr.1; (категория <literal>ports</literal>).
Если вы сопровождаете порт, обязательно поместите текст
<literal>[maintainer update]</literal> в начале строки описания и
задайте в поле <quote>Class</quote> вашего PR строчку
<literal>maintainer-update</literal>. В противном случае в поле
<quote>Class</quote> вашего PR должно быть указано
<literal>change-request</literal>. Будьте добры, в сообщении
отметьте все добавленные или удалённые файлы, так как они будут
непосредственно указаны &man.svn.1; при выполнении операции
коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите
его и обработайте утилитой uuencode; в противном случае просто
включите его как есть в PR.</para>
<para>Прежде чем пользоваться &man.send-pr.1; просмотрите раздел
о <link xlink:href="&url.articles.problem-reports;/pr-writing.html">Написании
сообщений о проблемах</link> в статье о Сообщениях об ошибках. Он
содержит гораздо больше информации о том, как писать полезные сообщения
о проблемах.</para>
<para>Прежде чем пользоваться &man.send-pr.1; просмотрите раздел о
<link
xlink:href="&url.articles.problem-reports;/pr-writing.html">Написании
сообщений о проблемах</link> в статье о Сообщениях об ошибках.
Он содержит гораздо больше информации о том, как писать полезные
сообщения о проблемах.</para>
<important>
<para>Если обновление вызвано соображениями информационной
безопасности или наличием серьёзных ошибок в имеющемся порте,
пожалуйста, оповестите &a.portmgr; о необходимости немедленного
перепостроения и повторного распространения пакета данного порта.
В противном случае ничего не подозревающие пользователи
<command>pkg</command> будут продолжать устанавливать старую
версию по команде <command>pkg install</command> в течение
ещё нескольких недель.</para>
</important>
<important>
<para>Если обновление вызвано соображениями информационной
безопасности или наличием серьёзных ошибок в имеющемся порте,
пожалуйста, оповестите &a.portmgr; о необходимости немедленного
перепостроения и повторного распространения пакета данного
порта. В противном случае ничего не подозревающие пользователи
<command>pkg</command> будут продолжать устанавливать старую
версию по команде <command>pkg install</command> в течение ещё
нескольких недель.</para>
</important>
<note>
<para>Повторяем еще раз - для посылки обновлений существующих портов
используйте утилиту &man.diff.1;, а не &man.shar.1;! Это поможет
понять коммиттерам портов, что именно было изменено.</para>
</note>
<note>
<para>Повторяем еще раз - для посылки обновлений существующих
портов используйте утилиту &man.diff.1;, а не &man.shar.1;!
Это поможет понять коммиттерам портов, что именно было
изменено.</para>
</note>
<para>Теперь, когда вы проделали всё это, прочитайте о том, как
поддерживать актуальное состояние, в <xref linkend="keeping-up"/>.</para>
<para>Теперь, когда вы проделали всё это, прочитайте о том, как
поддерживать актуальное состояние, в <xref
linkend="keeping-up"/>.</para>
<sect1 xml:id="svn-diff">
<title>Использование <application>Subversion</application> для
создания патчей</title>
<sect1 xml:id="svn-diff">
<title>Использование <application>Subversion</application> для
создания патчей</title>
<para>По возможности присылайте исправления в формате &man.svn.1; diff.
В таком виде их проще использовать по сравнению с разницей между
<quote>старым и новым</quote> каталогами. Так проще
увидеть изменения и обновить их в случае, если что-нибудь
изменилось в Коллекции Портов с тех пор, как вы начали работу,
либо если коммиттер просит что-то исправить.</para>
<para>По возможности присылайте исправления в формате &man.svn.1;
diff. В таком виде их проще использовать по сравнению с
разницей между <quote>старым и новым</quote> каталогами. Так
проще увидеть изменения и обновить их в случае, если что-нибудь
изменилось в Коллекции Портов с тех пор, как вы начали работу,
либо если коммиттер просит что-то исправить.</para>
<screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co xml:id="my-wrkdir"/>
<screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co xml:id="my-wrkdir"/>
&prompt.user; <userinput>svn co https://svn0.us-west.FreeBSD.org/ports/head/dns/pdnsd</userinput> <co xml:id="svn-FreeBSD-org"/>
&prompt.user; <userinput>cd ~/my_wrkdir/pdnsd</userinput></screen>
<calloutlist>
<callout arearefs="my-wrkdir">
<para>Это может быть где угодно; место, в котором производится
построение портов, не привязано к
<filename>/usr/ports/</filename>.</para>
</callout>
<calloutlist>
<callout arearefs="my-wrkdir">
<para>Это может быть где угодно; место, в котором
производится построение портов, не привязано к
<filename>/usr/ports/</filename>.</para>
</callout>
<callout arearefs="svn-FreeBSD-org">
<para><link xlink:href="https://svn0.us-west.FreeBSD.org/">svn0.us-west.FreeBSD.org</link>
&mdash; это общедоступный сервер
<application>Subversion</application>.
Выберите ближайшее зеркало и проверьте сертификат
зеркалирующего сервера на наличие в перечне <link xlink:href="&url.books.handbook;/svn-mirrors.html">зеркалирующих
<callout arearefs="svn-FreeBSD-org">
<para><link
xlink:href="https://svn0.us-west.FreeBSD.org/">svn0.us-west.FreeBSD.org</link>
&mdash; это общедоступный сервер
<application>Subversion</application>. Выберите ближайшее
зеркало и проверьте сертификат зеркалирующего сервера на
наличие в перечне <link
xlink:href="&url.books.handbook;/svn-mirrors.html">зеркалирующих
ÓÁÊÔÏ× Subversion</link>.</para>
</callout>
</calloutlist>
</callout>
</calloutlist>
<para>Находясь в рабочем каталоге, вносите любые изменения, которые
обычно делают для порта. При добавлении или удалении файла
используйте <command>svn</command> для отслеживания этих
изменений:</para>
<para>Находясь в рабочем каталоге, вносите любые изменения,
которые обычно делают для порта. При добавлении или удалении
файла используйте <command>svn</command> для отслеживания этих
изменений:</para>
<screen>&prompt.user; <userinput>svn add new_file</userinput>
<screen>&prompt.user; <userinput>svn add new_file</userinput>
&prompt.user; <userinput>svn remove deleted_file</userinput></screen>
<para>Убедитесь, что вы проверяете порт в соответствии с рекомендуемым
порядком проверки, описанным в <xref linkend="porting-testing"/> и
<xref linkend="porting-portlint"/>.</para>
<para>Убедитесь, что вы проверяете порт в соответствии с
рекомендуемым порядком проверки, описанным в
<xref linkend="porting-testing"/> и
<xref linkend="porting-portlint"/>.</para>
<screen>&prompt.user; <userinput>svn status</userinput>
<screen>&prompt.user; <userinput>svn status</userinput>
&prompt.user; <userinput>svn update</userinput> <co xml:id="svn-update"/></screen>
<calloutlist>
<callout arearefs="svn-update">
<para>Эта команда попытается выполнить слияние различий между
вашим патчем и текущей версией репозитория; внимательно проверьте
полученный вывод. Буква перед названием каждого файла означает
тип изменения, сделанного с этим файлом. Для получения полного
списка смотрите <xref linkend="table-svn-up"/>.</para>
</callout>
</calloutlist>
<calloutlist>
<callout arearefs="svn-update">
<para>Эта команда попытается выполнить слияние различий между
вашим патчем и текущей версией репозитория; внимательно
проверьте полученный вывод. Буква перед названием каждого
файла означает тип изменения, сделанного с этим файлом.
Для получения полного списка смотрите <xref
linkend="table-svn-up"/>.</para>
</callout>
</calloutlist>
<table pgwide="1" frame="none" xml:id="table-svn-up">
<title>Префиксы файлов для <application>Subversion</application>
update</title>
<table pgwide="1" frame="none" xml:id="table-svn-up">
<title>Префиксы файлов для
<application>Subversion</application> Update</title>
<tgroup cols="2">
<tbody>
<row>
<entry>U</entry>
<tgroup cols="2">
<tbody>
<row>
<entry>U</entry>
<entry>Файл обновлен без проблем.</entry>
</row>
<entry>Файл обновлен без проблем.</entry>
</row>
<row>
<entry>G</entry>
<entry>Файл обновлен без проблем (вы увидите это только
при работе с удаленным репозиторием).</entry>
</row>
<row>
<entry>G</entry>
<row>
<entry>M</entry>
<entry>Файл с локальными изменениями, слияние выполнено
без конфликтов.</entry>
</row>
<entry>Файл обновлен без проблем (вы увидите это только
при работе с удаленным репозиторием).</entry>
</row>
<row>
<entry>C</entry>
<entry>Файл с локальными изменениями, слияние выполнено
с конфликтами.</entry>
</row>
</tbody>
</tgroup>
</table>
<row>
<entry>M</entry>
<para>Если в результате выполнения <literal>svn update</literal>
отображается <literal>C</literal>, то это означает, что что-то
изменилось в репозитории <application>Subversion</application>
и &man.svn.1; не смогла выполнить слияние локальных изменений с
полученными из репозитория. В любом случае никогда не помешает
просмотреть изменения, поскольку &man.svn.1; ничего не знает о
том, каким должен быть порт, поэтому эта команда может (и,
вероятно, будет) делать слияние тех изменений, которые не имеют
смысла.</para>
<entry>Файл с локальными изменениями, слияние выполнено
без конфликтов.</entry>
</row>
<para>Последним шагом является создание унифицированного
&man.diff.1; для полученных изменений:</para>
<row>
<entry>C</entry>
<screen>&prompt.user; <userinput>svn diff &gt; ../`basename ${PWD}`.diff</userinput></screen>
<entry>Файл с локальными изменениями, слияние выполнено
с конфликтами.</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>Информация о любых удаляемых файлов должна быть явным
образом указана в PR, поскольку необходимость в удалении
файла для коммиттера может быть неочевидна.</para>
</note>
<para>Если в результате выполнения <literal>svn update</literal>
отображается <literal>C</literal>, то это означает, что что-то
изменилось в репозитории <application>Subversion</application>
и &man.svn.1; не смогла выполнить
слияние локальных изменений с полученными из репозитория.
В любом случае никогда не помешает просмотреть изменения,
поскольку &man.svn.1; ничего не знает о том, каким должен быть
порт, поэтому эта команда может (и, вероятно, будет) делать
слияние тех изменений, которые не имеют смысла.</para>
<para>Присылайте свои патчи в соответствии с руководством,
описанном в <xref linkend="port-upgrading"/>.</para>
</sect1>
<para>Последним шагом является создание унифицированного &man.diff.1;
для полученных изменений:</para>
<sect1 xml:id="moved-and-updating-files">
<title>Файлы <filename>UPDATING</filename> и
<filename>MOVED</filename></title>
<screen>&prompt.user; <userinput>svn diff &gt; ../`basename ${PWD}`.diff</userinput></screen>
<para>Если при обновлении порта требуются специальные шаги, такие
как изменение файлов конфигурации или запуск специальной
программы, то вам следует это задокументировать в файле
<filename>/usr/ports/UPDATING</filename>. Формат записи в этом
файле приводится ниже:</para>
<note>
<para>Информация о любых удаляемых файлов должна быть явным
образом указана в PR, поскольку необходимость в удалении
файла для коммиттера может быть неочевидна.</para>
</note>
<para>Присылайте свои патчи в соответствии с руководством, описанном в
<xref linkend="port-upgrading"/>.</para>
</sect1>
<sect1 xml:id="moved-and-updating-files">
<title>Файлы <filename>UPDATING</filename> и
<filename>MOVED</filename></title>
<para>Если при обновлении порта требуются специальные шаги, такие как
изменение файлов конфигурации или запуск специальной программы,
то вам следует это задокументировать в файле
<filename>/usr/ports/UPDATING</filename>. Формат записи в этом
файле приводится ниже:</para>
<programlisting>YYYYMMDD:
<programlisting>YYYYMMDD:
AFFECTS: users of portcategory/portname
AUTHOR: Your name &lt;Your email address&gt;
Special instructions</programlisting>
<para>Если вы включаете точные инструкции portmaster или portupgrading,
пожалуйста, убедитесь в правильном экранировании символов внутри
командной оболочки.</para>
<para>Если вы включаете точные инструкции portmaster или
portupgrade, пожалуйста, убедитесь в правильном экранировании
символов внутри командной оболочки.</para>
<para>Файл <filename>/usr/ports/MOVED</filename> содержит записи
об удалённых или перемещённых портах. Каждая строка в этом
файле состоит из полей: название порта, место, куда он был
перемещён, дата и причина перемещения. Если порт был удалён,
то поле, указывающее новое место, может оставаться незаполненным.
Поля должны разделяться символом <literal>|</literal> (pipe),
как это показано ниже:</para>
<para>Файл <filename>/usr/ports/MOVED</filename> содержит записи
об удалённых или перемещённых портах. Каждая строка в этом
файле состоит из полей: название порта, место, куда он был
перемещён, дата и причина перемещения. Если порт был удалён,
то поле, указывающее новое место, может оставаться
незаполненным. Поля должны разделяться символом
<literal>|</literal> (pipe), как это показано ниже:</para>
<programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting>
<programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting>
<para>Дату следует вводить в формате <literal>YYYY-MM-DD</literal>.
Новые записи следует добавлять в конец файла в хронологическом
порядке.</para>
<para>Дату следует вводить в формате
<literal>YYYY-MM-DD</literal>. Новые записи следует добавлять
в конец файла в хронологическом порядке.</para>
<para>Если порт был перемещён, но в дальнейшем восстановлен на
прежнем месте, удалите в этом файле строку, содержащую
информацию о перемещении.</para>
<para>Полученные изменения можно проверить командой
<command>Tools/scripts/MOVEDlint.awk</command>.</para>
</sect1>
</chapter>
<para>Если порт был перемещён, но в дальнейшем восстановлен на
прежнем месте, удалите в этом файле строку, содержащую
информацию о перемещении.</para>
<para>Полученные изменения можно проверить командой
<command>Tools/scripts/MOVEDlint.awk</command>.</para>
</sect1>
</chapter>

View file

@ -156,14 +156,15 @@
<entry>(ÎÅÔ), ARGS</entry>
<entry>Устанавливает окружение виртуального дисплея. Если переменная
окружения <varname>DISPLAY</varname> не установлена, то
<application>Xvfb</application> добавляется как зависимость для
построения и <varname>CONFIGURE_ENV</varname> дополняется номером
порта текущего запущенного экземпляра <application>Xvfb</application>.
Параметр <literal>ARGS</literal> по умолчанию имеет значение
<literal>install</literal> и управляет фазой, в которой запускается
и останавливается виртуальный дисплей.</entry>
<entry>Устанавливает окружение виртуального дисплея. Если
переменная окружения <varname>DISPLAY</varname> не установлена,
то <application>Xvfb</application> добавляется как зависимость
для построения и <varname>CONFIGURE_ENV</varname> дополняется
номером порта текущего запущенного экземпляра
<application>Xvfb</application>. Параметр
<literal>ARGS</literal> по умолчанию имеет значение
<literal>install</literal> и управляет фазой, в которой
запускается и останавливается виртуальный дисплей.</entry>
</row>
<row xml:id="uses-dos2unix">
@ -218,7 +219,8 @@
<row xml:id="uses-fortran">
<entry><literal>fortran</literal></entry>
<entry><literal>gcc</literal> (default), <literal>ifort</literal></entry>
<entry><literal>gcc</literal> (default),
<literal>ifort</literal></entry>
<entry>éÓÐÏÌØÚÕÅÔ ËÏÍÐÉÌÑÔÏÒ Fortran ÏÔ GNU ÉÌÉ Intel.</entry>
</row>
@ -241,7 +243,7 @@
<entry>éÓÐÏÌØÚÕÅÔ <package role="port">devel/gettext</package>.
ðÏ ÕÍÏÌÞÁÎÉÀ, ÂÅÚ ÁÒÇÕÍÅÎÔÏ× ÉÌÉ Ó ÁÒÇÕÍÅÎÔÏÍ
<literal>lib</literal>, ÏÚÎÁÞÁÅÔ ÚÁ×ÉÓÉÍÏÓÔØ ÏÔ ÂÉÂÌÉÏÔÅËÉ
<filename>libintl.so</filename>. <literal>build</literal>
<filename>libintl.so</filename>. <literal>build</literal>
É <literal>run</literal> ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ ÏÚÎÁÞÁÀÔ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ
ÏÔ <filename>xgettext</filename> ÄÌÑ ÓÂÏÒËÉ É ×ÙÐÏÌÎÅÎÉÑ.</entry>
</row>
@ -265,8 +267,8 @@
<entry>éÓÐÏÌØÚÕÅÔ ÆÕÎËÃÉÉ <command>iconv</command>, ÉÚ ÐÏÒÔÁ
<package role="port">converters/libiconv</package> ËÁË ÚÁ×ÉÓÉÍÏÓÔØ
для сборки и выполнения или же из основной системы на 10-CURRENT после
появления собственного <command>iconv</command> в
для сборки и выполнения или же из основной системы на 10-CURRENT
после появления собственного <command>iconv</command> в
<revnumber>254273</revnumber>. ðÏ ÕÍÏÌÞÁÎÉÀ, ÂÅÚ ÐÁÒÁÍÅÔÒÏ× ÉÌÉ
Ó ÐÁÒÁÍÅÔÒÏÍ <literal>lib</literal>, <command>iconv</command>
ÏÚÎÁÞÁÅÔ ÚÁ×ÉÓÉÍÏÓÔØ ÄÌÑ ÓÂÏÒËÉ É ×ÙÐÏÌÎÅÎÉÑ,
@ -393,15 +395,16 @@
<row xml:id="uses-openal">
<entry><literal>openal</literal></entry>
<entry><literal>al</literal>, <literal>soft</literal> (по умолчанию),
<literal>si</literal>, <literal>alut</literal></entry>
<entry><literal>al</literal>, <literal>soft</literal> (по
умолчанию), <literal>si</literal>, <literal>alut</literal></entry>
<entry>éÓÐÏÌØÚÕÅÔ <application>OpenAL</application>. íÏÖÅÔ ÂÙÔØ
ÕËÁÚÁÎ ÂÜËÜÎÄ, ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÏÇÒÁÍÍÎÁÑ ÒÅÁÌÉÚÁÃÉÑ.
ðÏÌØÚÏ×ÁÔÅÌØ ÍÏÖÅÔ ÕËÁÚÁÔØ ÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÂÜËÜÎÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ
ÐÅÒÅËÌÀÞÁÔÅÌÑ <varname>WANT_OPENAL</varname>. ðÒÁ×ÉÌØÎÙÍÉ
значениями для этого переключателя являются <literal>soft</literal>
(по умолчанию) и <literal>si</literal>.</entry>
значениями для этого переключателя являются
<literal>soft</literal> (по умолчанию) и
<literal>si</literal>.</entry>
</row>
<row xml:id="uses-pathfix">
@ -521,7 +524,7 @@
ÏÚÎÁÞÁÅÔ ÚÁ×ÉÓÉÍÏÓÔØ ÄÌÑ ÓÂÏÒËÉ É <literal>run</literal> ÄÌÑ
×ÙÐÏÌÎÅÎÉÑ. âÅÚ ÁÒÇÕÍÅÎÔÏ× ÉÌÉ Ó ÁÒÇÕÍÅÎÔÏÍ
<literal>both</literal> <command>qmail</command> ÏÚÎÁÞÁÅÔ
зависимость для сборки и выполнения. <literal>vars</literal>
зависимость для сборки и выполнения. <literal>vars</literal>
ÚÁÄÁÅÔ ÐÅÒÅÍÅÎÎÙÅ QMAIL ÄÌÑ ÎÕÖÄ ÐÏÒÔÁ.</entry>
</row>
@ -567,8 +570,8 @@
ÉÚ <package role="port">misc/shared-mime-info</package>. üÔÏ
ÔÁËÖÅ ÄÏÂÁ×ÌÑÅÔ ÓÏÂÓÔ×ÅÎÎÙÊ ÜÔÁÐ post-install É ÓÔÒÏËÉ × plist
ÄÌÑ ÚÁÐÕÓËÁ <application>update-mime-data</application> Ó
подходящими аргументами во время установки и удаления пакета.
</entry>
подходящими аргументами во время установки и удаления
пакета.</entry>
</row>
<row xml:id="uses-shebangfix">
@ -578,16 +581,19 @@
<entry>÷Ï ÍÎÏÇÏÍ ÐÒÏÇÒÁÍÍÎÏÍ ÏÂÅÓÐÅÞÅÎÉÉ ÕËÁÚÙ×ÁÅÔÓÑ ÎÅÐÒÁ×ÉÌØÎÙÊ
ÐÕÔØ Ë ÉÎÔÅÒÐÒÅÔÁÔÏÒÕ (shebang), × ÐÅÒ×ÕÀ ÏÞÅÒÅÄØ ÜÔÏ ËÁÓÁÅÔÓÑ
<filename>/usr/bin/perl</filename> и <filename>/bin/bash</filename>.
Это значение исправляет строку shebang в сценариях, перечисленных
в <varname>SHEBANG_FILES</varname>. По умолчанию сейчас
<filename>/usr/bin/perl</filename> и
<filename>/bin/bash</filename>. Это значение исправляет строку
shebang в сценариях, перечисленных в
<varname>SHEBANG_FILES</varname>. По умолчанию сейчас
ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ <application>Perl</application>,
<application>Python</application>, <application>Bash</application>,
<application>Ruby</application> и <application>PHP</application>.
Для поддержки других интерпретаторов необходимо соответствующее
значение <varname>SHEBANG_LANG</varname> (например,
<application>Python</application>,
<application>Bash</application>, <application>Ruby</application>
и <application>PHP</application>. Для поддержки других
интерпретаторов необходимо соответствующее значение
<varname>SHEBANG_LANG</varname> (например,
<literal>SHEBANG_LANG=lua</literal>),
<varname>lua_OLD_CMD</varname> и <varname>lua_CMD</varname>.</entry>
<varname>lua_OLD_CMD</varname> и
<varname>lua_CMD</varname>.</entry>
</row>
<row xml:id="uses-tcl">
@ -606,10 +612,10 @@
<literal>86</literal>) ÉÌÉ ÖÅ ÍÉÎÉÍÁÌØÎÙÊ ÎÏÍÅÒ ×ÅÒÓÉÉ (ÎÁ ÄÁÎÎÙÊ
ÍÏÍÅÎÔ <literal>84+</literal>, <literal>85+</literal> ÉÌÉ
<literal>86+</literal>). íÏÖÅÔ ÂÙÔØ ÕËÁÚÁÎÁ ÚÁ×ÉÓÉÍÏÓÔØ ÄÌÑ
сборки или выполнения с использованием <literal>PORT,build</literal>
или <literal>PORT,run</literal>. После подключения
<filename>bsd.port.pre.mk</filename> порт может проверить
результат, используя эти переменные:
сборки или выполнения с использованием
<literal>PORT,build</literal> или <literal>PORT,run</literal>.
После подключения <filename>bsd.port.pre.mk</filename> порт может
проверить результат, используя эти переменные:
<itemizedlist>
<listitem>
@ -670,22 +676,22 @@
<entry>(ÎÅÔ), <literal>ARGS</literal></entry>
<entry>Добавляет зависимость от <application>twistedCore</application>.
Перечень требуемых компонентов можно указать в качестве значения
этой переменной. <literal>ARGS</literal> может принимать одно из
значений:
<entry>Добавляет зависимость от
<application>twistedCore</application>. Перечень требуемых
компонентов можно указать в качестве значения этой переменной.
<literal>ARGS</literal> может принимать одно из значений:
<itemizedlist>
<listitem>
<para><literal>build</literal>: ÄÏÂÁ×ÌÑÅÔ
<application>twistedCore</application> или любой из указанных
компонентов как зависимость построения.</para>
<application>twistedCore</application> или любой из
указанных компонентов как зависимость построения.</para>
</listitem>
<listitem>
<para><literal>run</literal>: ÄÏÂÁ×ÌÑÅÔ
<application>twistedCore</application> или любой из указанных
компонентов как зависимость запуска.</para>
<application>twistedCore</application> или любой из
указанных компонентов как зависимость запуска.</para>
</listitem>
</itemizedlist>
@ -772,7 +778,7 @@
<listitem>
<para>(ÏÔÄÅÌØÎÙÅ ÚÁÐÉÓÉ): ÐÏÄÄÅÒÖËÁ ÔÏÌØËÏ ÕËÁÚÁÎÎÙÈ
браузеров</para>
браузеров</para>
</listitem>
</itemizedlist>

View file

@ -861,8 +861,8 @@
<entry>500018</entry>
<entry>24 ÆÅ×ÒÁÌÑ 2001</entry>
<entry>5.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÐÅÒÅÍÅÎÎÏÊ make CPUTYPE,
ÐÏÚ×ÏÌÑÀÝÅÊ ËÏÎÔÒÏÌÉÒÏ×ÁÔØ ÓÐÅÃÉÆÉÞÎÙÅ ÄÌÑ CPU ÏÐÔÉÍÉÚÁÃÉÉ.
</entry>
ÐÏÚ×ÏÌÑÀÝÅÊ ËÏÎÔÒÏÌÉÒÏ×ÁÔØ ÓÐÅÃÉÆÉÞÎÙÅ ÄÌÑ CPU
ÏÐÔÉÍÉÚÁÃÉÉ.</entry>
</row>
<row>
@ -1363,8 +1363,7 @@
<row>
<entry>502114</entry>
<entry>13 ÉÀÎÑ 2004</entry>
<entry>5.2-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ ALTQ ÉÎÆÒÁÓÔÒÕËÔÕÒÙ.
</entry>
<entry>5.2-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ ALTQ ÉÎÆÒÁÓÔÒÕËÔÕÒÙ.</entry>
</row>
<row>
@ -1458,16 +1457,16 @@
<entry>502127</entry>
<entry>2 Á×ÇÕÓÔÁ 2004</entry>
<entry>5.2-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ × API ÑÄÒÁ UMA, ÒÁÚÒÅÛÁÀÝÅÇÏ
ËÏÎÓÔÒÕËÔÏÒÁÍ/ÉÎÉÃÉÁÌÉÚÁÔÏÒÁÍ (ctors/inits) ×ÏÚ×ÒÁÝÁÔØ ÎÅÕÄÁÞÕ.
</entry>
ËÏÎÓÔÒÕËÔÏÒÁÍ/ÉÎÉÃÉÁÌÉÚÁÔÏÒÁÍ (ctors/inits) ×ÏÚ×ÒÁÝÁÔØ
ÎÅÕÄÁÞÕ.</entry>
</row>
<row>
<entry>502128</entry>
<entry>8 Á×ÇÕÓÔÁ 2004</entry>
<entry>5.2-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ × ÓÉÇÎÁÔÕÒÅ vfs_mount, Á ÔÁËÖÅ
ÐÏÓÌÅ ÏÂÝÅÊ ÚÁÍÅÎÙ PRISON_ROOT ÎÁ SUSER_ALLOWJAIL × API suser(9).
</entry>
ÐÏÓÌÅ ÏÂÝÅÊ ÚÁÍÅÎÙ PRISON_ROOT ÎÁ SUSER_ALLOWJAIL × API
suser(9).</entry>
</row>
<row>
@ -1498,8 +1497,8 @@
<row>
<entry>503102</entry>
<entry>13 ÆÅ×ÒÁÌÑ 2005</entry>
<entry>5.3-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÉÍÐÏÒÔÁ nc(1) ÉÚ OpenBSD.
</entry>
<entry>5.3-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÉÍÐÏÒÔÁ nc(1) ÉÚ
OpenBSD.</entry>
</row>
<row>
@ -1592,8 +1591,8 @@
<row>
<entry>600001</entry>
<entry>27 Á×ÇÕÓÔÁ 2004</entry>
<entry>6.0-CURRENT ÐÏÓÌÅ ÐÏÓÔÏÑÎÎÏÇÏ ×ËÌÀÞÅÎÉÑ × ÑÄÒÏ PFIL_HOOKS.
</entry>
<entry>6.0-CURRENT ÐÏÓÌÅ ÐÏÓÔÏÑÎÎÏÇÏ ×ËÌÀÞÅÎÉÑ × ÑÄÒÏ
PFIL_HOOKS.</entry>
</row>
<row>
@ -1679,8 +1678,8 @@
<entry>6.0-CURRENT ÐÏÓÌÅ ÉÓÐÒÁ×ÌÅÎÉÊ ×
<filename>&lt;src/include/stdbool.h&gt;</filename> É
<filename>&lt;src/sys/i386/include/_types.h&gt;</filename>
ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ GCC × ËÏÍÐÉÌÑÔÏÒÅ Intel C/C++.
</entry>
ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ GCC × ËÏÍÐÉÌÑÔÏÒÅ Intel
C/C++.</entry>
</row>
<row>
@ -1941,8 +1940,8 @@
<entry>602104</entry>
<entry>28 ÑÎ×ÁÒÑ 2007</entry>
<entry>6.2-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÕÚÌÏ× netgraph ng_deflate(4)
É ng_pred1(4) É ÎÏ×ÏÇÏ ÕÚÌÁ ng_ppp(4) ÓÏ ÓÖÁÔÉÅÍ É ÛÉÆÒÏ×ÁÎÉÅÍ.
</entry>
É ng_pred1(4) É ÎÏ×ÏÇÏ ÕÚÌÁ ng_ppp(4) ÓÏ ÓÖÁÔÉÅÍ É
ÛÉÆÒÏ×ÁÎÉÅÍ.</entry>
</row>
<row>
@ -2047,8 +2046,8 @@
<row>
<entry>603102</entry>
<entry>24 ÁÐÒÅÌÑ 2008</entry>
<entry>6.3-STABLE ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid Ë ÓÔÒÕËÔÕÒÅ flock.
</entry>
<entry>6.3-STABLE ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid Ë ÓÔÒÕËÔÕÒÅ
flock.</entry>
</row>
<row>
@ -2193,8 +2192,8 @@
<row>
<entry>700016</entry>
<entry>22 ÁÐÒÅÌÑ 2006</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ &man.fcloseall.3; × libc.
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ &man.fcloseall.3; ×
libc.</entry>
</row>
<row>
@ -2224,8 +2223,8 @@
<row>
<entry>700021</entry>
<entry>4 ÓÅÎÔÑÂÒÑ 2006</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ libpcap 0.9.4 É tcpdump 3.9.4.
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ libpcap 0.9.4 É tcpdump
3.9.4.</entry>
</row>
<row>
@ -2290,15 +2289,14 @@
<row>
<entry>700031</entry>
<entry>23 ÆÅ×ÒÁÌÑ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ × bus_setup_intr() (newbus).
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ × bus_setup_intr()
(newbus).</entry>
</row>
<row>
<entry>700032</entry>
<entry>2 ÍÁÒÔÁ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ×ÎÅÓÅÎÉÑ ÍÉËÒÏËÏÄÁ ipw(4) É iwi(4).
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ×ÎÅÓÅÎÉÑ ÍÉËÒÏËÏÄÁ ipw(4) É iwi(4).</entry>
</row>
<row>
@ -2319,8 +2317,7 @@
<entry>700035</entry>
<entry>26 ÍÁÒÔÁ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÍÅÈÁÎÉÚÍÁ Õ×ÅÄÏÍÌÅÎÉÊ
ÐÒÉ ÉÚÍÅÎÅÎÉÉ ÞÁÓÔÏÔÙ CPU.
</entry>
ÐÒÉ ÉÚÍÅÎÅÎÉÉ ÞÁÓÔÏÔÙ CPU.</entry>
</row>
<row>
@ -2341,8 +2338,8 @@
<entry>700038</entry>
<entry>30 ÁÐÒÅÌÑ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ &man.getenv.3;, &man.putenv.3;,
&man.setenv.3; É &man.unsetenv.3; ÄÌÑ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó POSIX.
</entry>
&man.setenv.3; É &man.unsetenv.3; ÄÌÑ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó
POSIX.</entry>
</row>
<row>
@ -2354,8 +2351,8 @@
<row>
<entry>700040</entry>
<entry>10 ÍÁÑ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ &man.flopen.3; × libutil.
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ &man.flopen.3; ×
libutil.</entry>
</row>
<row>
@ -2457,8 +2454,8 @@
<row>
<entry>700053</entry>
<entry>30 ÓÅÎÔÑÂÒÑ 2007</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÐÏÄÄÅÒÖËÉ ÄÌÑ ÄÏÍÅÎÏ× PCI.
</entry>
<entry>7.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÐÏÄÄÅÒÖËÉ ÄÌÑ ÄÏÍÅÎÏ×
PCI.</entry>
</row>
<row>
@ -2498,8 +2495,8 @@
<row>
<entry>700103</entry>
<entry>10 ÁÐÒÅÌÑ 2008</entry>
<entry>7.0-STABLE ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid × ÓÔÒÕËÔÕÒÕ flock.
</entry>
<entry>7.0-STABLE ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid × ÓÔÒÕËÔÕÒÕ
flock.</entry>
</row>
<row>
@ -2559,8 +2556,8 @@
<row>
<entry>700112</entry>
<entry>27 Á×ÇÕÓÔÁ 2008</entry>
<entry>7.0-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÐÏÄÄÅÒÖËÉ DTrace × ÑÄÒÅ.
</entry>
<entry>7.0-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÐÏÄÄÅÒÖËÉ DTrace ×
ÑÄÒÅ.</entry>
</row>
<row>
@ -2578,8 +2575,8 @@
<row>
<entry>701101</entry>
<entry>10 ÑÎ×ÁÒÑ 2009</entry>
<entry>7.1-STABLE ÐÏÓÌÅ ÂÅËÐÏÒÔÁ <function>strndup</function>.
</entry>
<entry>7.1-STABLE ÐÏÓÌÅ ÂÅËÐÏÒÔÁ
<function>strndup</function>.</entry>
</row>
<row>
@ -2662,8 +2659,8 @@
<row>
<entry>702105</entry>
<entry>31 ÉÀÌÑ 2009</entry>
<entry>7.2-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÉÚÍÅÎÅÎÉÑ ABI ÄÌÑ SYSVIPC.
</entry>
<entry>7.2-STABLE ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC ÉÚÍÅÎÅÎÉÑ ABI ÄÌÑ
SYSVIPC.</entry>
</row>
<row>
@ -2701,15 +2698,15 @@
<row>
<entry>800000</entry>
<entry>11 ÏËÔÑÂÒÑ 2007</entry>
<entry>8.0-CURRENT. òÁÚÄÅÌÅÎÉÅ Ä×ÕÈÂÁÊÔÏ×ÙÈ É ÏÄÎÏÂÁÊÔÏ×ÙÈ ctype.
</entry>
<entry>8.0-CURRENT. òÁÚÄÅÌÅÎÉÅ Ä×ÕÈÂÁÊÔÏ×ÙÈ É ÏÄÎÏÂÁÊÔÏ×ÙÈ
ctype.</entry>
</row>
<row>
<entry>800001</entry>
<entry>16 ÏËÔÑÂÒÑ 2007</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ libpcap 0.9.8 É tcpdump 3.9.8.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ libpcap 0.9.8 É tcpdump
3.9.8.</entry>
</row>
<row>
@ -2724,8 +2721,8 @@
<entry>24 ÏËÔÑÂÒÑ 2007</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÏÂÒÁÔÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ ABI ÄÌÑ
IOCTL'ÅÊ PCIOCGETCONF, PCIOCREAD É PCIOCWRITE Ó ×ÅÒÓÉÑÍÉ FreeBSD
4/5/6, ÞÔÏ ×ÙÚ×ÁÌÏ ÐÏ×ÔÏÒÎÕÀ ÐÏÌÏÍËÕ ABI ÄÌÑ PCIOCGETCONF IOCTL
</entry>
4/5/6, ÞÔÏ ×ÙÚ×ÁÌÏ ÐÏ×ÔÏÒÎÕÀ ÐÏÌÏÍËÕ ABI ÄÌÑ PCIOCGETCONF
IOCTL</entry>
</row>
<row>
@ -2771,8 +2768,8 @@
<row>
<entry>800010</entry>
<entry>10 ÑÎ×ÁÒÑ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÐÒÏÔÏÔÉÐÁ &man.vn.lock.9;.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÐÒÏÔÏÔÉÐÁ
&man.vn.lock.9;.</entry>
</row>
<row>
@ -2793,8 +2790,8 @@
<row>
<entry>800013</entry>
<entry>23 ÑÎ×ÁÒÑ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ËÏÄÉÒÏ×ËÉ <quote>ASCII</quote>.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ËÏÄÉÒÏ×ËÉ
<quote>ASCII</quote>.</entry>
</row>
<row>
@ -2808,8 +2805,8 @@
<row>
<entry>800015</entry>
<entry>26 ÑÎ×ÁÒÑ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÒÁÓÛÉÒÅÎÉÑ ÔÉÐÏ× ÄÌÑ ÓÔÒÕËÔÕÒ &man.fts.3;.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÒÁÓÛÉÒÅÎÉÑ ÔÉÐÏ× ÄÌÑ ÓÔÒÕËÔÕÒ
&man.fts.3;.</entry>
</row>
<row>
@ -2889,8 +2886,8 @@
<entry>800026</entry>
<entry>12 ÍÁÒÔÁ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÐÁÒÁÍÅÔÒÁ ÐÒÉÏÒÉÔÅÔÁ ÄÌÑ
cv_broadcastpri ÔÁË, ÞÔÏ 0 ÏÚÎÁÞÁÅÔ ÏÔÓÕÔÓÔ×ÉÅ ÐÒÉÏÒÉÔÅÔÁ.
</entry>
cv_broadcastpri ÔÁË, ÞÔÏ 0 ÏÚÎÁÞÁÅÔ ÏÔÓÕÔÓÔ×ÉÅ
ÐÒÉÏÒÉÔÅÔÁ.</entry>
</row>
<row>
@ -2903,8 +2900,8 @@
<row>
<entry>800028</entry>
<entry>26 ÍÁÒÔÁ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid × ÓÔÒÕËÔÕÒÕ flock.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ l_sysid × ÓÔÒÕËÔÕÒÕ
flock.</entry>
</row>
<row>
@ -3012,8 +3009,8 @@
<entry>800043</entry>
<entry>13 Á×ÇÕÓÔÁ 2008</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ × bpf(4) ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ
ÅÄÉÎÓÔ×ÅÎÎÏÇÏ ÕÚÌÁ ÕÓÔÒÏÊÓÔ×Á ×ÍÅÓÔÏ ËÌÏÎÉÒÏ×ÁÎÉÑ ÕÓÔÒÏÊÓÔ×.
</entry>
ÅÄÉÎÓÔ×ÅÎÎÏÇÏ ÕÚÌÁ ÕÓÔÒÏÊÓÔ×Á ×ÍÅÓÔÏ ËÌÏÎÉÒÏ×ÁÎÉÑ
ÕÓÔÒÏÊÓÔ×.</entry>
</row>
<row>
@ -3128,8 +3125,8 @@
<row>
<entry>800059</entry>
<entry>15 ÄÅËÁÂÒÑ 2008</entry>
<entry>8.0-CURRENT ×ËÌÀÞÁÅÔ × ÓÅÂÑ ÎÏ×ÙÊ ÐÅÒÅÐÉÓÁÎÎÙÊ arp-v2.
</entry>
<entry>8.0-CURRENT ×ËÌÀÞÁÅÔ × ÓÅÂÑ ÎÏ×ÙÊ ÐÅÒÅÐÉÓÁÎÎÙÊ
arp-v2.</entry>
</row>
<row>
@ -3155,8 +3152,8 @@
<entry>800063</entry>
<entry>18 ÆÅ×ÒÁÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ËÏÎÆÉÇÁ GENERIC ÄÌÑ
ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÔÅËÁ USB2, Á ÔÁËÖÅ ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ fdevname(3).
</entry>
ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÔÅËÁ USB2, Á ÔÁËÖÅ ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ
fdevname(3).</entry>
</row>
<row>
@ -3169,8 +3166,8 @@
<row>
<entry>800065</entry>
<entry>26 ÆÅ×ÒÁÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ×ÓÅÈ ÆÕÎËÃÉÊ × libmp(3).
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ×ÓÅÈ ÆÕÎËÃÉÊ ×
libmp(3).</entry>
</row>
<row>
@ -3184,15 +3181,15 @@
<entry>800067</entry>
<entry>28 ÆÅ×ÒÁÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ getdelim(), getline(),
stpncpy(), strnlen(), wcsnlen(), wcscasecmp() É wcsncasecmp().
</entry>
stpncpy(), strnlen(), wcsnlen(), wcscasecmp() É
wcsncasecmp().</entry>
</row>
<row>
<entry>800068</entry>
<entry>2 ÍÁÒÔÁ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ devclass ushub × uhub.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ devclass ushub ×
uhub.</entry>
</row>
<row>
@ -3233,8 +3230,8 @@
<row>
<entry>800074</entry>
<entry>24 ÍÁÒÔÁ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ tcpdump 4.0.0 É libpcap 1.0.0.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ tcpdump 4.0.0 É libpcap
1.0.0.</entry>
</row>
<row>
@ -3247,8 +3244,8 @@
<row>
<entry>800076</entry>
<entry>9 ÁÐÒÅÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÐÒÏÆÉÌÅÊ ÚÁÄÅÒÖËÉ × dummynet.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÐÒÏÆÉÌÅÊ ÚÁÄÅÒÖËÉ ×
dummynet.</entry>
</row>
<row>
@ -3277,15 +3274,15 @@
<row>
<entry>800080</entry>
<entry>15 ÁÐÒÅÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÒÁÓËÌÁÄËÉ ÓÔÒÕËÔÕÒÙ inpcb.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÒÁÓËÌÁÄËÉ ÓÔÒÕËÔÕÒÙ
inpcb.</entry>
</row>
<row>
<entry>800081</entry>
<entry>19 ÁÐÒÅÌÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÒÁÓËÌÁÄËÉ ÓÔÒÕËÔÕÒÙ malloc_type.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÒÁÓËÌÁÄËÉ ÓÔÒÕËÔÕÒÙ
malloc_type.</entry>
</row>
<row>
@ -3335,8 +3332,8 @@
<row>
<entry>800088</entry>
<entry>20 ÍÁÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÊ × ÒÅÖÉÍÅ net80211 monitor.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÊ × ÒÅÖÉÍÅ net80211
monitor.</entry>
</row>
<row>
@ -3349,8 +3346,8 @@
<row>
<entry>800090</entry>
<entry>23 ÍÁÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ËÌÏÎÉÒÏ×ÁÎÉÑ ×ÉÒÔÕÁÌÉÚÏ×ÁÎÎÙÈ ÉÎÔÅÒÆÅÊÓÏ×.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ËÌÏÎÉÒÏ×ÁÎÉÑ ×ÉÒÔÕÁÌÉÚÏ×ÁÎÎÙÈ
ÉÎÔÅÒÆÅÊÓÏ×.</entry>
</row>
<row>
@ -3372,8 +3369,8 @@
<row>
<entry>800093</entry>
<entry>29 ÍÁÑ 2009</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ mnt_xflag × ÓÔÒÕËÔÕÒÕ mount.
</entry>
<entry>8.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ mnt_xflag × ÓÔÒÕËÔÕÒÕ
mount.</entry>
</row>
<row>
@ -3485,8 +3482,8 @@
<row>
<entry>800108</entry>
<entry>21 ÎÏÑÂÒÑ 2009</entry>
<entry>8.0-STABLE ÐÏÓÌÅ ÒÅÁÌÉÚÁÃÉÉ kevent-ÆÉÌØÔÒÁ EVFILT_USER.
</entry>
<entry>8.0-STABLE ÐÏÓÌÅ ÒÅÁÌÉÚÁÃÉÉ kevent-ÆÉÌØÔÒÁ
EVFILT_USER.</entry>
</row>
<row>
@ -3570,15 +3567,15 @@
<entry>802501</entry>
<entry>28 ÆÅ×ÒÁÌÑ 2011</entry>
<entry>8.2-STABLE ÐÏÓÌÅ ÏÂÒÁÔÎÏÇÏ ÐÏÒÔÉÒÏ×ÁÎÉÑ ÉÚÍÅÎÅÎÉÊ DTrace,
×ËÌÀÞÁÀÝÉÈ ÐÏÄÄÅÒÖËÕ ÔÒÁÓÓÉÒÏ×ËÉ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÈ ÐÒÏÇÒÁÍÍ.
</entry>
×ËÌÀÞÁÀÝÉÈ ÐÏÄÄÅÒÖËÕ ÔÒÁÓÓÉÒÏ×ËÉ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÈ
ÐÒÏÇÒÁÍÍ.</entry>
</row>
<row>
<entry>802502</entry>
<entry>6 ÍÁÒÔÁ 2011</entry>
<entry>8.2-STABLE ÐÏÓÌÅ ÏÂÒÁÔÎÏÇÏ ÐÏÒÔÉÒÏ×ÁÎÉÑ log2 É log2f × libm.
</entry>
<entry>8.2-STABLE ÐÏÓÌÅ ÏÂÒÁÔÎÏÇÏ ÐÏÒÔÉÒÏ×ÁÎÉÑ log2 É log2f ×
libm.</entry>
</row>
<row>
@ -3693,8 +3690,8 @@
<row>
<entry>803500</entry>
<entry>3 ÍÁÒÔÁ 2012</entry>
<entry>8.3-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ releng/8.3 (RELENG_8_3).
</entry>
<entry>8.3-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ releng/8.3
(RELENG_8_3).</entry>
</row>
<row>
@ -3765,8 +3762,8 @@
<entry>13 ÑÎ×ÁÒÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÕÄÁÌÅÎÉÑ utmp(5) É ÄÏÂÁ×ÌÅÎÉÑ utmpx
(ÓÍÏÔÒÉÔÅ <function>getutxent(3)</function>) ÄÌÑ ÕÌÕÞÛÅÎÎÏÇÏ
ÐÒÏÔÏËÏÌÉÒÏ×ÁÎÉÑ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÈ ×ÈÏÄÏ× É ÓÉÓÔÅÍÎÙÈ ÓÏÂÙÔÉÊ.
</entry>
ÐÒÏÔÏËÏÌÉÒÏ×ÁÎÉÑ ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÈ ×ÈÏÄÏ× É ÓÉÓÔÅÍÎÙÈ
ÓÏÂÙÔÉÊ.</entry>
</row>
<row>
@ -3800,15 +3797,15 @@
<row>
<entry>900012</entry>
<entry>10 ÍÁÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ liblzma, xz, xzdec É lzmainfo.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ liblzma, xz, xzdec É
lzmainfo.</entry>
</row>
<row>
<entry>900013</entry>
<entry>14 ÍÁÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÐÒÉ×ÌÅÞÅÎÉÑ ÉÓÐÒÁ×ÌÅÎÉÊ USB × linux(4).
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÐÒÉ×ÌÅÞÅÎÉÑ ÉÓÐÒÁ×ÌÅÎÉÊ USB ×
linux(4).</entry>
</row>
<row>
@ -3876,22 +3873,22 @@
<row>
<entry>900023</entry>
<entry>11 ÏËÔÑÂÒÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ xz ÄÏ ÓÎÁÐÛÏÔÁ git 20101010.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ xz ÄÏ ÓÎÁÐÛÏÔÁ git
20101010.</entry>
</row>
<row>
<entry>900024</entry>
<entry>11 ÎÏÑÂÒÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÚÁÍÅÎÙ libgcc.a ÎÁ libcompiler_rt.a.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÚÁÍÅÎÙ libgcc.a ÎÁ
libcompiler_rt.a.</entry>
</row>
<row>
<entry>900025</entry>
<entry>12 ÎÏÑÂÒÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ÍÏÄÕÌØÎÏÇÏ ËÏÎÔÒÏÌÑ ÐÅÒÅÇÒÕÚËÉ.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ÍÏÄÕÌØÎÏÇÏ ËÏÎÔÒÏÌÑ
ÐÅÒÅÇÒÕÚËÉ.</entry>
</row>
<row>
@ -3920,15 +3917,14 @@
<entry>28 ÄÅËÁÂÒÑ 2010</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÓÔÅËÁ TCP ÄÌÑ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó
ÍÏÄÕÌÑÍÉ Khelp ÞÅÒÅÚ ×ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÔÏÞËÉ Ó×ÑÚÉ É ÈÒÁÎÅÎÉÑ
ÄÁÎÎÙÈ ÕÒÏ×ÎÑ ÓÅÔÅ×ÏÇÏ ÓÏÅÄÉÎÅÎÉÑ × ÕÐÒÁ×ÌÑÀÝÅÍ ÂÌÏËÅ TCP.
</entry>
ÄÁÎÎÙÈ ÕÒÏ×ÎÑ ÓÅÔÅ×ÏÇÏ ÓÏÅÄÉÎÅÎÉÑ × ÕÐÒÁ×ÌÑÀÝÅÍ ÂÌÏËÅ TCP.</entry>
</row>
<row>
<entry>900030</entry>
<entry>12 ÑÎ×ÁÒÑ 2011</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ libdialog ÄÏ ×ÅÒÓÉÉ 20100428.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ libdialog ÄÏ ×ÅÒÓÉÉ
20100428.</entry>
</row>
<row>
@ -3941,22 +3937,22 @@
<row>
<entry>900032</entry>
<entry>8 ÆÅ×ÒÁÌÑ 2011</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÕÄÁÌÅÎÉÑ ÓÉÍ×ÏÌÁ É ÐÒÏÔÏÔÉÐÁ uio_yield.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÕÄÁÌÅÎÉÑ ÓÉÍ×ÏÌÁ É ÐÒÏÔÏÔÉÐÁ
uio_yield.</entry>
</row>
<row>
<entry>900033</entry>
<entry>18 ÆÅ×ÒÁÌÑ 2011</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ binutils ÄÏ ×ÅÒÓÉÉ 2.17.50.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ binutils ÄÏ ×ÅÒÓÉÉ
2.17.50.</entry>
</row>
<row>
<entry>900034</entry>
<entry>8 ÍÁÒÔÁ 2011</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÊ × struct sysvec (sv_schedtail).
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÊ × struct sysvec
(sv_schedtail).</entry>
</row>
<row>
@ -4041,8 +4037,8 @@
<row>
<entry>900045</entry>
<entry>2 ÑÎ×ÁÒÑ 2012</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC true/false ÉÚ 1000002.
</entry>
<entry>9.0-CURRENT ÐÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ MFC true/false ÉÚ
1000002.</entry>
</row>
<row>
@ -4104,8 +4100,8 @@
<row>
<entry>901500</entry>
<entry>6 Á×ÇÕÓÔÁ 2012</entry>
<entry>9.1-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ releng/9.1 (RELENG_9_1).
</entry>
<entry>9.1-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ releng/9.1
(RELENG_9_1).</entry>
</row>
<row>
@ -4150,16 +4146,16 @@
<entry>902001</entry>
<entry>3 Á×ÇÕÓÔÁ 2013</entry>
<entry>ïÔÄÅÌÅÎÉÅ ×ÅÔËÉ <literal>releng/9.2</literal> ÏÔ
<literal>stable/9</literal> (ÒÅ×. <revnumber>253912</revnumber>).
</entry>
<literal>stable/9</literal> (ÒÅ×.
<revnumber>253912</revnumber>).</entry>
</row>
<row>
<entry>902501</entry>
<entry>August 2, 2013</entry>
<entry>9.2-STABLE ÐÏÓÌÅ ÓÏÚÄÁÎÉÑ ×ÅÔËÉ
<literal>releng/9.2</literal> (ÒÅ×. <revnumber>253913</revnumber>).
</entry>
<literal>releng/9.2</literal> (ÒÅ×.
<revnumber>253913</revnumber>).</entry>
</row>
<row>
@ -4250,8 +4246,8 @@
<entry>1000006</entry>
<entry>26 ÑÎ×ÁÒÑ 2012</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ÁÓÉÎÈÒÏÎÎÙÈ Õ×ÅÄÏÍÌÅÎÉÊ Ï ÎÁÌÉÞÉÉ
×ÈÏÄÎÙÈ ÄÁÎÎÙÈ × ÕÒÏ×ÎÅ cam(4) (ÒÅ×. <revnumber>230590</revnumber>).
</entry>
×ÈÏÄÎÙÈ ÄÁÎÎÙÈ × ÕÒÏ×ÎÅ cam(4) (ÒÅ×.
<revnumber>230590</revnumber>).</entry>
</row>
<row>
@ -4368,8 +4364,8 @@
<entry>22 ÏËÔÑÂÒÑ 2012</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÕÄÁÌÅÎÉÑ ÐÏÄÄÅÒÖËÉ ÆÁÊÌÏ×ÙÈ ÓÉÓÔÅÍ, ÎÅ
Ñ×ÌÑÀÝÉÈÓÑ MPSAFE, É ÄÏÂÁ×ÌÅÎÉÑ ÐÏÄÄÅÒÖËÉ FUSEFS (ÒÅ×.
<revnumber>241519</revnumber>, <revnumber>241897</revnumber>).
</entry>
<revnumber>241519</revnumber>,
<revnumber>241897</revnumber>).</entry>
</row>
<row>
@ -4395,8 +4391,7 @@
<entry>5 ÎÏÑÂÒÑ 2012</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÅÒÅËÌÀÞÅÎÉÑ ËÏÍÐÉÌÑÔÏÒÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÎÁ
clang ÎÁ ÐÌÁÔÆÏÒÍÁÈ i386 É amd64 (ÒÅ×.
<revnumber>242624</revnumber>).
</entry>
<revnumber>242624</revnumber>).</entry>
</row>
<row>
@ -4407,8 +4402,8 @@
ÏÔÐÒÁ×ËÏÊ ÓÔÒÕËÔÕÒÙ × ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÊ ÒÅÖÉÍ ÐÏÓÒÅÄÓÔ×ÏÍ sysctl
ÉÌÉ ÓÏËÅÔÁ ÍÁÒÛÒÕÔÉÚÁÃÉÉ. üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÓÐÅÃÉÆÉÞÎÙÊ ÄÌÑ KAME
embedded scope id × sin6_addr.s6_addr[2] × ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÍ
ÐÒÉÌÏÖÅÎÉÉ ×ÓÅÇÄÁ ÏÞÉÝÁÅÔÓÑ (ÒÅ×. <revnumber>243443</revnumber>).
</entry>
ÐÒÉÌÏÖÅÎÉÉ ×ÓÅÇÄÁ ÏÞÉÝÁÅÔÓÑ (ÒÅ×.
<revnumber>243443</revnumber>).</entry>
</row>
<row>
@ -4462,9 +4457,9 @@
<entry>1000032</entry>
<entry>1 ÍÁÑ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ÓÉÓÔÅÍÎÙÈ ×ÙÚÏ×Ï×
<function>accept4</function> (ÒÅ×. <revnumber>250154</revnumber>) É
<function>pipe2</function> (ÒÅ×. <revnumber>250159</revnumber>).
</entry>
<function>accept4</function> (ÒÅ×. <revnumber>250154</revnumber>)
É <function>pipe2</function> (ÒÅ×.
<revnumber>250159</revnumber>).</entry>
</row>
<row>
@ -4486,24 +4481,24 @@
<function>catanh</function>, <function>catanhf</function>,
<function>logl</function>, <function>log2l</function>,
<function>log10l</function>, <function>log1pl</function>,
<function>expm1l</function> (ÒÅ×. <revnumber>251294</revnumber>).
</entry>
<function>expm1l</function> (ÒÅ×.
<revnumber>251294</revnumber>).</entry>
</row>
<row>
<entry>1000035</entry>
<entry>8 ÉÀÎÑ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÏÑ×ÌÅÎÉÑ ÓÉÓÔÅÍÎÏÇÏ ×ÙÚÏ×Á
<function>aio_mlock</function> (ÒÅ×. <revnumber>251526</revnumber>).
</entry>
<function>aio_mlock</function> (ÒÅ×.
<revnumber>251526</revnumber>).</entry>
</row>
<row>
<entry>1000036</entry>
<entry>9 ÉÀÌÑ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÎÏ×ÏÊ ÆÕÎËÃÉÉ × ÐÒÏÇÒÁÍÍÎÙÊ
ÉÎÔÅÒÆÅÊÓ ÍÏÄÕÌÑ ÑÄÒÁ GSSAPI (ÒÅ×. <revnumber>253049</revnumber>).
</entry>
ÉÎÔÅÒÆÅÊÓ ÍÏÄÕÌÑ ÑÄÒÁ GSSAPI (ÒÅ×.
<revnumber>253049</revnumber>).</entry>
</row>
<row>
@ -4519,8 +4514,8 @@
<literal>mrt6stat</literal>, <literal>mrtstat</literal>,
<literal>pfkeystat</literal>, <literal>pim6stat</literal>,
<literal>pimstat</literal>, <literal>rip6stat</literal>,
<literal>udpstat</literal> (ÒÅ×. <revnumber>253081</revnumber>).
</entry>
<literal>udpstat</literal> (ÒÅ×.
<revnumber>253081</revnumber>).</entry>
</row>
<row>
@ -4528,8 +4523,8 @@
<entry>16 ÉÀÌÑ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÅÒÅËÌÀÞÅÎÉÑ ABI, ÉÓÐÏÌØÚÕÅÍÏÇÏ ÐÏ
ÕÍÏÌÞÁÎÉÀ, ÎÁ <literal>ARM EABI</literal> ÄÌÑ ÁÒÈÉÔÅËÔÕÒ arm,
armeb, armv6, and armv6eb (ÒÅ×. <revnumber>253396</revnumber>).
</entry>
armeb, armv6, and armv6eb (ÒÅ×.
<revnumber>253396</revnumber>).</entry>
</row>
<row>
@ -4579,8 +4574,8 @@
<entry>15 Á×ÇÕÓÔÁ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÐÅÒÅ×ÏÄÁ <literal>libc.so</literal> ÎÁ
ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÓÃÅÎÁÒÉÑ &man.ld.1; (ÒÅ×.
<revnumber>251668</revnumber>, <revnumber>254358</revnumber>).
</entry>
<revnumber>251668</revnumber>,
<revnumber>254358</revnumber>).</entry>
</row>
<row>
@ -4598,8 +4593,8 @@
<entry>10-CURRENT ÐÏÓÌÅ ÄÏÂÁ×ÌÅÎÉÑ ÆÌÁÇÏ× mbuf
<literal>M_PROTO[9-12]</literal> É ÕÄÁÌÅÎÉÑ ÆÌÁÇÏ×
<literal>M_FRAG|M_FIRSTFRAG|M_LASTFRAG</literal> (ÒÅ×.
<revnumber>254524</revnumber>, <revnumber>254526</revnumber>).
</entry>
<revnumber>254524</revnumber>,
<revnumber>254526</revnumber>).</entry>
</row>
<row>
@ -4607,16 +4602,16 @@
<entry>21 Á×ÇÕÓÔÁ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÏÂÎÏ×ÌÅÎÉÑ &man.stat.2;, ÐÏÚ×ÏÌÑÀÛÅÇÏ
ÓÏÈÒÁÎÑÔØ ÎÅËÏÔÏÒÙÅ ÆÁÊÌÏ×ÙÅ ÁÔÒÉÂÕÔÙ Windows/DOS É CIFS ×
ËÁÞÅÓÔ×Å ÆÌÁÇÏ× &man.stat.2; (ÒÅ×. <revnumber>254627</revnumber>).
</entry>
ËÁÞÅÓÔ×Å ÆÌÁÇÏ× &man.stat.2; (ÒÅ×.
<revnumber>254627</revnumber>).</entry>
</row>
<row>
<entry>1000048</entry>
<entry>22 Á×ÇÕÓÔÁ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÓÔÒÕËÔÕÒÙ
<literal>xsctp_inpcb</literal> (ÒÅ×. <revnumber>254672</revnumber>).
</entry>
<literal>xsctp_inpcb</literal> (ÒÅ×.
<revnumber>254672</revnumber>).</entry>
</row>
<row>
@ -4632,8 +4627,9 @@
<entry>1000050</entry>
<entry>24 Á×ÇÕÓÔÁ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÓÔÒÕËÔÕÒÙ <literal>mbuf</literal>
(ÒÅ×. <revnumber>254780</revnumber>, <revnumber>254799</revnumber>,
<revnumber>254804</revnumber>, <revnumber>254807</revnumber>
(ÒÅ×. <revnumber>254780</revnumber>,
<revnumber>254799</revnumber>, <revnumber>254804</revnumber>,
<revnumber>254807</revnumber>,
<revnumber>254842</revnumber>).</entry>
</row>
@ -4641,8 +4637,8 @@
<entry>1000051</entry>
<entry>25 Á×ÇÕÓÔÁ 2013</entry>
<entry>10-CURRENT ÐÏÓÌÅ ÉÍÐÏÒÔÁ ÄÒÁÊ×ÅÒÁ Radeon KMS (ÒÅ×.
<revnumber>254885</revnumber>, <revnumber>254887</revnumber>).
</entry>
<revnumber>254885</revnumber>,
<revnumber>254887</revnumber>).</entry>
</row>
<row>
@ -4717,8 +4713,9 @@
<row>
<entry>1000700</entry>
<entry>7 ÄÅËÁÂÒÑ 2013</entry>
<entry>10-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ <literal>releng/10.0</literal>
(ÒÅ×. <revnumber>259069</revnumber>).</entry>
<entry>10-STABLE ÐÏÓÌÅ ÏÔÄÅÌÅÎÉÑ ×ÅÔËÉ
<literal>releng/10.0</literal> (ÒÅ×.
<revnumber>259069</revnumber>).</entry>
</row>
<row>