16167 lines
575 KiB
XML
16167 lines
575 KiB
XML
<?xml version="1.0" encoding="koi8-r"?>
|
||
<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN"
|
||
"../../../share/xml/freebsd45.dtd">
|
||
|
||
<!--
|
||
The FreeBSD Russian Documentation Project
|
||
|
||
$FreeBSD$
|
||
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/book.xml,v 1.136 2006/10/20 09:25:00 marck Exp $
|
||
|
||
Original revision: r39245
|
||
-->
|
||
|
||
<book lang="ru">
|
||
<bookinfo>
|
||
<title>Руководство FreeBSD по созданию портов</title>
|
||
|
||
<authorgroup>
|
||
<corpauthor>The FreeBSD Documentation Project</corpauthor>
|
||
</authorgroup>
|
||
|
||
<pubdate>Апрель 2000</pubdate>
|
||
|
||
<copyright>
|
||
<year>2000</year>
|
||
<year>2001</year>
|
||
<year>2002</year>
|
||
<year>2003</year>
|
||
<year>2004</year>
|
||
<year>2005</year>
|
||
<year>2006</year>
|
||
<year>2007</year>
|
||
<year>2008</year>
|
||
<year>2009</year>
|
||
<year>2010</year>
|
||
<year>2011</year>
|
||
<year>2012</year>
|
||
<holder role="mailto:doc@FreeBSD.org">
|
||
The FreeBSD Documentation Project</holder>
|
||
</copyright>
|
||
|
||
&trademarks;
|
||
|
||
&legalnotice;
|
||
|
||
<releaseinfo>$FreeBSD$</releaseinfo>
|
||
</bookinfo>
|
||
|
||
<chapter id="why-port">
|
||
<title>Введение</title>
|
||
|
||
<para>Коллекция портов FreeBSD является способом, используемым
|
||
практически каждым для установки приложений ("портов") на FreeBSD.
|
||
Как и почти всё остальное во FreeBSD, эта система в основном является
|
||
добровольно поддерживаемым начинанием. Важно иметь это в виду при
|
||
чтении данного документа.</para>
|
||
|
||
<para>Во FreeBSD любой может прислать новый порт либо изъявить желание
|
||
поддерживать существующий порт, если его никто ещё никто не
|
||
поддерживает—вам не нужно иметь никаких особых привилегий на
|
||
внесение изменений, чтобы это делать.</para>
|
||
</chapter>
|
||
|
||
<chapter id="own-port">
|
||
<title>Как самому сделать новый порт</title>
|
||
|
||
<para>Итак, вы интересуетесь, как создать собственный порт или
|
||
обновить существующий? Великолепно!</para>
|
||
|
||
<para>Ниже находятся некоторые указания по созданию нового порта для
|
||
FreeBSD. Если вы хотите обновить существующий порт, вы должны
|
||
прочесть их, а затем <xref linkend="port-upgrading"/>.</para>
|
||
|
||
<para>Если этот документ недостаточно подробен, вы должны обратиться к
|
||
файлу <filename>/usr/ports/Mk/bsd.port.mk</filename>, который
|
||
включается в make-файл каждого порта. Он хорошо прокомментирован, и
|
||
даже если вы не занимаетесь хакингом make-файлов каждодневно, из него
|
||
вы сможете узнать много нового. Кроме того, конкретные вопросы можно
|
||
задать, послав письмо на адрес &a.ports;.</para>
|
||
|
||
<note>
|
||
<para>Только часть переменных
|
||
(<makevar><replaceable>VAR</replaceable></makevar>), которые могут быть
|
||
переопределены, описаны в этом документе. Большинство (если не все)
|
||
описаны в начале файла <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>
|
||
Ищете, с чего бы начать попроще? Посмотрите на <ulink
|
||
url="http://wiki.freebsd.org/WantedPorts">перечень запрошенных
|
||
портов</ulink>, есть ли там такие, над которыми вы можете работать.
|
||
</para>
|
||
</chapter>
|
||
|
||
<chapter id="quick-porting">
|
||
<title>Быстрое портирование</title>
|
||
|
||
<para>В этом разделе описано, как создать новый порт на скорую руку.
|
||
Во многих случаях этого бывает не достаточно, так что вам нужно будет
|
||
прочитать документ дальше.</para>
|
||
|
||
<para>Во-первых, скачайте оригинальный tar-файл и поместите его в каталог
|
||
<makevar>DISTDIR</makevar>, который по умолчанию есть не что иное, как
|
||
<filename>/usr/ports/distfiles</filename>.</para>
|
||
|
||
<note>
|
||
<para>Здесь предполагается, что программное обеспечение компилируется
|
||
без проблем как есть, то есть для работы приложения на вашей системе
|
||
FreeBSD не потребовалось абсолютно никаких изменений. Если
|
||
требовалось что-то изменить, то вам придется обратиться также и к
|
||
следующему разделу.</para>
|
||
</note>
|
||
|
||
<sect1 id="porting-makefile">
|
||
<title>Создание файла <filename>Makefile</filename></title>
|
||
|
||
<para>Минимальный <filename>Makefile</filename> будет выглядеть
|
||
примерно так:</para>
|
||
|
||
<programlisting># New ports collection makefile for: oneko
|
||
# Date created: 5 December 1994
|
||
# Whom: asami
|
||
#
|
||
# $FreeBSD$
|
||
#
|
||
|
||
PORTNAME= oneko
|
||
PORTVERSION= 1.1b
|
||
CATEGORIES= games
|
||
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
|
||
|
||
MAINTAINER= asami@FreeBSD.org
|
||
|
||
MAN1= oneko.1
|
||
MANCOMPRESSED= yes
|
||
USE_IMAKE= yes
|
||
|
||
.include <bsd.port.mk></programlisting>
|
||
|
||
<para>Посмотрим, сможете ли вы его понять. Не обращайте внимание на
|
||
содержимое строчки <literal>$FreeBSD$</literal>, она
|
||
будет заполнена автоматически системой SVN, когда порт будет
|
||
импортирован в наше дерево портов. Вы можете найти более подробный
|
||
пример в разделе <link linkend="porting-samplem">пример
|
||
Makefile</link>.</para>
|
||
</sect1>
|
||
|
||
<sect1 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>; слишком часто они не являются кратким
|
||
описанием порта или имеют неудобный формат (например, страницы
|
||
справочника выровнены пробелами). Если портируемое приложение
|
||
имеет официальную страничку Интернет, укажите ее здесь.
|
||
Перед <emphasis>одним</emphasis> из сайтов добавьте слово
|
||
<literal>WWW:</literal> для того, чтобы вспомогательные утилиты
|
||
работали правильно.</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>).
|
||
Если вы используете переменные
|
||
<makevar>MAN<replaceable>n</replaceable></makevar> (а вы должны
|
||
это делать), то указывать страницы справочника здесь не
|
||
нужно. Если порт во время установки создает каталоги, убедитесь,
|
||
что добавили строку <literal>@dirrm</literal> для удаления
|
||
каталогов при удалении пакета.</para>
|
||
|
||
<para>Вот маленький пример:</para>
|
||
|
||
<programlisting>bin/oneko
|
||
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.1; с подробным описанием формата списка
|
||
упаковки.</para>
|
||
|
||
<note>
|
||
<para>Рекомендуется, чтобы имена файлов в этом списке были
|
||
отсортированы в алфавитном порядке. Это позволит значительно
|
||
облегчить сверку изменений при обновлении порта.</para>
|
||
</note>
|
||
|
||
<note>
|
||
<para>Создание списка упаковки вручную может оказаться весьма
|
||
трудоёмкой задачей. Если порт устанавливает большое количество
|
||
файлов, раздел об <link
|
||
linkend="plist-autoplist">автоматическом построении списка
|
||
упаковки</link> может помочь сэкономить время.</para>
|
||
</note>
|
||
|
||
<para>Существует только одно исключение, когда у порта может
|
||
отсутствовать <filename>pkg-plist</filename>. Если порт
|
||
устанавливает лишь несколько файлов, а возможно, и каталогов, то
|
||
они могут быть перечислены в переменных
|
||
<makevar>PLIST_FILES</makevar> и <makevar>PLIST_DIRS</makevar>,
|
||
соответственно, внутри файла <filename>Makefile</filename> порта.
|
||
К примеру, мы можем обойтись без файла
|
||
<filename>pkg-plist</filename> у приведённого выше порта
|
||
<filename>oneko</filename>, добавив следующие строки в
|
||
<filename>Makefile</filename>:</para>
|
||
|
||
<programlisting>PLIST_FILES= bin/oneko \
|
||
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>Конечно, переменная <makevar>PLIST_DIRS</makevar> не должна
|
||
задаваться, если порт не устанавливает никаких каталогов.</para>
|
||
|
||
<para>Обратной стороной такого способа перечисления файлов и
|
||
каталогов порта является невозможность использования
|
||
последовательностей команд, описанных в &man.pkg.create.1;.
|
||
Поэтому он подходит для простых портов, что делает их ещё более
|
||
простыми. Одновременно с этим положительным моментом является
|
||
уменьшение количества файлов в коллекции портов. Пожалуйста,
|
||
подумайте над использованием этой техники, прежде чем создавать
|
||
<filename>pkg-plist</filename>.</para>
|
||
|
||
<para>Далее мы увидим, как можно использовать файлы
|
||
<filename>pkg-plist</filename> и <makevar>PLIST_FILES</makevar>
|
||
выполнения <link linkend="plist">более сложных
|
||
задач</link>.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-checksum">
|
||
<title>Создание файла с контрольной суммой</title>
|
||
|
||
<para>Просто введите команду <command>make makesum</command>.
|
||
Правила утилиты make автоматически сгенерируют файл
|
||
<filename>distinfo</filename>.</para>
|
||
|
||
<para>Если у извлекаемого файла регулярно меняется контрольная
|
||
сумма и вы не сомневаетесь в надежности источника (т.е. он получен
|
||
из CD производителя, либо ежедневно обновляется документация), то вы
|
||
должны указать эти файлы в переменной <makevar>IGNOREFILES</makevar>.
|
||
Тогда контрольная сумма при выполнении <command>make makesum</command>
|
||
для этого файла создаваться не будет, а вместо этого для него будет
|
||
установлено значение <literal>IGNORE</literal>.</para>
|
||
</sect1>
|
||
|
||
<sect1 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>Ваш порт может быть переустановлен множество раз с помощью
|
||
указания цели <maketarget>reinstall</maketarget></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Ваш порт <link linkend="plist-cleaning">подчищает</link>
|
||
за собой после своего удаления</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<procedure>
|
||
<title>Рекомендуемый порядок проверки</title>
|
||
|
||
<step>
|
||
<para><command>make install</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make package</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make deinstall</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>pkg_add <replaceable>package-name</replaceable>
|
||
</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make deinstall</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make reinstall</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make package</command></para>
|
||
</step>
|
||
|
||
<step>
|
||
<para><command>make readme</command></para>
|
||
</step>
|
||
</procedure>
|
||
|
||
<para>Проверьте, что ни на шаге <maketarget>package</maketarget>, ни на
|
||
шаге <maketarget>deinstall</maketarget> не выдается никаких
|
||
предупреждений. После выполнения шага 3 проверьте, что все новые
|
||
каталоги были успешно удалены. Также попробуйте запустить
|
||
программное обеспечение после выполнения шага 4, чтобы убедиться, что
|
||
оно работает правильно при установке из пакета.</para>
|
||
|
||
<para>Наиболее основательным способом автоматизации этих шагов является
|
||
установка <application>ports tinderbox</application>. Это
|
||
обеспечивает <literal>jails</literal>, в которых вы можете проверять
|
||
все вышеуказанные шаги без изменения состояния в вашей основной
|
||
системе. Для получения дополнительной информации смотрите
|
||
<filename>ports/ports-mgmt/tinderbox</filename>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-portlint">
|
||
<title>Проверка вашего порта утилитой
|
||
<command>portlint</command></title>
|
||
|
||
<para>Будьте добры, пользуйтесь утилитой <command>portlint</command>
|
||
для проверки того, что ваш порт соответствует нашим рекомендациям.
|
||
Программа <filename role="package">ports-mgmt/portlint</filename>
|
||
является частью Коллекции
|
||
Портов. В частности, вы можете захотеть проверить, правильно ли
|
||
сформирован файл <link linkend="porting-samplem">Makefile</link> и
|
||
соответствующим ли образом именован <link
|
||
linkend="porting-pkgname">пакет</link>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-submitting">
|
||
<title>Посылка нового порта</title>
|
||
|
||
<para>Перед посылкой нового порта удостоверьтесь, что вы прочитали
|
||
раздел о том, что <link
|
||
linkend="porting-dads">можно и нельзя</link> делать.</para>
|
||
|
||
<para>Теперь, когда вы счастливы от своего первого порта, единственное,
|
||
что осталось сделать, это включить его в основное дерево портов
|
||
&os; и осчастливить этим всех остальных. Нам не нужен ни ваш
|
||
каталог <filename>work</filename>, ни пакет
|
||
<filename>pkgname.tgz</filename>, так что удалите их прямо сейчас.
|
||
Затем (предположим, что ваш порт зовут oneko) перейдите в каталог
|
||
выше, там, где находится каталог <literal>oneko</literal>, и наберите
|
||
следующее: <command>shar `find oneko` > oneko.shar</command></para>
|
||
|
||
<para>Включите ваш файл <literal>oneko.shar</literal>
|
||
в сообщение об ошибке и пошлите
|
||
его с помощью программы &man.send-pr.1; (обратитесь к разделу <ulink
|
||
url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">
|
||
Сообщения об ошибках и общие замечания</ulink> для получения подробной
|
||
информации о программе &man.send-pr.1;). Не забудьте
|
||
указать в сообщении категорию <literal>ports</literal> и класс
|
||
<literal>change-request</literal> (Не указывайте, что сообщение
|
||
имеет статус <literal>confidential</literal>!). Добавьте также
|
||
краткое описание программы, порт которой вы создали, в раздел
|
||
<quote>Description</quote> отправляемого PR (например, содержимое
|
||
<makevar>COMMENT</makevar> в сокращенном виде) и сам файл в виде архива
|
||
shar, поместив его в раздел <quote>Fix</quote>.</para>
|
||
|
||
<note>
|
||
<para>Вы можете значительно облегчить нашу работу, если в тему
|
||
сообщения о проблеме поместите хорошее описание. Мы рекомендуем
|
||
нечто вроде <quote>New port: <категория>/<название
|
||
порта> <краткое описание порта></quote> для новых портов.
|
||
Если вы следуете этой схеме, то шансы на то, что на ваше PR вскоре
|
||
кто-то взглянет, гораздо выше.</para>
|
||
</note>
|
||
|
||
<para>Повторим ещё раз, что <emphasis>не нужно включать ни оригинальный
|
||
файл с дистрибутивом, ни каталог <filename>work</filename>,
|
||
ни пакет, построенный вами командой
|
||
<command>make package</command></emphasis>; для новых портов
|
||
используйте &man.shar.1;, но не &man.diff.1;.</para>
|
||
|
||
<para>После того как вы послали порт, пожалуйста, потерпите.
|
||
Иногда включение нового порта во &os; может занять до нескольких
|
||
месяцев, а иногда всего несколько дней. <ulink
|
||
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
|
||
Здесь</ulink> вы можете найти список PR для портов ожидающих своей
|
||
очереди для включения во &os;.</para>
|
||
|
||
<para>Мы рассмотрим ваш порт, при необходимости вернём его обратно, а
|
||
затем включим порт в наше дерево. Ваше имя также появится в списке
|
||
<ulink url="&url.articles.contributors;/contrib-additional.html">
|
||
Дополнительных контрибуторов проекта FreeBSD</ulink> и других
|
||
файлах. Разве это не великолепно?!? <!-- smiley -->:-)</para>
|
||
</sect1>
|
||
</chapter>
|
||
|
||
<chapter id="slow">
|
||
<title>Медленное портирование</title>
|
||
|
||
<para>Итак, все оказалось не так уж и просто, и порт потребовал
|
||
некоторых модификаций для того, чтобы заставить его работать. В этом
|
||
разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он
|
||
работал с нашей системой портов.</para>
|
||
|
||
<sect1 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>Запускается цель <maketarget>fetch</maketarget>. Цель
|
||
<maketarget>fetch</maketarget> отвечает за то, что архив исходных
|
||
текстов имеется в наличии локально в каталоге
|
||
<makevar>DISTDIR</makevar>. Если цель
|
||
<maketarget>fetch</maketarget> не может найти требуемые файлы в
|
||
каталоге <makevar>DISTDIR</makevar>, то он будет искаться по
|
||
указателю URL <makevar>MASTER_SITES</makevar>, который
|
||
устанавливается в Makefile, а также на нашем основном FTP-сервере
|
||
по адресу <ulink
|
||
url="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/"></ulink>,
|
||
куда мы по возможности помещаем дистрибутивные файлы для архива.
|
||
Затем она попытается сгрузить указанный файл с помощью
|
||
<makevar>FETCH</makevar>, полагая, что запрашивающая машина имеет
|
||
прямое подключение к Интернет. Если файл скачается удачно, то
|
||
он будет помещен в каталог <makevar>DISTDIR</makevar> для
|
||
последующего использования и обработки.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Выполняется цель <maketarget>extract</maketarget>. Она ищет
|
||
дистрибутивный файл порта (как правило, tar-архив
|
||
<command>gzip</command>) в
|
||
каталоге <makevar>DISTDIR</makevar> и распаковывает его во
|
||
временный каталог, задаваемый переменной
|
||
<makevar>WRKDIR</makevar> (по умолчанию
|
||
<filename>work</filename>).</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Выполняется цель <maketarget>patch</maketarget>. Во-первых,
|
||
применяются все патчи, заданные переменной
|
||
<makevar>PATCHFILES</makevar>. Во-вторых, если какие-либо файлы с
|
||
патчами, носящие имена
|
||
<filename>patch-<replaceable>*</replaceable></filename>, имеются в
|
||
подкаталоге <makevar>PATCHDIR</makevar> (по умолчанию это каталог
|
||
<filename>files</filename>), то они применяются в этот момент в
|
||
алфавитном порядке.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Запускается цель <maketarget>configure</maketarget>. Здесь
|
||
может выполняться любая из многих различных вещей.</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Если существует скрипт
|
||
<filename>scripts/configure</filename>, то он запускается.
|
||
</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если задана переменная <makevar>HAS_CONFIGURE</makevar>
|
||
или <makevar>GNU_CONFIGURE</makevar>, то запускается скрипт
|
||
<filename><makevar>WRKSRC</makevar>/configure</filename>.
|
||
</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если задана переменная <makevar>USE_IMAKE</makevar>,
|
||
то запускается команда <makevar>XMKMF</makevar> (по умолчанию
|
||
это <command>xmkmf -a</command>).</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Выполняется цель <maketarget>build</maketarget>. Она
|
||
отвечает за переход в собственный рабочий каталог порта
|
||
(<makevar>WRKSRC</makevar>) и его построение. Если задана
|
||
переменная <makevar>USE_GMAKE</makevar>, будет использоваться
|
||
GNU-версия утилиты <command>make</command>, в противном случае
|
||
будет использована системная утилита
|
||
<command>make</command>.</para>
|
||
</step>
|
||
</procedure>
|
||
|
||
<para>Выше перечислены стандартные действия. Кроме того, вы сами
|
||
можете определить цели
|
||
<maketarget>pre-<replaceable>что-то</replaceable></maketarget> или
|
||
<maketarget>post-<replaceable>что-то</replaceable></maketarget>,
|
||
или создать скрипты с такими именами в подкаталоге
|
||
<filename>scripts</filename>, и они будут запущены до или после
|
||
выполнения действий по умолчанию.</para>
|
||
|
||
<para>Например, если у вас есть цель
|
||
<maketarget>post-extract</maketarget>, определённая в вашем файле
|
||
<filename>Makefile</filename> и файл <filename>pre-build</filename> в
|
||
подкаталоге
|
||
<filename>scripts</filename>, то после выполнения обычных действий по
|
||
распаковке, будет вызвана цель <maketarget>post-extract</maketarget>
|
||
а скрипт <filename>pre-build</filename> будет выполнен перед
|
||
запуском стандартных правил построения. Рекомендуется использовать
|
||
цели из <filename>Makefile</filename>, если действия достаточно
|
||
просты, потому что в дальнейшем будет проще определить, какие
|
||
нестандартные действия требует порт.</para>
|
||
|
||
<para>Действия по умолчанию выполняются целями
|
||
<maketarget>do-<replaceable>что-то</replaceable></maketarget> из
|
||
<filename>bsd.port.mk</filename>. Например, команды для
|
||
распаковки порта находятся в цели
|
||
<maketarget>do-extract</maketarget>. Если вам не хватает цели по
|
||
умолчанию, вы можете ее исправить, переопределив цель
|
||
<maketarget>do-<replaceable>something</replaceable></maketarget>
|
||
в вашем файле <filename>Makefile</filename>.</para>
|
||
|
||
<note>
|
||
<para><quote>Основные</quote> цели (к примеру,
|
||
<maketarget>extract</maketarget>, <maketarget>configure</maketarget>
|
||
и так далее) не делают ничего больше,
|
||
чем проверяют успешность завершения всех предыдущих шагов и
|
||
вызывают настоящие цели или скрипты, и их не нужно менять. Если
|
||
вам нужно изменить распаковку, исправляйте
|
||
<maketarget>do-extract</maketarget>, но никогда не меняйте способ
|
||
работы <maketarget>extract</maketarget>! Кроме того, цель
|
||
<maketarget>post-deinstall</maketarget> является недействительной
|
||
и не выполняется инфраструктурой портов.</para>
|
||
</note>
|
||
|
||
<para>Теперь вы представляете, что происходит, когда пользователь
|
||
набирает команду <command>make</command>, теперь давайте пройдемся
|
||
через шаги, рекомендуемые для создания настоящего порта.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="slow-sources">
|
||
<title>Получение исходного кода</title>
|
||
|
||
<para>Получите оригинальные исходные тексты (обычно) в виде
|
||
упакованного tar-архива
|
||
(<filename><replaceable>foo</replaceable>.tar.gz</filename> или
|
||
<filename><replaceable>foo</replaceable>.tar.bz2</filename>)
|
||
и скопируйте его в каталог <makevar>DISTDIR</makevar>. Всегда
|
||
используйте исходные тексты <emphasis>основной ветки
|
||
разработки</emphasis> везде, где это возможно.</para>
|
||
|
||
<para>Вам потребуется задать значение переменной
|
||
<makevar>MASTER_SITES</makevar> так, чтобы оно указывало на
|
||
местоположение оригинального tar-архива. В файле
|
||
<filename>bsd.sites.mk</filename> вы найдёте краткие обозначения
|
||
для большинства популярных сайтов. Пожалуйста, используйте эти
|
||
сайты—и соответствующие определения—везде, где это
|
||
возможно, чтобы избежать проблем повторения одной и той же информации
|
||
в базе источников. Так как эти сайты со временем меняются, для
|
||
всех причастных поддержка становится настоящим кошмаром.</para>
|
||
|
||
<para>Если вы не можете найти FTP/HTTP сайт с хорошим подключением к
|
||
сети, или находите только сайты, которые имеют раздражающе
|
||
нестандартные форматы, то можете захотеть поместить копию на надежный
|
||
сервер FTP или HTTP, который вам доступен (например, ваша домашняя
|
||
страница).</para>
|
||
|
||
<para>Если вы не можете найти доступного и надёжного места для
|
||
помещения дистрибутивного файла, то мы сами сможем разместить его на
|
||
сервере <hostid>ftp.FreeBSD.org</hostid>; однако это наименее
|
||
рекомендуемое решение. Дистрибутивный файл должен
|
||
быть помещён в каталог <filename>~/public_distfiles/</filename>
|
||
одного из пользователей машины <hostid>freefall</hostid>. Попросите
|
||
того, кто коммиттил ваш порт, сделать это. Этот человек также задаст
|
||
переменной <makevar>MASTER_SITES</makevar> значение
|
||
<makevar>MASTER_SITE_LOCAL</makevar>, а в переменной
|
||
<makevar>MASTER_SITE_SUBDIR</makevar> укажет своё имя пользователя
|
||
с машины <hostid>freefall</hostid>.</para>
|
||
|
||
<para>Если дистрибутивные файлы вашего порта постоянно меняются по
|
||
неизвестным причинам без изменения версий со стороны автора, остаётся
|
||
только поместить дистрибутив на вашу домашнюю Web-страницу и указать
|
||
её первой в списке <makevar>MASTER_SITES</makevar>. Если можете,
|
||
попытайтесь договориться с автором порта об этом; это действительно
|
||
помогает в достижении некоторого управления исходным кодом.
|
||
Размещение собственной версии поможет избежать появления ошибок у
|
||
пользователей типа <errorname>checksum mismatch</errorname>, а
|
||
также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер.
|
||
Также, если у порта имеется только один основной сервер, то
|
||
рекомендуется поместить архивную копию на свой сайт и указать его в
|
||
списке <makevar>MASTER_SITES</makevar> вторым.</para>
|
||
|
||
<para>Если вашему порту требуются дополнительные `патчи', доступные
|
||
в Интернет, скачайте также и их, поместив в каталог
|
||
<makevar>DISTDIR</makevar>. Не волнуйтесь, если они находятся не
|
||
на том же сайте, откуда взят дистрибутивный архив, мы умеем
|
||
обрабатывать такие ситуации (смотрите описание <link
|
||
linkend="porting-patchfiles">PATCHFILES</link> ниже).</para>
|
||
</sect1>
|
||
|
||
<sect1 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 id="slow-patch">
|
||
<title>Создание патчей</title>
|
||
|
||
<para>Файлы, которые добавлялись или изменялись в процессе создания
|
||
порта, могут быть выявлены вызовом программы &man.diff.1;,
|
||
а результат работы этой программы может быть в дальнейшем передан
|
||
программе &man.patch.1;. Каждый патч, который вы собираетесь
|
||
применить, должен быть сохранен в файл с именем
|
||
<filename>patch-<replaceable>*</replaceable></filename>, где
|
||
<replaceable>*</replaceable> обозначает путь к файлу, к которому
|
||
применяется патч, такой как
|
||
<filename>patch-Imakefile</filename> или
|
||
<filename>patch-src-config.h</filename>. Эти файлы должны находиться в
|
||
каталоге <makevar>PATCHDIR</makevar>
|
||
(как правило, это <filename>files/</filename>),
|
||
откуда они будут взяты автоматически. Все патчи обязаны быть сделаны
|
||
относительно каталога <makevar>WRKSRC</makevar> (как правило,
|
||
это каталог, в который распаковывается исходный архив и где будет
|
||
выполняться построение). Для упрощения внесения изменений и
|
||
обновлений вы должны избегать наличия более чем одного патча для
|
||
одного и того же файла (например, патчей
|
||
<filename>patch-file</filename> и <filename>patch-file2</filename>,
|
||
оба меняющих файл <filename><makevar>WRKSRC</makevar>/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>Не помещайте строки RCS в патчи. SVN будет изменять их при
|
||
помещении файлов в дерево портов, и когда мы будем их оттуда
|
||
извлекать, они будут уже другие, поэтому применение патчей
|
||
окончится неудачей. Строчки 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>Также постарайтесь минимизировать в ваших патчах объем
|
||
нефункциональных изменений с пустыми символами. В мире Открытого
|
||
Исходного Кода является распространенным совместное использование
|
||
проектами больших объемов кодовой базы, но с различными стилями
|
||
и правилами отступов. Если вы берете работающую функциональную
|
||
часть из одного проекта для исправления похожей области в другом,
|
||
то будьте аккуратны, пожалуйста: получаемый однострочный патч
|
||
может быть полон нефункциональных изменений. Это не только
|
||
увеличивает размер репозитория SVN, но также усложняет поиск того,
|
||
что конкретно вызвало проблему и что вы вообще изменили.</para>
|
||
|
||
<para>Если вам нужно удалить файл, то вы можете сделать это при
|
||
выполнении цели <maketarget>post-extract</maketarget> вместо того,
|
||
чтобы оформлять это как часть патча.</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
|
||
@${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure</programlisting>
|
||
|
||
<para>Довольно часто бывают ситуации, когда портируемое программное
|
||
обеспечение, особенно если основной платформой разработки является
|
||
&windows;, использует конвенцию CR/LF для большинства своих исходных
|
||
файлов. Это может быть причиной проблем с дальнейшей упаковкой,
|
||
предупреждениями компилятора, выполнением скриптов
|
||
(<command>/bin/sh^M</command> not found) и так далее. Для быстрой
|
||
преобразования всех файлов из CR/LF просто в LF добавьте
|
||
<literal>USE_DOS2UNIX=yes</literal> в <filename>Makefile</filename>
|
||
порта. Может быть указан перечень преобразуемых файлов:</para>
|
||
|
||
<programlisting>USE_DOS2UNIX= util.c util.h</programlisting>
|
||
|
||
<para>Если вы хотите преобразовать группу файлов в разных подкаталогах,
|
||
то для этого можно использовать <makevar>DOS2UNIX_REGEX</makevar>.
|
||
Его параметром является регулярное выражение, совместимое с
|
||
<command>find</command>. Подробнее о формате в &man.re.format.7;.
|
||
Эта опция используется для преобразования всех файлов заданного
|
||
расширения, к примеру всех исходных файлов, не затрагивая двоичные
|
||
файлы:</para>
|
||
|
||
<programlisting>USE_DOS2UNIX= yes
|
||
DOS2UNIX_REGEX= .*\.(c|cpp|h)</programlisting>
|
||
|
||
<para>Если вы хотите создать патч на основе существующего файла, то вы
|
||
можете его скопировать с расширением <filename>.orig</filename>, а
|
||
затем изменить исходный. Цель<maketarget>makepatch</maketarget>
|
||
запишет соответствующий файл с патчем в каталог
|
||
<filename class="directory">files</filename> данного порта.</para>
|
||
</sect1>
|
||
|
||
<sect1 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 id="slow-user-input">
|
||
<title>Обработка пользовательского ввода</title>
|
||
|
||
<para>Если для построения, конфигурации или установки вашего порта
|
||
требуется некоторый ввод со стороны пользователя, то вы должны задать
|
||
переменную <makevar>IS_INTERACTIVE</makevar> в вашем файле
|
||
<filename>Makefile</filename>. В случае <quote>ночного
|
||
построения</quote> это позволит пропустить
|
||
ваш порт, если пользователь в своем окружении задал переменную
|
||
<envar>BATCH</envar> (и если пользователь установил переменную
|
||
<envar>INTERACTIVE</envar>, то будут строиться
|
||
<emphasis>только</emphasis> порты, которые требуют взаимодействия
|
||
с пользователем. Это сэкономит значительное количество времени на
|
||
части машин, которые постоянно строят порты (смотрите ниже).</para>
|
||
|
||
<para>При наличии разумных ответов на задаваемые вопросы, подходящих по
|
||
умолчанию, также рекомендуется проверять переменную
|
||
<makevar>PACKAGE_BUILDING</makevar> и выключать интерактивный скрипт,
|
||
если он есть. Это позволит нам строить пакеты для помещения на
|
||
компакт-диски и FTP-серверы.</para>
|
||
</sect1>
|
||
</chapter>
|
||
|
||
<chapter id="makefile">
|
||
<title>Настройка файла Makefile</title>
|
||
|
||
<para>Настройка файла <filename>Makefile</filename> достаточно проста, и
|
||
мы снова предполагаем, что перед тем, как начать, вы посмотрите на
|
||
существующие примеры. К тому же в этом руководстве имеется <link
|
||
linkend="porting-samplem">примерный Makefile</link>, так что взгляните
|
||
на него и, пожалуйста, следуйте порядку переменных и разделов в этом
|
||
образце, чтобы облегчить чтение вашего порта другими людьми.</para>
|
||
|
||
<para>Итак, расположим решаемые задачи в порядке их возникновения при
|
||
создании вашего нового файла <filename>Makefile</filename>:</para>
|
||
|
||
<sect1 id="makefile-source">
|
||
<title>Оригинальные исходный код</title>
|
||
|
||
<para>Находится ли он в каталоге <makevar>DISTDIR</makevar> в виде
|
||
стандартного упакованного архиватором <command>gzip</command>
|
||
tar-архива с именем типа
|
||
<filename>foozolix-1.2.tar.gz</filename>? Если это так,
|
||
можно перейти к следующему шагу. Если нет, то вы должны попытаться
|
||
переопределить некоторые из переменных
|
||
<makevar>DISTVERSION</makevar>, <makevar>DISTNAME</makevar>,
|
||
<makevar>EXTRACT_CMD</makevar>,
|
||
<makevar>EXTRACT_BEFORE_ARGS</makevar>,
|
||
<makevar>EXTRACT_AFTER_ARGS</makevar>,
|
||
<makevar>EXTRACT_SUFX</makevar> или <makevar>DISTFILES</makevar> в
|
||
зависимости от того, насколько необычен формат дистрибутивного
|
||
файла.</para>
|
||
|
||
<para>В худшем случае вы можете просто определить свою собственную цель
|
||
<maketarget>do-extract</maketarget> для переопределения действий по
|
||
умолчанию, хотя к этому нужно будет прибегать в очень редких случаях,
|
||
если вообще придётся.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-naming">
|
||
<title>Именование</title>
|
||
|
||
<para>В первой части <filename>Makefile</filename> порта ему даётся
|
||
название, указывается его номер версии и принадлежность к правильной
|
||
категории.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>PORTNAME</makevar> и
|
||
<makevar>PORTVERSION</makevar></title>
|
||
|
||
<para>В переменной <makevar>PORTNAME</makevar> вы должны указать
|
||
основную часть имени вашего порта, а в переменной
|
||
<makevar>PORTVERSION</makevar> - номер версии.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="makefile-naming-revepoch">
|
||
<title><makevar>PORTREVISION</makevar> и
|
||
<makevar>PORTEPOCH</makevar></title>
|
||
|
||
<sect3>
|
||
<title><makevar>PORTREVISION</makevar></title>
|
||
|
||
<para>Переменная <makevar>PORTREVISION</makevar> представляет собой
|
||
монотонно увеличивающееся число, которое обнуляется при каждом
|
||
увеличении значения переменной <makevar>PORTVERSION</makevar> (то
|
||
есть каждый раз, когда создателями выпускается новый официальный
|
||
релиз), и добавляется к имени пакета, если оно не равно нулю.
|
||
Изменения в <makevar>PORTREVISION</makevar> используются
|
||
автоматизированными инструментами (например, &man.pkg.version.1;)
|
||
для определения факта появления нового пакета.</para>
|
||
|
||
<para>Значение <makevar>PORTREVISION</makevar> должно увеличиваться
|
||
каждый раз, когда в порте FreeBSD делаются изменения, которые
|
||
достаточно сильно затрагивают содержимое или структуру
|
||
соответствующего пакета.</para>
|
||
|
||
<para>Примеры случаев, когда значение <makevar>PORTREVISION</makevar>
|
||
должно быть увеличено:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Добавление патчей для исправления уязвимостей,
|
||
ошибок, или добавления новой функциональности в порт.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Изменения в файле <filename>Makefile</filename> порта для
|
||
включения и выключения параметров, определяемых при компиляции
|
||
пакета.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Изменения в списке упаковки или в поведении пакета во
|
||
время его установки (например, изменение скрипта, генерирующего
|
||
начальные данные для пакета, такие, как ssh-ключи для
|
||
хоста).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Увеличение версии динамической библиотеки, от которой
|
||
зависит порт (в этом случае тот, кто попытается установить
|
||
старый пакет после установки более новой версии библиотеки,
|
||
не сможет этого сделать, потому что при этом будет делаться
|
||
поиск старой библиотеки libfoo.x, а не libfoo.(x+1)).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Большие функциональные изменения в дистрибутивном файле
|
||
порта, происходящие без объявлений, и приводящие к большим
|
||
изменениям, то есть изменения в дистрибутиве требуют
|
||
корректировки файла <filename>distinfo</filename> без
|
||
соответствующего изменения <makevar>PORTVERSION</makevar>,
|
||
когда как команда <command>diff -ru</command> между новой
|
||
и старой версиями показывает нетривиальные изменения в
|
||
коде.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Примеры изменений, которые не требуют увеличения переменной
|
||
<makevar>PORTREVISION</makevar>:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Изменения стиля в скелете порта без функциональных изменений
|
||
в пакете.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Изменения в переменной <makevar>MASTER_SITES</makevar> или
|
||
другие функциональные изменения порта, которые не затрагивают
|
||
получающегося пакета.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Тривиальные патчи к дистрибутивному файлу, такие, как
|
||
исправления опечаток, которые не так уж важны, что пользователи
|
||
пакета должны озаботиться обновлением.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Исправления, касающиеся этапа построения, которые делают
|
||
возможным построение пакета, если ранее это было невозможно
|
||
сделать (пока изменения не приводят к изменению работы на любых
|
||
других платформах, на которых порт ранее строился). Так как
|
||
<makevar>PORTREVISION</makevar> отражает содержимое пакета,
|
||
то, если ранее пакет не строился, то нет нужды увеличивать
|
||
<makevar>PORTREVISION</makevar> для отметки изменения.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Правило, которому нужно приблизительно следовать, заключается в
|
||
том, что нужно спрашивать себя, является ли вносимое в порт
|
||
изменение таким, что от него выиграют все (в виде
|
||
усовершенствования, исправления или благодаря тому, что новый
|
||
пакет будет вообще работоспособным), и примите во внимание тот
|
||
факт, что при этом все, кто регулярно обновляют своё дерево портов,
|
||
будут обязаны это сделать. Если это так, то переменная
|
||
<makevar>PORTREVISION</makevar> должна быть увеличена.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title><makevar>PORTEPOCH</makevar></title>
|
||
|
||
<para>Время от времени разработчик программного обеспечения или
|
||
создатель порта FreeBSD делают что-то не так и выпускают версию
|
||
программы, номер которой меньше предыдущей версии. Примером этого
|
||
является порт, название которого меняется с foo-20000801 на foo-1.0
|
||
(изначально это не считалось бы более новой версией, так как
|
||
20000801 численно больше, чем 1).</para>
|
||
|
||
<para>В ситуациях, подобных этой, должно быть увеличено значение
|
||
<makevar>PORTEPOCH</makevar>. Если значение
|
||
<makevar>PORTEPOCH</makevar> не равно нулю, то оно добавляется к
|
||
имени пакета, как описано в разделе выше. Значение
|
||
<makevar>PORTEPOCH</makevar> никогда не должно уменьшаться или
|
||
сбрасываться в ноль, потому что это приведёт к ошибке сравнения с
|
||
пакетом с меньшим номером эпохи (то есть то, что пакет устарел,
|
||
обнаружено не будет): номер новой версии (например,
|
||
<literal>1.0,1</literal> в примере выше) останется меньше, чем
|
||
номер предыдущей версии (20000801), однако суффикс
|
||
<literal>,1</literal> интерпретируется различными
|
||
автоматизированными утилитами особым образом, и окажется больше,
|
||
чем предполагаемый суффикс <literal>,0</literal> более раннего
|
||
пакета).</para>
|
||
|
||
<para>Некорректное уменьшение или сброс <makevar>PORTEPOCH</makevar>
|
||
приводит к печальным последствиям; если вы не поняли, о чём шла
|
||
речь ранее, пожалуйста, всё же разберитесь с этим, либо спросите
|
||
в списках рассылки.</para>
|
||
|
||
<para>Предполагается, что в большинстве портов переменная
|
||
<makevar>PORTEPOCH</makevar> использоваться не будет, но при
|
||
корректном использовании <makevar>PORTVERSION</makevar> может
|
||
появиться необходимость её иметь, если в будущих релизах
|
||
программное обеспечение должно изменить структуру номера версии.
|
||
Однако создателям портов нужно быть внимательными, когда
|
||
разработчик выпускает релиз без официального номера версии —
|
||
эдакие <quote>промежуточные</quote> релизы. Имеется соблазн
|
||
пометить релиз датой его выхода, что может вызвать проблемы, как и
|
||
в примере выше, когда будет выпущен новый
|
||
<quote>официальный</quote> релиз.</para>
|
||
|
||
<para>Например, если промежуточный релиз помечен датой 20000917, а
|
||
предыдущая версия программного обеспечения имела номер 1.2, то
|
||
промежуточному релизу должно быть поставлено в соответствие
|
||
значение <makevar>PORTVERSION</makevar>, равное 1.2.20000917 или
|
||
что-то похожее, но не 20000917, так как последующий релиз, скажем,
|
||
1.3, должен иметь численно большее значение.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Пример использования переменных
|
||
<makevar>PORTREVISION</makevar> и
|
||
<makevar>PORTEPOCH</makevar></title>
|
||
|
||
<para>Выполнен коммит порта <literal>gtkmumble</literal>, версии
|
||
<literal>0.10</literal>, в коллекцию портов.</para>
|
||
|
||
<programlisting>PORTNAME= gtkmumble
|
||
PORTVERSION= 0.10</programlisting>
|
||
|
||
<para>Значение <makevar>PKGNAME</makevar> станет равным
|
||
<literal>gtkmumble-0.10</literal>.</para>
|
||
|
||
<para>Обнаружена брешь в безопасности, исправление которой
|
||
потребовало создания
|
||
локального патча для FreeBSD. Соответственно было увеличено
|
||
значение переменной <makevar>PORTREVISION</makevar>.</para>
|
||
|
||
<programlisting>PORTNAME= gtkmumble
|
||
PORTVERSION= 0.10
|
||
PORTREVISION= 1</programlisting>
|
||
|
||
<para><makevar>PKGNAME</makevar> принимает значение
|
||
<literal>gtkmumble-0.10_1</literal></para>
|
||
|
||
<para>Разработчиком выпущена новая версия с номером
|
||
<literal>0.2</literal> (оказалось, что под номером
|
||
<literal>0.10</literal> автор имел в виду
|
||
<literal>0.1.0</literal>, а не <quote>то, что будет выпущено после
|
||
версии 0.9</quote> - извините, теперь уже поздно). Так как новый
|
||
младший номер версии <literal>2</literal> по значению меньше, чем
|
||
номер предыдущей версии <literal>10</literal>, то должно быть
|
||
увеличено значение <makevar>PORTEPOCH</makevar> для того, чтобы
|
||
заставить распознавать вновь создаваемый пакет как <quote>более
|
||
новый</quote>. Так как это новый релиз программы, то
|
||
<makevar>PORTREVISION</makevar> обнуляется (или удаляется из
|
||
файла <filename>Makefile</filename>).</para>
|
||
|
||
<programlisting>PORTNAME= gtkmumble
|
||
PORTVERSION= 0.2
|
||
PORTEPOCH= 1</programlisting>
|
||
|
||
<para><makevar>PKGNAME</makevar> принимает значение
|
||
<literal>gtkmumble-0.2,1</literal></para>
|
||
|
||
<para>Следующий релиз имеет номер версии 0.3. Так как значение
|
||
переменной <makevar>PORTEPOCH</makevar> никогда не уменьшается, что
|
||
переменные, определяющие версии, теперь выглядят так:</para>
|
||
|
||
<programlisting>PORTNAME= gtkmumble
|
||
PORTVERSION= 0.3
|
||
PORTEPOCH= 1</programlisting>
|
||
|
||
<para><makevar>PKGNAME</makevar> принимает значение
|
||
<literal>gtkmumble-0.3,1</literal></para>
|
||
|
||
<note>
|
||
<para>Если значение <makevar>PORTEPOCH</makevar> этим обновлением
|
||
было бы сброшено в <literal>0</literal>, то кто-нибудь, имеющий
|
||
установленный пакет <literal>gtkmumble-0.10_1</literal>, не
|
||
смог бы опознать пакет <literal>gtkmumble-0.3</literal> как
|
||
более новый, так как <literal>3</literal> было бы меньше, чем
|
||
<literal>10</literal>. Помните, что в первую очередь это
|
||
касается <makevar>PORTEPOCH</makevar>.</para>
|
||
</note>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Переменные <makevar>PKGNAMEPREFIX</makevar>
|
||
и <makevar>PKGNAMESUFFIX</makevar></title>
|
||
|
||
<para>Две необязательные переменные, <makevar>PKGNAMEPREFIX</makevar> и
|
||
<makevar>PKGNAMESUFFIX</makevar>, объединяются со значениями
|
||
<makevar>PORTNAME</makevar> и
|
||
<makevar>PORTVERSION</makevar> для формирования
|
||
<makevar>PKGNAME</makevar> в форме
|
||
<literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>.
|
||
Добейтесь того, чтобы это соответствовало нашим <link
|
||
linkend="porting-pkgname">рекомендациям по правильному выбору
|
||
названий для пакетов</link>. В частности, в переменной
|
||
<makevar>PORTVERSION</makevar> <emphasis>не разрешается</emphasis>
|
||
использование дефиса (<literal>-</literal>). Кроме того, если в
|
||
имени пакета присутствует часть <replaceable>language-</replaceable>
|
||
или <replaceable>-compiled.specifics</replaceable> (смотрите ниже),
|
||
то используйте переменные <makevar>PKGNAMEPREFIX</makevar> и
|
||
<makevar>PKGNAMESUFFIX</makevar>, соответственно. Не делайте их
|
||
частью значения переменной <makevar>PORTNAME</makevar>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>LATEST_LINK</makevar></title>
|
||
|
||
<para><makevar>LATEST_LINK</makevar> задает в процессе построения
|
||
пакета короткое имя ссылки, которые могут использоваться при
|
||
выполнении команды <command>pkg_add -r</command>. Это позволяет,
|
||
к примеру, установить последнюю версию perl, используя
|
||
<command>pkg_add -r perl</command>, без знания точного номера
|
||
версии. Такое имя должно быть уникальным и очевидным для
|
||
пользователей.</para>
|
||
|
||
<para>В некоторых случаях в коллекции портов может присутствовать
|
||
несколько версий программы одновременно. Обе системы, построения
|
||
индексов и построения пакетов, нуждаются в способности их видеть
|
||
как разные, независимые порты, хотя все они могут иметь схожее
|
||
значение для <makevar>PORTNAME</makevar>,
|
||
<makevar>PKGNAMEPREFIX</makevar> и даже
|
||
<makevar>PKGNAMESUFFIX</makevar>. В этих случаях для всех портов
|
||
кроме <quote>главного</quote> следует присвоить различные значения для
|
||
необязательной переменной <makevar>LATEST_LINK</makevar> —
|
||
чтобы получить пример ее использования, смотрите порты
|
||
<filename>lang/gcc46</filename> и <filename>lang/gcc</filename>,
|
||
а также семейство <filename>www/apache*</filename>. При установке
|
||
<makevar>NO_LATEST_LINK</makevar> ссылки не создаются; эта
|
||
необязательная переменная может быть указана во всех версиях,
|
||
кроме <quote>главной</quote>. Обратите
|
||
внимание, как выбирать <quote>главную</quote> версию —
|
||
<quote>самую популярную</quote>, <quote>самую поддерживаемую</quote>,
|
||
<quote>с наименьшими изменениями</quote> и так далее — это
|
||
выходит за рамки рекомендаций этого руководства; мы всего лишь
|
||
сообщаем вам, как указывать версии других портов после того, как
|
||
вы выбрали <quote>главный</quote>.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="porting-pkgname">
|
||
<title>Соглашения по именованию пакетов</title>
|
||
|
||
<para>Далее описаны некоторые соглашения, которым вы должны следовать
|
||
в именовании ваших пакетов. Они были разработаны для облегчения
|
||
просмотра каталога, так как имеется уже тысячи пакетов, а
|
||
пользователи отвернутся от нас, если список не понравится их
|
||
взору!</para>
|
||
|
||
<para>Имя пакета должно иметь вид
|
||
<filename><replaceable><optional>language<optional>_region</optional></optional>-name<optional><optional>-</optional>compiled.specifics</optional>-version.numbers</replaceable></filename>.</para>
|
||
|
||
<para>Имя пакета определяется как
|
||
<literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>.
|
||
Вы должны задавать значения переменных в соответствии с этим
|
||
форматом.</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>FreeBSD пытается поддерживать языки, на которых разговаривают
|
||
её пользователи. Часть <replaceable>language-</replaceable>
|
||
должна быть двухсимвольным сокращением от названия языка по
|
||
стандарту ISO-639, если порт специфичен для конкретного языка.
|
||
Примерами являются <literal>ja</literal> для японского,
|
||
<literal>ru</literal> для русского, <literal>vi</literal> для
|
||
вьетнамского, <literal>zh</literal> для китайского,
|
||
<literal>ko</literal> для корейского и <literal>de</literal> для
|
||
немецкого языков.</para>
|
||
|
||
<para>Если ваш порт специфичен для конкретного региона внутри
|
||
области использования языка, добавьте также двухсимвольный код
|
||
страны. Примерами являются <literal>en_US</literal> для US
|
||
English и <literal>fr_CH</literal> для Swiss French.</para>
|
||
|
||
<para>Часть <replaceable>language-</replaceable> должна задаваться
|
||
в переменной <makevar>PKGNAMEPREFIX</makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Первая буква части <filename>name</filename> должна быть в
|
||
нижнем регистре. (Оставшаяся часть названия может содержать
|
||
буквы в верхнем регистре, так что принимайте решение сами, когда
|
||
преобразуете имя программного пакета, содержащего в имени
|
||
некоторое количество заглавных букв.) Существует традиция
|
||
именовать модули для <literal>Perl 5</literal>, добавляя впереди
|
||
<literal>p5-</literal> и преобразуя пару двоеточий в
|
||
дефис; например, модуль <literal>Data::Dumper</literal> будет
|
||
именоваться <literal>p5-Data-Dumper</literal>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Убедитесь, что имя порта и версия четко отделены и
|
||
размещаются в переменных <makevar>PORTNAME</makevar> и
|
||
<makevar>PORTVERSION</makevar>. Единственная причина, по
|
||
которой <makevar>PORTNAME</makevar> содержит версионную часть,
|
||
это если полученный дистрибутив сам назван таким образом, как
|
||
это сделано для портов <filename>textproc/libxml2</filename>
|
||
или <filename>japanese/kinput2-freewnn</filename>. В противном
|
||
случае <makevar>PORTNAME</makevar> не должен содержать никакой
|
||
информации, указывающей на версию. То, что некоторые порты
|
||
имеют одинаковый <makevar>PORTNAME</makevar>, является вполне
|
||
нормальным, как для портов <filename>www/apache*</filename>;
|
||
в этом случае различные версии (и различные записи в индексе)
|
||
отличаются по значениям <makevar>PKGNAMEPREFIX</makevar>,
|
||
<makevar>PKGNAMESUFFIX</makevar> и
|
||
<makevar>LATEST_LINK</makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если порт может быть построен с различными <link
|
||
linkend="makefile-masterdir">статически заданными значениями по
|
||
умолчанию</link> (обычно это часть имени каталога в семействе
|
||
портов), то часть <replaceable>-compiled.specifics</replaceable>
|
||
должна определять вкомпилированные значения по умолчанию (дефис
|
||
не обязателен). Примерами являются размеры бумаги и
|
||
шрифтов.</para>
|
||
|
||
<para>Часть <replaceable>-compiled.specifics</replaceable> должна
|
||
задаваться в переменной <makevar>PKGNAMESUFFIX</makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Строка с номером версии должна следовать за дефисом
|
||
(<literal>-</literal>) и являться списком разделенных двоеточием
|
||
чисел и букв в нижнем регистре. В частности, не разрешается
|
||
иметь еще один дефис внутри строки с обозначением номера версии.
|
||
Единственным исключением является строчка <literal>pl</literal>
|
||
(означающая <quote>patchlevel</quote>), которая может
|
||
использоваться <emphasis>только</emphasis> тогда, когда у
|
||
программного обеспечения нет старшего и младшего номера версии.
|
||
Если в номер версии программного обеспечения включена строчка
|
||
типа <quote>alpha</quote>, <quote>beta</quote>,
|
||
<quote>rc</quote> или <quote>pre</quote>, возьмите из неё первую
|
||
букву и поставьте её непосредственно после точки. Если после
|
||
таких строк номер версии ещё продолжается, то после буквы должно
|
||
следовать число без дополнительной разделяющей точки.</para>
|
||
|
||
<para>Смысл такого формата заключается в удобстве сортировки портов
|
||
по номеру версии. В частности, следите за тем, чтобы компоненты
|
||
номера версии разделялись точкой, и если там присутствует дата,
|
||
то используйте формат
|
||
<literal>0.0.<replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>, но не
|
||
<literal><replaceable>dd</replaceable>.<replaceable>mm</replaceable>.<replaceable>yyyy</replaceable></literal>
|
||
или не совместимый с проблемой Y2K
|
||
<literal><replaceable>yy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>.
|
||
Добавление к версии префикса <literal>0.0.</literal> является
|
||
важным, в случае если выпущен релиз с присвоением настоящей
|
||
версии, которая в числовом представлении, конечно же, будет
|
||
ниже, чем
|
||
<literal><replaceable>yyyy</replaceable></literal>.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
|
||
<para>Вот несколько (реальных) примеров того, как преобразовать имя из
|
||
оригинального, придуманного авторами, к подходящему для имени
|
||
пакета:</para>
|
||
|
||
<informaltable frame="none" pgwide="1">
|
||
<tgroup cols="6">
|
||
<thead>
|
||
<row>
|
||
<entry>Имя дистрибутива</entry>
|
||
|
||
<entry><makevar>PKGNAMEPREFIX</makevar></entry>
|
||
|
||
<entry><makevar>PORTNAME</makevar></entry>
|
||
|
||
<entry><makevar>PKGNAMESUFFIX</makevar></entry>
|
||
|
||
<entry><makevar>PORTVERSION</makevar></entry>
|
||
|
||
<entry>Обоснование</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>mule-2.2.2</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>mule</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>2.2.2</entry>
|
||
<entry>Изменений не потребовалось</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>EmiClock-1.0.2</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>emiclock</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>1.0.2</entry>
|
||
<entry>Для отдельных программ имена с заглавными буквами
|
||
запрещены</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>rdist-1.3alpha</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>rdist</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>1.3.a</entry>
|
||
<entry>Строчки типа <literal>alpha</literal> запрещены</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>es-0.9-beta1</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>es</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>0.9.b1</entry>
|
||
<entry>Строчки типа <literal>beta</literal> запрещены</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>mailman-2.0rc3</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>mailman</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>2.0.r3</entry>
|
||
<entry>Строчки типа <literal>rc</literal> запрещены</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>v3.3beta021.src</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>tiff</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>3.3</entry>
|
||
<entry>Что это такое было вообще?</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>tvtwm</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>tvtwm</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>pl11</entry>
|
||
<entry>Всегда требуется указание номера версии</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>piewm</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>piewm</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>1.0</entry>
|
||
<entry>Всегда требуется указание номера версии</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>xvgr-2.10pl1</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>xvgr</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>2.10.1</entry>
|
||
<entry><literal>pl</literal> разрешено только при отсутствии
|
||
старшего/младшего номера версии</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>gawk-2.15.6</entry>
|
||
<entry>ja-</entry>
|
||
<entry>gawk</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>2.15.6</entry>
|
||
<entry>Версия на японском языке</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>psutils-1.13</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>psutils</entry>
|
||
<entry>-letter</entry>
|
||
<entry>1.13</entry>
|
||
<entry>Размер бумаги задается статически во время построения
|
||
пакета</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>pkfonts</entry>
|
||
<entry>(пусто)</entry>
|
||
<entry>pkfonts</entry>
|
||
<entry>300</entry>
|
||
<entry>1.0</entry>
|
||
<entry>пакет для шрифтов 300dpi</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>Если в исходном коде абсолютно нет информации о номере версии и
|
||
не похоже, что автор собирается выпускать другую версию, то в
|
||
качестве номера версии задайте просто <literal>1.0</literal> (как в
|
||
примере с <literal>piewm</literal> выше). В противном случае
|
||
спросите автора программы или используйте дату
|
||
(<literal>0.0.<replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>)
|
||
в качестве номера версии.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-categories">
|
||
<title>Разделение по категориям</title>
|
||
|
||
<sect2>
|
||
<title><makevar>CATEGORIES</makevar></title>
|
||
|
||
<para>В процессе создания пакета он помещается в каталог
|
||
<filename>/usr/ports/packages/All</filename>, а в одном или более
|
||
подкаталогов из <filename>/usr/ports/packages</filename>
|
||
создаются на него ссылки. Имена этих подкаталогов определяются
|
||
переменной <makevar>CATEGORIES</makevar>. Такая схема нужна для
|
||
облегчения жизни пользователя, когда он сталкивается с массой
|
||
пакетов на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на
|
||
<link linkend="porting-categories">текущий список категорий</link>
|
||
и выберите те из них,
|
||
которые более всего подходят к вашему порту.</para>
|
||
|
||
<para>Этот список также определяет, куда в дереве портов будет помещен
|
||
порт. Если вы укажете здесь более одной категории, то
|
||
предполагается, что файлы порта будут помещены в подкаталог с именем
|
||
первой категории. Посмотрите <link
|
||
linkend="choosing-categories">ниже</link> для получения
|
||
подробной информации о том, как правильно выбрать категории.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="porting-categories">
|
||
<title>Текущий список категорий</title>
|
||
|
||
<para>Вот текущий список категорий. Те, которые отмечены
|
||
звёздочкой (<literal>*</literal>), являются
|
||
<emphasis>виртуальными</emphasis> категориями—они не имеют
|
||
собственного подкаталога в дереве портов. Они используются только в
|
||
качестве вторичных категорий, и только для поиска.</para>
|
||
|
||
<note>
|
||
<para>Для невиртуальных категорий имеется однострочное описание
|
||
в <makevar>COMMENT</makevar> в <filename>Makefile</filename>
|
||
соответствующего подкаталога.</para>
|
||
</note>
|
||
|
||
<informaltable frame="none" pgwide="1">
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Категория</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Примечания</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><filename>accessibility</filename></entry>
|
||
<entry>Порты для помощи пользователям с ограниченными
|
||
возможностями.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>afterstep*</filename></entry>
|
||
<entry>Порты, поддерживающие менеджер окон <ulink
|
||
url="http://www.afterstep.org">AfterStep</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>arabic</filename></entry>
|
||
<entry>Поддержка арабского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>archivers</filename></entry>
|
||
<entry>Инструменты для работы с архивами.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>astro</filename></entry>
|
||
<entry>Приложения, связанные с астрономией.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>audio</filename></entry>
|
||
<entry>Поддержка работы со звуком.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>benchmarks</filename></entry>
|
||
<entry>Утилиты для измерения производительности системы.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>biology</filename></entry>
|
||
<entry>Программное обеспечение, связанное с биологией.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>cad</filename></entry>
|
||
<entry>Инструменты Систем Автоматизированного
|
||
Проектирования.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>chinese</filename></entry>
|
||
<entry>Поддержка китайского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>comms</filename></entry>
|
||
<entry>Коммуникационное программное обеспечение.</entry>
|
||
<entry>В основном программы для работы с последовательным
|
||
портом.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>converters</filename></entry>
|
||
<entry>Утилиты для преобразования символьных форматов.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>databases</filename></entry>
|
||
<entry>Базы данных.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>deskutils</filename></entry>
|
||
<entry>То, что было на столе до изобретения компьютеров.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>devel</filename></entry>
|
||
<entry>Утилиты для разработки программного обеспечения.</entry>
|
||
<entry>Не помещайте сюда библиотеки просто потому что это
|
||
библиотеки—если они подпадают под какую-то другую
|
||
категорию, то их быть здесь не должно.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>dns</filename></entry>
|
||
<entry>Программное обеспечение для работы с DNS.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>docs*</filename></entry>
|
||
<entry>Мета-порты для документации FreeBSD.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>editors</filename></entry>
|
||
<entry>Редакторы общего назначения.</entry>
|
||
<entry>Специализированные редакторы относят к разделу для
|
||
соответствующих инструментов (например, редактор
|
||
математических формул попадает в
|
||
категорию <filename>math</filename>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>elisp*</filename></entry>
|
||
<entry>Порты для Emacs lisp.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>emulators</filename></entry>
|
||
<entry>Эмуляторы других операционных систем.</entry>
|
||
<entry>Эмуляторы терминалов сюда <emphasis>не</emphasis>
|
||
относятся—те, которые разработаны для X, должны быть в
|
||
категории <filename>x11</filename>, а текстовые в
|
||
<filename>comms</filename> или <filename>misc</filename>, в
|
||
зависимости от конкретного их предназначения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>finance</filename></entry>
|
||
<entry>Приложения для работы с деньгами, финансами и всем, что
|
||
с этим связано.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>french</filename></entry>
|
||
<entry>Поддержка французского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>ftp</filename></entry>
|
||
<entry>Клиенты и серверы FTP.</entry>
|
||
<entry>Если ваш порт понимает как FTP,
|
||
так и HTTP, поместите его в категорию
|
||
<filename>ftp</filename> и укажите вторичную категорию
|
||
<filename>www</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>games</filename></entry>
|
||
<entry>Игры.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>geography*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с географией.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>german</filename></entry>
|
||
<entry>Поддержка немецкого языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>gnome*</filename></entry>
|
||
<entry>Порты Проекта <ulink
|
||
url="http://www.gnome.org">GNOME</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>gnustep*</filename></entry>
|
||
<entry>Программное обеспечение для окружения рабочего
|
||
стола GNUstep.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>graphics</filename></entry>
|
||
<entry>Графические утилиты.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>hamradio*</filename></entry>
|
||
<entry>Программное обеспечение для любительского радио</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>haskell*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком
|
||
Haskell.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>hebrew</filename></entry>
|
||
<entry>Поддержка иврита.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>hungarian</filename></entry>
|
||
<entry>Поддержка венгерского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>ipv6*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с IPv6.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>irc</filename></entry>
|
||
<entry>Утилиты для работы с Internet Relay Chat.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>japanese</filename></entry>
|
||
<entry>Поддержка японского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>java</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком
|
||
Java™.</entry>
|
||
<entry>Категория <filename>java</filename> ни в коем случае
|
||
не должна быть единственной для порта. Оставьте для портов,
|
||
непосредственно имеющих отношение к языку Java, портерам
|
||
также рекомендуется не использовать
|
||
<filename>java</filename> как основную категорию
|
||
порта.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>kde*</filename></entry>
|
||
<entry>Порты проекта
|
||
<ulink url="http://www.kde.org">KDE</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>kld*</filename></entry>
|
||
<entry>Загружаемые модули ядра.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>korean</filename></entry>
|
||
<entry>Поддержка корейского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>lang</filename></entry>
|
||
<entry>Языки программирования.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>linux*</filename></entry>
|
||
<entry>Linux приложения и утилиты.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>lisp*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком
|
||
Lisp.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>mail</filename></entry>
|
||
<entry>Программы для работы с электронной почтой.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>math</filename></entry>
|
||
<entry>Программное обеспечение для численных вычислений и
|
||
другие утилиты, связанные с математикой.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>mbone*</filename></entry>
|
||
<entry>Приложения для MBone.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>misc</filename></entry>
|
||
<entry>Различные утилиты</entry>
|
||
<entry>В основном то, что не попадает в
|
||
другие категории. Если это возможно, попробуйте найти
|
||
более подходящую, чем <literal>misc</literal>, категорию для
|
||
вашего порта, так как здесь порты теряются.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>multimedia</filename></entry>
|
||
<entry>Программное обеспечение для работы с
|
||
мультимедиа.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>net</filename></entry>
|
||
<entry>Различное сетевое программное обеспечение.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>net-im</filename></entry>
|
||
<entry>Программы мгновенного обмена сообщениями.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>net-mgmt</filename></entry>
|
||
<entry>Программное обеспечение для сетевого управления.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>net-p2p</filename></entry>
|
||
<entry>Приложения для пиринговых сетей.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>news</filename></entry>
|
||
<entry>Программное обеспечение для работы с конференциями
|
||
USENET.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>palm</filename></entry>
|
||
<entry>Программная поддержка <ulink
|
||
url="http://www.palm.com/">Palm™</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>parallel*</filename></entry>
|
||
<entry>Приложения, связанные с параллельными
|
||
вычислениями.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>pear*</filename></entry>
|
||
<entry>Порты, относящиеся к технологии Pear PHP.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>perl5*</filename></entry>
|
||
<entry>Порты, которым для работы требуется
|
||
<application>Perl</application> версии 5.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>plan9*</filename></entry>
|
||
<entry>Различные программы из <ulink
|
||
url="http://www.cs.bell-labs.com/plan9dist/">
|
||
Plan9</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>polish</filename></entry>
|
||
<entry>Поддержка польского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>ports-mgmt</filename></entry>
|
||
<entry>Порты для управления, установки и разработки
|
||
портов и пакетов FreeBSD.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>portuguese</filename></entry>
|
||
<entry>Поддержка португальского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>print</filename></entry>
|
||
<entry>Программное обеспечение для печати.</entry>
|
||
<entry>Инструменты для вёрстки (просмотрщики и тому подобное)
|
||
тоже относятся сюда.</entry>
|
||
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>python*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком <ulink
|
||
url="http://www.python.org/">Python</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>ruby*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком <ulink
|
||
url="http://www.ruby-lang.org/">Ruby</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>rubygems*</filename></entry>
|
||
<entry>Порты для пакетов <ulink
|
||
url="http://www.rubygems.org/">RubyGems</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>russian</filename></entry>
|
||
<entry>Поддержка русского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>scheme*</filename></entry>
|
||
<entry>Программное обеспечение, связанное с языком
|
||
Scheme.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>science</filename></entry>
|
||
<entry>Научные программы, которые не подпадают под другие
|
||
категории, скажем, <filename>astro</filename>,
|
||
<filename>biology</filename> или
|
||
<filename>math</filename>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>security</filename></entry>
|
||
<entry>Программы, обеспечивающие безопасность системы.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>shells</filename></entry>
|
||
<entry>Различные командные процессоры.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>sysutils</filename></entry>
|
||
<entry>Системные утилиты.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>spanish*</filename></entry>
|
||
<entry>Поддержка испанского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>tcl*</filename></entry>
|
||
<entry>Порты, для работы которых нужен Tcl.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>textproc</filename></entry>
|
||
<entry>Утилиты для обработки текстов.</entry>
|
||
<entry>Инструменты для вёрстки помещаются в категорию
|
||
<filename>print</filename>, а не сюда.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>tk*</filename></entry>
|
||
<entry>Порты, для работы которых нужен Tk.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>ukrainian</filename></entry>
|
||
<entry>Поддержка украинского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>vietnamese</filename></entry>
|
||
<entry>Поддержка вьетнамского языка.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>windowmaker*</filename></entry>
|
||
<entry>Порты, поддерживающие менеджер окон WindowMaker.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>www</filename></entry>
|
||
<entry>Программное обеспечение, связанное с World Wide
|
||
Web.</entry>
|
||
<entry>Поддержка языка HTML относится сюда же.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11</filename></entry>
|
||
<entry>X Window System и иже с ними.</entry>
|
||
<entry>Эта категория
|
||
предназначена только для программного обеспечения, которое
|
||
поддерживает саму оконную систему. Не помещайте сюда
|
||
обычные приложения для X: большинство из них должны быть
|
||
перенесены в другие категории <filename>x11-*</filename>
|
||
(смотрите ниже). Если ваш порт <emphasis>является</emphasis>
|
||
приложением для X, задайте <makevar>USE_XLIB</makevar> (что
|
||
подразумевается при использовании
|
||
<makevar>USE_IMAKE</makevar>) и укажите подходящую
|
||
категорию.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-clocks</filename></entry>
|
||
<entry>Часы для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-drivers</filename></entry>
|
||
<entry>Драйверы X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-fm</filename></entry>
|
||
<entry>Менеджеры файлов для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-fonts</filename></entry>
|
||
<entry>Шрифты для X11 и утилиты для работы с ними.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-servers</filename></entry>
|
||
<entry>Серверы для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-themes</filename></entry>
|
||
<entry>Темы для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-toolkits</filename></entry>
|
||
<entry>Пакеты разработчика для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>x11-wm</filename></entry>
|
||
<entry>Оконные менеджеры для X11.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>xfce*</filename></entry>
|
||
<entry>Порты, связанные с окружением рабочего стола
|
||
<ulink url="http://www.xfce.org/">Xfce</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><filename>zope*</filename></entry>
|
||
<entry>Поддержка <ulink
|
||
url="http://www.zope.org/">Zope</ulink>.</entry>
|
||
<entry></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</sect2>
|
||
|
||
<sect2 id="choosing-categories">
|
||
<title>Выбор правильной категории</title>
|
||
|
||
<para>Так как многие категории перекрываются, вам часто необходимо
|
||
будет выбирать, какая их них должна быть основной для вашего порта.
|
||
Есть несколько правил, по которым можно решить этот вопрос. Вот
|
||
список приоритетов, в уменьшающейся степени предпочтения:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Первая категория должна быть физической категорий (смотрите
|
||
<link linkend="porting-categories">выше</link>). Это
|
||
необходимо для создания пакетов. После этого виртуальные
|
||
и физические категории могут смешиваться.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Сначала всегда идут категории, специфичные для языков.
|
||
Например, если ваш порт устанавливает японские шрифты для X11,
|
||
то строчка <makevar>CATEGORIES</makevar> должна иметь вид
|
||
<filename>japanese x11-fonts</filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Более конкретные категории идут первыми перед более
|
||
общими. В частности, редактор HTML должен быть описан как
|
||
<filename>www editors</filename>, а не наоборот. Кроме того, вы
|
||
не должны указывать категорию <filename>net</filename>, если порт
|
||
относится к одной из категорий <filename>irc</filename>,
|
||
<filename>mail</filename>,
|
||
<filename>news</filename>, <filename>security</filename> или
|
||
<filename>www</filename>, так как <filename>net</filename>
|
||
включается автоматически.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>x11</filename> используется как вторичная категория
|
||
только в случае, если в качестве основной категории указан
|
||
естественный язык. В частности, вам не нужно указывать
|
||
<filename>x11</filename> в качестве категории для
|
||
приложений X.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Режимы для редактора <application>Emacs</application> должны
|
||
помещаться в ту же категорию, что и приложение, которое
|
||
поддерживается этим режимом, а не в <filename>editors</filename>.
|
||
Например, режим <application>Emacs</application> для
|
||
редактирования исходного кода некоторого языка программирования
|
||
должен быть помещен в категорию <filename>lang</filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Порты, устанавливающие загружаемые модули ядра, должны
|
||
содержать виртуальную категорию <filename>kld</filename> в
|
||
строке <makevar>CATEGORIES</makevar>.
|
||
</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>misc</filename>
|
||
не должна указываться вместе с любой другой невиртуальной
|
||
категорией. Если вы указываете <literal>misc</literal>
|
||
вместе с чем-то ещё в строке <makevar>CATEGORIES</makevar>,
|
||
это значит, что вы можете спокойно удалить
|
||
<literal>misc</literal> и просто поместить порт в этот
|
||
другой подкаталог!</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если ваш порт решительным образом не подпадает ни под какую
|
||
категорию, поместите его в <filename>misc</filename>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Если вы не уверены в правильности выбора категории, пожалуйста,
|
||
отметьте это в вашем сообщении через &man.send-pr.1;, чтобы мы
|
||
могли обсудить это до того, как включить порт в Коллекцию. Если вы
|
||
являетесь коммиттером, пошлите замечание на адрес &a.ports;, чтобы мы
|
||
могли обсудить это. Зачастую новые порты помещаются не в ту
|
||
категорию только для того, чтобы их оттуда сразу же удалили.
|
||
Это приводит к излишнему и ненужному росту основного хранилища
|
||
исходных текстов.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="proposing-categories">
|
||
<title>Предложение новой категории</title>
|
||
|
||
<para>Поскольку со временем Коллекция Портов увеличилась, то в связи
|
||
с этим были добавлены различные новые категории. Новые категории
|
||
могут быть или <emphasis>виртуальными</emphasis> категориями—
|
||
которые не имеют соответствующего подкаталога в дереве портов—
|
||
или <emphasis>физическими</emphasis> категориями—у которых
|
||
он есть. Следующий текст содержит обсуждение вопросов, возникающих
|
||
при создании новой физической категории, чтобы вы могли понимать
|
||
их, когда предложите новую категорию.</para>
|
||
|
||
<para>В соответствие с существующей практикой мы избегаем создания
|
||
новой физической категории, пока достаточно большое число портов
|
||
логически ей не принадлежит или же порты, которые могли бы ей
|
||
принадлежать, не являются логически обособленной группой,
|
||
представляющей для всех ограниченный интерес (в частности,
|
||
категории, относящиеся к естественным языкам); предпочтительно
|
||
выполнение обоих условий.</para>
|
||
|
||
<para>Основной причиной для этого является то, что такое изменение
|
||
создает <ulink url="&url.articles.committers-guide;/#ports">изрядное
|
||
количество работы</ulink> и для коммиттеров, и для всех тех
|
||
пользователей, которые отслеживают изменения в Коллекции Портов.
|
||
В дополнение, предложенная категория создает естественное
|
||
разногласие. (Пожалуй, потому что не существует четкого соглашения,
|
||
является ли категория <quote>слишком большой</quote>, или должны
|
||
ли категории предоставлять себя для просмотра (и, таким образом,
|
||
какое количество категорий было бы идеальным значением), и так
|
||
далее.)</para>
|
||
|
||
<para>Процедура:</para>
|
||
|
||
<procedure>
|
||
<step>
|
||
<para>Предложите новую категорию на &a.ports;. Вам следует
|
||
включить для новой категории детальное обоснование, в том числе
|
||
почему вы считаете, что существующие категории не являются
|
||
достаточными, и список существующих портов, предложенных для
|
||
перемещения. (Если есть новые порты, ожидающие в
|
||
<application>GNATS</application> и попадающие в эту категорию,
|
||
то укажите их тоже.) Если вы являетесь сопровождающим и/или
|
||
отправителем, то укажите это соответственно, так как это может
|
||
помочь вам в вашем деле.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Принимайте участие в обсуждении.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Если кажется, что для вашей идеи появилась поддержка,
|
||
отправьте PR, который будет включать обоснование и список
|
||
существующих портов, которые надо переместить. В идеале
|
||
этот PR должен также включать патчи для следующего:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><filename>Makefile</filename>'ы для новых портов в
|
||
результате репозиторного копирования</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>Makefile</filename> для категорий старых
|
||
портов</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>Makefile</filename>'ы для портов, зависящих
|
||
от старых портов</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>(в дополнение, вы можете включить другие файлы,
|
||
требующие изменений, согласно процедуре из Руководства
|
||
Коммиттера.)</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Поскольку это затрагивает инфраструктуру портов и
|
||
охватывает не только выполнение репозиторного копирования, но
|
||
также, возможно, и выполнение регрессивных тестов на кластере
|
||
построения, то PR должна назначать себе &a.portmgr;.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Если этот PR одобрен, то коммиттеру нужно продолжить
|
||
остальную часть процедуры, которая <ulink
|
||
url="&url.articles.committers-guide;/article.html#PORTS">
|
||
изложена в Руководстве Коммиттера</ulink>.</para>
|
||
</step>
|
||
</procedure>
|
||
|
||
<para>Предложение новой виртуальной категории должно быть схожим
|
||
с вышеизложенным, но при этом затрагивать намного меньше,
|
||
поскольку ни один из портов не будет перемещен в действительности.
|
||
В этом случае единственными патчами, включенными в PR, будут
|
||
те, что добавляют новую категорию в <makevar>CATEGORIES</makevar>
|
||
каждого из затрагиваемых портов.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="proposing-reorg">
|
||
<title>Предложение реорганизации всех категорий</title>
|
||
|
||
<para>Время от времени кто-нибудь предлагает произвести реорганизацию
|
||
категорий либо до двухуровневой, либо другого типа на основе
|
||
ключевых слов. На данный момент из этих предложений ничего не
|
||
получилось, потому что, хотя они просты в реализации, но
|
||
предполагаемая переделка всей коллекции портов по меньшей мере
|
||
приводит в уныние. Пожалуйста, прочтите историю этих предложений
|
||
в архивах рассылок перед тем, как присылать свои соображения;
|
||
более того, вы должны быть готовы представить работающий
|
||
прототип.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-distfiles">
|
||
<title>Дистрибутивные файлы</title>
|
||
|
||
<para>Во второй части <filename>Makefile</filename> задаётся, какие
|
||
файлы и откуда должны быть сгружены для того, чтобы построить
|
||
порт.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>DISTVERSION/DISTNAME</makevar></title>
|
||
|
||
<para>В переменной <makevar>DISTNAME</makevar> указывается имя порта
|
||
так, как назвали его создатели программного обеспечения. Значение
|
||
<makevar>DISTNAME</makevar> по умолчанию совпадает с
|
||
<literal>${PORTNAME}-${PORTVERSION}</literal>, так что
|
||
переопределяете её значение только в случае необходимости.
|
||
<makevar>DISTNAME</makevar> используется только в двух местах.
|
||
Во-первых, список дистрибутивных файлов
|
||
(<makevar>DISTFILES</makevar>) по умолчанию состоит из
|
||
<makevar>${DISTNAME}</makevar><makevar>${EXTRACT_SUFX}</makevar>. И
|
||
во-вторых, предполагается, что дистрибутивный файл будет распакован в
|
||
подкаталог с именем <makevar>WRKSRC</makevar>, значение которого по
|
||
умолчанию есть не что иное, как
|
||
<filename>work/<makevar>${DISTNAME}</makevar></filename>.</para>
|
||
|
||
<para>Названия некоторых дистрибутивов, которые не укладываются в
|
||
<literal>${PORTNAME}-${PORTVERSION}</literal>-схему, могут быть
|
||
автоматически обработаны посредством установки переменной
|
||
<makevar>DISTVERSION</makevar>. <makevar>PORTVERSION</makevar> и
|
||
<makevar>DISTNAME</makevar> будут унаследованы автоматически, но
|
||
конечно же могут быть переопределены. Следующая таблица
|
||
демонстрирует некоторые примеры:</para>
|
||
|
||
<informaltable frame="none" pgwide="0">
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry><makevar>DISTVERSION</makevar></entry>
|
||
<entry><makevar>PORTVERSION</makevar></entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>0.7.1d</entry>
|
||
<entry>0.7.1.d</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>10Alpha3</entry>
|
||
<entry>10.a3</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>3Beta7-pre2</entry>
|
||
<entry>3.b7.p2</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>8:f_17</entry>
|
||
<entry>8f.17</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<note>
|
||
<para>Значения переменных <makevar>PKGNAMEPREFIX</makevar>
|
||
и <makevar>PKGNAMESUFFIX</makevar> не влияют на значение
|
||
<makevar>DISTNAME</makevar>. Заметьте также, что если значение
|
||
<makevar>WRKSRC</makevar> равно
|
||
<filename>work/<makevar>${PORTNAME}-${PORTVERSION}</makevar></filename>,
|
||
и в случае, когда оригинальный архив называется по имени, отличном
|
||
от <makevar>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</makevar>,
|
||
скорее всего, вы должны оставить <makevar>DISTNAME</makevar>
|
||
как есть— лучше переопределить <makevar>DISTFILES</makevar>,
|
||
чем задавать значения как
|
||
<makevar>DISTNAME</makevar>, так и <makevar>WRKSRC</makevar>
|
||
(и, возможно, ещё и <makevar>EXTRACT_SUFX</makevar>).</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>MASTER_SITES</makevar></title>
|
||
|
||
<para>Содержит часть с каталогом FTP/HTTP-URL, которая указывает на
|
||
оригинальный архив на сервере <makevar>MASTER_SITES</makevar>. Не
|
||
забудьте лидирующий слэш (<filename>/</filename>)!</para>
|
||
|
||
<para>Макрос команды <command>make</command> будет пытаться
|
||
воспользоваться этой переменной для получения дистрибутивного файла
|
||
с помощью программы <makevar>FETCH</makevar>, если он не будет найден
|
||
в системе.</para>
|
||
|
||
<para>Рекомендуется помещать в список много сайтов, предпочтительно с
|
||
разных континентов. Это поможет при наличии проблем с мировой сетью.
|
||
Мы даже планируем добавить поддержку автоматического определения
|
||
ближайшего сайта и сгрузки файлов оттуда; наличие нескольких сайтов
|
||
будет способствовать этому начинанию.</para>
|
||
|
||
<para>Если оригинальный архив находится на одном из таких популярных
|
||
серверов, как SourceForge, GNU или Perl CPAN, то указывайте эти
|
||
сайты в простой форме при помощи
|
||
<makevar>MASTER_SITE_<replaceable>*</replaceable></makevar>
|
||
(к примеру, <makevar>MASTER_SITE_SOURCEFORGE</makevar>,
|
||
<makevar>MASTER_SITE_GNU</makevar> или
|
||
<makevar>MASTER_SITE_PERL_CPAN</makevar>. Просто укажите в переменной
|
||
<makevar>MASTER_SITES</makevar> одно из этих значений, а в
|
||
переменной <makevar>MASTER_SITE_SUBDIR</makevar> задайте путь к
|
||
архиву. Вот пример:</para>
|
||
|
||
<programlisting>MASTER_SITES= ${MASTER_SITE_GNU}
|
||
MASTER_SITE_SUBDIR= make</programlisting>
|
||
|
||
<para>Или можно использовать сокращенный формат:</para>
|
||
|
||
<programlisting>MASTER_SITES= GNU/make</programlisting>
|
||
|
||
<para>Эти переменные определены в файле
|
||
<filename>/usr/ports/Mk/bsd.sites.mk</filename>. Всё время
|
||
добавляются новые записи, так что обращайтесь к последней версии
|
||
этого файла перед тем, как послать нам свой порт.</para>
|
||
|
||
<para>Для популярных сайтов существует несколько
|
||
<emphasis>магических</emphasis> макросов с заранее известной
|
||
структурой каталогов. Используйте для них сокращения, и система
|
||
попытается угадать для вас правильный подкаталог.</para>
|
||
|
||
<programlisting>MASTER_SITES= SF</programlisting>
|
||
|
||
<para>Если попытка угадать не удалась, то это может быть переписано
|
||
следующим образом.</para>
|
||
|
||
<programlisting>MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}</programlisting>
|
||
|
||
<para>Что также можно записать в таком виде:</para>
|
||
|
||
<programlisting>MASTER_SITES= SF
|
||
MASTER_SITE_SUBDIR= stardict/WyabdcRealPeopleTTS/${PORTVERSION}</programlisting>
|
||
|
||
<table frame="none">
|
||
<title>Популярные магические макросы для
|
||
<makevar>MASTER_SITES</makevar></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Macro</entry>
|
||
|
||
<entry>Assumed subdirectory</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>BERLIOS</makevar></entry>
|
||
|
||
<entry><makevar>/${PORTNAME:L}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>CHEESESHOP</makevar></entry>
|
||
|
||
<entry><makevar>/packages/source/source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>DEBIAN</makevar></entry>
|
||
|
||
<entry><makevar>/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>GCC</makevar></entry>
|
||
|
||
<entry><makevar>/pub/gcc/releases/${DISTNAME}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>GNOME</makevar></entry>
|
||
|
||
<entry><makevar>/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>GNU</makevar></entry>
|
||
|
||
<entry><makevar>/gnu/${PORTNAME}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>MOZDEV</makevar></entry>
|
||
|
||
<entry><makevar>/pub/mozdev/${PORTNAME:L}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_CPAN</makevar></entry>
|
||
|
||
<entry><makevar>/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYTHON</makevar></entry>
|
||
|
||
<entry><makevar>/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBYFORGE</makevar></entry>
|
||
|
||
<entry><makevar>/${PORTNAME:L}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SAVANNAH</makevar></entry>
|
||
|
||
<entry><makevar>/${PORTNAME:L}</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SF</makevar></entry>
|
||
|
||
<entry><makevar>/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}</makevar></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>EXTRACT_SUFX</makevar></title>
|
||
|
||
<para>Если у вас имеется один дистрибутивный файл, и в его имени
|
||
используется странное окончание для указания типа сжатия, задайте
|
||
переменную <makevar>EXTRACT_SUFX</makevar>.</para>
|
||
|
||
<para>К примеру, если дистрибутивный файл носит имя
|
||
<filename>foo.tgz</filename>, а не более привычное
|
||
<filename>foo.tar.gz</filename>, вы должны написать:</para>
|
||
|
||
<programlisting>DISTNAME= foo
|
||
EXTRACT_SUFX= .tgz</programlisting>
|
||
|
||
<para>Переменные <makevar>USE_BZIP2</makevar>,
|
||
<makevar>USE_XZ</makevar> и
|
||
<makevar>USE_ZIP</makevar> при необходимости автоматически
|
||
устанавливают значение <makevar>EXTRACT_SUFX</makevar> в
|
||
<literal>.tar.bz2</literal>, <literal>.tar.xz</literal> или
|
||
<literal>.zip</literal>. Если ни одна из этих
|
||
переменных не задана, то значение <makevar>EXTRACT_SUFX</makevar>
|
||
по умолчанию устанавливается в <literal>.tar.gz</literal>.</para>
|
||
|
||
<note>
|
||
<para>Вам не нужно задавать значения <makevar>EXTRACT_SUFX</makevar>
|
||
и <makevar>DISTFILES</makevar> одновременно.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>DISTFILES</makevar></title>
|
||
|
||
<para>Иногда имена сгружаемых файлов не соответствуют имени порта. К
|
||
примеру, файл может называться <filename>source.tar.gz</filename> или
|
||
подобным образом. В других случаях исходный код приложения может
|
||
располагаться в нескольких отличающихся архивах, и все они должны
|
||
быть сгружены.</para>
|
||
|
||
<para>Если это ваш случай, то задайте в переменной
|
||
<makevar>DISTFILES</makevar> список разделённых пробелами имён
|
||
файлов, которые нужно сгрузить.</para>
|
||
|
||
<programlisting>DISTFILES= source1.tar.gz source2.tar.gz</programlisting>
|
||
|
||
<para>Если переменная <makevar>DISTFILES</makevar> не задана явно, то
|
||
её значением по умолчанию будет
|
||
<literal>${DISTNAME}${EXTRACT_SUFX}</literal>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>EXTRACT_ONLY</makevar></title>
|
||
|
||
<para>Если только некоторые из <makevar>DISTFILES</makevar> должны быть
|
||
распакованы—к примеру, часть из них является исходным кодом, а
|
||
другие представляют собой неупакованную
|
||
документацию—перечислите имена файлов, которые должны быть
|
||
распакованы, в <makevar>EXTRACT_ONLY</makevar>.</para>
|
||
|
||
<programlisting>DISTFILES= source.tar.gz manual.html
|
||
EXTRACT_ONLY= source.tar.gz</programlisting>
|
||
|
||
<para>Если <emphasis>ни один</emphasis> из <makevar>DISTFILES</makevar>
|
||
не должен распаковываться, то установите пустое значение
|
||
переменной <makevar>EXTRACT_ONLY</makevar>.</para>
|
||
|
||
<programlisting>EXTRACT_ONLY=</programlisting>
|
||
</sect2>
|
||
|
||
<sect2 id="porting-patchfiles">
|
||
<title><makevar>PATCHFILES</makevar></title>
|
||
|
||
<para>Если вашему порту требуются некоторых дополнительные патчи,
|
||
которые доступны по FTP или HTTP, задайте имена этих файлов в
|
||
переменной <makevar>PATCHFILES</makevar>, а в переменной
|
||
<makevar>PATCH_SITES</makevar> укажите URL того каталога, в котором
|
||
они содержатся (формат такой же, как
|
||
для <makevar>MASTER_SITES</makevar>).</para>
|
||
|
||
<para>Если патч не относится к самому верху дерева исходных текстов
|
||
(то есть <makevar>WRKSRC</makevar>), потому что он содержит некоторые
|
||
дополнительные пути, установите соответственно значение переменной
|
||
<makevar>PATCH_DIST_STRIP</makevar>. В частности, если все имена
|
||
путей в патче имеют дополнительный путь
|
||
<literal>foozolix-1.0/</literal> перед именем файла, то задайте
|
||
<literal>PATCH_DIST_STRIP=-p1</literal>.</para>
|
||
|
||
<para>Не волнуйтесь, если патчи упакованы; они будут распакованы
|
||
автоматически, если имена файлов оканчиваются на
|
||
<filename>.gz</filename> или <filename>.Z</filename>.</para>
|
||
|
||
<para>Если патч распространяется вместе с какими-то другими файлами,
|
||
такими, как документация, в виде tar-архива <command>gzip</command>,
|
||
вы не можете просто
|
||
использовать <makevar>PATCHFILES</makevar>. Если это ваш случай,
|
||
добавьте имя и местоположение архива с патчем к
|
||
<makevar>DISTFILES</makevar> и <makevar>MASTER_SITES</makevar>.
|
||
Затем воспользуйтесь переменной <makevar>EXTRA_PATCHES</makevar> для
|
||
указания этих файлов, и <filename>bsd.port.mk</filename> автоматически
|
||
применит эти патчи. В частности, <emphasis>не копируйте</emphasis>
|
||
файлы с патчами в каталог <makevar>PATCHDIR</makevar>—этот
|
||
каталог может быть недоступным для записи.</para>
|
||
|
||
<note>
|
||
<para>Архив будет распакован вне исходного кода, как
|
||
обычно, и к тому же его не нужно явно распаковывать, если
|
||
это обычный архив <command>gzip</command> или
|
||
<command>compress</command>. Если вы сделаете последнее,
|
||
приложите дополнительные усилия для того, чтобы не перезаписать
|
||
что-либо, уже существующее в этом каталоге. Также не забудьте
|
||
добавить команду для удаления скопированного патча в цели
|
||
<maketarget>pre-clean</maketarget>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2 id="porting-master-sites-n">
|
||
<title>Несколько дистрибутивных файлов или патчей с различных серверов
|
||
и подкаталогов (<literal>MASTER_SITES:n</literal>)</title>
|
||
|
||
<para>(Этот раздел можно считать немного <quote>повышенной
|
||
трудности</quote>; те, кто впервые знакомятся с этим текстом, могут
|
||
пропустить этот раздел).</para>
|
||
|
||
<para>В этом разделе находится информация о механизме сгрузки,
|
||
известном как <literal>MASTER_SITES:n</literal> и
|
||
<literal>MASTER_SITES_NN</literal>. Далее мы будем называть этот
|
||
механизм <literal>MASTER_SITES:n</literal>.</para>
|
||
|
||
<para>Сначала немного общей информации. В OpenBSD имеется полезная
|
||
возможность, используемая в переменных <makevar>DISTFILES</makevar> и
|
||
<makevar>PATCHFILES</makevar>, которая позволяет закреплять после
|
||
имен файлов и патчей идентификаторы типа <literal>:n</literal>. Здесь
|
||
<literal>n</literal> может быть из диапазона <literal>[0-9]</literal>
|
||
и обозначать закреплённую группу. К примеру:</para>
|
||
|
||
<programlisting>DISTFILES= alpha:0 beta:1</programlisting>
|
||
|
||
<para>В OpenBSD дистрибутивный файл <filename>alpha</filename> будет
|
||
связан с переменной <makevar>MASTER_SITES0</makevar>, но не с нашей
|
||
общей переменной <makevar>MASTER_SITES</makevar>, а файл
|
||
<filename>beta</filename> с переменной
|
||
<makevar>MASTER_SITES1</makevar>.</para>
|
||
|
||
<para>Этот очень интересная возможность, которая может уменьшить этот
|
||
бесконечный поиск работающего сайта для сгрузки.</para>
|
||
|
||
<para>Просто представьте себе 2 файла в <makevar>DISTFILES</makevar> и
|
||
20 сайтов в <makevar>MASTER_SITES</makevar>; сайты очень медленные,
|
||
причём <filename>beta</filename> находится на всех сайтах из
|
||
<makevar>MASTER_SITES</makevar>, а <filename>alpha</filename>
|
||
может быть найден только на 20-м сайте. Будет неправильно проверять
|
||
их все, если создатель знает об этом, не правда ли? Неподходящее
|
||
начало для таких прекрасных выходных!</para>
|
||
|
||
<para>Теперь, когда вы получили общее представление, просто представьте
|
||
ещё большее количество <makevar>DISTFILES</makevar> и
|
||
<makevar>MASTER_SITES</makevar>. Конечно, наш <quote>магистр
|
||
доступности дистрибутивов</quote> представляет масштабы нагрузки
|
||
на сеть, которую это даёт.</para>
|
||
|
||
<para>В последующих разделах информация будет даваться вместе с
|
||
реализацией этой идеи во FreeBSD. Мы несколько улучшили концепцию
|
||
OpenBSD.</para>
|
||
|
||
<sect3>
|
||
<title>Упрощённая информация</title>
|
||
|
||
<para>В этом разделе рассказывается, как быстро подготовить точную
|
||
сгрузку нескольких дистрибутивных файлов и патчей с разных сайтов
|
||
и каталогов. Мы описываем здесь случай упрощённого использования
|
||
<literal>MASTER_SITES:n</literal>. Для большинства сценариев этого
|
||
будет достаточно. Однако, если вам нужна дополнительная
|
||
информация, обратитесь к следующему разделу.</para>
|
||
|
||
<para>Некоторые приложения состоят из многих дистрибутивных
|
||
файлов, которые должны быть сгружены с нескольких различных сайтов.
|
||
К примеру, <application>Ghostscript</application> состоит из
|
||
основной программы и большого числа файлов драйверов, которые
|
||
используются в зависимости от принтера пользователя. Некоторые из
|
||
этих файлов драйверов поставляются с основной программой, но при
|
||
этом многие другие должны быть сгружены с множества различных
|
||
сайтов.</para>
|
||
|
||
<para>Чтобы это поддерживать, за каждой записью в
|
||
<makevar>DISTFILES</makevar> может следовать символ двоеточия и
|
||
<quote>имя метки</quote>. За каждым сайтом, перечисленным в
|
||
<makevar>MASTER_SITES</makevar>, тоже следует двоеточие и метка,
|
||
которая указывает, какие файлы дистрибутива должны быть сгружены
|
||
с этого сайта.</para>
|
||
|
||
<para>Например, рассмотрим приложение, исходный код которого разделён
|
||
на две части, <filename>source1.tar.gz</filename> и
|
||
<filename>source2.tar.gz</filename>, которые должны быть сгружены с
|
||
двух различных источников. Файл <filename>Makefile</filename>
|
||
порта будет содержать строчки типа <xref
|
||
linkend="ports-master-sites-n-example-simple-use-one-file-per-site"/>.</para>
|
||
|
||
<example
|
||
id="ports-master-sites-n-example-simple-use-one-file-per-site">
|
||
|
||
<title>Упрощённое использование <literal>MASTER_SITES:n</literal>
|
||
с 1 файлом на каждом сайте</title>
|
||
|
||
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
|
||
ftp://ftp.example2.com/:source2
|
||
DISTFILES= source1.tar.gz:source1 \
|
||
source2.tar.gz:source2</programlisting>
|
||
</example>
|
||
|
||
<para>Несколько дистрибутивных файлов могут иметь одну и ту же метку.
|
||
Продолжая предыдущий пример, положим, что имеется и третий
|
||
дистрибутивный файл, <filename>source3.tar.gz</filename>, который
|
||
должен быть сгружен с <hostid>ftp.example2.com</hostid>. Тогда
|
||
файл <filename>Makefile</filename> будет написан как <xref
|
||
linkend="ports-master-sites-n-example-simple-use-more-than-one-file-per-site"/>.</para>
|
||
|
||
<example
|
||
id="ports-master-sites-n-example-simple-use-more-than-one-file-per-site">
|
||
<title>Упрощённое использование <literal>MASTER_SITES:n</literal> с
|
||
более чем 1 файлом на каждом сервере</title>
|
||
|
||
<programlisting>MASTER_SITES= ftp://ftp.example1.com/:source1 \
|
||
ftp://ftp.example2.com/:source2
|
||
DISTFILES= source1.tar.gz:source1 \
|
||
source2.tar.gz:source2 \
|
||
source3.tar.gz:source2</programlisting>
|
||
</example>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Подробная информация</title>
|
||
|
||
<para>Прекрасно, но пример из предыдущего раздела не показал вам всё,
|
||
что вам нужно? В этом разделе мы подробно опишем, как работает
|
||
механизм <literal>MASTER_SITES:n</literal> точной сгрузки и как
|
||
вы можете изменить ваши порты, чтобы это использовать.</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>За элементами могут следовать символы
|
||
<literal>:<replaceable>n</replaceable></literal>, где
|
||
<replaceable>n</replaceable> это <literal>[^:,]+</literal>, то
|
||
есть <replaceable>n</replaceable> может теоретически быть
|
||
любой алфавитно-цифровой строкой, но пока мы будем ограничивать
|
||
их <literal>[a-zA-Z_][0-9a-zA-Z_]+</literal>.</para>
|
||
|
||
<para>Более того, совпадение строк чувствительно к регистру;
|
||
другими словами, <literal>n</literal> отличается от
|
||
<literal>N</literal>.</para>
|
||
|
||
<para>Однако следующие слова не могут использоваться для этих
|
||
нужд, так как они имеют особое значение:
|
||
<literal>default</literal>, <literal>all</literal> и
|
||
<literal>ALL</literal> (они используются для своих нужд в <xref
|
||
linkend="porting-master-sites-n-what-changes-in-port-targets"/>).
|
||
Кроме того, <literal>DEFAULT</literal> является специальным
|
||
ключевым словом (посмотрите <xref
|
||
linkend="porting-master-sites-n-DEFAULT-group"/>).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Элементы, за которыми следуют <literal>:n</literal>,
|
||
принадлежат группе <literal>n</literal>,
|
||
<literal>:m</literal> относится к группе <literal>m</literal> и
|
||
так далее.</para>
|
||
</listitem>
|
||
|
||
<listitem id="porting-master-sites-n-DEFAULT-group">
|
||
<para>Элементы без таких суффиксов не относятся ни к какой
|
||
группе, то есть они принадлежат к особой группе
|
||
<literal>DEFAULT</literal>. Если вы укажете суффиксом любого
|
||
элемента <literal>DEFAULT</literal>, вы просто выполните
|
||
излишнюю работу, если только вы не хотите отнесения элемента
|
||
как к группе <literal>DEFAULT</literal>, так и какой-то другой
|
||
в одно и то же время (посмотрите на пункт <xref
|
||
linkend="porting-master-sites-n-comma-operator"/>).</para>
|
||
|
||
<para>Следующие примеры равнозначны, но первый более
|
||
предпочтителен:</para>
|
||
|
||
<programlisting>MASTER_SITES= alpha</programlisting>
|
||
|
||
<programlisting>MASTER_SITES= alpha:DEFAULT</programlisting>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Группы не являются эксклюзивными, элемент может
|
||
принадлежать к нескольким отличающимся группам одновременно, а
|
||
группа может либо иметь несколько различных элементов, либо не
|
||
иметь их вовсе. Повторяющиеся элементы в одной и той же группе
|
||
будут являться просто повторяющимися элементами.</para>
|
||
</listitem>
|
||
|
||
<listitem id="porting-master-sites-n-comma-operator">
|
||
<para>Если в хотите, чтобы элемент принадлежал к нескольким
|
||
группам одновременно, вы можете использовать
|
||
запятую (<literal>,</literal>).</para>
|
||
|
||
<para>Вместо того, чтобы повторять их несколько раз, каждый раз с
|
||
разным постфиксом, мы можем перечислить несколько групп за раз
|
||
в одном постфиксе. Например, <literal>:m,n,o</literal>
|
||
определяет элемент, принадлежащий группам <literal>m</literal>,
|
||
<literal>n</literal> и <literal>o</literal>.</para>
|
||
|
||
<para>Все следующие примеры имеют один смысл, но последний
|
||
является предпочтительным:</para>
|
||
|
||
<programlisting>MASTER_SITES= alpha alpha:SOME_SITE</programlisting>
|
||
|
||
<programlisting>MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE</programlisting>
|
||
|
||
<programlisting>MASTER_SITES= alpha:SOME_SITE,DEFAULT</programlisting>
|
||
|
||
<programlisting>MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Все серверы внутри определённой группы сортируются в
|
||
соответствии с <makevar>MASTER_SORT_AWK</makevar>. Все группы
|
||
в <makevar>MASTER_SITES</makevar> и
|
||
<makevar>PATCH_SITES</makevar> тоже сортируются.</para>
|
||
</listitem>
|
||
|
||
<listitem id="porting-master-sites-n-group-semantics">
|
||
<para>Семантика групп может использоваться в любой из следующих
|
||
переменных <makevar>MASTER_SITES</makevar>,
|
||
<makevar>PATCH_SITES</makevar>,
|
||
<makevar>MASTER_SITE_SUBDIR</makevar>,
|
||
<makevar>PATCH_SITE_SUBDIR</makevar>,
|
||
<makevar>DISTFILES</makevar> и
|
||
<makevar>PATCHFILES</makevar> в соответствии со следующим
|
||
синтаксисом:</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Все элементы <makevar>MASTER_SITES</makevar>,
|
||
<makevar>PATCH_SITES</makevar>,
|
||
<makevar>MASTER_SITE_SUBDIR</makevar> и
|
||
<makevar>PATCH_SITE_SUBDIR</makevar> должны заканчиваться
|
||
символом прямого слэша <literal>/</literal>. Если какие-то
|
||
элементы принадлежат каким-то группам, постфикс группы
|
||
<literal>:<replaceable>n</replaceable></literal> должен
|
||
следовать сразу после завершающего символа
|
||
<literal>/</literal>. Механизм
|
||
<literal>MASTER_SITES:n</literal> опирается на наличие
|
||
завершающего символа <literal>/</literal> во избежание
|
||
совпадающих элементов, где <literal>:n</literal> является
|
||
корректной частью элемента с вхождениями, где
|
||
<literal>:n</literal> обозначает группу
|
||
<literal>n</literal>. Для целей совместимости, так как
|
||
завершающий символ <literal>/</literal> ранее не
|
||
требовался в элементах
|
||
<makevar>MASTER_SITE_SUBDIR</makevar> и
|
||
<makevar>PATCH_SITE_SUBDIR</makevar>, если символ, сразу
|
||
предшествующий постфиксу, не является символом
|
||
<literal>/</literal>, то <literal>:n</literal> будет
|
||
считаться корректной частью элемента, а не постфиксом
|
||
группы, даже если за элементом следует
|
||
<literal>:n</literal>. Посмотрите <xref
|
||
linkend="ports-master-sites-n-example-detailed-use-master-site-subdir"/>
|
||
и <xref
|
||
linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para>
|
||
|
||
<example id="ports-master-sites-n-example-detailed-use-master-site-subdir">
|
||
<title>Подробное использование
|
||
<literal>MASTER_SITES:n</literal> в
|
||
<makevar>MASTER_SITE_SUBDIR</makevar></title>
|
||
|
||
<programlisting>MASTER_SITE_SUBDIR= old:n new/:NEW</programlisting>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Каталоги внутри группы
|
||
<literal>DEFAULT</literal> -> old:n</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Каталоги внутри группы
|
||
<literal>NEW</literal> -> new</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</example>
|
||
|
||
<example
|
||
id="ports-master-sites-n-example-detailed-use-complete-example-master-sites">
|
||
<title>Подробное использование
|
||
<literal>MASTER_SITES:n</literal> с запятыми,
|
||
несколькими файлами, несколькими серверами и
|
||
несколькими подкаталогами</title>
|
||
|
||
<programlisting>MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
|
||
http://site3/:group3 http://site4/:group4 \
|
||
http://site5/:group5 http://site6/:group6 \
|
||
http://site7/:DEFAULT,group6 \
|
||
http://site8/%SUBDIR%/:group6,group7 \
|
||
http://site9/:group8
|
||
DISTFILES= file1 file2:DEFAULT file3:group3 \
|
||
file4:group4,group5,group6 file5:grouping \
|
||
file6:group7
|
||
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
|
||
directory-one/:group6,DEFAULT \
|
||
directory</programlisting>
|
||
|
||
<para>Предыдущий пример приводит к следующей точной
|
||
сгрузке. Серверы перечислены в точном порядке их
|
||
использования.</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><filename>file1</filename> будет сгружаться
|
||
с</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory-trial:1/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory-one/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site2/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site7/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>file2</filename> будет сгружаться точно
|
||
также, как <filename>file1</filename>, так как они
|
||
оба относятся к одной и той же группе</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory-trial:1/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory-one/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site1/directory/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site2/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site7/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>file3</filename> будет сгружен с</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site3/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>file4</filename> будет сгружаться
|
||
с</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site4/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site5/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site6/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site7/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site8/directory-one/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>file5</filename> будет сгружен с</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename>file6</filename> будет сгружаться
|
||
с</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_OVERRIDE</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>http://site8/</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>MASTER_SITE_BACKUP</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</example>
|
||
</listitem>
|
||
</orderedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Как мне сгруппировать одну из специальных переменных из
|
||
<filename>bsd.sites.mk</filename>, например,
|
||
<makevar>MASTER_SITE_SOURCEFORGE</makevar>?</para>
|
||
|
||
<para>Посмотрите <xref
|
||
linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>.</para>
|
||
|
||
<example
|
||
id="ports-master-sites-n-example-detailed-use-master-site-sourceforge">
|
||
<title>Подробное использование
|
||
<literal>MASTER_SITES:n</literal> с
|
||
<makevar>MASTER_SITE_SOURCEFORGE</makevar></title>
|
||
|
||
<programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
|
||
DISTFILES= something.tar.gz:sourceforge</programlisting>
|
||
</example>
|
||
|
||
<para><filename>something.tar.gz</filename> будет сгружаться со
|
||
всех сайтов из
|
||
<makevar>MASTER_SITE_SOURCEFORGE</makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Как мне использовать это с переменными
|
||
<makevar>PATCH*</makevar>?</para>
|
||
|
||
<para>Все примеры выполнялись с переменными
|
||
<makevar>MASTER*</makevar>, и они работают точно также и для
|
||
<makevar>PATCH*</makevar>, как это можно видеть в <xref
|
||
linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>.</para>
|
||
|
||
<example
|
||
id="ports-master-sites-n-example-detailed-use-patch-sites">
|
||
<title>Упрощённое использование
|
||
<literal>MASTER_SITES:n</literal> с
|
||
<makevar>PATCH_SITES</makevar>.</title>
|
||
|
||
<programlisting>PATCH_SITES= http://site1/ http://site2/:test
|
||
PATCHFILES= patch1:test</programlisting>
|
||
</example>
|
||
</listitem>
|
||
</orderedlist>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Что изменится для портов? А что не изменится?</title>
|
||
|
||
<orderedlist numeration="lowerroman">
|
||
<listitem>
|
||
<para>Все имеющиеся порты остаются без изменений. Код для
|
||
механизма <literal>MASTER_SITES:n</literal> активируется, если
|
||
только есть элементы, которые заканчиваются на
|
||
<literal>:<replaceable>n</replaceable></literal>, как и
|
||
элементы в соответствии с вышеописанным синтаксисом, особенно
|
||
как это показано в пункте <xref
|
||
linkend="porting-master-sites-n-group-semantics"/>.</para>
|
||
</listitem>
|
||
|
||
<listitem id="porting-master-sites-n-what-changes-in-port-targets">
|
||
<para>Цели порт остаются теми же самыми:
|
||
<maketarget>checksum</maketarget>,
|
||
<maketarget>makesum</maketarget>,
|
||
<maketarget>patch</maketarget>,
|
||
<maketarget>configure</maketarget>,
|
||
<maketarget>build</maketarget> и так далее. С обычными
|
||
исключениями для <maketarget>do-fetch</maketarget>,
|
||
<maketarget>fetch-list</maketarget>,
|
||
<maketarget>master-sites</maketarget> и
|
||
<maketarget>patch-sites</maketarget>.</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><maketarget>do-fetch</maketarget>: использует новую
|
||
группировку с постфиксами в <makevar>DISTFILES</makevar> и
|
||
<makevar>PATCHFILES</makevar> с соответствующими элементами
|
||
групп в <makevar>MASTER_SITES</makevar> и
|
||
<makevar>PATCH_SITES</makevar>, которые используют группы
|
||
из <makevar>MASTER_SITE_SUBDIR</makevar> и
|
||
<makevar>PATCH_SITE_SUBDIR</makevar>. Посмотрите <xref
|
||
linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><maketarget>fetch-list</maketarget>: работает также,
|
||
как старая цель <maketarget>fetch-list</maketarget> с тем
|
||
исключением, что она группирует, как и
|
||
<maketarget>do-fetch</maketarget>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><maketarget>master-sites</maketarget> и
|
||
<maketarget>patch-sites</maketarget>:
|
||
(несовместимы со старыми версиями) только возвращают
|
||
элементы группы <literal>DEFAULT</literal>; на самом деле
|
||
они выполняют цели
|
||
<maketarget>master-sites-default</maketarget> и
|
||
<maketarget>patch-sites-default</maketarget>
|
||
соответственно.</para>
|
||
|
||
<para>Более того, использование целей
|
||
<maketarget>master-sites-all</maketarget> или
|
||
<maketarget>patch-sites-all</maketarget> предпочтительно
|
||
для непосредственной проверки
|
||
<maketarget>MASTER_SITES</maketarget> или
|
||
<maketarget>PATCH_SITES</maketarget>. Также работа прямой
|
||
проверки в последующих версиях не гарантируется.
|
||
Посмотрите <xref
|
||
linkend="porting-master-sites-n-new-port-targets-master-sites-all"/>
|
||
для получения более дополнительной информации об этих новых
|
||
целях.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Новые цели построения портов</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Имеются цели
|
||
<maketarget>master-sites-<replaceable>n</replaceable></maketarget>
|
||
и
|
||
<maketarget>patch-sites-<replaceable>n</replaceable></maketarget>,
|
||
которые будут перечислять элементы соответствующей группы
|
||
<replaceable>n</replaceable> из
|
||
<makevar>MASTER_SITES</makevar> и
|
||
<makevar>PATCH_SITES</makevar> соответственно. К примеру,
|
||
<maketarget>master-sites-DEFAULT</maketarget> и
|
||
<maketarget>patch-sites-DEFAULT</maketarget> обе будут
|
||
возвращать элементы группы <literal>DEFAULT</literal>,
|
||
<maketarget>master-sites-test</maketarget> и
|
||
<maketarget>patch-sites-test</maketarget> группы
|
||
<literal>test</literal> и так далее.</para>
|
||
</listitem>
|
||
|
||
<listitem id="porting-master-sites-n-new-port-targets-master-sites-all">
|
||
<para>Имеются новые цели
|
||
<maketarget>master-sites-all</maketarget> и
|
||
<maketarget>patch-sites-all</maketarget>, которые выполняют
|
||
работу старых <maketarget>master-sites</maketarget> и
|
||
<maketarget>patch-sites</maketarget>. Они возвращают
|
||
элементы всех групп, как если бы они все принадлежали одной
|
||
и той же группе с тем, что она перечисляет ровно столько
|
||
<makevar>MASTER_SITE_BACKUP</makevar> и
|
||
<makevar>MASTER_SITE_OVERRIDE</makevar>, как и группы,
|
||
определённые в <makevar>DISTFILES</makevar> или
|
||
<makevar>PATCHFILES</makevar>; соответственно для
|
||
<maketarget>master-sites-all</maketarget> и
|
||
<maketarget>patch-sites-all</maketarget>.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
</listitem>
|
||
</orderedlist>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>DIST_SUBDIR</makevar></title>
|
||
|
||
<para>Не позволяйте вашему порту засорять
|
||
<filename>/usr/ports/distfiles</filename>. Если вашему порту
|
||
требуется сгрузить много файлов, или он содержит имя файла,
|
||
могущее вызвать конфликты с другими портами (например,
|
||
<filename>Makefile</filename>), то укажите в переменной
|
||
<makevar>DIST_SUBDIR</makevar> имя порта (должны подойти
|
||
<literal>${PORTNAME}</literal> или
|
||
<literal>${PKGNAMEPREFIX}${PORTNAME}</literal>). Это изменит
|
||
значение переменной <makevar>DISTDIR</makevar> со значения по
|
||
умолчанию <filename>/usr/ports/distfiles</filename> к значению
|
||
<filename>/usr/ports/distfiles/<makevar>DIST_SUBDIR</makevar></filename>,
|
||
и в результате всё, что требуется для порта, будет помещено в этот
|
||
подкаталог.</para>
|
||
|
||
<para>Он заглянет также в подкаталог с тем же именем на
|
||
основном резервном сервере <filename>ftp.FreeBSD.org</filename>.
|
||
(Явное задание переменной <makevar>DISTDIR</makevar> в вашем файле
|
||
<makevar>Makefile</makevar> этого не сделает, так что, пожалуйста,
|
||
воспользуйтесь <makevar>DIST_SUBDIR</makevar>.)</para>
|
||
|
||
<note>
|
||
<para>Это не коснётся тех сайтов <makevar>MASTER_SITES</makevar>,
|
||
которые вы указали в вашем файле
|
||
<filename>Makefile</filename>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>ALWAYS_KEEP_DISTFILES</makevar></title>
|
||
|
||
<para>Если ваш порт использует двоичные дистрибутивные файлы и
|
||
обладает лицензией, требующей, чтобы исходный код предоставлялся
|
||
вместе с пакетами, распространяемыми в двоичной форме, например
|
||
GPL, то <makevar>ALWAYS_KEEP_DISTFILES</makevar> даст кластеру
|
||
построения &os; указание сохранять копию файлов, указанных в
|
||
<makevar>DISTFILES</makevar>. Пользователям таких портов эти
|
||
файлы в основном не нужны, поэтому хорошей идеей является
|
||
добавление в <makevar>DISTFILES</makevar> исходных
|
||
дистрибутивных файлов, только когда определена переменная
|
||
<makevar>PACKAGE_BUILDING</makevar>.</para>
|
||
|
||
<example id="ports-master-sites-n-example-always-keep-distfiles">
|
||
<title>Использование <makevar>ALWAYS_KEEP_DISTFILES</makevar>.</title>
|
||
<programlisting>.if defined(PACKAGE_BUILDING)
|
||
DISTFILES+= <replaceable>foo.tar.gz</replaceable>
|
||
ALWAYS_KEEP_DISTFILES= yes
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<para>При добавлении дополнительных файлов в <makevar>DISTFILES</makevar>
|
||
убедитесь, что вы их также добавляете в <filename>distinfo</filename>.
|
||
Кроме того, дополнительные файлы обычно распаковываются также в
|
||
<makevar>WRKDIR</makevar>, что для некоторых портов может вызывать
|
||
нежелательные подобные эффекты и требовать особую обработку.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-maintainer">
|
||
<title><makevar>MAINTAINER</makevar></title>
|
||
|
||
<para>Укажите здесь ваш адрес электронной почты. Пожалуйста.
|
||
<!-- smiley --><emphasis>:-)</emphasis></para>
|
||
|
||
<para>Заметьте, что в качестве значения для
|
||
<makevar>MAINTAINER</makevar> допустимо использование только одного
|
||
адреса без поля комментария. Должен использоваться формат
|
||
<literal>user@hostname.domain</literal>. Пожалуйста, не включайте
|
||
никакого описательного текста, например, вашего настоящего имени в
|
||
эту строку—это несколько сбивает с толку
|
||
<filename>bsd.port.mk</filename>.</para>
|
||
|
||
<para>Сопровождающий ответственен за поддержание порта в актуальном
|
||
состоянии и обеспечение правильной работы порта. За подробным
|
||
описанием обязанностей сопровождающего порт обращайтесь к главе
|
||
<ulink url="&url.articles.contributing-ports.en;/maintain-port.html">The
|
||
challenge for port maintainers</ulink>.</para>
|
||
|
||
<para>Перед фиксацией в репозитории изменения в порте будут отправлены
|
||
сопровождающему для просмотра и одобрения.
|
||
Если сопровождающий порта не ответил на запрос пользователя об
|
||
обновлении в течение двух недель (исключая большие праздники),
|
||
то это можно считать тайм-аутом сопровождающего, и обновление может
|
||
быть выполнено без явного подтверждения от сопровождающего. Если
|
||
сопровождающий не отвечает в течение трёх месяцев, то считается, что
|
||
он отсутствует, и как сопровождающий порта, о котором идёт речь, может
|
||
быть заменён. Исключениями из этого правила является всё, что
|
||
сопровождает &a.portmgr; или &a.security-officer;. Запрещено делать
|
||
любые несанкционированные изменения в портах, которые ведут эти
|
||
группы.</para>
|
||
|
||
<para>Мы оставляем за собой право изменять сообщение сопровождающего
|
||
для лучшего соответствия существующим политикам и стилю Коллекции
|
||
Портов без явного одобрения со стороны отправителя. Также,
|
||
крупные изменения в инфраструктуре могут повлечь изменения в порте
|
||
без согласия сопровождающего. Такой вид изменений никогда не будет
|
||
затрагивать функциональность порта.</para>
|
||
|
||
<para>За &a.portmgr; оставляется право снять или назначить кого-либо
|
||
сопровождающим по любой причине, а за the &a.security-officer;
|
||
оставляется право лишать или назначать права на сопровождение порта
|
||
по соображениям информационной безопасности.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-comment">
|
||
<title><makevar>COMMENT</makevar></title>
|
||
|
||
<para>Это однострочное описание порта. <emphasis>Пожалуйста</emphasis>,
|
||
не включайте сюда название пакета (или номер версии программного
|
||
обеспечения). Комментарий должен начинаться с заглавной буквы и не
|
||
заканчиваться точкой. Вот пример:</para>
|
||
|
||
<programlisting>A cat chasing a mouse all over the screen</programlisting>
|
||
|
||
<para>В файле <filename>Makefile</filename> переменная COMMENT должна
|
||
следовать сразу за переменной MAINTAINER.</para>
|
||
|
||
<para>Пожалуйста, постарайтесь делать строку COMMENT длиной не больше,
|
||
чем 70 символов, так как эта строка будет использована программой
|
||
&man.pkg.info.1; для отображения однострочного описания порта.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-depend">
|
||
<title>Зависимости</title>
|
||
|
||
<para>Многие порты зависят от других портов. Это очень удобная
|
||
замечательная особенность большинства Unix-подобных операционных
|
||
систем, включая &os;. Множество портов могут использовать общую
|
||
зависимость совместно, а не включать её в состав каждого порта или
|
||
пакета, который в ней нуждается. Имеется семь переменных,
|
||
которые вы можете использовать для обеспечения того, что всё
|
||
требуемое находится на машине пользователя. Имеется также несколько
|
||
предопределённых переменных, отражающих зависимости для общих
|
||
случаев, плюс ещё несколько для управления поведением
|
||
зависимостей.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>LIB_DEPENDS</makevar></title>
|
||
|
||
<para>Эта переменная указывает, от каких совместно используемых
|
||
библиотек зависит порт. Это список пар
|
||
<replaceable>lib</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
|
||
где <replaceable>lib</replaceable> - это имя библиотеки,
|
||
<replaceable>dir</replaceable> - это каталог, в котором можно ее
|
||
найти в случае, если ее нет на машине, и
|
||
<replaceable>target</replaceable> - это цель, которую нужно вызвать
|
||
в этом каталоге. Например,</para>
|
||
|
||
<programlisting>LIB_DEPENDS= jpeg:${PORTSDIR}/graphics/jpeg</programlisting>
|
||
|
||
<para>проверит наличие библиотеки jpeg с любым номером версии и
|
||
перейдет в подкаталог <filename>graphics/jpeg</filename> вашего
|
||
дерева портов для ее построения и установки, если библиотека
|
||
отсутствует. Часть <replaceable>target</replaceable> может быть
|
||
опущена, если она равна <makevar>DEPENDS_TARGET</makevar>
|
||
(по умолчанию <literal>install</literal>).</para>
|
||
|
||
<note>
|
||
<para>Часть <replaceable>lib</replaceable> является регулярным
|
||
выражением, которое вызывается для вывода, полученного из
|
||
<command>ldconfig -r</command>. Разрешаются такие значения, как
|
||
<literal>intl.9</literal> и <literal>intl.[5-7]</literal>.
|
||
Первый шаблон, <literal>intl.9</literal>, совпадает только с
|
||
intl версии 9, в то время как <literal>intl.[5-7]</literal>
|
||
совпадает с любым из: <literal>intl.5</literal>,
|
||
<literal>intl.6</literal> и <literal>intl.7</literal>.</para>
|
||
</note>
|
||
|
||
<para>Зависимость проверяется дважды, один раз внутри цели
|
||
<maketarget>extract</maketarget>, а затем из цели
|
||
<maketarget>install</maketarget>. Кроме того, имя зависимости
|
||
помещается в пакет, так что &man.pkg.add.1; будет
|
||
автоматически его устанавливать, если его нет на пользовательской
|
||
системе.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>RUN_DEPENDS</makevar></title>
|
||
|
||
<para>В этой переменной перечисляются выполнимые файлы или файлы, от
|
||
которых зависит работа порта. Это список пар вида
|
||
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
|
||
где <replaceable>path</replaceable> - это имя программы или файла,
|
||
а <replaceable>dir</replaceable> - каталог, в котором можно найти
|
||
порт в случае, если его нет в системе, и
|
||
<replaceable>target</replaceable> - это цель, которую нужно вызвать
|
||
в этом каталоге. Если <replaceable>path</replaceable> начинается
|
||
со слэша (<literal>/</literal>), он воспринимается как файл и его
|
||
существование проверяется командой <command>test -e</command>; в
|
||
противном случае предполагается, что это выполнимый файл, и
|
||
для определения того, имеется ли программа в пути поиска,
|
||
используется команда <command>which -s</command>.</para>
|
||
|
||
<para>Например,</para>
|
||
|
||
<programlisting>RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:${PORTSDIR}/news/inn \
|
||
xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr</programlisting>
|
||
|
||
<para>проверит существование файла или каталога
|
||
<filename>/usr/local/news/bin/innd</filename>, и если ничего
|
||
не будет найдено, то построит и установит порт из подкаталога
|
||
<filename>news/inn</filename> дерева портов. Также будет
|
||
выполнена проверка, присутствует ли в пути поиска исполняемый
|
||
файл с именем <command>xmlcatmgr</command>, и перейдет в
|
||
подкаталог <filename>textproc/xmlcatmgr</filename> вашего дерева
|
||
портов для его построения и установки, если он не будет
|
||
найден.</para>
|
||
|
||
<note>
|
||
<para>В приведенном примере <command>innd</command> является
|
||
выполнимым файлом; если выполнимый файл находится в месте,
|
||
которое отсутствует в списке путей файлов, то вы должны указать
|
||
полный путь к файлу.</para>
|
||
</note>
|
||
|
||
<note>
|
||
<para>Официальным значением переменной поиска <envar>PATH</envar>,
|
||
используемым в кластере построения портов является</para>
|
||
|
||
<programlisting>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</programlisting>
|
||
</note>
|
||
|
||
<para>Зависимость проверяется внутри цели
|
||
<maketarget>install</maketarget>. Кроме того, имя зависимости
|
||
помещается в пакет, так что программа &man.pkg.add.1;
|
||
будет автоматически его устанавливать, если он не будет найден
|
||
в пользовательской системе. Часть
|
||
<replaceable>target</replaceable> может быть опущена, если она
|
||
совпадает с <makevar>DEPENDS_TARGET</makevar>.</para>
|
||
|
||
<para>Довольно распространенной является ситуация, когда
|
||
<makevar>RUN_DEPENDS</makevar> буквально такая же как
|
||
<makevar>BUILD_DEPENDS</makevar>, особенно если переносимое
|
||
программное обеспечение написано на языке сценариев, или если
|
||
оно требует такое же окружение для исполнения, как и используемое
|
||
во время построения. В этом случае, очень заманчивым или довольно
|
||
естественным является присвоение одного другому:</para>
|
||
|
||
<programlisting>RUN_DEPENDS= ${BUILD_DEPENDS}</programlisting>
|
||
|
||
<para>Тем не менее, подобные присвоения могут загрязнять зависимости
|
||
времени исполнения содержимым, не заданным в
|
||
<makevar>BUILD_DEPENDS</makevar> исходного порта.
|
||
Такое случается из-за ленивого вычисления в &man.make.1;
|
||
присваиваемых переменных. Представьте <filename>Makefile</filename>
|
||
с переменными <makevar>USE_<replaceable>*</replaceable></makevar>,
|
||
которые обрабатываются в <filename>ports/Mk/bsd.*.mk</filename>
|
||
для пополнения первоначальных зависимостей построения. Например,
|
||
<literal>USE_GMAKE=yes</literal> добавляет
|
||
<filename role="package">devel/gmake</filename> в
|
||
<makevar>BUILD_DEPENDS</makevar>. Для предотвращения загрязнения
|
||
<makevar>RUN_DEPENDS</makevar> подобными дополнительными
|
||
зависимостями проявляйте осторожность с присвоением с раскрытием,
|
||
т.е. с раскрытием значения перед его присвоением переменной:</para>
|
||
|
||
<programlisting>RUN_DEPENDS:= ${BUILD_DEPENDS}</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>BUILD_DEPENDS</makevar></title>
|
||
|
||
<para>В этой переменной перечисляются выполнимые или обычные файлы,
|
||
которые требуются порту для его построения. Как и
|
||
<makevar>RUN_DEPENDS</makevar>, это список пар
|
||
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
|
||
Например,</para>
|
||
|
||
<programlisting>BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting>
|
||
|
||
<para>будет проверять
|
||
наличие выполнимого фала с именем <command>unzip</command> и
|
||
перейдет в подкаталог <filename>archivers/unzip</filename> вашего
|
||
дерева портов для его построения и установки, если последний не
|
||
будет найден.</para>
|
||
|
||
<note>
|
||
<para>Под <quote>построением</quote> здесь понимается всё, от
|
||
распаковки до компиляции. Зависимость проверяется из цели
|
||
<maketarget>extract</maketarget>. Часть
|
||
<replaceable>target</replaceable> может быть опущена, если она
|
||
совпадает с <makevar>DEPENDS_TARGET</makevar>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>FETCH_DEPENDS</makevar></title>
|
||
|
||
<para>В этой переменной перечисляются выполняемые файлы или просто
|
||
файлы, которые требуются порту для сгрузки. Как и предыдущие две
|
||
переменные, это список пар
|
||
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
|
||
Например,</para>
|
||
|
||
<programlisting>FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2</programlisting>
|
||
|
||
<para>будет проверять
|
||
наличие выполняемого файла с именем <command>ncftp2</command> и
|
||
перейдет в каталог <filename>net/ncftp2</filename> вашего дерева
|
||
портов для его построения и установки, если тот не будет
|
||
найден.</para>
|
||
|
||
<para>Зависимость проверяется при выполнении цели
|
||
<maketarget>fetch</maketarget>. Часть
|
||
<replaceable>target</replaceable> может быть опущена, если она
|
||
совпадает с <makevar>DEPENDS_TARGET</makevar>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>EXTRACT_DEPENDS</makevar></title>
|
||
|
||
<para>В этой переменной указываются программы или файлы, которые
|
||
требуются для распаковки порта. Как и в предыдущих случаях, это
|
||
список пар вида
|
||
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>.
|
||
Например,</para>
|
||
|
||
<programlisting>EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting>
|
||
|
||
<para>будет проверять
|
||
наличие программы с именем <command>unzip</command>, и перейдёт в
|
||
подкаталог <filename>archivers/unzip</filename> вашего дерева
|
||
портов для её построения и установки, если такой программы не будет
|
||
найдено.</para>
|
||
|
||
<para>Зависимость проверяется внутри цели
|
||
<maketarget>extract</maketarget>. Часть
|
||
<replaceable>target</replaceable> может быть опущена, если она
|
||
совпадает с <makevar>DEPENDS_TARGET</makevar>.</para>
|
||
|
||
<note>
|
||
<para>Используйте эту переменную, только если распаковка не
|
||
работает (по умолчанию предполагается использование
|
||
<command>gzip</command>) и это не исправляется при помощи
|
||
<makevar>USE_ZIP</makevar> или <makevar>USE_BZIP2</makevar>,
|
||
которые описаны в <xref linkend="use-vars"/>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>PATCH_DEPENDS</makevar></title>
|
||
|
||
<para>Эта переменная указывает на программы или файлы, которые нужны
|
||
порту для применения патчей. Как и в предыдущих случаях, это
|
||
список пар вида
|
||
<replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>.
|
||
Например,</para>
|
||
|
||
<programlisting>PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract</programlisting>
|
||
|
||
<para>будет
|
||
переходить в подкаталог <filename>java/jfc</filename> вашего дерева
|
||
портов для распаковки.</para>
|
||
|
||
<para>Зависимость проверяется внутри цели
|
||
<maketarget>patch</maketarget>. Часть
|
||
<replaceable>target</replaceable> может быть опущена, если она
|
||
совпадает с <makevar>DEPENDS_TARGET</makevar>.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="use-vars">
|
||
<title><makevar>USE_<replaceable>*</replaceable></makevar></title>
|
||
|
||
<para>Для определения общих зависимостей, совместно используемых
|
||
многими портами, предназначено несколько переменных. Их
|
||
использование является необязательным, но помогает упростить
|
||
избыточность файлов <filename>Makefile</filename> порта.
|
||
Каждый из них оформляется как
|
||
<makevar>USE_<replaceable>*</replaceable></makevar>. Эти
|
||
переменные можно использовать только в <filename>Makefile</filename>
|
||
порта и <filename>ports/Mk/bsd.*.mk</filename>. Они не
|
||
предназначены для установки пользователями параметров —
|
||
используйте для этих целей <makevar>PORT_OPTIONS</makevar>.</para>
|
||
|
||
<note>
|
||
<para>Установка любых <makevar>USE_<replaceable>*</replaceable></makevar>
|
||
в <filename>/etc/make.conf</filename> <emphasis>всегда</emphasis>
|
||
является ошибочным действием. В частности, установка</para>
|
||
|
||
<programlisting>USE_GCC= 3.4</programlisting>
|
||
|
||
<para>добавит зависимость
|
||
от gcc34 к каждому порту, включая сам gcc34!</para>
|
||
</note>
|
||
|
||
<table frame="none">
|
||
<title>Переменные
|
||
<makevar>USE_<replaceable>*</replaceable></makevar></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Смысл</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_BZIP2</makevar></entry>
|
||
|
||
<entry>tar-архивы порта упакованы при помощи
|
||
<command>bzip2</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_ZIP</makevar></entry>
|
||
|
||
<entry>tar-архивы порта упакованы при помощи
|
||
<command>zip</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_BISON</makevar></entry>
|
||
|
||
<entry>Для построения порт использует
|
||
<command>bison</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_CDRTOOLS</makevar></entry>
|
||
|
||
<entry>Порт требует <application>cdrecord</application>
|
||
из <filename
|
||
role="package">sysutils/cdrtools</filename> или <filename
|
||
role="package">sysutils/cdrtools-cjk</filename> в
|
||
зависимости от предпочтений пользователя.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_GCC</makevar></entry>
|
||
|
||
<entry>Порт требует для сборки специальную версию
|
||
<command>gcc</command>. Точная версия может быть указана
|
||
в значении переменной, например <literal>3.4</literal>.
|
||
Минимально необходимую версию можно указать как
|
||
<literal>3.4+</literal>. <command>gcc</command> из
|
||
основной системы используется в случае, если он
|
||
удовлетворяет запрошенной версии, иначе производится
|
||
компиляция подходящей версии <command>gcc</command> из
|
||
портов с коррекций переменных <makevar>CC</makevar> и
|
||
<makevar>CXX</makevar>.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Переменные, относящиеся к <application>gmake</application>
|
||
и сценарию <filename>configure</filename>, описаны в
|
||
<xref linkend="building"/>, а <application>autoconf</application>,
|
||
<application>automake</application> и
|
||
<application>libtool</application> описаны в
|
||
<xref linkend="using-autotools"/>. Переменные, связанные с
|
||
<application>Perl</application>, описаны в <xref
|
||
linkend="using-perl"/>. Переменные X11 перечислены в <xref
|
||
linkend="using-x11"/>. <xref linkend="using-gnome"/>
|
||
работает с переменными GNOME и <xref linkend="using-kde"/> с KDE.
|
||
<xref linkend="using-java"/> описывает переменные Java, а <xref
|
||
linkend="using-php"/> содержит информацию об
|
||
<application>Apache</application>, <application>PHP</application>
|
||
и модулях PEAR. <application>Python</application> обсуждается в
|
||
<xref linkend="using-python"/>, а <application>Ruby</application>
|
||
в <xref linkend="using-ruby"/>. <xref linkend="using-sdl"/>
|
||
предоставляет переменные, используемые для приложений
|
||
<application>SDL</application>, и, наконец,
|
||
<xref linkend="using-xfce"/> содержит информацию о приложении
|
||
<application>Xfce</application>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Минимальная версия зависимости</title>
|
||
|
||
<para>Минимальная версия зависимости может быть указана в любой
|
||
переменной <makevar>*_DEPENDS</makevar>, за исключением
|
||
<makevar>LIB_DEPENDS</makevar>, с использованием следующего
|
||
синтаксиса:</para>
|
||
|
||
<programlisting>p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy</programlisting>
|
||
|
||
<para>Первое поле содержит название зависимого пакета, которое
|
||
обязано совпадать с записью в базе данные пакетов, знак сравнения
|
||
и версию версию пакета. Зависимость удовлетворяется если на машине
|
||
установлен p5-Spiffy-0.26 или новее.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Замечания касательно зависимостей</title>
|
||
|
||
<para>Как уже отмечено выше, целью, которая вызывается по умолчанию
|
||
в случае, когда это требует зависимость, является
|
||
<maketarget>DEPENDS_TARGET</maketarget>. Она по умолчанию есть
|
||
<literal>install</literal>. Это пользовательская переменная; она
|
||
нигде не определена в файле <filename>Makefile</filename> порта.
|
||
Если вашему порту требуется особый метод обработки зависимости,
|
||
воспользуйтесь частью <literal>:target</literal> переменной
|
||
<makevar>*_DEPENDS</makevar> вместо того, чтобы переопределять
|
||
<makevar>DEPENDS_TARGET</makevar>.</para>
|
||
|
||
<para>Когда вы набираете команду <command>make clean</command>,
|
||
эта операция также выполняется и над зависимостями этого порта.
|
||
Если вы не хотите, чтобы это случилось, определите переменную
|
||
<makevar>NOCLEANDEPENDS</makevar> в вашем окружении.
|
||
Это может быть особенно нужным, если порт имеет нечто, что занимает
|
||
много времени на построение, в своём списке зависимостей, например,
|
||
KDE, GNOME или Mozilla.</para>
|
||
|
||
<para>Чтобы безусловно зависеть от другого порта, укажите переменную
|
||
<makevar>${NONEXISTENT}</makevar> в качестве первого поля
|
||
переменной <makevar>BUILD_DEPENDS</makevar> или
|
||
<makevar>RUN_DEPENDS</makevar>. Пользуйтесь этим, только когда вам
|
||
нужно иметь исходный код другого порта. Вы можете сэкономить время
|
||
на компиляции, указав также и цель. Например,</para>
|
||
|
||
<programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting>
|
||
|
||
<para>всегда будет переходить в каталог с портом
|
||
<literal>jpeg</literal> и распаковывать его.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Зацикленные зависимости фатальны</title>
|
||
|
||
<important>
|
||
<para>Не помещайте зацикливающиеся зависимости в дерево
|
||
портов!</para>
|
||
</important>
|
||
|
||
<para>Технология построения портов не защищена от зацикленных
|
||
зависимостей. Если вы создадите такую, то у кого-нибудь и
|
||
где-нибудь установка FreeBSD будет немедленно сломана, а у остальных
|
||
сломается несколько позже. Это на самом деле очень трудно
|
||
распознать; если вы сомневаетесь, то перед внесением изменений
|
||
проверьте, что выполнили следующее: <command>cd /usr/ports; make
|
||
index</command>. Этот процесс может быть достаточно медленным на
|
||
старых машинах, хотя мы сможете спасти большое количество
|
||
людей—включая себя—от грядущих бед.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Автоматические зависимости и проблемы, которые они
|
||
вызывают</title>
|
||
|
||
<para>Зависимости должны быть указаны либо явно, либо с
|
||
использованием <link linkend="makefile-options">фреймворка
|
||
OPTIONS</link>. Использование прочих методов, таких как
|
||
автоматическое обнаружение зависимостей, усложняет индексирование,
|
||
что вызывает проблемы в управлении портами и пакетами.</para>
|
||
|
||
<example>
|
||
<title>Некорректное объявление необязательной зависимости</title>
|
||
|
||
<programlisting>.include <bsd.port.pre.mk>
|
||
|
||
.if exists(${LOCALBASE}/bin/foo)
|
||
LIB_DEPENDS= bar:${PORTSDIR}/foo/bar
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<para>Проблема автоматического добавления зависимостей
|
||
заключается в том, что файлы и настройки за пределами порта
|
||
могут произвольно меняться. Пример: после построения
|
||
индекса устанавливается набор портов. При этом один из
|
||
них устанавливает проверяемый файл. На этом этапе индекс
|
||
будет неправильным, потому что установленный порт неожиданно
|
||
получит новую зависимость. Индекс может быть по прежнему
|
||
неправильным даже после его перестроения, в случае если
|
||
другие порты также определят дополнительные зависимости,
|
||
основываясь на существовании других файлов.</para>
|
||
|
||
<example>
|
||
<title>Корректное объявление необязательной зависимости</title>
|
||
|
||
<programlisting>OPTIONS_DEFINE= BAR
|
||
BAR_DESC= Enable bar support
|
||
|
||
.include <bsd.port.options.mk>
|
||
|
||
.if ${PORTOPTIONS:MBAR}
|
||
LIB_DEPENDS= bar:${PORTSDIR}/foo/bar
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<para>Правильным способом является проверка переменных параметров.
|
||
Этот способ не приводит к несоответствиям в индексе набора
|
||
портов, поскольку параметры определены до построения индекса.
|
||
При этом можно использовать простые скрипты для автоматизации
|
||
построения, установки и обновления этих портов и соответствующих
|
||
им пакетов.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="use-want">
|
||
<title><makevar>USE_</makevar> и
|
||
<makevar>WANT_</makevar></title>
|
||
|
||
<para>Переменные <makevar>USE_</makevar> задаются мейнтейнером
|
||
порта для определения программного обеспечения, от которого
|
||
этот порт зависит. Порт, для которого нужен Firefox,
|
||
укажет</para>
|
||
|
||
<programlisting>USE_FIREFOX= yes</programlisting>
|
||
|
||
<para>Некоторые переменные <makevar>USE_</makevar> могут
|
||
принимать номера версий или другие параметры. Например,
|
||
порт, который требует Apache 2.2, укажет</para>
|
||
|
||
<programlisting>USE_APACHE= 22</programlisting>
|
||
|
||
<para>В некоторых случаях для большего контроля над
|
||
зависимостями используются переменные <makevar>WANT_</makevar>,
|
||
которые позволяют указывать требования в более точной форме.
|
||
Например, взгляните на порт <filename
|
||
role="package">mail/squirrelmail</filename>. Этому порту
|
||
нужны несколько модулей PHP, которые перечислены в переменной
|
||
<makevar>USE_PHP</makevar>:</para>
|
||
|
||
<programlisting>USE_PHP= session mhash gettext mbstring pcre openssl xml</programlisting>
|
||
|
||
<para>Эти модули доступны в версиях CLI и web, поэтому версия
|
||
web выбрана с переменной <makevar>WANT_</makevar>:</para>
|
||
|
||
<programlisting>WANT_PHP_WEB= yes</programlisting>
|
||
|
||
<para>Имеющиеся переменные <makevar>USE_</makevar> и
|
||
<makevar>WANT_</makevar> определены в файлах
|
||
<filename>/usr/ports/Mk</filename>.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-masterdir">
|
||
<title><makevar>MASTERDIR</makevar></title>
|
||
|
||
<para>Если вашему порту требуется построение довольно различающихся
|
||
версий пакетов через переменную (задающую, например, разрешение,
|
||
или размер бумаги), которая принимает различные значения, создайте для
|
||
каждого пакета отдельный подкаталог, чтобы пользователям было легче
|
||
определить, каким пакетом воспользоваться, но попробуйте использовать
|
||
совместно между портами как можно больше файлов. В типичном случае вам
|
||
потребуются только очень короткие файлы <filename>Makefile</filename>
|
||
во всех каталогах, кроме одного, если вы будете использовать переменные
|
||
с умом. В отдельных файлах <filename>Makefile</filename> вы можете
|
||
использовать переменную <makevar>MASTERDIR</makevar> для указания
|
||
каталога, в котором находятся все остальные файлы. Также используйте
|
||
переменную как часть <link
|
||
linkend="porting-pkgname"><makevar>PKGNAMESUFFIX</makevar></link>, чтобы
|
||
пакеты имели разные имена.</para>
|
||
|
||
<para>Продемонстрируем это на примере. Вот часть файла
|
||
<filename>japanese/xdvi300/Makefile</filename>:</para>
|
||
|
||
<programlisting>
|
||
PORTNAME= xdvi
|
||
PORTVERSION= 17
|
||
PKGNAMEPREFIX= ja-
|
||
PKGNAMESUFFIX= ${RESOLUTION}
|
||
:
|
||
# default
|
||
RESOLUTION?= 300
|
||
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
|
||
${RESOLUTION} != 300 && ${RESOLUTION} != 400
|
||
@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
|
||
@${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
|
||
@${FALSE}
|
||
.endif
|
||
</programlisting>
|
||
|
||
<para>Порт <filename role="package">japanese/xdvi300</filename> содержит
|
||
также все обычные патчи, файлы для пакета и так далее. Если вы введете
|
||
здесь команду <command>make</command>, она возьмет в качестве разрешения
|
||
значение по умолчанию (300) и построит порт обычным образом.</para>
|
||
|
||
<para>Для другого разрешения приведем <emphasis>полный</emphasis>
|
||
<filename>xdvi118/Makefile</filename>:</para>
|
||
|
||
<programlisting>RESOLUTION= 118
|
||
MASTERDIR= ${.CURDIR}/../xdvi300
|
||
|
||
.include "${MASTERDIR}/Makefile"</programlisting>
|
||
|
||
<para>(<filename>xdvi240/Makefile</filename> и
|
||
<filename>xdvi400/Makefile</filename> похожи). Задание
|
||
<makevar>MASTERDIR</makevar> говорит <filename>bsd.port.mk</filename>,
|
||
что обычный набор подкаталогов типа <makevar>FILESDIR</makevar> и
|
||
<makevar>SCRIPTDIR</makevar> находится в каталоге
|
||
<filename>xdvi300</filename>. Строчка
|
||
<literal>RESOLUTION=118</literal> переопределят строку
|
||
<literal>RESOLUTION=300</literal> в файле
|
||
<filename>xdvi300/Makefile</filename> и порт будет построен с
|
||
разрешением 118.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-manpages">
|
||
<title>Страницы Справочника</title>
|
||
|
||
<para>Переменные <makevar>MAN[1-9LN]</makevar> автоматически добавят любые
|
||
страницы Справочника к файлу <filename>pkg-plist</filename> (это
|
||
означает, что вам <emphasis>не нужно</emphasis> указывать страницы
|
||
Справочника в файле <filename>pkg-plist</filename>—обратитесь к
|
||
главе о <link linkend="plist-sub">генерации файла PLIST</link> для
|
||
получения более подробной информации). Это также позволяет на этапе
|
||
установки автоматически упаковывать и распаковывать страницы
|
||
Справочника в зависимости от значения переменной
|
||
<makevar>NO_MANCOMPRESS</makevar> в файле
|
||
<filename>/etc/make.conf</filename>.</para>
|
||
|
||
<para>Если ваш порт пытается задать несколько имен для страниц
|
||
Справочника при помощи символических или жестких ссылок, то вы должны
|
||
использовать переменную <makevar>MLINKS</makevar>, чтобы указать на
|
||
это. Ссылка, установленная вашим портом, будет уничтожена и создана
|
||
заново сценарием <filename>bsd.port.mk</filename> для проверки того,
|
||
что она указывает на правильный файл. Любые страницы Справочника,
|
||
перечисленные в переменной MLINKS, не должны фигурировать в файле
|
||
<filename>pkg-plist</filename>.</para>
|
||
|
||
<para>Для указания того, что страницы Справочника нужно сжимать во
|
||
время установки, используйте переменную
|
||
<makevar>MANCOMPRESSED</makevar>. Эта переменная может принимать три
|
||
значения - <literal>yes</literal>, <literal>no</literal> и
|
||
<literal>maybe</literal>. <literal>yes</literal> означает, что
|
||
страницы Справочника устанавливаются уже сжатыми, <literal>no</literal>
|
||
означает, что они не сжимаются и <literal>maybe</literal> означает, что
|
||
программное обеспечение принимает во внимание значение переменной
|
||
<makevar>NO_MANCOMPRESS</makevar>, так что сценарию
|
||
<filename>bsd.port.mk</filename> ничего дополнительно делать не
|
||
нужно.</para>
|
||
|
||
<para>Значение переменной <makevar>MANCOMPRESSED</makevar> автоматически
|
||
устанавливается в <literal>yes</literal>, если переменная
|
||
<makevar>USE_IMAKE</makevar> задана, а
|
||
<makevar>NO_INSTALL_MANPAGES</makevar> нет, и в значение
|
||
<literal>no</literal> в противном случае. Вам не нужно задавать ее
|
||
явно, если значение по умолчанию подходит вашему порту.</para>
|
||
|
||
<para>Если ваш порт определяет корнем для файлов Справочника каталог,
|
||
отличный от <makevar>PREFIX</makevar>, вы можете использовать
|
||
переменную <makevar>MANPREFIX</makevar>, чтобы задать его явно. Кроме
|
||
того, если страницы только некоторых разделов помещаются в
|
||
нестандартное место, например, в случае портов модулей языка
|
||
<literal>perl</literal> Perl, вы можете установить маршруты к справочным
|
||
страницам индивидуально, при помощи
|
||
<makevar>MAN<replaceable>sect</replaceable>PREFIX</makevar> (где
|
||
<replaceable>sect</replaceable> принимает значения
|
||
<literal>1-9</literal>, <literal>L</literal> или
|
||
<literal>N</literal>).</para>
|
||
|
||
<para>Если страницы Справочника помещаются в подкаталоги, соответствующие
|
||
некоторому языку, то задайте название языка языка в переменной
|
||
<makevar>MANLANG</makevar>. Значение этой переменной по умолчанию
|
||
равно <literal>""</literal> (то есть только английский язык).</para>
|
||
|
||
<para>Вот пример, в котором приводятся все случаи.</para>
|
||
|
||
<programlisting>
|
||
MAN1= foo.1
|
||
MAN3= bar.3
|
||
MAN4= baz.4
|
||
MLINKS= foo.1 alt-name.8
|
||
MANLANG= "" ja
|
||
MAN3PREFIX= ${PREFIX}/share/foobar
|
||
MANCOMPRESSED= yes
|
||
</programlisting>
|
||
|
||
<para>Здесь указано, что этот порт устанавливает 6 файлов:</para>
|
||
|
||
<programlisting>${MANPREFIX}/man/man1/foo.1.gz
|
||
${MANPREFIX}/man/ja/man1/foo.1.gz
|
||
${PREFIX}/share/foobar/man/man3/bar.3.gz
|
||
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
|
||
${MANPREFIX}/man/man4/baz.4.gz
|
||
${MANPREFIX}/man/ja/man4/baz.4.gz</programlisting>
|
||
|
||
<para>Кроме того, файл
|
||
<filename>${MANPREFIX}/man/man8/alt-name.8.gz</filename> может быть, а
|
||
может и не быть установлен вашим портом. В любом случае будет создана
|
||
символическая ссылка для объединения страниц Справочника foo(1) и
|
||
alt-name(8).</para>
|
||
|
||
<para>Если переведена только часть страниц справочника, вы можете
|
||
использовать некоторые переменные, созданные динамически из
|
||
содержимого <makevar>MANLANG</makevar>:</para>
|
||
|
||
<programlisting>MANLANG= "" de ja
|
||
MAN1= foo.1
|
||
MAN1_EN= bar.1
|
||
MAN3_DE= baz.3</programlisting>
|
||
|
||
<para>Что переводится в такой список файлов:</para>
|
||
|
||
<programlisting>${MANPREFIX}/man/man1/foo.1.gz
|
||
${MANPREFIX}/man/de/man1/foo.1.gz
|
||
${MANPREFIX}/man/ja/man1/foo.1.gz
|
||
${MANPREFIX}/man/man1/bar.1.gz
|
||
${MANPREFIX}/man/de/man3/baz.3.gz</programlisting>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-info">
|
||
<title>Файлы в формате info</title>
|
||
|
||
<para>Если в вашем пакете нужна установка файлов GNU info, они должны
|
||
быть перечислены в переменной <makevar>INFO</makevar> (без окончания
|
||
<literal>.info</literal>), по записи на документ. Предполагается,
|
||
что эти файлы устанавливаются в
|
||
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename>.
|
||
Вы можете изменить <makevar>INFO_PATH</makevar>, если ваш пакет
|
||
использует другое место для размещения. Однако, это не рекомендуется
|
||
делать. Эти записи всего лишь содержат путь относительно
|
||
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename>.
|
||
Например, <filename role="package">lang/gcc34</filename> устанавливает
|
||
файлы info в
|
||
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar>/gcc34</filename>,
|
||
и в <makevar>INFO</makevar> будет что-то вроде этого:</para>
|
||
|
||
<programlisting>INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...</programlisting>
|
||
|
||
<para>Перед регистрацией пакета соответствующий код установки/удаления будет
|
||
автоматически добавлен во временный <filename>pkg-plist</filename>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-options">
|
||
<title>Опции для Makefile</title>
|
||
|
||
<para>Многие приложения могут быть построены в различных
|
||
конфигурациях и с дополнительной функциональностью. Например,
|
||
выбор естественного (человеческого) языка, GUI против командной
|
||
строки или типа используемой базы данных. Пользователи могут
|
||
нуждаться в различных конфигурациях, отличных от используемой по
|
||
умолчанию, поэтому в системе портов предусмотрен механизм,
|
||
позволяющий автору порта управлять сборкой того или иного
|
||
варианта конфигурации.
|
||
Правильная поддержка этих необязательных параметров облегчает
|
||
пользователям жизнь и даёт два или более порта по цене одного.</para>
|
||
|
||
<sect2>
|
||
<title>Knobs</title>
|
||
|
||
<sect3>
|
||
<title><makevar>WITH_<replaceable>*</replaceable></makevar>
|
||
и
|
||
<makevar>WITHOUT_<replaceable>*</replaceable></makevar></title>
|
||
|
||
<para>Эти переменные предназначены для установки системным
|
||
администратором. Многие из них стандартизованы в файле
|
||
<ulink url="http://svn.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>ports/KNOBS</filename></ulink>.</para>
|
||
|
||
<para>При создании порта не давайте имя для knob, специфичное
|
||
для данного приложения. На примере порта Avahi, используйте
|
||
<makevar>WITHOUT_MDNS</makevar> вместо
|
||
<makevar>WITHOUT_AVAHI_MDNS</makevar>.</para>
|
||
|
||
<note>
|
||
<para>Не стоит рассчитывать, что
|
||
<makevar>WITH_<replaceable>*</replaceable></makevar>
|
||
обязательно имеет соответствующую переменную
|
||
<makevar>WITHOUT_<replaceable>*</replaceable></makevar>,
|
||
и наоборот. В общем случае, предполагается значение по
|
||
умолчанию.</para>
|
||
</note>
|
||
|
||
<note>
|
||
<para>Если обратное не указано, то проверяется только факт
|
||
установки самих переменных, но не их конкретное значение типа
|
||
<literal>YES</literal> или <literal>NO</literal>.</para>
|
||
</note>
|
||
|
||
<table frame="none">
|
||
<title>Основные переменные
|
||
<makevar>WITH_<replaceable>*</replaceable></makevar>
|
||
и <makevar>WITHOUT_<replaceable>*</replaceable></makevar></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значения</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row id="knobs-without-nls">
|
||
<entry><makevar>WITHOUT_NLS</makevar></entry>
|
||
|
||
<entry>Если установлена, указывает не задействовать
|
||
интернационализацию, что может ускорить компиляцию.
|
||
По умолчанию, интернационализация используется.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_OPENSSL_BASE</makevar></entry>
|
||
|
||
<entry>Использовать версию OpenSSL из базовой системы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_OPENSSL_PORT</makevar></entry>
|
||
|
||
<entry>Устанавливает версию OpenSSL из
|
||
<filename role="package">security/openssl</filename>,
|
||
даже если в базовой системе последняя версия.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITHOUT_X11</makevar></entry>
|
||
|
||
<entry>Порты, которые могут быть собраны с поддержкой
|
||
или без поддержки X, обычно собираются с поддержкой
|
||
X. Если эта переменная определена, то будет собрана
|
||
версия без поддержки X.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Наименование KNOBS</title>
|
||
<para>Портеры должны использовать так называемые
|
||
knobs для помощи конечным пользователям и для поддержания
|
||
количества наименований knobs в небольшом количестве.
|
||
Список популярных названий knobs можно найти в файле <ulink
|
||
url="http://svn.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>KNOBS</filename></ulink>
|
||
</para>
|
||
|
||
<para>Названия knobs должны отражать, что это такое и что
|
||
выполняет. Если у порта имеется библиотечный префикс в
|
||
<makevar>PORTNAME</makevar>, то он должен присутствовать в
|
||
названии knobs.</para>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>OPTIONS</makevar></title>
|
||
|
||
<sect3>
|
||
<title>Описание</title>
|
||
<para>При установке порта переменные <makevar>OPTIONS_*</makevar>
|
||
предоставляют пользователю окно диалога с отображением
|
||
доступных параметров, с записью выбранных параметров в файл
|
||
<filename>/var/db/ports/<makevar>${UNIQUENAME}</makevar>/options</filename>.
|
||
Эти опции повторно используются при следующем построении
|
||
порта.</para>
|
||
|
||
<para>Когда пользователь запускает <command>make config</command>
|
||
(или запускает впервые <command>make build</command>),
|
||
инфраструктура выполняет проверку существования файла
|
||
<filename>/var/db/ports/<makevar>${UNIQUENAME}</makevar>/options</filename>.
|
||
Если этот файл не существует, то используются значения
|
||
<makevar>OPTIONS_*</makevar> и отображается диалоговое окно,
|
||
в котором эти параметры можно включить или выключить.
|
||
Затем сохраняется файл опций <filename>options</filename>,
|
||
и выбранные переменные используются при построении порта.</para>
|
||
|
||
<para>Если новая версия порта добавляет новые значения
|
||
<makevar>OPTIONS</makevar>, то пользователю будет представлено
|
||
окно диалога с сохраненными заполненными значениями старых
|
||
<makevar>OPTIONS.</makevar></para>
|
||
|
||
<para><command>make showconfig</command> отображает
|
||
сохраненную конфигурацию. Для удаления
|
||
сохраненной конфигурации используйте
|
||
<command>make rmconfig</command>.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Синтаксис</title>
|
||
|
||
<para><makevar>OPTIONS_DEFINE</makevar> содержит список
|
||
используемых <makevar>OPTIONS</makevar>. Они независимы
|
||
друг от друга и не сгруппированы:</para>
|
||
|
||
<programlisting>OPTIONS_DEFINE= OPT1 OPT2</programlisting>
|
||
|
||
<para>Далее после определения следует описание
|
||
<makevar>OPTIONS</makevar> (не является обязательным,
|
||
но настоятельно рекомендуется):</para>
|
||
|
||
<programlisting>OPT1_DESC= Describe OPT1
|
||
OPT2_DESC= Describe OPT2
|
||
OPT3_DESC= Describe OPT3
|
||
OPT4_DESC= Describe OPT4
|
||
OPT5_DESC= Describe OPT5
|
||
OPT6_DESC= Describe OPT6</programlisting>
|
||
|
||
<tip>
|
||
<para><filename>ports/Mk/bsd.options.desc.mk</filename>
|
||
содержит описание множества наиболее используемых
|
||
<makevar>OPTIONS</makevar>; переопределять их, как
|
||
правило, не нужно.</para>
|
||
</tip>
|
||
|
||
<tip>
|
||
<para>При описании параметров старайтесь представить себя
|
||
на месте пользователя: <quote>Что это делает?</quote>
|
||
и <quote>Для чего бы я захотел включить это?</quote>
|
||
Не делайте простое повторение названия. Например,
|
||
описание параметра <literal>NLS</literal> как
|
||
<quote>include NLS support</quote> (<quote>включить
|
||
поддержку NLS</quote>) не поможет пользователю, который
|
||
уже видит название параметра, но может не знать, что
|
||
это означает. Описав его как <quote>Native Language
|
||
Support via gettext utilities</quote> (<quote>Поддержка
|
||
национального языка через утилиты gettext</quote>),
|
||
вы поможете пользователю гораздо больше.</para>
|
||
</tip>
|
||
|
||
<para><makevar>OPTIONS</makevar> можно группировать в виде
|
||
переключателей, для которых разрешен выбор единственного
|
||
варианта в каждой группе:</para>
|
||
|
||
<programlisting>OPTIONS_SINGLE= SG1
|
||
OPTIONS_SINGLE_SG1= OPT3 OPT4</programlisting>
|
||
|
||
<para><makevar>OPTIONS</makevar> также можно группировать
|
||
в виде списков со множественным выбором, для которых
|
||
обязан быть включен <emphasis>по крайней мере
|
||
один</emphasis> из параметров:</para>
|
||
|
||
<programlisting>OPTIONS_MULTI= MG1
|
||
OPTIONS_MULTI_MG1= OPT5 OPT6</programlisting>
|
||
|
||
<para><makevar>OPTIONS_MULTI</makevar> и
|
||
<makevar>OPTIONS_SINGLE</makevar> также допускают
|
||
отсутствие выбора путём включения группы в
|
||
<makevar>OPTIONS_DEFINE</makevar>:</para>
|
||
|
||
<programlisting>OPTIONS_DEFINE= MG1
|
||
OPTIONS_MULTI= MG1
|
||
OPTIONS_MULTI_MG1= OPT5 OPT6</programlisting>
|
||
|
||
<para>После этого группа требует по крайней мере один
|
||
<makevar>OPTION</makevar> из <makevar>MG1</makevar>,
|
||
только если выбран новый <makevar>MG1</makevar>
|
||
<makevar>OPTION</makevar>. Рекомендуется
|
||
поэкспериментировать, чтобы улучшить понимание.</para>
|
||
|
||
<para>По умолчанию <makevar>OPTIONS</makevar> находится в
|
||
выключенном положении, если при этом оно также отсутствует
|
||
в списке <makevar>OPTIONS_DEFAULT</makevar>:</para>
|
||
|
||
<programlisting>OPTIONS_DEFAULT= OPT1 OPT3 OPT6</programlisting>
|
||
|
||
<para>Определения <makevar>OPTIONS</makevar> обязаны появиться
|
||
до подключения <filename>bsd.port.options.mk</filename>.
|
||
Переменные <makevar>PORT_OPTIONS</makevar>
|
||
могут быть проверены только после
|
||
подключения <filename>bsd.port.options.mk</filename>.
|
||
Вместо этого также можно использовать подключение
|
||
<filename>bsd.port.pre.mk</filename>, что все еще широко
|
||
используется в портах, написанных до появления
|
||
<filename>bsd.port.options.mk</filename>. Но имейте в виду,
|
||
что некоторые переменные, обычно, это некоторые флаги
|
||
<makevar>USE_*</makevar>,
|
||
после подключения <filename>bsd.port.pre.mk</filename> будут
|
||
работать не так, как этого от них ожидают.</para>
|
||
|
||
<example id="ports-options-simple-use">
|
||
<title>Простое использование <makevar>OPTIONS</makevar></title>
|
||
|
||
<programlisting>OPTIONS_DEFINE= FOO BAR
|
||
FOO_DESC= Enable option foo
|
||
BAR_DESC= Support feature bar
|
||
|
||
.include <bsd.port.options.mk>
|
||
|
||
.if ${PORT_OPTIONS:MFOO}
|
||
CONFIGURE_ARGS+=--with-foo
|
||
.else
|
||
CONFIGURE_ARGS+=--without-foo
|
||
.endif
|
||
|
||
.if ${PORT_OPTIONS:MBAR}
|
||
RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
|
||
.endif
|
||
|
||
.include <bsd.port.mk></programlisting>
|
||
</example>
|
||
|
||
<example id="ports-options-practical-use">
|
||
<title>Пример реального использования
|
||
<makevar>OPTIONS</makevar></title>
|
||
|
||
<programlisting>OPTIONS_DEFINE= EXAMPLES
|
||
|
||
OPTIONS_SINGLE= BACKEND
|
||
OPTIONS_SINGLE_BACKEND= MYSQL PGSQL BDB
|
||
|
||
OPTIONS_MULTI= AUTH
|
||
OPTIONS_MULTI_AUTH= LDAP PAM SSL
|
||
|
||
EXAMPLES_DESC= Install extra examples
|
||
MYSQL_DESC= Use MySQL as backend
|
||
PGSQL_DESC= Use PostgreSQL as backend
|
||
BDB_DESC= Use Berkeley DB as backend
|
||
LDAP_DESC= Build with LDAP authentication support
|
||
PAM_DESC= Build with PAM support
|
||
SSL_DESC= Build with OpenSSL support
|
||
|
||
OPTIONS_DEFAULT= PGSQL LDAP SSL
|
||
|
||
.include <bsd.port.options.mk>
|
||
|
||
.if ${PORT_OPTIONS:MPGSQL}
|
||
USE_PGSQL= yes
|
||
CONFIGURE_ARGS+= --with-postgres
|
||
.else
|
||
CONFIGURE_ARGS+= --without-postgres
|
||
.endif
|
||
|
||
.if ${PORT_OPTIONS:MICU}
|
||
LIB_DEPENDS+= icuuc:${PORTSDIR}/devel/icu
|
||
.endif
|
||
|
||
# Check other OPTIONS
|
||
|
||
.include <bsd.port.mk></programlisting>
|
||
</example>
|
||
|
||
<example id="ports-options-old-style-use">
|
||
<title>Использование <makevar>OPTIONS</makevar>
|
||
в старом стиле</title>
|
||
<programlisting>OPTIONS= FOO "Enable option foo" On
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if defined(WITHOUT_FOO)
|
||
CONFIGURE_ARGS+= --without-foo
|
||
.else
|
||
CONFIGURE_ARGS+= --with-foo
|
||
.endif
|
||
|
||
.include <bsd.port.post.mk></programlisting>
|
||
</example>
|
||
|
||
<important>
|
||
<para>Такой способ использования <makevar>OPTIONS</makevar>
|
||
является устаревшим, и в будущем его поддержка будет
|
||
удалёна. Не используйте этот способ для новых портов.</para>
|
||
</important>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Функция автоматической активации</title>
|
||
|
||
<para>При использовании сценария GNU configure, следите за тем,
|
||
какие необязательные функции задействуются посредством
|
||
автоматической активации. Отключайте явным образом те
|
||
необязательные функции, которые вы не хотели бы использовать,
|
||
через передачу соответствующих <literal>--without-xxx</literal>
|
||
или <literal>--disable-xxx</literal> в переменной
|
||
<makevar>CONFIGURE_ARGS</makevar>.</para>
|
||
|
||
<example>
|
||
<title>Неправильное управление опцией</title>
|
||
|
||
<programlisting>.if ${PORT_OPTIONS:MFOO}
|
||
LIB_DEPENDS+= foo:${PORTSDIR}/devel/foo
|
||
CONFIGURE_ARGS+= --enable-foo
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<para>В приведенном выше примере представьте себе библиотеку libfoo,
|
||
установленную в системе. Пользователь не желает, чтобы приложение
|
||
использовало libfoo, и поэтому он выключает соответствующую опцию
|
||
в диалоге <literal>make config</literal>. Но сценарий configure
|
||
приложения определяет наличие библиотеки в системе и включает ее
|
||
поддержку в итоговый исполняемый файл. Теперь, когда пользователь
|
||
решит удалить libfoo из системы, система портов позволит это
|
||
сделать (т.к. зависимость от libfoo не была записана), но
|
||
приложение перестанет работать.</para>
|
||
|
||
<example>
|
||
<title>Правильное управление опцией</title>
|
||
|
||
<programlisting>.if ${PORT_OPTIONS:MFOO}
|
||
LIB_DEPENDS+= foo:${PORTSDIR}/devel/foo
|
||
CONFIGURE_ARGS+= --enable-foo
|
||
.else
|
||
CONFIGURE_ARGS+= --disable-foo
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<para>Во втором примере библиотека libfoo отключена явным образом.
|
||
Сценарий configure не включает соответствующие функции в приложении,
|
||
несмотря на присутствие библиотеки в системе.</para>
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="makefile-wrkdir">
|
||
<title>Задание рабочего каталога</title>
|
||
|
||
<para>Каждый порт распаковывается в рабочий каталог, который должен быть
|
||
доступным для записи. В системе портов по умолчанию
|
||
<makevar>DISTFILES</makevar> распаковываются в каталог с именем
|
||
<literal>${DISTNAME}</literal>. Другими словами, если вы
|
||
задали:</para>
|
||
|
||
<programlisting>PORTNAME= foo
|
||
PORTVERSION= 1.0</programlisting>
|
||
|
||
<para>то дистрибутивные файлы порта содержат каталог верхнего уровня,
|
||
<filename>foo-1.0</filename>, и все файлы расположены в этом
|
||
каталоге.</para>
|
||
|
||
<para>Если это не ваш случай, то имеется несколько переменных, которые
|
||
вы можете переопределить.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>WRKSRC</makevar></title>
|
||
|
||
<para>Эта переменная задаёт имя каталога, который создаётся при
|
||
распаковке исходных файлов приложения. В нашем предыдущем
|
||
примере если бы распаковка происходила в каталог с именем
|
||
<filename>foo</filename> (а не
|
||
<filename>foo-1.0</filename>), то вы должны написать:</para>
|
||
|
||
<programlisting>WRKSRC= ${WRKDIR}/foo</programlisting>
|
||
|
||
<para>или, как вариант</para>
|
||
|
||
<programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>NO_WRKSUBDIR</makevar></title>
|
||
|
||
<para>Если порт вообще не распаковывается ни в какой каталог, то вы
|
||
должны задать переменную <makevar>NO_WRKSUBDIR</makevar> для указания
|
||
на этот факт.</para>
|
||
|
||
<programlisting>NO_WRKSUBDIR= yes</programlisting>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="conflicts">
|
||
<title>Разрешение конфликтов</title>
|
||
|
||
<para>Для регистрации конфликта между пакетами и портами используются
|
||
три различные переменные: <makevar>CONFLICTS</makevar>,
|
||
<makevar>CONFLICTS_INSTALL</makevar> и
|
||
<makevar>CONFLICTS_BUILD</makevar>.</para>
|
||
|
||
<note>
|
||
<para>Переменные регистрации конфликта автоматически определяют
|
||
переменную <makevar>IGNORE</makevar>, которая более подробно
|
||
описана в <xref linkend="dads-noinstall"/>.</para>
|
||
</note>
|
||
|
||
<para>При удалении одного из конфликтующих портов целесообразно
|
||
сохранить записи <makevar>CONFLICTS</makevar> в тех других портах
|
||
в течении нескольких месяцев, чтобы позаботиться о тех пользователей,
|
||
которые обновляются от случая к случаю.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>CONFLICTS_INSTALL</makevar></title>
|
||
|
||
<para>Если ваш пакет не может существовать вместе с другими
|
||
(из-за конфликта файлов, несовместимости времени выполнения и так
|
||
далее), перечислите имена остальных пакетов в переменной
|
||
<makevar>CONFLICTS_INSTALL</makevar>. Здесь вы можете использовать
|
||
шаблоны командного интерпретатора, такие как <literal>*</literal>
|
||
и <literal>?</literal>. Имена пакетов должны выглядеть так же,
|
||
как в <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь,
|
||
что <makevar>CONFLICTS_INSTALL</makevar> не содержит пакет самого
|
||
этого порта. В противном случае не будет работать установка с
|
||
использованием переменной <makevar>FORCE_PKG_REGISTER</makevar>.
|
||
Проверка CONFLICTS_INSTALL выполняется после процесса сборки и
|
||
до процесса установки.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>CONFLICTS_BUILD</makevar></title>
|
||
|
||
<para>Если ваш порт не может быть собран, когда уже установлен
|
||
другой, перечислите имена остальных портов в переменной
|
||
<makevar>CONFLICTS_BUILD</makevar>. Здесь вы можете использовать
|
||
шаблоны командного интерпретатора, такие как <literal>*</literal>
|
||
и <literal>?</literal>. Имена пакетов должны выглядеть так же,
|
||
как в <filename>/var/db/pkg</filename>. Проверка CONFLICTS_BUILD
|
||
выполняется до процесса сборки. Конфликты сборки в получаемом
|
||
пакете не записываются.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>CONFLICTS</makevar></title>
|
||
|
||
<para>Если ваш порт не может быть собран, когда уже установлен
|
||
другой, а получаемый пакет не может существовать вместе с другими,
|
||
перечислите имена остальных пакетов в переменной
|
||
<makevar>CONFLICTS</makevar>. Здесь вы можете использовать шаблоны
|
||
командного интерпретатора, такие как <literal>*</literal> и
|
||
<literal>?</literal>. Имена пакетов должны выглядеть так же, как
|
||
в <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь, что
|
||
<makevar>CONFLICTS</makevar> не содержит пакет самого этого порта.
|
||
В противном случае не будет работать установка с использованием
|
||
переменной <makevar>FORCE_PKG_REGISTER</makevar>. Проверка
|
||
CONFLICTS выполняется до процессов сборки и установки.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="install">
|
||
<title>Установка файлов</title>
|
||
|
||
<sect2 id="install-macros">
|
||
<title>Макросы INSTALL_*</title>
|
||
|
||
<para>Используйте макросы, которые есть в файле
|
||
<filename>bsd.port.mk</filename> для обеспечения правильных прав
|
||
доступа и владения файлов в своих целях
|
||
<maketarget>*-install</maketarget>.</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>INSTALL_PROGRAM</makevar> - это команда для
|
||
установки бинарных выполнимых файлов.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>INSTALL_SCRIPT</makevar> - это команда для установки
|
||
выполнимых скриптов.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>INSTALL_LIB</makevar> - это команда для установки
|
||
динамических библиотек.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>INSTALL_KLD</makevar> - это команда для установки
|
||
загружаемых модулей ядра. Некоторые архитектуры предпочитают,
|
||
чтобы для модулей сохранялись отладочные сведения, по этой
|
||
причине используйте эту команду вместо
|
||
<makevar>INSTALL_PROGRAM</makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>INSTALL_DATA</makevar> - это команда для установки
|
||
совместно используемых файлов данных.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>INSTALL_MAN</makevar> - это команда для установки
|
||
страниц Справочника и другой документации (никаких файлов она не
|
||
сжимает).</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>В основе работы этих макросов лежит команда
|
||
<command>install</command> со всеми соответствующими флагами.
|
||
Смотрите пример их использования ниже.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="install-strip">
|
||
<title>Удаление отладочной информации в бинарных файлах и
|
||
динамических библиотеках</title>
|
||
|
||
<para>Не удаляйте отладочную информацию из бинарных файлов вручную,
|
||
если вы это делали. Во всех двоичных файлах отладочная информация
|
||
должна быть удалена, и макрос <makevar>INSTALL_PROGRAM</makevar>
|
||
выполнит установку и удаление отладочной информации одновременно
|
||
(обратитесь к следующему разделу). Макрос
|
||
<makevar>INSTALL_LIB</makevar> делает то же самое для
|
||
динамических библиотек.</para>
|
||
|
||
<para>Если вам нужно удалить отладочную информацию из файла без
|
||
использования макросов <makevar>INSTALL_PROGRAM</makevar> и
|
||
<makevar>INSTALL_LIB</makevar>, то это можно сделать при помощи
|
||
<makevar>${STRIP_CMD}</makevar>. Обычно это делается внутри цели
|
||
<literal>post-install</literal>. К примеру:</para>
|
||
|
||
<programlisting>post-install:
|
||
${STRIP_CMD} ${PREFIX}/bin/xdl</programlisting>
|
||
|
||
<para>Для проверки того, удалена ли отладочная информация из
|
||
установленного выполнимого файла, выполните команду &man.file.1;.
|
||
Если утилита не выдаст строку <literal>not stripped</literal>, то
|
||
файл уже обработан. Кроме того, &man.strip.1; не будет обрабатывать
|
||
программу, отладочная информация из которой уже удалена; вместо этого
|
||
утилита просто завершит свою работу.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="install-copytree">
|
||
<title>Установка целого дерева файлов</title>
|
||
|
||
<para>Иногда существует необходимость в установке большого количества
|
||
файлов с сохранением их иерархической организации, т.е. в копировании
|
||
дерева каталогов целиком из <makevar>WRKSRC</makevar> в целевой
|
||
каталог внутри <makevar>PREFIX</makevar>.</para>
|
||
|
||
<para>Для этой ситуации существует два макроса. Преимущество от
|
||
использования этих макросов вместо команды <command>cp</command>
|
||
в том, что они гарантируют установку правильного владельца и прав
|
||
на конечные файлы. Первый макрос, <makevar>COPYTREE_BIN</makevar>,
|
||
делает все устанавливаемые файлы исполняемыми, что подходит для
|
||
установки в <filename><makevar>PREFIX</makevar>/bin</filename>.
|
||
Второй макрос, <makevar>COPYTREE_SHARE</makevar>, не устанавливает
|
||
на файлы права исполнения, и, таким образом, подходит для установки
|
||
файлов внутри каталога
|
||
<filename><makevar>PREFIX</makevar>/share</filename>.</para>
|
||
|
||
<programlisting>post-install:
|
||
${MKDIR} ${EXAMPLESDIR}
|
||
(cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})</programlisting>
|
||
|
||
<para>В этом примере устанавливается содержимое каталога
|
||
<filename>examples</filename> из установочных файлов производителя
|
||
в надлежащее место для примеров вашего порта.</para>
|
||
|
||
<programlisting>post-install:
|
||
${MKDIR} ${DATADIR}/summer
|
||
(cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)</programlisting>
|
||
|
||
<para>А в этом примере будут установлены данные летних месяцев в
|
||
подкаталог <filename>summer</filename> каталога
|
||
<filename><makevar>DATADIR</makevar></filename>.</para>
|
||
|
||
<para>В качестве третьего параметра в макросе
|
||
<makevar>COPYTREE_*</makevar> можно передать дополнительные
|
||
параметры <command>find</command>. Например, чтобы в первом
|
||
примере установить все файлы кроме файлов Makefile, можно
|
||
использовать следующую команду.</para>
|
||
|
||
<programlisting>post-install:
|
||
${MKDIR} ${EXAMPLESDIR}
|
||
(cd ${WRKSRC}/examples/ && \
|
||
${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")</programlisting>
|
||
|
||
<para>Обратите внимание, что эти макросы не производят добавление
|
||
устанавливаемых файлов в <filename>pkg-plist</filename>. Вам все
|
||
еще нужно их перечислить.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="install-documentation">
|
||
<title>Установка дополнительной документации</title>
|
||
|
||
<para>Если с вашим программным обеспечением поставляется некоторая
|
||
документация, отличающаяся от стандартных страниц Справочника и
|
||
файлов info, которая, как вы думаете, будет полезна пользователям,
|
||
установите ее в каталог
|
||
<filename><makevar>PREFIX</makevar>/share/doc</filename>. Это может
|
||
быть сделано, как и в предыдущем разделе, в цели
|
||
<maketarget>post-install</maketarget>.</para>
|
||
|
||
<para>Создайте для вашего порта новый каталог. Имя каталога должно
|
||
соответствовать тому, что представляет из себя порт. Обычно это
|
||
означает <makevar>PORTNAME</makevar>. Однако, если
|
||
вы думаете, что пользователь захочет иметь разные версии порта,
|
||
установленные одновременно, то вы можете использовать полное имя
|
||
<makevar>PKGNAME</makevar>.</para>
|
||
|
||
<para>Сделайте установку документации зависящей от переменной
|
||
<makevar>NOPORTDOCS</makevar> для того, чтобы пользователи могли
|
||
выключить это в файле <filename>/etc/make.conf</filename>, как
|
||
здесь:</para>
|
||
|
||
<programlisting>post-install:
|
||
.if !defined(NOPORTDOCS)
|
||
${MKDIR} ${DOCSDIR}
|
||
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
|
||
.endif</programlisting>
|
||
|
||
<para>Вот несколько полезных переменных и то, как они преобразуются по
|
||
умолчанию при использовании в <filename>Makefile</filename>:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>DATADIR</makevar> преобразуется в
|
||
<filename><makevar>PREFIX</makevar>/share/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>DATADIR_REL</makevar> преобразуется в
|
||
<filename>share/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>DOCSDIR</makevar> преобразуется в
|
||
<filename><makevar>PREFIX</makevar>/share/doc/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>DOCSDIR_REL</makevar> преобразуется в
|
||
<filename>share/doc/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>EXAMPLESDIR</makevar> преобразуется в
|
||
<filename><makevar>PREFIX</makevar>/share/examples/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>EXAMPLESDIR_REL</makevar> преобразуется в
|
||
<filename>share/examples/<makevar>PORTNAME</makevar></filename>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<note>
|
||
<para><makevar>NOPORTDOCS</makevar> управляет установкой
|
||
дополнительной документации в <makevar>DOCSDIR</makevar>. Это
|
||
не относится к стандартным страницам справочника и страницам info.
|
||
Все, что устанавливается в <makevar>DATADIR</makevar> и
|
||
<makevar>EXAMPLESDIR</makevar>, управляется через
|
||
<makevar>NOPORTDATA</makevar> и <makevar>NOPORTEXAMPLES</makevar>
|
||
соответственно.</para>
|
||
</note>
|
||
|
||
<para>Эти переменные экспортируются в <makevar>PLIST_SUB</makevar>.
|
||
Их значения появятся там в виде имён путей относительно
|
||
<filename><makevar>PREFIX</makevar></filename>, если это возможно.
|
||
То есть <filename>share/doc/<makevar>PORTNAME</makevar></filename>
|
||
в списке сборки по умолчанию будет заменен на
|
||
<literal>%%DOCSDIR%%</literal>, и так далее. (Дополнительную
|
||
информацию о подстановке в <filename>pkg-plist</filename> можно
|
||
найти <link linkend="plist-sub">здесь</link>.)</para>
|
||
|
||
<para>Все условно устанавливаемые файлы и каталоги с документацией
|
||
должны быть перечислены в файле <filename>pkg-plist</filename> с
|
||
префиксом <literal>%%PORTDOCS%%</literal>, например:</para>
|
||
|
||
<programlisting>%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
|
||
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
|
||
%%PORTDOCS%%@dirrm %%DOCSDIR%%</programlisting>
|
||
|
||
<para>В качестве альтернативы перечислению файлов документации в файле
|
||
<filename>pkg-plist</filename>, порт может указать в переменной
|
||
<makevar>PORTDOCS</makevar> список имён файлов и глобальных шаблонов
|
||
командного процессора для добавления в окончательный список сборки.
|
||
Имена будут задаваться относительно <makevar>DOCSDIR</makevar>.
|
||
Таким образом, порт, использующий <makevar>PORTDOCS</makevar> и
|
||
нестандартное местоположение документации, должен задавать
|
||
соответствующим образом и <makevar>DOCSDIR</makevar>. Если каталог
|
||
указан в <makevar>PORTDOCS</makevar> или соответствует шаблону для
|
||
этой переменной, то полное поддерево с входящими в него файлами и
|
||
каталогами будет регистрироваться в окончательном списке сборки.
|
||
Если определена <makevar>NOPORTDOCS</makevar>, то файлы и каталоги,
|
||
перечисленные в <makevar>PORTDOCS</makevar>, не будут установлены и
|
||
добавлены в список сборки порта. Установка документации в
|
||
<makevar>PORTDOCS</makevar>, как это показано выше, остаётся за
|
||
самим портом. Типичный пример использования
|
||
<makevar>PORTDOCS</makevar> выглядит следующим образом:</para>
|
||
|
||
<programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting>
|
||
|
||
<note>
|
||
<para>Эквивалентами <makevar>PORTDOCS</makevar> для файлов,
|
||
устанавливаемых в <makevar>DATADIR</makevar> и
|
||
<makevar>EXAMPLESDIR</makevar> являются <makevar>PORTDATA</makevar>
|
||
и <makevar>PORTEXAMPLES</makevar> соответственно.</para>
|
||
|
||
<para>Кроме того, вы можете использовать файл
|
||
<filename>pkg-message</filename> для вывода сообщений во
|
||
время установки. За подробной информацией обратитесь к <link
|
||
linkend="porting-message">разделу об использовании
|
||
<filename>pkg-message</filename></link>.
|
||
Файл <filename>pkg-message</filename> не нужно добавлять в
|
||
<filename>pkg-plist</filename>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2 id="install-subdirs">
|
||
<title>Подкаталоги внутри PREFIX</title>
|
||
|
||
<para>Попробуйте поместить все файлы порта в правильных подкаталогах
|
||
каталога <makevar>PREFIX</makevar>. Некоторые порты игнорируют все
|
||
установки и помещают все в подкаталог с именем порта, что
|
||
неправильно. Также многие порты помещают все, кроме бинарных файлов,
|
||
файлов заголовков и страниц Справочника, в подкаталог каталога
|
||
<filename>lib</filename>, что не очень хорошо работает с подходом
|
||
BSD. Многие файлы должны быть перемещены в одно из следующих
|
||
местоположений: <filename>etc</filename>
|
||
(настроечные/конфигурационные файлы), <filename>libexec</filename>
|
||
(выполнимые файлы, запускаемые из других программ),
|
||
<filename>sbin</filename> (исполнимые файлы для
|
||
администраторов/менеджеров системы), <filename>info</filename>
|
||
(документация в формате info для просмотрщика info) или
|
||
<filename>share</filename> (независимые от архитектуры файлы).
|
||
Обратитесь к &man.hier.7; для прояснения деталей; правила,
|
||
покрывающие <filename>/usr</filename>, достаточно хорошо подходят
|
||
также и к <filename>/usr/local</filename>. Исключением являются
|
||
порты, имеющие дело с <quote>новостями</quote> USENET. Они могут
|
||
использовать каталог
|
||
<filename><makevar>PREFIX</makevar>/news</filename> для установки
|
||
своих файлов.</para>
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
</chapter>
|
||
|
||
<chapter id="special">
|
||
<title>Особые соглашения</title>
|
||
|
||
<para>Имеется ещё несколько вещей, которые вы должны иметь в виду при
|
||
создании порта. Этот раздел описывает наиболее часто встречающиеся из
|
||
них.</para>
|
||
|
||
<sect1 id="porting-shlibs">
|
||
<title>Динамические библиотеки</title>
|
||
|
||
<para>Если ваш порт устанавливает одну или несколько динамических
|
||
библиотек, определите переменную <makevar>USE_LDCONFIG</makevar>,
|
||
которая приведёт к запуску из <filename>bsd.port.mk</filename> команды
|
||
<literal>${LDCONFIG} -m</literal> относительно каталога, в
|
||
который устанавливается новая библиотека (как правило, это
|
||
<filename><makevar>PREFIX</makevar>/lib</filename>), во время
|
||
выполнения цели <maketarget>post-install</maketarget> для её
|
||
регистрации в кэше динамических библиотек. Эта переменная, если она
|
||
определена, также приведёт к добавлению соответствующей пары команд
|
||
<literal>@exec /sbin/ldconfig -m</literal> и
|
||
<literal>@unexec /sbin/ldconfig -R</literal> в ваш файл
|
||
<filename>pkg-plist</filename>, так что пользователь, устанавливающий
|
||
пакет, сможет сразу же использовать динамическую библиотеку, а
|
||
удаление пакета не приведёт к тому, что система будет предполагать,
|
||
что библиотека всё ещё имеется в наличии.</para>
|
||
|
||
<programlisting>USE_LDCONFIG= yes</programlisting>
|
||
|
||
<para>Если нужно, вы можете переопределить каталог по умолчанию,
|
||
задав значение
|
||
<makevar>USE_LDCONFIG</makevar>, в котором должны быть перечислены
|
||
каталоги, в которые устанавливаются динамические библиотеки. Например,
|
||
если ваш порт устанавливает динамические библиотеки в каталоги
|
||
<filename><makevar>PREFIX</makevar>/lib/foo</filename> и
|
||
<filename><makevar>PREFIX</makevar>/lib/bar</filename>, то вы можете в
|
||
файле <filename>Makefile</filename> указать следующее:</para>
|
||
|
||
<programlisting>USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar</programlisting>
|
||
|
||
<para>Будьте
|
||
добры перепроверить, т.к. часто это вовсе не является необходимым
|
||
и может быть решено иначе с помощью <literal>-rpath</literal>
|
||
или установки <envar>LD_RUN_PATH</envar> во время компоновки (для
|
||
примера смотрите <filename role="package">lang/moscow_ml</filename>),
|
||
или с помощью сценария-обёртки, который выставляет
|
||
<makevar>LD_LIBRARY_PATH</makevar> перед запуском исполняемого файла
|
||
как это делает <filename role="package">www/seamonkey</filename>.</para>
|
||
|
||
<para>При установке 32-разрядных библиотек на 64-разрядной системе
|
||
используйте вместо этого <makevar>USE_LDCONFIG32</makevar>.</para>
|
||
|
||
<para>Постарайтесь сохранять номера версий динамических библиотек
|
||
в формате <filename>libfoo.so.0</filename>. Наш компоновщик
|
||
позаботится только о старшем (первом) номере.</para>
|
||
|
||
<para>Если при обновлении порта увеличивается старший номер версии
|
||
библиотеки, то для всех портов, компонуемых с затронутой библиотекой,
|
||
следует увеличить значение <makevar>PORTREVISION</makevar> для
|
||
форсирования перекомпиляции с новой версией библиотеки.</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="porting-restrictions">
|
||
<title>Порты с ограничениями на распространение</title>
|
||
|
||
<para>Лицензии бывают разных видов, и некоторые накладывают ограничение
|
||
на то, как приложение может быть оформлено в виде пакета, может ли
|
||
оно продаваться для извлечения коммерческой выгоды, и так далее.</para>
|
||
|
||
<important>
|
||
<para>На вас, как на человека, портирующего приложение, ложится
|
||
обязанность прочесть лицензионные соглашения на программное
|
||
обеспечение и удостовериться, что проект FreeBSD не будет являться
|
||
их нарушителем, если будет заниматься распространением исходного
|
||
кода или в бинарном виде по FTP/HTTP или на CD-ROM. Если
|
||
у вас возникли сомнения, то, пожалуйста, обратитесь в
|
||
&a.ports;.</para>
|
||
</important>
|
||
|
||
<para>В подобных ситуациях можно использовать переменные, описываемые в
|
||
последующих разделах.</para>
|
||
|
||
<sect2>
|
||
<title><makevar>NO_PACKAGE</makevar></title>
|
||
|
||
<para>Эта переменная указывает, что мы не можем создавать для
|
||
приложения двоичный пакет. К примеру, лицензия не позволяет
|
||
бинарное распространение или она может запрещать распространение
|
||
пакетов, созданных из изменённых исходников.</para>
|
||
|
||
<para>Однако файлы <makevar>DISTFILES</makevar> могут свободно
|
||
зеркалироваться по FTP/HTTP. Они также могут распространяться,
|
||
используя CD-ROM (или на похожих носителях), если не установлена
|
||
переменная <makevar>NO_CDROM</makevar>.</para>
|
||
|
||
<para><makevar>NO_PACKAGE</makevar> должна также использоваться, если
|
||
двоичный пакет, как правило, бесполезен, а приложение должно всегда
|
||
компилироваться из исходного кода. К примеру, если в приложение
|
||
во время компиляции жёстко включается конфигурационная информация,
|
||
привязанная к конкретной системе, то задайте переменную
|
||
<makevar>NO_PACKAGE</makevar>.</para>
|
||
|
||
<para>Значением переменной <makevar>NO_PACKAGE</makevar> должна быть
|
||
строка, описывающая причину, по которой пакет не должен
|
||
создаваться.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>NO_CDROM</makevar></title>
|
||
|
||
<para>Эта переменная указывает на то, что, хотя мы имеем право
|
||
создавать бинарные пакеты, мы не можем помещать эти пакеты или
|
||
файлы <makevar>DISTFILES</makevar> порта на CD-ROM (или на похожие носители) для
|
||
перепродажи. Однако бинарные пакеты и файлы
|
||
<makevar>DISTFILES</makevar> порта будут оставаться
|
||
доступными посредством FTP/HTTP.</para>
|
||
|
||
<para>Если эта переменная устанавливается вместе с
|
||
<makevar>NO_PACKAGE</makevar>, то только файлы порта
|
||
<makevar>DISTFILES</makevar> будут доступны, и только посредством
|
||
FTP/HTTP.</para>
|
||
|
||
<para>В качестве значения <makevar>NO_CDROM</makevar> должна
|
||
указываться строка, описывающая причины, по которым порт не может
|
||
распространяться на CD-ROM. К примеру, это применяется, если
|
||
лицензионное соглашение приложения предполагает только его
|
||
<quote>некоммерческое</quote> использование.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>NOFETCHFILES</makevar></title>
|
||
|
||
<para>Файлы, определенные в переменной <makevar>NOFETCHFILES</makevar>,
|
||
не будут извлекаться ни из одного из <makevar>MASTER_SITES</makevar>.
|
||
Примером такого файла является файл, поставляемый на CD-ROM.</para>
|
||
|
||
<para>Инструменты, проверяющие доступность этих файлов на
|
||
<makevar>MASTER_SITES</makevar>, должны игнорировать эти файлы и
|
||
не сообщать о них.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>RESTRICTED</makevar></title>
|
||
|
||
<para>Задайте эту переменную, если лицензия на приложение не позволяет
|
||
ни зеркалировать файлы <makevar>DISTFILES</makevar>, ни распространять
|
||
бинарный пакет через FTP/HTTP или на CD-ROM.</para>
|
||
|
||
<para>Ни <makevar>NO_CDROM</makevar>, ни <makevar>NO_PACKAGE</makevar>
|
||
не стоит устанавливать вместе с <makevar>RESTRICTED</makevar>, так
|
||
как последняя переменная подразумевает первые две.</para>
|
||
|
||
<para>В качестве значения <makevar>RESTRICTED</makevar> должна
|
||
указываться строка, описывающая причины, по которым порт нельзя
|
||
распространять. Обычно это означает, что порт использует закрытое
|
||
программное обеспечение, а пользователь должен вручную сгрузить файлы
|
||
<makevar>DISTFILES</makevar>, возможно, после заполнения
|
||
регистрационной формы или подтверждения соглашения с условиями
|
||
<acronym>EULA</acronym>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><makevar>RESTRICTED_FILES</makevar></title>
|
||
|
||
<para>Если заданы <makevar>RESTRICTED</makevar> или
|
||
<makevar>NO_CDROM</makevar>, то значение этой переменной по умолчанию
|
||
соответствует <literal>${DISTFILES} ${PATCHFILES}</literal>, в
|
||
противном случае она пуста. Если ограничены в распространении лишь
|
||
некоторые из дистрибутивных файлов, то в этой переменной задаётся их
|
||
список.</para>
|
||
|
||
<para>Обратите внимание, что при включении порта в дерево исходных
|
||
текстов системы коммиттер должен добавить запись в файл
|
||
<filename>/usr/ports/LEGAL</filename> для каждого из перечисленных
|
||
файлов, в точности описав, что подразумевают ограничения.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Примеры использования</title>
|
||
|
||
<para>Предпочтительным способом реализации утверждения "архивы
|
||
исходных текстов для этого порта должны загружаться самостоятельно"
|
||
является следующее:</para>
|
||
|
||
<programlisting>.if !exists(${DISTDIR}/${DISTNAME}${EXTRACT_SUFX})
|
||
IGNORE= may not be redistributed because of licensing reasons. Please visit <replaceable>some-website</replaceable> to accept their license and download ${DISTFILES} into ${DISTDIR}
|
||
.endif</programlisting>
|
||
|
||
<para>Это одновременно и информирует пользователя, и устанавливает
|
||
нужные метаданные на пользовательской машине для использования
|
||
автоматическими программами.</para>
|
||
|
||
<para>Обратите внимание, что данная кляуза должна предшествовать
|
||
подключению файла <filename>bsd.port.pre.mk</filename>.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="building">
|
||
<title>Механизмы построения</title>
|
||
|
||
<sect2 id="parallel-builds">
|
||
<title>Параллельное построение портов</title>
|
||
|
||
<para>Инфраструктура портов &os; поддерживает параллельное
|
||
построение с использованием множественных подпроцессов
|
||
<command>make</command>, что позволяет системам
|
||
<acronym>SMP</acronym> задействовать всю доступную мощность
|
||
<acronym>CPU</acronym>, тем самым делая построение портов более
|
||
быстрым и эффективным.</para>
|
||
|
||
<para>Это достигается путем передачи флага <makevar>-jX</makevar>
|
||
команде &man.make.1;. К сожалению, не все порты поддерживают
|
||
параллельную сборку достаточно хорошо. Поэтому требуется включать
|
||
этот механизм явным образом путем добавления строки
|
||
<literal>MAKE_JOBS_SAFE=yes</literal> в <filename>Makefile</filename>
|
||
где-нибудь после раздела с объявлениями зависимостей.</para>
|
||
|
||
<para>Другой опцией управления этим механизмом с точки зрения
|
||
сопровождающего является <makevar>MAKE_JOBS_UNSAFE=yes</makevar>.
|
||
Эта переменная используется в случае, когда известно, что порт
|
||
ломается с <makevar>-jX</makevar>, и пользователь форсирует
|
||
использование многопроцессорной компиляции для всех портов с
|
||
переменной <literal>FORCE_MAKE_JOBS=yes</literal> в
|
||
<filename>/etc/make.conf</filename>.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="using-make">
|
||
<title><command>make</command>, <command>gmake</command> и
|
||
<command>imake</command></title>
|
||
|
||
<para>Если ваш порт использует <application>GNU make</application>,
|
||
то установите <literal>USE_GMAKE=yes</literal>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих
|
||
<application>gmake</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_GMAKE</makevar></entry>
|
||
|
||
<entry>Для сборки порта требуется
|
||
<command>gmake</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>GMAKE</makevar></entry>
|
||
|
||
<entry>Полный путь к команде <command>gmake</command>, если
|
||
отсутствует в <envar>PATH</envar>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Если ваш порт является приложением X, которое создает файлы
|
||
<filename>Makefile</filename> из <filename>Imakefile</filename>,
|
||
используя <application>imake</application>, то установите
|
||
<literal>USE_IMAKE=yes</literal>. Это заставит стадию
|
||
конфигурирования автоматически выполнить <command>xmkmf -a</command>.
|
||
Если флаг <option>-a</option> представляет для вашего порта
|
||
проблему, то установите <literal>XMKMF=xmkmf</literal>. Если
|
||
порт использует <application>imake</application>, но не понимает
|
||
цель <maketarget>install.man</maketarget>, то следует установить
|
||
<literal>NO_INSTALL_MANPAGES=yes</literal>.</para>
|
||
|
||
<para>Если исходный <filename>Makefile</filename> вашего порта
|
||
имеет что-нибудь помимо <maketarget>all</maketarget> в качестве
|
||
основной цели построения, то задайте соответствующее значение
|
||
<makevar>ALL_TARGET</makevar>. То же касается
|
||
<maketarget>install</maketarget> и
|
||
<makevar>INSTALL_TARGET</makevar>.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="using-configure">
|
||
<title>Сценарий <command>configure</command></title>
|
||
|
||
<para>Если ваш порт использует сценарий <command>configure</command>
|
||
для получения файлов <filename>Makefile</filename> из файлов
|
||
<filename>Makefile.in</filename>, то установите
|
||
<literal>GNU_CONFIGURE=yes</literal>. Если вы хотите дать
|
||
дополнительные параметры сценарию <command>configure</command>
|
||
(аргументом по умолчанию является <literal>--prefix=${PREFIX}
|
||
--infodir=${PREFIX}/${INFO_PATH}
|
||
--mandir=${MANPREFIX}/man
|
||
--build=${CONFIGURE_TARGET}</literal>), установите эти параметры
|
||
в <makevar>CONFIGURE_ARGS</makevar>. Дополнительные переменные
|
||
окружения можно передать, используя переменную
|
||
<makevar>CONFIGURE_ENV</makevar>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих
|
||
<command>configure</command></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>GNU_CONFIGURE</makevar></entry>
|
||
|
||
<entry>Порт использует сценарий <command>configure</command>
|
||
для подготовки построения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>HAS_CONFIGURE</makevar></entry>
|
||
|
||
<entry>То же, что и <makevar>GNU_CONFIGURE</makevar>, кроме
|
||
того, что цель configure по умолчанию не добавляется в
|
||
<makevar>CONFIGURE_ARGS</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>CONFIGURE_ARGS</makevar></entry>
|
||
|
||
<entry>Дополнительные параметры, передаваемые сценарию
|
||
<command>configure</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>CONFIGURE_ENV</makevar></entry>
|
||
|
||
<entry>Дополнительные переменные окружения, задаваемые для
|
||
запуска сценария <command>configure</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>CONFIGURE_TARGET</makevar></entry>
|
||
|
||
<entry>Переопределить цель configure по умолчанию. Значением
|
||
по умолчанию является
|
||
<literal>${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2 id="using-scons">
|
||
<title>Использование <command>scons</command></title>
|
||
|
||
<para>Если ваш порт использует <application>SCons</application>,
|
||
определите <literal>USE_SCONS=yes</literal>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих
|
||
<command>scons</command></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значения</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>SCONS_ARGS</makevar></entry>
|
||
|
||
<entry>Специфичные для порта флаги SCons, передаваемые
|
||
окружению SCons.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SCONS_BUILDENV</makevar></entry>
|
||
|
||
<entry>Переменные для установки в системном окружении.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SCONS_ENV</makevar></entry>
|
||
|
||
<entry>Переменные для установки в окружении SCons.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SCONS_TARGET</makevar></entry>
|
||
|
||
<entry>Последний параметр для передачи SCons, похожий на
|
||
<makevar>MAKE_TARGET</makevar>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Для того, чтобы сторонний <filename>SConstruct</filename>
|
||
соответствовал всему, что передается SCons в переменной
|
||
<makevar>SCONS_ENV</makevar> (самое главное, это
|
||
<makevar>CC/CXX/CFLAGS/CXXFLAGS</makevar>), примените патч к
|
||
<filename>SConstruct</filename>, так чтобы переменная построения
|
||
<literal>Environment</literal> выглядела следующим образом:</para>
|
||
|
||
<programlisting>env = Environment(**ARGUMENTS)</programlisting>
|
||
|
||
<para>В дальнейшем ее можно изменить при помощи
|
||
<literal>env.Append</literal> и <literal>env.Replace</literal>.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-autotools">
|
||
<title>Использование GNU autotools</title>
|
||
|
||
<sect2 id="using-autotools-introduction">
|
||
<title>Введение</title>
|
||
|
||
<para>Различные инструменты GNU autotools предоставляют механизм
|
||
абстракции для построения частей программного обеспечения на
|
||
широком наборе операционных систем и аппаратных архитектур.
|
||
Внутри Коллекции Портов отдельный порт может использовать
|
||
эти инструменты при помощи простых конструкций:</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= <replaceable>tool</replaceable>:<replaceable>version</replaceable>[:<replaceable>operation</replaceable>] ...</programlisting>
|
||
|
||
<para>К моменту написания <replaceable>tool</replaceable>
|
||
может быть одним из <literal>libtool</literal>,
|
||
<literal>libltdl</literal>, <literal>autoconf</literal>,
|
||
<literal>autoheader</literal>, <literal>automake</literal> или
|
||
<literal>aclocal</literal>.</para>
|
||
|
||
<para><replaceable>version</replaceable> указывает конкретную
|
||
версию используемого инструмента (действующие версии смотрите в
|
||
<literal>devel/{automake,autoconf,libtool}[0-9]+</literal>).</para>
|
||
|
||
<para><replaceable>operation</replaceable> является необязательным
|
||
расширением и указывает на способ использования
|
||
инструмента.</para>
|
||
|
||
<para>Одновременно может быть указано несколько инструментов,
|
||
добавляя их все на одной строке или используя конструкцию
|
||
Makefile <literal>+=</literal>.</para>
|
||
|
||
<para>В заключение, существует специальный инструмент по называнию
|
||
<literal>autotools</literal>, который является удобной функцией
|
||
при установке всех доступных версий autotools для возможности
|
||
проведения кросс-разработки. Это также может быть достигнуто
|
||
путем установки порта <literal>devel/autotools</literal>.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="using-libtool">
|
||
<title><command>libtool</command></title>
|
||
|
||
<para>Динамические библиотеки, использующие инфраструктуру
|
||
построения GNU, обычно используют <application>libtool</application>
|
||
для настройки компиляции и установки динамических библиотек в
|
||
соответствии с особенностями данной операционной системы.
|
||
В типичной практике используется копирование встроенного в
|
||
приложение <command>libtool</command>. Если вам нужно
|
||
использовать внешнюю команду <command>libtool</command>, то вы
|
||
можете использовать версию, поставляемую Коллекцией Портов:</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= libtool:<replaceable>version</replaceable>[:env]</programlisting>
|
||
|
||
<para>При отсутствии дополнительных операций,
|
||
<literal>libtool:<replaceable>version</replaceable></literal>
|
||
сообщает инфраструктуре построения о применении патча к сценарию
|
||
configure с установленной в системе копией
|
||
<command>libtool</command>. Подразумевается использование
|
||
The <makevar>GNU_CONFIGURE</makevar>
|
||
Более того, некоторые переменные make и оболочки shell
|
||
будут назначены для дальнейшего использования этим портом.
|
||
Подробности смотрите в <filename>bsd.autotools.mk</filename>.</para>
|
||
|
||
<para>При использовании операции <literal>:env</literal> будет
|
||
настроено только окружение.</para>
|
||
|
||
<para>Наконец, <makevar>LIBTOOLFLAGS</makevar> и
|
||
<makevar>LIBTOOLFILES</makevar> можно установить по желанию,
|
||
чтобы переопределить наиболее вероятные аргументы для
|
||
<command>libtool</command> и файлы, предназначенные для
|
||
изменения. Большинству портов это скорее всего не понадобится.
|
||
Для дальнейших подробностей смотрите
|
||
<filename>bsd.autotools.mk</filename>.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="using-libltdl">
|
||
<title><command>libltdl</command></title>
|
||
|
||
<para>Некоторые порты задействуют пакет с библиотекой
|
||
<command>libltdl</command>, которая является частью комплекта
|
||
<command>libtool</command>. Использование этой библиотеки
|
||
не вызывает автоматическое использование самой
|
||
<command>libtool</command>, и, таким образом, обеспечивается
|
||
отдельная конструкция.</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= libltdl:<replaceable>version</replaceable></programlisting>
|
||
|
||
<para>Всё, что в настоящее время она делает, это добавление
|
||
<makevar>LIB_DEPENDS</makevar> для подходящего порта
|
||
<command>libltdl</command>, потому она предоставляется как
|
||
удобная функция для помощи в устранении всяких зависимостей от
|
||
портов autotools вне инфраструктуры <makevar>USE_AUTOTOOLS</makevar>.
|
||
Для этого инструмента не существует необязательных операций.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="using-autoconf">
|
||
<title><command>autoconf</command> и
|
||
<command>autoheader</command></title>
|
||
|
||
<para>Некоторые порты не содержат сценарий configure, но содержат
|
||
шаблон autoconf в файле <filename>configure.ac</filename>.
|
||
Вы можете использовать следующие присвоения, чтобы позволить
|
||
<command>autoconf</command> создать сценарий configure, а
|
||
<command>autoheader</command> создать заголовки шаблона для
|
||
использования в сценарии configure.</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= autoconf:<replaceable>version</replaceable>[:env]</programlisting>
|
||
|
||
<para>и</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= autoheader:<replaceable>version</replaceable></programlisting>
|
||
|
||
<para>которые также подразумевают использование
|
||
<literal>autoconf:<replaceable>version</replaceable></literal>.</para>
|
||
|
||
<para>Аналогично команде <command>libtool</command>, подключение
|
||
необязательной операции <literal>:env</literal> всего лишь
|
||
настраивает окружение для дальнейшего использования. Без этого
|
||
выполняется наложение патчей и переконфигурирование порта.</para>
|
||
|
||
<para>Дополнительные необязательные переменные
|
||
<makevar>AUTOCONF_ARGS</makevar> и <makevar>AUTOHEADER_ARGS</makevar>
|
||
можно переопределить в <filename>Makefile</filename> порта,
|
||
если указано явным образом. Как и с эквивалентами
|
||
<command>libtool</command>, большинству портов это вряд ли
|
||
понадобится.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="using-automake">
|
||
<title><command>automake</command> и
|
||
<command>aclocal</command></title>
|
||
|
||
<para>Некоторые пакеты содержат только файлы
|
||
<filename>Makefile.am</filename>. Они должны быть преобразованы
|
||
в файлы <filename>Makefile.in</filename> с использованием
|
||
<application>automake</application> и дальнейшей обработкой
|
||
<command>configure</command> для получения настоящего
|
||
<filename>Makefile</filename>.</para>
|
||
|
||
<para>Аналогично, иногда пакеты не поставляются с вложенными
|
||
файлами <filename>aclocal.m4</filename>, снова требуемых для
|
||
построения программного обеспечения. Этого можно достичь
|
||
с <command>aclocal</command>, которая просматривает
|
||
<filename>configure.ac</filename> или
|
||
<filename>configure.in</filename>.</para>
|
||
|
||
<para><command>aclocal</command> имеет похожую связь с
|
||
<command>automake</command>, как у <command>autoheader</command>
|
||
с <command>autoconf</command>, что описано в предыдущей главе.
|
||
<command>aclocal</command> подразумевает использование
|
||
<command>automake</command>, таким образом, мы имеем:</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= automake:<replaceable>version</replaceable>[:<replaceable>env</replaceable>]</programlisting>
|
||
|
||
<para>и</para>
|
||
|
||
<programlisting>USE_AUTOTOOLS= aclocal:<replaceable>version</replaceable></programlisting>
|
||
|
||
<para>которые также подразумевают использование
|
||
<literal>automake:<replaceable>version</replaceable></literal>.</para>
|
||
|
||
<para>Также как и для <command>libtool</command> и
|
||
<command>autoconf</command>, подключение необязательной
|
||
операции <literal>:env</literal> всего лишь устанавливает
|
||
окружение для дальнейшего пользования. Без этого выполняется
|
||
реконфигурирование этого порта.</para>
|
||
|
||
<para>Как и в случае с
|
||
<command>autoconf</command> и <command>autoheader</command>, обе
|
||
<command>automake</command> и <command>aclocal</command> имеют
|
||
необязательные переменные <makevar>AUTOMAKE_ARGS</makevar> и
|
||
<makevar>ACLOCAL_ARGS</makevar>, соответственно, которые при
|
||
необходимости можно переопределить в <filename>Makefile</filename>
|
||
порта.</para>
|
||
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-gettext">
|
||
<title>Использование GNU <literal>gettext</literal></title>
|
||
|
||
<sect2>
|
||
<title>Простой вариант использования</title>
|
||
|
||
<para>Если для вашего порта требует <literal>gettext</literal>,
|
||
просто установите переменную <makevar>USE_GETTEXT</makevar> в
|
||
значение <literal>yes</literal>, и в ваш порт добавится зависимость
|
||
от <filename role="package">devel/gettext</filename>. Кроме того,
|
||
в <makevar>USE_GETTEXT</makevar> можно установить требуемую версию
|
||
библиотеки <literal>libintl</literal>, основного компонента
|
||
<literal>gettext</literal>, но такой механизм лучше не использовать.
|
||
Ваш порт должен работать и с текущей версией
|
||
<filename role="package">devel/gettext</filename>.</para>
|
||
|
||
<para>Довольно распространенным случаем является использование в
|
||
порте <literal>gettext</literal> и <command>configure</command>.
|
||
Как правило, GNU <command>configure</command> способен находить
|
||
<literal>gettext</literal> автоматически. Если он все же не
|
||
сможет это сделать, то подсказки для размещения
|
||
<literal>gettext</literal> можно передать через переменные окружения
|
||
<envar>CPPFLAGS</envar> и <envar>LDFLAGS</envar>:</para>
|
||
|
||
<programlisting>USE_GETTEXT= yes
|
||
CPPFLAGS+= -I${LOCALBASE}/include
|
||
LDFLAGS+= -L${LOCALBASE}/lib
|
||
|
||
GNU_CONFIGURE= yes
|
||
CONFIGURE_ENV= CPPFLAGS="${CPPFLAGS}" \
|
||
LDFLAGS="${LDFLAGS}"</programlisting>
|
||
|
||
<para>Of course, the code can be more compact if there are no
|
||
more flags to pass to <command>configure</command>:</para>
|
||
|
||
<programlisting>USE_GETTEXT= yes
|
||
GNU_CONFIGURE= yes
|
||
CONFIGURE_ENV= CPPFLAGS="-I${LOCALBASE}/include" \
|
||
LDFLAGS="-L${LOCALBASE}/lib"</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Оптимальное использование</title>
|
||
|
||
<para>Некоторые программные продукты позволяют отключать NLS,
|
||
к примеру через передачу параметра <option>--disable-nls</option>
|
||
сценарию <command>configure</command>. В этом случае, ваш порт
|
||
должен использовать <literal>gettext</literal> в зависимости от
|
||
статуса переключателя <link
|
||
linkend="knobs-without-nls"><makevar>WITHOUT_NLS</makevar></link>.
|
||
Для портов небольшой или средней сложности вы можете полагаться
|
||
на следующую идиому:</para>
|
||
|
||
<programlisting>GNU_CONFIGURE= yes
|
||
|
||
.if !defined(WITHOUT_NLS)
|
||
USE_GETTEXT= yes
|
||
PLIST_SUB+= NLS=""
|
||
.else
|
||
CONFIGURE_ARGS+= --disable-nls
|
||
PLIST_SUB+= NLS="@comment "
|
||
.endif</programlisting>
|
||
|
||
<para>Следующий пункт в вашем списке дел разобраться, чтобы файлы
|
||
каталога сообщения включались в список упаковки по условию. Часть,
|
||
входящая в <filename>Makefile</filename>, уже обеспечена этой
|
||
идиомой. Остальное объясняется в главе <link linkend="plist-sub">
|
||
продвинутые практики <filename>pkg-plist</filename></link>. Вкратце,
|
||
каждое вхождение <literal>%%NLS%%</literal> в
|
||
<filename>pkg-plist</filename> будет заменено на
|
||
<quote><literal>@comment </literal></quote>, если NLS выключен,
|
||
или пустой строкой, если включен. В результате строки,
|
||
предваряемые <literal>%%NLS%%</literal>, станут комментариями
|
||
в итоговом листе упаковки, если NLS выключен; иначе, префикс будет
|
||
просто удален. Всё, что вам нужно, это вставить
|
||
<literal>%%NLS%%</literal> перед каждым путем к файлу каталога
|
||
сообщений в <filename>pkg-plist</filename>. Например:</para>
|
||
|
||
<programlisting>%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
|
||
%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo</programlisting>
|
||
|
||
<para>В особо сложных случаях вам понадобиться использовать более
|
||
продвинутые техники, чем данный рецепт, такие как <link
|
||
linkend="plist-dynamic">динамические списки упаковки</link>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Управление каталогами сообщений</title>
|
||
|
||
<para>Существует момент, который следует учитывать при установке
|
||
файлов каталогов сообщений. Целевые каталоги для размещения,
|
||
расположенные под
|
||
<filename><makevar>LOCALBASE</makevar>/share/locale</filename>,
|
||
редко когда должны создаваться и удаляться вашим портом. Для
|
||
наиболее популярных языков имеются собственные каталоги,
|
||
перечисленные в <filename>/etc/mtree/BSD.local.dist</filename>;
|
||
таким образом, они включены в основную систему. Каталоги для
|
||
множества других языков управляются с помощью порта <filename
|
||
role="package">devel/gettext</filename>. Возможно, вам понадобиться
|
||
обратить внимание на его <filename>pkg-plist</filename> и
|
||
посмотреть, куда ваш порт собирается установить файлы каталогов
|
||
сообщений для единственного в своем роде языка.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-perl">
|
||
<title>Использование <application>Perl</application></title>
|
||
|
||
<para>Если <makevar>MASTER_SITES</makevar> установлена в значение
|
||
<makevar>MASTER_SITE_PERL_CPAN</makevar>, то предпочтительным
|
||
значением <makevar>MASTER_SITE_SUBDIR</makevar> является имя
|
||
иерархии верхнего уровня. Например, рекомендуемым значением для
|
||
<literal>p5-Module-Name</literal> является <literal>Module</literal>.
|
||
Иерархию верхнего уровня можно посмотреть на сайте <ulink
|
||
url="http://cpan.org/modules/by-module/">cpan.org</ulink>. Это
|
||
поддерживает порт в рабочем состоянии при изменении модуля
|
||
автором.</para>
|
||
|
||
<para>Исключением этого правила является отсутствие соответствующего
|
||
каталога или файла с дистрибутивом в этом каталоге. В этом случае
|
||
в качестве <makevar>MASTER_SITE_SUBDIR</makevar> разрешается
|
||
использовать id автора.</para>
|
||
|
||
<para>Все из настраиваемых knobs ниже принимают либо <literal>YES</literal>,
|
||
либо строку с версией вида <literal>5.8.0+</literal>.
|
||
<literal>YES</literal> означает, что данный порт можно использовать
|
||
с любой из поддерживаемых версий Perl.
|
||
Если порт работает только с некоторыми версиями
|
||
Perl, то это можно обозначить при помощи
|
||
строки с версией, указывающей на минимальную версию (пример:
|
||
<literal>5.7.3+</literal>), максимальную версию (пример:
|
||
<literal>5.8.0-</literal>) или точную версию (пример:
|
||
<literal>5.8.3</literal>).</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих
|
||
<application>Perl</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_PERL5</makevar></entry>
|
||
|
||
<entry>Perl 5 используется для построения и работы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PERL5_BUILD</makevar></entry>
|
||
|
||
<entry>Perl 5 используется для построения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PERL5_RUN</makevar></entry>
|
||
|
||
<entry>Perl 5 используется во время работы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL</makevar></entry>
|
||
|
||
<entry>Полный путь к интерпретатору Perl 5, либо в
|
||
системе, либо установленному из портов, но без номера версии.
|
||
Используйте это, если вам нужно заменить строки
|
||
<quote><literal>#!</literal></quote> в скриптах.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_CONFIGURE</makevar></entry>
|
||
|
||
<entry>Конфигурация при помощи MakeMaker языка Perl. Влечёт
|
||
<makevar>USE_PERL5</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_MODBUILD</makevar></entry>
|
||
|
||
<entry>Конфигурация, построение и установка с использованием
|
||
Module::Build. Влечёт <makevar>PERL_CONFIGURE</makevar>.
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменные только для чтения</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>PERL_VERSION</makevar></entry>
|
||
|
||
<entry>Полная версия установленного Perl
|
||
(например, <literal>5.8.9</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_LEVEL</makevar></entry>
|
||
|
||
<entry>Установленная версия Perl в форме
|
||
целого числа вида <literal>MNNNPP</literal> (например,
|
||
<literal>500809</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_ARCH</makevar></entry>
|
||
|
||
<entry>Место, в котором Perl хранит
|
||
архитектурно-зависимые библиотеки. По умолчанию
|
||
это <literal>${ARCH}-freebsd</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PERL_PORT</makevar></entry>
|
||
|
||
<entry>Название установленного порта Perl,
|
||
(к примеру, <literal>perl5</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SITE_PERL</makevar></entry>
|
||
|
||
<entry>Имя каталога, куда помещаются специфичные для сайта
|
||
пакеты Perl. Это значение добавляется к
|
||
<makevar>PLIST_SUB</makevar>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<note>
|
||
<para>Порты для модулей Perl, которые не имеют официального вебсайта,
|
||
должны указывать <hostid>cpan.org</hostid> в строке WWW в файле
|
||
<filename>pkg-descr</filename>. Предпочтительная форма URL
|
||
<literal>http://search.cpan.org/dist/Module-Name/</literal>
|
||
(включая завершающий слэш).</para>
|
||
</note>
|
||
|
||
<note>
|
||
<para>Не используйте <literal>${SITE_PERL}</literal> в объявлении
|
||
зависимостей. Использование этой конструкции подразумевает
|
||
наличие подключенного <filename>bsd.perl.mk</filename>, что
|
||
не всегда так. Порты, зависимые от этого порта, получат
|
||
неправильные зависимости, если файлы этого порта будут
|
||
перемещены при последующем обновлении. Правильный способ
|
||
объявления зависимостей для модулей Perl показан в примере
|
||
ниже.</para>
|
||
</note>
|
||
|
||
<example id="use-perl-dependency-example">
|
||
<title>Пример зависимости Perl</title>
|
||
|
||
<programlisting>p5-IO-Tee>=0.64:${PORTSDIR}/devel/p5-IO-Tee</programlisting>
|
||
</example>
|
||
</sect1>
|
||
|
||
<sect1 id="using-x11">
|
||
<title>Использование X11</title>
|
||
|
||
<sect2 id="x11-variables">
|
||
<title>Компоненты X.Org</title>
|
||
|
||
<para>X.Org является реализацией X11, доступной в Коллекции Портов.
|
||
Если ваше приложение зависит от компонентов X, установите в
|
||
переменную <makevar>USE_XORG</makevar> в перечень требуемых
|
||
компонентов. К настоящему времени доступными компонентами
|
||
являются:</para>
|
||
|
||
<para><literal>bigreqsproto compositeproto damageproto dmx
|
||
dmxproto dri2proto evieproto fixesproto fontcacheproto
|
||
fontenc fontsproto fontutil glproto ice inputproto kbproto
|
||
libfs oldx pciaccess pixman printproto randrproto
|
||
recordproto renderproto resourceproto scrnsaverproto sm
|
||
trapproto videoproto x11 xau xaw xaw6 xaw7 xbitmaps
|
||
xcmiscproto xcomposite xcursor xdamage xdmcp xevie xext
|
||
xextproto xf86bigfontproto xf86dgaproto xf86driproto
|
||
xf86miscproto xf86rushproto xf86vidmodeproto xfixes xfont
|
||
xfontcache xft xi xinerama xineramaproto xkbfile xkbui
|
||
xmu xmuu xorg-server xp xpm xprintapputil xprintutil
|
||
xproto xproxymngproto xrandr xrender xres xscrnsaver xt
|
||
xtrans xtrap xtst xv xvmc xxf86dga xxf86misc xxf86vm</literal>.</para>
|
||
|
||
<para>Всегда актуальный перечень можно найти в
|
||
<filename>/usr/ports/Mk/bsd.xorg.mk</filename>.</para>
|
||
|
||
<para>Проект Mesa является попыткой обеспечить свободную реализацию
|
||
OpenGL. Вы можете указать зависимость от различных компонентов
|
||
этого проекта при помощи переменной <makevar>USE_GL</makevar>.
|
||
Действительные опции: <literal>glut, glu, glw, glew, gl</literal> и
|
||
<literal>linux</literal>. Для обратной совместимости значение
|
||
<literal>yes</literal> соответствует <literal>glu</literal>.</para>
|
||
|
||
<example id="use-xorg-example">
|
||
<title>Пример для USE_XORG</title>
|
||
<programlisting>USE_XORG= xrender xft xkbfile xt xaw
|
||
USE_GL= glu</programlisting>
|
||
</example>
|
||
|
||
<para>Некоторые порты определяют <makevar>USE_XLIB</makevar>, которая
|
||
делает порт зависимым ото всех 50 или около того библиотек. Эта
|
||
переменная существует для обратной совместимости, т.к. предшествует
|
||
модульному X.Org, и не должна использоваться в новых портах.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих X</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_XLIB</makevar></entry>
|
||
|
||
<entry>Порт использует библиотеки X. Является устаревшим -
|
||
используйте вместо этого список компонентов X.Org в
|
||
переменной <makevar>USE_XORG</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_IMAKE</makevar></entry>
|
||
|
||
<entry>Порт использует <command>imake</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>XMKMF</makevar></entry>
|
||
|
||
<entry>Задаётся маршрут до <command>xmkmf</command>, если он
|
||
отсутствует в переменной окружения <envar>PATH</envar>. По
|
||
умолчанию это <literal>xmkmf -a</literal>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<table>
|
||
<title>Переменные, определяющие зависимости от отдельных
|
||
частей X11</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>X_IMAKE_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий <command>imake</command> и
|
||
несколько других утилит, используемых при построении
|
||
X11.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_LIBRARIES_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий библиотеки X11.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_CLIENTS_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий клиентов X.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_SERVER_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий сервер X.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTSERVER_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий сервер шрифтов.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_PRINTSERVER_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий сервер печати.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_VFBSERVER_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий сервер виртуального
|
||
фреймбуфера.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_NESTSERVER_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий вложенный сервер X.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_ENCODINGS_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий кодировки для шрифтов.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_MISC_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий прочие растровые шрифты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_100DPI_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий 100dpi растровые шрифты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_75DPI_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий 75dpi растровые шрифты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_CYRILLIC_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий кириллические растровые шрифты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_TTF_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий шрифты &truetype;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_FONTS_TYPE1_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий шрифты Type1.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>X_MANUALS_PORT</makevar></entry>
|
||
|
||
<entry>Порт, предоставляющий страницы справочника,
|
||
предназначенные для разработчиков.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="using-x11-vars">
|
||
<title>Использование переменных X11 в порте</title>
|
||
<programlisting># Use some X11 libraries and depend on
|
||
# font server as well as cyrillic fonts.
|
||
RUN_DEPENDS= ${LOCALBASE}/bin/xfs:${X_FONTSERVER_PORT} \
|
||
${LOCALBASE}/lib/X11/fonts/cyrillic/crox1c.pcf.gz:${X_FONTS_CYRILLIC_PORT}
|
||
|
||
USE_XORG= x11 xpm</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="porting-motif">
|
||
<title>Порты, которым требуется Motif</title>
|
||
|
||
<para>Если вашему порту требуется Motif, задайте переменную
|
||
<makevar>USE_MOTIF</makevar> в файле <filename>Makefile</filename>.
|
||
Реализация Motif, используемая по умолчанию, находится в
|
||
<filename role="package">x11-toolkits/open-motif</filename>.
|
||
Пользователи вместо этого могут выбрать
|
||
<filename role="package">x11-toolkits/lesstif</filename> через
|
||
установку переменной <makevar>WANT_LESSTIF</makevar>.</para>
|
||
|
||
<para>Переменная <makevar>MOTIFLIB</makevar> будет установлена в
|
||
<filename>bsd.port.mk</filename>, чтобы ссылаться на
|
||
соответствующую библиотеку Motif. Пожалуйста, измените исходные
|
||
тексты вашего порта на использование
|
||
<literal>${MOTIFLIB}</literal> везде, где упоминается
|
||
библиотека Motif, в первоначальном <filename>Makefile</filename>
|
||
или <filename>Imakefile</filename>.</para>
|
||
|
||
<para>Существует два общих случая:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Если порт обращается к библиотеке Motif как
|
||
<literal>-lXm</literal> в своих файлах
|
||
<filename>Makefile</filename> или <filename>Imakefile</filename>,
|
||
просто подставьте вместо этих обращений
|
||
<literal>${MOTIFLIB}</literal>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если порт использует <literal>XmClientLibs</literal> в своем
|
||
файле <filename>Imakefile</filename>, измените это обращение на
|
||
<literal>${MOTIFLIB} ${XTOOLLIB}
|
||
${XLIB}</literal>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Заметьте, что переменная <makevar>MOTIFLIB</makevar> (как
|
||
правило) раскрывается в <literal>-L/usr/local/lib -lXm</literal> или
|
||
<literal>/usr/local/lib/libXm.a</literal>, так что нет нужды впереди
|
||
добавлять <literal>-L</literal> или <literal>-l</literal>.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Шрифты для X11</title>
|
||
|
||
<para>Если ваш порт устанавливает шрифты для X Window System,
|
||
поместите их в каталог
|
||
<filename><makevar>LOCALBASE</makevar>/lib/X11/fonts/local</filename>.
|
||
</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Получение поддельного <envar>DISPLAY</envar>, используя
|
||
Xvfb</title>
|
||
|
||
<para>Некоторые приложения для успешной компиляции требуют
|
||
наличие работающего дисплея X11. Это создает проблему для машин,
|
||
которые работают в режиме headless. При использовании следующего
|
||
канонического хака инфраструктура построения
|
||
запустит сервер X в виртуальном фреймбуфере. Затем переменная
|
||
работающего <envar>DISPLAY</envar> передается при построении.</para>
|
||
|
||
<programlisting>USE_DISPLAY= yes</programlisting>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="desktop-entries">
|
||
<title>Элементы рабочего стола</title>
|
||
|
||
<para>Элементы рабочего стола (<ulink
|
||
url="http://standards.freedesktop.org/desktop-entry-spec/latest/">стандарта
|
||
Freedesktop</ulink>) предоставляют способ автоматической настройки
|
||
функций рабочего стола при установке новой программы, не требуя
|
||
вмешательства пользователя. Например, новые программы автоматически
|
||
отображаются в меню приложений совместимых окружений рабочего стола.
|
||
Элементы рабочего стола изначально появились в окружении рабочего
|
||
стола <application>GNOME</application>, но в настоящее время являются
|
||
стандартом и также работают с <application>KDE</application> и
|
||
<application>Xfce</application>. Такая небольшая автоматизация
|
||
предоставляет реальное удобство для пользователя, и посему элементы
|
||
рабочего стола приветствуются в приложениях, которые можно
|
||
использовать в окружении рабочего стола.</para>
|
||
|
||
<sect3>
|
||
<title>Использование предопределенных файлов
|
||
<filename>.desktop</filename></title>
|
||
|
||
<para>Порты, включающие предопределенные файлы
|
||
<filename>*.desktop</filename>, должны включать эти файлы в
|
||
<filename>pkg-plist</filename> и устанавливать их в каталог
|
||
<filename><makevar>$LOCALBASE</makevar>/share/applications</filename>.
|
||
Для установки этих файлов используется <link
|
||
linkend="install-macros">макрос <makevar>INSTALL_DATA</makevar></link>.</para>
|
||
</sect3>
|
||
|
||
<sect3 id="desktop-entries-macro">
|
||
<title>Создание элементов рабочего стола с использованием
|
||
<makevar>DESKTOP_ENTRIES</makevar></title>
|
||
|
||
<para>Элементы рабочего стола можно легко создавать для приложений,
|
||
используя переменную <makevar>DESKTOP_ENTRIES</makevar>.
|
||
Будет автоматически создан, установлен и добавлен в
|
||
<filename>pkg-plist</filename> файл с названием
|
||
<filename><replaceable>name</replaceable>.desktop</filename>.
|
||
Синтаксис:</para>
|
||
|
||
<programlisting>DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify</programlisting>
|
||
|
||
<para>Перечень возможных категорий доступен на <ulink
|
||
url="http://standards.freedesktop.org/menu-spec/latest/apa.html">
|
||
вебсайте Freedesktop</ulink>. <makevar>StartupNotify</makevar>
|
||
отобразит, поддерживает ли приложение <emphasis>уведомления о
|
||
запуске</emphasis>. Как правило, это графический индикатор часы
|
||
вместо указателя мыши, меню или панель, которые уведомляют
|
||
пользователя о загрузке программы. Программа, поддерживающая
|
||
уведомления о запуске, очистит этот индикатор после запуска.
|
||
Программы, несовместимые с уведомлениями о запуске, не будут
|
||
очищать индикатор (возможно, вызывая путаницу и приводя
|
||
пользователей в бешенство), и поэтому должны иметь
|
||
<makevar>StartupNotify</makevar> в выключенном состоянии
|
||
<literal>false</literal>; тогда индикатор не будет отображаться
|
||
совсем.</para>
|
||
|
||
<para>Пример:</para>
|
||
|
||
<programlisting>DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
|
||
"${DATADIR}/xtra/graf/tome-128.png" \
|
||
"tome -v -g" "Application;Game;RolePlaying;" \
|
||
false</programlisting>
|
||
</sect3>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-gnome">
|
||
<title>Использование GNOME</title>
|
||
|
||
<para>Для задания того, какие компоненты GNOME использует конкретный
|
||
порт, проект FreeBSD/GNOME использует собственный набор переменных.
|
||
На странице проекта FreeBSD/GNOME
|
||
размещён <ulink url="http://www.FreeBSD.org/gnome/docs/porting.html">
|
||
исчерпывающий список этих переменных</ulink>.</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-qt">
|
||
<title>Использование Qt</title>
|
||
|
||
<sect2 id="qt-common">
|
||
<title>Порты, для которых требуется Qt</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих Qt</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_QT_VER</makevar></entry>
|
||
|
||
<entry>Порт использует инструментальный пакет Qt.
|
||
Возможными значениями являются <literal>3</literal> и
|
||
<literal>4</literal>, каждая из которых указывает на
|
||
старший номер используемой версии Qt. Соответствующие
|
||
параметры передаются в сценарий <command>configure</command>
|
||
и <command>make</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QT_PREFIX</makevar></entry>
|
||
|
||
<entry>Устанавливается в значение, содержащее путь к
|
||
установленному Qt (переменная только для чтения).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>MOC</makevar></entry>
|
||
|
||
<entry>Устанавливается в значение, содержащее путь к
|
||
<command>moc</command> (переменная только для чтения).
|
||
По умолчанию устанавливается в соответствии со значением
|
||
<makevar>USE_QT_VER</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QTCPPFLAGS</makevar></entry>
|
||
|
||
<entry>Дополнительные флаги компилятора для инструментального
|
||
пакета Qt, передаваемые через переменную
|
||
<makevar>CONFIGURE_ENV</makevar>. По умолчанию
|
||
устанавливается в соответствии со значением
|
||
<makevar>USE_QT_VER</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QTCFGLIBS</makevar></entry>
|
||
|
||
<entry>Дополнительные флаги компоновки для инструментального
|
||
пакета Qt, передаваемые через переменную
|
||
<makevar>CONFIGURE_ENV</makevar>. По умолчанию
|
||
устанавливается в соответствии со значением
|
||
<makevar>USE_QT_VER</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QTNONSTANDARD</makevar></entry>
|
||
|
||
<entry>Подавляет изменение <makevar>CONFIGURE_ENV</makevar>,
|
||
<makevar>CONFIGURE_ARGS</makevar>,
|
||
<makevar>CPPFLAGS</makevar> и
|
||
<makevar>MAKE_ENV</makevar>.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<table frame="none">
|
||
<title>Дополнительные переменные для портов,
|
||
использующих Qt 4.x</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>QT_COMPONENTS</makevar></entry>
|
||
|
||
<entry>Указывает инструменты и библиотеки в качестве
|
||
зависимостей для Qt 4. Смотрите подробнее ниже.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>UIC</makevar></entry>
|
||
|
||
<entry>Устанавливает путь к <command>uic</command>
|
||
(переменная только для чтения).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QMAKE</makevar></entry>
|
||
|
||
<entry>Устанавливает путь к <command>qmake</command>
|
||
(переменная только для чтения).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>QMAKESPEC</makevar></entry>
|
||
|
||
<entry>Устанавливает путь к конфигурационному файлу для
|
||
<command>qmake</command> (переменная только для чтения).</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>При установленной переменной <makevar>USE_QT_VER</makevar>
|
||
сценарию <command>configure</command> можно передавать некоторые
|
||
полезные настройки:</para>
|
||
|
||
<programlisting>CONFIGURE_ARGS+= --with-qt-includes=${QT_PREFIX}/include \
|
||
--with-qt-libraries=${QT_PREFIX}/lib \
|
||
--with-extra-libs=${LOCALBASE}/lib \
|
||
--with-extra-includes=${LOCALBASE}/include
|
||
CONFIGURE_ENV+= MOC="${MOC}" LIBS="${QTCFGLIBS}" \
|
||
QTDIR="${QT_PREFIX}" KDEDIR="${KDE_PREFIX}"
|
||
CPPFLAGS+= ${QTCPPFLAGS}</programlisting>
|
||
|
||
<para>Если переменная <makevar>USE_QT_VER</makevar> установлена в
|
||
значение <literal>4</literal>, то также разворачиваются следующие
|
||
настройки:</para>
|
||
|
||
<programlisting>CONFIGURE_ENV+= UIC="${UIC}" QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}"
|
||
MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="qt4-components">
|
||
<title>Выбор компонентов (только для Qt 4.x)</title>
|
||
|
||
<para>Если <makevar>USE_QT_VER</makevar> установлена в
|
||
значение <literal>4</literal>, то в
|
||
переменной <makevar>QT_COMPONENTS</makevar> можно указать
|
||
зависимость от отдельных инструментов и библиотек Qt 4. К каждому
|
||
компоненту можно добавить суффикс, <literal>_build</literal>
|
||
или <literal>_run</literal>, отражающий, когда должна быть применена
|
||
зависимость, во время сборки или выполнения, соответственно. Если
|
||
суффикс отсутствует, зависимость от компонента будет и для времени
|
||
сборки, и для времени выполнения. Обычно, компоненты библиотек
|
||
должны указываться без суффиксов, компоненты инструментов - с
|
||
суффиксом <literal>_build</literal>, а компоненты плагинов - с
|
||
суффиксом <literal>_run</literal>. Наиболее общие используемые
|
||
компоненты перечислены ниже (все доступные компоненты перечислены
|
||
в <makevar>_QT_COMPONENTS_ALL</makevar> в файле
|
||
<filename>/usr/ports/Mk/bsd.qt.mk</filename>):</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные библиотечные компоненты Qt 4</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>corelib</literal></entry>
|
||
<entry>основная библиотека (можно опустить, если порт не
|
||
использует ничего, кроме <literal>corelib</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>gui</literal></entry>
|
||
<entry>библиотека графического пользовательского
|
||
интерфейса</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>network</literal></entry>
|
||
<entry>сетевая библиотека</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>opengl</literal></entry>
|
||
<entry>библиотека OpenGL</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>qt3support</literal></entry>
|
||
<entry>библиотека совместимости с Qt 3</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>qtestlib</literal></entry>
|
||
<entry>библиотека модульного тестирования</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>script</literal></entry>
|
||
<entry>библиотека сценариев</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>sql</literal></entry>
|
||
<entry>библиотека SQL</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>xml</literal></entry>
|
||
<entry>библиотека XML</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Вы можете определить, от каких библиотек зависит приложение,
|
||
запустив <command>ldd</command> на основной исполняемый файл
|
||
после успешной компиляции.</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные компоненты инструментов Qt 4</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>moc</literal></entry>
|
||
<entry>мета-объектный компилятор (нужен при построении
|
||
почти для каждого приложения Qt)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>qmake</literal></entry>
|
||
<entry>генератор Makefile / утилита построения</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>rcc</literal></entry>
|
||
<entry>компилятор ресурсов (нужен, если приложение
|
||
идет вместе с файлами <filename>*.rc</filename> или
|
||
<filename>*.qrc</filename>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>uic</literal></entry>
|
||
<entry>компилятор пользовательского интерфейса (нужен, если
|
||
приложение идет вместе с файлами <filename>*.ui</filename>,
|
||
созданными при помощи Qt Designer, - на практике каждое
|
||
приложение Qt с GUI)</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<table frame="none">
|
||
<title>Доступные компоненты плагинов Qt 4</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>iconengines</literal></entry>
|
||
<entry>плагин для движка иконок SVG (если приложение
|
||
поставляется с иконками SVG)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>imageformats</literal></entry>
|
||
<entry>плагины для графических форматов GIF, JPEG, MNG и SVG
|
||
(если приложение поставляется с графическими файлами)</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="qt4-components-example">
|
||
<title>Выбор компонентов Qt 4</title>
|
||
|
||
<para>В этом примере портированное приложение использует библиотеку
|
||
графического пользовательского интерфейса Qt 4, основную библиотеку
|
||
Qt 4, все инструменты генерации кода Qt 4 и генератор Makefile Qt 4.
|
||
Поскольку библиотека <literal>gui</literal> подразумевает
|
||
зависимость от основной библиотеки, указывать
|
||
<literal>corelib</literal> нет необходимости. Инструменты
|
||
генерации кода Qt 4 <literal>moc</literal>, <literal>uic</literal>
|
||
и <literal>rcc</literal>, а также генератор Makefile
|
||
<literal>qmake</literal> нужны только для времени построения,
|
||
поэтому они указаны с суффиксом <literal>_build</literal>:</para>
|
||
|
||
<programlisting>USE_QT_VER= 4
|
||
QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_build</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="qt-additional">
|
||
<title>Прочие соображения</title>
|
||
|
||
<para>Если вместе с приложением вместо <filename>configure</filename>
|
||
поставляется файл <filename>.pro</filename>, вы можете использовать
|
||
следующее:</para>
|
||
|
||
<programlisting>HAS_CONFIGURE= yes
|
||
|
||
do-configure:
|
||
@cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV} \
|
||
${QMAKE} PREFIX=${PREFIX} texmaker.pro</programlisting>
|
||
|
||
<para>Обратите внимание на сходство со строкой <command>qmake</command>
|
||
из прилагаемого сценария <filename>BUILD.sh</filename>. Передача
|
||
<makevar>CONFIGURE_ENV</makevar> обеспечивает видимость переменной
|
||
<makevar>QMAKESPEC</makevar> для <command>qmake</command>, без
|
||
которой команда не может работать. <command>qmake</command>
|
||
порождает стандартные Makefile, и, таким образом, отпадает
|
||
необходимость в написании своих собственных целей
|
||
<maketarget>build</maketarget>.</para>
|
||
|
||
<para>Приложения Qt часто пишутся в кроссплатформенной манере, и
|
||
X11/Unix часто не является для них платформой разработки, что в
|
||
свою очередь часто приводит к соответствующим упущенным
|
||
моментам:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><emphasis>Отсутствующие дополнительные пути для
|
||
заголовочных файлов.</emphasis> Многие приложения идут с
|
||
поддержкой иконки в системном трее, но пренебрегают смотреть
|
||
на наличие заголовочных файлов и/или библиотеками в каталогах
|
||
X11. Вы можете сообщить <command>qmake</command>, чтобы она
|
||
добавила каталоги в пути поиска заголовочных файлов и библиотек
|
||
через командную строку. К примеру:</para>
|
||
|
||
<programlisting>${QMAKE} PREFIX=${PREFIX} INCLUDEPATH+=${LOCALBASE}/include \
|
||
LIBS+=-L${LOCALBASE}/lib sillyapp.pro</programlisting>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><emphasis>Фиктивные пути установки.</emphasis>
|
||
Иногда данные, такие как иконки и файлы .desktop,
|
||
устанавливаются по умолчанию в каталоги, которые не
|
||
просматриваются XDG-совместимыми приложениями. Примером
|
||
является <filename role="package">editors/texmaker</filename> -
|
||
взгляните на <filename>patch-texmaker.pro</filename> из каталога
|
||
<filename>files</filename> этого порта, который можно взять
|
||
в качестве шаблона исправления этого непосредственно в файле
|
||
проекта <command>qmake</command>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-kde">
|
||
<title>Использование KDE</title>
|
||
|
||
<sect2 id="kde-variables">
|
||
<title>Задание переменных (только для KDE 3.x)</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих KDE 3.x</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_KDELIBS_VER</makevar></entry>
|
||
|
||
<entry>Порт использует библиотеки KDE. Определяет старший
|
||
номер используемой версии KDE. Подразумевается
|
||
включение <makevar>USE_QT_VER</makevar> подходящей версии.
|
||
Единственным возможным значением является
|
||
<literal>3</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_KDEBASE_VER</makevar></entry>
|
||
|
||
<entry>Порт использует в качестве установки корневой каталог
|
||
KDE. Определяет старший номер используемой версии KDE.
|
||
Подразумевает включение <makevar>USE_QT_VER</makevar>
|
||
подходящей версии. Единственным возможным значением
|
||
является <literal>3</literal>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2 id="kde4-variables">
|
||
<title>Задание переменных KDE 4</title>
|
||
|
||
<para>Если ваше приложение зависит от KDE 4.x, присвойте
|
||
<makevar>USE_KDE4</makevar> список требуемых компонентов.
|
||
Для переопределения типа зависимости компонента могут быть
|
||
использованы суффиксы <literal>_build</literal> и
|
||
<literal>_run</literal> (например, <literal>baseapps_run</literal>).
|
||
Если суффикс не задан, будет использован тип зависимости по
|
||
умолчанию. Если вы хотите использовать оба типа, добавьте
|
||
компонент дважды с обоими суффиксами (например,
|
||
<literal>automoc4_build automoc4_run</literal>). Основные
|
||
наиболее используемые компоненты перечислены ниже (актуальные
|
||
компоненты задокументированы в начале файла
|
||
<filename>/usr/ports/Mk/bsd.kde4.mk</filename>):</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные компоненты KDE 4</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>baseapps</literal></entry>
|
||
<entry>Основные приложения KDE Desktop</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>kdehier</literal></entry>
|
||
<entry>Иерархия основных каталогов KDE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>kdelibs</literal></entry>
|
||
<entry>KDE Developer Platform</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>kdeprefix</literal></entry>
|
||
<entry>Если установлено, то порт будет установлен в
|
||
<literal>${KDE4_PREFIX}</literal> вместо
|
||
<literal>${LOCALBASE}</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>pimlibs</literal></entry>
|
||
<entry>Библиотеки KDE-Pim</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>workspace</literal></entry>
|
||
<entry>Пользовательские окружения KDE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>akonadi</literal></entry>
|
||
<entry>Сервер хранения KDE-Pim</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>automoc4</literal></entry>
|
||
<entry>automoc для пакетов Qt 4</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Для избежания конфликтов с портами KDE 3.x, порты KDE 4.x
|
||
устанавливаются в <makevar>KDE4_PREFIX</makevar>, что в
|
||
настоящее время соответствует <filename>/usr/local/kde4</filename>.
|
||
Это достигается путем указания компонента <literal>kdeprefix</literal>,
|
||
который определяет значение по умолчанию для <makevar>PREFIX</makevar>.
|
||
Тем не менее, порты учитывают любые <makevar>PREFIX</makevar>,
|
||
установленные через переменную окружения <envar>MAKEFLAGS</envar>
|
||
и/или параметры <command>make</command>.</para>
|
||
|
||
<example id="kde4-components-example">
|
||
<title>Пример <makevar>USE_KDE4</makevar></title>
|
||
|
||
<para>Это простой пример для порта KDE 4.
|
||
<makevar>USE_CMAKE</makevar> указывает порту использовать
|
||
<application>CMake</application> — конфигурационный
|
||
инструмент, широко распространенный среди проектов KDE 4.
|
||
<makevar>USE_KDE4</makevar> добавляет зависимость от библиотек KDE
|
||
и заставляет порты использовать <command>automoc4</command>
|
||
во время сборки. Требуемые компоненты KDE и другие зависимости
|
||
можно определить в журнале configure. <makevar>USE_KDE4</makevar>
|
||
не подразумевает <makevar>USE_QT_VER</makevar>. Если порт требует
|
||
какой-либо из компонентов Qt 4, то следует установить
|
||
<makevar>USE_QT_VER</makevar>, а затем можно указать необходимые
|
||
компоненты.</para>
|
||
|
||
<programlisting>USE_CMAKE= yes
|
||
USE_KDE4= kdelibs kdeprefix automoc4
|
||
USE_QT_VER= 4
|
||
QT_COMPONENTS= moc_build qmake_build rcc_build uic_build</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-java">
|
||
<title>Использование Java</title>
|
||
|
||
<sect2 id="java-variables">
|
||
<title>Задание переменных</title>
|
||
|
||
<para>Если вашему порту необходимо наличие Java™ Development Kit
|
||
(JDK™) для построения, работы или даже распаковки
|
||
дистрибутивного файла, то в нём должна быть задана переменная
|
||
<makevar>USE_JAVA</makevar>.</para>
|
||
|
||
<para>В Коллекции Портов присутствуют несколько JDK различных
|
||
разработчиков и разных версий. Если ваш порт должен использовать
|
||
одну из этих версий, то вы должны указать, какую именно. Самой
|
||
последней версией является <filename
|
||
role="package">java/jdk16</filename>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные, которые которые могут задаваться портами,
|
||
использующими Java</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_JAVA</makevar></entry>
|
||
|
||
<entry>Должна быть определена для того, что последующие
|
||
переменные вступили в действие.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_VERSION</makevar></entry>
|
||
<entry>Список версий Java, перечисленных через пробел,
|
||
подходящих для порта. Опциональный знак
|
||
<literal>"+"</literal> позволяет вам указать диапазон
|
||
версий (возможные значения:
|
||
<literal>1.5[+] 1.6[+] 1.7[+]
|
||
</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_OS</makevar></entry>
|
||
<entry>Список операционных систем, перечисленных через пробел,
|
||
порты JDK для которых подходят для порта (возможные значения:
|
||
<literal>native linux</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_VENDOR</makevar></entry>
|
||
<entry>Список разработчиков портов JDK, перечисленных через
|
||
пробел, которые подходят для порта (возможные значения:
|
||
<literal>freebsd bsdjava sun
|
||
openjdk</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_BUILD</makevar></entry>
|
||
<entry>Если задана, то означает, что выбранный порт JDK должен
|
||
быть добавлен к зависимостям порта для его
|
||
построения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_RUN</makevar></entry>
|
||
<entry>Если задана, то означает, что выбранный порт JDK должен
|
||
быть добавлен в зависимостям порта для его работы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_EXTRACT</makevar></entry>
|
||
<entry>Если задана, то означает, что выбранный порт JDK должен
|
||
быть добавлен в зависимостям порта для распаковки его
|
||
дистрибутивных файлов.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Ниже перечисляются все значения, которые принимают переменные
|
||
после задания переменной <makevar>USE_JAVA</makevar>:</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные, доступные в портах, использующих Java</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>JAVA_PORT</makevar></entry>
|
||
<entry>Название порта JDK (к примеру,
|
||
<literal>'java/openjdk6'</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_PORT_VERSION</makevar></entry>
|
||
<entry>Полное наименовании версии порта JDK (к примеру,
|
||
<literal>'1.6.0'</literal>). Если вам нужны только первые
|
||
две цифры номера версии, используйте конструкцию
|
||
<makevar>${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_PORT_OS</makevar></entry>
|
||
<entry>Операционная система, используемая портом JDK (к примеру,
|
||
<literal>'native'</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_PORT_VENDOR</makevar></entry>
|
||
<entry>Разработчик порта JDK (к примеру,
|
||
<literal>'openjdk'</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_PORT_OS_DESCRIPTION</makevar></entry>
|
||
<entry>Описание операционной системы, используемой портом JDK
|
||
(к примеру, <literal>'Native'</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_PORT_VENDOR_DESCRIPTION</makevar></entry>
|
||
<entry>Описание разработчика порта JDK (к примеру,
|
||
<literal>'OpenJDK BSD Porting Team'</literal>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_HOME</makevar></entry>
|
||
<entry>Маршрут к установочному каталогу JDK (к примеру,
|
||
<filename>'/usr/local/openjdk6'</filename>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVAC</makevar></entry>
|
||
<entry>Маршрут к используемому компилятору Java (к примеру,
|
||
<filename>'/usr/local/openjdk6/bin/javac'</filename>.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAR</makevar></entry>
|
||
<entry>Маршрут к используемой утилите <command>jar</command> (к
|
||
примеру, <filename>'/usr/local/openjdk6/bin/jar'</filename>
|
||
или <filename>'/usr/local/bin/fastjar'</filename>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APPLETVIEWER</makevar></entry>
|
||
<entry>Маршрут к утилите <command>appletviewer</command> (к
|
||
примеру,
|
||
<filename>'/usr/local/openjdk6/bin/appletviewer'</filename>).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA</makevar></entry>
|
||
<entry>Маршрут к выполняемому файлу <command>java</command>.
|
||
Используйте его для запуска Java-программ (к примеру,
|
||
<filename>'/usr/local/openjdk6/bin/java'</filename>).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVADOC</makevar></entry>
|
||
<entry>Маршрут к вспомогательной программе
|
||
<command>javadoc</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVAH</makevar></entry>
|
||
<entry>Маршрут к программе <command>javah</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVAP</makevar></entry>
|
||
<entry>Маршрут к программе <command>javap</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_KEYTOOL</makevar></entry>
|
||
<entry>Маршрут к вспомогательной программе
|
||
<command>keytool</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_N2A</makevar></entry>
|
||
<entry>Маршрут к утилите
|
||
<command>native2ascii</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_POLICYTOOL</makevar></entry>
|
||
<entry>Маршрут к программе <command>policytool</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_SERIALVER</makevar></entry>
|
||
<entry>Маршрут к вспомогательной программе
|
||
<command>serialver</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RMIC</makevar></entry>
|
||
<entry>Маршрут к генератору каркаса программ RMI, утилите
|
||
<command>rmic</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RMIREGISTRY</makevar></entry>
|
||
<entry>Маршрут к программе регистрации RMI,
|
||
<command>rmiregistry</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RMID</makevar></entry>
|
||
<entry>Маршрут к программе-даемону RMI
|
||
<command>rmid</command>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVA_CLASSES</makevar></entry>
|
||
<entry>Маршрут к архиву, который содержит файлы классов JDK,
|
||
<filename>${JAVA_HOME}/jre/lib/rt.jar</filename>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Вы можете воспользоваться make-целью
|
||
<literal>java-debug</literal> для получения информации, необходимой
|
||
для отладки вашего порта. При её выполнении будут выданы значения
|
||
многих упомянутых выше переменных.</para>
|
||
|
||
<para>Кроме того, для единообразия установки всех портов Java
|
||
определены следующие константы:</para>
|
||
|
||
<table frame="none">
|
||
<title>Константы, определённые для портов, использующих Java</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Константа</entry>
|
||
|
||
<entry>Значение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>JAVASHAREDIR</makevar></entry>
|
||
<entry>Корневой каталог для всего, что связано с Java.
|
||
По умолчанию: <filename>${PREFIX}/share/java</filename>.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVAJARDIR</makevar></entry>
|
||
<entry>Каталог, в который должны устанавливаться JAR-файлы. По
|
||
умолчанию:
|
||
<filename>${JAVASHAREDIR}/classes</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>JAVALIBDIR</makevar></entry>
|
||
<entry>Каталог, в который устанавливаются JAR-файлы из
|
||
других портов. По умолчанию:
|
||
<filename>${LOCALBASE}/share/java/classes</filename>.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Соответствующие записи определяются в обоих переменных
|
||
<makevar>PLIST_SUB</makevar> (описана в <xref
|
||
linkend="plist-sub"/>) и <makevar>SUB_LIST</makevar>.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="java-building-with-ant">
|
||
<title>Построение с Ant</title>
|
||
|
||
<para>Если построение порта производится с использованием Apache Ant,
|
||
то необходимо определить <makevar>USE_ANT</makevar>. Таким образом
|
||
Ant становится подкомандой make. Если в порте не определена цель
|
||
<literal>do-build</literal>, то будет установлена цель по умолчанию,
|
||
которая просто запускает Ant в соответствии со значением
|
||
<makevar>MAKE_ENV</makevar>, <makevar>MAKE_ARGS</makevar> и
|
||
<makevar>ALL_TARGET</makevar>. Это похоже на механизм
|
||
<makevar>USE_GMAKE</makevar>, который описан в
|
||
<xref linkend="building"/>.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="java-best-practices">
|
||
<title>Практические рекомендации</title>
|
||
|
||
<para>При портировании Java-библиотеки ваш порт должен
|
||
устанавливать JAR-файл(ы) в каталог
|
||
<filename>${JAVAJARDIR}</filename>, а все остальные данные в каталог
|
||
<filename>${JAVASHAREDIR}/${PORTNAME}</filename> (за исключением
|
||
документации, о которой пойдёт речь ниже). Для уменьшения размера
|
||
упакованного файла вы можете сослаться на JAR-файл(ы) непосредственно
|
||
в файле <filename>Makefile</filename>. Просто воспользуйтесь
|
||
следующей директивой (в которой <filename>myport.jar</filename>
|
||
является именем JAR-файла, устанавливаемого как часть порта):</para>
|
||
|
||
<programlisting>PLIST_FILES+= %%JAVAJARDIR%%/myport.jar</programlisting>
|
||
|
||
<para>При портировании Java-приложения порт обычно устанавливает всё
|
||
в один каталог (в том числе все свои JAR-зависимости). В этом
|
||
отношении настоятельно рекомендуется использование
|
||
<filename>${JAVASHAREDIR}/${PORTNAME}</filename>. На усмотрение
|
||
создателя порта остаётся решение вопроса о том, устанавливать ли
|
||
дополнительные JAR-зависимости в этот каталог или напрямую
|
||
использовать уже установленные (из каталога
|
||
<filename>${JAVAJARDIR}</filename>).</para>
|
||
|
||
<para>Вне зависимости от типа вашего порта (библиотека это или
|
||
приложение), дополнительная документация должна быть устанавливаться
|
||
<link linkend="install-documentation">в тоже самое место</link>, что
|
||
и для других портов. Известно, что в зависимости от используемой
|
||
версии JDK утилита JavaDoc генерирует различные наборы файлов. Для
|
||
портов, которые не привязаны к использованию определённой версии
|
||
JDK, таким образом становится проблематичным определить список файлов
|
||
для упаковки (<filename>pkg-plist</filename>). Это одна из причин,
|
||
по которой создателям портов настоятельно рекомендуется использовать
|
||
макрос <makevar>PORTDOCS</makevar>. Более того, даже если вы сможете
|
||
угадать набор файлов, который будет сгенерирован утилитой
|
||
<command>javadoc</command>, размер получающегося файла
|
||
<filename>pkg-plist</filename> голосует за использование
|
||
<makevar>PORTDOCS</makevar>.</para>
|
||
|
||
<para>Значением по умолчанию для переменной <makevar>DATADIR</makevar>
|
||
является <filename>${PREFIX}/share/${PORTNAME}</filename>. Хорошей
|
||
идеей является переопределение для Java-портов значения
|
||
<makevar>DATADIR</makevar> как
|
||
<filename>${JAVASHAREDIR}/${PORTNAME}</filename>. На самом деле
|
||
<makevar>DATADIR</makevar> автоматически добавляется к
|
||
<makevar>PLIST_SUB</makevar> (это описано в <xref
|
||
linkend="plist-sub"/>), так что вы сможете
|
||
использовать <literal>%%DATADIR%%</literal> непосредственно в
|
||
<filename>pkg-plist</filename>.</para>
|
||
|
||
<para>Что касается выбора между построением портов Java из исходных
|
||
текстов или их прямой установкой из бинарных дистрибутивов, то на
|
||
момент создания этого текста определённой политики на этот счёт не
|
||
существует. Однако участники <ulink
|
||
url="http://www.freebsd.org/java/">Проекта &os; Java</ulink>
|
||
рекомендуют создателям портов строить их из исходных текстов, если
|
||
эта задача является несложной.</para>
|
||
|
||
<para>Все возможности, которые были описаны в этом разделе, реализованы
|
||
в файле <filename>bsd.java.mk</filename>. Если вы предположите, что
|
||
вашему порту требуется менее тривиальная поддержка Java, пожалуйста,
|
||
взгляните сначала на <ulink
|
||
url="http://svn.FreeBSD.org/ports/head/Mk/bsd.java.mk?view=markup">журнал
|
||
изменений bsd.java.mk в SVN</ulink>, так как для
|
||
документирования последних изменений требуется какое-то время.
|
||
Затем, если вы думаете, что не хватающая вам поддержка окажется
|
||
полезной для многих других портов Java, обсудите ваш вопрос в
|
||
&a.java;.</para>
|
||
|
||
<para>Хотя в базе сообщений об ошибках для соответствующих PR имеется
|
||
категория <literal>java</literal>, она относится к работе над
|
||
портированием JDK, которые проводит Проект &os; Java. Таким образом,
|
||
вы должны относить свой Java-порт, как и любой другой, к категории
|
||
<literal>ports</literal>, если решаемый вами вопрос не относится ни
|
||
к реализации JDK, ни к <filename>bsd.java.mk</filename>.</para>
|
||
|
||
<para>Похожим образом определена политика по отношению к
|
||
<makevar>CATEGORIES</makevar> порта Java, которая подробно описана
|
||
в <xref linkend="makefile-categories"/>.</para>
|
||
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-php">
|
||
<title>Веб-приложения, Apache и PHP</title>
|
||
|
||
<sect2 id="using-apache">
|
||
<title>Apache</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих Apache</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
|
||
<row>
|
||
<entry><makevar>USE_APACHE</makevar></entry>
|
||
|
||
<entry>Порт требует Apache. Возможные значения:
|
||
<literal>yes</literal> (берёт любую версию),
|
||
<literal>20</literal>, <literal>22</literal>,
|
||
<literal>20-22</literal>, <literal>20+</literal>
|
||
и так далее. Версия по умолчанию
|
||
<literal>22</literal>. Более подробная информация
|
||
содержится в файле
|
||
<filename>ports/Mk/bsd.apache.mk</filename> и на
|
||
странице <ulink url="http://wiki.freebsd.org/Apache/">
|
||
wiki.freebsd.org/Apache/</ulink>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_APACHE2</makevar></entry>
|
||
|
||
<entry>Эта переменная является
|
||
устаревшей и не должна больше использоваться.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APXS</makevar></entry>
|
||
|
||
<entry>Полный путь к исполняемому файлу <command>apxs</command>.
|
||
Может быть переопределен в вашем порту.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>HTTPD</makevar></entry>
|
||
|
||
<entry>Полный путь к исполняемому файлу <command>httpd</command>.
|
||
Может быть переопределен в вашем порту.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APACHE_VERSION</makevar></entry>
|
||
|
||
<entry>Версия установленного Apache (переменная только для
|
||
чтения). Эта переменная доступна только после подключения
|
||
<filename>bsd.port.pre.mk</filename>. Возможные значения:
|
||
<literal>20</literal>, <literal>22</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APACHEMODDIR</makevar></entry>
|
||
|
||
<entry>Каталог для модулей Apache. Значение переменной
|
||
автоматически подставляется в <filename>pkg-plist</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APACHEINCLUDEDIR</makevar></entry>
|
||
|
||
<entry>Каталог для заголовков Apache. Значение переменной
|
||
автоматически подставляется в <filename>pkg-plist</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>APACHEETCDIR</makevar></entry>
|
||
|
||
<entry>Каталог для конфигурационных файлов Apache. Значение
|
||
переменной автоматически подставляется в
|
||
<filename>pkg-plist</filename>.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<table frame="none">
|
||
<title>Используемые переменные при портировании модулей
|
||
Apache</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
|
||
<row>
|
||
<entry><makevar>MODULENAME</makevar></entry>
|
||
|
||
<entry>Название модуля. Значением по умолчанию является
|
||
<makevar>PORTNAME</makevar>. Пример:
|
||
<literal>mod_hello</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>SHORTMODNAME</makevar></entry>
|
||
|
||
<entry>Краткое название модуля. Наследуется автоматически
|
||
от <makevar>MODULENAME</makevar>, но может быть
|
||
переопределено. Пример: <literal>hello</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>AP_FAST_BUILD</makevar></entry>
|
||
|
||
<entry>Использовать <command>apxs</command> для компиляции
|
||
и установки модуля.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>AP_GENPLIST</makevar></entry>
|
||
|
||
<entry>Также автоматически создает
|
||
<filename>pkg-plist</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>AP_INC</makevar></entry>
|
||
|
||
<entry>Добавляет каталог к пути поиска заголовков
|
||
во время компиляции.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>AP_LIB</makevar></entry>
|
||
|
||
<entry>Добавляет каталог к пути поиска библиотек
|
||
во время компиляции.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>AP_EXTRAS</makevar></entry>
|
||
|
||
<entry>Дополнительные флаги, передаваемые
|
||
<command>apxs</command>.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2 id="web-apps">
|
||
<title>Веб-приложения</title>
|
||
|
||
<para>Веб-приложения следует устанавливать в
|
||
<filename><makevar>PREFIX</makevar>/www/<replaceable>appname</replaceable></filename>.
|
||
Для вашего удобства этот путь одинаково доступен в
|
||
<filename>Makefile</filename> и <filename>pkg-plist</filename>
|
||
как переменная <makevar>WWWDIR</makevar>, а путь относительно
|
||
<makevar>PREFIX</makevar> доступен в <filename>Makefile</filename>
|
||
как <makevar>WWWDIR_REL</makevar>.</para>
|
||
|
||
<para>Пользователь и группа процесса веб-сервера доступны как
|
||
<makevar>WWWOWN</makevar> и <makevar>WWWGRP</makevar>, в случае
|
||
если вам нужно изменить владельца для некоторых файлов. Значением
|
||
по умолчанию и для владельца, и для группы является
|
||
<literal>www</literal>. Если вы хотите использовать в вашем
|
||
порте другие значения, воспользуйтесь для этого нотацией
|
||
<literal>WWWOWN?= myuser</literal>, чтобы позволить
|
||
пользователю легко переопределить их.</para>
|
||
|
||
<para>Не добавляйте зависимость от Apache, если веб-приложение
|
||
явным образом не нуждается в Apache. Учитывайте, что пользователи
|
||
могут пожелать запустить ваше веб-приложение на другом веб-сервере
|
||
помимо Apache.</para>
|
||
|
||
</sect2>
|
||
|
||
<sect2 id="php-variables">
|
||
<title>PHP</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих PHP</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_PHP</makevar></entry>
|
||
|
||
<entry>Порт требует PHP. Значение <literal>yes</literal>
|
||
добавляет зависимость от PHP. Вместо этого может быть
|
||
указан перечень требуемых расширений PHP. Пример:
|
||
<literal>pcre xml gettext</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>DEFAULT_PHP_VER</makevar></entry>
|
||
|
||
<entry>Выбирает старший номер версии, с которым будет
|
||
установлен PHP как зависимость в случае, когда PHP еще
|
||
не установлен. По умолчанию <literal>5</literal>.
|
||
Возможные значения: <literal>4</literal>,
|
||
<literal>5</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>IGNORE_WITH_PHP</makevar></entry>
|
||
|
||
<entry>Порт не работает с PHP данной версии. Возможные
|
||
значения: <literal>4</literal>, <literal>5</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PHPIZE</makevar></entry>
|
||
|
||
<entry>Порт будет построен как расширение PHP.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PHPEXT</makevar></entry>
|
||
|
||
<entry>Порт будет считаться расширением PHP, включая установку
|
||
и регистрацию в реестре расширений.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PHP_BUILD</makevar></entry>
|
||
|
||
<entry>Установить PHP как зависимость времени построения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_PHP_CLI</makevar></entry>
|
||
|
||
<entry>Хочет CLI (командная строка) версию PHP.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_PHP_CGI</makevar></entry>
|
||
|
||
<entry>Хочет CGI версию PHP.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_PHP_MOD</makevar></entry>
|
||
|
||
<entry>Хочет PHP как модуль Apache.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_PHP_SCR</makevar></entry>
|
||
|
||
<entry>Хочет CLI или CGI версию PHP.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_PHP_WEB</makevar></entry>
|
||
|
||
<entry>Хочет модуль Apache или CGI версию PHP.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Модули PEAR</title>
|
||
|
||
<para>Портирование модулей PEAR является очень простым
|
||
процессом.</para>
|
||
|
||
<para>Используйте переменные <makevar>FILES</makevar>,
|
||
<makevar>TESTS</makevar>, <makevar>DATA</makevar>,
|
||
<makevar>SQLS</makevar>, <makevar>SCRIPTFILES</makevar>,
|
||
<makevar>DOCS</makevar> and <makevar>EXAMPLES</makevar> для
|
||
перечисления файлов, которые вы хотите установить. Все
|
||
перечисленные файлы будут автоматически установлены в подходящие
|
||
места и добавлены в <filename>pkg-plist</filename>.</para>
|
||
|
||
<para>Подключите
|
||
<filename>${PORTSDIR}/devel/pear/bsd.pear.mk</filename>
|
||
на последней строке <filename>Makefile</filename>.</para>
|
||
|
||
<example id="pear-makefile">
|
||
<title>Пример Makefile для классов PEAR</title>
|
||
<programlisting>PORTNAME= Date
|
||
PORTVERSION= 1.4.3
|
||
CATEGORIES= devel www pear
|
||
|
||
MAINTAINER= example@domain.com
|
||
COMMENT= PEAR Date and Time Zone Classes
|
||
|
||
BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR
|
||
RUN_DEPENDS:= ${BUILD_DEPENDS}
|
||
|
||
FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \
|
||
Date/TimeZone.php
|
||
TESTS= test_calc.php test_date_methods_span.php testunit.php \
|
||
testunit_date.php testunit_date_span.php wknotest.txt \
|
||
bug674.php bug727_1.php bug727_2.php bug727_3.php \
|
||
bug727_4.php bug967.php weeksinmonth_4_monday.txt \
|
||
weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \
|
||
weeksinmonth_rdm_sunday.txt
|
||
DOCS= TODO
|
||
_DOCSDIR= .
|
||
|
||
.include <bsd.port.pre.mk>
|
||
.include "${PORTSDIR}/devel/pear/bsd.pear.mk"
|
||
.include <bsd.port.post.mk></programlisting>
|
||
|
||
</example>
|
||
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-python">
|
||
<title>Использование Python</title>
|
||
|
||
<para>Коллекция Портов поддерживает параллельную установку множества
|
||
версий Python. Следует убедиться, что в портах используется
|
||
правильный интерпретатор <command>python</command> в соответствии
|
||
с переменной <makevar>PYTHON_VERSION</makevar>, установленной
|
||
пользователем. По большей части это означает замену пути к
|
||
исполняемому файлу <command>python</command> в сценариях на
|
||
значение переменной <makevar>PYTHON_CMD</makevar>.</para>
|
||
|
||
<para>Порты, устанавливающие файлы под каталог
|
||
<makevar>PYTHON_SITELIBDIR</makevar>, должны использовать префикс
|
||
вида <literal>pyXY-</literal>, таким образом названия пакетов будут
|
||
включать в себя версию Python, с которой они установлены.</para>
|
||
|
||
<programlisting>PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}</programlisting>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, которые используют Python</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_PYTHON</makevar></entry>
|
||
|
||
<entry>Для этого порта нужен Python. Минимальная требуемая
|
||
версия может быть указана с таким значением как
|
||
<literal>2.6+</literal>. Также можно указан диапазон
|
||
версий с разделением двух версий через ‐, например:
|
||
<literal>2.6-2.7</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PYDISTUTILS</makevar></entry>
|
||
|
||
<entry>Использовать дистрибутивные утилиты (distutils) Python
|
||
для конфигурации, компиляции и установки. Необходимо, если
|
||
порт использует <filename>setup.py</filename>.
|
||
Переопределяет цели <maketarget>do-build</maketarget> и
|
||
<maketarget>do-install</maketarget> и также может
|
||
переопределять <maketarget>do-configure</maketarget>, если
|
||
не определена <makevar>GNU_CONFIGURE</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYTHON_PKGNAMEPREFIX</makevar></entry>
|
||
|
||
<entry>Используется как <makevar>PKGNAMEPREFIX</makevar> для
|
||
отличия пакетов, использующих разные версии Python. Пример:
|
||
<literal>py24-</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYTHON_SITELIBDIR</makevar></entry>
|
||
|
||
<entry>Местонахождение дерева site-packages, которое содержит
|
||
путь установки Python (обычно, <makevar>LOCALBASE</makevar>).
|
||
Переменная <makevar>PYTHON_SITELIBDIR</makevar> может быть
|
||
очень полезной при установке модулей Python.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYTHONPREFIX_SITELIBDIR</makevar></entry>
|
||
|
||
<entry>Вариант PYTHON_SITELIBDIR без PREFIX.
|
||
По возможности всегда используйте
|
||
<literal>%%PYTHON_SITELIBDIR%%</literal> в
|
||
<filename>pkg-plist</filename>. Значением по умолчанию для
|
||
<literal>%%PYTHON_SITELIBDIR%%</literal> является
|
||
<literal>lib/python%%PYTHON_VERSION%%/site-packages</literal>
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYTHON_CMD</makevar></entry>
|
||
|
||
<entry>Командная строка интерпретатора Python, включая номер
|
||
версии.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYNUMERIC</makevar></entry>
|
||
|
||
<entry>Строка зависимости для расширения numeric.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYNUMPY</makevar></entry>
|
||
<entry>Строка зависимости для нового расширения numeric,
|
||
numpy (PYNUMERIC объявлен устаревшим вышестоящим
|
||
производителем).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PYXML</makevar></entry>
|
||
|
||
<entry>Строка зависимости для расширения XML (не нужно для
|
||
Python 2.0 и выше, т.к. включено в основной дистрибутив).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TWISTED</makevar></entry>
|
||
|
||
<entry>Добавить зависимость от twistedCore. Перечень требуемых
|
||
компонентов может быть указан как значение этой переменной.
|
||
Пример: <literal>web lore pair flow</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_ZOPE</makevar></entry>
|
||
|
||
<entry>Добавить зависимость от Zope, платформы веб приложений.
|
||
Изменяет зависимость от Python на Python 2.7. Переменная
|
||
<makevar>ZOPEBASEDIR</makevar> содержит директорию с
|
||
установленным Zope.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Полный перечень доступных переменных можно найти в
|
||
<filename>/usr/ports/Mk/bsd.python.mk</filename>.</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-tcl">
|
||
<title>Использование <application>Tcl/Tk</application></title>
|
||
|
||
<para>В Коллекции Портов поддерживается одновременная установка
|
||
множественных версий <application>Tcl/Tk</application>. Порты
|
||
должны пытаться поддерживать по крайней мере версию
|
||
<application>Tcl/Tk</application>, используемую по умолчанию, и
|
||
выше с помощью переменных <makevar>USE_TCL</makevar> и
|
||
<makevar>USE_TK</makevar>. Желаемую версию <command>tcl</command>
|
||
можно указать в переменной <makevar>WITH_TCL_VER</makevar>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Наиболее востребованные переменные для портов, которые
|
||
используют <application>Tcl/Tk</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_TCL</makevar></entry>
|
||
|
||
<entry>Порт зависит от библиотеки
|
||
<application>Tcl</application> (не оболочки).
|
||
Минимальную требуемую версию можно указать с использованием
|
||
таких значений, как 84+. Отдельные неподдерживаемые версии
|
||
указываются в переменной
|
||
<makevar>INVALID_TCL_VER</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TCL_BUILD</makevar></entry>
|
||
|
||
<entry><application>Tcl</application> нужен для порта только
|
||
на время сборки.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TCL_WRAPPER</makevar></entry>
|
||
|
||
<entry>Эту новую переменную следует использовать для портов,
|
||
для которых требуется оболочка <application>Tcl</application>
|
||
и не требуется конкретная версия <literal>tclsh</literal>.
|
||
Обертка <literal>tclsh</literal> устанавливается в систему.
|
||
Пользователь может указать желаемую оболочку
|
||
<command>tcl</command> для использования.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_TCL_VER</makevar></entry>
|
||
|
||
<entry>Определяемые пользователем переменные, которые
|
||
устанавливают желаемую версию
|
||
<application>Tcl</application>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar><replaceable>UNIQUENAME</replaceable>_WITH_TCL_VER</makevar></entry>
|
||
|
||
<entry>Подобно <makevar>WITH_TCL_VER</makevar>, но для
|
||
каждого порта.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TCL_THREADS</makevar></entry>
|
||
|
||
<entry>Требует многопоточную сборку
|
||
<application>Tcl/Tk</application>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TK</makevar></entry>
|
||
|
||
<entry>Порт зависит от библиотеки <application>Tk</application>
|
||
(не от предпочитаемой оболочки). Подразумевает
|
||
<makevar>USE_TCL</makevar> с тем же значением. Для
|
||
большей информации смотрите описание переменной
|
||
<makevar>USE_TCL</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TK_BUILD</makevar></entry>
|
||
|
||
<entry>Аналогично <makevar>USE_TCL_BUILD</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_TK_WRAPPER</makevar></entry>
|
||
|
||
<entry>Аналогично <makevar>USE_TCL_WRAPPER</makevar>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_TK_VER</makevar></entry>
|
||
|
||
<entry>Аналогично <makevar>WITH_TCL_VER</makevar>,
|
||
подразумевает <makevar>WITH_TCL_VER</makevar> той же
|
||
версии.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Полный перечень доступных переменных находится в
|
||
<filename>/usr/ports/Mk/bsd.tcl.mk</filename>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="using-emacs">
|
||
<title>Использование Emacs</title>
|
||
|
||
<para>Этот раздел ещё предстоит написать.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="using-ruby">
|
||
<title>Использование Ruby</title>
|
||
|
||
<table frame="none">
|
||
<title>Полезные переменные для портов, использующих Ruby</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_RUBY</makevar></entry>
|
||
|
||
<entry>Порт требует Ruby.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_RUBY_EXTCONF</makevar></entry>
|
||
|
||
<entry>Порт использует для конфигурации
|
||
<filename>extconf.rb</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_RUBY_SETUP</makevar></entry>
|
||
|
||
<entry>Порт использует для конфигурации
|
||
<filename>setup.rb</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_SETUP</makevar></entry>
|
||
|
||
<entry>Устанавливает альтернативное имя для
|
||
<filename>setup.rb</filename>. Распространенным значением
|
||
является <filename>install.rb</filename>.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Следующая таблица отражает некоторые переменные, доступные
|
||
авторам портов через инфраструктуру портов. Эти переменные должны
|
||
использоваться для установки файлов в правильное месторасположение.
|
||
Используйте их в <filename>pkg-plist</filename> как можно больше.
|
||
Эти переменные не должны переопределяться в самом порте.</para>
|
||
|
||
<table frame="none">
|
||
<title>Отобранные переменные только для чтения для портов,
|
||
использующих Ruby</title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
<entry>Описание</entry>
|
||
<entry>Примерное значение</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_PKGNAMEPREFIX</makevar></entry>
|
||
|
||
<entry>Используется как <makevar>PKGNAMEPREFIX</makevar>
|
||
для различия пакетов от разных версий Ruby.</entry>
|
||
|
||
<entry><literal>ruby18-</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_VERSION</makevar></entry>
|
||
|
||
<entry>Полная версия Ruby в форме <literal>x.y.z</literal>.</entry>
|
||
|
||
<entry><literal>1.8.2</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_SITELIBDIR</makevar></entry>
|
||
|
||
<entry>Путь для установки архитектуронезависимых библиотек.</entry>
|
||
|
||
<entry><literal>/usr/local/lib/ruby/site_ruby/1.8</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_SITEARCHLIBDIR</makevar></entry>
|
||
|
||
<entry>Путь для установки архитектурозависимых библиотек.</entry>
|
||
|
||
<entry><literal>/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_MODDOCDIR</makevar></entry>
|
||
|
||
<entry>Путь для установки документации модуля.</entry>
|
||
|
||
<entry><literal>/usr/local/share/doc/ruby18/patsy</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>RUBY_MODEXAMPLESDIR</makevar></entry>
|
||
|
||
<entry>Путь для установки примеров модуля.</entry>
|
||
|
||
<entry><literal>/usr/local/share/examples/ruby18/patsy</literal></entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Полный перечень доступных переменных находится в
|
||
<filename>/usr/ports/Mk/bsd.ruby.mk</filename>.</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="using-sdl">
|
||
<title>Использование SDL</title>
|
||
|
||
<para>Переменная <makevar>USE_SDL</makevar> используется для
|
||
автоматической настройки зависимостей для портов, использующих
|
||
библиотеки на основе SDL, такие как
|
||
<filename role="package">devel/sdl12</filename> или
|
||
<filename role="package">x11-toolkits/sdl_gui</filename>.</para>
|
||
|
||
<para>На данный момент распознаются следующие SDL-библиотеки:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>sdl: <filename role="package">devel/sdl12</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>gfx: <filename
|
||
role="package">graphics/sdl_gfx</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>gui: <filename
|
||
role="package">x11-toolkits/sdl_gui</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>image: <filename
|
||
role="package">graphics/sdl_image</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>ldbad: <filename
|
||
role="package">devel/sdl_ldbad</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>mixer: <filename
|
||
role="package">audio/sdl_mixer</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>mm: <filename role="package">devel/sdlmm</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>net: <filename role="package">net/sdl_net</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>sound: <filename
|
||
role="package">audio/sdl_sound</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>ttf: <filename
|
||
role="package">graphics/sdl_ttf</filename></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Таким образом, если порт имеет зависимость от
|
||
<filename role="package">net/sdl_net</filename> и
|
||
<filename role="package">audio/sdl_mixer</filename>, то строка будет
|
||
следующей:</para>
|
||
|
||
<programlisting>USE_SDL= net mixer</programlisting>
|
||
|
||
<para>Зависимость от порта <filename
|
||
role="package">devel/sdl12</filename>, который требуется для <filename
|
||
role="package">net/sdl_net</filename> и <filename
|
||
role="package">audio/sdl_mixer</filename> будет также автоматически
|
||
добавлен.</para>
|
||
|
||
<para>Если вы используете <makevar>USE_SDL</makevar>, то
|
||
он автоматически:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Добавляет зависимость от
|
||
<application>sdl12-config</application>
|
||
к <makevar>BUILD_DEPENDS</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Добавляет переменную <makevar>SDL_CONFIG</makevar> к
|
||
<makevar>CONFIGURE_ENV</makevar></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Добавляет зависимости от указанных библиотек к
|
||
<makevar>LIB_DEPENDS</makevar></para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Для проверки наличия библиотеки SDL вы можете делать это при
|
||
помощи переменной <makevar>WANT_SDL</makevar>:</para>
|
||
|
||
<programlisting>WANT_SDL=yes
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if ${HAVE_SDL:Mmixer}!=""
|
||
USE_SDL+= mixer
|
||
.endif
|
||
|
||
.include <bsd.port.post.mk></programlisting>
|
||
</sect1>
|
||
|
||
<sect1 id="using-wx">
|
||
<title>Использование <application>wxWidgets</application></title>
|
||
|
||
<para>Эта глава описывает статус библиотек
|
||
<application>wxWidgets</application> в дереве портов и их интеграцию
|
||
с системой портов.</para>
|
||
|
||
<sect2 id="wx-introduction">
|
||
<title>Введение</title>
|
||
|
||
<para>Существует множество версий библиотек
|
||
<application>wxWidgets</application>, конфликтующих между собой
|
||
(устанавливают файлы под тем же именем). В дереве портов эта
|
||
проблема решена путем установки каждой версии под собственным
|
||
названием с использованием номера версии в качестве
|
||
суффикса.</para>
|
||
|
||
<para>Очевидным недостатком этого является необходимость изменения
|
||
каждого приложения для нахождения искомой версии. К счастью,
|
||
большинство приложений для определения нужного компилятора и флагов
|
||
компоновки вызывают сценарий <command>wx-config</command>. Для
|
||
каждой доступной версии этот сценарий имеет своё имя. Большинство
|
||
приложений учитывают переменную окружения или принимают
|
||
аргумент configure для указания, какой сценарий
|
||
<command>wx-config</command> следует вызывать. На все остальные
|
||
приходится накладывать патч.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-version">
|
||
<title>Выбор версии</title>
|
||
|
||
<para>Для того, чтобы заставить ваш порт использовать конкретную
|
||
версию <application>wxWidgets</application>, существует две
|
||
доступные для определения переменные (если определена только одна,
|
||
то вторая примет значение по умолчанию):</para>
|
||
|
||
<table id="wx-ver-sel-table" frame="none">
|
||
<title>Переменные для выбора версии
|
||
<application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Значение по умолчанию</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_WX</makevar></entry>
|
||
|
||
<entry>Перечень версий, которые порт может использовать</entry>
|
||
|
||
<entry>Все доступные версии</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_WX_NOT</makevar></entry>
|
||
|
||
<entry>Перечень версий, которые порт не может использовать</entry>
|
||
|
||
<entry>Нет</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Перечень доступных версий <application>wxWidgets</application>
|
||
и соответствующих им портов в дереве:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные версии <application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Версия</entry>
|
||
|
||
<entry>Порт</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>2.4</literal></entry>
|
||
|
||
<entry><filename
|
||
role="package">x11-toolkits/wxgtk24</filename></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>2.6</literal></entry>
|
||
|
||
<entry><filename
|
||
role="package">x11-toolkits/wxgtk26</filename></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>2.8</literal></entry>
|
||
|
||
<entry><filename
|
||
role="package">x11-toolkits/wxgtk28</filename></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<note>
|
||
<para>Версии начиная с <literal>2.5</literal> также поставляются
|
||
с Unicode и устанавливается подчиненным портом с названием как
|
||
как у обычного, но с суффиксом <literal>-unicode</literal>, но
|
||
этим можно управлять при помощи переменных (смотрите <xref
|
||
linkend="wx-unicode"/>).</para>
|
||
</note>
|
||
|
||
<para>Переменные в <xref linkend="wx-ver-sel-table"/> можно установить
|
||
в одну или более следующих комбинаций, разделенных пробелами:</para>
|
||
|
||
<table frame="none">
|
||
<title>Определение версии для
|
||
<application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Пример</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>Единичная версия</entry>
|
||
|
||
<entry><literal>2.4</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Восходящий диапазон</entry>
|
||
|
||
<entry><literal>2.4+</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Нисходящий диапазон</entry>
|
||
|
||
<entry><literal>2.6-</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Полный диапазон (обязан быть восходящим)</entry>
|
||
|
||
<entry><literal>2.4-2.6</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Кроме того, существует несколько переменных для выбора
|
||
предпочитаемых версий из перечня доступных. Они могут быть
|
||
установлены в несколько версий, первая из которых будет иметь
|
||
наибольший приоритет.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для выбора предпочитаемых версий
|
||
<application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Предназначение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>WANT_WX_VER</makevar></entry>
|
||
|
||
<entry>порт</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_WX_VER</makevar></entry>
|
||
|
||
<entry>пользователь</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-components">
|
||
<title>Выбор компонентов</title>
|
||
|
||
<para>Существуют другие приложения, которые, хотя и не являются
|
||
библиотеками <application>wxWidgets</application>, но в тоже время
|
||
относятся к ним. Эти приложения можно указать в переменной
|
||
<makevar>WX_COMPS</makevar>. Доступны следующие компоненты:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные компоненты <application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
|
||
<entry>Ограничение версии</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>wx</literal></entry>
|
||
|
||
<entry>основная библиотека</entry>
|
||
|
||
<entry>нет</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>contrib</literal></entry>
|
||
|
||
<entry>сторонние библиотеки</entry>
|
||
|
||
<entry><literal>нет</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>python</literal></entry>
|
||
|
||
<entry><application>wxPython</application>
|
||
(привязки к <application>Python</application>)</entry>
|
||
|
||
<entry><literal>2.4-2.6</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>mozilla</literal></entry>
|
||
|
||
<entry><application>wxMozilla</application></entry>
|
||
|
||
<entry><literal>2.4</literal></entry>
|
||
</row>
|
||
<row>
|
||
<entry><literal>svg</literal></entry>
|
||
|
||
<entry><application>wxSVG</application></entry>
|
||
|
||
<entry><literal>2.6</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Тип добавляемой зависимости при выборе каждого компонента
|
||
может быть указан вручную путем добавления суффикса, отделенного
|
||
точкой с запятой. Если таковой отсутствует, но будет использовано
|
||
значение по умолчанию (смотрите <xref linkend="wx-def-dep-types"/>).
|
||
Доступные типы зависимости:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные типы зависимости
|
||
<application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>build</literal></entry>
|
||
|
||
<entry>Компонент требуется для построения, эквивалентен
|
||
<makevar>BUILD_DEPENDS</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>run</literal></entry>
|
||
|
||
<entry>Компонент требуется для запуска, эквивалентен
|
||
<makevar>RUN_DEPENDS</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>lib</literal></entry>
|
||
|
||
<entry>Компонент требуется для построения и запуска,
|
||
эквивалентен <makevar>LIB_DEPENDS</makevar></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Значения по умолчанию для компонентов подробно рассматриваются
|
||
в следующей таблице:</para>
|
||
|
||
<table id="wx-def-dep-types" frame="none">
|
||
<title>Типы зависимости <application>wxWidgets</application>,
|
||
используемые по умолчанию</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Компонент</entry>
|
||
|
||
<entry>Тип зависимости</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>wx</literal></entry>
|
||
|
||
<entry><literal>lib</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>contrib</literal></entry>
|
||
|
||
<entry><literal>lib</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>python</literal></entry>
|
||
|
||
<entry><literal>run</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>mozilla</literal></entry>
|
||
|
||
<entry><literal>lib</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>svg</literal></entry>
|
||
|
||
<entry><literal>lib</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="wx-components-example">
|
||
<title>Выбор компонентов
|
||
<application>wxWidgets</application></title>
|
||
|
||
<para>Следующий фрагмент относится к порту, в котором используется
|
||
<application>wxWidgets</application> версии 2.4 с его сторонними
|
||
библиотеками.</para>
|
||
|
||
<programlisting>USE_WX= 2.4
|
||
WX_COMPS= wx contrib</programlisting>
|
||
</example>
|
||
</sect2>
|
||
<sect2 id="wx-unicode">
|
||
<title>Unicode</title>
|
||
|
||
<para>Библиотека <application>wxWidgets</application> поддерживает
|
||
Unicode начиная с версии <literal>2.5</literal>. В дереве портов
|
||
доступны обе версии и могут быть выбраны с использованием
|
||
следующих переменных:</para>
|
||
|
||
<table id="wx-unicode-var-table" frame="none">
|
||
<title>Переменные для выбора версии
|
||
<application>wxWidgets</application> с Unicode</title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Предназначение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>WX_UNICODE</makevar></entry>
|
||
|
||
<entry>Порт работает <emphasis>только</emphasis> с версией
|
||
Unicode</entry>
|
||
|
||
<entry>порт</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WANT_UNICODE</makevar></entry>
|
||
|
||
<entry>Порт работает с обеими версиями, но предпочитает
|
||
версию с Unicode</entry>
|
||
|
||
<entry>порт</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>WITH_UNICODE</makevar></entry>
|
||
|
||
<entry>Порт будет использовать версию Unicode</entry>
|
||
|
||
<entry>пользователь</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>WITHOUT_UNICODE</makevar></entry>
|
||
|
||
<entry>Порт будет использовать обычную версию, если это
|
||
поддерживается (когда <makevar>WX_UNICODE</makevar>
|
||
не определена)</entry>
|
||
|
||
<entry>пользователь</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<warning>
|
||
<para>Не используйте <makevar>WX_UNICODE</makevar> для портов,
|
||
которые могут использовать обе версии. Если вы хотите, чтобы
|
||
порт по умолчанию использовал Unicode, определите вместо этого
|
||
<makevar>WANT_UNICODE</makevar>.</para>
|
||
</warning>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-version-detection">
|
||
<title>Обнаружение установленных версий</title>
|
||
|
||
<para>Для обнаружения установленной версии вам необходимо задать
|
||
переменную <makevar>WANT_WX</makevar>. Если вы не присвоите ей
|
||
определенную версию, то компоненты получат суффикс версии.
|
||
Переменная <makevar>HAVE_WX</makevar> будет заполнена после
|
||
обнаружения.</para>
|
||
|
||
<example id="wx-ver-det-example">
|
||
<title>Обнаружение установленных версий и компонентов
|
||
<application>wxWidgets</application></title>
|
||
|
||
<para>Следующий фрагмент может быть использован в порту, который
|
||
использует <application>wxWidgets</application>, в случае если
|
||
он установлен или выбран соответствующий параметр.</para>
|
||
|
||
<programlisting>WANT_WX= yes
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.4)
|
||
USE_WX= 2.4
|
||
CONFIGURE_ARGS+=--enable-wx
|
||
.endif</programlisting>
|
||
|
||
<para>Следующий фрагмент может быть использован в порту, который
|
||
задействует поддержку <application>wxPython</application>,
|
||
в случае если он установлен или выбран соответствующий параметр,
|
||
в дополнение к <application>wxWidgets</application>, обе версии
|
||
<literal>2.6</literal>.</para>
|
||
|
||
<programlisting>USE_WX= 2.6
|
||
WX_COMPS= wx
|
||
WANT_WX= 2.6
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython)
|
||
WX_COMPS+= python
|
||
CONFIGURE_ARGS+=--enable-wxpython
|
||
.endif</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-defined-variables">
|
||
<title>Переменные для определения</title>
|
||
|
||
<para>Следующие переменные доступны в порту (после определения одной
|
||
из переменных из <xref linkend="wx-ver-sel-table"/>).</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные, определенные для портов, использующих
|
||
<application>wxWidgets</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>WX_CONFIG</makevar></entry>
|
||
|
||
<entry>Путь к сценарию <application>wxWidgets</application>
|
||
<command>wx-config</command> (с другим именем)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WXRC_CMD</makevar></entry>
|
||
|
||
<entry>Путь к программе <application>wxWidgets</application>
|
||
<command>wxrc</command> (с другим именем)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WX_VERSION</makevar></entry>
|
||
|
||
<entry>Версия <application>wxWidgets</application>, которая
|
||
будет использоваться (например,
|
||
<literal>2.6</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WX_UNICODE</makevar></entry>
|
||
|
||
<entry>Если не определена, но Unicode будет использоваться,
|
||
то она будет определена</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-premk">
|
||
<title>Обработка в <filename>bsd.port.pre.mk</filename></title>
|
||
|
||
<para>Если вам нужно использовать переменные для запуска команд
|
||
сразу после подключения <filename>bsd.port.pre.mk</filename>, то
|
||
вам нужно определить <makevar>WX_PREMK</makevar>.</para>
|
||
|
||
<important>
|
||
<para>Если вы определите <makevar>WX_PREMK</makevar>, то версия,
|
||
зависимости, компоненты и заданные переменные не изменяться, в
|
||
случае вы изменили переменные порта
|
||
<application>wxWidgets</application> <emphasis>после</emphasis>
|
||
подключения <filename>bsd.port.pre.mk</filename>.</para>
|
||
</important>
|
||
|
||
<example id="wx-premk-example">
|
||
<title>Использование переменных <application>wxWidgets</application>
|
||
в командах</title>
|
||
|
||
<para>Следующий фрагмент иллюстрирует использование переменной
|
||
<makevar>WX_PREMK</makevar> посредством запуска сценария
|
||
<command>wx-config</command> для получения строки с полной версией
|
||
с присвоением ее переменной и передачей в программу.</para>
|
||
|
||
<programlisting>USE_WX= 2.4
|
||
WX_PREMK= yes
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if exists(${WX_CONFIG})
|
||
VER_STR!= ${WX_CONFIG} --release
|
||
|
||
PLIST_SUB+= VERSION="${VER_STR}"
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<note>
|
||
<para>Переменные <application>wxWidgets</application> можно
|
||
безопасно использовать в командах внутри целей без необходимости
|
||
в использовании <makevar>WX_PREMK</makevar>.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2 id="wx-additional-config-args">
|
||
<title>Дополнительные параметры <command>configure</command></title>
|
||
|
||
<para>Некоторые сценарии GNU <command>configure</command> не могут
|
||
найти <application>wxWidgets</application> только с установленной
|
||
переменной окружения <literal>WX_CONFIG</literal>, требуя
|
||
дополнительные параметры. Для их передачи можно использовать
|
||
переменную <makevar>WX_CONF_ARGS</makevar>.</para>
|
||
|
||
<table frame="none">
|
||
<title>Допустимые значения <makevar>WX_CONF_ARGS</makevar></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Возможное значение</entry>
|
||
|
||
<entry>Получаемый параметр</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>absolute</literal></entry>
|
||
|
||
<entry><literal>--with-wx-config=${WX_CONFIG}</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>relative</literal></entry>
|
||
|
||
<entry><literal>--with-wx=${LOCALBASE}
|
||
--with-wx-config=${WX_CONFIG:T}</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-lua">
|
||
<title>Использование <application>Lua</application></title>
|
||
|
||
<para>Эта глава описывает статус библиотек <application>Lua</application>
|
||
в дереве портов и их интеграцию в систему портов.</para>
|
||
|
||
<sect2 id="lua-introduction">
|
||
<title>Введение</title>
|
||
|
||
<para>Существует множество версий библиотек
|
||
<application>Lua</application> и соответствующих интерпретаторов,
|
||
конфликтующих между собой (устанавливают файлы под тем же именем).
|
||
В дереве портов эта проблема решена путем установки каждой версии
|
||
в собственное место с использованием номера версии в качестве
|
||
суффикса.</para>
|
||
|
||
<para>Очевидным недостатком этого является необходимость изменения
|
||
каждого приложения для нахождения искомой версии. Но это решается
|
||
добавлением некоторых дополнительных флагов для компилятора и
|
||
компоновщика.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="lua-version">
|
||
<title>Выбор версии</title>
|
||
|
||
<para>Для того, чтобы заставить ваш порт использовать конкретную
|
||
версию <application>Lua</application>, существует две доступные
|
||
для определения переменные (если определена только одна, то
|
||
вторая примет значение по умолчанию):</para>
|
||
|
||
<table id="lua-ver-sel-table" frame="none">
|
||
<title>Переменные для выбора версии
|
||
<application>Lua</application></title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Значение по умолчанию</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_LUA</makevar></entry>
|
||
|
||
<entry>Перечень версий, которые порт может использовать</entry>
|
||
|
||
<entry>Все доступные версии</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_LUA_NOT</makevar></entry>
|
||
|
||
<entry>Перечень версий, которые порт не может
|
||
использовать</entry>
|
||
|
||
<entry>Пусто</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Перечень доступных версий <application>Lua</application> и
|
||
соответствующих портов в дереве:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные версии <application>Lua</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Версия</entry>
|
||
|
||
<entry>Порт</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>4.0</literal></entry>
|
||
|
||
<entry><filename role="package">lang/lua4</filename></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>5.0</literal></entry>
|
||
|
||
<entry><filename role="package">lang/lua50</filename></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>5.1</literal></entry>
|
||
|
||
<entry><filename role="package">lang/lua</filename></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Переменные из <xref linkend="lua-ver-sel-table"/> могут иметь
|
||
комбинации из одного или нескольких значений, разделенных
|
||
пробелом:</para>
|
||
|
||
<table frame="none">
|
||
<title>Определение версии <application>Lua</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Описание</entry>
|
||
|
||
<entry>Пример</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>Единичная версия</entry>
|
||
|
||
<entry><literal>4.0</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Восходящий диапазон</entry>
|
||
|
||
<entry><literal>5.0+</literal></entry>
|
||
</row>
|
||
|
||
|
||
<row>
|
||
<entry>Нисходящий диапазон</entry>
|
||
|
||
<entry><literal>5.0-</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Полный диапазон (обязан быть восходящим)</entry>
|
||
|
||
<entry><literal>5.0-5.1</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Кроме того, существует несколько переменных для выбора
|
||
предпочитаемых версий из перечня доступных. Они могут быть
|
||
установлены в несколько версий, первая из которых будет иметь
|
||
наибольший приоритет.</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для выбора предпочитаемых версий
|
||
<application>Lua</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Предназначение</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>WANT_LUA_VER</makevar></entry>
|
||
|
||
<entry>порт</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>WITH_LUA_VER</makevar></entry>
|
||
|
||
<entry>пользователь</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="lua-version-example">
|
||
<title>Выбор версии <application>Lua</application></title>
|
||
|
||
<para>Следующий фрагмент взят из порта, который использует
|
||
<application>Lua</application> версий <literal>5.0</literal>
|
||
или <literal>5.1</literal>, по умолчанию <literal>5.0</literal>.
|
||
Значение может быть переопределено пользователем с использованием
|
||
переменной <makevar>WITH_LUA_VER</makevar>.</para>
|
||
|
||
<programlisting>USE_LUA= 5.0-5.1
|
||
WANT_LUA_VER= 5.0</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="lua-components">
|
||
<title>Выбор компонентов</title>
|
||
|
||
<para>Существуют другие приложения, которые хотя и не являются
|
||
библиотеками <application>Lua</application>, но относятся к ним.
|
||
Эти приложения можно указать в переменной
|
||
<makevar>LUA_COMPS</makevar>. Доступны следующие компоненты:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные компоненты <application>Lua</application></title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
|
||
|
||
<entry>Ограничение версии</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>lua</literal></entry>
|
||
|
||
<entry>Основная библиотека</entry>
|
||
|
||
<entry>нет</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>tolua</literal></entry>
|
||
|
||
<entry>Библиотека доступа к коду C/C++</entry>
|
||
|
||
<entry>4.0-5.0</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>ruby</literal></entry>
|
||
|
||
<entry>Привязка к Ruby</entry>
|
||
|
||
<entry>4.0-5.0</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<note>
|
||
<para>Есть и другие компоненты, но они относятся к модулям для
|
||
интерпретатора и не используются приложениями (только другими
|
||
модулями).</para>
|
||
</note>
|
||
|
||
<para>Тип зависимости можно выбрать для каждого компонента через
|
||
добавление суффикса, отделенного точкой с запятой. В случае
|
||
отсутствия будет использован тип по умолчанию (смотрите
|
||
<xref linkend="lua-def-dep-types"/>). Доступные следующие
|
||
типы:</para>
|
||
|
||
<table frame="none">
|
||
<title>Доступные типы зависимости
|
||
<application>Lua</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>build</literal></entry>
|
||
|
||
<entry>Компонент требуется для построения, эквивалентен
|
||
<makevar>BUILD_DEPENDS</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>run</literal></entry>
|
||
|
||
<entry>Компонент требуется для запуска, эквивалентен
|
||
<makevar>RUN_DEPENDS</makevar></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>lib</literal></entry>
|
||
|
||
<entry>Компонент требуется для построения и запуска,
|
||
эквивалентен <makevar>LIB_DEPENDS</makevar></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Значения по умолчанию для компонентов подробно рассматриваются
|
||
в следующей таблице:</para>
|
||
|
||
<table id="lua-def-dep-types" frame="none">
|
||
<title>Типы зависимости <application>Lua</application>,
|
||
используемые по умолчанию</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Компонент</entry>
|
||
|
||
<entry>Тип зависимости</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><literal>lua</literal></entry>
|
||
|
||
<entry><literal>lib</literal> для <literal>4.0-5.0</literal>
|
||
(динамическая) и <literal>build</literal> для
|
||
<literal>5.1</literal> (статическая)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>tolua</literal></entry>
|
||
|
||
<entry><literal>build</literal> (статическая)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><literal>ruby</literal></entry>
|
||
|
||
<entry><literal>lib</literal> (динамическая)</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="lua-components-example">
|
||
<title>Выбор компонентов <application>Lua</application></title>
|
||
|
||
<para>Следующий фрагмент соответствует порту, использующему
|
||
<application>Lua</application> версии <literal>4.0</literal>
|
||
и привязку к <application>Ruby</application>.</para>
|
||
|
||
<programlisting>USE_LUA= 4.0
|
||
LUA_COMPS= lua ruby</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="lua-version-detection">
|
||
<title>Обнаружение установленных версий</title>
|
||
|
||
<para>Для обнаружения установленной версии вам необходимо задать
|
||
переменную <makevar>WANT_LUA</makevar>. Если вы не присвоите ей
|
||
определенную версию, то компоненты получат суффикс версии.
|
||
Переменная <makevar>HAVE_LUA</makevar> будет заполнена после
|
||
обнаружения.</para>
|
||
|
||
<example id="lua-ver-det-example">
|
||
<title>Обнаружение установленных версий и компонентов
|
||
<application>Lua</application></title>
|
||
|
||
<para>Следующий фрагмент можно использовать для порта, использующего
|
||
<application>Lua</application>, если она установлена, или был
|
||
выбран соответствующий параметр.</para>
|
||
|
||
<programlisting>WANT_LUA= yes
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if defined(WITH_LUA5) || !empty(PORT_OPTIONS:MLUA5) || !empty(HAVE_LUA:Mlua-5.[01])
|
||
USE_LUA= 5.0-5.1
|
||
CONFIGURE_ARGS+=--enable-lua5
|
||
.endif</programlisting>
|
||
|
||
<para>Следующий фрагмент можно использовать для порта, который
|
||
включает поддержку <application>tolua</application>, если
|
||
такой компонент установлен, или был выбран соответствующий
|
||
параметр в дополнение к <application>Lua</application>, оба
|
||
имеют версию <literal>4.0</literal>.</para>
|
||
|
||
<programlisting>USE_LUA= 4.0
|
||
LUA_COMPS= lua
|
||
WANT_LUA= 4.0
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if defined(WITH_TOLUA) || !empty(PORT_OPTIONS:MTOLUA) || !empty(HAVE_LUA:Mtolua)
|
||
LUA_COMPS+= tolua
|
||
CONFIGURE_ARGS+=--enable-tolua
|
||
.endif</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="lua-defined-variables">
|
||
<title>Переменные для определения</title>
|
||
|
||
<para>Следующие переменные доступны в порту (после определения одной
|
||
из переменных из <xref linkend="lua-ver-sel-table"/>).</para>
|
||
|
||
<table frame="none">
|
||
<title>Переменные, определенные для портов, использующих
|
||
<application>Lua</application></title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Название</entry>
|
||
|
||
<entry>Описание</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>LUA_VER</makevar></entry>
|
||
|
||
<entry>Версия <application>Lua</application>, которая будет
|
||
использоваться (например, <literal>5.1</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_VER_SH</makevar></entry>
|
||
|
||
<entry>Старший номер версии динамической библиотеки
|
||
<application>Lua</application> (например,
|
||
<literal>1</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_VER_STR</makevar></entry>
|
||
|
||
<entry>Версия <application>Lua</application> без точки
|
||
(например, <literal>51</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_PREFIX</makevar></entry>
|
||
|
||
<entry>Префикс, в который установлена
|
||
<application>Lua</application> (и компоненты)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_SUBDIR</makevar></entry>
|
||
|
||
<entry>Каталог под <filename>${PREFIX}/bin</filename>,
|
||
<filename>${PREFIX}/share</filename> и
|
||
<filename>${PREFIX}/lib</filename>, в который установлена
|
||
<application>Lua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_INCDIR</makevar></entry>
|
||
|
||
<entry>Каталог, в который установлены заголовочные файлы
|
||
<application>Lua</application> и
|
||
<application>tolua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_LIBDIR</makevar></entry>
|
||
|
||
<entry>Каталог, в который установлены библиотеки
|
||
<application>Lua</application> и
|
||
<application>tolua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_MODLIBDIR</makevar></entry>
|
||
|
||
<entry>Каталог, в который установлены модули библиотеки
|
||
<application>Lua</application>
|
||
(<filename>.so</filename>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_MODSHAREDIR</makevar></entry>
|
||
|
||
<entry>Каталог, в который установлены модули
|
||
<application>Lua</application>
|
||
(<filename>.lua</filename>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_PKGNAMEPREFIX</makevar></entry>
|
||
|
||
<entry>Префикс с именем пакета, используемый модулями
|
||
<application>Lua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUA_CMD</makevar></entry>
|
||
|
||
<entry>Путь к интерпретатору
|
||
<application>Lua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LUAC_CMD</makevar></entry>
|
||
|
||
<entry>Путь к компилятору
|
||
<application>Lua</application></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>TOLUA_CMD</makevar></entry>
|
||
|
||
<entry>Путь к программе
|
||
<application>tolua</application></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<example id="lua-variables-example">
|
||
<title>Указание для порта, где искать
|
||
<application>Lua</application></title>
|
||
|
||
<para>Следующий фрагмент показывает, как сообщить порту, который
|
||
использует сценарий configure, где расположены заголовочные
|
||
файлы и библиотеки <application>Lua</application>.</para>
|
||
|
||
<programlisting>
|
||
USE_LUA= 4.0
|
||
GNU_CONFIGURE= yes
|
||
CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"</programlisting>
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 id="lua-premk">
|
||
<title>Обработка в <filename>bsd.port.pre.mk</filename></title>
|
||
|
||
<para>Если вам нужно использовать переменные для запуска команд сразу
|
||
после подключения <filename>bsd.port.pre.mk</filename>, для этого
|
||
вам нужно определить переменную <makevar>LUA_PREMK</makevar>.</para>
|
||
|
||
<important>
|
||
<para>Если вы задаете <makevar>LUA_PREMK</makevar>, то версия,
|
||
зависимости, компоненты и уже заданные переменные не будут
|
||
изменены, в случае если вы изменили переменные порта
|
||
<application>Lua</application> <emphasis>после</emphasis>
|
||
подключения <filename>bsd.port.pre.mk</filename>.</para>
|
||
</important>
|
||
|
||
<example id="lua-premk-example">
|
||
<title>Использование переменных <application>Lua</application>
|
||
в командах</title>
|
||
|
||
<para>Следующий фрагмент иллюстрирует использование
|
||
<makevar>LUA_PREMK</makevar> посредством запуска
|
||
интерпретатора <application>Lua</application> для того, чтобы
|
||
получить строку с полной версией, сохранить ее в переменную
|
||
и передать программе.</para>
|
||
|
||
<programlisting>USE_LUA= 5.0
|
||
LUA_PREMK= yes
|
||
|
||
.include <bsd.port.pre.mk>
|
||
|
||
.if exists(${LUA_CMD})
|
||
VER_STR!= ${LUA_CMD} -v
|
||
|
||
CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
<note>
|
||
<para>Переменные <application>Lua</application> можно безопасно
|
||
использовать в командах внутри целей без необходимости в
|
||
использовании <makevar>LUA_PREMK</makevar>.</para>
|
||
</note>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="using-xfce">
|
||
<title>Использование Xfce</title>
|
||
|
||
<para>Переменная <makevar>USE_XFCE</makevar> используется для
|
||
автоматической конфигурации зависимостей для портов, использующих
|
||
библиотеки или приложения на основе Xfce, такие как
|
||
<filename role="package">x11-toolkits/libxfce4gui</filename> и
|
||
<filename role="package">x11-wm/xfce4-panel</filename>.</para>
|
||
|
||
<para>В настоящее время распознаются следующие библиотеки и приложения
|
||
Xfce:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>libexo: <filename role="package">x11/libexo</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>libgui: <filename role="package">x11-toolkits/libxfce4gui</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>libutil: <filename role="package">x11/libxfce4util</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>libmcs: <filename role="package">x11/libxfce4mcs</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>mcsmanager: <filename role="package">sysutils/xfce4-mcs-manager</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>panel: <filename role="package">x11-wm/xfce4-panel</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>thunar: <filename role="package">x11-fm/thunar</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>wm: <filename role="package">x11-wm/xfce4-wm</filename></para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>xfdev: <filename role="package">dev/xfce4-dev-tools</filename></para>
|
||
</listitem>
|
||
|
||
</itemizedlist>
|
||
|
||
<para>Распознаются следующие дополнительные параметры:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>configenv: Используйте, если ваш порт требует специально
|
||
измененного значения <makevar>CONFIGURE_ENV</makevar> для поиска
|
||
требуемых для порта библиотек.</para>
|
||
|
||
<programlisting>-I${LOCALBASE}/include -L${LOCALBASE}/lib</programlisting>
|
||
|
||
<para>добавляется в CPPFLAGS к <makevar>CONFIGURE_ENV</makevar>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Следовательно, если у порта имеется зависимость от
|
||
<filename role="package">sysutils/xfce4-mcs-manager</filename>, и
|
||
порт требует специальных CPPFLAGS в своем окружении configure,
|
||
то синтаксис будет следующим:</para>
|
||
|
||
<programlisting>USE_XFCE= mcsmanager configenv</programlisting>
|
||
</sect1>
|
||
|
||
<sect1 id="using-mozilla">
|
||
<title>Использование Mozilla</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих Mozilla</title>
|
||
|
||
<tgroup cols="2">
|
||
<tbody>
|
||
|
||
<row>
|
||
<entry><makevar>USE_GECKO</makevar></entry>
|
||
|
||
<entry>Один из бэкэндов Gecko, с которым может работать
|
||
порт. Возможные значения:
|
||
<literal>libxul</literal> (<filename>libxul.so</filename>),
|
||
<literal>seamonkey</literal> (<filename>libgtkembedmoz.so</filename>,
|
||
устаревший, больше не должен использоваться).</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_FIREFOX</makevar></entry>
|
||
|
||
<entry>Для запуска порта требуется Firefox.
|
||
Возможные значения:
|
||
<literal>yes</literal> (берется версия по умолчанию),
|
||
<literal>40</literal>, <literal>36</literal>,
|
||
<literal>35</literal>.
|
||
По умолчанию устанавливает зависимость от версии
|
||
<literal>40</literal>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_FIREFOX_BUILD</makevar></entry>
|
||
|
||
<entry>Для построения порта требуется Firefox.
|
||
Возможные значения: смотрите USE_FIREFOX.
|
||
Автоматически устанавливает USE_FIREFOX с присвоением
|
||
того же значения.</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_SEAMONKEY</makevar></entry>
|
||
|
||
<entry>Для запуска порта требуется SeaMonkey.
|
||
Возможные значения:
|
||
<literal>yes</literal> (берется версия по умолчанию),
|
||
<literal>20</literal>, <literal>11</literal>
|
||
(устарело, больше не должно использоваться).
|
||
По умолчанию устанавливает зависимость от версии
|
||
<literal>20</literal>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_SEAMONKEY_BUILD</makevar></entry>
|
||
|
||
<entry>Для построения порта требуется SeaMonkey.
|
||
Возможные значения: смотрите USE_SEAMONKEY.
|
||
Автоматически устанавливает USE_SEAMONKEY с присвоением
|
||
того же значения.</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_THUNDERBIRD</makevar></entry>
|
||
|
||
<entry>Для запуска порта требуется Thunderbird.
|
||
Возможные значения:
|
||
<literal>yes</literal> (берется версия по умолчанию),
|
||
<literal>31</literal>, <literal>30</literal>
|
||
(устарело, больше не должно использоваться).
|
||
По умолчанию устанавливает зависимость от версии
|
||
<literal>31</literal>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry><makevar>USE_THUNDERBIRD_BUILD</makevar></entry>
|
||
|
||
<entry>Для построения порта требуется Thunderbird.
|
||
Возможные значения: смотрите USE_THUNDERBIRD.
|
||
Автоматически устанавливает USE_THUNDERBIRD с присвоением
|
||
того же значения.</entry>
|
||
</row>
|
||
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
<para>Полный перечень доступных переменных можно получить в файле
|
||
<filename>/usr/ports/Mk/bsd.gecko.mk</filename>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="using-databases">
|
||
<title>Использование баз данных</title>
|
||
|
||
<table frame="none">
|
||
<title>Переменные для портов, использующих базы данных</title>
|
||
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значения</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>USE_BDB</makevar></entry>
|
||
|
||
<entry>Если переменная установлена в <literal>yes</literal>,
|
||
добавляет зависимость от порта
|
||
<filename role="package">databases/db41</filename>.
|
||
Также переменной можно присвоить значения: 2, 3, 40, 41,
|
||
42, 43, 44, 46, 47, 48 или 51. Вы можете объявить диапазон
|
||
принимаемых значений, <makevar>USE_BDB</makevar>=42+
|
||
будет искать установленную версию с наибольшим номером,
|
||
и, если ничего не установлено, вернется к 42.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_MYSQL</makevar></entry>
|
||
|
||
<entry>Если переменная установлена в <literal>yes</literal>,
|
||
добавляет зависимость от порта
|
||
<filename role="package">databases/mysql55-client</filename>.
|
||
Как связанная переменная,
|
||
<makevar>WANT_MYSQL_VER</makevar> может быть установлена
|
||
в значение 323, 40, 41, 50, 51, 52, 55 или 60.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_PGSQL</makevar></entry>
|
||
|
||
<entry>Если установлена в <literal>yes</literal>, добавляет
|
||
зависимость от порта <filename
|
||
role="package">databases/postgresql90-client</filename>.
|
||
Как связанная переменная,
|
||
<makevar>WANT_PGSQL_VER</makevar> может быть установлена
|
||
в значение 83, 84, 90, 91 или 92. Вы можете указать
|
||
максимальное и минимальное значения;
|
||
<makevar>WANT_PGSQL_VER</makevar>=
|
||
<literal> 90+</literal> сделает порт зависимым от
|
||
минимальной версии 9.0.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>USE_SQLITE</makevar></entry>
|
||
|
||
<entry>Если переменная имеет значение <literal>yes</literal>,
|
||
добавляет зависимость от порта <filename
|
||
role="package">databases/sqlite3</filename>.
|
||
Переменная может принимать значения: 3, 2.</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>Подробнее смотрите в <ulink
|
||
url="http://svn.FreeBSD.org/ports/head/Mk/bsd.database.mk?view=markup">bsd.database.mk</ulink>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="rc-scripts">
|
||
<title>Запуск и остановка служб (сценарии <literal>rc</literal>)</title>
|
||
|
||
<para>Сценарии <filename>rc.d</filename> используются для запуска служб
|
||
при запуске системы и дают администратору стандартный способ
|
||
остановки, запуска и перезапуска службы. Порты интегрируются в
|
||
системную инфраструктуру <filename>rc.d</filename>. Подробности
|
||
по её использованию можно найти в <ulink
|
||
url="&url.books.handbook;/configtuning-rcd.html">главе rc.d
|
||
Руководства</ulink>. Подробное объяснение доступных команд
|
||
находится в &man.rc.8; и &man.rc.subr.8;. Наконец, есть <ulink
|
||
url="&url.articles.rc-scripting;">статья</ulink>о практических
|
||
аспектах написания сценариев <filename>rc.d</filename>.</para>
|
||
|
||
<para>Установить можно один или более сценариев
|
||
<filename>rc.d</filename>:</para>
|
||
|
||
<programlisting>USE_RC_SUBR= doormand</programlisting>
|
||
|
||
<para>Сценарии обязаны размещаться в подкаталоге
|
||
<filename>files</filename> с обязательным добавлением суффикса
|
||
<literal>.in</literal> к имени файла. Для этого файла будут
|
||
использоваться стандартные расширения <makevar>SUB_LIST</makevar>.
|
||
Также особенно приветствуется использование расширений
|
||
<literal>%%PREFIX%%</literal> и <literal>%%LOCALBASE%%</literal>.
|
||
Подробнее о <makevar>SUB_LIST</makevar> в <link
|
||
linkend="using-sub-files">соответствующей главе</link>.</para>
|
||
|
||
<para>До &os; 6.1-RELEASE интеграция с &man.rcorder.8; доступна
|
||
через использование <makevar>USE_RCORDER</makevar> вместо
|
||
<makevar>USE_RC_SUBR</makevar>. Однако, использовать этот метод
|
||
не нужно, если ваш порт не включает опцию по своей установке в
|
||
основную систему или службе не нужно запускаться до выполнения
|
||
сценария <filename>FILESYSTEMS</filename> из <filename>rc.d</filename>
|
||
основной системы.</para>
|
||
|
||
<para>Начиная с &os; 6.1-RELEASE локальные сценарии
|
||
<filename>rc.d</filename> (включая установленные из портов) включены
|
||
в общий &man.rcorder.8; основной системы.</para>
|
||
|
||
<para>Пример простого сценария <filename>rc.d</filename>:</para>
|
||
|
||
<programlisting>#!/bin/sh
|
||
|
||
# $FreeBSD$
|
||
#
|
||
# PROVIDE: doormand
|
||
# REQUIRE: LOGIN
|
||
# KEYWORD: shutdown
|
||
#
|
||
#
|
||
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable doorman:
|
||
# doorman_enable (bool): Set to "NO" by default.
|
||
# Set it to "YES" to enable doorman
|
||
# doorman_config (path): Set to "%%PREFIX%%/etc/doormand/doormand.cf" by default.
|
||
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
|
||
# to enable this service:
|
||
#
|
||
# doormand_enable (bool): Set to NO by default.
|
||
# Set it to YES to enable doormand.
|
||
# doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf
|
||
# by default.
|
||
#
|
||
|
||
. /etc/rc.subr
|
||
|
||
name=doormand
|
||
rcvar=doormand_enable
|
||
|
||
load_rc_config $name
|
||
|
||
: ${doormand_enable:="NO"}
|
||
: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}
|
||
|
||
command=%%PREFIX%%/sbin/${name}
|
||
pidfile=/var/run/${name}.pid
|
||
|
||
command_args="-p $pidfile -f $doormand_config"
|
||
|
||
run_rc_command "$1"</programlisting>
|
||
|
||
<para>Если нет стоящей причины запускать службы раньше всех портов,
|
||
сценарии должны использовать</para>
|
||
|
||
<programlisting>REQUIRE: LOGIN</programlisting>
|
||
|
||
<para>Если служба
|
||
работает под определенным пользователем (отличным от root), то
|
||
это делается принудительно. В сценарий выше включена конструкция</para>
|
||
|
||
<programlisting>KEYWORD: shutdown</programlisting>
|
||
|
||
<para>потому что
|
||
вымышленный порт, который мы используем в качестве примера, запускает
|
||
службу, и она должна корректно завершиться при выключении системы.
|
||
Если сценарий не запускает постоянную службу, то это не является
|
||
необходимым.</para>
|
||
|
||
<para>Для необязательных элементов конфигурации
|
||
присвоение переменной по умолчанию в стиле "="
|
||
является более предпочтительным по сравнению со стилем ":=",
|
||
используемым здесь, поскольку первый устанавливает значение по
|
||
умолчанию только если переменная не установлена, а последний
|
||
устанавливает её, если переменная не установлена
|
||
<emphasis>или</emphasis> обнулена. Пользователь вполне может
|
||
написать в своем файле <filename>rc.conf.local</filename>
|
||
что-нибудь типа</para>
|
||
|
||
<programlisting>doormand_flags=""</programlisting>
|
||
|
||
<para>и тогда произойдет
|
||
неуместная подстановка переменной с использованием ":=",
|
||
что переопределит намерения пользователя.</para>
|
||
|
||
<note>
|
||
<para>Новые сценарии не следует добавлять с суффиксом
|
||
<filename>.sh</filename>. В определенный момент будет произведено
|
||
массовое репозиторное копирование всех сценариев, все еще
|
||
имеющих этот суффикс.</para>
|
||
</note>
|
||
|
||
<sect2>
|
||
<title>Остановка служб при удалении</title>
|
||
|
||
<para>Существует возможность сделать автоматическую остановку службы
|
||
частью процедуры удаления. Мы советуем использовать эту функцию
|
||
только при абсолютной необходимости остановки службы перед тем
|
||
как файлы будут удалены. Как правило, решение об остановке службы
|
||
при удалении остается за администратором. Также учитывайте, что
|
||
это в том числе касается обновлений.</para>
|
||
|
||
<para>В <filename>pkg-plist</filename> добавляются примерно такие
|
||
строки:</para>
|
||
|
||
<programlisting>@stopdaemon doormand</programlisting>
|
||
|
||
<para>Параметр обязательно должен совпадать с содержимым переменной
|
||
<makevar>USE_RC_SUBR</makevar>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Контрольный список перед внесением изменений</title>
|
||
|
||
<para>Перед тем, как отсылать порт со сценарием
|
||
<filename>rc.d</filename>, и тем более перед его коммитом,
|
||
сверьтесь со следующим контрольным списком, чтобы убедиться,
|
||
что порт для этого готов.</para>
|
||
|
||
<procedure>
|
||
<step>
|
||
<para>Если это новый файл, заканчивается ли он на
|
||
<filename>.sh</filename>? Если это так, то имя файла должно
|
||
быть изменено на <filename>file.in</filename>, поскольку
|
||
новые файлы <filename>rc.d</filename> не могут оканчиваться
|
||
на такое расширение.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Присутствует ли в файле тег
|
||
<literal>$FreeBSD$</literal>?</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Соответствуют ли друг другу имя файла
|
||
(без <filename>.in</filename>), строка <literal>PROVIDE</literal>
|
||
и <literal>$</literal><replaceable>name</replaceable>?
|
||
Имя файла, совпадающее с <literal>PROVIDE</literal>, упрощает
|
||
отладку, особенно для проблем, связанных с &man.rcorder.8;.
|
||
Соответствие имени файла и
|
||
<literal>$</literal><replaceable>name</replaceable>
|
||
также упрощает понимание, какие переменные имеют отношение к
|
||
сценарию в <filename>rc.conf[.local]</filename>. Последнее
|
||
также является тем, что вы могли бы назвать "политикой"
|
||
для всех новых сценариев, включая те, что входят в базовую
|
||
систему.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Содержит ли строка <literal>REQUIRE</literal> значение
|
||
LOGIN? Это условие обязательно для сценариев, работающих не
|
||
из под суперпользователя. Если сценарий запускается из-под
|
||
суперпользователя, то стоит ли его запускать до
|
||
<literal>LOGIN</literal>? Если нет, то его следует запускать
|
||
после, так чтобы мы могли свободно сгруппировать локальные
|
||
сценарии в той точке &man.rcorder.8;, когда почти все сценарии
|
||
в базовой системе уже стартовали.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Запускает ли сценарий постоянную службу? Если да, то он
|
||
должен иметь <literal>KEYWORD: shutdown</literal>.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Убедитесь в том, что в сценарии отсутствует
|
||
<literal>KEYWORD: FreeBSD</literal>. Это перестало быть
|
||
нужным и нежелательно уже много лет. Это также служит
|
||
индикатором того, что новый сценарий был скопирован со
|
||
старого, поэтому особое внимание должно быть уделено при
|
||
проверке.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Если сценарий использует интерпретируемый язык, такой
|
||
как <command>perl</command>, <command>python</command> или
|
||
<command>ruby</command>, то убедитесь, что значение
|
||
<varname>command_interpreter</varname> установлено
|
||
должным образом. В противном случае</para>
|
||
|
||
<screen>&prompt.root; <userinput>service <replaceable>name</replaceable> stop</userinput></screen>
|
||
|
||
<para>возможно будет работать неправильно. Смотрите &man.service.8;
|
||
для получения дополнительной информации.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Все ли вхождения <filename>/usr/local</filename> были
|
||
заменены на <literal>%%PREFIX%%</literal>?</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Идет ли присвоение переменным значений по умолчанию
|
||
после <function>load_rc_config</function>?</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Используются ли пустые строки при присвоении значений
|
||
по умолчанию? Такие присвоения должны быть удалены, но
|
||
перепроверьте, что эти параметры задокументированы в
|
||
комментариях в начале файла.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Действительно ли в сценариях используются значения,
|
||
присвоенные переменным?</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Являются ли параметры по умолчанию, перечисленные в
|
||
<replaceable>name</replaceable><varname>_flags</varname>,
|
||
обязательными? Если это так, то их следует поместить
|
||
в <varname>command_args</varname>. Параметр <option>-d</option>
|
||
здесь - это как красный флаг (прошу прощения за каламбур),
|
||
поскольку обычно он применяется для “демонизации“
|
||
процесса и поэтому на самом деле обязательный.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Никогда не включайте переменную
|
||
<replaceable>name</replaceable><varname>_flags</varname> в
|
||
<varname>command_args</varname> (и наоборот; в прочем, такая
|
||
ошибка встречается реже).</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Запускает ли сценарий какой-либо код безусловно? Это
|
||
нехорошо. Обычно такие вещи могут/должны помещаться в
|
||
<function>start_precmd</function>.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Все логические условия должны использовать функцию
|
||
<function>checkyesno</function>. Не пишите самописных
|
||
проверок для <literal>[Yy][Ee][Ss]</literal>, и так далее.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Если в сценарии выполняется цикл (например, ожидание
|
||
чего-либо перед стартом), используется ли счетчик для
|
||
завершения цикла? Мы не хотим бесконечного ожидания загрузки
|
||
в случае возникновения ошибки.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Создает ли сценарий файлы или каталоги, которым нужны
|
||
особые права доступа? Например, файл <filename>pid</filename>,
|
||
который должен принадлежать пользователю, из-под которого
|
||
запускается процесс. Вместо традиционных команд
|
||
&man.touch.1;/&man.chown.8;/&man.chmod.1; подумайте об
|
||
использовании &man.install.1; с подходящими аргументами
|
||
командной строки, для того чтобы выполнить всю процедуру за
|
||
один шаг.</para>
|
||
</step>
|
||
</procedure>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="users-and-groups">
|
||
<title>Добавление пользователей и групп</title>
|
||
|
||
<para>Некоторые порты требуют в установленной системе наличие
|
||
определенного пользователя. Выберите свободный UID в диапазоне от 50
|
||
до 999 и зарегистрируйте его в <filename>ports/UIDs</filename>
|
||
(для пользователей) и/или в <filename>ports/GIDs</filename> (для
|
||
групп). Удостоверьтесь, что не используете UID, уже используемый
|
||
системой или другими портами.</para>
|
||
|
||
<para>Пожалуйста, включите в патч изменение для этих двух файлов,
|
||
если вам требуется создать нового пользователя или группу для
|
||
вашего порта.</para>
|
||
|
||
<para>Затем вы сможете использовать в вашем <filename>Makefile</filename>
|
||
переменные <makevar>USERS</makevar> и <makevar>GROUPS</makevar>,
|
||
и пользователь автоматические создастся при установке порта.</para>
|
||
|
||
<para>Текущий перечень зарезервированных UID и GID находится в
|
||
<filename>ports/UIDs</filename> и <filename>ports/GIDs</filename>.
|
||
</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1>
|
||
<title>Порты, требующие наличия исходных текстов ядра</title>
|
||
|
||
<para>Некоторым портам (таким как загружаемые модули ядра) для
|
||
компиляции нужны файлы с исходными текстами ядра. Ниже указан
|
||
корректный способ определения, установлены ли они пользователем:</para>
|
||
|
||
<programlisting>.if !exists(${SRC_BASE}/sys/Makefile)
|
||
IGNORE= requires kernel sources to be installed
|
||
.endif</programlisting>
|
||
</sect1>
|
||
|
||
</chapter>
|
||
|
||
<chapter id="plist">
|
||
<title>Продвинутые практики <filename>pkg-plist</filename></title>
|
||
<sect1 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>%%<replaceable>VARS</replaceable>%%</literal>, имеющие
|
||
отношение к файлам документации порта, описаны в <link
|
||
linkend="install-documentation">соответствующем разделе</link>.</para>
|
||
|
||
<para>Если вам нужно сделать другие подстановки, вы можете указать в
|
||
переменной <makevar>PLIST_SUB</makevar> список пар
|
||
<literal><replaceable>VAR</replaceable>=<replaceable>VALUE</replaceable></literal>,
|
||
и все вхождения <literal>%%<replaceable>VAR</replaceable>%%</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> в переменную <makevar>PLIST_SUB</makevar>
|
||
внутри <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>Эта подстановка (также, как и добавление любых <link
|
||
linkend="makefile-manpages">справочных страниц</link>) будет сделана
|
||
между выполнением целей <maketarget>pre-install</maketarget> и
|
||
<maketarget>do-install</maketarget>, посредством чтения файла
|
||
<filename><makevar>PLIST</makevar></filename> и записью в файл
|
||
<filename><makevar>TMPPLIST</makevar></filename>
|
||
(по умолчанию это файл
|
||
<filename><makevar>WRKDIR</makevar>/.PLIST.mktmp</filename>). Так
|
||
что если ваш порт строит <filename><makevar>PLIST</makevar></filename> на лету, делайте
|
||
это во время или до выполнения цели
|
||
<maketarget>pre-install</maketarget>. Кроме того, если вашему порту
|
||
требуется отредактировать получающийся файл, делайте это в цели
|
||
<maketarget>post-install</maketarget> изменением файла
|
||
<filename><makevar>TMPPLIST</makevar></filename>.</para>
|
||
|
||
<para>Другой способ изменения списка сборки порта основан на
|
||
определении значений переменных <makevar>PLIST_FILES</makevar> и
|
||
<makevar>PLIST_DIRS</makevar>. Каждое из них рассматривается как
|
||
перечень путей для записи в
|
||
<filename><makevar>TMPPLIST</makevar></filename> содержимого
|
||
<filename><makevar>PLIST</makevar></filename>. Имена, перечисленные
|
||
в <makevar>PLIST_FILES</makevar> и <makevar>PLIST_DIRS</makevar>,
|
||
подвергаются подстановке
|
||
<literal>%%<replaceable>VAR</replaceable>%%</literal>, как описано
|
||
выше. За исключением этого, имена из <makevar>PLIST_FILES</makevar>
|
||
будут появляться в окончательном варианте перечня сборки без
|
||
изменений, когда как <literal>@dirrm</literal> будет предшествовать
|
||
именам из <makevar>PLIST_DIRS</makevar>. Для того, чтобы возыметь
|
||
действие, <makevar>PLIST_FILES</makevar> и
|
||
<makevar>PLIST_DIRS</makevar> должны задаваться до того, как будет
|
||
записываться <filename><makevar>TMPPLIST</makevar></filename>, то
|
||
есть в цели <maketarget>pre-install</maketarget> или ещё
|
||
раньше.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="plist-cleaning">
|
||
<title>Пустые каталоги</title>
|
||
|
||
<sect2 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>Эта команда не выведет никаких сообщений об ошибках и не вызовет
|
||
аварийного завершения работы &man.pkg.delete.1;, даже если
|
||
каталог <filename><makevar>${PREFIX}</makevar>/share/doc/gimp</filename>
|
||
не пуст из-за того, что другие порты установили сюда какие-то
|
||
файлы.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="plist-dir-empty">
|
||
<title>Создание пустых каталогов</title>
|
||
|
||
<para>Пустым каталогам, создаваемым во время установки порта, нужно
|
||
особое внимание. Они не будут созданы при установке пакета, потому
|
||
что пакеты содержат только файлы, а &man.pkg.add.1; создает для них
|
||
каталоги по мере надобности. Чтобы убедиться, что пустой каталог
|
||
создается при установке пакета, добавьте эту строку в
|
||
<filename>pkg-plist</filename> перед соответствующей строкой
|
||
<literal>@dirrm</literal>:</para>
|
||
|
||
<programlisting>@exec mkdir -p %D/share/foo/templates</programlisting>
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="plist-config">
|
||
<title>Конфигурационные файлы</title>
|
||
|
||
<para>Если ваш порт устанавливает конфигурационные файлы в каталог
|
||
<filename><makevar>PREFIX</makevar>/etc</filename> (или куда-то еще),
|
||
<emphasis>не</emphasis> делайте их простого перечисления в файле
|
||
<filename>pkg-plist</filename>. Это приведёт к тому, что по команде
|
||
&man.pkg.delete.1; или при новой установке файлы,
|
||
тщательно отредактированные и настроенные пользователем, будут
|
||
уничтожены.</para>
|
||
|
||
<para>Вместо этого установите файл(ы) с примерами с расширением
|
||
<filename><replaceable>filename</replaceable>.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 ${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.1;.</para>
|
||
|
||
<para>Если существует действительно стоящая причина не устанавливать
|
||
рабочий файл конфигурации по умолчанию, уберите строку
|
||
<literal>@exec</literal> из <filename>pkg-plist</filename> и
|
||
добавьте <link linkend="porting-message">сообщение</link>,
|
||
указывающее на то, что пользователь обязан скопировать и
|
||
отредактировать этот файл перед тем, как программное обеспечение
|
||
начнёт работать.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="plist-dynamic">
|
||
<title>Динамический или статический список упаковки</title>
|
||
|
||
<para><emphasis>Статический список упаковки</emphasis> это список
|
||
упаковки, который доступен в Коллекции Портов или как файл
|
||
<filename>pkg-plist</filename> (с подстановкой переменных или без
|
||
неё), или как встроенный в <filename>Makefile</filename> посредством
|
||
<makevar>PLIST_FILES</makevar> и <makevar>PLIST_DIRS</makevar>.
|
||
Даже если содержимое является автоматически порождаемым при помощи
|
||
инструмента или в результате выполнения цели в Makefile
|
||
<emphasis>до</emphasis> включения в Коллекцию Портов коммиттером,
|
||
то список всё ещё будет считаться статическим, поскольку его
|
||
можно узнать без необходимости скачивания или компиляции
|
||
дистрибутива.</para>
|
||
|
||
<para><emphasis>Динамический список упаковки</emphasis> это список
|
||
упаковки, который получается во время компиляции порта и строится
|
||
на основе устанавливаемых файлов и каталогов. Узнать такой список
|
||
невозможно до того, как исходный код портируемого приложения
|
||
будет скачен и скомпилирован, или после запуска
|
||
<literal>make clean</literal>.</para>
|
||
|
||
<para>Хотя использование динамических список упаковки не запрещено,
|
||
сопровождающие должны использовать статические списки упаковки
|
||
везде, где это возможно, поскольку это позволяет пользователям
|
||
выполнять &man.grep.1; по доступным портам для обнаружения, например,
|
||
который порт устанавливает определенный файл. Динамические списки
|
||
должны быть использованы в основном для сложных портов, для которых
|
||
изменения в списке упаковки кардинальным образом основаны на
|
||
необязательных возможностях порта (и, таким образом, делая
|
||
сопровождение статических списков упаковки невозможным), или портов,
|
||
которые изменяют список упаковки на основе версии используемого
|
||
им программного обеспечения (например, порты, которые порождают
|
||
документы при помощи <application>Javadoc</application>).</para>
|
||
|
||
<para>Сопровождающим, которые предпочитают динамические списки
|
||
упаковки, рекомендуется добавлять в свои порты новую цель,
|
||
которая производит файл <filename>pkg-plist</filename>, чтобы
|
||
пользователи могли изучать содержимое.</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="plist-autoplist">
|
||
<title>Автоматическое создание списка упаковки</title>
|
||
|
||
<para>Первым делом убедитесь, что ваш порт практически полностью
|
||
завершён и осталось создать только <filename>pkg-plist</filename>.</para>
|
||
|
||
<para>Далее создайте временное дерево каталогов, куда может быть
|
||
установлен ваш порт, и установите все зависимости.</para>
|
||
|
||
<screen>&prompt.root; <userinput>mkdir /var/tmp/`make -V PORTNAME`</userinput>
|
||
&prompt.root; <userinput>mtree -U -f `make -V MTREE_FILE` -d -e -p /var/tmp/`make -V PORTNAME`</userinput>
|
||
&prompt.root; <userinput>make depends PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
|
||
|
||
<para>Сохраните структуру каталогов в новом файле.</para>
|
||
|
||
<screen>&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` && find -d * -type d) | sort > OLD-DIRS</userinput></screen>
|
||
|
||
<para>Создайте пустой файл <filename>pkg-plist</filename>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>:>pkg-plist</userinput></screen>
|
||
|
||
<para>Если ваш порт принимает во внимание <makevar>PREFIX</makevar> (а он
|
||
должен это делать), то тогда вы можете установить порт и создать список
|
||
упаковки.</para>
|
||
|
||
<screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/`make -V PORTNAME`</userinput>
|
||
&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` && find -d * \! -type d) | sort > pkg-plist</userinput></screen>
|
||
|
||
<para>Кроме того, в список упаковки вы должны добавить все вновь
|
||
созданные каталоги.</para>
|
||
|
||
<screen>&prompt.root; <userinput>(cd /var/tmp/`make -V PORTNAME` && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist</userinput></screen>
|
||
|
||
<para>И наконец, вам нужно вручную отшлифовать список упаковки; его
|
||
создание автоматизировано <emphasis>не полностью</emphasis>. Страницы
|
||
справочной системы должны быть перечислены в файле
|
||
<filename>Makefile</filename> порта в переменных
|
||
<makevar>MAN<replaceable>n</replaceable></makevar>, а не в списке
|
||
упаковки. Пользовательские конфигурационные файлы должны быть удалены
|
||
или быть установлены как
|
||
<filename><replaceable>filename</replaceable>.sample</filename>.
|
||
Файл <filename>info/dir</filename> включать в список не нужно, но
|
||
должны быть добавлены соответствующие строчки
|
||
<filename>install-info</filename>, так, как это описано в разделе о <link
|
||
linkend="makefile-info">файлах в формате info</link>. Все
|
||
библиотеки, устанавливаемые портом, должны быть перечислены так, как
|
||
это описано в разделе о <link
|
||
linkend="porting-shlibs">динамических библиотеках</link>.</para>
|
||
|
||
<para>Как альтернативу, можно использовать скрипт <command>plist</command>
|
||
из <filename>/usr/ports/Tools/scripts/</filename> для автоматического
|
||
построения списка упаковки. Скрипт <filename>plist</filename> - это
|
||
сценарий на <application>Ruby</application>, который автоматизирует
|
||
большинство ручных операций, изложенных в предыдущем параграфе.</para>
|
||
|
||
<para>Первый шаг такой же как выше: взять
|
||
первые три строки,
|
||
<command>mkdir</command>, <command>mtree</command> и
|
||
<command>make depends</command>. Затем собрать и установить
|
||
порт:</para>
|
||
|
||
<screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
|
||
|
||
<para>И позволить <command>plist</command> создать файл
|
||
<filename>pkg-plist</filename>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>/usr/ports/Tools/scripts/plist -Md -m `make -V MTREE_FILE` /var/tmp/`make -V PORTNAME` > pkg-plist</userinput></screen>
|
||
|
||
<para>Список упаковки всё ещё должен быть подчищен вручную как описано
|
||
выше.</para>
|
||
|
||
<para>Для первоначального создания <filename>pkg-plist</filename> можно
|
||
использовать другой инструмент <filename
|
||
role="package">ports-mgmt/genplist</filename>. Как и с прочими
|
||
автоматизированными инструментами, получаемый <filename>pkg-plist</filename>
|
||
следует проверить и при необходимости отредактировать вручную.</para>
|
||
</sect1>
|
||
|
||
</chapter>
|
||
|
||
<chapter id="pkg-files">
|
||
<title>Файлы <filename>pkg-<replaceable>*</replaceable></filename></title>
|
||
|
||
<para>Есть несколько приёмов работы с файлами
|
||
<filename>pkg-<replaceable>*</replaceable></filename>, которые мы ещё не
|
||
описали, но они иногда могут быть очень кстати.</para>
|
||
|
||
<sect1 id="porting-message">
|
||
<title><filename>pkg-message</filename></title>
|
||
|
||
<para>Если вам нужно вывести сообщение для человека, устанавливающего
|
||
приложение, то вы можете поместить сообщение в файл
|
||
<filename>pkg-message</filename>. Эта возможность часто оказывается
|
||
полезной для вывода дополнительных шагов установки, которые нужно
|
||
предпринять после выполнения команды &man.pkg.add.1;, или
|
||
для вывода информации о лицензировании.</para>
|
||
|
||
<para>Если должны выводиться некоторые строки о knobs времени построения
|
||
или предупреждения, используйте <makevar>ECHO_MSG</makevar>. Файл
|
||
<filename>pkg-message</filename> только для послеустановочных шагов.
|
||
Также следует иметь в виду различие между <makevar>ECHO_MSG</makevar>
|
||
и <makevar>ECHO_CMD</makevar>. Первое предназначено для вывода на
|
||
экран информационного текста, а второе для конвейера команд:</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>. И он не будет автоматически
|
||
выводиться, если пользователь использует порт, а не пакет, так что
|
||
вы должны будете сами выводить его при выполнении цели
|
||
<maketarget>post-install</maketarget>.</para>
|
||
</note>
|
||
</sect1>
|
||
|
||
<sect1 id="pkg-install">
|
||
<title><filename>pkg-install</filename></title>
|
||
|
||
<para>Если при установке бинарного пакета по команде
|
||
&man.pkg.add.1; вашему порту нужно выполнить какие-то
|
||
дополнительные действия или команды, то вы можете сделать это с
|
||
помощью скрипта <filename>pkg-install</filename>. Этот скрипт будет
|
||
автоматически добавлен к пакету, и будет дважды запускаться по
|
||
команде &man.pkg.add.1;: первый раз в виде
|
||
<literal>${SH} pkg-install ${PKGNAME}
|
||
PRE-INSTALL</literal>, а второй раз как <literal>${SH} {PKGNAME}
|
||
POST-INSTALL</literal>.
|
||
Для распознавания того, в каком режиме запущен скрипт, можно
|
||
использовать параметр <literal>$2</literal>. Переменная
|
||
окружения <envar>PKG_PREFIX</envar> будет принимать значение,
|
||
соответствующее каталогу, в который устанавливается пакет.
|
||
Дополнительная информация находится на странице Справочника о
|
||
команде &man.pkg.add.1;.</para>
|
||
|
||
<note>
|
||
<para>Этот скрипт не запускается автоматически, если вы
|
||
устанавливаете порт командой <command>make install</command>.
|
||
Если же вам действительно необходимо его запустить, то запустите
|
||
его явно из файла <filename>Makefile</filename> порта строкой
|
||
вида <literal>PKG_PREFIX=${PREFIX} ${SH} $
|
||
{PKGINSTALL}${PKGNAME} PRE-INSTALL</literal>.</para>
|
||
</note>
|
||
</sect1>
|
||
|
||
<sect1 id="pkg-deinstall">
|
||
<title><filename>pkg-deinstall</filename></title>
|
||
|
||
<para>Этот скрипт вызывается при удалении пакета.</para>
|
||
|
||
<para>Этот скрипт утилитой &man.pkg.delete.1; будет запускаться
|
||
дважды. Первый раз как <literal>${SH} pkg-deinstall
|
||
${PKGNAME} DEINSTALL</literal>, а второй раз как
|
||
<literal>${SH} pkg-deinstall ${PKGNAME}
|
||
POST-DEINSTALL</literal>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="pkg-req">
|
||
<title><filename>pkg-req</filename></title>
|
||
|
||
<para>Если вашему порту нужно определять, должен ли он устанавливаться
|
||
или нет, то вы можете создать скрипт <quote>необходимости</quote>
|
||
<filename>pkg-req</filename>. Он будет вызван автоматически
|
||
в момент установки/удаления для определения того, должны ли они
|
||
реально выполняться.</para>
|
||
|
||
<para>Скрипт будет запущен в процессе установки командой
|
||
&man.pkg.add.1;, как <literal>pkg-req
|
||
${PKGNAME} INSTALL</literal>. В процессе удаления он
|
||
будет запущен командой &man.pkg.delete.1; как
|
||
<literal>pkg-req ${PKGNAME} DEINSTALL</literal>.</para>
|
||
</sect1>
|
||
|
||
|
||
<sect1 id="pkg-names">
|
||
<title id="porting-pkgfiles">Изменение имён файлов
|
||
<filename>pkg-<replaceable>*</replaceable></filename></title>
|
||
|
||
<para>Все имена файлов
|
||
<filename>pkg-<replaceable>*</replaceable></filename>
|
||
определяются с помощью переменных, так что вы можете изменить их,
|
||
если это нужно, в вашем файле <filename>Makefile</filename>. Это
|
||
особенно полезно, если вы используете одни и те же файлы
|
||
<filename>pkg-<replaceable>*</replaceable></filename>
|
||
совместно между несколькими портами или
|
||
пишете в один из вышеперечисленных файлов (в главе о <link
|
||
linkend="porting-wrkdir">записи в каталоги, отличные от
|
||
<makevar>WRKDIR</makevar></link> объяснено, почему не рекомендуется
|
||
осуществлять запись непосредственно в файлы
|
||
<filename>pkg-<replaceable>*</replaceable></filename>.</para>
|
||
|
||
<para>Вот список имён переменных и их значений по умолчанию. (Значение
|
||
<makevar>PKGDIR</makevar> по умолчанию равно
|
||
<makevar>${MASTERDIR}</makevar>.)</para>
|
||
|
||
<informaltable frame="none" pgwide="0">
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Переменная</entry>
|
||
|
||
<entry>Значение по умолчанию</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><makevar>DESCR</makevar></entry>
|
||
<entry><literal>${PKGDIR}/pkg-descr</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PLIST</makevar></entry>
|
||
<entry><literal>${PKGDIR}/pkg-plist</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PKGINSTALL</makevar></entry>
|
||
<entry><literal>${PKGDIR}/pkg-install</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PKGREQ</makevar></entry>
|
||
<entry><literal>${PKGDIR}/pkg-req</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PKGMESSAGE</makevar></entry>
|
||
<entry><literal>${PKGDIR}/pkg-message</literal></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>Пожалуйста, изменяйте значения этих переменных, а не
|
||
переопределяйте <makevar>PKG_ARGS</makevar>. Если вы измените
|
||
значение переменных <makevar>PKG_ARGS</makevar>, то эти файлы при
|
||
установке из порта будут установлены в каталог
|
||
<filename>/var/db/pkg</filename> некорректно.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="using-sub-files">
|
||
<title>Использование <makevar>SUB_FILES</makevar> и
|
||
<makevar>SUB_LIST</makevar></title>
|
||
|
||
<para>Переменные <makevar>SUB_FILES</makevar> и
|
||
<makevar>SUB_LIST</makevar> подходят для задания в файлах порта
|
||
динамических значений, таких как <makevar>PREFIX</makevar> установки
|
||
в <filename>pkg-message</filename>.</para>
|
||
|
||
<para>В переменной <makevar>SUB_FILES</makevar> указывается перечень
|
||
файлов для автоматического изменения. Каждый
|
||
<replaceable>file</replaceable> из перечня <makevar>SUB_FILES</makevar>
|
||
обязан иметь соответствующий
|
||
<filename><replaceable>file</replaceable>.in</filename>,
|
||
присутствующий в <makevar>FILESDIR</makevar>. Измененная версия
|
||
будет создана в <makevar>WRKDIR</makevar>. Файлы, определенные в
|
||
качестве значения <makevar>USE_RC_SUBR</makevar> (или устаревшего
|
||
<makevar>USE_RCORDER</makevar>), автоматически добавляются в
|
||
<makevar>SUB_FILES</makevar>. Для файлов
|
||
<filename>pkg-message</filename>, <filename>pkg-install</filename>,
|
||
<filename>pkg-deinstall</filename> и <filename>pkg-req</filename>
|
||
устанавливается соответствующая переменная Makefile, указывающая на
|
||
обработанную версию.</para>
|
||
|
||
<para>Переменная <makevar>SUB_LIST</makevar> содержит перечень пар
|
||
<literal>VAR=VALUE</literal>. В каждом файле из
|
||
<makevar>SUB_FILES</makevar> для каждой пары будет произведена
|
||
замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>.
|
||
Некоторые общие пары определяются автоматически:
|
||
<makevar>PREFIX</makevar>, <makevar>LOCALBASE</makevar>,
|
||
<makevar>DATADIR</makevar>,
|
||
<makevar>DOCSDIR</makevar>, <makevar>EXAMPLESDIR</makevar>.
|
||
Любая строка, начинающаяся с <literal>@comment</literal>, будет
|
||
удалена из конечного файла после подстановки переменной .</para>
|
||
|
||
<para>В следующем примере в <filename>pkg-message</filename>
|
||
будет сделана замена <literal>%%ARCH%%</literal> на системную
|
||
архитектуру:</para>
|
||
|
||
<programlisting>SUB_FILES= pkg-message
|
||
SUB_LIST= ARCH=${ARCH}</programlisting>
|
||
|
||
<para>Обратите внимание, что в этом примере в <makevar>FILESDIR</makevar>
|
||
обязательно существование файла <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>
|
||
|
||
<chapter id="testing">
|
||
<title>Тестирование вашего порта</title>
|
||
|
||
<sect1 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 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 id="testing-porttools">
|
||
<title>Port Tools</title>
|
||
|
||
<para>Программа <filename role="package">ports-mgmt/porttools</filename>
|
||
входит в состав Коллекции Портов.</para>
|
||
|
||
<para><command>port</command> является сценарием переднего плана,
|
||
который может упростить вам задачу тестирования. Если вы хотите
|
||
проверить новый порт или обновить существующий, то вы можете
|
||
использовать <command>port test</command> для проверки вашего порта,
|
||
включая проверку <link
|
||
linkend="testing-portlint"><command>portlint</command></link>. Эта
|
||
команда также находит и отображает любые файлы, которые невключенные
|
||
в <filename>pkg-plist</filename>. Смотрите следующий пример:</para>
|
||
|
||
<screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-prefix">
|
||
<title><makevar>PREFIX</makevar> и <makevar>DESTDIR</makevar></title>
|
||
|
||
<para>Переменная <makevar>PREFIX</makevar> определяет, куда будет
|
||
установлен порт. По умолчанию это <filename>/usr/local</filename>,
|
||
но может меняться пользователем на собственный путь, такой как
|
||
<filename>/opt</filename>. В вашем порту значение этой переменной
|
||
должно учитываться.</para>
|
||
|
||
<para>Если пользователь установил переменную <makevar>DESTDIR</makevar>,
|
||
то она определяет полное альтернативное окружение, обычно, это jail
|
||
или установленная система, смонтированная в месте, отличном от
|
||
<filename>/</filename>. На самом деле порт устанавливается в
|
||
<filename><makevar>DESTDIR</makevar>/<makevar>PREFIX</makevar></filename>
|
||
и регистрируется в базе данных пакетов в
|
||
<filename><makevar>DESTDIR</makevar>/var/db/pkg</filename>.
|
||
Поскольку управление <makevar>DESTDIR</makevar> производится
|
||
автоматически инфраструктурой портов с помощью &man.chroot.8;, вам
|
||
не нужны никакие изменения или проявление особой осторожности
|
||
при написании <makevar>DESTDIR</makevar>-совместимых портов.</para>
|
||
|
||
<para>Значение переменной <makevar>PREFIX</makevar> будет установлено
|
||
в <makevar>LOCALBASE</makevar> (по умолчанию
|
||
<filename>/usr/local</filename>). Если
|
||
задана переменная <makevar>USE_LINUX_PREFIX</makevar>, то
|
||
<makevar>PREFIX</makevar> примет значение <makevar>LINUXBASE</makevar>
|
||
(по умолчанию <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> вместо
|
||
<makevar>PREFIX</makevar>. Наличие явно указанных путей можно быстро
|
||
проверить следующим образом:</para>
|
||
|
||
<screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen>
|
||
|
||
<para>Если что-то было установлено за пределами
|
||
<makevar>PREFIX</makevar>, то процесс создания пакета сообщит об
|
||
отсутствии файлов.</para>
|
||
|
||
<para>Этот тест не найдет явно указанных путей внутри файлов порта
|
||
и не проверит корректность использования <makevar>LOCALBASE</makevar>
|
||
в качестве ссылки на файлы из других портов. Порт, временно
|
||
установленный в <filename>/var/tmp/`make -V PORTNAME`</filename>,
|
||
следует проверять на работоспособность, чтобы убедиться в отсутствии
|
||
проблем с путями.</para>
|
||
|
||
<para>Переменная <makevar>PREFIX</makevar> не должна задаваться явно в
|
||
файле <filename>Makefile</filename> порта. Пользователи при установке
|
||
порта могут задать в <makevar>PREFIX</makevar> свое собственное
|
||
место, и порт должен учитывать это значение.</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>Путь с использованием <makevar>LOCALBASE</makevar> имеет больше
|
||
шансов оставаться работоспособным, если системный администратор
|
||
переместил всё дерево <filename>/usr/local</filename> куда-то в другое
|
||
место.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="testing-tinderbox">
|
||
<title>Tinderbox</title>
|
||
|
||
<para>Если вы алчный контрибутор портов, то вы можете захотеть
|
||
взглянуть на <application>Tinderbox</application>. Это мощная
|
||
система построения и тестирования портов, основанная на сценариях,
|
||
используемых в <link linkend="build-cluster">Pointyhat</link>.
|
||
<application>Tinderbox</application> можно установить, используя
|
||
порт <filename role="package">ports-mgmt/tinderbox</filename>.
|
||
Обязательно прочитайте поставляемую документацию, поскольку
|
||
конфигурация не является тривиальной.</para>
|
||
|
||
<para>Для получения подробностей посетите <ulink
|
||
url="http://tinderbox.marcuscom.com/">вебсайт Tinderbox</ulink>.</para>
|
||
|
||
</sect1>
|
||
</chapter>
|
||
|
||
<chapter id="port-upgrading">
|
||
<title>Обновление отдельного порта</title>
|
||
|
||
<para>Если вы заметите, что ваш порт устарел по сравнению с последней
|
||
авторской версией, первым делом вы должны получить самую
|
||
последнюю версия порта. Вы можете найти их в каталоге
|
||
<filename>ports/ports-current</filename> на зеркальных FTP-серверах &os;.
|
||
Однако если вы работаете с достаточно большим количеством портов,
|
||
наверное, будет проще использовать <application>CVSup</application> для
|
||
поддержания всей коллекции портов в актуальном состоянии, как это
|
||
описано в <ulink url="../handbook/synching.html#CVSUP-CONFIG">
|
||
Руководстве</ulink>. К тому же это даст возможность отслеживать все
|
||
зависимости портов.</para>
|
||
|
||
<para>На следующем шаге необходимо выяснить, нет ожидает ли уже это
|
||
обновление своей очереди. Для этого у вас есть две возможности.
|
||
Существует интерфейс к <ulink
|
||
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе
|
||
данных сообщений о проблемах FreeBSD (PR)</ulink> (известной также как
|
||
<literal>GNATS</literal>) с поисковыми возможностями. Выберите из
|
||
выпадающего списка <literal>ports</literal> и введите название
|
||
порта.</para>
|
||
|
||
<para>Однако иногда люди забывают поместить название порта в поле
|
||
Synopsis в точном виде. В таком случае вы можете воспользоваться
|
||
<link linkend="portsmon">Системой мониторинга портов
|
||
FreeBSD</link> (которая известна также как
|
||
<literal>portsmon</literal>). В рамках этой системы делается попытка
|
||
классифицировать PR, касающиеся портов, по имени порта. Для поиска
|
||
PR, относящихся к определённому порту, используйте механизм <ulink
|
||
url="http://portsmon.FreeBSD.org/portoverview.py">
|
||
Просмотра по одному порту</ulink>.</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>/usr/bin/diff 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 портов без поддержки, и это
|
||
как раз та область, где всегда нужны добровольцы. (Детальное описание
|
||
обязанностей сопровождающего можно найти в разделе в <ulink
|
||
url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">
|
||
Руководстве Разработчика</ulink>.)</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; вы должны просмотреть раздел
|
||
о <ulink url="&url.articles.problem-reports;/pr-writing.html">Написании
|
||
сообщений о проблемах</ulink> в статье о Сообщениях об ошибках; он
|
||
содержит гораздо больше информации о том, как писать полезные сообщения
|
||
о проблемах.</para>
|
||
|
||
<important>
|
||
<para>Если ваше обновление вызвано соображениями информационной
|
||
безопасности или наличием серьёзных ошибок в имеющемся порте,
|
||
пожалуйста, оповестите &a.portmgr; о необходимости немедленного
|
||
перепостроения и повторного распространения пакета вашего порта.
|
||
В противном случае ничего не подозревающие пользователи &man.pkg.add.1;
|
||
будут продолжать устанавливать старую версию по команде
|
||
<command>pkg_add -r</command> в течение ещё нескольких недель.</para>
|
||
</important>
|
||
|
||
<note>
|
||
<para>Повторяем еще раз - для посылки обновлений существующих портов
|
||
используйте утилиту &man.diff.1;, а не &man.shar.1;! Это поможет
|
||
понять коммиттерам портов, что именно было изменено.</para>
|
||
</note>
|
||
|
||
<para>Теперь, когда вы проделали всё это, вам может понадобиться
|
||
прочесть о том, как поддерживать актуальное состояние, в <xref
|
||
linkend="keeping-up"/>.</para>
|
||
|
||
<sect1 id="svn-diff">
|
||
<title>Использование <literal>SVN</literal> для создания патчей</title>
|
||
|
||
<para>По возможности присылайте исправления в формате &man.svn.1; diff;
|
||
в таком виде их проще использовать по сравнению с разницей между
|
||
<quote>старым и новым</quote> каталогами. К тому же, вам проще
|
||
увидеть ваши изменения и обновить их в случае, если что-нибудь
|
||
изменилось в Коллекции Портов с тех пор, как вы начали работу, пока вы
|
||
не отправите ваши изменения, либо если коммиттер попросит вас
|
||
исправить что-то еще.</para>
|
||
|
||
<screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co id="my-wrkdir"/>
|
||
&prompt.user; <userinput>svn co svn://svn.FreeBSD.org/ports/head/dns/pdnsd</userinput> <co id="svn-FreeBSD-org"/>
|
||
&prompt.user; <userinput>cd ~/my_wrkdir/pdnsd</userinput></screen>
|
||
|
||
<calloutlist>
|
||
<callout arearefs="my-wrkdir">
|
||
<para>Это может быть где угодно; место, в котором производится
|
||
построение портов, не привязано к
|
||
<filename class="directory">/usr/ports/</filename>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="svn-FreeBSD-org">
|
||
<para><ulink url="http://svn.FreeBSD.org/">svn.FreeBSD.org</ulink>
|
||
— это общедоступный <literal>SVN</literal> сервер.</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 id="svn-update"/></screen>
|
||
|
||
<calloutlist>
|
||
<callout arearefs="svn-update">
|
||
<para>Эта команда попытается выполнить слияние различий между
|
||
вашим патчем и текущим содержимым в SVN; внимательно проверьте
|
||
полученный вывод. Буква перед названием каждого файла означает
|
||
тип изменения, сделанного с этим файлом. Для получения полного
|
||
списка смотрите <xref linkend="table-svn-up"/>.</para>
|
||
</callout>
|
||
</calloutlist>
|
||
|
||
<table pgwide="1" frame="none" id="table-svn-up">
|
||
<title>Префиксы файлов для <literal>SVN</literal> 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>, то это означает, что что-то
|
||
изменилось в репозитории SVN и &man.svn.1; не смогла выполнить
|
||
слияние ваших локальных изменений с полученными из репозитория.
|
||
В любом случае никогда не помешает просмотреть изменения,
|
||
поскольку &man.svn.1; ничего не знает о том, каким должен быть
|
||
порт, поэтому эта команда может (и, вероятно, будет) делать
|
||
слияние тех изменений, которые не имеют смысла.</para>
|
||
|
||
<para>Последним шагом является создание унифицированного &man.diff.1;
|
||
для файлов относительно SVN:</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 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>
|
||
|
||
<chapter id="security">
|
||
<title>Безопасность портов</title>
|
||
|
||
<sect1 id="security-intro">
|
||
<title>Почему безопасность так важна</title>
|
||
|
||
<para>Ошибки в программном обеспечении появляются случайно. Возможно,
|
||
самые опасные из них те, что создают уязвимости безопасности. С
|
||
технической точки зрения подобные уязвимости должны быть закрыты
|
||
путем исправления вызывающих их ошибок. Тем не менее, политики
|
||
обработки несущественных ошибок и уязвимостей очень различаются.
|
||
</para>
|
||
|
||
<para>Обычная небольшая ошибка затрагивает только тех пользователей,
|
||
которые задействуют некоторые комбинации настроек, активирующие эту
|
||
ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую
|
||
версию программного обеспечения, свободного от ошибки, но большинство
|
||
пользователей не посчитают нужным сразу же произвести обновление,
|
||
поскольку эта ошибка никогда у них не проявлялась. Критическая
|
||
ошибка, которая может приводить к потере данных, представляет
|
||
серьезную проблему. Тем не менее, предусмотрительные пользователи
|
||
знают, что большинство возможных происшествий, и среди них программные
|
||
ошибки, скорее всего приводят к потере данных, поэтому они выполняют
|
||
резервное копирование важных данных; дополнительно, критическая
|
||
ошибка будет обнаружена очень скоро.</para>
|
||
|
||
<para>С уязвимостью безопасности всё иначе. Во-первых, она может
|
||
сохраняться необнаруженной целые годы, потому что чаще всего не
|
||
вызывает ошибок в работе. Во-вторых, компания злоумышленников
|
||
может использовать ее для получения неавторизованного доступа к
|
||
уязвимой системе, уничтожить или подменить важные данные; в худшем
|
||
случае пользователь даже не заметит нанесенный урон. В-третьих,
|
||
взлом уязвимой системы часто упрощает задачу проникновения атакующих
|
||
в другие системы, которые не могут быть скомпрометированы иначе.
|
||
Таким образом, устранение уязвимости как таковой недостаточно:
|
||
следует разослать всем заинтересованным уведомления в наиболее
|
||
понятной и исчерпывающей форме, что позволит оценить риск и
|
||
предпринять подходящие меры.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="security-fix">
|
||
<title>Исправление уязвимостей безопасности</title>
|
||
|
||
<para>Что касается портов и пакетов, уязвимость безопасности
|
||
изначально может появиться в исходном дистрибутиве или файлах
|
||
порта. В первом случае, разработчик исходного программного
|
||
обеспечения скорее всего сразу же выпустит патч или новую версию,
|
||
и вам лишь понадобится сразу обновить порт в соответствии с
|
||
исправлением автора. Если исправление по какой-то причине
|
||
задерживается, вам следует либо <link linkend="dads-noinstall">пометить
|
||
порт как <makevar>FORBIDDEN</makevar></link>, либо добавить в порт
|
||
ваш собственный патч. В случае уязвимости порта просто исправьте
|
||
этот порт как можно скорее. В любом случае нужно следовать
|
||
<link linkend="port-upgrading">стандартной процедуре отправки вашего
|
||
изменения</link>, если вы не обладаете правами на коммит изменения
|
||
непосредственно в дерево портов.</para>
|
||
|
||
<important>
|
||
<para>Быть коммиттером портов недостаточно для коммита произвольного
|
||
порта. Помните, что обычно у портов есть сопровождающие, мнение
|
||
которых вы должны учитывать.</para>
|
||
</important>
|
||
|
||
<para>Пожалуйста, убедитесь, что ревизия порта после закрытия
|
||
уязвимости увеличена. Вот как пользователи, обновляющие
|
||
установленные пакеты на постоянной основе, увидят, что им нужно
|
||
запустить обновление. Кроме того, новый пакет будет собран и
|
||
распространен через FTP и WWW зеркала, замещая уязвимый.
|
||
Если в процессе исправления уязвимости не было изменено значение
|
||
<makevar>PORTVERSION</makevar>, то должно быть увеличено значение
|
||
<makevar>PORTREVISION</makevar>. Вам следует увеличить значение
|
||
<makevar>PORTREVISION</makevar> после добавления в порт файла с
|
||
патчем, но не когда вы обновили порт до последней версии
|
||
программного обеспечения, попутно затронув при этом
|
||
<makevar>PORTVERSION</makevar>. За дальнейшей информацией
|
||
обращайтесь к
|
||
<link linkend="makefile-naming-revepoch">соответствующему
|
||
разделу</link>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="security-notify">
|
||
<title>Обеспечение сообщества информацией</title>
|
||
|
||
<sect2 id="security-notify-vuxml-db">
|
||
<title>База данных VuXML</title>
|
||
|
||
<para>Очень важным и первостепенным шагом при действии как можно
|
||
раньше после раскрытия уязвимости является уведомление сообщества
|
||
пользователей порта об опасности. Такие уведомления служат двум
|
||
целям. Во-первых, в случае действительно серьезной угрозы, будет
|
||
посоветовано применить мгновенное воздействие. Например, остановить
|
||
затрагиваемый сетевой сервис или даже удалить порт целиком,
|
||
пока уязвимость не будет устранена. Во-вторых, масса
|
||
пользователей имеет тенденцию обновлять установленные пакеты только от
|
||
случая к случаю. Из уведомления они узнают, что
|
||
<emphasis>должны</emphasis> обновить пакет без промедления сразу
|
||
же после появления исправленной версии.</para>
|
||
|
||
<para>Учитывая огромное число портов в дереве, невозможно по
|
||
каждому случаю выпускать бюллетень безопасности без создания
|
||
флуда и потери внимания сообщества к моменту появления
|
||
действительно серьезных причин. Поэтому уязвимости безопасности,
|
||
обнаруженные в портах, записываются в <ulink
|
||
url="http://vuxml.freebsd.org/">базу данных FreeBSD VuXML</ulink>.
|
||
Члены Команды Офицеров Безопасности также отслеживают её на
|
||
предмет появления вопросов, требующих их вмешательства.</para>
|
||
|
||
<para>Если вы обладаете правами коммиттера, вы можете сам обновить
|
||
базу данных VuXML. Так вы поможете Команде Офицеров Безопасности
|
||
и своевременно пошлете ценную информацию сообществу. Тем не
|
||
менее, если вы не являетесь коммиттером или верите, что нашли
|
||
исключительно серьезную уязвимость, то не
|
||
задумываясь свяжитесь с Командой Офицеров Безопасности напрямую
|
||
как это описано на странице <ulink
|
||
url="http://www.freebsd.org/security/#how">информационной
|
||
безопасности FreeBSD</ulink>.</para>
|
||
|
||
<para>База данных VuXML является
|
||
документом XML. Его исходный файл <filename>vuln.xml</filename>
|
||
содержится прямо внутри порта <filename
|
||
role="package">security/vuxml</filename>. Поэтому полное имя
|
||
пути к файлу будет
|
||
<filename><envar>PORTSDIR</envar>/security/vuxml/vuln.xml</filename>.
|
||
Каждый раз, при обнаружении вами в порте уязвимости безопасности
|
||
добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML,
|
||
лучшее, что вы можете сделать, это найти существующую запись,
|
||
подпадающую под ваш случай, затем скопировать ее и использовать
|
||
в качестве шаблона.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="security-notify-vuxml-intro">
|
||
<title>Короткое вступление в VuXML</title>
|
||
|
||
<para>В совокупности XML является очень сложным форматом, и его
|
||
описание выходит далеко за рамки
|
||
этой книги. Тем не менее, для достижения основного понимания
|
||
структуры записи VuXML вам понадобится всего лишь понять теги.
|
||
Имена тегов XML обрамляются в угловые скобки. Каждый открывающий
|
||
<тег> должен иметь совпадающий закрывающий </tag>.
|
||
Теги могут быть вложенными. При вложенности внутренние теги
|
||
должны быть закрыты до закрытия внешних. Существует иерархия
|
||
тегов, т.е. более сложные правила вкладывания тегов. Очень
|
||
похоже на HTML, правда? Основное отличие в расширяемости XML,
|
||
т.е. определении собственных тегов. Из-за своей характерной
|
||
структуры XML придает форму разрозненным данным. В частности,
|
||
XML подходит для разметки описаний уязвимостей безопасности.</para>
|
||
|
||
<para>Теперь давайте возьмем настоящую запись VuXML:</para>
|
||
|
||
<programlisting><vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <co id="co-vx-vid"/>
|
||
<topic>Several vulnerabilities found in Foo</topic> <co id="co-vx-top"/>
|
||
<affects>
|
||
<package>
|
||
<name>foo</name> <co id="co-vx-nam"/>
|
||
<name>foo-devel</name>
|
||
<name>ja-foo</name>
|
||
<range><ge>1.6</ge><lt>1.9</lt></range> <co 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 id="co-vx-nm2"/>
|
||
<range><lt>1.10_7</lt></range> <co 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 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 id="co-vx-ref"/>
|
||
<freebsdsa>SA-10:75.foo</freebsdsa> <co id="co-vx-fsa"/>
|
||
<freebsdpr>ports/987654</freebsdpr> <co id="co-vx-fpr"/>
|
||
<cvename>CAN-2010-0201</cvename> <co id="co-vx-cve"/>
|
||
<cvename>CAN-2010-0466</cvename>
|
||
<bid>96298</bid> <co id="co-vx-bid"/>
|
||
<certsa>CA-2010-99</certsa> <co id="co-vx-cts"/>
|
||
<certvu>740169</certvu> <co id="co-vx-ctv"/>
|
||
<uscertsa>SA10-99A</uscertsa> <co id="co-vx-ucs"/>
|
||
<uscertta>SA10-99A</uscertta> <co id="co-vx-uct"/>
|
||
<mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <co id="co-vx-mls"/>
|
||
<url>http://j.r.hacker.com/advisories/1</url> <co id="co-vx-url"/>
|
||
</references>
|
||
<dates>
|
||
<discovery>2010-05-25</discovery> <co id="co-vx-dsc"/>
|
||
<entry>2010-07-13</entry> <co id="co-vx-ent"/>
|
||
<modified>2010-09-17</modified> <co 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>Диапазоны версий должны учитывать
|
||
<makevar>PORTEPOCH</makevar> и <makevar>PORTREVISION</makevar>,
|
||
если это применимо. Пожалуйста, помните, что в соответствии
|
||
с правилами сравнения строк версия с ненулевым значением
|
||
<makevar>PORTEPOCH</makevar> выше, чем любая версия без
|
||
<makevar>PORTEPOCH</makevar>, например, <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>Это
|
||
<ulink url="http://www.freebsd.org/security/#adv">бюллетень
|
||
безопасности FreeBSD</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-fpr">
|
||
<para>Это
|
||
<ulink url="http://www.freebsd.org/support.html#gnats">сообщение
|
||
об ошибке FreeBSD</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-cve">
|
||
<para>Идентификатор
|
||
<ulink url="http://www.cve.mitre.org/">MITRE
|
||
CVE</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-bid">
|
||
<para>Это
|
||
<ulink url="http://www.securityfocus.com/bid">SecurityFocus
|
||
Bug ID</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-cts">
|
||
<para>Бюллетень безопасности
|
||
<ulink url="http://www.cert.org/">US-CERT</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-ctv">
|
||
<para>Примечание к уязвимости
|
||
<ulink url="http://www.cert.org/">US-CERT</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-ucs">
|
||
<para>Уведомление системы Cyber Security Alert
|
||
<ulink url="http://www.cert.org/">US-CERT</ulink>.</para>
|
||
</callout>
|
||
|
||
<callout arearefs="co-vx-uct">
|
||
<para>Уведомление системы Technical Cyber Security Alert
|
||
<ulink url="http://www.cert.org/">US-CERT</ulink>.</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 id="security-notify-vuxml-testing">
|
||
<title>Тестирование ваших изменений в базе данных VuXML</title>
|
||
|
||
<para>Предположим, что вы только что написали или заполнили запись
|
||
об уязвимости в пакете <literal>clamav</literal>, которая была
|
||
исправлена в версии <literal>0.65_7</literal>.</para>
|
||
|
||
<para>Прежде всего, вам нужно <emphasis>установить</emphasis>
|
||
последние версии портов
|
||
<filename role="package">ports-mgmt/portaudit</filename>,
|
||
<filename role="package">ports-mgmt/portaudit-db</filename> и
|
||
<filename role="package">security/vuxml</filename>.</para>
|
||
|
||
<note>
|
||
<para>Для запуска <command>packaudit</command> вы должны обладать
|
||
правами на запись в
|
||
<filename><makevar>DATABASEDIR</makevar></filename>; как правило,
|
||
это <filename>/var/db/portaudit</filename>.</para>
|
||
|
||
<para>Для использования другого каталога присвойте переменной
|
||
окружения <filename><makevar>DATABASEDIR</makevar></filename>
|
||
другой путь.</para>
|
||
|
||
<para>Если вы работаете в каталоге, отличном от
|
||
<filename>${PORTSDIR}/security/vuxml</filename>, присвойте
|
||
переменной окружения
|
||
<filename><makevar>VUXMLDIR</makevar></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>Вам понадобится установить по крайней мере один из следующих
|
||
пакетов: <filename role="package">textproc/libxml2</filename>,
|
||
<filename role="package">textproc/jade</filename>.</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 <replaceable>uuid</replaceable></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>
|
||
|
||
<chapter id="porting-dads">
|
||
<title>Что делать нужно, и что делать нельзя</title>
|
||
|
||
<sect1 id="dads-intro">
|
||
<title>Введение</title>
|
||
|
||
<para>Вот список часто встречающихся действий, которые нужно и которые
|
||
нельзя делать во время процесса портирования. Вы должны проверять ваш
|
||
порт по этому списку, и вы также можете проверять порты в <ulink
|
||
url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе
|
||
сообщений PR</ulink>, которые присланы другими людьми. Присылайте
|
||
любые комментарии о портах, которые вы проверили, так, как это описано
|
||
в статье о <ulink
|
||
url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">
|
||
Сообщениях об ошибках и общих замечаниях</ulink>. Проверка портов в
|
||
базе сообщений PR позволит нам быстрее коммиттить их и удостовериться,
|
||
что вы знаете, что делаете.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-wrkdir">
|
||
<title><makevar>WRKDIR</makevar></title>
|
||
|
||
<para>Не пишите ничего в файлы вне каталога <makevar>WRKDIR</makevar>.
|
||
Каталог <makevar>WRKDIR</makevar> является единственным местом,
|
||
которое гарантированно будет доступно для записи во время построения
|
||
порта (обратитесь к главе о <ulink
|
||
url="&url.books.handbook;/ports-using.html#PORTS-CD">установке портов с
|
||
CDROM</ulink> за
|
||
примером построения портов из дерева, доступного только для чтения).
|
||
Если вам нужно изменить какой-либо из файлов
|
||
<filename>pkg-<replaceable>*</replaceable></filename>, сделайте это,
|
||
<link linkend="porting-pkgfiles">переопределив переменную</link>, но не
|
||
перезаписывая их.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-wrkdirprefix">
|
||
<title><makevar>WRKDIRPREFIX</makevar></title>
|
||
|
||
<para>Добейтесь того, чтобы ваш порт принимал во внимание значение
|
||
переменной <makevar>WRKDIRPREFIX</makevar>. Большинство портов об
|
||
этом не заботятся. В частности, если вы обращаетесь к каталогу
|
||
<makevar>WRKDIR</makevar> другого порта, заметьте, что его правильным
|
||
местоположением является
|
||
<filename><makevar>WRKDIRPREFIX</makevar><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> not <filename><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/work</filename>
|
||
или <filename><makevar>.CURDIR</makevar>/../../<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename>
|
||
или что-то подобное.</para>
|
||
|
||
<para>Кроме того, если вы сами задаете <makevar>WRKDIR</makevar>, то
|
||
должны поставить перед ним знак
|
||
<literal>${WRKDIRPREFIX}${.CURDIR}</literal>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="porting-versions">
|
||
<title>Различение операционных систем и версий ОС</title>
|
||
|
||
<para>Вы можете встретиться с кодом, который требует модификаций
|
||
или условной компиляции в зависимости от того, с какой версией
|
||
Unix он работает. Если вам нужно сделать такие изменения в коде для
|
||
условной компиляции, то вы должны делать изменения как можно
|
||
более общими, чтобы мы могли перенести код на более старые системы
|
||
FreeBSD, а также и на другие системы BSD, такие, как 4.4BSD от CSRG,
|
||
BSD/386, 386BSD, NetBSD, и OpenBSD.</para>
|
||
|
||
<para>Предпочтительным способом отделения кода для 4.3BSD/Reno (1990) и
|
||
и более новых версий BSD является использование макроса
|
||
<literal>BSD</literal>, определенного в файле <ulink
|
||
url="http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup">sys/param.h</ulink>.
|
||
Хорошо, если этот файл уже
|
||
включен; если это не так, то добавьте такой код:</para>
|
||
|
||
<programlisting>
|
||
#if (defined(__unix__) || defined(unix)) && !defined(USG)
|
||
#include <sys/param.h>
|
||
#endif
|
||
</programlisting>
|
||
|
||
<para>в соответствующем месте файла <filename>.c</filename>. Мы
|
||
надеемся, что все системы, в которых определены эти две константы,
|
||
имеют файл <filename>sys/param.h</filename>. Если вы обнаружите
|
||
систему, в которой это не так, мы хотим знать. Пошлите, пожалуйста,
|
||
письмо на адрес &a.ports;.</para>
|
||
|
||
<para>Другим способом является использование для этого стиля GNU
|
||
Autoconf:</para>
|
||
|
||
<programlisting>
|
||
#ifdef HAVE_SYS_PARAM_H
|
||
#include <sys/param.h>
|
||
#endif
|
||
</programlisting>
|
||
|
||
<para>Не забудьте добавить <literal>-DHAVE_SYS_PARAM_H</literal> к
|
||
<makevar>CFLAGS</makevar> в файле <filename>Makefile</filename>
|
||
при использовании этого метода.</para>
|
||
|
||
<para>Как только вы включите <filename>sys/param.h</filename>, то
|
||
сможете воспользоваться следующим:</para>
|
||
|
||
<programlisting>
|
||
#if (defined(BSD) && (BSD >= 199103))
|
||
</programlisting>
|
||
|
||
<para>для определения того, компилируется ли программа на основе кода
|
||
Net2 версии 4.3 или более новой версии (например, FreeBSD 1.x,
|
||
4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 и ниже).</para>
|
||
|
||
<para>Используйте:</para>
|
||
|
||
<programlisting>
|
||
#if (defined(BSD) && (BSD >= 199306))
|
||
</programlisting>
|
||
|
||
<para>для определения того, компилируется ли программа на основе кода
|
||
4.4 или более новой (например, FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386
|
||
2.0 и выше).</para>
|
||
|
||
<para>Значение макроса <literal>BSD</literal> равно
|
||
<literal>199506</literal> для кода на основе 4.4BSD-Lite2. Оно
|
||
задано только для информационной целей. Оно не должно использоваться
|
||
для различия между версиями FreeBSD, основанными на коде 4.4-Lite
|
||
и версиями, в которые включены изменения из 4.4-Lite2. Вместо этого
|
||
нужно использовать макрос <literal>__FreeBSD__</literal>.</para>
|
||
|
||
<para>Реже используйте:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><literal>__FreeBSD__</literal> определён во всех версиях
|
||
FreeBSD. Используйте его, если изменение, вносимое вами,
|
||
касается <emphasis>только</emphasis> FreeBSD. Проблемы
|
||
портирования, такие, как использование
|
||
<literal>sys_errlist[]</literal> или
|
||
<function>strerror()</function> являются особенностями систем
|
||
BSD, а не FreeBSD.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Во FreeBSD 2.x, значение <literal>__FreeBSD__</literal>
|
||
определено как <literal>2</literal>. В более ранних версиях оно
|
||
равно <literal>1</literal>. В более поздних версиях это значение
|
||
всегда увеличивается в соответствии со старшим номером версии
|
||
системы.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если вам нужно отделить системы FreeBSD 1.x от систем FreeBSD
|
||
2.x и более старших, правильным способом, как правило, будет
|
||
использование макроса <literal>BSD</literal>, описанное выше.
|
||
Если это действительно изменение, специфичное для FreeBSD
|
||
(например, особая опция для динамической библиотеки при
|
||
использовании <command>ld</command>), то для распознавания
|
||
систем FreeBSD 2.x и более поздних нормальным будет использование
|
||
<literal>__FreeBSD__</literal> и
|
||
<literal>#if __FreeBSD__ > 1</literal>. Если вам нужно более
|
||
точное определение версий FreeBSD, начиная с 2.0-RELEASE, то
|
||
вы можете использовать следующее:</para>
|
||
|
||
<programlisting>
|
||
#if __FreeBSD__ >= 2
|
||
#include <osreldate.h>
|
||
# if __FreeBSD_version >= 199504
|
||
/* 2.0.5+ release specific code here */
|
||
# endif
|
||
#endif
|
||
</programlisting>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Из сотен уже сделанных портов только в одном или двух случаях
|
||
потребовалось использование <literal>__FreeBSD__</literal>. Если
|
||
старые порты использовали этот макрос не по назначению, вовсе не
|
||
значит, что вам нужно поступать точно также.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="freebsd-versions">
|
||
<title>Значения <literal>__FreeBSD_version</literal></title>
|
||
|
||
<para>Ниже для справки приводится перечень значений
|
||
<literal>__FreeBSD_version</literal> в виде, который определён в
|
||
<ulink
|
||
url="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</ulink>:</para>
|
||
|
||
<table frame="none">
|
||
<title>Значения <literal>__FreeBSD_version</literal></title>
|
||
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry>Значение</entry>
|
||
<entry>Дата</entry>
|
||
<entry>Релиз</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>119411</entry>
|
||
<entry></entry>
|
||
<entry>2.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199501, 199503</entry>
|
||
<entry>19 марта 1995</entry>
|
||
<entry>2.1-CURRENT</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199504</entry>
|
||
<entry>9 апреля 1995</entry>
|
||
<entry>2.0.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199508</entry>
|
||
<entry>26 августа 1995</entry>
|
||
<entry>2.2-CURRENT до выхода 2.1</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199511</entry>
|
||
<entry>10 ноября 1995</entry>
|
||
<entry>2.1.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199512</entry>
|
||
<entry>10 ноября 1995</entry>
|
||
<entry>2.2-CURRENT до выхода 2.1.5</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199607</entry>
|
||
<entry>10 июля 1996</entry>
|
||
<entry>2.1.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199608</entry>
|
||
<entry>12 июля 1996</entry>
|
||
<entry>2.2-CURRENT до выхода 2.1.6</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199612</entry>
|
||
<entry>15 ноября 1996</entry>
|
||
<entry>2.1.6-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>199612</entry>
|
||
<entry></entry>
|
||
<entry>2.1.7-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>220000</entry>
|
||
<entry>19 февраля 1997</entry>
|
||
<entry>2.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>(без изменений)</entry>
|
||
<entry></entry>
|
||
<entry>2.2.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>(без изменений)</entry>
|
||
<entry></entry>
|
||
<entry>2.2-STABLE после выхода 2.2.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>221001</entry>
|
||
<entry>15 апреля 1997</entry>
|
||
<entry>2.2-STABLE после включения texinfo-3.9</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>221002</entry>
|
||
<entry>30 апреля 1997</entry>
|
||
<entry>2.2-STABLE после включения top</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>222000</entry>
|
||
<entry>16 мая 1997</entry>
|
||
<entry>2.2.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>222001</entry>
|
||
<entry>19 мая 1997</entry>
|
||
<entry>2.2-STABLE после выхода 2.2.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>225000</entry>
|
||
<entry>2 октября 1997</entry>
|
||
<entry>2.2.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>225001</entry>
|
||
<entry>20 ноября 1997</entry>
|
||
<entry>2.2-STABLE после выхода 2.2.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>225002</entry>
|
||
<entry>27 декабря 1997</entry>
|
||
<entry>2.2-STABLE после появления ldconfig -R</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>226000</entry>
|
||
<entry>24 марта 1998</entry>
|
||
<entry>2.2.6-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>227000</entry>
|
||
<entry>21 июля 1998</entry>
|
||
<entry>2.2.7-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>227001</entry>
|
||
<entry>21 июля 1998</entry>
|
||
<entry>2.2-STABLE после выхода 2.2.7-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>227002</entry>
|
||
<entry>19 сентября 1998</entry>
|
||
<entry>2.2-STABLE после изменения в &man.semctl.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>228000</entry>
|
||
<entry>29 ноября 1998</entry>
|
||
<entry>2.2.8-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>228001</entry>
|
||
<entry>29 ноября 1998</entry>
|
||
<entry>2.2-STABLE после выхода 2.2.8-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300000</entry>
|
||
<entry>19 февраля 1996</entry>
|
||
<entry>3.0-CURRENT до изменения в &man.mount.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300001</entry>
|
||
<entry>24 сентября 1997</entry>
|
||
<entry>3.0-CURRENT после изменения в &man.mount.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300002</entry>
|
||
<entry>2 июня 1998</entry>
|
||
<entry>3.0-CURRENT после изменения в &man.semctl.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300003</entry>
|
||
<entry>7 июня 1998</entry>
|
||
<entry>3.0-CURRENT после изменений в аргументах ioctl</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300004</entry>
|
||
<entry>3 сентября 1998</entry>
|
||
<entry>3.0-CURRENT после перехода на формат ELF</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300005</entry>
|
||
<entry>16 октября 1998</entry>
|
||
<entry>3.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300006</entry>
|
||
<entry>16 октября 1998</entry>
|
||
<entry>3.0-CURRENT после выхода 3.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>300007</entry>
|
||
<entry>22 января 1999</entry>
|
||
<entry>3.0-STABLE после разбиения на ветки 3/4</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>310000</entry>
|
||
<entry>9 февраля 1999</entry>
|
||
<entry>3.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>310001</entry>
|
||
<entry>27 марта 1999</entry>
|
||
<entry>3.1-STABLE после выхода 3.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>310002</entry>
|
||
<entry>14 апреля 1999</entry>
|
||
<entry>3.1-STABLE после изменения в порядке следования
|
||
конструкторов/деструкторов в C++</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>320000</entry>
|
||
<entry></entry>
|
||
<entry>3.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>320001</entry>
|
||
<entry>8 мая 1999</entry>
|
||
<entry>3.2-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>320002</entry>
|
||
<entry>29 августа 1999</entry>
|
||
<entry>3.2-STABLE после несовместимых изменений в IPFW и
|
||
сокетах</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>330000</entry>
|
||
<entry>2 сентября 1999</entry>
|
||
<entry>3.3-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>330001</entry>
|
||
<entry>16 сентября 1999</entry>
|
||
<entry>3.3-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>330002</entry>
|
||
<entry>24 ноября 1999</entry>
|
||
<entry>3.3-STABLE после добавления &man.mkstemp.3; в libc</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>340000</entry>
|
||
<entry>5 декабря 1999</entry>
|
||
<entry>3.4-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>340001</entry>
|
||
<entry>17 декабря 1999</entry>
|
||
<entry>3.4-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>350000</entry>
|
||
<entry>20 июня 2000</entry>
|
||
<entry>3.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>350001</entry>
|
||
<entry>12 июля 2000</entry>
|
||
<entry>3.5-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400000</entry>
|
||
<entry>22 января 1999</entry>
|
||
<entry>4.0-CURRENT после появления ветки 3.4</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400001</entry>
|
||
<entry>20 февраля 1999</entry>
|
||
<entry>4.0-CURRENT после изменения в работе динамического
|
||
компоновщика</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400002</entry>
|
||
<entry>13 марта 1999</entry>
|
||
<entry>4.0-CURRENT после изменения в порядке следования
|
||
конструкторов/деструкторов в C++</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400003</entry>
|
||
<entry>27 марта 1999</entry>
|
||
<entry>4.0-CURRENT после появления функции &man.dladdr.3;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400004</entry>
|
||
<entry>5 апреля 1999</entry>
|
||
<entry>4.0-CURRENT после исправления ошибки в работе функции
|
||
__deregister_frame_info динамического компоновщика (а также
|
||
4.0-CURRENT после интеграции EGCS 1.1.2)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400005</entry>
|
||
<entry>27 апреля 1999</entry>
|
||
<entry>4.0-CURRENT после изменения интерфейса функции
|
||
&man.suser.9; (а также 4.0-CURRENT после появления
|
||
newbus)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400006</entry>
|
||
<entry>31 мая 1999</entry>
|
||
<entry>4.0-CURRENT после изменения в регистрации cdevsw</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400007</entry>
|
||
<entry>17 июня 1999</entry>
|
||
<entry>4.0-CURRENT после добавления so_cred в проверки на
|
||
уровне сокетов</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400008</entry>
|
||
<entry>20 июня 1999</entry>
|
||
<entry>4.0-CURRENT после добавления обработчика системного
|
||
вызова poll в libc_r</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400009</entry>
|
||
<entry>20 июля 1999</entry>
|
||
<entry>4.0-CURRENT после перехода в ядре с типа
|
||
<literal>dev_t</literal> на указатель
|
||
<literal>struct specinfo</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400010</entry>
|
||
<entry>25 сентября 1999</entry>
|
||
<entry>4.0-CURRENT после исправления дыры в безопасности
|
||
&man.jail.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400011</entry>
|
||
<entry>29 сентября 1999</entry>
|
||
<entry>4.0-CURRENT после изменения в типе данных
|
||
<literal>sigset_t</literal></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400012</entry>
|
||
<entry>15 ноября 1999</entry>
|
||
<entry>4.0-CURRENT после перехода на компилятор
|
||
GCC 2.95.2</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400013</entry>
|
||
<entry>4 декабря 1999</entry>
|
||
<entry>4.0-CURRENT после появления добавляемых обработчиков
|
||
ioctl режима linux</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400014</entry>
|
||
<entry>18 января 2000</entry>
|
||
<entry>4.0-CURRENT после заимствования OpenSSL</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400015</entry>
|
||
<entry>27 января 2000</entry>
|
||
<entry>4.0-CURRENT после изменения в C++ ABI компилятора
|
||
GCC 2.95.2 по умолчанию с -fvtable-thunks на
|
||
-fno-vtable-thunks</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400016</entry>
|
||
<entry>27 февраля 2000</entry>
|
||
<entry>4.0-CURRENT после заимствования OpenSSH</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400017</entry>
|
||
<entry>13 марта 2000</entry>
|
||
<entry>4.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400018</entry>
|
||
<entry>17 марта 2000</entry>
|
||
<entry>4.0-STABLE после появления 4.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400019</entry>
|
||
<entry>5 мая 2000</entry>
|
||
<entry>4.0-STABLE после появления отложенных контрольных
|
||
сумм.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400020</entry>
|
||
<entry>4 июня 2000</entry>
|
||
<entry>4.0-STABLE после интеграции кода библиотеки
|
||
libxpg4 в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>400021</entry>
|
||
<entry>8 июля 2000</entry>
|
||
<entry>4.0-STABLE после обновления пакета Binutils до версии
|
||
2.10.0, изменения в схеме пометки выполнимых файлов ELF и
|
||
включения tcsh в качестве базового компонента.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>410000</entry>
|
||
<entry>14 июля 2000</entry>
|
||
<entry>4.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>410001</entry>
|
||
<entry>29 июля 2000</entry>
|
||
<entry>4.1-STABLE после выхода 4.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>410002</entry>
|
||
<entry>16 сентября 2000</entry>
|
||
<entry>4.1-STABLE после переноса функции &man.setproctitle.3; из
|
||
библиотеки libutil в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>411000</entry>
|
||
<entry>25 сентября 2000</entry>
|
||
<entry>4.1.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>411001</entry>
|
||
<entry></entry>
|
||
<entry>4.1.1-STABLE после выхода 4.1.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>420000</entry>
|
||
<entry>31 октября 2000</entry>
|
||
<entry>4.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>420001</entry>
|
||
<entry>10 января 2001</entry>
|
||
<entry>4.2-STABLE после объединения libgcc.a и libgcc_r.a,
|
||
а также соответствующих изменений в компоновке
|
||
GCC.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>430000</entry>
|
||
<entry>6 марта 2001</entry>
|
||
<entry>4.3-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>430001</entry>
|
||
<entry>18 мая 2001</entry>
|
||
<entry>4.3-STABLE после появления wint_t.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>430002</entry>
|
||
<entry>22 июля 2001</entry>
|
||
<entry>4.3-STABLE после добавления API состояния электропитания
|
||
PCI.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>440000</entry>
|
||
<entry>1 августа 2001</entry>
|
||
<entry>4.4-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>440001</entry>
|
||
<entry>23 октября 2001</entry>
|
||
<entry>4.4-STABLE после добавления d_thread_t.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>440002</entry>
|
||
<entry>4 ноября 2001</entry>
|
||
<entry>4.4-STABLE после изменений в структуру для монтирования
|
||
(это затрагивает KLD файловых систем).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>440003</entry>
|
||
<entry>18 декабря 2001</entry>
|
||
<entry>4.4-STABLE после импорта пользовательских
|
||
компонент smbfs.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>450000</entry>
|
||
<entry>20 декабря 2001</entry>
|
||
<entry>4.5-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>450001</entry>
|
||
<entry>24 февраля 2002</entry>
|
||
<entry>4.5-STABLE после переименования элементов структур
|
||
usb</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>450004</entry>
|
||
<entry>16 апреля 2002</entry>
|
||
<entry>4.5-STABLE после того, как переменная &man.rc.conf.5;
|
||
<literal>sendmail_enable</literal> стала обрабатывать значение
|
||
<literal>NONE</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>450005</entry>
|
||
<entry>27 апреля 2002</entry>
|
||
<entry>4.5-STABLE после переключения на использование по
|
||
умолчанию при построении пакетов XFree86 4.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>450006</entry>
|
||
<entry>1 мая 2002</entry>
|
||
<entry>4.5-STABLE после того, как сетевой фильтр для этапа
|
||
подтверждения соединения был исправлен таким образом, что
|
||
он больше не подвержен простым DoS-атакам.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460000</entry>
|
||
<entry>21 июня 2002</entry>
|
||
<entry>4.6-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460001</entry>
|
||
<entry>21 июня 2002</entry>
|
||
<entry>Справочная страница по &man.sendfile.2; в 4.6-STABLE
|
||
приведена в соответствие с документацией, никакие заголовки не
|
||
сравниваются с количеством данных, посланных из файла.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460002</entry>
|
||
<entry>19 июля 2002</entry>
|
||
<entry>4.6.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460100</entry>
|
||
<entry>26 июня 2002</entry>
|
||
<entry>4.6-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460101</entry>
|
||
<entry>26 июня 2002</entry>
|
||
<entry>4.6-STABLE после переноса из -CURRENT
|
||
функциональности `sed -i'.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>460102</entry>
|
||
<entry>1 сентября 2002</entry>
|
||
<entry>4.6-STABLE после MFC многих новых возможностей pkg_install
|
||
из ветки HEAD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>470000</entry>
|
||
<entry>8 октября 2002</entry>
|
||
<entry>4.7-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>470100</entry>
|
||
<entry>9 октября 2002</entry>
|
||
<entry>4.7-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>470101</entry>
|
||
<entry>10 ноября 2002</entry>
|
||
<entry>Начало генерации ссылок __std{in,out,err}p вместо __sF.
|
||
Это переносит вычисление выражений в std{in,out,err} с момента
|
||
компиляции на время выполнения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>470102</entry>
|
||
<entry>23 января 2003</entry>
|
||
<entry>4.7-STABLE после MFC изменений в mbuf для замены
|
||
m_aux mbufs на m_tag's</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>470103</entry>
|
||
<entry>14 февраля 2003</entry>
|
||
<entry>В 4.7-STABLE появляется OpenSSL 0.9.7</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>480000</entry>
|
||
<entry>30 марта 2003</entry>
|
||
<entry>4.8-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>480100</entry>
|
||
<entry>5 апреля 2003</entry>
|
||
<entry>4.8-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>480101</entry>
|
||
<entry>22 мая 2003</entry>
|
||
<entry>4.8-STABLE после того, как функция &man.realpath.3; была
|
||
сделана совместимой с потоками выполнения</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>480102</entry>
|
||
<entry>10 августа 2003</entry>
|
||
<entry>4.8-STABLE после изменений 3ware API в twe.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>490000</entry>
|
||
<entry>27 октября 2003</entry>
|
||
<entry>4.9-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>490100</entry>
|
||
<entry>27 октября 2003</entry>
|
||
<entry>4.9-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>490101</entry>
|
||
<entry>8 января 2004</entry>
|
||
<entry>4.9-STABLE после добавления e_sid в структуру
|
||
kinfo_eproc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>490102</entry>
|
||
<entry>4 февраля 2004</entry>
|
||
<entry>4.9-STABLE после выполнения MFC функциональности libmap
|
||
для rtld.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>491000</entry>
|
||
<entry>25 мая 2004</entry>
|
||
<entry>4.10-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>491100</entry>
|
||
<entry>1 июня 2004</entry>
|
||
<entry>4.10-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>491101</entry>
|
||
<entry>11 августа 2004</entry>
|
||
<entry>4.10-STABLE после выполнения MFC ревизии 20040629
|
||
пакетного инструментария</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>491102</entry>
|
||
<entry>16 ноября 2004</entry>
|
||
<entry>4.10-STABLE после исправления ошибки в VM при
|
||
отвязывании (unwire) фиктивных страниц</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>492000</entry>
|
||
<entry>17 декабря 2004</entry>
|
||
<entry>4.11-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>492100</entry>
|
||
<entry>17 декабря 2004</entry>
|
||
<entry>4.11-STABLE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>492101</entry>
|
||
<entry>18 апреля 2006</entry>
|
||
<entry>4.11-STABLE после добавления каталогов
|
||
libdata/ldconfig в файлы mtree.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500000</entry>
|
||
<entry>13 марта 2000</entry>
|
||
<entry>5.0-CURRENT</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500001</entry>
|
||
<entry>18 апреля 2000</entry>
|
||
<entry>5.0-CURRENT после добавления дополнительных полей в
|
||
заголовке ELF и изменения метода пометки принадлежности
|
||
к определённой системе для выполнимых файлов в формате
|
||
ELF.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500002</entry>
|
||
<entry>2 мая 2000</entry>
|
||
<entry>5.0-CURRENT после изменений в метаданных kld.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500003</entry>
|
||
<entry>18 мая 2000</entry>
|
||
<entry>5.0-CURRENT после изменений buf/bio.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500004</entry>
|
||
<entry>26 мая 2000</entry>
|
||
<entry>5.0-CURRENT после обновления binutils.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500005</entry>
|
||
<entry>3 июня 2000</entry>
|
||
<entry>5.0-CURRENT после интеграции кода библиотеки libxpg4 в
|
||
libc и появления интерфейса TASKQ.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500006</entry>
|
||
<entry>10 июня 2000</entry>
|
||
<entry>5.0-CURRENT после добавления интерфейсов AGP.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500007</entry>
|
||
<entry>29 июня 2000</entry>
|
||
<entry>5.0-CURRENT после обновления Perl до версии 5.6.0</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500008</entry>
|
||
<entry>7 июля 2000</entry>
|
||
<entry>5.0-CURRENT после обновления кода KAME до версии
|
||
2000/07.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500009</entry>
|
||
<entry>14 июля 2000</entry>
|
||
<entry>5.0-CURRENT после изменений в ether_ifattach() и
|
||
ether_ifdetach().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500010</entry>
|
||
<entry>16 июля 2000</entry>
|
||
<entry>5.0-CURRENT после возврата в настройках утилиты mtree,
|
||
применяемых по умолчанию, обратно к оригинальным и добавления
|
||
флага -L для перехода по символическим ссылкам.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500011</entry>
|
||
<entry>18 июля 2000</entry>
|
||
<entry>5.0-CURRENT после изменения в API для kqueue.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500012</entry>
|
||
<entry>2 сентября 2000</entry>
|
||
<entry>5.0-CURRENT после перемещения &man.setproctitle.3; из
|
||
библиотеки libutil в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500013</entry>
|
||
<entry>10 сентября 2000</entry>
|
||
<entry>5.0-CURRENT после первого коммита SMPng.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500014</entry>
|
||
<entry>4 января 2001</entry>
|
||
<entry>5.0-CURRENT после переноса <sys/select.h> в
|
||
<sys/selinfo.h>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500015</entry>
|
||
<entry>10 января 2001</entry>
|
||
<entry>5.0-CURRENT после объединения libgcc.a и
|
||
libgcc_r.a, а также соответствующих изменений в
|
||
компоновке GCC.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500016</entry>
|
||
<entry>24 января 2001</entry>
|
||
<entry>5.0-CURRENT после изменения, позволяющего libc и
|
||
libc_r быть скомпонованными вместе, что делает параметр
|
||
-pthread ненужным.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500017</entry>
|
||
<entry>18 февраля 2001</entry>
|
||
<entry>5.0-CURRENT после перехода на использование
|
||
struct xucred вместо struct ucred для стабилизации
|
||
экспортируемого API ядра для mountd и т.д.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500018</entry>
|
||
<entry>24 февраля 2001</entry>
|
||
<entry>5.0-CURRENT после добавления переменной make
|
||
CPUTYPE позволяющей контролировать специфичные
|
||
для CPU оптимизации.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500019</entry>
|
||
<entry>9 июня 2001</entry>
|
||
<entry>5.0-CURRENT после переноса machine/ioctl_fd.h в
|
||
sys/fdcio.h</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500020</entry>
|
||
<entry>15 июня 2001</entry>
|
||
<entry>5.0-CURRENT после изменения имен для локализации.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500021</entry>
|
||
<entry>22 июня 2001</entry>
|
||
<entry>5.0-CURRENT после импорта Bzip2. Также означает
|
||
удаление S/Key.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500022</entry>
|
||
<entry>12 июля 2001</entry>
|
||
<entry>5.0-CURRENT с поддержкой SSE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500023</entry>
|
||
<entry>14 сентября 2001</entry>
|
||
<entry>5.0-CURRENT после KSE Этап 2.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500024</entry>
|
||
<entry>1 октября 2001</entry>
|
||
<entry>5.0-CURRENT после d_thread_t и переноса UUCP в
|
||
порты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500025</entry>
|
||
<entry>4 октября 2001</entry>
|
||
<entry>5.0-CURRENT после изменения ABI из-за переноса передачи
|
||
дескриптора и прав на 64-разрядные платформы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500026</entry>
|
||
<entry>9 октября 2001</entry>
|
||
<entry>5.0-CURRENT после перехода на использование по умолчанию
|
||
XFree86 4 для построения пакетов и после добавления в
|
||
библиотеку libc новой функции strnstr().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500027</entry>
|
||
<entry>10 октября 2001</entry>
|
||
<entry>5.0-CURRENT после добавления в библиотеку libc новой
|
||
функции strcasestr().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500028</entry>
|
||
<entry>14 декабря 2001</entry>
|
||
<entry>5.0-CURRENT после импорта пользовательских
|
||
компонент smbfs.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>(Значение не изменено)</entry>
|
||
<entry></entry>
|
||
<entry>5.0-CURRENT после добавления новых специфических для
|
||
C99 целочисленных типов.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500029</entry>
|
||
<entry>29 января 2002</entry>
|
||
<entry>5.0-CURRENT после изменения возвращаемого функцией
|
||
&man.sendfile.2; значения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500030</entry>
|
||
<entry>15 февраля 2002</entry>
|
||
<entry>5.0-CURRENT после добавления нового типа
|
||
<literal>fflags_t</literal>, соответствующий файловым
|
||
флагам.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500031</entry>
|
||
<entry>24 февраля 2002</entry>
|
||
<entry>5.0-CURRENT после переименования элементов структур
|
||
usb.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500032</entry>
|
||
<entry>16 марта 2002</entry>
|
||
<entry>5.0-CURRENT после обновления Perl до версии 5.6.1</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500033</entry>
|
||
<entry>3 апреля 2002</entry>
|
||
<entry>5.0-CURRENT после того как переменная &man.rc.conf.5;
|
||
<literal>sendmail_enable</literal> стала обрабатывать значение
|
||
<literal>NONE</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500034</entry>
|
||
<entry>30 апреля 2002</entry>
|
||
<entry>5.0-CURRENT после добавления в функцию mtx_init()
|
||
третьего параметра.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500035</entry>
|
||
<entry>13 мая 2002</entry>
|
||
<entry>5.0-CURRENT после импорта Gcc 3.1</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500036</entry>
|
||
<entry>17 мая 2002</entry>
|
||
<entry>5.0-CURRENT после удаления Perl из /usr/src</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500037</entry>
|
||
<entry>29 мая 2002</entry>
|
||
<entry>5.0-CURRENT после добавления функции
|
||
&man.dlfunc.3;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500038</entry>
|
||
<entry>24 июля 2002</entry>
|
||
<entry>5.0-CURRENT после того, как были изменены типы некоторых
|
||
записей в структуре sockbuf, а сама структура была
|
||
реорганизована.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500039</entry>
|
||
<entry>1 сентября 2002</entry>
|
||
<entry>5.0-CURRENT после импорта GCC 3.2.1.
|
||
Также после того, как в файлах заголовков было
|
||
прекращено использование _BSD_FOO_T_ и начато использование
|
||
_FOO_T_DECLARED. Это значение может быть также использовано
|
||
как примерная точка начала поддержки пакетов в формате
|
||
&man.bzip2.1;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500040</entry>
|
||
<entry>20 сентября 2002</entry>
|
||
<entry>5.0-CURRENT после различных изменений в дисковых
|
||
функциях, сделанных для избавления от зависимости от
|
||
внутреннего устройства структуры метки диска.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500041</entry>
|
||
<entry>1 октября 2002</entry>
|
||
<entry>5.0-CURRENT после добавления функции &man.getopt.long.3;
|
||
в библиотеку libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500042</entry>
|
||
<entry>15 октября 2002</entry>
|
||
<entry>5.0-CURRENT после обновления Binutils 2.13, куда
|
||
включена новая эмуляция FreeBSD, vec и формат выдачи.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500043</entry>
|
||
<entry>1 ноября 2002</entry>
|
||
<entry>5.0-CURRENT после добавления простых заглушек pthread_XXX
|
||
к библиотеке libc, что сделало libXThrStub.so ненужной.
|
||
5.0-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500100</entry>
|
||
<entry>17 января 2003</entry>
|
||
<entry>5.0-CURRENT после создания ветки для RELENG_5_0</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500101</entry>
|
||
<entry>19 февраля 2003</entry>
|
||
<entry><sys/dkstat.h> пуст и не должен
|
||
использоваться.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500102</entry>
|
||
<entry>25 февраля 2003</entry>
|
||
<entry>5.0-CURRENT после изменения интерфейса d_mmap_t.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500103</entry>
|
||
<entry>26 февраля 2003</entry>
|
||
<entry>5.0-CURRENT после того, как было внесено изменение,
|
||
при котором taskqueue_swi работает без Giant, и было
|
||
добавлено taskqueue_swi_giant, работающее с Giant.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500104</entry>
|
||
<entry>27 февраля 2003</entry>
|
||
<entry>cdevsw_add() и cdevsw_remove() больше не
|
||
существуют. Появилась технология выделения MAJOR_AUTO.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500105</entry>
|
||
<entry>4 марта 2003</entry>
|
||
<entry>5.0-CURRENT после появления нового метода инициализации
|
||
cdevsw.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500106</entry>
|
||
<entry>8 марта 2003</entry>
|
||
<entry>devstat_add_entry() заменено на
|
||
devstat_new_entry()</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500107</entry>
|
||
<entry>15 марта 2003</entry>
|
||
<entry>Изменение интерфейса devstat смотрите
|
||
sys/sys/param.h 1.149</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500108</entry>
|
||
<entry>15 марта 2003</entry>
|
||
<entry>Изменение в интерфейсе Token-Ring.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500109</entry>
|
||
<entry>25 марта 2003</entry>
|
||
<entry>Добавление vm_paddr_t.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500110</entry>
|
||
<entry>28 марта 2003</entry>
|
||
<entry>5.0-CURRENT после того, как функция &man.realpath.3; была
|
||
сделана совместимой с потоками выполнения</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500111</entry>
|
||
<entry>9 апреля 2003</entry>
|
||
<entry>5.0-CURRENT после того, как функция &man.usbhid.3; была
|
||
приведена в соответствие с NetBSD</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500112</entry>
|
||
<entry>17 апреля 2003</entry>
|
||
<entry>5.0-CURRENT после новой реализации NSS и добавления
|
||
функций POSIX.1 getpw*_r и getgr*_r</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>500113</entry>
|
||
<entry>2 мая 2003</entry>
|
||
<entry>5.0-CURRENT после удаления старой системы rc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501000</entry>
|
||
<entry>4 июня 2004</entry>
|
||
<entry>5.1-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501100</entry>
|
||
<entry>2 июня 2003</entry>
|
||
<entry>5.1-CURRENT после появления ветки RELENG_5_1.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501101</entry>
|
||
<entry>29 июня 2003</entry>
|
||
<entry>5.1-CURRENT после корректировки смысла функций
|
||
sigtimedwait(2) и sigwaitinfo(2).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501102</entry>
|
||
<entry>3 июля 2003</entry>
|
||
<entry>5.1-CURRENT после добавления полей lockfunc и lockfuncarg
|
||
в &man.bus.dma.tag.create.9;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501103</entry>
|
||
<entry>31 июля 2003</entry>
|
||
<entry>5.1-CURRENT после интеграции снэпшота GCC 3.3.1-pre
|
||
20030711.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501104</entry>
|
||
<entry>5 августа 2003</entry>
|
||
<entry>5.1-CURRENT осле изменений 3ware API в twe.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501105</entry>
|
||
<entry>17 августа 2003</entry>
|
||
<entry>Поддержка в 5.1-CURRENT динамически скомпонованных /bin и
|
||
/sbin, перемещение библиотек в /lib.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501106</entry>
|
||
<entry>8 сентября 2003</entry>
|
||
<entry>5.1-CURRENT после добавления в ядро поддержки
|
||
Coda 6.x.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501107</entry>
|
||
<entry>17 сентября 2003</entry>
|
||
<entry>5.1-CURRENT после перемещения констант для 16550 UART из
|
||
файла <filename><dev/sio/sioreg.h></filename> в
|
||
<filename><dev/ic/ns16550.h></filename>. А также момент,
|
||
когда rtld стал поддерживать функциональность libmap в
|
||
безусловном режиме.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501108</entry>
|
||
<entry>23 сентября 2003</entry>
|
||
<entry>5.1-CURRENT после обновления в API PFIL_HOOKS</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501109</entry>
|
||
<entry>27 сентября 2003</entry>
|
||
<entry>5.1-CURRENT после добавления функции kiconv(3)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501110</entry>
|
||
<entry>28 сентября 2003</entry>
|
||
<entry>5.1-CURRENT после изменений операций по умолчанию для
|
||
open и close в cdevsw</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501111</entry>
|
||
<entry>16 октября 2003</entry>
|
||
<entry>5.1-CURRENT после изменений в структуре cdevsw</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501112</entry>
|
||
<entry>16 октября 2003</entry>
|
||
<entry>5.1-CURRENT после добавления множественного наследования
|
||
для kobj</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501113</entry>
|
||
<entry>31 октября 2003</entry>
|
||
<entry>5.1-CURRENT после изменения if_xname в структуре
|
||
ifnet</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>501114</entry>
|
||
<entry>16 ноября 2003</entry>
|
||
<entry>5.1-CURRENT после изменений, связанных с динамической
|
||
компоновкой /bin и /sbin</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502000</entry>
|
||
<entry>7 декабря 2003</entry>
|
||
<entry>5.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502010</entry>
|
||
<entry>23 февраля 2003</entry>
|
||
<entry>5.2.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502100</entry>
|
||
<entry>7 декабря 2003</entry>
|
||
<entry>5.2-CURRENT после отделения ветки RELENG_5_2</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502101</entry>
|
||
<entry>19 декабря 2003</entry>
|
||
<entry>5.2-CURRENT после добавления в libc функций
|
||
__cxa_atexit/__cxa_finalize.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502102</entry>
|
||
<entry>30 января 2004</entry>
|
||
<entry>5.2-CURRENT после смены используемой по умолчанию
|
||
библиотеки работы с потоками выполнения libc_r на
|
||
libpthread.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502103</entry>
|
||
<entry>21 февраля 2004</entry>
|
||
<entry>5.2-CURRENT после большого изменения в API драйверов
|
||
устройств.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502104</entry>
|
||
<entry>25 февраля 2004</entry>
|
||
<entry>5.2-CURRENT после добавления getopt_long_only().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502105</entry>
|
||
<entry>5 марта 2004</entry>
|
||
<entry>5.2-CURRENT после того, как макро-переменная NULL
|
||
была переопределена для языка C как ((void *)0), что привело к
|
||
увеличению количества предупреждений компилятора.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502106</entry>
|
||
<entry>8 марта 2004</entry>
|
||
<entry>5.2-CURRENT после установки и включения pf в процесс
|
||
построения системы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502107</entry>
|
||
<entry>10 марта 2004</entry>
|
||
<entry>5.2-CURRENT после того, как значение time_t на платформе
|
||
sparc64 стало 64-разрядным.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502108</entry>
|
||
<entry>12 марта 2004</entry>
|
||
<entry>5.2-CURRENT после того, как поддержка компилятора
|
||
Intel C/C++ в некоторых заголовочных файлах и execve(2)
|
||
была изменена на более строго соответствующую POSIX.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502109</entry>
|
||
<entry>22 марта 2004</entry>
|
||
<entry>5.2-CURRENT после введения программного интерфейса
|
||
bus_alloc_resource_any</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502110</entry>
|
||
<entry>27 марта 2004</entry>
|
||
<entry>5.2-CURRENT после добавления поддержки локализации
|
||
UTF-8</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502111</entry>
|
||
<entry>11 апреля 2004</entry>
|
||
<entry>5.2-CURRENT после удаления программного интерфейса
|
||
getvfsent(3)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502112</entry>
|
||
<entry>13 апреля 2004</entry>
|
||
<entry>5.2-CURRENT после добавления директивы .warning для
|
||
make.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502113</entry>
|
||
<entry>4 июня 2004</entry>
|
||
<entry>5.2-CURRENT после того, как функция ttyioctl() стала
|
||
обязательной для драйверов последовательных
|
||
устройств.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502114</entry>
|
||
<entry>13 июня 2004</entry>
|
||
<entry>5.2-CURRENT после импорта ALTQ инфраструктуры.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502115</entry>
|
||
<entry>14 июня 2004</entry>
|
||
<entry>5.2-CURRENT после того, как sema_timedwait(9) стал
|
||
возвращать 0 в случае успеха и не нулевой код ошибки в
|
||
случае неудачи.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502116</entry>
|
||
<entry>16 июня 2004</entry>
|
||
<entry>5.2-CURRENT после того, как kernel тип dev_t стал
|
||
указателем на struct cdev *.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502117</entry>
|
||
<entry>17 июня 2004</entry>
|
||
<entry>5.2-CURRENT после того, как kernel тип udev_t изменился на
|
||
dev_t.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502118</entry>
|
||
<entry>17 июня 2004</entry>
|
||
<entry>5.2-CURRENT после добавления поддержки CLOCK_VIRTUAL
|
||
и CLOCK_PROF в clock_gettime(2) и clock_getres(2).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502119</entry>
|
||
<entry>22 июня 2004</entry>
|
||
<entry>5.2-CURRENT после того, как был проведён пересмотр
|
||
клонирования сетевого интерфейса.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502120</entry>
|
||
<entry>2 июля 2004</entry>
|
||
<entry>5.2-CURRENT после обновления пакетного инструментария
|
||
до ревизии 20040629.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502121</entry>
|
||
<entry>9 июля 2004</entry>
|
||
<entry>5.2-CURRENT после отметки, что код Bluetooth не
|
||
ограничен архитектурой i386.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502122</entry>
|
||
<entry>11 июля 2004</entry>
|
||
<entry>5.2-CURRENT после появления отладочной инфраструктуры
|
||
KDB, переноса DDB в бэкэнд и появления бэкэнда GDB.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502123</entry>
|
||
<entry>12 июля 2004</entry>
|
||
<entry>5.2-CURRENT после добавления в VFS_ROOT нового аргумента
|
||
struct thread, так же как это делает vflush. Структура
|
||
kinfo_proc теперь имеет указатель на пользовательские данные.
|
||
Смена реализации X по умолчанию на <literal>xorg</literal>
|
||
было сделано в это же время.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502124</entry>
|
||
<entry>24 июля 2004</entry>
|
||
<entry>5.2-CURRENT после разделения способов запуска скриптов
|
||
rc.d из портов и имеющих статус legacy.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502125</entry>
|
||
<entry>28 июля 2004</entry>
|
||
<entry>5.2-CURRENT после отмены предыдущего
|
||
изменения.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502126</entry>
|
||
<entry>31 июля 2004</entry>
|
||
<entry>5.2-CURRENT после удаления
|
||
kmem_alloc_pageable() и импорта gcc 3.4.2.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502127</entry>
|
||
<entry>2 августа 2004</entry>
|
||
<entry>5.2-CURRENT после изменения в API ядра UMA,
|
||
разрешающего конструкторам/инициализаторам
|
||
(ctors/inits) возвращать неудачу.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>502128</entry>
|
||
<entry>8 августа 2004</entry>
|
||
<entry>5.2-CURRENT после изменения в
|
||
сигнатуре vfs_mount, а также после общей замены
|
||
PRISON_ROOT на SUSER_ALLOWJAIL в API suser(9).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503000</entry>
|
||
<entry>23 августа 2004</entry>
|
||
<entry>5.3-BETA/RC перед изменением в pfil API</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503001</entry>
|
||
<entry>22 сентября 2004</entry>
|
||
<entry>5.3-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503100</entry>
|
||
<entry>16 октября 2004</entry>
|
||
<entry>5.3-STABLE после отделения ветки RELENG_5_3</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503101</entry>
|
||
<entry>3 декабря 2004</entry>
|
||
<entry>5.3-STABLE после добавления в функцию
|
||
&man.strftime.3; параметров отступа в стиле glibc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503102</entry>
|
||
<entry>13 февраля 2005</entry>
|
||
<entry>5.3-STABLE после выполнения MFC импорта nc(1)
|
||
из OpenBSD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503103</entry>
|
||
<entry>27 февраля 2005</entry>
|
||
<entry>5.4-PRERELEASE после выполнения MFC исправлений в
|
||
<filename><src/include/stdbool.h></filename> и
|
||
<filename><src/sys/i386/include/_types.h></filename>
|
||
для использования совместимости GCC в компиляторе
|
||
Intel C/C++.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503104</entry>
|
||
<entry>28 февраля 2005</entry>
|
||
<entry>5.4-PRERELEASE после выполнения MFC изменения поля
|
||
ifi_epoch в структуре if_data со времени часов на
|
||
время с момента старта.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>503105</entry>
|
||
<entry>2 марта 2005</entry>
|
||
<entry>5.4-PRERELEASE после выполнения MFC исправления в
|
||
vswprintf(3) проверки на EOVERFLOW.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504000</entry>
|
||
<entry>3 апреля 2005</entry>
|
||
<entry>5.4-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504100</entry>
|
||
<entry>3 апреля 2005</entry>
|
||
<entry>5.4-STABLE после отделения ветки RELENG_5_4</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504101</entry>
|
||
<entry>11 мая 2005</entry>
|
||
<entry>5.4-STABLE после увеличения значения по умолчанию
|
||
размера стеков потока.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504102</entry>
|
||
<entry>24 июня 2005</entry>
|
||
<entry>5.4-STABLE после добавления sha256</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504103</entry>
|
||
<entry>3 октября 2005</entry>
|
||
<entry>5.4-STABLE после выполнения MFC if_bridge</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504104</entry>
|
||
<entry>13 октября 2005</entry>
|
||
<entry>5.4-STABLE после выполнения MFC bsdiff и portsnap</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>504105</entry>
|
||
<entry>17 января 2006</entry>
|
||
<entry>5.4-STABLE после выполнения MFC изменения
|
||
ldconfig_local_dirs.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>505000</entry>
|
||
<entry>12 мая 2006</entry>
|
||
<entry>5.5-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>505100</entry>
|
||
<entry>12 мая 2006</entry>
|
||
<entry>5.5-STABLE после отделения ветки RELENG_5_5</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600000</entry>
|
||
<entry>18 августа 2004</entry>
|
||
<entry>6.0-CURRENT</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600001</entry>
|
||
<entry>27 августа 2004</entry>
|
||
<entry>6.0-CURRENT после постоянного включения
|
||
в ядро PFIL_HOOKS.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600002</entry>
|
||
<entry>30 августа 2004</entry>
|
||
<entry>6.0-CURRENT после первоначального добавления
|
||
ifi_epoch в структуру if_data. Выполнен возврат после
|
||
нескольких дней. Не используйте это значение.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600003</entry>
|
||
<entry>8 сентября 2004</entry>
|
||
<entry>6.0-CURRENT после повторного добавления поля
|
||
ifi_epoch в структуру if_data.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600004</entry>
|
||
<entry>29 сентября 2004</entry>
|
||
<entry>6.0-CURRENT после добавления в pfil API структуры
|
||
inpcb как параметра.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600005</entry>
|
||
<entry>5 октября 2004</entry>
|
||
<entry>6.0-CURRENT после добавления в newsyslog
|
||
параметра "-d DESTDIR".
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600006</entry>
|
||
<entry>4 ноября 2004</entry>
|
||
<entry>6.0-CURRENT после добавления в функцию
|
||
&man.strftime.3; параметров отступа в стиле glibc.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600007</entry>
|
||
<entry>12 декабря 2004</entry>
|
||
<entry>6.0-CURRENT после обновлений в инфраструктуре 802.11.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600008</entry>
|
||
<entry>25 января 2005</entry>
|
||
<entry>6.0-CURRENT после изменений в функциях VOP_*VOBJECT()
|
||
и появления флага MNTK_MPSAFE для файловых систем,
|
||
свободных от Giant.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600009</entry>
|
||
<entry>4 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после добавления инфраструктуры
|
||
и драйверов cpufreq.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600010</entry>
|
||
<entry>6 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после импорта nc(1) из OpenBSD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600011</entry>
|
||
<entry>12 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после удаления подобия поддержки
|
||
SVID2 <literal>matherr()</literal>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600012</entry>
|
||
<entry>15 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после увеличения значения по умолчанию
|
||
размера стеков потока.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600013</entry>
|
||
<entry>19 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после исправлений в
|
||
<filename><src/include/stdbool.h></filename> и
|
||
<filename><src/sys/i386/include/_types.h></filename>
|
||
для использования совместимости GCC в компиляторе
|
||
Intel C/C++.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600014</entry>
|
||
<entry>21 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после исправления в vswprintf(3)
|
||
проверки на EOVERFLOW.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600015</entry>
|
||
<entry>25 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после изменения поля ifi_epoch в структуре
|
||
if_data со времени часов на время с момента старта.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600016</entry>
|
||
<entry>26 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после изменения формата LC_CTYPE,
|
||
используемого при записи на диск.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600017</entry>
|
||
<entry>27 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после изменения формата каталогов NLS,
|
||
используемого при записи на диск.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600018</entry>
|
||
<entry>27 февраля 2005</entry>
|
||
<entry>6.0-CURRENT после изменения формата LC_COLLATE,
|
||
используемого при записи на диск.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600019</entry>
|
||
<entry>28 февраля 2005</entry>
|
||
<entry>Установка подключаемых файлов acpica
|
||
в /usr/include.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600020</entry>
|
||
<entry>9 марта 2005</entry>
|
||
<entry>Добавление флага MSG_NOSIGNAL в API send(2).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600021</entry>
|
||
<entry>17 марта 2005</entry>
|
||
<entry>Добавление полей в cdevsw.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600022</entry>
|
||
<entry>21 марта 2005</entry>
|
||
<entry>gtar удален из основной системы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600023</entry>
|
||
<entry>13 апреля 2005</entry>
|
||
<entry>В unix(4) добавлены параметры сокета
|
||
LOCAL_CREDS, LOCAL_CONNWAIT.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600024</entry>
|
||
<entry>19 апреля 2005</entry>
|
||
<entry>В 6.0-CURRENT добавлены &man.hwpmc.4; и связанные
|
||
инструменты.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600025</entry>
|
||
<entry>26 апреля 2005</entry>
|
||
<entry>В 6.0-CURRENT добавлена структура icmphdr.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600026</entry>
|
||
<entry>3 мая 2005</entry>
|
||
<entry>pf обновлен до 3.7.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600027</entry>
|
||
<entry>6 мая 2005</entry>
|
||
<entry>Представлены libalias и ng_nat уровня ядра.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600028</entry>
|
||
<entry>13 мая 2005</entry>
|
||
<entry>POSIX ttyname_r(3) сделан доступным через
|
||
unistd.h и libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600029</entry>
|
||
<entry>29 мая 2005</entry>
|
||
<entry>6.0-CURRENT после обновления libpcap
|
||
до v0.9.1 alpha 096.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600030</entry>
|
||
<entry>5 июня 2005</entry>
|
||
<entry>6.0-CURRENT после импорта if_bridge(4) из NetBSD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600031</entry>
|
||
<entry>10 июня 2005</entry>
|
||
<entry>6.0-CURRENT после перемещения структуры ifnet из
|
||
структуры драйверов softc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600032</entry>
|
||
<entry>11 июля 2005</entry>
|
||
<entry>6.0-CURRENT после импорта libpcap v0.9.1.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600033</entry>
|
||
<entry>25 июля 2005</entry>
|
||
<entry>6.0-STABLE после увеличения номера версии всех
|
||
динамических библиотек, для которых он не был изменен
|
||
с RELENG_5.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600034</entry>
|
||
<entry>13 августа 2005</entry>
|
||
<entry>6.0-STABLE после добавления аргумента учетных
|
||
данных в обработчик событий dev_clone. 6.0-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600100</entry>
|
||
<entry>1 ноября 2005</entry>
|
||
<entry>6.0-STABLE после 6.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600101</entry>
|
||
<entry>21 декабря 2005</entry>
|
||
<entry>6.0-STABLE после внедрения сценариев из каталогов
|
||
local_startup в базовый &man.rcorder.8;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600102</entry>
|
||
<entry>30 декабря 2005</entry>
|
||
<entry>6.0-STABLE после обновления типов и констант ELF.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600103</entry>
|
||
<entry>15 января 2006</entry>
|
||
<entry>6.0-STABLE после выполнения MFC API pidfile(3).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600104</entry>
|
||
<entry>17 января 2006</entry>
|
||
<entry>6.0-STABLE после выполнения MFC изменения
|
||
ldconfig_local_dirs.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>600105</entry>
|
||
<entry>26 февраля 2006</entry>
|
||
<entry>6.0-STABLE после добавления поддержки каталога NLS
|
||
для csh(1).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601000</entry>
|
||
<entry>6 мая 2006</entry>
|
||
<entry>6.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601100</entry>
|
||
<entry>6 мая 2006</entry>
|
||
<entry>6.1-STABLE после 6.1-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601101</entry>
|
||
<entry>22 июня 2006</entry>
|
||
<entry>6.1-STABLE после импорта csup.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601102</entry>
|
||
<entry>11 июля 2006</entry>
|
||
<entry>6.1-STABLE после обновления iwi(4).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601103</entry>
|
||
<entry>17 июля 2006</entry>
|
||
<entry>6.1-STABLE после обновления резолвера до BIND9
|
||
и добавления реентерабельной версии функций netdb.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601104</entry>
|
||
<entry>8 августа 2006</entry>
|
||
<entry>6.1-STABLE после включения поддержки DSO (динамических
|
||
совместно используемых объектов) в OpenSSL.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>601105</entry>
|
||
<entry>2 сентября 2006</entry>
|
||
<entry>6.1-STABLE после исправлений в 802.11, изменяющих API
|
||
для ioctl IEEE80211_IOC_STA_INFO.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602000</entry>
|
||
<entry>15 ноября 2006</entry>
|
||
<entry>6.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602100</entry>
|
||
<entry>15 сентября 2006</entry>
|
||
<entry>6.2-STABLE после 6.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602101</entry>
|
||
<entry>12 декабря 2006</entry>
|
||
<entry>6.2-STABLE после добавления квирка Wi-Spy.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602102</entry>
|
||
<entry>28 декабря 2006</entry>
|
||
<entry>6.2-STABLE после добавления pci_find_extcap().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602103</entry>
|
||
<entry>16 января 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC изменения dlsym для
|
||
поиска запрошенного символа в указанном dso и
|
||
его неявных зависимостей.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602104</entry>
|
||
<entry>28 января 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC узлов netgraph
|
||
ng_deflate(4) и ng_pred1(4) и нового узла ng_ppp(4) со
|
||
сжатием и шифрованием.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602105</entry>
|
||
<entry>20 февраля 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC портированной из NetBSD
|
||
версии &man.gzip.1; с лицензией BSD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602106</entry>
|
||
<entry>31 марта 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC поддержки
|
||
PCI MSI и MSI-X.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602107</entry>
|
||
<entry>6 апреля 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC ncurses 5.6 и поддержки
|
||
двухбайтовых символов.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602108</entry>
|
||
<entry>11 апреля 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC добавления периферийного
|
||
устройства CAM 'SG', которое реализует подмножество API
|
||
сквозных (passthrough) устройств Linux SCSI SG.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602109</entry>
|
||
<entry>17 апреля 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC readline 5.2
|
||
patchset 002.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602110</entry>
|
||
<entry>2 мая 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC pmap_invalidate_cache(),
|
||
pmap_change_attr(), pmap_mapbios(), pmap_mapdev_attr()
|
||
и pmap_unmapbios() для mad64 и i386.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602111</entry>
|
||
<entry>11 июня 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC BOP_BDFLUSH и вызванной
|
||
этим поломки в KBI для модулей файловых систем.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602112</entry>
|
||
<entry>21 сентября 2007</entry>
|
||
<entry>6.2-STABLE после выполнения серии MFC libutil(3).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602113</entry>
|
||
<entry>25 октября 2007</entry>
|
||
<entry>6.2-STABLE после выполнения MFC разделения двухбайтовых
|
||
и однобайтовых ctype. Заново скомпилированные двоичные
|
||
файлы, ссылающиеся на ctype.h, могут потребовать новый символ
|
||
__mb_sb_limit, недоступный на более старых системах.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602114</entry>
|
||
<entry>30 октября 2007</entry>
|
||
<entry>6.2-STABLE после восстановления обратной совместимости
|
||
ctype ABI.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>602115</entry>
|
||
<entry>21 ноября 2007</entry>
|
||
<entry>6.2-STABLE после отката разделения двухбайтовых и
|
||
однобайтовых ctype.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603000</entry>
|
||
<entry>25 ноября 2007</entry>
|
||
<entry>6.3-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603100</entry>
|
||
<entry>25 ноября 2007</entry>
|
||
<entry>6.3-STABLE после 6.3-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603101</entry>
|
||
<entry>7 декабря 2007</entry>
|
||
<entry>6.3-STABLE после исправления поддержки многобайтовых
|
||
типов в битовом макросе.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603102</entry>
|
||
<entry>24 апреля 2008</entry>
|
||
<entry>6.3-STABLE после добавления l_sysid к структуре
|
||
flock.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603103</entry>
|
||
<entry>27 мая 2008</entry>
|
||
<entry>6.3-STABLE после выполнения MFC функции
|
||
<function>memrchr</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>603104</entry>
|
||
<entry>15 июня 2008</entry>
|
||
<entry>6.3-STABLE после выполнения MFC поддержки модификатора
|
||
переменной <literal>:u</literal> в make(1).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>604000</entry>
|
||
<entry>4 октября 2008</entry>
|
||
<entry>6.4-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>604100</entry>
|
||
<entry>4 октября 2008</entry>
|
||
<entry>6.4-STABLE после 6.4-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700000</entry>
|
||
<entry>11 июля 2005</entry>
|
||
<entry>7.0-CURRENT.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700001</entry>
|
||
<entry>23 июля 2005</entry>
|
||
<entry>7.0-CURRENT после увеличения номера версии всех
|
||
динамических библиотек, для которых он не был изменен
|
||
с RELENG_5.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700002</entry>
|
||
<entry>13 августа 2005</entry>
|
||
<entry>7.0-CURRENT после добавления аргумента учетных
|
||
данных в обработчик событий dev_clone.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700003</entry>
|
||
<entry>25 августа 2005</entry>
|
||
<entry>7.0-CURRENT после добавления memmem(3) в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700004</entry>
|
||
<entry>30 октября 2005</entry>
|
||
<entry>7.0-CURRENT после изменения параметров функции ядра
|
||
solisten(9) для получения параметра backlog.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700005</entry>
|
||
<entry>11 ноября 2005</entry>
|
||
<entry>7.0-CURRENT после изменения IFP2ENADDR(), который теперь
|
||
возвращает указатель на IF_LLADDR().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700006</entry>
|
||
<entry>11 ноября 2005</entry>
|
||
<entry>7.0-CURRENT после добавления поля
|
||
<literal>if_addr</literal> в <literal>struct ifnet</literal>
|
||
и удаления IFP2ENADDR().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700007</entry>
|
||
<entry>2 декабря 2005</entry>
|
||
<entry>7.0-CURRENT после внедрения сценариев из
|
||
каталогов local_startup в базовый &man.rcorder.8;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700008</entry>
|
||
<entry>5 декабря 2005</entry>
|
||
<entry>7.0-CURRENT после удаления параметра монтирования
|
||
MNT_NODEV.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700009</entry>
|
||
<entry>19 декабря 2005</entry>
|
||
<entry>7.0-CURRENT после изменений типа ELF-64 и
|
||
символьного версионирования.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700010</entry>
|
||
<entry>20 декабря 2005</entry>
|
||
<entry>7.0-CURRENT после добавления драйверов hostb и vgapci,
|
||
добавления pci_find_extcap() и изменения в драйверах AGP,
|
||
чтобы больше не отображать в память aperture.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700011</entry>
|
||
<entry>31 декабря 2005</entry>
|
||
<entry>7.0-CURRENT после замены tv_sec на time_t на всех
|
||
платформах, кроме Alpha.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700012</entry>
|
||
<entry>8 января 2006</entry>
|
||
<entry>7.0-CURRENT после изменения ldconfig_local_dirs.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700013</entry>
|
||
<entry>12 января 2006</entry>
|
||
<entry>7.0-CURRENT после изменений в
|
||
<filename>/etc/rc.d/abi</filename> для поддержки
|
||
<filename>/compat/linux/etc/ld.so.cache</filename>
|
||
в качестве символической ссылки на файловую систему в
|
||
режиме только для чтения.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700014</entry>
|
||
<entry>26 января 2006</entry>
|
||
<entry>7.0-CURRENT после импорта pts.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700015</entry>
|
||
<entry>26 марта 2006</entry>
|
||
<entry>7.0-CURRENT после появления второй версии ABI
|
||
&man.hwpmc.4;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700016</entry>
|
||
<entry>22 апреля 2006</entry>
|
||
<entry>7.0-CURRENT после добавления &man.fcloseall.3;
|
||
в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700017</entry>
|
||
<entry>13 мая 2006</entry>
|
||
<entry>7.0-CURRENT после удаления ip6fw.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700018</entry>
|
||
<entry>15 июля 2006</entry>
|
||
<entry>7.0-CURRENT после импорта snd_emu10kx.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700019</entry>
|
||
<entry>29 июля 2006</entry>
|
||
<entry>7.0-CURRENT после импорта OpenSSL 0.9.8b.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700020</entry>
|
||
<entry>3 сентября 2006</entry>
|
||
<entry>7.0-CURRENT после добавления функции
|
||
bus_dma_get_tag</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700021</entry>
|
||
<entry>4 сентября 2006</entry>
|
||
<entry>7.0-CURRENT после импорта libpcap 0.9.4 и
|
||
tcpdump 3.9.4.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700022</entry>
|
||
<entry>9 сентября 2006</entry>
|
||
<entry>7.0-CURRENT после изменения dlsym для поиска
|
||
запрошенного символа в указанном dso и
|
||
его неявных зависимостях.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700023</entry>
|
||
<entry>23 сентября 2006</entry>
|
||
<entry>7.0-CURRENT после добавления новых звуковых IOCTL
|
||
для API микшера OSSv4.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700024</entry>
|
||
<entry>28 сентября 2006</entry>
|
||
<entry>7.0-CURRENT после импорта OpenSSL 0.9.8d.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700025</entry>
|
||
<entry>11 ноября 2006</entry>
|
||
<entry>7.0-CURRENT после добавления libelf.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700026</entry>
|
||
<entry>26 ноября 2006</entry>
|
||
<entry>7.0-CURRENT после значительных изменений в sysctl
|
||
звуковой подсистемы.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700027</entry>
|
||
<entry>30 ноября 2006</entry>
|
||
<entry>7.0-CURRENT после добавления квирка Wi-Spy.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700028</entry>
|
||
<entry>15 декабря 2006</entry>
|
||
<entry>7.0-CURRENT после добавления вызовов sctp в libc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700029</entry>
|
||
<entry>26 января 2007</entry>
|
||
<entry>7.0-CURRENT после удаления инкапсуляции туннеля IPIP
|
||
(VIFF_TUNNEL) из кода IPv4 multicast forwarding.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700030</entry>
|
||
<entry>7 февраля 2007</entry>
|
||
<entry>7.0-CURRENT после замены реализации GNU &man.gzip.1;
|
||
на портированную из NetBSD версию с лицензией BSD.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700031</entry>
|
||
<entry>23 февраля 2007</entry>
|
||
<entry>7.0-CURRENT после изменения в bus_setup_intr() (newbus).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700032</entry>
|
||
<entry>2 марта 2007</entry>
|
||
<entry>7.0-CURRENT после внесения микрокода ipw(4) и iwi(4).
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700033</entry>
|
||
<entry>9 марта 2007</entry>
|
||
<entry>7.0-CURRENT после внесения поддержки двухбайтовых
|
||
символов ncurses.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700034</entry>
|
||
<entry>19 марта 2007</entry>
|
||
<entry>7.0-CURRENT после изменений в работе insmntque(),
|
||
getnewvnode() и vfs_hash_insert().
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700035</entry>
|
||
<entry>26 марта 2007</entry>
|
||
<entry>7.0-CURRENT после добавления механизма уведомлений
|
||
при изменении частоты CPU.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700036</entry>
|
||
<entry>6 апреля 2007</entry>
|
||
<entry>7.0-CURRENT после импорта файловой системы ZFS.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700037</entry>
|
||
<entry>8 апреля 2007</entry>
|
||
<entry>7.0-CURRENT после добавления периферийного устройства
|
||
CAM 'SG', которое реализует подмножество API сквозных
|
||
(passthrough) устройств Linux SCSI SG.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700038</entry>
|
||
<entry>30 апреля 2007</entry>
|
||
<entry>7.0-CURRENT после изменения &man.getenv.3;,
|
||
&man.putenv.3;, &man.setenv.3; и &man.unsetenv.3; для
|
||
совместимости с POSIX.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700039</entry>
|
||
<entry>1 мая 2007</entry>
|
||
<entry>7.0-CURRENT после отката изменений в 700038.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700040</entry>
|
||
<entry>10 мая 2007</entry>
|
||
<entry>7.0-CURRENT после добавления &man.flopen.3;
|
||
в libutil.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700041</entry>
|
||
<entry>13 мая 2007</entry>
|
||
<entry>7.0-CURRENT после включения версионирования символов
|
||
и изменения потоковой библиотеки, используемой по умолчанию,
|
||
на libthr.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700042</entry>
|
||
<entry>19 мая 2007</entry>
|
||
<entry>7.0-CURRENT после импорта gcc 4.2.0.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700043</entry>
|
||
<entry>21 мая 2007</entry>
|
||
<entry>7.0-CURRENT после увеличения старшего номера версии
|
||
для всех динамических библиотек, для которых это не было
|
||
сделано с момента RELENG_6.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700044</entry>
|
||
<entry>7 июня 2007</entry>
|
||
<entry>7.0-CURRENT после изменения параметра для
|
||
vn_open()/VOP_OPEN() вместо файлового дескриптора на
|
||
struct file *.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700045</entry>
|
||
<entry>10 июня 2007</entry>
|
||
<entry>7.0-CURRENT после изменения &man.pam.nologin.8;
|
||
для обеспечения функции управления учетными записями
|
||
вместо функции аутентификации для инфраструктуры PAM.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700046</entry>
|
||
<entry>11 июня 2007</entry>
|
||
<entry>7.0-CURRENT после обновления поддержки беспроводной
|
||
связи 802.11.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700047</entry>
|
||
<entry>11 июня 2007</entry>
|
||
<entry>7.0-CURRENT после добавления возможностей
|
||
TCP LRO интерфейса.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700048</entry>
|
||
<entry>12 июня 2007</entry>
|
||
<entry>7.0-CURRENT после добавления в стек IPv4 поддержки
|
||
API RFC 3678. Унаследованное от RFC 1724 поведение
|
||
ioctl IP_MULTICAST_IF теперь удалено; 0.0.0.0/8 больше не
|
||
может быть использован для указания индекса интерфейса.
|
||
Вместо этого следует использовать структуру ipmreqn.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700049</entry>
|
||
<entry>3 июля 2007</entry>
|
||
<entry>7.0-CURRENT после импорта pf из OpenBSD 4.1</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>(не изменено)</entry>
|
||
<entry></entry>
|
||
<entry>7.0-CURRENT после добавления поддержки IPv6 для
|
||
FAST_IPSEC, удаления KAME IPSEC и переименования
|
||
FAST_IPSEC в IPSEC.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700050</entry>
|
||
<entry>4 июля 2007</entry>
|
||
<entry>7.0-CURRENT после конвертации вызовов setenv/putenv/etc
|
||
из традиционных BSD в POSIX.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700051</entry>
|
||
<entry>4 июля 2007</entry>
|
||
<entry>7.0-CURRENT после добавления новых системных вызовов
|
||
mmap/lseek/etc.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700052</entry>
|
||
<entry>6 июля 2007</entry>
|
||
<entry>7.0-CURRENT после перемещения заголовков I4B
|
||
в include/i4b.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700053</entry>
|
||
<entry>30 сентября 2007</entry>
|
||
<entry>7.0-CURRENT после добавления поддержки
|
||
для доменов PCI.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700054</entry>
|
||
<entry>25 октября 2007</entry>
|
||
<entry>7.0-CURRENT после выполнения MFC разделения двухбайтовых
|
||
и однобайтовых ctype.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700055</entry>
|
||
<entry>28 октября 2007</entry>
|
||
<entry>7.0-RELEASE, и 7.0-CURRENT после выполнения MFC обратной
|
||
совместимости ABI для IOCTL'ей PCIOCGETCONF, PCIOCREAD и
|
||
PCIOCWRITE с версиями FreeBSD 4/5/6, что вызвало повторную
|
||
поломку ABI для PCIOCGETCONF IOCTL</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700100</entry>
|
||
<entry>22 декабря 2007</entry>
|
||
<entry>7.0-STABLE после 7.0-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700101</entry>
|
||
<entry>8 февраля 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC m_collapse().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700102</entry>
|
||
<entry>30 марта 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC kdb_enter_why().</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700103</entry>
|
||
<entry>10 апреля 2008</entry>
|
||
<entry>7.0-STABLE после добавления l_sysid в структуру
|
||
flock.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700104</entry>
|
||
<entry>11 апреля 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC procstat(1).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700105</entry>
|
||
<entry>11 апреля 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC возможностей umtx.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700106</entry>
|
||
<entry>15 апреля 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC поддержки &man.write.2;
|
||
для &man.psm.4;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700107</entry>
|
||
<entry>20 апреля 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC команды F_DUP2FD
|
||
для &man.fcntl.2;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700108</entry>
|
||
<entry>5 мая 2008</entry>
|
||
<entry>7.0-STABLE после некоторых изменений в &man.lockmgr.9;,
|
||
которые для использования &man.lockmgr.9; требуют
|
||
подключения <filename>sys/lock.h</filename>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700109</entry>
|
||
<entry>27 мая 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC функции
|
||
<function>memrchr</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700110</entry>
|
||
<entry>5 августа 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC NFS-клиента lockd.
|
||
</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700111</entry>
|
||
<entry>20 августа 2008</entry>
|
||
<entry>7.0-STABLE после добавления поддержки
|
||
физически протяженных jumbo-фреймов.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>700112</entry>
|
||
<entry>27 августа 2008</entry>
|
||
<entry>7.0-STABLE после выполнения MFC поддержки
|
||
DTrace в ядре.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701000</entry>
|
||
<entry>25 ноября 2008</entry>
|
||
<entry>7.1-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701100</entry>
|
||
<entry>25 ноября 2008</entry>
|
||
<entry>7.1-STABLE после 7.1-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701101</entry>
|
||
<entry>10 января 2009</entry>
|
||
<entry>7.1-STABLE после бекпорта
|
||
<function>strndup</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701102</entry>
|
||
<entry>17 января 2009</entry>
|
||
<entry>7.1-STABLE после добавления поддержки
|
||
cpuctl(4).</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701103</entry>
|
||
<entry>7 февраля 2009</entry>
|
||
<entry>7.1-STABLE после бекпорта jail
|
||
с несколькими IP / без указания IP / с IPv6.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701104</entry>
|
||
<entry>14 февраля 2009</entry>
|
||
<entry>7.1-STABLE после сохранения владельца приостановки
|
||
в структуре mount и появления метода vfs_susp_clean
|
||
в структуре vfsops.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701105</entry>
|
||
<entry>12 марта 2009</entry>
|
||
<entry>7.1-STABLE после несовместимых изменений в sysctl
|
||
kern.ipc.shmsegs для возможности выделения сегментов
|
||
разделяемой памяти SysV большего размера на 64-битных
|
||
архитектурах.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>701106</entry>
|
||
<entry>14 марта 2009</entry>
|
||
<entry>7.1-STABLE после бекпорта исправления операций
|
||
ожидания для семафоров POSIX.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702000</entry>
|
||
<entry>15 апреля 2009</entry>
|
||
<entry>7.2-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702100</entry>
|
||
<entry>15 апреля 2009</entry>
|
||
<entry>7.2-STABLE после 7.2-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702101</entry>
|
||
<entry>15 мая 2009</entry>
|
||
<entry>7.2-STABLE после изменения ichsmb(4) для использования
|
||
вспомогательной адресации с выравниванием по левой стороне,
|
||
как и в других драйверах контроллера SMBus.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702102</entry>
|
||
<entry>28 мая 2009</entry>
|
||
<entry>7.2-STABLE после выполнения MFC функции
|
||
<function>fdopendir</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702103</entry>
|
||
<entry>6 июня 2009</entry>
|
||
<entry>7.2-STABLE после выполнения MFC PmcTools.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702104</entry>
|
||
<entry>14 июля 2009</entry>
|
||
<entry>7.2-STABLE после выполнения MFC системного
|
||
вызова <function>closefrom</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702105</entry>
|
||
<entry>31 июля 2009</entry>
|
||
<entry>7.2-STABLE после выполнения MFC изменения ABI
|
||
для SYSVIPC.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>702106</entry>
|
||
<entry>14 сентября 2009</entry>
|
||
<entry>7.2-STABLE после выполнения MFC улучшений в x86 PAT
|
||
и добавления d_mmap_single() и объекта VM типа
|
||
"список scatter/gather".</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>703000</entry>
|
||
<entry>9 февраля 2010</entry>
|
||
<entry>7.3-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>703100</entry>
|
||
<entry>9 февраля 2010</entry>
|
||
<entry>7.3-STABLE после 7.3-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>704000</entry>
|
||
<entry>22 декабря 2010</entry>
|
||
<entry>7.4-RELEASE</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>704100</entry>
|
||
<entry>22 декабря 2010</entry>
|
||
<entry>7.4-STABLE после 7.4-RELEASE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800000</entry>
|
||
<entry>11 октября 2007</entry>
|
||
<entry>8.0-CURRENT. Разделение двухбайтовых и однобайтовых
|
||
ctype.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800001</entry>
|
||
<entry>16 октября 2007</entry>
|
||
<entry>8.0-CURRENT после импорта libpcap 0.9.8 и
|
||
tcpdump 3.9.8.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800002</entry>
|
||
<entry>21 октября 2007</entry>
|
||
<entry>8.0-CURRENT после переименования kthread_create() и
|
||
сопутствующих функций в kproc_create() и т.д.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800003</entry>
|
||
<entry>24 октября 2007</entry>
|
||
<entry>8.0-CURRENT после добавления обратной совместимости
|
||
ABI для IOCTL'ей PCIOCGETCONF, PCIOCREAD и PCIOCWRITE с
|
||
версиями FreeBSD 4/5/6, что вызвало повторную поломку ABI
|
||
для PCIOCGETCONF IOCTL</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800004</entry>
|
||
<entry>12 ноября 2007</entry>
|
||
<entry>8.0-CURRENT после перемещения драйвера agp(4) из
|
||
src/sys/pci в src/sys/dev/agp</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800005</entry>
|
||
<entry>4 декабря 2007</entry>
|
||
<entry>8.0-CURRENT после
|
||
<ulink url="http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_mbuf.c#rev1.35">изменений
|
||
в распределителе jumbo-фреймов</ulink>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800006</entry>
|
||
<entry>7 декабря 2007</entry>
|
||
<entry>8.0-CURRENT после добавления функциональности захвата
|
||
графа вызовов в &man.hwpmc.4;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800007</entry>
|
||
<entry>25 декабря 2007</entry>
|
||
<entry>8.0-CURRENT после того, как kdb_enter() получила
|
||
параметр "why".</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800008</entry>
|
||
<entry>28 декабря 2007</entry>
|
||
<entry>8.0-CURRENT после удаления опции LK_EXCLUPGRADE.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800009</entry>
|
||
<entry>9 января 2008</entry>
|
||
<entry>8.0-CURRENT после появления
|
||
&man.lockmgr.disown.9;</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800010</entry>
|
||
<entry>10 января 2008</entry>
|
||
<entry>8.0-CURRENT после изменения прототипа
|
||
&man.vn.lock.9;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800011</entry>
|
||
<entry>13 января 2008</entry>
|
||
<entry>8.0-CURRENT после изменения прототипов
|
||
&man.VOP.LOCK.9; и &man.VOP.UNLOCK.9;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800012</entry>
|
||
<entry>19 января 2008</entry>
|
||
<entry>8.0-CURRENT после появления
|
||
&man.lockmgr.recursed.9;, &man.BUF.RECURSED.9; и
|
||
&man.BUF.ISLOCKED.9; и удаления
|
||
<function>BUF_REFCNT()</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800013</entry>
|
||
<entry>23 января 2008</entry>
|
||
<entry>8.0-CURRENT после появления
|
||
кодировки <quote>ASCII</quote>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800014</entry>
|
||
<entry>24 января 2008</entry>
|
||
<entry>8.0-CURRENT после изменения прототипа &man.lockmgr.9;
|
||
и удаления <function>lockcount()</function> и
|
||
<function>LOCKMGR_ASSERT()</function>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800015</entry>
|
||
<entry>26 января 2008</entry>
|
||
<entry>8.0-CURRENT после расширения типов для
|
||
структур &man.fts.3;.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>800016</entry>
|
||
<entry>1 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после добавления параметра MEXTADD(9)
|
||
</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800017</entry>
|
||
<entry>6 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после появления опций LK_NODUP и
|
||
LK_NOWITNESS в пространстве &man.lockmgr.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800018</entry>
|
||
<entry>8 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после добавления m_collapse.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800019</entry>
|
||
<entry>9 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после добавления поддержки текущего
|
||
рабочего каталога, корневого каталога и каталогов jail
|
||
в sysctl kern.proc.filedesc.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800020</entry>
|
||
<entry>13 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после появления функций
|
||
&man.lockmgr.assert.9; и
|
||
<function>BUF_ASSERT</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800021</entry>
|
||
<entry>15 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после появления &man.lockmgr.args.9;
|
||
и удаления флага LK_INTERNAL.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800022</entry>
|
||
<entry>(отменено)</entry>
|
||
<entry>8.0-CURRENT после замены используемого по умолчанию
|
||
ar на BSD &man.ar.1;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800023</entry>
|
||
<entry>25 февраля 2008</entry>
|
||
<entry>8.0-CURRENT после изменения прототипов
|
||
&man.lockstatus.9; и &man.VOP.ISLOCKED.9;, а именно
|
||
удаления аргумента <literal>struct thread</literal>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800024</entry>
|
||
<entry>1 марта 2008</entry>
|
||
<entry>8.0-CURRENT после сокращения функций
|
||
<function>lockwaiters</function> и
|
||
<function>BUF_LOCKWAITERS</function>, изменения
|
||
возвращаемого значения для <function>brelvp</function>
|
||
с void и int и появления новых флагов для
|
||
&man.lockinit.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800025</entry>
|
||
<entry>8 марта 2008</entry>
|
||
<entry>8.0-CURRENT после добавления в &man.fcntl.2;
|
||
команды F_DUP2FD.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800026</entry>
|
||
<entry>12 марта 2008</entry>
|
||
<entry>8.0-CURRENT после изменения параметра приоритета
|
||
для cv_broadcastpri так, что 0 означает отсутствие
|
||
приоритета.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800027</entry>
|
||
<entry>24 марта 2008</entry>
|
||
<entry>8.0-CURRENT после изменения API мониторинга bpf,
|
||
когда были добавлены буферы zerocopy bpf.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800028</entry>
|
||
<entry>26 марта 2008</entry>
|
||
<entry>8.0-CURRENT после добавления l_sysid в структуру
|
||
flock.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800029</entry>
|
||
<entry>28 марта 2008</entry>
|
||
<entry>8.0-CURRENT после реинтеграции функции
|
||
<function>BUF_LOCKWAITERS</function> и добавления
|
||
&man.lockmgr.waiters.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800030</entry>
|
||
<entry>1 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после появления функций
|
||
&man.rw.try.rlock.9; и &man.rw.try.wlock.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800031</entry>
|
||
<entry>6 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после появления функций
|
||
<function>lockmgr_rw</function> и
|
||
<function>lockmgr_args_rw</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800032</entry>
|
||
<entry>8 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после реализации openat и связанных
|
||
с ним системных вызовов, появления флага O_EXEC для
|
||
&man.open.2; и обеспечения соответствующих системных
|
||
вызовов для linux-совместимости.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800033</entry>
|
||
<entry>8 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после добавления поддержки &man.write.2;
|
||
для &man.psm.4; в нативном операционном режиме. Теперь
|
||
в <devicename>/dev/psm%d</devicename> можно записывать
|
||
произвольные команды и считывать из него обратно
|
||
состояние.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800034</entry>
|
||
<entry>10 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после появления функции
|
||
<function>memrchr</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800035</entry>
|
||
<entry>16 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после появления функции
|
||
<function>fdopendir</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800036</entry>
|
||
<entry>20 апреля 2008</entry>
|
||
<entry>8.0-CURRENT после переключения беспроводной связи
|
||
802.11 на поддержку multi-bss (также известного как
|
||
vaps).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800037</entry>
|
||
<entry>9 мая 2008</entry>
|
||
<entry>8.0-CURRENT после добавления поддержки мульти-роутинговых
|
||
таблиц (также известных как setfib(1), setfib(2)).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800038</entry>
|
||
<entry>26 мая 2008</entry>
|
||
<entry>8.0-CURRENT после удаления netatm и ISDN4BSD. Также,
|
||
добавление инструментария Compact C Type (CTF).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800039</entry>
|
||
<entry>14 июня 2008</entry>
|
||
<entry>8.0-CURRENT после удаления sgtty.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800040</entry>
|
||
<entry>26 июня 2008</entry>
|
||
<entry>8.0-CURRENT клиентом NFS lockd в ядре.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800041</entry>
|
||
<entry>22 июля 2008</entry>
|
||
<entry>8.0-CURRENT после добавления arc4random_buf(3)
|
||
и arc4random_uniform(3).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800042</entry>
|
||
<entry>8 августа 2008</entry>
|
||
<entry>8.0-CURRENT после добавления cpuctl(4).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800043</entry>
|
||
<entry>13 августа 2008</entry>
|
||
<entry>8.0-CURRENT после изменения в bpf(4) для использования
|
||
единственного узла устройства вместо клонирования
|
||
устройств.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800044</entry>
|
||
<entry>17 августа 2008</entry>
|
||
<entry>8.0-CURRENT после коммита первых шагов проекта vimage
|
||
с переименованием глобальных переменных для их виртуализации
|
||
в макросы с префиксом V_ для их отображения обратно на
|
||
глобальные имена.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800045</entry>
|
||
<entry>20 августа 2008</entry>
|
||
<entry>8.0-CURRENT после интеграции прослойки MPSAFE TTY,
|
||
включающей изменения в различных, взаимодействующих с ней
|
||
драйверах и утилитах.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800046</entry>
|
||
<entry>8 сентября 2008</entry>
|
||
<entry>8.0-CURRENT после разделения GDT
|
||
для каждого CPU в архитектуре amd64.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800047</entry>
|
||
<entry>10 сентября 2008</entry>
|
||
<entry>8.0-CURRENT после удаления VSVTX, VSGID
|
||
и VSUID.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800048</entry>
|
||
<entry>16 сентября 2008</entry>
|
||
<entry>8.0-CURRENT после преобразования кода монтирования
|
||
NFS в ядре для принятия индивидуальных опций монтирования
|
||
в iovec nmount(), а не только в одной большой
|
||
структуре nfs_args.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800049</entry>
|
||
<entry>17 сентября 2008</entry>
|
||
<entry>8.0-CURRENT после удаления &man.suser.9; и
|
||
&man.suser.cred.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800050</entry>
|
||
<entry>20 октября 2008</entry>
|
||
<entry>8.0-CURRENT после изменения в API кеша буферов.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800051</entry>
|
||
<entry>23 октября 2008</entry>
|
||
<entry>8.0-CURRENT после удаления макросов
|
||
&man.MALLOC.9; и &man.FREE.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800052</entry>
|
||
<entry>28 октября 2008</entry>
|
||
<entry>8.0-CURRENT после появления accmode_t
|
||
и переименования параметра VOP_ACCESS 'a_mode' в
|
||
'a_accmode'.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800053</entry>
|
||
<entry>2 ноября 2008</entry>
|
||
<entry>8.0-CURRENT после изменения прототипа &man.vfs.busy.9;
|
||
и появления его флагов MBF_NOWAIT и MBF_MNTLSTLOCK.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800054</entry>
|
||
<entry>22 ноября 2008</entry>
|
||
<entry>8.0-CURRENT после добавления buf_ring, барьеров
|
||
памяти и функций ifnet для множественных аппаратных
|
||
очередей передачи для поддерживающих это карт, а также
|
||
реализации ring-buffer без использования синхронизации
|
||
для более эффективного управления очередями пакетов
|
||
в драйверах.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800055</entry>
|
||
<entry>27 ноября 2008</entry>
|
||
<entry>8.0-CURRENT после добавления поддержки &man.hwpmc.4;
|
||
для Intel™ Core, Core2 и Atom.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800056</entry>
|
||
<entry>29 ноября 2008</entry>
|
||
<entry>8.0-CURRENT после появления jail
|
||
с несколькими IP / без указания IP / с IPv6.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800057</entry>
|
||
<entry>1 декабря 2008</entry>
|
||
<entry>8.0-CURRENT после переключения на использование
|
||
исходного кода ath hal.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800058</entry>
|
||
<entry>12 декабря 2008</entry>
|
||
<entry>8.0-CURRENT после появления операции VOP_VPTOCNP.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800059</entry>
|
||
<entry>15 декабря 2008</entry>
|
||
<entry>8.0-CURRENT включает в себя новый переписанный arp-v2.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800060</entry>
|
||
<entry>19 декабря 2008</entry>
|
||
<entry>8.0-CURRENT после добавления makefs.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800061</entry>
|
||
<entry>15 января 2009</entry>
|
||
<entry>8.0-CURRENT после TCP Appropriate Byte Counting.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800062</entry>
|
||
<entry>28 января 2009</entry>
|
||
<entry>8.0-CURRENT после удаления minor(), minor2unit(),
|
||
unit2minor(), и т.д.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800063</entry>
|
||
<entry>18 февраля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения конфига GENERIC
|
||
для использования стека USB2, а также после добавления
|
||
fdevname(3).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800064</entry>
|
||
<entry>23 февраля 2009</entry>
|
||
<entry>8.0-CURRENT после того, как перемещен стек USB2,
|
||
и он заменяет dev/usb.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800065</entry>
|
||
<entry>26 февраля 2009</entry>
|
||
<entry>8.0-CURRENT после переименования всех функций
|
||
в libmp(3).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800066</entry>
|
||
<entry>27 февраля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения управления и раскладки
|
||
USB в devfs.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800067</entry>
|
||
<entry>28 февраля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления getdelim(), getline(),
|
||
stpncpy(), strnlen(), wcsnlen(), wcscasecmp()
|
||
и wcsncasecmp().</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800068</entry>
|
||
<entry>2 марта 2009</entry>
|
||
<entry>8.0-CURRENT после переименования devclass ushub
|
||
в uhub.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800069</entry>
|
||
<entry>9 марта 2009</entry>
|
||
<entry>8.0-CURRENT после переименования libusb20.so.1
|
||
в libusb.so.1.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800070</entry>
|
||
<entry>9 марта 2009</entry>
|
||
<entry>8.0-CURRENT после объединения IGMPv3 и
|
||
Source-Specific Multicast (SSM) в стек IPv4.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800071</entry>
|
||
<entry>14 марта 2009</entry>
|
||
<entry>8.0-CURRENT после применения патча к gcc для
|
||
использования inline-семантики C99 в режиме c99 и gnu99.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800072</entry>
|
||
<entry>15 марта 2009</entry>
|
||
<entry>8.0-CURRENT после удаления флага IFF_NEEDSGIANT;
|
||
сетевые не-MPSAFE драйвера устройств более не
|
||
поддерживаются.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800073</entry>
|
||
<entry>18 марта 2009</entry>
|
||
<entry>8.0-CURRENT после реализации динамического замещения
|
||
строковых токенов для rpath и необходимых путей.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800074</entry>
|
||
<entry>24 марта 2009</entry>
|
||
<entry>8.0-CURRENT после импорта tcpdump 4.0.0
|
||
и libpcap 1.0.0.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800075</entry>
|
||
<entry>6 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения раскладки в структурах
|
||
vnet_net, vnet_inet и vnet_ipfw.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800076</entry>
|
||
<entry>9 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления профилей задержки
|
||
в dummynet.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800077</entry>
|
||
<entry>14 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после удаления VOP_LEASE() и
|
||
vop_vector.vop_lease.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800078</entry>
|
||
<entry>15 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления полей структуры rt_weight
|
||
в структуры rt_metrics и rt_metrics_lite, изменения
|
||
раскладки структуры rt_metrics_lite. Сделано, но затем
|
||
отменено увеличение номера версии RTM_VERSION.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800079</entry>
|
||
<entry>15 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления указателей на структуру
|
||
llentry в структуры route и route_in6.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800080</entry>
|
||
<entry>15 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения раскладки структуры
|
||
inpcb.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800081</entry>
|
||
<entry>19 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения раскладки структуры
|
||
malloc_type.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800082</entry>
|
||
<entry>21 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после изменения раскладки структуры
|
||
ifnet и подсчета ссылок на ifnet в if_ref() и
|
||
if_rele().</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800083</entry>
|
||
<entry>22 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после реализации низкоуровнего API
|
||
Bluetooth HCI.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800084</entry>
|
||
<entry>29 апреля 2009</entry>
|
||
<entry>8.0-CURRENT изменений в IPv6 SSM и MLDv2.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800085</entry>
|
||
<entry>30 апреля 2009</entry>
|
||
<entry>8.0-CURRENT после включения поддержки сборки ядра
|
||
VIMAGE с одним активным образом.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800086</entry>
|
||
<entry>8 мая 2009</entry>
|
||
<entry>8.0-CURRENT после добавления в patch(1) поддержки
|
||
строк ввода произвольной длины.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800087</entry>
|
||
<entry>11 мая 2009</entry>
|
||
<entry>8.0-CURRENT после некоторых изменений в KPI VFS.
|
||
Параметр потока удален из частей FSD в VFS. Функциям
|
||
<function>VFS_*</function> этот контекст больше не нужен,
|
||
потому что он всегда ссылается на <varname>curthread</varname>.
|
||
В некоторых особых случаях оставлено прежнее поведение.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800088</entry>
|
||
<entry>20 мая 2009</entry>
|
||
<entry>8.0-CURRENT после изменений в режиме net80211
|
||
monitor.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800089</entry>
|
||
<entry>23 мая 2009</entry>
|
||
<entry>8.0-CURRENT после добавления поддержки управляющего
|
||
блока UDP.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800090</entry>
|
||
<entry>23 мая 2009</entry>
|
||
<entry>8.0-CURRENT после клонирования виртуализованных
|
||
интерфейсов.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800091</entry>
|
||
<entry>27 мая 2009</entry>
|
||
<entry>8.0-CURRENT после добавления иерархических jail
|
||
и удаления глобального securelevel.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800092</entry>
|
||
<entry>29 мая 2009</entry>
|
||
<entry>8.0-CURRENT после изменения KPI для
|
||
<function>sx_init_flags()</function>. Для обратного
|
||
логического управления вместо убранной
|
||
<constant>SX_ADAPTIVESPIN</constant> представлена
|
||
новая <constant>SX_NOADAPTIVE</constant>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800093</entry>
|
||
<entry>29 мая 2009</entry>
|
||
<entry>8.0-CURRENT после добавления mnt_xflag в
|
||
структуру mount.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800094</entry>
|
||
<entry>30 мая 2009</entry>
|
||
<entry>8.0-CURRENT после добавления
|
||
&man.VOP.ACCESSX.9;.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800095</entry>
|
||
<entry>30 мая 2009</entry>
|
||
<entry>8.0-CURRENT после изменения KPI polling.
|
||
Обработчики polling теперь возвращают количество
|
||
обработанных пакетов. Также представлена новая
|
||
<constant>IFCAP_POLLING_NOCOUNT</constant> для указания
|
||
на неважность возвращаемого значения и пропуска
|
||
счетчиков.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800096</entry>
|
||
<entry>1 июня 2009</entry>
|
||
<entry>8.0-CURRENT после обновления до новой реализации
|
||
netisr и после изменения способа хранения
|
||
и доступа к FIB.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800097</entry>
|
||
<entry>8 июня 2009</entry>
|
||
<entry>8.0-CURRENT после появления хуков для деструкторов
|
||
и инфраструктуры vnet.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800097</entry>
|
||
<entry>11 июня 2009</entry>
|
||
<entry>8.0-CURRENT после появления обнаружения пути вызовов
|
||
от исходящего на входящий для netgraph и постановления в
|
||
очередь, что также изменяет раскладку структуры thread.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800098</entry>
|
||
<entry>14 июня 2009</entry>
|
||
<entry>8.0-CURRENT после импорта OpenSSL 0.9.8k.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800099</entry>
|
||
<entry>22 июня 2009</entry>
|
||
<entry>8.0-CURRENT после обновления NGROUPS и перемещения
|
||
виртуализации маршрутов в свой собственный модуль VImage.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800100</entry>
|
||
<entry>24 июня 2009</entry>
|
||
<entry>8.0-CURRENT после изменения ABI для SYSVIPC.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800101</entry>
|
||
<entry>29 июня 2009</entry>
|
||
<entry>8.0-CURRENT после удаления символьных устройств
|
||
/dev/net/*, используемых отдельно для каждого
|
||
интерфейса.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800102</entry>
|
||
<entry>12 июля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления резервных полей в
|
||
структурах sackhint, tcpcb и tcpstat.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800103</entry>
|
||
<entry>13 июля 2009</entry>
|
||
<entry>8.0-CURRENT после замены структуры tcpopt на
|
||
структуру toeopt в интерфейсе драйвера TOE в
|
||
TCP syncache.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800104</entry>
|
||
<entry>14 июля 2009</entry>
|
||
<entry>8.0-CURRENT после добавления распределителя,
|
||
индивидуального для каждого vnet, на основе связанного
|
||
множества.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800105</entry>
|
||
<entry>19 июля 2009</entry>
|
||
<entry>8.0-CURRENT после увеличения номера версии для всех
|
||
динамических библиотек, для которых не включено символьное
|
||
версионирование.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800106</entry>
|
||
<entry>24 июля 2009</entry>
|
||
<entry>8.0-CURRENT после появления типа объекта
|
||
VM OBJT_SG.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800107</entry>
|
||
<entry>2 августа 2009</entry>
|
||
<entry>8.0-CURRENT после освобождения подсистемы newbus
|
||
от Giant через добавление newbus sxlock.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800108</entry>
|
||
<entry>21 ноября 2009</entry>
|
||
<entry>8.0-STABLE после реализации kevent-фильтра
|
||
EVFILT_USER.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800500</entry>
|
||
<entry>7 января 2010</entry>
|
||
<entry>8.0-STABLE после увеличения номера
|
||
<literal>__FreeBSD_version</literal> для использования в
|
||
<command>pkg_add -r</command> packages-8-stable.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800501</entry>
|
||
<entry>24 января 2010</entry>
|
||
<entry>8.0-STABLE после изменения прототипов
|
||
<function>scandir(3)</function> и
|
||
<function>alphasort(3)</function> для соответствия SUSv4.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800502</entry>
|
||
<entry>31 января 2010</entry>
|
||
<entry>8.0-STABLE после добавления
|
||
<function>sigpause(3)</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800503</entry>
|
||
<entry>25 февраля 2010</entry>
|
||
<entry>8.0-STABLE после добавления ioctl SIOCGIFDESCR и
|
||
SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl можно
|
||
использовать для описания интерфейсов в духе OpenBSD.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800504</entry>
|
||
<entry>1 марта 2010</entry>
|
||
<entry>8.0-STABLE после выполнения MFC импорта x86emu из
|
||
OpenBSD, программного эмулятора реального режима для
|
||
CPU x86.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>800505</entry>
|
||
<entry>18 мая 2010</entry>
|
||
<entry>8.0-STABLE после выполнения MFC добавления liblzma,
|
||
xz, xzdec, и lzmainfo.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>801000</entry>
|
||
<entry>14 июня 2010</entry>
|
||
<entry>8.1-RELEASE</entry>
|
||
</row>
|
||
<row>
|
||
<entry>801500</entry>
|
||
<entry>14 июня 2010</entry>
|
||
<entry>8.1-STABLE после 8.1-RELEASE.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>801501</entry>
|
||
<entry>3 ноября 2010</entry>
|
||
<entry>8.1-STABLE после изменения KBI в структуре sysentvec
|
||
и реализации PL_FLAG_SCE/SCX/EXEC/SI и pl_siginfo для
|
||
ptrace(PT_LWPINFO).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802000</entry>
|
||
<entry>22 декабря 2010</entry>
|
||
<entry>8.2-RELEASE</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802500</entry>
|
||
<entry>22 декабря 2010</entry>
|
||
<entry>8.2-STABLE после 8.2-RELEASE.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802501</entry>
|
||
<entry>28 февраля 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования изменений
|
||
DTrace, включающих поддержку трассировки пользовательских
|
||
программ.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802502</entry>
|
||
<entry>6 марта 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования log2 и
|
||
log2f в libm.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802503</entry>
|
||
<entry>1 мая 2011</entry>
|
||
<entry>8.2-STABLE после обновления gcc до последней версии
|
||
с лицензией GPLv2 из FSF gcc-4_2-branch.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802504</entry>
|
||
<entry>28 мая 2011</entry>
|
||
<entry>8.2-STABLE после появления KPI и вспомогательной
|
||
инфраструктуры модульного контроля перегрузки.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802505</entry>
|
||
<entry>28 мая 2011</entry>
|
||
<entry>8.2-STABLE после появления KPI Hhook и Khelp.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802506</entry>
|
||
<entry>28 мая 2011</entry>
|
||
<entry>8.2-STABLE после добавления OSD в структуру
|
||
tcpcb.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802507</entry>
|
||
<entry>6 июня 2011</entry>
|
||
<entry>8.2-STABLE после импорта ZFS v28.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802508</entry>
|
||
<entry>8 июня 2011</entry>
|
||
<entry>8.2-STABLE после удаления обработчика событий schedtail
|
||
и добавления метода sv_schedtail в структуру sysvec.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802509</entry>
|
||
<entry>14 июля 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования поддержки
|
||
SSSE3 в binutils.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802510</entry>
|
||
<entry>19 июля 2011</entry>
|
||
<entry>8.2-STABLE после добавления флага
|
||
RFTSIGZMB в <function>rfork(2)</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802511</entry>
|
||
<entry>9 сентября 2011</entry>
|
||
<entry>8.2-STABLE после добавления автоматического
|
||
распознавания устройств USB mass storage, которые не
|
||
поддерживают команду SCSI no synchronize cache.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802512</entry>
|
||
<entry>10 сентября 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования
|
||
переработанного auto-quirk.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802513</entry>
|
||
<entry>25 октября 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования флага
|
||
MAP_PREFAULT_READ в <function>mmap(2)</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802514</entry>
|
||
<entry>16 ноября 2011</entry>
|
||
<entry>8.2-STABLE после обратного портирования
|
||
системного вызова posix_fallocate(2).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802515</entry>
|
||
<entry>6 января 2012</entry>
|
||
<entry>8.2-STABLE после обратного портирования
|
||
системного вызова posix_fadvise(2).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802516</entry>
|
||
<entry>16 января 2012</entry>
|
||
<entry>8.2-STABLE после обратного портирования
|
||
gperf 3.0.3.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>802517</entry>
|
||
<entry>15 февраля 2012</entry>
|
||
<entry>8.2-STABLE после появления нового расширяемого
|
||
интерфейса sysctl(3) NET_RT_IFLISTL для получения списка
|
||
адресов (рев. <svnref>231769</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>803000</entry>
|
||
<entry>3 марта 2012</entry>
|
||
<entry>8.3-RELEASE.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>803500</entry>
|
||
<entry>3 марта 2012</entry>
|
||
<entry>8.3-STABLE после отделения ветки releng/8.3
|
||
(RELENG_8_3).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900000</entry>
|
||
<entry>22 августа 2009</entry>
|
||
<entry>9.0-CURRENT.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900001</entry>
|
||
<entry>8 сентября 2009</entry>
|
||
<entry>9.0-CURRENT после импорта x86emu из OpenBSD, программного
|
||
эмулятора реального режима для CPU x86.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900002</entry>
|
||
<entry>23 сентября 2009</entry>
|
||
<entry>9.0-CURRENT после реализации функциональности
|
||
kevent-фильтра EVFILT_USER.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900003</entry>
|
||
<entry>2 декабря 2009</entry>
|
||
<entry>9.0-CURRENT после добавления
|
||
<function>sigpause(3)</function> и поддержки PIE в csu.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900004</entry>
|
||
<entry>6 декабря 2009</entry>
|
||
<entry>9.0-CURRENT после добавления libulog и его интерфейса
|
||
совместимости libutempter.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900005</entry>
|
||
<entry>12 декабря 2009</entry>
|
||
<entry>9.0-CURRENT после добавления
|
||
<function>sleepq_sleepcnt()</function>, которую можно
|
||
использовать для запроса количества ожидающих в указанной
|
||
очереди ожидания.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900006</entry>
|
||
<entry>4 января 2010</entry>
|
||
<entry>9.0-CURRENT после изменения прототипов
|
||
<function>scandir(3)</function> и
|
||
<function>alphasort(3)</function> для соответствия
|
||
SUSv4.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900007</entry>
|
||
<entry>13 января 2010</entry>
|
||
<entry>9.0-CURRENT после удаления utmp(5) и добавления
|
||
utmpx (смотрите <function>getutxent(3)</function>) для
|
||
улучшенного протоколирования пользовательских входов
|
||
и системных событий.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900008</entry>
|
||
<entry>20 января 2010</entry>
|
||
<entry>9.0-CURRENT после импорта BSDL bc/dc и объявления
|
||
GNU bc/dc устаревшими.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900009</entry>
|
||
<entry>26 января 2010</entry>
|
||
<entry>9.0-CURRENT после добавления ioctl SIOCGIFDESCR и
|
||
SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl можно
|
||
использовать для описания интерфейсов в духе OpenBSD.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900010</entry>
|
||
<entry>22 марта 2010</entry>
|
||
<entry>9.0-CURRENT после импорта zlib 1.2.4.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900011</entry>
|
||
<entry>24 апреля 2010</entry>
|
||
<entry>9.0-CURRENT после добавления журналирования мягких
|
||
обновлений.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900012</entry>
|
||
<entry>10 мая 2010</entry>
|
||
<entry>9.0-CURRENT после добавления liblzma, xz, xzdec
|
||
и lzmainfo.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900013</entry>
|
||
<entry>14 мая 2010</entry>
|
||
<entry>9.0-CURRENT после привлечения исправлений USB
|
||
в linux(4).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900014</entry>
|
||
<entry>10 июня 2010</entry>
|
||
<entry>9.0-CURRENT после добавления Clang.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900015</entry>
|
||
<entry>22 июля 2010</entry>
|
||
<entry>9.0-CURRENT после импорта BSD grep.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900016</entry>
|
||
<entry>28 июля 2010</entry>
|
||
<entry>9.0-CURRENT после добавления mti_zone в структуру
|
||
malloc_type_internal.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900017</entry>
|
||
<entry>23 августа 2010</entry>
|
||
<entry>9.0-CURRENT после изменения grep по умолчанию
|
||
обратно на GNU grep и добавления knob WITH_BSD_GREP.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900018</entry>
|
||
<entry>24 августа 2010</entry>
|
||
<entry>9.0-CURRENT после того, как сигнал, сгенерированный в
|
||
<function>pthread_kill(3)</function>, распознается в si_code
|
||
как SI_LWP. Ранее si_code содержал SI_USER.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900019</entry>
|
||
<entry>28 августа 2010</entry>
|
||
<entry>9.0-CURRENT после добавления в
|
||
<function>mmap(2)</function> флага MAP_PREFAULT_READ.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900020</entry>
|
||
<entry>9 сентября 2010</entry>
|
||
<entry>9.0-CURRENT после добавления в sbufs функциональности
|
||
осушения, что также изменило раскладку в структуре sbuf.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900021</entry>
|
||
<entry>13 сентября 2010</entry>
|
||
<entry>9.0-CURRENT после добавления в DTrace поддержки
|
||
трассировки пользовательских процессов.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900022</entry>
|
||
<entry>2 октября 2010</entry>
|
||
<entry>9.0-CURRENT после добавления BSDL утилит man
|
||
и списания GNU/GPL утилит man.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900023</entry>
|
||
<entry>11 октября 2010</entry>
|
||
<entry>9.0-CURRENT после обновления xz до снапшота
|
||
git 20101010.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900024</entry>
|
||
<entry>11 ноября 2010</entry>
|
||
<entry>9.0-CURRENT после замены libgcc.a на
|
||
libcompiler_rt.a.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900025</entry>
|
||
<entry>12 ноября 2010</entry>
|
||
<entry>9.0-CURRENT после появления модульного контроля
|
||
перегрузки.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900026</entry>
|
||
<entry>30 ноября 2010</entry>
|
||
<entry>9.0-CURRENT после появления протокола для поддержки
|
||
расширителей SAS (SMP, Serial Management Protocol) и
|
||
блоков управления (CCB) CAM XPT_SMP_IO и
|
||
XPT_GDEV_ADVINFO.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900027</entry>
|
||
<entry>5 декабря 2010</entry>
|
||
<entry>9.0-CURRENT после добавления log2 в libm.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900028</entry>
|
||
<entry>21 декабря 2010</entry>
|
||
<entry>9.0-CURRENT после добавления KPI Hhook (Helper
|
||
Hook), Khelp (Kernel Helpers) и Object Specific Data
|
||
(OSD).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900029</entry>
|
||
<entry>28 декабря 2010</entry>
|
||
<entry>9.0-CURRENT после изменения стека TCP для
|
||
взаимодействия с модулями Khelp через вспомогательные
|
||
точки связи и хранения данных уровня сетевого соединения
|
||
в управляющем блоке TCP.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900030</entry>
|
||
<entry>12 января 2011</entry>
|
||
<entry>9.0-CURRENT после обновления libdialog до версии
|
||
20100428.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900031</entry>
|
||
<entry>7 февраля 2011</entry>
|
||
<entry>9.0-CURRENT после добавления
|
||
<function>pthread_getthreadid_np(3)</function>.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900032</entry>
|
||
<entry>8 февраля 2011</entry>
|
||
<entry>9.0-CURRENT после удаления символа и прототипа
|
||
uio_yield.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900033</entry>
|
||
<entry>18 февраля 2011</entry>
|
||
<entry>9.0-CURRENT после обновления binutils до версии
|
||
2.17.50.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900034</entry>
|
||
<entry>8 марта 2011</entry>
|
||
<entry>9.0-CURRENT после изменений в struct sysvec
|
||
(sv_schedtail).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900035</entry>
|
||
<entry>29 марта 2011</entry>
|
||
<entry>9.0-CURRENT после обновления базовых gcc и libstdc++
|
||
до последних ревизий, выполненных под лицензией GPLv2.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900036</entry>
|
||
<entry>18 апреля 2011</entry>
|
||
<entry>9.0-CURRENT после удаления libobjc и поддержки
|
||
Objective-C из базовой системы.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900037</entry>
|
||
<entry>13 мая 2011</entry>
|
||
<entry>9.0-CURRENT после импорта библиотеки libprocstat(3)
|
||
и утилиты fuser(1) в базовую систему.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900038</entry>
|
||
<entry>22 мая 2011</entry>
|
||
<entry>9.0-CURRENT после добавления флага с параметрами
|
||
блокировки в VFS_FHTOVP(9).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900039</entry>
|
||
<entry>28 июня 2011</entry>
|
||
<entry>9.0-CURRENT после импорта pf из OpenBSD 4.5.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900040</entry>
|
||
<entry>19 июля 2011</entry>
|
||
<entry>Значение MAXCPU, используемое по умолчанию, увеличено
|
||
до 64 на amd64 и ia64, и до 128 для XLP (mips).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900041</entry>
|
||
<entry>13 августа 2011</entry>
|
||
<entry>9.0-CURRENT после реализации Capsicum capabilities;
|
||
в fget(9) добавлен аргумент rights.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900042</entry>
|
||
<entry>28 августа 2011</entry>
|
||
<entry>Увеличен номер версии для динамических библиотек,
|
||
ABI которых был изменен, в рамках подготовки к 9.0.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900043</entry>
|
||
<entry>2 сентября 2011</entry>
|
||
<entry>Добавлено автоматическое распознавание устройств
|
||
USB mass storage, которые не поддерживают команду SCSI
|
||
no synchronize cache.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900044</entry>
|
||
<entry>10 сентября 2011</entry>
|
||
<entry>Переработан механизм auto-quirk. 9.0-RELEASE</entry>
|
||
</row>
|
||
<!-- Обратите внимание: хотя некоторое время 900045 документировалось
|
||
как указано ниже, самого изменения никогда не было:
|
||
<row>
|
||
<entry>900045</entry>
|
||
<entry>13 октября 2011</entry>
|
||
<entry>Добавлен префикс sys_ для всех системных вызовов,
|
||
кроме тех, которые существуют для совместимости.</entry>
|
||
</row>
|
||
-->
|
||
<row>
|
||
<entry>900045</entry>
|
||
<entry>2 января 2012</entry>
|
||
<entry>9.0-CURRENT после выполнения MFC true/false
|
||
из 1000002.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900500</entry>
|
||
<entry>2 января 2012</entry>
|
||
<entry>9.0-STABLE.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900501</entry>
|
||
<entry>6 января 2012</entry>
|
||
<entry>9.0-STABLE после обратного портирования
|
||
системного вызова posix_fadvise(2).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900502</entry>
|
||
<entry>16 января 2012</entry>
|
||
<entry>9.0-STABLE после обратного портирования
|
||
gperf 3.0.3.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900503</entry>
|
||
<entry>15 февраля 2012</entry>
|
||
<entry>9.0-STABLE после появления нового расширяемого
|
||
интерфейса sysctl(3) NET_RT_IFLISTL для получения списка
|
||
адресов (рев. <svnref>231768</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900504</entry>
|
||
<entry>3 марта 2012</entry>
|
||
<entry>9.0-STABLE после изменения механизма монтирования
|
||
файловых систем в jail (рев. <svnref>232728</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>900503</entry>
|
||
<entry>13 марта 2012</entry>
|
||
<entry>9.0-STABLE после появления новых параметров сокета
|
||
tcp(4): TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и
|
||
TCP_KEEPCNT (рев. <svnref>232945</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000000</entry>
|
||
<entry>26 сентября 2011</entry>
|
||
<entry>10.0-CURRENT.</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000001</entry>
|
||
<entry>4 ноября 2011</entry>
|
||
<entry>10.0-CURRENT после добавления системного вызова
|
||
posix_fadvise(2).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000002</entry>
|
||
<entry>12 декабря 2011</entry>
|
||
<entry>10.0-CURRENT после определения булевых true/false в
|
||
sys/types.h, значение sizeof(bool) могло измениться
|
||
(рев. <svnref>228444</svnref>). 10-CURRENT после появления
|
||
xlocale.h (рев. <svnref>r227753</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000003</entry>
|
||
<entry>15 декабря 2011</entry>
|
||
<entry>10.0-CURRENT после крупных изменений в carp(4),
|
||
изменения размера структур in_aliasreq, in6_aliasreq
|
||
(рев. <svnref>228571</svnref>) и более строгих проверок
|
||
параметров SIOCAIFADDR (рев <svnref>228574</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000004</entry>
|
||
<entry>1 января 2012</entry>
|
||
<entry>10.0-CURRENT после удаления skpc(9) и добавления
|
||
of memcchr(9) (рев. <svnref>229200</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000005</entry>
|
||
<entry>16 января 2012</entry>
|
||
<entry>10.0-CURRENT после удаления поддержки ioctl
|
||
SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR
|
||
(рев. <svnref>230207</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000006</entry>
|
||
<entry>26 января 2012</entry>
|
||
<entry>10.0-CURRENT после появления асинхронных уведомлений
|
||
о наличии входных данных в уровне cam(4)
|
||
(рев. <svnref>230590</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000007</entry>
|
||
<entry>5 февраля 2012</entry>
|
||
<entry>10.0-CURRENT после появления новых параметров сокета
|
||
tcp(4): TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и
|
||
TCP_KEEPCNT (рев. <svnref>231025</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000008</entry>
|
||
<entry>11 февраля 2012</entry>
|
||
<entry>10.0-CURRENT после появления нового расширяемого
|
||
интерфейса sysctl(3) NET_RT_IFLISTL для получения списка
|
||
адресов (рев. <svnref>231505</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000010</entry>
|
||
<entry>31 марта 2012</entry>
|
||
<entry>10.0-CURRENT после исправлений в xlocale
|
||
(рев. <svnref>233757</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000011</entry>
|
||
<entry>16 апреля 2012</entry>
|
||
<entry>10.0-CURRENT после импорта LLVM/Clang 3.1 trunk
|
||
r154661 (рев. <svnref>234353</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000012</entry>
|
||
<entry>2 мая 2012</entry>
|
||
<entry>10.0-CURRENT после импорта jemalloc
|
||
(рев. <svnref>234924</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000013</entry>
|
||
<entry>22 мая 2012</entry>
|
||
<entry>10.0-CURRENT после импорта byacc
|
||
(рев. <svnref>235788</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000014</entry>
|
||
<entry>27 июня 2012</entry>
|
||
<entry>10.0-CURRENT после изменения sort по умолчанию
|
||
на BSD sort (рев. <svnref>237629</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>1000015</entry>
|
||
<entry>12 июля 2012</entry>
|
||
<entry>10.0-CURRENT после импорта OpenSSL 1.0.1c
|
||
(рев. <svnref>238405</svnref>).</entry>
|
||
</row>
|
||
<row>
|
||
<entry>(не изменено)</entry>
|
||
<entry>13 июля 2012</entry>
|
||
<entry>10-CURRENT после исправления регрессии в
|
||
LLVM/Clang 3.1 (рев. <svnref>238429</svnref>).</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<note>
|
||
<para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как
|
||
<quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой принцип
|
||
использовался год и месяц, но мы решили изменить его на более
|
||
однозначную систему нумерации старший/младший, начиная с версии
|
||
2.2. Это объясняется тем, что параллельная разработка в нескольких
|
||
ветках делает непрактичным идентификацию релизов просто по их
|
||
реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит
|
||
заботиться о старых версиях -CURRENT; они перечислены здесь просто
|
||
в информационных целях.</para>
|
||
</note>
|
||
</sect1>
|
||
|
||
<sect1 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><makevar>ARCH</makevar></entry>
|
||
<entry>Архитектура машины в виде, получаемом по команде
|
||
<command>uname -m</command> (например,
|
||
<literal>i386</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>OPSYS</makevar></entry>
|
||
<entry>Тип операционной системы, получаемый по команде
|
||
<command>uname -s</command> (например,
|
||
<literal>FreeBSD</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>OSREL</makevar></entry>
|
||
<entry>Версия релиза операционной системы (например,
|
||
<literal>2.1.5</literal> или <literal>2.2.7</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>OSVERSION</makevar></entry>
|
||
|
||
<entry>Версия операционной системы в виде числа, та же, что и <link
|
||
linkend="freebsd-versions">
|
||
<literal>__FreeBSD_version</literal></link>.</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>LOCALBASE</makevar></entry>
|
||
<entry>Корень дерева <quote>local</quote> (например,
|
||
<literal>/usr/local/</literal>)</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><makevar>PREFIX</makevar></entry>
|
||
<entry>Куда, собственно, устанавливается порт (обратитесь к <link
|
||
linkend="porting-prefix">
|
||
подробной информации о <makevar>PREFIX</makevar></link>).</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<note>
|
||
<para>Если вы задаете переменные <makevar>USE_IMAKE</makevar>
|
||
или <makevar>MASTERDIR</makevar>, то делайте это до
|
||
подключения <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
|
||
|
||
# only one shlib version number for ELF
|
||
.if ${PORTOBJFORMAT} == "elf"
|
||
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
|
||
.else
|
||
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
|
||
.endif
|
||
|
||
# software already makes link for ELF, but not for a.out
|
||
post-install:
|
||
.if ${PORTOBJFORMAT} == "aout"
|
||
${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
|
||
.endif</programlisting>
|
||
|
||
<para>Вы не забываете об использовании табуляции вместо пробелов
|
||
после <literal>BROKEN=</literal> и <literal>TCL_LIB_FILE=</literal>,
|
||
не так ли? <!-- улыбка -->:-).</para>
|
||
</sect1>
|
||
|
||
<sect1 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 id="dads-rational">
|
||
<title>Поступайте разумно</title>
|
||
|
||
<para>Файл <filename>Makefile</filename> должен выполнять действия
|
||
просто и небеспричинно. Если вы можете сделать что-то на несколько
|
||
строк короче или более читабельно, сделайте это. В качестве примеров
|
||
можно привести использование конструкций <literal>.if</literal>
|
||
утилиты make вместо соответствующей конструкции <literal>if</literal>
|
||
командного процессора, ненужность переопределения цели
|
||
<maketarget>do-extract</maketarget> при возможности переопределения
|
||
<makevar>EXTRACT*</makevar> и использование
|
||
<makevar>GNU_CONFIGURE</makevar> вместо
|
||
<literal>CONFIGURE_ARGS+= --prefix=${PREFIX}</literal>.</para>
|
||
|
||
<para>Если вы обнаружите, что для выполнения чего-то приходится писать
|
||
много нового кода, то, пожалуйста, просмотрите файл
|
||
<filename>bsd.port.mk</filename> на предмет того, не содержит ли он
|
||
реализацию именно вашей проблемы. Хотя его трудно читать, имеется
|
||
много проблем, выглядящих сложными, для которых файл
|
||
<filename>bsd.port.mk</filename> уже содержит быстрое решение.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-cc">
|
||
<title>Работа как с <makevar>CC</makevar>, так и
|
||
<makevar>CXX</makevar></title>
|
||
|
||
<para>Порт должен принимать во внимание как переменную
|
||
<makevar>CC</makevar>, так и <makevar>CXX</makevar>.
|
||
Под этим мы подразумеваем, что порт ни в коем случае не должен
|
||
устанавливать значения этих переменных, переопределяя имеющиеся
|
||
значения; вместо этого можно добавлять нужные значения к уже
|
||
имеющимся. Это связано с тем, что параметры построения,
|
||
относящиеся ко всем портам, могут быть заданы глобально.</para>
|
||
|
||
<para>Если порты не учитывают значения этих переменных, добавьте
|
||
строку <literal>NO_PACKAGE=ignores either cc or cxx</literal>
|
||
в файл <filename>Makefile</filename>.</para>
|
||
|
||
<para>Далее следует пример файла <filename>Makefile</filename>,
|
||
использующего как переменную <makevar>CC</makevar>, так и
|
||
<makevar>CXX</makevar>. Обратите внимание на использование символов
|
||
<makevar>?=</makevar>:</para>
|
||
|
||
<programlisting>CC?= gcc</programlisting>
|
||
|
||
<programlisting>CXX?= g++</programlisting>
|
||
|
||
<para>Вот пример, в котором не принимаются во внимание ни переменная
|
||
<makevar>CC</makevar>, ни <makevar>CXX</makevar>:</para>
|
||
|
||
<programlisting>CC= gcc</programlisting>
|
||
|
||
<programlisting>CXX= g++</programlisting>
|
||
|
||
<para>Обе переменные <makevar>CC</makevar> и <makevar>CXX</makevar>
|
||
могут быть определены в системах FreeBSD в файле
|
||
<filename>/etc/make.conf</filename>. В первом примере задаётся
|
||
значение, если оно ранее не было определено в
|
||
<filename>/etc/make.conf</filename>, что сохраняет любые определения,
|
||
данные на уровне системы в целом. Второй пример переопределяет всё,
|
||
что было задано ранее.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-cflags">
|
||
<title>Использование <makevar>CFLAGS</makevar></title>
|
||
|
||
<para>Порт должен принимать во внимание переменную
|
||
<makevar>CFLAGS</makevar>.
|
||
Под этим мы подразумеваем, что порт ни в коем случае не должен
|
||
устанавливать значения этих переменных, переопределяя имеющиеся
|
||
значения; вместо этого можно добавлять нужные значения к уже
|
||
имеющимся. Это связано с тем, что параметры построения,
|
||
относящиеся ко всем портам, могут быть заданы глобально.</para>
|
||
|
||
<para>Если порты не учитывают значения этой переменной, добавьте
|
||
строку <literal>NO_PACKAGE=ignores cflags</literal> в файл
|
||
<filename>Makefile</filename>.</para>
|
||
|
||
<para>Далее следует пример файла <filename>Makefile</filename>,
|
||
использующего переменную <makevar>CFLAGS</makevar>. Обратите
|
||
внимание на использование символов <makevar>+=</makevar>:</para>
|
||
|
||
<programlisting>
|
||
CFLAGS+= -Wall -Werror
|
||
</programlisting>
|
||
|
||
<para>А вот пример, в котором не учитывается значение переменной
|
||
<makevar>CFLAGS</makevar>:</para>
|
||
|
||
<programlisting>
|
||
CFLAGS= -Wall -Werror
|
||
</programlisting>
|
||
|
||
<para>В системе FreeBSD переменная <makevar>CFLAGS</makevar> определена
|
||
в файле <filename>/etc/make.conf</filename>. В первом примере к
|
||
переменной <makevar>CFLAGS</makevar> добавляются дополнительные флаги,
|
||
при этом сохраняются все определения, данные ранее на уровне системы.
|
||
Во втором примере всё, что было задано ранее, игнорируется.</para>
|
||
|
||
<para>Из сторонних файлов <filename>Makefile</filename> следует удалить
|
||
флаги оптимизации. Общесистемные флаги оптимизации находятся в
|
||
системной переменной <makevar>CFLAGS</makevar>. Пример из
|
||
немодифицированного <filename>Makefile</filename>:</para>
|
||
|
||
<programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting>
|
||
|
||
<para>При использовании системных флагов оптимизации
|
||
<filename>Makefile</filename> станет похожим на следующий пример:</para>
|
||
|
||
<programlisting>CFLAGS+= -DHAVE_SOUND</programlisting>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="dads-pthread">
|
||
<title>Библиотеки потоков</title>
|
||
|
||
<para>Во &os; библиотека потоков обязана быть скомпонована с
|
||
исполняемыми файлами с использованием специального флага
|
||
компоновщика <literal>-pthread</literal>. Если порт настаивает
|
||
на прямой компоновке с <literal>-lpthread</literal> или
|
||
<literal>-lc_r</literal>, создайте патч с использованием
|
||
переменной <makevar>PTHREAD_LIBS</makevar>, предусмотренной
|
||
инфраструктурой портов. Обычно для этой переменной установлено
|
||
значение <literal>-pthread</literal>, но на определенных
|
||
архитектурах и версиях &os; она может иметь другие значения,
|
||
поэтому не задавайте <literal>-pthread</literal> в патчах
|
||
статически и всегда используйте <makevar>PTHREAD_LIBS</makevar>.
|
||
</para>
|
||
|
||
<note>
|
||
<para>Если построение порта заканчивается ошибкой
|
||
<literal>unrecognized option '-pthread'</literal> при
|
||
установленной переменной <makevar>PTHREAD_LIBS</makevar>,
|
||
то может быть желательно использование <command>gcc</command>
|
||
в качестве компоновщика через установку
|
||
<makevar>CONFIGURE_ENV</makevar> в <literal>LD=${CC}</literal>.
|
||
Параметр <literal>-pthread</literal> напрямую командой
|
||
<command>ld</command> не поддерживается.</para>
|
||
</note>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="dads-freedback">
|
||
<title>Пожелания</title>
|
||
|
||
<para>Посылайте подходящие изменения/патчи авторам/сопровождающему
|
||
для включения в следующий релиз. Это только сделает вашу работу
|
||
гораздо легче при выходе следующего релиза.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-readme">
|
||
<title><filename>README.html</filename></title>
|
||
|
||
<para>Не включайте сюда файл <filename>README.html</filename>. Этот файл
|
||
не является частью дерева SVN, и он генерируется при помощи команды
|
||
<command>make readme</command>.</para>
|
||
|
||
<note>
|
||
<para>Если не удается выполнить <command>make readme</command>,
|
||
убедитесь, что значение по умолчанию <makevar>ECHO_MSG</makevar>
|
||
не было изменено внутри порта.</para>
|
||
</note>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-noinstall">
|
||
<title>Пометка неустанавливаемого порта как <makevar>BROKEN</makevar>,
|
||
<makevar>FORBIDDEN</makevar> или <makevar>IGNORE</makevar></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 id="dads-noinstall-variables">
|
||
<title>Переменные</title>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><makevar>BROKEN</makevar> предназначена для портов, которые
|
||
в настоящее время не компилируются, не устанавливаются или не
|
||
удаляются правильно. Следует использовать для портов,
|
||
когда проблема считается временной.</para>
|
||
|
||
<para>В особых случаях кластер
|
||
построения будет продолжать попытки собрать их, чтобы показать,
|
||
решена ли основная проблема. (Однако, как правило, кластер
|
||
запускается без этой возможности.)</para>
|
||
|
||
<para>В частности, используйте
|
||
<makevar>BROKEN</makevar>, когда порт:</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><makevar>FORBIDDEN</makevar> используется для портов, которые
|
||
содержат уязвимости в информационной безопасности или
|
||
являются потенциально вредными в плане обеспечения информационной
|
||
безопасности системы FreeBSD при установке данного порта
|
||
(например: заведомо небезопасная программа или программа, которая
|
||
предоставляет легко взламываемые сервисы). Порты должны
|
||
помечаться как <makevar>FORBIDDEN</makevar>, как только в
|
||
конкретном программном обеспечении обнаружилась уязвимость, но
|
||
обновление выпущено не было. В идеальном случае порты должны
|
||
обновляться максимально быстро после обнаружения уязвимости,
|
||
чтобы уменьшить число уязвимых хостов FreeBSD (нам нравится иметь
|
||
репутацию безопасной системы), однако иногда случается
|
||
значительный временной разрыв между обнаружением уязвимости и
|
||
выходом обновлённого релиза уязвимого программного обеспечения.
|
||
Не помечайте порт как <makevar>FORBIDDEN</makevar>, если причина
|
||
не вызвана соображениями информационной безопасности.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><makevar>IGNORE</makevar> предназначена для портов, которые
|
||
не должны строиться по какой-либо другой причине. Следует
|
||
использовать для портов, в случае когда проблема считает
|
||
конструктивной. Кластер построения
|
||
ни при каких условиях не будет строить порты, помеченные как
|
||
<makevar>IGNORE</makevar>. В частности, используйте
|
||
<makevar>IGNORE</makevar>, когда порт:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>компилируется, но работает неправильно</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>не работает на установленной версии &os;</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>требует для построения исходные тексты ядра &os;, но
|
||
у пользователя в установленном виде они отсутствуют</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>имеет distfile, который не может быть автоматически
|
||
извлечен из-за лицензионных ограничений</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>не работает с каким-либо другим портом, установленным
|
||
в настоящее время (например, порт зависит от <filename
|
||
role="package">www/apache20</filename>, но установлен
|
||
<filename role="package">www/apache22</filename>)
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<note>
|
||
<para>Если порт будет конфликтовать с уже установленным портом,
|
||
(например, если они устанавливают файл в то же место, но
|
||
с иным функциональным назначением), то
|
||
<link linkend="conflicts">используйте
|
||
вместо этого <makevar>CONFLICTS</makevar></link>.
|
||
<makevar>CONFLICTS</makevar> сам установит значение
|
||
<makevar>IGNORE</makevar>.</para>
|
||
</note>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если порт нужно пометить как <makevar>IGNORE</makevar>
|
||
только на некоторых архитектурах, для этого есть две другие
|
||
удобные переменные, которые автоматически установят для вас
|
||
значения: <makevar>ONLY_FOR_ARCHS</makevar> и
|
||
<makevar>NOT_FOR_ARCHS</makevar>. Примеры:</para>
|
||
|
||
<programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting>
|
||
|
||
<programlisting>NOT_FOR_ARCHS= ia64 sparc64</programlisting>
|
||
|
||
<para>Собственное сообщение <makevar>IGNORE</makevar> можно задать
|
||
с использованием <makevar>ONLY_FOR_ARCHS_REASON</makevar> и
|
||
<makevar>NOT_FOR_ARCHS_REASON</makevar>. Отдельно для каждой
|
||
архитектуры это возможно с использованием
|
||
<makevar>ONLY_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></makevar>
|
||
и
|
||
<makevar>NOT_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></makevar>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Если порт загружает и устанавливает исполняемые файлы i386,
|
||
то следует установить <makevar>IA32_BINARY_PORT</makevar>.
|
||
Если эта переменная установлена, будет выполнена проверка
|
||
доступности каталога <filename>/usr/lib32</filename> для
|
||
библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении
|
||
любого из этих условий будет автоматически установлена
|
||
переменная <makevar>IGNORE</makevar>.</para>
|
||
</listitem>
|
||
|
||
</itemizedlist>
|
||
|
||
</sect2>
|
||
<sect2 id="dads-noinstall-notes">
|
||
<title>Замечания по реализации</title>
|
||
|
||
<para>Строки не следует брать в кавычки.
|
||
Также построение строки должно несколько различаться из-за
|
||
способа отображения информации пользователю. Примеры:</para>
|
||
|
||
<programlisting>BROKEN= this port is unsupported on FreeBSD 5.x</programlisting>
|
||
|
||
<programlisting>IGNORE= is unsupported on FreeBSD 5.x</programlisting>
|
||
|
||
<para>получаемые в результате следующего вывода
|
||
<command>make describe</command>:</para>
|
||
|
||
<programlisting>===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.</programlisting>
|
||
|
||
<programlisting>===> foobar-0.1 is unsupported on FreeBSD 5.x.</programlisting>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-deprecated">
|
||
<title>Пометка порта на удаление с <makevar>DEPRECATED</makevar>
|
||
или <makevar>EXPIRATION_DATE</makevar></title>
|
||
|
||
<para>Помните, что <makevar>BROKEN</makevar> и
|
||
<makevar>FORBIDDEN</makevar> будут использованы как временное
|
||
средство, если порт не является работающим. Постоянно
|
||
неработоспособные порты должны полностью удаляться из дерева.</para>
|
||
|
||
<para>В подходящих ситуациях пользователи могут быть оповещены о
|
||
предстоящем удалении через переменные <makevar>DEPRECATED</makevar>
|
||
и <makevar>EXPIRATION_DATE</makevar>. Первое - это просто строка,
|
||
сообщающая причину запланированного удаления порта; вторая является
|
||
строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны
|
||
пользователю.</para>
|
||
|
||
<para>Переменную <makevar>DEPRECATED</makevar> можно установить без
|
||
использования <makevar>EXPIRATION_DATE</makevar> (в частности, при
|
||
рекомендации новой версии порта), но обратный порядок не имеет
|
||
никакого смысла.</para>
|
||
|
||
<para>Не существует устоявшейся политики, как долго следует продолжать
|
||
уведомления. Текущая практика дает около месяца для решения проблем
|
||
безопасности и два месяца для проблем построения. Это также дает
|
||
немного времени на исправление проблем любым заинтересованным
|
||
коммиттерам.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-dot-error">
|
||
<title>Избегайте использования конструкции
|
||
<literal>.error</literal></title>
|
||
|
||
<para>Правильным способом подать сигнал для <filename>Makefile</filename>
|
||
о том, что порт не может быть установлен из-за какого-то внешнего
|
||
фактора (например, пользователь указал недопустимую комбинацию
|
||
опций построения), является установка непустого значения для
|
||
<makevar>IGNORE</makevar>. Это значение будет сформатировано и
|
||
показано пользователю во время <command>make install</command>.</para>
|
||
|
||
<para>Использование для этих целей <literal>.error</literal> является
|
||
распространенной ошибкой. Проблема в том, что в этой ситуации
|
||
будут повреждены многие инструменты автоматизации, работающие с
|
||
деревом портов. Наибольшим образом это распространено при попытке
|
||
построить <filename>/usr/ports/INDEX</filename> (смотрите <xref
|
||
linkend="make-describe"/>). Тем не менее, даже более простые команды,
|
||
такие как <command>make maintainer</command>, в этом случае также
|
||
вернут ошибку. Это не является приемлемым.</para>
|
||
|
||
<example id="dot-error-breaks-index">
|
||
<title>Как избегать использование <literal>.error</literal></title>
|
||
<para>Предположим, что кто-то поместил строку</para>
|
||
|
||
<programlisting>USE_POINTYHAT=yes</programlisting>
|
||
|
||
<para>в <filename>make.conf</filename>. Первый из последующих двух
|
||
вариантов строк файла <filename>Makefile</filename> приведёт к
|
||
неудачному завершению работы <command>make index</command>, а
|
||
второй - нет:</para>
|
||
<programlisting>.if USE_POINTYHAT
|
||
.error "POINTYHAT is not supported"
|
||
.endif</programlisting>
|
||
|
||
<programlisting>.if USE_POINTYHAT
|
||
IGNORE=POINTYHAT is not supported
|
||
.endif</programlisting>
|
||
</example>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="dads-sysctl">
|
||
<title>Использование <filename>sysctl</filename></title>
|
||
|
||
<para>Использование <filename>sysctl</filename> не рекомендуется,
|
||
кроме как при выполнении целей. Это вызвано тем, что вычисление
|
||
любых <literal>makevar</literal>, таких как во время команды
|
||
<command>make index</command>, с необходимостью запуска этой
|
||
команды, еще больше замедляет весь процесс.</para>
|
||
|
||
<para>&man.sysctl.8; следует всегда использовать через переменную
|
||
<makevar>SYSCTL</makevar>, поскольку она содержит полностью заданный
|
||
путь, и при необходимости может быть переопределена.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="dads-rerolling-distfiles">
|
||
<title>Меняющиеся дистрибутивные файлы</title>
|
||
|
||
<para>Иногда авторы программного обеспечения меняют содержимое
|
||
выпущенных дистрибутивных файлов без смены названия. Вы должны
|
||
проверять, что изменения являются официальными и произведены
|
||
автором. В прошлом бывало, что дистрибутивный файл молча изменялся
|
||
на сайтах загрузки с намерением нанести вред или скомпрометировать
|
||
безопасность конечного пользователя.</para>
|
||
|
||
<para>Отложите старый файл с дистрибутивом в сторону, загрузите новый,
|
||
распакуйте его и сравните содержимое при помощи &man.diff.1;.
|
||
Если вы не видите ничего подозрительного, то можете обновить файл
|
||
<filename>distinfo</filename>. Убедитесь, что вы подытожили различия
|
||
в вашем PR или описании коммита, чтобы другие люди были в курсе, что
|
||
вы позаботились о том, что ничего плохого не случилось.</para>
|
||
|
||
<para>Возможно вы также захотите связаться с автором этого программного
|
||
обеспечения для подтверждения изменений.</para>
|
||
</sect1>
|
||
|
||
<sect1 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>Используйте <ulink
|
||
url="http://www.freebsd.org/cgi/man.cgi">страницы
|
||
справочника</ulink> для проверки, относится ли функция к
|
||
интерфейсу <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>-измов
|
||
расположен <ulink
|
||
url="https://wiki.ubuntu.com/DashAsBinSh">здесь</ulink>.</para>
|
||
|
||
<para>Не используйте <literal>#include
|
||
<filename><stdint.h></filename></literal>, если
|
||
достаточно подключить <filename>inttypes.h</filename>. Это
|
||
позволит убедиться, что программное обеспечение собирается на
|
||
более старых версиях &os;.</para>
|
||
|
||
<para>Проверьте, что используемые заголовочные файлы включены в
|
||
<acronym>POSIX</acronym> или список, рекомендуемый страницей
|
||
справочника, т.к. например, забыть подключить
|
||
<filename>sys/types.h</filename> — не такая уж проблема
|
||
в &linux;, однако это не так во &os;.</para>
|
||
|
||
<para>Компилируйте многопоточные приложения с ключом
|
||
<quote>-pthread</quote>, а не <quote>-lpthread</quote> или
|
||
как-либо ещё.</para>
|
||
</sect1>
|
||
|
||
<sect1 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>
|
||
|
||
<chapter 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>
|
||
[заголовок...просто чтобы нам было легче идентифицировать порт.]
|
||
# New ports collection makefile for: xdvi
|
||
[строчка "version required" необходима только тогда, когда переменная
|
||
PORTVERSION недостаточно конкретна для описания порта.]
|
||
# Date created: 26 May 1995
|
||
[Это человек, который сделал первоначальный порт для FreeBSD, в частности,
|
||
тот, кто создал первую версию этого файла Makefile. Запомните, что позже
|
||
при обновлении порта эта строка меняться не должна.]
|
||
# Whom: Satoshi Asami <asami@FreeBSD.org>
|
||
#
|
||
# $FreeBSD$
|
||
[ ^^^^^^^^^ Эта строка будет автоматически заменена со строчкой RCS ID
|
||
системой SVN при выполнении операции коммита в наше хранилище. При
|
||
обновлении порта не приводите эту строку обратно к виду
|
||
"$FreeBSD$". SVN сделает это автоматически.]
|
||
#
|
||
|
||
[секция описания собственно порта и основного сервера - сначала всегда
|
||
PORTNAME и PORTVERSIONA, за ним следует 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= A DVI Previewer for the X Window System
|
||
|
||
[зависимости -- могут быть пустыми]
|
||
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
|
||
LIB_DEPENDS= Xpm:${PORTSDIR}/graphics/xpm
|
||
|
||
[этот раздел для остальных стандартных переменных из 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...]
|
||
USE_GMAKE= yes
|
||
[Если это приложение X и требует запуска "xmkmf -a"...]
|
||
USE_IMAKE= yes
|
||
[и так далее]
|
||
|
||
[В правилах ниже используются нестандартные переменные]
|
||
MY_FAVORITE_RESPONSE= "yeah, right"
|
||
|
||
[теперь специальные правила, в порядке их вызова]
|
||
pre-fetch:
|
||
я что-то выкачиваю, точно
|
||
|
||
post-patch:
|
||
мне кое-что сделать после применения патча, великолепно
|
||
|
||
pre-install:
|
||
и потом еще кое-что перед установкой, ого
|
||
|
||
[и, наконец, эпилог]
|
||
.include <bsd.port.mk>
|
||
</programlisting>
|
||
</chapter>
|
||
|
||
|
||
<chapter id="keeping-up">
|
||
<title>Актуализация</title>
|
||
|
||
<para>Коллекция Портов &os; постоянно изменяется. Здесь находится
|
||
некоторая информация о том, как поддерживать её в актуальном
|
||
состоянии.</para>
|
||
|
||
<sect1 id="freshports">
|
||
<title>FreshPorts</title>
|
||
|
||
<para>Самым простым способом отслеживать уже произошедшие обновления
|
||
является подписка на <ulink url="http://www.FreshPorts.org/">
|
||
FreshPorts</ulink>. Для мониторинга вы можете выбрать несколько
|
||
портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь,
|
||
потому что они будут получать уведомления не только о собственных
|
||
изменениях, но и об изменениях, сделанных любым другим коммиттером
|
||
&os;. (Это часто необходимо для синхронизации с изменениями на более
|
||
низком технологическом уровне—хотя более корректным было бы
|
||
получение предупреждений от тех, кто вносит подобные изменения,
|
||
иногда этот этап пропускается или он просто непрактичен. Кроме того,
|
||
в некоторых случаях изменения по своей природе весьма незначительны.
|
||
Мы полагаем, что любой разработчик в таких ситуациях будет
|
||
руководствоваться здравым смыслом).</para>
|
||
|
||
<para>Если вы хотите использовать FreshPorts, то вам нужна только
|
||
учётная запись. Если регистрационный адрес вашей электронной почты
|
||
будет иметь вид <literal>@FreeBSD.org</literal>, то справа на
|
||
Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто
|
||
уже получил учётную запись FreshPorts, но не использовал собственный
|
||
адрес электронной почты <literal>@FreeBSD.org</literal>, достаточно
|
||
сменить адрес на <literal>@FreeBSD.org</literal>, подписаться, а
|
||
затем сменить его обратно.</para>
|
||
|
||
<para>Во FreshPorts имеется также функция проверки правильности,
|
||
которая автоматически проверяет каждое изменение, внесённое в дерево
|
||
портов FreeBSD. Если вы подпишетесь на эту услугу, то будете
|
||
оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке
|
||
внесённых вами изменений.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="svnweb">
|
||
<title>Web-интерфейс к хранилищу исходных текстов</title>
|
||
|
||
<para>Файлы в хранилище исходных текстов можно просматривать при помощи
|
||
Web-интерфейса. Изменения, которые касаются в целом всей системы
|
||
портов, теперь документируются в файле <ulink
|
||
url="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</ulink>.
|
||
Изменения, касающиеся отдельных портов, отражаются теперь в
|
||
файле <ulink
|
||
url="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</ulink>.
|
||
Однако однозначный ответ на любой вопрос можно найти, только
|
||
прочитав исходных код <ulink
|
||
url="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</ulink>
|
||
и связанных с ним файлов.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="ports-mailling-list">
|
||
<title>Список рассылки &os;, посвящённый портам</title>
|
||
|
||
<para>Если вы поддерживаете порты, то должны следить за &a.ports;.
|
||
О важных изменениях, отражающихся на работе портов, будет сообщаться
|
||
здесь, а затем они переносятся в <filename>CHANGES</filename>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="build-cluster">
|
||
<title>Кластер построения портов &os; на
|
||
<hostid role="hostname">pointyhat.FreeBSD.org</hostid></title>
|
||
|
||
<para>Одной из наименее известных сильных сторон &os; является тот
|
||
факт, что для непрерывного построения Коллекции Портов для каждого
|
||
из основных релизов ОС для каждой архитектуры уровня поддержки
|
||
Tier-1 выделен целый кластер машин. Вы можете увидеть результаты
|
||
этих построений в <ulink url="http://pointyhat.FreeBSD.org/">протоколах
|
||
построения пакетов и обнаруженных ошибок</ulink>.</para>
|
||
|
||
<para>Отдельные порты собираются, если они специально не помечены как
|
||
<makevar>IGNORE</makevar>. Для портов, помеченных как
|
||
<makevar>BROKEN</makevar>, попытки будут продолжены для того,
|
||
чтобы увидеть, если основная проблема была решена. (Это сделано
|
||
через использование переменной <makevar>TRYBROKEN</makevar> для
|
||
<filename>Makefile</filename> порта.)</para>
|
||
|
||
</sect1>
|
||
|
||
<sect1 id="distfile-survey">
|
||
<title>Portscout: сканер дистрибутивных файлов портов &os;</title>
|
||
|
||
<para>Кластер построения выделен для выполнения самого последнего
|
||
релиза каждого из портов, дистрибутивные файлы которых уже были
|
||
сгружены. Однако из-за постоянных изменений в Internet
|
||
дистрибутивные файлы могут быстро исчезать. <ulink
|
||
url="http://www.portscout.org">Portscout</ulink>, средство
|
||
сканирования дистрибутивных файлов &os; пытается опросить
|
||
каждый из сайтов, доступных для сгрузки каждого из портов,
|
||
для определения того, доступны ли ещё дистрибутивные файлы.
|
||
<application>Portscout</application> может готовить отчёты
|
||
в <acronym>HTML</acronym> и рассылать электронные письма об
|
||
имеющихся обновлениях для портов тем, кто это запрашивает.
|
||
Мейнтейнеры периодически запрашивают наличие изменений, либо
|
||
вручную, либо используя ленту <acronym>RSS</acronym>.</para>
|
||
|
||
<para>Главная страница <application>Portscout</application>
|
||
отображает email мейнтейнера порта, количество портов, за
|
||
которые ответственен мейнтейнер, количество портов с новыми
|
||
дистрибутивными файлами и процент устаревших портов. Функция
|
||
поиска выполняет поиск мейнтейнера по адресу электронной почты
|
||
и позволяет выбирать между всеми портами или только
|
||
устаревшими.</para>
|
||
|
||
<para>При щелчке по адресу электронной почты мейнтейнера
|
||
отображается список всех его портов, разделённых по категориям,
|
||
вместе с текущим номером версии, информацией о наличии новой
|
||
версии, временем последнего обновления порта и временем его
|
||
последней проверки. Функция поиска на этой странице позволяет
|
||
пользователю выполнять поиск конкретного порта.</para>
|
||
|
||
<para>По щелчку на название порта в списке отображается информация
|
||
о порте <ulink url="http://freshports.org">FreshPorts</ulink>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="portsmon">
|
||
<title>Система мониторинга портов &os;</title>
|
||
|
||
<para>Другим полезным ресурсом является <ulink
|
||
url="http://portsmon.FreeBSD.org">Система мониторинга портов
|
||
FreeBSD</ulink> (известная также как <literal>portsmon</literal>).
|
||
Система представляет собой базу данных, обрабатывающую информацию из
|
||
нескольких источников и позволяющую просматривать их при помощи
|
||
Web-интерфейса. На данный момент задействованы база сообщений об
|
||
ошибках (PR), протоколы ошибок кластера построения и отдельные файлы
|
||
из коллекции портов. В будущем в этот список будет добавлена система
|
||
проверки дистрибутивных файлов и другие ресурсы.</para>
|
||
|
||
<para>Для начала вы можете просмотреть всю информацию о некотором порте
|
||
при помощи средства <ulink
|
||
url="http://portsmon.FreeBSD.org/portoverview.py">Обзор
|
||
отдельного порта</ulink>.</para>
|
||
|
||
<para>На момент написания это единственный доступный ресурс, который
|
||
для имени порта ставит в соответствие записи PR GNATS.
|
||
(Отправители PR не всегда добавляют в название имя порта, хотя
|
||
мы предпочитаем, чтобы они это делали.) Таким образом,
|
||
<literal>portsmon</literal> это хорошее место для начала, если вы
|
||
хотите найти присланные PR и/или ошибки построения для существующего
|
||
порта; либо поискать, был ли уже прислан новый порт, который вы
|
||
подумывали создать сами.</para>
|
||
</sect1>
|
||
</chapter>
|
||
</book>
|