MFen r43840 et al.
Break the porters handbook out into individual chapters.
This commit is contained in:
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
ru_RU.KOI8-R/books/porters-handbook
Makefile
appendices
book.xmlchapters.entkeeping-up
makefiles
new-port
pkg-files
plist
porting-dads
porting-samplem
porting-why
quick-porting
security
slow-porting
special
testing
upgrading
uses.xml
|
@ -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"
|
||||
|
|
17
ru_RU.KOI8-R/books/porters-handbook/appendices/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/appendices/Makefile
Normal 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"
|
73
ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml
Normal file
73
ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml
Normal 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
22
ru_RU.KOI8-R/books/porters-handbook/chapters.ent
Normal file
22
ru_RU.KOI8-R/books/porters-handbook/chapters.ent
Normal 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">
|
17
ru_RU.KOI8-R/books/porters-handbook/keeping-up/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/keeping-up/Makefile
Normal 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"
|
155
ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml
Normal file
155
ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml
Normal 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;. (Это часто необходимо для синхронизации с изменениями на более
|
||||
низком технологическом уровне—хотя более корректным было бы
|
||||
получение предупреждений от тех, кто вносит подобные изменения,
|
||||
иногда этот этап пропускается или он просто непрактичен. Кроме того,
|
||||
в некоторых случаях изменения по своей природе весьма незначительны.
|
||||
Мы полагаем, что любой разработчик в таких ситуациях будет
|
||||
руководствоваться здравым смыслом).</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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/makefiles/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/makefiles/Makefile
Normal 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"
|
4315
ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml
Normal file
4315
ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml
Normal file
File diff suppressed because it is too large
Load diff
17
ru_RU.KOI8-R/books/porters-handbook/new-port/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/new-port/Makefile
Normal 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"
|
47
ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml
Normal file
47
ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml
Normal 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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/pkg-files/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/pkg-files/Makefile
Normal 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"
|
204
ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml
Normal file
204
ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml
Normal 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) >/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>${SH} pkg-install ${PKGNAME}
|
||||
PRE-INSTALL</literal>, а второй раз как
|
||||
<literal>${SH} {PKGNAME} POST-INSTALL</literal>.
|
||||
Для распознавания того, в каком режиме запущен скрипт, можно
|
||||
использовать параметр <literal>$2</literal>. Переменная
|
||||
окружения <envar>PKG_PREFIX</envar> будет принимать значение,
|
||||
соответствующее каталогу, в который устанавливается пакет.</para>
|
||||
|
||||
<note>
|
||||
<para>Этот скрипт не запускается автоматически, если вы
|
||||
устанавливаете порт командой <command>make install</command>.
|
||||
Если же вам действительно необходимо его запустить, то запустите
|
||||
его явно из файла <filename>Makefile</filename> порта строкой
|
||||
вида <literal>PKG_PREFIX=${PREFIX} ${SH} $
|
||||
{PKGINSTALL}${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>${SH} pkg-deinstall
|
||||
${PKGNAME} DEINSTALL</literal>, а второй раз как
|
||||
<literal>${SH} pkg-deinstall ${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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/plist/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/plist/Makefile
Normal 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"
|
284
ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml
Normal file
284
ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml
Normal 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> — это список
|
||||
упаковки, который доступен в Коллекции Портов или как файл
|
||||
<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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/porting-dads/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/porting-dads/Makefile
Normal 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"
|
720
ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml
Normal file
720
ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml
Normal 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>${WRKDIRPREFIX}${.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 <sys/param.h></programlisting>
|
||||
|
||||
<para>в соответствующем месте файла <filename>.c</filename>.
|
||||
<literal>__FreeBSD__</literal> определён во всех версиях &os;
|
||||
в качестве старшего номера версии системы. Например, в &os;
|
||||
9.x <literal>__FreeBSD__</literal> определён со значением
|
||||
<literal>9</literal>.</para>
|
||||
|
||||
<programlisting>#if __FreeBSD__ >= 9
|
||||
# if __FreeBSD_version >= 901000
|
||||
/* здесь особый код для версий 9.1+ */
|
||||
# endif
|
||||
#endif</programlisting>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="dads-after-port-mk">
|
||||
<title>Написание чего-либо после
|
||||
<filename>bsd.port.mk</filename></title>
|
||||
|
||||
<para>Не пишите ничего после строки
|
||||
<literal>.include <bsd.port.mk></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} > 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=${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>===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.</programlisting>
|
||||
|
||||
<programlisting>===> 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> — не такая уж проблема
|
||||
в &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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/porting-samplem/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/porting-samplem/Makefile
Normal 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"
|
110
ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml
Normal file
110
ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml
Normal 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 <asami@FreeBSD.org>
|
||||
[Необязательная строка <emphasis>Created by:</emphasis> содержит имя
|
||||
человека, создавшего первоначальную версию порта. Следует отметить,
|
||||
что за <quote>:</quote> следует пробел, но не символ табуляции. Если
|
||||
эта строка присутствует, будущие сопровождающие не должны её менять
|
||||
или удалять, кроме как по запросу первоначального автора.]
|
||||
|
||||
# $FreeBSD$
|
||||
[ ^^^^^^^^^ Эта строка будет автоматически заменена на строчку RCS ID
|
||||
системой SVN при выполнении операции коммита в наше хранилище. При
|
||||
обновлении порта не приводите эту строку обратно к виду
|
||||
"$FreeBSD$". 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 <bsd.port.mk>
|
||||
</programlisting>
|
||||
</chapter>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/porting-why/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/porting-why/Makefile
Normal 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"
|
25
ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml
Normal file
25
ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml
Normal 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; каждый может прислать новый порт либо изъявить желание
|
||||
поддерживать существующий порт, если его никто ещё никто не
|
||||
поддерживает—вам не нужно иметь никаких особых привилегий на
|
||||
внесение изменений, чтобы это делать.</para>
|
||||
</chapter>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/quick-porting/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/quick-porting/Makefile
Normal 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"
|
407
ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml
Normal file
407
ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml
Normal 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># $FreeBSD$
|
||||
|
||||
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 <bsd.port.mk></programlisting>
|
||||
|
||||
<note>
|
||||
<para>В некоторых случаях в заголовке <filename>Makefile</filename>
|
||||
существующего порта могут содержаться дополнительные строки,
|
||||
такие как название порта и дата его создания.
|
||||
Эта дополнительная информация была объявлена устаревшей
|
||||
и находится в процессе удаления.</para>
|
||||
</note>
|
||||
|
||||
<para>Посмотрим, сможете ли вы его понять. Не обращайте внимание на
|
||||
содержимое строчки <literal>$FreeBSD$</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` > 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:
|
||||
<категория>/<название порта> <краткое
|
||||
описание порта></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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/security/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/security/Makefile
Normal 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"
|
486
ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml
Normal file
486
ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml
Normal 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 обрамляются в угловые скобки. Каждый открывающий
|
||||
<tag> должен иметь совпадающий закрывающий </tag>.
|
||||
Теги могут быть вложенными. При вложенности внутренние теги
|
||||
должны быть закрыты до закрытия внешних. Существует иерархия
|
||||
тегов, т.е. более сложные правила вкладывания тегов. Это
|
||||
похоже на HTML. Основное отличие в расширяемости XML,
|
||||
т.е. в определении собственных тегов. Из-за своей характерной
|
||||
структуры XML придает форму разрозненным данным. В частности,
|
||||
XML подходит для разметки описаний уязвимостей безопасности.</para>
|
||||
|
||||
<para>Теперь рассмотрим настоящую запись VuXML:</para>
|
||||
|
||||
<programlisting><vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <co xml:id="co-vx-vid"/>
|
||||
<topic>Several vulnerabilities found in Foo</topic> <co xml:id="co-vx-top"/>
|
||||
<affects>
|
||||
<package>
|
||||
<name>foo</name> <co xml:id="co-vx-nam"/>
|
||||
<name>foo-devel</name>
|
||||
<name>ja-foo</name>
|
||||
<range><ge>1.6</ge><lt>1.9</lt></range> <co xml:id="co-vx-rng"/>
|
||||
<range><ge>2.*</ge><lt>2.4_1</lt></range>
|
||||
<range><eq>3.0b1</eq></range>
|
||||
</package>
|
||||
<package>
|
||||
<name>openfoo</name> <co xml:id="co-vx-nm2"/>
|
||||
<range><lt>1.10_7</lt></range> <co xml:id="co-vx-epo"/>
|
||||
<range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
|
||||
</package>
|
||||
</affects>
|
||||
<description>
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<p>J. Random Hacker reports:</p> <co xml:id="co-vx-bdy"/>
|
||||
<blockquote
|
||||
cite="http://j.r.hacker.com/advisories/1">
|
||||
<p>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.</p>
|
||||
</blockquote>
|
||||
</body>
|
||||
</description>
|
||||
<references> <co xml:id="co-vx-ref"/>
|
||||
<freebsdsa>SA-10:75.foo</freebsdsa> <co xml:id="co-vx-fsa"/>
|
||||
<freebsdpr>ports/987654</freebsdpr> <co xml:id="co-vx-fpr"/>
|
||||
<cvename>CAN-2010-0201</cvename> <co xml:id="co-vx-cve"/>
|
||||
<cvename>CAN-2010-0466</cvename>
|
||||
<bid>96298</bid> <co xml:id="co-vx-bid"/>
|
||||
<certsa>CA-2010-99</certsa> <co xml:id="co-vx-cts"/>
|
||||
<certvu>740169</certvu> <co xml:id="co-vx-ctv"/>
|
||||
<uscertsa>SA10-99A</uscertsa> <co xml:id="co-vx-ucs"/>
|
||||
<uscertta>SA10-99A</uscertta> <co xml:id="co-vx-uct"/>
|
||||
<mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <co xml:id="co-vx-mls"/>
|
||||
<url>http://j.r.hacker.com/advisories/1</url> <co xml:id="co-vx-url"/>
|
||||
</references>
|
||||
<dates>
|
||||
<discovery>2010-05-25</discovery> <co xml:id="co-vx-dsc"/>
|
||||
<entry>2010-07-13</entry> <co xml:id="co-vx-ent"/>
|
||||
<modified>2010-09-17</modified> <co xml:id="co-vx-mod"/>
|
||||
</dates>
|
||||
</vuln></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></literal>, <literal><le></literal>,
|
||||
<literal><eq></literal>, <literal><ge></literal>,
|
||||
и <literal><gt></literal>. Диапазоны внесённых версий
|
||||
не должны пересекаться.</para>
|
||||
|
||||
<para>В спецификации диапазонов <literal>*</literal> (звёздочка)
|
||||
означает наименьший номер версии. В частности,
|
||||
<literal>2.*</literal> меньше, чем <literal>2.a</literal>.
|
||||
Поэтому звездочка может быть использована в диапазоне для
|
||||
совпадения со всеми возможными <literal>alpha</literal>,
|
||||
<literal>beta</literal> и <literal>RC</literal> версиями.
|
||||
Как вариант,
|
||||
<literal><ge>2.*</ge><lt>3.*</lt></literal>
|
||||
выборочно совпадет с версией <literal>2.x</literal>, а
|
||||
<literal><ge>2.0</ge><lt>3.0</lt></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><affected></literal>.
|
||||
Это можно использовать, если некоторые программные продукты
|
||||
(скажем, FooBar, FreeBar and OpenBar) являются производными
|
||||
от общей кодовой базы и всё еще совместно используют её ошибки
|
||||
и уязвимости. Имейте в виду отличие от перечисления
|
||||
множественных имён в одном разделе <package>.</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><p></literal> и <literal></p></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><affected></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<0.65_7)
|
||||
Type of problem: clamav remote denial-of-service.
|
||||
Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
|
||||
|
||||
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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/slow-porting/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/slow-porting/Makefile
Normal 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"
|
434
ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml
Normal file
434
ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml
Normal 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>:-></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> вы найдёте краткие обозначения
|
||||
для большинства популярных сайтов. Пожалуйста, используйте эти
|
||||
сайты—и соответствующие определения—везде, где это
|
||||
возможно, чтобы избежать проблем повторения одной и той же информации
|
||||
в базе источников. Так как эти сайты со временем меняются, для
|
||||
всех причастных поддержка становится настоящим кошмаром.</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> > 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> > 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>$</literal>), и обычно начинаются с
|
||||
<literal>$Id</literal> или
|
||||
<literal>$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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/special/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/special/Makefile
Normal 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"
|
5060
ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml
Normal file
5060
ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml
Normal file
File diff suppressed because it is too large
Load diff
17
ru_RU.KOI8-R/books/porters-handbook/testing/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/testing/Makefile
Normal 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"
|
197
ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml
Normal file
197
ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml
Normal 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>${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 && make check-orphans && 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>${LOCALBASE}</literal>:</para>
|
||||
|
||||
<programlisting>-DPAGER=\"${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>
|
||||
|
17
ru_RU.KOI8-R/books/porters-handbook/upgrading/Makefile
Normal file
17
ru_RU.KOI8-R/books/porters-handbook/upgrading/Makefile
Normal 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"
|
300
ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml
Normal file
300
ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml
Normal 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 > 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>—это одобряемый способ
|
||||
заставить 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>
|
||||
— это общедоступный сервер
|
||||
<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 > ../`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 <Your email address>
|
||||
|
||||
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>
|
||||
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue