MFen r43840 et al.

Break the porters handbook out into individual chapters.
This commit is contained in:
Sergey Kandaurov 2014-02-22 12:30:10 +00:00
parent c6739bc4d1
commit b2690733d4
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=44029
34 changed files with 13186 additions and 12715 deletions

View file

@ -4,7 +4,7 @@
# $FreeBSD$
# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/Makefile,v 1.7 2003/09/26 02:34:16 andy Exp $
#
# Original revision: r42686
# Original revision: r43849
#
#
@ -27,6 +27,21 @@ INSTALL_ONLY_COMPRESSED?=
# XML content
SRCS= book.xml
SRCS+= porting-why/chapter.xml
SRCS+= new-port/chapter.xml
SRCS+= quick-porting/chapter.xml
SRCS+= slow-porting/chapter.xml
SRCS+= makefiles/chapter.xml
SRCS+= special/chapter.xml
SRCS+= plist/chapter.xml
SRCS+= pkg-files/chapter.xml
SRCS+= testing/chapter.xml
SRCS+= upgrading/chapter.xml
SRCS+= security/chapter.xml
SRCS+= porting-dads/chapter.xml
SRCS+= porting-samplem/chapter.xml
SRCS+= keeping-up/chapter.xml
SRCS+= appendices/chapter.xml
SRCS+= uses.xml
SRCS+= versions.xml
@ -55,4 +70,14 @@ IMAGES_LIB+= callouts/21.png
DOC_PREFIX?= ${.CURDIR}/../../..
# Entities
SRCS+= chapters.ent
SYMLINKS= ${DESTDIR} index.html handbook.html
# Turn on all the chapters.
CHAPTERS?= ${SRCS:M*chapter.xml}
XMLFLAGS+= ${CHAPTERS:S/\/chapter.xml//:S/^/-i chap./}
.include "${DOC_PREFIX}/share/mk/doc.project.mk"

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= appendices/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
Original revision: r43844
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices">
<title>Приложения</title>
<sect1 xml:id="uses-values">
<title>Значения <varname>USES</varname></title>
<table>
<title>Значения <varname>USES</varname></title>
<tgroup cols="3">
<thead>
<row>
<entry>Наименование</entry>
<entry>Аргументы</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody valign="top">
&values.uses;
</tbody>
</tgroup>
</table>
</sect1>
<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>
<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>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
$FreeBSD$
Original revision: r43840
-->
<!ENTITY chap.porting-why SYSTEM "porting-why/chapter.xml">
<!ENTITY chap.new-port SYSTEM "new-port/chapter.xml">
<!ENTITY chap.quick-porting SYSTEM "quick-porting/chapter.xml">
<!ENTITY chap.slow-porting SYSTEM "slow-porting/chapter.xml">
<!ENTITY chap.makefiles SYSTEM "makefiles/chapter.xml">
<!ENTITY chap.special SYSTEM "special/chapter.xml">
<!ENTITY chap.plist SYSTEM "plist/chapter.xml">
<!ENTITY chap.pkg-files SYSTEM "pkg-files/chapter.xml">
<!ENTITY chap.testing SYSTEM "testing/chapter.xml">
<!ENTITY chap.upgrading SYSTEM "upgrading/chapter.xml">
<!ENTITY chap.security SYSTEM "security/chapter.xml">
<!ENTITY chap.porting-dads SYSTEM "porting-dads/chapter.xml">
<!ENTITY chap.porting-samplem SYSTEM "porting-samplem/chapter.xml">
<!ENTITY chap.keeping-up SYSTEM "keeping-up/chapter.xml">
<!ENTITY chap.appendices SYSTEM "appendices/chapter.xml">

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= keeping-up/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Актуализация</title>
<para>Коллекция Портов &os; постоянно изменяется. Здесь находится
некоторая информация о том, как поддерживать её в актуальном
состоянии.</para>
<sect1 xml:id="freshports">
<title>FreshPorts</title>
<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 имеется также функция проверки правильности,
которая автоматически проверяет каждое изменение, внесённое в дерево
портов &os;. Если вы подпишетесь на эту услугу, то будете
оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке
внесённых вами изменений.</para>
</sect1>
<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>
<sect1 xml:id="ports-mailing-list">
<title>Список рассылки &os;, посвящённый портам</title>
<para>Если вы поддерживаете порты, то должны следить за &a.ports;.
О важных изменениях, отражающихся на работе портов, будет сообщаться
здесь, а затем они переносятся в <filename>CHANGES</filename>.</para>
<para>Если данный список рассылки слишком загружен сообщениями,
вы можете отслеживать &a.ports-announce.name;, который модерируется
и не является местом для дискуссий.</para>
</sect1>
<sect1 xml:id="build-cluster">
<title>Кластер построения портов &os;</title>
<para>Одной из наименее известных сильных сторон &os; является тот
факт, что для непрерывного построения Коллекции Портов для каждого
из основных релизов ОС для каждой архитектуры уровня поддержки
Tier-1 выделен целый кластер машин.</para>
<para>Отдельные порты собираются, если они специально не помечены как
<varname>IGNORE</varname>. Для портов, помеченных как
<varname>BROKEN</varname>, попытки будут продолжены для того,
чтобы увидеть, если основная проблема была решена. (Это сделано
через использование переменной <varname>TRYBROKEN</varname> для
<filename>Makefile</filename> порта.)</para>
</sect1>
<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>Главная страница <application>Portscout</application>
отображает email мейнтейнера порта, количество портов, за
которые ответственен мейнтейнер, количество портов с новыми
дистрибутивными файлами и процент устаревших портов. Функция
поиска выполняет поиск мейнтейнера по адресу электронной почты
и позволяет выбирать между всеми портами или только
устаревшими.</para>
<para>При щелчке по адресу электронной почты мейнтейнера
отображается список всех его портов, разделённых по категориям,
вместе с текущим номером версии, информацией о наличии новой
версии, временем последнего обновления порта и временем его
последней проверки. Функция поиска на этой странице позволяет
пользователю выполнять поиск конкретного порта.</para>
<para>По щелчку на название порта в списке отображается информация
о порте <link xlink:href="http://freshports.org">FreshPorts</link>.</para>
</sect1>
<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/portoverview.py">Обзор
отдельного порта</link>.</para>
<para>На момент написания это единственный доступный ресурс, который
для имени порта ставит в соответствие записи PR GNATS.
(Отправители PR не всегда добавляют в название имя порта, хотя
мы предпочитаем, чтобы они это делали.) Таким образом,
<literal>portsmon</literal> это хорошее место для начала, если вы
хотите найти присланные PR и/или ошибки построения для существующего
порта; либо поискать, был ли уже прислан новый порт, который вы
подумывали создать сами.</para>
</sect1>
</chapter>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= makefiles/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= new-port/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Как самому сделать новый порт</title>
<para>Итак, вы интересуетесь, как создать собственный порт или
обновить существующий? Великолепно!</para>
<para>Ниже находятся некоторые указания по созданию нового порта для
&os;. Если вы хотите обновить существующий порт, вы должны
прочесть их, а затем <xref linkend="port-upgrading"/>.</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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= pkg-files/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Файлы <filename>pkg-*</filename></title>
<para>Есть несколько приёмов работы с файлами
<filename>pkg-*</filename>, которые мы ещё не
описали, но они иногда могут быть очень кстати.</para>
<sect1 xml:id="porting-message">
<title><filename>pkg-message</filename></title>
<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>
<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>
<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>
<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>
<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>
<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>Вот список имён переменных и их значений по умолчанию. (Значение
<varname>PKGDIR</varname> по умолчанию равно
<varname>${MASTERDIR}</varname>.)</para>
<informaltable frame="none" pgwide="0">
<tgroup cols="2">
<thead>
<row>
<entry>Переменная</entry>
<entry>Значение по умолчанию</entry>
</row>
</thead>
<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>PKGINSTALL</varname></entry>
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
</row>
<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>
<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> указывается перечень
файлов для автоматического изменения. Каждый
<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>В следующем примере в <filename>pkg-message</filename>
будет сделана замена <literal>%%ARCH%%</literal> на системную
архитектуру:</para>
<programlisting>SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}</programlisting>
<para>Обратите внимание, что в этом примере в <varname>FILESDIR</varname>
обязательно существование файла <filename>pkg-message.in</filename>.
</para>
<para>Пример хорошего <filename>pkg-message.in</filename>:</para>
<programlisting>Now it's 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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= plist/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,284 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
Original revision: r43840
-->
<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>
<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>Если вам нужно сделать другие подстановки, вы можете указать в
переменной <varname>PLIST_SUB</varname> список пар
<literal>VAR=VALUE</literal>,
и все вхождения <literal>%%VAR%%</literal>
в файле <filename>pkg-plist</filename> будут заменяться на значение
<replaceable>VALUE</replaceable>.</para>
<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>Если ваш порт устанавливает файлы в соответствии с установленными
в порту опциями, то обычным способом управления является добавление
префиксов <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)
PLIST_SUB+= X11=""
.else
PLIST_SUB+= X11="@comment "
.endif</programlisting>
<para>и в самом <filename>pkg-plist</filename>:</para>
<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>Другой способ изменения списка сборки порта основан на
определении значений переменных <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>
<sect2 xml:id="plist-dir-cleaning">
<title>Очистка пустых каталогов</title>
<para>Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это
достигается добавлением строк <literal>@dirrm</literal> для всех
каталогов, которые создаются этим портом. Вам нужно удалить
подкаталоги до того, как вы сможете удалить родительские
каталоги.</para>
<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>
<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>
</sect2>
<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>
<programlisting>@exec mkdir -p %D/share/foo/templates</programlisting>
</sect2>
</sect1>
<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>filename.sample</filename>.
Затем скопируйте файл с примером на место настоящего файла
конфигурации, если таковой ещё не существует. При деинсталляции
удаляйте файл конфигурации только в том случае, если он идентичен
файлу с расширением <filename>.sample</filename>. Вам
нужно управлять этим в <filename>Makefile</filename> и в
<filename>pkg-plist</filename> (для установки из пакета).</para>
<para>Пример части <filename>Makefile</filename>:</para>
<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>
<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>-s</literal> из команды
&man.cmp.1;.</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>
<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> это список
упаковки, который получается во время компиляции порта и строится
на основе устанавливаемых файлов и каталогов. Узнать такой список
невозможно до того, как исходный код портируемого приложения
будет скачен и скомпилирован, или после запуска
<literal>make clean</literal>.</para>
<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>
<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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= porting-dads/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,720 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="porting-dads">
<title>Что делать нужно, и что делать нельзя</title>
<sect1 xml:id="dads-intro">
<title>Введение</title>
<para>Вот список часто встречающихся действий, которые нужно и которые
нельзя делать во время процесса портирования. Проверьте
порт по этому списку, и также проверьте порты в
<link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе
сообщений PR</link>, которые присланы другими людьми. Присылайте
любые комментарии о портах, которые вы проверили, так, как это описано
в статье о <link xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">
Сообщениях об ошибках и общих замечаниях</link>. Проверка портов в
базе сообщений PR позволит нам быстрее коммиттить их и удостовериться,
что вы знаете, что делаете.</para>
</sect1>
<sect1 xml:id="porting-wrkdir">
<title><varname>WRKDIR</varname></title>
<para>Не пишите ничего в файлы вне каталога <varname>WRKDIR</varname>.
Каталог <varname>WRKDIR</varname> является единственным местом,
которое гарантированно будет доступно для записи во время построения
порта (обратитесь к главе о <link xlink:href="&url.books.handbook;/ports-using.html#PORTS-CD">установке портов с
CDROM</link> за
примером построения портов из дерева, доступного только для чтения).
Если вам нужно изменить какой-либо из файлов
<filename>pkg-*</filename>, сделайте это,
<link linkend="porting-pkgfiles">переопределив переменную</link>, но не
перезаписывая их.</para>
</sect1>
<sect1 xml:id="porting-wrkdirprefix">
<title><varname>WRKDIRPREFIX</varname></title>
<para>Добейтесь того, чтобы ваш порт принимал во внимание значение
переменной <varname>WRKDIRPREFIX</varname>. Большинство портов об
этом не заботятся. В частности, если вы обращаетесь к каталогу
<varname>WRKDIR</varname> другого порта, заметьте, что его правильным
местоположением является
<filename>WRKDIRPREFIXPORTSDIR/subdir/name/work</filename> not <filename>PORTSDIR/subdir/work</filename>
или <filename>.CURDIR/../../subdir/name/work</filename>
или что-то подобное.</para>
<para>Кроме того, если вы сами задаете <varname>WRKDIR</varname>, то
должны поставить перед ним знак
<literal>&dollar;{WRKDIRPREFIX}&dollar;{.CURDIR}</literal>.</para>
</sect1>
<sect1 xml:id="porting-versions">
<title>Различение операционных систем и версий ОС</title>
<para>Вы можете встретиться с кодом, который требует модификаций
или условной компиляции в зависимости от того, с какой версией &os;
Unix он работает. Предпочтительным способом отделения кода для
версий &os; является использование макросов
<literal>__FreeBSD_version</literal> и
<literal>__FreeBSD__</literal>, определённых в <link
xlink:href="http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>.
Если этот файл не подключен, добавьте код</para>
<programlisting>#include &lt;sys/param.h&gt;</programlisting>
<para>в соответствующем месте файла <filename>.c</filename>.
<literal>__FreeBSD__</literal> определён во всех версиях &os;
в качестве старшего номера версии системы. Например, в &os;
9.x <literal>__FreeBSD__</literal> определён со значением
<literal>9</literal>.</para>
<programlisting>#if __FreeBSD__ &gt;= 9
# if __FreeBSD_version &gt;= 901000
/* здесь особый код для версий 9.1+ */
# endif
#endif</programlisting>
</sect1>
<sect1 xml:id="dads-after-port-mk">
<title>Написание чего-либо после
<filename>bsd.port.mk</filename></title>
<para>Не пишите ничего после строки
<literal>.include &lt;bsd.port.mk&gt;</literal>. Этой строки можно
избежать, включив в где-то в середину вашего файла
<filename>Makefile</filename> файл
<filename>bsd.port.pre.mk</filename>, и
файл <filename>bsd.port.post.mk</filename> в конец.</para>
<note>
<para>Вам нужно включить либо пару файлов
<filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>,
либо только <filename>bsd.port.mk</filename>; не используйте оба этих
метода одновременно.</para>
</note>
<para>В файле <filename>bsd.port.pre.mk</filename> определяются лишь
несколько переменных, которые могут быть использованы в тестах из
файла <filename>Makefile</filename>, в файле
<filename>bsd.port.post.mk</filename> заданы остальные.</para>
<para>Вот некоторые важные переменные, определенные в файле
<filename>bsd.port.pre.mk</filename> (это не полный список, для
выяснения полного списка прочтите, пожалуйста, сам файл
<filename>bsd.port.mk</filename>).</para>
<informaltable frame="none" pgwide="0">
<tgroup cols="2">
<thead>
<row>
<entry>Переменная</entry>
<entry>Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry><varname>ARCH</varname></entry>
<entry>Архитектура машины в виде, получаемом по команде
<command>uname -m</command> (например,
<literal>i386</literal>)</entry>
</row>
<row>
<entry><varname>OPSYS</varname></entry>
<entry>Тип операционной системы, получаемый по команде
<command>uname -s</command> (например,
<literal>FreeBSD</literal>)</entry>
</row>
<row>
<entry><varname>OSREL</varname></entry>
<entry>Версия релиза операционной системы (например,
<literal>2.1.5</literal> или <literal>2.2.7</literal>)</entry>
</row>
<row>
<entry><varname>OSVERSION</varname></entry>
<entry>Версия операционной системы в виде числа, та же, что и <link linkend="freebsd-versions">
<literal>__FreeBSD_version</literal></link>.</entry>
</row>
<row>
<entry><varname>LOCALBASE</varname></entry>
<entry>Корень дерева <quote>local</quote> (например,
<literal>/usr/local</literal>)</entry>
</row>
<row>
<entry><varname>PREFIX</varname></entry>
<entry>Куда, собственно, устанавливается порт (обратитесь к <link linkend="porting-prefix">
подробной информации о <varname>PREFIX</varname></link>).</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para>Если вы задаете переменную
<varname>MASTERDIR</varname>, делайте это до
подключения <filename>bsd.port.pre.mk</filename>.</para>
</note>
<para>Вот несколько примеров того, что вы можете написать после
<filename>bsd.port.pre.mk</filename>:</para>
<programlisting># no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} &gt; 300003
BROKEN= perl is in system
.endif</programlisting>
<para>Вы не забываете об использовании табуляции вместо пробелов
после <literal>BROKEN=</literal>,
не так ли? <!-- улыбка -->:-).</para>
</sect1>
<sect1 xml:id="dads-sh-exec">
<title>Использование выражения <function>exec</function>
в сценариях обёртках</title>
<para>Если порт устанавливает сценарий на языке shell, который служит
для запуска другой программы, и если запуск этой программы является
последним действием сценария, убедитесь, что запуск программы
производится с использованием выражения <function>exec</function>,
например:</para>
<programlisting>#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"</programlisting>
<para>Выражение <function>exec</function> заменяет процесс сценария
на указанную программу. Если <function>exec</function> опущен,
то процесс сценария во время работы программы остается в памяти,
без бесполезно потребляя системные ресурсы.</para>
</sect1>
<sect1 xml:id="dads-rational">
<title>Поступайте разумно</title>
<para>Файл <filename>Makefile</filename> должен выполнять действия
просто и небеспричинно. Если вы можете сделать что-то на несколько
строк короче или более читабельно, сделайте это. В качестве примеров
можно привести использование конструкций <literal>.if</literal>
утилиты make вместо соответствующей конструкции <literal>if</literal>
командного процессора, ненужность переопределения цели
<buildtarget>do-extract</buildtarget> при возможности переопределения
<varname>EXTRACT*</varname> и использование
<varname>GNU_CONFIGURE</varname> вместо
<literal>CONFIGURE_ARGS+= --prefix=&dollar;{PREFIX}</literal>.</para>
<para>Если вы обнаружите, что для выполнения чего-то приходится писать
много нового кода, то, пожалуйста, просмотрите файл
<filename>bsd.port.mk</filename> на предмет того, не содержит ли он
реализацию именно вашей проблемы. Хотя его трудно читать, имеется
много проблем, выглядящих сложными, для которых файл
<filename>bsd.port.mk</filename> уже содержит быстрое решение.</para>
</sect1>
<sect1 xml:id="dads-cc">
<title>Работа как с <varname>CC</varname>, так и
<varname>CXX</varname></title>
<para>Порт должен принимать во внимание как переменную
<varname>CC</varname>, так и <varname>CXX</varname>.
Под этим мы подразумеваем, что порт ни в коем случае не должен
устанавливать значения этих переменных, переопределяя имеющиеся
значения; вместо этого можно добавлять нужные значения к уже
имеющимся. Это связано с тем, что параметры построения,
относящиеся ко всем портам, могут быть заданы глобально.</para>
<para>Если порты не учитывают значения этих переменных, добавьте
строку <literal>NO_PACKAGE=ignores either cc or cxx</literal>
в файл <filename>Makefile</filename>.</para>
<para>Далее следует пример файла <filename>Makefile</filename>,
использующего как переменную <varname>CC</varname>, так и
<varname>CXX</varname>. Обратите внимание на использование символов
<varname>?=</varname>:</para>
<programlisting>CC?= gcc</programlisting>
<programlisting>CXX?= g++</programlisting>
<para>Вот пример, в котором не принимаются во внимание ни переменная
<varname>CC</varname>, ни <varname>CXX</varname>:</para>
<programlisting>CC= gcc</programlisting>
<programlisting>CXX= g++</programlisting>
<para>В системах &os; обе переменные <varname>CC</varname> и
<varname>CXX</varname> могут быть определены в файле
<filename>/etc/make.conf</filename>. В первом примере задаётся
значение, если оно ранее не было определено в
<filename>/etc/make.conf</filename>, что сохраняет любые определения,
данные на уровне системы в целом. Второй пример переопределяет всё,
что было задано ранее.</para>
</sect1>
<sect1 xml:id="dads-cflags">
<title>Использование <varname>CFLAGS</varname></title>
<para>Порт должен принимать во внимание переменную
<varname>CFLAGS</varname>.
Под этим мы подразумеваем, что порт ни в коем случае не должен
устанавливать значения этих переменных, переопределяя имеющиеся
значения; вместо этого можно добавлять нужные значения к уже
имеющимся. Это связано с тем, что параметры построения,
относящиеся ко всем портам, могут быть заданы глобально.</para>
<para>Если порты не учитывают значения этой переменной, добавьте
строку <literal>NO_PACKAGE=ignores cflags</literal> в файл
<filename>Makefile</filename>.</para>
<para>Далее следует пример файла <filename>Makefile</filename>,
использующего переменную <varname>CFLAGS</varname>. Обратите
внимание на использование символов <varname>+=</varname>:</para>
<programlisting>
CFLAGS+= -Wall -Werror
</programlisting>
<para>А вот пример, в котором не учитывается значение переменной
<varname>CFLAGS</varname>:</para>
<programlisting>
CFLAGS= -Wall -Werror
</programlisting>
<para>В системе &os; переменная <varname>CFLAGS</varname> определена
в файле <filename>/etc/make.conf</filename>. В первом примере к
переменной <varname>CFLAGS</varname> добавляются дополнительные флаги,
при этом сохраняются все определения, данные ранее на уровне системы.
Во втором примере всё, что было задано ранее, игнорируется.</para>
<para>Из сторонних файлов <filename>Makefile</filename> следует удалить
флаги оптимизации. Общесистемные флаги оптимизации находятся в
системной переменной <varname>CFLAGS</varname>. Пример из
немодифицированного <filename>Makefile</filename>:</para>
<programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting>
<para>При использовании системных флагов оптимизации
<filename>Makefile</filename> станет похожим на следующий пример:</para>
<programlisting>CFLAGS+= -DHAVE_SOUND</programlisting>
</sect1>
<sect1 xml:id="dads-pthread">
<title>Библиотеки потоков</title>
<para>Во &os; библиотека потоков обязана быть скомпонована с
исполняемыми файлами с использованием специального флага
<literal>-pthread</literal>. Если порт настаивает
на прямой компоновке с <literal>-lpthread</literal>,
создайте патч для использования <literal>-pthread</literal>
</para>
<note>
<para>Если построение порта заканчивается ошибкой
<literal>unrecognized option '-pthread'</literal>,
то может быть желательно использование <command>cc</command>
в качестве компоновщика через установку
<varname>CONFIGURE_ENV</varname> в <literal>LD=${CC}</literal>.
Параметр <literal>-pthread</literal> напрямую командой
<command>ld</command> не поддерживается.</para>
</note>
</sect1>
<sect1 xml:id="dads-feedback">
<title>Пожелания</title>
<para>Посылайте подходящие изменения/патчи авторам/сопровождающему
для включения в следующий релиз. Это только сделает вашу работу
гораздо легче при выходе следующего релиза.</para>
</sect1>
<sect1 xml:id="dads-readme">
<title><filename>README.html</filename></title>
<para><filename>README.html</filename> не является частью порта
и генерируется при помощи <command>make readme</command>.
Не включайте этот файл в патчи или коммиты.</para>
<note>
<para>Если не удается выполнить <command>make readme</command>,
убедитесь, что значение по умолчанию <varname>ECHO_MSG</varname>
не было изменено внутри порта.</para>
</note>
</sect1>
<sect1 xml:id="dads-noinstall">
<title>Пометка неустанавливаемого порта как <varname>BROKEN</varname>,
<varname>FORBIDDEN</varname> или <varname>IGNORE</varname></title>
<para>В некоторых случаях пользователи не должны допускаться к
установке порта. Для того, чтобы сообщить пользователю, что порт
не следует устанавливать, имеется несколько
<command>make</command>-переменных, которые могут быть использованы
в файле <filename>Makefile</filename> порта. Значения следующих
<command>make</command>-переменных будут причиной, возвращаемой
пользователям, по которой порт отказывает в установке.
Пожалуйста, используйте корректные <command>make</command>-переменные,
так как каждая переменная make передает абсолютно различный смысл
как для пользователей, так и для автоматизированных систем, которые
полагаются на файлы <filename>Makefile</filename>, таких как
<link linkend="build-cluster">кластер построения портов</link>,
<link linkend="freshports">FreshPorts</link> и
<link linkend="portsmon">portsmon</link>.</para>
<sect2 xml:id="dads-noinstall-variables">
<title>Переменные</title>
<itemizedlist>
<listitem>
<para><varname>BROKEN</varname> предназначена для портов, которые
в настоящее время не компилируются, не устанавливаются или не
удаляются правильно. Следует использовать для портов,
когда проблема считается временной.</para>
<para>В особых случаях кластер
построения будет продолжать попытки собрать их, чтобы показать,
решена ли основная проблема. (Однако, как правило, кластер
запускается без этой возможности.)</para>
<para>В частности, используйте
<varname>BROKEN</varname>, когда порт:</para>
<itemizedlist>
<listitem>
<para>не компилируется</para>
</listitem>
<listitem>
<para>не выполняет процесс своей конфигурации или
установки</para>
</listitem>
<listitem>
<para>устанавливает файлы вовне
<filename>${LOCALBASE}</filename></para>
</listitem>
<listitem>
<para>не удаляет полностью все свои файлы при деинсталляции
(тем не менее, это может быть допустимо, и подходит
для портов, оставляющих после себя файлы, измененные
пользователем)</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para><varname>FORBIDDEN</varname> используется для портов, которые
содержат уязвимости в информационной безопасности или
являются потенциально вредными в плане обеспечения информационной
безопасности системы &os; при установке данного порта
(например: заведомо небезопасная программа или программа, которая
предоставляет легко взламываемые сервисы). Порты должны
помечаться как <varname>FORBIDDEN</varname>, как только в
конкретном программном обеспечении обнаружилась уязвимость, но
обновление выпущено не было. В идеальном случае порты должны
обновляться максимально быстро после обнаружения уязвимости,
чтобы уменьшить число уязвимых хостов &os; (нам нравится иметь
репутацию безопасной системы), однако иногда случается
значительный временной разрыв между обнаружением уязвимости и
выходом обновлённого релиза уязвимого программного обеспечения.
Не помечайте порт как <varname>FORBIDDEN</varname>, если причина
не вызвана соображениями информационной безопасности.</para>
</listitem>
<listitem>
<para><varname>IGNORE</varname> предназначена для портов, которые
не должны строиться по какой-либо другой причине. Следует
использовать для портов, в случае когда проблема считает
конструктивной. Кластер построения
ни при каких условиях не будет строить порты, помеченные как
<varname>IGNORE</varname>. В частности, используйте
<varname>IGNORE</varname>, когда порт:</para>
<itemizedlist>
<listitem>
<para>компилируется, но работает неправильно</para>
</listitem>
<listitem>
<para>не работает на установленной версии &os;</para>
</listitem>
<listitem>
<para>имеет distfile, который не может быть автоматически
извлечен из-за лицензионных ограничений</para>
</listitem>
<listitem>
<para>не работает с каким-либо другим портом, установленным
в настоящее время (например, порт зависит от
<package role="port">www/apache20</package>, но установлен
<package role="port">www/apache22</package>)
</para>
</listitem>
</itemizedlist>
<note>
<para>Если порт будет конфликтовать с уже установленным портом,
(например, если они устанавливают файл в то же место, но
с иным функциональным назначением), то
<link linkend="conflicts">используйте
вместо этого <varname>CONFLICTS</varname></link>.
<varname>CONFLICTS</varname> сам установит значение
<varname>IGNORE</varname>.</para>
</note>
</listitem>
<listitem>
<para>Если порт нужно пометить как <varname>IGNORE</varname>
только на некоторых архитектурах, для этого есть две другие
удобные переменные, которые автоматически установят для вас
значения: <varname>ONLY_FOR_ARCHS</varname> и
<varname>NOT_FOR_ARCHS</varname>. Примеры:</para>
<programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting>
<programlisting>NOT_FOR_ARCHS= ia64 sparc64</programlisting>
<para>Собственное сообщение <varname>IGNORE</varname> можно задать
с использованием <varname>ONLY_FOR_ARCHS_REASON</varname> и
<varname>NOT_FOR_ARCHS_REASON</varname>. Отдельно для каждой
архитектуры это возможно с использованием
<varname>ONLY_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname>
и
<varname>NOT_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname>.</para>
</listitem>
<listitem>
<para>Если порт загружает и устанавливает исполняемые файлы i386,
то следует установить <varname>IA32_BINARY_PORT</varname>.
Если эта переменная установлена, будет выполнена проверка
доступности каталога <filename>/usr/lib32</filename> для
библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении
любого из этих условий будет автоматически установлена
переменная <varname>IGNORE</varname>.</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml:id="dads-noinstall-notes">
<title>Замечания по реализации</title>
<para>Строки не следует брать в кавычки.
Также построение строки должно несколько различаться из-за
способа отображения информации пользователю. Примеры:</para>
<programlisting>BROKEN= fails to link with base -lcrypto</programlisting>
<programlisting>IGNORE= unsupported on recent versions</programlisting>
<para>получаемые в результате следующего вывода
<command>make describe</command>:</para>
<programlisting>===&gt; foobar-0.1 is marked as broken: fails to link with base -lcrypto.</programlisting>
<programlisting>===&gt; foobar-0.1 is unsupported on recent versions.</programlisting>
</sect2>
</sect1>
<sect1 xml:id="dads-deprecated">
<title>Пометка порта на удаление с <varname>DEPRECATED</varname>
или <varname>EXPIRATION_DATE</varname></title>
<para>Помните, что <varname>BROKEN</varname> и
<varname>FORBIDDEN</varname> будут использованы как временное
средство, если порт не является работающим. Постоянно
неработоспособные порты должны полностью удаляться из дерева.</para>
<para>В подходящих ситуациях пользователи могут быть оповещены о
предстоящем удалении через переменные <varname>DEPRECATED</varname>
и <varname>EXPIRATION_DATE</varname>. Первое - это просто строка,
сообщающая причину запланированного удаления порта; вторая является
строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны
пользователю.</para>
<para>Переменную <varname>DEPRECATED</varname> можно установить без
использования <varname>EXPIRATION_DATE</varname> (в частности, при
рекомендации новой версии порта), но обратный порядок не имеет
никакого смысла.</para>
<para>Не существует устоявшейся политики, как долго следует продолжать
уведомления. Текущая практика дает около месяца для решения проблем
безопасности и два месяца для проблем построения. Это также дает
немного времени на исправление проблем любым заинтересованным
коммиттерам.</para>
</sect1>
<sect1 xml:id="dads-dot-error">
<title>Избегайте использования конструкции
<literal>.error</literal></title>
<para>Правильным способом подать сигнал для <filename>Makefile</filename>
о том, что порт не может быть установлен из-за какого-то внешнего
фактора (например, пользователь указал недопустимую комбинацию
опций построения), является установка непустого значения для
<varname>IGNORE</varname>. Это значение будет сформатировано и
показано пользователю во время <command>make install</command>.</para>
<para>Использование для этих целей <literal>.error</literal> является
распространенной ошибкой. Проблема в том, что в этой ситуации
будут повреждены многие инструменты автоматизации, работающие с
деревом портов. Наибольшим образом это распространено при попытке
построить <filename>/usr/ports/INDEX</filename> (смотрите <xref linkend="make-describe"/>). Тем не менее, даже более простые команды,
такие как <command>make maintainer</command>, в этом случае также
вернут ошибку. Это не является приемлемым.</para>
<example xml:id="dot-error-breaks-index">
<title>Как избегать использование <literal>.error</literal></title>
<para>Из следующих двух вариантов строки файла
<filename>Makefile</filename> первый приведёт к неудачному
завершению работы <command>make index</command>, а второй -
нет:</para>
<programlisting>.error "option is not supported"</programlisting>
<programlisting>IGNORE=option is not supported</programlisting>
</example>
</sect1>
<sect1 xml:id="dads-sysctl">
<title>Использование <filename>sysctl</filename></title>
<para>Использование <filename>sysctl</filename> не рекомендуется,
кроме как при выполнении целей. Это вызвано тем, что вычисление
любых <literal>makevar</literal>, таких как во время команды
<command>make index</command>, с необходимостью запуска этой
команды, еще больше замедляет весь процесс.</para>
<para>&man.sysctl.8; следует всегда использовать через переменную
<varname>SYSCTL</varname>, поскольку она содержит полностью заданный
путь, и при необходимости может быть переопределена.</para>
</sect1>
<sect1 xml:id="dads-rerolling-distfiles">
<title>Меняющиеся дистрибутивные файлы</title>
<para>Иногда авторы программного обеспечения меняют содержимое
выпущенных дистрибутивных файлов без смены названия. Вы должны
проверять, что изменения являются официальными и произведены
автором. В прошлом бывало, что дистрибутивный файл молча изменялся
на сайтах загрузки с намерением нанести вред или скомпрометировать
безопасность конечного пользователя.</para>
<para>Отложите старый файл с дистрибутивом в сторону, загрузите новый,
распакуйте его и сравните содержимое при помощи &man.diff.1;.
Если вы не видите ничего подозрительного, то можете обновить файл
<filename>distinfo</filename>. Убедитесь, что вы подытожили различия
в вашем PR или описании коммита, чтобы другие люди были в курсе, что
вы позаботились о том, что ничего плохого не случилось.</para>
<para>Возможно вы также захотите связаться с автором этого программного
обеспечения для подтверждения изменений.</para>
</sect1>
<sect1 xml:id="dads-avoiding-linuxisms">
<title>Избегание линуксизмов</title>
<para>Не используйте <filename>/proc</filename>, если доступны
любые другие источники получения информации, например,
<function>setprogname(argv[0])</function> в
<function>main()</function> и &man.getprogname.3;, в случае
если вы хотите <quote>знать своё имя</quote>.</para>
<para>Не полагайтесь на поведение, не регламентированное
<acronym>POSIX</acronym>.</para>
<para>Не выполняйте запись временных меток в критических путях
выполнения приложения, если можно обойтись без этого. Получение
временных меток может быть медленным, в зависимости от степени
точности используемых часов в операционной системе. Если
временные метки действительно нужны, определите степень
требуемой точности и используйте тот <acronym>API</acronym>,
в котором документируется получение достаточной точности.</para>
<para>Ряд простых системных вызовов (например, &man.gettimeofday.2;,
&man.getpid.2;) работают намного быстрее в &linux; по сравнению
с любой другой операционной системой из-за кеширования и
используемой оптимизации vsyscall. Не полагайтесь на их
дешевизну в критичных к производительности приложениях. В
целом, старайтесь избегать системных вызовов там, где это
возможно.</para>
<para>Не полагайтесь на специфичное для &linux; поведение сокета.
В частности, отличаются размеры буфера сокета по умолчанию
(выполните вызов &man.setsockopt.2; с <literal>SO_SNDBUF</literal>
и <literal>SO_RCVBUF</literal>, и в то время как в &linux;
при заполнении буфера сокета &man.send.2; блокируется, &os;
возвращает ошибку и устанавливает <literal>ENOBUFS</literal>
в качестве значения errno.</para>
<para>Если требуется рассчитывать на нестандартное поведение,
инкапсулируйте это должным образом в общий для всех
<acronym>API</acronym> с проверкой поведения на этапе
конфигурации, и если требуемое поведение не найдено,
прекращайте выполнение.</para>
<para>Используйте <link xlink:href="http://www.freebsd.org/cgi/man.cgi">страницы
справочника</link> для проверки, относится ли функция к
интерфейсу <acronym>POSIX</acronym> (ищите раздел
<quote>STANDARDS</quote> на странице справочника).</para>
<para>Не рассчитывайте на то, что в качестве
<filename>/bin/sh</filename> используется
<application>bash</application>. Убедитесь, что командная
строка, переданная в &man.system.3;, будет работать в
<acronym>POSIX</acronym>-совместимой оболочке.</para>
<para>Список основных <application>bash</application>-измов
расположен <link xlink:href="https://wiki.ubuntu.com/DashAsBinSh">здесь</link>.</para>
<para>Проверьте, что используемые заголовочные файлы включены в
<acronym>POSIX</acronym> или список, рекомендуемый страницей
справочника, т.к. например, забыть подключить
<filename>sys/types.h</filename> &mdash; не такая уж проблема
в &linux;, однако это не так во &os;.</para>
<para>Компилируйте многопоточные приложения с ключом
<quote>-pthread</quote>, а не <quote>-lpthread</quote> или
как-либо ещё.</para>
</sect1>
<sect1 xml:id="dads-misc">
<title>Разное</title>
<para>Файлы <filename>pkg-descr</filename> и
<filename>pkg-plist</filename> должны проверяться дважды. Если вы
пересматриваете порт и думаете, что его можно описать иначе,
сделайте это.</para>
<para>Пожалуйста, не создавайте дополнительных копий лицензии GNU
General Public License в нашей системе.</para>
<para>Будьте внимательны с юридическими вопросами! Не делайте из нас
нелегальных распространителей ПО!</para>
</sect1>
</chapter>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= porting-samplem/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Примерный <filename>Makefile</filename></title>
<para>Вот примерный <filename>Makefile</filename>, который можно
использовать при создании нового порта. Обязательно удалите все
дополнительные комментарии (те, которые в скобках)!</para>
<para>Вам рекомендуется следовать этому формату (соблюдая порядок
следования переменных, пустые строки между разделами, и так далее).
Этот формат разработан для того, чтобы важная информация была легко
найдена. Мы рекомендуем вам воспользоваться утилитой <link linkend="porting-portlint">portlint</link> для проверки файла
<filename>Makefile</filename>.</para>
<programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.]
# Created by: Satoshi Asami &lt;asami@FreeBSD.org&gt;
[Необязательная строка <emphasis>Created by:</emphasis> содержит имя
человека, создавшего первоначальную версию порта. Следует отметить,
что за <quote>:</quote> следует пробел, но не символ табуляции. Если
эта строка присутствует, будущие сопровождающие не должны её менять
или удалять, кроме как по запросу первоначального автора.]
# &dollar;FreeBSD&dollar;
[ ^^^^^^^^^ Эта строка будет автоматически заменена на строчку RCS ID
системой SVN при выполнении операции коммита в наше хранилище. При
обновлении порта не приводите эту строку обратно к виду
"&dollar;FreeBSD&dollar;". SVN сделает это автоматически.]
[секция описания собственно порта и основного сервера - сначала всегда
PORTNAME и PORTVERSION, за ним следует CATEGORIES, а затем
MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR.
PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.
Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,
EXTRACT_ONLY.]
PORTNAME= xdvi
PORTVERSION= 18.2
CATEGORIES= print
[не забывайте про завершающую косую черту ("/")!
если вы не используете макросы MASTER_SITE_*]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
[задайте это, если исходный код поставляется не в виде
стандартного файла ".tar.gz"]
EXTRACT_SUFX= .tar.Z
[секция патчей -- может быть пустой]
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
[зависимости -- могут быть пустыми]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме
тех, что перечислены выше]
[Если порт задает вопросы во время этапов настройки, построения,
установки...]
IS_INTERACTIVE= yes
[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]
WRKSRC= ${WRKDIR}/xdvi-new
[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не
придется изменять эту переменную]
PATCH_DIST_STRIP= -p1
[Если порт требует скрипта "configure", генерируемого GNU-версией программы
autoconf]
GNU_CONFIGURE= yes
[Если для построения порту требуется GNU-версия утилиты make, а не
/usr/bin/make...]
USES= gmake
[Если это приложение X и требует запуска "xmkmf -a"...]
USES= imake
[и так далее]
[В правилах ниже используются нестандартные переменные]
MY_FAVORITE_RESPONSE= "yeah, right"
[теперь специальные правила, в порядке их вызова]
pre-fetch:
я что-то выкачиваю, точно
post-patch:
мне кое-что сделать после применения патча, великолепно
pre-install:
и потом еще кое-что перед установкой, ого
[и, наконец, эпилог]
.include &lt;bsd.port.mk&gt;
</programlisting>
</chapter>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= porting-why/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Введение</title>
<para>Коллекция портов &os; является способом, используемым
практически каждым для установки приложений ("портов") на &os;.
Как и почти всё остальное во &os;, эта система в основном является
добровольно поддерживаемым начинанием. Важно иметь это в виду при
чтении данного документа.</para>
<para>Во &os; каждый может прислать новый порт либо изъявить желание
поддерживать существующий порт, если его никто ещё никто не
поддерживает&mdash;вам не нужно иметь никаких особых привилегий на
внесение изменений, чтобы это делать.</para>
</chapter>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= quick-porting/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Быстрое портирование</title>
<para>В этом разделе описано, как создать новый порт на скорую руку.
Во многих случаях этого бывает не достаточно, так что вам нужно будет
прочитать документ дальше.</para>
<para>Во-первых, скачайте оригинальный tar-файл и поместите его в каталог
<varname>DISTDIR</varname>, который по умолчанию есть не что иное, как
<filename>/usr/ports/distfiles</filename>.</para>
<note>
<para>Здесь предполагается, что программное обеспечение компилируется
без проблем как есть, то есть для работы приложения на вашей системе
&os; не потребовалось абсолютно никаких изменений. Если
требовалось что-то изменить, то вам придется обратиться также и к
следующему разделу.</para>
</note>
<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>
<para>Эта настройка включает <quote>режим разработчика</quote>,
в котором отображаются предупреждения при использовании
устаревших конструкций и задействуются некоторые дополнительные
проверки при вызове команды <command>make</command>.</para>
</note>
<sect1 xml:id="porting-makefile">
<title>Создание файла <filename>Makefile</filename></title>
<para>Минимальный <filename>Makefile</filename> будет выглядеть
примерно так:</para>
<programlisting># &dollar;FreeBSD&dollar;
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
.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>Это <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
the screen.
:
(etc.)
WWW: http://www.oneko.org/</programlisting>
</sect2>
<sect2>
<title><filename>pkg-plist</filename></title>
<para>Здесь перечисляются все файлы, устанавливаемые портом. Его
также называют <quote>списком для упаковки</quote>, потому что
пакет генерируется упаковкой файлов, которые здесь указаны.
Имена путей указываются относительно установочного префикса
(обычно <filename>/usr/local</filename>).
Если порт во время установки создает каталоги, убедитесь,
что добавлены строки <literal>@dirrm</literal> для удаления
каталогов при удалении пакета.</para>
<para>Вот маленький пример:</para>
<programlisting>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
@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>
<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

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= security/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,486 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="security">
<title>Безопасность портов</title>
<sect1 xml:id="security-intro">
<title>Почему безопасность так важна</title>
<para>Ошибки в программном обеспечении появляются случайно. Возможно,
самые опасные из них те, что создают уязвимости безопасности. С
технической точки зрения подобные уязвимости должны быть закрыты
путем исправления вызывающих их ошибок. Тем не менее, политики
обработки несущественных ошибок и уязвимостей очень различаются.
</para>
<para>Обычная небольшая ошибка затрагивает только тех пользователей,
которые задействуют некоторые комбинации настроек, активирующие эту
ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую
версию программного обеспечения, свободного от ошибки, но большинство
пользователей не посчитают нужным сразу же произвести обновление,
поскольку эта ошибка никогда у них не проявлялась. Критическая
ошибка, которая может приводить к потере данных, представляет
серьезную проблему. Тем не менее, предусмотрительные пользователи
знают, что большинство возможных происшествий, и среди них программные
ошибки, скорее всего приводят к потере данных, поэтому они выполняют
резервное копирование важных данных; дополнительно, критическая
ошибка будет обнаружена очень скоро.</para>
<para>С уязвимостью безопасности всё иначе. Во-первых, она может
сохраняться необнаруженной целые годы, потому что чаще всего не
вызывает ошибок в работе. Во-вторых, компания злоумышленников
может использовать ее для получения неавторизованного доступа к
уязвимой системе, уничтожить или подменить важные данные; в худшем
случае пользователь даже не заметит нанесенный урон. В-третьих,
взлом уязвимой системы часто упрощает задачу проникновения атакующих
в другие системы, которые не могут быть скомпрометированы иначе.
Таким образом, устранение уязвимости как таковой недостаточно:
следует разослать всем заинтересованным уведомления в наиболее
понятной и исчерпывающей форме, что позволит оценить риск и
предпринять подходящие меры.</para>
</sect1>
<sect1 xml:id="security-fix">
<title>Исправление уязвимостей безопасности</title>
<para>Что касается портов и пакетов, уязвимость безопасности
изначально может появиться в исходном дистрибутиве или файлах
порта. В первом случае, разработчик исходного программного
обеспечения скорее всего сразу же выпустит патч или новую версию,
и вам лишь понадобится сразу обновить порт в соответствии с
исправлением автора. Если исправление по какой-то причине
задерживается, вам следует либо <link linkend="dads-noinstall">пометить
порт как <varname>FORBIDDEN</varname></link>, либо добавить в порт
ваш собственный патч. В случае уязвимости порта просто исправьте
этот порт как можно скорее. В любом случае нужно следовать
<link linkend="port-upgrading">стандартной процедуре отправки вашего
изменения</link>, если вы не обладаете правами на коммит изменения
непосредственно в дерево портов.</para>
<important>
<para>Быть коммиттером портов недостаточно для коммита произвольного
порта. Помните, что обычно у портов есть сопровождающие, мнение
которых вы должны учитывать.</para>
</important>
<para>Пожалуйста, убедитесь, что ревизия порта после закрытия
уязвимости увеличена. Вот как пользователи, обновляющие
установленные пакеты на постоянной основе, увидят, что им нужно
запустить обновление. Кроме того, новый пакет будет собран и
распространен через FTP и WWW зеркала, замещая уязвимый.
Если в процессе исправления уязвимости не было изменено значение
<varname>PORTVERSION</varname>, то должно быть увеличено значение
<varname>PORTREVISION</varname>. Вам следует увеличить значение
<varname>PORTREVISION</varname> после добавления в порт файла с
патчем, но не когда вы обновили порт до последней версии
программного обеспечения, попутно затронув при этом
<varname>PORTVERSION</varname>. За дальнейшей информацией
обращайтесь к
<link linkend="makefile-naming-revepoch">соответствующему
разделу</link>.</para>
</sect1>
<sect1 xml:id="security-notify">
<title>Обеспечение сообщества информацией</title>
<sect2 xml:id="security-notify-vuxml-db">
<title>База данных VuXML</title>
<para>Очень важным и первостепенным шагом при действии как можно
раньше после раскрытия уязвимости является уведомление сообщества
пользователей порта об опасности. Такие уведомления служат двум
целям. Во-первых, в случае действительно серьезной угрозы, будет
посоветовано применить мгновенное воздействие. Например, остановить
затрагиваемый сетевой сервис или даже удалить порт целиком,
пока уязвимость не будет устранена. Во-вторых, масса
пользователей имеет тенденцию обновлять установленные пакеты только от
случая к случаю. Из уведомления они узнают, что
<emphasis>должны</emphasis> обновить пакет без промедления сразу
же после появления исправленной версии.</para>
<para>Учитывая огромное число портов в дереве, невозможно по
каждому случаю выпускать бюллетень безопасности без создания
флуда и потери внимания сообщества к моменту появления
действительно серьезных причин. Поэтому уязвимости безопасности,
обнаруженные в портах, записываются в
<link xlink:href="http://vuxml.freebsd.org/">базу данных
&os; VuXML</link>.
Члены Команды Офицеров Безопасности также отслеживают её на
предмет появления вопросов, требующих их вмешательства.</para>
<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>
<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>Теперь рассмотрим настоящую запись VuXML:</para>
<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;
&lt;name&gt;foo&lt;/name&gt; <co xml:id="co-vx-nam"/>
&lt;name&gt;foo-devel&lt;/name&gt;
&lt;name&gt;ja-foo&lt;/name&gt;
&lt;range&gt;&lt;ge&gt;1.6&lt;/ge&gt;&lt;lt&gt;1.9&lt;/lt&gt;&lt;/range&gt; <co xml:id="co-vx-rng"/>
&lt;range&gt;&lt;ge&gt;2.*&lt;/ge&gt;&lt;lt&gt;2.4_1&lt;/lt&gt;&lt;/range&gt;
&lt;range&gt;&lt;eq&gt;3.0b1&lt;/eq&gt;&lt;/range&gt;
&lt;/package&gt;
&lt;package&gt;
&lt;name&gt;openfoo&lt;/name&gt; <co xml:id="co-vx-nm2"/>
&lt;range&gt;&lt;lt&gt;1.10_7&lt;/lt&gt;&lt;/range&gt; <co xml:id="co-vx-epo"/>
&lt;range&gt;&lt;ge&gt;1.2,1&lt;/ge&gt;&lt;lt&gt;1.3_1,1&lt;/lt&gt;&lt;/range&gt;
&lt;/package&gt;
&lt;/affects&gt;
&lt;description&gt;
&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;J. Random Hacker reports:&lt;/p&gt; <co xml:id="co-vx-bdy"/>
&lt;blockquote
cite="http://j.r.hacker.com/advisories/1"&gt;
&lt;p&gt;Several issues in the Foo software may be exploited
via carefully crafted QUUX requests. These requests will
permit the injection of Bar code, mumble theft, and the
readability of the Foo administrator account.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/body&gt;
&lt;/description&gt;
&lt;references&gt; <co xml:id="co-vx-ref"/>
&lt;freebsdsa&gt;SA-10:75.foo&lt;/freebsdsa&gt; <co xml:id="co-vx-fsa"/>
&lt;freebsdpr&gt;ports/987654&lt;/freebsdpr&gt; <co xml:id="co-vx-fpr"/>
&lt;cvename&gt;CAN-2010-0201&lt;/cvename&gt; <co xml:id="co-vx-cve"/>
&lt;cvename&gt;CAN-2010-0466&lt;/cvename&gt;
&lt;bid&gt;96298&lt;/bid&gt; <co xml:id="co-vx-bid"/>
&lt;certsa&gt;CA-2010-99&lt;/certsa&gt; <co xml:id="co-vx-cts"/>
&lt;certvu&gt;740169&lt;/certvu&gt; <co xml:id="co-vx-ctv"/>
&lt;uscertsa&gt;SA10-99A&lt;/uscertsa&gt; <co xml:id="co-vx-ucs"/>
&lt;uscertta&gt;SA10-99A&lt;/uscertta&gt; <co xml:id="co-vx-uct"/>
&lt;mlist msgid="201075606@hacker.com"&gt;http://marc.theaimsgroup.com/?l=bugtraq&amp;amp;m=203886607825605&lt;/mlist&gt; <co xml:id="co-vx-mls"/>
&lt;url&gt;http://j.r.hacker.com/advisories/1&lt;/url&gt; <co xml:id="co-vx-url"/>
&lt;/references&gt;
&lt;dates&gt;
&lt;discovery&gt;2010-05-25&lt;/discovery&gt; <co xml:id="co-vx-dsc"/>
&lt;entry&gt;2010-07-13&lt;/entry&gt; <co xml:id="co-vx-ent"/>
&lt;modified&gt;2010-09-17&lt;/modified&gt; <co xml:id="co-vx-mod"/>
&lt;/dates&gt;
&lt;/vuln&gt;</programlisting>
<para>Имена тегов должны быть самодокументируемыми, чтобы мы
сфокусировались только на полях, нужных нам для заполнения:</para>
<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-nam">
<para>Здесь перечислены имена затронутых пакетов.
Может быть дано несколько имен, поскольку некоторые пакеты
могут быть основаны на одном главном порте или программном
продукте. Сюда можно включить стабильную ветвь и ветвь
разработки, локализованные версии и подчиненные порты,
зависящие от различного выбора важных вариантов конфигурации,
указанных на этапе построения.</para>
<important>
<para>Поиск всех подобных пакетов при написании записи VuXML
входит в зону вашей ответственности. Имейте в виду, что
<literal>make search name=foo</literal> это ваш друг.
Первичные точки для поиска следующие:</para>
<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>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>
<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>
<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-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-fsa">
<para>Это
<link xlink:href="http://www.freebsd.org/security/#adv">бюллетень
безопасности &os;</link>.</para>
</callout>
<callout arearefs="co-vx-fpr">
<para>Это
<link xlink:href="http://www.freebsd.org/support.html#gnats">сообщение
об ошибке &os;</link>.</para>
</callout>
<callout arearefs="co-vx-cve">
<para>Идентификатор
<link xlink:href="http://www.cve.mitre.org/">MITRE
CVE</link>.</para>
</callout>
<callout arearefs="co-vx-bid">
<para>Это
<link xlink:href="http://www.securityfocus.com/bid">SecurityFocus
Bug ID</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-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-mls">
<para>URL к архивному сообщению в списке рассылки.
Атрибут <literal>msgid</literal> является необязательным
и может указывать на message ID сообщения.</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>
<sect2 xml:id="security-notify-vuxml-testing">
<title>Тестирование ваших изменений в базе данных VuXML</title>
<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>
<note>
<para>Для запуска <command>packaudit</command> вы должны обладать
правами на запись в
<filename>DATABASEDIR</filename>; как правило,
это <filename>/var/db/portaudit</filename>.</para>
<para>Для использования другого каталога присвойте переменной
окружения <filename>DATABASEDIR</filename>
другой путь.</para>
<para>Если вы работаете в каталоге, отличном от
<filename>${PORTSDIR}/security/vuxml</filename>, присвойте
переменной окружения
<filename>VUXMLDIR</filename> путь к каталогу,
в котором находится <filename>vuln.xml</filename>.</para>
</note>
<para>Во-первых, проверьте, нет ли уже записи об этой уязвимости.
Если такая запись есть, она совпадёт с предыдущей версией
пакета <literal>0.65_6</literal>:</para>
<screen>&prompt.user; <userinput>packaudit</userinput>
&prompt.user; <userinput>portaudit clamav-0.65_6</userinput></screen>
<para>Если ничего не найдено, значит вы получили зеленый свет для
добавления новой записи для этой уязвимости.</para>
<screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput>
&prompt.user; <userinput>make newentry</userinput></screen>
<para>Когда вы закончите, проверьте синтаксис и форматирование.</para>
<screen>&prompt.user; <userinput>make validate</userinput></screen>
<note>
<para>Вам понадобится установить по крайней мере один из следующих
пакетов: <package role="port">textproc/libxml2</package>,
<package role="port">textproc/jade</package>.</para>
</note>
<para>Теперь выполните перепостроение базы данных
<command>portaudit</command> из файла VuXML:</para>
<screen>&prompt.user; <userinput>packaudit</userinput></screen>
<para>Чтобы убедиться, что раздел <literal>&lt;affected&gt;</literal>
в вашей записи совпадает с правильными пакетами, выполните
следующую команду:</para>
<screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen>
<note>
<para>Для лучшего понимания синтаксиса этой команды обращайтесь
к &man.portaudit.1;.</para>
</note>
<para>Убедитесь, что ваша запись не производит ложных совпадений
в выводе.</para>
<para>Теперь проверьте, совпадает ли ваша запись с нужными версиями
пакета:</para>
<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>В заключение проверьте, что веб-страница, сформированная из
базы данных VuXML, выглядит как положено:</para>
<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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= slow-porting/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,434 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<title>Медленное портирование</title>
<para>Итак, все оказалось не так уж и просто, и порт потребовал
некоторых модификаций для того, чтобы заставить его работать. В этом
разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он
работал с нашей системой портов.</para>
<sect1 xml:id="slow-work">
<title>Как всё это работает</title>
<para>Во-первых, когда пользователь дает в своем каталоге с портом
команду <command>make</command>, происходит целая череда событий.
Во время чтения этого текста может оказаться полезным иметь файл
<filename>bsd.port.mk</filename> открытым в другом окне, что сильно
поможет в их понимании.</para>
<para>Но не волнуйтесь сильно, если вы не до конца понимаете, что
делается в <filename>bsd.port.mk</filename>, не так уж много людей
его понимает... <!-- smiley --><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>
<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>configure</buildtarget>. Здесь
может выполняться любая из многих различных вещей.</para>
<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>
<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>install</buildtarget>.
В систему копируются файлы, перечисленные в pkg-plist
порта.</para>
</step>
</procedure>
<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>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>
<para>Теперь, когда вы представляете, что происходит, когда
пользователь набирает команду <command>make install</command>,
давайте пройдемся
через шаги, рекомендуемые для создания настоящего порта.</para>
</sect1>
<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>Вам потребуется задать значение переменной
<varname>MASTER_SITES</varname> так, чтобы оно указывало на
местоположение оригинального tar-архива. В файле
<filename>bsd.sites.mk</filename> вы найдёте краткие обозначения
для большинства популярных сайтов. Пожалуйста, используйте эти
сайты&mdash;и соответствующие определения&mdash;везде, где это
возможно, чтобы избежать проблем повторения одной и той же информации
в базе источников. Так как эти сайты со временем меняются, для
всех причастных поддержка становится настоящим кошмаром.</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>Если дистрибутивные файлы вашего порта постоянно меняются по
неизвестным причинам без изменения версий со стороны автора, остаётся
только поместить дистрибутив на вашу домашнюю 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>
<sect1 xml:id="slow-modifying">
<title>Модификация порта</title>
<para>Распакуйте копию дистрибутивного файла в отдельный каталог и
внесите изменения, которые необходимы для того, чтобы порт
компилировался нормально в текущей версии &os;.
<emphasis>Тщательно отслеживайте</emphasis> все, что вы делаете,
этот процесс вам предстоит автоматизировать. Все, включая удаление,
добавление или модификацию в файлах должны будут выполняться
автоматически с помощью скриптов или файлов патчей, когда вы
завершите работу над портом.</para>
<para>Если вашему порту во время компиляции, установки и настройки
требуется довольно много взаимодействовать с пользователем, то
посмотрите на один из классических скриптов
<application>Configure</application> Лэрри Уолла (Larry Wall) и
сделайте сами что-либо подобное. Предназначение новой коллекции
портов - это сделать каждое приложение в стиле
<quote>plug-and-play</quote> настолько, насколько это вообще возможно
для конечного пользователя при минимальном использовании дискового
пространства.</para>
<note>
<para>Если явно не указано обратное, то патчи, скрипты и другие
файлы, которые вы создали и предоставили для Коллекции Портов
&os;, неявно подпадают под стандартные условия лицензии
BSD.</para>
</note>
</sect1>
<sect1 xml:id="slow-patch">
<title>Создание патчей</title>
<para>Файлы, которые добавлялись или изменялись в процессе создания
порта, могут быть выявлены программой &man.diff.1;,
а результат работы этой программы может быть в дальнейшем передан
программе &man.patch.1;. Такое действие с обычным файлом
подразумевает сохранение копии файла с первоначальным содержимым
перед внесением каких-либо изменений.</para>
<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>После того как файл был изменён, используется &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>
<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>
<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>Существует альтернативный упрощённый способ создания
патчей для существующих файлов. Первые шаги те же самые:
создание копии неизменённого файла с расширением
<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>Использование параметра рекурсии (<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>Если нужно удалить файл, сделайте это при выполнении цели
<buildtarget>post-extract</buildtarget>, вместо того чтобы
оформлять это как часть патча.</para>
<para>Простые перемещения могут быть выполнены непосредственно из
<filename>Makefile</filename> порта с использованием &man.sed.1; в
режиме in-place. Это удобно, когда при изменении используется
значение переменной:</para>
<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>
<programlisting>USES= dos2unix</programlisting>
<para>Может быть задан точный список преобразуемых файлов:</para>
<programlisting>USES= dos2unix
DOS2UNIX_FILES= util.c util.h</programlisting>
<para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы
преобразовать группу файлов в разных подкаталогах.
Его параметром является регулярное выражение, совместимое с
&man.find.1;. Подробнее о формате в &man.re.format.7;.
Такой вариант удобен для преобразования всех файлов заданного
расширения. Для примера, преобразуем все исходные файлы,
не затрагивая двоичные файлы:</para>
<programlisting>USES= dos2unix
DOS2UNIX_REGEX= .*\.([ch]|cpp)</programlisting>
<para>Другим вариантом является использование
<varname>DOS2UNIX_GLOB</varname>, который вызывает
<command>find</command> для каждого из перечисленных в нём
элементов.</para>
<programlisting>USES= dos2unix
DOS2UNIX_GLOB= *.c *.cpp *.h</programlisting>
</sect1>
<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>
<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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= special/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= testing/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,197 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
Original revision: r43840
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="testing">
<title>Тестирование вашего порта</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>
<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>portlint</command> (как указано в следующем разделе)
приведёт к автоматическому запуску команды
<command>make describe</command>.</para>
</sect1>
<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>Так как для обнаружения ошибок <command>portlint</command>
использует эвристические методы, то им могут выдаваться и ошибочные
предупреждения. Кроме того, время от времени нечто, отмечаемое как
некорректность, из-за ограничений механизма создания портов не может
быть сделано никак иначе. Если вы сомневаетесь, то лучше всего
спросить в &a.ports;.</para>
</sect1>
<sect1 xml:id="testing-porttools">
<title>Port Tools</title>
<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>
<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>
<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>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> вместо
<varname>PREFIX</varname>. Наличие явно указанных путей можно быстро
проверить следующим образом:</para>
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
<para>Если что-то было установлено за пределами
<varname>PREFIX</varname>, то процесс создания пакета сообщит об
отсутствии файлов.</para>
<para>Это также стоит проверить с использованием поддержки
каталога сборки (смотрите <xref linkend="staging"/>):</para>
<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>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>
<programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>
<para>Путь с использованием <varname>LOCALBASE</varname> имеет больше
шансов оставаться работоспособным, если системный администратор
переместил всё дерево <filename>/usr/local</filename> куда-то в другое
место.</para>
</sect1>
<sect1 xml:id="testing-tinderbox">
<title>Tinderbox</title>
<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>
<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>

View file

@ -0,0 +1,17 @@
#
# Build the Porters Handbook with just the content from this chapter.
#
# $FreeBSD$
#
# Original revision: r43840
#
CHAPTERS= upgrading/chapter.xml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -0,0 +1,300 @@
<?xml version="1.0" encoding="koi8-r"?>
<!--
The FreeBSD Russian Documentation Project
$FreeBSD$
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">
<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>На следующем шаге необходимо выяснить, нет ожидает ли уже это
обновление своей очереди. Для этого у вас есть две возможности.
Существует интерфейс к <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">Просмотра
по одному порту</link>.</para>
<para>Если таких отложенных PR не существует, то на следующем этапе
следует послать сообщение электронной почты человеку, поддерживающему
порт, который выдаётся по команде <command>make maintainer</command>.
Этот человек может уже работать над обновлением, или иметь
причину не обновлять порт прямо сейчас (например, из-за проблем со
стабильностью функционирования новой версии);
вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые
порты перечисляются с адресом сопровождающего
<literal>ports@FreeBSD.org</literal>, который является всего лишь
адресом общего списка рассылки, так что отправка туда сообщений,
скорее всего, в данном случае не поможет.</para>
<para>Если сопровождающий просит вас выполнить обновление, либо
сопровождающий отсутствует, то у вас появляется шанс помочь &os;,
приготовив обновление самим! Пожалуйста, делайте это с использованием
команды &man.diff.1; в основной системе.</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>
<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>Если порт никем не поддерживается, а вы активно его используете,
пожалуйста, подумайте над тем, чтобы добровольно стать его
сопровождающим. Во &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>Прежде чем пользоваться &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>
<note>
<para>Повторяем еще раз - для посылки обновлений существующих портов
используйте утилиту &man.diff.1;, а не &man.shar.1;! Это поможет
понять коммиттерам портов, что именно было изменено.</para>
</note>
<para>Теперь, когда вы проделали всё это, прочитайте о том, как
поддерживать актуальное состояние, в <xref linkend="keeping-up"/>.</para>
<sect1 xml:id="svn-diff">
<title>Использование <application>Subversion</application> для
создания патчей</title>
<para>По возможности присылайте исправления в формате &man.svn.1; diff.
В таком виде их проще использовать по сравнению с разницей между
<quote>старым и новым</quote> каталогами. Так проще
увидеть изменения и обновить их в случае, если что-нибудь
изменилось в Коллекции Портов с тех пор, как вы начали работу,
либо если коммиттер просит что-то исправить.</para>
<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>
<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>
<para>Находясь в рабочем каталоге, вносите любые изменения, которые
обычно делают для порта. При добавлении или удалении файла
используйте <command>svn</command> для отслеживания этих
изменений:</para>
<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>
<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>
<table pgwide="1" frame="none" xml:id="table-svn-up">
<title>Префиксы файлов для <application>Subversion</application>
update</title>
<tgroup cols="2">
<tbody>
<row>
<entry>U</entry>
<entry>Файл обновлен без проблем.</entry>
</row>
<row>
<entry>G</entry>
<entry>Файл обновлен без проблем (вы увидите это только
при работе с удаленным репозиторием).</entry>
</row>
<row>
<entry>M</entry>
<entry>Файл с локальными изменениями, слияние выполнено
без конфликтов.</entry>
</row>
<row>
<entry>C</entry>
<entry>Файл с локальными изменениями, слияние выполнено
с конфликтами.</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Если в результате выполнения <literal>svn update</literal>
отображается <literal>C</literal>, то это означает, что что-то
изменилось в репозитории <application>Subversion</application>
и &man.svn.1; не смогла выполнить
слияние локальных изменений с полученными из репозитория.
В любом случае никогда не помешает просмотреть изменения,
поскольку &man.svn.1; ничего не знает о том, каким должен быть
порт, поэтому эта команда может (и, вероятно, будет) делать
слияние тех изменений, которые не имеют смысла.</para>
<para>Последним шагом является создание унифицированного &man.diff.1;
для полученных изменений:</para>
<screen>&prompt.user; <userinput>svn diff &gt; ../`basename ${PWD}`.diff</userinput></screen>
<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:
AFFECTS: users of portcategory/portname
AUTHOR: Your name &lt;Your email address&gt;
Special instructions</programlisting>
<para>Если вы включаете точные инструкции portmaster или portupgrading,
пожалуйста, убедитесь в правильном экранировании символов внутри
командной оболочки.</para>
<para>Файл <filename>/usr/ports/MOVED</filename> содержит записи
об удалённых или перемещённых портах. Каждая строка в этом
файле состоит из полей: название порта, место, куда он был
перемещён, дата и причина перемещения. Если порт был удалён,
то поле, указывающее новое место, может оставаться незаполненным.
Поля должны разделяться символом <literal>|</literal> (pipe),
как это показано ниже:</para>
<programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting>
<para>Дату следует вводить в формате <literal>YYYY-MM-DD</literal>.
Новые записи следует добавлять в конец файла в хронологическом
порядке.</para>
<para>Если порт был перемещён, но в дальнейшем восстановлен на
прежнем месте, удалите в этом файле строку, содержащую
информацию о перемещении.</para>
<para>Полученные изменения можно проверить командой
<command>Tools/scripts/MOVEDlint.awk</command>.</para>
</sect1>
</chapter>

View file

@ -5,10 +5,10 @@
$FreeBSD$
Original revision: r43793
Original revision: r43811
-->
<row>
<row xml:id="uses-ada">
<entry><literal>ada</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -18,7 +18,7 @@
ÏÐÒÅÄÅÌÑÅÔÓÑ ÚÎÁÞÅÎÉÅ <varname>CC</varname>.</entry>
</row>
<row>
<row xml:id="uses-bison">
<entry><literal>bison</literal></entry>
<entry>(ÎÅÔ), <literal>build</literal>, <literal>run</literal>,
@ -31,7 +31,7 @@
É <literal>both</literal> ÄÌÑ ÓÂÏÒËÉ É ×ÙÐÏÌÎÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-charsetfix">
<entry><literal>charsetfix</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -45,7 +45,7 @@
<varname>WRKSRC</varname>/<filename>Makefile.in</filename>.</entry>
</row>
<row>
<row xml:id="uses-cmake">
<entry><literal>cmake</literal></entry>
<entry>(ÎÅÔ), <literal>outsource</literal>,
@ -60,7 +60,7 @@
<xref linkend="using-cmake"/>.</entry>
</row>
<row>
<row xml:id="uses-compiler">
<entry><literal>compiler</literal></entry>
<entry>(ÎÅÔ), <literal>c++0x</literal>,
@ -118,7 +118,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-cran">
<entry><literal>cran</literal></entry>
<entry>(ÎÅÔ), <literal>auto-plist</literal></entry>
@ -128,7 +128,7 @@
<filename>pkg-plist</filename>.</entry>
</row>
<row>
<row xml:id="uses-desktop-file-utils">
<entry><literal>desktop-file-utils</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -141,7 +141,7 @@
ÐÒÉ ÕÓÔÁÎÏ×ËÅ É ÕÄÁÌÅÎÉÉ ÐÁËÅÔÁ.</entry>
</row>
<row>
<row xml:id="uses-desthack">
<entry><literal>desthack</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -151,7 +151,7 @@
ÜÔÏÇÏ ÎÅ ÄÅÌÁÅÔ.</entry>
</row>
<row>
<row xml:id="uses-display">
<entry><literal>display</literal></entry>
<entry>(ÎÅÔ), ARGS</entry>
@ -166,7 +166,7 @@
É ÏÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ×ÉÒÔÕÁÌØÎÙÊ ÄÉÓÐÌÅÊ.</entry>
</row>
<row>
<row xml:id="uses-dos2unix">
<entry><literal>dos2unix</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -195,7 +195,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-fam">
<entry><literal>fam</literal></entry>
<entry>(ÎÅÔ), fam, gamin</entry>
@ -206,7 +206,7 @@
ÚÁÄÁÔØ WITH_FAM_SYSTEM ÄÌÑ ÕËÁÚÁÎÉÑ Ó×ÏÅÇÏ ÐÒÅÄÐÏÞÔÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-fmake">
<entry><literal>fmake</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -215,7 +215,7 @@
ÚÁ×ÉÓÉÍÏÓÔØ ÄÌÑ ÓÂÏÒËÉ.</entry>
</row>
<row>
<row xml:id="uses-fortran">
<entry><literal>fortran</literal></entry>
<entry><literal>gcc</literal> (default), <literal>ifort</literal></entry>
@ -223,7 +223,7 @@
<entry>éÓÐÏÌØÚÕÅÔ ËÏÍÐÉÌÑÔÏÒ Fortran ÏÔ GNU ÉÌÉ Intel.</entry>
</row>
<row>
<row xml:id="uses-fuse">
<entry><literal>fuse</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -232,7 +232,7 @@
ÑÄÒÁ, × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ×ÅÒÓÉÅÊ &os;.</entry>
</row>
<row>
<row xml:id="uses-gettext">
<entry><literal>gettext</literal></entry>
<entry>(ÎÅÔ), <literal>lib</literal> (ÐÏ ÕÍÏÌÞÁÎÉÀ),
@ -246,7 +246,7 @@
ÏÔ <filename>xgettext</filename> ÄÌÑ ÓÂÏÒËÉ É ×ÙÐÏÌÎÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-gmake">
<entry><literal>gmake</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -257,7 +257,7 @@
<command>make</command> ÄÌÑ ÓÂÏÒËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ.</entry>
</row>
<row>
<row xml:id="uses-iconv">
<entry><literal>iconv</literal></entry>
<entry>(ÎÅÔ), <literal>lib</literal>, <literal>build</literal>,
@ -275,7 +275,7 @@
<xref linkend="using-iconv"/>.</entry>
</row>
<row>
<row xml:id="uses-imake">
<entry><literal>imake</literal></entry>
<entry>(ÎÅÔ), <literal>env</literal>,
@ -288,7 +288,7 @@
<literal>-a</literal> ËÏÍÁÎÄÅ <command>xmkmf</command>.</entry>
</row>
<row>
<row xml:id="uses-kmod">
<entry><literal>kmod</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -333,7 +333,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-libtool">
<entry><literal>libtool</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -343,7 +343,7 @@
ÐÏÒÔÏ×, ÉÓÐÏÌØÚÕÀÝÉÈ <command>libtool</command>.</entry>
</row>
<row>
<row xml:id="uses-lua">
<entry><literal>lua</literal></entry>
<entry>(ÎÅÔ), <literal>XY+</literal>, <literal>XY</literal>,
@ -357,7 +357,7 @@
<literal>51</literal> ÉÌÉ <literal>52+</literal>).</entry>
</row>
<row>
<row xml:id="uses-motif">
<entry><literal>motif</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -370,7 +370,7 @@
<package role="port">x11-toolkits/open-motif</package>.</entry>
</row>
<row>
<row xml:id="uses-ncurses">
<entry><literal>ncurses</literal></entry>
<entry>(ÎÅÔ), <literal>base</literal>,
@ -380,7 +380,7 @@
ÔÅÍ ÓÁÍÙÍ ÚÁÄÁ£Ô ÎÅËÏÔÏÒÙÅ ÎÕÖÎÙÅ ÐÅÒÅÍÅÎÎÙÅ.</entry>
</row>
<row>
<row xml:id="uses-ninja">
<entry><literal>ninja</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -390,7 +390,7 @@
ÄÌÑ ÐÏÄÒÏÂÎÏÇÏ ×Ù×ÏÄÁ ÓÏÏÂÝÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-openal">
<entry><literal>openal</literal></entry>
<entry><literal>al</literal>, <literal>soft</literal> (ÐÏ ÕÍÏÌÞÁÎÉÀ),
@ -404,7 +404,7 @@
(ÐÏ ÕÍÏÌÞÁÎÉÀ) É <literal>si</literal>.</entry>
</row>
<row>
<row xml:id="uses-pathfix">
<entry><literal>pathfix</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -415,7 +415,7 @@
ÐÏÒÔÁ.</entry>
</row>
<row>
<row xml:id="uses-perl5">
<entry><literal>perl5</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -465,7 +465,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-pgsql">
<entry><literal>pgsql</literal></entry>
<entry>(ÎÅÔ), <literal>X.Y</literal>, <literal>X.Y+</literal>,
@ -484,7 +484,7 @@
<command>make -V _USE_PGSQL_DEP</command>.</para></entry>
</row>
<row>
<row xml:id="uses-pkgconfig">
<entry><literal>pkgconfig</literal></entry>
<entry>(ÎÅÔ), <literal>build</literal> (ÐÏ ÕÍÏÌÞÁÎÉÀ),
@ -497,7 +497,7 @@
ÄÌÑ ÓÂÏÒËÉ É ×ÙÐÏÌÎÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-pure">
<entry><literal>pure</literal></entry>
<entry>(ÎÅÔ), <literal>ffi</literal></entry>
@ -510,7 +510,7 @@
×ÙÐÏÌÎÅÎÉÑ.</entry>
</row>
<row>
<row xml:id="uses-qmail">
<entry><literal>qmail</literal></entry>
<entry>(ÎÅÔ), <literal>build</literal>, <literal>run</literal>,
@ -525,7 +525,7 @@
ÚÁÄÁÅÔ ÐÅÒÅÍÅÎÎÙÅ QMAIL ÄÌÑ ÎÕÖÄ ÐÏÒÔÁ.</entry>
</row>
<row>
<row xml:id="uses-qmake">
<entry><literal>qmake</literal></entry>
<entry>(ÎÅÔ), <literal>norecursive</literal>,
@ -536,7 +536,7 @@
<xref linkend="using-qmake"/>.</entry>
</row>
<row>
<row xml:id="uses-readline">
<entry><literal>readline</literal></entry>
<entry>(ÎÅÔ), <literal>port</literal></entry>
@ -549,7 +549,7 @@
<package role="port">devel/readline</package>.</entry>
</row>
<row>
<row xml:id="uses-scons">
<entry><literal>scons</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -558,7 +558,7 @@
<package role="port">devel/scons</package></entry>
</row>
<row>
<row xml:id="uses-shared-mime-info">
<entry><literal>shared-mime-info</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -571,7 +571,7 @@
</entry>
</row>
<row>
<row xml:id="uses-shebangfix">
<entry><literal>shebangfix</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -590,7 +590,7 @@
<varname>lua_OLD_CMD</varname> É <varname>lua_CMD</varname>.</entry>
</row>
<row>
<row xml:id="uses-tcl">
<entry><literal>tcl</literal></entry>
<entry><literal>PORT</literal></entry>
@ -654,7 +654,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-tk">
<entry><literal>tk</literal></entry>
<entry>ôÏ ÖÅ, ÞÔÏ É ÄÌÑ <literal>tcl</literal></entry>
@ -665,7 +665,7 @@
<application>Tcl</application>.</entry>
</row>
<row>
<row xml:id="uses-twisted">
<entry><literal>twisted</literal></entry>
<entry>(ÎÅÔ), <literal>ARGS</literal></entry>
@ -695,7 +695,7 @@
ÐÅÒÅÞÉÓÌÅÎÙ × <filename>Uses/twisted.mk</filename>.</entry>
</row>
<row>
<row xml:id="uses-uidfix">
<entry><literal>uidfix</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -706,7 +706,7 @@
ÐÅÒÅÄ ÄÏÂÁ×ÌÅÎÉÅÍ <literal>NEED_ROOT=yes</literal>.</entry>
</row>
<row>
<row xml:id="uses-uniquefiles">
<entry><literal>uniquefiles</literal></entry>
<entry>(ÎÅÔ), <literal>dirs</literal></entry>
@ -740,7 +740,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-webplugin">
<entry><literal>webplugin</literal></entry>
<entry>(ÎÅÔ), <literal>ARGS</literal></entry>
@ -802,7 +802,7 @@
</itemizedlist></entry>
</row>
<row>
<row xml:id="uses-zenoss">
<entry><literal>zenoss</literal></entry>
<entry>(ÎÅÔ)</entry>
@ -813,7 +813,7 @@
Ë <application>zenpack</application>.</entry>
</row>
<row>
<row xml:id="uses-zope">
<entry><literal>zope</literal></entry>
<entry>(ÎÅÔ)</entry>