diff options
author | Sergey Kandaurov <pluknet@FreeBSD.org> | 2014-07-12 14:08:49 +0000 |
---|---|---|
committer | Sergey Kandaurov <pluknet@FreeBSD.org> | 2014-07-12 14:08:49 +0000 |
commit | 8cc7166d976d6a5da04a21b299bcf499bdbf3682 (patch) | |
tree | 0943fd4d24cbb7f8e9c8f679db728cf6a7b92e2a /ru_RU.KOI8-R/books | |
parent | 63c96f9f372d73d0a3758c4ea154578f308e4e71 (diff) | |
download | doc-8cc7166d976d6a5da04a21b299bcf499bdbf3682.tar.gz doc-8cc7166d976d6a5da04a21b299bcf499bdbf3682.zip |
Whitespace fixes after PH split.
Notes
Notes:
svn path=/head/; revision=45256
Diffstat (limited to 'ru_RU.KOI8-R/books')
17 files changed, 11686 insertions, 11365 deletions
diff --git a/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml index 00e7ce81a5..c6fd86a2ee 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml @@ -7,67 +7,70 @@ Original revision: r43844 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices"> +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink= + "http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices"> - <title>Приложения</title> + <title>Приложения</title> - <sect1 xml:id="uses-values"> - <title>Значения <varname>USES</varname></title> + <sect1 xml:id="uses-values"> + <title>Значения <varname>USES</varname></title> - <table> - <title>Значения <varname>USES</varname></title> + <table> + <title>Значения <varname>USES</varname></title> - <tgroup cols="3"> - <thead> - <row> - <entry>Наименование</entry> - <entry>Аргументы</entry> - <entry>Описание</entry> - </row> - </thead> - <tbody valign="top"> - &values.uses; - </tbody> - </tgroup> - </table> - </sect1> + <tgroup cols="3"> + <thead> + <row> + <entry>Наименование</entry> + <entry>Аргументы</entry> + <entry>Описание</entry> + </row> + </thead> - <sect1 xml:id="freebsd-versions"> - <title>Значения <literal>__FreeBSD_version</literal></title> + <tbody valign="top"> + &values.uses; + </tbody> + </tgroup> + </table> + </sect1> - <para>Ниже для справки приводится перечень значений - <literal>__FreeBSD_version</literal> в виде, который определён в - <link xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para> + <sect1 xml:id="freebsd-versions"> + <title>Значения <literal>__FreeBSD_version</literal></title> - <table frame="none"> - <title>Значения <literal>__FreeBSD_version</literal></title> + <para>Ниже для справки приводится перечень значений + <literal>__FreeBSD_version</literal> в виде, который определён + в <link + xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para> - <tgroup cols="3"> - <thead> - <row> - <entry>Значение</entry> - <entry>Дата</entry> - <entry>Релиз</entry> - </row> - </thead> + <table frame="none"> + <title>Значения <literal>__FreeBSD_version</literal></title> - <tbody> - &values.versions; - </tbody> - </tgroup> - </table> + <tgroup cols="3"> + <thead> + <row> + <entry>Значение</entry> + <entry>Дата</entry> + <entry>Релиз</entry> + </row> + </thead> - <note> - <para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как - <quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой принцип - использовался год и месяц, но мы решили изменить его на более - однозначную систему нумерации старший/младший, начиная с версии - 2.2. Это объясняется тем, что параллельная разработка в нескольких - ветках делает непрактичным идентификацию релизов просто по их - реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит - заботиться о старых версиях -CURRENT; они перечислены здесь просто - в информационных целях.</para> - </note> - </sect1> - </chapter> + <tbody> + &values.versions; + </tbody> + </tgroup> + </table> + <note> + <para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как + <quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой + принцип использовался год и месяц, но мы решили изменить его + на более однозначную систему нумерации старший/младший, + начиная с версии 2.2. Это объясняется тем, что параллельная + разработка в нескольких ветках делает непрактичным + идентификацию релизов просто по их реальным датам выпуска. + Если вы сейчас делаете порт, вам не стоит заботиться о старых + версиях -CURRENT; они перечислены здесь просто в + информационных целях.</para> + </note> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml index 80c2359ba9..030ab03c00 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml @@ -7,149 +7,161 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="keeping-up"> - - <title>Актуализация</title> - - <para>Коллекция Портов &os; постоянно изменяется. Здесь находится - некоторая информация о том, как поддерживать её в актуальном - состоянии.</para> - - <sect1 xml:id="freshports"> - <title>FreshPorts</title> - - <para>Самым простым способом отслеживать уже произошедшие обновления - является подписка на <link xlink:href="http://www.FreshPorts.org/"> - FreshPorts</link>. Для мониторинга вы можете выбрать несколько - портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь, - потому что они будут получать уведомления не только о собственных - изменениях, но и об изменениях, сделанных любым другим коммиттером - &os;. (Это часто необходимо для синхронизации с изменениями на более - низком технологическом уровне—хотя более корректным было бы - получение предупреждений от тех, кто вносит подобные изменения, - иногда этот этап пропускается или он просто непрактичен. Кроме того, - в некоторых случаях изменения по своей природе весьма незначительны. - Мы полагаем, что любой разработчик в таких ситуациях будет - руководствоваться здравым смыслом).</para> - - <para>Если вы хотите использовать FreshPorts, то вам нужна только - учётная запись. Если регистрационный адрес вашей электронной почты - будет иметь вид <literal>@FreeBSD.org</literal>, то справа на - Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто - уже получил учётную запись FreshPorts, но не использовал собственный - адрес электронной почты <literal>@FreeBSD.org</literal>, достаточно - сменить адрес на <literal>@FreeBSD.org</literal>, подписаться, а - затем сменить его обратно.</para> - - <para>Во FreshPorts имеется также функция проверки правильности, - которая автоматически проверяет каждое изменение, внесённое в дерево - портов &os;. Если вы подпишетесь на эту услугу, то будете - оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке - внесённых вами изменений.</para> - </sect1> - - <sect1 xml:id="svnweb"> - <title>Web-интерфейс к хранилищу исходных текстов</title> - - <para>Файлы в хранилище исходных текстов можно просматривать при помощи - Web-интерфейса. Изменения, которые касаются в целом всей системы - портов, теперь документируются в файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</link>. - Изменения, касающиеся отдельных портов, отражаются теперь в - файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</link>. - Однако однозначный ответ на любой вопрос можно найти, только - прочитав исходных код <link xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</link> - и связанных с ним файлов.</para> - </sect1> - - <sect1 xml:id="ports-mailing-list"> - <title>Список рассылки &os;, посвящённый портам</title> - - <para>Если вы поддерживаете порты, то должны следить за &a.ports;. - О важных изменениях, отражающихся на работе портов, будет сообщаться - здесь, а затем они переносятся в <filename>CHANGES</filename>.</para> - - <para>Если данный список рассылки слишком загружен сообщениями, - вы можете отслеживать &a.ports-announce.name;, который модерируется - и не является местом для дискуссий.</para> - </sect1> - - <sect1 xml:id="build-cluster"> - <title>Кластер построения портов &os;</title> - - <para>Одной из наименее известных сильных сторон &os; является тот - факт, что для непрерывного построения Коллекции Портов для каждого - из основных релизов ОС для каждой архитектуры уровня поддержки - Tier-1 выделен целый кластер машин.</para> - - <para>Отдельные порты собираются, если они специально не помечены как - <varname>IGNORE</varname>. Для портов, помеченных как - <varname>BROKEN</varname>, попытки будут продолжены для того, - чтобы увидеть, если основная проблема была решена. (Это сделано - через использование переменной <varname>TRYBROKEN</varname> для - <filename>Makefile</filename> порта.)</para> - - </sect1> - - <sect1 xml:id="distfile-survey"> - <title>Portscout: сканер дистрибутивных файлов портов &os;</title> - - <para>Кластер построения выделен для выполнения самого последнего - релиза каждого из портов, дистрибутивные файлы которых уже были - сгружены. Однако из-за постоянных изменений в Internet - дистрибутивные файлы могут быстро исчезать. <link xlink:href="http://portscout.FreeBSD.org">Portscout</link>, средство - сканирования дистрибутивных файлов &os; пытается опросить - каждый из сайтов, доступных для сгрузки каждого из портов, - для определения того, доступны ли ещё дистрибутивные файлы. - <application>Portscout</application> может готовить отчёты - в <acronym>HTML</acronym> и рассылать электронные письма об - имеющихся обновлениях для портов тем, кто это запрашивает. - Мейнтейнеры периодически запрашивают наличие изменений, либо - вручную, либо используя ленту <acronym>RSS</acronym>.</para> - - <para>Главная страница <application>Portscout</application> - отображает email мейнтейнера порта, количество портов, за - которые ответственен мейнтейнер, количество портов с новыми - дистрибутивными файлами и процент устаревших портов. Функция - поиска выполняет поиск мейнтейнера по адресу электронной почты - и позволяет выбирать между всеми портами или только - устаревшими.</para> - - <para>При щелчке по адресу электронной почты мейнтейнера - отображается список всех его портов, разделённых по категориям, - вместе с текущим номером версии, информацией о наличии новой - версии, временем последнего обновления порта и временем его - последней проверки. Функция поиска на этой странице позволяет - пользователю выполнять поиск конкретного порта.</para> - - <para>По щелчку на название порта в списке отображается информация - о порте <link xlink:href="http://freshports.org">FreshPorts</link>.</para> - </sect1> - - <sect1 xml:id="portsmon"> - <title>Система мониторинга портов &os;</title> - - <para>Другим полезным ресурсом является - <link xlink:href="http://portsmon.FreeBSD.org">Система мониторинга - портов &os;</link> (известная также как <literal>portsmon</literal>). - Система представляет собой базу данных, обрабатывающую информацию из - нескольких источников и позволяющую просматривать их при помощи - Web-интерфейса. На данный момент задействованы база сообщений об - ошибках (PR), протоколы ошибок кластера построения и отдельные файлы - из коллекции портов. В будущем в этот список будет добавлена система - проверки дистрибутивных файлов и другие ресурсы.</para> - - <para>Для начала вы можете просмотреть всю информацию о некотором порте - при помощи средства <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Обзор - отдельного порта</link>.</para> - - <para>На момент написания это единственный доступный ресурс, который - для имени порта ставит в соответствие записи PR GNATS. - (Отправители PR не всегда добавляют в название имя порта, хотя - мы предпочитаем, чтобы они это делали.) Таким образом, - <literal>portsmon</literal> это хорошее место для начала, если вы - хотите найти присланные PR и/или ошибки построения для существующего - порта; либо поискать, был ли уже прислан новый порт, который вы - подумывали создать сами.</para> - </sect1> - </chapter> - +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink= + "http://www.w3.org/1999/xlink" version="5.0" xml:id="keeping-up"> + + <title>Актуализация</title> + + <para>Коллекция Портов &os; постоянно изменяется. Здесь находится + некоторая информация о том, как поддерживать её в актуальном + состоянии.</para> + + <sect1 xml:id="freshports"> + <title>FreshPorts</title> + + <para>Самым простым способом отслеживать уже произошедшие + обновления является подписка на <link xlink:href= + "http://www.FreshPorts.org/">FreshPorts</link>. Для + мониторинга вы можете выбрать несколько портов. Мейнтейнерам + настоятельно рекомендуется подписаться здесь, потому что они + будут получать уведомления не только о собственных изменениях, + но и об изменениях, сделанных любым другим коммиттером &os;. + (Это часто необходимо для синхронизации с изменениями на более + низком технологическом уровне—хотя более корректным было + бы получение предупреждений от тех, кто вносит подобные + изменения, иногда этот этап пропускается или он просто + непрактичен. Кроме того, в некоторых случаях изменения по + своей природе весьма незначительны. Мы полагаем, что любой + разработчик в таких ситуациях будет руководствоваться здравым + смыслом).</para> + + <para>Если вы хотите использовать FreshPorts, то вам нужна только + учётная запись. Если регистрационный адрес вашей электронной + почты будет иметь вид <literal>@FreeBSD.org</literal>, то + справа на Web-страницах вы увидите дополнительную ссылку. Для + тех из вас, кто уже получил учётную запись FreshPorts, но не + использовал собственный адрес электронной почты + <literal>@FreeBSD.org</literal>, достаточно сменить адрес на + <literal>@FreeBSD.org</literal>, подписаться, а затем сменить + его обратно.</para> + + <para>Во FreshPorts имеется также функция проверки правильности, + которая автоматически проверяет каждое изменение, внесённое в + дерево портов &os;. Если вы подпишетесь на эту услугу, то + будете оповещаться обо всех ошибках, обнаруженных FreshPorts + при проверке внесённых вами изменений.</para> + </sect1> + + <sect1 xml:id="svnweb"> + <title>Web-интерфейс к хранилищу исходных текстов</title> + + <para>Файлы в хранилище исходных текстов можно просматривать при + помощи Web-интерфейса. Изменения, которые касаются в целом + всей системы портов, теперь документируются в файле <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</link>. + Изменения, касающиеся отдельных портов, отражаются теперь в + файле <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</link>. + Однако однозначный ответ на любой вопрос можно найти, только + прочитав исходных код <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</link> + и связанных с ним файлов.</para> + </sect1> + + <sect1 xml:id="ports-mailing-list"> + <title>Список рассылки &os;, посвящённый портам</title> + + <para>Если вы поддерживаете порты, то должны следить за + &a.ports;. О важных изменениях, отражающихся на работе портов, + будет сообщаться здесь, а затем они переносятся в + <filename>CHANGES</filename>.</para> + + <para>Если данный список рассылки слишком загружен сообщениями, + вы можете отслеживать &a.ports-announce.name;, который + модерируется и не является местом для дискуссий.</para> + </sect1> + + <sect1 xml:id="build-cluster"> + <title>Кластер построения портов &os;</title> + + <para>Одной из наименее известных сильных сторон &os; является + тот факт, что для непрерывного построения Коллекции Портов для + каждого из основных релизов ОС для каждой архитектуры уровня + поддержки Tier-1 выделен целый кластер машин.</para> + + <para>Отдельные порты собираются, если они специально не помечены + как <varname>IGNORE</varname>. Для портов, помеченных как + <varname>BROKEN</varname>, попытки будут продолжены для того, + чтобы увидеть, если основная проблема была решена. (Это + сделано через использование переменной + <varname>TRYBROKEN</varname> для <filename>Makefile</filename> + порта.)</para> + </sect1> + + <sect1 xml:id="distfile-survey"> + <title>Portscout: сканер дистрибутивных файлов портов + &os;</title> + + <para>Кластер построения выделен для выполнения самого последнего + релиза каждого из портов, дистрибутивные файлы которых уже были + сгружены. Однако из-за постоянных изменений в Internet + дистрибутивные файлы могут быстро исчезать. <link + xlink:href="http://portscout.FreeBSD.org">Portscout</link>, + средство сканирования дистрибутивных файлов &os; пытается + опросить каждый из сайтов, доступных для сгрузки каждого из + портов, для определения того, доступны ли ещё дистрибутивные + файлы. <application>Portscout</application> может готовить + отчёты в <acronym>HTML</acronym> и рассылать электронные письма + об имеющихся обновлениях для портов тем, кто это запрашивает. + Мейнтейнеры периодически запрашивают наличие изменений, либо + вручную, либо используя ленту <acronym>RSS</acronym>.</para> + + <para>Главная страница <application>Portscout</application> + отображает email мейнтейнера порта, количество портов, за + которые ответственен мейнтейнер, количество портов с новыми + дистрибутивными файлами и процент устаревших портов. Функция + поиска выполняет поиск мейнтейнера по адресу электронной почты + и позволяет выбирать между всеми портами или только + устаревшими.</para> + + <para>При щелчке по адресу электронной почты мейнтейнера + отображается список всех его портов, разделённых по категориям, + вместе с текущим номером версии, информацией о наличии новой + версии, временем последнего обновления порта и временем его + последней проверки. Функция поиска на этой странице позволяет + пользователю выполнять поиск конкретного порта.</para> + + <para>По щелчку на название порта в списке отображается информация + о порте <link + xlink:href="http://freshports.org">FreshPorts</link>.</para> + </sect1> + + <sect1 xml:id="portsmon"> + <title>Система мониторинга портов &os;</title> + + <para>Другим полезным ресурсом является <link + xlink:href="http://portsmon.FreeBSD.org">Система мониторинга + портов &os;</link> (известная также как + <literal>portsmon</literal>). Система представляет собой базу + данных, обрабатывающую информацию из нескольких источников и + позволяющую просматривать их при помощи Web-интерфейса. На + данный момент задействованы база сообщений об ошибках (PR), + протоколы ошибок кластера построения и отдельные файлы из + коллекции портов. В будущем в этот список будет добавлена + система проверки дистрибутивных файлов и другие ресурсы.</para> + + <para>Для начала вы можете просмотреть всю информацию о некотором + порте при помощи средства <link + xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Обзор + отдельного порта</link>.</para> + + <para>На момент написания это единственный доступный ресурс, + который для имени порта ставит в соответствие записи PR GNATS. + (Отправители PR не всегда добавляют в название имя порта, хотя + мы предпочитаем, чтобы они это делали.) Таким образом, + <literal>portsmon</literal> это хорошее место для начала, если + вы хотите найти присланные PR и/или ошибки построения для + существующего порта; либо поискать, был ли уже прислан новый + порт, который вы подумывали создать сами.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml index 12e66950df..0b37c5b1d2 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml @@ -7,3028 +7,3209 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="makefiles"> - - <title>Настройка файла Makefile</title> - - <para>Настройка файла <filename>Makefile</filename> достаточно проста, и - мы снова предполагаем, что перед тем, как начать, вы посмотрите на - существующие примеры. К тому же в этом руководстве имеется <link linkend="porting-samplem">примерный Makefile</link>, так что взгляните - на него и, пожалуйста, следуйте порядку переменных и разделов в этом - образце, чтобы облегчить чтение вашего порта другими людьми.</para> - - <para>Итак, расположим решаемые задачи в порядке их возникновения при - создании вашего нового файла <filename>Makefile</filename>:</para> - - <sect1 xml:id="makefile-source"> - <title>Оригинальные исходный код</title> - - <para>Находится ли он в каталоге <varname>DISTDIR</varname> в виде - стандартного упакованного архиватором <command>gzip</command> - tar-архива с именем типа - <filename>foozolix-1.2.tar.gz</filename>? Если это так, - можно перейти к следующему шагу. Если нет, то вы должны попытаться - переопределить некоторые из переменных - <varname>DISTVERSION</varname>, <varname>DISTNAME</varname>, - <varname>EXTRACT_CMD</varname>, - <varname>EXTRACT_BEFORE_ARGS</varname>, - <varname>EXTRACT_AFTER_ARGS</varname>, - <varname>EXTRACT_SUFX</varname> или <varname>DISTFILES</varname> в - зависимости от того, насколько необычен формат дистрибутивного - файла.</para> - - <para>В худшем случае вы можете просто определить свою собственную цель - <buildtarget>do-extract</buildtarget> для переопределения действий по - умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, - если вообще придётся.</para> - </sect1> - - <sect1 xml:id="makefile-naming"> - <title>Именование</title> - - <para>В первой части <filename>Makefile</filename> порта ему даётся - название, указывается его номер версии и принадлежность к правильной - категории.</para> - - <sect2> - <title><varname>PORTNAME</varname> и - <varname>PORTVERSION</varname></title> - - <para>В переменной <varname>PORTNAME</varname> вы должны указать - основную часть имени вашего порта, а в переменной - <varname>PORTVERSION</varname> - номер версии.</para> - </sect2> - - <sect2 xml:id="makefile-naming-revepoch"> - <title><varname>PORTREVISION</varname> и - <varname>PORTEPOCH</varname></title> - - <sect3> - <title><varname>PORTREVISION</varname></title> - - <para>Переменная <varname>PORTREVISION</varname> представляет собой - монотонно увеличивающееся число, которое обнуляется при каждом - увеличении значения переменной <varname>PORTVERSION</varname> (то - есть каждый раз, когда создателями выпускается новый официальный - релиз), и добавляется к имени пакета, если оно не равно нулю. - Изменения в <varname>PORTREVISION</varname> используются - автоматизированными инструментами (например, - <command>pkg version</command>, см. &man.pkg-version.8;) - для определения факта появления нового пакета.</para> - - <para>Значение <varname>PORTREVISION</varname> должно увеличиваться - каждый раз, когда в порте FreeBSD делаются изменения, которые - как-либо меняют получаемый пакет. Сюда относятся только - изменения, затрагивающие построение пакета с <link - linkend="makefile-options">параметрами</link> по - умолчанию.</para> - - <para>Примеры случаев, когда значение <varname>PORTREVISION</varname> - должно быть увеличено:</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> без - соответствующего изменения <varname>PORTVERSION</varname>, - когда как команда <command>diff -ru</command> между новой - и старой версиями показывает нетривиальные изменения в - коде.</para> - </listitem> - </itemizedlist> - - <para>Примеры изменений, которые не требуют увеличения переменной - <varname>PORTREVISION</varname>:</para> - - <itemizedlist> - <listitem> - <para>Изменения стиля в скелете порта без функциональных изменений - в пакете.</para> - </listitem> - - <listitem> - <para>Изменения в переменной <varname>MASTER_SITES</varname> или - другие функциональные изменения порта, которые не затрагивают - получающегося пакета.</para> - </listitem> - - <listitem> - <para>Тривиальные патчи к дистрибутивному файлу, такие, как - исправления опечаток, которые не так уж важны, что пользователи - пакета должны озаботиться обновлением.</para> - </listitem> - - <listitem> - <para>Исправления, касающиеся этапа построения, которые делают - возможным построение пакета, если ранее это было невозможно - сделать (пока изменения не приводят к изменению работы на любых - других платформах, на которых порт ранее строился). Так как - <varname>PORTREVISION</varname> отражает содержимое пакета, - то, если ранее пакет не строился, то нет нужды увеличивать - <varname>PORTREVISION</varname> для отметки изменения.</para> - </listitem> - </itemizedlist> - - <para>Правило, которому нужно приблизительно следовать, заключается в - том, что нужно спрашивать себя, является ли вносимое в порт - изменение таким, что от него выиграют все (в виде - усовершенствования, исправления или благодаря тому, что новый - пакет будет вообще работоспособным), и примите во внимание тот - факт, что при этом все, кто регулярно обновляют своё дерево портов, - будут обязаны это сделать. Если это так, то переменная - <varname>PORTREVISION</varname> должна быть увеличена.</para> - </sect3> - - <sect3> - <title><varname>PORTEPOCH</varname></title> - - <para>Время от времени разработчик программного обеспечения или - создатель порта &os; делают что-то не так и выпускают версию - программы, номер которой меньше предыдущей версии. Примером этого - является порт, название которого меняется с foo-20000801 на foo-1.0 - (изначально это не считалось бы более новой версией, так как - 20000801 численно больше, чем 1).</para> - - <tip> - <para>Результат сравнения номера версии не всегда очевиден. - Для выполнения сравнения двух строк с номером версии можно - использовать <command>pkg version</command> - (см. &man.pkg-version.8;). Например:</para> - - <screen>&prompt.user; <userinput>pkg_version -t 0.031 0.29</userinput> -></screen> - - <para>Для пользователей <application>pkgng</application>:</para> - - <screen>&prompt.user; <userinput>pkg version -t 0.031 0.29</userinput> -></screen> - - <para>Строка <literal>></literal> в выводе команды означает, - что версия 0.031 считается выше, чем версия 0.29, что может - быть не очевидно для того, кто выполняет портирование.</para> - </tip> +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink= + "http://www.w3.org/1999/xlink" version="5.0" xml:id="makefiles"> + + <title>Настройка файла Makefile</title> + + <para>Настройка файла <filename>Makefile</filename> достаточно + проста, и мы снова предполагаем, что перед тем, как начать, вы + посмотрите на существующие примеры. К тому же в этом руководстве + имеется <link linkend="porting-samplem">примерный + Makefile</link>, так что взгляните на него и, пожалуйста, + следуйте порядку переменных и разделов в этом образце, чтобы + облегчить чтение вашего порта другими людьми.</para> + + <para>Итак, расположим решаемые задачи в порядке их возникновения + при создании вашего нового файла + <filename>Makefile</filename>:</para> + + <sect1 xml:id="makefile-source"> + <title>Оригинальные исходный код</title> + + <para>Находится ли он в каталоге <varname>DISTDIR</varname> в + виде стандартного упакованного архиватором + <command>gzip</command> tar-архива с именем типа + <filename>foozolix-1.2.tar.gz</filename>? Если это так, можно + перейти к следующему шагу. Если нет, то вы должны попытаться + переопределить некоторые из переменных + <varname>DISTVERSION</varname>, <varname>DISTNAME</varname>, + <varname>EXTRACT_CMD</varname>, + <varname>EXTRACT_BEFORE_ARGS</varname>, + <varname>EXTRACT_AFTER_ARGS</varname>, + <varname>EXTRACT_SUFX</varname> или + <varname>DISTFILES</varname> в зависимости от того, насколько + необычен формат дистрибутивного файла.</para> + + <para>В худшем случае вы можете просто определить свою + собственную цель <buildtarget>do-extract</buildtarget> для + переопределения действий по умолчанию, хотя к этому нужно будет + прибегать в очень редких случаях, если вообще придётся.</para> + </sect1> - <para>В ситуациях, подобных этой, должно быть увеличено значение - <varname>PORTEPOCH</varname>. Если значение - <varname>PORTEPOCH</varname> не равно нулю, то оно добавляется к - имени пакета, как описано в разделе выше. Значение - <varname>PORTEPOCH</varname> никогда не должно уменьшаться или - сбрасываться в ноль, потому что это приведёт к ошибке сравнения с - пакетом с меньшим номером эпохи (то есть то, что пакет устарел, - обнаружено не будет): номер новой версии (например, - <literal>1.0,1</literal> в примере выше) останется меньше, чем - номер предыдущей версии (20000801), однако суффикс - <literal>,1</literal> интерпретируется различными - автоматизированными утилитами особым образом, и окажется больше, - чем предполагаемый суффикс <literal>,0</literal> более раннего - пакета).</para> - - <para>Некорректное уменьшение или сброс <varname>PORTEPOCH</varname> - приводит к печальным последствиям; если вы не поняли, о чём шла - речь ранее, пожалуйста, всё же разберитесь с этим, либо спросите - в списках рассылки.</para> - - <para>Предполагается, что в большинстве портов переменная - <varname>PORTEPOCH</varname> использоваться не будет, но при - корректном использовании <varname>PORTVERSION</varname> может - появиться необходимость её иметь, если в будущих релизах - программное обеспечение должно изменить структуру номера версии. - Однако создателям портов для &os; нужно быть внимательными, когда - разработчик выпускает релиз без официального номера версии — - эдакие <quote>промежуточные</quote> релизы. Имеется соблазн - пометить релиз датой его выхода, что может вызвать проблемы, как и - в примере выше, когда будет выпущен новый - <quote>официальный</quote> релиз.</para> - - <para>Например, если промежуточный релиз помечен датой 20000917, а - предыдущая версия программного обеспечения имела номер 1.2, то - промежуточному релизу должно быть поставлено в соответствие - значение <varname>PORTVERSION</varname>, равное 1.2.20000917 или - что-то похожее, но не 20000917, так как последующий релиз, скажем, - 1.3, должен иметь численно большее значение.</para> - </sect3> - - <sect3> - <title>Пример использования переменных - <varname>PORTREVISION</varname> и - <varname>PORTEPOCH</varname></title> - - <para>Выполнен коммит порта <literal>gtkmumble</literal>, версии - <literal>0.10</literal>, в коллекцию портов.</para> - - <programlisting>PORTNAME= gtkmumble -PORTVERSION= 0.10</programlisting> - - <para>Значение <varname>PKGNAME</varname> станет равным - <literal>gtkmumble-0.10</literal>.</para> - - <para>Обнаружена брешь в безопасности, исправление которой - потребовало создания - локального патча для &os;. Соответственно было увеличено - значение переменной <varname>PORTREVISION</varname>.</para> - - <programlisting>PORTNAME= gtkmumble -PORTVERSION= 0.10 -PORTREVISION= 1</programlisting> - - <para><varname>PKGNAME</varname> принимает значение - <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>, то должно быть - увеличено значение <varname>PORTEPOCH</varname> для того, чтобы - заставить распознавать вновь создаваемый пакет как <quote>более - новый</quote>. Так как это новый релиз программы, то - <varname>PORTREVISION</varname> обнуляется (или удаляется из - файла <filename>Makefile</filename>).</para> - - <programlisting>PORTNAME= gtkmumble -PORTVERSION= 0.2 -PORTEPOCH= 1</programlisting> - - <para><varname>PKGNAME</varname> принимает значение - <literal>gtkmumble-0.2,1</literal></para> - - <para>Следующий релиз имеет номер версии 0.3. Так как значение - переменной <varname>PORTEPOCH</varname> никогда не уменьшается, что - переменные, определяющие версии, теперь выглядят так:</para> - - <programlisting>PORTNAME= gtkmumble -PORTVERSION= 0.3 -PORTEPOCH= 1</programlisting> - - <para><varname>PKGNAME</varname> принимает значение - <literal>gtkmumble-0.3,1</literal></para> - - <note> - <para>Если значение <varname>PORTEPOCH</varname> этим обновлением - было бы сброшено в <literal>0</literal>, то кто-нибудь, имеющий - установленный пакет <literal>gtkmumble-0.10_1</literal>, не - смог бы опознать пакет <literal>gtkmumble-0.3</literal> как - более новый, так как <literal>3</literal> было бы меньше, чем - <literal>10</literal>. Помните, что в первую очередь это - касается <varname>PORTEPOCH</varname>.</para> - </note> - </sect3> - </sect2> - - <sect2> - <title>Переменные <varname>PKGNAMEPREFIX</varname> - и <varname>PKGNAMESUFFIX</varname></title> - - <para>Две необязательные переменные, <varname>PKGNAMEPREFIX</varname> и - <varname>PKGNAMESUFFIX</varname>, объединяются со значениями - <varname>PORTNAME</varname> и - <varname>PORTVERSION</varname> для формирования - <varname>PKGNAME</varname> в форме - <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>. - Добейтесь того, чтобы это соответствовало нашим <link linkend="porting-pkgname">рекомендациям по правильному выбору - названий для пакетов</link>. В частности, в переменной - <varname>PORTVERSION</varname> <emphasis>не разрешается</emphasis> - использование дефиса (<literal>-</literal>). Кроме того, если в - имени пакета присутствует часть <replaceable>language-</replaceable> - или <replaceable>-compiled.specifics</replaceable> (смотрите ниже), - то используйте переменные <varname>PKGNAMEPREFIX</varname> и - <varname>PKGNAMESUFFIX</varname>, соответственно. Не делайте их - частью значения переменной <varname>PORTNAME</varname>.</para> - </sect2> - - <sect2 xml:id="porting-pkgname"> - <title>Соглашения по именованию пакетов</title> - - <para>Далее описаны некоторые соглашения, которым вы должны следовать - в именовании ваших пакетов. Они были разработаны для облегчения - просмотра каталога, так как имеется уже тысячи пакетов, а - пользователи отвернутся от нас, если список не понравится их - взору!</para> - - <para>Имя пакета должно иметь вид - <filename>language_region-name-compiled.specifics-version.numbers</filename>.</para> - - <para>Имя пакета определяется как - <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>. - Вы должны задавать значения переменных в соответствии с этим - форматом.</para> - - <orderedlist> - <listitem> - <para>&os; пытается поддерживать языки, на которых разговаривают - её пользователи. Часть <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> должна задаваться - в переменной <varname>PKGNAMEPREFIX</varname>.</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> + <sect1 xml:id="makefile-naming"> + <title>Именование</title> + + <para>В первой части <filename>Makefile</filename> порта ему + даётся название, указывается его номер версии и принадлежность + к правильной категории.</para> + + <sect2> + <title><varname>PORTNAME</varname> и + <varname>PORTVERSION</varname></title> + + <para>В переменной <varname>PORTNAME</varname> вы должны + указать основную часть имени вашего порта, а в переменной + <varname>PORTVERSION</varname> - номер версии.</para> + </sect2> + + <sect2 xml:id="makefile-naming-revepoch"> + <title><varname>PORTREVISION</varname> и + <varname>PORTEPOCH</varname></title> + + <sect3> + <title><varname>PORTREVISION</varname></title> + + <para>Переменная <varname>PORTREVISION</varname> представляет + собой монотонно увеличивающееся число, которое обнуляется + при каждом увеличении значения переменной + <varname>PORTVERSION</varname> (то есть каждый раз, когда + создателями выпускается новый официальный релиз), и + добавляется к имени пакета, если оно не равно нулю. + Изменения в <varname>PORTREVISION</varname> используются + автоматизированными инструментами (например, + <command>pkg version</command>, см. &man.pkg-version.8;) + для определения факта появления нового пакета.</para> + + <para>Значение <varname>PORTREVISION</varname> должно + увеличиваться каждый раз, когда в порте FreeBSD делаются + изменения, которые как-либо меняют получаемый пакет. Сюда + относятся только изменения, затрагивающие построение пакета + с <link linkend="makefile-options">параметрами</link> по + умолчанию.</para> + + <para>Примеры случаев, когда значение + <varname>PORTREVISION</varname> должно быть + увеличено:</para> + <itemizedlist> <listitem> - <para>Убедитесь, что имя порта и версия четко отделены и - размещаются в переменных <varname>PORTNAME</varname> и - <varname>PORTVERSION</varname>. Единственная причина, по - которой <varname>PORTNAME</varname> содержит версионную часть, - это если полученный дистрибутив сам назван таким образом, как - это сделано для портов <filename>textproc/libxml2</filename> - или <filename>japanese/kinput2-freewnn</filename>. В противном - случае <varname>PORTNAME</varname> не должен содержать никакой - информации, указывающей на версию. То, что некоторые порты - имеют одинаковый <varname>PORTNAME</varname>, является вполне - нормальным, как для портов <filename>www/apache*</filename>; - в этом случае различные версии (и различные записи в индексе) - отличаются по значениям <varname>PKGNAMEPREFIX</varname> - и <varname>PKGNAMESUFFIX</varname>.</para> - </listitem> - - <listitem> - <para>Если порт может быть построен с различными <link linkend="makefile-masterdir">статически заданными значениями по - умолчанию</link> (обычно это часть имени каталога в семействе - портов), то часть <replaceable>-compiled.specifics</replaceable> - должна определять вкомпилированные значения по умолчанию (дефис - не обязателен). Примерами являются размеры бумаги и - шрифтов.</para> - - <para>Часть <replaceable>-compiled.specifics</replaceable> должна - задаваться в переменной <varname>PKGNAMESUFFIX</varname>.</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.yyyy.mm.dd</literal>, но не - <literal>dd.mm.yyyy</literal> - или не совместимый с проблемой Y2K - <literal>yy.mm.dd</literal>. - Добавление к версии префикса <literal>0.0.</literal> является - важным, в случае если выпущен релиз с присвоением настоящей - версии, которая в числовом представлении, конечно же, будет - ниже, чем - <literal>yyyy</literal>.</para> - </listitem> - </orderedlist> - - <para>Вот несколько (реальных) примеров того, как преобразовать имя из - оригинального, придуманного авторами, к подходящему для имени - пакета:</para> - - <informaltable frame="none" pgwide="1"> - <tgroup cols="6"> - <thead> - <row> - <entry>Имя дистрибутива</entry> - - <entry><varname>PKGNAMEPREFIX</varname></entry> - - <entry><varname>PORTNAME</varname></entry> - - <entry><varname>PKGNAMESUFFIX</varname></entry> - - <entry><varname>PORTVERSION</varname></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.yyyy.mm.dd</literal>) - в качестве номера версии.</para> - </sect2> - </sect1> - - <sect1 xml:id="makefile-categories"> - <title>Разделение по категориям</title> - - <sect2> - <title><varname>CATEGORIES</varname></title> - - <para>В процессе создания пакета он помещается в каталог - <filename>/usr/ports/packages/All</filename>, а в одном или более - подкаталогов из <filename>/usr/ports/packages</filename> - создаются на него ссылки. Имена этих подкаталогов определяются - переменной <varname>CATEGORIES</varname>. Такая схема нужна для - облегчения жизни пользователя, когда он сталкивается с массой - пакетов на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на - <link linkend="porting-categories">текущий список категорий</link> - и выберите те из них, - которые более всего подходят к вашему порту.</para> - - <para>Этот список также определяет, куда в дереве портов будет помещен - порт. Если вы укажете здесь более одной категории, то - предполагается, что файлы порта будут помещены в подкаталог с именем - первой категории. Посмотрите <link linkend="choosing-categories">ниже</link> для получения - подробной информации о том, как правильно выбрать категории.</para> - </sect2> - - <sect2 xml:id="porting-categories"> - <title>Текущий список категорий</title> - - <para>Вот текущий список категорий. Те, которые отмечены - звёздочкой (<literal>*</literal>), являются - <emphasis>виртуальными</emphasis> категориями—они не имеют - собственного подкаталога в дереве портов. Они используются только в - качестве вторичных категорий, и только для поиска.</para> - - <note> - <para>Для невиртуальных категорий имеется однострочное описание - в <varname>COMMENT</varname> в <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/> - </row> - - <row> - <entry><filename>afterstep*</filename></entry> - <entry>Порты, поддерживающие менеджер окон <link xlink:href="http://www.afterstep.org">AfterStep</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>arabic</filename></entry> - <entry>Поддержка арабского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>archivers</filename></entry> - <entry>Инструменты для работы с архивами.</entry> - <entry/> - </row> - - <row> - <entry><filename>astro</filename></entry> - <entry>Приложения, связанные с астрономией.</entry> - <entry/> - </row> - - <row> - <entry><filename>audio</filename></entry> - <entry>Поддержка работы со звуком.</entry> - <entry/> - </row> - - <row> - <entry><filename>benchmarks</filename></entry> - <entry>Утилиты для измерения производительности системы.</entry> - <entry/> - </row> - - <row> - <entry><filename>biology</filename></entry> - <entry>Программное обеспечение, связанное с биологией.</entry> - <entry/> - </row> - - <row> - <entry><filename>cad</filename></entry> - <entry>Инструменты Систем Автоматизированного - Проектирования.</entry> - <entry/> - </row> - - <row> - <entry><filename>chinese</filename></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/> - </row> - - <row> - <entry><filename>databases</filename></entry> - <entry>Базы данных.</entry> - <entry/> - </row> - - <row> - <entry><filename>deskutils</filename></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/> - </row> - - <row> - <entry><filename>docs*</filename></entry> - <entry>Мета-порты для документации &os;.</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/> - </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/> - </row> - - <row> - <entry><filename>french</filename></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/> - </row> - - <row> - <entry><filename>geography*</filename></entry> - <entry>Программное обеспечение, связанное с географией.</entry> - <entry/> - </row> - - <row> - <entry><filename>german</filename></entry> - <entry>Поддержка немецкого языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>gnome*</filename></entry> - <entry>Порты Проекта <link xlink:href="http://www.gnome.org">GNOME</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>gnustep*</filename></entry> - <entry>Программное обеспечение для окружения рабочего - стола GNUstep.</entry> - <entry/> - </row> - - <row> - <entry><filename>graphics</filename></entry> - <entry>Графические утилиты.</entry> - <entry/> - </row> - - <row> - <entry><filename>hamradio*</filename></entry> - <entry>Программное обеспечение для любительского радио</entry> - <entry/> - </row> - - <row> - <entry><filename>haskell*</filename></entry> - <entry>Программное обеспечение, связанное с языком - Haskell.</entry> - <entry/> - </row> - - <row> - <entry><filename>hebrew</filename></entry> - <entry>Поддержка иврита.</entry> - <entry/> - </row> - - <row> - <entry><filename>hungarian</filename></entry> - <entry>Поддержка венгерского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>ipv6*</filename></entry> - <entry>Программное обеспечение, связанное с IPv6.</entry> - <entry/> - </row> - - <row> - <entry><filename>irc</filename></entry> - <entry>Утилиты для работы с Internet Relay Chat.</entry> - <entry/> - </row> - - <row> - <entry><filename>japanese</filename></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>Порты проекта - <link xlink:href="http://www.kde.org">KDE</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>kld*</filename></entry> - <entry>Загружаемые модули ядра.</entry> - <entry/> - </row> - - <row> - <entry><filename>korean</filename></entry> - <entry>Поддержка корейского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>lang</filename></entry> - <entry>Языки программирования.</entry> - <entry/> - </row> - - <row> - <entry><filename>linux*</filename></entry> - <entry>Linux приложения и утилиты.</entry> - <entry/> - </row> - - <row> - <entry><filename>lisp*</filename></entry> - <entry>Программное обеспечение, связанное с языком - Lisp.</entry> - <entry/> - </row> - - <row> - <entry><filename>mail</filename></entry> - <entry>Программы для работы с электронной почтой.</entry> - <entry/> - </row> - - <row> - <entry><filename>math</filename></entry> - <entry>Программное обеспечение для численных вычислений и - другие утилиты, связанные с математикой.</entry> - <entry/> - </row> - - <row> - <entry><filename>mbone*</filename></entry> - <entry>Приложения для MBone.</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/> - </row> - - <row> - <entry><filename>net</filename></entry> - <entry>Различное сетевое программное обеспечение.</entry> - <entry/> - </row> - - <row> - <entry><filename>net-im</filename></entry> - <entry>Программы мгновенного обмена сообщениями.</entry> - <entry/> - </row> - - <row> - <entry><filename>net-mgmt</filename></entry> - <entry>Программное обеспечение для сетевого управления.</entry> - <entry/> - </row> - - <row> - <entry><filename>net-p2p</filename></entry> - <entry>Приложения для пиринговых сетей.</entry> - <entry/> - </row> - - <row> - <entry><filename>news</filename></entry> - <entry>Программное обеспечение для работы с конференциями - USENET.</entry> - <entry/> - </row> - - <row> - <entry><filename>palm</filename></entry> - <entry>Программная поддержка <link xlink:href="http://www.palm.com/">Palm™</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>parallel*</filename></entry> - <entry>Приложения, связанные с параллельными - вычислениями.</entry> - <entry/> - </row> - - <row> - <entry><filename>pear*</filename></entry> - <entry>Порты, относящиеся к технологии Pear PHP.</entry> - <entry/> - </row> - - <row> - <entry><filename>perl5*</filename></entry> - <entry>Порты, которым для работы требуется - <application>Perl</application> версии 5.</entry> - <entry/> - </row> - - <row> - <entry><filename>plan9*</filename></entry> - <entry>Различные программы из <link xlink:href="http://www.cs.bell-labs.com/plan9dist/"> - Plan9</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>polish</filename></entry> - <entry>Поддержка польского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>ports-mgmt</filename></entry> - <entry>Порты для управления, установки и разработки - портов и пакетов &os;.</entry> - <entry/> - </row> - - <row> - <entry><filename>portuguese</filename></entry> - <entry>Поддержка португальского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>print</filename></entry> - <entry>Программное обеспечение для печати.</entry> - <entry>Инструменты для вёрстки (просмотрщики и тому подобное) - тоже относятся сюда.</entry> - </row> - - <row> - <entry><filename>python*</filename></entry> - <entry>Программное обеспечение, связанное с языком <link xlink:href="http://www.python.org/">Python</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>ruby*</filename></entry> - <entry>Программное обеспечение, связанное с языком <link xlink:href="http://www.ruby-lang.org/">Ruby</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>rubygems*</filename></entry> - <entry>Порты для пакетов <link xlink:href="http://www.rubygems.org/">RubyGems</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>russian</filename></entry> - <entry>Поддержка русского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>scheme*</filename></entry> - <entry>Программное обеспечение, связанное с языком - Scheme.</entry> - <entry/> - </row> - - <row> - <entry><filename>science</filename></entry> - <entry>Научные программы, которые не подпадают под другие - категории, скажем, <filename>astro</filename>, - <filename>biology</filename> или - <filename>math</filename>.</entry> - <entry/> - </row> - - <row> - <entry><filename>security</filename></entry> - <entry>Программы, обеспечивающие безопасность системы.</entry> - <entry/> - </row> - - <row> - <entry><filename>shells</filename></entry> - <entry>Различные командные процессоры.</entry> - <entry/> - </row> - - <row> - <entry><filename>sysutils</filename></entry> - <entry>Системные утилиты.</entry> - <entry/> - </row> - - <row> - <entry><filename>spanish*</filename></entry> - <entry>Поддержка испанского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>tcl*</filename></entry> - <entry>Порты, для работы которых нужен Tcl.</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/> - </row> - - <row> - <entry><filename>ukrainian</filename></entry> - <entry>Поддержка украинского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>vietnamese</filename></entry> - <entry>Поддержка вьетнамского языка.</entry> - <entry/> - </row> - - <row> - <entry><filename>windowmaker*</filename></entry> - <entry>Порты, поддерживающие менеджер окон WindowMaker.</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> - (смотрите ниже).</entry> - </row> - - <row> - <entry><filename>x11-clocks</filename></entry> - <entry>Часы для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-drivers</filename></entry> - <entry>Драйверы X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-fm</filename></entry> - <entry>Менеджеры файлов для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-fonts</filename></entry> - <entry>Шрифты для X11 и утилиты для работы с ними.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-servers</filename></entry> - <entry>Серверы для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-themes</filename></entry> - <entry>Темы для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-toolkits</filename></entry> - <entry>Пакеты разработчика для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>x11-wm</filename></entry> - <entry>Оконные менеджеры для X11.</entry> - <entry/> - </row> - - <row> - <entry><filename>xfce*</filename></entry> - <entry>Порты, связанные с окружением рабочего стола - <link xlink:href="http://www.xfce.org/">Xfce</link>.</entry> - <entry/> - </row> - - <row> - <entry><filename>zope*</filename></entry> - <entry>Поддержка <link xlink:href="http://www.zope.org/">Zope</link>.</entry> - <entry/> - </row> - </tbody> - </tgroup> - </informaltable> - </sect2> - - <sect2 xml:id="choosing-categories"> - <title>Выбор правильной категории</title> - - <para>Так как многие категории перекрываются, вам часто необходимо - будет выбирать, какая их них должна быть основной для вашего порта. - Есть несколько правил, по которым можно решить этот вопрос. Вот - список приоритетов, в уменьшающейся степени предпочтения:</para> + <para>Добавление патчей для исправления уязвимостей, + ошибок, или добавления новой функциональности в + порт.</para> + </listitem> - <itemizedlist> <listitem> - <para>Первая категория должна быть физической категорий (смотрите - <link linkend="porting-categories">выше</link>). Это - необходимо для создания пакетов. После этого виртуальные - и физические категории могут смешиваться.</para> + <para>Изменения в файле <filename>Makefile</filename> + порта для включения и выключения параметров, + определяемых при компиляции пакета.</para> </listitem> <listitem> - <para>Сначала всегда идут категории, специфичные для языков. - Например, если ваш порт устанавливает японские шрифты для X11, - то строчка <varname>CATEGORIES</varname> должна иметь вид - <filename>japanese x11-fonts</filename>.</para> + <para>Изменения в списке упаковки или в поведении пакета + во время его установки (например, изменение скрипта, + генерирующего начальные данные для пакета, такие, как + ssh-ключи для хоста).</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> + <para>Увеличение версии динамической библиотеки, от + которой зависит порт (в этом случае тот, кто попытается + установить старый пакет после установки более новой + версии библиотеки, не сможет этого сделать, потому что + при этом будет делаться поиск старой библиотеки + libfoo.x, а не libfoo.(x+1)).</para> </listitem> <listitem> - <para><filename>x11</filename> используется как вторичная категория - только в случае, если в качестве основной категории указан - естественный язык. В частности, вам не нужно указывать - <filename>x11</filename> в качестве категории для - приложений X.</para> + <para>Большие функциональные изменения в дистрибутивном + файле порта, происходящие без объявлений, и приводящие + к большим изменениям, то есть изменения в дистрибутиве + требуют корректировки файла + <filename>distinfo</filename> без соответствующего + изменения <varname>PORTVERSION</varname>, когда как + команда <command>diff -ru</command> между новой и + старой версиями показывает нетривиальные изменения в + коде.</para> </listitem> + </itemizedlist> + + <para>Примеры изменений, которые не требуют увеличения + переменной <varname>PORTREVISION</varname>:</para> + <itemizedlist> <listitem> - <para>Режимы для редактора <application>Emacs</application> должны - помещаться в ту же категорию, что и приложение, которое - поддерживается этим режимом, а не в <filename>editors</filename>. - Например, режим <application>Emacs</application> для - редактирования исходного кода некоторого языка программирования - должен быть помещен в категорию <filename>lang</filename>.</para> + <para>Изменения стиля в скелете порта без функциональных + изменений в пакете.</para> </listitem> <listitem> - <para>Порты, устанавливающие загружаемые модули ядра, должны - содержать виртуальную категорию <filename>kld</filename> в - строке <varname>CATEGORIES</varname>. Это одно из действий, - выполняемых автоматически с добавлением - <literal>kmod</literal> в строке <varname>USES</varname>. - </para> + <para>Изменения в переменной + <varname>MASTER_SITES</varname> или другие + функциональные изменения порта, которые не затрагивают + получающегося пакета.</para> </listitem> <listitem> - <para><filename>misc</filename> - не должна указываться вместе с любой другой невиртуальной - категорией. Если вы указываете <literal>misc</literal> - вместе с чем-то ещё в строке <varname>CATEGORIES</varname>, - это значит, что вы можете спокойно удалить - <literal>misc</literal> и просто поместить порт в этот - другой подкаталог!</para> + <para>Тривиальные патчи к дистрибутивному файлу, такие, + как исправления опечаток, которые не так уж важны, что + пользователи пакета должны озаботиться + обновлением.</para> </listitem> <listitem> - <para>Если ваш порт решительным образом не подпадает ни под какую - категорию, поместите его в <filename>misc</filename>.</para> - </listitem> - </itemizedlist> - - <para>Если вы не уверены в правильности выбора категории, пожалуйста, - отметьте это в вашем сообщении через &man.send-pr.1;, чтобы мы - могли обсудить это до того, как включить порт в Коллекцию. Если вы - являетесь коммиттером, пошлите замечание на адрес &a.ports;, чтобы мы - могли обсудить это. Зачастую новые порты помещаются не в ту - категорию только для того, чтобы их оттуда сразу же удалили. - Это приводит к излишнему и ненужному росту основного хранилища - исходных текстов.</para> - </sect2> - - <sect2 xml:id="proposing-categories"> - <title>Предложение новой категории</title> - - <para>Поскольку со временем Коллекция Портов увеличилась, то в связи - с этим были добавлены различные новые категории. Новые категории - могут быть или <emphasis>виртуальными</emphasis> категориями— - которые не имеют соответствующего подкаталога в дереве портов— - или <emphasis>физическими</emphasis> категориями—у которых - он есть. Следующий текст содержит обсуждение вопросов, возникающих - при создании новой физической категории, чтобы вы могли понимать - их, когда предложите новую категорию.</para> - - <para>В соответствие с существующей практикой мы избегаем создания - новой физической категории, пока достаточно большое число портов - логически ей не принадлежит или же порты, которые могли бы ей - принадлежать, не являются логически обособленной группой, - представляющей для всех ограниченный интерес (в частности, - категории, относящиеся к естественным языкам); предпочтительно - выполнение обоих условий.</para> - - <para>Основной причиной для этого является то, что такое изменение - создает <link xlink:href="&url.articles.committers-guide;/#ports">изрядное - количество работы</link> и для коммиттеров, и для всех тех - пользователей, которые отслеживают изменения в Коллекции Портов. - В дополнение, предложенная категория создает естественное - разногласие. (Пожалуй, потому что не существует четкого соглашения, - является ли категория <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 одобрен, то коммиттеру нужно продолжить - остальную часть процедуры, которая <link xlink:href="&url.articles.committers-guide;/article.html#PORTS"> - изложена в Руководстве Коммиттера</link>.</para> - </step> - </procedure> - - <para>Предложение новой виртуальной категории должно быть схожим - с вышеизложенным, но при этом затрагивать намного меньше, - поскольку ни один из портов не будет перемещен в действительности. - В этом случае единственными патчами, включенными в PR, будут - те, что добавляют новую категорию в <varname>CATEGORIES</varname> - каждого из затрагиваемых портов.</para> - </sect2> - - <sect2 xml:id="proposing-reorg"> - <title>Предложение реорганизации всех категорий</title> - - <para>Время от времени кто-нибудь предлагает произвести реорганизацию - категорий либо до двухуровневой, либо другого типа на основе - ключевых слов. На данный момент из этих предложений ничего не - получилось, потому что, хотя они просты в реализации, но - предполагаемая переделка всей коллекции портов по меньшей мере - приводит в уныние. Пожалуйста, прочтите историю этих предложений - в архивах рассылок перед тем, как присылать свои соображения; - более того, вы должны быть готовы представить работающий - прототип.</para> - </sect2> - </sect1> - - <sect1 xml:id="makefile-distfiles"> - <title>Дистрибутивные файлы</title> - - <para>Во второй части <filename>Makefile</filename> задаётся, какие - файлы и откуда должны быть сгружены для того, чтобы построить - порт.</para> - - <sect2> - <title><varname>DISTVERSION/DISTNAME</varname></title> - - <para>В переменной <varname>DISTNAME</varname> указывается имя порта - так, как назвали его создатели программного обеспечения. Значение - <varname>DISTNAME</varname> по умолчанию совпадает с - <literal>${PORTNAME}-${PORTVERSION}</literal>, так что - переопределяете её значение только в случае необходимости. - <varname>DISTNAME</varname> используется только в двух местах. - Во-первых, список дистрибутивных файлов - (<varname>DISTFILES</varname>) по умолчанию состоит из - <varname>${DISTNAME}</varname><varname>${EXTRACT_SUFX}</varname>. И - во-вторых, предполагается, что дистрибутивный файл будет распакован в - подкаталог с именем <varname>WRKSRC</varname>, значение которого по - умолчанию есть не что иное, как - <filename>work/${DISTNAME}</filename>.</para> - - <para>Названия некоторых дистрибутивов, которые не укладываются в - <literal>${PORTNAME}-${PORTVERSION}</literal>-схему, могут быть - автоматически обработаны посредством установки переменной - <varname>DISTVERSION</varname>. <varname>PORTVERSION</varname> и - <varname>DISTNAME</varname> будут унаследованы автоматически, но - конечно же могут быть переопределены. Следующая таблица - демонстрирует некоторые примеры:</para> - - <informaltable frame="none" pgwide="0"> - <tgroup cols="2"> - <thead> - <row> - <entry><varname>DISTVERSION</varname></entry> - <entry><varname>PORTVERSION</varname></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>Значения переменных <varname>PKGNAMEPREFIX</varname> - и <varname>PKGNAMESUFFIX</varname> не влияют на значение - <varname>DISTNAME</varname>. Заметьте также, что если значение - <varname>WRKSRC</varname> равно - <filename>work/${PORTNAME}-${PORTVERSION}</filename>, - и в случае, когда оригинальный архив называется по имени, отличном - от <varname>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</varname>, - скорее всего, вы должны оставить <varname>DISTNAME</varname> - как есть— лучше переопределить <varname>DISTFILES</varname>, - чем задавать значения как - <varname>DISTNAME</varname>, так и <varname>WRKSRC</varname> - (и, возможно, ещё и <varname>EXTRACT_SUFX</varname>).</para> - </note> - </sect2> - - <sect2> - <title><varname>MASTER_SITES</varname></title> - - <para>Содержит часть с каталогом FTP/HTTP-URL, которая указывает на - оригинальный архив на сервере <varname>MASTER_SITES</varname>. Не - забудьте лидирующий слэш (<filename>/</filename>)!</para> - - <para>Макрос команды <command>make</command> будет пытаться - воспользоваться этой переменной для получения дистрибутивного файла - с помощью программы <varname>FETCH</varname>, если он не будет найден - в системе.</para> - - <para>Рекомендуется помещать в список много сайтов, предпочтительно с - разных континентов. Это поможет при наличии проблем с мировой сетью. - Мы даже планируем добавить поддержку автоматического определения - ближайшего сайта и сгрузки файлов оттуда; наличие нескольких сайтов - будет способствовать этому начинанию.</para> - - <para>Если оригинальный архив находится на одном из таких популярных - серверов, как SourceForge, GNU или Perl CPAN, то указывайте эти - сайты в простой форме при помощи - <varname>MASTER_SITE_<replaceable>*</replaceable></varname> - (к примеру, <varname>MASTER_SITE_SOURCEFORGE</varname>, - <varname>MASTER_SITE_GNU</varname> или - <varname>MASTER_SITE_PERL_CPAN</varname>. Просто укажите в переменной - <varname>MASTER_SITES</varname> одно из этих значений, а в - переменной <varname>MASTER_SITE_SUBDIR</varname> задайте путь к - архиву. Вот пример:</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>Популярные магические макросы для - <varname>MASTER_SITES</varname></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Macro</entry> - - <entry>Assumed subdirectory</entry> - </row> - </thead> + <para>Исправления, касающиеся этапа построения, которые + делают возможным построение пакета, если ранее это было + невозможно сделать (пока изменения не приводят к + изменению работы на любых других платформах, на которых + порт ранее строился). Так как + <varname>PORTREVISION</varname> отражает содержимое + пакета, то, если ранее пакет не строился, то нет нужды + увеличивать <varname>PORTREVISION</varname> для отметки + изменения.</para> + </listitem> + </itemizedlist> - <tbody> - <row> - <entry><varname>BERLIOS</varname></entry> + <para>Правило, которому нужно приблизительно следовать, + заключается в том, что нужно спрашивать себя, является ли + вносимое в порт изменение таким, что от него выиграют все + (в виде усовершенствования, исправления или благодаря тому, + что новый пакет будет вообще работоспособным), и примите во + внимание тот факт, что при этом все, кто регулярно + обновляют своё дерево портов, будут обязаны это сделать. + Если это так, то переменная <varname>PORTREVISION</varname> + должна быть увеличена.</para> + </sect3> + + <sect3> + <title><varname>PORTEPOCH</varname></title> + + <para>Время от времени разработчик программного обеспечения + или создатель порта &os; делают что-то не так и выпускают + версию программы, номер которой меньше предыдущей версии. + Примером этого является порт, название которого меняется с + foo-20000801 на foo-1.0 (изначально это не считалось бы + более новой версией, так как 20000801 численно больше, чем + 1).</para> + + <tip> + <para>Результат сравнения номера версии не всегда очевиден. + Для выполнения сравнения двух строк с номером версии + можно использовать <command>pkg version</command> (см. + &man.pkg-version.8;). Например:</para> + + <screen>&prompt.user; <userinput>pkg version -t 0.031 0.29</userinput> +></screen> - <entry><varname>/${PORTNAME:L}</varname></entry> - </row> + <para>Строка <literal>></literal> в выводе команды + означает, что версия 0.031 считается выше, чем версия + 0.29, что может быть не очевидно для того, кто выполняет + портирование.</para> + </tip> - <row> - <entry><varname>CHEESESHOP</varname></entry> + <para>В ситуациях, подобных этой, должно быть увеличено + значение <varname>PORTEPOCH</varname>. Если значение + <varname>PORTEPOCH</varname> не равно нулю, то оно + добавляется к имени пакета, как описано в разделе выше. + Значение <varname>PORTEPOCH</varname> никогда не должно + уменьшаться или сбрасываться в ноль, потому что это + приведёт к ошибке сравнения с пакетом с меньшим номером + эпохи (то есть то, что пакет устарел, обнаружено не будет): + номер новой версии (например, <literal>1.0,1</literal> в + примере выше) останется меньше, чем номер предыдущей версии + (20000801), однако суффикс <literal>,1</literal> + интерпретируется различными автоматизированными утилитами + особым образом, и окажется больше, чем предполагаемый + суффикс <literal>,0</literal> более раннего пакета).</para> + + <para>Некорректное уменьшение или сброс + <varname>PORTEPOCH</varname> приводит к печальным + последствиям; если вы не поняли, о чём шла речь ранее, + пожалуйста, всё же разберитесь с этим, либо спросите в + списках рассылки.</para> + + <para>Предполагается, что в большинстве портов переменная + <varname>PORTEPOCH</varname> использоваться не будет, но + при корректном использовании <varname>PORTVERSION</varname> + может появиться необходимость её иметь, если в будущих + релизах программное обеспечение должно изменить структуру + номера версии. Однако создателям портов для &os; нужно + быть внимательными, когда разработчик выпускает релиз без + официального номера версии — эдакие + <quote>промежуточные</quote> релизы. Имеется соблазн + пометить релиз датой его выхода, что может вызвать + проблемы, как и в примере выше, когда будет выпущен новый + <quote>официальный</quote> релиз.</para> + + <para>Например, если промежуточный релиз помечен датой + 20000917, а предыдущая версия программного обеспечения + имела номер 1.2, то промежуточному релизу должно быть + поставлено в соответствие значение + <varname>PORTVERSION</varname>, равное 1.2.20000917 или + что-то похожее, но не 20000917, так как последующий релиз, + скажем, 1.3, должен иметь численно большее значение.</para> + </sect3> + + <sect3> + <title>Пример использования переменных + <varname>PORTREVISION</varname> и + <varname>PORTEPOCH</varname></title> + + <para>Выполнен коммит порта <literal>gtkmumble</literal>, + версии <literal>0.10</literal>, в коллекцию портов.</para> + + <programlisting>PORTNAME= gtkmumble +PORTVERSION= 0.10</programlisting> + + <para>Значение <varname>PKGNAME</varname> станет равным + <literal>gtkmumble-0.10</literal>.</para> + + <para>Обнаружена брешь в безопасности, исправление которой + потребовало создания локального патча для &os;. + Соответственно было увеличено значение переменной + <varname>PORTREVISION</varname>.</para> + + <programlisting>PORTNAME= gtkmumble +PORTVERSION= 0.10 +PORTREVISION= 1</programlisting> + + <para><varname>PKGNAME</varname> принимает значение + <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>, то должно быть + увеличено значение <varname>PORTEPOCH</varname> для того, + чтобы заставить распознавать вновь создаваемый пакет как + <quote>более новый</quote>. Так как это новый релиз + программы, то <varname>PORTREVISION</varname> обнуляется + (или удаляется из файла + <filename>Makefile</filename>).</para> + + <programlisting>PORTNAME= gtkmumble +PORTVERSION= 0.2 +PORTEPOCH= 1</programlisting> + + <para><varname>PKGNAME</varname> принимает значение + <literal>gtkmumble-0.2,1</literal></para> + + <para>Следующий релиз имеет номер версии 0.3. Так как + значение переменной <varname>PORTEPOCH</varname> никогда не + уменьшается, что переменные, определяющие версии, теперь + выглядят так:</para> + + <programlisting>PORTNAME= gtkmumble +PORTVERSION= 0.3 +PORTEPOCH= 1</programlisting> + + <para><varname>PKGNAME</varname> принимает значение + <literal>gtkmumble-0.3,1</literal></para> - <entry><varname>/packages/source/source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}</varname></entry> - </row> + <note> + <para>Если значение <varname>PORTEPOCH</varname> этим + обновлением было бы сброшено в <literal>0</literal>, то + кто-нибудь, имеющий установленный пакет + <literal>gtkmumble-0.10_1</literal>, не смог бы опознать + пакет <literal>gtkmumble-0.3</literal> как более новый, + так как <literal>3</literal> было бы меньше, чем + <literal>10</literal>. Помните, что в первую очередь это + касается <varname>PORTEPOCH</varname>.</para> + </note> + </sect3> + </sect2> + + <sect2> + <title>Переменные <varname>PKGNAMEPREFIX</varname> и + <varname>PKGNAMESUFFIX</varname></title> + + <para>Две необязательные переменные, + <varname>PKGNAMEPREFIX</varname> и + <varname>PKGNAMESUFFIX</varname>, объединяются со значениями + <varname>PORTNAME</varname> и <varname>PORTVERSION</varname> + для формирования <varname>PKGNAME</varname> в форме + <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>. + Добейтесь того, чтобы это соответствовало нашим + <link linkend="porting-pkgname">рекомендациям по правильному + выбору названий для пакетов</link>. В частности, в + переменной <varname>PORTVERSION</varname> <emphasis>не + разрешается</emphasis> использование дефиса + (<literal>-</literal>). Кроме того, если в имени пакета + присутствует часть <replaceable>language-</replaceable> или + <replaceable>-compiled.specifics</replaceable> (смотрите + ниже), то используйте переменные + <varname>PKGNAMEPREFIX</varname> и + <varname>PKGNAMESUFFIX</varname>, соответственно. Не делайте + их частью значения переменной + <varname>PORTNAME</varname>.</para> + </sect2> + + <sect2 xml:id="porting-pkgname"> + <title>Соглашения по именованию пакетов</title> + + <para>Далее описаны некоторые соглашения, которым вы должны + следовать в именовании ваших пакетов. Они были разработаны + для облегчения просмотра каталога, так как имеется уже тысячи + пакетов, а пользователи отвернутся от нас, если список не + понравится их взору!</para> + + <para>Имя пакета должно иметь вид + <filename>language_region-name-compiled.specifics-version.numbers</filename>.</para> + + <para>Имя пакета определяется как + <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>. + Вы должны задавать значения переменных в соответствии с этим + форматом.</para> - <row> - <entry><varname>DEBIAN</varname></entry> + <orderedlist> + <listitem> + <para>&os; пытается поддерживать языки, на которых + разговаривают её пользователи. Часть + <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> должна + задаваться в переменной + <varname>PKGNAMEPREFIX</varname>.</para> + </listitem> - <entry><varname>/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}</varname></entry> - </row> + <listitem> + <para>Первая буква части <filename>name</filename> должна + быть в нижнем регистре. (Оставшаяся часть названия может + содержать буквы в верхнем регистре, так что принимайте + решение сами, когда преобразуете имя программного пакета, + содержащего в имени некоторое количество заглавных букв.) + Существует традиция именовать модули для <literal>Perl + 5</literal>, добавляя впереди <literal>p5-</literal> и + преобразуя пару двоеточий в дефис; например, модуль + <literal>Data::Dumper</literal> будет именоваться + <literal>p5-Data-Dumper</literal>.</para> + </listitem> - <row> - <entry><varname>GCC</varname></entry> + <listitem> + <para>Убедитесь, что имя порта и версия четко отделены и + размещаются в переменных <varname>PORTNAME</varname> и + <varname>PORTVERSION</varname>. Единственная причина, по + которой <varname>PORTNAME</varname> содержит версионную + часть, это если полученный дистрибутив сам назван таким + образом, как это сделано для портов + <filename>textproc/libxml2</filename> или + <filename>japanese/kinput2-freewnn</filename>. В + противном случае <varname>PORTNAME</varname> не должен + содержать никакой информации, указывающей на версию. То, + что некоторые порты имеют одинаковый + <varname>PORTNAME</varname>, является вполне нормальным, + как для портов <filename>www/apache*</filename>; в этом + случае различные версии (и различные записи в индексе) + отличаются по значениям <varname>PKGNAMEPREFIX</varname> + и <varname>PKGNAMESUFFIX</varname>.</para> + </listitem> - <entry><varname>/pub/gcc/releases/${DISTNAME}</varname></entry> - </row> + <listitem> + <para>Если порт может быть построен с различными + <link linkend="makefile-masterdir">статически заданными + значениями по умолчанию</link> (обычно это часть + имени каталога в семействе портов), то часть + <replaceable>-compiled.specifics</replaceable> должна + определять вкомпилированные значения по умолчанию + (дефис не обязателен). Примерами являются размеры + бумаги и шрифтов.</para> + + <para>Часть <replaceable>-compiled.specifics</replaceable> + должна задаваться в переменной + <varname>PKGNAMESUFFIX</varname>.</para> + </listitem> - <row> - <entry><varname>GNOME</varname></entry> + <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.yyyy.mm.dd</literal>, но не + <literal>dd.mm.yyyy</literal> или не совместимый с + проблемой Y2K <literal>yy.mm.dd</literal>. Добавление к + версии префикса <literal>0.0.</literal> является важным, + в случае если выпущен релиз с присвоением настоящей + версии, которая в числовом представлении, конечно же, + будет ниже, чем <literal>yyyy</literal>.</para> + </listitem> + </orderedlist> - <entry><varname>/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}</varname></entry> - </row> + <para>Вот несколько (реальных) примеров того, как преобразовать + имя из оригинального, придуманного авторами, к подходящему + для имени пакета:</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="6"> + <thead> + <row> + <entry>Имя дистрибутива</entry> + <entry><varname>PKGNAMEPREFIX</varname></entry> + <entry><varname>PORTNAME</varname></entry> + <entry><varname>PKGNAMESUFFIX</varname></entry> + <entry><varname>PORTVERSION</varname></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.yyyy.mm.dd</literal>) в качестве номера + версии.</para> + </sect2> + </sect1> - <row> - <entry><varname>GNU</varname></entry> + <sect1 xml:id="makefile-categories"> + <title>Разделение по категориям</title> + + <sect2> + <title><varname>CATEGORIES</varname></title> + + <para>В процессе создания пакета он помещается в каталог + <filename>/usr/ports/packages/All</filename>, а в одном или + более подкаталогов из + <filename>/usr/ports/packages</filename> создаются на него + ссылки. Имена этих подкаталогов определяются переменной + <varname>CATEGORIES</varname>. Такая схема нужна для + облегчения жизни пользователя, когда он сталкивается с массой + пакетов на FTP-сервере или компакт-диске. Пожалуйста, + посмотрите на <link linkend="porting-categories">текущий + список категорий</link> и выберите те из них, которые более + всего подходят к вашему порту.</para> + + <para>Этот список также определяет, куда в дереве портов будет + помещен порт. Если вы укажете здесь более одной категории, + то предполагается, что файлы порта будут помещены в + подкаталог с именем первой категории. Посмотрите + <link linkend="choosing-categories">ниже</link> для получения + подробной информации о том, как правильно выбрать + категории.</para> + </sect2> + + <sect2 xml:id="porting-categories"> + <title>Текущий список категорий</title> + + <para>Вот текущий список категорий. Те, которые отмечены + звёздочкой (<literal>*</literal>), являются + <emphasis>виртуальными</emphasis> категориями—они не + имеют собственного подкаталога в дереве портов. Они + используются только в качестве вторичных категорий, и только + для поиска.</para> - <entry><varname>/gnu/${PORTNAME}</varname></entry> - </row> + <note> + <para>Для невиртуальных категорий имеется однострочное + описание в <varname>COMMENT</varname> в + <filename>Makefile</filename> соответствующего + подкаталога.</para> + </note> - <row> - <entry><varname>MOZDEV</varname></entry> + <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/> + </row> + + <row> + <entry><filename>afterstep*</filename></entry> + <entry>Порты, поддерживающие менеджер окон <link + xlink:href="http://www.afterstep.org">AfterStep</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>arabic</filename></entry> + <entry>Поддержка арабского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>archivers</filename></entry> + <entry>Инструменты для работы с архивами.</entry> + <entry/> + </row> + + <row> + <entry><filename>astro</filename></entry> + <entry>Приложения, связанные с астрономией.</entry> + <entry/> + </row> + + <row> + <entry><filename>audio</filename></entry> + <entry>Поддержка работы со звуком.</entry> + <entry/> + </row> + + <row> + <entry><filename>benchmarks</filename></entry> + <entry>Утилиты для измерения производительности + системы.</entry> + <entry/> + </row> + + <row> + <entry><filename>biology</filename></entry> + <entry>Программное обеспечение, связанное с + биологией.</entry> + <entry/> + </row> + + <row> + <entry><filename>cad</filename></entry> + <entry>Инструменты Систем Автоматизированного + Проектирования.</entry> + <entry/> + </row> + + <row> + <entry><filename>chinese</filename></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/> + </row> + + <row> + <entry><filename>databases</filename></entry> + <entry>Базы данных.</entry> + <entry/> + </row> + + <row> + <entry><filename>deskutils</filename></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/> + </row> + + <row> + <entry><filename>docs*</filename></entry> + <entry>Мета-порты для документации &os;.</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/> + </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/> + </row> + + <row> + <entry><filename>french</filename></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/> + </row> + + <row> + <entry><filename>geography*</filename></entry> + <entry>Программное обеспечение, связанное с + географией.</entry> + <entry/> + </row> + + <row> + <entry><filename>german</filename></entry> + <entry>Поддержка немецкого языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>gnome*</filename></entry> + <entry>Порты Проекта <link + xlink:href="http://www.gnome.org">GNOME</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>gnustep*</filename></entry> + <entry>Программное обеспечение для окружения рабочего + стола GNUstep.</entry> + <entry/> + </row> + + <row> + <entry><filename>graphics</filename></entry> + <entry>Графические утилиты.</entry> + <entry/> + </row> + + <row> + <entry><filename>hamradio*</filename></entry> + <entry>Программное обеспечение для любительского + радио</entry> + <entry/> + </row> + + <row> + <entry><filename>haskell*</filename></entry> + <entry>Программное обеспечение, связанное с языком + Haskell.</entry> + <entry/> + </row> + + <row> + <entry><filename>hebrew</filename></entry> + <entry>Поддержка иврита.</entry> + <entry/> + </row> + + <row> + <entry><filename>hungarian</filename></entry> + <entry>Поддержка венгерского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>ipv6*</filename></entry> + <entry>Программное обеспечение, связанное с + IPv6.</entry> + <entry/> + </row> + + <row> + <entry><filename>irc</filename></entry> + <entry>Утилиты для Internet Relay Chat.</entry> + <entry/> + </row> + + <row> + <entry><filename>japanese</filename></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>Порты проекта <link + xlink:href="http://www.kde.org">KDE</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>kld*</filename></entry> + <entry>Загружаемые модули ядра.</entry> + <entry/> + </row> + + <row> + <entry><filename>korean</filename></entry> + <entry>Поддержка корейского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>lang</filename></entry> + <entry>Языки программирования.</entry> + <entry/> + </row> + + <row> + <entry><filename>linux*</filename></entry> + <entry>Linux приложения и утилиты.</entry> + <entry/> + </row> + + <row> + <entry><filename>lisp*</filename></entry> + <entry>Программное обеспечение, связанное с языком + Lisp.</entry> + <entry/> + </row> + + <row> + <entry><filename>mail</filename></entry> + <entry>Программы для работы с почтой.</entry> + <entry/> + </row> + + <row> + <entry><filename>math</filename></entry> + <entry>Программное обеспечение для численных вычислений + и другие утилиты, связанные с математикой.</entry> + <entry/> + </row> + + <row> + <entry><filename>mbone*</filename></entry> + <entry>Приложения для MBone.</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/> + </row> + + <row> + <entry><filename>net</filename></entry> + <entry>Различное сетевое программное + обеспечение.</entry> + <entry/> + </row> + + <row> + <entry><filename>net-im</filename></entry> + <entry>Программы мгновенного обмена + сообщениями.</entry> + <entry/> + </row> + + <row> + <entry><filename>net-mgmt</filename></entry> + <entry>Программное обеспечение для сетевого + управления.</entry> + <entry/> + </row> + + <row> + <entry><filename>net-p2p</filename></entry> + <entry>Приложения для пиринговых сетей.</entry> + <entry/> + </row> + + <row> + <entry><filename>news</filename></entry> + <entry>Программное обеспечение для работы с + конференциями USENET.</entry> + <entry/> + </row> + + <row> + <entry><filename>palm</filename></entry> + <entry>Программная поддержка <link + xlink:href="http://www.palm.com/">Palm™</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>parallel*</filename></entry> + <entry>Приложения, связанные с параллельными + вычислениями.</entry> + <entry/> + </row> + + <row> + <entry><filename>pear*</filename></entry> + <entry>Порты, относящиеся к технологии Pear + PHP.</entry> + <entry/> + </row> + + <row> + <entry><filename>perl5*</filename></entry> + <entry>Порты, которым для работы требуется + <application>Perl</application> версии 5.</entry> + <entry/> + </row> + + <row> + <entry><filename>plan9*</filename></entry> + <entry>Различные программы из <link + xlink:href="http://www.cs.bell-labs.com/plan9dist/">Plan9</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>polish</filename></entry> + <entry>Поддержка польского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>ports-mgmt</filename></entry> + <entry>Порты для управления, установки и разработки + портов и пакетов &os;.</entry> + <entry/> + </row> + + <row> + <entry><filename>portuguese</filename></entry> + <entry>Поддержка португальского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>print</filename></entry> + <entry>Программное обеспечение для печати.</entry> + <entry>Инструменты для вёрстки (просмотрщики и тому + подобное) тоже относятся сюда.</entry> + </row> + + <row> + <entry><filename>python*</filename></entry> + <entry>Программное обеспечение, связанное с языком + <link + xlink:href="http://www.python.org/">Python</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>ruby*</filename></entry> + <entry>Программное обеспечение, связанное с языком + <link + xlink:href="http://www.ruby-lang.org/">Ruby</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>rubygems*</filename></entry> + <entry>Порты для пакетов <link + xlink:href="http://www.rubygems.org/">RubyGems</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>russian</filename></entry> + <entry>Поддержка русского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>scheme*</filename></entry> + <entry>Программное обеспечение, связанное с языком + Scheme.</entry> + <entry/> + </row> + + <row> + <entry><filename>science</filename></entry> + <entry>Научные программы, которые не подпадают под + другие категории, скажем, <filename>astro</filename>, + <filename>biology</filename> или + <filename>math</filename>.</entry> + <entry/> + </row> + + <row> + <entry><filename>security</filename></entry> + <entry>Программы, обеспечивающие безопасность + системы.</entry> + <entry/> + </row> + + <row> + <entry><filename>shells</filename></entry> + <entry>Различные командные процессоры.</entry> + <entry/> + </row> + + <row> + <entry><filename>sysutils</filename></entry> + <entry>Системные утилиты.</entry> + <entry/> + </row> + + <row> + <entry><filename>spanish*</filename></entry> + <entry>Поддержка испанского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>tcl*</filename></entry> + <entry>Порты, для работы которых нужен Tcl.</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/> + </row> + + <row> + <entry><filename>ukrainian</filename></entry> + <entry>Поддержка украинского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>vietnamese</filename></entry> + <entry>Поддержка вьетнамского языка.</entry> + <entry/> + </row> + + <row> + <entry><filename>windowmaker*</filename></entry> + <entry>Порты для поддержки менеджера окон + WindowMaker.</entry> + <entry/> + </row> + + <row> + <entry><filename>www</filename></entry> + <entry>Программное обеспечение, связанное со всемирной + паутиной.</entry> + <entry>Поддержка языка HTML относится сюда же.</entry> + </row> + + <row> + <entry><filename>x11</filename></entry> + <entry>X Window System и иже с ними.</entry> + <entry>Эта категория предназначена только для + программного обеспечения, которое поддерживает саму + оконную систему. Не помещайте сюда обычные + приложения для X: большинство из них должны быть + перенесены в другие категории + <filename>x11-*</filename> (смотрите ниже).</entry> + </row> + + <row> + <entry><filename>x11-clocks</filename></entry> + <entry>Часы для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-drivers</filename></entry> + <entry>Драйверы X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-fm</filename></entry> + <entry>Менеджеры файлов для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-fonts</filename></entry> + <entry>Шрифты для X11 и утилиты для работы с + ними.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-servers</filename></entry> + <entry>Серверы для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-themes</filename></entry> + <entry>Темы для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-toolkits</filename></entry> + <entry>Пакеты разработчика для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>x11-wm</filename></entry> + <entry>Оконные менеджеры для X11.</entry> + <entry/> + </row> + + <row> + <entry><filename>xfce*</filename></entry> + <entry>Порты, связанные с окружением рабочего стола + <link + xlink:href="http://www.xfce.org/">Xfce</link>.</entry> + <entry/> + </row> + + <row> + <entry><filename>zope*</filename></entry> + <entry>Поддержка <link + xlink:href="http://www.zope.org/">Zope</link>.</entry> + <entry/> + </row> + </tbody> + </tgroup> + </informaltable> + </sect2> + + <sect2 xml:id="choosing-categories"> + <title>Выбор правильной категории</title> + + <para>Так как многие категории перекрываются, вам часто + необходимо будет выбирать, какая их них должна быть основной + для вашего порта. Есть несколько правил, по которым можно + решить этот вопрос. Вот список приоритетов, в уменьшающейся + степени предпочтения:</para> - <entry><varname>/pub/mozdev/${PORTNAME:L}</varname></entry> - </row> + <itemizedlist> + <listitem> + <para>Первая категория должна быть физической категорий + (смотрите <link + linkend="porting-categories">выше</link>). Это + необходимо для создания пакетов. После этого виртуальные + и физические категории могут смешиваться.</para> + </listitem> - <row> - <entry><varname>PERL_CPAN</varname></entry> + <listitem> + <para>Сначала всегда идут категории, специфичные для + языков. Например, если ваш порт устанавливает японские + шрифты для X11, то строчка <varname>CATEGORIES</varname> + должна иметь вид + <filename>japanese x11-fonts</filename>.</para> + </listitem> - <entry><varname>/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}</varname></entry> - </row> + <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> - <row> - <entry><varname>PYTHON</varname></entry> + <listitem> + <para><filename>x11</filename> используется как вторичная + категория только в случае, если в качестве основной + категории указан естественный язык. В частности, вам не + нужно указывать <filename>x11</filename> в качестве + категории для приложений X.</para> + </listitem> - <entry><varname>/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}</varname></entry> - </row> + <listitem> + <para>Режимы для редактора <application>Emacs</application> + должны помещаться в ту же категорию, что и приложение, + которое поддерживается этим режимом, а не в + <filename>editors</filename>. Например, + режим <application>Emacs</application> для редактирования + исходного кода некоторого языка программирования должен + быть помещен в категорию + <filename>lang</filename>.</para> + </listitem> - <row> - <entry><varname>RUBYFORGE</varname></entry> + <listitem> + <para>Порты, устанавливающие загружаемые модули ядра, + должны содержать виртуальную категорию + <filename>kld</filename> в строке + <varname>CATEGORIES</varname>. Это одно из действий, + выполняемых автоматически с добавлением + <literal>kmod</literal> в строке + <varname>USES</varname>.</para> + </listitem> - <entry><varname>/${PORTNAME:L}</varname></entry> - </row> + <listitem> + <para><filename>misc</filename> не должна указываться + вместе с любой другой невиртуальной категорией. Если вы + указываете <literal>misc</literal> вместе с чем-то ещё в + строке <varname>CATEGORIES</varname>, это значит, что вы + можете спокойно удалить <literal>misc</literal> и просто + поместить порт в этот другой подкаталог!</para> + </listitem> - <row> - <entry><varname>SAVANNAH</varname></entry> + <listitem> + <para>Если ваш порт решительным образом не подпадает ни под + какую категорию, поместите его в + <filename>misc</filename>.</para> + </listitem> + </itemizedlist> - <entry><varname>/${PORTNAME:L}</varname></entry> - </row> + <para>Если вы не уверены в правильности выбора категории, + пожалуйста, отметьте это в вашем сообщении &man.send-pr.1;, + чтобы мы могли обсудить это до того, как включить порт в + Коллекцию. Если вы являетесь коммиттером, пошлите замечание + на адрес &a.ports;, чтобы мы могли обсудить это. Зачастую + новые порты помещаются не в ту категорию только для того, + чтобы их оттуда сразу же удалили. Это приводит к излишнему и + ненужному росту основного хранилища исходных текстов.</para> + </sect2> + + <sect2 xml:id="proposing-categories"> + <title>Предложение новой категории</title> + + <para>Поскольку со временем Коллекция Портов увеличилась, то в + связи с этим были добавлены различные новые категории. Новые + категории могут быть или <emphasis>виртуальными</emphasis> + категориями—которые не имеют соответствующего + подкаталога в дереве портов—или + <emphasis>физическими</emphasis> категориями—у которых + он есть. Следующий текст содержит обсуждение вопросов, + возникающих при создании новой физической категории, чтобы вы + могли понимать их, когда предложите новую категорию.</para> + + <para>В соответствие с существующей практикой мы избегаем + создания новой физической категории, пока достаточно большое + число портов логически ей не принадлежит или же порты, + которые могли бы ей принадлежать, не являются логически + обособленной группой, представляющей для всех ограниченный + интерес (в частности, категории, относящиеся к естественным + языкам); предпочтительно выполнение обоих условий.</para> + + <para>Основной причиной для этого является то, что такое + изменение создает <link + xlink:href="&url.articles.committers-guide;/#ports">изрядное + количество работы</link> и для коммиттеров, и для всех тех + пользователей, которые отслеживают изменения в Коллекции + Портов. В дополнение, предложенная категория создает + естественное разногласие. (Пожалуй, потому что не существует + четкого соглашения, является ли категория <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> - <row> - <entry><varname>SF</varname></entry> + <listitem> + <para><filename>Makefile</filename> для категорий + старых портов</para> + </listitem> - <entry><varname>/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}</varname></entry> - </row> - </tbody> - </tgroup> - </table> - </sect2> - - <sect2> - <title><varname>EXTRACT_SUFX</varname></title> - - <para>Если у вас имеется один дистрибутивный файл, и в его имени - используется странное окончание для указания типа сжатия, задайте - переменную <varname>EXTRACT_SUFX</varname>.</para> - - <para>К примеру, если дистрибутивный файл носит имя - <filename>foo.tgz</filename>, а не более привычное - <filename>foo.tar.gz</filename>, вы должны написать:</para> - - <programlisting>DISTNAME= foo -EXTRACT_SUFX= .tgz</programlisting> - - <para>Переменные <varname>USE_BZIP2</varname>, - <varname>USE_XZ</varname> и - <varname>USE_ZIP</varname> при необходимости автоматически - устанавливают значение <varname>EXTRACT_SUFX</varname> в - <literal>.tar.bz2</literal>, <literal>.tar.xz</literal> или - <literal>.zip</literal>. Если ни одна из этих - переменных не задана, то значение <varname>EXTRACT_SUFX</varname> - по умолчанию устанавливается в <literal>.tar.gz</literal>.</para> - - <note> - <para>Вам не нужно задавать значения <varname>EXTRACT_SUFX</varname> - и <varname>DISTFILES</varname> одновременно.</para> - </note> - </sect2> - - <sect2> - <title><varname>DISTFILES</varname></title> - - <para>Иногда имена сгружаемых файлов не соответствуют имени порта. К - примеру, файл может называться <filename>source.tar.gz</filename> или - подобным образом. В других случаях исходный код приложения может - располагаться в нескольких отличающихся архивах, и все они должны - быть сгружены.</para> - - <para>Если это ваш случай, то задайте в переменной - <varname>DISTFILES</varname> список разделённых пробелами имён - файлов, которые нужно сгрузить.</para> - - <programlisting>DISTFILES= source1.tar.gz source2.tar.gz</programlisting> - - <para>Если переменная <varname>DISTFILES</varname> не задана явно, то - её значением по умолчанию будет - <literal>${DISTNAME}${EXTRACT_SUFX}</literal>.</para> - </sect2> - - <sect2> - <title><varname>EXTRACT_ONLY</varname></title> - - <para>Если только некоторые из <varname>DISTFILES</varname> должны быть - распакованы—к примеру, часть из них является исходным кодом, а - другие представляют собой неупакованную - документацию—перечислите имена файлов, которые должны быть - распакованы, в <varname>EXTRACT_ONLY</varname>.</para> - - <programlisting>DISTFILES= source.tar.gz manual.html -EXTRACT_ONLY= source.tar.gz</programlisting> - - <para>Если <emphasis>ни один</emphasis> из <varname>DISTFILES</varname> - не должен распаковываться, то установите пустое значение - переменной <varname>EXTRACT_ONLY</varname>.</para> - - <programlisting>EXTRACT_ONLY=</programlisting> - </sect2> - - <sect2 xml:id="porting-patchfiles"> - <title><varname>PATCHFILES</varname></title> - - <para>Если вашему порту требуются некоторых дополнительные патчи, - которые доступны по FTP или HTTP, задайте имена этих файлов в - переменной <varname>PATCHFILES</varname>, а в переменной - <varname>PATCH_SITES</varname> укажите URL того каталога, в котором - они содержатся (формат такой же, как - для <varname>MASTER_SITES</varname>).</para> - - <para>Если патч не относится к самому верху дерева исходных текстов - (то есть <varname>WRKSRC</varname>), потому что он содержит некоторые - дополнительные пути, установите соответственно значение переменной - <varname>PATCH_DIST_STRIP</varname>. В частности, если все имена - путей в патче имеют дополнительный путь - <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>, - вы не можете просто - использовать <varname>PATCHFILES</varname>. Если это ваш случай, - добавьте имя и местоположение архива с патчем к - <varname>DISTFILES</varname> и <varname>MASTER_SITES</varname>. - Затем воспользуйтесь переменной <varname>EXTRA_PATCHES</varname> для - указания этих файлов, и <filename>bsd.port.mk</filename> автоматически - применит эти патчи. В частности, <emphasis>не копируйте</emphasis> - файлы с патчами в каталог <varname>PATCHDIR</varname>—этот - каталог может быть недоступным для записи.</para> - - <note> - <para>Архив будет распакован вне исходного кода, как - обычно, и к тому же его не нужно явно распаковывать, если - это обычный архив <command>gzip</command> или - <command>compress</command>. Если вы сделаете последнее, - приложите дополнительные усилия для того, чтобы не перезаписать - что-либо, уже существующее в этом каталоге. Также не забудьте - добавить команду для удаления скопированного патча в цели - <buildtarget>pre-clean</buildtarget>.</para> - </note> - </sect2> - - <sect2 xml: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 имеется полезная - возможность, используемая в переменных <varname>DISTFILES</varname> и - <varname>PATCHFILES</varname>, которая позволяет закреплять после - имен файлов и патчей идентификаторы типа <literal>:n</literal>. Здесь - <literal>n</literal> может быть из диапазона <literal>[0-9]</literal> - и обозначать закреплённую группу. К примеру:</para> - - <programlisting>DISTFILES= alpha:0 beta:1</programlisting> - - <para>В OpenBSD дистрибутивный файл <filename>alpha</filename> будет - связан с переменной <varname>MASTER_SITES0</varname>, но не с нашей - общей переменной <varname>MASTER_SITES</varname>, а файл - <filename>beta</filename> с переменной - <varname>MASTER_SITES1</varname>.</para> - - <para>Этот очень интересная возможность, которая может уменьшить этот - бесконечный поиск работающего сайта для сгрузки.</para> - - <para>Просто представьте себе 2 файла в <varname>DISTFILES</varname> и - 20 сайтов в <varname>MASTER_SITES</varname>; сайты очень медленные, - причём <filename>beta</filename> находится на всех сайтах из - <varname>MASTER_SITES</varname>, а <filename>alpha</filename> - может быть найден только на 20-м сайте. Будет неправильно проверять - их все, если создатель знает об этом, не правда ли? Неподходящее - начало для таких прекрасных выходных!</para> - - <para>Теперь, когда вы получили общее представление, просто представьте - ещё большее количество <varname>DISTFILES</varname> и - <varname>MASTER_SITES</varname>. Конечно, наш <quote>магистр - доступности дистрибутивов</quote> представляет масштабы нагрузки - на сеть, которую это даёт.</para> - - <para>В последующих разделах информация будет даваться вместе с - реализацией этой идеи во &os;. Мы несколько улучшили концепцию - OpenBSD.</para> - - <sect3> - <title>Упрощённая информация</title> - - <para>В этом разделе рассказывается, как быстро подготовить точную - сгрузку нескольких дистрибутивных файлов и патчей с разных сайтов - и каталогов. Мы описываем здесь случай упрощённого использования - <literal>MASTER_SITES:n</literal>. Для большинства сценариев этого - будет достаточно. Однако, если вам нужна дополнительная - информация, обратитесь к следующему разделу.</para> - - <para>Некоторые приложения состоят из многих дистрибутивных - файлов, которые должны быть сгружены с нескольких различных сайтов. - К примеру, <application>Ghostscript</application> состоит из - основной программы и большого числа файлов драйверов, которые - используются в зависимости от принтера пользователя. Некоторые из - этих файлов драйверов поставляются с основной программой, но при - этом многие другие должны быть сгружены с множества различных - сайтов.</para> - - <para>Чтобы это поддерживать, за каждой записью в - <varname>DISTFILES</varname> может следовать символ двоеточия и - <quote>имя метки</quote>. За каждым сайтом, перечисленным в - <varname>MASTER_SITES</varname>, тоже следует двоеточие и метка, - которая указывает, какие файлы дистрибутива должны быть сгружены - с этого сайта.</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 xml: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>, который - должен быть сгружен с <systemitem>ftp.example2.com</systemitem>. Тогда - файл <filename>Makefile</filename> будет написан как <xref linkend="ports-master-sites-n-example-simple-use-more-than-one-file-per-site"/>.</para> - - <example xml: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>:n</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> + <para><filename>Makefile</filename>'ы для портов, + зависящих от старых портов</para> </listitem> <listitem> - <para>Элементы, за которыми следуют <literal>:n</literal>, - принадлежат группе <literal>n</literal>, - <literal>:m</literal> относится к группе <literal>m</literal> и - так далее.</para> + <para>(в дополнение, вы можете включить другие файлы, + требующие изменений, согласно процедуре из + Руководства Коммиттера.)</para> </listitem> + </itemizedlist> + </step> + + <step> + <para>Поскольку это затрагивает инфраструктуру портов и + охватывает не только выполнение репозиторного + копирования, но также, возможно, и выполнение + регрессивных тестов на кластере построения, то PR должна + назначать себе &a.portmgr;.</para> + </step> + + <step> + <para>Если этот PR одобрен, то коммиттеру нужно продолжить + остальную часть процедуры, которая <link + xlink:href="&url.articles.committers-guide;/article.html#PORTS">изложена + в Руководстве Коммиттера</link>.</para> + </step> + </procedure> + + <para>Предложение новой виртуальной категории должно быть + схожим с вышеизложенным, но при этом затрагивать намного + меньше, поскольку ни один из портов не будет перемещен в + действительности. В этом случае единственными патчами, + включенными в PR, будут те, что добавляют новую категорию в + <varname>CATEGORIES</varname> каждого из затрагиваемых + портов.</para> + </sect2> + + <sect2 xml:id="proposing-reorg"> + <title>Предложение реорганизации всех категорий</title> + + <para>Время от времени кто-нибудь предлагает произвести + реорганизацию категорий либо до двухуровневой, либо другого + типа на основе ключевых слов. На данный момент из этих + предложений ничего не получилось, потому что, хотя они просты + в реализации, но предполагаемая переделка всей коллекции + портов по меньшей мере приводит в уныние. Пожалуйста, + прочтите историю этих предложений в архивах рассылок перед + тем, как присылать свои соображения; более того, вы должны + быть готовы представить работающий прототип.</para> + </sect2> + </sect1> - <listitem xml: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> + <sect1 xml:id="makefile-distfiles"> + <title>Дистрибутивные файлы</title> + + <para>Во второй части <filename>Makefile</filename> задаётся, + какие файлы и откуда должны быть сгружены для того, чтобы + построить порт.</para> + + <sect2> + <title><varname>DISTVERSION/DISTNAME</varname></title> + + <para>В переменной <varname>DISTNAME</varname> указывается имя + порта так, как назвали его создатели программного + обеспечения. Значение <varname>DISTNAME</varname> по + умолчанию совпадает с + <literal>${PORTNAME}-${PORTVERSION}</literal>, так что + переопределяете её значение только в случае необходимости. + <varname>DISTNAME</varname> используется только в двух + местах. Во-первых, список дистрибутивных файлов + (<varname>DISTFILES</varname>) по умолчанию состоит из + <varname>${DISTNAME}</varname><varname>${EXTRACT_SUFX}</varname>. + И во-вторых, предполагается, что дистрибутивный файл будет + распакован в подкаталог с именем <varname>WRKSRC</varname>, + значение которого по умолчанию есть не что иное, как + <filename>work/${DISTNAME}</filename>.</para> + + <para>Названия некоторых дистрибутивов, которые не укладываются + в <literal>${PORTNAME}-${PORTVERSION}</literal>-схему, могут + быть автоматически обработаны посредством установки + переменной <varname>DISTVERSION</varname>. + <varname>PORTVERSION</varname> и <varname>DISTNAME</varname> + будут унаследованы автоматически, но конечно же могут быть + переопределены. Следующая таблица демонстрирует некоторые + примеры:</para> + + <informaltable frame="none" pgwide="0"> + <tgroup cols="2"> + <thead> + <row> + <entry><varname>DISTVERSION</varname></entry> + <entry><varname>PORTVERSION</varname></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> - <para>Следующие примеры равнозначны, но первый более - предпочтителен:</para> + <note> + <para>Значения переменных <varname>PKGNAMEPREFIX</varname> + и <varname>PKGNAMESUFFIX</varname> не влияют на значение + <varname>DISTNAME</varname>. Заметьте также, что если + значение <varname>WRKSRC</varname> равно + <filename>work/${PORTNAME}-${PORTVERSION}</filename>, и в + случае, когда оригинальный архив называется по имени, + отличном от + <varname>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</varname>, + скорее всего, вы должны оставить + <varname>DISTNAME</varname> как есть— лучше + переопределить <varname>DISTFILES</varname>, чем задавать + значения как <varname>DISTNAME</varname>, так и + <varname>WRKSRC</varname> (и, возможно, ещё и + <varname>EXTRACT_SUFX</varname>).</para> + </note> + </sect2> + + <sect2> + <title><varname>MASTER_SITES</varname></title> + + <para>Содержит часть с каталогом FTP/HTTP-URL, которая + указывает на оригинальный архив на сервере + <varname>MASTER_SITES</varname>. Не забудьте лидирующий слэш + (<filename>/</filename>)!</para> + + <para>Макрос команды <command>make</command> будет пытаться + воспользоваться этой переменной для получения + дистрибутивного файла с помощью программы + <varname>FETCH</varname>, если он не будет найден в + системе.</para> + + <para>Рекомендуется помещать в список много сайтов, + предпочтительно с разных континентов. Это поможет при + наличии проблем с мировой сетью. Мы даже планируем добавить + поддержку автоматического определения ближайшего сайта и + сгрузки файлов оттуда; наличие нескольких сайтов будет + способствовать этому начинанию.</para> + + <para>Если оригинальный архив находится на одном из таких + популярных серверов, как SourceForge, GNU или Perl CPAN, то + указывайте эти сайты в простой форме при помощи + <varname>MASTER_SITE_<replaceable>*</replaceable></varname> + (к примеру, <varname>MASTER_SITE_SOURCEFORGE</varname>, + <varname>MASTER_SITE_GNU</varname> или + <varname>MASTER_SITE_PERL_CPAN</varname>. Просто укажите в + переменной <varname>MASTER_SITES</varname> одно из этих + значений, а в переменной + <varname>MASTER_SITE_SUBDIR</varname> задайте путь к архиву. + Вот пример:</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> - <programlisting>MASTER_SITES= alpha</programlisting> + <table frame="none"> + <title>Популярные магические макросы для + <varname>MASTER_SITES</varname></title> + + <tgroup cols="2"> + <thead> + <row> + <entry>Макрос</entry> + <entry>Предполагаемый подкаталог</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>APACHE_JAKARTA</varname></entry> + <entry><varname>/dist/jakarta/${PORTNAME:S,-,,/,}/source</varname></entry> + </row> + + <row> + <entry><varname>BERLIOS</varname></entry> + <entry><varname>/${PORTNAME:L}</varname></entry> + </row> + + <row> + <entry><varname>CHEESESHOP</varname></entry> + <entry><varname>/packages/source/source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}</varname></entry> + </row> + + <row> + <entry><varname>DEBIAN</varname></entry> + <entry><varname>/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}</varname></entry> + </row> + + <row> + <entry><varname>GCC</varname></entry> + <entry><varname>/pub/gcc/releases/${DISTNAME}</varname></entry> + </row> + + <row> + <entry><varname>GNOME</varname></entry> + <entry><varname>/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}</varname></entry> + </row> + + <row> + <entry><varname>GNU</varname></entry> + <entry><varname>/gnu/${PORTNAME}</varname></entry> + </row> + + <row> + <entry><varname>MOZDEV</varname></entry> + <entry><varname>/pub/mozdev/${PORTNAME:L}</varname></entry> + </row> + + <row> + <entry><varname>PERL_CPAN</varname></entry> + <entry><varname>/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}</varname></entry> + </row> + + <row> + <entry><varname>PYTHON</varname></entry> + <entry><varname>/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}</varname></entry> + </row> + + <row> + <entry><varname>RUBYFORGE</varname></entry> + <entry><varname>/${PORTNAME:L}</varname></entry> + </row> + + <row> + <entry><varname>SAVANNAH</varname></entry> + <entry><varname>/${PORTNAME:L}</varname></entry> + </row> + + <row> + <entry><varname>SF</varname></entry> + <entry><varname>/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}</varname></entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> + + <sect2> + <title><varname>EXTRACT_SUFX</varname></title> + + <para>Если у вас имеется один дистрибутивный файл, и в его + имени используется странное окончание для указания типа + сжатия, задайте переменную + <varname>EXTRACT_SUFX</varname>.</para> + + <para>К примеру, если дистрибутивный файл носит имя + <filename>foo.tgz</filename>, а не более привычное + <filename>foo.tar.gz</filename>, вы должны написать:</para> + + <programlisting>DISTNAME= foo +EXTRACT_SUFX= .tgz</programlisting> + + <para>Переменные <varname>USE_BZIP2</varname>, + <varname>USE_XZ</varname> и <varname>USE_ZIP</varname> при + необходимости автоматически устанавливают значение + <varname>EXTRACT_SUFX</varname> в + <literal>.tar.bz2</literal>, <literal>.tar.xz</literal> или + <literal>.zip</literal>. Если ни одна из этих переменных не + задана, то значение <varname>EXTRACT_SUFX</varname> по + умолчанию устанавливается в + <literal>.tar.gz</literal>.</para> - <programlisting>MASTER_SITES= alpha:DEFAULT</programlisting> - </listitem> + <note> + <para>Вам не нужно задавать значения + <varname>EXTRACT_SUFX</varname> и + <varname>DISTFILES</varname> одновременно.</para> + </note> + </sect2> + + <sect2> + <title><varname>DISTFILES</varname></title> + + <para>Иногда имена сгружаемых файлов не соответствуют имени + порта. К примеру, файл может называться + <filename>source.tar.gz</filename> или подобным образом. В + других случаях исходный код приложения может располагаться в + нескольких отличающихся архивах, и все они должны быть + сгружены.</para> + + <para>Если это ваш случай, то задайте в переменной + <varname>DISTFILES</varname> список разделённых пробелами + имён файлов, которые нужно сгрузить.</para> + + <programlisting>DISTFILES= source1.tar.gz source2.tar.gz</programlisting> + + <para>Если переменная <varname>DISTFILES</varname> не задана + явно, то её значением по умолчанию будет + <literal>${DISTNAME}${EXTRACT_SUFX}</literal>.</para> + </sect2> + + <sect2> + <title><varname>EXTRACT_ONLY</varname></title> + + <para>Если только некоторые из <varname>DISTFILES</varname> + должны быть распакованы—к примеру, часть из них + является исходным кодом, а другие представляют собой + неупакованную документацию—перечислите имена файлов, + которые должны быть распакованы, в + <varname>EXTRACT_ONLY</varname>.</para> + + <programlisting>DISTFILES= source.tar.gz manual.html +EXTRACT_ONLY= source.tar.gz</programlisting> + + <para>Если <emphasis>ни один</emphasis> из + <varname>DISTFILES</varname> не должен распаковываться, то + установите пустое значение переменной + <varname>EXTRACT_ONLY</varname>.</para> + + <programlisting>EXTRACT_ONLY=</programlisting> + </sect2> + + <sect2 xml:id="porting-patchfiles"> + <title><varname>PATCHFILES</varname></title> + + <para>Если вашему порту требуются некоторых дополнительные + патчи, которые доступны по FTP или HTTP, задайте имена этих + файлов в переменной <varname>PATCHFILES</varname>, а в + переменной <varname>PATCH_SITES</varname> укажите URL того + каталога, в котором они содержатся (формат такой же, как для + <varname>MASTER_SITES</varname>).</para> + + <para>Если патч не относится к самому верху дерева исходных + текстов (то есть <varname>WRKSRC</varname>), потому что он + содержит некоторые дополнительные пути, установите + соответственно значение переменной + <varname>PATCH_DIST_STRIP</varname>. В частности, если все + имена путей в патче имеют дополнительный путь + <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>, вы не можете просто использовать + <varname>PATCHFILES</varname>. Если это ваш случай, добавьте + имя и местоположение архива с патчем к + <varname>DISTFILES</varname> и + <varname>MASTER_SITES</varname>. Затем воспользуйтесь + переменной <varname>EXTRA_PATCHES</varname> для указания этих + файлов, и <filename>bsd.port.mk</filename> автоматически + применит эти патчи. В частности, + <emphasis>не копируйте</emphasis> файлы с патчами в каталог + <varname>PATCHDIR</varname>—этот каталог может быть + недоступным для записи.</para> - <listitem> - <para>Группы не являются эксклюзивными, элемент может - принадлежать к нескольким отличающимся группам одновременно, а - группа может либо иметь несколько различных элементов, либо не - иметь их вовсе. Повторяющиеся элементы в одной и той же группе - будут являться просто повторяющимися элементами.</para> - </listitem> + <note> + <para>Архив будет распакован вне исходного кода, как обычно, + и к тому же его не нужно явно распаковывать, если это + обычный архив <command>gzip</command> или + <command>compress</command>. Если вы сделаете последнее, + приложите дополнительные усилия для того, чтобы не + перезаписать что-либо, уже существующее в этом каталоге. + Также не забудьте добавить команду для удаления + скопированного патча в цели + <buildtarget>pre-clean</buildtarget>.</para> + </note> + </sect2> + + <sect2 xml: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 имеется + полезная возможность, используемая в переменных + <varname>DISTFILES</varname> и <varname>PATCHFILES</varname>, + которая позволяет закреплять после имен файлов и патчей + идентификаторы типа <literal>:n</literal>. Здесь + <literal>n</literal> может быть из диапазона + <literal>[0-9]</literal> и обозначать закреплённую группу. К + примеру:</para> + + <programlisting>DISTFILES= alpha:0 beta:1</programlisting> + + <para>В OpenBSD дистрибутивный файл <filename>alpha</filename> + будет связан с переменной <varname>MASTER_SITES0</varname>, + но не с нашей общей переменной + <varname>MASTER_SITES</varname>, а файл + <filename>beta</filename> с переменной + <varname>MASTER_SITES1</varname>.</para> + + <para>Этот очень интересная возможность, которая может + уменьшить этот бесконечный поиск работающего сайта для + сгрузки.</para> + + <para>Просто представьте себе 2 файла в + <varname>DISTFILES</varname> и 20 сайтов в + <varname>MASTER_SITES</varname>; сайты очень медленные, + причём <filename>beta</filename> находится на всех сайтах из + <varname>MASTER_SITES</varname>, а <filename>alpha</filename> + может быть найден только на 20-м сайте. Будет неправильно + проверять их все, если создатель знает об этом, не правда ли? + Неподходящее начало для таких прекрасных выходных!</para> + + <para>Теперь, когда вы получили общее представление, просто + представьте ещё большее количество + <varname>DISTFILES</varname> и + <varname>MASTER_SITES</varname>. Конечно, наш <quote>магистр + доступности дистрибутивов</quote> представляет масштабы + нагрузки на сеть, которую это даёт.</para> + + <para>В последующих разделах информация будет даваться вместе с + реализацией этой идеи во &os;. Мы несколько улучшили + концепцию OpenBSD.</para> + + <sect3> + <title>Упрощённая информация</title> + + <para>В этом разделе рассказывается, как быстро подготовить + точную сгрузку нескольких дистрибутивных файлов и патчей с + разных сайтов и каталогов. Мы описываем здесь случай + упрощённого использования + <literal>MASTER_SITES:n</literal>. Для большинства + сценариев этого будет достаточно. Однако, если вам нужна + дополнительная информация, обратитесь к следующему + разделу.</para> + + <para>Некоторые приложения состоят из многих дистрибутивных + файлов, которые должны быть сгружены с нескольких различных + сайтов. К примеру, <application>Ghostscript</application> + состоит из основной программы и большого числа файлов + драйверов, которые используются в зависимости от принтера + пользователя. Некоторые из этих файлов драйверов + поставляются с основной программой, но при этом многие + другие должны быть сгружены с множества различных + сайтов.</para> + + <para>Чтобы это поддерживать, за каждой записью в + <varname>DISTFILES</varname> может следовать символ + двоеточия и <quote>имя метки</quote>. За каждым сайтом, + перечисленным в <varname>MASTER_SITES</varname>, тоже + следует двоеточие и метка, которая указывает, какие файлы + дистрибутива должны быть сгружены с этого сайта.</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 + xml: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> - <listitem xml:id="porting-master-sites-n-comma-operator"> - <para>Если в хотите, чтобы элемент принадлежал к нескольким - группам одновременно, вы можете использовать - запятую (<literal>,</literal>).</para> + <para>Несколько дистрибутивных файлов могут иметь одну и ту + же метку. Продолжая предыдущий пример, положим, что + имеется и третий дистрибутивный файл, + <filename>source3.tar.gz</filename>, который должен быть + сгружен с <systemitem>ftp.example2.com</systemitem>. Тогда + файл <filename>Makefile</filename> будет написан как <xref + linkend="ports-master-sites-n-example-simple-use-more-than-one-file-per-site"/>.</para> + + <example + xml: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> - <para>Вместо того, чтобы повторять их несколько раз, каждый раз с - разным постфиксом, мы можем перечислить несколько групп за раз - в одном постфиксе. Например, <literal>:m,n,o</literal> - определяет элемент, принадлежащий группам <literal>m</literal>, - <literal>n</literal> и <literal>o</literal>.</para> + <sect3> + <title>Подробная информация</title> - <para>Все следующие примеры имеют один смысл, но последний - является предпочтительным:</para> + <para>Прекрасно, но пример из предыдущего раздела не показал + вам всё, что вам нужно? В этом разделе мы подробно опишем, + как работает механизм <literal>MASTER_SITES:n</literal> + точной сгрузки и как вы можете изменить ваши порты, чтобы + это использовать.</para> - <programlisting>MASTER_SITES= alpha alpha:SOME_SITE</programlisting> + <orderedlist> + <listitem> + <para>За элементами могут следовать символы + <literal>:n</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> - <programlisting>MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE</programlisting> + <listitem> + <para>Элементы, за которыми следуют + <literal>:n</literal>, принадлежат группе + <literal>n</literal>, <literal>:m</literal> относится к + группе <literal>m</literal> и так далее.</para> + </listitem> - <programlisting>MASTER_SITES= alpha:SOME_SITE,DEFAULT</programlisting> + <listitem xml: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> - <programlisting>MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting> - </listitem> + <para>Следующие примеры равнозначны, но первый более + предпочтителен:</para> - <listitem> - <para>Все серверы внутри определённой группы сортируются в - соответствии с <varname>MASTER_SORT_AWK</varname>. Все группы - в <varname>MASTER_SITES</varname> и - <varname>PATCH_SITES</varname> тоже сортируются.</para> - </listitem> + <programlisting>MASTER_SITES= alpha</programlisting> - <listitem xml:id="porting-master-sites-n-group-semantics"> - <para>Семантика групп может использоваться в любой из следующих - переменных <varname>MASTER_SITES</varname>, - <varname>PATCH_SITES</varname>, - <varname>MASTER_SITE_SUBDIR</varname>, - <varname>PATCH_SITE_SUBDIR</varname>, - <varname>DISTFILES</varname> и - <varname>PATCHFILES</varname> в соответствии со следующим - синтаксисом:</para> - - <orderedlist> - <listitem> - <para>Все элементы <varname>MASTER_SITES</varname>, - <varname>PATCH_SITES</varname>, - <varname>MASTER_SITE_SUBDIR</varname> и - <varname>PATCH_SITE_SUBDIR</varname> должны заканчиваться - символом прямого слэша <literal>/</literal>. Если какие-то - элементы принадлежат каким-то группам, постфикс группы - <literal>:n</literal> должен - следовать сразу после завершающего символа - <literal>/</literal>. Механизм - <literal>MASTER_SITES:n</literal> опирается на наличие - завершающего символа <literal>/</literal> во избежание - совпадающих элементов, где <literal>:n</literal> является - корректной частью элемента с вхождениями, где - <literal>:n</literal> обозначает группу - <literal>n</literal>. Для целей совместимости, так как - завершающий символ <literal>/</literal> ранее не - требовался в элементах - <varname>MASTER_SITE_SUBDIR</varname> и - <varname>PATCH_SITE_SUBDIR</varname>, если символ, сразу - предшествующий постфиксу, не является символом - <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 xml:id="ports-master-sites-n-example-detailed-use-master-site-subdir"> - <title>Подробное использование - <literal>MASTER_SITES:n</literal> в - <varname>MASTER_SITE_SUBDIR</varname></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 xml: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><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><filename>file2</filename> будет сгружаться точно - также, как <filename>file1</filename>, так как они - оба относятся к одной и той же группе</para> - - <itemizedlist> - <listitem> - <para><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><filename>file3</filename> будет сгружен с</para> - - <itemizedlist> - <listitem> - <para><varname>MASTER_SITE_OVERRIDE</varname></para> - </listitem> - - <listitem> - <para>http://site3/</para> - </listitem> - - <listitem> - <para><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><filename>file4</filename> будет сгружаться - с</para> - - <itemizedlist> - <listitem> - <para><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><filename>file5</filename> будет сгружен с</para> - - <itemizedlist> - <listitem> - <para><varname>MASTER_SITE_OVERRIDE</varname></para> - </listitem> - - <listitem> - <para><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><filename>file6</filename> будет сгружаться - с</para> - - <itemizedlist> - <listitem> - <para><varname>MASTER_SITE_OVERRIDE</varname></para> - </listitem> - - <listitem> - <para>http://site8/</para> - </listitem> - - <listitem> - <para><varname>MASTER_SITE_BACKUP</varname></para> - </listitem> - </itemizedlist> - </listitem> - </itemizedlist> - </example> - </listitem> - </orderedlist> - </listitem> + <programlisting>MASTER_SITES= alpha:DEFAULT</programlisting> + </listitem> - <listitem> - <para>Как мне сгруппировать одну из специальных переменных из - <filename>bsd.sites.mk</filename>, например, - <varname>MASTER_SITE_SOURCEFORGE</varname>?</para> + <listitem> + <para>Группы не являются эксклюзивными, элемент может + принадлежать к нескольким отличающимся группам + одновременно, а группа может либо иметь несколько + различных элементов, либо не иметь их вовсе. + Повторяющиеся элементы в одной и той же группе будут + являться просто повторяющимися элементами.</para> + </listitem> - <para>Посмотрите <xref linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>.</para> + <listitem xml:id="porting-master-sites-n-comma-operator"> + <para>Если в хотите, чтобы элемент принадлежал к + нескольким группам одновременно, вы можете использовать + запятую (<literal>,</literal>).</para> - <example xml:id="ports-master-sites-n-example-detailed-use-master-site-sourceforge"> - <title>Подробное использование - <literal>MASTER_SITES:n</literal> с - <varname>MASTER_SITE_SOURCEFORGE</varname></title> + <para>Вместо того, чтобы повторять их несколько раз, + каждый раз с разным постфиксом, мы можем перечислить + несколько групп за раз в одном постфиксе. Например, + <literal>:m,n,o</literal> определяет элемент, + принадлежащий группам <literal>m</literal>, + <literal>n</literal> и <literal>o</literal>.</para> - <programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/} -DISTFILES= something.tar.gz:sourceforge</programlisting> - </example> + <para>Все следующие примеры имеют один смысл, но + последний является предпочтительным:</para> - <para><filename>something.tar.gz</filename> будет сгружаться со - всех сайтов из - <varname>MASTER_SITE_SOURCEFORGE</varname>.</para> - </listitem> + <programlisting>MASTER_SITES= alpha alpha:SOME_SITE</programlisting> - <listitem> - <para>Как мне использовать это с переменными - <varname>PATCH*</varname>?</para> + <programlisting>MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE</programlisting> - <para>Все примеры выполнялись с переменными - <varname>MASTER*</varname>, и они работают точно также и для - <varname>PATCH*</varname>, как это можно видеть в <xref linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>.</para> + <programlisting>MASTER_SITES= alpha:SOME_SITE,DEFAULT</programlisting> - <example xml:id="ports-master-sites-n-example-detailed-use-patch-sites"> - <title>Упрощённое использование - <literal>MASTER_SITES:n</literal> с - <varname>PATCH_SITES</varname>.</title> + <programlisting>MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting> + </listitem> - <programlisting>PATCH_SITES= http://site1/ http://site2/:test -PATCHFILES= patch1:test</programlisting> - </example> - </listitem> - </orderedlist> - </sect3> + <listitem> + <para>Все серверы внутри определённой группы сортируются + в соответствии с <varname>MASTER_SORT_AWK</varname>. + Все группы в <varname>MASTER_SITES</varname> и + <varname>PATCH_SITES</varname> тоже сортируются.</para> + </listitem> - <sect3> - <title>Что изменится для портов? А что не изменится?</title> + <listitem xml:id="porting-master-sites-n-group-semantics"> + <para>Семантика групп может использоваться в любой из + следующих переменных <varname>MASTER_SITES</varname>, + <varname>PATCH_SITES</varname>, + <varname>MASTER_SITE_SUBDIR</varname>, + <varname>PATCH_SITE_SUBDIR</varname>, + <varname>DISTFILES</varname> и + <varname>PATCHFILES</varname> в соответствии со + следующим синтаксисом:</para> + + <orderedlist> + <listitem> + <para>Все элементы <varname>MASTER_SITES</varname>, + <varname>PATCH_SITES</varname>, + <varname>MASTER_SITE_SUBDIR</varname> и + <varname>PATCH_SITE_SUBDIR</varname> должны + заканчиваться символом прямого слэша + <literal>/</literal>. Если какие-то элементы + принадлежат каким-то группам, постфикс группы + <literal>:n</literal> должен следовать сразу после + завершающего символа <literal>/</literal>. + Механизм <literal>MASTER_SITES:n</literal> + опирается на наличие завершающего символа + <literal>/</literal> во избежание совпадающих + элементов, где <literal>:n</literal> является + корректной частью элемента с вхождениями, где + <literal>:n</literal> обозначает группу + <literal>n</literal>. Для целей совместимости, так + как завершающий символ <literal>/</literal> ранее + не требовался в элементах + <varname>MASTER_SITE_SUBDIR</varname> и + <varname>PATCH_SITE_SUBDIR</varname>, если символ, + сразу предшествующий постфиксу, не является + символом <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 + xml:id="ports-master-sites-n-example-detailed-use-master-site-subdir"> + + <title>Подробное использование + <literal>MASTER_SITES:n</literal> в + <varname>MASTER_SITE_SUBDIR</varname></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 + xml: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><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + + <listitem> + <para><filename>file2</filename> будет + сгружаться точно также, как + <filename>file1</filename>, так как они + оба относятся к одной и той же группе</para> + + <itemizedlist> + <listitem> + <para><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + + <listitem> + <para><filename>file3</filename> будет сгружен + с</para> + + <itemizedlist> + <listitem> + <para><varname>MASTER_SITE_OVERRIDE</varname></para> + </listitem> + + <listitem> + <para>http://site3/</para> + </listitem> + + <listitem> + <para><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + + <listitem> + <para><filename>file4</filename> будет + сгружаться с</para> + + <itemizedlist> + <listitem> + <para><varname>MASTER_SITE_OVERRIDE</varname></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><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + + <listitem> + <para><filename>file5</filename> будет сгружен + с</para> + + <itemizedlist> + <listitem> + <para><varname>MASTER_SITE_OVERRIDE</varname></para> + </listitem> + + <listitem> + <para><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + + <listitem> + <para><filename>file6</filename> будет + сгружаться с</para> + + <itemizedlist> + <listitem> + <para><varname>MASTER_SITE_OVERRIDE</varname></para> + </listitem> + + <listitem> + <para>http://site8/</para> + </listitem> + + <listitem> + <para><varname>MASTER_SITE_BACKUP</varname></para> + </listitem> + </itemizedlist> + </listitem> + </itemizedlist> + </example> + </listitem> + </orderedlist> + </listitem> - <orderedlist numeration="lowerroman"> - <listitem> - <para>Все имеющиеся порты остаются без изменений. Код для - механизма <literal>MASTER_SITES:n</literal> активируется, если - только есть элементы, которые заканчиваются на - <literal>:n</literal>, как и - элементы в соответствии с вышеописанным синтаксисом, особенно - как это показано в пункте <xref linkend="porting-master-sites-n-group-semantics"/>.</para> - </listitem> + <listitem> + <para>Как мне группировать одну из специальных переменных + из <filename>bsd.sites.mk</filename>, например, + <varname>MASTER_SITE_SOURCEFORGE</varname>?</para> - <listitem xml:id="porting-master-sites-n-what-changes-in-port-targets"> - <para>Цели порт остаются теми же самыми: - <buildtarget>checksum</buildtarget>, - <buildtarget>makesum</buildtarget>, - <buildtarget>patch</buildtarget>, - <buildtarget>configure</buildtarget>, - <buildtarget>build</buildtarget> и так далее. С обычными - исключениями для <buildtarget>do-fetch</buildtarget>, - <buildtarget>fetch-list</buildtarget>, - <buildtarget>master-sites</buildtarget> и - <buildtarget>patch-sites</buildtarget>.</para> - - <itemizedlist> - <listitem> - <para><buildtarget>do-fetch</buildtarget>: использует новую - группировку с постфиксами в <varname>DISTFILES</varname> и - <varname>PATCHFILES</varname> с соответствующими элементами - групп в <varname>MASTER_SITES</varname> и - <varname>PATCH_SITES</varname>, которые используют группы - из <varname>MASTER_SITE_SUBDIR</varname> и - <varname>PATCH_SITE_SUBDIR</varname>. Посмотрите <xref linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para> - </listitem> - - <listitem> - <para><buildtarget>fetch-list</buildtarget>: работает также, - как старая цель <buildtarget>fetch-list</buildtarget> с тем - исключением, что она группирует, как и - <buildtarget>do-fetch</buildtarget>.</para> - </listitem> - - <listitem> - <para><buildtarget>master-sites</buildtarget> и - <buildtarget>patch-sites</buildtarget>: - (несовместимы со старыми версиями) только возвращают - элементы группы <literal>DEFAULT</literal>; на самом деле - они выполняют цели - <buildtarget>master-sites-default</buildtarget> и - <buildtarget>patch-sites-default</buildtarget> - соответственно.</para> - - <para>Более того, использование целей - <buildtarget>master-sites-all</buildtarget> или - <buildtarget>patch-sites-all</buildtarget> предпочтительно - для непосредственной проверки - <buildtarget>MASTER_SITES</buildtarget> или - <buildtarget>PATCH_SITES</buildtarget>. Также работа прямой - проверки в последующих версиях не гарантируется. - Посмотрите <xref linkend="porting-master-sites-n-new-port-targets-master-sites-all"/> - для получения более дополнительной информации об этих новых - целях.</para> - </listitem> - </itemizedlist> - </listitem> + <para>Посмотрите <xref + linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>.</para> - <listitem> - <para>Новые цели построения портов</para> - - <orderedlist> - <listitem> - <para>Имеются цели - <buildtarget>master-sites-<replaceable>n</replaceable></buildtarget> - и - <buildtarget>patch-sites-<replaceable>n</replaceable></buildtarget>, - которые будут перечислять элементы соответствующей группы - <replaceable>n</replaceable> из - <varname>MASTER_SITES</varname> и - <varname>PATCH_SITES</varname> соответственно. К примеру, - <buildtarget>master-sites-DEFAULT</buildtarget> и - <buildtarget>patch-sites-DEFAULT</buildtarget> обе будут - возвращать элементы группы <literal>DEFAULT</literal>, - <buildtarget>master-sites-test</buildtarget> и - <buildtarget>patch-sites-test</buildtarget> группы - <literal>test</literal> и так далее.</para> - </listitem> - - <listitem xml:id="porting-master-sites-n-new-port-targets-master-sites-all"> - <para>Имеются новые цели - <buildtarget>master-sites-all</buildtarget> и - <buildtarget>patch-sites-all</buildtarget>, которые выполняют - работу старых <buildtarget>master-sites</buildtarget> и - <buildtarget>patch-sites</buildtarget>. Они возвращают - элементы всех групп, как если бы они все принадлежали одной - и той же группе с тем, что она перечисляет ровно столько - <varname>MASTER_SITE_BACKUP</varname> и - <varname>MASTER_SITE_OVERRIDE</varname>, как и группы, - определённые в <varname>DISTFILES</varname> или - <varname>PATCHFILES</varname>; соответственно для - <buildtarget>master-sites-all</buildtarget> и - <buildtarget>patch-sites-all</buildtarget>.</para> - </listitem> - </orderedlist> - </listitem> - </orderedlist> - </sect3> - </sect2> - - <sect2> - <title><varname>DIST_SUBDIR</varname></title> - - <para>Не позволяйте вашему порту засорять - <filename>/usr/ports/distfiles</filename>. Если вашему порту - требуется сгрузить много файлов, или он содержит имя файла, - могущее вызвать конфликты с другими портами (например, - <filename>Makefile</filename>), то укажите в переменной - <varname>DIST_SUBDIR</varname> имя порта (должны подойти - <literal>${PORTNAME}</literal> или - <literal>${PKGNAMEPREFIX}${PORTNAME}</literal>). Это изменит - значение переменной <varname>DISTDIR</varname> со значения по - умолчанию <filename>/usr/ports/distfiles</filename> к значению - <filename>/usr/ports/distfiles/DIST_SUBDIR</filename>, - и в результате всё, что требуется для порта, будет помещено в этот - подкаталог.</para> - - <para>Он заглянет также в подкаталог с тем же именем на - основном резервном сервере <filename>ftp.FreeBSD.org</filename>. - (Явное задание переменной <varname>DISTDIR</varname> в вашем файле - <varname>Makefile</varname> этого не сделает, так что, пожалуйста, - воспользуйтесь <varname>DIST_SUBDIR</varname>.)</para> - - <note> - <para>Это не коснётся тех сайтов <varname>MASTER_SITES</varname>, - которые вы указали в вашем файле - <filename>Makefile</filename>.</para> - </note> - </sect2> - - <sect2> - <title><varname>ALWAYS_KEEP_DISTFILES</varname></title> - - <para>Если ваш порт использует двоичные дистрибутивные файлы и - обладает лицензией, требующей, чтобы исходный код предоставлялся - вместе с пакетами, распространяемыми в двоичной форме, например - GPL, то <varname>ALWAYS_KEEP_DISTFILES</varname> даст кластеру - построения &os; указание сохранять копию файлов, указанных в - <varname>DISTFILES</varname>. Пользователям таких портов эти - файлы в основном не нужны, поэтому хорошей идеей является - добавление в <varname>DISTFILES</varname> исходных - дистрибутивных файлов, только когда определена переменная - <varname>PACKAGE_BUILDING</varname>.</para> - - <example xml:id="ports-master-sites-n-example-always-keep-distfiles"> - <title>Использование <varname>ALWAYS_KEEP_DISTFILES</varname>.</title> - <programlisting>.if defined(PACKAGE_BUILDING) -DISTFILES+= <replaceable>foo.tar.gz</replaceable> -ALWAYS_KEEP_DISTFILES= yes -.endif</programlisting> - </example> + <example + xml:id="ports-master-sites-n-example-detailed-use-master-site-sourceforge"> - <para>При добавлении дополнительных файлов в <varname>DISTFILES</varname> - убедитесь, что вы их также добавляете в <filename>distinfo</filename>. - Кроме того, дополнительные файлы обычно распаковываются также в - <varname>WRKDIR</varname>, что для некоторых портов может вызывать - нежелательные подобные эффекты и требовать особую обработку.</para> - </sect2> - </sect1> - - <sect1 xml:id="makefile-maintainer"> - <title><varname>MAINTAINER</varname></title> - - <para>Укажите здесь ваш адрес электронной почты. Пожалуйста. - <!-- smiley --><emphasis>:-)</emphasis></para> - - <para>Заметьте, что в качестве значения для - <varname>MAINTAINER</varname> допустимо использование только одного - адреса без поля комментария. Должен использоваться формат - <literal>user@hostname.domain</literal>. Пожалуйста, не включайте - никакого описательного текста, например, вашего настоящего имени в - эту строку—это несколько сбивает с толку - <filename>bsd.port.mk</filename>.</para> - - <para>Сопровождающий ответственен за поддержание порта в актуальном - состоянии и обеспечение правильной работы порта. За подробным - описанием обязанностей сопровождающего порт обращайтесь к главе - <link xlink:href="&url.articles.contributing-ports.en;/maintain-port.html">The - challenge for port maintainers</link>.</para> + <title>Подробное использование + <literal>MASTER_SITES:n</literal> с + <varname>MASTER_SITE_SOURCEFORGE</varname></title> - <para>Перед фиксацией в репозитории изменения в порте будут отправлены - сопровождающему для просмотра и одобрения. - Если сопровождающий порта не ответил на запрос пользователя об - обновлении в течение двух недель (исключая большие праздники), - то это можно считать тайм-аутом сопровождающего, и обновление может - быть выполнено без явного подтверждения от сопровождающего. Если - сопровождающий не отвечает в течение трёх месяцев, то считается, что - он отсутствует, и как сопровождающий порта, о котором идёт речь, может - быть заменён. Исключениями из этого правила является всё, что - сопровождает &a.portmgr; или &a.security-officer;. Запрещено делать - любые несанкционированные изменения в портах, которые ведут эти - группы.</para> - - <para>Мы оставляем за собой право изменять сообщение сопровождающего - для лучшего соответствия существующим политикам и стилю Коллекции - Портов без явного одобрения со стороны отправителя. Также, - крупные изменения в инфраструктуре могут повлечь изменения в порте - без согласия сопровождающего. Такой вид изменений никогда не будет - затрагивать функциональность порта.</para> - - <para>За &a.portmgr; оставляется право снять или назначить кого-либо - сопровождающим по любой причине, а за the &a.security-officer; - оставляется право лишать или назначать права на сопровождение порта - по соображениям информационной безопасности.</para> - </sect1> - - <sect1 xml:id="makefile-comment"> - <title><varname>COMMENT</varname></title> - - <para>Содержит однострочное описание порта. Пожалуйста, соблюдайте - следующие правила:</para> + <programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/} +DISTFILES= something.tar.gz:sourceforge</programlisting> + </example> - <orderedlist> - <listitem> - <para>Старайтесь делать строку COMMENT длиной не больше, чем 70 - символов, так как эта строка будет использована командой - <command>pkg info</command> (см. &man.pkg-info.8;) для - отображения однострочного описания порта;</para> - </listitem> + <para><filename>something.tar.gz</filename> будет + сгружаться со всех сайтов из + <varname>MASTER_SITE_SOURCEFORGE</varname>.</para> + </listitem> - <listitem> - <para><emphasis>Не</emphasis> включайте сюда название пакета - (или номер версии программного обеспечения);</para> - </listitem> + <listitem> + <para>Как мне использовать это с переменными + <varname>PATCH*</varname>?</para> - <listitem> - <para>Комментарий должен начинаться с заглавной буквы и не - заканчиваться точкой;</para> - </listitem> + <para>Все примеры выполнялись с переменными + <varname>MASTER*</varname>, и они работают точно так же + и для <varname>PATCH*</varname>, как это можно видеть в + <xref + linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>.</para> - <listitem> - <para>Не начинайте комментарий с неопределённого артикля (A - или An);</para> - </listitem> + <example + xml:id="ports-master-sites-n-example-detailed-use-patch-sites"> - <listitem> - <para>Имена пишутся с заглавной буквы (например, Apache, - JavaScript. Perl);</para> - </listitem> + <title>Упрощённое использование + <literal>MASTER_SITES:n</literal> с + <varname>PATCH_SITES</varname>.</title> - <listitem> - <para>Для перечислений используйте английскую Оксфордскую - запятую (англ. Oxford comma) (например, green, - red<emphasis>,</emphasis> and blue);</para> - </listitem> + <programlisting>PATCH_SITES= http://site1/ http://site2/:test +PATCHFILES= patch1:test</programlisting> + </example> + </listitem> + </orderedlist> + </sect3> - <listitem> - <para>Используйте программу проверки орфографии.</para> - </listitem> - </orderedlist> + <sect3> + <title>Что изменится для портов? А что не изменится?</title> - <para>Вот пример:</para> + <orderedlist numeration="lowerroman"> + <listitem> + <para>Все имеющиеся порты остаются без изменений. Код + для механизма <literal>MASTER_SITES:n</literal> + активируется, если только есть элементы, которые + заканчиваются на <literal>:n</literal>, как и элементы + в соответствии с вышеописанным синтаксисом, особенно + как это показано в пункте <xref + linkend="porting-master-sites-n-group-semantics"/>.</para> + </listitem> - <programlisting>Cat chasing a mouse all over the screen</programlisting> + <listitem + xml:id="porting-master-sites-n-what-changes-in-port-targets"> + <para>Цели порт остаются теми же самыми: + <buildtarget>checksum</buildtarget>, + <buildtarget>makesum</buildtarget>, + <buildtarget>patch</buildtarget>, + <buildtarget>configure</buildtarget>, + <buildtarget>build</buildtarget> и так далее. С + обычными исключениями для + <buildtarget>do-fetch</buildtarget>, + <buildtarget>fetch-list</buildtarget>, + <buildtarget>master-sites</buildtarget> и + <buildtarget>patch-sites</buildtarget>.</para> - <para>В файле <filename>Makefile</filename> переменная COMMENT должна - следовать сразу за переменной MAINTAINER.</para> - </sect1> + <itemizedlist> + <listitem> + <para><buildtarget>do-fetch</buildtarget>: использует + новую группировку с постфиксами в + <varname>DISTFILES</varname> и + <varname>PATCHFILES</varname> с соответствующими + элементами групп в <varname>MASTER_SITES</varname> + и <varname>PATCH_SITES</varname>, которые + используют группы из + <varname>MASTER_SITE_SUBDIR</varname> и + <varname>PATCH_SITE_SUBDIR</varname>. Посмотрите + <xref + linkend="ports-master-sites-n-example-detailed-use-complete-example-master-sites"/>.</para> + </listitem> - <sect1 xml:id="makefile-portscout"> - <title><varname>PORTSCOUT</varname></title> + <listitem> + <para><buildtarget>fetch-list</buildtarget>: работает + так же, как старая цель + <buildtarget>fetch-list</buildtarget> с тем + исключением, что она группирует, как и + <buildtarget>do-fetch</buildtarget>.</para> + </listitem> - <para><application>Portscout</application> являет собой - автоматизированное средство проверки доступности дистрибутивных - файлов для Коллекции Портов &os;, подробное описание которого - предоставляет <xref linkend="distfile-survey"/>.</para> + <listitem> + <para><buildtarget>master-sites</buildtarget> и + <buildtarget>patch-sites</buildtarget>: + (несовместимы со старыми версиями) только + возвращают элементы группы + <literal>DEFAULT</literal>; на самом деле они + выполняют цели + <buildtarget>master-sites-default</buildtarget> и + <buildtarget>patch-sites-default</buildtarget> + соответственно.</para> + + <para>Более того, использование целей + <buildtarget>master-sites-all</buildtarget> или + <buildtarget>patch-sites-all</buildtarget> + предпочтительно для непосредственной проверки + <buildtarget>MASTER_SITES</buildtarget> или + <buildtarget>PATCH_SITES</buildtarget>. Также + работа прямой проверки в последующих версиях не + гарантируется. Посмотрите <xref + linkend="porting-master-sites-n-new-port-targets-master-sites-all"/> + для получения более дополнительной информации об + этих новых целях.</para> + </listitem> + </itemizedlist> + </listitem> - <para>Переменная <varname>PORTSCOUT</varname> задаёт специальные - условия, ограничивающие работу <application>Portscout</application> - - сканера дистрибутивных файлов.</para> + <listitem> + <para>Новые цели построения портов</para> - <para>Ситуации, при которых следует указывать переменную - <varname>PORTSCOUT</varname>:</para> + <orderedlist> + <listitem> + <para>Имеются цели + <buildtarget>master-sites-<replaceable>n</replaceable></buildtarget> + и + <buildtarget>patch-sites-<replaceable>n</replaceable></buildtarget>, + которые будут перечислять элементы соответствующей + группы <replaceable>n</replaceable> из + <varname>MASTER_SITES</varname> и + <varname>PATCH_SITES</varname> соответственно. К + примеру, + <buildtarget>master-sites-DEFAULT</buildtarget> и + <buildtarget>patch-sites-DEFAULT</buildtarget> обе + будут возвращать элементы группы + <literal>DEFAULT</literal>, + <buildtarget>master-sites-test</buildtarget> и + <buildtarget>patch-sites-test</buildtarget> группы + <literal>test</literal> и так далее.</para> + </listitem> - <itemizedlist> - <listitem> - <para>Когда должны игнорироваться дистрибутивные файлы для - конкретных версий или младших ревизий. Например, чтобы - исключить из проверок новых версий дистрибутивных файлов - версию <replaceable>8.2</replaceable> по причине того, что - она является поломанной, добавьте следующее:</para> + <listitem + xml:id="porting-master-sites-n-new-port-targets-master-sites-all"> + <para>Имеются новые цели + <buildtarget>master-sites-all</buildtarget> и + <buildtarget>patch-sites-all</buildtarget>, которые + выполняют работу старых + <buildtarget>master-sites</buildtarget> и + <buildtarget>patch-sites</buildtarget>. Они + возвращают элементы всех групп, как если бы они все + принадлежали одной и той же группе с тем, что она + перечисляет ровно столько + <varname>MASTER_SITE_BACKUP</varname> и + <varname>MASTER_SITE_OVERRIDE</varname>, как и + группы, определённые в <varname>DISTFILES</varname> + или <varname>PATCHFILES</varname>; соответственно + для <buildtarget>master-sites-all</buildtarget> и + <buildtarget>patch-sites-all</buildtarget>.</para> + </listitem> + </orderedlist> + </listitem> + </orderedlist> + </sect3> + </sect2> + + <sect2> + <title><varname>DIST_SUBDIR</varname></title> + + <para>Не позволяйте вашему порту засорять + <filename>/usr/ports/distfiles</filename>. Если вашему порту + требуется сгрузить много файлов, или он содержит имя файла, + могущее вызвать конфликты с другими портами (например, + <filename>Makefile</filename>), то укажите в переменной + <varname>DIST_SUBDIR</varname> имя порта (должны подойти + <literal>${PORTNAME}</literal> или + <literal>${PKGNAMEPREFIX}${PORTNAME}</literal>). Это изменит + значение переменной <varname>DISTDIR</varname> со значения по + умолчанию <filename>/usr/ports/distfiles</filename> к + значению + <filename>/usr/ports/distfiles/DIST_SUBDIR</filename>, и в + результате всё, что требуется для порта, будет помещено в + этот подкаталог.</para> + + <para>Он заглянет также в подкаталог с тем же именем на + основном резервном сервере + <filename>ftp.FreeBSD.org</filename>. (Явное задание + переменной <varname>DISTDIR</varname> в вашем файле + <varname>Makefile</varname> этого не сделает, так что, + пожалуйста, воспользуйтесь + <varname>DIST_SUBDIR</varname>.)</para> - <programlisting>PORTSCOUT= ignore:8.2</programlisting> + <note> + <para>Это не коснётся тех сайтов + <varname>MASTER_SITES</varname>, которые вы указали в вашем + файле <filename>Makefile</filename>.</para> + </note> + </sect2> + + <sect2> + <title><varname>ALWAYS_KEEP_DISTFILES</varname></title> + + <para>Если ваш порт использует двоичные дистрибутивные файлы и + обладает лицензией, требующей, чтобы исходный код + предоставлялся вместе с пакетами, распространяемыми в + двоичной форме, например GPL, то + <varname>ALWAYS_KEEP_DISTFILES</varname> даст кластеру + построения &os; указание сохранять копию файлов, указанных в + <varname>DISTFILES</varname>. Пользователям таких портов эти + файлы в основном не нужны, поэтому хорошей идеей является + добавление в <varname>DISTFILES</varname> исходных + дистрибутивных файлов, только когда определена переменная + <varname>PACKAGE_BUILDING</varname>.</para> + + <example + xml:id="ports-master-sites-n-example-always-keep-distfiles"> + + <title>Использование + <varname>ALWAYS_KEEP_DISTFILES</varname>.</title> + + <programlisting>.if defined(PACKAGE_BUILDING) +DISTFILES+= <replaceable>foo.tar.gz</replaceable> +ALWAYS_KEEP_DISTFILES= yes +.endif</programlisting> + </example> + + <para>При добавлении дополнительных файлов в + <varname>DISTFILES</varname> убедитесь, что вы их также + добавляете в <filename>distinfo</filename>. Кроме того, + дополнительные файлы обычно распаковываются также в + <varname>WRKDIR</varname>, что для некоторых портов может + вызывать нежелательные подобные эффекты и требовать особую + обработку.</para> + </sect2> + </sect1> - </listitem> - <listitem> - <para>Когда должны проверяться конкретные версии или старшие - и младшие ревизии дистрибутивных файлов. Например, если - следует ограничиться проверкой версии - <replaceable>0.6.4</replaceable>, потому что более новые - версии имеют проблемы совместимости с &os;, добавьте:</para> + <sect1 xml:id="makefile-maintainer"> + <title><varname>MAINTAINER</varname></title> + + <para>Укажите здесь ваш адрес электронной почты. Пожалуйста. + <!-- smiley --><emphasis>:-)</emphasis></para> + + <para>Заметьте, что в качестве значения для + <varname>MAINTAINER</varname> допустимо использование только + одного адреса без поля комментария. Должен использоваться + формат <literal>user@hostname.domain</literal>. Пожалуйста, не + включайте никакого описательного текста, например, вашего + настоящего имени в эту строку—это несколько сбивает с + толку <filename>bsd.port.mk</filename>.</para> + + <para>Сопровождающий ответственен за поддержание порта в + актуальном состоянии и обеспечение правильной работы порта. За + подробным описанием обязанностей сопровождающего порт + обращайтесь к главе <link + xlink:href="&url.articles.contributing-ports.en;/maintain-port.html">The + challenge for port maintainers</link>.</para> - <programlisting>PORTSCOUT= limit:^0\.6\.4</programlisting> + <para>Перед фиксацией в репозитории изменения в порте будут + отправлены сопровождающему для просмотра и одобрения. Если + сопровождающий порта не ответил на запрос пользователя об + обновлении в течение двух недель (исключая большие праздники), + то это можно считать тайм-аутом сопровождающего, и обновление + может быть выполнено без явного подтверждения от + сопровождающего. Если сопровождающий не отвечает в течение + трёх месяцев, то считается, что он отсутствует, и как + сопровождающий порта, о котором идёт речь, может быть заменён. + Исключениями из этого правила является всё, что сопровождает + &a.portmgr; или &a.security-officer;. Запрещено делать любые + несанкционированные изменения в портах, которые ведут эти + группы.</para> + + <para>Мы оставляем за собой право изменять сообщение + сопровождающего для лучшего соответствия существующим политикам + и стилю Коллекции Портов без явного одобрения со стороны + отправителя. Также, крупные изменения в инфраструктуре могут + повлечь изменения в порте без согласия сопровождающего. Такой + вид изменений никогда не будет затрагивать функциональность + порта.</para> + + <para>За &a.portmgr; оставляется право снять или назначить + кого-либо сопровождающим по любой причине, а за + &a.security-officer; оставляется право лишать или назначать + права на сопровождение порта по соображениям информационной + безопасности.</para> + </sect1> - </listitem> - <listitem> - <para>Когда URL, в которых указаны доступные версии, отличаются - от URL их загрузки. Например, чтобы привязать проверку новых - версий дистрибутивных файлов к странице загрузки для порта - <package role="port">databases/pgtune</package>, - добавьте:</para> + <sect1 xml:id="makefile-comment"> + <title><varname>COMMENT</varname></title> + + <para>Содержит однострочное описание порта. Пожалуйста, + соблюдайте следующие правила:</para> + + <orderedlist> + <listitem> + <para>Старайтесь делать строку COMMENT длиной не больше, чем + 70 символов, так как эта строка будет использована командой + <command>pkg info</command> (см. &man.pkg-info.8;) для + отображения однострочного описания порта;</para> + </listitem> + + <listitem> + <para><emphasis>Не</emphasis> включайте сюда название пакета + (или номер версии программного обеспечения);</para> + </listitem> + + <listitem> + <para>Комментарий должен начинаться с заглавной буквы и не + заканчиваться точкой;</para> + </listitem> + + <listitem> + <para>Не начинайте комментарий с неопределённого артикля (A + или An);</para> + </listitem> + + <listitem> + <para>Имена пишутся с заглавной буквы (например, Apache, + JavaScript, Perl);</para> + </listitem> + + <listitem> + <para>Для перечислений используйте английскую Оксфордскую + запятую (англ. Oxford comma) (например, green, + red<emphasis>,</emphasis> and blue);</para> + </listitem> + + <listitem> + <para>Используйте программу проверки орфографии.</para> + </listitem> + </orderedlist> + + <para>Вот пример:</para> + + <programlisting>COMMENT= Cat chasing a mouse all over the screen</programlisting> + + <para>В файле <filename>Makefile</filename> переменная COMMENT + должна следовать сразу за переменной MAINTAINER.</para> + </sect1> - <programlisting>PORTSCOUT= site:http://pgfoundry.org/frs/?group_id=1000416</programlisting> - </listitem> - </itemizedlist> - </sect1> - - <sect1 xml:id="makefile-depend"> - <title>Зависимости</title> - - <para>Многие порты зависят от других портов. Это очень удобная - замечательная особенность большинства Unix-подобных операционных - систем, включая &os;. Множество портов могут использовать общую - зависимость совместно, а не включать её в состав каждого порта или - пакета, который в ней нуждается. Имеется семь переменных, - которые вы можете использовать для обеспечения того, что всё - требуемое находится на машине пользователя. Имеется также несколько - предопределённых переменных, отражающих зависимости для общих - случаев, плюс ещё несколько для управления поведением - зависимостей.</para> - - <sect2> - <title><varname>LIB_DEPENDS</varname></title> - - <para>Эта переменная указывает, от каких совместно используемых - библиотек зависит порт. Это список пар - <replaceable>lib</replaceable>:<replaceable>dir</replaceable> - где <replaceable>lib</replaceable> - это имя библиотеки, - <replaceable>dir</replaceable> - это каталог, в котором можно ее - найти в случае, если ее нет на машине. Например,</para> - - <programlisting>LIB_DEPENDS= libjpeg.so:${PORTSDIR}/graphics/jpeg</programlisting> - - <para>проверит наличие библиотеки jpeg с любым номером версии и - перейдет в подкаталог <filename>graphics/jpeg</filename> вашего - дерева портов для ее построения и установки, если библиотека - отсутствует.</para> - - <para>Зависимость проверяется дважды, один раз внутри цели - <buildtarget>build</buildtarget>, а затем из цели - <buildtarget>install</buildtarget>. Кроме того, имя зависимости - помещается в пакет, так что <command>pkg install</command> - (см. &man.pkg-install.8;) будет - автоматически её устанавливать, если её нет на пользовательской - системе.</para> - </sect2> - - <sect2> - <title><varname>RUN_DEPENDS</varname></title> - - <para>В этой переменной перечисляются выполнимые файлы или файлы, от - которых зависит работа порта. Это список пар вида - <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</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> + <sect1 xml:id="makefile-portscout"> + <title><varname>PORTSCOUT</varname></title> + + <para><application>Portscout</application> являет собой + автоматизированное средство проверки доступности дистрибутивных + файлов для Коллекции Портов &os;, подробное описание которого + предоставляет <xref linkend="distfile-survey"/>.</para> + + <para>Переменная <varname>PORTSCOUT</varname> задаёт специальные + условия, ограничивающие работу + <application>Portscout</application> - сканера дистрибутивных + файлов.</para> + + <para>Ситуации, при которых следует указывать переменную + <varname>PORTSCOUT</varname>:</para> + + <itemizedlist> + <listitem> + <para>Когда должны игнорироваться дистрибутивные файлы для + конкретных версий или младших ревизий. Например, чтобы + исключить из проверок новых версий дистрибутивных файлов + версию <replaceable>8.2</replaceable> по причине того, что + она является поломанной, добавьте следующее:</para> + + <programlisting>PORTSCOUT= ignore:8.2</programlisting> + </listitem> + + <listitem> + <para>Когда должны проверяться конкретные версии или старшие + и младшие ревизии дистрибутивных файлов. Например, если + следует ограничиться проверкой версии + <replaceable>0.6.4</replaceable>, потому что более новые + версии имеют проблемы совместимости с &os;, + добавьте:</para> + + <programlisting>PORTSCOUT= limit:^0\.6\.4</programlisting> + </listitem> + + <listitem> + <para>Когда URL, в которых указаны доступные версии, + отличаются от URL их загрузки. Например, чтобы привязать + проверку новых версий дистрибутивных файлов к странице + загрузки для порта <package + role="port">databases/pgtune</package>, добавьте:</para> + + <programlisting>PORTSCOUT= site:http://pgfoundry.org/frs/?group_id=1000416</programlisting> + </listitem> + </itemizedlist> + </sect1> - <note> - <para>В приведенном примере <command>innd</command> является - выполнимым файлом; если выполнимый файл находится в месте, - которое отсутствует в списке путей файлов, то вы должны указать - полный путь к файлу.</para> - </note> + <sect1 xml:id="makefile-depend"> + <title>Зависимости</title> + + <para>Многие порты зависят от других портов. Это очень удобная + замечательная особенность большинства Unix-подобных + операционных систем, включая &os;. Множество портов могут + использовать общую зависимость совместно, а не включать её в + состав каждого порта или пакета, который в ней нуждается. + Имеется семь переменных, которые вы можете использовать для + обеспечения того, что всё требуемое находится на машине + пользователя. Имеется также несколько предопределённых + переменных, отражающих зависимости для общих случаев, плюс ещё + несколько для управления поведением зависимостей.</para> + + <sect2> + <title><varname>LIB_DEPENDS</varname></title> + + <para>Эта переменная указывает, от каких совместно используемых + библиотек зависит порт. Это список пар + <replaceable>lib</replaceable>:<replaceable>dir</replaceable>, + где <replaceable>lib</replaceable> - это имя библиотеки, + <replaceable>dir</replaceable> - это каталог, в котором можно + ее найти в случае, если ее нет на машине. Например,</para> + + <programlisting>LIB_DEPENDS= libjpeg.so:${PORTSDIR}/graphics/jpeg</programlisting> + + <para>проверит наличие библиотеки jpeg с любым номером версии и + перейдет в подкаталог <filename>graphics/jpeg</filename> + вашего дерева портов для ее построения и установки, если + библиотека отсутствует.</para> + + <para>Зависимость проверяется дважды, один раз внутри цели + <buildtarget>build</buildtarget>, а затем из цели + <buildtarget>install</buildtarget>. Кроме того, имя + зависимости помещается в пакет, так что + <command>pkg install</command> (см. &man.pkg-install.8;) + будет автоматически её устанавливать, если её нет на + пользовательской системе.</para> + </sect2> + + <sect2> + <title><varname>RUN_DEPENDS</varname></title> + + <para>В этой переменной перечисляются выполнимые файлы или + файлы, от которых зависит работа порта. Это список пар вида + <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</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>Официальным значением переменной поиска <envar>PATH</envar>, - используемым в кластере построения портов является</para> + <note> + <para>В приведенном примере <command>innd</command> является + выполнимым файлом; если выполнимый файл находится в месте, + которое отсутствует в списке путей файлов, то вы должны + указать полный путь к файлу.</para> + </note> - <programlisting>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</programlisting> - </note> + <note> + <para>Официальным значением переменной поиска + <envar>PATH</envar>, используемым в кластере построения + портов является</para> - <para>Зависимость проверяется внутри цели - <buildtarget>install</buildtarget>. Кроме того, имя зависимости - помещается в пакет, так что <command>pkg install</command> - (см. &man.pkg-install.8;) - будет автоматически его устанавливать, если он не будет найден - в пользовательской системе. Часть - <replaceable>target</replaceable> может быть опущена, если она - совпадает с <varname>DEPENDS_TARGET</varname>.</para> - - <para>Довольно распространенной является ситуация, когда - <varname>RUN_DEPENDS</varname> буквально такая же как - <varname>BUILD_DEPENDS</varname>, особенно если переносимое - программное обеспечение написано на языке сценариев, или если - оно требует такое же окружение для исполнения, как и используемое - во время построения. В этом случае, очень заманчивым или довольно - естественным является присвоение одного другому:</para> - - <programlisting>RUN_DEPENDS= ${BUILD_DEPENDS}</programlisting> - - <para>Тем не менее, подобные присвоения могут загрязнять зависимости - времени исполнения содержимым, не заданным в - <varname>BUILD_DEPENDS</varname> исходного порта. - Такое случается из-за ленивого вычисления в &man.make.1; - присваиваемых переменных. Представьте <filename>Makefile</filename> - с переменными <varname>USE_<replaceable>*</replaceable></varname>, - которые обрабатываются в <filename>ports/Mk/bsd.*.mk</filename> - для пополнения первоначальных зависимостей построения. Например, - <literal>USES= gmake</literal> добавляет - <package role="port">devel/gmake</package> в - <varname>BUILD_DEPENDS</varname>. Для предотвращения загрязнения - <varname>RUN_DEPENDS</varname> подобными дополнительными - зависимостями проявляйте осторожность с присвоением с раскрытием, - т.е. с раскрытием значения перед его присвоением переменной:</para> - - <programlisting>RUN_DEPENDS:= ${BUILD_DEPENDS}</programlisting> - </sect2> - - <sect2> - <title><varname>BUILD_DEPENDS</varname></title> - - <para>В этой переменной перечисляются выполнимые или обычные файлы, - которые требуются порту для его построения. Как и - <varname>RUN_DEPENDS</varname>, это список пар - <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional> - Например,</para> - - <programlisting>BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting> - - <para>будет проверять - наличие выполнимого фала с именем <command>unzip</command> и - перейдет в подкаталог <filename>archivers/unzip</filename> вашего - дерева портов для его построения и установки, если последний не - будет найден.</para> + <programlisting>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</programlisting> + </note> - <note> - <para>Под <quote>построением</quote> здесь понимается всё, от - распаковки до компиляции. Зависимость проверяется из цели - <buildtarget>extract</buildtarget>. Часть - <replaceable>target</replaceable> может быть опущена, если она - совпадает с <varname>DEPENDS_TARGET</varname>.</para> - </note> - </sect2> - - <sect2> - <title><varname>FETCH_DEPENDS</varname></title> - - <para>В этой переменной перечисляются выполняемые файлы или просто - файлы, которые требуются порту для сгрузки. Как и предыдущие две - переменные, это список пар - <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional> - Например,</para> - - <programlisting>FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2</programlisting> - - <para>будет проверять - наличие выполняемого файла с именем <command>ncftp2</command> и - перейдет в каталог <filename>net/ncftp2</filename> вашего дерева - портов для его построения и установки, если тот не будет - найден.</para> - - <para>Зависимость проверяется при выполнении цели - <buildtarget>fetch</buildtarget>. Часть - <replaceable>target</replaceable> может быть опущена, если она - совпадает с <varname>DEPENDS_TARGET</varname>.</para> - </sect2> - - <sect2> - <title><varname>EXTRACT_DEPENDS</varname></title> - - <para>В этой переменной указываются программы или файлы, которые - требуются для распаковки порта. Как и в предыдущих случаях, это - список пар вида - <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. - Например,</para> - - <programlisting>EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting> - - <para>будет проверять - наличие программы с именем <command>unzip</command>, и перейдёт в - подкаталог <filename>archivers/unzip</filename> вашего дерева - портов для её построения и установки, если такой программы не будет - найдено.</para> - - <para>Зависимость проверяется внутри цели - <buildtarget>extract</buildtarget>. Часть - <replaceable>target</replaceable> может быть опущена, если она - совпадает с <varname>DEPENDS_TARGET</varname>.</para> - - <note> - <para>Используйте эту переменную, только если распаковка не - работает (по умолчанию предполагается использование - <command>gzip</command>) и это не исправляется при помощи - <varname>USE_ZIP</varname> или <varname>USE_BZIP2</varname>, - которые описаны в <xref linkend="use-vars"/>.</para> - </note> - </sect2> - - <sect2> - <title><varname>PATCH_DEPENDS</varname></title> - - <para>Эта переменная указывает на программы или файлы, которые нужны - порту для применения патчей. Как и в предыдущих случаях, это - список пар вида - <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. - Например,</para> - - <programlisting>PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract</programlisting> - - <para>будет - переходить в подкаталог <filename>java/jfc</filename> вашего дерева - портов для распаковки.</para> - - <para>Зависимость проверяется внутри цели - <buildtarget>patch</buildtarget>. Часть - <replaceable>target</replaceable> может быть опущена, если она - совпадает с <varname>DEPENDS_TARGET</varname>.</para> - </sect2> - - <sect2 xml:id="uses"> - <title><varname>USES</varname></title> - - <para>Могут быть добавлены параметры для определения различных - характерных особенностей и зависимостей, которыми - обладает данный порт. Они указываются путём добавления - в <filename>Makefile</filename> этой строки:</para> - - <programlisting>USES= feature[:arguments]</programlisting> - - <para>Для получения полного списка значений смотрите - <xref linkend="uses-values"/>.</para> - - <warning> - <para>Значение <varname>USES</varname> нельзя присваивать - после подключения <filename>bsd.port.pre.mk</filename>.</para> - </warning> - </sect2> - - <sect2 xml:id="use-vars"> - <title><varname>USE_<replaceable>*</replaceable></varname></title> - - <para>Для определения общих зависимостей, совместно используемых - многими портами, предназначено несколько переменных. Их - использование является необязательным, но помогает упростить - избыточность файлов <filename>Makefile</filename> порта. - Каждый из них оформляется как - <varname>USE_<replaceable>*</replaceable></varname>. Эти - переменные можно использовать только в <filename>Makefile</filename> - порта и <filename>ports/Mk/bsd.*.mk</filename>. Они не - предназначены для установки пользователями параметров — - используйте для этих целей <varname>PORT_OPTIONS</varname>.</para> + <para>Зависимость проверяется внутри цели + <buildtarget>install</buildtarget>. Кроме того, имя + зависимости помещается в пакет, так что + <command>pkg install</command> (см. &man.pkg-install.8;) + будет автоматически его устанавливать, если он не будет + найден в пользовательской системе. Часть + <replaceable>target</replaceable> может быть опущена, если + она совпадает с <varname>DEPENDS_TARGET</varname>.</para> + + <para>Довольно распространенной является ситуация, когда + <varname>RUN_DEPENDS</varname> буквально такая же как + <varname>BUILD_DEPENDS</varname>, особенно если переносимое + программное обеспечение написано на языке сценариев, или если + оно требует такое же окружение для исполнения, как и + используемое во время построения. В этом случае, очень + заманчивым или довольно естественным является присвоение + одного другому:</para> + + <programlisting>RUN_DEPENDS= ${BUILD_DEPENDS}</programlisting> + + <para>Тем не менее, подобные присвоения могут загрязнять + зависимости времени исполнения содержимым, не заданным в + <varname>BUILD_DEPENDS</varname> исходного порта. Такое + случается из-за ленивого вычисления в &man.make.1; + присваиваемых переменных. Представьте + <filename>Makefile</filename> с переменными + <varname>USE_<replaceable>*</replaceable></varname>, которые + обрабатываются в <filename>ports/Mk/bsd.*.mk</filename> для + пополнения первоначальных зависимостей построения. Например, + <literal>USES= gmake</literal> добавляет <package + role="port">devel/gmake</package> в + <varname>BUILD_DEPENDS</varname>. Для предотвращения + загрязнения <varname>RUN_DEPENDS</varname> подобными + дополнительными зависимостями проявляйте осторожность с + присвоением с раскрытием, т.е. с раскрытием значения перед + его присвоением переменной:</para> + + <programlisting>RUN_DEPENDS:= ${BUILD_DEPENDS}</programlisting> + </sect2> + + <sect2> + <title><varname>BUILD_DEPENDS</varname></title> + + <para>В этой переменной перечисляются выполнимые или обычные + файлы, которые требуются порту для его построения. Как и + <varname>RUN_DEPENDS</varname>, это список пар + <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. + Например,</para> + + <programlisting>BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting> + + <para>будет проверять наличие выполнимого фала с именем + <command>unzip</command> и перейдет в подкаталог + <filename>archivers/unzip</filename> вашего дерева портов для + его построения и установки, если последний не будет + найден.</para> - <note> - <para>Установка любых <varname>USE_<replaceable>*</replaceable></varname> - в <filename>/etc/make.conf</filename> <emphasis>всегда</emphasis> - является ошибочным действием. В частности, установка</para> + <note> + <para>Под <quote>построением</quote> здесь понимается всё, от + распаковки до компиляции. Зависимость проверяется из цели + <buildtarget>extract</buildtarget>. Часть + <replaceable>target</replaceable> может быть опущена, если + она совпадает с <varname>DEPENDS_TARGET</varname>.</para> + </note> + </sect2> - <programlisting>USE_GCC=X.Y</programlisting> + <sect2> + <title><varname>FETCH_DEPENDS</varname></title> - <para>(где X.Y соответствует версии) добавит зависимость - от gccXY к каждому порту, включая и сам - <literal>lang/gccXY</literal>!</para> - </note> + <para>В этой переменной перечисляются выполняемые файлы или + просто файлы, которые требуются порту для сгрузки. Как и + предыдущие две переменные, это список пар + <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. + Например,</para> - <table frame="none"> - <title>Переменные - <varname>USE_<replaceable>*</replaceable></varname></title> + <programlisting>FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2</programlisting> - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> + <para>будет проверять наличие выполняемого файла с именем + <command>ncftp2</command> и перейдет в каталог + <filename>net/ncftp2</filename> вашего дерева портов для его + построения и установки, если тот не будет найден.</para> - <entry>Значение</entry> - </row> - </thead> + <para>Зависимость проверяется при выполнении цели + <buildtarget>fetch</buildtarget>. Часть + <replaceable>target</replaceable> может быть опущена, если + она совпадает с <varname>DEPENDS_TARGET</varname>.</para> + </sect2> - <tbody> - <row> - <entry><varname>USE_BZIP2</varname></entry> + <sect2> + <title><varname>EXTRACT_DEPENDS</varname></title> - <entry>tar-архивы порта упакованы при помощи - <command>bzip2</command>.</entry> - </row> + <para>В этой переменной указываются программы или файлы, + которые требуются для распаковки порта. Как и в предыдущих + случаях, это список пар вида + <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. + Например,</para> - <row> - <entry><varname>USE_ZIP</varname></entry> + <programlisting>EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip</programlisting> - <entry>tar-архивы порта упакованы при помощи - <command>zip</command>.</entry> - </row> + <para>будет проверять наличие программы с именем + <command>unzip</command>, и перейдёт в подкаталог + <filename>archivers/unzip</filename> вашего дерева портов для + её построения и установки, если такой программы не будет + найдено.</para> - <row> - <entry><varname>USE_GCC</varname></entry> - - <entry>Для сборки порта требуется GCC - (<command>gcc</command> или <command>g++</command>). - Некоторым портам подходит любая версия, для других - требуются последние современные версии. Обычно - используется со значением <literal>any</literal> (в - этом случае используется встроенный GCC в тех - версиях &os;, в состав которых он всё ещё входит, - или устанавливается порт - <literal>lang/gcc</literal>, когда Clang является - компилятором C/C++ по умолчанию) или - <literal>yes</literal> (всегда используется - стабильная современная версия GCC из порта - <literal>lang/gcc</literal>). Также в значении - переменной можно указать точную версию, например - <literal>4.7</literal>. Минимально допустимую - версию можно указать как <literal>4.6+</literal>. - GCC из основной системы используется в случае, если - его версия удовлетворяет запрошенной, иначе - собирается подходящая версии компилятора из порта с - соответствующей коррекцией переменных - <varname>CC</varname> и <varname>CXX</varname>. - </entry> - </row> + <para>Зависимость проверяется внутри цели + <buildtarget>extract</buildtarget>. Часть + <replaceable>target</replaceable> может быть опущена, если + она совпадает с <varname>DEPENDS_TARGET</varname>.</para> - </tbody> - </tgroup> - </table> + <note> + <para>Используйте эту переменную, только если распаковка не + работает (по умолчанию предполагается использование + <command>gzip</command>) и это не исправляется при помощи + <varname>USE_ZIP</varname> или + <varname>USE_BZIP2</varname>, которые описаны в <xref + linkend="use-vars"/>.</para> + </note> + </sect2> + + <sect2> + <title><varname>PATCH_DEPENDS</varname></title> + + <para>Эта переменная указывает на программы или файлы, которые + нужны порту для применения патчей. Как и в предыдущих + случаях, это список пар вида + <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional>:target</optional>. + Например,</para> + + <programlisting>PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract</programlisting> + + <para>будет переходить в подкаталог + <filename>java/jfc</filename> вашего дерева портов для + распаковки.</para> + + <para>Зависимость проверяется внутри цели + <buildtarget>patch</buildtarget>. Часть + <replaceable>target</replaceable> может быть опущена, если + она совпадает с <varname>DEPENDS_TARGET</varname>.</para> + </sect2> + + <sect2 xml:id="uses"> + <title><varname>USES</varname></title> + + <para>Могут быть добавлены параметры для определения различных + характерных особенностей и зависимостей, которыми обладает + данный порт. Они указываются путём добавления в + <filename>Makefile</filename> этой строки:</para> + + <programlisting>USES= feature[:arguments]</programlisting> + + <para>Для получения полного списка значений смотрите + <xref linkend="uses-values"/>.</para> + + <warning> + <para>Значение <varname>USES</varname> нельзя присваивать + после подключения + <filename>bsd.port.pre.mk</filename>.</para> + </warning> + </sect2> + + <sect2 xml:id="use-vars"> + <title><varname>USE_<replaceable>*</replaceable></varname></title> + + <para>Для определения общих зависимостей, совместно + используемых многими портами, предназначено несколько + переменных. Их использование является необязательным, но + помогает упростить избыточность файлов + <filename>Makefile</filename> порта. Каждый из них + оформляется как + <varname>USE_<replaceable>*</replaceable></varname>. Эти + переменные можно использовать только в + <filename>Makefile</filename> порта и + <filename>ports/Mk/bsd.*.mk</filename>. Они не предназначены + для установки пользователями параметров — используйте + для этих целей <varname>PORT_OPTIONS</varname>.</para> + + <note> + <para>Установка любых + <varname>USE_<replaceable>*</replaceable></varname> в + <filename>/etc/make.conf</filename> + <emphasis>всегда</emphasis> является ошибочным действием. + В частности, установка</para> + + <programlisting>USE_GCC=X.Y</programlisting> + + <para>(где X.Y соответствует версии) добавит зависимость от + gccXY к каждому порту, включая и сам + <literal>lang/gccXY</literal>!</para> + </note> - <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>Минимальная версия зависимости может быть указана в любой - переменной <varname>*_DEPENDS</varname>, за исключением - <varname>LIB_DEPENDS</varname>, с использованием следующего - синтаксиса:</para> - - <programlisting>p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy</programlisting> - - <para>Первое поле содержит название зависимого пакета, которое - обязано совпадать с записью в базе данные пакетов, знак сравнения - и версию версию пакета. Зависимость удовлетворяется если на машине - установлен p5-Spiffy-0.26 или новее.</para> - </sect2> - - <sect2> - <title>Замечания касательно зависимостей</title> - - <para>Как уже отмечено выше, целью, которая вызывается по умолчанию - в случае, когда это требует зависимость, является - <buildtarget>DEPENDS_TARGET</buildtarget>. Она по умолчанию есть - <literal>install</literal>. Это пользовательская переменная; она - нигде не определена в файле <filename>Makefile</filename> порта. - Если вашему порту требуется особый метод обработки зависимости, - воспользуйтесь частью <literal>:target</literal> переменной - <varname>*_DEPENDS</varname> вместо того, чтобы переопределять - <varname>DEPENDS_TARGET</varname>.</para> - - <para>Когда вы набираете команду <command>make clean</command>, - эта операция также выполняется и над зависимостями этого порта. - Если вы не хотите, чтобы это случилось, определите переменную - <varname>NOCLEANDEPENDS</varname> в вашем окружении. - Это может быть особенно нужным, если порт имеет нечто, что занимает - много времени на построение, в своём списке зависимостей, например, - KDE, GNOME или Mozilla.</para> - - <para>Чтобы безусловно зависеть от другого порта, укажите переменную - <varname>${NONEXISTENT}</varname> в качестве первого поля - переменной <varname>BUILD_DEPENDS</varname> или - <varname>RUN_DEPENDS</varname>. Пользуйтесь этим, только когда вам - нужно иметь исходный код другого порта. Вы можете сэкономить время - на компиляции, указав также и цель. Например,</para> - - <programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting> - - <para>всегда будет переходить в каталог с портом - <literal>jpeg</literal> и распаковывать его.</para> - </sect2> - - <sect2> - <title>Зацикленные зависимости фатальны</title> - - <important> - <para>Не помещайте зацикливающиеся зависимости в дерево - портов!</para> - </important> - - <para>Технология построения портов не защищена от зацикленных - зависимостей. Если вы создадите такую, то у кого-нибудь и - где-нибудь установка &os; будет немедленно сломана, а у остальных - сломается несколько позже. Это на самом деле очень трудно - распознать; если вы сомневаетесь, то перед внесением изменений - проверьте, что выполнили следующее: <command>cd /usr/ports; make - index</command>. Этот процесс может быть достаточно медленным на - старых машинах, хотя мы сможете спасти большое количество - людей—включая себя—от грядущих бед.</para> - </sect2> - - <sect2> - <title>Автоматические зависимости и проблемы, которые они - вызывают</title> - - <para>Зависимости должны быть указаны либо явно, либо с - использованием <link linkend="makefile-options">фреймворка + <table frame="none"> + <title>Переменные + <varname>USE_<replaceable>*</replaceable></varname></title> + + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>USE_BZIP2</varname></entry> + <entry>tar-архивы порта упакованы при помощи + <command>bzip2</command>.</entry> + </row> + + <row> + <entry><varname>USE_ZIP</varname></entry> + <entry>tar-архивы порта упакованы при помощи + <command>zip</command>.</entry> + </row> + + <row> + <entry><varname>USE_GCC</varname></entry> + <entry>Для сборки порта требуется GCC + (<command>gcc</command> или <command>g++</command>). + Некоторым портам подходит любая версия, для других + требуются последние современные версии. Обычно + используется со значением <literal>any</literal> (в + этом случае используется встроенный GCC в тех версиях + &os;, в состав которых он всё ещё входит, или + устанавливается порт <literal>lang/gcc</literal>, + когда Clang является компилятором C/C++ по умолчанию) + или <literal>yes</literal> (всегда используется + стабильная современная версия GCC из порта + <literal>lang/gcc</literal>). Также в значении + переменной можно указать точную версию, например + <literal>4.7</literal>. Минимально допустимую версию + можно указать как <literal>4.6+</literal>. + GCC из основной системы используется в случае, если + его версия удовлетворяет запрошенной, иначе + собирается подходящая версии компилятора из порта с + соответствующей коррекцией переменных + <varname>CC</varname> и + <varname>CXX</varname>.</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>Минимальная версия зависимости может быть указана в любой + переменной <varname>*_DEPENDS</varname>, за исключением + <varname>LIB_DEPENDS</varname>, с использованием следующего + синтаксиса:</para> + + <programlisting>p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy</programlisting> + + <para>Первое поле содержит название зависимого пакета, которое + обязано совпадать с записью в базе данные пакетов, знак + сравнения и версию пакета. Зависимость удовлетворяется, если + на машине установлен p5-Spiffy-0.26 или новее.</para> + </sect2> + + <sect2> + <title>Замечания касательно зависимостей</title> + + <para>Как уже отмечено выше, целью, которая вызывается по + умолчанию в случае, когда это требует зависимость, является + <buildtarget>DEPENDS_TARGET</buildtarget>. Она по умолчанию + есть <literal>install</literal>. Это пользовательская + переменная; она нигде не определена в файле + <filename>Makefile</filename> порта. Если вашему порту + требуется особый метод обработки зависимости, воспользуйтесь + частью <literal>:target</literal> переменной + <varname>*_DEPENDS</varname> вместо того, чтобы + переопределять <varname>DEPENDS_TARGET</varname>.</para> + + <para>Когда вы набираете команду <command>make clean</command>, + эта операция также выполняется и над зависимостями этого + порта. Если вы не хотите, чтобы это случилось, определите + переменную <varname>NOCLEANDEPENDS</varname> в вашем + окружении. Это может быть особенно нужным, если порт имеет + нечто, что занимает много времени на построение, в своём + списке зависимостей, например, KDE, GNOME или Mozilla.</para> + + <para>Чтобы безусловно зависеть от другого порта, укажите + переменную <varname>${NONEXISTENT}</varname> в качестве + первого поля переменной <varname>BUILD_DEPENDS</varname> или + <varname>RUN_DEPENDS</varname>. Пользуйтесь этим, только + когда вам нужно иметь исходный код другого порта. Вы можете + сэкономить время на компиляции, указав также и цель. + Например,</para> + + <programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting> + + <para>всегда будет переходить в каталог с портом + <literal>jpeg</literal> и распаковывать его.</para> + </sect2> + + <sect2> + <title>Зацикленные зависимости фатальны</title> + + <important> + <para>Не помещайте зацикливающиеся зависимости в дерево + портов!</para> + </important> + + <para>Технология построения портов не защищена от зацикленных + зависимостей. Если вы создадите такую, то у кого-нибудь и + где-нибудь установка &os; будет немедленно сломана, а у + остальных сломается несколько позже. Это на самом деле очень + трудно распознать; если вы сомневаетесь, то перед внесением + изменений проверьте, что выполнили следующее: + <command>cd /usr/ports; make index</command>. Этот процесс + может быть достаточно медленным на старых машинах, хотя вы + сможете спасти большое количество людей—включая + себя—от грядущих бед.</para> + </sect2> + + <sect2> + <title>Автоматические зависимости и проблемы, которые они + вызывают</title> + + <para>Зависимости должны быть указаны либо явно, либо с + использованием <link linkend="makefile-options">фреймворка OPTIONS</link>. Использование прочих методов, таких как - автоматическое обнаружение зависимостей, усложняет индексирование, - что вызывает проблемы в управлении портами и пакетами.</para> + автоматическое обнаружение зависимостей, усложняет + индексирование, что вызывает проблемы в управлении портами и + пакетами.</para> - <example> - <title>Некорректное объявление необязательной зависимости</title> + <example> + <title>Некорректное объявление необязательной + зависимости</title> - <programlisting>.include <bsd.port.pre.mk> + <programlisting>.include <bsd.port.pre.mk> .if exists(${LOCALBASE}/bin/foo) LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar .endif</programlisting> - </example> - - <para>Проблема автоматического добавления зависимостей - заключается в том, что файлы и настройки за пределами порта - могут произвольно меняться. Пример: после построения - индекса устанавливается набор портов. При этом один из - них устанавливает проверяемый файл. На этом этапе индекс - будет неправильным, потому что установленный порт неожиданно - получит новую зависимость. Индекс может быть по прежнему - неправильным даже после его перестроения, в случае если - другие порты также определят дополнительные зависимости, - основываясь на существовании других файлов.</para> - - <example> - <title>Корректное объявление необязательной зависимости</title> - - <programlisting>OPTIONS_DEFINE= BAR + </example> + + <para>Проблема автоматического добавления зависимостей + заключается в том, что файлы и настройки за пределами порта + могут произвольно меняться. Пример: после построения индекса + устанавливается набор портов. При этом один из них + устанавливает проверяемый файл. На этом этапе индекс будет + неправильным, потому что установленный порт неожиданно + получит новую зависимость. Индекс может быть по прежнему + неправильным даже после его перестроения, в случае если + другие порты также определят дополнительные зависимости, + основываясь на существовании других файлов.</para> + + <example> + <title>Корректное объявление необязательной + зависимости</title> + + <programlisting>OPTIONS_DEFINE= BAR BAR_DESC= Bar support .include <bsd.port.options.mk> @@ -3036,94 +3217,96 @@ BAR_DESC= Bar support .if ${PORT_OPTIONS:MBAR} LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar .endif</programlisting> - </example> + </example> - <para>Правильным способом является проверка переменных параметров. - Этот способ не приводит к несоответствиям в индексе набора - портов, поскольку параметры определены до построения индекса. - При этом можно использовать простые скрипты для автоматизации - построения, установки и обновления этих портов и соответствующих - им пакетов.</para> - </sect2> + <para>Правильным способом является проверка переменных + параметров. Этот способ не приводит к несоответствиям в + индексе набора портов, поскольку параметры определены до + построения индекса. При этом можно использовать простые + скрипты для автоматизации построения, установки и обновления + этих портов и соответствующих им пакетов.</para> + </sect2> - <sect2 xml:id="use-want"> - <title><varname>USE_</varname> и - <varname>WANT_</varname></title> + <sect2 xml:id="use-want"> + <title><varname>USE_</varname> и + <varname>WANT_</varname></title> - <para>Переменные <varname>USE_</varname> задаются мейнтейнером - порта для определения программного обеспечения, от которого - этот порт зависит. Порт, для которого нужен Firefox, - укажет</para> + <para>Переменные <varname>USE_</varname> задаются мейнтейнером + порта для определения программного обеспечения, от которого + этот порт зависит. Порт, для которого нужен Firefox, + укажет</para> - <programlisting>USE_FIREFOX= yes</programlisting> + <programlisting>USE_FIREFOX= yes</programlisting> - <para>Некоторые переменные <varname>USE_</varname> могут - принимать номера версий или другие параметры. Например, - порт, который требует Apache 2.2, укажет</para> + <para>Некоторые переменные <varname>USE_</varname> могут + принимать номера версий или другие параметры. Например, + порт, который требует Apache 2.2, укажет</para> - <programlisting>USE_APACHE= 22</programlisting> + <programlisting>USE_APACHE= 22</programlisting> - <para>В некоторых случаях для большего контроля над - зависимостями используются переменные <varname>WANT_</varname>, - которые позволяют указывать требования в более точной форме. - Например, взгляните на порт - <package role="port">mail/squirrelmail</package>. Этому порту - нужны несколько модулей PHP, которые перечислены в переменной - <varname>USE_PHP</varname>:</para> + <para>В некоторых случаях для большего контроля над + зависимостями используются переменные + <varname>WANT_</varname>, которые позволяют указывать + требования в более точной форме. Например, взгляните на порт + <package role="port">mail/squirrelmail</package>. Этому + порту нужны несколько модулей PHP, которые перечислены в + переменной <varname>USE_PHP</varname>:</para> - <programlisting>USE_PHP= session mhash gettext mbstring pcre openssl xml</programlisting> + <programlisting>USE_PHP= session mhash gettext mbstring pcre openssl xml</programlisting> - <para>Эти модули доступны в версиях CLI и web, поэтому версия - web выбрана с переменной <varname>WANT_</varname>:</para> + <para>Эти модули доступны в версиях CLI и web, поэтому версия + web выбрана с переменной <varname>WANT_</varname>:</para> - <programlisting>WANT_PHP_WEB= yes</programlisting> + <programlisting>WANT_PHP_WEB= yes</programlisting> - <para>Имеющиеся переменные <varname>USE_</varname> и - <varname>WANT_</varname> определены в файлах в - <filename class="directory">/usr/ports/Mk</filename>.</para> - </sect2> - </sect1> + <para>Имеющиеся переменные <varname>USE_</varname> и + <varname>WANT_</varname> определены в файлах в + <filename class="directory">/usr/ports/Mk</filename>.</para> + </sect2> + </sect1> <sect1 xml:id="makefile-masterdir"> <title><varname>MASTERDIR</varname></title> - <para>Если вашему порту требуется построение довольно различающихся - версий пакетов через переменную (задающую, например, разрешение, - или размер бумаги), которая принимает различные значения, создайте для - каждого пакета отдельный подкаталог, чтобы пользователям было легче - определить, каким пакетом воспользоваться, но попробуйте использовать - совместно между портами как можно больше файлов. В типичном случае вам - потребуются только очень короткие файлы <filename>Makefile</filename> - во всех каталогах, кроме одного, если вы будете использовать переменные - с умом. В отдельных файлах <filename>Makefile</filename> вы можете - использовать переменную <varname>MASTERDIR</varname> для указания - каталога, в котором находятся все остальные файлы. Также используйте - переменную как часть <link linkend="porting-pkgname"><varname>PKGNAMESUFFIX</varname></link>, чтобы - пакеты имели разные имена.</para> + <para>Если вашему порту требуется построение довольно + различающихся версий пакетов через переменную (задающую, + например, разрешение, или размер бумаги), которая принимает + различные значения, создайте для каждого пакета отдельный + подкаталог, чтобы пользователям было легче определить, каким + пакетом воспользоваться, но попробуйте использовать совместно + между портами как можно больше файлов. В типичном случае вам + потребуются только очень короткие файлы + <filename>Makefile</filename> во всех каталогах, кроме одного, + если вы будете использовать переменные с умом. В отдельных + файлах <filename>Makefile</filename> вы можете использовать + переменную <varname>MASTERDIR</varname> для указания каталога, + в котором находятся все остальные файлы. Также используйте + переменную как часть <link + linkend="porting-pkgname"><varname>PKGNAMESUFFIX</varname></link>, + чтобы пакеты имели разные имена.</para> <para>Продемонстрируем это на примере. Вот часть файла <filename>japanese/xdvi300/Makefile</filename>:</para> - <programlisting> -PORTNAME= xdvi -PORTVERSION= 17 -PKGNAMEPREFIX= ja- -PKGNAMESUFFIX= ${RESOLUTION} + <programlisting>PORTNAME= xdvi +PORTVERSION= 17 +PKGNAMEPREFIX= ja- +PKGNAMESUFFIX= ${RESOLUTION} : # default -RESOLUTION?= 300 +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> + ${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>Порт <package role="port">japanese/xdvi300</package> содержит - также все обычные патчи, файлы для пакета и так далее. Если вы введете - здесь команду <command>make</command>, она возьмет в качестве разрешения - значение по умолчанию (300) и построит порт обычным образом.</para> + <para>Порт <package role="port">japanese/xdvi300</package> + содержит также все обычные патчи, файлы для пакета и так далее. + Если вы введете здесь команду <command>make</command>, она + возьмет в качестве разрешения значение по умолчанию (300) и + построит порт обычным образом.</para> <para>Для другого разрешения приведем <emphasis>полный</emphasis> <filename>xdvi118/Makefile</filename>:</para> @@ -3135,8 +3318,9 @@ MASTERDIR= ${.CURDIR}/../xdvi300 <para>(<filename>xdvi240/Makefile</filename> и <filename>xdvi400/Makefile</filename> похожи). Задание - <varname>MASTERDIR</varname> говорит <filename>bsd.port.mk</filename>, - что обычный набор подкаталогов типа <varname>FILESDIR</varname> и + <varname>MASTERDIR</varname> говорит + <filename>bsd.port.mk</filename>, что обычный набор + подкаталогов типа <varname>FILESDIR</varname> и <varname>SCRIPTDIR</varname> находится в каталоге <filename>xdvi300</filename>. Строчка <literal>RESOLUTION=118</literal> переопределят строку @@ -3148,263 +3332,270 @@ MASTERDIR= ${.CURDIR}/../xdvi300 <sect1 xml:id="makefile-manpages"> <title>Страницы Справочника</title> - <para>Если ваш порт определяет корнем для файлов Справочника каталог, - отличный от <varname>PREFIX</varname>, вы можете использовать - переменную <varname>MANDIRS</varname>, чтобы указать эти каталоги. - Обратите внимание, что файлы страниц справочника следует размещать - в <filename>pkg-plist</filename> наряду с остальными файлами. - <varname>MANDIRS</varname> предназначена для автоматического - сжатия страниц справочника, так чтобы имена файлов оканчивались - на <filename>.gz</filename>.</para> + <para>Если ваш порт определяет корнем для файлов Справочника + каталог, отличный от <varname>PREFIX</varname>, вы можете + использовать переменную <varname>MANDIRS</varname>, чтобы + указать эти каталоги. Обратите внимание, что файлы страниц + справочника следует размещать в <filename>pkg-plist</filename> + наряду с остальными файлами. <varname>MANDIRS</varname> + предназначена для автоматического сжатия страниц справочника, + так чтобы имена файлов оканчивались на + <filename>.gz</filename>.</para> </sect1> <sect1 xml:id="makefile-info"> <title>Файлы в формате info</title> - <para>Если в вашем пакете нужна установка файлов GNU info, они должны - быть перечислены в переменной <varname>INFO</varname> (без окончания - <literal>.info</literal>), по записи на документ. Предполагается, - что эти файлы устанавливаются в - <filename>PREFIX/INFO_PATH</filename>. - Вы можете изменить <varname>INFO_PATH</varname>, если ваш пакет - использует другое место для размещения. Однако, это не рекомендуется - делать. Эти записи всего лишь содержат путь относительно - <filename>PREFIX/INFO_PATH</filename>. - Например, <package role="port">lang/gcc34</package> устанавливает - файлы info в - <filename>PREFIX/INFO_PATH/gcc34</filename>, - и в <varname>INFO</varname> будет что-то вроде этого:</para> - - <programlisting>INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...</programlisting> - - <para>Перед регистрацией пакета соответствующий код установки/удаления будет - автоматически добавлен во временный <filename>pkg-plist</filename>.</para> + <para>Если в вашем пакете нужна установка файлов GNU info, они + должны быть перечислены в переменной <varname>INFO</varname> + (без окончания <literal>.info</literal>), по записи на + документ. Предполагается, что эти файлы устанавливаются в + <filename>PREFIX/INFO_PATH</filename>. Вы можете изменить + <varname>INFO_PATH</varname>, если ваш пакет использует другое + место для размещения. Однако, это не рекомендуется делать. + Эти записи всего лишь содержат путь относительно + <filename>PREFIX/INFO_PATH</filename>. Например, <package + role="port">lang/gcc34</package> устанавливает файлы info в + <filename>PREFIX/INFO_PATH/gcc34</filename>, и в + <varname>INFO</varname> будет что-то вроде этого:</para> + + <programlisting>INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...</programlisting> + + <para>Перед регистрацией пакета соответствующий код + установки/удаления будет автоматически добавлен во временный + <filename>pkg-plist</filename>.</para> </sect1> - <sect1 xml:id="makefile-options"> - <title>Опции для Makefile</title> - - <para>Многие приложения могут быть построены в различных - конфигурациях и с дополнительной функциональностью. Например, - выбор естественного (человеческого) языка, GUI против командной - строки или типа используемой базы данных. Пользователи могут - нуждаться в различных конфигурациях, отличных от используемой по - умолчанию, поэтому в системе портов предусмотрен механизм, - позволяющий автору порта управлять сборкой того или иного - варианта конфигурации. - Правильная поддержка этих необязательных параметров облегчает - пользователям жизнь и даёт два или более порта по цене одного.</para> - - <sect2> - <title>Knobs</title> - - <sect3> - <title><varname>WITH_<replaceable>*</replaceable></varname> - и + <sect1 xml:id="makefile-options"> + <title>Опции для Makefile</title> + + <para>Многие приложения могут быть построены в различных + конфигурациях и с дополнительной функциональностью. Например, + выбор естественного (человеческого) языка, GUI против командной + строки или типа используемой базы данных. Пользователи могут + нуждаться в различных конфигурациях, отличных от используемой + по умолчанию, поэтому в системе портов предусмотрен механизм, + позволяющий автору порта управлять сборкой того или иного + варианта конфигурации. Правильная поддержка этих + необязательных параметров облегчает пользователям жизнь и даёт + два или более порта по цене одного.</para> + + <sect2> + <title>Knobs</title> + + <sect3> + <title><varname>WITH_<replaceable>*</replaceable></varname> + и + <varname>WITHOUT_<replaceable>*</replaceable></varname></title> + + <para>Эти переменные предназначены для установки системным + администратором. Многие из них стандартизованы в файле + <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>ports/KNOBS</filename></link>.</para> + + <para>При создании порта не давайте имя для knob, специфичное + для данного приложения. На примере порта Avahi, + используйте <varname>WITHOUT_MDNS</varname> вместо + <varname>WITHOUT_AVAHI_MDNS</varname>.</para> + + <note> + <para>Не стоит рассчитывать, что + <varname>WITH_<replaceable>*</replaceable></varname> + обязательно имеет соответствующую переменную + <varname>WITHOUT_<replaceable>*</replaceable></varname>, + и наоборот. В общем случае, предполагается значение по + умолчанию.</para> + </note> + + <note> + <para>Если обратное не указано, то проверяется только факт + установки самих переменных, но не их конкретное значение + типа <literal>YES</literal> или + <literal>NO</literal>.</para> + </note> + + <table frame="none"> + <title>Основные переменные + <varname>WITH_<replaceable>*</replaceable></varname> и <varname>WITHOUT_<replaceable>*</replaceable></varname></title> - <para>Эти переменные предназначены для установки системным - администратором. Многие из них стандартизованы в файле - <link xlink:href="http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>ports/KNOBS</filename></link>.</para> - - <para>При создании порта не давайте имя для knob, специфичное - для данного приложения. На примере порта Avahi, используйте - <varname>WITHOUT_MDNS</varname> вместо - <varname>WITHOUT_AVAHI_MDNS</varname>.</para> - - <note> - <para>Не стоит рассчитывать, что - <varname>WITH_<replaceable>*</replaceable></varname> - обязательно имеет соответствующую переменную - <varname>WITHOUT_<replaceable>*</replaceable></varname>, - и наоборот. В общем случае, предполагается значение по - умолчанию.</para> - </note> - - <note> - <para>Если обратное не указано, то проверяется только факт - установки самих переменных, но не их конкретное значение типа - <literal>YES</literal> или <literal>NO</literal>.</para> - </note> - - <table frame="none"> - <title>Основные переменные - <varname>WITH_<replaceable>*</replaceable></varname> - и <varname>WITHOUT_<replaceable>*</replaceable></varname></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>WITH_OPENSSL_BASE</varname></entry> - - <entry>Использовать версию OpenSSL из базовой системы.</entry> - </row> - - <row> - <entry><varname>WITH_OPENSSL_PORT</varname></entry> - - <entry>Устанавливает версию OpenSSL из - <package role="port">security/openssl</package>, - даже если в базовой системе последняя версия.</entry> - </row> - </tbody> - </tgroup> - </table> - - </sect3> - - <sect3> - <title>Наименование KNOBS</title> - <para>Портеры должны использовать так называемые - knobs для помощи конечным пользователям и для поддержания - количества наименований knobs в небольшом количестве. - Список популярных названий knobs можно найти в файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>KNOBS</filename></link> - </para> - - <para>Названия knobs должны отражать, что это такое и что - выполняет. Если у порта имеется библиотечный префикс в - <varname>PORTNAME</varname>, то он должен присутствовать в - названии knobs.</para> - </sect3> - </sect2> - - <sect2> - <title><varname>OPTIONS</varname></title> - - <sect3> - <title>Описание</title> - <para>При установке порта переменные <varname>OPTIONS_*</varname> - предоставляют пользователю окно диалога с отображением - доступных параметров, с записью выбранных параметров в файл - <filename>/var/db/ports/${UNIQUENAME}/options</filename>. - Эти опции повторно используются при следующем построении - порта.</para> - - <para>Когда пользователь запускает <command>make config</command> - (или запускает впервые <command>make build</command>), - инфраструктура выполняет проверку существования файла - <filename>/var/db/ports/${UNIQUENAME}/options</filename>. - Если этот файл не существует, то используются значения - <varname>OPTIONS_*</varname> и отображается диалоговое окно, - в котором эти параметры можно включить или выключить. - Затем сохраняется файл опций <filename>options</filename>, - и выбранные переменные используются при построении порта.</para> - - <para>Если новая версия порта добавляет новые значения - <varname>OPTIONS</varname>, то пользователю будет представлено - окно диалога с сохраненными заполненными значениями старых - <varname>OPTIONS.</varname></para> - - <para><command>make showconfig</command> отображает - сохраненную конфигурацию. Для удаления - сохраненной конфигурации используйте - <command>make rmconfig</command>.</para> - </sect3> - - <sect3> - <title>Синтаксис</title> - - <para><varname>OPTIONS_DEFINE</varname> содержит список - используемых <varname>OPTIONS</varname>. Они независимы - друг от друга и не сгруппированы:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 OPT2</programlisting> - - <para>Далее после определения следует описание - <varname>OPTIONS</varname> (не является обязательным, - но настоятельно рекомендуется):</para> - - <programlisting>OPT1_DESC= Describe OPT1 + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>WITH_OPENSSL_BASE</varname></entry> + <entry>Использовать версию OpenSSL из базовой + системы.</entry> + </row> + + <row> + <entry><varname>WITH_OPENSSL_PORT</varname></entry> + + <entry>Устанавливает версию OpenSSL из <package + role="port">security/openssl</package>, даже если в + базовой системе последняя версия.</entry> + </row> + </tbody> + </tgroup> + </table> + </sect3> + + <sect3> + <title>Наименование KNOBS</title> + + <para>Портеры должны использовать так называемые knobs для + помощи конечным пользователям и для поддержания количества + наименований knobs в небольшом количестве. Список + популярных названий knobs можно найти в файле <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup"><filename>KNOBS</filename></link></para> + + <para>Названия knobs должны отражать, что это такое и что + выполняет. Если у порта имеется библиотечный префикс в + <varname>PORTNAME</varname>, то он должен присутствовать в + названии knobs.</para> + </sect3> + </sect2> + + <sect2> + <title><varname>OPTIONS</varname></title> + + <sect3> + <title>Описание</title> + + <para>При установке порта переменные + <varname>OPTIONS_*</varname> предоставляют пользователю + окно диалога с отображением доступных параметров, с записью + выбранных параметров в файл + <filename>/var/db/ports/${UNIQUENAME}/options</filename>. + Эти опции повторно используются при следующем построении + порта.</para> + + <para>Когда пользователь запускает + <command>make config</command> (или запускает впервые + <command>make build</command>), инфраструктура выполняет + проверку существования файла + <filename>/var/db/ports/${UNIQUENAME}/options</filename>. + Если этот файл не существует, то используются значения + <varname>OPTIONS_*</varname> и отображается диалоговое + окно, в котором эти параметры можно включить или выключить. + Затем сохраняется файл опций <filename>options</filename>, + и выбранные переменные используются при построении + порта.</para> + + <para>Если новая версия порта добавляет новые значения + <varname>OPTIONS</varname>, то пользователю будет + представлено окно диалога с сохраненными заполненными + значениями старых <varname>OPTIONS.</varname></para> + + <para><command>make showconfig</command> отображает + сохраненную конфигурацию. Для удаления сохраненной + конфигурации используйте + <command>make rmconfig</command>.</para> + </sect3> + + <sect3> + <title>Синтаксис</title> + + <para><varname>OPTIONS_DEFINE</varname> содержит список + используемых <varname>OPTIONS</varname>. Они независимы + друг от друга и не сгруппированы:</para> + + <programlisting>OPTIONS_DEFINE= OPT1 OPT2</programlisting> + + <para>Далее после определения следует описание + <varname>OPTIONS</varname> (не является обязательным, но + настоятельно рекомендуется):</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> - содержит описание множества наиболее используемых - <varname>OPTIONS</varname>; переопределять их, как - правило, не нужно.</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><varname>OPTIONS</varname> можно группировать в виде - переключателей, для которых разрешен выбор единственного - варианта в каждой группе:</para> - - <programlisting>OPTIONS_SINGLE= SG1 + <tip> + <para><filename>ports/Mk/bsd.options.desc.mk</filename> + содержит описание множества наиболее используемых + <varname>OPTIONS</varname>; переопределять их, как + правило, не нужно.</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><varname>OPTIONS</varname> можно группировать в виде + переключателей, для которых разрешен выбор единственного + варианта в каждой группе:</para> + + <programlisting>OPTIONS_SINGLE= SG1 OPTIONS_SINGLE_SG1= OPT3 OPT4</programlisting> - <para><varname>OPTIONS</varname> можно группировать в виде - переключателей, для которых разрешен выбор единственного - варианта (или ни одного) в каждой группе:</para> + <para><varname>OPTIONS</varname> можно группировать в виде + переключателей, для которых разрешен выбор единственного + варианта (или ни одного) в каждой группе:</para> - <programlisting>OPTIONS_RADIO= RG1 + <programlisting>OPTIONS_RADIO= RG1 OPTIONS_RADIO_RG1= OPT7 OPT8</programlisting> - <para><varname>OPTIONS</varname> также можно группировать - в виде списков со множественным выбором, для которых - обязан быть включен <emphasis>по крайней мере - один</emphasis> из параметров:</para> + <para><varname>OPTIONS</varname> также можно группировать в + виде списков со множественным выбором, для которых обязан + быть включен <emphasis>по крайней мере один</emphasis> из + параметров:</para> - <programlisting>OPTIONS_MULTI= MG1 + <programlisting>OPTIONS_MULTI= MG1 OPTIONS_MULTI_MG1= OPT5 OPT6</programlisting> - <para><varname>OPTIONS</varname> также можно группировать - в виде списков со множественным выбором, для которых - могут быть включены любые параметры, включая отсутствие - выбора:</para> + <para><varname>OPTIONS</varname> также можно группировать в + виде списков со множественным выбором, для которых могут + быть включены любые параметры, включая отсутствие + выбора:</para> - <programlisting>OPTIONS_GROUP= GG1 + <programlisting>OPTIONS_GROUP= GG1 OPTIONS_GROUP_GG1= OPT9 OPT10</programlisting> - <para>По умолчанию <varname>OPTIONS</varname> находится в - выключенном положении, если при этом оно также отсутствует - в списке <varname>OPTIONS_DEFAULT</varname>:</para> - - <programlisting>OPTIONS_DEFAULT= OPT1 OPT3 OPT6</programlisting> - - <para>Определения <varname>OPTIONS</varname> обязаны появиться - до подключения <filename>bsd.port.options.mk</filename>. - Переменные <varname>PORT_OPTIONS</varname> - могут быть проверены только после - подключения <filename>bsd.port.options.mk</filename>. - Вместо этого также можно использовать подключение - <filename>bsd.port.pre.mk</filename>, что все еще широко - используется в портах, написанных до появления - <filename>bsd.port.options.mk</filename>. Но имейте в виду, - что некоторые переменные, обычно, это некоторые флаги - <varname>USE_*</varname>, - после подключения <filename>bsd.port.pre.mk</filename> будут - работать не так, как этого от них ожидают.</para> - - <example xml:id="ports-options-simple-use"> - <title>Простое использование <varname>OPTIONS</varname></title> - - <programlisting>OPTIONS_DEFINE= FOO BAR + <para>По умолчанию <varname>OPTIONS</varname> находится в + выключенном положении, если при этом оно также отсутствует + в списке <varname>OPTIONS_DEFAULT</varname>:</para> + + <programlisting>OPTIONS_DEFAULT= OPT1 OPT3 OPT6</programlisting> + + <para>Определения <varname>OPTIONS</varname> обязаны быть + до подключения <filename>bsd.port.options.mk</filename>. + Переменные <varname>PORT_OPTIONS</varname> могут быть + проверены только после подключения + <filename>bsd.port.options.mk</filename>. Вместо этого + также можно использовать подключение + <filename>bsd.port.pre.mk</filename>, что все еще широко + используется в портах, написанных до появления + <filename>bsd.port.options.mk</filename>. Но имейте в + виду, что некоторые переменные, обычно, это некоторые флаги + <varname>USE_*</varname>, после подключения + <filename>bsd.port.pre.mk</filename> будут работать не так, + как этого от них ожидают.</para> + + <example xml:id="ports-options-simple-use"> + <title>Простое использование + <varname>OPTIONS</varname></title> + + <programlisting>OPTIONS_DEFINE= FOO BAR FOO_DESC= Enable option foo BAR_DESC= Support feature bar @@ -3421,22 +3612,22 @@ RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar .endif .include <bsd.port.mk></programlisting> - </example> + </example> - <example xml:id="ports-options-check-unset"> - <title>Проверка незаданных значений - <varname>OPTIONS</varname></title> + <example xml:id="ports-options-check-unset"> + <title>Проверка незаданных значений + <varname>OPTIONS</varname></title> - <programlisting>.if ! ${PORT_OPTIONS:MEXAMPLES} + <programlisting>.if ! ${PORT_OPTIONS:MEXAMPLES} CONFIGURE_ARGS+=--without-examples .endif</programlisting> - </example> + </example> - <example xml:id="ports-options-practical-use"> - <title>Пример реального использования - <varname>OPTIONS</varname></title> + <example xml:id="ports-options-practical-use"> + <title>Пример реального использования + <varname>OPTIONS</varname></title> - <programlisting>OPTIONS_DEFINE= EXAMPLES + <programlisting>OPTIONS_DEFINE= EXAMPLES OPTIONS_SINGLE= BACKEND OPTIONS_SINGLE_BACKEND= MYSQL PGSQL BDB @@ -3474,114 +3665,126 @@ CONFIGURE_ARGS+= --without-examples # Проверка других параметров OPTIONS .include <bsd.port.mk></programlisting> - </example> - </sect3> - - <sect3> - <title>Параметры по умолчанию</title> - <para>Следующие параметры по умолчанию всегда включены.</para> - <itemizedlist> - <listitem> - <para><literal>DOCS</literal> — построение и установка - документации.</para> - </listitem> - <listitem> - <para><literal>NLS</literal> — интернационализация.</para> - </listitem> - <listitem> - <para><literal>EXAMPLES</literal> — построение и - установка примеров использования.</para> - </listitem> - <listitem> - <para><literal>IPV6</literal> — поддержка протокола - IPv6.</para> - </listitem> - </itemizedlist> - <note> - <para>Нет необходимости добавлять эти параметры в - <varname>OPTIONS_DEFAULT</varname>. Тем не менее, чтобы - отобразить их в окне диалога выбора параметров, они должны - быть добавлены в <varname>OPTIONS_DEFINE</varname>.</para> - </note> - </sect3> - </sect2> - - <sect2> - <title>Функция автоматической активации</title> - - <para>При использовании сценария GNU configure, следите за тем, - какие необязательные функции задействуются посредством - автоматической активации. Отключайте явным образом те - необязательные функции, которые вы не хотели бы использовать, - через передачу соответствующих <literal>--without-xxx</literal> - или <literal>--disable-xxx</literal> в переменной - <varname>CONFIGURE_ARGS</varname>.</para> - - <example> - <title>Неправильное управление опцией</title> - - <programlisting>.if ${PORT_OPTIONS:MFOO} -LIB_DEPENDS+= libfoo.so:${PORTSDIR}/devel/foo -CONFIGURE_ARGS+= --enable-foo -.endif</programlisting> </example> + </sect3> + + <sect3> + <title>Параметры по умолчанию</title> + + <para>Следующие параметры по умолчанию всегда + включены.</para> + + <itemizedlist> + <listitem> + <para><literal>DOCS</literal> — построение и + установка документации.</para> + </listitem> + + <listitem> + <para><literal>NLS</literal> — + интернационализация.</para> + </listitem> + + <listitem> + <para><literal>EXAMPLES</literal> — построение и + установка примеров использования.</para> + </listitem> + + <listitem> + <para><literal>IPV6</literal> — поддержка протокола + IPv6.</para> + </listitem> + </itemizedlist> - <para>В приведенном выше примере представьте себе библиотеку libfoo, - установленную в системе. Пользователь не желает, чтобы приложение - использовало libfoo, и поэтому он выключает соответствующую опцию - в диалоге <literal>make config</literal>. Но сценарий configure - приложения определяет наличие библиотеки в системе и включает ее - поддержку в итоговый исполняемый файл. Теперь, когда пользователь - решит удалить libfoo из системы, система портов позволит это - сделать (т.к. зависимость от libfoo не была записана), но - приложение перестанет работать.</para> + <note> + <para>Нет необходимости добавлять эти параметры в + <varname>OPTIONS_DEFAULT</varname>. Тем не менее, чтобы + отобразить их в окне диалога выбора параметров, они + должны быть добавлены в + <varname>OPTIONS_DEFINE</varname>.</para> + </note> + </sect3> + </sect2> + + <sect2> + <title>Функция автоматической активации</title> + + <para>При использовании сценария GNU configure, следите за тем, + какие необязательные функции задействуются посредством + автоматической активации. Отключайте явным образом те + необязательные функции, которые вы не хотели бы использовать, + через передачу соответствующих + <literal>--without-xxx</literal> или + <literal>--disable-xxx</literal> в переменной + <varname>CONFIGURE_ARGS</varname>.</para> - <example> - <title>Правильное управление опцией</title> + <example> + <title>Неправильное управление опцией</title> - <programlisting>.if ${PORT_OPTIONS:MFOO} + <programlisting>.if ${PORT_OPTIONS:MFOO} +LIB_DEPENDS+= libfoo.so:${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+= libfoo.so:${PORTSDIR}/devel/foo CONFIGURE_ARGS+= --enable-foo .else CONFIGURE_ARGS+= --disable-foo .endif</programlisting> - </example> + </example> - <para>Во втором примере библиотека libfoo отключена явным образом. - Сценарий configure не включает соответствующие функции в приложении, - несмотря на присутствие библиотеки в системе.</para> + <para>Во втором примере библиотека libfoo отключена явным + образом. Сценарий configure не включает соответствующие + функции в приложении, несмотря на присутствие библиотеки в + системе.</para> - <note> - <para>При определенных условиях сокращенный синтаксис записи - условий может вызывать проблемы со сложными конструкциями. - Если вы получаете ошибки, такие как <literal>Malformed - conditional</literal>, то может быть использован - альтернативный синтаксис.</para> + <note> + <para>При определенных условиях сокращенный синтаксис записи + условий может вызывать проблемы со сложными конструкциями. + Если вы получаете ошибки, такие как <literal>Malformed + conditional</literal>, то может быть использован + альтернативный синтаксис.</para> - <programlisting>.if !empty(VARIABLE:MVALUE) + <programlisting>.if !empty(VARIABLE:MVALUE) # as an alternative to .if ${VARIABLE:MVALUE}</programlisting> - </note> - </sect2> + </note> + </sect2> - <sect2> - <title>Вспомогательные макросы</title> + <sect2> + <title>Вспомогательные макросы</title> - <para>Существует несколько макросов, упрощающих запись условных - значений, которые отличаются в зависимости от набора - параметров.</para> + <para>Существует несколько макросов, упрощающих запись условных + значений, которые отличаются в зависимости от набора + параметров.</para> - <para>Если переменная <varname>OPTIONS_SUB</varname> имеет - значение <literal>yes</literal>, то каждый из указанных в - <varname>OPTIONS_DEFINE</varname> параметров будет добавлен - в <varname>PLIST_SUB</varname>. Следующая запись:</para> + <para>Если переменная <varname>OPTIONS_SUB</varname> имеет + значение <literal>yes</literal>, то каждый из указанных в + <varname>OPTIONS_DEFINE</varname> параметров будет добавлен в + <varname>PLIST_SUB</varname>. Следующая запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPTIONS_SUB= yes</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3591,19 +3794,19 @@ PLIST_SUB+= OPT1="" PLIST_SUB+= OPT1="@comment " .endif</programlisting> - <para><varname>X_CONFIGURE_ENABLE</varname> дописывает в - <varname>CONFIGURE_ARGS</varname> строку - <literal>--enable-${X_CONFIGURE_ENABLE}</literal> или - <literal>--disable-${X_CONFIGURE_ENABLE}</literal> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para><varname>X_CONFIGURE_ENABLE</varname> дописывает в + <varname>CONFIGURE_ARGS</varname> строку + <literal>--enable-${X_CONFIGURE_ENABLE}</literal> или + <literal>--disable-${X_CONFIGURE_ENABLE}</literal> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CONFIGURE_ENABLE= test</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3613,19 +3816,19 @@ CONFIGURE_ARGS+= --enable-test CONFIGURE_ARGS+= --disable-test .endif</programlisting> - <para><varname>X_CONFIGURE_WITH</varname> дописывает в - <varname>CONFIGURE_ARGS</varname> строку - <literal>--with-${X_CONFIGURE_WITH}</literal> или - <literal>--without-${X_CONFIGURE_WITH}</literal> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para><varname>X_CONFIGURE_WITH</varname> дописывает в + <varname>CONFIGURE_ARGS</varname> строку + <literal>--with-${X_CONFIGURE_WITH}</literal> или + <literal>--without-${X_CONFIGURE_WITH}</literal> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CONFIGURE_WITH= test</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3635,17 +3838,17 @@ CONFIGURE_ARGS+= --with-test CONFIGURE_ARGS+= --without-test .endif</programlisting> - <para>Значение переменной <varname>X_CONFIGURE_ON</varname> - будет дописано в <varname>CONFIGURE_ARGS</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para>Значение переменной <varname>X_CONFIGURE_ON</varname> + будет дописано в <varname>CONFIGURE_ARGS</varname> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CONFIGURE_ON= --add-test</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3653,32 +3856,32 @@ OPT1_CONFIGURE_ON= --add-test</programlisting> CONFIGURE_ARGS+= --add-test .endif</programlisting> - <para>Значение переменной <varname>X_CONFIGURE_OFF</varname> - будет дописано в <varname>CONFIGURE_ARGS</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para>Значение переменной <varname>X_CONFIGURE_OFF</varname> + будет дописано в <varname>CONFIGURE_ARGS</varname> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CONFIGURE_OFF= --no-test</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> .if ! ${PORT_OPTIONS:MOPT1} CONFIGURE_ARGS+= --no-test .endif</programlisting> - <para>Значение переменной <varname>X_CMAKE_ON</varname> будет - дописано в <varname>CMAKE_ARGS</varname> в соответствии с - состоянием <varname>X</varname>. Следующая запись:</para> + <para>Значение переменной <varname>X_CMAKE_ON</varname> будет + дописано в <varname>CMAKE_ARGS</varname> в соответствии с + состоянием <varname>X</varname>. Следующая запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CMAKE_ON= -DTEST:BOOL=true</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3686,16 +3889,16 @@ OPT1_CMAKE_ON= -DTEST:BOOL=true</programlisting> CMAKE_ARGS+= -DTEST:BOOL=true .endif</programlisting> - <para>Значение переменной <varname>X_CMAKE_OFF</varname> будет - дописано в <varname>CMAKE_ARGS</varname> в соответствии с - состоянием <varname>X</varname>. Следующая запись:</para> + <para>Значение переменной <varname>X_CMAKE_OFF</varname> будет + дописано в <varname>CMAKE_ARGS</varname> в соответствии с + состоянием <varname>X</varname>. Следующая запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_CMAKE_OFF= -DTEST:BOOL=false</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3703,94 +3906,94 @@ OPT1_CMAKE_OFF= -DTEST:BOOL=false</programlisting> CMAKE_ARGS+= -DTEST:BOOL=false .endif</programlisting> - <para>Для любой из следующих переменных:</para> + <para>Для любой из следующих переменных:</para> - <itemizedlist> - <listitem> - <para><varname>ALL_TARGET</varname></para> - </listitem> + <itemizedlist> + <listitem> + <para><varname>ALL_TARGET</varname></para> + </listitem> - <listitem> - <para><varname>CATEGORIES</varname></para> - </listitem> + <listitem> + <para><varname>CATEGORIES</varname></para> + </listitem> - <listitem> - <para><varname>CFLAGS</varname></para> - </listitem> + <listitem> + <para><varname>CFLAGS</varname></para> + </listitem> - <listitem> - <para><varname>CPPFLAGS</varname></para> - </listitem> + <listitem> + <para><varname>CPPFLAGS</varname></para> + </listitem> - <listitem> - <para><varname>CXXFLAGS</varname></para> - </listitem> + <listitem> + <para><varname>CXXFLAGS</varname></para> + </listitem> - <listitem> - <para><varname>CONFIGURE_ENV</varname></para> - </listitem> + <listitem> + <para><varname>CONFIGURE_ENV</varname></para> + </listitem> - <listitem> - <para><varname>DISTFILES</varname></para> - </listitem> + <listitem> + <para><varname>DISTFILES</varname></para> + </listitem> - <listitem> - <para><varname>EXTRA_PATCHES</varname></para> - </listitem> + <listitem> + <para><varname>EXTRA_PATCHES</varname></para> + </listitem> - <listitem> - <para><varname>INSTALL_TARGET</varname></para> - </listitem> + <listitem> + <para><varname>INSTALL_TARGET</varname></para> + </listitem> - <listitem> - <para><varname>LDFLAGS</varname></para> - </listitem> + <listitem> + <para><varname>LDFLAGS</varname></para> + </listitem> - <listitem> - <para><varname>MAKE_ARGS</varname></para> - </listitem> + <listitem> + <para><varname>MAKE_ARGS</varname></para> + </listitem> - <listitem> - <para><varname>MAKE_ENV</varname></para> - </listitem> + <listitem> + <para><varname>MAKE_ENV</varname></para> + </listitem> - <listitem> - <para><varname>PATCH_SITES</varname></para> - </listitem> + <listitem> + <para><varname>PATCH_SITES</varname></para> + </listitem> - <listitem> - <para><varname>PATCHFILES</varname></para> - </listitem> + <listitem> + <para><varname>PATCHFILES</varname></para> + </listitem> - <listitem> - <para><varname>PLIST_FILES</varname></para> - </listitem> + <listitem> + <para><varname>PLIST_FILES</varname></para> + </listitem> - <listitem> - <para><varname>PLIST_DIRS</varname></para> - </listitem> + <listitem> + <para><varname>PLIST_DIRS</varname></para> + </listitem> - <listitem> - <para><varname>PLIST_DIRSTRY</varname></para> - </listitem> + <listitem> + <para><varname>PLIST_DIRSTRY</varname></para> + </listitem> - <listitem> - <para><varname>USES</varname></para> - </listitem> - </itemizedlist> + <listitem> + <para><varname>USES</varname></para> + </listitem> + </itemizedlist> - <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> - будет дописано в <varname>ABOVEVARIABLE</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> + будет дописано в <varname>ABOVEVARIABLE</varname> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_USES= gmake OPT1_CFLAGS= -DTEST</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3799,17 +4002,17 @@ USES+= gmake CFLAGS+= -DTEST .endif</programlisting> - <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, - то флаг <literal>ABOVEVARIABLE</literal> будет автоматически - выставлен при выключенном параметре <literal>X</literal>. - Например:</para> + <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, + то флаг <literal>ABOVEVARIABLE</literal> будет автоматически + выставлен при выключенном параметре <literal>X</literal>. + Например:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_USES_OFF=gmake</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3817,49 +4020,49 @@ OPT1_USES_OFF=gmake</programlisting> USES+= gmake .endif</programlisting> - <para>Для любого из следующих типов зависимости:</para> + <para>Для любого из следующих типов зависимости:</para> - <itemizedlist> - <listitem> - <para><varname>PKG_DEPENDS</varname></para> - </listitem> + <itemizedlist> + <listitem> + <para><varname>PKG_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>EXTRACT_DEPENDS</varname></para> - </listitem> + <listitem> + <para><varname>EXTRACT_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>PATCH_DEPENDS</varname></para> - </listitem> + <listitem> + <para><varname>PATCH_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>FETCH_DEPENDS</varname></para> - </listitem> + <listitem> + <para><varname>FETCH_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>BUILD_DEPENDS</varname></para> - </listitem> + <listitem> + <para><varname>BUILD_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>LIB_DEPENDS</varname></para> - </listitem> + <listitem> + <para><varname>LIB_DEPENDS</varname></para> + </listitem> - <listitem> - <para><varname>RUN_DEPENDS</varname></para> - </listitem> - </itemizedlist> + <listitem> + <para><varname>RUN_DEPENDS</varname></para> + </listitem> + </itemizedlist> - <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> - будет дописано в <varname>ABOVEVARIABLE</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> + <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> + будет дописано в <varname>ABOVEVARIABLE</varname> в + соответствии с состоянием <varname>X</varname>. Следующая + запись:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_LIB_DEPENDS= liba.so:${PORTSDIR}/devel/a</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> @@ -3867,449 +4070,467 @@ OPT1_LIB_DEPENDS= liba.so:${PORTSDIR}/devel/a</programlisting> LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a .endif</programlisting> - <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, - то зависимость типа <literal>ABOVEVARIABLE</literal> будет - добавлена при выключенном параметре <literal>X</literal>. - Например:</para> + <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, + то зависимость типа <literal>ABOVEVARIABLE</literal> будет + добавлена при выключенном параметре <literal>X</literal>. + Например:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 OPT1_LIB_DEPENDS_OFF= liba.so:${PORTSDIR}/devel/a</programlisting> - <para>соответствует:</para> + <para>соответствует:</para> - <programlisting>OPTIONS_DEFINE= OPT1 + <programlisting>OPTIONS_DEFINE= OPT1 .include <bsd.port.options.mk> . if ! ${PORT_OPTIONS:MOPT1} LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a .endif</programlisting> - </sect2> - </sect1> + </sect2> + </sect1> - <sect1 xml:id="makefile-wrkdir"> - <title>Задание рабочего каталога</title> + <sect1 xml:id="makefile-wrkdir"> + <title>Задание рабочего каталога</title> - <para>Каждый порт распаковывается в рабочий каталог, который должен быть - доступным для записи. В системе портов по умолчанию - <varname>DISTFILES</varname> распаковываются в каталог с именем - <literal>${DISTNAME}</literal>. Другими словами, если вы - задали:</para> + <para>Каждый порт распаковывается в рабочий каталог, который + должен быть доступным для записи. В системе портов по + умолчанию <varname>DISTFILES</varname> распаковываются в + каталог с именем <literal>${DISTNAME}</literal>. Другими + словами, если вы задали:</para> - <programlisting>PORTNAME= foo -PORTVERSION= 1.0</programlisting> + <programlisting>PORTNAME= foo +PORTVERSION= 1.0</programlisting> - <para>то дистрибутивные файлы порта содержат каталог верхнего уровня, - <filename>foo-1.0</filename>, и все файлы расположены в этом - каталоге.</para> + <para>то дистрибутивные файлы порта содержат каталог верхнего + уровня, <filename>foo-1.0</filename>, и все файлы расположены + в этом каталоге.</para> - <para>Если это не ваш случай, то имеется несколько переменных, которые - вы можете переопределить.</para> + <para>Если это не ваш случай, то имеется несколько переменных, + которые вы можете переопределить.</para> - <sect2> - <title><varname>WRKSRC</varname></title> + <sect2> + <title><varname>WRKSRC</varname></title> - <para>Эта переменная задаёт имя каталога, который создаётся при - распаковке исходных файлов приложения. В нашем предыдущем - примере если бы распаковка происходила в каталог с именем - <filename>foo</filename> (а не - <filename>foo-1.0</filename>), то вы должны написать:</para> + <para>Эта переменная задаёт имя каталога, который создаётся при + распаковке исходных файлов приложения. В нашем предыдущем + примере если бы распаковка происходила в каталог с именем + <filename>foo</filename> (а не <filename>foo-1.0</filename>), + то вы должны написать:</para> - <programlisting>WRKSRC= ${WRKDIR}/foo</programlisting> + <programlisting>WRKSRC= ${WRKDIR}/foo</programlisting> - <para>или, как вариант</para> + <para>или, как вариант</para> - <programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}</programlisting> - </sect2> + <programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}</programlisting> + </sect2> - <sect2> - <title><varname>NO_WRKSUBDIR</varname></title> + <sect2> + <title><varname>NO_WRKSUBDIR</varname></title> - <para>Если порт вообще не распаковывается ни в какой каталог, то вы - должны задать переменную <varname>NO_WRKSUBDIR</varname> для указания - на этот факт.</para> + <para>Если порт вообще не распаковывается ни в какой каталог, + то вы должны задать для этого переменную + <varname>NO_WRKSUBDIR</varname>.</para> - <programlisting>NO_WRKSUBDIR= yes</programlisting> - </sect2> - </sect1> + <programlisting>NO_WRKSUBDIR= yes</programlisting> + </sect2> + </sect1> - <sect1 xml:id="conflicts"> - <title>Разрешение конфликтов</title> + <sect1 xml:id="conflicts"> + <title>Разрешение конфликтов</title> + + <para>Для регистрации конфликта между пакетами и портами + используются три различные переменные: + <varname>CONFLICTS</varname>, + <varname>CONFLICTS_INSTALL</varname> и + <varname>CONFLICTS_BUILD</varname>.</para> + + <note> + <para>Переменные регистрации конфликта автоматически определяют + переменную <varname>IGNORE</varname>, которая более подробно + описана в <xref linkend="dads-noinstall"/>.</para> + </note> + + <para>При удалении одного из конфликтующих портов целесообразно + сохранить записи <varname>CONFLICTS</varname> в тех других + портах в течении нескольких месяцев, чтобы позаботиться о тех + пользователей, которые обновляются от случая к случаю.</para> + + <sect2> + <title><varname>CONFLICTS_INSTALL</varname></title> + + <para>Если ваш пакет не может существовать вместе с другими + (из-за конфликта файлов, несовместимости времени выполнения и + так далее), перечислите имена остальных пакетов в переменной + <varname>CONFLICTS_INSTALL</varname>. Здесь вы можете + использовать шаблоны командного интерпретатора, такие как + <literal>*</literal> и <literal>?</literal>. Имена пакетов + должны выглядеть так же, как в + <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь, что + <varname>CONFLICTS_INSTALL</varname> не содержит пакет самого + этого порта. В противном случае не будет работать установка + с использованием переменной + <varname>FORCE_PKG_REGISTER</varname>. Проверка + CONFLICTS_INSTALL выполняется после процесса сборки и до + процесса установки.</para> + </sect2> + + <sect2> + <title><varname>CONFLICTS_BUILD</varname></title> + + <para>Если ваш порт не может быть собран, когда уже установлен + другой, перечислите имена остальных портов в переменной + <varname>CONFLICTS_BUILD</varname>. Здесь вы можете + использовать шаблоны командного интерпретатора, такие как + <literal>*</literal> и <literal>?</literal>. Имена пакетов + должны выглядеть так же, как в + <filename>/var/db/pkg</filename>. Проверка CONFLICTS_BUILD + выполняется до процесса сборки. Конфликты сборки в + получаемом пакете не записываются.</para> + </sect2> + + <sect2> + <title><varname>CONFLICTS</varname></title> + + <para>Если ваш порт не может быть собран, когда уже установлен + другой, а получаемый пакет не может существовать вместе с + другими, перечислите имена остальных пакетов в переменной + <varname>CONFLICTS</varname>. Здесь вы можете использовать + шаблоны командного интерпретатора, такие как + <literal>*</literal> и <literal>?</literal>. Имена пакетов + должны выглядеть так же, как в + <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь, что + <varname>CONFLICTS</varname> не содержит пакет самого этого + порта. В противном случае не будет работать установка с + использованием переменной + <varname>FORCE_PKG_REGISTER</varname>. Проверка CONFLICTS + выполняется до процессов сборки и установки.</para> + </sect2> + </sect1> - <para>Для регистрации конфликта между пакетами и портами используются - три различные переменные: <varname>CONFLICTS</varname>, - <varname>CONFLICTS_INSTALL</varname> и - <varname>CONFLICTS_BUILD</varname>.</para> + <sect1 xml:id="install"> + <title>Установка файлов</title> - <note> - <para>Переменные регистрации конфликта автоматически определяют - переменную <varname>IGNORE</varname>, которая более подробно - описана в <xref linkend="dads-noinstall"/>.</para> - </note> + <sect2 xml:id="install-macros"> + <title>Макросы <varname>INSTALL_*</varname></title> - <para>При удалении одного из конфликтующих портов целесообразно - сохранить записи <varname>CONFLICTS</varname> в тех других портах - в течении нескольких месяцев, чтобы позаботиться о тех пользователей, - которые обновляются от случая к случаю.</para> - - <sect2> - <title><varname>CONFLICTS_INSTALL</varname></title> - - <para>Если ваш пакет не может существовать вместе с другими - (из-за конфликта файлов, несовместимости времени выполнения и так - далее), перечислите имена остальных пакетов в переменной - <varname>CONFLICTS_INSTALL</varname>. Здесь вы можете использовать - шаблоны командного интерпретатора, такие как <literal>*</literal> - и <literal>?</literal>. Имена пакетов должны выглядеть так же, - как в <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь, - что <varname>CONFLICTS_INSTALL</varname> не содержит пакет самого - этого порта. В противном случае не будет работать установка с - использованием переменной <varname>FORCE_PKG_REGISTER</varname>. - Проверка CONFLICTS_INSTALL выполняется после процесса сборки и - до процесса установки.</para> - </sect2> - - <sect2> - <title><varname>CONFLICTS_BUILD</varname></title> - - <para>Если ваш порт не может быть собран, когда уже установлен - другой, перечислите имена остальных портов в переменной - <varname>CONFLICTS_BUILD</varname>. Здесь вы можете использовать - шаблоны командного интерпретатора, такие как <literal>*</literal> - и <literal>?</literal>. Имена пакетов должны выглядеть так же, - как в <filename>/var/db/pkg</filename>. Проверка CONFLICTS_BUILD - выполняется до процесса сборки. Конфликты сборки в получаемом - пакете не записываются.</para> - </sect2> - - <sect2> - <title><varname>CONFLICTS</varname></title> - - <para>Если ваш порт не может быть собран, когда уже установлен - другой, а получаемый пакет не может существовать вместе с другими, - перечислите имена остальных пакетов в переменной - <varname>CONFLICTS</varname>. Здесь вы можете использовать шаблоны - командного интерпретатора, такие как <literal>*</literal> и - <literal>?</literal>. Имена пакетов должны выглядеть так же, как - в <filename>/var/db/pkg</filename>. Пожалуйста, убедитесь, что - <varname>CONFLICTS</varname> не содержит пакет самого этого порта. - В противном случае не будет работать установка с использованием - переменной <varname>FORCE_PKG_REGISTER</varname>. Проверка - CONFLICTS выполняется до процессов сборки и установки.</para> - </sect2> - </sect1> - - <sect1 xml:id="install"> - <title>Установка файлов</title> - - <sect2 xml:id="install-macros"> - <title>Макросы INSTALL_*</title> - - <para>Используйте макросы, которые есть в файле - <filename>bsd.port.mk</filename> для обеспечения правильных прав - доступа файлов в целях <buildtarget>*-install</buildtarget> - порта. Устанавливайте права владения напрямую в - <filename>pkg-plist</filename> через соответствующие записи - <literal>@owner owner</literal> и - <literal>@group group</literal>. Эти операторы работают до - момента их переопределения или до конца - <filename>pkg-plist</filename>, поэтому не забывайте их - сбрасывать, когда они больше не нужны. По умолчанию владение - устанавливается для <literal>root:wheel</literal>.</para> + <para>Используйте макросы, которые есть в файле + <filename>bsd.port.mk</filename> для обеспечения правильных + прав доступа файлов в целях + <buildtarget>*-install</buildtarget> порта. Устанавливайте + права владения напрямую в <filename>pkg-plist</filename> + через соответствующие записи <literal>@owner owner</literal> + и <literal>@group group</literal>. Эти операторы работают до + момента их переопределения или до конца + <filename>pkg-plist</filename>, поэтому не забывайте их + сбрасывать, когда они больше не нужны. По умолчанию владение + устанавливается для <literal>root:wheel</literal>.</para> - <itemizedlist> - <listitem> - <para><varname>INSTALL_PROGRAM</varname> - это команда для - установки бинарных выполнимых файлов.</para> - </listitem> + <itemizedlist> + <listitem> + <para><varname>INSTALL_PROGRAM</varname> - это команда для + установки бинарных выполнимых файлов.</para> + </listitem> - <listitem> - <para><varname>INSTALL_SCRIPT</varname> - это команда для установки - выполнимых скриптов.</para> - </listitem> + <listitem> + <para><varname>INSTALL_SCRIPT</varname> - это команда для + установки выполнимых скриптов.</para> + </listitem> - <listitem> - <para><varname>INSTALL_LIB</varname> - это команда для установки - динамических библиотек.</para> - </listitem> + <listitem> + <para><varname>INSTALL_LIB</varname> - это команда для + установки динамических библиотек.</para> + </listitem> - <listitem> - <para><varname>INSTALL_KLD</varname> - это команда для установки - загружаемых модулей ядра. Некоторые архитектуры предпочитают, - чтобы для модулей сохранялись отладочные сведения, по этой - причине используйте эту команду вместо - <varname>INSTALL_PROGRAM</varname>.</para> - </listitem> + <listitem> + <para><varname>INSTALL_KLD</varname> - это команда для + установки загружаемых модулей ядра. Некоторые + архитектуры предпочитают, чтобы для модулей сохранялись + отладочные сведения, по этой причине используйте эту + команду вместо <varname>INSTALL_PROGRAM</varname>.</para> + </listitem> - <listitem> - <para><varname>INSTALL_DATA</varname> - это команда для установки - совместно используемых файлов данных.</para> - </listitem> + <listitem> + <para><varname>INSTALL_DATA</varname> - это команда для + установки совместно используемых файлов данных.</para> + </listitem> - <listitem> - <para><varname>INSTALL_MAN</varname> - это команда для установки - страниц Справочника и другой документации (никаких файлов она не - сжимает).</para> - </listitem> - </itemizedlist> + <listitem> + <para><varname>INSTALL_MAN</varname> - это команда для + установки страниц Справочника и другой документации + (никаких файлов она не сжимает).</para> + </listitem> + </itemizedlist> - <para>В основе работы этих макросов лежит команда - <command>install</command> со всеми соответствующими флагами. - Смотрите пример их использования ниже.</para> - </sect2> - - <sect2 xml:id="install-strip"> - <title>Удаление отладочной информации в бинарных файлах и - динамических библиотеках</title> - - <para>Не удаляйте отладочную информацию из бинарных файлов вручную, - если вы это делали. Во всех двоичных файлах отладочная информация - должна быть удалена, и макрос <varname>INSTALL_PROGRAM</varname> - выполнит установку и удаление отладочной информации одновременно - (обратитесь к следующему разделу). Макрос - <varname>INSTALL_LIB</varname> делает то же самое для - динамических библиотек.</para> - - <para>Если вам нужно удалить отладочную информацию из файла без - использования макросов <varname>INSTALL_PROGRAM</varname> и - <varname>INSTALL_LIB</varname>, то это можно сделать при помощи - <varname>${STRIP_CMD}</varname>. Обычно это делается внутри цели - <literal>post-install</literal>. К примеру:</para> - - <programlisting>post-install: + <para>В основе работы этих макросов лежит команда + <command>install</command> со всеми соответствующими флагами. + Смотрите пример их использования ниже.</para> + </sect2> + + <sect2 xml:id="install-strip"> + <title>Удаление отладочной информации в бинарных файлах и + динамических библиотеках</title> + + <para>Не удаляйте отладочную информацию из бинарных файлов + вручную, если вы это делали. Во всех двоичных файлах + отладочная информация должна быть удалена, и макрос + <varname>INSTALL_PROGRAM</varname> выполнит установку и + удаление отладочной информации одновременно (обратитесь к + следующему разделу). Макрос <varname>INSTALL_LIB</varname> + делает то же самое для динамических библиотек.</para> + + <para>Если вам нужно удалить отладочную информацию из файла без + использования макросов <varname>INSTALL_PROGRAM</varname> и + <varname>INSTALL_LIB</varname>, то это можно сделать при + помощи <varname>${STRIP_CMD}</varname>. Обычно это делается + внутри цели <literal>post-install</literal>. К + примеру:</para> + + <programlisting>post-install: ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl</programlisting> - <para>Удаление отладочной информации из нескольких - файлов:</para> - - <programlisting>post-install: - .for l in geometry media body track world - ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0 - .endfor</programlisting> - - <para>Для проверки того, удалена ли отладочная информация из - файла, используйте &man.file.1;. Для двоичных файлов - &man.file.1; печатает <literal>stripped</literal> или - <literal>not stripped</literal>. Кроме того, &man.strip.1; - определяет, была ли уже удалена из программы отладочная - информация, и в этом случае просто завершает свою работу.</para> - </sect2> - - <sect2 xml:id="install-copytree"> - <title>Установка целого дерева файлов</title> - - <para>Иногда должно быть установлено большое количество файлов - с сохранением их иерархической организации. Например, копирование - дерева каталогов целиком из <varname>WRKSRC</varname> в целевой - каталог внутри <varname>PREFIX</varname>. Обратите внимание, - что <varname>PREFIX</varname>, <varname>EXAMPLESDIR</varname>, - <varname>DATADIR</varname> и другие переменные пути всегда - должны предваряться <varname>STAGEDIR</varname>, чтобы не - ломать staging (смотрите <xref linkend="staging"/>).</para> - - <para>Для этой ситуации существует два макроса. Преимущество от - использования этих макросов вместо команды <command>cp</command> - в том, что они гарантируют установку правильного владельца и прав - на конечные файлы. Первый макрос, <varname>COPYTREE_BIN</varname>, - делает все устанавливаемые файлы исполняемыми, что подходит для - установки в <filename>PREFIX/bin</filename>. - Второй макрос, <varname>COPYTREE_SHARE</varname>, не устанавливает - на файлы права исполнения, и, таким образом, подходит для установки - файлов внутри каталога - <filename>PREFIX/share</filename>.</para> - - <programlisting>post-install: + <para>Удаление отладочной информации из нескольких + файлов:</para> + + <programlisting>post-install: + .for l in geometry media body track world + ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0 + .endfor</programlisting> + + <para>Для проверки того, удалена ли отладочная информация из + файла, используйте &man.file.1;. Для двоичных файлов + &man.file.1; печатает <literal>stripped</literal> или + <literal>not stripped</literal>. Кроме того, &man.strip.1; + определяет, была ли уже удалена из программы отладочная + информация, и в этом случае просто завершает свою + работу.</para> + </sect2> + + <sect2 xml:id="install-copytree"> + <title>Установка целого дерева файлов</title> + + <para>Иногда должно быть установлено большое количество файлов + с сохранением их иерархической организации. Например, + копирование дерева каталогов целиком из + <varname>WRKSRC</varname> в целевой каталог внутри + <varname>PREFIX</varname>. Обратите внимание, что + <varname>PREFIX</varname>, <varname>EXAMPLESDIR</varname>, + <varname>DATADIR</varname> и другие переменные пути всегда + должны предваряться <varname>STAGEDIR</varname>, чтобы не + ломать staging (смотрите <xref linkend="staging"/>).</para> + + <para>Для этой ситуации существует два макроса. Преимущество + от использования этих макросов вместо команды + <command>cp</command> в том, что они гарантируют установку + правильного владельца и прав на конечные файлы. Первый + макрос, <varname>COPYTREE_BIN</varname>, делает все + устанавливаемые файлы исполняемыми, что подходит для + установки в <filename>PREFIX/bin</filename>. Второй макрос, + <varname>COPYTREE_SHARE</varname>, не устанавливает на файлы + права исполнения, и, таким образом, подходит для установки + файлов внутри каталога + <filename>PREFIX/share</filename>.</para> + + <programlisting>post-install: ${MKDIR} ${STAGEDIR}${EXAMPLESDIR} (cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})</programlisting> - <para>В этом примере устанавливается содержимое каталога - <filename>examples</filename> из установочных файлов производителя - в надлежащее место для примеров вашего порта.</para> + <para>В этом примере устанавливается содержимое каталога + <filename>examples</filename> из установочных файлов + производителя в надлежащее место для примеров вашего + порта.</para> - <programlisting>post-install: + <programlisting>post-install: ${MKDIR} ${STAGEDIR}${DATADIR}/summer (cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)</programlisting> - <para>А в этом примере будут установлены данные летних месяцев в - подкаталог <filename>summer</filename> каталога - <filename>DATADIR</filename>.</para> + <para>А в этом примере будут установлены данные летних месяцев + в подкаталог <filename>summer</filename> каталога + <filename>DATADIR</filename>.</para> - <para>В качестве третьего параметра в макросе - <varname>COPYTREE_*</varname> можно передать дополнительные - параметры <command>find</command>. Например, чтобы в первом - примере установить все файлы кроме файлов Makefile, можно - использовать следующую команду.</para> + <para>В качестве третьего параметра в макросе + <varname>COPYTREE_*</varname> можно передать дополнительные + параметры <command>find</command>. Например, чтобы в первом + примере установить все файлы кроме файлов Makefile, можно + использовать следующую команду.</para> - <programlisting>post-install: + <programlisting>post-install: ${MKDIR} ${STAGEDIR}${EXAMPLESDIR} (cd ${WRKSRC}/examples && \ ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")</programlisting> - <para>Эти макросы не производят добавление устанавливаемых - файлов в <filename>pkg-plist</filename>. Они должны быть - добавлены туда вручную. Необязательные файлы документации - (<varname>PORTDOCS</varname>, смотрите - <xref linkend="install-documentation"/>) и примеров - (<varname>PORTEXAMPLES</varname>) всегда должны предваряться - в <filename>pkg-plist</filename> префиксами - <literal>%%PORTDOCS%%</literal> или - <literal>%%PORTEXAMPLES%%</literal>.</para> - </sect2> - - <sect2 xml:id="install-documentation"> - <title>Установка дополнительной документации</title> - - <para>Если с вашим программным обеспечением поставляется некоторая - документация, отличающаяся от стандартных страниц Справочника и - файлов info, которая, как вы думаете, будет полезна пользователям, - установите ее в каталог - <filename>PREFIX/share/doc</filename>. Это может - быть сделано, как и в предыдущем разделе, в цели - <buildtarget>post-install</buildtarget>.</para> - - <para>Создайте для вашего порта новый каталог. Имя каталога должно - соответствовать тому, что представляет из себя порт. Обычно это - означает <varname>PORTNAME</varname>. Однако, если - вы думаете, что пользователь захочет иметь разные версии порта, - установленные одновременно, то вы можете использовать полное имя - <varname>PKGNAME</varname>.</para> - - <para>Поскольку устанавливаются только файлы, перечисленные в - <filename>pkg-plist</filename>, безопасным способом будет - устанавливать документацию в <varname>STAGEDIR</varname> - всегда (смотрите <xref linkend="staging"/>). Следовательно, - блоки <literal>.if</literal> нужны только для файлов - достаточно большого размера, установка которых влечёт - значительные накладные расходы на операции ввода/вывода.</para> - - <programlisting>post-install: - ${MKDIR} ${STAGEDIR}${DOCSDIR} - ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}</programlisting> - - <para>Вот несколько полезных переменных и то, как они преобразуются по - умолчанию при использовании в <filename>Makefile</filename>:</para> - - <itemizedlist> - <listitem> - <para><varname>DATADIR</varname> преобразуется в - <filename>PREFIX/share/PORTNAME</filename>.</para> - </listitem> - - <listitem> - <para><varname>DATADIR_REL</varname> преобразуется в - <filename>share/PORTNAME</filename>.</para> - </listitem> + <para>Эти макросы не производят добавление устанавливаемых + файлов в <filename>pkg-plist</filename>. Они должны быть + добавлены туда вручную. Необязательные файлы документации + (<varname>PORTDOCS</varname>, смотрите <xref + linkend="install-documentation"/>) и примеров + (<varname>PORTEXAMPLES</varname>) всегда должны предваряться + в <filename>pkg-plist</filename> префиксами + <literal>%%PORTDOCS%%</literal> или + <literal>%%PORTEXAMPLES%%</literal>.</para> + </sect2> + + <sect2 xml:id="install-documentation"> + <title>Установка дополнительной документации</title> + + <para>Если с вашим программным обеспечением поставляется + некоторая документация, отличающаяся от стандартных страниц + Справочника и файлов info, которая, как вы думаете, будет + полезна пользователям, установите ее в каталог + <filename>PREFIX/share/doc</filename>. Это может быть + сделано, как и в предыдущем разделе, в цели + <buildtarget>post-install</buildtarget>.</para> + + <para>Создайте для вашего порта новый каталог. Имя каталога + должно соответствовать тому, что представляет из себя порт. + Обычно это означает <varname>PORTNAME</varname>. Однако, + если вы думаете, что пользователь захочет иметь разные версии + порта, установленные одновременно, то вы можете использовать + полное имя <varname>PKGNAME</varname>.</para> + + <para>Поскольку устанавливаются только файлы, перечисленные в + <filename>pkg-plist</filename>, безопасным способом будет + устанавливать документацию в <varname>STAGEDIR</varname> + всегда (смотрите <xref linkend="staging"/>). Следовательно, + блоки <literal>.if</literal> нужны только для файлов + достаточно большого размера, установка которых влечёт + значительные накладные расходы на операции + ввода/вывода.</para> + + <programlisting>post-install: + ${MKDIR} ${STAGEDIR}${DOCSDIR} + ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}</programlisting> + + <para>Вот несколько полезных переменных и то, как они + преобразуются по умолчанию при использовании в + <filename>Makefile</filename>:</para> - <listitem> - <para><varname>DOCSDIR</varname> преобразуется в - <filename>PREFIX/share/doc/PORTNAME</filename>.</para> - </listitem> + <itemizedlist> + <listitem> + <para><varname>DATADIR</varname> преобразуется в + <filename>PREFIX/share/PORTNAME</filename>.</para> + </listitem> - <listitem> - <para><varname>DOCSDIR_REL</varname> преобразуется в - <filename>share/doc/PORTNAME</filename>.</para> - </listitem> + <listitem> + <para><varname>DATADIR_REL</varname> преобразуется в + <filename>share/PORTNAME</filename>.</para> + </listitem> - <listitem> - <para><varname>EXAMPLESDIR</varname> преобразуется в - <filename>PREFIX/share/examples/PORTNAME</filename>.</para> - </listitem> + <listitem> + <para><varname>DOCSDIR</varname> преобразуется в + <filename>PREFIX/share/doc/PORTNAME</filename>.</para> + </listitem> - <listitem> - <para><varname>EXAMPLESDIR_REL</varname> преобразуется в - <filename>share/examples/PORTNAME</filename>.</para> - </listitem> - </itemizedlist> + <listitem> + <para><varname>DOCSDIR_REL</varname> преобразуется в + <filename>share/doc/PORTNAME</filename>.</para> + </listitem> - <note> - <para>Параметр <literal>DOCS</literal> управляет установкой - дополнительной документации в <varname>DOCSDIR</varname>. Это - не относится к стандартным страницам справочника и страницам info. - Все, что устанавливается в <varname>DATADIR</varname> и - <varname>EXAMPLESDIR</varname>, соответственно управляется - через параметры <literal>DATA</literal> и - <literal>EXAMPLES</literal>.</para> - </note> + <listitem> + <para><varname>EXAMPLESDIR</varname> преобразуется в + <filename>PREFIX/share/examples/PORTNAME</filename>.</para> + </listitem> - <para>Эти переменные экспортируются в <varname>PLIST_SUB</varname>. - Их значения появятся там в виде имён путей относительно - <filename>PREFIX</filename>, если это возможно. - То есть <filename>share/doc/PORTNAME</filename> - в списке сборки по умолчанию будет заменен на - <literal>%%DOCSDIR%%</literal>, и так далее. (Дополнительную - информацию о подстановке в <filename>pkg-plist</filename> можно - найти <link linkend="plist-sub">здесь</link>.)</para> + <listitem> + <para><varname>EXAMPLESDIR_REL</varname> преобразуется в + <filename>share/examples/PORTNAME</filename>.</para> + </listitem> + </itemizedlist> - <para>Все условно устанавливаемые файлы и каталоги с документацией - должны быть перечислены в файле <filename>pkg-plist</filename> с - префиксом <literal>%%PORTDOCS%%</literal>, например:</para> + <note> + <para>Параметр <literal>DOCS</literal> управляет установкой + дополнительной документации в <varname>DOCSDIR</varname>. + Это не относится к стандартным страницам справочника и + страницам info. Все, что устанавливается в + <varname>DATADIR</varname> и + <varname>EXAMPLESDIR</varname>, соответственно управляется + через параметры <literal>DATA</literal> и + <literal>EXAMPLES</literal>.</para> + </note> - <programlisting>%%PORTDOCS%%%%DOCSDIR%%/AUTHORS + <para>Эти переменные экспортируются в + <varname>PLIST_SUB</varname>. Их значения появятся там в + виде имён путей относительно <filename>PREFIX</filename>, + если это возможно. То есть + <filename>share/doc/PORTNAME</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>, порт может указать в переменной - <varname>PORTDOCS</varname> список имён файлов и глобальных шаблонов - командного процессора для добавления в окончательный список сборки. - Имена будут задаваться относительно <varname>DOCSDIR</varname>. - Таким образом, порт, использующий <varname>PORTDOCS</varname> и - нестандартное местоположение документации, должен задавать - соответствующим образом и <varname>DOCSDIR</varname>. Если каталог - указан в <varname>PORTDOCS</varname> или соответствует шаблону для - этой переменной, то полное поддерево с входящими в него файлами и - каталогами будет регистрироваться в окончательном списке сборки. - Если параметр <literal>DOCS</literal> не задан, то файлы и каталоги, - перечисленные в <varname>PORTDOCS</varname>, не будут установлены и - добавлены в список сборки порта. Установка документации в - <varname>PORTDOCS</varname>, как это показано выше, остаётся за - самим портом. Типичный пример использования - <varname>PORTDOCS</varname> выглядит следующим образом:</para> - - <programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting> - - <note> - <para>Эквивалентами <varname>PORTDOCS</varname> для файлов, - устанавливаемых в <varname>DATADIR</varname> и - <varname>EXAMPLESDIR</varname> являются <varname>PORTDATA</varname> - и <varname>PORTEXAMPLES</varname> соответственно.</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 xml:id="install-subdirs"> - <title>Подкаталоги внутри PREFIX</title> - - <para>Попробуйте поместить все файлы порта в правильных подкаталогах - каталога <varname>PREFIX</varname>. Некоторые порты игнорируют все - установки и помещают все в подкаталог с именем порта, что - неправильно. Также многие порты помещают все, кроме бинарных файлов, - файлов заголовков и страниц Справочника, в подкаталог каталога - <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>PREFIX/news</filename> для установки - своих файлов.</para> - </sect2> - - </sect1> - - </chapter> + <para>В качестве альтернативы перечислению файлов документации + в файле <filename>pkg-plist</filename>, порт может указать в + переменной <varname>PORTDOCS</varname> список имён файлов и + глобальных шаблонов командного процессора для добавления в + окончательный список сборки. Имена будут задаваться + относительно <varname>DOCSDIR</varname>. Таким образом, + порт, использующий <varname>PORTDOCS</varname> и + нестандартное местоположение документации, должен задавать + соответствующим образом и <varname>DOCSDIR</varname>. Если + каталог указан в <varname>PORTDOCS</varname> или + соответствует шаблону для этой переменной, то полное + поддерево с входящими в него файлами и каталогами будет + регистрироваться в окончательном списке сборки. Если + параметр <literal>DOCS</literal> не задан, то файлы и + каталоги, перечисленные в <varname>PORTDOCS</varname>, не + будут установлены и добавлены в список сборки порта. + Установка документации в <varname>PORTDOCS</varname>, как это + показано выше, остаётся за самим портом. Типичный пример + использования <varname>PORTDOCS</varname> выглядит следующим + образом:</para> + + <programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting> + <note> + <para>Эквивалентами <varname>PORTDOCS</varname> для файлов, + устанавливаемых в <varname>DATADIR</varname> и + <varname>EXAMPLESDIR</varname> являются + <varname>PORTDATA</varname> и + <varname>PORTEXAMPLES</varname> соответственно.</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 xml:id="install-subdirs"> + <title>Подкаталоги внутри PREFIX</title> + + <para>Попробуйте поместить все файлы порта в правильных + подкаталогах каталога <varname>PREFIX</varname>. Некоторые + порты игнорируют все установки и помещают все в подкаталог с + именем порта, что неправильно. Также многие порты помещают + все, кроме бинарных файлов, файлов заголовков и страниц + Справочника, в подкаталог каталога <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>PREFIX/news</filename> + для установки своих файлов.</para> + </sect2> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml index 4229dce1e3..f8e432801d 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/new-port/chapter.xml @@ -7,41 +7,46 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="own-port"> - - <title>Как самому сделать новый порт</title> - - <para>Итак, вы интересуетесь, как создать собственный порт или - обновить существующий? Великолепно!</para> - - <para>Ниже находятся некоторые указания по созданию нового порта для - &os;. Если вы хотите обновить существующий порт, вы должны - прочесть их, а затем <xref linkend="port-upgrading"/>.</para> - - <para>Если этот документ недостаточно подробен, вы должны обратиться к - файлу <filename>/usr/ports/Mk/bsd.port.mk</filename>, который - включается в make-файл каждого порта. Он хорошо прокомментирован, и - даже если вы не занимаетесь хакингом make-файлов каждодневно, из него - вы сможете узнать много нового. Кроме того, конкретные вопросы можно - задать, послав письмо на адрес &a.ports;.</para> - - <note> - <para>Только часть переменных - (<varname><replaceable>VAR</replaceable></varname>), которые могут быть - переопределены, описаны в этом документе. Большинство (если не все) - описаны в начале файла <filename>/usr/ports/Mk/bsd.port.mk</filename>; - остальные, скорее всего, тоже там описаны. Заметьте, что - в этом файле используется нестандартная настройка шага табуляции: - <application>Emacs</application> и <application>Vim</application> - должны распознать это при загрузке файла. Как &man.vi.1;, - так и &man.ex.1; могут быть настроены на использование - правильного значения выдачей команды <command>:set tabstop=4</command> - после загрузки файла.</para> - </note> - - <para> - Ищете, с чего бы начать попроще? Посмотрите на <link xlink:href="http://wiki.freebsd.org/WantedPorts">перечень запрошенных - портов</link>, есть ли там такие, над которыми вы можете работать. - </para> - </chapter> - +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="own-port"> + + <title>Как самому сделать новый порт</title> + + <para>Итак, вы интересуетесь, как создать собственный порт или + обновить существующий? Великолепно!</para> + + <para>Ниже находятся некоторые указания по созданию нового порта + для &os;. Если вы хотите обновить существующий порт, вы должны + прочесть их, а затем <xref linkend="port-upgrading"/>.</para> + + <para>Если этот документ недостаточно подробен, вы должны + обратиться к файлу + <filename>/usr/ports/Mk/bsd.port.mk</filename>, который + включается в make-файл каждого порта. Он хорошо + прокомментирован, и даже если вы не занимаетесь хакингом + make-файлов каждодневно, из него вы сможете узнать много нового. + Кроме того, конкретные вопросы можно задать, послав письмо на + адрес &a.ports;.</para> + + <note> + <para>Только часть переменных + (<varname><replaceable>VAR</replaceable></varname>), которые + могут быть переопределены, описаны в этом документе. + Большинство (если не все) описаны в начале файла + <filename>/usr/ports/Mk/bsd.port.mk</filename>; остальные, + скорее всего, тоже там описаны. Заметьте, что в этом файле + используется нестандартная настройка шага табуляции: + <application>Emacs</application> и + <application>Vim</application> должны распознать это при + загрузке файла. Как &man.vi.1;, так и &man.ex.1; могут быть + настроены на использование правильного значения выдачей команды + <command>:set tabstop=4</command> после загрузки файла.</para> + </note> + + <para> + Ищете, с чего бы начать попроще? Посмотрите на <link + xlink:href="http://wiki.freebsd.org/WantedPorts">перечень + запрошенных портов</link>, есть ли там такие, над которыми вы + можете работать.</para> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml index 78b5378cff..18d78bc50a 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/pkg-files/chapter.xml @@ -7,198 +7,207 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="pkg-files"> +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="pkg-files"> - <title>Файлы <filename>pkg-*</filename></title> + <title>Файлы <filename>pkg-*</filename></title> <para>Есть несколько приёмов работы с файлами - <filename>pkg-*</filename>, которые мы ещё не - описали, но они иногда могут быть очень кстати.</para> - - <sect1 xml:id="porting-message"> - <title><filename>pkg-message</filename></title> - - <para>Если вам нужно вывести сообщение для человека, устанавливающего - приложение, то вы можете поместить сообщение в файл - <filename>pkg-message</filename>. Эта возможность часто оказывается - полезной для вывода дополнительных шагов установки, которые нужно - предпринять после выполнения команды <command>pkg install</command>, - или для вывода информации о лицензировании.</para> - - <para>Если должны выводиться некоторые строки о knobs времени построения - или предупреждения, используйте <varname>ECHO_MSG</varname>. Файл - <filename>pkg-message</filename> только для послеустановочных шагов. - Также следует иметь в виду различие между <varname>ECHO_MSG</varname> - и <varname>ECHO_CMD</varname>. Первое предназначено для вывода на - экран информационного текста, а второе для конвейера команд:</para> - - <programlisting>update-etc-shells: + <filename>pkg-*</filename>, которые мы ещё не описали, но они + иногда могут быть очень кстати.</para> + + <sect1 xml:id="porting-message"> + <title><filename>pkg-message</filename></title> + + <para>Если вам нужно вывести сообщение для человека, + устанавливающего приложение, то вы можете поместить сообщение в + файл <filename>pkg-message</filename>. Эта возможность часто + оказывается полезной для вывода дополнительных шагов установки, + которые нужно предпринять после выполнения команды + <command>pkg install</command>, или для вывода информации о + лицензировании.</para> + + <para>Если должны выводиться некоторые строки о knobs времени + построения или предупреждения, используйте + <varname>ECHO_MSG</varname>. Файл + <filename>pkg-message</filename> только для послеустановочных + шагов. Также следует иметь в виду различие между + <varname>ECHO_MSG</varname> и <varname>ECHO_CMD</varname>. + Первое предназначено для вывода на экран информационного + текста, а второе для конвейера команд:</para> + + <programlisting>update-etc-shells: @${ECHO_MSG} "updating /etc/shells" @${CP} /etc/shells /etc/shells.bak @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \ ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells @${RM} /etc/shells.bak</programlisting> - <note> - <para>Файл <filename>pkg-message</filename> не нужно добавлять в - <filename>pkg-plist</filename>.</para> - </note> - </sect1> - - <sect1 xml:id="pkg-install"> - <title><filename>pkg-install</filename></title> - - <para>Если при установке бинарного пакета по команде - <command>pkg add</command> или <command>pkg install</command> - вашему порту нужно выполнить какие-то команды, то вы можете - это сделать с помощью скрипта <filename>pkg-install</filename>. - Этот скрипт будет автоматически добавлен к пакету и будет - дважды запускаться командой <command>pkg</command>: первый раз - в виде <literal>${SH} pkg-install ${PKGNAME} - PRE-INSTALL</literal>, а второй раз как - <literal>${SH} {PKGNAME} POST-INSTALL</literal>. - Для распознавания того, в каком режиме запущен скрипт, можно - использовать параметр <literal>$2</literal>. Переменная - окружения <envar>PKG_PREFIX</envar> будет принимать значение, - соответствующее каталогу, в который устанавливается пакет.</para> - - <note> - <para>Этот скрипт не запускается автоматически, если вы - устанавливаете порт командой <command>make install</command>. - Если же вам действительно необходимо его запустить, то запустите - его явно из файла <filename>Makefile</filename> порта строкой - вида <literal>PKG_PREFIX=${PREFIX} ${SH} $ - {PKGINSTALL}${PKGNAME} PRE-INSTALL</literal>.</para> - </note> - </sect1> - - <sect1 xml:id="pkg-deinstall"> - <title><filename>pkg-deinstall</filename></title> - - <para>Этот скрипт вызывается при удалении пакета.</para> - - <para>Этот скрипт будет дважды запускаться командой - <command>pkg delete</command>. - Первый раз как <literal>${SH} pkg-deinstall - ${PKGNAME} DEINSTALL</literal>, а второй раз как - <literal>${SH} pkg-deinstall ${PKGNAME} - POST-DEINSTALL</literal>.</para> - </sect1> - - <sect1 xml:id="pkg-names"> - <title xml:id="porting-pkgfiles">Изменение имён файлов - <filename>pkg-*</filename></title> - - <para>Все имена файлов - <filename>pkg-*</filename> - определяются с помощью переменных, так что вы можете изменить их, - если это нужно, в вашем файле <filename>Makefile</filename>. Это - особенно полезно, если вы используете одни и те же файлы - <filename>pkg-*</filename> - совместно между несколькими портами или - пишете в один из вышеперечисленных файлов (в главе о <link linkend="porting-wrkdir">записи в каталоги, отличные от - <varname>WRKDIR</varname></link> объяснено, почему не рекомендуется - осуществлять запись непосредственно в файлы - <filename>pkg-*</filename>.</para> - - <para>Вот список имён переменных и их значений по умолчанию. (Значение - <varname>PKGDIR</varname> по умолчанию равно - <varname>${MASTERDIR}</varname>.)</para> - - <informaltable frame="none" pgwide="0"> - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение по умолчанию</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>DESCR</varname></entry> - <entry><literal>${PKGDIR}/pkg-descr</literal></entry> - </row> - - <row> - <entry><varname>PLIST</varname></entry> - <entry><literal>${PKGDIR}/pkg-plist</literal></entry> - </row> - - <row> - <entry><varname>PKGINSTALL</varname></entry> - <entry><literal>${PKGDIR}/pkg-install</literal></entry> - </row> - - <row> - <entry><varname>PKGMESSAGE</varname></entry> - <entry><literal>${PKGDIR}/pkg-message</literal></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Пожалуйста, изменяйте значения этих переменных, а не - переопределяйте <varname>PKG_ARGS</varname>. Если вы измените - значение переменных <varname>PKG_ARGS</varname>, то эти файлы при - установке из порта будут установлены в каталог - <filename>/var/db/pkg</filename> некорректно.</para> - </sect1> - - <sect1 xml:id="using-sub-files"> - <title>Использование <varname>SUB_FILES</varname> и - <varname>SUB_LIST</varname></title> - - <para>Переменные <varname>SUB_FILES</varname> и - <varname>SUB_LIST</varname> подходят для задания в файлах порта - динамических значений, таких как <varname>PREFIX</varname> установки - в <filename>pkg-message</filename>.</para> - - <para>В переменной <varname>SUB_FILES</varname> указывается перечень - файлов для автоматического изменения. Каждый - <replaceable>file</replaceable> из перечня <varname>SUB_FILES</varname> - обязан иметь соответствующий - <filename>file.in</filename>, - присутствующий в <varname>FILESDIR</varname>. Измененная версия - будет создана в <varname>WRKDIR</varname>. Файлы, определенные в - качестве значения <varname>USE_RC_SUBR</varname> (или устаревшего - <varname>USE_RCORDER</varname>), автоматически добавляются в - <varname>SUB_FILES</varname>. Для файлов - <filename>pkg-message</filename>, <filename>pkg-install</filename> - и <filename>pkg-deinstall</filename> - устанавливается соответствующая переменная Makefile, указывающая на - обработанную версию.</para> - - <para>Переменная <varname>SUB_LIST</varname> содержит перечень пар - <literal>VAR=VALUE</literal>. В каждом файле из - <varname>SUB_FILES</varname> для каждой пары будет произведена - замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>. - Некоторые общие пары определяются автоматически: - <varname>PREFIX</varname>, <varname>LOCALBASE</varname>, - <varname>DATADIR</varname>, - <varname>DOCSDIR</varname>, <varname>EXAMPLESDIR</varname>, - <varname>WWWDIR</varname> и <varname>ETCDIR</varname>. - Любая строка, начинающаяся с <literal>@comment</literal>, будет - удалена из конечного файла после подстановки переменной.</para> - - <para>В следующем примере в <filename>pkg-message</filename> - будет сделана замена <literal>%%ARCH%%</literal> на системную - архитектуру:</para> - - <programlisting>SUB_FILES= pkg-message -SUB_LIST= ARCH=${ARCH}</programlisting> - - <para>Обратите внимание, что в этом примере в <varname>FILESDIR</varname> - обязательно существование файла <filename>pkg-message.in</filename>. - </para> - - <para>Пример хорошего <filename>pkg-message.in</filename>:</para> - - <programlisting>Now it's time to configure this package. + <note> + <para>Файл <filename>pkg-message</filename> не нужно добавлять в + <filename>pkg-plist</filename>.</para> + </note> + </sect1> + + <sect1 xml:id="pkg-install"> + <title><filename>pkg-install</filename></title> + + <para>Если при установке бинарного пакета по команде + <command>pkg add</command> или <command>pkg install</command> + вашему порту нужно выполнить какие-то команды, то вы можете это + сделать с помощью скрипта <filename>pkg-install</filename>. + Этот скрипт будет автоматически добавлен к пакету и будет + дважды запускаться командой <command>pkg</command>: первый раз + в виде <literal>${SH} pkg-install ${PKGNAME} + PRE-INSTALL</literal>, а второй раз как + <literal>${SH} {PKGNAME} POST-INSTALL</literal>. Для + распознавания того, в каком режиме запущен скрипт, можно + использовать параметр <literal>$2</literal>. Переменная + окружения <envar>PKG_PREFIX</envar> будет принимать значение, + соответствующее каталогу, в который устанавливается + пакет.</para> + + <note> + <para>Этот скрипт не запускается автоматически, если вы + устанавливаете порт командой <command>make install</command>. + Если же вам действительно необходимо его запустить, то + запустите его явно из файла <filename>Makefile</filename> + порта строкой вида <literal>PKG_PREFIX=${PREFIX} + ${SH} $ {PKGINSTALL}${PKGNAME} + PRE-INSTALL</literal>.</para> + </note> + </sect1> + + <sect1 xml:id="pkg-deinstall"> + <title><filename>pkg-deinstall</filename></title> + + <para>Этот скрипт вызывается при удалении пакета.</para> + + <para>Этот скрипт будет дважды запускаться командой + <command>pkg delete</command>. Первый раз как + <literal>${SH} pkg-deinstall ${PKGNAME} + DEINSTALL</literal>, а второй раз как <literal>${SH} + pkg-deinstall ${PKGNAME} + POST-DEINSTALL</literal>.</para> + </sect1> + + <sect1 xml:id="pkg-names"> + <title xml:id="porting-pkgfiles">Изменение имён файлов + <filename>pkg-*</filename></title> + + <para>Все имена файлов <filename>pkg-*</filename> определяются с + помощью переменных, так что вы можете изменить их, если это + нужно, в вашем файле <filename>Makefile</filename>. Это + особенно полезно, если вы используете одни и те же файлы + <filename>pkg-*</filename> совместно между несколькими портами + или пишете в один из вышеперечисленных файлов (в главе о <link + linkend="porting-wrkdir">записи в каталоги, отличные от + <varname>WRKDIR</varname></link> объяснено, почему не + рекомендуется осуществлять запись непосредственно в файлы + <filename>pkg-*</filename>.</para> + + <para>Вот список имён переменных и их значений по умолчанию. + (Значение <varname>PKGDIR</varname> по умолчанию равно + <varname>${MASTERDIR}</varname>.)</para> + + <informaltable frame="none" pgwide="0"> + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение по умолчанию</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>DESCR</varname></entry> + <entry><literal>${PKGDIR}/pkg-descr</literal></entry> + </row> + + <row> + <entry><varname>PLIST</varname></entry> + <entry><literal>${PKGDIR}/pkg-plist</literal></entry> + </row> + + <row> + <entry><varname>PKGINSTALL</varname></entry> + <entry><literal>${PKGDIR}/pkg-install</literal></entry> + </row> + + <row> + <entry><varname>PKGDEINSTALL</varname></entry> + <entry><literal>${PKGDIR}/pkg-deinstall</literal></entry> + </row> + + <row> + <entry><varname>PKGMESSAGE</varname></entry> + <entry><literal>${PKGDIR}/pkg-message</literal></entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>Пожалуйста, изменяйте значения этих переменных, а не + переопределяйте <varname>PKG_ARGS</varname>. Если вы измените + значение переменных <varname>PKG_ARGS</varname>, то эти файлы + при установке из порта будут установлены в каталог + <filename>/var/db/pkg</filename> некорректно.</para> + </sect1> + + <sect1 xml:id="using-sub-files"> + <title>Использование <varname>SUB_FILES</varname> и + <varname>SUB_LIST</varname></title> + + <para>Переменные <varname>SUB_FILES</varname> и + <varname>SUB_LIST</varname> подходят для задания в файлах порта + динамических значений, таких как <varname>PREFIX</varname> + установки в <filename>pkg-message</filename>.</para> + + <para>В переменной <varname>SUB_FILES</varname> указывается + перечень файлов для автоматического изменения. Каждый + <replaceable>file</replaceable> из перечня + <varname>SUB_FILES</varname> обязан иметь соответствующий + <filename>file.in</filename>, присутствующий в + <varname>FILESDIR</varname>. Измененная версия будет создана в + <varname>WRKDIR</varname>. Файлы, определенные в качестве + значения <varname>USE_RC_SUBR</varname> (или устаревшего + <varname>USE_RCORDER</varname>), автоматически добавляются в + <varname>SUB_FILES</varname>. Для файлов + <filename>pkg-message</filename>, + <filename>pkg-install</filename> и + <filename>pkg-deinstall</filename> устанавливается + соответствующая переменная Makefile, указывающая на + обработанную версию.</para> + + <para>Переменная <varname>SUB_LIST</varname> содержит перечень + пар <literal>VAR=VALUE</literal>. В каждом файле из + <varname>SUB_FILES</varname> для каждой пары будет произведена + замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>. + Некоторые общие пары определяются автоматически: + <varname>PREFIX</varname>, <varname>LOCALBASE</varname>, + <varname>DATADIR</varname>, <varname>DOCSDIR</varname>, + <varname>EXAMPLESDIR</varname>, <varname>WWWDIR</varname> и + <varname>ETCDIR</varname>. Любая строка, начинающаяся с + <literal>@comment</literal>, будет удалена из конечного файла + после подстановки переменной.</para> + + <para>В следующем примере в <filename>pkg-message</filename> + будет сделана замена <literal>%%ARCH%%</literal> на системную + архитектуру:</para> + + <programlisting>SUB_FILES= pkg-message +SUB_LIST= ARCH=${ARCH}</programlisting> + + <para>Обратите внимание, что в этом примере в + <varname>FILESDIR</varname> обязательно существование файла + <filename>pkg-message.in</filename>.</para> + + <para>Пример хорошего <filename>pkg-message.in</filename>:</para> + + <programlisting>Now it is time to configure this package. Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory as .putsy.conf and edit it.</programlisting> - - </sect1> - </chapter> - + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml index bd6e088c04..ffc701f7d6 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/plist/chapter.xml @@ -7,278 +7,292 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="plist"> - - <title>Продвинутые практики <filename>pkg-plist</filename></title> - <sect1 xml:id="plist-sub"> - <title>Изменение содержимого <filename>pkg-plist</filename> в зависимости - от make-переменных</title> - - <para>Некоторые порты, в частности, порты <literal>p5-</literal>, должны - менять содержимое своих файлов <filename>pkg-plist</filename> в - зависимости от того, с какими параметрами они были отконфигурированы - (или в зависимости от версии языка <literal>perl</literal> в случае - портов <literal>p5-</literal>). Чтобы облегчить этот - процесс, любые вхождения ключевых слов <literal>%%OSREL%%</literal>, - <literal>%%PERL_VER%%</literal> и <literal>%%PERL_VERSION%%</literal> - в файле <filename>pkg-plist</filename> будут заменяться соответствующими - значениями. Значением <literal>%%OSREL%%</literal> является номер - версии операционной системы (например, <literal>4.9</literal>). - <literal>%%PERL_VERSION%%</literal> и <literal>%%PERL_VER%%</literal> - обозначают полный номер версии <command>perl</command> (например, - <literal>5.8.9</literal>). Некоторые - другие <literal>%%VARS%%</literal>, имеющие - отношение к файлам документации порта, описаны в <link linkend="install-documentation">соответствующем разделе</link>.</para> - - <para>Если вам нужно сделать другие подстановки, вы можете указать в - переменной <varname>PLIST_SUB</varname> список пар - <literal>VAR=VALUE</literal>, - и все вхождения <literal>%%VAR%%</literal> - в файле <filename>pkg-plist</filename> будут заменяться на значение - <replaceable>VALUE</replaceable>.</para> - - <para>Например, если у вас имеется порт, который устанавливает много - файлов в каталог, зависящий от версии, вы можете задать нечто - типа</para> - - <programlisting>OCTAVE_VERSION= 2.0.13 +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="plist"> + + <title>Продвинутые практики <filename>pkg-plist</filename></title> + + <sect1 xml:id="plist-sub"> + <title>Изменение содержимого <filename>pkg-plist</filename> в + зависимости от make-переменных</title> + + <para>Некоторые порты, в частности, порты <literal>p5-</literal>, + должны менять содержимое своих файлов + <filename>pkg-plist</filename> в зависимости от того, с какими + параметрами они были отконфигурированы (или в зависимости от + версии языка <literal>perl</literal> в случае портов + <literal>p5-</literal>). Чтобы облегчить этот процесс, любые + вхождения ключевых слов <literal>%%OSREL%%</literal>, + <literal>%%PERL_VER%%</literal> и + <literal>%%PERL_VERSION%%</literal> в файле + <filename>pkg-plist</filename> будут заменяться + соответствующими значениями. Значением + <literal>%%OSREL%%</literal> является номер версии операционной + системы (например, <literal>4.9</literal>). + <literal>%%PERL_VERSION%%</literal> и + <literal>%%PERL_VER%%</literal> обозначают полный номер версии + <command>perl</command> (например, <literal>5.8.9</literal>). + Некоторые другие <literal>%%VARS%%</literal>, имеющие отношение + к файлам документации порта, описаны в <link + linkend="install-documentation">соответствующем + разделе</link>.</para> + + <para>Если вам нужно сделать другие подстановки, вы можете + указать в переменной <varname>PLIST_SUB</varname> список пар + <literal>VAR=VALUE</literal>, и все вхождения + <literal>%%VAR%%</literal> в файле + <filename>pkg-plist</filename> будут заменяться на значение + <replaceable>VALUE</replaceable>.</para> + + <para>Например, если у вас имеется порт, который устанавливает + много файлов в каталог, зависящий от версии, вы можете задать + нечто типа</para> + + <programlisting>OCTAVE_VERSION= 2.0.13 PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> - <para>в файле <filename>Makefile</filename> и использовать - <literal>%%OCTAVE_VERSION%%</literal> везде, где нужно указать - номер версии в файле <filename>pkg-plist</filename>. Таким образом, - при обновлении порта вам не нужно будет менять десятки (а в некоторых - случаях и сотни) строк в файле <filename>pkg-plist</filename>.</para> - - <para>Если ваш порт устанавливает файлы в соответствии с установленными - в порту опциями, то обычным способом управления является добавление - префиксов <literal>%%TAG%%</literal> для строк - <filename>pkg-plist</filename> с добавлением этого - <literal>TAG</literal> в переменную <varname>PLIST_SUB</varname> - внутри <filename>Makefile</filename> со специальным значением - <literal>@comment</literal>, которое указывает пакетным инструментам - игнорировать эти строки:</para> - - <programlisting>.if defined(WITH_X11) + <para>в файле <filename>Makefile</filename> и использовать + <literal>%%OCTAVE_VERSION%%</literal> везде, где нужно указать + номер версии в файле <filename>pkg-plist</filename>. Таким + образом, при обновлении порта вам не нужно будет менять десятки + (а в некоторых случаях и сотни) строк в файле + <filename>pkg-plist</filename>.</para> + + <para>Если ваш порт устанавливает файлы в соответствии с + установленными в порту опциями, то обычным способом управления + является добавление префиксов <literal>%%TAG%%</literal> для + строк <filename>pkg-plist</filename> с добавлением этого + <literal>TAG</literal> в переменную + <varname>PLIST_SUB</varname> внутри + <filename>Makefile</filename> со специальным значением + <literal>@comment</literal>, которое указывает пакетным + инструментам игнорировать эти строки:</para> + + <programlisting>.if defined(WITH_X11) PLIST_SUB+= X11="" .else PLIST_SUB+= X11="@comment " .endif</programlisting> - <para>и в самом <filename>pkg-plist</filename>:</para> - - <programlisting>%%X11%%bin/foo-gui</programlisting> - - <para>Эта подстановка будет сделана - между выполнением целей <buildtarget>pre-install</buildtarget> и - <buildtarget>do-install</buildtarget>, посредством чтения файла - <filename>PLIST</filename> и записью в файл - <filename>TMPPLIST</filename> - (по умолчанию это файл - <filename>WRKDIR/.PLIST.mktmp</filename>). Так - что если ваш порт строит <filename>PLIST</filename> на лету, делайте - это во время или до выполнения цели - <buildtarget>pre-install</buildtarget>. Кроме того, если вашему порту - требуется отредактировать получающийся файл, делайте это в цели - <buildtarget>post-install</buildtarget> изменением файла - <filename>TMPPLIST</filename>.</para> - - <para>Другой способ изменения списка сборки порта основан на - определении значений переменных <varname>PLIST_FILES</varname>, - <varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname>. - Каждое из них рассматривается как перечень путей для записи в - <filename>TMPPLIST</filename> содержимого - <filename>PLIST</filename>. Имена, перечисленные - в <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname> подвергаются подстановке - <literal>%%VAR%%</literal>, как описано - выше. За исключением этого, имена из <varname>PLIST_FILES</varname> - будут появляться в окончательном варианте перечня сборки без - изменений, тогда как <literal>@dirrm</literal> и - <literal>@dirrmtry</literal> будут соответственно предшествовать - именам из <varname>PLIST_DIRS</varname> и - <varname>PLIST_DIRSTRY</varname>. Для того чтобы изменения - вступили в силу, <varname>PLIST_FILES</varname>, - <varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname> - должны задаваться до того, как будет - записываться <filename>TMPPLIST</filename>, то - есть в цели <buildtarget>pre-install</buildtarget> или ещё - раньше.</para> - </sect1> - - <sect1 xml:id="plist-cleaning"> - <title>Пустые каталоги</title> - - <sect2 xml:id="plist-dir-cleaning"> - <title>Очистка пустых каталогов</title> - - <para>Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это - достигается добавлением строк <literal>@dirrm</literal> для всех - каталогов, которые создаются этим портом. Вам нужно удалить - подкаталоги до того, как вы сможете удалить родительские - каталоги.</para> - - <programlisting> - : + <para>и в самом <filename>pkg-plist</filename>:</para> + + <programlisting>%%X11%%bin/foo-gui</programlisting> + + <para>Эта подстановка будет сделана между выполнением целей + <buildtarget>pre-install</buildtarget> и + <buildtarget>do-install</buildtarget>, посредством чтения файла + <filename>PLIST</filename> и записью в файл + <filename>TMPPLIST</filename> (по умолчанию это файл + <filename>WRKDIR/.PLIST.mktmp</filename>). Так что если ваш + порт строит <filename>PLIST</filename> на лету, делайте это во + время или до выполнения цели + <buildtarget>pre-install</buildtarget>. Кроме того, если + вашему порту требуется отредактировать получающийся файл, + делайте это в цели <buildtarget>post-install</buildtarget> + изменением файла <filename>TMPPLIST</filename>.</para> + + <para>Другой способ изменения списка сборки порта основан на + определении значений переменных <varname>PLIST_FILES</varname>, + <varname>PLIST_DIRS</varname> и + <varname>PLIST_DIRSTRY</varname>. Каждое из них + рассматривается как перечень путей для записи в + <filename>TMPPLIST</filename> содержимого + <filename>PLIST</filename>. Имена, перечисленные в + <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> и + <varname>PLIST_DIRSTRY</varname> подвергаются подстановке + <literal>%%VAR%%</literal>, как описано выше. За исключением + этого, имена из <varname>PLIST_FILES</varname> будут появляться + в окончательном варианте перечня сборки без изменений, тогда + как <literal>@dirrm</literal> и <literal>@dirrmtry</literal> + будут соответственно предшествовать именам из + <varname>PLIST_DIRS</varname> и + <varname>PLIST_DIRSTRY</varname>. Для того чтобы изменения + вступили в силу, <varname>PLIST_FILES</varname>, + <varname>PLIST_DIRS</varname> и + <varname>PLIST_DIRSTRY</varname> должны задаваться до того, как + будет записываться <filename>TMPPLIST</filename>, то есть в + цели <buildtarget>pre-install</buildtarget> или ещё + раньше.</para> + </sect1> + + <sect1 xml:id="plist-cleaning"> + <title>Пустые каталоги</title> + + <sect2 xml:id="plist-dir-cleaning"> + <title>Очистка пустых каталогов</title> + + <para>Заставьте ваш порты удалять пустые каталоги при удалении. + Обычно это достигается добавлением строк + <literal>@dirrm</literal> для всех каталогов, которые + создаются этим портом. Вам нужно удалить подкаталоги до + того, как вы сможете удалить родительские каталоги.</para> + + <programlisting> : lib/X11/oneko/pixmaps/cat.xpm lib/X11/oneko/sounds/cat.au : @dirrm lib/X11/oneko/pixmaps @dirrm lib/X11/oneko/sounds -@dirrm lib/X11/oneko - </programlisting> +@dirrm lib/X11/oneko</programlisting> - <para>Однако, иногда <literal>@dirrm</literal> будет выдавать ошибки, - потому что другие порты используют тот же самый подкаталог. Вы - можете использовать <literal>@dirrmtry</literal> для удаления - только пустых каталогов без выдачи предупреждений.</para> + <para>Однако, иногда <literal>@dirrm</literal> будет выдавать + ошибки, потому что другие порты используют тот же самый + подкаталог. Вы можете использовать + <literal>@dirrmtry</literal> для удаления только пустых + каталогов без выдачи предупреждений.</para> <programlisting>@dirrmtry share/doc/gimp</programlisting> - <para>Эта команда не выведет никаких сообщений об ошибках и не вызовет - аварийного завершения работы <command>pkg delete</command> - (см. &man.pkg-delete.8;), даже если - каталог <filename>${PREFIX}/share/doc/gimp</filename> + <para>Эта команда не выведет никаких сообщений об ошибках и не + вызовет аварийного завершения работы + <command>pkg delete</command> (см. &man.pkg-delete.8;), даже + если каталог <filename>${PREFIX}/share/doc/gimp</filename> не пуст из-за того, что другие порты установили сюда какие-то файлы.</para> - </sect2> - - <sect2 xml:id="plist-dir-empty"> - <title>Создание пустых каталогов</title> - - <para>Пустым каталогам, создаваемым во время установки порта, нужно - особое внимание. Они не будут созданы при установке пакета, потому - что пакеты содержат только файлы, а <command>pkg add</command> - и <command>pkg install</command> создают для них - каталоги по мере надобности. Чтобы убедиться, что пустой каталог - создается при установке пакета, добавьте эту строку в - <filename>pkg-plist</filename> перед соответствующей строкой - <literal>@dirrm</literal>:</para> - - <programlisting>@exec mkdir -p %D/share/foo/templates</programlisting> - </sect2> - - </sect1> - - <sect1 xml:id="plist-config"> - <title>Конфигурационные файлы</title> - - <para>Если ваш порт устанавливает конфигурационные файлы в каталог - <filename>PREFIX/etc</filename> (или куда-то еще), - <emphasis>не</emphasis> делайте их простого перечисления в файле - <filename>pkg-plist</filename>. Это приведёт к тому, что по команде - <command>pkg delete</command> или при новой установке файлы, - тщательно отредактированные и настроенные пользователем, будут - уничтожены.</para> - - <para>Вместо этого установите файл(ы) с примерами с расширением - <filename>filename.sample</filename>. - Затем скопируйте файл с примером на место настоящего файла - конфигурации, если таковой ещё не существует. При деинсталляции - удаляйте файл конфигурации только в том случае, если он идентичен - файлу с расширением <filename>.sample</filename>. Вам - нужно управлять этим в <filename>Makefile</filename> и в - <filename>pkg-plist</filename> (для установки из пакета).</para> - - <para>Пример части <filename>Makefile</filename>:</para> - - <programlisting>post-install: + </sect2> + + <sect2 xml:id="plist-dir-empty"> + <title>Создание пустых каталогов</title> + + <para>Пустым каталогам, создаваемым во время установки порта, + нужно особое внимание. Они не будут созданы при установке + пакета, потому что пакеты содержат только файлы, а + <command>pkg add</command> и <command>pkg install</command> + создают для них каталоги по мере надобности. Чтобы + убедиться, что пустой каталог создается при установке пакета, + добавьте эту строку в <filename>pkg-plist</filename> перед + соответствующей строкой <literal>@dirrm</literal>:</para> + + <programlisting>@exec mkdir -p %D/share/foo/templates</programlisting> + </sect2> + </sect1> + + <sect1 xml:id="plist-config"> + <title>Конфигурационные файлы</title> + + <para>Если ваш порт устанавливает конфигурационные файлы в + каталог <filename>PREFIX/etc</filename> (или куда-то еще), + <emphasis>не</emphasis> делайте их простого перечисления в + файле <filename>pkg-plist</filename>. Это приведёт к тому, что + по команде <command>pkg delete</command> или при новой + установке файлы, тщательно отредактированные и настроенные + пользователем, будут уничтожены.</para> + + <para>Вместо этого установите файл(ы) с примерами с расширением + <filename>filename.sample</filename>. Затем скопируйте файл с + примером на место настоящего файла конфигурации, если таковой + ещё не существует. При деинсталляции удаляйте файл + конфигурации только в том случае, если он идентичен файлу с + расширением <filename>.sample</filename>. Вам нужно управлять + этим в <filename>Makefile</filename> и в + <filename>pkg-plist</filename> (для установки из + пакета).</para> + + <para>Пример части <filename>Makefile</filename>:</para> + + <programlisting>post-install: @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \ ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${STAGEDIR}${PREFIX}/etc/orbit.conf ; \ fi</programlisting> - <para>Добавьте по три строки в <filename>pkg-plist</filename> для - каждого конфигурационного файла, как показано ниже:</para> + <para>Добавьте по три строки в <filename>pkg-plist</filename> для + каждого конфигурационного файла, как показано ниже:</para> - <programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi + <programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi etc/orbit.conf.sample @exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi</programlisting> - <para>Данные строки являются упорядоченными. На этапе удаления - файл с примером сравнивается с рабочим конфигурационным файлом. - Полное совпадение означает отсутствие каких-либо изменений в - рабочем файле со стороны пользователя, и следовательно этот файл - может быть безопасно удалён. Так как файл с примером всё ещё - должен существовать для сравнения, строка <literal>@unexec</literal> - следует перед именем файла с примером конфигурации. На этапе - установки, если рабочий файл конфигурации отсутствует, он - копируется из файла с примером. Файл с примером обязательно - должен быть установлен до операции копирования, поэтому строка - <literal>@exec</literal> следует после имени файла с примером - конфигурации.</para> - - <para>Для получения дополнительного отладочного вывода на экран - можно временно удалить параметр <literal>-s</literal> из команды - &man.cmp.1;.</para> - - <para>Для получения дополнительной инфорации по использованию - <literal>%D</literal> и прочих маркеров подстановки обратитесь - к странице Справочника &man.pkg-create.8;.</para> - - <para>Если существует действительно стоящая причина не устанавливать - рабочий файл конфигурации по умолчанию, уберите строку - <literal>@exec</literal> из <filename>pkg-plist</filename> и - добавьте <link linkend="porting-message">сообщение</link>, - указывающее на то, что пользователь обязан скопировать и - отредактировать этот файл перед тем, как программное обеспечение - начнёт работать.</para> - </sect1> - - <sect1 xml:id="plist-dynamic"> - <title>Динамический или статический список упаковки</title> - - <para><emphasis>Статический список упаковки</emphasis> — это список - упаковки, который доступен в Коллекции Портов или как файл - <filename>pkg-plist</filename> (с подстановкой переменных или без - неё), или как встроенный в <filename>Makefile</filename> посредством - <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname>. - Даже если содержимое является автоматически порождаемым при помощи - инструмента или в результате выполнения цели в Makefile - <emphasis>до</emphasis> включения в Коллекцию Портов коммиттером, - то список всё ещё будет считаться статическим, поскольку его - можно узнать без необходимости скачивания или компиляции - дистрибутива.</para> - - <para><emphasis>Динамический список упаковки</emphasis> это список - упаковки, который получается во время компиляции порта и строится - на основе устанавливаемых файлов и каталогов. Узнать такой список - невозможно до того, как исходный код портируемого приложения - будет скачен и скомпилирован, или после запуска - <literal>make clean</literal>.</para> - - <para>Хотя использование динамических список упаковки не запрещено, - сопровождающие должны использовать статические списки упаковки - везде, где это возможно, поскольку это позволяет пользователям - выполнять &man.grep.1; по доступным портам для обнаружения, например, - который порт устанавливает определенный файл. Динамические списки - должны быть использованы в основном для сложных портов, для которых - изменения в списке упаковки кардинальным образом основаны на - необязательных возможностях порта (и, таким образом, делая - сопровождение статических списков упаковки невозможным), или портов, - которые изменяют список упаковки на основе версии используемого - им программного обеспечения (например, порты, которые порождают - документы при помощи <application>Javadoc</application>).</para> - </sect1> + <para>Данные строки являются упорядоченными. На этапе удаления + файл с примером сравнивается с рабочим конфигурационным файлом. + Полное совпадение означает отсутствие каких-либо изменений в + рабочем файле со стороны пользователя, и следовательно этот + файл может быть безопасно удалён. Так как файл с примером всё + ещё должен существовать для сравнения, строка + <literal>@unexec</literal> следует перед именем файла с + примером конфигурации. На этапе установки, если рабочий файл + конфигурации отсутствует, он копируется из файла с примером. + Файл с примером обязательно должен быть установлен до операции + копирования, поэтому строка <literal>@exec</literal> следует + после имени файла с примером конфигурации.</para> + + <para>Для получения дополнительного отладочного вывода на экран + можно временно удалить параметр <literal>-s</literal> из + команды &man.cmp.1;.</para> + + <para>Для получения дополнительной инфорации по использованию + <literal>%D</literal> и прочих маркеров подстановки обратитесь + к странице Справочника &man.pkg-create.8;.</para> + + <para>Если существует действительно стоящая причина не + устанавливать рабочий файл конфигурации по умолчанию, уберите + строку <literal>@exec</literal> из + <filename>pkg-plist</filename> и добавьте <link + linkend="porting-message">сообщение</link>, указывающее на + то, что пользователь обязан скопировать и отредактировать этот + файл перед тем, как программное обеспечение начнёт + работать.</para> + </sect1> + + <sect1 xml:id="plist-dynamic"> + <title>Динамический или статический список упаковки</title> + + <para><emphasis>Статический список упаковки</emphasis> — + это список упаковки, который доступен в Коллекции Портов или + как файл <filename>pkg-plist</filename> (с подстановкой + переменных или без неё), или как встроенный в + <filename>Makefile</filename> посредством + <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> и + <varname>PLIST_DIRSTRY</varname>. Даже если содержимое + является автоматически порождаемым при помощи инструмента или в + результате выполнения цели в Makefile <emphasis>до</emphasis> + включения в Коллекцию Портов коммиттером, то список всё ещё + будет считаться статическим, поскольку его можно узнать без + необходимости скачивания или компиляции дистрибутива.</para> + + <para><emphasis>Динамический список упаковки</emphasis> это + список упаковки, который получается во время компиляции порта и + строится на основе устанавливаемых файлов и каталогов. Узнать + такой список невозможно до того, как исходный код портируемого + приложения будет скачен и скомпилирован, или после запуска + <literal>make clean</literal>.</para> + + <para>Хотя использование динамических список упаковки не + запрещено, сопровождающие должны использовать статические + списки упаковки везде, где это возможно, поскольку это + позволяет пользователям выполнять &man.grep.1; по доступным + портам для обнаружения, например, который порт устанавливает + определенный файл. Динамические списки должны быть + использованы в основном для сложных портов, для которых + изменения в списке упаковки кардинальным образом основаны на + необязательных возможностях порта (и, таким образом, делая + сопровождение статических списков упаковки невозможным), или + портов, которые изменяют список упаковки на основе версии + используемого им программного обеспечения (например, порты, + которые порождают документы при помощи + <application>Javadoc</application>).</para> + </sect1> <sect1 xml:id="plist-autoplist"> <title>Автоматическое создание списка упаковки</title> <para>Первым делом убедитесь, что ваш порт практически полностью - завершён и осталось создать только <filename>pkg-plist</filename>. - После этого вы можете запустить <command>make makeplist</command> - для автоматического создания <filename>pkg-plist</filename>. - Содержимое этого файла должно быть дважды перепроверено.</para> + завершён и осталось создать только + <filename>pkg-plist</filename>. После этого вы можете + запустить <command>make makeplist</command> для автоматического + создания <filename>pkg-plist</filename>. Содержимое этого + файла должно быть дважды перепроверено.</para> <para>Пользовательские конфигурационные файлы должны быть удалены - или быть установлены как - <filename>filename.sample</filename>. - Файл <filename>info/dir</filename> включать в список не нужно, но - должны быть добавлены соответствующие строчки - <filename>install-info</filename>, так, как это описано в разделе о <link linkend="makefile-info">файлах в формате info</link>. Все - библиотеки, устанавливаемые портом, должны быть перечислены так, как - это описано в разделе о <link linkend="porting-shlibs">динамических библиотеках</link>.</para> + или быть установлены как <filename>filename.sample</filename>. + Файл <filename>info/dir</filename> включать в список не нужно, + но должны быть добавлены соответствующие строчки + <filename>install-info</filename>, так, как это описано в + разделе о <link + linkend="makefile-info">файлах в формате info</link>. Все + библиотеки, устанавливаемые портом, должны быть перечислены + так, как это описано в разделе о <link + linkend="porting-shlibs">динамических + библиотеках</link>.</para> </sect1> - - </chapter> - +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml index c932281198..87e93e663b 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/porting-dads/chapter.xml @@ -7,396 +7,404 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="porting-dads"> - - <title>Что делать нужно, и что делать нельзя</title> - - <sect1 xml:id="dads-intro"> - <title>Введение</title> - - <para>Вот список часто встречающихся действий, которые нужно и которые - нельзя делать во время процесса портирования. Проверьте - порт по этому списку, и также проверьте порты в - <link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе - сообщений PR</link>, которые присланы другими людьми. Присылайте - любые комментарии о портах, которые вы проверили, так, как это описано - в статье о <link xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL"> - Сообщениях об ошибках и общих замечаниях</link>. Проверка портов в - базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, - что вы знаете, что делаете.</para> - </sect1> - - <sect1 xml:id="porting-wrkdir"> - <title><varname>WRKDIR</varname></title> - - <para>Не пишите ничего в файлы вне каталога <varname>WRKDIR</varname>. - Каталог <varname>WRKDIR</varname> является единственным местом, - которое гарантированно будет доступно для записи во время построения - порта (обратитесь к главе о <link xlink:href="&url.books.handbook;/ports-using.html#PORTS-CD">установке портов с - CDROM</link> за - примером построения портов из дерева, доступного только для чтения). - Если вам нужно изменить какой-либо из файлов - <filename>pkg-*</filename>, сделайте это, - <link linkend="porting-pkgfiles">переопределив переменную</link>, но не - перезаписывая их.</para> - </sect1> - - <sect1 xml:id="porting-wrkdirprefix"> - <title><varname>WRKDIRPREFIX</varname></title> - - <para>Добейтесь того, чтобы ваш порт принимал во внимание значение - переменной <varname>WRKDIRPREFIX</varname>. Большинство портов об - этом не заботятся. В частности, если вы обращаетесь к каталогу - <varname>WRKDIR</varname> другого порта, заметьте, что его правильным - местоположением является - <filename>WRKDIRPREFIXPORTSDIR/subdir/name/work</filename> not <filename>PORTSDIR/subdir/work</filename> - или <filename>.CURDIR/../../subdir/name/work</filename> - или что-то подобное.</para> - - <para>Кроме того, если вы сами задаете <varname>WRKDIR</varname>, то - должны поставить перед ним знак - <literal>${WRKDIRPREFIX}${.CURDIR}</literal>.</para> - </sect1> - - <sect1 xml:id="porting-versions"> - <title>Различение операционных систем и версий ОС</title> - - <para>Вы можете встретиться с кодом, который требует модификаций - или условной компиляции в зависимости от того, с какой версией &os; - Unix он работает. Предпочтительным способом отделения кода для - версий &os; является использование макросов - <literal>__FreeBSD_version</literal> и - <literal>__FreeBSD__</literal>, определённых в <link - xlink:href="http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>. - Если этот файл не подключен, добавьте код</para> - - <programlisting>#include <sys/param.h></programlisting> - - <para>в соответствующем месте файла <filename>.c</filename>. - <literal>__FreeBSD__</literal> определён во всех версиях &os; - в качестве старшего номера версии системы. Например, в &os; - 9.x <literal>__FreeBSD__</literal> определён со значением - <literal>9</literal>.</para> - - <programlisting>#if __FreeBSD__ >= 9 +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="porting-dads"> + + <title>Что делать нужно, и что делать нельзя</title> + + <sect1 xml:id="dads-intro"> + <title>Введение</title> + + <para>Вот список часто встречающихся действий, которые нужно и + которые нельзя делать во время процесса портирования. + Проверьте порт по этому списку, и также проверьте порты в <link + xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе + сообщений PR</link>, которые присланы другими людьми. + Присылайте любые комментарии о портах, которые вы проверили, + так, как это описано в статье о <link + xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL"> + Сообщениях об ошибках и общих замечаниях</link>. Проверка + портов в базе сообщений PR позволит нам быстрее коммиттить их и + удостовериться, что вы знаете, что делаете.</para> + </sect1> + + <sect1 xml:id="porting-wrkdir"> + <title><varname>WRKDIR</varname></title> + + <para>Не пишите ничего в файлы вне каталога + <varname>WRKDIR</varname>. Каталог <varname>WRKDIR</varname> + является единственным местом, которое гарантированно будет + доступно для записи во время построения порта (обратитесь к + главе об <link + xlink:href="&url.books.handbook;/ports-using.html#PORTS-CD">установке + портов с CDROM</link> за примером построения портов из + дерева, доступного только для чтения). Если вам нужно изменить + какой-либо из файлов <filename>pkg-*</filename>, сделайте это, + <link linkend="porting-pkgfiles">переопределив + переменную</link>, но не перезаписывая их.</para> + </sect1> + + <sect1 xml:id="porting-wrkdirprefix"> + <title><varname>WRKDIRPREFIX</varname></title> + + <para>Добейтесь того, чтобы ваш порт принимал во внимание + значение переменной <varname>WRKDIRPREFIX</varname>. + Большинство портов об этом не заботятся. В частности, если вы + обращаетесь к каталогу <varname>WRKDIR</varname> другого порта, + заметьте, что его правильным местоположением является + <filename>WRKDIRPREFIXPORTSDIR/subdir/name/work</filename>, а + не <filename>PORTSDIR/subdir/work</filename> или + <filename>.CURDIR/../../subdir/name/work</filename> мли что-то + подобное.</para> + + <para>Кроме того, если вы сами задаете <varname>WRKDIR</varname>, + то должны поставить перед ним знак + <literal>${WRKDIRPREFIX}${.CURDIR}</literal>.</para> + </sect1> + + <sect1 xml:id="porting-versions"> + <title>Различение операционных систем и версий ОС</title> + + <para>Вы можете встретиться с кодом, который требует модификаций + или условной компиляции в зависимости от того, с какой версией + &os; Unix он работает. Предпочтительным способом отделения + кода для версий &os; является использование макросов + <literal>__FreeBSD_version</literal> и + <literal>__FreeBSD__</literal>, определённых в <link + xlink:href="http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>. + Если этот файл не подключен, добавьте код</para> + + <programlisting>#include <sys/param.h></programlisting> + + <para>в нужном месте файла <filename>.c</filename>.</para> + + <para><literal>__FreeBSD__</literal> определён во всех версиях + &os; в качестве старшего номера версии системы. Например, в + &os; 9.x <literal>__FreeBSD__</literal> определён со значением + <literal>9</literal>.</para> + + <programlisting>#if __FreeBSD__ >= 9 # if __FreeBSD_version >= 901000 /* здесь особый код для версий 9.1+ */ # endif #endif</programlisting> - </sect1> - - <sect1 xml:id="dads-after-port-mk"> - <title>Написание чего-либо после - <filename>bsd.port.mk</filename></title> - - <para>Не пишите ничего после строки - <literal>.include <bsd.port.mk></literal>. Этой строки можно - избежать, включив в где-то в середину вашего файла - <filename>Makefile</filename> файл - <filename>bsd.port.pre.mk</filename>, и - файл <filename>bsd.port.post.mk</filename> в конец.</para> - - <note> - <para>Вам нужно включить либо пару файлов - <filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>, - либо только <filename>bsd.port.mk</filename>; не используйте оба этих - метода одновременно.</para> - </note> - - <para>В файле <filename>bsd.port.pre.mk</filename> определяются лишь - несколько переменных, которые могут быть использованы в тестах из - файла <filename>Makefile</filename>, в файле - <filename>bsd.port.post.mk</filename> заданы остальные.</para> - - <para>Вот некоторые важные переменные, определенные в файле - <filename>bsd.port.pre.mk</filename> (это не полный список, для - выяснения полного списка прочтите, пожалуйста, сам файл - <filename>bsd.port.mk</filename>).</para> - - <informaltable frame="none" pgwide="0"> + </sect1> + + <sect1 xml:id="dads-after-port-mk"> + <title>Написание чего-либо после + <filename>bsd.port.mk</filename></title> + + <para>Не пишите ничего после строки + <literal>.include <bsd.port.mk></literal>. Этой строки + можно избежать, включив в где-то в середину вашего файла + <filename>Makefile</filename> файл + <filename>bsd.port.pre.mk</filename>, и файл + <filename>bsd.port.post.mk</filename> в конец.</para> + + <note> + <para>Вам нужно включить либо пару файлов + <filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>, + либо только <filename>bsd.port.mk</filename>; не используйте + оба этих метода одновременно.</para> + </note> + + <para>В файле <filename>bsd.port.pre.mk</filename> определяются + лишь несколько переменных, которые могут быть использованы в + тестах из файла <filename>Makefile</filename>, в файле + <filename>bsd.port.post.mk</filename> заданы остальные.</para> + + <para>Вот некоторые важные переменные, определенные в файле + <filename>bsd.port.pre.mk</filename> (это не полный список, для + выяснения полного списка прочтите, пожалуйста, сам файл + <filename>bsd.port.mk</filename>).</para> + + <informaltable frame="none" pgwide="0"> <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - <entry>Описание</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>ARCH</varname></entry> - <entry>Архитектура машины в виде, получаемом по команде - <command>uname -m</command> (например, - <literal>i386</literal>)</entry> - </row> - - <row> - <entry><varname>OPSYS</varname></entry> - <entry>Тип операционной системы, получаемый по команде - <command>uname -s</command> (например, - <literal>FreeBSD</literal>)</entry> - </row> - - <row> - <entry><varname>OSREL</varname></entry> - <entry>Версия релиза операционной системы (например, - <literal>2.1.5</literal> или <literal>2.2.7</literal>)</entry> - </row> - - <row> - <entry><varname>OSVERSION</varname></entry> - - <entry>Версия операционной системы в виде числа, та же, что и <link linkend="freebsd-versions"> - <literal>__FreeBSD_version</literal></link>.</entry> - </row> - - <row> - <entry><varname>LOCALBASE</varname></entry> - <entry>Корень дерева <quote>local</quote> (например, - <literal>/usr/local</literal>)</entry> - </row> - - <row> - <entry><varname>PREFIX</varname></entry> - <entry>Куда, собственно, устанавливается порт (обратитесь к <link linkend="porting-prefix"> - подробной информации о <varname>PREFIX</varname></link>).</entry> - </row> - </tbody> + <thead> + <row> + <entry>Переменная</entry> + <entry>Описание</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>ARCH</varname></entry> + <entry>Архитектура машины в виде, получаемом по команде + <command>uname -m</command> (например, + <literal>i386</literal>)</entry> + </row> + + <row> + <entry><varname>OPSYS</varname></entry> + <entry>Тип операционной системы, получаемый по команде + <command>uname -s</command> (например, + <literal>FreeBSD</literal>)</entry> + </row> + + <row> + <entry><varname>OSREL</varname></entry> + <entry>Версия релиза операционной системы (например, + <literal>2.1.5</literal> или + <literal>2.2.7</literal>)</entry> + </row> + + <row> + <entry><varname>OSVERSION</varname></entry> + <entry>Версия операционной системы в виде числа, та же, + что и <link linkend="freebsd-versions"> + <literal>__FreeBSD_version</literal></link>.</entry> + </row> + + <row> + <entry><varname>LOCALBASE</varname></entry> + <entry>Корень дерева <quote>local</quote> (например, + <literal>/usr/local</literal>)</entry> + </row> + + <row> + <entry><varname>PREFIX</varname></entry> + <entry>Куда, собственно, устанавливается порт (обратитесь + к <link linkend="porting-prefix">подробной информации о + <varname>PREFIX</varname></link>).</entry> + </row> + </tbody> </tgroup> - </informaltable> + </informaltable> - <note> - <para>Если вы задаете переменную - <varname>MASTERDIR</varname>, делайте это до - подключения <filename>bsd.port.pre.mk</filename>.</para> - </note> + <note> + <para>Если вы задаете переменную <varname>MASTERDIR</varname>, + делайте это до подключения + <filename>bsd.port.pre.mk</filename>.</para> + </note> - <para>Вот несколько примеров того, что вы можете написать после - <filename>bsd.port.pre.mk</filename>:</para> + <para>Вот несколько примеров того, что вы можете написать после + <filename>bsd.port.pre.mk</filename>:</para> - <programlisting># no need to compile lang/perl5 if perl5 is already in system + <programlisting># no need to compile lang/perl5 if perl5 is already in system .if ${OSVERSION} > 300003 -BROKEN= perl is in system +BROKEN= perl is in system .endif</programlisting> - <para>Вы не забываете об использовании табуляции вместо пробелов - после <literal>BROKEN=</literal>, - не так ли? <!-- улыбка -->:-).</para> - </sect1> + <para>Вы не забываете об использовании табуляции вместо пробелов + после <literal>BROKEN=</literal><!-- улыбка -->:-).</para> + </sect1> - <sect1 xml:id="dads-sh-exec"> - <title>Использование выражения <function>exec</function> - в сценариях обёртках</title> + <sect1 xml:id="dads-sh-exec"> + <title>Использование выражения <function>exec</function> + в сценариях обёртках</title> - <para>Если порт устанавливает сценарий на языке shell, который служит - для запуска другой программы, и если запуск этой программы является - последним действием сценария, убедитесь, что запуск программы - производится с использованием выражения <function>exec</function>, - например:</para> + <para>Если порт устанавливает сценарий на языке shell, который + служит для запуска другой программы, и если запуск этой + программы является последним действием сценария, убедитесь, что + запуск программы производится с использованием выражения + <function>exec</function>, например:</para> - <programlisting>#!/bin/sh + <programlisting>#!/bin/sh exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"</programlisting> - <para>Выражение <function>exec</function> заменяет процесс сценария - на указанную программу. Если <function>exec</function> опущен, - то процесс сценария во время работы программы остается в памяти, - без бесполезно потребляя системные ресурсы.</para> - - </sect1> - - <sect1 xml:id="dads-rational"> - <title>Поступайте разумно</title> - - <para>Файл <filename>Makefile</filename> должен выполнять действия - просто и небеспричинно. Если вы можете сделать что-то на несколько - строк короче или более читабельно, сделайте это. В качестве примеров - можно привести использование конструкций <literal>.if</literal> - утилиты make вместо соответствующей конструкции <literal>if</literal> - командного процессора, ненужность переопределения цели - <buildtarget>do-extract</buildtarget> при возможности переопределения - <varname>EXTRACT*</varname> и использование - <varname>GNU_CONFIGURE</varname> вместо - <literal>CONFIGURE_ARGS+= --prefix=${PREFIX}</literal>.</para> - - <para>Если вы обнаружите, что для выполнения чего-то приходится писать - много нового кода, то, пожалуйста, просмотрите файл - <filename>bsd.port.mk</filename> на предмет того, не содержит ли он - реализацию именно вашей проблемы. Хотя его трудно читать, имеется - много проблем, выглядящих сложными, для которых файл - <filename>bsd.port.mk</filename> уже содержит быстрое решение.</para> - </sect1> - - <sect1 xml:id="dads-cc"> - <title>Работа как с <varname>CC</varname>, так и - <varname>CXX</varname></title> - - <para>Порт должен принимать во внимание как переменную - <varname>CC</varname>, так и <varname>CXX</varname>. - Под этим мы подразумеваем, что порт ни в коем случае не должен - устанавливать значения этих переменных, переопределяя имеющиеся - значения; вместо этого можно добавлять нужные значения к уже - имеющимся. Это связано с тем, что параметры построения, - относящиеся ко всем портам, могут быть заданы глобально.</para> - - <para>Если порты не учитывают значения этих переменных, добавьте - строку <literal>NO_PACKAGE=ignores either cc or cxx</literal> - в файл <filename>Makefile</filename>.</para> - - <para>Далее следует пример файла <filename>Makefile</filename>, - использующего как переменную <varname>CC</varname>, так и - <varname>CXX</varname>. Обратите внимание на использование символов - <varname>?=</varname>:</para> - - <programlisting>CC?= gcc</programlisting> - - <programlisting>CXX?= g++</programlisting> - - <para>Вот пример, в котором не принимаются во внимание ни переменная - <varname>CC</varname>, ни <varname>CXX</varname>:</para> - - <programlisting>CC= gcc</programlisting> - - <programlisting>CXX= g++</programlisting> - - <para>В системах &os; обе переменные <varname>CC</varname> и - <varname>CXX</varname> могут быть определены в файле - <filename>/etc/make.conf</filename>. В первом примере задаётся - значение, если оно ранее не было определено в - <filename>/etc/make.conf</filename>, что сохраняет любые определения, - данные на уровне системы в целом. Второй пример переопределяет всё, - что было задано ранее.</para> - </sect1> - - <sect1 xml:id="dads-cflags"> - <title>Использование <varname>CFLAGS</varname></title> - - <para>Порт должен принимать во внимание переменную - <varname>CFLAGS</varname>. - Под этим мы подразумеваем, что порт ни в коем случае не должен - устанавливать значения этих переменных, переопределяя имеющиеся - значения; вместо этого можно добавлять нужные значения к уже - имеющимся. Это связано с тем, что параметры построения, - относящиеся ко всем портам, могут быть заданы глобально.</para> - - <para>Если порты не учитывают значения этой переменной, добавьте - строку <literal>NO_PACKAGE=ignores cflags</literal> в файл - <filename>Makefile</filename>.</para> - - <para>Далее следует пример файла <filename>Makefile</filename>, - использующего переменную <varname>CFLAGS</varname>. Обратите - внимание на использование символов <varname>+=</varname>:</para> - - <programlisting> -CFLAGS+= -Wall -Werror - </programlisting> - - <para>А вот пример, в котором не учитывается значение переменной - <varname>CFLAGS</varname>:</para> - - <programlisting> -CFLAGS= -Wall -Werror - </programlisting> - - <para>В системе &os; переменная <varname>CFLAGS</varname> определена - в файле <filename>/etc/make.conf</filename>. В первом примере к - переменной <varname>CFLAGS</varname> добавляются дополнительные флаги, - при этом сохраняются все определения, данные ранее на уровне системы. - Во втором примере всё, что было задано ранее, игнорируется.</para> - - <para>Из сторонних файлов <filename>Makefile</filename> следует удалить - флаги оптимизации. Общесистемные флаги оптимизации находятся в - системной переменной <varname>CFLAGS</varname>. Пример из - немодифицированного <filename>Makefile</filename>:</para> - - <programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting> - - <para>При использовании системных флагов оптимизации - <filename>Makefile</filename> станет похожим на следующий пример:</para> - - <programlisting>CFLAGS+= -DHAVE_SOUND</programlisting> - - </sect1> - - <sect1 xml:id="dads-pthread"> - <title>Библиотеки потоков</title> - - <para>Во &os; библиотека потоков обязана быть скомпонована с - исполняемыми файлами с использованием специального флага - <literal>-pthread</literal>. Если порт настаивает - на прямой компоновке с <literal>-lpthread</literal>, - создайте патч для использования <literal>-pthread</literal> - </para> - - <note> - <para>Если построение порта заканчивается ошибкой - <literal>unrecognized option '-pthread'</literal>, - то может быть желательно использование <command>cc</command> - в качестве компоновщика через установку - <varname>CONFIGURE_ENV</varname> в <literal>LD=${CC}</literal>. - Параметр <literal>-pthread</literal> напрямую командой - <command>ld</command> не поддерживается.</para> - </note> - - </sect1> - - <sect1 xml:id="dads-feedback"> - <title>Пожелания</title> - - <para>Посылайте подходящие изменения/патчи авторам/сопровождающему - для включения в следующий релиз. Это только сделает вашу работу - гораздо легче при выходе следующего релиза.</para> - </sect1> - - <sect1 xml:id="dads-readme"> - <title><filename>README.html</filename></title> - - <para><filename>README.html</filename> не является частью порта - и генерируется при помощи <command>make readme</command>. - Не включайте этот файл в патчи или коммиты.</para> - - <note> - <para>Если не удается выполнить <command>make readme</command>, - убедитесь, что значение по умолчанию <varname>ECHO_MSG</varname> - не было изменено внутри порта.</para> - </note> - </sect1> - - <sect1 xml:id="dads-noinstall"> - <title>Пометка неустанавливаемого порта как <varname>BROKEN</varname>, - <varname>FORBIDDEN</varname> или <varname>IGNORE</varname></title> - - <para>В некоторых случаях пользователи не должны допускаться к - установке порта. Для того, чтобы сообщить пользователю, что порт - не следует устанавливать, имеется несколько - <command>make</command>-переменных, которые могут быть использованы - в файле <filename>Makefile</filename> порта. Значения следующих - <command>make</command>-переменных будут причиной, возвращаемой - пользователям, по которой порт отказывает в установке. - Пожалуйста, используйте корректные <command>make</command>-переменные, - так как каждая переменная make передает абсолютно различный смысл - как для пользователей, так и для автоматизированных систем, которые - полагаются на файлы <filename>Makefile</filename>, таких как - <link linkend="build-cluster">кластер построения портов</link>, - <link linkend="freshports">FreshPorts</link> и - <link linkend="portsmon">portsmon</link>.</para> - - <sect2 xml:id="dads-noinstall-variables"> - <title>Переменные</title> + <para>Выражение <function>exec</function> заменяет процесс + сценария на указанную программу. Если + <function>exec</function> опущен, то процесс сценария во время + работы программы остается в памяти, бесполезно потребляя + системные ресурсы.</para> + </sect1> + + <sect1 xml:id="dads-rational"> + <title>Поступайте разумно</title> + + <para>Файл <filename>Makefile</filename> должен выполнять + действия просто и небеспричинно. Если вы можете сделать что-то + на несколько строк короче или более читабельно, сделайте это. + В качестве примеров можно привести использование конструкций + <literal>.if</literal> утилиты make вместо соответствующей + конструкции <literal>if</literal> командного процессора, + ненужность переопределения цели + <buildtarget>do-extract</buildtarget> при возможности + переопределения <varname>EXTRACT*</varname> и использование + <varname>GNU_CONFIGURE</varname> вместо + <literal>CONFIGURE_ARGS + += --prefix=${PREFIX}</literal>.</para> + + <para>Если вы обнаружите, что для выполнения чего-то приходится + писать много нового кода, то, пожалуйста, просмотрите файл + <filename>bsd.port.mk</filename> на предмет того, не содержит + ли он решение именно вашей проблемы. Хотя его трудно читать, + имеется много проблем, выглядящих сложными, для которых файл + <filename>bsd.port.mk</filename> уже содержит быстрое + решение.</para> + </sect1> + + <sect1 xml:id="dads-cc"> + <title>Работа как с <varname>CC</varname>, так и + <varname>CXX</varname></title> + + <para>Порт должен принимать во внимание как переменную + <varname>CC</varname>, так и <varname>CXX</varname>. Под этим + мы подразумеваем, что порт ни в коем случае не должен + устанавливать значения этих переменных, переопределяя имеющиеся + значения; вместо этого можно добавлять нужные значения к уже + имеющимся. Это связано с тем, что параметры построения, + относящиеся ко всем портам, могут быть заданы глобально.</para> + + <para>Если порты не учитывают значения этих переменных, добавьте + строку <literal>NO_PACKAGE=ignores either cc or cxx</literal> + в файл <filename>Makefile</filename>.</para> + + <para>Далее следует пример файла <filename>Makefile</filename>, + использующего как переменную <varname>CC</varname>, так и + <varname>CXX</varname>. Обратите внимание на использование + символов <varname>?=</varname>:</para> + + <programlisting>CC?= gcc</programlisting> + + <programlisting>CXX?= g++</programlisting> + + <para>Вот пример, в котором не принимаются во внимание ни + <varname>CC</varname>, ни <varname>CXX</varname>:</para> + + <programlisting>CC= gcc</programlisting> + + <programlisting>CXX= g++</programlisting> + + <para>В системах &os; обе переменные <varname>CC</varname> и + <varname>CXX</varname> могут быть определены в файле + <filename>/etc/make.conf</filename>. В первом примере задаётся + значение, если оно ранее не было определено в + <filename>/etc/make.conf</filename>, что сохраняет любые + определения, данные на уровне системы в целом. Второй пример + переопределяет всё, что было задано ранее.</para> + </sect1> + + <sect1 xml:id="dads-cflags"> + <title>Использование <varname>CFLAGS</varname></title> + + <para>Порт должен учитывать переменную <varname>CFLAGS</varname>. + Под этим мы подразумеваем, что порт ни в коем случае не должен + устанавливать значения этой переменной, переопределяя имеющиеся + значения; вместо этого можно добавлять нужные значения к уже + имеющимся. Это связано с тем, что параметры построения, + относящиеся ко всем портам, могут быть заданы глобально.</para> + + <para>Если порты не учитывают значения этой переменной, добавьте + строку <literal>NO_PACKAGE=ignores cflags</literal> в файл + <filename>Makefile</filename>.</para> + + <para>Далее следует пример файла <filename>Makefile</filename>, + использующего переменную <varname>CFLAGS</varname>. Обратите + внимание на использование символов <varname>+=</varname>:</para> + + <programlisting>CFLAGS+= -Wall -Werror</programlisting> + + <para>А вот пример, в котором не учитывается значение переменной + <varname>CFLAGS</varname>:</para> + + <programlisting>CFLAGS= -Wall -Werror</programlisting> + + <para>В системе &os; переменная <varname>CFLAGS</varname> + определена в файле <filename>/etc/make.conf</filename>. В + первом примере к переменной <varname>CFLAGS</varname> + добавляются дополнительные флаги, при этом сохраняются все + определения, данные ранее на уровне системы. Во втором примере + всё, что было задано ранее, игнорируется.</para> + + <para>Из сторонних файлов <filename>Makefile</filename> следует + удалить флаги оптимизации. Общесистемные флаги оптимизации + находятся в системной переменной <varname>CFLAGS</varname>. + Пример из немодифицированного + <filename>Makefile</filename>:</para> + + <programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting> + + <para>При использовании системных флагов оптимизации + <filename>Makefile</filename> станет похожим на следующий + пример:</para> + + <programlisting>CFLAGS+= -DHAVE_SOUND</programlisting> + </sect1> + + <sect1 xml:id="dads-pthread"> + <title>Библиотеки потоков</title> + + <para>Во &os; библиотека потоков обязана быть скомпонована с + исполняемыми файлами с использованием специального флага + <literal>-pthread</literal>. Если порт настаивает на прямой + компоновке с <literal>-lpthread</literal>, создайте патч для + использования <literal>-pthread</literal>.</para> + + <note> + <para>Если построение порта заканчивается ошибкой + <literal>unrecognized option '-pthread'</literal>, то может + быть желательно использование <command>cc</command> в + качестве компоновщика через установку + <varname>CONFIGURE_ENV</varname> в + <literal>LD=${CC}</literal>. Параметр + <literal>-pthread</literal> напрямую командой + <command>ld</command> не поддерживается.</para> + </note> + </sect1> + + <sect1 xml:id="dads-feedback"> + <title>Пожелания</title> + + <para>Посылайте подходящие изменения/патчи автору/сопровождающему + для включения в следующий релиз. Это только сделает вашу + работу гораздо легче при выходе следующего релиза.</para> + </sect1> + + <sect1 xml:id="dads-readme"> + <title><filename>README.html</filename></title> + + <para><filename>README.html</filename> не является частью порта + и генерируется при помощи <command>make readme</command>. + Не включайте этот файл в патчи или коммиты.</para> + + <note> + <para>Если не удается выполнить <command>make readme</command>, + убедитесь, что значение по умолчанию + <varname>ECHO_MSG</varname> не изменено внутри порта.</para> + </note> + </sect1> + + <sect1 xml:id="dads-noinstall"> + <title>Пометка неустанавливаемого порта как + <varname>BROKEN</varname>, <varname>FORBIDDEN</varname> или + <varname>IGNORE</varname></title> + + <para>В некоторых случаях пользователи не должны допускаться к + установке порта. Для того, чтобы сообщить пользователю, что + порт не следует устанавливать, имеется несколько + <command>make</command>-переменных, которые могут быть + использованы в файле <filename>Makefile</filename> порта. + Значения следующих <command>make</command>-переменных будут + причиной, возвращаемой пользователям, по которой порт + отказывает в установке. Пожалуйста, используйте корректные + <command>make</command>-переменные, так как каждая переменная + make передает абсолютно различный смысл как для пользователей, + так и для автоматизированных систем, которые полагаются на + файлы <filename>Makefile</filename>, таких как <link + linkend="build-cluster">кластер построения портов</link>, + <link linkend="freshports">FreshPorts</link> и <link + linkend="portsmon">portsmon</link>.</para> + + <sect2 xml:id="dads-noinstall-variables"> + <title>Переменные</title> <itemizedlist> <listitem> - <para><varname>BROKEN</varname> предназначена для портов, которые - в настоящее время не компилируются, не устанавливаются или не - удаляются правильно. Следует использовать для портов, - когда проблема считается временной.</para> + <para><varname>BROKEN</varname> предназначена для портов, + которые в настоящее время не компилируются, не + устанавливаются или не удаляются правильно. Следует + использовать, когда проблема считается временной.</para> - <para>В особых случаях кластер - построения будет продолжать попытки собрать их, чтобы показать, - решена ли основная проблема. (Однако, как правило, кластер - запускается без этой возможности.)</para> + <para>В особых случаях кластер построения будет продолжать + попытки собрать их, чтобы показать, решена ли основная + проблема. (Однако, как правило, кластер запускается без + этой возможности.)</para> - <para>В частности, используйте - <varname>BROKEN</varname>, когда порт:</para> + <para>В частности, используйте <varname>BROKEN</varname>, + когда порт:</para> <itemizedlist> <listitem> @@ -414,40 +422,41 @@ CFLAGS= -Wall -Werror </listitem> <listitem> - <para>не удаляет полностью все свои файлы при деинсталляции - (тем не менее, это может быть допустимо, и подходит - для портов, оставляющих после себя файлы, измененные - пользователем)</para> + <para>не удаляет полностью все свои файлы при + деинсталляции (тем не менее, это может быть + допустимо, и подходит для портов, оставляющих после + себя файлы, измененные пользователем)</para> </listitem> </itemizedlist> - </listitem> - <listitem> - <para><varname>FORBIDDEN</varname> используется для портов, которые - содержат уязвимости в информационной безопасности или - являются потенциально вредными в плане обеспечения информационной - безопасности системы &os; при установке данного порта - (например: заведомо небезопасная программа или программа, которая - предоставляет легко взламываемые сервисы). Порты должны - помечаться как <varname>FORBIDDEN</varname>, как только в - конкретном программном обеспечении обнаружилась уязвимость, но - обновление выпущено не было. В идеальном случае порты должны - обновляться максимально быстро после обнаружения уязвимости, - чтобы уменьшить число уязвимых хостов &os; (нам нравится иметь - репутацию безопасной системы), однако иногда случается - значительный временной разрыв между обнаружением уязвимости и - выходом обновлённого релиза уязвимого программного обеспечения. - Не помечайте порт как <varname>FORBIDDEN</varname>, если причина - не вызвана соображениями информационной безопасности.</para> + <listitem> + <para><varname>FORBIDDEN</varname> используется для портов, + которые содержат уязвимости в информационной безопасности + или являются потенциально вредными в плане обеспечения + информационной безопасности системы &os; при установке + данного порта (например: заведомо небезопасная программа + или программа, которая предоставляет легко взламываемые + сервисы). Порты должны помечаться как + <varname>FORBIDDEN</varname>, как только в конкретном + программном обеспечении обнаружилась уязвимость, но + обновление выпущено не было. В идеальном случае порты + должны обновляться максимально быстро после обнаружения + уязвимости, чтобы уменьшить число уязвимых хостов &os; + (нам нравится иметь репутацию безопасной системы), однако + иногда случается значительный временной разрыв между + обнаружением уязвимости и выходом обновлённого релиза + уязвимого программного обеспечения. Не помечайте порт + как <varname>FORBIDDEN</varname>, если причина не вызвана + соображениями информационной безопасности.</para> </listitem> <listitem> - <para><varname>IGNORE</varname> предназначена для портов, которые - не должны строиться по какой-либо другой причине. Следует - использовать для портов, в случае когда проблема считает - конструктивной. Кластер построения - ни при каких условиях не будет строить порты, помеченные как + <para><varname>IGNORE</varname> предназначена для портов, + которые не должны строиться по какой-либо другой причине. + Следует использовать для портов, в случае когда проблема + считается структурной. Кластер построения ни при каких + условиях не будет строить порты, помеченные как <varname>IGNORE</varname>. В частности, используйте <varname>IGNORE</varname>, когда порт:</para> @@ -461,260 +470,274 @@ CFLAGS= -Wall -Werror </listitem> <listitem> - <para>имеет distfile, который не может быть автоматически - извлечен из-за лицензионных ограничений</para> + <para>имеет дистрибутивный файл, который не может быть + автоматически извлечен из-за лицензионных + ограничений</para> </listitem> <listitem> - <para>не работает с каким-либо другим портом, установленным - в настоящее время (например, порт зависит от - <package role="port">www/apache20</package>, но установлен - <package role="port">www/apache22</package>) - </para> + <para>не работает с каким-либо другим портом, + установленным в настоящее время (например, порт + зависит от <package + role="port">www/apache20</package>, но установлен + <package role="port">www/apache22</package>)</para> </listitem> </itemizedlist> <note> - <para>Если порт будет конфликтовать с уже установленным портом, - (например, если они устанавливают файл в то же место, но - с иным функциональным назначением), то - <link linkend="conflicts">используйте - вместо этого <varname>CONFLICTS</varname></link>. + <para>Если порт будет конфликтовать с уже установленным + портом (например, если они устанавливают файл в то же + место, но с иным функциональным назначением), то <link + linkend="conflicts">используйте вместо этого + <varname>CONFLICTS</varname></link>. <varname>CONFLICTS</varname> сам установит значение <varname>IGNORE</varname>.</para> </note> </listitem> <listitem> - <para>Если порт нужно пометить как <varname>IGNORE</varname> - только на некоторых архитектурах, для этого есть две другие - удобные переменные, которые автоматически установят для вас + <para>Если порт нужно пометить как + <varname>IGNORE</varname> только на некоторых + архитектурах, для этого есть две другие удобные + переменные, которые автоматически установят для вас значения: <varname>ONLY_FOR_ARCHS</varname> и <varname>NOT_FOR_ARCHS</varname>. Примеры:</para> - <programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting> + <programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting> - <programlisting>NOT_FOR_ARCHS= ia64 sparc64</programlisting> + <programlisting>NOT_FOR_ARCHS= ia64 sparc64</programlisting> - <para>Собственное сообщение <varname>IGNORE</varname> можно задать - с использованием <varname>ONLY_FOR_ARCHS_REASON</varname> и - <varname>NOT_FOR_ARCHS_REASON</varname>. Отдельно для каждой - архитектуры это возможно с использованием + <para>Собственное сообщение <varname>IGNORE</varname> можно + задать с использованием + <varname>ONLY_FOR_ARCHS_REASON</varname> и + <varname>NOT_FOR_ARCHS_REASON</varname>. Отдельно для + каждой архитектуры это возможно с использованием <varname>ONLY_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname> и <varname>NOT_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname>.</para> </listitem> <listitem> - <para>Если порт загружает и устанавливает исполняемые файлы i386, - то следует установить <varname>IA32_BINARY_PORT</varname>. - Если эта переменная установлена, будет выполнена проверка - доступности каталога <filename>/usr/lib32</filename> для - библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении + <para>Если порт загружает и устанавливает исполняемые файлы + i386, то следует установить + <varname>IA32_BINARY_PORT</varname>. Если эта переменная + установлена, будет выполнена проверка доступности + каталога <filename>/usr/lib32</filename> для библиотек + версии IA32 и поддержки IA32 в ядре. При невыполнении любого из этих условий будет автоматически установлена переменная <varname>IGNORE</varname>.</para> </listitem> - </itemizedlist> - - </sect2> - <sect2 xml:id="dads-noinstall-notes"> - <title>Замечания по реализации</title> - - <para>Строки не следует брать в кавычки. - Также построение строки должно несколько различаться из-за - способа отображения информации пользователю. Примеры:</para> - - <programlisting>BROKEN= fails to link with base -lcrypto</programlisting> - - <programlisting>IGNORE= unsupported on recent versions</programlisting> - - <para>получаемые в результате следующего вывода - <command>make describe</command>:</para> - - <programlisting>===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.</programlisting> - - <programlisting>===> foobar-0.1 is unsupported on recent versions.</programlisting> - </sect2> - </sect1> - - <sect1 xml:id="dads-deprecated"> - <title>Пометка порта на удаление с <varname>DEPRECATED</varname> - или <varname>EXPIRATION_DATE</varname></title> - - <para>Помните, что <varname>BROKEN</varname> и - <varname>FORBIDDEN</varname> будут использованы как временное - средство, если порт не является работающим. Постоянно - неработоспособные порты должны полностью удаляться из дерева.</para> - - <para>В подходящих ситуациях пользователи могут быть оповещены о - предстоящем удалении через переменные <varname>DEPRECATED</varname> - и <varname>EXPIRATION_DATE</varname>. Первое - это просто строка, - сообщающая причину запланированного удаления порта; вторая является - строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны - пользователю.</para> - - <para>Переменную <varname>DEPRECATED</varname> можно установить без - использования <varname>EXPIRATION_DATE</varname> (в частности, при - рекомендации новой версии порта), но обратный порядок не имеет - никакого смысла.</para> - - <para>Не существует устоявшейся политики, как долго следует продолжать - уведомления. Текущая практика дает около месяца для решения проблем - безопасности и два месяца для проблем построения. Это также дает - немного времени на исправление проблем любым заинтересованным - коммиттерам.</para> - </sect1> - - <sect1 xml:id="dads-dot-error"> - <title>Избегайте использования конструкции + </sect2> + + <sect2 xml:id="dads-noinstall-notes"> + <title>Замечания по реализации</title> + + <para>Строки не следует брать в кавычки. Также построение + строки должно несколько различаться из-за способа отображения + информации пользователю. Примеры:</para> + + <programlisting>BROKEN= fails to link with base -lcrypto</programlisting> + + <programlisting>IGNORE= unsupported on recent versions</programlisting> + + <para>получаемые в результате следующего вывода + <command>make describe</command>:</para> + + <programlisting>===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.</programlisting> + + <programlisting>===> foobar-0.1 is unsupported on recent versions.</programlisting> + </sect2> + </sect1> + + <sect1 xml:id="dads-deprecated"> + <title>Пометка порта на удаление с <varname>DEPRECATED</varname> + или <varname>EXPIRATION_DATE</varname></title> + + <para>Помните, что <varname>BROKEN</varname> и + <varname>FORBIDDEN</varname> будут использованы как временное + средство, если порт не является работающим. Постоянно + неработоспособные порты должны полностью удаляться из + дерева.</para> + + <para>В подходящих ситуациях пользователи могут быть оповещены о + предстоящем удалении через переменные + <varname>DEPRECATED</varname> и + <varname>EXPIRATION_DATE</varname>. Первое - это просто + строка, сообщающая причину запланированного удаления порта; + вторая является строкой в формате ISO 8601 (YYYY-MM-DD). Обе + будут показаны пользователю.</para> + + <para>Переменную <varname>DEPRECATED</varname> можно установить + без использования <varname>EXPIRATION_DATE</varname> (в + частности, при рекомендации новой версии порта), но обратный + порядок не имеет никакого смысла.</para> + + <para>Не существует устоявшейся политики, как долго следует + продолжать уведомления. Текущая практика дает около месяца для + решения проблем безопасности и два месяца для проблем + построения. Это также дает немного времени на исправление + проблем любым заинтересованным коммиттерам.</para> + </sect1> + + <sect1 xml:id="dads-dot-error"> + <title>Избегайте использования конструкции + <literal>.error</literal></title> + + <para>Правильным способом подать сигнал для + <filename>Makefile</filename> о том, что порт не может быть + установлен из-за какого-то внешнего фактора (например, + пользователь указал недопустимую комбинацию опций построения), + является установка непустого значения для + <varname>IGNORE</varname>. Это значение будет сформатировано и + показано пользователю во время + <command>make install</command>.</para> + + <para>Использование для этих целей <literal>.error</literal> + является распространенной ошибкой. Проблема в том, что в этой + ситуации будут повреждены многие инструменты автоматизации, + работающие с деревом портов. Наибольшим образом это + распространено при попытке построить + <filename>/usr/ports/INDEX</filename> (смотрите <xref + linkend="make-describe"/>). Тем не менее, даже более простые + команды, такие как <command>make maintainer</command>, в этом + случае также вернут ошибку. Это не является приемлемым.</para> + + <example xml:id="dot-error-breaks-index"> + <title>Как избегать использования <literal>.error</literal></title> - <para>Правильным способом подать сигнал для <filename>Makefile</filename> - о том, что порт не может быть установлен из-за какого-то внешнего - фактора (например, пользователь указал недопустимую комбинацию - опций построения), является установка непустого значения для - <varname>IGNORE</varname>. Это значение будет сформатировано и - показано пользователю во время <command>make install</command>.</para> - - <para>Использование для этих целей <literal>.error</literal> является - распространенной ошибкой. Проблема в том, что в этой ситуации - будут повреждены многие инструменты автоматизации, работающие с - деревом портов. Наибольшим образом это распространено при попытке - построить <filename>/usr/ports/INDEX</filename> (смотрите <xref linkend="make-describe"/>). Тем не менее, даже более простые команды, - такие как <command>make maintainer</command>, в этом случае также - вернут ошибку. Это не является приемлемым.</para> - - <example xml:id="dot-error-breaks-index"> - <title>Как избегать использование <literal>.error</literal></title> - - <para>Из следующих двух вариантов строки файла - <filename>Makefile</filename> первый приведёт к неудачному - завершению работы <command>make index</command>, а второй - - нет:</para> - - <programlisting>.error "option is not supported"</programlisting> - - <programlisting>IGNORE=option is not supported</programlisting> - </example> - </sect1> - - <sect1 xml:id="dads-sysctl"> - <title>Использование <filename>sysctl</filename></title> - - <para>Использование <filename>sysctl</filename> не рекомендуется, - кроме как при выполнении целей. Это вызвано тем, что вычисление - любых <literal>makevar</literal>, таких как во время команды - <command>make index</command>, с необходимостью запуска этой - команды, еще больше замедляет весь процесс.</para> - - <para>&man.sysctl.8; следует всегда использовать через переменную - <varname>SYSCTL</varname>, поскольку она содержит полностью заданный - путь, и при необходимости может быть переопределена.</para> - </sect1> - - <sect1 xml:id="dads-rerolling-distfiles"> - <title>Меняющиеся дистрибутивные файлы</title> - - <para>Иногда авторы программного обеспечения меняют содержимое - выпущенных дистрибутивных файлов без смены названия. Вы должны - проверять, что изменения являются официальными и произведены - автором. В прошлом бывало, что дистрибутивный файл молча изменялся - на сайтах загрузки с намерением нанести вред или скомпрометировать - безопасность конечного пользователя.</para> - - <para>Отложите старый файл с дистрибутивом в сторону, загрузите новый, - распакуйте его и сравните содержимое при помощи &man.diff.1;. - Если вы не видите ничего подозрительного, то можете обновить файл - <filename>distinfo</filename>. Убедитесь, что вы подытожили различия - в вашем PR или описании коммита, чтобы другие люди были в курсе, что - вы позаботились о том, что ничего плохого не случилось.</para> - - <para>Возможно вы также захотите связаться с автором этого программного - обеспечения для подтверждения изменений.</para> - </sect1> - - <sect1 xml:id="dads-avoiding-linuxisms"> - <title>Избегание линуксизмов</title> - - <para>Не используйте <filename>/proc</filename>, если доступны - любые другие источники получения информации, например, - <function>setprogname(argv[0])</function> в - <function>main()</function> и &man.getprogname.3;, в случае - если вы хотите <quote>знать своё имя</quote>.</para> - - <para>Не полагайтесь на поведение, не регламентированное - <acronym>POSIX</acronym>.</para> - - <para>Не выполняйте запись временных меток в критических путях - выполнения приложения, если можно обойтись без этого. Получение - временных меток может быть медленным, в зависимости от степени - точности используемых часов в операционной системе. Если - временные метки действительно нужны, определите степень - требуемой точности и используйте тот <acronym>API</acronym>, - в котором документируется получение достаточной точности.</para> - - <para>Ряд простых системных вызовов (например, &man.gettimeofday.2;, - &man.getpid.2;) работают намного быстрее в &linux; по сравнению - с любой другой операционной системой из-за кеширования и - используемой оптимизации vsyscall. Не полагайтесь на их - дешевизну в критичных к производительности приложениях. В - целом, старайтесь избегать системных вызовов там, где это - возможно.</para> - - <para>Не полагайтесь на специфичное для &linux; поведение сокета. - В частности, отличаются размеры буфера сокета по умолчанию - (выполните вызов &man.setsockopt.2; с <literal>SO_SNDBUF</literal> - и <literal>SO_RCVBUF</literal>, и в то время как в &linux; - при заполнении буфера сокета &man.send.2; блокируется, &os; - возвращает ошибку и устанавливает <literal>ENOBUFS</literal> - в качестве значения errno.</para> - - <para>Если требуется рассчитывать на нестандартное поведение, - инкапсулируйте это должным образом в общий для всех - <acronym>API</acronym> с проверкой поведения на этапе - конфигурации, и если требуемое поведение не найдено, - прекращайте выполнение.</para> - - <para>Используйте <link xlink:href="http://www.freebsd.org/cgi/man.cgi">страницы - справочника</link> для проверки, относится ли функция к - интерфейсу <acronym>POSIX</acronym> (ищите раздел - <quote>STANDARDS</quote> на странице справочника).</para> - - <para>Не рассчитывайте на то, что в качестве - <filename>/bin/sh</filename> используется - <application>bash</application>. Убедитесь, что командная - строка, переданная в &man.system.3;, будет работать в - <acronym>POSIX</acronym>-совместимой оболочке.</para> - - <para>Список основных <application>bash</application>-измов - расположен <link xlink:href="https://wiki.ubuntu.com/DashAsBinSh">здесь</link>.</para> - - <para>Проверьте, что используемые заголовочные файлы включены в - <acronym>POSIX</acronym> или список, рекомендуемый страницей - справочника, т.к. например, забыть подключить - <filename>sys/types.h</filename> — не такая уж проблема - в &linux;, однако это не так во &os;.</para> - - <para>Компилируйте многопоточные приложения с ключом - <quote>-pthread</quote>, а не <quote>-lpthread</quote> или - как-либо ещё.</para> - </sect1> - - <sect1 xml:id="dads-misc"> - <title>Разное</title> - - <para>Файлы <filename>pkg-descr</filename> и - <filename>pkg-plist</filename> должны проверяться дважды. Если вы - пересматриваете порт и думаете, что его можно описать иначе, - сделайте это.</para> - - <para>Пожалуйста, не создавайте дополнительных копий лицензии GNU - General Public License в нашей системе.</para> - - <para>Будьте внимательны с юридическими вопросами! Не делайте из нас - нелегальных распространителей ПО!</para> - </sect1> - - </chapter> - + <para>Из следующих двух вариантов строки файла + <filename>Makefile</filename> первый приведёт к неудачному + завершению работы <command>make index</command>, а второй - + нет:</para> + + <programlisting>.error "option is not supported"</programlisting> + + <programlisting>IGNORE=option is not supported</programlisting> + </example> + </sect1> + + <sect1 xml:id="dads-sysctl"> + <title>Использование <filename>sysctl</filename></title> + + <para>Использование <filename>sysctl</filename> не рекомендуется, + кроме как при выполнении целей. Это вызвано тем, что + вычисление любых <literal>makevar</literal>, таких как во время + команды <command>make index</command>, с необходимостью запуска + этой команды, еще больше замедляет весь процесс.</para> + + <para>&man.sysctl.8; следует всегда использовать через переменную + <varname>SYSCTL</varname>, поскольку она содержит полностью + заданный путь, и при необходимости может быть + переопределена.</para> + </sect1> + + <sect1 xml:id="dads-rerolling-distfiles"> + <title>Меняющиеся дистрибутивные файлы</title> + + <para>Иногда авторы программного обеспечения меняют содержимое + выпущенных дистрибутивных файлов без смены названия. Вы должны + проверять, что изменения являются официальными и произведены + автором. В прошлом бывало, что дистрибутивный файл молча + изменялся на сайтах загрузки с намерением нанести вред или + скомпрометировать безопасность конечного пользователя.</para> + + <para>Отложите старый файл с дистрибутивом в сторону, загрузите + новый, распакуйте его и сравните содержимое при помощи + &man.diff.1;. Если вы не видите ничего подозрительного, то + можете обновить файл <filename>distinfo</filename>. Убедитесь, + что вы подытожили различия в вашем PR или описании коммита, + чтобы другие люди были в курсе, что вы позаботились о том, что + ничего плохого не случилось.</para> + + <para>Возможно вы также захотите связаться с автором этого + программного обеспечения для подтверждения изменений.</para> + </sect1> + + <sect1 xml:id="dads-avoiding-linuxisms"> + <title>Избегание линуксизмов</title> + + <para>Не используйте <filename>/proc</filename>, если доступны + любые другие источники получения информации, например, + <function>setprogname(argv[0])</function> в + <function>main()</function> и &man.getprogname.3;, в случае + если вы хотите <quote>знать своё имя</quote>.</para> + + <para>Не полагайтесь на поведение, не регламентированное + <acronym>POSIX</acronym>.</para> + + <para>Не выполняйте запись временных меток в критических путях + выполнения приложения, если можно обойтись без этого. + Получение временных меток может быть медленным, в зависимости + от степени точности используемых часов в операционной системе. + Если временные метки действительно нужны, определите степень + требуемой точности и используйте тот <acronym>API</acronym>, + в котором документируется получение достаточной + точности.</para> + + <para>Ряд простых системных вызовов (например, + &man.gettimeofday.2;, &man.getpid.2;) работают намного быстрее + в &linux; по сравнению с любой другой операционной системой + из-за кеширования и используемой оптимизации vsyscall. Не + полагайтесь на их дешевизну в критичных к производительности + приложениях. В целом, старайтесь избегать системных вызовов + там, где это возможно.</para> + + <para>Не полагайтесь на специфичное для &linux; поведение сокета. + В частности, отличаются размеры буфера сокета по умолчанию + (выполните вызов &man.setsockopt.2; с + <literal>SO_SNDBUF</literal> и <literal>SO_RCVBUF</literal>, и + в то время как в &linux; при заполнении буфера сокета + &man.send.2; блокируется, &os; возвращает ошибку и + устанавливает <literal>ENOBUFS</literal> в качестве значения + errno.</para> + + <para>Если требуется рассчитывать на нестандартное поведение, + инкапсулируйте это должным образом в общий для всех + <acronym>API</acronym> с проверкой поведения на этапе + конфигурации, и если требуемое поведение не найдено, + прекращайте выполнение.</para> + + <para>Используйте <link + xlink:href="http://www.freebsd.org/cgi/man.cgi">страницы + справочника</link> для проверки, относится ли функция к + интерфейсу <acronym>POSIX</acronym> (ищите раздел + <quote>STANDARDS</quote> на странице справочника).</para> + + <para>Не рассчитывайте на то, что в качестве + <filename>/bin/sh</filename> используется + <application>bash</application>. Убедитесь, что командная + строка, переданная в &man.system.3;, будет работать в + <acronym>POSIX</acronym>-совместимой оболочке.</para> + + <para>Список основных <application>bash</application>-измов + расположен <link + xlink:href="https://wiki.ubuntu.com/DashAsBinSh">здесь</link>.</para> + + <para>Проверьте, что используемые заголовочные файлы включены в + <acronym>POSIX</acronym> или список, рекомендуемый страницей + справочника, т.к. например, забыть подключить + <filename>sys/types.h</filename> — не такая уж проблема в + &linux;, однако это не так во &os;.</para> + + <para>Компилируйте многопоточные приложения с ключом + <quote>-pthread</quote>, а не <quote>-lpthread</quote> или + как-либо ещё.</para> + </sect1> + + <sect1 xml:id="dads-misc"> + <title>Разное</title> + + <para>Файлы <filename>pkg-descr</filename> и + <filename>pkg-plist</filename> должны проверяться дважды. Если + вы пересматриваете порт и думаете, что его можно описать иначе, + сделайте это.</para> + + <para>Пожалуйста, не создавайте дополнительных копий лицензии GNU + General Public License в нашей системе.</para> + + <para>Будьте внимательны с юридическими вопросами! Не делайте из + нас нелегальных распространителей ПО!</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml index c0c1656a6a..6a88c9eab9 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/porting-samplem/chapter.xml @@ -7,21 +7,24 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="porting-samplem"> +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="porting-samplem"> - <title>Примерный <filename>Makefile</filename></title> + <title>Примерный <filename>Makefile</filename></title> - <para>Вот примерный <filename>Makefile</filename>, который можно - использовать при создании нового порта. Обязательно удалите все - дополнительные комментарии (те, которые в скобках)!</para> + <para>Вот примерный <filename>Makefile</filename>, который можно + использовать при создании нового порта. Обязательно удалите все + дополнительные комментарии (те, которые в скобках)!</para> - <para>Вам рекомендуется следовать этому формату (соблюдая порядок - следования переменных, пустые строки между разделами, и так далее). - Этот формат разработан для того, чтобы важная информация была легко - найдена. Мы рекомендуем вам воспользоваться утилитой <link linkend="porting-portlint">portlint</link> для проверки файла - <filename>Makefile</filename>.</para> + <para>Вам рекомендуется следовать этому формату (соблюдая порядок + следования переменных, пустые строки между разделами, и так + далее). Этот формат разработан для того, чтобы важная информация + была легко найдена. Мы рекомендуем вам воспользоваться утилитой + <link linkend="porting-portlint">portlint</link> для проверки + файла <filename>Makefile</filename>.</para> - <programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.] + <programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.] # Created by: Satoshi Asami <asami@FreeBSD.org> [Необязательная строка <emphasis>Created by:</emphasis> содержит имя человека, создавшего первоначальную версию порта. Следует отметить, @@ -41,56 +44,56 @@ PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними. Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно, EXTRACT_ONLY.] -PORTNAME= xdvi -PORTVERSION= 18.2 -CATEGORIES= print +PORTNAME= xdvi +PORTVERSION= 18.2 +CATEGORIES= print [не забывайте про завершающую косую черту ("/")! если вы не используете макросы MASTER_SITE_*] -MASTER_SITES= ${MASTER_SITE_XCONTRIB} +MASTER_SITES= ${MASTER_SITE_XCONTRIB} MASTER_SITE_SUBDIR= applications -PKGNAMEPREFIX= ja- -DISTNAME= xdvi-pl18 +PKGNAMEPREFIX= ja- +DISTNAME= xdvi-pl18 [задайте это, если исходный код поставляется не в виде стандартного файла ".tar.gz"] -EXTRACT_SUFX= .tar.Z +EXTRACT_SUFX= .tar.Z [секция патчей -- может быть пустой] -PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ -PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz +PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ +PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz [сопровождающий; *обязательное поле*! Это человек, который добровольно занимается обновлениями порта и неисправностями при построении, и которому пользователь может направлять вопросы и сообщения об ошибках. Для сохранения как можно более высокого качества Коллекции Портов мы больше не принимаем новые порты, назначенные на "ports@FreeBSD.org".] -MAINTAINER= asami@FreeBSD.org -COMMENT= DVI Previewer for the X Window System +MAINTAINER= asami@FreeBSD.org +COMMENT= DVI Previewer for the X Window System [зависимости -- могут быть пустыми] -RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript +RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript [этот раздел для остальных стандартных переменных из bsd.port.mk, кроме тех, что перечислены выше] [Если порт задает вопросы во время этапов настройки, построения, установки...] -IS_INTERACTIVE= yes +IS_INTERACTIVE= yes [Если распаковка происходит в каталог, отличных от ${DISTNAME}...] -WRKSRC= ${WRKDIR}/xdvi-new +WRKSRC= ${WRKDIR}/xdvi-new [Если патчи делались не относительно ${WRKSRC}, вам, может быть, не придется изменять эту переменную] -PATCH_DIST_STRIP= -p1 +PATCH_DIST_STRIP= -p1 [Если порт требует скрипта "configure", генерируемого GNU-версией программы autoconf] -GNU_CONFIGURE= yes +GNU_CONFIGURE= yes [Если для построения порту требуется GNU-версия утилиты make, а не /usr/bin/make...] -USES= gmake +USES= gmake [Если это приложение X и требует запуска "xmkmf -a"...] -USES= imake +USES= imake [и так далее] [В правилах ниже используются нестандартные переменные] -MY_FAVORITE_RESPONSE= "yeah, right" +MY_FAVORITE_RESPONSE= "yeah, right" [теперь специальные правила, в порядке их вызова] pre-fetch: @@ -104,7 +107,5 @@ pre-install: [и, наконец, эпилог] -.include <bsd.port.mk> - </programlisting> - </chapter> - +.include <bsd.port.mk></programlisting> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml index 42ae60f1cf..e57a947951 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/porting-why/chapter.xml @@ -7,19 +7,20 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="why-port"> +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="why-port"> - <title>Введение</title> + <title>Введение</title> - <para>Коллекция портов &os; является способом, используемым - практически каждым для установки приложений ("портов") на &os;. - Как и почти всё остальное во &os;, эта система в основном является - добровольно поддерживаемым начинанием. Важно иметь это в виду при - чтении данного документа.</para> - - <para>Во &os; каждый может прислать новый порт либо изъявить желание - поддерживать существующий порт, если его никто ещё никто не - поддерживает—вам не нужно иметь никаких особых привилегий на - внесение изменений, чтобы это делать.</para> - </chapter> + <para>Коллекция портов &os; является способом, используемым + практически каждым для установки приложений ("портов") на &os;. + Как и почти всё остальное во &os;, эта система в основном + является добровольно поддерживаемым начинанием. Важно иметь это + в виду при чтении данного документа.</para> + <para>Во &os; каждый может прислать новый порт либо изъявить + желание поддерживать существующий порт, если его никто ещё никто + не поддерживает—вам не нужно иметь никаких особых + привилегий на внесение изменений, чтобы это делать.</para> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml index 8b6b0b498e..c5357a8b18 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/quick-porting/chapter.xml @@ -7,150 +7,155 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="quick-porting"> +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="quick-porting"> - <title>Быстрое портирование</title> + <title>Быстрое портирование</title> - <para>В этом разделе описано, как создать новый порт на скорую руку. - Во многих случаях этого бывает не достаточно, так что вам нужно будет - прочитать документ дальше.</para> + <para>В этом разделе описано, как создать новый порт на скорую + руку. Во многих случаях этого бывает не достаточно, так что вам + нужно будет прочитать документ дальше.</para> - <para>Во-первых, скачайте оригинальный tar-файл и поместите его в каталог - <varname>DISTDIR</varname>, который по умолчанию есть не что иное, как - <filename>/usr/ports/distfiles</filename>.</para> + <para>Во-первых, скачайте оригинальный tar-файл и поместите его в + каталог <varname>DISTDIR</varname>, который по умолчанию есть не + что иное, как <filename>/usr/ports/distfiles</filename>.</para> - <note> - <para>Здесь предполагается, что программное обеспечение компилируется - без проблем как есть, то есть для работы приложения на вашей системе - &os; не потребовалось абсолютно никаких изменений. Если - требовалось что-то изменить, то вам придется обратиться также и к - следующему разделу.</para> - </note> + <note> + <para>Здесь предполагается, что программное обеспечение + компилируется без проблем как есть, то есть для работы + приложения на вашей системе &os; не потребовалось абсолютно + никаких изменений. Если требовалось что-то изменить, то вам + придется обратиться также и к следующему разделу.</para> + </note> - <note> - <para>Перед началом портирования рекомендуется установить - переменную &man.make.1; <varname>DEVELOPER</varname> в - <filename>/etc/make.conf</filename>.</para> + <note> + <para>Перед началом портирования рекомендуется установить + переменную &man.make.1; <varname>DEVELOPER</varname> в + <filename>/etc/make.conf</filename>.</para> - <screen>&prompt.root; <userinput>echo DEVELOPER=yes >> /etc/make.conf</userinput></screen> + <screen>&prompt.root; <userinput>echo DEVELOPER=yes >> /etc/make.conf</userinput></screen> - <para>Эта настройка включает <quote>режим разработчика</quote>, - в котором отображаются предупреждения при использовании - устаревших конструкций и задействуются некоторые дополнительные - проверки при вызове команды <command>make</command>.</para> - </note> + <para>Эта настройка включает <quote>режим разработчика</quote>, в + котором отображаются предупреждения при использовании + устаревших конструкций и задействуются некоторые дополнительные + проверки при вызове команды <command>make</command>.</para> + </note> - <sect1 xml:id="porting-makefile"> - <title>Создание файла <filename>Makefile</filename></title> + <sect1 xml:id="porting-makefile"> + <title>Создание файла <filename>Makefile</filename></title> - <para>Минимальный <filename>Makefile</filename> будет выглядеть - примерно так:</para> + <para>Минимальный <filename>Makefile</filename> будет выглядеть + примерно так:</para> - <programlisting># $FreeBSD$ + <programlisting># $FreeBSD$ -PORTNAME= oneko -PORTVERSION= 1.1b -CATEGORIES= games -MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/ +PORTNAME= oneko +PORTVERSION= 1.1b +CATEGORIES= games +MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/ -MAINTAINER= youremail@example.com -COMMENT= Cat chasing a mouse all over the screen +MAINTAINER= youremail@example.com +COMMENT= Cat chasing a mouse all over the screen .include <bsd.port.mk></programlisting> + <note> + <para>В некоторых случаях в заголовке + <filename>Makefile</filename> существующего порта могут + содержаться дополнительные строки, такие как название порта и + дата его создания. Эта дополнительная информация была + объявлена устаревшей и находится в процессе удаления.</para> + </note> + + <para>Посмотрим, сможете ли вы его понять. Не обращайте внимание + на содержимое строчки + <literal>$FreeBSD$</literal>, она будет заполнена + автоматически системой <application>Subversion</application>, + когда порт будет импортирован в наше дерево портов. Вы можете + найти более подробный пример в разделе <link + linkend="porting-samplem">пример Makefile</link>.</para> + </sect1> + + <sect1 xml:id="porting-desc"> + <title>Создание информационных файлов</title> + + <para>Имеется два информационных файла, которые требуются для + любого порта, вне зависимости от того, является ли он пакетом + или нет. Это <filename>pkg-descr</filename> и + <filename>pkg-plist</filename>. Префикс + <filename>pkg-</filename> отличает их от других файлов.</para> + + <sect2> + <title><filename>pkg-descr</filename></title> + + <para>Это более подробное краткое описание порта. От одного до + нескольких абзацев, кратко описывающих, что представляет + собой порт, будет достаточно.</para> + + <note> + <para>Это <emphasis>не</emphasis> руководство и не + подробнейшее описание того, как использовать или + компилировать порт! <emphasis>Пожалуйста, будьте + внимательны при копировании текста из + <filename>README</filename> или страниц справочника + </emphasis>; слишком часто они не являются кратким + описанием порта или имеют неудобный формат (например, + страницы справочника выровнены пробелами, что особенно + плохо смотрится с моноширинными шрифтами).</para> + </note> + + <para>Хорошо составленный <filename>pkg-descr</filename> + описывает порт достаточно полно, чтобы пользователю не + приходилось сверяться с документацией или посещать вебсайт + для понимания того, что делает данное программное + обеспечение, чем оно может быть полезно или какие хорошие + функции у него имеются. Упоминание про определённые + требования, такие как используемый графический + инструментарий, тяжёлые зависимости, окружение для запуска + или используемый язык программирования помогут пользователям + определиться, будет ли этот порт для них работать.</para> + + <para>Включите сюда URL официальной домашней страницы Интернет. + Перед <emphasis>одним</emphasis> из сайтов (выберите + основной) добавьте <literal>WWW:</literal> (с последующим + единичным пробелом) для того, чтобы вспомогательные утилиты + работали правильно. Если URI является корнем сайта или + каталогом, то значение должно быть дополнено косой + чертой.</para> + <note> - <para>В некоторых случаях в заголовке <filename>Makefile</filename> - существующего порта могут содержаться дополнительные строки, - такие как название порта и дата его создания. - Эта дополнительная информация была объявлена устаревшей - и находится в процессе удаления.</para> + <para>Если указанная для порта веб-страница не доступна, + попытайтесь сперва поискать, был ли официальный сайт + перемещён, переименован или размещён в другом месте.</para> </note> - <para>Посмотрим, сможете ли вы его понять. Не обращайте внимание на - содержимое строчки <literal>$FreeBSD$</literal>, она - будет заполнена автоматически системой - <application>Subversion</application>, когда порт будет - импортирован в наше дерево портов. Вы можете найти более подробный - пример в разделе <link linkend="porting-samplem">пример - Makefile</link>.</para> - </sect1> - - <sect1 xml:id="porting-desc"> - <title>Создание информационных файлов</title> - - <para>Имеется два информационных файла, которые требуются для любого - порта, вне зависимости от того, является ли он пакетом или нет. Это - <filename>pkg-descr</filename> и <filename>pkg-plist</filename>. - Префикс <filename>pkg-</filename> отличает их от других файлов.</para> - - <sect2> - <title><filename>pkg-descr</filename></title> - - <para>Это более подробное краткое описание порта. От одного до - нескольких абзацев, кратко описывающих, что представляет собой - порт, будет достаточно.</para> - - <note> - <para>Это <emphasis>не</emphasis> руководство и не подробнейшее - описание того, как использовать или компилировать порт! - <emphasis>Пожалуйста, будьте внимательны при копировании текста - из <filename>README</filename> или страниц - справочника</emphasis>; слишком часто они не являются кратким - описанием порта или имеют неудобный формат (например, страницы - справочника выровнены пробелами, что особенно плохо - смотрится с моноширинными шрифтами).</para> - </note> - - <para>Хорошо составленный <filename>pkg-descr</filename> - описывает порт достаточно полно, чтобы пользователю не - приходилось сверяться с документацией или посещать вебсайт - для понимания того, что делает данное программное обеспечение, - чем оно может быть полезно или какие хорошие функции у него - имеются. Упоминание про определённые требования, такие как - используемый графический инструментарий, тяжёлые зависимости, - окружение для запуска или используемый язык программирования - помогут пользователям определиться, будет ли этот порт для - них работать.</para> - - <para>Включите сюда URL официальной домашней страницы Интернет. - Перед <emphasis>одним</emphasis> из сайтов (выберите основной) - добавьте <literal>WWW:</literal> (с последующим единичным - пробелом) для того, чтобы вспомогательные утилиты работали - правильно. Если URI является корнем сайта или каталогом, - то значение должно быть дополнено косой чертой.</para> - - <note> - <para>Если указанная для порта веб-страница не доступна, - попытайтесь сперва поискать, был ли официальный сайт - перемещён, переименован или размещён в другом месте.</para> - </note> - - <para>Следующий пример показывает, как должен выглядеть ваш - <filename>pkg-descr</filename>:</para> - - <programlisting>This is a port of oneko, in which a cat chases a poor mouse all over + <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> - <sect2> - <title><filename>pkg-plist</filename></title> + <sect2> + <title><filename>pkg-plist</filename></title> - <para>Здесь перечисляются все файлы, устанавливаемые портом. Его - также называют <quote>списком для упаковки</quote>, потому что - пакет генерируется упаковкой файлов, которые здесь указаны. - Имена путей указываются относительно установочного префикса - (обычно <filename>/usr/local</filename>). - Если порт во время установки создает каталоги, убедитесь, - что добавлены строки <literal>@dirrm</literal> для удаления - каталогов при удалении пакета.</para> + <para>Здесь перечисляются все файлы, устанавливаемые портом. + Его также называют <quote>списком для упаковки</quote>, + потому что пакет генерируется упаковкой файлов, которые здесь + указаны. Имена путей указываются относительно установочного + префикса (обычно <filename>/usr/local</filename>). Если порт + во время установки создает каталоги, убедитесь, что добавлены + строки <literal>@dirrm</literal> для удаления каталогов при + удалении пакета.</para> - <para>Вот маленький пример:</para> + <para>Вот маленький пример:</para> - <programlisting>bin/oneko + <programlisting>bin/oneko man/man1/oneko.1.gz lib/X11/app-defaults/Oneko lib/X11/oneko/cat1.xpm @@ -158,250 +163,258 @@ lib/X11/oneko/cat2.xpm lib/X11/oneko/mouse.xpm @dirrm lib/X11/oneko</programlisting> - <para>Обратитесь к странице справочной системы по команде - &man.pkg-create.8; с подробным описанием формата списка - упаковки.</para> - - <note> - <para>Рекомендуется, чтобы имена файлов в этом списке были - отсортированы в алфавитном порядке. Это позволит значительно - облегчить сверку изменений при обновлении порта.</para> - </note> - - <note> - <para>Создание списка упаковки вручную может оказаться весьма - трудоёмкой задачей. Если порт устанавливает большое количество - файлов, раздел об <link linkend="plist-autoplist">автоматическом построении списка - упаковки</link> может помочь сэкономить время.</para> - </note> - - <para>Существует только одно исключение, когда у порта может - отсутствовать <filename>pkg-plist</filename>. Если порт - устанавливает лишь несколько файлов, а возможно, и каталогов, то - они могут быть перечислены в переменных - <varname>PLIST_FILES</varname> и <varname>PLIST_DIRS</varname>, - соответственно, внутри файла <filename>Makefile</filename> порта. - К примеру, мы можем обойтись без файла - <filename>pkg-plist</filename> у приведённого выше порта - <filename>oneko</filename>, добавив следующие строки в - <filename>Makefile</filename>:</para> - - <programlisting>PLIST_FILES= bin/oneko \ - man/man1/oneko.1.gz \ - lib/X11/app-defaults/Oneko \ - lib/X11/oneko/cat1.xpm \ - lib/X11/oneko/cat2.xpm \ - lib/X11/oneko/mouse.xpm -PLIST_DIRS= lib/X11/oneko</programlisting> - - <para>Конечно, переменная <varname>PLIST_DIRS</varname> не должна - задаваться, если порт не устанавливает никаких каталогов.</para> - - <note> - <para>Несколько портов могут совместно использовать общий - каталог. В этом случае <varname>PLIST_DIRS</varname> - следует заменить на <varname>PLIST_DIRSTRY</varname>, так - чтобы каталог удалялся только если он пуст, а иначе - игнорировался. Использование <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname> аналогично - <literal>@dirrm</literal> и <literal>@dirrmtry</literal> - в <filename>pkg-plist</filename>, описание которых - входит в <xref linkend="plist-dir-cleaning"/>.</para> - </note> - - <para>Обратной стороной такого способа перечисления файлов и - каталогов порта является невозможность использования - последовательностей команд, описанных в &man.pkg-create.8;. - Поэтому он подходит для простых портов, что делает их ещё более - простыми. Одновременно с этим положительным моментом является - уменьшение количества файлов в коллекции портов. Пожалуйста, - подумайте над использованием этой техники, прежде чем создавать - <filename>pkg-plist</filename>.</para> - - <para>Далее мы увидим, как можно использовать файлы - <filename>pkg-plist</filename> и <varname>PLIST_FILES</varname> - выполнения <link linkend="plist">более сложных - задач</link>.</para> - </sect2> - </sect1> - - <sect1 xml:id="porting-checksum"> - <title>Создание файла с контрольной суммой</title> - - <para>Просто введите команду <command>make makesum</command>. - Правила утилиты make автоматически сгенерируют файл - <filename>distinfo</filename>.</para> - - <para>Если у извлекаемого файла регулярно меняется контрольная - сумма и вы не сомневаетесь в надежности источника (т.е. он получен - из CD производителя, либо ежедневно обновляется документация), то вы - должны указать эти файлы в переменной <varname>IGNOREFILES</varname>. - Тогда контрольная сумма при выполнении <command>make makesum</command> - для этого файла создаваться не будет, а вместо этого для него будет - установлено значение <literal>IGNORE</literal>.</para> - </sect1> - - <sect1 xml:id="porting-testing"> - <title>Тестирование порта</title> - - <para>Вы должны удостовериться, что правила построения порта выполняют - именно то, что вы хотите, включая создание пакета для порта. Вот - те важные вещи, которые вы должны проверить.</para> - - <itemizedlist> - <listitem> - <para><filename>pkg-plist</filename> не содержит ничего сверх того, - что устанавливается портом</para> - </listitem> - - <listitem> - <para><filename>pkg-plist</filename> содержит абсолютно все, что - устанавливается портом</para> - </listitem> - - <listitem> - <para>Порт может быть установлен с помощью - указания цели <buildtarget>install</buildtarget>. Это - позволяет убедиться в правильной работе сценария - установки.</para> - </listitem> - - <listitem> - <para>Порт может быть правильным образом удалён с помощью - указания цели <buildtarget>deinstall</buildtarget>. Это - позволяет убедиться в правильной работе сценария - удаления.</para> - </listitem> - - <listitem> - <para>Следует убедиться, что <command>make package</command> - можно запустить из-под обычного пользователя (то есть, - не из-под <systemitem class="username">root</systemitem>). - Если это не так, в <filename>Makefile</filename> порта - должно быть добавлено <literal>NEED_ROOT=yes</literal>.</para> - </listitem> - </itemizedlist> - - <procedure> - <title>Рекомендуемый порядок проверки</title> - - <step> - <para><command>make stage</command></para> - </step> - - <step> - <para><command>make check-orphans</command></para> - </step> - - <step> - <para><command>make package</command></para> - </step> - - <step> - <para><command>make install</command></para> - </step> - - <step> - <para><command>make deinstall</command></para> - </step> - - <step> - <para><command>pkg add package-filename</command></para> - </step> - - <step> - <para><command>make package</command> (из-под - пользователя)</para> - </step> - </procedure> - - <para>Убедитесь, что на любом из этапов не выдается никаких - предупреждений.</para> - - <para>Основательное автоматизированное тестирование может быть - выполнено при помощи - <package role="port">ports-mgmt/tinderbox</package> или - <package role="port">ports-mgmt/poudriere</package> из Коллекции - Портов. Эти приложения используют <literal>jails</literal>, - в которых проверяются все перечисленные выше этапы без - изменения состояния основной системы.</para> - </sect1> - - <sect1 xml:id="porting-portlint"> - <title>Проверка вашего порта утилитой - <command>portlint</command></title> - - <para>Будьте добры, пользуйтесь утилитой <command>portlint</command> - для проверки того, что ваш порт соответствует нашим рекомендациям. - Программа <package role="port">ports-mgmt/portlint</package> - является частью Коллекции - Портов. В частности, вы можете захотеть проверить, правильно ли - сформирован файл <link linkend="porting-samplem">Makefile</link> и - соответствующим ли образом именован <link linkend="porting-pkgname">пакет</link>.</para> - </sect1> - - <sect1 xml:id="porting-submitting"> - <title>Посылка нового порта</title> - - <para>Перед посылкой нового порта прочитайте раздел о том, что - <link linkend="porting-dads">можно и нельзя</link> делать.</para> - - <para>Когда вы наконец довольны своим первым портом, единственное, - что осталось сделать, это включить его в основное дерево портов - &os; и осчастливить этим всех остальных. Нам не нужен ни - каталог <filename>work</filename>, ни пакет - <filename>pkgname.tgz</filename>, так что удалите их прямо - сейчас.</para> - - <para>Затем получите файл &man.shar.1;. Предполагая, что порт - называется oneko, перейдите в каталог выше, где находится - каталог <literal>oneko</literal>, и наберите: - <command>shar `find oneko` > oneko.shar</command></para> - - <para>Включите <filename>oneko.shar</filename> в сообщение об - ошибке и пошлите его с помощью &man.send-pr.1;. Обратитесь к - разделу <link - xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL"> - Сообщения об ошибках и общие замечания</link> для получения - подробной информации о &man.send-pr.1;).</para> - - <para>Укажите в сообщении категорию <literal>ports</literal> и - класс <literal>change-request</literal>. - <emphasis>Не</emphasis> указывайте, что сообщение имеет статус - <literal>confidential</literal>! Добавьте краткое описание - программы в поле <quote>Description</quote> отправляемого PR - (например, содержимое <varname>COMMENT</varname> в сокращённом - варианте) и сам файл в виде архива <filename>.shar</filename> - в поле <quote>Fix</quote>.</para> + <para>Обратитесь к странице справочной системы по команде + &man.pkg-create.8; с подробным описанием формата списка + упаковки.</para> <note> - <para>Хорошее описание в заголовке сообщения о проблеме - значительно облегчает работу коммиттеров портов. Для новых - портов мы предпочитаем нечто вроде <quote>New port: - <категория>/<название порта> <краткое - описание порта></quote>. Следование этой схеме - упрощает и ускоряет начало работы по добавлению нового + <para>Рекомендуется, чтобы имена файлов в этом списке были + отсортированы в алфавитном порядке. Это позволит + значительно облегчить сверку изменений при обновлении порта.</para> </note> - <para>Повторим ещё раз, что <emphasis>не нужно включать ни оригинальный - файл с дистрибутивом, ни каталог <filename>work</filename>, - ни пакет, построенный вами командой - <command>make package</command></emphasis>; для новых портов - используйте &man.shar.1;, но не &man.diff.1;.</para> - - <para>После отправки порта, пожалуйста, потерпите. Время, - необходимое для включения нового порта во &os;, может занимать - от нескольких дней до нескольких месяцев. <link - xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports"> - Здесь</link> можно увидеть список ожидающих PR для портов.</para> - - <para>После рассмотрения нового порта мы при необходимости вам - ответим, а затем включим порт в наше дерево. Ваше имя также - будет добавлено в список <link - xlink:href="&url.articles.contributors;/contrib-additional.html"> - Дополнительных контрибуторов проекта &os;</link> и другие - файлы.</para> - </sect1> - </chapter> + <note> + <para>Создание списка упаковки вручную может оказаться весьма + трудоёмкой задачей. Если порт устанавливает большое + количество файлов, раздел об <link + linkend="plist-autoplist">автоматическом построении + списка упаковки</link> может помочь сэкономить + время.</para> + </note> + + <para>Существует только одно исключение, когда у порта может + отсутствовать <filename>pkg-plist</filename>. Если порт + устанавливает лишь несколько файлов, а возможно, и каталогов, + то они могут быть перечислены в переменных + <varname>PLIST_FILES</varname> и + <varname>PLIST_DIRS</varname>, соответственно, внутри файла + <filename>Makefile</filename> порта. К примеру, мы можем + обойтись без файла <filename>pkg-plist</filename> у + приведённого выше порта <filename>oneko</filename>, добавив + следующие строки в <filename>Makefile</filename>:</para> + + <programlisting>PLIST_FILES= bin/oneko \ + man/man1/oneko.1.gz \ + lib/X11/app-defaults/Oneko \ + lib/X11/oneko/cat1.xpm \ + lib/X11/oneko/cat2.xpm \ + lib/X11/oneko/mouse.xpm +PLIST_DIRS= lib/X11/oneko</programlisting> + + <para>Конечно, переменная <varname>PLIST_DIRS</varname> не + должна задаваться, если порт не устанавливает никаких + каталогов.</para> + + <note> + <para>Несколько портов могут совместно использовать общий + каталог. В этом случае <varname>PLIST_DIRS</varname> + следует заменить на <varname>PLIST_DIRSTRY</varname>, так + чтобы каталог удалялся только если он пуст, а иначе + игнорировался. Использование <varname>PLIST_DIRS</varname> + и <varname>PLIST_DIRSTRY</varname> аналогично + <literal>@dirrm</literal> и <literal>@dirrmtry</literal> в + <filename>pkg-plist</filename>, описание которых входит в + <xref linkend="plist-dir-cleaning"/>.</para> + </note> + + <para>Обратной стороной такого способа перечисления файлов и + каталогов порта является невозможность использования + последовательностей команд, описанных в &man.pkg-create.8;. + Поэтому он подходит для простых портов, что делает их ещё + более простыми. Одновременно с этим положительным моментом + является уменьшение количества файлов в коллекции портов. + Пожалуйста, подумайте над использованием этой техники, прежде + чем создавать <filename>pkg-plist</filename>.</para> + + <para>Далее мы увидим, как можно использовать файлы + <filename>pkg-plist</filename> и + <varname>PLIST_FILES</varname> выполнения <link + linkend="plist">более сложных задач</link>.</para> + </sect2> + </sect1> + + <sect1 xml:id="porting-checksum"> + <title>Создание файла с контрольной суммой</title> + + <para>Просто введите команду <command>make makesum</command>. + Правила утилиты make автоматически сгенерируют файл + <filename>distinfo</filename>.</para> + + <para>Если у извлекаемого файла регулярно меняется контрольная + сумма и вы не сомневаетесь в надежности источника (т.е. он + получен из CD производителя, либо ежедневно обновляется + документация), то вы должны указать эти файлы в переменной + <varname>IGNOREFILES</varname>. Тогда контрольная сумма при + выполнении <command>make makesum</command> для этого файла + создаваться не будет, а вместо этого для него будет установлено + значение <literal>IGNORE</literal>.</para> + </sect1> + + <sect1 xml:id="porting-testing"> + <title>Тестирование порта</title> + + <para>Вы должны удостовериться, что правила построения порта + выполняют именно то, что вы хотите, включая создание пакета для + порта. Вот те важные вещи, которые вы должны проверить.</para> + + <itemizedlist> + <listitem> + <para><filename>pkg-plist</filename> не содержит ничего сверх + того, что устанавливается портом</para> + </listitem> + + <listitem> + <para><filename>pkg-plist</filename> содержит абсолютно все, + что устанавливается портом</para> + </listitem> + + <listitem> + <para>Порт может быть установлен с помощью указания цели + <buildtarget>install</buildtarget>. Это позволяет + убедиться в правильной работе сценария установки.</para> + </listitem> + + <listitem> + <para>Порт может быть правильным образом удалён с помощью + указания цели <buildtarget>deinstall</buildtarget>. Это + позволяет убедиться в правильной работе сценария + удаления.</para> + </listitem> + + <listitem> + <para>Следует убедиться, что <command>make package</command> + можно запустить из-под обычного пользователя (то есть, не + из-под <systemitem class="username">root</systemitem>). + Если это не так, в <filename>Makefile</filename> порта + должно быть добавлено + <literal>NEED_ROOT=yes</literal>.</para> + </listitem> + </itemizedlist> + + <procedure> + <title>Рекомендуемый порядок проверки</title> + + <step> + <para><command>make stage</command></para> + </step> + + <step> + <para><command>make check-orphans</command></para> + </step> + + <step> + <para><command>make package</command></para> + </step> + + <step> + <para><command>make install</command></para> + </step> + + <step> + <para><command>make deinstall</command></para> + </step> + + <step> + <para><command>pkg add package-filename</command></para> + </step> + + <step> + <para><command>make package</command> (из-под + пользователя)</para> + </step> + </procedure> + + <para>Убедитесь, что на любом из этапов не выдается никаких + предупреждений.</para> + + <para>Основательное автоматизированное тестирование может быть + выполнено при помощи <package + role="port">ports-mgmt/tinderbox</package> или <package + role="port">ports-mgmt/poudriere</package> из Коллекции + Портов. Эти приложения используют <literal>jails</literal>, + в которых проверяются все перечисленные выше этапы без + изменения состояния основной системы.</para> + </sect1> + + <sect1 xml:id="porting-portlint"> + <title>Проверка вашего порта утилитой + <command>portlint</command></title> + + <para>Будьте добры, пользуйтесь утилитой + <command>portlint</command> для проверки того, что ваш порт + соответствует нашим рекомендациям. Программа <package + role="port">ports-mgmt/portlint</package> является частью + Коллекции Портов. В частности, вы можете захотеть проверить, + правильно ли сформирован файл <link + linkend="porting-samplem">Makefile</link> и соответствующим + ли образом именован <link + linkend="porting-pkgname">пакет</link>.</para> + </sect1> + + <sect1 xml:id="porting-submitting"> + <title>Посылка нового порта</title> + + <para>Перед посылкой нового порта прочитайте раздел о том, что + <link linkend="porting-dads">можно и нельзя</link> + делать.</para> + + <para>Когда вы наконец довольны своим первым портом, + единственное, что осталось сделать, это включить его в основное + дерево портов &os; и осчастливить этим всех остальных. Нам не + нужен ни каталог <filename>work</filename>, ни пакет + <filename>pkgname.tgz</filename>, так что удалите их прямо + сейчас.</para> + + <para>Затем получите файл &man.shar.1;. Предполагая, что порт + называется oneko, перейдите в каталог выше, где находится + каталог <literal>oneko</literal>, и наберите: + <command>shar `find oneko` > oneko.shar</command></para> + + <para>Включите <filename>oneko.shar</filename> в сообщение об + ошибке и пошлите его с помощью &man.send-pr.1;. Обратитесь к + разделу <link + xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">Сообщения + об ошибках и общие замечания</link> для получения подробной + информации о &man.send-pr.1;).</para> + + <para>Укажите в сообщении категорию <literal>ports</literal> и + класс <literal>change-request</literal>. + <emphasis>Не</emphasis> указывайте, что сообщение имеет статус + <literal>confidential</literal>! Добавьте краткое описание + программы в поле <quote>Description</quote> отправляемого PR + (например, содержимое <varname>COMMENT</varname> в сокращённом + варианте) и сам файл в виде архива <filename>.shar</filename> в + поле <quote>Fix</quote>.</para> + + <note> + <para>Хорошее описание в заголовке сообщения о проблеме + значительно облегчает работу коммиттеров портов. Для новых + портов мы предпочитаем нечто вроде <quote>New port: + <категория>/<название порта> <краткое + описание порта></quote>. Следование этой схеме упрощает + и ускоряет начало работы по добавлению нового порта.</para> + </note> + <para>Повторим ещё раз, что <emphasis>не нужно включать ни + оригинальный файл с дистрибутивом, ни каталог + <filename>work</filename>, ни пакет, построенный вами + командой <command>make package</command></emphasis>; для + новых портов используйте &man.shar.1;, но не + &man.diff.1;.</para> + + <para>После отправки порта, пожалуйста, потерпите. Время, + необходимое для включения нового порта во &os;, может занимать + от нескольких дней до нескольких месяцев. <link + xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports"> + Здесь</link> можно увидеть список ожидающих PR для + портов.</para> + + <para>После рассмотрения нового порта мы при необходимости вам + ответим, а затем включим порт в наше дерево. Ваше имя также + будет добавлено в список <link + xlink:href="&url.articles.contributors;/contrib-additional.html"> + Дополнительных контрибуторов проекта &os;</link> и другие + файлы.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml index aedf010f93..afa76db02a 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/security/chapter.xml @@ -7,157 +7,165 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="security"> - - <title>Безопасность портов</title> - - <sect1 xml:id="security-intro"> - <title>Почему безопасность так важна</title> - - <para>Ошибки в программном обеспечении появляются случайно. Возможно, - самые опасные из них те, что создают уязвимости безопасности. С - технической точки зрения подобные уязвимости должны быть закрыты - путем исправления вызывающих их ошибок. Тем не менее, политики - обработки несущественных ошибок и уязвимостей очень различаются. - </para> - - <para>Обычная небольшая ошибка затрагивает только тех пользователей, - которые задействуют некоторые комбинации настроек, активирующие эту - ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую - версию программного обеспечения, свободного от ошибки, но большинство - пользователей не посчитают нужным сразу же произвести обновление, - поскольку эта ошибка никогда у них не проявлялась. Критическая - ошибка, которая может приводить к потере данных, представляет - серьезную проблему. Тем не менее, предусмотрительные пользователи - знают, что большинство возможных происшествий, и среди них программные - ошибки, скорее всего приводят к потере данных, поэтому они выполняют - резервное копирование важных данных; дополнительно, критическая - ошибка будет обнаружена очень скоро.</para> - - <para>С уязвимостью безопасности всё иначе. Во-первых, она может - сохраняться необнаруженной целые годы, потому что чаще всего не - вызывает ошибок в работе. Во-вторых, компания злоумышленников - может использовать ее для получения неавторизованного доступа к - уязвимой системе, уничтожить или подменить важные данные; в худшем - случае пользователь даже не заметит нанесенный урон. В-третьих, - взлом уязвимой системы часто упрощает задачу проникновения атакующих - в другие системы, которые не могут быть скомпрометированы иначе. - Таким образом, устранение уязвимости как таковой недостаточно: - следует разослать всем заинтересованным уведомления в наиболее - понятной и исчерпывающей форме, что позволит оценить риск и - предпринять подходящие меры.</para> - </sect1> - - <sect1 xml:id="security-fix"> - <title>Исправление уязвимостей безопасности</title> - - <para>Что касается портов и пакетов, уязвимость безопасности - изначально может появиться в исходном дистрибутиве или файлах - порта. В первом случае, разработчик исходного программного - обеспечения скорее всего сразу же выпустит патч или новую версию, - и вам лишь понадобится сразу обновить порт в соответствии с - исправлением автора. Если исправление по какой-то причине - задерживается, вам следует либо <link linkend="dads-noinstall">пометить - порт как <varname>FORBIDDEN</varname></link>, либо добавить в порт - ваш собственный патч. В случае уязвимости порта просто исправьте - этот порт как можно скорее. В любом случае нужно следовать - <link linkend="port-upgrading">стандартной процедуре отправки вашего - изменения</link>, если вы не обладаете правами на коммит изменения - непосредственно в дерево портов.</para> - - <important> - <para>Быть коммиттером портов недостаточно для коммита произвольного - порта. Помните, что обычно у портов есть сопровождающие, мнение - которых вы должны учитывать.</para> - </important> - - <para>Пожалуйста, убедитесь, что ревизия порта после закрытия - уязвимости увеличена. Вот как пользователи, обновляющие - установленные пакеты на постоянной основе, увидят, что им нужно - запустить обновление. Кроме того, новый пакет будет собран и - распространен через FTP и WWW зеркала, замещая уязвимый. - Если в процессе исправления уязвимости не было изменено значение - <varname>PORTVERSION</varname>, то должно быть увеличено значение - <varname>PORTREVISION</varname>. Вам следует увеличить значение - <varname>PORTREVISION</varname> после добавления в порт файла с - патчем, но не когда вы обновили порт до последней версии - программного обеспечения, попутно затронув при этом - <varname>PORTVERSION</varname>. За дальнейшей информацией - обращайтесь к - <link linkend="makefile-naming-revepoch">соответствующему +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="security"> + + <title>Безопасность портов</title> + + <sect1 xml:id="security-intro"> + <title>Почему безопасность так важна</title> + + <para>Ошибки в программном обеспечении появляются случайно. + Возможно, самые опасные из них те, что создают уязвимости + безопасности. С технической точки зрения подобные уязвимости + должны быть закрыты путем исправления вызывающих их ошибок. + Тем не менее, политики обработки несущественных ошибок и + уязвимостей очень различаются.</para> + + <para>Обычная небольшая ошибка затрагивает только тех + пользователей, которые задействуют некоторые комбинации + настроек, активирующие эту ошибку. Разработчик в конечном + счете выпустит патч, а зачтем новую версию программного + обеспечения, свободного от ошибки, но большинство пользователей + не посчитают нужным сразу же произвести обновление, поскольку + эта ошибка никогда у них не проявлялась. Критическая ошибка, + которая может приводить к потере данных, представляет серьезную + проблему. Тем не менее, предусмотрительные пользователи знают, + что большинство возможных происшествий, и среди них программные + ошибки, скорее всего приводят к потере данных, поэтому они + выполняют резервное копирование важных данных; дополнительно, + критическая ошибка будет обнаружена очень скоро.</para> + + <para>С уязвимостью безопасности всё иначе. Во-первых, она может + сохраняться необнаруженной целые годы, потому что чаще всего не + вызывает ошибок в работе. Во-вторых, компания злоумышленников + может использовать ее для получения неавторизованного доступа к + уязвимой системе, уничтожить или подменить важные данные; в + худшем случае пользователь даже не заметит нанесенный урон. + В-третьих, взлом уязвимой системы часто упрощает задачу + проникновения атакующих в другие системы, которые не могут быть + скомпрометированы иначе. Таким образом, устранение уязвимости + как таковой недостаточно: следует разослать всем + заинтересованным уведомления в наиболее понятной и + исчерпывающей форме, что позволит оценить риск и предпринять + подходящие меры.</para> + </sect1> + + <sect1 xml:id="security-fix"> + <title>Исправление уязвимостей безопасности</title> + + <para>Что касается портов и пакетов, уязвимость безопасности + изначально может появиться в исходном дистрибутиве или файлах + порта. В первом случае, разработчик исходного программного + обеспечения скорее всего сразу же выпустит патч или новую + версию, и вам лишь понадобится сразу обновить порт в + соответствии с исправлением автора. Если исправление по + какой-то причине задерживается, вам следует либо <link + linkend="dads-noinstall">пометить порт как + <varname>FORBIDDEN</varname></link>, либо добавить в порт ваш + собственный патч. В случае уязвимости порта просто исправьте + этот порт как можно скорее. В любом случае нужно следовать + <link linkend="port-upgrading">стандартной процедуре отправки + вашего изменения</link>, если вы не обладаете правами на + коммит изменения непосредственно в дерево портов.</para> + + <important> + <para>Быть коммиттером портов недостаточно для коммита + произвольного порта. Помните, что обычно у портов есть + сопровождающие, мнение которых вы должны учитывать.</para> + </important> + + <para>Пожалуйста, убедитесь, что ревизия порта после закрытия + уязвимости увеличена. Вот как пользователи, обновляющие + установленные пакеты на постоянной основе, увидят, что им нужно + запустить обновление. Кроме того, новый пакет будет собран и + распространен через FTP и WWW зеркала, замещая уязвимый. Если + в процессе исправления уязвимости не было изменено значение + <varname>PORTVERSION</varname>, то должно быть увеличено + значение <varname>PORTREVISION</varname>. Вам следует + увеличить значение <varname>PORTREVISION</varname> после + добавления в порт файла с патчем, но не когда вы обновили порт + до последней версии программного обеспечения, попутно затронув + при этом <varname>PORTVERSION</varname>. За дальнейшей + информацией обращайтесь к <link + linkend="makefile-naming-revepoch">соответствующему разделу</link>.</para> - </sect1> - - <sect1 xml:id="security-notify"> - <title>Обеспечение сообщества информацией</title> - - <sect2 xml:id="security-notify-vuxml-db"> - <title>База данных VuXML</title> - - <para>Очень важным и первостепенным шагом при действии как можно - раньше после раскрытия уязвимости является уведомление сообщества - пользователей порта об опасности. Такие уведомления служат двум - целям. Во-первых, в случае действительно серьезной угрозы, будет - посоветовано применить мгновенное воздействие. Например, остановить - затрагиваемый сетевой сервис или даже удалить порт целиком, - пока уязвимость не будет устранена. Во-вторых, масса - пользователей имеет тенденцию обновлять установленные пакеты только от - случая к случаю. Из уведомления они узнают, что - <emphasis>должны</emphasis> обновить пакет без промедления сразу - же после появления исправленной версии.</para> - - <para>Учитывая огромное число портов в дереве, невозможно по - каждому случаю выпускать бюллетень безопасности без создания - флуда и потери внимания сообщества к моменту появления - действительно серьезных причин. Поэтому уязвимости безопасности, - обнаруженные в портах, записываются в - <link xlink:href="http://vuxml.freebsd.org/">базу данных - &os; VuXML</link>. - Члены Команды Офицеров Безопасности также отслеживают её на - предмет появления вопросов, требующих их вмешательства.</para> - - <para>Если вы обладаете правами коммиттера, вы можете сам обновить - базу данных VuXML. Так вы поможете Команде Офицеров Безопасности - и своевременно пошлете ценную информацию сообществу. Тем не - менее, если вы не являетесь коммиттером или верите, что нашли - исключительно серьезную уязвимость, то не - задумываясь свяжитесь с Командой Офицеров Безопасности напрямую - как это описано на странице - <link xlink:href="http://www.freebsd.org/security/#how">информационной + </sect1> + + <sect1 xml:id="security-notify"> + <title>Обеспечение сообщества информацией</title> + + <sect2 xml:id="security-notify-vuxml-db"> + <title>База данных VuXML</title> + + <para>Очень важным и первостепенным шагом при действии как + можно раньше после раскрытия уязвимости является уведомление + сообщества пользователей порта об опасности. Такие + уведомления служат двум целям. Во-первых, в случае + действительно серьезной угрозы, будет посоветовано применить + мгновенное воздействие. Например, остановить затрагиваемый + сетевой сервис или даже удалить порт целиком, пока уязвимость + не будет устранена. Во-вторых, масса пользователей имеет + тенденцию обновлять установленные пакеты только от случая к + случаю. Из уведомления они узнают, что + <emphasis>должны</emphasis> обновить пакет без промедления + сразу же после появления исправленной версии.</para> + + <para>Учитывая огромное число портов в дереве, невозможно по + каждому случаю выпускать бюллетень безопасности без создания + флуда и потери внимания сообщества к моменту появления + действительно серьезных причин. Поэтому уязвимости + безопасности, обнаруженные в портах, записываются в <link + xlink:href="http://vuxml.freebsd.org/">базу данных &os; + VuXML</link>. Члены Команды Офицеров Безопасности также + отслеживают её на предмет появления вопросов, требующих их + вмешательства.</para> + + <para>Если вы обладаете правами коммиттера, вы можете сам + обновить базу данных VuXML. Так вы поможете Команде Офицеров + Безопасности и своевременно пошлете ценную информацию + сообществу. Тем не менее, если вы не являетесь коммиттером + или верите, что нашли исключительно серьезную уязвимость, то + не задумываясь свяжитесь с Командой Офицеров Безопасности + напрямую как это описано на странице <link + xlink:href="http://www.freebsd.org/security/#how">информационной безопасности &os;</link>.</para> - <para>База данных VuXML является документом <acronym>XML</acronym>. - Его исходный файл <filename>vuln.xml</filename> содержится - прямо внутри порта <package role="port">security/vuxml</package>. - Следовательно, полное имя пути к файлу будет - <filename>PORTSDIR/security/vuxml/vuln.xml</filename>. - Каждый раз, при обнаружении вами в порте уязвимости безопасности - добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML, - лучшее, что вы можете сделать, это найти существующую запись, - подпадающую под ваш случай, затем скопировать ее и использовать - в качестве шаблона.</para> - </sect2> - - <sect2 xml:id="security-notify-vuxml-intro"> - <title>Короткое вступление в VuXML</title> - - <para>В совокупности <acronym>XML</acronym> является очень - сложным форматом, и его описание выходит далеко за рамки - этой книги. Тем не менее, для достижения основного понимания - структуры записи VuXML вам понадобится всего лишь понять теги. - Имена тегов XML обрамляются в угловые скобки. Каждый открывающий - <tag> должен иметь совпадающий закрывающий </tag>. - Теги могут быть вложенными. При вложенности внутренние теги - должны быть закрыты до закрытия внешних. Существует иерархия - тегов, т.е. более сложные правила вкладывания тегов. Это - похоже на HTML. Основное отличие в расширяемости XML, - т.е. в определении собственных тегов. Из-за своей характерной - структуры XML придает форму разрозненным данным. В частности, - XML подходит для разметки описаний уязвимостей безопасности.</para> - - <para>Теперь рассмотрим настоящую запись VuXML:</para> - - <programlisting><vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <co xml:id="co-vx-vid"/> + <para>База данных VuXML является документом + <acronym>XML</acronym>. Его исходный файл + <filename>vuln.xml</filename> содержится прямо внутри порта + <package role="port">security/vuxml</package>. + Следовательно, полное имя пути к файлу будет + <filename>PORTSDIR/security/vuxml/vuln.xml</filename>. + Каждый раз, при обнаружении вами в порте уязвимости + безопасности добавьте об этом запись в этот файл. Пока вы не + знакомы с VuXML, лучшее, что вы можете сделать, это найти + существующую запись, подпадающую под ваш случай, затем + скопировать ее и использовать в качестве шаблона.</para> + </sect2> + + <sect2 xml:id="security-notify-vuxml-intro"> + <title>Короткое вступление в VuXML</title> + + <para>В совокупности <acronym>XML</acronym> является очень + сложным форматом, и его описание выходит далеко за рамки этой + книги. Тем не менее, для достижения основного понимания + структуры записи VuXML вам понадобится всего лишь понять + теги. Имена тегов XML обрамляются в угловые скобки. Каждый + открывающий <tag> должен иметь совпадающий закрывающий + </tag>. Теги могут быть вложенными. При вложенности + внутренние теги должны быть закрыты до закрытия внешних. + Существует иерархия тегов, т.е. более сложные правила + вкладывания тегов. Это похоже на HTML. Основное отличие в + расширяемости XML, т.е. в определении собственных тегов. + Из-за своей характерной структуры XML придает форму + разрозненным данным. В частности, XML подходит для разметки + описаний уязвимостей безопасности.</para> + + <para>Теперь рассмотрим настоящую запись VuXML:</para> + + <programlisting><vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <co xml:id="co-vx-vid"/> <topic>Several vulnerabilities found in Foo</topic> <co xml:id="co-vx-top"/> <affects> <package> @@ -206,281 +214,296 @@ </dates> </vuln></programlisting> - <para>Имена тегов должны быть самодокументируемыми, чтобы мы - сфокусировались только на полях, нужных нам для заполнения:</para> - - <calloutlist> - <callout arearefs="co-vx-vid"> - <para>Это тег верхнего уровня записи VuXML. У него есть - обязательный атрибут <literal>vid</literal>, указывающий на - универсальный уникальный идентификатор (UUID) для этой записи - (в кавычках). Вы должны формировать UUID для каждой новой - записи VuXML (и не забудьте заменить ее для шаблона UUID, - если вы не пишете запись с нуля). Для получения VuXML UUID - вы можете использовать &man.uuidgen.1;.</para> - </callout> - - <callout arearefs="co-vx-top"> - <para>Однострочное описание найденной проблемы.</para> - </callout> - - <callout arearefs="co-vx-nam"> - <para>Здесь перечислены имена затронутых пакетов. - Может быть дано несколько имен, поскольку некоторые пакеты - могут быть основаны на одном главном порте или программном - продукте. Сюда можно включить стабильную ветвь и ветвь - разработки, локализованные версии и подчиненные порты, - зависящие от различного выбора важных вариантов конфигурации, - указанных на этапе построения.</para> - - <important> - <para>Поиск всех подобных пакетов при написании записи VuXML - входит в зону вашей ответственности. Имейте в виду, что - <literal>make search name=foo</literal> это ваш друг. - Первичные точки для поиска следующие:</para> - - <itemizedlist> - <listitem> - <para>вариант <filename>foo-devel</filename> для порта - <filename>foo</filename>;</para> - </listitem> - - <listitem> - <para>другие варианты с суффиксами вида - <literal>-a4</literal> (для пакетов, связанных с печатью), - <literal>-without-gui</literal> (для пакетов с - отключенной поддержкой X), или подобных;</para> - </listitem> - - <listitem> - <para><literal>jp-</literal>, <literal>ru-</literal>, - <literal>zh-</literal> и другие возможные локализованные - варианты в соответствующих национальных категориях - коллекции портов.</para> - </listitem> - </itemizedlist> - </important> - </callout> - - <callout arearefs="co-vx-rng"> - <para>Здесь указаны затронутые версии пакета(-ов) как один или - более диапазонов с использованием комбинации элементов - <literal><lt></literal>, <literal><le></literal>, - <literal><eq></literal>, <literal><ge></literal>, - и <literal><gt></literal>. Диапазоны внесённых версий - не должны пересекаться.</para> - - <para>В спецификации диапазонов <literal>*</literal> (звёздочка) - означает наименьший номер версии. В частности, - <literal>2.*</literal> меньше, чем <literal>2.a</literal>. - Поэтому звездочка может быть использована в диапазоне для - совпадения со всеми возможными <literal>alpha</literal>, - <literal>beta</literal> и <literal>RC</literal> версиями. - Как вариант, - <literal><ge>2.*</ge><lt>3.*</lt></literal> - выборочно совпадет с версией <literal>2.x</literal>, а - <literal><ge>2.0</ge><lt>3.0</lt></literal> - - нет, поскольку последнее не включает - <literal>2.r3</literal> и совпадает с <literal>3.b</literal>. - </para> - - <para>Пример выше указывает, что к затронутым относятся версии с - <literal>1.6</literal> до <literal>1.9</literal> включительно, - версии <literal>2.x</literal> до <literal>2.4_1</literal> и - версия <literal>3.0b1</literal>.</para> - </callout> - - <callout arearefs="co-vx-nm2"> - <para>Некоторые связанные группы пакетов (в конечном счете, порты) - могут быть указаны в разделе <literal><affected></literal>. - Это можно использовать, если некоторые программные продукты - (скажем, FooBar, FreeBar and OpenBar) являются производными - от общей кодовой базы и всё еще совместно используют её ошибки - и уязвимости. Имейте в виду отличие от перечисления - множественных имён в одном разделе <package>.</para> - </callout> - - <callout arearefs="co-vx-epo"> - <para>Диапазоны версий должны учитывать - <varname>PORTEPOCH</varname> и <varname>PORTREVISION</varname>, - если это применимо. Пожалуйста, помните, что в соответствии - с правилами сравнения строк версия с ненулевым значением - <varname>PORTEPOCH</varname> выше, чем любая версия без - <varname>PORTEPOCH</varname>, например, <literal>3.0,1</literal> - выше, чем <literal>3.1</literal> или даже <literal>8.9</literal>. - </para> - </callout> - - <callout arearefs="co-vx-bdy"> - <para>Сводная информация о проблеме. В этом поле - используется XHTML. По крайней мере, должны быть обрамляющие - <literal><p></literal> и <literal></p></literal>. - Может быть использована более сложная разметка, но только в - целях аккуратности и ясности: без эстетства, пожалуйста. - </para> - </callout> - - <callout arearefs="co-vx-ref"> - <para>Этот раздел содержит ссылки на имеющие отношение документы. - Приветствуется как можно большее количество ссылок.</para> - </callout> - - <callout arearefs="co-vx-fsa"> - <para>Это - <link xlink:href="http://www.freebsd.org/security/#adv">бюллетень + <para>Имена тегов должны быть самодокументируемыми, чтобы мы + сфокусировались только на полях, нужных нам для + заполнения:</para> + + <calloutlist> + <callout arearefs="co-vx-vid"> + <para>Это тег верхнего уровня записи VuXML. У него есть + обязательный атрибут <literal>vid</literal>, указывающий + на универсальный уникальный идентификатор (UUID) для этой + записи (в кавычках). Вы должны формировать UUID для + каждой новой записи VuXML (и не забудьте заменить ее для + шаблона UUID, если вы не пишете запись с нуля). Для + получения VuXML UUID вы можете использовать + &man.uuidgen.1;.</para> + </callout> + + <callout arearefs="co-vx-top"> + <para>Однострочное описание найденной проблемы.</para> + </callout> + + <callout arearefs="co-vx-nam"> + <para>Здесь перечислены имена затронутых пакетов. Может + быть дано несколько имен, поскольку некоторые пакеты + могут быть основаны на одном главном порте или + программном продукте. Сюда можно включить стабильную + ветвь и ветвь разработки, локализованные версии и + подчиненные порты, зависящие от различного выбора важных + вариантов конфигурации, указанных на этапе + построения.</para> + + <important> + <para>Поиск всех подобных пакетов при написании записи + VuXML входит в зону вашей ответственности. Имейте в + виду, что <literal>make search name=foo</literal> это + ваш друг. Первичные точки для поиска следующие:</para> + + <itemizedlist> + <listitem> + <para>вариант <filename>foo-devel</filename> для + порта <filename>foo</filename>;</para> + </listitem> + + <listitem> + <para>другие варианты с суффиксами вида + <literal>-a4</literal> (для пакетов, связанных с + печатью), <literal>-without-gui</literal> (для + пакетов с отключенной поддержкой X), или + подобных;</para> + </listitem> + + <listitem> + <para><literal>jp-</literal>, <literal>ru-</literal>, + <literal>zh-</literal> и другие возможные + локализованные варианты в соответствующих + национальных категориях коллекции портов.</para> + </listitem> + </itemizedlist> + </important> + </callout> + + <callout arearefs="co-vx-rng"> + <para>Здесь указаны затронутые версии пакета(-ов) как один + или более диапазонов с использованием комбинации + элементов <literal><lt></literal>, + <literal><le></literal>, + <literal><eq></literal>, + <literal><ge></literal>, и + <literal><gt></literal>. Диапазоны внесённых + версий не должны пересекаться.</para> + + <para>В спецификации диапазонов <literal>*</literal> + (звёздочка) означает наименьший номер версии. В + частности, <literal>2.*</literal> меньше, чем + <literal>2.a</literal>. Поэтому звездочка может быть + использована в диапазоне для совпадения со всеми + возможными <literal>alpha</literal>, + <literal>beta</literal> и <literal>RC</literal> версиями. + Как вариант, + <literal><ge>2.*</ge><lt>3.*</lt></literal> + выборочно совпадет с версией <literal>2.x</literal>, а + <literal><ge>2.0</ge><lt>3.0</lt></literal> + - нет, поскольку последнее не включает + <literal>2.r3</literal> и совпадает с + <literal>3.b</literal>.</para> + + <para>Пример выше указывает, что к затронутым относятся + версии с <literal>1.6</literal> до <literal>1.9</literal> + включительно, версии <literal>2.x</literal> до + <literal>2.4_1</literal> и версия + <literal>3.0b1</literal>.</para> + </callout> + + <callout arearefs="co-vx-nm2"> + <para>Некоторые связанные группы пакетов (в конечном счете, + порты) могут быть указаны в разделе + <literal><affected></literal>. Это можно + использовать, если некоторые программные продукты + (скажем, FooBar, FreeBar and OpenBar) являются + производными от общей кодовой базы и всё еще совместно + используют её ошибки и уязвимости. Имейте в виду отличие + от перечисления множественных имён в одном разделе + <package>.</para> + </callout> + + <callout arearefs="co-vx-epo"> + <para>Диапазоны версий должны учитывать + <varname>PORTEPOCH</varname> и + <varname>PORTREVISION</varname>, если это применимо. + Пожалуйста, помните, что в соответствии с правилами + сравнения строк версия с ненулевым значением + <varname>PORTEPOCH</varname> выше, чем любая версия без + <varname>PORTEPOCH</varname>, например, + <literal>3.0,1</literal> выше, чем <literal>3.1</literal> + или даже <literal>8.9</literal>.</para> + </callout> + + <callout arearefs="co-vx-bdy"> + <para>Сводная информация о проблеме. В этом поле + используется XHTML. По крайней мере, должны быть + обрамляющие <literal><p></literal> и + <literal></p></literal>. Может быть использована + более сложная разметка, но только в целях аккуратности и + ясности: без эстетства, пожалуйста.</para> + </callout> + + <callout arearefs="co-vx-ref"> + <para>Этот раздел содержит ссылки на имеющие отношение + документы. Приветствуется как можно большее количество + ссылок.</para> + </callout> + + <callout arearefs="co-vx-fsa"> + <para>Это <link + xlink:href="http://www.freebsd.org/security/#adv">бюллетень безопасности &os;</link>.</para> - </callout> + </callout> - <callout arearefs="co-vx-fpr"> - <para>Это - <link xlink:href="http://www.freebsd.org/support.html#gnats">сообщение + <callout arearefs="co-vx-fpr"> + <para>Это <link + xlink:href="http://www.freebsd.org/support.html#gnats">сообщение об ошибке &os;</link>.</para> - </callout> + </callout> - <callout arearefs="co-vx-cve"> - <para>Идентификатор - <link xlink:href="http://www.cve.mitre.org/">MITRE + <callout arearefs="co-vx-cve"> + <para>Идентификатор <link + xlink:href="http://www.cve.mitre.org/">MITRE CVE</link>.</para> - </callout> + </callout> - <callout arearefs="co-vx-bid"> - <para>Это - <link xlink:href="http://www.securityfocus.com/bid">SecurityFocus + <callout arearefs="co-vx-bid"> + <para>Это <link + xlink:href="http://www.securityfocus.com/bid">SecurityFocus Bug ID</link>.</para> - </callout> - - <callout arearefs="co-vx-cts"> - <para>Бюллетень безопасности - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-ctv"> - <para>Примечание к уязвимости - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-ucs"> - <para>Уведомление системы Cyber Security Alert - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-uct"> - <para>Уведомление системы Technical Cyber Security Alert - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-mls"> - <para>URL к архивному сообщению в списке рассылки. - Атрибут <literal>msgid</literal> является необязательным - и может указывать на message ID сообщения.</para> - </callout> - - <callout arearefs="co-vx-url"> - <para>Основной URL. Должен быть использован в случае, если - не подходит ни одна из категорий источника.</para> - </callout> - - <callout arearefs="co-vx-dsc"> - <para>Дата последнего изменения любой информации данной записи - (<replaceable>YYYY-MM-DD</replaceable>). Новые записи не - должны включать это поле. Поле должно быть добавлено после - редактирования существующей записи.</para> - </callout> - </calloutlist> - </sect2> - - <sect2 xml:id="security-notify-vuxml-testing"> - <title>Тестирование ваших изменений в базе данных VuXML</title> - - <para>Предположим, что вы только что написали или заполнили запись - об уязвимости в пакете <literal>clamav</literal>, которая была - исправлена в версии <literal>0.65_7</literal>.</para> - - <para>Прежде всего, вам нужно <emphasis>установить</emphasis> - последние версии портов - <package role="port">ports-mgmt/portaudit</package>, - <package role="port">ports-mgmt/portaudit-db</package> и - <package role="port">security/vuxml</package>.</para> - - <note> - <para>Для запуска <command>packaudit</command> вы должны обладать - правами на запись в - <filename>DATABASEDIR</filename>; как правило, - это <filename>/var/db/portaudit</filename>.</para> - - <para>Для использования другого каталога присвойте переменной - окружения <filename>DATABASEDIR</filename> - другой путь.</para> - - <para>Если вы работаете в каталоге, отличном от - <filename>${PORTSDIR}/security/vuxml</filename>, присвойте - переменной окружения - <filename>VUXMLDIR</filename> путь к каталогу, - в котором находится <filename>vuln.xml</filename>.</para> - </note> - - <para>Во-первых, проверьте, нет ли уже записи об этой уязвимости. - Если такая запись есть, она совпадёт с предыдущей версией - пакета <literal>0.65_6</literal>:</para> - - <screen>&prompt.user; <userinput>packaudit</userinput> + </callout> + + <callout arearefs="co-vx-cts"> + <para>Бюллетень безопасности <link + xlink:href="http://www.cert.org/">US-CERT</link>.</para> + </callout> + + <callout arearefs="co-vx-ctv"> + <para>Примечание к уязвимости <link + xlink:href="http://www.cert.org/">US-CERT</link>.</para> + </callout> + + <callout arearefs="co-vx-ucs"> + <para>Уведомление системы Cyber Security Alert <link + xlink:href="http://www.cert.org/">US-CERT</link>.</para> + </callout> + + <callout arearefs="co-vx-uct"> + <para>Уведомление системы Technical Cyber Security Alert + <link + xlink:href="http://www.cert.org/">US-CERT</link>.</para> + </callout> + + <callout arearefs="co-vx-mls"> + <para>URL к архивному сообщению в списке рассылки. Атрибут + <literal>msgid</literal> является необязательным и может + указывать на message ID сообщения.</para> + </callout> + + <callout arearefs="co-vx-url"> + <para>Основной URL. Должен быть использован в случае, если + не подходит ни одна из категорий источника.</para> + </callout> + + <callout arearefs="co-vx-dsc"> + <para>Дата последнего изменения любой информации данной + записи (<replaceable>YYYY-MM-DD</replaceable>). Новые + записи не должны включать это поле. Поле должно быть + добавлено после редактирования существующей + записи.</para> + </callout> + </calloutlist> + </sect2> + + <sect2 xml:id="security-notify-vuxml-testing"> + <title>Тестирование ваших изменений в базе данных VuXML</title> + + <para>Предположим, что вы только что написали или заполнили + запись об уязвимости в пакете <literal>clamav</literal>, + которая была исправлена в версии + <literal>0.65_7</literal>.</para> + + <para>Прежде всего, вам нужно <emphasis>установить</emphasis> + последние версии портов + <package role="port">ports-mgmt/portaudit</package>, + <package role="port">ports-mgmt/portaudit-db</package> и + <package role="port">security/vuxml</package>.</para> + + <note> + <para>Для запуска <command>packaudit</command> вы должны + обладать правами на запись в + <filename>DATABASEDIR</filename>; как правило, это + <filename>/var/db/portaudit</filename>.</para> + + <para>Для использования другого каталога присвойте переменной + окружения <filename>DATABASEDIR</filename> другой + путь.</para> + + <para>Если вы работаете в каталоге, отличном от + <filename>${PORTSDIR}/security/vuxml</filename>, присвойте + переменной окружения <filename>VUXMLDIR</filename> путь к + каталогу, в котором находится + <filename>vuln.xml</filename>.</para> + </note> + + <para>Во-первых, проверьте, нет ли уже записи об этой + уязвимости. Если такая запись есть, она совпадёт с + предыдущей версией пакета <literal>0.65_6</literal>:</para> + + <screen>&prompt.user; <userinput>packaudit</userinput> &prompt.user; <userinput>portaudit clamav-0.65_6</userinput></screen> - <para>Если ничего не найдено, значит вы получили зеленый свет для - добавления новой записи для этой уязвимости.</para> + <para>Если ничего не найдено, значит вы получили зеленый свет + для добавления новой записи для этой уязвимости.</para> - <screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput> + <screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput> &prompt.user; <userinput>make newentry</userinput></screen> - <para>Когда вы закончите, проверьте синтаксис и форматирование.</para> + <para>Когда вы закончите, проверьте синтаксис и + форматирование.</para> - <screen>&prompt.user; <userinput>make validate</userinput></screen> + <screen>&prompt.user; <userinput>make validate</userinput></screen> - <note> - <para>Вам понадобится установить по крайней мере один из следующих - пакетов: <package role="port">textproc/libxml2</package>, - <package role="port">textproc/jade</package>.</para> - </note> + <note> + <para>Вам понадобится установить по крайней мере один из + следующих пакетов: + <package role="port">textproc/libxml2</package>, + <package role="port">textproc/jade</package>.</para> + </note> - <para>Теперь выполните перепостроение базы данных - <command>portaudit</command> из файла VuXML:</para> + <para>Теперь выполните перепостроение базы данных + <command>portaudit</command> из файла VuXML:</para> - <screen>&prompt.user; <userinput>packaudit</userinput></screen> + <screen>&prompt.user; <userinput>packaudit</userinput></screen> - <para>Чтобы убедиться, что раздел <literal><affected></literal> - в вашей записи совпадает с правильными пакетами, выполните - следующую команду:</para> + <para>Чтобы убедиться, что раздел + <literal><affected></literal> в вашей записи совпадает + с правильными пакетами, выполните следующую команду:</para> - <screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen> + <screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen> - <note> - <para>Для лучшего понимания синтаксиса этой команды обращайтесь - к &man.portaudit.1;.</para> - </note> + <note> + <para>Для лучшего понимания синтаксиса этой команды + обращайтесь к &man.portaudit.1;.</para> + </note> - <para>Убедитесь, что ваша запись не производит ложных совпадений - в выводе.</para> + <para>Убедитесь, что ваша запись не производит ложных + совпадений в выводе.</para> - <para>Теперь проверьте, совпадает ли ваша запись с нужными версиями - пакета:</para> + <para>Теперь проверьте, совпадает ли ваша запись с нужными + версиями пакета:</para> - <screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput> + <screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput> Affected package: clamav-0.65_6 (matched by clamav<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>Первая версия должна совпасть, а последняя нет.</para> - <para>В заключение проверьте, что веб-страница, сформированная из - базы данных VuXML, выглядит как положено:</para> + <para>В заключение проверьте, что веб-страница, сформированная + из базы данных VuXML, выглядит как положено:</para> - <screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput> + <screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput> &prompt.user; <userinput>packaudit</userinput> &prompt.user; <userinput>lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html</userinput></screen> - </sect2> - </sect1> - </chapter> - + </sect2> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml index 38bbeb8ea7..1ad5b5ccea 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/slow-porting/chapter.xml @@ -7,428 +7,441 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="slow-porting"> - - <title>Медленное портирование</title> - - <para>Итак, все оказалось не так уж и просто, и порт потребовал - некоторых модификаций для того, чтобы заставить его работать. В этом - разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он - работал с нашей системой портов.</para> - - <sect1 xml:id="slow-work"> - <title>Как всё это работает</title> - - <para>Во-первых, когда пользователь дает в своем каталоге с портом - команду <command>make</command>, происходит целая череда событий. - Во время чтения этого текста может оказаться полезным иметь файл - <filename>bsd.port.mk</filename> открытым в другом окне, что сильно - поможет в их понимании.</para> - - <para>Но не волнуйтесь сильно, если вы не до конца понимаете, что - делается в <filename>bsd.port.mk</filename>, не так уж много людей - его понимает... <!-- smiley --><emphasis>:-></emphasis></para> - - <procedure> - <step> - <para>Запускается цель <buildtarget>fetch</buildtarget>. Цель - <buildtarget>fetch</buildtarget> отвечает за то, что архив исходных - текстов имеется в наличии локально в каталоге - <varname>DISTDIR</varname>. Если цель - <buildtarget>fetch</buildtarget> не может найти требуемые файлы в - каталоге <varname>DISTDIR</varname>, то они будут искаться по - указателю URL <varname>MASTER_SITES</varname>, который - устанавливается в Makefile, а также на наших FTP зеркалах, - куда мы по возможности помещаем дистрибутивные файлы для архива. - Затем она попытается сгрузить указанный файл с помощью - <varname>FETCH</varname>, полагая, что запрашивающая машина имеет - прямое подключение к Интернет. Если файл скачается удачно, то - он будет помещен в каталог <varname>DISTDIR</varname> для - последующего использования и обработки.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>extract</buildtarget>. Она ищет - дистрибутивный файл порта (как правило, tar-архив - <command>gzip</command>) в - каталоге <varname>DISTDIR</varname> и распаковывает его во - временный каталог, задаваемый переменной - <varname>WRKDIR</varname> (по умолчанию - <filename>work</filename>).</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>patch</buildtarget>. Во-первых, - применяются все патчи, заданные переменной - <varname>PATCHFILES</varname>. Во-вторых, если какие-либо файлы с - патчами, носящие имена - <filename>patch-*</filename>, имеются в - подкаталоге <varname>PATCHDIR</varname> (по умолчанию это каталог - <filename>files</filename>), то они применяются в этот момент в - алфавитном порядке.</para> - </step> - - <step> - <para>Запускается цель <buildtarget>configure</buildtarget>. Здесь - может выполняться любая из многих различных вещей.</para> - - <orderedlist> - <listitem> - <para>Если существует скрипт - <filename>scripts/configure</filename>, то он запускается. - </para> - </listitem> - - <listitem> - <para>Если задана переменная <varname>HAS_CONFIGURE</varname> - или <varname>GNU_CONFIGURE</varname>, то запускается скрипт - <filename>WRKSRC/configure</filename>. - </para> - </listitem> - </orderedlist> - </step> - - <step> - <para>Выполняется цель <buildtarget>build</buildtarget>. Она - отвечает за переход в собственный рабочий каталог порта - (<varname>WRKSRC</varname>) и его построение.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>stage</buildtarget>. - Конечный набор построенных файлов помещается во временный - каталог (<varname>STAGEDIR</varname>, смотрите - <xref linkend="staging"/>). Иерархия этого - каталога отражает иерархию каталогов системы, в которую - данный пакет будет устанавливаться.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>install</buildtarget>. - В систему копируются файлы, перечисленные в pkg-plist - порта.</para> - </step> - </procedure> - - <para>Выше перечислены стандартные действия. Кроме того, вы сами - можете определить цели - <buildtarget>pre-<replaceable>что-то</replaceable></buildtarget> или - <buildtarget>post-<replaceable>что-то</replaceable></buildtarget>, - или создать скрипты с такими именами в подкаталоге - <filename>scripts</filename>, и они будут запущены до или после - выполнения действий по умолчанию.</para> - - <para>Например, если у вас есть цель - <buildtarget>post-extract</buildtarget>, определённая в вашем файле - <filename>Makefile</filename> и файл <filename>pre-build</filename> в - подкаталоге - <filename>scripts</filename>, то после выполнения обычных действий по - распаковке, будет вызвана цель <buildtarget>post-extract</buildtarget> - а скрипт <filename>pre-build</filename> будет выполнен перед - запуском стандартных правил построения. Рекомендуется использовать - цели из <filename>Makefile</filename>, если действия достаточно - просты, потому что в дальнейшем будет проще определить, какие - нестандартные действия требует порт.</para> - - <para>Действия по умолчанию выполняются целями - <buildtarget>do-<replaceable>что-то</replaceable></buildtarget> из - <filename>bsd.port.mk</filename>. Например, команды для - распаковки порта находятся в цели - <buildtarget>do-extract</buildtarget>. Если вам не хватает цели по - умолчанию, вы можете ее исправить, переопределив цель - <buildtarget>do-<replaceable>something</replaceable></buildtarget> - в вашем файле <filename>Makefile</filename>.</para> - - <note> - <para><quote>Основные</quote> цели (к примеру, - <buildtarget>extract</buildtarget>, <buildtarget>configure</buildtarget> - и так далее) не делают ничего больше, - чем проверяют успешность завершения всех предыдущих шагов и - вызывают настоящие цели или скрипты, и их не нужно менять. Если - вам нужно изменить распаковку, исправляйте - <buildtarget>do-extract</buildtarget>, но никогда не меняйте способ - работы <buildtarget>extract</buildtarget>! Кроме того, цель - <buildtarget>post-deinstall</buildtarget> является недействительной - и не выполняется инфраструктурой портов.</para> - </note> - - <para>Теперь, когда вы представляете, что происходит, когда - пользователь набирает команду <command>make install</command>, - давайте пройдемся - через шаги, рекомендуемые для создания настоящего порта.</para> - </sect1> - - <sect1 xml:id="slow-sources"> - <title>Получение исходного кода</title> - - <para>Получите оригинальные исходные тексты (обычно) в виде - упакованного tar-архива - (<filename>foo.tar.gz</filename> или - <filename>foo.tar.bz2</filename>) - и скопируйте его в каталог <varname>DISTDIR</varname>. Всегда - используйте исходные тексты <emphasis>основной ветки - разработки</emphasis> везде, где это возможно.</para> - - <para>Вам потребуется задать значение переменной - <varname>MASTER_SITES</varname> так, чтобы оно указывало на - местоположение оригинального tar-архива. В файле - <filename>bsd.sites.mk</filename> вы найдёте краткие обозначения - для большинства популярных сайтов. Пожалуйста, используйте эти - сайты—и соответствующие определения—везде, где это - возможно, чтобы избежать проблем повторения одной и той же информации - в базе источников. Так как эти сайты со временем меняются, для - всех причастных поддержка становится настоящим кошмаром.</para> - - <para>Если вы не можете найти FTP/HTTP сайт с хорошим подключением к - сети, или находите только сайты, которые имеют раздражающе - нестандартные форматы, то можете захотеть поместить копию на надежный - сервер FTP или HTTP, который вам доступен (например, ваша домашняя - страница).</para> - - <para>Если вы не можете найти доступного и надёжного места для - помещения дистрибутивного файла, то мы сами сможем разместить его на - сервере <systemitem>ftp.FreeBSD.org</systemitem>; однако это наименее - рекомендуемое решение. Дистрибутивный файл должен - быть помещён в каталог <filename>~/public_distfiles/</filename> - одного из пользователей машины <systemitem>freefall</systemitem>. Попросите - того, кто коммиттил ваш порт, сделать это. Этот человек также задаст - переменной <varname>MASTER_SITES</varname> значение - <varname>MASTER_SITE_LOCAL</varname>, а в переменной - <varname>MASTER_SITE_SUBDIR</varname> укажет своё имя пользователя - с машины <systemitem>freefall</systemitem>.</para> - - <para>Если дистрибутивные файлы вашего порта постоянно меняются по - неизвестным причинам без изменения версий со стороны автора, остаётся - только поместить дистрибутив на вашу домашнюю Web-страницу и указать - её первой в списке <varname>MASTER_SITES</varname>. Если можете, - попытайтесь договориться с автором порта об этом; это действительно - помогает в достижении некоторого управления исходным кодом. - Размещение собственной версии поможет избежать появления ошибок у - пользователей типа <errorname>checksum mismatch</errorname>, а - также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер. - Также, если у порта имеется только один основной сервер, то - рекомендуется поместить архивную копию на свой сайт и указать его в - списке <varname>MASTER_SITES</varname> вторым.</para> - - <para>Если вашему порту требуются дополнительные `патчи', доступные - в Интернет, скачайте также и их, поместив в каталог - <varname>DISTDIR</varname>. Не волнуйтесь, если они находятся не - на том же сайте, откуда взят дистрибутивный архив, мы умеем - обрабатывать такие ситуации (смотрите описание <link linkend="porting-patchfiles">PATCHFILES</link> ниже).</para> - </sect1> - - <sect1 xml:id="slow-modifying"> - <title>Модификация порта</title> - - <para>Распакуйте копию дистрибутивного файла в отдельный каталог и - внесите изменения, которые необходимы для того, чтобы порт - компилировался нормально в текущей версии &os;. - <emphasis>Тщательно отслеживайте</emphasis> все, что вы делаете, - этот процесс вам предстоит автоматизировать. Все, включая удаление, - добавление или модификацию в файлах должны будут выполняться - автоматически с помощью скриптов или файлов патчей, когда вы - завершите работу над портом.</para> - - <para>Если вашему порту во время компиляции, установки и настройки - требуется довольно много взаимодействовать с пользователем, то - посмотрите на один из классических скриптов - <application>Configure</application> Лэрри Уолла (Larry Wall) и - сделайте сами что-либо подобное. Предназначение новой коллекции - портов - это сделать каждое приложение в стиле - <quote>plug-and-play</quote> настолько, насколько это вообще возможно - для конечного пользователя при минимальном использовании дискового - пространства.</para> - - <note> - <para>Если явно не указано обратное, то патчи, скрипты и другие - файлы, которые вы создали и предоставили для Коллекции Портов - &os;, неявно подпадают под стандартные условия лицензии - BSD.</para> - </note> - </sect1> - - <sect1 xml:id="slow-patch"> - <title>Создание патчей</title> - - <para>Файлы, которые добавлялись или изменялись в процессе создания - порта, могут быть выявлены программой &man.diff.1;, - а результат работы этой программы может быть в дальнейшем передан - программе &man.patch.1;. Такое действие с обычным файлом - подразумевает сохранение копии файла с первоначальным содержимым - перед внесением каких-либо изменений.</para> - - <screen>&prompt.user; <userinput>cp <replaceable>file</replaceable> <replaceable>file</replaceable>.orig</userinput></screen> - - <para>Патчи сохраняются в виде файлов с именем - <filename>patch-*</filename>, где - <replaceable>*</replaceable> обозначает путь к файлу, - к которому применяется патч, такой как - <filename>patch-Imakefile</filename> или - <filename>patch-src-config.h</filename>.</para> - - <para>После того как файл был изменён, используется &man.diff.1; - для получения разницы между первоначальной и изменённой - версиями. Параметр <option>-u</option> указывает &man.diff.1; - выводить разницу в <quote>унифицированном</quote> формате, - который также является предпочтительным.</para> - - <screen>&prompt.user; <userinput>diff -u <replaceable>file</replaceable>.orig <replaceable>file</replaceable> > patch-<replaceable>pathname-file</replaceable></userinput></screen> - - <para>Для порождении патчей для новых добавляемых файлов - используется параметр <option>-N</option>, который заставляет - &man.diff.1; трактовать несуществующие прежде файлы как если - бы они существовали, но имели пустое содержимое:</para> - - <screen>&prompt.user; <userinput>diff -u -N <replaceable>newfile</replaceable>.orig <replaceable>newfile</replaceable> > patch-<replaceable>pathname-newfile</replaceable></userinput></screen> - - <para>Файлы с патчами помещаются в - каталоге <varname>PATCHDIR</varname> - (как правило, это <filename class="directory">files/</filename>), - откуда они будут взяты автоматически. Все патчи обязаны быть сделаны - относительно каталога <varname>WRKSRC</varname> (как правило, - это каталог, в который распаковывается исходный архив и где будет - выполняться построение). Для упрощения внесения изменений и - обновлений избегайте наличия более чем одного патча для - одного и того же файла (например, патчей - <filename>patch-file</filename> и <filename>patch-file2</filename>, - оба меняющих файл <filename>WRKSRC/foobar.c</filename>). - Обратите внимание, что если путь к изменяемому файлу содержит символ - подчеркивания (<literal>_</literal>), то патч должен содержать в своем - имени два подчеркивания вместо одного. Например, для применения патча - на файл с именем <filename>src/freeglut_joystick.c</filename> - соответствующий патч следует назвать - <filename>patch-src-freeglut__joystick.c</filename>.</para> - - <para>Пожалуйста, используйте для именования патчей только символы - <literal>[-+._a-zA-Z0-9]</literal>. Не используйте любые другие - символы, кроме этих. Не называйте патчи как - <filename>patch-aa</filename> или <filename>patch-ab</filename>, - всегда ссылайтесь на путь и название файла в названиях самих - патчей.</para> - - <para>Существует альтернативный упрощённый способ создания - патчей для существующих файлов. Первые шаги те же самые: - создание копии неизменённого файла с расширением - <filename>.orig</filename> и внесение изменений. После этого - используйте <command>make makepatch</command>, чтобы обновить - файлы с патчами в каталоге <filename>files</filename> данного - порта.</para> - - <para>Не помещайте строки RCS в патчи. - <application>Subversion</application> будет изменять их при - помещении файлов в дерево портов, и когда мы будем их оттуда - извлекать, они будут уже другие, поэтому применение патчей - окончится неудачей. Строчки RCS предваряются знаком доллара - (<literal>$</literal>), и обычно начинаются с - <literal>$Id</literal> или - <literal>$RCS</literal>.</para> - - <para>Использование параметра рекурсии (<option>-r</option>) с командой - &man.diff.1; для генерации патчей - это хорошо, но всё же, - пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в - отсутствии ненужного мусора. В частности, diff-разниц между двумя - резервными копиями файлов, файлы <filename>Makefile</filename>, когда - как порт использует <command>Imake</command> или - GNU-версию программы <command>configure</command>, и так далее, - не нужны, и должны быть удалены. Если было необходимо - отредактировать файл <filename>configure.in</filename> и - запустить <command>autoconf</command> для перегенерации - <command>configure</command>, не нужно включать файлы diff для - <command>configure</command> (они частенько вырастают до нескольких - тысяч строк!). Вместо этого задайте - <literal>USE_AUTOTOOLS=autoconf:261</literal> и - включите diff-файл для <filename>configure.in</filename>.</para> - - <para>Старайтесь минимизировать в патчах объём - нефункциональных изменений с пустыми символами. В мире Открытого - Исходного Кода является распространенным совместное использование - проектами больших объемов кодовой базы, но с различными стилями - и правилами отступов. При копировании работающей функциональной - части из одного проекта для исправления похожей области в другом, - будьте аккуратны, пожалуйста: получаемый однострочный патч - может указаться полон нефункциональных изменений. Это не только - увеличивает размер репозитория <application>Subversion</application>, - но также усложняет поиск того, - что конкретно вызвало проблему и что вообще поменялось.</para> - - <para>Если нужно удалить файл, сделайте это при выполнении цели - <buildtarget>post-extract</buildtarget>, вместо того чтобы - оформлять это как часть патча.</para> - - <para>Простые перемещения могут быть выполнены непосредственно из - <filename>Makefile</filename> порта с использованием &man.sed.1; в - режиме in-place. Это удобно, когда при изменении используется - значение переменной:</para> - - <programlisting>post-patch: +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="slow-porting"> + + <title>Медленное портирование</title> + + <para>Итак, все оказалось не так уж и просто, и порт потребовал + некоторых модификаций для того, чтобы заставить его работать. В + этом разделе мы расскажем, шаг за шагом, как его модифицировать, + чтобы он работал с нашей системой портов.</para> + + <sect1 xml:id="slow-work"> + <title>Как всё это работает</title> + + <para>Во-первых, когда пользователь дает в своем каталоге с + портом команду <command>make</command>, происходит целая череда + событий. Во время чтения этого текста может оказаться полезным + иметь файл <filename>bsd.port.mk</filename> открытым в другом + окне, что сильно поможет в их понимании.</para> + + <para>Но не волнуйтесь сильно, если вы не до конца понимаете, что + делается в <filename>bsd.port.mk</filename>, не так уж много + людей его понимает... <emphasis>:-></emphasis></para> + + <procedure> + <step> + <para>Запускается цель <buildtarget>fetch</buildtarget>. + Цель <buildtarget>fetch</buildtarget> отвечает за то, что + архив исходных текстов имеется в наличии локально в + каталоге <varname>DISTDIR</varname>. Если цель + <buildtarget>fetch</buildtarget> не может найти требуемые + файлы в каталоге <varname>DISTDIR</varname>, то они будут + искаться по указателю URL <varname>MASTER_SITES</varname>, + который устанавливается в Makefile, а также на наших FTP + зеркалах, куда мы по возможности помещаем дистрибутивные + файлы для архива. Затем она попытается сгрузить указанный + файл с помощью <varname>FETCH</varname>, полагая, что + запрашивающая машина имеет прямое подключение к Интернет. + Если файл скачается удачно, то он будет помещен в каталог + <varname>DISTDIR</varname> для последующего использования и + обработки.</para> + </step> + + <step> + <para>Выполняется цель <buildtarget>extract</buildtarget>. + Она ищет дистрибутивный файл порта (как правило, tar-архив + <command>gzip</command>) в каталоге + <varname>DISTDIR</varname> и распаковывает его во временный + каталог, задаваемый переменной <varname>WRKDIR</varname> + (по умолчанию <filename>work</filename>).</para> + </step> + + <step> + <para>Выполняется цель <buildtarget>patch</buildtarget>. + Во-первых, применяются все патчи, заданные переменной + <varname>PATCHFILES</varname>. Во-вторых, если какие-либо + файлы с патчами, носящие имена + <filename>patch-*</filename>, имеются в подкаталоге + <varname>PATCHDIR</varname> (по умолчанию это каталог + <filename>files</filename>), то они применяются в этот + момент в алфавитном порядке.</para> + </step> + + <step> + <para>Запускается цель <buildtarget>configure</buildtarget>. + Здесь может выполняться любая из многих различных + вещей.</para> + + <orderedlist> + <listitem> + <para>Если существует скрипт + <filename>scripts/configure</filename>, то он + запускается.</para> + </listitem> + + <listitem> + <para>Если задана переменная + <varname>HAS_CONFIGURE</varname> или + <varname>GNU_CONFIGURE</varname>, то запускается скрипт + <filename>WRKSRC/configure</filename>.</para> + </listitem> + </orderedlist> + </step> + + <step> + <para>Выполняется цель <buildtarget>build</buildtarget>. Она + отвечает за переход в собственный рабочий каталог порта + (<varname>WRKSRC</varname>) и его построение.</para> + </step> + + <step> + <para>Выполняется цель <buildtarget>stage</buildtarget>. + Конечный набор построенных файлов помещается во временный + каталог (<varname>STAGEDIR</varname>, смотрите <xref + linkend="staging"/>). Иерархия этого каталога отражает + иерархию каталогов системы, в которую данный пакет будет + устанавливаться.</para> + </step> + + <step> + <para>Выполняется цель <buildtarget>install</buildtarget>. + В систему копируются файлы, перечисленные в pkg-plist + порта.</para> + </step> + </procedure> + + <para>Выше перечислены стандартные действия. Кроме того, вы сами + можете определить цели + <buildtarget>pre-<replaceable>что-то</replaceable></buildtarget> + или + <buildtarget>post-<replaceable>что-то</replaceable></buildtarget>, + или создать скрипты с такими именами в подкаталоге + <filename>scripts</filename>, и они будут запущены до или после + выполнения действий по умолчанию.</para> + + <para>Например, если у вас есть цель + <buildtarget>post-extract</buildtarget>, определённая в вашем + файле <filename>Makefile</filename> и файл + <filename>pre-build</filename> в подкаталоге + <filename>scripts</filename>, то после выполнения обычных + действий по распаковке, будет вызвана цель + <buildtarget>post-extract</buildtarget> а скрипт + <filename>pre-build</filename> будет выполнен перед запуском + стандартных правил построения. Рекомендуется использовать цели + из <filename>Makefile</filename>, если действия достаточно + просты, потому что в дальнейшем будет проще определить, какие + нестандартные действия требует порт.</para> + + <para>Действия по умолчанию выполняются целями + <buildtarget>do-<replaceable>что-то</replaceable></buildtarget> + из <filename>bsd.port.mk</filename>. Например, команды для + распаковки порта находятся в цели + <buildtarget>do-extract</buildtarget>. Если вам не хватает + цели по умолчанию, вы можете ее исправить, переопределив цель + <buildtarget>do-<replaceable>something</replaceable></buildtarget> + в вашем файле <filename>Makefile</filename>.</para> + + <note> + <para><quote>Основные</quote> цели (к примеру, + <buildtarget>extract</buildtarget>, + <buildtarget>configure</buildtarget> и так далее) не делают + ничего больше, чем проверяют успешность завершения всех + предыдущих шагов и вызывают настоящие цели или скрипты, и их + не нужно менять. Если вам нужно изменить распаковку, + исправляйте <buildtarget>do-extract</buildtarget>, но никогда + не меняйте способ работы <buildtarget>extract</buildtarget>! + Кроме того, цель <buildtarget>post-deinstall</buildtarget> + является недействительной и не выполняется инфраструктурой + портов.</para> + </note> + + <para>Теперь, когда вы представляете, что происходит, когда + пользователь набирает команду <command>make install</command>, + давайте пройдемся через шаги, рекомендуемые для создания + настоящего порта.</para> + </sect1> + + <sect1 xml:id="slow-sources"> + <title>Получение исходного кода</title> + + <para>Получите оригинальные исходные тексты (обычно) в виде + упакованного tar-архива (<filename>foo.tar.gz</filename> или + <filename>foo.tar.bz2</filename>) и скопируйте его в каталог + <varname>DISTDIR</varname>. Всегда используйте исходные тексты + <emphasis>основной ветки разработки</emphasis> везде, где это + возможно.</para> + + <para>Вам потребуется задать значение переменной + <varname>MASTER_SITES</varname> так, чтобы оно указывало на + местоположение оригинального tar-архива. В файле + <filename>bsd.sites.mk</filename> вы найдёте краткие + обозначения для большинства популярных сайтов. Пожалуйста, + используйте эти сайты—и соответствующие + определения—везде, где это возможно, чтобы избежать + проблем повторения одной и той же информации в базе источников. + Так как эти сайты со временем меняются, для всех причастных + поддержка становится настоящим кошмаром.</para> + + <para>Если вы не можете найти FTP/HTTP сайт с хорошим + подключением к сети, или находите только сайты, которые имеют + раздражающе нестандартные форматы, то можете захотеть поместить + копию на надежный сервер FTP или HTTP, который вам доступен + (например, ваша домашняя страница).</para> + + <para>Если вы не можете найти доступного и надёжного места для + помещения дистрибутивного файла, то мы сами сможем разместить + его на сервере <systemitem>ftp.FreeBSD.org</systemitem>; однако + это наименее рекомендуемое решение. Дистрибутивный файл должен + быть помещён в каталог <filename>~/public_distfiles/</filename> + одного из пользователей машины + <systemitem>freefall</systemitem>. Попросите того, кто + коммиттил ваш порт, сделать это. Этот человек также задаст + переменной <varname>MASTER_SITES</varname> значение + <varname>MASTER_SITE_LOCAL</varname>, а в переменной + <varname>MASTER_SITE_SUBDIR</varname> укажет своё имя + пользователя с машины <systemitem>freefall</systemitem>.</para> + + <para>Если дистрибутивные файлы вашего порта постоянно меняются + по неизвестным причинам без изменения версий со стороны автора, + остаётся только поместить дистрибутив на вашу домашнюю + Web-страницу и указать её первой в списке + <varname>MASTER_SITES</varname>. Если можете, попытайтесь + договориться с автором порта об этом; это действительно + помогает в достижении некоторого управления исходным кодом. + Размещение собственной версии поможет избежать появления ошибок + у пользователей типа <errorname>checksum mismatch</errorname>, + а также уменьшит нагрузку на людей, сопровождающих наш + FTP-сервер. Также, если у порта имеется только один основной + сервер, то рекомендуется поместить архивную копию на свой сайт + и указать его в списке <varname>MASTER_SITES</varname> + вторым.</para> + + <para>Если вашему порту требуются дополнительные `патчи', + доступные в Интернет, скачайте также и их, поместив в каталог + <varname>DISTDIR</varname>. Не волнуйтесь, если они находятся + не на том же сайте, откуда взят дистрибутивный архив, мы умеем + обрабатывать такие ситуации (смотрите описание <link + linkend="porting-patchfiles">PATCHFILES</link> ниже).</para> + </sect1> + + <sect1 xml:id="slow-modifying"> + <title>Модификация порта</title> + + <para>Распакуйте копию дистрибутивного файла в отдельный каталог + и внесите изменения, которые необходимы для того, чтобы порт + компилировался нормально в текущей версии &os;. + <emphasis>Тщательно отслеживайте</emphasis> все, что вы + делаете, этот процесс вам предстоит автоматизировать. Все, + включая удаление, добавление или модификацию в файлах должны + будут выполняться автоматически с помощью скриптов или файлов + патчей, когда вы завершите работу над портом.</para> + + <para>Если вашему порту во время компиляции, установки и + настройки требуется довольно много взаимодействовать с + пользователем, то посмотрите на один из классических скриптов + <application>Configure</application> Лэрри Уолла (Larry Wall) и + сделайте сами что-либо подобное. Предназначение новой + коллекции портов - это сделать каждое приложение в стиле + <quote>plug-and-play</quote> настолько, насколько это вообще + возможно для конечного пользователя при минимальном + использовании дискового пространства.</para> + + <note> + <para>Если явно не указано обратное, то патчи, скрипты и другие + файлы, которые вы создали и предоставили для Коллекции Портов + &os;, неявно подпадают под стандартные условия лицензии + BSD.</para> + </note> + </sect1> + + <sect1 xml:id="slow-patch"> + <title>Создание патчей</title> + + <para>Файлы, которые добавлялись или изменялись в процессе + создания порта, могут быть выявлены программой &man.diff.1;, а + результат работы этой программы может быть в дальнейшем передан + программе &man.patch.1;. Такое действие с обычным файлом + подразумевает сохранение копии файла с первоначальным + содержимым перед внесением каких-либо изменений.</para> + + <screen>&prompt.user; <userinput>cp <replaceable>file</replaceable> <replaceable>file</replaceable>.orig</userinput></screen> + + <para>Патчи сохраняются в виде файлов с именем + <filename>patch-*</filename>, где <replaceable>*</replaceable> + обозначает путь к файлу, к которому применяется патч, такой как + <filename>patch-Imakefile</filename> или + <filename>patch-src-config.h</filename>.</para> + + <para>После того как файл был изменён, используется &man.diff.1; + для получения разницы между первоначальной и изменённой + версиями. Параметр <option>-u</option> указывает &man.diff.1; + выводить разницу в <quote>унифицированном</quote> формате, + который также является предпочтительным.</para> + + <screen>&prompt.user; <userinput>diff -u <replaceable>file</replaceable>.orig <replaceable>file</replaceable> > patch-<replaceable>pathname-file</replaceable></userinput></screen> + + <para>Для порождении патчей для новых добавляемых файлов + используется параметр <option>-N</option>, который заставляет + &man.diff.1; трактовать несуществующие прежде файлы как если бы + они существовали, но имели пустое содержимое:</para> + + <screen>&prompt.user; <userinput>diff -u -N <replaceable>newfile</replaceable>.orig <replaceable>newfile</replaceable> > patch-<replaceable>pathname-newfile</replaceable></userinput></screen> + + <para>Файлы с патчами помещаются в каталоге + <varname>PATCHDIR</varname> (как правило, это <filename + class="directory">files/</filename>), откуда они будут взяты + автоматически. Все патчи обязаны быть сделаны относительно + каталога <varname>WRKSRC</varname> (как правило, это каталог, в + который распаковывается исходный архив и где будет выполняться + построение). Для упрощения внесения изменений и обновлений + избегайте наличия более чем одного патча для одного и того же + файла (например, патчей <filename>patch-file</filename> и + <filename>patch-file2</filename>, оба меняющих файл + <filename>WRKSRC/foobar.c</filename>). Обратите внимание, что + если путь к изменяемому файлу содержит символ подчеркивания + (<literal>_</literal>), то патч должен содержать в своем имени + два подчеркивания вместо одного. Например, для применения + патча на файл с именем + <filename>src/freeglut_joystick.c</filename> соответствующий + патч следует назвать + <filename>patch-src-freeglut__joystick.c</filename>.</para> + + <para>Пожалуйста, используйте для именования патчей только + символы <literal>[-+._a-zA-Z0-9]</literal>. Не используйте + любые другие символы, кроме этих. Не называйте патчи как + <filename>patch-aa</filename> или + <filename>patch-ab</filename>, всегда ссылайтесь на путь и + название файла в названиях самих патчей.</para> + + <para>Существует альтернативный упрощённый способ создания патчей + для существующих файлов. Первые шаги те же самые: создание + копии неизменённого файла с расширением + <filename>.orig</filename> и внесение изменений. После этого + используйте <command>make makepatch</command>, чтобы обновить + файлы с патчами в каталоге <filename>files</filename> данного + порта.</para> + + <para>Не помещайте строки RCS в патчи. + <application>Subversion</application> будет изменять их при + помещении файлов в дерево портов, и когда мы будем их оттуда + извлекать, они будут уже другие, поэтому применение патчей + окончится неудачей. Строчки RCS предваряются знаком доллара + (<literal>$</literal>), и обычно начинаются с + <literal>$Id</literal> или + <literal>$RCS</literal>.</para> + + <para>Использование параметра рекурсии (<option>-r</option>) с + командой &man.diff.1; для генерации патчей - это хорошо, но всё + же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться + в отсутствии ненужного мусора. В частности, diff-разниц между + двумя резервными копиями файлов, файлы + <filename>Makefile</filename>, когда как порт использует + <command>Imake</command> или GNU-версию программы + <command>configure</command>, и так далее, не нужны, и должны + быть удалены. Если было необходимо отредактировать файл + <filename>configure.in</filename> и запустить + <command>autoconf</command> для перегенерации + <command>configure</command>, не нужно включать файлы diff для + <command>configure</command> (они частенько вырастают до + нескольких тысяч строк!). Вместо этого задайте + <literal>USE_AUTOTOOLS=autoconf:261</literal> и включите + diff-файл для <filename>configure.in</filename>.</para> + + <para>Старайтесь минимизировать в патчах объём нефункциональных + изменений с пустыми символами. В мире Открытого Исходного Кода + является распространенным совместное использование проектами + больших объемов кодовой базы, но с различными стилями и + правилами отступов. При копировании работающей функциональной + части из одного проекта для исправления похожей области в + другом, будьте аккуратны, пожалуйста: получаемый однострочный + патч может указаться полон нефункциональных изменений. Это не + только увеличивает размер репозитория + <application>Subversion</application>, но также усложняет поиск + того, что конкретно вызвало проблему и что вообще + поменялось.</para> + + <para>Если нужно удалить файл, сделайте это при выполнении цели + <buildtarget>post-extract</buildtarget>, вместо того чтобы + оформлять это как часть патча.</para> + + <para>Простые перемещения могут быть выполнены непосредственно из + <filename>Makefile</filename> порта с использованием + &man.sed.1; в режиме in-place. Это удобно, когда при изменении + используется значение переменной:</para> + + <programlisting>post-patch: @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README</programlisting> - <para>Довольно часто в исходных файлах портируемого программного - обеспечения используется конвенция CR/LF. Это может стать - причиной проблем с дальнейшей упаковкой, предупреждениями - компилятора или выполнением скриптов (таких как - <literal>/bin/sh^M not found</literal>). Для быстрого - преобразования всех файлов из CR/LF просто в LF добавьте - в <filename>Makefile</filename> порта эту запись:</para> + <para>Довольно часто в исходных файлах портируемого программного + обеспечения используется конвенция CR/LF. Это может стать + причиной проблем с дальнейшей упаковкой, предупреждениями + компилятора или выполнением скриптов (таких как + <literal>/bin/sh^M not found</literal>). Для быстрого + преобразования всех файлов из CR/LF просто в LF добавьте в + <filename>Makefile</filename> порта эту запись:</para> - <programlisting>USES= dos2unix</programlisting> + <programlisting>USES= dos2unix</programlisting> - <para>Может быть задан точный список преобразуемых файлов:</para> + <para>Может быть задан точный список преобразуемых файлов:</para> - <programlisting>USES= dos2unix + <programlisting>USES= dos2unix DOS2UNIX_FILES= util.c util.h</programlisting> - <para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы - преобразовать группу файлов в разных подкаталогах. - Его параметром является регулярное выражение, совместимое с - &man.find.1;. Подробнее о формате в &man.re.format.7;. - Такой вариант удобен для преобразования всех файлов заданного - расширения. Для примера, преобразуем все исходные файлы, - не затрагивая двоичные файлы:</para> + <para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы + преобразовать группу файлов в разных подкаталогах. Его + параметром является регулярное выражение, совместимое с + &man.find.1;. Подробнее о формате в &man.re.format.7;. Такой + вариант удобен для преобразования всех файлов заданного + расширения. Для примера, преобразуем все исходные файлы, не + затрагивая двоичные файлы:</para> - <programlisting>USES= dos2unix + <programlisting>USES= dos2unix DOS2UNIX_REGEX= .*\.([ch]|cpp)</programlisting> - <para>Другим вариантом является использование - <varname>DOS2UNIX_GLOB</varname>, который вызывает - <command>find</command> для каждого из перечисленных в нём - элементов.</para> + <para>Другим вариантом является использование + <varname>DOS2UNIX_GLOB</varname>, который вызывает + <command>find</command> для каждого из перечисленных в нём + элементов.</para> - <programlisting>USES= dos2unix + <programlisting>USES= dos2unix DOS2UNIX_GLOB= *.c *.cpp *.h</programlisting> - </sect1> - - <sect1 xml:id="slow-configure"> - <title>Конфигурирование</title> - - <para>Поместите все дополнительные команды, требуемые для настройки, - в ваш скрипт <filename>configure</filename> и сохраните его в - подкаталоге <filename>scripts</filename>. Как отмечено выше, вы - можете сделать это целями в файле <filename>Makefile</filename> - и/или скриптами с именами <filename>pre-configure</filename> или - <filename>post-configure</filename>.</para> - </sect1> - - <sect1 xml:id="slow-user-input"> - <title>Обработка пользовательского ввода</title> - - <para>Если для построения, конфигурации или установки вашего порта - требуется некоторый ввод со стороны пользователя, то вы должны задать - переменную <varname>IS_INTERACTIVE</varname> в вашем файле - <filename>Makefile</filename>. В случае <quote>ночного - построения</quote> это позволит пропустить - ваш порт, если пользователь в своем окружении задал переменную - <envar>BATCH</envar> (и если пользователь установил переменную - <envar>INTERACTIVE</envar>, то будут строиться - <emphasis>только</emphasis> порты, которые требуют взаимодействия - с пользователем. Это сэкономит значительное количество времени на - части машин, которые постоянно строят порты (смотрите ниже).</para> - - <para>При наличии разумных ответов на задаваемые вопросы, подходящих по - умолчанию, также рекомендуется проверять переменную - <varname>PACKAGE_BUILDING</varname> и выключать интерактивный скрипт, - если он есть. Это позволит нам строить пакеты для помещения на - компакт-диски и FTP-серверы.</para> - </sect1> - </chapter> - + </sect1> + + <sect1 xml:id="slow-configure"> + <title>Конфигурирование</title> + + <para>Поместите все дополнительные команды, требуемые для + настройки, в ваш скрипт <filename>configure</filename> и + сохраните его в подкаталоге <filename>scripts</filename>. Как + отмечено выше, вы можете сделать это целями в файле + <filename>Makefile</filename> и/или скриптами с именами + <filename>pre-configure</filename> или + <filename>post-configure</filename>.</para> + </sect1> + + <sect1 xml:id="slow-user-input"> + <title>Обработка пользовательского ввода</title> + + <para>Если для построения, конфигурации или установки вашего + порта требуется некоторый ввод со стороны пользователя, то вы + должны задать переменную <varname>IS_INTERACTIVE</varname> в + вашем файле <filename>Makefile</filename>. В случае + <quote>ночного построения</quote> это позволит пропустить ваш + порт, если пользователь в своем окружении задал переменную + <envar>BATCH</envar> (и если пользователь установил переменную + <envar>INTERACTIVE</envar>, то будут строиться + <emphasis>только</emphasis> порты, которые требуют + взаимодействия с пользователем. Это сэкономит значительное + количество времени на части машин, которые постоянно строят + порты (смотрите ниже).</para> + + <para>При наличии разумных ответов на задаваемые вопросы, + подходящих по умолчанию, также рекомендуется проверять + переменную <varname>PACKAGE_BUILDING</varname> и выключать + интерактивный скрипт, если он есть. Это позволит нам строить + пакеты для помещения на компакт-диски и FTP-серверы.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml index 5e1ce3a36f..db94a53010 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/special/chapter.xml @@ -7,1141 +7,1166 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="special"> - - <title>Особые соглашения</title> - - <para>Имеется ещё несколько вещей, которые вы должны иметь в виду при - создании порта. Этот раздел описывает наиболее часто встречающиеся из - них.</para> - - <sect1 xml:id="staging"> - <title>Staging</title> - - <para><filename>bsd.port.mk</filename> ожидает от портов работу - с <quote>каталогом сборки</quote>. Это означает, что порт - должен устанавливать файлы не напрямую в назначенные каталоги - (то есть, например, под <varname>PREFIX</varname>), а в - отдельный каталог, из которого затем собирается пакет. - Во многих случаях привилегии root для этого не требуются, - что делает возможным сборку пакетов из-под непривилегированного - пользователя. В режиме staging порт собирается и устанавливается - в каталог сборки <varname>STAGEDIR</varname>. Пакет создается - из каталога сборки и затем устанавливается в систему. - В инструментарии automake такая концепция именуется - <varname>DESTDIR</varname>; в прочем, в &os; - <varname>DESTDIR</varname> имеет собственное значение - (смотрите <xref linkend="porting-prefix"/>).</para> - - <para>Если для порта всё ещё требуются системные привилегии при - выполнении цели <buildtarget>package</buildtarget>, то в - <filename>Makefile</filename> должна быть добавлена следующая - строка:</para> - - <programlisting>NEED_ROOT= yes</programlisting> - - <para>Метапорты, то есть порты, которые не устанавливают файлы - непосредственно, а только зависят от других портов, должны - по возможности избегать распаковки &man.mtree.8; в каталог - сборки. Это основная иерархия каталогов пакета, и эти пустые - каталоги будут выглядеть лишними. Для предотвращения - распаковки &man.mtree.8; добавьте эту строку:</para> - - <programlisting>NO_MTREE= yes</programlisting> - - <para>Staging задействуется посредством добавления переменной - <varname>STAGEDIR</varname> слева от путей, которые используются - в целях <buildtarget>pre-install</buildtarget>, - <buildtarget>do-install</buildtarget> и - <buildtarget>post-install</buildtarget> (смотрите примеры - в книге). Обычно сюда относятся - <varname>PREFIX</varname>, <varname>ETCDIR</varname>, - <varname>DATADIR</varname>, <varname>EXAMPLESDIR</varname>, - <varname>MANPREFIX</varname>, <varname>DOCSDIR</varname> и - так далее. Каталоги должны создаваться при выполнении цели - <buildtarget>post-install</buildtarget>. Избегайте - использования абсолютных путей, когда это возможно.</para> - - <para>При создании символический ссылки <varname>STAGEDIR</varname> - должен ставиться только для пути назначения. Например:</para> - - <programlisting>${LN} -sf libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so</programlisting> - - <para>Первоначальный путь - <filename>${PREFIX}/lib/libfoo.so.42</filename> выглядит - нормально, но по факту может быть неправильным. Абсолютные - пути могут указывать на неподходящее место, например, когда - удалённая файловая система смонтирована по - <acronym>NFS</acronym> как непривилегированная точка - монтирования. Относительные пути реже подвержены проблемам - и часто намного короче.</para> - - <para>Порты, устанавливающие модули ядра, должны предварять путь - установки (по умолчанию <filename>/boot/modules</filename>) - переменной <varname>STAGEDIR</varname>.</para> - </sect1> - - <sect1 xml:id="porting-shlibs"> - <title>Динамические библиотеки</title> - - <para>Если ваш порт устанавливает одну или несколько динамических - библиотек, определите переменную <varname>USE_LDCONFIG</varname>, - которая приведёт к запуску из <filename>bsd.port.mk</filename> команды - <literal>${LDCONFIG} -m</literal> относительно каталога, в - который устанавливается новая библиотека (как правило, это - <filename>PREFIX/lib</filename>), во время - выполнения цели <buildtarget>post-install</buildtarget> для её - регистрации в кэше динамических библиотек. Эта переменная, если она - определена, также приведёт к добавлению соответствующей пары команд - <literal>@exec /sbin/ldconfig -m</literal> и - <literal>@unexec /sbin/ldconfig -R</literal> в ваш файл - <filename>pkg-plist</filename>, так что пользователь, устанавливающий - пакет, сможет сразу же использовать динамическую библиотеку, а - удаление пакета не приведёт к тому, что система будет предполагать, - что библиотека всё ещё имеется в наличии.</para> - - <programlisting>USE_LDCONFIG= yes</programlisting> - - <para>Если нужно, вы можете переопределить каталог по умолчанию, - задав значение - <varname>USE_LDCONFIG</varname>, в котором должны быть перечислены - каталоги, в которые устанавливаются динамические библиотеки. Например, - если ваш порт устанавливает динамические библиотеки в каталоги - <filename>PREFIX/lib/foo</filename> и - <filename>PREFIX/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> во время компоновки (для - примера смотрите <package role="port">lang/moscow_ml</package>), - или с помощью сценария-обёртки, который выставляет - <varname>LD_LIBRARY_PATH</varname> перед запуском исполняемого файла - как это делает <package role="port">www/seamonkey</package>.</para> - - <para>При установке 32-разрядных библиотек на 64-разрядной системе - используйте вместо этого <varname>USE_LDCONFIG32</varname>.</para> - - <para>Постарайтесь сохранять номера версий динамических библиотек - в формате <filename>libfoo.so.0</filename>. Наш компоновщик - позаботится только о старшем (первом) номере.</para> - - <para>Если при обновлении порта увеличивается старший номер версии - библиотеки, то для всех портов, компонуемых с затронутой библиотекой, - следует увеличить значение <varname>PORTREVISION</varname> для - форсирования перекомпиляции с новой версией библиотеки.</para> - - </sect1> - - <sect1 xml:id="porting-restrictions"> - <title>Порты с ограничениями на распространение или с - правовым обременением</title> - - <para>Лицензии бывают разных видов, и некоторые накладывают ограничение - на то, как приложение может быть оформлено в виде пакета, может ли - оно продаваться для извлечения коммерческой выгоды, и так далее.</para> - - <important> - <para>На вас, как на человека, портирующего приложение, ложится - обязанность прочесть лицензионные соглашения на программное - обеспечение и удостовериться, что проект &os; не будет являться - их нарушителем, если будет заниматься распространением исходного - кода или в бинарном виде по FTP/HTTP или на CD-ROM. Если - у вас возникли сомнения, то, пожалуйста, обратитесь в - &a.ports;.</para> - </important> - - <para>В подобных ситуациях можно использовать переменные, описываемые в - последующих разделах.</para> - - <sect2> - <title><varname>NO_PACKAGE</varname></title> - - <para>Эта переменная указывает, что мы не можем создавать для - приложения двоичный пакет. К примеру, лицензия не позволяет - бинарное распространение или она может запрещать распространение - пакетов, созданных из изменённых исходников.</para> - - <para>Однако файлы <varname>DISTFILES</varname> могут свободно - зеркалироваться по FTP/HTTP. Они также могут распространяться, - используя CD-ROM (или на похожих носителях), если не установлена - переменная <varname>NO_CDROM</varname>.</para> - - <para><varname>NO_PACKAGE</varname> должна также использоваться, если - двоичный пакет, как правило, бесполезен, а приложение должно всегда - компилироваться из исходного кода. К примеру, если в приложение - во время компиляции жёстко включается конфигурационная информация, - привязанная к конкретной системе, то задайте переменную - <varname>NO_PACKAGE</varname>.</para> - - <para>Значением переменной <varname>NO_PACKAGE</varname> должна быть - строка, описывающая причину, по которой пакет не должен - создаваться.</para> - </sect2> - - <sect2> - <title><varname>NO_CDROM</varname></title> - - <para>Эта переменная указывает на то, что, хотя мы имеем право - создавать бинарные пакеты, мы не можем помещать эти пакеты или - файлы <varname>DISTFILES</varname> порта на CD-ROM (или на похожие носители) для - перепродажи. Однако бинарные пакеты и файлы - <varname>DISTFILES</varname> порта будут оставаться - доступными посредством FTP/HTTP.</para> - - <para>Если эта переменная устанавливается вместе с - <varname>NO_PACKAGE</varname>, то только файлы порта - <varname>DISTFILES</varname> будут доступны, и только посредством - FTP/HTTP.</para> - - <para>В качестве значения <varname>NO_CDROM</varname> должна - указываться строка, описывающая причины, по которым порт не может - распространяться на CD-ROM. К примеру, это применяется, если - лицензионное соглашение приложения предполагает только его - <quote>некоммерческое</quote> использование.</para> - </sect2> - - <sect2> - <title><varname>NOFETCHFILES</varname></title> - - <para>Файлы, определенные в переменной <varname>NOFETCHFILES</varname>, - не будут извлекаться ни из одного из <varname>MASTER_SITES</varname>. - Примером такого файла является файл, поставляемый на CD-ROM.</para> - - <para>Инструменты, проверяющие доступность этих файлов на - <varname>MASTER_SITES</varname>, должны игнорировать эти файлы и - не сообщать о них.</para> - </sect2> - - <sect2> - <title><varname>RESTRICTED</varname></title> - - <para>Задайте эту переменную, если лицензия на приложение не позволяет - ни зеркалировать файлы <varname>DISTFILES</varname>, ни распространять - бинарный пакет через FTP/HTTP или на CD-ROM.</para> - - <para>Ни <varname>NO_CDROM</varname>, ни <varname>NO_PACKAGE</varname> - не стоит устанавливать вместе с <varname>RESTRICTED</varname>, так - как последняя переменная подразумевает первые две.</para> - - <para>В качестве значения <varname>RESTRICTED</varname> должна - указываться строка, описывающая причины, по которым порт нельзя - распространять. Обычно это означает, что порт использует закрытое - программное обеспечение, а пользователь должен вручную сгрузить файлы - <varname>DISTFILES</varname>, возможно, после заполнения - регистрационной формы или подтверждения соглашения с условиями - <acronym>EULA</acronym>.</para> - </sect2> - - <sect2> - <title><varname>RESTRICTED_FILES</varname></title> - - <para>Если заданы <varname>RESTRICTED</varname> или - <varname>NO_CDROM</varname>, то значение этой переменной по умолчанию - соответствует <literal>${DISTFILES} ${PATCHFILES}</literal>, в - противном случае она пуста. Если ограничены в распространении лишь - некоторые из дистрибутивных файлов, то в этой переменной задаётся их - список.</para> - </sect2> - - <sect2> - <title><varname>LEGAL_TEXT</varname></title> - - <para>Если порт имеет правовое обременение, которое не - покрывается перечисленными выше переменными, то переменной - <varname>LEGAL_TEXT</varname> следует присвоить строку с - описанием данного обременения. Например, если было получено - особое разрешение для &os; на распространение двоичного - файла, то эта переменная должна содержать соответствующее - указание.</para> - </sect2> - - <sect2> - <title><filename>/usr/ports/LEGAL</filename> и - <varname>LEGAL</varname></title> - - <para>Порт, содержащий любую из перечисленных выше переменных, - также должен быть добавлен в <filename>/usr/ports/LEGAL</filename>. - Первый столбец содержит шаблон совпадения с дистрибутивными - файлами, имеющими ограничения на распространение. Второй - столбец содержит корень порта. Третий столбец содержит - вывод <command>make -VLEGAL</command>.</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} +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="special"> + + <title>Особые соглашения</title> + + <para>Имеется ещё несколько вещей, которые вы должны иметь в виду + при создании порта. Этот раздел описывает наиболее часто + встречающиеся из них.</para> + + <sect1 xml:id="staging"> + <title>Staging</title> + + <para><filename>bsd.port.mk</filename> ожидает от портов работу с + <quote>каталогом сборки</quote>. Это означает, что порт должен + устанавливать файлы не напрямую в назначенные каталоги (то + есть, например, под <varname>PREFIX</varname>), а в отдельный + каталог, из которого затем собирается пакет. Во многих случаях + привилегии root для этого не требуются, что делает возможным + сборку пакетов из-под непривилегированного пользователя. В + режиме staging порт собирается и устанавливается в каталог + сборки <varname>STAGEDIR</varname>. Пакет создается из + каталога сборки и затем устанавливается в систему. В + инструментарии automake такая концепция именуется + <varname>DESTDIR</varname>; в прочем, в &os; + <varname>DESTDIR</varname> имеет собственное значение (смотрите + <xref linkend="porting-prefix"/>).</para> + + <para>Если для порта всё ещё требуются системные привилегии при + выполнении цели <buildtarget>package</buildtarget>, то в + <filename>Makefile</filename> должна быть добавлена следующая + строка:</para> + + <programlisting>NEED_ROOT= yes</programlisting> + + <para>Метапорты, то есть порты, которые не устанавливают файлы + непосредственно, а только зависят от других портов, должны по + возможности избегать распаковки &man.mtree.8; в каталог сборки. + Это основная иерархия каталогов пакета, и эти пустые каталоги + будут выглядеть лишними. Для предотвращения распаковки + &man.mtree.8; добавьте эту строку:</para> + + <programlisting>NO_MTREE= yes</programlisting> + + <para>Staging задействуется посредством добавления переменной + <varname>STAGEDIR</varname> слева от путей, которые + используются в целях <buildtarget>pre-install</buildtarget>, + <buildtarget>do-install</buildtarget> и + <buildtarget>post-install</buildtarget> (смотрите примеры в + книге). Обычно сюда относятся <varname>PREFIX</varname>, + <varname>ETCDIR</varname>, <varname>DATADIR</varname>, + <varname>EXAMPLESDIR</varname>, <varname>MANPREFIX</varname>, + <varname>DOCSDIR</varname> и так далее. Каталоги должны + создаваться при выполнении цели + <buildtarget>post-install</buildtarget>. Избегайте + использования абсолютных путей, когда это возможно.</para> + + <para>При создании символический ссылки + <varname>STAGEDIR</varname> должен ставиться только для пути + назначения. Например:</para> + + <programlisting>${LN} -sf libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so</programlisting> + + <para>Первоначальный путь + <filename>${PREFIX}/lib/libfoo.so.42</filename> выглядит + нормально, но по факту может быть неправильным. Абсолютные + пути могут указывать на неподходящее место, например, когда + удалённая файловая система смонтирована по + <acronym>NFS</acronym> как непривилегированная точка + монтирования. Относительные пути реже подвержены проблемам и + часто намного короче.</para> + + <para>Порты, устанавливающие модули ядра, должны предварять путь + установки (по умолчанию <filename>/boot/modules</filename>) + переменной <varname>STAGEDIR</varname>.</para> + </sect1> + + <sect1 xml:id="porting-shlibs"> + <title>Динамические библиотеки</title> + + <para>Если ваш порт устанавливает одну или несколько динамических + библиотек, определите переменную + <varname>USE_LDCONFIG</varname>, которая приведёт к запуску из + <filename>bsd.port.mk</filename> команды + <literal>${LDCONFIG} -m</literal> относительно каталога, + в который устанавливается новая библиотека (как правило, это + <filename>PREFIX/lib</filename>), во время выполнения цели + <buildtarget>post-install</buildtarget> для её регистрации в + кэше динамических библиотек. Эта переменная, если она + определена, также приведёт к добавлению соответствующей пары + команд <literal>@exec /sbin/ldconfig -m</literal> и + <literal>@unexec /sbin/ldconfig -R</literal> в ваш файл + <filename>pkg-plist</filename>, так что пользователь, + устанавливающий пакет, сможет сразу же использовать + динамическую библиотеку, а удаление пакета не приведёт к тому, + что система будет предполагать, что библиотека всё ещё имеется + в наличии.</para> + + <programlisting>USE_LDCONFIG= yes</programlisting> + + <para>Если нужно, вы можете переопределить каталог по умолчанию, + задав значение <varname>USE_LDCONFIG</varname>, в котором + должны быть перечислены каталоги, в которые устанавливаются + динамические библиотеки. Например, если ваш порт устанавливает + динамические библиотеки в каталоги + <filename>PREFIX/lib/foo</filename> и + <filename>PREFIX/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> во время компоновки (для примера + смотрите <package role="port">lang/moscow_ml</package>), или с + помощью сценария-обёртки, который выставляет + <varname>LD_LIBRARY_PATH</varname> перед запуском исполняемого + файла как это делает <package + role="port">www/seamonkey</package>.</para> + + <para>При установке 32-разрядных библиотек на 64-разрядной + системе используйте вместо этого + <varname>USE_LDCONFIG32</varname>.</para> + + <para>Постарайтесь сохранять номера версий динамических библиотек + в формате <filename>libfoo.so.0</filename>. Наш компоновщик + позаботится только о старшем (первом) номере.</para> + + <para>Если при обновлении порта увеличивается старший номер + версии библиотеки, то для всех портов, компонуемых с затронутой + библиотекой, следует увеличить значение + <varname>PORTREVISION</varname> для форсирования перекомпиляции + с новой версией библиотеки.</para> + </sect1> + + <sect1 xml:id="porting-restrictions"> + <title>Порты с ограничениями на распространение или с правовым + обременением</title> + + <para>Лицензии бывают разных видов, и некоторые накладывают + ограничение на то, как приложение может быть оформлено в виде + пакета, может ли оно продаваться для извлечения коммерческой + выгоды, и так далее.</para> + + <important> + <para>На вас, как на человека, портирующего приложение, ложится + обязанность прочесть лицензионные соглашения на программное + обеспечение и удостовериться, что проект &os; не будет + являться их нарушителем, если будет заниматься + распространением исходного кода или в бинарном виде по + FTP/HTTP или на CD-ROM. Если у вас возникли сомнения, то, + пожалуйста, обратитесь в &a.ports;.</para> + </important> + + <para>В подобных ситуациях можно использовать переменные, + описываемые в последующих разделах.</para> + + <sect2> + <title><varname>NO_PACKAGE</varname></title> + + <para>Эта переменная указывает, что мы не можем создавать для + приложения двоичный пакет. К примеру, лицензия не позволяет + бинарное распространение или она может запрещать + распространение пакетов, созданных из изменённых + исходников.</para> + + <para>Однако файлы <varname>DISTFILES</varname> могут свободно + зеркалироваться по FTP/HTTP. Они также могут + распространяться, используя CD-ROM (или на похожих + носителях), если не установлена переменная + <varname>NO_CDROM</varname>.</para> + + <para><varname>NO_PACKAGE</varname> должна также + использоваться, если двоичный пакет, как правило, бесполезен, + а приложение должно всегда компилироваться из исходного кода. + К примеру, если в приложение во время компиляции жёстко + включается конфигурационная информация, привязанная к + конкретной системе, то задайте переменную + <varname>NO_PACKAGE</varname>.</para> + + <para>Значением переменной <varname>NO_PACKAGE</varname> должна + быть строка, описывающая причину, по которой пакет не должен + создаваться.</para> + </sect2> + + <sect2> + <title><varname>NO_CDROM</varname></title> + + <para>Эта переменная указывает на то, что, хотя мы имеем право + создавать бинарные пакеты, мы не можем помещать эти пакеты + или файлы <varname>DISTFILES</varname> порта на CD-ROM (или + на похожие носители) для перепродажи. Однако бинарные пакеты + и файлы <varname>DISTFILES</varname> порта будут оставаться + доступными посредством FTP/HTTP.</para> + + <para>Если эта переменная устанавливается вместе с + <varname>NO_PACKAGE</varname>, то только файлы порта + <varname>DISTFILES</varname> будут доступны, и только + посредством FTP/HTTP.</para> + + <para>В качестве значения <varname>NO_CDROM</varname> должна + указываться строка, описывающая причины, по которым порт не + может распространяться на CD-ROM. К примеру, это + применяется, если лицензионное соглашение приложения + предполагает только его <quote>некоммерческое</quote> + использование.</para> + </sect2> + + <sect2> + <title><varname>NOFETCHFILES</varname></title> + + <para>Файлы, определенные в переменной + <varname>NOFETCHFILES</varname>, не будут извлекаться ни из + одного из <varname>MASTER_SITES</varname>. Примером такого + файла является файл, поставляемый на CD-ROM.</para> + + <para>Инструменты, проверяющие доступность этих файлов на + <varname>MASTER_SITES</varname>, должны игнорировать эти + файлы и не сообщать о них.</para> + </sect2> + + <sect2> + <title><varname>RESTRICTED</varname></title> + + <para>Задайте эту переменную, если лицензия на приложение не + позволяет ни зеркалировать файлы + <varname>DISTFILES</varname>, ни распространять бинарный + пакет через FTP/HTTP или на CD-ROM.</para> + + <para>Ни <varname>NO_CDROM</varname>, ни + <varname>NO_PACKAGE</varname> не стоит устанавливать вместе с + <varname>RESTRICTED</varname>, так как последняя переменная + подразумевает первые две.</para> + + <para>В качестве значения <varname>RESTRICTED</varname> должна + указываться строка, описывающая причины, по которым порт + нельзя распространять. Обычно это означает, что порт + использует закрытое программное обеспечение, а пользователь + должен вручную сгрузить файлы <varname>DISTFILES</varname>, + возможно, после заполнения регистрационной формы или + подтверждения соглашения с условиями + <acronym>EULA</acronym>.</para> + </sect2> + + <sect2> + <title><varname>RESTRICTED_FILES</varname></title> + + <para>Если заданы <varname>RESTRICTED</varname> или + <varname>NO_CDROM</varname>, то значение этой переменной по + умолчанию соответствует <literal>${DISTFILES} + ${PATCHFILES}</literal>, в противном случае она пуста. + Если ограничены в распространении лишь некоторые из + дистрибутивных файлов, то в этой переменной задаётся их + список.</para> + </sect2> + + <sect2> + <title><varname>LEGAL_TEXT</varname></title> + + <para>Если порт имеет правовое обременение, которое не + покрывается перечисленными выше переменными, то переменной + <varname>LEGAL_TEXT</varname> следует присвоить строку с + описанием данного обременения. Например, если было получено + особое разрешение для &os; на распространение двоичного + файла, то эта переменная должна содержать соответствующее + указание.</para> + </sect2> + + <sect2> + <title><filename>/usr/ports/LEGAL</filename> и + <varname>LEGAL</varname></title> + + <para>Порт, содержащий любую из перечисленных выше переменных, + также должен быть добавлен в + <filename>/usr/ports/LEGAL</filename>. Первый столбец + содержит шаблон совпадения с дистрибутивными файлами, + имеющими ограничения на распространение. Второй столбец + содержит корень порта. Третий столбец содержит вывод + <command>make -VLEGAL</command>.</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 xml:id="building"> - <title>Механизмы построения</title> - - <sect2 xml:id="parallel-builds"> - <title>Параллельное построение портов</title> - - <para>Инфраструктура портов &os; поддерживает параллельное - построение с использованием множественных подпроцессов - <command>make</command>, что позволяет системам - <acronym>SMP</acronym> задействовать всю доступную мощность - <acronym>CPU</acronym>, тем самым делая построение портов более - быстрым и эффективным.</para> - - <para>Это достигается путём передачи флага <varname>-jX</varname> - команде &man.make.1;. Такое построение портов является - поведением по умолчанию. К сожалению, не все порты поддерживают - параллельную сборку достаточно хорошо, и поэтому может - потребоваться выключить этот механизм явным образом путём - добавления переменной <literal>MAKE_JOBS_UNSAFE=yes</literal>. - Эта переменная используется в случае, когда известно, что порт - ломается с <varname>-jX</varname>.</para> - </sect2> - - <sect2 xml:id="using-make"> - <title><command>make</command>, <command>gmake</command> и - <command>imake</command></title> - - <para>Если ваш порт использует <application>GNU make</application>, - то установите <literal>USES= gmake</literal>.</para> - - <table frame="none"> - <title>Переменные для портов, использующих - <application>gmake</application></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>USES= gmake</varname></entry> - - <entry>Для сборки порта требуется - <command>gmake</command>.</entry> - </row> - - <row> - <entry><varname>GMAKE</varname></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>USES= imake</literal>. Это заставит стадию - конфигурирования автоматически выполнить <command>xmkmf -a</command>. - Если флаг <option>-a</option> представляет для вашего порта - проблему, то установите <literal>XMKMF=xmkmf</literal>. Если - порт использует <application>imake</application>, но не понимает - цель <buildtarget>install.man</buildtarget>, то следует установить - <literal>NO_INSTALL_MANPAGES=yes</literal>.</para> - - <para>Если исходный <filename>Makefile</filename> вашего порта - имеет что-нибудь помимо <buildtarget>all</buildtarget> в качестве - основной цели построения, то задайте соответствующее значение - <varname>ALL_TARGET</varname>. То же касается - <buildtarget>install</buildtarget> и - <varname>INSTALL_TARGET</varname>.</para> - - </sect2> - - <sect2 xml: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>), установите эти параметры - в <varname>CONFIGURE_ARGS</varname>. Дополнительные переменные - окружения можно передать, используя переменную - <varname>CONFIGURE_ENV</varname>.</para> - - <table frame="none"> - <title>Переменные для портов, использующих - <command>configure</command></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>GNU_CONFIGURE</varname></entry> - - <entry>Порт использует сценарий <command>configure</command> - для подготовки построения.</entry> - </row> - - <row> - <entry><varname>HAS_CONFIGURE</varname></entry> - - <entry>То же, что и <varname>GNU_CONFIGURE</varname>, кроме - того, что цель configure по умолчанию не добавляется в - <varname>CONFIGURE_ARGS</varname>.</entry> - </row> - - <row> - <entry><varname>CONFIGURE_ARGS</varname></entry> - - <entry>Дополнительные параметры, передаваемые сценарию - <command>configure</command>.</entry> - </row> - - <row> - <entry><varname>CONFIGURE_ENV</varname></entry> - - <entry>Дополнительные переменные окружения, задаваемые для - запуска сценария <command>configure</command>.</entry> - </row> - - <row> - <entry><varname>CONFIGURE_TARGET</varname></entry> - - <entry>Переопределить цель configure по умолчанию. Значением - по умолчанию является - <literal>${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal>.</entry> - </row> - </tbody> - </tgroup> - </table> - </sect2> - - <sect2 xml:id="using-cmake"> - <title>Использование <command>cmake</command></title> - - <para>Если ваш порт использует <application>CMake</application>, - определите <literal>USES= cmake</literal> или - <literal>USES= cmake:outsource</literal> для построения - во внешнем каталоге (см. ниже).</para> - - <table frame="none"> - <title>Переменные для портов, использующих - <command>cmake</command></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>CMAKE_ARGS</varname></entry> - <entry>Специфичные для порта флаги - <application>CMake</application>, передаваемые - <command>cmake</command>.</entry> - </row> - - <row> - <entry><varname>CMAKE_BUILD_TYPE</varname></entry> - <entry>Тип построения (предопределённые профили - построения <application>CMake</application>). По - умолчанию <literal>Release</literal>, - <literal>Debug</literal> при использовании - <varname>WITH_DEBUG</varname>.</entry> - </row> - - <row> - <entry><varname>CMAKE_ENV</varname></entry> - <entry>Переменные окружения для передачи - <command>cmake</command>. По умолчанию - <literal>${CONFIGURE_ENV}</literal>.</entry> - </row> - - <row> - <entry><varname>CMAKE_SOURCE_PATH</varname></entry> - <entry>Путь к каталогу с исходным кодом. По умолчанию - <literal>${WRKSRC}</literal>.</entry> - </row> - </tbody> - </tgroup> - </table> - - <table frame="none"> - <title>Переменные построения <command>cmake</command>, - устанавливаемые пользователем</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>CMAKE_VERBOSE</varname></entry> - <entry>Разрешает подробный вывод сообщений при - построении. Значение по умолчанию не задано, - если не заданы <varname>BATCH</varname> или - <varname>PACKAGE_BUILDING</varname>.</entry> - </row> - - <row> - <entry><varname>CMAKE_NOCOLOR</varname></entry> - <entry>Запрещает цветной вывод сообщений при - построении. Значение по умолчанию не задано, - если не заданы <varname>BATCH</varname> или - <varname>PACKAGE_BUILDING</varname>.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para><application>CMake</application> поддерживает следующие - профили построения: <literal>Debug</literal>, - <literal>Release</literal>, - <literal>RelWithDebInfo</literal> и - <literal>MinSizeRel</literal>. Профили - <literal>Debug</literal> и <literal>Release</literal> - учитывают системные флаги <literal>*FLAGS</literal>; - <literal>RelWithDebInfo</literal> и - <literal>MinSizeRel</literal> соответственно определяют - <varname>CFLAGS</varname> со значением - <literal>-O2 -g</literal> и <literal>-Os -DNDEBUG</literal>. - Значение <varname>CMAKE_BUILD_TYPE</varname> экспортируется - в нижнем регистре в <varname>PLIST_SUB</varname> и должно - использоваться, если порт устанавливает файлы - <literal>*.cmake</literal> в зависимости от типа построения - (для примера посмотрите на - <package role="port">deskutils/strigi</package>). Следует - учитывать, что некоторые проекты могут определять собственные - профили построения и/или форсировать конкретный тип построения - через установку <literal>CMAKE_BUILD_TYPE</literal> в файлах - <filename>CMakeLists.txt </filename> . Для того чтобы порт - для такого проекта учитывал <varname>CFLAGS</varname> и - <varname>WITH_DEBUG</varname>, из этих файлов должны быть - удалены значения <literal>CMAKE_BUILD_TYPE</literal>.</para> - - <para>Большинство проектов, основанных на - <application>CMake</application>, поддерживают метод внешнего - (out-of-source) построения. Для порта внешнее построение - можно запросить с использованием суффикса - <literal>:outsource</literal>. В этом случае - <varname>CONFIGURE_WRKSRC</varname>, - <varname>BUILD_WRKSRC</varname> и - <varname>INSTALL_WRKSRC</varname> будут иметь значение - <literal>${WRKDIR}/.build</literal> для каталога, - содержащего файлы, получаемые на этапах конфигурации и - построения; при этом каталог с исходным кодом будет - оставаться без изменений.</para> - - <example xml:id="using-cmake-example"> - <title>Пример использования - <literal>USES= cmake</literal></title> - - <para>Следующий отрывок демонстрирует использование - <application>CMake</application> для порта. - <varname>CMAKE_SOURCE_PATH</varname> обычно не требуется, - но может быть установлен, когда исходный код не находится - в верхнем каталоге или если порт используется для - построения части проекта.</para> - - <programlisting>USES= cmake:outsource -CMAKE_SOURCE_PATH= ${WRKSRC}/subproject</programlisting> - </example> - </sect2> + <para>Это одновременно и информирует пользователя, и + устанавливает нужные метаданные на пользовательской машине + для использования автоматическими программами.</para> + + <para>Обратите внимание, что данная кляуза должна + предшествовать подключению файла + <filename>bsd.port.pre.mk</filename>.</para> + </sect2> + </sect1> + + <sect1 xml:id="building"> + <title>Механизмы построения</title> + + <sect2 xml:id="parallel-builds"> + <title>Параллельное построение портов</title> + + <para>Инфраструктура портов &os; поддерживает параллельное + построение с использованием множественных подпроцессов + <command>make</command>, что позволяет системам + <acronym>SMP</acronym> задействовать всю доступную мощность + <acronym>CPU</acronym>, тем самым делая построение портов + более быстрым и эффективным.</para> + + <para>Это достигается путём передачи флага + <varname>-jX</varname> команде &man.make.1;. Такое + построение портов является поведением по умолчанию. К + сожалению, не все порты поддерживают параллельную сборку + достаточно хорошо, и поэтому может потребоваться выключить + этот механизм явным образом путём добавления переменной + <literal>MAKE_JOBS_UNSAFE=yes</literal>. Эта переменная + используется в случае, когда известно, что порт ломается с + <varname>-jX</varname>.</para> + </sect2> + + <sect2 xml:id="using-make"> + <title><command>make</command>, <command>gmake</command> и + <command>imake</command></title> + + <para>Если ваш порт использует + <application>GNU make</application>, то установите + <literal>USES= gmake</literal>.</para> - <sect2 xml: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><varname>SCONS_ARGS</varname></entry> - - <entry>Специфичные для порта флаги SCons, передаваемые - окружению SCons.</entry> - </row> - - <row> - <entry><varname>SCONS_BUILDENV</varname></entry> - - <entry>Переменные для установки в системном окружении.</entry> - </row> - - <row> - <entry><varname>SCONS_ENV</varname></entry> - - <entry>Переменные для установки в окружении SCons.</entry> - </row> - - <row> - <entry><varname>SCONS_TARGET</varname></entry> - - <entry>Последний параметр для передачи SCons, похожий на - <varname>MAKE_TARGET</varname>.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Для того, чтобы сторонний <filename>SConstruct</filename> - соответствовал всему, что передается SCons в переменной - <varname>SCONS_ENV</varname> (самое главное, это - <varname>CC/CXX/CFLAGS/CXXFLAGS</varname>), примените патч к - <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 xml:id="using-autotools"> - <title>Использование GNU autotools</title> - - <sect2 xml: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 xml: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:version</literal> - сообщает инфраструктуре построения о применении патча к сценарию - configure с установленной в системе копией - <command>libtool</command>. Подразумевается использование - The <varname>GNU_CONFIGURE</varname> - Более того, некоторые переменные make и оболочки shell - будут назначены для дальнейшего использования этим портом. - Подробности смотрите в <filename>bsd.autotools.mk</filename>.</para> - - <para>При использовании операции <literal>:env</literal> будет - настроено только окружение.</para> - - <para>Наконец, <varname>LIBTOOLFLAGS</varname> и - <varname>LIBTOOLFILES</varname> можно установить по желанию, - чтобы переопределить наиболее вероятные аргументы для - <command>libtool</command> и файлы, предназначенные для - изменения. Большинству портов это скорее всего не понадобится. - Для дальнейших подробностей смотрите - <filename>bsd.autotools.mk</filename>.</para> - </sect2> - - <sect2 xml: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>Всё, что в настоящее время она делает, это добавление - <varname>LIB_DEPENDS</varname> для подходящего порта - <command>libltdl</command>, потому она предоставляется как - удобная функция для помощи в устранении всяких зависимостей от - портов autotools вне инфраструктуры <varname>USE_AUTOTOOLS</varname>. - Для этого инструмента не существует необязательных операций.</para> - - </sect2> - - <sect2 xml: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:version</literal>.</para> - - <para>Аналогично команде <command>libtool</command>, подключение - необязательной операции <literal>:env</literal> всего лишь - настраивает окружение для дальнейшего использования. Без этого - выполняется наложение патчей и переконфигурирование порта.</para> - - <para>Дополнительные необязательные переменные - <varname>AUTOCONF_ARGS</varname> и <varname>AUTOHEADER_ARGS</varname> - можно переопределить в <filename>Makefile</filename> порта, - если указано явным образом. Как и с эквивалентами - <command>libtool</command>, большинству портов это вряд ли - понадобится.</para> - </sect2> - - <sect2 xml: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:version</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> имеют - необязательные переменные <varname>AUTOMAKE_ARGS</varname> и - <varname>ACLOCAL_ARGS</varname>, соответственно, которые при - необходимости можно переопределить в <filename>Makefile</filename> - порта.</para> - - </sect2> - </sect1> - - <sect1 xml:id="using-gettext"> - <title>Использование GNU <literal>gettext</literal></title> - - <sect2> - <title>Простой вариант использования</title> - - <para>Если для вашего порта требуется <literal>gettext</literal>, - добавьте <literal>USES= gettext</literal>, и ваш порт - унаследует зависимость от <package role="port">devel/gettext</package>. - <xref linkend="uses-values"/> содержит перечень других - значений для использования <literal>gettext</literal>.</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>USES= gettext -CPPFLAGS+= -I${LOCALBASE}/include -LDFLAGS+= -L${LOCALBASE}/lib - -GNU_CONFIGURE= yes</programlisting> - - <para>Конечно же, этот код можно записать в более компактном - виде, если передавать флаги в - <command>configure</command> не требуется:</para> - - <programlisting>USES= gettext -GNU_CONFIGURE= yes</programlisting> - </sect2> - - <sect2> - <title>Оптимальное использование</title> - - <para>Некоторые программные продукты позволяют отключать NLS, - к примеру через передачу параметра <option>--disable-nls</option> - сценарию <command>configure</command>. В этом случае ваш порт - должен использовать <literal>gettext</literal>, в зависимости - от значения <varname>NLS</varname>. - Для портов небольшой или средней сложности вы можете полагаться - на следующую идиому:</para> - - <programlisting>GNU_CONFIGURE= yes - -.include <bsd.port.options.mk> + <table frame="none"> + <title>Переменные для портов, использующих + <application>gmake</application></title> -.if ${PORT_OPTIONS:MNLS} -USES+= gettext -PLIST_SUB+= NLS="" -.else -CONFIGURE_ARGS+= --disable-nls -PLIST_SUB+= NLS="@comment " -.endif + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> -.include <bsd.port.mk></programlisting> + <tbody> + <row> + <entry><varname>USES= gmake</varname></entry> + <entry>Для сборки порта требуется + <command>gmake</command>.</entry> + </row> - <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> + <row> + <entry><varname>GMAKE</varname></entry> + <entry>Полный путь к команде <command>gmake</command>, + если отсутствует в <envar>PATH</envar>.</entry> + </row> + </tbody> + </tgroup> + </table> - <para>В особо сложных случаях вам понадобиться использовать более - продвинутые техники, чем данный рецепт, такие как <link linkend="plist-dynamic">динамические списки упаковки</link>.</para> - </sect2> - - <sect2> - <title>Управление каталогами сообщений</title> - - <para>Существует момент, который следует учитывать при установке - файлов каталогов сообщений. Целевые каталоги для размещения, - расположенные под - <filename>LOCALBASE/share/locale</filename>, - редко когда должны создаваться и удаляться портом. Для - наиболее популярных языков имеются собственные каталоги, - перечисленные в - <filename>PORTSDIR/Templates/BSD.local.dist</filename>. - Каталоги для - множества других языков управляются с помощью порта - <package role="port">devel/gettext</package>. Обратите внимание - на его <filename>pkg-plist</filename> и посмотрите, куда данный - порт собирается установить файлы каталогов сообщений для - единственного в своем роде языка.</para> - </sect2> - </sect1> - - <sect1 xml:id="using-perl"> - <title>Использование <application>Perl</application></title> - - <para>Если <varname>MASTER_SITES</varname> установлена в значение - <varname>MASTER_SITE_PERL_CPAN</varname>, то предпочтительным - значением <varname>MASTER_SITE_SUBDIR</varname> является имя - иерархии верхнего уровня. Например, рекомендуемым значением для - <literal>p5-Module-Name</literal> является <literal>Module</literal>. - Иерархию верхнего уровня можно посмотреть на сайте <link xlink:href="http://cpan.org/modules/by-module/">cpan.org</link>. Это - поддерживает порт в рабочем состоянии при изменении модуля - автором.</para> - - <para>Исключением этого правила является отсутствие соответствующего - каталога или файла с дистрибутивом в этом каталоге. В этом случае - в качестве <varname>MASTER_SITE_SUBDIR</varname> разрешается - использовать 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> + <para>Если ваш порт является приложением X, которое создает + файлы <filename>Makefile</filename> из + <filename>Imakefile</filename>, используя + <application>imake</application>, то установите + <literal>USES= imake</literal>. Это заставит стадию + конфигурирования автоматически выполнить + <command>xmkmf -a</command>. Если флаг <option>-a</option> + представляет для вашего порта проблему, то установите + <literal>XMKMF=xmkmf</literal>. Если порт использует + <application>imake</application>, но не понимает цель + <buildtarget>install.man</buildtarget>, то следует установить + <literal>NO_INSTALL_MANPAGES=yes</literal>.</para> + + <para>Если исходный <filename>Makefile</filename> вашего порта + имеет что-нибудь помимо <buildtarget>all</buildtarget> в + качестве основной цели построения, то задайте соответствующее + значение <varname>ALL_TARGET</varname>. То же касается + <buildtarget>install</buildtarget> и + <varname>INSTALL_TARGET</varname>.</para> + </sect2> + + <sect2 xml: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>), установите + эти параметры в <varname>CONFIGURE_ARGS</varname>. + Дополнительные переменные окружения можно передать, используя + переменную <varname>CONFIGURE_ENV</varname>.</para> <table frame="none"> <title>Переменные для портов, использующих - <application>Perl</application></title> + <command>configure</command></title> <tgroup cols="2"> <thead> <row> <entry>Переменная</entry> - <entry>Значение</entry> </row> </thead> <tbody> <row> - <entry><varname>USE_PERL5</varname></entry> + <entry><varname>GNU_CONFIGURE</varname></entry> + <entry>Порт использует сценарий + <command>configure</command> для подготовки + построения.</entry> + </row> - <entry>Perl 5 используется для построения и работы.</entry> + <row> + <entry><varname>HAS_CONFIGURE</varname></entry> + <entry>То же, что и <varname>GNU_CONFIGURE</varname>, + кроме того, что цель configure по умолчанию не + добавляется в + <varname>CONFIGURE_ARGS</varname>.</entry> </row> <row> - <entry><varname>USE_PERL5_BUILD</varname></entry> + <entry><varname>CONFIGURE_ARGS</varname></entry> + <entry>Дополнительные параметры, передаваемые сценарию + <command>configure</command>.</entry> + </row> - <entry>Perl 5 используется для построения.</entry> - </row> + <row> + <entry><varname>CONFIGURE_ENV</varname></entry> + <entry>Дополнительные переменные окружения, задаваемые + для запуска сценария + <command>configure</command>.</entry> + </row> - <row> - <entry><varname>USE_PERL5_RUN</varname></entry> + <row> + <entry><varname>CONFIGURE_TARGET</varname></entry> + <entry>Переопределить цель configure по умолчанию. + Значением по умолчанию является + <literal>${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal>.</entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> - <entry>Perl 5 используется во время работы.</entry> - </row> + <sect2 xml:id="using-cmake"> + <title>Использование <command>cmake</command></title> - <row> - <entry><varname>PERL</varname></entry> + <para>Если порт использует <application>CMake</application>, + определите <literal>USES= cmake</literal> или + <literal>USES= cmake:outsource</literal> для построения во + внешнем каталоге (см. ниже).</para> - <entry>Полный путь к интерпретатору Perl 5, либо в - системе, либо установленному из портов, но без номера версии. - Используйте это, если вам нужно заменить строки - <quote><literal>#!</literal></quote> в скриптах.</entry> - </row> + <table frame="none"> + <title>Переменные для портов, использующих + <command>cmake</command></title> - <row> - <entry><varname>PERL_CONFIGURE</varname></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> - <entry>Конфигурация при помощи MakeMaker языка Perl. Влечёт - <varname>USE_PERL5</varname>.</entry> + <tbody> + <row> + <entry><varname>CMAKE_ARGS</varname></entry> + <entry>Специфичные для порта флаги + <application>CMake</application>, передаваемые + <command>cmake</command>.</entry> </row> - <row> - <entry><varname>PERL_MODBUILD</varname></entry> + <row> + <entry><varname>CMAKE_BUILD_TYPE</varname></entry> + <entry>Тип построения (предопределённые профили + построения <application>CMake</application>). По + умолчанию <literal>Release</literal>, + <literal>Debug</literal> при использовании + <varname>WITH_DEBUG</varname>.</entry> + </row> - <entry>Конфигурация, построение и установка с использованием - Module::Build. Влечёт <varname>PERL_CONFIGURE</varname>. - </entry> + <row> + <entry><varname>CMAKE_ENV</varname></entry> + <entry>Переменные окружения для передачи + <command>cmake</command>. По умолчанию + <literal>${CONFIGURE_ENV}</literal>.</entry> + </row> + + <row> + <entry><varname>CMAKE_SOURCE_PATH</varname></entry> + <entry>Путь к каталогу с исходным кодом. По умолчанию + <literal>${WRKSRC}</literal>.</entry> </row> </tbody> </tgroup> + </table> + + <table frame="none"> + <title>Переменные построения <command>cmake</command>, + устанавливаемые пользователем</title> <tgroup cols="2"> <thead> <row> - <entry>Переменные только для чтения</entry> - + <entry>Переменная</entry> <entry>Значение</entry> </row> </thead> <tbody> <row> - <entry><varname>PERL_VERSION</varname></entry> + <entry><varname>CMAKE_VERBOSE</varname></entry> + <entry>Разрешает подробный вывод сообщений при + построении. Значение по умолчанию не задано, если не + заданы <varname>BATCH</varname> или + <varname>PACKAGE_BUILDING</varname>.</entry> + </row> - <entry>Полная версия установленного Perl - (например, <literal>5.8.9</literal>).</entry> + <row> + <entry><varname>CMAKE_NOCOLOR</varname></entry> + <entry>Запрещает цветной вывод сообщений при + построении. Значение по умолчанию не задано, если не + заданы <varname>BATCH</varname> или + <varname>PACKAGE_BUILDING</varname>.</entry> </row> + </tbody> + </tgroup> + </table> - <row> - <entry><varname>PERL_LEVEL</varname></entry> + <para><application>CMake</application> поддерживает следующие + профили построения: <literal>Debug</literal>, + <literal>Release</literal>, <literal>RelWithDebInfo</literal> + и <literal>MinSizeRel</literal>. Профили + <literal>Debug</literal> и <literal>Release</literal> + учитывают системные флаги <literal>*FLAGS</literal>; + <literal>RelWithDebInfo</literal> и + <literal>MinSizeRel</literal> соответственно определяют + <varname>CFLAGS</varname> со значением + <literal>-O2 -g</literal> и <literal>-Os -DNDEBUG</literal>. + Значение <varname>CMAKE_BUILD_TYPE</varname> экспортируется в + нижнем регистре в <varname>PLIST_SUB</varname> и должно + использоваться, если порт устанавливает файлы + <literal>*.cmake</literal> в зависимости от типа построения + (для примера посмотрите на + <package role="port">deskutils/strigi</package>). Следует + учитывать, что некоторые проекты могут определять собственные + профили построения и/или форсировать конкретный тип + построения через установку + <literal>CMAKE_BUILD_TYPE</literal> в файлах + <filename>CMakeLists.txt </filename> . Для того чтобы порт + для такого проекта учитывал <varname>CFLAGS</varname> и + <varname>WITH_DEBUG</varname>, из этих файлов должны быть + удалены значения <literal>CMAKE_BUILD_TYPE</literal>.</para> + + <para>Большинство проектов, основанных на + <application>CMake</application>, поддерживают метод внешнего + (out-of-source) построения. Для порта внешнее построение + можно запросить с использованием суффикса + <literal>:outsource</literal>. В этом случае + <varname>CONFIGURE_WRKSRC</varname>, + <varname>BUILD_WRKSRC</varname> и + <varname>INSTALL_WRKSRC</varname> будут иметь значение + <literal>${WRKDIR}/.build</literal> для каталога, + содержащего файлы, получаемые на этапах конфигурации и + построения; при этом каталог с исходным кодом будет + оставаться без изменений.</para> + + <example xml:id="using-cmake-example"> + <title>Пример для <literal>USES= cmake</literal></title> + + <para>Следующий отрывок демонстрирует использование + <application>CMake</application> для порта. + <varname>CMAKE_SOURCE_PATH</varname> обычно не требуется, + но может быть установлен, когда исходный код не находится + в верхнем каталоге или если порт используется для + построения части проекта.</para> + + <programlisting>USES= cmake:outsource +CMAKE_SOURCE_PATH= ${WRKSRC}/subproject</programlisting> + </example> + </sect2> - <entry>Установленная версия Perl в форме - целого числа вида <literal>MNNNPP</literal> (например, - <literal>500809</literal>).</entry> - </row> + <sect2 xml:id="using-scons"> + <title>Использование <command>scons</command></title> - <row> - <entry><varname>PERL_ARCH</varname></entry> + <para>Если ваш порт использует + <application>SCons</application>, определите + <literal>USE_SCONS=yes</literal>.</para> - <entry>Место, в котором Perl хранит - архитектурно-зависимые библиотеки. По умолчанию - это <literal>${ARCH}-freebsd</literal>.</entry> - </row> + <table frame="none"> + <title>Переменные для портов, использующих + <command>scons</command></title> - <row> - <entry><varname>PERL_PORT</varname></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> - <entry>Название установленного порта Perl, - (к примеру, <literal>perl5</literal>).</entry> - </row> + <tbody> + <row> + <entry><varname>SCONS_ARGS</varname></entry> + <entry>Специфичные для порта флаги SCons, передаваемые + окружению SCons.</entry> + </row> - <row> - <entry><varname>SITE_PERL</varname></entry> + <row> + <entry><varname>SCONS_BUILDENV</varname></entry> + <entry>Переменные для установки в системном + окружении.</entry> + </row> - <entry>Имя каталога, куда помещаются специфичные для сайта - пакеты Perl. Это значение добавляется к - <varname>PLIST_SUB</varname>.</entry> - </row> + <row> + <entry><varname>SCONS_ENV</varname></entry> + <entry>Переменные для установки в окружении + SCons.</entry> + </row> + + <row> + <entry><varname>SCONS_TARGET</varname></entry> + <entry>Последний параметр для передачи SCons, похожий + на <varname>MAKE_TARGET</varname>.</entry> + </row> </tbody> </tgroup> </table> - <note> - <para>Порты для модулей Perl, которые не имеют официального вебсайта, - должны указывать <systemitem>cpan.org</systemitem> в строке WWW в файле - <filename>pkg-descr</filename>. Предпочтительная форма URL - <literal>http://search.cpan.org/dist/Module-Name/</literal> - (включая завершающий слэш).</para> - </note> + <para>Для того, чтобы сторонний <filename>SConstruct</filename> + соответствовал всему, что передается SCons в переменной + <varname>SCONS_ENV</varname> (самое главное, это + <varname>CC/CXX/CFLAGS/CXXFLAGS</varname>), примените патч к + <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 xml:id="using-autotools"> + <title>Использование GNU Autotools</title> + + <sect2 xml: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 xml: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:version</literal> сообщает инфраструктуре + построения о применении патча к сценарию configure с + установленной в системе копией <command>libtool</command>. + Означает использование <varname>GNU_CONFIGURE</varname>. + Более того, некоторые переменные make и оболочки shell будут + назначены для дальнейшего использования этим портом. + Подробности смотрите в + <filename>bsd.autotools.mk</filename>.</para> + + <para>При использовании операции <literal>:env</literal> будет + настроено только окружение.</para> + + <para>Наконец, <varname>LIBTOOLFLAGS</varname> и + <varname>LIBTOOLFILES</varname> можно установить по желанию, + чтобы переопределить наиболее вероятные аргументы для + <command>libtool</command> и файлы, предназначенные для + изменения. Большинству портов это скорее всего не + понадобится. Для дальнейших подробностей смотрите + <filename>bsd.autotools.mk</filename>.</para> + </sect2> + + <sect2 xml: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>Всё, что в настоящее время она делает, это добавление + <varname>LIB_DEPENDS</varname> для подходящего порта + <command>libltdl</command>, потому она предоставляется как + удобная функция для помощи в устранении всяких зависимостей + от портов autotools вне инфраструктуры + <varname>USE_AUTOTOOLS</varname>. Для этого инструмента не + существует необязательных операций.</para> + </sect2> + + <sect2 xml: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:version</literal>.</para> + + <para>Аналогично команде <command>libtool</command> включение + необязательной операции <literal>:env</literal> всего лишь + настраивает окружение для дальнейшего использования. Без + этого выполняется наложение патчей и переконфигурирование + порта.</para> + + <para>Дополнительные необязательные переменные + <varname>AUTOCONF_ARGS</varname> и + <varname>AUTOHEADER_ARGS</varname> можно переопределить в + <filename>Makefile</filename> порта, если указано явным + образом. Как и с эквивалентами <command>libtool</command>, + большинству портов это вряд ли понадобится.</para> + </sect2> + + <sect2 xml: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:version</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> + соответственно имеют необязательные переменные + <varname>AUTOMAKE_ARGS</varname> и + <varname>ACLOCAL_ARGS</varname>, которые при необходимости + можно переопределить в <filename>Makefile</filename> + порта.</para> + </sect2> + </sect1> + + <sect1 xml:id="using-gettext"> + <title>Использование GNU <literal>gettext</literal></title> + + <sect2> + <title>Простой вариант использования</title> + + <para>Если для вашего порта требуется + <literal>gettext</literal>, добавьте + <literal>USES= gettext</literal>, и ваш порт унаследует + зависимость от <package role="port">devel/gettext</package>. + <xref linkend="uses-values"/> содержит перечень других + значений для использования <literal>gettext</literal>.</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>USES= gettext +CPPFLAGS+= -I${LOCALBASE}/include +LDFLAGS+= -L${LOCALBASE}/lib + +GNU_CONFIGURE= yes</programlisting> + + <para>Конечно же, этот код можно записать в более компактном + виде, если передавать флаги в <command>configure</command> не + требуется:</para> + + <programlisting>USES= gettext +GNU_CONFIGURE= yes</programlisting> + </sect2> + + <sect2> + <title>Оптимальное использование</title> + + <para>Некоторые программные продукты позволяют отключать NLS, + к примеру, передавая параметр <option>--disable-nls</option> + сценарию <command>configure</command>. В этом случае ваш + порт должен использовать <literal>gettext</literal>, в + зависимости от значения <varname>NLS</varname>. Для портов + небольшой или средней сложности вы можете полагаться на + следующую идиому:</para> + + <programlisting>GNU_CONFIGURE= yes - <note> - <para>Не используйте <literal>${SITE_PERL}</literal> в объявлении - зависимостей. Использование этой конструкции подразумевает - наличие подключенного <filename>bsd.perl.mk</filename>, что - не всегда так. Порты, зависимые от этого порта, получат - неправильные зависимости, если файлы этого порта будут - перемещены при последующем обновлении. Правильный способ - объявления зависимостей для модулей Perl показан в примере - ниже.</para> - </note> +.include <bsd.port.options.mk> + +.if ${PORT_OPTIONS:MNLS} +USES+= gettext +PLIST_SUB+= NLS="" +.else +CONFIGURE_ARGS+= --disable-nls +PLIST_SUB+= NLS="@comment " +.endif - <example xml:id="use-perl-dependency-example"> - <title>Пример зависимости Perl</title> +.include <bsd.port.mk></programlisting> - <programlisting>p5-IO-Tee>=0.64:${PORTSDIR}/devel/p5-IO-Tee</programlisting> - </example> + <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>Для портов Perl, которые устанавливают страницы справочника, - в <filename>pkg-plist</filename> можно использовать макрос - <varname>PERL5_MAN<replaceable>x</replaceable></varname> (где - <replaceable>x</replaceable> принимает значение от - <literal>1</literal> до <literal>9</literal>). Например,</para> - - <programlisting>lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz</programlisting> - - <para>можно заменить на</para> - - <programlisting>%%PERL5_MAN3%%/AnyEvent::I3.3.gz</programlisting> - </sect1> - - <sect1 xml:id="using-x11"> - <title>Использование X11</title> - - <sect2 xml:id="x11-variables"> - <title>Компоненты X.Org</title> - - <para>X.Org является реализацией X11, доступной в Коллекции Портов. - Если ваше приложение зависит от компонентов X, установите в - переменную <varname>USE_XORG</varname> в перечень требуемых - компонентов. К настоящему времени доступными компонентами - являются:</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. Вы можете указать зависимость от различных компонентов - этого проекта при помощи переменной <varname>USE_GL</varname>. - Действительные опции: <literal>glut, glu, glw, glew, gl</literal> и - <literal>linux</literal>. Для обратной совместимости значение - <literal>yes</literal> соответствует <literal>glu</literal>.</para> - - <example xml:id="use-xorg-example"> - <title>Пример для USE_XORG</title> - <programlisting>USE_XORG= xrender xft xkbfile xt xaw -USE_GL= glu</programlisting> - </example> + <para>В особо сложных случаях вам понадобиться использовать + более продвинутые техники, чем данный рецепт, такие как <link + linkend="plist-dynamic">динамические списки + упаковки</link>.</para> + </sect2> + + <sect2> + <title>Управление каталогами сообщений</title> + + <para>Существует момент, который следует учитывать при + установке файлов каталогов сообщений. Целевые каталоги для + размещения, расположенные под + <filename>LOCALBASE/share/locale</filename>, редко когда + должны создаваться и удаляться портом. Для наиболее + популярных языков имеются собственные каталоги, перечисленные + в <filename>PORTSDIR/Templates/BSD.local.dist</filename>. + Каталоги для множества других языков управляются с помощью + порта <package role="port">devel/gettext</package>. Обратите + внимание на его <filename>pkg-plist</filename> и посмотрите, + куда данный порт собирается установить файлы каталогов + сообщений для единственного в своем роде языка.</para> + </sect2> + </sect1> + + <sect1 xml:id="using-perl"> + <title>Использование <application>Perl</application></title> + + <para>Если <varname>MASTER_SITES</varname> установлена в значение + <varname>MASTER_SITE_PERL_CPAN</varname>, то предпочтительным + значением <varname>MASTER_SITE_SUBDIR</varname> является имя + иерархии верхнего уровня. Например, рекомендуемым значением + для <literal>p5-Module-Name</literal> является + <literal>Module</literal>. Иерархию верхнего уровня можно + посмотреть на сайте <link + xlink:href="http://cpan.org/modules/by-module/">cpan.org</link>. + Это поддерживает порт в рабочем состоянии при изменении модуля + автором.</para> + + <para>Исключением этого правила является отсутствие + соответствующего каталога или файла с дистрибутивом в этом + каталоге. В качестве <varname>MASTER_SITE_SUBDIR</varname> в + этом случае разрешается использовать 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><varname>USE_PERL5</varname></entry> + <entry>Perl 5 используется для построения и + работы.</entry> + </row> + + <row> + <entry><varname>USE_PERL5_BUILD</varname></entry> + <entry>Perl 5 используется для построения.</entry> + </row> + + <row> + <entry><varname>USE_PERL5_RUN</varname></entry> + <entry>Perl 5 используется во время работы.</entry> + </row> + + <row> + <entry><varname>PERL</varname></entry> + <entry>Полный путь к интерпретатору Perl 5, либо в + системе, либо установленному из портов, но без номера + версии. Используйте это, если вам нужно заменить + строки <quote><literal>#!</literal></quote> в + скриптах.</entry> + </row> + + <row> + <entry><varname>PERL_CONFIGURE</varname></entry> + <entry>Конфигурация при помощи MakeMaker языка Perl. + Влечёт <varname>USE_PERL5</varname>.</entry> + </row> + + <row> + <entry><varname>PERL_MODBUILD</varname></entry> + <entry>Конфигурация, построение и установка с + использованием Module::Build. Влечёт + <varname>PERL_CONFIGURE</varname>.</entry> + </row> + </tbody> + </tgroup> + + <tgroup cols="2"> + <thead> + <row> + <entry>Переменные только для чтения</entry> + <entry>Значение</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>PERL_VERSION</varname></entry> + <entry>Полная версия установленного Perl + (например, <literal>5.8.9</literal>).</entry> + </row> + + <row> + <entry><varname>PERL_LEVEL</varname></entry> + <entry>Установленная версия Perl в форме целого числа + вида <literal>MNNNPP</literal> (например, + <literal>500809</literal>).</entry> + </row> + + <row> + <entry><varname>PERL_ARCH</varname></entry> + <entry>Место, в котором Perl хранит + архитектурно-зависимые библиотеки. По умолчанию это + <literal>${ARCH}-freebsd</literal>.</entry> + </row> + + <row> + <entry><varname>PERL_PORT</varname></entry> + <entry>Название установленного порта Perl, (к примеру, + <literal>perl5</literal>).</entry> + </row> + + <row> + <entry><varname>SITE_PERL</varname></entry> + <entry>Имя каталога, куда помещаются специфичные для + сайта пакеты Perl. Это значение добавляется к + <varname>PLIST_SUB</varname>.</entry> + </row> + </tbody> + </tgroup> + </table> + + <note> + <para>Порты для модулей Perl, которые не имеют официального + вебсайта, должны указывать <systemitem>cpan.org</systemitem> + в строке 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 xml:id="use-perl-dependency-example"> + <title>Пример зависимости Perl</title> + + <programlisting>p5-IO-Tee>=0.64:${PORTSDIR}/devel/p5-IO-Tee</programlisting> + </example> + + <para>Для портов Perl, которые устанавливают страницы + справочника, в <filename>pkg-plist</filename> можно + использовать макрос + <varname>PERL5_MAN<replaceable>x</replaceable></varname> (где + <replaceable>x</replaceable> принимает значение от + <literal>1</literal> до <literal>9</literal>). + Например,</para> + + <programlisting>lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz</programlisting> + + <para>можно заменить на</para> + + <programlisting>%%PERL5_MAN3%%/AnyEvent::I3.3.gz</programlisting> + </sect1> + + <sect1 xml:id="using-x11"> + <title>Использование X11</title> + + <sect2 xml:id="x11-variables"> + <title>Компоненты X.Org</title> + + <para>X.Org является реализацией X11, доступной в Коллекции + Портов. Если ваше приложение зависит от компонентов X, + установите в переменную <varname>USE_XORG</varname> в + перечень требуемых компонентов. К настоящему времени + доступными компонентами являются:</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. Вы можете указать зависимость от + различных компонентов этого проекта при помощи переменной + <varname>USE_GL</varname>. Действительные опции: + <literal>glut, glu, glw, glew, gl</literal> и + <literal>linux</literal>. Для обратной совместимости + значение <literal>yes</literal> соответствует + <literal>glu</literal>.</para> + + <example xml:id="use-xorg-example"> + <title>Пример для USE_XORG</title> + + <programlisting>USE_XORG= xrender xft xkbfile xt xaw +USE_GL= glu</programlisting> + </example> <table frame="none"> <title>Переменные для портов, использующих X</title> @@ -1150,16 +1175,14 @@ USE_GL= glu</programlisting> <tbody> <row> <entry><varname>USES= imake</varname></entry> - - <entry>Порт использует <command>imake</command>.</entry> + <entry>Используется <command>imake</command>.</entry> </row> <row> <entry><varname>XMKMF</varname></entry> - - <entry>Задаётся маршрут до <command>xmkmf</command>, если он - отсутствует в переменной окружения <envar>PATH</envar>. По - умолчанию это <literal>xmkmf -a</literal>.</entry> + <entry>Задаёт маршрут до <command>xmkmf</command>, если + он отсутствует в <envar>PATH</envar>. По умолчанию + это <literal>xmkmf -a</literal>.</entry> </row> </tbody> </tgroup> @@ -1169,296 +1192,295 @@ USE_GL= glu</programlisting> <title>Использование переменных X11 в порте</title> <programlisting># Использовать некоторые библиотеки X11 -USE_XORG= x11 xpm</programlisting> +USE_XORG= x11 xpm</programlisting> </example> - </sect2> - - <sect2 xml:id="porting-motif"> - <title>Порты, которым требуется Motif</title> - - <para>Если вашему порту требуется Motif, задайте переменную - <varname>USES= motif</varname> в файле <filename>Makefile</filename>. - Реализация Motif, используемая по умолчанию, находится в - <package role="port">x11-toolkits/open-motif</package>. - Пользователи вместо этого могут выбрать - <package role="port">x11-toolkits/lesstif</package> через - установку переменной <varname>WANT_LESSTIF</varname>.</para> - - <para>Переменная <varname>MOTIFLIB</varname> будет установлена в - <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>Заметьте, что переменная <varname>MOTIFLIB</varname> (как - правило) раскрывается в <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>LOCALBASE/lib/X11/fonts/local</filename>. - </para> - - </sect2> - - <sect2> - <title>Получение поддельного <envar>DISPLAY</envar>, используя - Xvfb</title> - - <para>Некоторые приложения для успешной компиляции требуют - наличие работающего дисплея X11. Это создает проблему для машин, - которые работают в режиме headless. При использовании следующего - канонического хака инфраструктура построения - запустит сервер X в виртуальном фреймбуфере. Затем переменная - работающего <envar>DISPLAY</envar> передается при построении.</para> - - <programlisting>USES= display</programlisting> - </sect2> - - <sect2 xml:id="desktop-entries"> - <title>Элементы рабочего стола</title> - - <para>Элементы рабочего стола (<link xlink:href="http://standards.freedesktop.org/desktop-entry-spec/latest/">стандарта - Freedesktop</link>) предоставляют способ автоматической настройки - функций рабочего стола при установке новой программы, не требуя - вмешательства пользователя. Например, новые программы автоматически - отображаются в меню приложений совместимых окружений рабочего стола. - Элементы рабочего стола изначально появились в окружении рабочего - стола <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>$LOCALBASE/share/applications</filename>. - Для установки этих файлов используется <link linkend="install-macros">макрос <varname>INSTALL_DATA</varname></link>.</para> - </sect3> - - <sect3 xml:id="updating-desktop-database"> - <title>Обновление базы данных рабочего стола</title> - - <para>Если в файле порта - <filename>portname.desktop</filename> - имеется запись MimeType, то база данных рабочего стола - должна быть обновлена после установки и удаления. Для - этого укажите - <varname>USES</varname>= desktop-file-utils.</para> - </sect3> - - <sect3 xml:id="desktop-entries-macro"> - <title>Создание элементов рабочего стола с использованием - <varname>DESKTOP_ENTRIES</varname></title> - - <para>Элементы рабочего стола можно легко создавать для приложений, - используя переменную <varname>DESKTOP_ENTRIES</varname>. - Будет автоматически создан, установлен и добавлен в - <filename>pkg-plist</filename> файл с названием - <filename>name.desktop</filename>. - Синтаксис:</para> - - <programlisting>DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify</programlisting> - - <para>Перечень возможных категорий доступен на <link xlink:href="http://standards.freedesktop.org/menu-spec/latest/apa.html"> - вебсайте Freedesktop</link>. <varname>StartupNotify</varname> - отобразит, поддерживает ли приложение <emphasis>уведомления о - запуске</emphasis>. Как правило, это графический индикатор часы - вместо указателя мыши, меню или панель, которые уведомляют - пользователя о загрузке программы. Программа, поддерживающая - уведомления о запуске, очистит этот индикатор после запуска. - Программы, несовместимые с уведомлениями о запуске, не будут - очищать индикатор (возможно, вызывая путаницу и приводя - пользователей в бешенство), и поэтому должны иметь - <varname>StartupNotify</varname> в выключенном состоянии - <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 xml:id="using-gnome"> - <title>Использование GNOME</title> - - <para>Для задания того, какие компоненты GNOME использует конкретный - порт, проект &os;/GNOME использует собственный набор переменных. - На странице проекта &os;/GNOME размещён - <link xlink:href="http://www.FreeBSD.org/gnome/docs/porting.html"> - исчерпывающий список этих переменных</link>.</para> - - </sect1> - - <sect1 xml:id="using-qt"> - <title>Использование Qt</title> - - <sect2 xml:id="qt-common"> - <title>Порты, для которых требуется Qt</title> - - <table frame="none"> - <title>Переменные для портов, использующих Qt</title> - - <tgroup cols="2"> - <tbody> - <row> - <entry><varname>USE_QT4</varname></entry> - - <entry>Указывает инструменты и библиотеки в качестве - зависимостей для портов, которые используют Qt 4. - Для получения подробностей смотрите <link linkend="qt4-components">выбор компонентов Qt - 4</link>.</entry> - </row> - - <row> - <entry><varname>QT_PREFIX</varname></entry> - - <entry>Устанавливается в значение, содержащее путь к - установленному Qt (переменная только для чтения).</entry> - </row> - - <row> - <entry><varname>MOC</varname></entry> - - <entry>Устанавливается в значение, содержащее путь к - <command>moc</command> (переменная только для чтения). - По умолчанию устанавливается в соответствии со значением - <varname>USE_QT_VER</varname>.</entry> - </row> - - <row> - <entry><varname>QTCPPFLAGS</varname></entry> - - <entry>Дополнительные флаги компилятора для инструментального - пакета Qt, передаваемые через переменную - <varname>CONFIGURE_ENV</varname>. По умолчанию - устанавливается в соответствии со значением - <varname>USE_QT_VER</varname>.</entry> - </row> - - <row> - <entry><varname>QTCFGLIBS</varname></entry> - - <entry>Дополнительные флаги компоновки для инструментального - пакета Qt, передаваемые через переменную - <varname>CONFIGURE_ENV</varname>. По умолчанию - устанавливается в соответствии со значением - <varname>USE_QT_VER</varname>.</entry> - </row> - - <row> - <entry><varname>QTNONSTANDARD</varname></entry> - - <entry>Подавляет изменение <varname>CONFIGURE_ENV</varname>, - <varname>CONFIGURE_ARGS</varname>, - <varname>CPPFLAGS</varname> и - <varname>MAKE_ENV</varname>.</entry> - </row> - - </tbody> - </tgroup> - </table> - - <table frame="none"> - <title>Дополнительные переменные для портов, - использующих Qt 4.x</title> - - <tgroup cols="2"> - <tbody> - <row> - <entry><varname>UIC</varname></entry> + </sect2> + + <sect2 xml:id="porting-motif"> + <title>Порты, которым требуется Motif</title> + + <para>Если вашему порту требуется Motif, задайте переменную + <varname>USES= motif</varname> в файле + <filename>Makefile</filename>. Реализация Motif, + используемая по умолчанию, находится в + <package role="port">x11-toolkits/open-motif</package>. + Пользователи вместо этого могут выбрать + <package role="port">x11-toolkits/lesstif</package> через + установку переменной <varname>WANT_LESSTIF</varname>.</para> + + <para>Переменная <varname>MOTIFLIB</varname> будет установлена + в <filename>bsd.port.mk</filename>, чтобы ссылаться на + соответствующую библиотеку Motif. Пожалуйста, измените + исходные тексты вашего порта на использование + <literal>${MOTIFLIB}</literal> везде, где упоминается + библиотека Motif, в первоначальном + <filename>Makefile</filename> или + <filename>Imakefile</filename>.</para> + + <para>Существует два общих случая:</para> - <entry>Устанавливает путь к <command>uic</command> - (переменная только для чтения).</entry> - </row> - - <row> - <entry><varname>QMAKE</varname></entry> + <itemizedlist> + <listitem> + <para>Если порт обращается к библиотеке Motif как + <literal>-lXm</literal> в своих файлах + <filename>Makefile</filename> или + <filename>Imakefile</filename>, просто подставьте вместо + этих обращений + <literal>${MOTIFLIB}</literal>.</para> + </listitem> - <entry>Устанавливает путь к <command>qmake</command> - (переменная только для чтения).</entry> - </row> + <listitem> + <para>Если порт использует <literal>XmClientLibs</literal> + в своем файле <filename>Imakefile</filename>, измените + это обращение на <literal>${MOTIFLIB} + ${XTOOLLIB} ${XLIB}</literal>.</para> + </listitem> + </itemizedlist> - <row> - <entry><varname>QMAKESPEC</varname></entry> + <para>Заметьте, что переменная <varname>MOTIFLIB</varname> (как + правило) раскрывается в + <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>LOCALBASE/lib/X11/fonts/local</filename>.</para> + </sect2> + + <sect2> + <title>Получение поддельного <envar>DISPLAY</envar>, используя + Xvfb</title> + + <para>Некоторые приложения для успешной компиляции требуют + наличие работающего дисплея X11. Это создает проблему для + машин, которые работают в режиме headless. При использовании + следующего канонического хака инфраструктура построения + запустит сервер X в виртуальном фреймбуфере. Затем + переменная работающего <envar>DISPLAY</envar> передается при + построении.</para> + + <programlisting>USES= display</programlisting> + </sect2> + + <sect2 xml:id="desktop-entries"> + <title>Элементы рабочего стола</title> + + <para>Элементы рабочего стола (<link + xlink:href="http://standards.freedesktop.org/desktop-entry-spec/latest/">стандарта + Freedesktop</link>) предоставляют способ автоматической + настройки функций рабочего стола при установке новой + программы, не требуя вмешательства пользователя. Например, + новые программы автоматически отображаются в меню приложений + совместимых окружений рабочего стола. Элементы рабочего + стола изначально появились в окружении рабочего стола + <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>$LOCALBASE/share/applications</filename>. + Для установки этих файлов используется <link + linkend="install-macros">макрос + <varname>INSTALL_DATA</varname></link>.</para> + </sect3> + + <sect3 xml:id="updating-desktop-database"> + <title>Обновление базы данных рабочего стола</title> + + <para>Если в файле порта + <filename>portname.desktop</filename> имеется запись + MimeType, то база данных рабочего стола олжна быть + обновлена после установки и удаления. Для этого укажите + <varname>USES</varname>= desktop-file-utils.</para> + </sect3> + + <sect3 xml:id="desktop-entries-macro"> + <title>Создание элементов рабочего стола с использованием + <varname>DESKTOP_ENTRIES</varname></title> + + <para>Элементы рабочего стола можно легко создавать для + приложений, используя переменную + <varname>DESKTOP_ENTRIES</varname>. Будет автоматически + создан, установлен и добавлен в + <filename>pkg-plist</filename> файл с названием + <filename>name.desktop</filename>. Синтаксис:</para> + + <programlisting>DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify</programlisting> + + <para>Перечень возможных категорий доступен на <link + xlink:href="http://standards.freedesktop.org/menu-spec/latest/apa.html">вебсайте + Freedesktop</link>. <varname>StartupNotify</varname> + отобразит, поддерживает ли приложение <emphasis>уведомления + о запуске</emphasis>. Как правило, это графический + индикатор часы вместо указателя мыши, меню или панель, + которые уведомляют пользователя о загрузке программы. + Программа, поддерживающая уведомления о запуске, очистит + этот индикатор после запуска. Программы, несовместимые с + уведомлениями о запуске, не будут очищать индикатор + (возможно, вызывая путаницу и приводя пользователей в + бешенство), и поэтому должны иметь + <varname>StartupNotify</varname> в выключенном состоянии + <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 xml:id="using-gnome"> + <title>Использование GNOME</title> + + <para>Для задания того, какие компоненты GNOME использует + конкретный порт, проект &os;/GNOME использует собственный набор + переменных. На странице проекта &os;/GNOME размещён <link + xlink:href="http://www.FreeBSD.org/gnome/docs/porting.html"> + исчерпывающий список этих переменных</link>.</para> + </sect1> + + <sect1 xml:id="using-qt"> + <title>Использование Qt</title> + + <sect2 xml:id="qt-common"> + <title>Порты, для которых требуется Qt</title> - <entry>Устанавливает путь к конфигурационному файлу для - <command>qmake</command> (переменная только для чтения).</entry> - </row> + <table frame="none"> + <title>Переменные для портов, использующих Qt</title> - <row> - <entry><varname>QMAKEFLAGS</varname></entry> + <tgroup cols="2"> + <tbody> + <row> + <entry><varname>USE_QT4</varname></entry> + <entry>Указывает инструменты и библиотеки в качестве + зависимостей для портов, которые используют Qt 4. + Для получения подробностей смотрите <link + linkend="qt4-components">выбор компонентов Qt + 4</link>.</entry> + </row> - <entry>Дополнительные флаги для - <command>qmake</command>.</entry> - </row> + <row> + <entry><varname>QT_PREFIX</varname></entry> + <entry>Устанавливается в значение, содержащее путь к + установленному Qt (переменная только для + чтения).</entry> + </row> - <row> - <entry><varname>QT_INCDIR</varname></entry> + <row> + <entry><varname>MOC</varname></entry> + <entry>Устанавливается в значение, содержащее путь к + <command>moc</command> (переменная только для + чтения). По умолчанию устанавливается в соответствии + со значением <varname>USE_QT_VER</varname>.</entry> + </row> - <entry>Устанавливает каталоги для заголовков Qt 4 - (переменная только для чтения).</entry> - </row> - - <row> - <entry><varname>QT_LIBDIR</varname></entry> + <row> + <entry><varname>QTCPPFLAGS</varname></entry> + <entry>Дополнительные флаги компилятора для + инструментального пакета Qt, передаваемые через + переменную <varname>CONFIGURE_ENV</varname>. По + умолчанию устанавливается в соответствии со значением + <varname>USE_QT_VER</varname>.</entry> + </row> - <entry>Устанавливает путь к библиотекам Qt 4 - (переменная только для чтения).</entry> - </row> + <row> + <entry><varname>QTCFGLIBS</varname></entry> + <entry>Дополнительные флаги компоновки для + инструментального пакета Qt, передаваемые через + переменную <varname>CONFIGURE_ENV</varname>. По + умолчанию устанавливается в соответствии со значением + <varname>USE_QT_VER</varname>.</entry> + </row> - <row> - <entry><varname>QT_PLUGINDIRC</varname></entry> + <row> + <entry><varname>QTNONSTANDARD</varname></entry> + <entry>Подавляет изменение + <varname>CONFIGURE_ENV</varname>, + <varname>CONFIGURE_ARGS</varname>, + <varname>CPPFLAGS</varname> и + <varname>MAKE_ENV</varname>.</entry> + </row> + </tbody> + </tgroup> + </table> - <entry>Устанавливает путь к плагинам Qt 4 - (переменная только для чтения).</entry> - </row> - </tbody> - </tgroup> - </table> + <table frame="none"> + <title>Дополнительные переменные для портов, использующих Qt + 4.x</title> - <para>При заданной переменной <varname>USE_QT4</varname> - применяются следующие настройки:</para> + <tgroup cols="2"> + <tbody> + <row> + <entry><varname>UIC</varname></entry> + <entry>Устанавливает путь к <command>uic</command> + (переменная только для чтения).</entry> + </row> - <programlisting>CONFIGURE_ARGS+= --with-qt-includes=${QT_INCDIR} \ + <row> + <entry><varname>QMAKE</varname></entry> + <entry>Устанавливает путь к <command>qmake</command> + (переменная только для чтения).</entry> + </row> + + <row> + <entry><varname>QMAKESPEC</varname></entry> + <entry>Устанавливает путь к конфигурационному файлу для + <command>qmake</command> (переменная только для + чтения).</entry> + </row> + + <row> + <entry><varname>QMAKEFLAGS</varname></entry> + <entry>Дополнительные флаги для + <command>qmake</command>.</entry> + </row> + + <row> + <entry><varname>QT_INCDIR</varname></entry> + <entry>Устанавливает каталоги для заголовков Qt 4 + (переменная только для чтения).</entry> + </row> + + <row> + <entry><varname>QT_LIBDIR</varname></entry> + <entry>Устанавливает путь к библиотекам Qt 4 + (переменная только для чтения).</entry> + </row> + + <row> + <entry><varname>QT_PLUGINDIRC</varname></entry> + <entry>Устанавливает путь к плагинам Qt 4 (переменная + только для чтения).</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>При заданной переменной <varname>USE_QT4</varname> + применяются следующие настройки:</para> + + <programlisting>CONFIGURE_ARGS+= --with-qt-includes=${QT_INCDIR} \ --with-qt-libraries=${QT_LIBDIR} \ --with-extra-libs=${LOCALBASE}/lib \ --with-extra-includes=${LOCALBASE}/include @@ -1469,3054 +1491,2975 @@ MAKE_ENV+= QMAKESPEC="${QMAKESPEC}" PLIST_SUB+= QT_INCDIR_REL=${QT_INCDIR_REL} \ QT_LIBDIR_REL=${QT_LIBDIR_REL} \ QT_PLUGINDIR_REL=${QT_PLUGINDIR_REL}</programlisting> - </sect2> - - <sect2 xml:id="qt4-components"> - <title>Выбор компонентов</title> - - <para>В переменной <varname>USE_QT4</varname> должны указываться - зависимости от отдельных инструментов и библиотек Qt 4. К каждому - компоненту можно добавить суффикс, <literal>_build</literal> - или <literal>_run</literal>, отражающий, когда должна быть применена - зависимость, во время сборки или выполнения, соответственно. Если - суффикс отсутствует, зависимость от компонента будет и для времени - сборки, и для времени выполнения. Обычно, компоненты библиотек - должны указываться без суффиксов, компоненты инструментов - с - суффиксом <literal>_build</literal>, а компоненты плагинов - с - суффиксом <literal>_run</literal>. Наиболее общие используемые - компоненты перечислены ниже (все доступные компоненты перечислены - в <varname>_USE_QT4_ALL</varname> в файле - <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 xml: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_QT4= gui moc_build qmake_build rcc_build uic_build</programlisting> - </example> - </sect2> - - <sect2 xml:id="using-qmake"> - <title>Использование <command>qmake</command></title> - - <table frame="none"> - <title>Переменные для портов, использующих - <command>qmake</command></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Название</entry> - <entry>Описание</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>QMAKE_ARGS</varname></entry> - <entry>Спефицичные для порта флаги - <application>QMake</application> для передачи - программе <command>qmake</command>.</entry> - </row> - - <row> - <entry><varname>QMAKE_ENV</varname></entry> - <entry>Переменные окружения, устанавливаемые для - программы <command>qmake</command>. По умолчанию - соответствует значению - <literal>${CONFIGURE_ENV}</literal>.</entry> - </row> - - <row> - <entry><varname>QMAKE_PRO</varname></entry> - <entry>Название файла проекта <filename>.pro</filename>. - По умолчанию принимает пустое значение (с - использованием автоопределения).</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Если вместе с приложением вместо <filename>configure</filename> - поставляется файл <filename>.pro</filename>, вы можете использовать - следующее:</para> - - <programlisting>USES= qmake -USE_QT4= qmake_build</programlisting> - - <para><literal>USES=qmake</literal> указывает порту на - использование <command>qmake</command> в процессе - конфигурации. Обратите внимание, что - <literal>USES=qmake</literal> не подразумевает зависимость - от Qt 4 <command>qmake</command>. Для этого в значении - <literal>USE_QT4</literal> должен присутствовать компонент - <literal>qmake_build</literal>.</para> - - <para>Приложения Qt часто пишутся в кроссплатформенной манере, и - X11/Unix часто не является для них платформой разработки, что в - свою очередь часто приводит к соответствующим упущенным - моментам:</para> - - <itemizedlist> - <listitem> - <para><emphasis>Отсутствующие дополнительные пути для - заголовочных файлов.</emphasis> Многие приложения идут с - поддержкой иконки в системном трее, но пренебрегают смотреть - на наличие заголовочных файлов и/или библиотеками в каталогах - X11. Вы можете сообщить <command>qmake</command>, чтобы она - добавила каталоги в пути поиска заголовочных файлов и библиотек - через командную строку. К примеру:</para> - - <programlisting>QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \ - LIBS+=-L${LOCALBASE}/lib</programlisting> - </listitem> - - <listitem> - <para><emphasis>Фиктивные пути установки.</emphasis> - Иногда данные, такие как иконки и файлы .desktop, - устанавливаются по умолчанию в каталоги, которые не - просматриваются XDG-совместимыми приложениями. Примером - является <package role="port">editors/texmaker</package> - - взгляните на <filename>patch-texmaker.pro</filename> из каталога - <filename>files</filename> этого порта, который можно взять - в качестве шаблона исправления этого непосредственно в файле - проекта <command>qmake</command>.</para> - </listitem> - </itemizedlist> - - </sect2> - - </sect1> - - <sect1 xml:id="using-kde"> - <title>Использование KDE</title> - - <sect2 xml:id="kde4-variables"> - <title>Задание переменных KDE 4</title> - - <para>Если ваше приложение зависит от KDE 4.x, присвойте - <varname>USE_KDE4</varname> список требуемых компонентов. - Для переопределения типа зависимости компонента могут быть - использованы суффиксы <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>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>sharedmime</literal></entry> - <entry>База данных MIME типов для портов KDE</entry> - </row> - - <row> - <entry><literal>automoc4</literal></entry> - <entry>automoc для пакетов Qt 4</entry> - </row> - - <row> - <entry><literal>akonadi</literal></entry> - <entry>Сервер хранения KDE-Pim</entry> - </row> - - <row> - <entry><literal>soprano</literal></entry> - <entry>Фреймворк Qt 4 RDF</entry> - </row> - - <row> - <entry><literal>strigi</literal></entry> - <entry>Поисковые даемон рабочего стола</entry> - </row> - - <row> - <entry><literal>libkcddb</literal></entry> - <entry>Библиотека KDE CDDB</entry> - </row> - - <row> - <entry><literal>libkcompactdisc</literal></entry> - <entry>Библиотека KDE для взаимодействия с аудио-CD</entry> - </row> - - <row> - <entry><literal>libkdeedu</literal></entry> - <entry>Библиотеки, используемые для образовательных - приложений</entry> - </row> - - <row> - <entry><literal>libkdcraw</literal></entry> - <entry>Библиотека KDE LibRaw</entry> - </row> - - <row> - <entry><literal>libkexiv2</literal></entry> - <entry>Библиотека KDE Exiv2</entry> - </row> - - <row> - <entry><literal>libkipi</literal></entry> - <entry> KDE Image Plugin Interface</entry> - </row> - - <row> - <entry><literal>libkonq</literal></entry> - <entry>Основная библиотека Konqueror</entry> - </row> - - <row> - <entry><literal>libksane</literal></entry> - <entry>Библиотека KDE SANE ("Scanner Access Now - Easy")</entry> - </row> - - <row> - <entry><literal>pimlibs</literal></entry> - <entry>Библиотеки KDE-Pim</entry> - </row> - - <row> - <entry><literal>kate</literal></entry> - <entry>Тектовый редактор</entry> - </row> - - <row> - <entry><literal>marble</literal></entry> - <entry>Виртуальный глобус</entry> - </row> - - <row> - <entry><literal>okular</literal></entry> - <entry>Универсальный просмотрщик документов</entry> - </row> - - <row> - <entry><literal>korundum</literal></entry> - <entry>Привязка Ruby к KDE</entry> - </row> - - <row> - <entry><literal>perlkde</literal></entry> - <entry>Привязка Perl к KDE</entry> - </row> - - <row> - <entry><literal>pykde4</literal></entry> - <entry>Привязка Python к KDE</entry> - </row> - - <row> - <entry><literal>pykdeuic4</literal></entry> - <entry>Компилятор пользовательского интерфейса PyKDE</entry> - </row> - - <row> - <entry><literal>smokekde</literal></entry> - <entry>Библиотеки KDE SMOKE</entry> - </row> - - </tbody> - </tgroup> - </table> - - <para>Порты KDE 4.x - устанавливаются в <varname>KDE4_PREFIX</varname>, что в - настоящее время соответствует <filename>/usr/local/kde4</filename>. - Это достигается путем указания компонента <literal>kdeprefix</literal>, - который определяет значение по умолчанию для <varname>PREFIX</varname>. - Тем не менее, порты учитывают любые <varname>PREFIX</varname>, - установленные через переменную окружения <envar>MAKEFLAGS</envar> - и/или параметры <command>make</command>.</para> - - <example xml:id="kde4-components-example"> - <title>Пример <varname>USE_KDE4</varname></title> - - <para>Это простой пример для порта KDE 4. - <literal>USES= cmake:outsource</literal> указывает порту - использовать <application>CMake</application>, конфигурационный - инструмент, широко применяемый в проектах KDE 4 (подробное - описание даёт <xref linkend="using-cmake"/>). - <varname>USE_KDE4</varname> добавляет зависимость от библиотек KDE - и заставляет порты использовать <command>automoc4</command> - во время сборки. Требуемые компоненты KDE и другие зависимости - можно определить в журнале configure. <varname>USE_KDE4</varname> - не подразумевает <varname>USE_QT4</varname>. Если порт требует - какой-либо из компонентов Qt 4, их следует указать в - <varname>USE_QT4</varname>.</para> - - <programlisting>USES= cmake:outsource -USE_KDE4= kdelibs kdeprefix automoc4 -USE_QT4= moc_build qmake_build rcc_build uic_build</programlisting> - </example> - </sect2> - - </sect1> - - <sect1 xml:id="using-java"> - <title>Использование Java</title> - - <sect2 xml:id="java-variables"> - <title>Задание переменных</title> - - <para>Если вашему порту необходимо наличие Java™ Development Kit - (JDK™) для построения, работы или даже распаковки - дистрибутивного файла, то в нём должна быть задана переменная - <varname>USE_JAVA</varname>.</para> - - <para>В Коллекции Портов присутствуют несколько JDK различных - разработчиков и разных версий. Если ваш порт должен использовать - одну из этих версий, то вы должны указать, какую именно. Самой - последней версией и версией по умолчанию является - <package role="port">java/openjdk6</package>.</para> - - <table frame="none"> - <title>Переменные, которые которые могут задаваться портами, - использующими Java</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>USE_JAVA</varname></entry> - - <entry>Должна быть определена для того, что последующие - переменные вступили в действие.</entry> - </row> - - <row> - <entry><varname>JAVA_VERSION</varname></entry> - <entry>Список версий Java, перечисленных через пробел, - подходящих для порта. Опциональный знак - <literal>"+"</literal> позволяет вам указать диапазон - версий (возможные значения: - <literal>1.5[+] 1.6[+] 1.7[+] - </literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_OS</varname></entry> - <entry>Список операционных систем, перечисленных через пробел, - порты JDK для которых подходят для порта (возможные значения: - <literal>native linux</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_VENDOR</varname></entry> - <entry>Список разработчиков портов JDK, перечисленных через - пробел, которые подходят для порта (возможные значения: - <literal>freebsd bsdjava sun - openjdk</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_BUILD</varname></entry> - <entry>Если задана, то означает, что выбранный порт JDK должен - быть добавлен к зависимостям порта для его - построения.</entry> - </row> - - <row> - <entry><varname>JAVA_RUN</varname></entry> - <entry>Если задана, то означает, что выбранный порт JDK должен - быть добавлен в зависимостям порта для его работы.</entry> - </row> - - <row> - <entry><varname>JAVA_EXTRACT</varname></entry> - <entry>Если задана, то означает, что выбранный порт JDK должен - быть добавлен в зависимостям порта для распаковки его - дистрибутивных файлов.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Ниже перечисляются все значения, которые принимают переменные - после задания переменной <varname>USE_JAVA</varname>:</para> - - <table frame="none"> - <title>Переменные, доступные в портах, использующих Java</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>JAVA_PORT</varname></entry> - <entry>Название порта JDK (к примеру, - <literal>'java/openjdk6'</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_PORT_VERSION</varname></entry> - <entry>Полное наименовании версии порта JDK (к примеру, - <literal>'1.6.0'</literal>). Если вам нужны только первые - две цифры номера версии, используйте конструкцию - <varname>${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}</varname>.</entry> - </row> - - <row> - <entry><varname>JAVA_PORT_OS</varname></entry> - <entry>Операционная система, используемая портом JDK (к примеру, - <literal>'native'</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_PORT_VENDOR</varname></entry> - <entry>Разработчик порта JDK (к примеру, - <literal>'openjdk'</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_PORT_OS_DESCRIPTION</varname></entry> - <entry>Описание операционной системы, используемой портом JDK - (к примеру, <literal>'Native'</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_PORT_VENDOR_DESCRIPTION</varname></entry> - <entry>Описание разработчика порта JDK (к примеру, - <literal>'OpenJDK BSD Porting Team'</literal>).</entry> - </row> - - <row> - <entry><varname>JAVA_HOME</varname></entry> - <entry>Маршрут к установочному каталогу JDK (к примеру, - <filename>'/usr/local/openjdk6'</filename>).</entry> - </row> - - <row> - <entry><varname>JAVAC</varname></entry> - <entry>Маршрут к используемому компилятору Java (к примеру, - <filename>'/usr/local/openjdk6/bin/javac'</filename>. - </entry> - </row> - - <row> - <entry><varname>JAR</varname></entry> - <entry>Маршрут к используемой утилите <command>jar</command> (к - примеру, <filename>'/usr/local/openjdk6/bin/jar'</filename> - или <filename>'/usr/local/bin/fastjar'</filename>).</entry> - </row> - - <row> - <entry><varname>APPLETVIEWER</varname></entry> - <entry>Маршрут к утилите <command>appletviewer</command> (к - примеру, - <filename>'/usr/local/openjdk6/bin/appletviewer'</filename>). - </entry> - </row> - - <row> - <entry><varname>JAVA</varname></entry> - <entry>Маршрут к выполняемому файлу <command>java</command>. - Используйте его для запуска Java-программ (к примеру, - <filename>'/usr/local/openjdk6/bin/java'</filename>).</entry> - </row> - - <row> - <entry><varname>JAVADOC</varname></entry> - <entry>Маршрут к вспомогательной программе - <command>javadoc</command>.</entry> - </row> - - <row> - <entry><varname>JAVAH</varname></entry> - <entry>Маршрут к программе <command>javah</command>.</entry> - </row> - - <row> - <entry><varname>JAVAP</varname></entry> - <entry>Маршрут к программе <command>javap</command>.</entry> - </row> - - <row> - <entry><varname>JAVA_KEYTOOL</varname></entry> - <entry>Маршрут к вспомогательной программе - <command>keytool</command>.</entry> - </row> - - <row> - <entry><varname>JAVA_N2A</varname></entry> - <entry>Маршрут к утилите - <command>native2ascii</command>.</entry> - </row> - - <row> - <entry><varname>JAVA_POLICYTOOL</varname></entry> - <entry>Маршрут к программе <command>policytool</command>.</entry> - </row> - - <row> - <entry><varname>JAVA_SERIALVER</varname></entry> - <entry>Маршрут к вспомогательной программе - <command>serialver</command>.</entry> - </row> - - <row> - <entry><varname>RMIC</varname></entry> - <entry>Маршрут к генератору каркаса программ RMI, утилите - <command>rmic</command>.</entry> - </row> - - <row> - <entry><varname>RMIREGISTRY</varname></entry> - <entry>Маршрут к программе регистрации RMI, - <command>rmiregistry</command>.</entry> - </row> - - <row> - <entry><varname>RMID</varname></entry> - <entry>Маршрут к программе-даемону RMI - <command>rmid</command>.</entry> - </row> - - <row> - <entry><varname>JAVA_CLASSES</varname></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><varname>JAVASHAREDIR</varname></entry> - <entry>Корневой каталог для всего, что связано с Java. - По умолчанию: <filename>${PREFIX}/share/java</filename>. - </entry> - </row> - - <row> - <entry><varname>JAVAJARDIR</varname></entry> - <entry>Каталог, в который должны устанавливаться JAR-файлы. По - умолчанию: - <filename>${JAVASHAREDIR}/classes</filename>.</entry> - </row> - - <row> - <entry><varname>JAVALIBDIR</varname></entry> - <entry>Каталог, в который устанавливаются JAR-файлы из - других портов. По умолчанию: - <filename>${LOCALBASE}/share/java/classes</filename>.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Соответствующие записи определяются в обоих переменных - <varname>PLIST_SUB</varname> (описана в <xref linkend="plist-sub"/>) и <varname>SUB_LIST</varname>.</para> - - </sect2> - - <sect2 xml:id="java-building-with-ant"> - <title>Построение с Ant</title> - - <para>Если построение порта производится с использованием Apache Ant, - то необходимо определить <varname>USE_ANT</varname>. Таким образом - Ant становится подкомандой make. Если в порте не определена цель - <literal>do-build</literal>, то будет установлена цель по умолчанию, - которая просто запускает Ant в соответствии со значением - <varname>MAKE_ENV</varname>, <varname>MAKE_ARGS</varname> и - <varname>ALL_TARGET</varname>. Это похоже на механизм - <varname>USES= gmake</varname>, который описан в - <xref linkend="building"/>.</para> - - </sect2> - - <sect2 xml: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>При портировании приложения &java;, для запуска сервиса - которого требуется сервер приложений, такой как - <package role="port">www/tomcat7</package>, для производителя - в порядке вещей является распространение файла - <filename>.war</filename>. Файл <filename>.war</filename> - — это Веб-приложение АРхивированное и оно распаковывается - при вызове данным приложением. Избегайте добавлять файлы - <filename>.war</filename> в <filename>pkg-plist</filename>. - Это не является наилучшим решением. Сервер приложений - производит расширение архива <filename>war</filename> без - должной его очистки при удалении порта. Более подходящим - способом работы с этим файлом будет распаковать архив, - установить файлы и добавить их в - <filename>pkg-plist</filename>.</para> - - <programlisting>TOMCATDIR= ${LOCALBASE}/apache-tomcat-7.0 -WEBAPPDIR= myapplication - -post-extract: - @${MKDIR} ${WRKDIR}/${PORTDIRNAME} - @${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME} + </sect2> + + <sect2 xml:id="qt4-components"> + <title>Выбор компонентов</title> + + <para>В переменной <varname>USE_QT4</varname> должны + указываться зависимости от отдельных инструментов и библиотек + Qt 4. К каждому компоненту можно добавить суффикс, + <literal>_build</literal> или <literal>_run</literal>, + отражающий, когда должна быть применена зависимость, во время + сборки или выполнения, соответственно. Если суффикс + отсутствует, зависимость от компонента будет и для времени + сборки, и для времени выполнения. Обычно, компоненты + библиотек должны указываться без суффиксов, компоненты + инструментов - с суффиксом <literal>_build</literal>, а + компоненты плагинов - с суффиксом <literal>_run</literal>. + Наиболее общие используемые компоненты перечислены ниже (все + доступные компоненты перечислены в + <varname>_USE_QT4_ALL</varname> в файле + <filename>/usr/ports/Mk/bsd.qt.mk</filename>):</para> -do-install: - cd ${WRKDIR} && \ - ${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME} - @cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}</programlisting> + <table frame="none"> + <title>Доступные библиотечные компоненты Qt 4</title> - <para>Вне зависимости от типа вашего порта (библиотека это или - приложение), дополнительная документация должна устанавливаться - <link linkend="install-documentation">в тоже самое место</link>, что - и для других портов. Известно, что в зависимости от используемой - версии JDK утилита JavaDoc генерирует различные наборы файлов. Для - портов, которые не привязаны к использованию определённой версии - JDK, таким образом становится проблематичным определить список файлов - для упаковки (<filename>pkg-plist</filename>). Это одна из причин, - по которой создателям портов настоятельно рекомендуется использовать - макрос <varname>PORTDOCS</varname>. Более того, даже если вы сможете - угадать набор файлов, который будет сгенерирован утилитой - <command>javadoc</command>, размер получающегося файла - <filename>pkg-plist</filename> голосует за использование - <varname>PORTDOCS</varname>.</para> - - <para>Значением по умолчанию для переменной <varname>DATADIR</varname> - является <filename>${PREFIX}/share/${PORTNAME}</filename>. Хорошей - идеей является переопределение для Java-портов значения - <varname>DATADIR</varname> как - <filename>${JAVASHAREDIR}/${PORTNAME}</filename>. На самом деле - <varname>DATADIR</varname> автоматически добавляется к - <varname>PLIST_SUB</varname> (это описано в <xref linkend="plist-sub"/>), так что вы сможете - использовать <literal>%%DATADIR%%</literal> непосредственно в - <filename>pkg-plist</filename>.</para> - - <para>Что касается выбора между построением портов Java из исходных - текстов или их прямой установкой из бинарных дистрибутивов, то на - момент создания этого текста определённой политики на этот счёт не - существует. Однако участники <link xlink:href="http://www.freebsd.org/java/">Проекта &os; Java</link> - рекомендуют создателям портов строить их из исходных текстов, если - эта задача является несложной.</para> - - <para>Все возможности, которые были описаны в этом разделе, реализованы - в файле <filename>bsd.java.mk</filename>. Если вы предположите, что - вашему порту требуется менее тривиальная поддержка Java, пожалуйста, - взгляните сначала на <link xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.java.mk?view=markup">журнал - изменений bsd.java.mk в - <application>Subversion</application></link>, так как для - документирования последних изменений требуется какое-то время. - Затем, если вы думаете, что не хватающая вам поддержка окажется - полезной для многих других портов Java, обсудите ваш вопрос в - &a.java;.</para> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <para>Хотя в базе сообщений об ошибках для соответствующих PR имеется - категория <literal>java</literal>, она относится к работе над - портированием JDK, которые проводит Проект &os; Java. Таким образом, - вы должны относить свой Java-порт, как и любой другой, к категории - <literal>ports</literal>, если решаемый вами вопрос не относится ни - к реализации JDK, ни к <filename>bsd.java.mk</filename>.</para> - - <para>Похожим образом определена политика по отношению к - <varname>CATEGORIES</varname> порта Java, которая подробно описана - в <xref linkend="makefile-categories"/>.</para> - - </sect2> - </sect1> + <tbody> + <row> + <entry><literal>corelib</literal></entry> + <entry>основная библиотека (можно опустить, если порт + не использует ничего, кроме + <literal>corelib</literal>)</entry> + </row> - <sect1 xml:id="using-php"> - <title>Веб-приложения, Apache и PHP</title> + <row> + <entry><literal>gui</literal></entry> + <entry>библиотека графического пользовательского + интерфейса</entry> + </row> - <sect2 xml:id="using-apache"> - <title>Apache</title> + <row> + <entry><literal>network</literal></entry> + <entry>сетевая библиотека</entry> + </row> - <table frame="none"> - <title>Переменные для портов, использующих Apache</title> + <row> + <entry><literal>opengl</literal></entry> + <entry>библиотека OpenGL</entry> + </row> - <tgroup cols="2"> - <tbody> + <row> + <entry><literal>qt3support</literal></entry> + <entry>библиотека совместимости с Qt 3</entry> + </row> - <row> - <entry><varname>USE_APACHE</varname></entry> + <row> + <entry><literal>qtestlib</literal></entry> + <entry>библиотека модульного тестирования</entry> + </row> - <entry>Порт требует Apache. Возможные значения: - <literal>yes</literal> (берёт любую версию), - <literal>22</literal>, <literal>24</literal>, - <literal>22-24</literal>, <literal>22+</literal> - и так далее. Версия по умолчанию - <literal>22</literal>. Более подробная информация - содержится в файле - <filename>ports/Mk/bsd.apache.mk</filename> и на - странице <link xlink:href="http://wiki.freebsd.org/Apache/"> - wiki.freebsd.org/Apache/</link>.</entry> - </row> + <row> + <entry><literal>script</literal></entry> + <entry>библиотека сценариев</entry> + </row> - <row> - <entry><varname>APXS</varname></entry> + <row> + <entry><literal>sql</literal></entry> + <entry>библиотека SQL</entry> + </row> - <entry>Полный путь к исполняемому файлу <command>apxs</command>. - Может быть переопределен в вашем порту.</entry> - </row> + <row> + <entry><literal>xml</literal></entry> + <entry>библиотека XML</entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><varname>HTTPD</varname></entry> + <para>Вы можете определить, от каких библиотек зависит + приложение, запустив <command>ldd</command> на основной + исполняемый файл после успешной компиляции.</para> - <entry>Полный путь к исполняемому файлу <command>httpd</command>. - Может быть переопределен в вашем порту.</entry> - </row> + <table frame="none"> + <title>Доступные компоненты инструментов Qt 4</title> - <row> - <entry><varname>APACHE_VERSION</varname></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <entry>Версия установленного Apache (переменная только для - чтения). Эта переменная доступна только после подключения - <filename>bsd.port.pre.mk</filename>. Возможные значения: - <literal>22</literal>, <literal>24</literal>.</entry> - </row> + <tbody> + <row> + <entry><literal>moc</literal></entry> + <entry>мета-объектный компилятор (нужен при построении + почти для каждого приложения Qt)</entry> + </row> - <row> - <entry><varname>APACHEMODDIR</varname></entry> - - <entry>Каталог для модулей Apache. Значение переменной - автоматически подставляется в <filename>pkg-plist</filename>.</entry> - </row> - - <row> - <entry><varname>APACHEINCLUDEDIR</varname></entry> - - <entry>Каталог для заголовков Apache. Значение переменной - автоматически подставляется в <filename>pkg-plist</filename>.</entry> - </row> - - <row> - <entry><varname>APACHEETCDIR</varname></entry> - - <entry>Каталог для конфигурационных файлов Apache. Значение - переменной автоматически подставляется в - <filename>pkg-plist</filename>.</entry> - </row> + <row> + <entry><literal>qmake</literal></entry> + <entry>генератор Makefile / утилита построения</entry> + </row> - </tbody> - </tgroup> - </table> - - <table frame="none"> - <title>Используемые переменные при портировании модулей - Apache</title> - - <tgroup cols="2"> - <tbody> - - <row> - <entry><varname>MODULENAME</varname></entry> + <row> + <entry><literal>rcc</literal></entry> + <entry>компилятор ресурсов (нужен, если приложение идет + вместе с файлами <filename>*.rc</filename> или + <filename>*.qrc</filename>)</entry> + </row> - <entry>Название модуля. Значением по умолчанию является - <varname>PORTNAME</varname>. Пример: - <literal>mod_hello</literal></entry> - </row> - - <row> - <entry><varname>SHORTMODNAME</varname></entry> - - <entry>Краткое название модуля. Наследуется автоматически - от <varname>MODULENAME</varname>, но может быть - переопределено. Пример: <literal>hello</literal></entry> - </row> - - <row> - <entry><varname>AP_FAST_BUILD</varname></entry> - - <entry>Использовать <command>apxs</command> для компиляции - и установки модуля.</entry> - </row> + <row> + <entry><literal>uic</literal></entry> + <entry>компилятор пользовательского интерфейса (нужен, + если приложение идет вместе с файлами + <filename>*.ui</filename>, созданными при помощи Qt + Designer, - на практике каждое приложение Qt с + GUI)</entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><varname>AP_GENPLIST</varname></entry> + <table frame="none"> + <title>Доступные компоненты плагинов Qt 4</title> - <entry>Также автоматически создает - <filename>pkg-plist</filename>.</entry> - </row> - - <row> - <entry><varname>AP_INC</varname></entry> - - <entry>Добавляет каталог к пути поиска заголовков - во время компиляции.</entry> - </row> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <row> - <entry><varname>AP_LIB</varname></entry> + <tbody> + <row> + <entry><literal>iconengines</literal></entry> + <entry>плагин для движка иконок SVG (если приложение + поставляется с иконками SVG)</entry> + </row> - <entry>Добавляет каталог к пути поиска библиотек - во время компиляции.</entry> - </row> + <row> + <entry><literal>imageformats</literal></entry> + <entry>плагины для графических форматов GIF, JPEG, MNG + и SVG (если приложение поставляется с графическими + файлами)</entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><varname>AP_EXTRAS</varname></entry> + <example xml: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_QT4= gui moc_build qmake_build rcc_build uic_build</programlisting> + </example> + </sect2> - <entry>Дополнительные флаги, передаваемые - <command>apxs</command>.</entry> - </row> + <sect2 xml:id="using-qmake"> + <title>Использование <command>qmake</command></title> - </tbody> - </tgroup> - </table> - </sect2> + <table frame="none"> + <title>Переменные для портов, использующих + <command>qmake</command></title> - <sect2 xml:id="web-apps"> - <title>Веб-приложения</title> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <para>Веб-приложения следует устанавливать в - <filename>PREFIX/www/appname</filename>. - Для вашего удобства этот путь одинаково доступен в - <filename>Makefile</filename> и <filename>pkg-plist</filename> - как переменная <varname>WWWDIR</varname>, а путь относительно - <varname>PREFIX</varname> доступен в <filename>Makefile</filename> - как <varname>WWWDIR_REL</varname>.</para> + <tbody> + <row> + <entry><varname>QMAKE_ARGS</varname></entry> + <entry>Спефицичные для порта флаги + <application>QMake</application> для передачи + программе <command>qmake</command>.</entry> + </row> - <para>Пользователь и группа процесса веб-сервера доступны как - <varname>WWWOWN</varname> и <varname>WWWGRP</varname>, в случае - если вам нужно изменить владельца для некоторых файлов. Значением - по умолчанию и для владельца, и для группы является - <literal>www</literal>. Если вы хотите использовать в вашем - порте другие значения, воспользуйтесь для этого нотацией - <literal>WWWOWN?= myuser</literal>, чтобы позволить - пользователю легко переопределить их.</para> + <row> + <entry><varname>QMAKE_ENV</varname></entry> + <entry>Переменные окружения, устанавливаемые для + программы <command>qmake</command>. По умолчанию + соответствует значению + <literal>${CONFIGURE_ENV}</literal>.</entry> + </row> - <para>Не добавляйте зависимость от Apache, если веб-приложение - явным образом не нуждается в Apache. Учитывайте, что пользователи - могут пожелать запустить ваше веб-приложение на другом веб-сервере - помимо Apache.</para> + <row> + <entry><varname>QMAKE_PRO</varname></entry> + <entry>Название файла проекта + <filename>.pro</filename>. По умолчанию имеет пустое + значение (с использованием автоопределения).</entry> + </row> + </tbody> + </tgroup> + </table> - </sect2> + <para>Если вместе с приложением вместо + <filename>configure</filename> поставляется файл + <filename>.pro</filename>, вы можете использовать + следующее:</para> - <sect2 xml:id="php-variables"> - <title>PHP</title> + <programlisting>USES= qmake +USE_QT4= qmake_build</programlisting> - <table frame="none"> - <title>Переменные для портов, использующих PHP</title> + <para><literal>USES=qmake</literal> указывает порту на + использование <command>qmake</command> в процессе + конфигурации. Обратите внимание, что + <literal>USES=qmake</literal> не подразумевает зависимость от + Qt 4 <command>qmake</command>. Для этого в значении + <literal>USE_QT4</literal> должен присутствовать компонент + <literal>qmake_build</literal>.</para> - <tgroup cols="2"> - <tbody> - <row> - <entry><varname>USE_PHP</varname></entry> + <para>Приложения Qt часто пишутся в кроссплатформенной манере, + и X11/Unix часто не является для них платформой разработки, + что в свою очередь часто приводит к соответствующим упущенным + моментам:</para> - <entry>Порт требует PHP. Значение <literal>yes</literal> - добавляет зависимость от PHP. Вместо этого может быть - указан перечень требуемых расширений PHP. Пример: - <literal>pcre xml gettext</literal></entry> - </row> + <itemizedlist> + <listitem> + <para><emphasis>Отсутствующие дополнительные пути для + заголовочных файлов.</emphasis> Многие приложения идут + с поддержкой иконки в системном трее, но пренебрегают + смотреть на наличие заголовочных файлов и/или + библиотеками в каталогах X11. Вы можете сообщить + <command>qmake</command>, чтобы она добавила каталоги в + пути поиска заголовочных файлов и библиотек через + командную строку. К примеру:</para> + + <programlisting>QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \ + LIBS+=-L${LOCALBASE}/lib</programlisting> + </listitem> - <row> - <entry><varname>DEFAULT_PHP_VER</varname></entry> + <listitem> + <para><emphasis>Фиктивные пути установки.</emphasis> + Иногда данные, такие как иконки и файлы .desktop, + устанавливаются по умолчанию в каталоги, которые не + просматриваются XDG-совместимыми приложениями. Примером + является <package role="port">editors/texmaker</package> + - взгляните на <filename>patch-texmaker.pro</filename> из + каталога <filename>files</filename> этого порта, который + можно взять в качестве шаблона исправления этого + непосредственно в файле проекта + <command>qmake</command>.</para> + </listitem> + </itemizedlist> + </sect2> + </sect1> + + <sect1 xml:id="using-kde"> + <title>Использование KDE</title> + + <sect2 xml:id="kde4-variables"> + <title>Задание переменных KDE 4</title> + + <para>Если ваше приложение зависит от KDE 4.x, присвойте + <varname>USE_KDE4</varname> список требуемых компонентов. + Для переопределения типа зависимости компонента могут быть + использованы суффиксы <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> - <entry>Выбирает старший номер версии, с которым будет - установлен PHP как зависимость в случае, когда PHP еще - не установлен. По умолчанию <literal>5</literal>. - Возможные значения: <literal>4</literal>, - <literal>5</literal></entry> - </row> + <table frame="none"> + <title>Доступные компоненты KDE 4</title> - <row> - <entry><varname>IGNORE_WITH_PHP</varname></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <entry>Порт не работает с PHP данной версии. Возможные - значения: <literal>4</literal>, <literal>5</literal></entry> - </row> + <tbody> + <row> + <entry><literal>kdehier</literal></entry> + <entry>Иерархия основных каталогов KDE</entry> + </row> - <row> - <entry><varname>USE_PHPIZE</varname></entry> + <row> + <entry><literal>kdelibs</literal></entry> + <entry>KDE Developer Platform</entry> + </row> - <entry>Порт будет построен как расширение PHP.</entry> - </row> + <row> + <entry><literal>kdeprefix</literal></entry> + <entry>Если установлено, то порт будет установлен в + <literal>${KDE4_PREFIX}</literal> вместо + <literal>${LOCALBASE}</literal></entry> + </row> - <row> - <entry><varname>USE_PHPEXT</varname></entry> + <row> + <entry><literal>sharedmime</literal></entry> + <entry>База данных MIME типов для портов KDE</entry> + </row> - <entry>Порт будет считаться расширением PHP, включая установку - и регистрацию в реестре расширений.</entry> - </row> + <row> + <entry><literal>automoc4</literal></entry> + <entry>automoc для пакетов Qt 4</entry> + </row> - <row> - <entry><varname>USE_PHP_BUILD</varname></entry> + <row> + <entry><literal>akonadi</literal></entry> + <entry>Сервер хранения KDE-Pim</entry> + </row> - <entry>Установить PHP как зависимость времени построения.</entry> - </row> + <row> + <entry><literal>soprano</literal></entry> + <entry>Фреймворк Qt 4 RDF</entry> + </row> - <row> - <entry><varname>WANT_PHP_CLI</varname></entry> + <row> + <entry><literal>strigi</literal></entry> + <entry>Поисковые даемон рабочего стола</entry> + </row> - <entry>Хочет CLI (командная строка) версию PHP.</entry> - </row> + <row> + <entry><literal>libkcddb</literal></entry> + <entry>Библиотека KDE CDDB</entry> + </row> - <row> - <entry><varname>WANT_PHP_CGI</varname></entry> - - <entry>Хочет CGI версию PHP.</entry> - </row> - - <row> - <entry><varname>WANT_PHP_MOD</varname></entry> + <row> + <entry><literal>libkcompactdisc</literal></entry> + <entry>Библиотека KDE для взаимодействия с + аудио-CD</entry> + </row> - <entry>Хочет PHP как модуль Apache.</entry> - </row> + <row> + <entry><literal>libkdeedu</literal></entry> + <entry>Библиотеки, используемые для образовательных + приложений</entry> + </row> - <row> - <entry><varname>WANT_PHP_SCR</varname></entry> - - <entry>Хочет CLI или CGI версию PHP.</entry> - </row> - - <row> - <entry><varname>WANT_PHP_WEB</varname></entry> + <row> + <entry><literal>libkdcraw</literal></entry> + <entry>Библиотека KDE LibRaw</entry> + </row> - <entry>Хочет модуль Apache или CGI версию PHP.</entry> - </row> - </tbody> - </tgroup> - </table> + <row> + <entry><literal>libkexiv2</literal></entry> + <entry>Библиотека KDE Exiv2</entry> + </row> - </sect2> + <row> + <entry><literal>libkipi</literal></entry> + <entry> KDE Image Plugin Interface</entry> + </row> - <sect2> - <title>Модули PEAR</title> + <row> + <entry><literal>libkonq</literal></entry> + <entry>Основная библиотека Konqueror</entry> + </row> - <para>Портирование модулей PEAR является очень простым - процессом.</para> + <row> + <entry><literal>libksane</literal></entry> + <entry>Библиотека KDE SANE ("Scanner Access Now + Easy")</entry> + </row> - <para>Используйте переменные <varname>FILES</varname>, - <varname>TESTS</varname>, <varname>DATA</varname>, - <varname>SQLS</varname>, <varname>SCRIPTFILES</varname>, - <varname>DOCS</varname> and <varname>EXAMPLES</varname> для - перечисления файлов, которые вы хотите установить. Все - перечисленные файлы будут автоматически установлены в подходящие - места и добавлены в <filename>pkg-plist</filename>.</para> + <row> + <entry><literal>pimlibs</literal></entry> + <entry>Библиотеки KDE-Pim</entry> + </row> - <para>Подключите - <filename>${PORTSDIR}/devel/pear/bsd.pear.mk</filename> - на последней строке <filename>Makefile</filename>.</para> + <row> + <entry><literal>kate</literal></entry> + <entry>Тектовый редактор</entry> + </row> - <example xml:id="pear-makefile"> - <title>Пример Makefile для классов PEAR</title> - <programlisting>PORTNAME= Date -PORTVERSION= 1.4.3 -CATEGORIES= devel www pear + <row> + <entry><literal>marble</literal></entry> + <entry>Виртуальный глобус</entry> + </row> -MAINTAINER= example@domain.com -COMMENT= PEAR Date and Time Zone Classes + <row> + <entry><literal>okular</literal></entry> + <entry>Универсальный просмотрщик документов</entry> + </row> -BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR -RUN_DEPENDS:= ${BUILD_DEPENDS} + <row> + <entry><literal>korundum</literal></entry> + <entry>Привязка Ruby к KDE</entry> + </row> -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= . + <row> + <entry><literal>perlkde</literal></entry> + <entry>Привязка Perl к KDE</entry> + </row> -.include <bsd.port.pre.mk> -.include "${PORTSDIR}/devel/pear/bsd.pear.mk" -.include <bsd.port.post.mk></programlisting> + <row> + <entry><literal>pykde4</literal></entry> + <entry>Привязка Python к KDE</entry> + </row> - </example> + <row> + <entry><literal>pykdeuic4</literal></entry> + <entry>Компилятор пользовательского интерфейса + PyKDE</entry> + </row> - </sect2> + <row> + <entry><literal>smokekde</literal></entry> + <entry>Библиотеки KDE SMOKE</entry> + </row> + </tbody> + </tgroup> + </table> - </sect1> + <para>Порты KDE 4.x устанавливаются в + <varname>KDE4_PREFIX</varname>, что в настоящее время + соответствует <filename>/usr/local/kde4</filename>. Это + достигается путем указания компонента + <literal>kdeprefix</literal>, который определяет значение по + умолчанию для <varname>PREFIX</varname>. Тем не менее, порты + учитывают любые <varname>PREFIX</varname>, установленные + через переменную окружения <envar>MAKEFLAGS</envar> и/или + параметры <command>make</command>.</para> + + <example xml:id="kde4-components-example"> + <title>Пример <varname>USE_KDE4</varname></title> + + <para>Это простой пример для порта KDE 4. + <literal>USES= cmake:outsource</literal> указывает порту + использовать <application>CMake</application>, + конфигурационный инструмент, широко применяемый в проектах + KDE 4 (подробное описание даёт <xref + linkend="using-cmake"/>). <varname>USE_KDE4</varname> + добавляет зависимость от библиотек KDE и заставляет порты + использовать <command>automoc4</command> во время сборки. + Требуемые компоненты KDE и другие зависимости можно + определить в журнале configure. + <varname>USE_KDE4</varname> не подразумевает + <varname>USE_QT4</varname>. Если порт требует какой-либо + из компонентов Qt 4, их следует указать в + <varname>USE_QT4</varname>.</para> + + <programlisting>USES= cmake:outsource +USE_KDE4= kdelibs kdeprefix automoc4 +USE_QT4= moc_build qmake_build rcc_build uic_build</programlisting> + </example> + </sect2> + </sect1> - <sect1 xml:id="using-python"> - <title>Использование Python</title> + <sect1 xml:id="using-java"> + <title>Использование Java</title> - <para>Коллекция Портов поддерживает параллельную установку множества - версий Python. Следует убедиться, что в портах используется - правильный интерпретатор <command>python</command> в соответствии - с переменной <varname>PYTHON_VERSION</varname>, установленной - пользователем. По большей части это означает замену пути к - исполняемому файлу <command>python</command> в сценариях на - значение переменной <varname>PYTHON_CMD</varname>.</para> + <sect2 xml:id="java-variables"> + <title>Задание переменных</title> - <para>Порты, устанавливающие файлы под каталог - <varname>PYTHON_SITELIBDIR</varname>, должны использовать префикс - вида <literal>pyXY-</literal>, таким образом названия пакетов будут - включать в себя версию Python, с которой они установлены.</para> + <para>Если вашему порту необходимо наличие Java™ + Development Kit (JDK™) для построения, работы или даже + распаковки дистрибутивного файла, то в нём должна быть задана + переменная <varname>USE_JAVA</varname>.</para> - <programlisting>PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}</programlisting> + <para>В Коллекции Портов присутствуют несколько JDK различных + разработчиков и разных версий. Если ваш порт должен + использовать одну из этих версий, то вы должны указать, какую + именно. Самой последней версией и версией по умолчанию + является <package role="port">java/openjdk6</package>.</para> <table frame="none"> - <title>Переменные для портов, которые используют Python</title> + <title>Переменные, которые которые могут задаваться портами, + использующими Java</title> <tgroup cols="2"> - <tbody> - <row> - <entry><varname>USE_PYTHON</varname></entry> - - <entry>Для этого порта нужен Python. Минимальная требуемая - версия может быть указана с таким значением как - <literal>2.6+</literal>. Также можно указан диапазон - версий с разделением двух версий через ‐, например: - <literal>2.6-2.7</literal></entry> - </row> - + <thead> <row> - <entry><varname>USE_PYDISTUTILS</varname></entry> - - <entry>Использовать дистрибутивные утилиты (distutils) Python - для конфигурации, компиляции и установки. Необходимо, если - порт использует <filename>setup.py</filename>. - Переопределяет цели <buildtarget>do-build</buildtarget> и - <buildtarget>do-install</buildtarget> и также может - переопределять <buildtarget>do-configure</buildtarget>, если - не определена <varname>GNU_CONFIGURE</varname>.</entry> + <entry>Переменная</entry> + <entry>Значение</entry> </row> + </thead> + <tbody> <row> - <entry><varname>PYTHON_PKGNAMEPREFIX</varname></entry> - - <entry>Используется как <varname>PKGNAMEPREFIX</varname> для - отличия пакетов, использующих разные версии Python. Пример: - <literal>py24-</literal></entry> + <entry><varname>USE_JAVA</varname></entry> + <entry>Должна быть определена для того, что последующие + переменные вступили в действие.</entry> </row> <row> - <entry><varname>PYTHON_SITELIBDIR</varname></entry> - - <entry>Местонахождение дерева site-packages, которое содержит - путь установки Python (обычно, <varname>LOCALBASE</varname>). - Переменная <varname>PYTHON_SITELIBDIR</varname> может быть - очень полезной при установке модулей Python.</entry> + <entry><varname>JAVA_VERSION</varname></entry> + <entry>Список версий Java, перечисленных через пробел, + подходящих для порта. Опциональный знак + <literal>"+"</literal> позволяет вам указать диапазон + версий (возможные значения: + <literal>1.5[+] 1.6[+] 1.7[+]</literal>).</entry> </row> <row> - <entry><varname>PYTHONPREFIX_SITELIBDIR</varname></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> + <entry><varname>JAVA_OS</varname></entry> + <entry>Список операционных систем, перечисленных через + пробел, порты JDK для которых подходят для порта + (возможные значения: + <literal>native linux</literal>).</entry> </row> <row> - <entry><varname>PYTHON_CMD</varname></entry> - - <entry>Командная строка интерпретатора Python, включая номер - версии.</entry> + <entry><varname>JAVA_VENDOR</varname></entry> + <entry>Список разработчиков портов JDK, перечисленных + через пробел, которые подходят для порта (возможные + значения: <literal>freebsd bsdjava sun + openjdk</literal>).</entry> </row> <row> - <entry><varname>PYNUMERIC</varname></entry> - - <entry>Строка зависимости для расширения numeric.</entry> + <entry><varname>JAVA_BUILD</varname></entry> + <entry>Если задана, то означает, что выбранный порт JDK + должен быть добавлен к зависимостям порта для его + построения.</entry> </row> <row> - <entry><varname>PYNUMPY</varname></entry> - <entry>Строка зависимости для нового расширения numeric, - numpy (PYNUMERIC объявлен устаревшим вышестоящим - производителем).</entry> + <entry><varname>JAVA_RUN</varname></entry> + <entry>Если задана, то означает, что выбранный порт JDK + должен быть добавлен в зависимостям порта для его + работы.</entry> </row> <row> - <entry><varname>PYXML</varname></entry> - - <entry>Строка зависимости для расширения XML (не нужно для - Python 2.0 и выше, т.к. включено в основной дистрибутив). - </entry> + <entry><varname>JAVA_EXTRACT</varname></entry> + <entry>Если задана, то означает, что выбранный порт JDK + должен быть добавлен в зависимостям порта для + распаковки его дистрибутивных файлов.</entry> </row> - </tbody> </tgroup> </table> - <para>Полный перечень доступных переменных можно найти в - <filename>/usr/ports/Mk/bsd.python.mk</filename>.</para> - - <para>Некоторые приложения на Python заявляют о поддержке - <varname>DESTDIR</varname> (требуется для staging), которая - не работает (в частности, у Mailman до версии 2.1.16). - Ограничение можно обойти путём перекомпиляции сценариев. - Например, это можно выполнить в цели - <buildtarget>post-build</buildtarget>. С учётом того, что после - установки предполагаемое место размещения сценариев Python - будет находиться в <varname>PYTHONPREFIX_SITELIBDIR</varname>, - можно применить следующее решение:</para> - - <programlisting>(cd ${STAGEDIR}${PREFIX} \ - && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \ - -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})</programlisting> - - <para>Эта команда перекомпилирует исходный текст с заменой путей - на относительные к каталогу сборки, а также дописывает значение - <varname>PREFIX</varname> перед именем файла, записанного в - выходном файле с промежуточным представлением, с использованием - <literal>-d</literal>. <literal>-f</literal> требуется для - безусловной перекомпиляции, а <literal>:S;${PREFIX}/;;</literal> - удаляет префиксы из значения переменной - <varname>PYTHONPREFIX_SITELIBDIR</varname>, чтобы сделать его - относительным к <varname>PREFIX</varname>.</para> - - <para>Для этого требуется Python 2.7 или выше. Это не - работает с Python 2.6.</para> - </sect1> - - <sect1 xml:id="using-tcl"> - <title>Использование <application>Tcl/Tk</application></title> - - <para>В Коллекции Портов поддерживается одновременная установка - множественных версий <application>Tcl/Tk</application>. Порты - должны пытаться поддерживать по крайней мере версию - <application>Tcl/Tk</application>, используемую по умолчанию, и - выше с помощью переменных <varname>USE_TCL</varname> и - <varname>USE_TK</varname>. Желаемую версию <command>tcl</command> - можно указать в переменной <varname>WITH_TCL_VER</varname>.</para> + <para>Ниже перечисляются все значения, которые принимают + переменные после задания переменной + <varname>USE_JAVA</varname>:</para> <table frame="none"> - <title>Наиболее востребованные переменные для портов, которые - используют <application>Tcl/Tk</application></title> + <title>Переменные, доступные в портах, использующих + Java</title> <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> + <tbody> <row> - <entry><varname>USE_TCL</varname></entry> + <entry><varname>JAVA_PORT</varname></entry> + <entry>Название порта JDK (к примеру, + <literal>'java/openjdk6'</literal>).</entry> + </row> - <entry>Порт зависит от библиотеки - <application>Tcl</application> (не оболочки). - Минимальную требуемую версию можно указать с использованием - таких значений, как 84+. Отдельные неподдерживаемые версии - указываются в переменной - <varname>INVALID_TCL_VER</varname>.</entry> + <row> + <entry><varname>JAVA_PORT_VERSION</varname></entry> + <entry>Полное наименовании версии порта JDK (к примеру, + <literal>'1.6.0'</literal>). Если вам нужны только + первые две цифры номера версии, используйте + <varname>${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}</varname>.</entry> </row> <row> - <entry><varname>USE_TCL_BUILD</varname></entry> + <entry><varname>JAVA_PORT_OS</varname></entry> + <entry>Операционная система, используемая портом JDK + (к примеру, <literal>'native'</literal>).</entry> + </row> - <entry><application>Tcl</application> нужен для порта только - на время сборки.</entry> + <row> + <entry><varname>JAVA_PORT_VENDOR</varname></entry> + <entry>Разработчик порта JDK (к примеру, + <literal>'openjdk'</literal>).</entry> </row> <row> - <entry><varname>USE_TCL_WRAPPER</varname></entry> + <entry><varname>JAVA_PORT_OS_DESCRIPTION</varname></entry> + <entry>Описание операционной системы, используемой + портом JDK (к примеру, + <literal>'Native'</literal>).</entry> + </row> - <entry>Эту новую переменную следует использовать для портов, - для которых требуется оболочка <application>Tcl</application> - и не требуется конкретная версия <literal>tclsh</literal>. - Обертка <literal>tclsh</literal> устанавливается в систему. - Пользователь может указать желаемую оболочку - <command>tcl</command> для использования.</entry> + <row> + <entry><varname>JAVA_PORT_VENDOR_DESCRIPTION</varname></entry> + <entry>Описание разработчика порта JDK (к примеру, + <literal>'OpenJDK BSD Porting + Team'</literal>).</entry> </row> <row> - <entry><varname>WITH_TCL_VER</varname></entry> + <entry><varname>JAVA_HOME</varname></entry> + <entry>Маршрут к установочному каталогу JDK (к примеру, + <filename>'/usr/local/openjdk6'</filename>).</entry> + </row> - <entry>Определяемые пользователем переменные, которые - устанавливают желаемую версию - <application>Tcl</application>.</entry> + <row> + <entry><varname>JAVAC</varname></entry> + <entry>Маршрут к используемому компилятору Java + (к примеру, + <filename>'/usr/local/openjdk6/bin/javac'</filename>.</entry> </row> <row> - <entry><varname><replaceable>UNIQUENAME</replaceable>_WITH_TCL_VER</varname></entry> + <entry><varname>JAR</varname></entry> + <entry>Маршрут к используемой утилите + <command>jar</command> (к примеру, + <filename>'/usr/local/openjdk6/bin/jar'</filename> + или + <filename>'/usr/local/bin/fastjar'</filename>).</entry> + </row> - <entry>Подобно <varname>WITH_TCL_VER</varname>, но для - каждого порта.</entry> + <row> + <entry><varname>APPLETVIEWER</varname></entry> + <entry>Маршрут к утилите + <command>appletviewer</command> (к примеру, + <filename>'/usr/local/openjdk6/bin/appletviewer'</filename>).</entry> </row> <row> - <entry><varname>USE_TCL_THREADS</varname></entry> + <entry><varname>JAVA</varname></entry> + <entry>Маршрут к выполняемому файлу + <command>java</command>. Используйте его для запуска + Java-программ (к примеру, + <filename>'/usr/local/openjdk6/bin/java'</filename>).</entry> + </row> - <entry>Требует многопоточную сборку - <application>Tcl/Tk</application>.</entry> + <row> + <entry><varname>JAVADOC</varname></entry> + <entry>Маршрут к вспомогательной программе + <command>javadoc</command>.</entry> </row> <row> - <entry><varname>USE_TK</varname></entry> + <entry><varname>JAVAH</varname></entry> + <entry>Маршрут к программе + <command>javah</command>.</entry> + </row> - <entry>Порт зависит от библиотеки <application>Tk</application> - (не от предпочитаемой оболочки). Подразумевает - <varname>USE_TCL</varname> с тем же значением. Для - большей информации смотрите описание переменной - <varname>USE_TCL</varname>.</entry> + <row> + <entry><varname>JAVAP</varname></entry> + <entry>Маршрут к программе + <command>javap</command>.</entry> </row> <row> - <entry><varname>USE_TK_BUILD</varname></entry> + <entry><varname>JAVA_KEYTOOL</varname></entry> + <entry>Маршрут к вспомогательной программе + <command>keytool</command>.</entry> + </row> - <entry>Аналогично <varname>USE_TCL_BUILD</varname>.</entry> + <row> + <entry><varname>JAVA_N2A</varname></entry> + <entry>Маршрут к утилите + <command>native2ascii</command>.</entry> </row> <row> - <entry><varname>USE_TK_WRAPPER</varname></entry> + <entry><varname>JAVA_POLICYTOOL</varname></entry> + <entry>Маршрут к программе + <command>policytool</command>.</entry> + </row> - <entry>Аналогично <varname>USE_TCL_WRAPPER</varname>.</entry> + <row> + <entry><varname>JAVA_SERIALVER</varname></entry> + <entry>Маршрут к вспомогательной программе + <command>serialver</command>.</entry> </row> <row> - <entry><varname>WITH_TK_VER</varname></entry> + <entry><varname>RMIC</varname></entry> + <entry>Маршрут к генератору каркаса программ RMI, + утилите <command>rmic</command>.</entry> + </row> - <entry>Аналогично <varname>WITH_TCL_VER</varname>, - подразумевает <varname>WITH_TCL_VER</varname> той же - версии.</entry> + <row> + <entry><varname>RMIREGISTRY</varname></entry> + <entry>Маршрут к программе регистрации RMI, + <command>rmiregistry</command>.</entry> + </row> + + <row> + <entry><varname>RMID</varname></entry> + <entry>Маршрут к программе-даемону RMI + <command>rmid</command>.</entry> + </row> + + <row> + <entry><varname>JAVA_CLASSES</varname></entry> + <entry>Маршрут к архиву, который содержит файлы классов + JDK, + <filename>${JAVA_HOME}/jre/lib/rt.jar</filename>.</entry> </row> </tbody> </tgroup> </table> - <para>Полный перечень доступных переменных находится в - <filename>/usr/ports/Mk/bsd.tcl.mk</filename>.</para> - </sect1> - - <sect1 xml:id="using-emacs"> - <title>Использование Emacs</title> - - <para>Этот раздел ещё предстоит написать.</para> - </sect1> + <para>Вы можете воспользоваться make-целью + <literal>java-debug</literal> для получения информации, + необходимой для отладки вашего порта. При её выполнении + будут выданы значения многих упомянутых выше + переменных.</para> - <sect1 xml:id="using-ruby"> - <title>Использование Ruby</title> + <para>Кроме того, для единообразия установки всех портов Java + определены следующие константы:</para> <table frame="none"> - <title>Полезные переменные для портов, использующих Ruby</title> + <title>Константы, определённые для портов, использующих + Java</title> <tgroup cols="2"> <thead> <row> - <entry>Переменная</entry> - <entry>Описание</entry> + <entry>Константа</entry> + <entry>Значение</entry> </row> </thead> + <tbody> <row> - <entry><varname>USE_RUBY</varname></entry> + <entry><varname>JAVASHAREDIR</varname></entry> + <entry>Корневой каталог для всего, что связано с Java. + По умолчанию: + <filename>${PREFIX}/share/java</filename>.</entry> + </row> - <entry>Порт требует Ruby.</entry> + <row> + <entry><varname>JAVAJARDIR</varname></entry> + <entry>Каталог, в который должны устанавливаться + JAR-файлы. По умолчанию: + <filename>${JAVASHAREDIR}/classes</filename>.</entry> </row> <row> - <entry><varname>USE_RUBY_EXTCONF</varname></entry> + <entry><varname>JAVALIBDIR</varname></entry> + <entry>Каталог, в который устанавливаются JAR-файлы из + других портов. По умолчанию: + <filename>${LOCALBASE}/share/java/classes</filename>.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Соответствующие записи определяются в обоих переменных + <varname>PLIST_SUB</varname> (описана в + <xref linkend="plist-sub"/>) и + <varname>SUB_LIST</varname>.</para> + </sect2> + + <sect2 xml:id="java-building-with-ant"> + <title>Построение с Ant</title> + + <para>Если построение порта производится с использованием + Apache Ant, то необходимо определить + <varname>USE_ANT</varname>. Таким образом Ant становится + подкомандой make. Если в порте не определена цель + <literal>do-build</literal>, то будет установлена цель по + умолчанию, которая просто запускает Ant в соответствии со + значением <varname>MAKE_ENV</varname>, + <varname>MAKE_ARGS</varname> и <varname>ALL_TARGET</varname>. + Это похоже на механизм <varname>USES= gmake</varname>, + который описан в <xref linkend="building"/>.</para> + </sect2> + + <sect2 xml: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>При портировании приложения &java;, для запуска сервиса + которого требуется сервер приложений, такой как <package + role="port">www/tomcat7</package>, для производителя в + порядке вещей является распространение файла + <filename>.war</filename>. Файл <filename>.war</filename> + — это Веб-приложение АРхивированное и оно + распаковывается при вызове данным приложением. Избегайте + добавлять файлы <filename>.war</filename> в + <filename>pkg-plist</filename>. Это не является наилучшим + решением. Сервер приложений производит расширение архива + <filename>war</filename> без должной его очистки при удалении + порта. Более подходящим способом работы с этим файлом будет + распаковать архив, установить файлы и добавить их в + <filename>pkg-plist</filename>.</para> + + <programlisting>TOMCATDIR= ${LOCALBASE}/apache-tomcat-7.0 +WEBAPPDIR= myapplication + +post-extract: + @${MKDIR} ${WRKDIR}/${PORTDIRNAME} + @${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME} - <entry>Порт использует для конфигурации - <filename>extconf.rb</filename>.</entry> +do-install: + cd ${WRKDIR} && \ + ${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME} + @cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}</programlisting> + + <para>Вне зависимости от типа вашего порта (библиотека это или + приложение), дополнительная документация должна + устанавливаться <link linkend="install-documentation">в тоже + самое место</link>, что и для других портов. Известно, что в + зависимости от используемой версии JDK утилита JavaDoc + генерирует различные наборы файлов. Для портов, которые не + привязаны к использованию определённой версии JDK, таким + образом становится проблематичным определить список файлов + для упаковки (<filename>pkg-plist</filename>). Это одна из + причин, по которой создателям портов настоятельно + рекомендуется использовать макрос + <varname>PORTDOCS</varname>. Более того, даже если вы + сможете угадать набор файлов, который будет сгенерирован + утилитой <command>javadoc</command>, размер получающегося + файла <filename>pkg-plist</filename> голосует за + использование <varname>PORTDOCS</varname>.</para> + + <para>Значением по умолчанию для переменной + <varname>DATADIR</varname> является + <filename>${PREFIX}/share/${PORTNAME}</filename>. Хорошей + идеей является переопределение для Java-портов значения + <varname>DATADIR</varname> как + <filename>${JAVASHAREDIR}/${PORTNAME}</filename>. На самом + деле <varname>DATADIR</varname> автоматически добавляется к + <varname>PLIST_SUB</varname> (это описано в <xref + linkend="plist-sub"/>), так что вы сможете использовать + <literal>%%DATADIR%%</literal> непосредственно в + <filename>pkg-plist</filename>.</para> + + <para>Что касается выбора между построением портов Java из + исходных текстов или их прямой установкой из бинарных + дистрибутивов, то на момент создания этого текста + определённой политики на этот счёт не существует. Однако + участники <link + xlink:href="http://www.freebsd.org/java/">Проекта &os; + Java</link> рекомендуют создателям портов строить их из + исходных текстов, если эта задача является несложной.</para> + + <para>Все возможности, которые были описаны в этом разделе, + реализованы в файле <filename>bsd.java.mk</filename>. Если + вы предположите, что вашему порту требуется менее тривиальная + поддержка Java, пожалуйста, взгляните сначала на <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.java.mk?view=markup">журнал + изменений bsd.java.mk в + <application>Subversion</application></link>, так как для + документирования последних изменений требуется какое-то + время. Затем, если вы думаете, что не хватающая вам + поддержка окажется полезной для многих других портов Java, + обсудите ваш вопрос в &a.java;.</para> + + <para>Хотя в базе сообщений об ошибках для соответствующих PR + имеется категория <literal>java</literal>, она относится к + работе над портированием JDK, которые проводит Проект &os; + Java. Таким образом, вы должны относить свой Java-порт, как + и любой другой, к категории <literal>ports</literal>, если + решаемый вами вопрос не относится ни к реализации JDK, ни к + <filename>bsd.java.mk</filename>.</para> + + <para>Похожим образом определена политика по отношению к + <varname>CATEGORIES</varname> порта Java, которая подробно + описана в <xref linkend="makefile-categories"/>.</para> + </sect2> + </sect1> + + <sect1 xml:id="using-php"> + <title>Веб-приложения, Apache и PHP</title> + + <sect2 xml:id="using-apache"> + <title>Apache</title> + + <table frame="none"> + <title>Переменные для портов, использующих Apache</title> + + <tgroup cols="2"> + <tbody> + + <row> + <entry><varname>USE_APACHE</varname></entry> + <entry>Порт требует Apache. Возможные значения: + <literal>yes</literal> (берёт любую версию), + <literal>22</literal>, <literal>24</literal>, + <literal>22-24</literal>, <literal>22+</literal> + и так далее. Версия по умолчанию + <literal>22</literal>. Более подробная информация + содержится в файле + <filename>ports/Mk/bsd.apache.mk</filename> и на + странице <link + xlink:href="http://wiki.freebsd.org/Apache/">wiki.freebsd.org/Apache/</link>.</entry> + </row> + + <row> + <entry><varname>APXS</varname></entry> + <entry>Полный путь к исполняемому файлу + <command>apxs</command>. Может быть переопределен в + вашем порту.</entry> </row> <row> - <entry><varname>USE_RUBY_SETUP</varname></entry> + <entry><varname>HTTPD</varname></entry> + <entry>Полный путь к исполняемому файлу + <command>httpd</command>. Может быть переопределен в + вашем порту.</entry> + </row> - <entry>Порт использует для конфигурации - <filename>setup.rb</filename>.</entry> + <row> + <entry><varname>APACHE_VERSION</varname></entry> + <entry>Версия установленного Apache (переменная только + для чтения). Эта переменная доступна только после + подключения <filename>bsd.port.pre.mk</filename>. + Возможные значения: <literal>22</literal>, + <literal>24</literal>.</entry> </row> <row> - <entry><varname>RUBY_SETUP</varname></entry> + <entry><varname>APACHEMODDIR</varname></entry> + <entry>Каталог для модулей Apache. Значение переменной + автоматически подставляется в + <filename>pkg-plist</filename>.</entry> + </row> - <entry>Устанавливает альтернативное имя для - <filename>setup.rb</filename>. Распространенным значением - является <filename>install.rb</filename>.</entry> + <row> + <entry><varname>APACHEINCLUDEDIR</varname></entry> + <entry>Каталог для заголовков Apache. Значение + переменной автоматически подставляется в + <filename>pkg-plist</filename>.</entry> </row> + <row> + <entry><varname>APACHEETCDIR</varname></entry> + <entry>Каталог для конфигурационных файлов Apache. + Значение переменной автоматически подставляется в + <filename>pkg-plist</filename>.</entry> + </row> </tbody> </tgroup> </table> - <para>Следующая таблица отражает некоторые переменные, доступные - авторам портов через инфраструктуру портов. Эти переменные должны - использоваться для установки файлов в правильное месторасположение. - Используйте их в <filename>pkg-plist</filename> как можно больше. - Эти переменные не должны переопределяться в самом порте.</para> - <table frame="none"> - <title>Отобранные переменные только для чтения для портов, - использующих Ruby</title> + <title>Используемые переменные при портировании модулей + Apache</title> - <tgroup cols="3"> - <thead> - <row> - <entry>Переменная</entry> - <entry>Описание</entry> - <entry>Примерное значение</entry> - </row> - </thead> + <tgroup cols="2"> <tbody> <row> - <entry><varname>RUBY_PKGNAMEPREFIX</varname></entry> + <entry><varname>MODULENAME</varname></entry> + <entry>Название модуля. Значением по умолчанию + является <varname>PORTNAME</varname>. Пример: + <literal>mod_hello</literal></entry> + </row> - <entry>Используется как <varname>PKGNAMEPREFIX</varname> - для различия пакетов от разных версий Ruby.</entry> + <row> + <entry><varname>SHORTMODNAME</varname></entry> + <entry>Краткое название модуля. Наследуется + автоматически от <varname>MODULENAME</varname>, но + может быть переопределено. Пример: + <literal>hello</literal></entry> + </row> - <entry><literal>ruby18-</literal></entry> + <row> + <entry><varname>AP_FAST_BUILD</varname></entry> + <entry>Использовать <command>apxs</command> для + компиляции и установки модуля.</entry> </row> <row> - <entry><varname>RUBY_VERSION</varname></entry> + <entry><varname>AP_GENPLIST</varname></entry> + <entry>Также автоматически создает + <filename>pkg-plist</filename>.</entry> + </row> - <entry>Полная версия Ruby в форме <literal>x.y.z</literal>.</entry> + <row> + <entry><varname>AP_INC</varname></entry> + <entry>Добавляет каталог к пути поиска заголовков + во время компиляции.</entry> + </row> - <entry><literal>1.8.2</literal></entry> + <row> + <entry><varname>AP_LIB</varname></entry> + <entry>Добавляет каталог к пути поиска библиотек во + время компиляции.</entry> </row> <row> - <entry><varname>RUBY_SITELIBDIR</varname></entry> + <entry><varname>AP_EXTRAS</varname></entry> + <entry>Дополнительные флаги, передаваемые + <command>apxs</command>.</entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> + + <sect2 xml:id="web-apps"> + <title>Веб-приложения</title> + + <para>Веб-приложения следует устанавливать в + <filename>PREFIX/www/appname</filename>. Для вашего удобства + этот путь одинаково доступен в <filename>Makefile</filename> + и <filename>pkg-plist</filename> как переменная + <varname>WWWDIR</varname>, а путь относительно + <varname>PREFIX</varname> доступен в + <filename>Makefile</filename> как + <varname>WWWDIR_REL</varname>.</para> + + <para>Пользователь и группа процесса веб-сервера доступны как + <varname>WWWOWN</varname> и <varname>WWWGRP</varname>, в + случае если вам нужно изменить владельца для некоторых + файлов. Значением по умолчанию и для владельца, и для группы + является <literal>www</literal>. Если вы хотите использовать + в вашем порте другие значения, воспользуйтесь для этого + нотацией <literal>WWWOWN?= myuser</literal>, чтобы позволить + пользователю легко переопределить их.</para> + + <para>Не добавляйте зависимость от Apache, если веб-приложение + явным образом не нуждается в Apache. Учитывайте, что + пользователи могут пожелать запустить ваше веб-приложение на + другом веб-сервере помимо Apache.</para> + </sect2> + + <sect2 xml:id="php-variables"> + <title>PHP</title> - <entry>Путь для установки архитектуронезависимых библиотек.</entry> + <table frame="none"> + <title>Переменные для портов, использующих PHP</title> - <entry><literal>/usr/local/lib/ruby/site_ruby/1.8</literal></entry> + <tgroup cols="2"> + <tbody> + <row> + <entry><varname>USE_PHP</varname></entry> + <entry>Порт требует PHP. Значение + <literal>yes</literal> добавляет зависимость от PHP. + Вместо этого может быть указан перечень требуемых + расширений PHP. Пример: + <literal>pcre xml gettext</literal></entry> </row> <row> - <entry><varname>RUBY_SITEARCHLIBDIR</varname></entry> + <entry><varname>DEFAULT_PHP_VER</varname></entry> + <entry>Выбирает старший номер версии, с которым будет + установлен PHP как зависимость в случае, когда PHP + еще не установлен. По умолчанию + <literal>5</literal>. Возможные значения: + <literal>4</literal>, <literal>5</literal></entry> + </row> - <entry>Путь для установки архитектурозависимых библиотек.</entry> + <row> + <entry><varname>IGNORE_WITH_PHP</varname></entry> + <entry>Порт не работает с PHP данной версии. Возможные + значения: <literal>4</literal>, + <literal>5</literal></entry> + </row> - <entry><literal>/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6</literal></entry> + <row> + <entry><varname>USE_PHPIZE</varname></entry> + <entry>Порт будет построен как расширение PHP.</entry> </row> <row> - <entry><varname>RUBY_MODDOCDIR</varname></entry> + <entry><varname>USE_PHPEXT</varname></entry> + <entry>Порт будет считаться расширением PHP, включая + установку и регистрацию в реестре расширений.</entry> + </row> - <entry>Путь для установки документации модуля.</entry> + <row> + <entry><varname>USE_PHP_BUILD</varname></entry> + <entry>Установить PHP как зависимость времени + построения.</entry> + </row> - <entry><literal>/usr/local/share/doc/ruby18/patsy</literal></entry> + <row> + <entry><varname>WANT_PHP_CLI</varname></entry> + <entry>Хочет CLI (командная строка) версию PHP.</entry> </row> <row> - <entry><varname>RUBY_MODEXAMPLESDIR</varname></entry> + <entry><varname>WANT_PHP_CGI</varname></entry> + <entry>Хочет CGI версию PHP.</entry> + </row> - <entry>Путь для установки примеров модуля.</entry> + <row> + <entry><varname>WANT_PHP_MOD</varname></entry> + <entry>Хочет PHP как модуль Apache.</entry> + </row> - <entry><literal>/usr/local/share/examples/ruby18/patsy</literal></entry> + <row> + <entry><varname>WANT_PHP_SCR</varname></entry> + <entry>Хочет CLI или CGI версию PHP.</entry> </row> + <row> + <entry><varname>WANT_PHP_WEB</varname></entry> + <entry>Хочет модуль Apache или CGI версию PHP.</entry> + </row> </tbody> </tgroup> </table> + </sect2> + + <sect2> + <title>Модули PEAR</title> + + <para>Портирование модулей PEAR является очень простым + процессом.</para> + + <para>Используйте переменные <varname>FILES</varname>, + <varname>TESTS</varname>, <varname>DATA</varname>, + <varname>SQLS</varname>, <varname>SCRIPTFILES</varname>, + <varname>DOCS</varname> and <varname>EXAMPLES</varname> для + перечисления файлов, которые вы хотите установить. Все + перечисленные файлы будут автоматически установлены в + подходящие места и добавлены в + <filename>pkg-plist</filename>.</para> + + <para>Подключите + <filename>${PORTSDIR}/devel/pear/bsd.pear.mk</filename> + на последней строке <filename>Makefile</filename>.</para> + + <example xml: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= . - <para>Полный перечень доступных переменных находится в - <filename>/usr/ports/Mk/bsd.ruby.mk</filename>.</para> - - </sect1> - - <sect1 xml:id="using-sdl"> - <title>Использование SDL</title> - - <para>Переменная <varname>USE_SDL</varname> используется для - автоматической настройки зависимостей для портов, использующих - библиотеки на основе SDL, такие как - <package role="port">devel/sdl12</package> или - <package role="port">graphics/sdl_image</package>.</para> - - <para>Для версии 1.2 - на данный момент распознаются следующие SDL-библиотеки:</para> - - <itemizedlist> - <listitem> - <para>sdl: <package - role="port">devel/sdl12</package></para> - </listitem> +.include <bsd.port.pre.mk> +.include "${PORTSDIR}/devel/pear/bsd.pear.mk" +.include <bsd.port.post.mk></programlisting> + </example> + </sect2> + </sect1> + + <sect1 xml:id="using-python"> + <title>Использование Python</title> + + <para>Коллекция Портов поддерживает параллельную установку + множества версий Python. Следует убедиться, что в портах + используется правильный интерпретатор <command>python</command> + в соответствии с переменной <varname>PYTHON_VERSION</varname>, + установленной пользователем. По большей части это означает + замену пути к исполняемому файлу <command>python</command> в + сценариях на значение переменной + <varname>PYTHON_CMD</varname>.</para> + + <para>Порты, устанавливающие файлы под каталог + <varname>PYTHON_SITELIBDIR</varname>, должны использовать + префикс вида <literal>pyXY-</literal>, таким образом названия + пакетов будут включать в себя версию Python, с которой они + установлены.</para> + + <programlisting>PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}</programlisting> + + <table frame="none"> + <title>Переменные для портов, которые используют Python</title> + + <tgroup cols="2"> + <tbody> + <row> + <entry><varname>USE_PYTHON</varname></entry> + <entry>Для этого порта нужен Python. Минимальная + требуемая версия может быть указана с таким значением + как <literal>2.6+</literal>. Также можно указан + диапазон версий с разделением двух версий через ‐, + например: <literal>2.6-2.7</literal></entry> + </row> + + <row> + <entry><varname>USE_PYDISTUTILS</varname></entry> + <entry>Использовать дистрибутивные утилиты (distutils) + Python для конфигурации, компиляции и установки. + Необходимо, если порт использует + <filename>setup.py</filename>. Переопределяет цели + <buildtarget>do-build</buildtarget> и + <buildtarget>do-install</buildtarget> и также может + переопределять <buildtarget>do-configure</buildtarget>, + если не определена + <varname>GNU_CONFIGURE</varname>.</entry> + </row> + + <row> + <entry><varname>PYTHON_PKGNAMEPREFIX</varname></entry> + <entry>Используется как <varname>PKGNAMEPREFIX</varname> + для отличия пакетов, использующих разные версии Python. + Пример: <literal>py24-</literal></entry> + </row> + + <row> + <entry><varname>PYTHON_SITELIBDIR</varname></entry> + <entry>Местонахождение дерева site-packages, которое + содержит путь установки Python (обычно, + <varname>LOCALBASE</varname>). Переменная + <varname>PYTHON_SITELIBDIR</varname> может быть очень + полезной при установке модулей Python.</entry> + </row> + + <row> + <entry><varname>PYTHONPREFIX_SITELIBDIR</varname></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><varname>PYTHON_CMD</varname></entry> + <entry>Командная строка интерпретатора Python, включая + номер версии.</entry> + </row> + + <row> + <entry><varname>PYNUMERIC</varname></entry> + <entry>Строка зависимости для расширения numeric.</entry> + </row> + + <row> + <entry><varname>PYNUMPY</varname></entry> + <entry>Строка зависимости для нового расширения numeric, + numpy (PYNUMERIC объявлен устаревшим вышестоящим + производителем).</entry> + </row> + + <row> + <entry><varname>PYXML</varname></entry> + <entry>Строка зависимости для расширения XML (не нужно + для Python 2.0 и выше, т.к. включено в основной + дистрибутив).</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Полный перечень доступных переменных можно найти в + <filename>/usr/ports/Mk/bsd.python.mk</filename>.</para> + + <para>Некоторые приложения на Python заявляют о поддержке + <varname>DESTDIR</varname> (требуется для staging), которая не + работает (в частности, у Mailman до версии 2.1.16). + Ограничение можно обойти путём перекомпиляции сценариев. + Например, это можно выполнить в цели + <buildtarget>post-build</buildtarget>. С учётом того, что + после установки предполагаемое место размещения сценариев + Python будет находиться в + <varname>PYTHONPREFIX_SITELIBDIR</varname>, можно применить + следующее решение:</para> + + <programlisting>(cd ${STAGEDIR}${PREFIX} \ + && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \ + -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})</programlisting> - <listitem> - <para>console: <package + <para>Эта команда перекомпилирует исходный текст с заменой путей + на относительные к каталогу сборки, а также дописывает значение + <varname>PREFIX</varname> перед именем файла, записанного в + выходном файле с промежуточным представлением, с использованием + <literal>-d</literal>. <literal>-f</literal> требуется для + безусловной перекомпиляции, <literal>:S;${PREFIX}/;;</literal> + удаляет префиксы из значения переменной + <varname>PYTHONPREFIX_SITELIBDIR</varname>, чтобы сделать его + относительным к <varname>PREFIX</varname>.</para> + + <para>Для этого требуется Python 2.7 или выше. Это не + работает с Python 2.6.</para> + </sect1> + + <sect1 xml:id="using-tcl"> + <title>Использование <application>Tcl/Tk</application></title> + + <para>В Коллекции Портов поддерживается одновременная установка + множественных версий <application>Tcl/Tk</application>. Порты + должны пытаться поддерживать по крайней мере версию + <application>Tcl/Tk</application>, используемую по умолчанию, и + выше с помощью переменных <varname>USE_TCL</varname> и + <varname>USE_TK</varname>. Желаемую версию + <command>tcl</command> можно указать в переменной + <varname>WITH_TCL_VER</varname>.</para> + + <table frame="none"> + <title>Наиболее востребованные переменные для портов, которые + используют <application>Tcl/Tk</application></title> + + <tgroup cols="2"> + <tbody> + <row> + <entry><varname>USE_TCL</varname></entry> + <entry>Порт зависит от библиотеки + <application>Tcl</application> (не оболочки). + Минимальную требуемую версию можно указать с + использованием таких значений, как 84+. Отдельные + неподдерживаемые версии указываются в переменной + <varname>INVALID_TCL_VER</varname>.</entry> + </row> + + <row> + <entry><varname>USE_TCL_BUILD</varname></entry> + <entry><application>Tcl</application> нужен для порта + только на время сборки.</entry> + </row> + + <row> + <entry><varname>USE_TCL_WRAPPER</varname></entry> + <entry>Эту новую переменную следует использовать для + портов, для которых требуется оболочка + <application>Tcl</application> и не требуется + конкретная версия <literal>tclsh</literal>. Обертка + <literal>tclsh</literal> устанавливается в систему. + Пользователь может указать желаемую оболочку + <command>tcl</command> для использования.</entry> + </row> + + <row> + <entry><varname>WITH_TCL_VER</varname></entry> + <entry>Определяемые пользователем переменные, которые + устанавливают желаемую версию + <application>Tcl</application>.</entry> + </row> + + <row> + <entry><varname><replaceable>UNIQUENAME</replaceable>_WITH_TCL_VER</varname></entry> + <entry>Подобно <varname>WITH_TCL_VER</varname>, но для + каждого порта.</entry> + </row> + + <row> + <entry><varname>USE_TCL_THREADS</varname></entry> + <entry>Требует многопоточную сборку + <application>Tcl/Tk</application>.</entry> + </row> + + <row> + <entry><varname>USE_TK</varname></entry> + <entry>Порт зависит от библиотеки + <application>Tk</application> (не от предпочитаемой + оболочки). Подразумевает <varname>USE_TCL</varname> с + тем же значением. Для большей информации смотрите + описание переменной <varname>USE_TCL</varname>.</entry> + </row> + + <row> + <entry><varname>USE_TK_BUILD</varname></entry> + <entry>Аналогично + <varname>USE_TCL_BUILD</varname>.</entry> + </row> + + <row> + <entry><varname>USE_TK_WRAPPER</varname></entry> + <entry>Аналогично + <varname>USE_TCL_WRAPPER</varname>.</entry> + </row> + + <row> + <entry><varname>WITH_TK_VER</varname></entry> + <entry>Аналогично <varname>WITH_TCL_VER</varname>, + подразумевает <varname>WITH_TCL_VER</varname> той же + версии.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Полный перечень доступных переменных находится в + <filename>/usr/ports/Mk/bsd.tcl.mk</filename>.</para> + </sect1> + + <sect1 xml:id="using-emacs"> + <title>Использование Emacs</title> + + <para>Этот раздел ещё предстоит написать.</para> + </sect1> + + <sect1 xml: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><varname>USE_RUBY</varname></entry> + <entry>Порт требует Ruby.</entry> + </row> + + <row> + <entry><varname>USE_RUBY_EXTCONF</varname></entry> + <entry>Порт использует для конфигурации + <filename>extconf.rb</filename>.</entry> + </row> + + <row> + <entry><varname>USE_RUBY_SETUP</varname></entry> + <entry>Порт использует для конфигурации + <filename>setup.rb</filename>.</entry> + </row> + + <row> + <entry><varname>RUBY_SETUP</varname></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><varname>RUBY_PKGNAMEPREFIX</varname></entry> + <entry>Используется как <varname>PKGNAMEPREFIX</varname> + для различия пакетов от разных версий Ruby.</entry> + <entry><literal>ruby18-</literal></entry> + </row> + + <row> + <entry><varname>RUBY_VERSION</varname></entry> + <entry>Полная версия Ruby в форме + <literal>x.y.z</literal>.</entry> + <entry><literal>1.8.2</literal></entry> + </row> + + <row> + <entry><varname>RUBY_SITELIBDIR</varname></entry> + <entry>Путь для установки архитектуронезависимых + библиотек.</entry> + <entry><literal>/usr/local/lib/ruby/site_ruby/1.8</literal></entry> + </row> + + <row> + <entry><varname>RUBY_SITEARCHLIBDIR</varname></entry> + <entry>Путь для установки архитектурозависимых + библиотек.</entry> + <entry><literal>/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6</literal></entry> + </row> + + <row> + <entry><varname>RUBY_MODDOCDIR</varname></entry> + <entry>Путь для установки документации модуля.</entry> + <entry><literal>/usr/local/share/doc/ruby18/patsy</literal></entry> + </row> + + <row> + <entry><varname>RUBY_MODEXAMPLESDIR</varname></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 xml:id="using-sdl"> + <title>Использование SDL</title> + + <para>Переменная <varname>USE_SDL</varname> используется для + автоматической настройки зависимостей для портов, использующих + библиотеки на основе SDL, такие как + <package role="port">devel/sdl12</package> или + <package role="port">graphics/sdl_image</package>.</para> + + <para>Для версии 1.2 на данный момент распознаются следующие + SDL-библиотеки:</para> + + <itemizedlist> + <listitem> + <para>sdl: <package role="port">devel/sdl12</package></para> + </listitem> + + <listitem> + <para>console: <package role="port">devel/sdl_console</package></para> - </listitem> + </listitem> - <listitem> - <para>gfx: <package + <listitem> + <para>gfx: <package role="port">graphics/sdl_gfx</package></para> - </listitem> + </listitem> - <listitem> - <para>image: <package + <listitem> + <para>image: <package role="port">graphics/sdl_image</package></para> - </listitem> + </listitem> - <listitem> - <para>mixer: <package + <listitem> + <para>mixer: <package role="port">audio/sdl_mixer</package></para> - </listitem> + </listitem> - <listitem> - <para>mm: <package - role="port">devel/sdlmm</package></para> - </listitem> + <listitem> + <para>mm: <package role="port">devel/sdlmm</package></para> + </listitem> - <listitem> - <para>net: <package - role="port">net/sdl_net</package></para> - </listitem> + <listitem> + <para>net: <package role="port">net/sdl_net</package></para> + </listitem> - <listitem> - <para>pango: <package + <listitem> + <para>pango: <package role="port">x11-toolkits/sdl_pango</package></para> - </listitem> + </listitem> - <listitem> - <para>sound: <package + <listitem> + <para>sound: <package role="port">audio/sdl_sound</package></para> - </listitem> + </listitem> - <listitem> - <para>ttf: <package + <listitem> + <para>ttf: <package role="port">graphics/sdl_ttf</package></para> - </listitem> - </itemizedlist> + </listitem> + </itemizedlist> - <para>Для версии 2.0 - на данный момент распознаются следующие SDL-библиотеки:</para> + <para>Для версии 2.0 на данный момент распознаются следующие + SDL-библиотеки:</para> - <itemizedlist> - <listitem> - <para>sdl: <package - role="port">devel/sdl20</package></para> - </listitem> + <itemizedlist> + <listitem> + <para>sdl: <package role="port">devel/sdl20</package></para> + </listitem> - <listitem> - <para>gfx: <package + <listitem> + <para>gfx: <package role="port">graphics/sdl2_gfx</package></para> - </listitem> + </listitem> - <listitem> - <para>image: <package + <listitem> + <para>image: <package role="port">graphics/sdl2_image</package></para> - </listitem> + </listitem> - <listitem> - <para>mixer: <package + <listitem> + <para>mixer: <package role="port">audio/sdl2_mixer</package></para> - </listitem> + </listitem> - <listitem> - <para>net: <package + <listitem> + <para>net: <package role="port">net/sdl2_net</package></para> - </listitem> + </listitem> - <listitem> - <para>ttf: <package + <listitem> + <para>ttf: <package role="port">graphics/sdl2_ttf</package></para> - </listitem> - </itemizedlist> - - <para>Таким образом, если порт имеет зависимость от - <package role="port">net/sdl_net</package> и - <package role="port">audio/sdl_mixer</package>, то строка будет - следующей:</para> - - <programlisting>USE_SDL= net mixer</programlisting> - - <para>Зависимость от порта <package role="port">devel/sdl12</package>, - который требуется для <package role="port">net/sdl_net</package> - и <package role="port">audio/sdl_mixer</package>, будет также - автоматически добавлен.</para> - - <para>Если вы используете <varname>USE_SDL</varname> с элементами - SDL 1.2, то он автоматически:</para> - - <itemizedlist> - <listitem> - <para>Добавляет зависимость от - <application>sdl12-config</application> - к <varname>BUILD_DEPENDS</varname></para> - </listitem> - - <listitem> - <para>Добавляет переменную <varname>SDL_CONFIG</varname> к - <varname>CONFIGURE_ENV</varname></para> - </listitem> - - <listitem> - <para>Добавляет зависимости от указанных библиотек к - <varname>LIB_DEPENDS</varname></para> - </listitem> - </itemizedlist> - - <para>Если вы используете <varname>USE_SDL</varname> с элементами - SDL 2.0, то он автоматически:</para> - - <itemizedlist> - <listitem> - <para>Добавляет зависимость от - <application>sdl2-config</application> к - <varname>BUILD_DEPENDS</varname></para> - </listitem> - - <listitem> - <para>Добавляет переменную <varname>SDL2_CONFIG</varname> к - <varname>CONFIGURE_ENV</varname></para> - </listitem> - - <listitem> - <para>Добавляет зависимости от указанных библиотек к - <varname>LIB_DEPENDS</varname></para> - </listitem> - </itemizedlist> - - <para>Для проверки наличия библиотеки SDL вы можете делать это при - помощи переменной <varname>WANT_SDL</varname>:</para> - - <programlisting>WANT_SDL=yes + </listitem> + </itemizedlist> + + <para>Таким образом, если порт имеет зависимость от + <package role="port">net/sdl_net</package> и + <package role="port">audio/sdl_mixer</package>, то строка будет + следующей:</para> + + <programlisting>USE_SDL= net mixer</programlisting> + + <para>Зависимость от порта + <package role="port">devel/sdl12</package>, который требуется + для <package role="port">net/sdl_net</package> и + <package role="port">audio/sdl_mixer</package>, будет также + автоматически добавлен.</para> + + <para>Если вы используете <varname>USE_SDL</varname> с элементами + SDL 1.2, то он автоматически:</para> + + <itemizedlist> + <listitem> + <para>Добавляет зависимость от + <application>sdl12-config</application> к + <varname>BUILD_DEPENDS</varname></para> + </listitem> + + <listitem> + <para>Добавляет переменную <varname>SDL_CONFIG</varname> к + <varname>CONFIGURE_ENV</varname></para> + </listitem> + + <listitem> + <para>Добавляет зависимости от указанных библиотек к + <varname>LIB_DEPENDS</varname></para> + </listitem> + </itemizedlist> + + <para>Если вы используете <varname>USE_SDL</varname> с элементами + SDL 2.0, то он автоматически:</para> + + <itemizedlist> + <listitem> + <para>Добавляет зависимость от + <application>sdl2-config</application> к + <varname>BUILD_DEPENDS</varname></para> + </listitem> + + <listitem> + <para>Добавляет переменную <varname>SDL2_CONFIG</varname> к + <varname>CONFIGURE_ENV</varname></para> + </listitem> + + <listitem> + <para>Добавляет зависимости от указанных библиотек к + <varname>LIB_DEPENDS</varname></para> + </listitem> + </itemizedlist> + + <para>Для проверки наличия библиотеки SDL вы можете делать это + при помощи переменной <varname>WANT_SDL</varname>:</para> + + <programlisting>WANT_SDL= yes .include <bsd.port.pre.mk> .if ${HAVE_SDL:Mmixer}!="" -USE_SDL+= mixer +USE_SDL+= mixer .endif .include <bsd.port.post.mk></programlisting> - </sect1> - - <sect1 xml:id="using-wx"> - <title>Использование <application>wxWidgets</application></title> - - <para>Эта глава описывает статус библиотек - <application>wxWidgets</application> в дереве портов и их интеграцию - с системой портов.</para> - - <sect2 xml:id="wx-introduction"> - <title>Введение</title> + </sect1> + + <sect1 xml:id="using-wx"> + <title>Использование <application>wxWidgets</application></title> + + <para>Эта глава описывает статус библиотек + <application>wxWidgets</application> в дереве портов и их + интеграцию с системой портов.</para> + + <sect2 xml:id="wx-introduction"> + <title>Введение</title> + + <para>Существует множество версий библиотек + <application>wxWidgets</application>, конфликтующих между + собой (устанавливают файлы под тем же именем). В дереве + портов эта проблема решена путем установки каждой версии под + собственным названием с использованием номера версии в + качестве суффикса.</para> + + <para>Очевидным недостатком этого является необходимость + изменения каждого приложения для нахождения искомой версии. + К счастью, большинство приложений для определения нужного + компилятора и флагов компоновки вызывают сценарий + <command>wx-config</command>. Для каждой доступной версии + этот сценарий имеет своё имя. Большинство приложений + учитывают переменную окружения или принимают аргумент + configure для указания, какой сценарий + <command>wx-config</command> следует вызывать. На все + остальные приходится накладывать патч.</para> + </sect2> + + <sect2 xml:id="wx-version"> + <title>Выбор версии</title> + + <para>Для того, чтобы заставить ваш порт использовать + конкретную версию <application>wxWidgets</application>, + существует две доступные для определения переменные (если + определена только одна, то вторая примет значение по + умолчанию):</para> + + <table xml:id="wx-ver-sel-table" frame="none"> + <title>Переменные для выбора версии + <application>wxWidgets</application></title> - <para>Существует множество версий библиотек - <application>wxWidgets</application>, конфликтующих между собой - (устанавливают файлы под тем же именем). В дереве портов эта - проблема решена путем установки каждой версии под собственным - названием с использованием номера версии в качестве - суффикса.</para> - - <para>Очевидным недостатком этого является необходимость изменения - каждого приложения для нахождения искомой версии. К счастью, - большинство приложений для определения нужного компилятора и флагов - компоновки вызывают сценарий <command>wx-config</command>. Для - каждой доступной версии этот сценарий имеет своё имя. Большинство - приложений учитывают переменную окружения или принимают - аргумент configure для указания, какой сценарий - <command>wx-config</command> следует вызывать. На все остальные - приходится накладывать патч.</para> - </sect2> - - <sect2 xml:id="wx-version"> - <title>Выбор версии</title> - - <para>Для того, чтобы заставить ваш порт использовать конкретную - версию <application>wxWidgets</application>, существует две - доступные для определения переменные (если определена только одна, - то вторая примет значение по умолчанию):</para> - - <table xml: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><varname>USE_WX</varname></entry> - - <entry>Перечень версий, которые порт может использовать</entry> - - <entry>Все доступные версии</entry> - </row> - - <row> - <entry><varname>USE_WX_NOT</varname></entry> - - <entry>Перечень версий, которые порт не может использовать</entry> - - <entry>Нет</entry> - </row> - </tbody> - </tgroup> - </table> + <tgroup cols="3"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Описание</entry> + <entry>Значение по умолчанию</entry> + </row> + </thead> - <para>Перечень доступных версий <application>wxWidgets</application> - и соответствующих им портов в дереве:</para> + <tbody> + <row> + <entry><varname>USE_WX</varname></entry> + <entry>Перечень версий, которые порт может + использовать</entry> + <entry>Все доступные версии</entry> + </row> - <table frame="none"> - <title>Доступные версии <application>wxWidgets</application></title> + <row> + <entry><varname>USE_WX_NOT</varname></entry> + <entry>Перечень версий, которые порт не может + использовать</entry> + <entry>Нет</entry> + </row> + </tbody> + </tgroup> + </table> - <tgroup cols="2"> - <thead> - <row> - <entry>Версия</entry> + <para>Перечень доступных версий + <application>wxWidgets</application> и соответствующих им + портов в дереве:</para> - <entry>Порт</entry> - </row> - </thead> + <table frame="none"> + <title>Доступные версии + <application>wxWidgets</application></title> - <tbody> - <row> - <entry><literal>2.4</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Версия</entry> + <entry>Порт</entry> + </row> + </thead> - <entry><package + <tbody> + <row> + <entry><literal>2.4</literal></entry> + <entry><package role="port">x11-toolkits/wxgtk24</package></entry> - </row> - - <row> - <entry><literal>2.6</literal></entry> + </row> - <entry><package + <row> + <entry><literal>2.6</literal></entry> + <entry><package role="port">x11-toolkits/wxgtk26</package></entry> - </row> - - <row> - <entry><literal>2.8</literal></entry> + </row> - <entry><package + <row> + <entry><literal>2.8</literal></entry> + <entry><package role="port">x11-toolkits/wxgtk28</package></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><varname>WANT_WX_VER</varname></entry> - - <entry>порт</entry> - </row> - - <row> - <entry><varname>WITH_WX_VER</varname></entry> - - <entry>пользователь</entry> - </row> - </tbody> - </tgroup> - </table> - </sect2> - - <sect2 xml:id="wx-components"> - <title>Выбор компонентов</title> - - <para>Существуют другие приложения, которые, хотя и не являются - библиотеками <application>wxWidgets</application>, но в тоже время - относятся к ним. Эти приложения можно указать в переменной - <varname>WX_COMPS</varname>. Доступны следующие компоненты:</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> + </row> + </tbody> + </tgroup> + </table> - <entry><literal>2.4-2.6</literal></entry> - </row> + <note> + <para>Версии начиная с <literal>2.5</literal> также + поставляются с Unicode и устанавливается подчиненным портом + с названием как как у обычного, но с суффиксом + <literal>-unicode</literal>, но этим можно управлять при + помощи переменных (смотрите + <xref linkend="wx-unicode"/>).</para> + </note> - <row> - <entry><literal>mozilla</literal></entry> + <para>Переменные в <xref linkend="wx-ver-sel-table"/> можно + установить в одну или более следующих комбинаций, разделенных + пробелами:</para> - <entry><application>wxMozilla</application></entry> + <table frame="none"> + <title>Определение версии для + <application>wxWidgets</application></title> - <entry><literal>2.4</literal></entry> - </row> - <row> - <entry><literal>svg</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Описание</entry> + <entry>Пример</entry> + </row> + </thead> - <entry><application>wxSVG</application></entry> + <tbody> + <row> + <entry>Единичная версия</entry> + <entry><literal>2.4</literal></entry> + </row> - <entry><literal>2.6</literal></entry> - </row> - </tbody> - </tgroup> - </table> + <row> + <entry>Восходящий диапазон</entry> + <entry><literal>2.4+</literal></entry> + </row> - <para>Тип добавляемой зависимости при выборе каждого компонента - может быть указан вручную путем добавления суффикса, отделенного - точкой с запятой. Если таковой отсутствует, но будет использовано - значение по умолчанию (смотрите <xref linkend="wx-def-dep-types"/>). - Доступные типы зависимости:</para> + <row> + <entry>Нисходящий диапазон</entry> + <entry><literal>2.6-</literal></entry> + </row> - <table frame="none"> - <title>Доступные типы зависимости - <application>wxWidgets</application></title> + <row> + <entry>Полный диапазон (обязан быть восходящим)</entry> + <entry><literal>2.4-2.6</literal></entry> + </row> + </tbody> + </tgroup> + </table> - <tgroup cols="2"> - <thead> - <row> - <entry>Название</entry> + <para>Кроме того, существует несколько переменных для выбора + предпочитаемых версий из перечня доступных. Они могут быть + установлены в несколько версий, первая из которых будет иметь + наибольший приоритет.</para> - <entry>Описание</entry> - </row> - </thead> + <table frame="none"> + <title>Переменные для выбора предпочитаемых версий + <application>wxWidgets</application></title> - <tbody> - <row> - <entry><literal>build</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Предназначение</entry> + </row> + </thead> - <entry>Компонент требуется для построения, эквивалентен - <varname>BUILD_DEPENDS</varname></entry> - </row> + <tbody> + <row> + <entry><varname>WANT_WX_VER</varname></entry> + <entry>порт</entry> + </row> - <row> - <entry><literal>run</literal></entry> + <row> + <entry><varname>WITH_WX_VER</varname></entry> + <entry>пользователь</entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> - <entry>Компонент требуется для запуска, эквивалентен - <varname>RUN_DEPENDS</varname></entry> - </row> + <sect2 xml:id="wx-components"> + <title>Выбор компонентов</title> - <row> - <entry><literal>lib</literal></entry> + <para>Существуют другие приложения, которые, хотя и не являются + библиотеками <application>wxWidgets</application>, но в тоже + время относятся к ним. Эти приложения можно указать в + переменной <varname>WX_COMPS</varname>. Доступны следующие + компоненты:</para> - <entry>Компонент требуется для построения и запуска, - эквивалентен <varname>LIB_DEPENDS</varname></entry> - </row> - </tbody> - </tgroup> - </table> + <table frame="none"> + <title>Доступные компоненты + <application>wxWidgets</application></title> - <para>Значения по умолчанию для компонентов подробно рассматриваются - в следующей таблице:</para> + <tgroup cols="3"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + <entry>Ограничение версии</entry> + </row> + </thead> - <table xml:id="wx-def-dep-types" frame="none"> - <title>Типы зависимости <application>wxWidgets</application>, - используемые по умолчанию</title> + <tbody> + <row> + <entry><literal>wx</literal></entry> + <entry>основная библиотека</entry> + <entry>нет</entry> + </row> - <tgroup cols="2"> - <thead> - <row> - <entry>Компонент</entry> + <row> + <entry><literal>contrib</literal></entry> + <entry>сторонние библиотеки</entry> + <entry><literal>нет</literal></entry> + </row> - <entry>Тип зависимости</entry> - </row> - </thead> + <row> + <entry><literal>python</literal></entry> + <entry><application>wxPython</application> + (привязки к + <application>Python</application>)</entry> + <entry><literal>2.4-2.6</literal></entry> + </row> - <tbody> - <row> - <entry><literal>wx</literal></entry> + <row> + <entry><literal>mozilla</literal></entry> + <entry><application>wxMozilla</application></entry> + <entry><literal>2.4</literal></entry> + </row> - <entry><literal>lib</literal></entry> - </row> + <row> + <entry><literal>svg</literal></entry> + <entry><application>wxSVG</application></entry> + <entry><literal>2.6</literal></entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><literal>contrib</literal></entry> + <para>Тип добавляемой зависимости при выборе каждого компонента + может быть указан вручную путем добавления суффикса, + отделенного точкой с запятой. Если таковой отсутствует, но + будет использовано значение по умолчанию (смотрите <xref + linkend="wx-def-dep-types"/>). Доступные типы + зависимости:</para> - <entry><literal>lib</literal></entry> - </row> + <table frame="none"> + <title>Доступные типы зависимости + <application>wxWidgets</application></title> - <row> - <entry><literal>python</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <entry><literal>run</literal></entry> - </row> + <tbody> + <row> + <entry><literal>build</literal></entry> + <entry>Компонент требуется для построения, эквивалентен + <varname>BUILD_DEPENDS</varname></entry> + </row> - <row> - <entry><literal>mozilla</literal></entry> + <row> + <entry><literal>run</literal></entry> + <entry>Компонент требуется для запуска, эквивалентен + <varname>RUN_DEPENDS</varname></entry> + </row> - <entry><literal>lib</literal></entry> - </row> + <row> + <entry><literal>lib</literal></entry> + <entry>Компонент требуется для построения и запуска, + эквивалентен <varname>LIB_DEPENDS</varname></entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><literal>svg</literal></entry> - - <entry><literal>lib</literal></entry> - </row> - </tbody> - </tgroup> - </table> + <para>Значения по умолчанию для компонентов подробно + рассматриваются в следующей таблице:</para> - <example xml:id="wx-components-example"> - <title>Выбор компонентов - <application>wxWidgets</application></title> + <table xml:id="wx-def-dep-types" frame="none"> + <title>Типы зависимости <application>wxWidgets</application>, + используемые по умолчанию</title> - <para>Следующий фрагмент относится к порту, в котором используется - <application>wxWidgets</application> версии 2.4 с его сторонними - библиотеками.</para> + <tgroup cols="2"> + <thead> + <row> + <entry>Компонент</entry> + <entry>Тип зависимости</entry> + </row> + </thead> - <programlisting>USE_WX= 2.4 -WX_COMPS= wx contrib</programlisting> - </example> - </sect2> - <sect2 xml:id="wx-unicode"> - <title>Unicode</title> + <tbody> + <row> + <entry><literal>wx</literal></entry> + <entry><literal>lib</literal></entry> + </row> - <para>Библиотека <application>wxWidgets</application> поддерживает - Unicode начиная с версии <literal>2.5</literal>. В дереве портов - доступны обе версии и могут быть выбраны с использованием - следующих переменных:</para> + <row> + <entry><literal>contrib</literal></entry> + <entry><literal>lib</literal></entry> + </row> - <table xml:id="wx-unicode-var-table" frame="none"> - <title>Переменные для выбора версии - <application>wxWidgets</application> с Unicode</title> + <row> + <entry><literal>python</literal></entry> + <entry><literal>run</literal></entry> + </row> - <tgroup cols="3"> - <thead> - <row> - <entry>Переменная</entry> + <row> + <entry><literal>mozilla</literal></entry> + <entry><literal>lib</literal></entry> + </row> - <entry>Описание</entry> + <row> + <entry><literal>svg</literal></entry> + <entry><literal>lib</literal></entry> + </row> + </tbody> + </tgroup> + </table> - <entry>Предназначение</entry> - </row> - </thead> + <example xml:id="wx-components-example"> + <title>Выбор компонентов + <application>wxWidgets</application></title> - <tbody> - <row> - <entry><varname>WX_UNICODE</varname></entry> + <para>Следующий фрагмент относится к порту, в котором + используется <application>wxWidgets</application> версии + <literal>2.4</literal> с его сторонними + библиотеками.</para> - <entry>Порт работает <emphasis>только</emphasis> с версией - Unicode</entry> + <programlisting>USE_WX= 2.4 +WX_COMPS= wx contrib</programlisting> + </example> + </sect2> - <entry>порт</entry> - </row> + <sect2 xml:id="wx-unicode"> + <title>Unicode</title> - <row> - <entry><varname>WANT_UNICODE</varname></entry> + <para>Библиотека <application>wxWidgets</application> + поддерживает Unicode начиная с версии <literal>2.5</literal>. + В дереве портов доступны обе версии и могут быть выбраны с + использованием следующих переменных:</para> - <entry>Порт работает с обеими версиями, но предпочитает - версию с Unicode</entry> + <table xml:id="wx-unicode-var-table" frame="none"> + <title>Переменные для выбора версии + <application>wxWidgets</application> с Unicode</title> - <entry>порт</entry> - </row> - <row> - <entry><varname>WITH_UNICODE</varname></entry> + <tgroup cols="3"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Описание</entry> + <entry>Предназначение</entry> + </row> + </thead> - <entry>Порт будет использовать версию Unicode</entry> + <tbody> + <row> + <entry><varname>WX_UNICODE</varname></entry> + <entry>Порт работает <emphasis>только</emphasis> с + версией Unicode</entry> + <entry>порт</entry> + </row> - <entry>пользователь</entry> - </row> - <row> - <entry><varname>WITHOUT_UNICODE</varname></entry> + <row> + <entry><varname>WANT_UNICODE</varname></entry> + <entry>Порт работает с обеими версиями, но предпочитает + версию с Unicode</entry> + <entry>порт</entry> + </row> - <entry>Порт будет использовать обычную версию, если это - поддерживается (когда <varname>WX_UNICODE</varname> - не определена)</entry> + <row> + <entry><varname>WITH_UNICODE</varname></entry> + <entry>Порт будет использовать версию Unicode</entry> + <entry>пользователь</entry> + </row> - <entry>пользователь</entry> - </row> - </tbody> - </tgroup> - </table> + <row> + <entry><varname>WITHOUT_UNICODE</varname></entry> + <entry>Порт будет использовать обычную версию, если это + поддерживается (когда <varname>WX_UNICODE</varname> + не определена)</entry> + <entry>пользователь</entry> + </row> + </tbody> + </tgroup> + </table> - <warning> - <para>Не используйте <varname>WX_UNICODE</varname> для портов, - которые могут использовать обе версии. Если вы хотите, чтобы - порт по умолчанию использовал Unicode, определите вместо этого - <varname>WANT_UNICODE</varname>.</para> - </warning> - </sect2> + <warning> + <para>Не используйте <varname>WX_UNICODE</varname> для + портов, которые могут использовать обе версии. Если вы + хотите, чтобы порт по умолчанию использовал Unicode, + определите вместо этого + <varname>WANT_UNICODE</varname>.</para> + </warning> + </sect2> - <sect2 xml:id="wx-version-detection"> - <title>Обнаружение установленных версий</title> + <sect2 xml:id="wx-version-detection"> + <title>Обнаружение установленных версий</title> - <para>Для обнаружения установленной версии вам необходимо задать - переменную <varname>WANT_WX</varname>. Если вы не присвоите ей - определенную версию, то компоненты получат суффикс версии. - Переменная <varname>HAVE_WX</varname> будет заполнена после - обнаружения.</para> + <para>Для обнаружения установленной версии вам необходимо + задать переменную <varname>WANT_WX</varname>. Если вы не + присвоите ей определенную версию, то компоненты получат + суффикс версии. Переменная <varname>HAVE_WX</varname> будет + заполнена после обнаружения.</para> - <example xml:id="wx-ver-det-example"> - <title>Обнаружение установленных версий и компонентов - <application>wxWidgets</application></title> + <example xml:id="wx-ver-det-example"> + <title>Обнаружение установленных версий и компонентов + <application>wxWidgets</application></title> - <para>Следующий фрагмент может быть использован в порту, который - использует <application>wxWidgets</application>, в случае если - он установлен или выбран соответствующий параметр.</para> + <para>Следующий фрагмент может быть использован в порту, + который использует <application>wxWidgets</application>, в + случае если он установлен или выбран соответствующий + параметр.</para> - <programlisting>WANT_WX= yes + <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 +USE_WX= 2.4 +CONFIGURE_ARGS+= --enable-wx .endif</programlisting> - <para>Следующий фрагмент может быть использован в порту, который - задействует поддержку <application>wxPython</application>, - в случае если он установлен или выбран соответствующий параметр, - в дополнение к <application>wxWidgets</application>, обе версии - <literal>2.6</literal>.</para> + <para>Следующий фрагмент может быть использован в порту, + который задействует поддержку + <application>wxPython</application>, в случае если он + установлен или выбран соответствующий параметр, в + дополнение к <application>wxWidgets</application>, обе + версии <literal>2.6</literal>.</para> - <programlisting>USE_WX= 2.6 -WX_COMPS= wx -WANT_WX= 2.6 + <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 +WX_COMPS+= python +CONFIGURE_ARGS+= --enable-wxpython .endif</programlisting> - </example> - </sect2> - - <sect2 xml: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> + </example> + </sect2> - <tbody> - <row> - <entry><varname>WX_CONFIG</varname></entry> + <sect2 xml:id="wx-defined-variables"> + <title>Переменные для определения</title> - <entry>Путь к сценарию <application>wxWidgets</application> - <command>wx-config</command> (с другим именем)</entry> - </row> + <para>Следующие переменные доступны в порту (после определения + одной из переменных из + <xref linkend="wx-ver-sel-table"/>).</para> - <row> - <entry><varname>WXRC_CMD</varname></entry> + <table frame="none"> + <title>Переменные, определенные для портов, использующих + <application>wxWidgets</application></title> - <entry>Путь к программе <application>wxWidgets</application> - <command>wxrc</command> (с другим именем)</entry> - </row> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <row> - <entry><varname>WX_VERSION</varname></entry> + <tbody> + <row> + <entry><varname>WX_CONFIG</varname></entry> + <entry>Путь к сценарию + <application>wxWidgets</application> + <command>wx-config</command> (с другим + именем)</entry> + </row> - <entry>Версия <application>wxWidgets</application>, которая - будет использоваться (например, - <literal>2.6</literal>)</entry> - </row> + <row> + <entry><varname>WXRC_CMD</varname></entry> + <entry>Путь к программе + <application>wxWidgets</application> + <command>wxrc</command> (с другим именем)</entry> + </row> - <row> - <entry><varname>WX_UNICODE</varname></entry> + <row> + <entry><varname>WX_VERSION</varname></entry> + <entry>Версия <application>wxWidgets</application>, + которая будет использоваться (например, + <literal>2.6</literal>)</entry> + </row> - <entry>Если не определена, но Unicode будет использоваться, - то она будет определена</entry> - </row> - </tbody> - </tgroup> - </table> - </sect2> + <row> + <entry><varname>WX_UNICODE</varname></entry> + <entry>Если не определена, но Unicode будет + использоваться, то она будет определена</entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> - <sect2 xml:id="wx-premk"> - <title>Обработка в <filename>bsd.port.pre.mk</filename></title> + <sect2 xml:id="wx-premk"> + <title>Обработка в <filename>bsd.port.pre.mk</filename></title> - <para>Если вам нужно использовать переменные для запуска команд - сразу после подключения <filename>bsd.port.pre.mk</filename>, то - вам нужно определить <varname>WX_PREMK</varname>.</para> + <para>Если вам нужно использовать переменные для запуска команд + сразу после подключения <filename>bsd.port.pre.mk</filename>, + то вам нужно определить <varname>WX_PREMK</varname>.</para> - <important> - <para>Если вы определите <varname>WX_PREMK</varname>, то версия, - зависимости, компоненты и заданные переменные не изменяться, в - случае вы изменили переменные порта - <application>wxWidgets</application> <emphasis>после</emphasis> - подключения <filename>bsd.port.pre.mk</filename>.</para> - </important> + <important> + <para>Если вы определите <varname>WX_PREMK</varname>, то + версия, зависимости, компоненты и заданные переменные не + изменяться, в случае вы изменили переменные порта + <application>wxWidgets</application> + <emphasis>после</emphasis> подключения + <filename>bsd.port.pre.mk</filename>.</para> + </important> - <example xml:id="wx-premk-example"> - <title>Использование переменных <application>wxWidgets</application> - в командах</title> + <example xml:id="wx-premk-example"> + <title>Использование переменных + <application>wxWidgets</application> в командах</title> - <para>Следующий фрагмент иллюстрирует использование переменной - <varname>WX_PREMK</varname> посредством запуска сценария - <command>wx-config</command> для получения строки с полной версией - с присвоением ее переменной и передачей в программу.</para> + <para>Следующий фрагмент иллюстрирует использование + переменной <varname>WX_PREMK</varname> посредством запуска + сценария <command>wx-config</command> для получения строки + с полной версией с присвоением ее переменной и передачей в + программу.</para> - <programlisting>USE_WX= 2.4 -WX_PREMK= yes + <programlisting>USE_WX= 2.4 +WX_PREMK= yes .include <bsd.port.pre.mk> .if exists(${WX_CONFIG}) -VER_STR!= ${WX_CONFIG} --release +VER_STR!= ${WX_CONFIG} --release -PLIST_SUB+= VERSION="${VER_STR}" +PLIST_SUB+= VERSION="${VER_STR}" .endif</programlisting> - </example> - - <note> - <para>Переменные <application>wxWidgets</application> можно - безопасно использовать в командах внутри целей без необходимости - в использовании <varname>WX_PREMK</varname>.</para> - </note> - </sect2> - - <sect2 xml:id="wx-additional-config-args"> - <title>Дополнительные параметры <command>configure</command></title> - - <para>Некоторые сценарии GNU <command>configure</command> не могут - найти <application>wxWidgets</application> только с установленной - переменной окружения <literal>WX_CONFIG</literal>, требуя - дополнительные параметры. Для их передачи можно использовать - переменную <varname>WX_CONF_ARGS</varname>.</para> + </example> - <table frame="none"> - <title>Допустимые значения <varname>WX_CONF_ARGS</varname></title> + <note> + <para>Переменные <application>wxWidgets</application> можно + безопасно использовать в командах внутри целей без + необходимости в использовании + <varname>WX_PREMK</varname>.</para> + </note> + </sect2> - <tgroup cols="2"> - <thead> - <row> - <entry>Возможное значение</entry> + <sect2 xml:id="wx-additional-config-args"> + <title>Дополнительные параметры + <command>configure</command></title> - <entry>Получаемый параметр</entry> - </row> - </thead> + <para>Некоторые сценарии GNU <command>configure</command> не + могут найти <application>wxWidgets</application> только с + установленной переменной окружения + <literal>WX_CONFIG</literal>, требуя дополнительные + параметры. Для их передачи можно использовать переменную + <varname>WX_CONF_ARGS</varname>.</para> - <tbody> - <row> - <entry><literal>absolute</literal></entry> + <table frame="none"> + <title>Допустимые значения + <varname>WX_CONF_ARGS</varname></title> - <entry><literal>--with-wx-config=${WX_CONFIG}</literal></entry> - </row> + <tgroup cols="2"> + <thead> + <row> + <entry>Возможное значение</entry> + <entry>Получаемый параметр</entry> + </row> + </thead> - <row> - <entry><literal>relative</literal></entry> + <tbody> + <row> + <entry><literal>absolute</literal></entry> + <entry><literal>--with-wx-config=${WX_CONFIG}</literal></entry> + </row> - <entry><literal>--with-wx=${LOCALBASE} + <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 xml:id="using-lua"> - <title>Использование <application>Lua</application></title> - - <para>Эта глава описывает статус библиотек <application>Lua</application> - в дереве портов и их интеграцию в систему портов.</para> - - <sect2 xml:id="lua-introduction"> - <title>Введение</title> - - <para>Существует множество версий библиотек - <application>Lua</application> и соответствующих интерпретаторов, - конфликтующих между собой (устанавливают файлы под тем же именем). - В дереве портов эта проблема решена путем установки каждой версии - в собственное место с использованием номера версии в качестве - суффикса.</para> - - <para>Очевидным недостатком этого является необходимость изменения - каждого приложения для нахождения искомой версии. Но это решается - добавлением некоторых дополнительных флагов для компилятора и - компоновщика.</para> - </sect2> - - <sect2 xml:id="lua-version"> - <title>Выбор версии</title> - - <para>Для того, чтобы заставить ваш порт использовать конкретную - версию <application>Lua</application>, существует две доступные - для определения переменные (если определена только одна, то - вторая примет значение по умолчанию):</para> - - <table xml:id="lua-ver-sel-table" frame="none"> - <title>Переменные для выбора версии - <application>Lua</application></title> + </row> + </tbody> + </tgroup> + </table> + </sect2> + </sect1> - <tgroup cols="3"> - <thead> - <row> - <entry>Переменная</entry> + <sect1 xml:id="using-lua"> + <title>Использование <application>Lua</application></title> - <entry>Описание</entry> + <para>Эта глава описывает статус библиотек + <application>Lua</application> в дереве портов и их интеграцию + в систему портов.</para> - <entry>Значение по умолчанию</entry> - </row> - </thead> + <sect2 xml:id="lua-introduction"> + <title>Введение</title> - <tbody> - <row> - <entry><varname>USE_LUA</varname></entry> + <para>Существует множество версий библиотек + <application>Lua</application> и соответствующих + интерпретаторов, конфликтующих между собой (устанавливают + файлы под тем же именем). В дереве портов эта проблема + решена путем установки каждой версии в собственное место с + использованием номера версии в качестве суффикса.</para> - <entry>Перечень версий, которые порт может использовать</entry> + <para>Очевидным недостатком этого является необходимость + изменения каждого приложения для нахождения искомой версии. + Но это решается добавлением некоторых дополнительных флагов + для компилятора и компоновщика.</para> + </sect2> - <entry>Все доступные версии</entry> - </row> + <sect2 xml:id="lua-version"> + <title>Выбор версии</title> - <row> - <entry><varname>USE_LUA_NOT</varname></entry> + <para>Для того, чтобы заставить ваш порт использовать + конкретную версию <application>Lua</application>, существует + две доступные для определения переменные (если определена + только одна, то вторая примет значение по умолчанию):</para> - <entry>Перечень версий, которые порт не может - использовать</entry> + <table xml:id="lua-ver-sel-table" frame="none"> + <title>Переменные для выбора версии + <application>Lua</application></title> - <entry>Пусто</entry> - </row> - </tbody> - </tgroup> - </table> + <tgroup cols="3"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Описание</entry> + <entry>Значение по умолчанию</entry> + </row> + </thead> - <para>Перечень доступных версий <application>Lua</application> и - соответствующих портов в дереве:</para> + <tbody> + <row> + <entry><varname>USE_LUA</varname></entry> + <entry>Перечень версий, которые порт может + использовать</entry> + <entry>Все доступные версии</entry> + </row> - <table frame="none"> - <title>Доступные версии <application>Lua</application></title> + <row> + <entry><varname>USE_LUA_NOT</varname></entry> + <entry>Перечень версий, которые порт не может + использовать</entry> + <entry>Пусто</entry> + </row> + </tbody> + </tgroup> + </table> - <tgroup cols="2"> - <thead> - <row> - <entry>Версия</entry> + <para>Перечень доступных версий <application>Lua</application> + и соответствующих портов в дереве:</para> - <entry>Порт</entry> - </row> - </thead> + <table frame="none"> + <title>Доступные версии + <application>Lua</application></title> - <tbody> - <row> - <entry><literal>4.0</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Версия</entry> + <entry>Порт</entry> + </row> + </thead> - <entry><package + <tbody> + <row> + <entry><literal>4.0</literal></entry> + <entry><package role="port">lang/lua4</package></entry> - </row> - - <row> - <entry><literal>5.0</literal></entry> + </row> - <entry><package + <row> + <entry><literal>5.0</literal></entry> + <entry><package role="port">lang/lua50</package></entry> - </row> - - <row> - <entry><literal>5.1</literal></entry> + </row> - <entry><package + <row> + <entry><literal>5.1</literal></entry> + <entry><package role="port">lang/lua</package></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><varname>WANT_LUA_VER</varname></entry> - - <entry>порт</entry> - </row> - - <row> - <entry><varname>WITH_LUA_VER</varname></entry> - - <entry>пользователь</entry> - </row> - </tbody> - </tgroup> - </table> - - <example xml:id="lua-version-example"> - <title>Выбор версии <application>Lua</application></title> + </row> + </tbody> + </tgroup> + </table> - <para>Следующий фрагмент взят из порта, который использует - <application>Lua</application> версий <literal>5.0</literal> - или <literal>5.1</literal>, по умолчанию <literal>5.0</literal>. - Значение может быть переопределено пользователем с использованием - переменной <varname>WITH_LUA_VER</varname>.</para> + <para>Переменные из <xref linkend="lua-ver-sel-table"/> могут + иметь комбинации из одного или нескольких значений, + разделенных пробелом:</para> - <programlisting>USE_LUA= 5.0-5.1 -WANT_LUA_VER= 5.0</programlisting> - </example> - </sect2> + <table frame="none"> + <title>Определение версии + <application>Lua</application></title> - <sect2 xml:id="lua-components"> - <title>Выбор компонентов</title> + <tgroup cols="2"> + <thead> + <row> + <entry>Описание</entry> + <entry>Пример</entry> + </row> + </thead> - <para>Существуют другие приложения, которые хотя и не являются - библиотеками <application>Lua</application>, но относятся к ним. - Эти приложения можно указать в переменной - <varname>LUA_COMPS</varname>. Доступны следующие компоненты:</para> + <tbody> + <row> + <entry>Единичная версия</entry> + <entry><literal>4.0</literal></entry> + </row> - <table frame="none"> - <title>Доступные компоненты <application>Lua</application></title> + <row> + <entry>Восходящий диапазон</entry> + <entry><literal>5.0+</literal></entry> + </row> - <tgroup cols="3"> - <thead> - <row> - <entry>Название</entry> + <row> + <entry>Нисходящий диапазон</entry> + <entry><literal>5.0-</literal></entry> + </row> - <entry>Описание</entry> + <row> + <entry>Полный диапазон (обязан быть восходящим)</entry> + <entry><literal>5.0-5.1</literal></entry> + </row> + </tbody> + </tgroup> + </table> + <para>Кроме того, существует несколько переменных для выбора + предпочитаемых версий из перечня доступных. Они могут быть + установлены в несколько версий, первая из которых будет иметь + наибольший приоритет.</para> - <entry>Ограничение версии</entry> - </row> - </thead> + <table frame="none"> + <title>Переменные для выбора предпочитаемых версий + <application>Lua</application></title> - <tbody> - <row> - <entry><literal>lua</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Предназначение</entry> + </row> + </thead> - <entry>Основная библиотека</entry> + <tbody> + <row> + <entry><varname>WANT_LUA_VER</varname></entry> + <entry>порт</entry> + </row> - <entry>нет</entry> - </row> + <row> + <entry><varname>WITH_LUA_VER</varname></entry> + <entry>пользователь</entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><literal>tolua</literal></entry> + <example xml:id="lua-version-example"> + <title>Выбор версии <application>Lua</application></title> - <entry>Библиотека доступа к коду C/C++</entry> + <para>Следующий фрагмент взят из порта, который использует + <application>Lua</application> версий + <literal>5.0</literal> или <literal>5.1</literal>, по + умолчанию <literal>5.0</literal>. Значение может быть + переопределено пользователем с использованием переменной + <varname>WITH_LUA_VER</varname>.</para> - <entry>4.0-5.0</entry> - </row> + <programlisting>USE_LUA= 5.0-5.1 +WANT_LUA_VER= 5.0</programlisting> + </example> + </sect2> - <row> - <entry><literal>ruby</literal></entry> + <sect2 xml:id="lua-components"> + <title>Выбор компонентов</title> - <entry>Привязка к Ruby</entry> + <para>Существуют другие приложения, которые хотя и не являются + библиотеками <application>Lua</application>, но относятся к + ним. Эти приложения можно указать в переменной + <varname>LUA_COMPS</varname>. Доступны следующие + компоненты:</para> - <entry>4.0-5.0</entry> - </row> - </tbody> - </tgroup> - </table> + <table frame="none"> + <title>Доступные компоненты + <application>Lua</application></title> - <note> - <para>Есть и другие компоненты, но они относятся к модулям для - интерпретатора и не используются приложениями (только другими - модулями).</para> - </note> + <tgroup cols="3"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + <entry>Ограничение версии</entry> + </row> + </thead> - <para>Тип зависимости можно выбрать для каждого компонента через - добавление суффикса, отделенного точкой с запятой. В случае - отсутствия будет использован тип по умолчанию (смотрите - <xref linkend="lua-def-dep-types"/>). Доступные следующие - типы:</para> + <tbody> + <row> + <entry><literal>lua</literal></entry> + <entry>Основная библиотека</entry> + <entry>нет</entry> + </row> - <table frame="none"> - <title>Доступные типы зависимости - <application>Lua</application></title> + <row> + <entry><literal>tolua</literal></entry> + <entry>Библиотека доступа к коду C/C++</entry> + <entry>4.0-5.0</entry> + </row> - <tgroup cols="2"> - <thead> - <row> - <entry>Название</entry> + <row> + <entry><literal>ruby</literal></entry> + <entry>Привязка к Ruby</entry> + <entry>4.0-5.0</entry> + </row> + </tbody> + </tgroup> + </table> - <entry>Описание</entry> - </row> - </thead> + <note> + <para>Есть и другие компоненты, но они относятся к модулям + для интерпретатора и не используются приложениями (только + другими модулями).</para> + </note> - <tbody> - <row> - <entry><literal>build</literal></entry> + <para>Тип зависимости можно выбрать для каждого компонента + через добавление суффикса, отделенного точкой с запятой. В + случае отсутствия будет использован тип по умолчанию + (смотрите <xref linkend="lua-def-dep-types"/>). Доступные + следующие типы:</para> - <entry>Компонент требуется для построения, эквивалентен - <varname>BUILD_DEPENDS</varname></entry> - </row> + <table frame="none"> + <title>Доступные типы зависимости + <application>Lua</application></title> - <row> - <entry><literal>run</literal></entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <entry>Компонент требуется для запуска, эквивалентен - <varname>RUN_DEPENDS</varname></entry> - </row> + <tbody> + <row> + <entry><literal>build</literal></entry> + <entry>Компонент требуется для построения, эквивалентен + <varname>BUILD_DEPENDS</varname></entry> + </row> - <row> - <entry><literal>lib</literal></entry> + <row> + <entry><literal>run</literal></entry> + <entry>Компонент требуется для запуска, эквивалентен + <varname>RUN_DEPENDS</varname></entry> + </row> - <entry>Компонент требуется для построения и запуска, - эквивалентен <varname>LIB_DEPENDS</varname></entry> - </row> - </tbody> - </tgroup> - </table> + <row> + <entry><literal>lib</literal></entry> + <entry>Компонент требуется для построения и запуска, + эквивалентен <varname>LIB_DEPENDS</varname></entry> + </row> + </tbody> + </tgroup> + </table> - <para>Значения по умолчанию для компонентов подробно рассматриваются - в следующей таблице:</para> + <para>Значения по умолчанию для компонентов подробно + рассматриваются в следующей таблице:</para> - <table xml:id="lua-def-dep-types" frame="none"> - <title>Типы зависимости <application>Lua</application>, - используемые по умолчанию</title> + <table xml:id="lua-def-dep-types" frame="none"> + <title>Типы зависимости <application>Lua</application>, + используемые по умолчанию</title> - <tgroup cols="2"> - <thead> - <row> - <entry>Компонент</entry> + <tgroup cols="2"> + <thead> + <row> + <entry>Компонент</entry> + <entry>Тип зависимости</entry> + </row> + </thead> - <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> - <tbody> - <row> - <entry><literal>lua</literal></entry> + <row> + <entry><literal>tolua</literal></entry> + <entry><literal>build</literal> (статическая)</entry> + </row> - <entry><literal>lib</literal> для <literal>4.0-5.0</literal> - (динамическая) и <literal>build</literal> для - <literal>5.1</literal> (статическая)</entry> - </row> + <row> + <entry><literal>ruby</literal></entry> + <entry><literal>lib</literal> (динамическая)</entry> + </row> + </tbody> + </tgroup> + </table> - <row> - <entry><literal>tolua</literal></entry> + <example xml:id="lua-components-example"> + <title>Выбор компонентов + <application>Lua</application></title> - <entry><literal>build</literal> (статическая)</entry> - </row> + <para>Следующий фрагмент соответствует порту, использующему + <application>Lua</application> версии + <literal>4.0</literal> и привязку к + <application>Ruby</application>.</para> - <row> - <entry><literal>ruby</literal></entry> + <programlisting>USE_LUA= 4.0 +LUA_COMPS= lua ruby</programlisting> + </example> + </sect2> - <entry><literal>lib</literal> (динамическая)</entry> - </row> - </tbody> - </tgroup> - </table> - - <example xml: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 xml:id="lua-version-detection"> - <title>Обнаружение установленных версий</title> + <sect2 xml:id="lua-version-detection"> + <title>Обнаружение установленных версий</title> - <para>Для обнаружения установленной версии вам необходимо задать - переменную <varname>WANT_LUA</varname>. Если вы не присвоите ей - определенную версию, то компоненты получат суффикс версии. - Переменная <varname>HAVE_LUA</varname> будет заполнена после - обнаружения.</para> + <para>Для обнаружения установленной версии вам необходимо + задать переменную <varname>WANT_LUA</varname>. Если вы не + присвоите ей определенную версию, то компоненты получат + суффикс версии. Переменная <varname>HAVE_LUA</varname> будет + заполнена после обнаружения.</para> - <example xml:id="lua-ver-det-example"> - <title>Обнаружение установленных версий и компонентов - <application>Lua</application></title> + <example xml:id="lua-ver-det-example"> + <title>Обнаружение установленных версий и компонентов + <application>Lua</application></title> - <para>Следующий фрагмент можно использовать для порта, использующего - <application>Lua</application>, если она установлена, или был - выбран соответствующий параметр.</para> + <para>Следующий фрагмент можно использовать для порта, + использующего <application>Lua</application>, если она + установлена, или был выбран соответствующий + параметр.</para> - <programlisting>WANT_LUA= yes + <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 +USE_LUA= 5.0-5.1 +CONFIGURE_ARGS+= --enable-lua5 .endif</programlisting> - <para>Следующий фрагмент можно использовать для порта, который - включает поддержку <application>tolua</application>, если - такой компонент установлен, или был выбран соответствующий - параметр в дополнение к <application>Lua</application>, оба - имеют версию <literal>4.0</literal>.</para> + <para>Следующий фрагмент можно использовать для порта, + который включает поддержку + <application>tolua</application>, если такой компонент + установлен, или был выбран соответствующий параметр в + дополнение к <application>Lua</application>, оба имеют + версию <literal>4.0</literal>.</para> - <programlisting>USE_LUA= 4.0 -LUA_COMPS= lua -WANT_LUA= 4.0 + <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 +LUA_COMPS+= tolua +CONFIGURE_ARGS+= --enable-tolua .endif</programlisting> - </example> - </sect2> - - <sect2 xml: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><varname>LUA_VER</varname></entry> - - <entry>Версия <application>Lua</application>, которая будет - использоваться (например, <literal>5.1</literal>)</entry> - </row> - - <row> - <entry><varname>LUA_VER_SH</varname></entry> - - <entry>Старший номер версии динамической библиотеки - <application>Lua</application> (например, - <literal>1</literal>)</entry> - </row> - - <row> - <entry><varname>LUA_VER_STR</varname></entry> - - <entry>Версия <application>Lua</application> без точки - (например, <literal>51</literal>)</entry> - </row> - - <row> - <entry><varname>LUA_PREFIX</varname></entry> - - <entry>Префикс, в который установлена - <application>Lua</application> (и компоненты)</entry> - </row> - - <row> - <entry><varname>LUA_SUBDIR</varname></entry> - - <entry>Каталог под <filename>${PREFIX}/bin</filename>, - <filename>${PREFIX}/share</filename> и - <filename>${PREFIX}/lib</filename>, в который установлена - <application>Lua</application></entry> - </row> - - <row> - <entry><varname>LUA_INCDIR</varname></entry> - - <entry>Каталог, в который установлены заголовочные файлы - <application>Lua</application> и - <application>tolua</application></entry> - </row> - - <row> - <entry><varname>LUA_LIBDIR</varname></entry> - - <entry>Каталог, в который установлены библиотеки - <application>Lua</application> и - <application>tolua</application></entry> - </row> + </example> + </sect2> - <row> - <entry><varname>LUA_MODLIBDIR</varname></entry> + <sect2 xml:id="lua-defined-variables"> + <title>Переменные для определения</title> - <entry>Каталог, в который установлены модули библиотеки - <application>Lua</application> - (<filename>.so</filename>)</entry> - </row> + <para>Следующие переменные доступны в порту (после определения + одной из переменных из + <xref linkend="lua-ver-sel-table"/>).</para> - <row> - <entry><varname>LUA_MODSHAREDIR</varname></entry> + <table frame="none"> + <title>Переменные, определенные для портов, использующих + <application>Lua</application></title> - <entry>Каталог, в который установлены модули - <application>Lua</application> - (<filename>.lua</filename>)</entry> - </row> + <tgroup cols="2"> + <thead> + <row> + <entry>Название</entry> + <entry>Описание</entry> + </row> + </thead> - <row> - <entry><varname>LUA_PKGNAMEPREFIX</varname></entry> + <tbody> + <row> + <entry><varname>LUA_VER</varname></entry> + <entry>Версия <application>Lua</application>, которая + будет использоваться (например, + <literal>5.1</literal>)</entry> + </row> - <entry>Префикс с именем пакета, используемый модулями - <application>Lua</application></entry> - </row> + <row> + <entry><varname>LUA_VER_SH</varname></entry> + <entry>Старший номер версии динамической библиотеки + <application>Lua</application> (например, + <literal>1</literal>)</entry> + </row> - <row> - <entry><varname>LUA_CMD</varname></entry> + <row> + <entry><varname>LUA_VER_STR</varname></entry> + <entry>Версия <application>Lua</application> без точки + (например, <literal>51</literal>)</entry> + </row> - <entry>Путь к интерпретатору - <application>Lua</application></entry> - </row> - - <row> - <entry><varname>LUAC_CMD</varname></entry> - - <entry>Путь к компилятору - <application>Lua</application></entry> - </row> - - <row> - <entry><varname>TOLUA_CMD</varname></entry> + <row> + <entry><varname>LUA_PREFIX</varname></entry> + <entry>Префикс, в который установлена + <application>Lua</application> (и компоненты)</entry> + </row> - <entry>Путь к программе - <application>tolua</application></entry> - </row> - </tbody> - </tgroup> - </table> - - <example xml: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 xml:id="lua-premk"> - <title>Обработка в <filename>bsd.port.pre.mk</filename></title> - - <para>Если вам нужно использовать переменные для запуска команд сразу - после подключения <filename>bsd.port.pre.mk</filename>, для этого - вам нужно определить переменную <varname>LUA_PREMK</varname>.</para> - - <important> - <para>Если вы задаете <varname>LUA_PREMK</varname>, то версия, - зависимости, компоненты и уже заданные переменные не будут - изменены, в случае если вы изменили переменные порта - <application>Lua</application> <emphasis>после</emphasis> - подключения <filename>bsd.port.pre.mk</filename>.</para> - </important> - - <example xml:id="lua-premk-example"> - <title>Использование переменных <application>Lua</application> - в командах</title> - - <para>Следующий фрагмент иллюстрирует использование - <varname>LUA_PREMK</varname> посредством запуска - интерпретатора <application>Lua</application> для того, чтобы - получить строку с полной версией, сохранить ее в переменную - и передать программе.</para> - - <programlisting>USE_LUA= 5.0 -LUA_PREMK= yes + <row> + <entry><varname>LUA_SUBDIR</varname></entry> + <entry>Каталог под <filename>${PREFIX}/bin</filename>, + <filename>${PREFIX}/share</filename> и + <filename>${PREFIX}/lib</filename>, в который + установлена <application>Lua</application></entry> + </row> -.include <bsd.port.pre.mk> + <row> + <entry><varname>LUA_INCDIR</varname></entry> + <entry>Каталог, в который установлены заголовочные + файлы <application>Lua</application> и + <application>tolua</application></entry> + </row> -.if exists(${LUA_CMD}) -VER_STR!= ${LUA_CMD} -v + <row> + <entry><varname>LUA_LIBDIR</varname></entry> + <entry>Каталог, в который установлены библиотеки + <application>Lua</application> и + <application>tolua</application></entry> + </row> -CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}" -.endif</programlisting> - </example> - - <note> - <para>Переменные <application>Lua</application> можно безопасно - использовать в командах внутри целей без необходимости в - использовании <varname>LUA_PREMK</varname>.</para> - </note> - </sect2> - </sect1> - - <sect1 xml:id="using-iconv"> - <title>Использование <command>iconv</command></title> - - <para>После 10-08-2013 (<revnumber>254273</revnumber>) - в составе &os; 10-CURRENT и более новых версий имеется - собственный <command role="port">iconv</command>. В более - ранних версиях дополнительной зависимостью выступал - <package role="port">converters/libiconv</package>.</para> - - <para>Для программного обеспечения, которому нужен - <command>iconv</command>, определите - <literal>USES=iconv</literal>. Версии &os; до - 10-CURRENT от 13-08-2013 (<revnumber>254273</revnumber>) не - имеют собственного <command>iconv</command>. На этих более - ранных версиях будет автоматически добавлена зависимость от - <package role="port">converters/libiconv</package>.</para> - - <para>Когда порт задаёт <literal>USES=iconv</literal>, становятся - доступными следующие переменные:</para> - - <informaltable frame="none" pgwide="0"> - <tgroup cols="4"> - <thead> <row> - <entry>Имя переменной</entry> - <entry>Назначение</entry> - <entry>Значение до &os; 10-CURRENT - <revnumber>254273</revnumber> (13-08-2013)</entry> - <entry>Значение после &os; 10-CURRENT - <revnumber>254273</revnumber> (13-08-2013)</entry> + <entry><varname>LUA_MODLIBDIR</varname></entry> + <entry>Каталог, в который установлены модули библиотеки + <application>Lua</application> + (<filename>.so</filename>)</entry> </row> - </thead> - <tbody> <row> - <entry><varname>ICONV_CMD</varname></entry> - <entry>Каталог размещения двоичного файла - <command>iconv</command></entry> - <entry><literal>${LOCALBASE}/bin/iconv</literal></entry> - <entry><filename>/usr/bin/iconv</filename></entry> + <entry><varname>LUA_MODSHAREDIR</varname></entry> + <entry>Каталог, в который установлены модули + <application>Lua</application> + (<filename>.lua</filename>)</entry> </row> <row> - <entry><varname>ICONV_LIB</varname></entry> - <entry>Аргумент <command>ld</command> для компоновки с - <filename>libiconv</filename> (если нужно)</entry> - <entry><literal>-liconv</literal></entry> - <entry>(пусто)</entry> + <entry><varname>LUA_PKGNAMEPREFIX</varname></entry> + <entry>Префикс с именем пакета, используемый модулями + <application>Lua</application></entry> </row> <row> - <entry><varname>ICONV_PREFIX</varname></entry> - <entry>Каталог размещения реализации - <command>iconv</command> (используется для сценариев - конфигурации)</entry> - <entry><literal>${LOCALBASE}</literal></entry> - <entry><filename>/usr</filename></entry> + <entry><varname>LUA_CMD</varname></entry> + <entry>Путь к интерпретатору + <application>Lua</application></entry> </row> <row> - <entry><varname>ICONV_CONFIGURE_ARG</varname></entry> - <entry>Параметр предварительно собранной конфигурации - для сценариев конфигурации</entry> - <entry><literal>--with-libiconv-prefix=${LOCALBASE}</literal></entry> - <entry>(пусто)</entry> + <entry><varname>LUAC_CMD</varname></entry> + <entry>Путь к компилятору + <application>Lua</application></entry> </row> <row> - <entry><varname>ICONV_CONFIGURE_BASE</varname></entry> - <entry>Параметр предварительно собранной конфигурации - для сценариев конфигурации</entry> - <entry><literal>--with-libiconv=${LOCALBASE}</literal></entry> - <entry>(пусто)</entry> + <entry><varname>TOLUA_CMD</varname></entry> + <entry>Путь к программе + <application>tolua</application></entry> </row> </tbody> </tgroup> - </informaltable> + </table> - <para>В следующих двух примерах демонстрируется автоматическое - присвоение переменным правильных значений для систем, - использующих <package role="port">converters/libiconv</package> - или собственный <command>iconv</command>.</para> + <example xml:id="lua-variables-example"> + <title>Указание для порта, где искать + <application>Lua</application></title> - <example xml:id="iconv-simple-use"> - <title>Простое использование <command>iconv</command></title> + <para>Следующий фрагмент показывает, как сообщить порту, + который использует сценарий configure, где расположены + заголовочные файлы и библиотеки + <application>Lua</application>.</para> - <programlisting>USES= iconv -LDFLAGS+= -L${LOCALBASE}/lib ${ICONV_LIB}</programlisting> + <programlisting>USE_LUA= 4.0 +GNU_CONFIGURE= yes +CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"</programlisting> </example> + </sect2> - <example xml:id="iconv-configure-use"> - <title>Использование <command>iconv</command> с - <command>configure</command></title> + <sect2 xml:id="lua-premk"> + <title>Обработка в <filename>bsd.port.pre.mk</filename></title> - <programlisting>USES= iconv -CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}</programlisting> + <para>Если вам нужно использовать переменные для запуска команд + сразу после подключения <filename>bsd.port.pre.mk</filename>, + для этого вам нужно определить переменную + <varname>LUA_PREMK</varname>.</para> + + <important> + <para>Если вы задаете <varname>LUA_PREMK</varname>, то + версия, зависимости, компоненты и уже заданные переменные + не будут изменены, в случае если вы изменили переменные + порта <application>Lua</application> + <emphasis>после</emphasis> подключения + <filename>bsd.port.pre.mk</filename>.</para> + </important> + + <example xml:id="lua-premk-example"> + <title>Использование переменных + <application>Lua</application> в командах</title> + + <para>Следующий фрагмент иллюстрирует использование + <varname>LUA_PREMK</varname> посредством запуска + интерпретатора <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> - <para>Как показано выше, <varname>ICONV_LIB</varname> имеет - пустое значение с собственным <command>iconv</command>. Эту - особенность можно использовать для обнаружения собственного - <command>iconv</command> с соответствующими действиями.</para> + <note> + <para>Переменные <application>Lua</application> можно + безопасно использовать в командах внутри целей без + необходимости в использовании + <varname>LUA_PREMK</varname>.</para> + </note> + </sect2> + </sect1> + + <sect1 xml:id="using-iconv"> + <title>Использование <command>iconv</command></title> + + <para>После 10-08-2013 (<revnumber>254273</revnumber>) в составе + &os; 10-CURRENT и более новых версий имеется собственный + <command role="port">iconv</command>. В более ранних версиях + дополнительной зависимостью выступал + <package role="port">converters/libiconv</package>.</para> + + <para>Для программного обеспечения, которому нужен + <command>iconv</command>, определите + <literal>USES=iconv</literal>. Версии &os; до 10-CURRENT от + 13-08-2013 (<revnumber>254273</revnumber>) не имеют + собственного <command>iconv</command>. На этих более ранных + версиях будет автоматически добавлена зависимость от + <package role="port">converters/libiconv</package>.</para> + + <para>Когда порт задаёт <literal>USES=iconv</literal>, становятся + доступными следующие переменные:</para> + + <informaltable frame="none" pgwide="0"> + <tgroup cols="4"> + <thead> + <row> + <entry>Имя переменной</entry> + <entry>Назначение</entry> + <entry>Значение до &os; 10-CURRENT + <revnumber>254273</revnumber> (13-08-2013)</entry> + <entry>Значение после &os; 10-CURRENT + <revnumber>254273</revnumber> (13-08-2013)</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>ICONV_CMD</varname></entry> + <entry>Каталог размещения двоичного файла + <command>iconv</command></entry> + <entry><literal>${LOCALBASE}/bin/iconv</literal></entry> + <entry><filename>/usr/bin/iconv</filename></entry> + </row> + + <row> + <entry><varname>ICONV_LIB</varname></entry> + <entry>Аргумент <command>ld</command> для компоновки с + <filename>libiconv</filename> (если нужно)</entry> + <entry><literal>-liconv</literal></entry> + <entry>(пусто)</entry> + </row> + + <row> + <entry><varname>ICONV_PREFIX</varname></entry> + <entry>Каталог размещения реализации + <command>iconv</command> (используется для сценариев + конфигурации)</entry> + <entry><literal>${LOCALBASE}</literal></entry> + <entry><filename>/usr</filename></entry> + </row> + + <row> + <entry><varname>ICONV_CONFIGURE_ARG</varname></entry> + <entry>Параметр предварительно собранной конфигурации для + сценариев конфигурации</entry> + <entry><literal>--with-libiconv-prefix=${LOCALBASE}</literal></entry> + <entry>(пусто)</entry> + </row> + + <row> + <entry><varname>ICONV_CONFIGURE_BASE</varname></entry> + <entry>Параметр предварительно собранной конфигурации для + сценариев конфигурации</entry> + <entry><literal>--with-libiconv=${LOCALBASE}</literal></entry> + <entry>(пусто)</entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>В следующих двух примерах демонстрируется автоматическое + присвоение переменным правильных значений для систем, + использующих <package role="port">converters/libiconv</package> + или собственный <command>iconv</command>.</para> + + <example xml:id="iconv-simple-use"> + <title>Простое использование <command>iconv</command></title> + + <programlisting>USES= iconv +LDFLAGS+= -L${LOCALBASE}/lib ${ICONV_LIB}</programlisting> + </example> + + <example xml:id="iconv-configure-use"> + <title>Использование <command>iconv</command> с + <command>configure</command></title> + + <programlisting>USES= iconv +CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}</programlisting> + </example> - <para>Иногда в программе параметр <command>ld</command> или путь - поиска жёстко заданы в <filename>Makefile</filename> или - сценарии конфигурации. Для решения этой проблемы можно - использовать следующий подход:</para> + <para>Как показано выше, <varname>ICONV_LIB</varname> имеет + пустое значение с собственным <command>iconv</command>. Эту + особенность можно использовать для обнаружения собственного + <command>iconv</command> с соответствующими действиями.</para> - <example xml:id="iconv-reinplace"> - <title>Исправление жёстко заданного - <literal>-liconv</literal></title> + <para>Иногда в программе параметр <command>ld</command> или путь + поиска жёстко заданы в <filename>Makefile</filename> или + сценарии конфигурации. Для решения этой проблемы можно + использовать следующий подход:</para> - <programlisting>USES= iconv + <example xml:id="iconv-reinplace"> + <title>Исправление жёстко заданного + <literal>-liconv</literal></title> + + <programlisting>USES= iconv post-patch: @${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/Makefile</programlisting> - </example> + </example> - <para>В некоторых случаях необходимо установить альтернативные - значения или выполнить операции в случае использования - собственного <command>iconv</command>. Перед проверкой - значения <varname>ICONV_LIB</varname> обязан быть подключён - <filename>bsd.port.pre.mk</filename>:</para> + <para>В некоторых случаях необходимо установить альтернативные + значения или выполнить операции в случае использования + собственного <command>iconv</command>. Перед проверкой + значения <varname>ICONV_LIB</varname> обязан быть подключён + <filename>bsd.port.pre.mk</filename>:</para> - <example xml:id="iconv-conditional"> - <title>Проверка доступности собственного - <command>iconv</command></title> + <example xml:id="iconv-conditional"> + <title>Проверка доступности собственного + <command>iconv</command></title> - <programlisting>USES= iconv + <programlisting>USES= iconv .include <bsd.port.pre.mk> @@ -4527,273 +4470,278 @@ post-patch: .endif .include <bsd.port.post.mk></programlisting> - </example> - </sect1> + </example> + </sect1> - <sect1 xml:id="using-xfce"> - <title>Использование Xfce</title> + <sect1 xml:id="using-xfce"> + <title>Использование Xfce</title> - <para>Переменная <varname>USE_XFCE</varname> используется для - автоматической конфигурации зависимостей для портов, использующих - библиотеки или приложения на основе Xfce, такие как - <package role="port">x11-toolkits/libxfce4gui</package> и - <package role="port">x11-wm/xfce4-panel</package>.</para> + <para>Переменная <varname>USE_XFCE</varname> используется для + автоматической конфигурации зависимостей для портов, + использующих библиотеки или приложения на основе Xfce, такие + как <package role="port">x11-toolkits/libxfce4gui</package> и + <package role="port">x11-wm/xfce4-panel</package>.</para> - <para>В настоящее время распознаются следующие библиотеки и приложения - Xfce:</para> + <para>В настоящее время распознаются следующие библиотеки и + приложения Xfce:</para> - <itemizedlist> - <listitem> - <para>libexo: <package + <itemizedlist> + <listitem> + <para>libexo: <package role="port">x11/libexo</package></para> - </listitem> + </listitem> - <listitem> - <para>libgui: <package + <listitem> + <para>libgui: <package role="port">x11-toolkits/libxfce4gui</package></para> - </listitem> + </listitem> - <listitem> - <para>libutil: <package + <listitem> + <para>libutil: <package role="port">x11/libxfce4util</package></para> - </listitem> + </listitem> - <listitem> - <para>libmcs: <package + <listitem> + <para>libmcs: <package role="port">x11/libxfce4mcs</package></para> - </listitem> + </listitem> - <listitem> - <para>mcsmanager: <package + <listitem> + <para>mcsmanager: <package role="port">sysutils/xfce4-mcs-manager</package></para> - </listitem> + </listitem> - <listitem> - <para>panel: <package + <listitem> + <para>panel: <package role="port">x11-wm/xfce4-panel</package></para> - </listitem> + </listitem> - <listitem> - <para>thunar: <package + <listitem> + <para>thunar: <package role="port">x11-fm/thunar</package></para> - </listitem> + </listitem> - <listitem> - <para>wm: <package + <listitem> + <para>wm: <package role="port">x11-wm/xfce4-wm</package></para> - </listitem> + </listitem> - <listitem> - <para>xfdev: <package + <listitem> + <para>xfdev: <package role="port">dev/xfce4-dev-tools</package></para> - </listitem> - </itemizedlist> - - <para>Распознаются следующие дополнительные параметры:</para> + </listitem> + </itemizedlist> - <itemizedlist> - <listitem> - <para>configenv: Используйте, если ваш порт требует специально - измененного значения <varname>CONFIGURE_ENV</varname> для поиска - требуемых для порта библиотек.</para> + <para>Распознаются следующие дополнительные параметры:</para> - <programlisting>-I${LOCALBASE}/include -L${LOCALBASE}/lib</programlisting> + <itemizedlist> + <listitem> + <para>configenv: Используйте, если ваш порт требует + специально измененного значения + <varname>CONFIGURE_ENV</varname> для поиска требуемых для + порта библиотек.</para> - <para>добавляется в CPPFLAGS к <varname>CONFIGURE_ENV</varname>.</para> - </listitem> - </itemizedlist> + <programlisting>-I${LOCALBASE}/include -L${LOCALBASE}/lib</programlisting> - <para>Следовательно, если у порта имеется зависимость от - <package role="port">sysutils/xfce4-mcs-manager</package>, и - порт требует специальных CPPFLAGS в своем окружении configure, - то синтаксис будет следующим:</para> - - <programlisting>USE_XFCE= mcsmanager configenv</programlisting> - </sect1> - - <sect1 xml:id="using-mozilla"> - <title>Использование Mozilla</title> - - <table frame="none"> - <title>Переменные для портов, использующих Mozilla</title> - - <tgroup cols="2"> - <tbody> - - <row> - <entry><varname>USE_GECKO</varname></entry> - - <entry>Один из бэкэндов Gecko, с которым может работать - порт. Возможные значения: - <literal>libxul</literal> (<filename>libxul.so</filename>), - <literal>seamonkey</literal> (<filename>libgtkembedmoz.so</filename>, - устаревший, больше не должен использоваться).</entry> - </row> - <row> - <entry><varname>USE_FIREFOX</varname></entry> - - <entry>Для запуска порта требуется Firefox. - Возможные значения: - <literal>yes</literal> (берется версия по умолчанию), - <literal>40</literal>, <literal>36</literal>, - <literal>35</literal>. - По умолчанию устанавливает зависимость от версии - <literal>40</literal>.</entry> - </row> - <row> - <entry><varname>USE_FIREFOX_BUILD</varname></entry> - - <entry>Для построения порта требуется Firefox. - Возможные значения: смотрите USE_FIREFOX. - Автоматически устанавливает USE_FIREFOX с присвоением - того же значения.</entry> - </row> - <row> - <entry><varname>USE_SEAMONKEY</varname></entry> - - <entry>Для запуска порта требуется SeaMonkey. - Возможные значения: - <literal>yes</literal> (берется версия по умолчанию), - <literal>20</literal>, <literal>11</literal> - (устарело, больше не должно использоваться). - По умолчанию устанавливает зависимость от версии - <literal>20</literal>.</entry> - </row> - <row> - <entry><varname>USE_SEAMONKEY_BUILD</varname></entry> - - <entry>Для построения порта требуется SeaMonkey. - Возможные значения: смотрите USE_SEAMONKEY. - Автоматически устанавливает USE_SEAMONKEY с присвоением - того же значения.</entry> - </row> - <row> - <entry><varname>USE_THUNDERBIRD</varname></entry> - - <entry>Для запуска порта требуется Thunderbird. - Возможные значения: - <literal>yes</literal> (берется версия по умолчанию), - <literal>31</literal>, <literal>30</literal> - (устарело, больше не должно использоваться). - По умолчанию устанавливает зависимость от версии - <literal>31</literal>.</entry> - </row> - <row> - <entry><varname>USE_THUNDERBIRD_BUILD</varname></entry> - - <entry>Для построения порта требуется Thunderbird. - Возможные значения: смотрите USE_THUNDERBIRD. - Автоматически устанавливает USE_THUNDERBIRD с присвоением - того же значения.</entry> - </row> - - </tbody> - </tgroup> - </table> - <para>Полный перечень доступных переменных можно получить в файле - <filename>/usr/ports/Mk/bsd.gecko.mk</filename>.</para> - </sect1> - - <sect1 xml:id="using-databases"> - <title>Использование баз данных</title> - - <table frame="none"> - <title>Переменные для портов, использующих базы данных</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>USE_BDB</varname></entry> - - <entry>Если переменная установлена в <literal>yes</literal>, - добавляет зависимость от порта - <package role="port">databases/db41</package>. - Также переменной можно присвоить значения: 2, 3, 40, 41, - 42, 43, 44, 46, 47, 48 или 51. Вы можете объявить диапазон - принимаемых значений, <varname>USE_BDB</varname>=42+ - будет искать установленную версию с наибольшим номером, - и, если ничего не установлено, вернется к 42.</entry> - </row> - - <row> - <entry><varname>USE_MYSQL</varname></entry> - - <entry>Если переменная установлена в <literal>yes</literal>, - добавляет зависимость от порта - <package role="port">databases/mysql55-client</package>. - Как связанная переменная, - <varname>WANT_MYSQL_VER</varname> может быть установлена - в значение 323, 40, 41, 50, 51, 52, 55 или 60.</entry> - </row> - - <row> - <entry><varname>USE_PGSQL</varname></entry> - - <entry>Если установлена в <literal>yes</literal>, добавляет - зависимость от порта <package role="port">databases/postgresql90-client</package>. - Как связанная переменная, - <varname>WANT_PGSQL_VER</varname> может быть установлена - в значение 83, 84, 90, 91 или 92. Вы можете указать - максимальное и минимальное значения; - <varname>WANT_PGSQL_VER</varname>= - <literal> 90+</literal> сделает порт зависимым от - минимальной версии 9.0.</entry> - </row> - - <row> - <entry><varname>USE_SQLITE</varname></entry> - - <entry>Если переменная имеет значение <literal>yes</literal>, - добавляет зависимость от порта <package role="port">databases/sqlite3</package>. - Переменная может принимать значения: 3, 2.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Подробнее смотрите в <link xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.database.mk?view=markup">bsd.database.mk</link>.</para> - </sect1> - - <sect1 xml:id="rc-scripts"> - <title>Запуск и остановка служб (сценарии <literal>rc</literal>)</title> - - <para>Сценарии <filename>rc.d</filename> используются для запуска служб - при запуске системы и дают администратору стандартный способ - остановки, запуска и перезапуска службы. Порты интегрируются в - системную инфраструктуру <filename>rc.d</filename>. Подробности - по её использованию можно найти в <link xlink:href="&url.books.handbook;/configtuning-rcd.html">главе rc.d - Руководства</link>. Подробное объяснение доступных команд - находится в &man.rc.8; и &man.rc.subr.8;. Наконец, есть <link xlink:href="&url.articles.rc-scripting;">статья</link>о практических - аспектах написания сценариев <filename>rc.d</filename>.</para> - - <para>Установить можно один или более сценариев - <filename>rc.d</filename>:</para> - - <programlisting>USE_RC_SUBR= doormand</programlisting> - - <para>Сценарии обязаны размещаться в подкаталоге - <filename>files</filename> с обязательным добавлением суффикса - <literal>.in</literal> к имени файла. Для этого файла будут - использоваться стандартные расширения <varname>SUB_LIST</varname>. - Также особенно приветствуется использование расширений - <literal>%%PREFIX%%</literal> и <literal>%%LOCALBASE%%</literal>. - Подробнее о <varname>SUB_LIST</varname> в <link linkend="using-sub-files">соответствующей главе</link>.</para> - - <para>Начиная с &os; 6.1-RELEASE локальные сценарии - <filename>rc.d</filename> (включая установленные из портов) включены - в общий &man.rcorder.8; основной системы.</para> - - <para>Пример простого сценария <filename>rc.d</filename>:</para> - - <programlisting>#!/bin/sh + <para>добавляется в CPPFLAGS к + <varname>CONFIGURE_ENV</varname>.</para> + </listitem> + </itemizedlist> + + <para>Следовательно, если у порта имеется зависимость от <package + role="port">sysutils/xfce4-mcs-manager</package>, и порт + требует специальных CPPFLAGS в своем окружении configure, то + синтаксис будет следующим:</para> + + <programlisting>USE_XFCE= mcsmanager configenv</programlisting> + </sect1> + + <sect1 xml:id="using-mozilla"> + <title>Использование Mozilla</title> + + <table frame="none"> + <title>Переменные для портов, использующих Mozilla</title> + + <tgroup cols="2"> + <tbody> + + <row> + <entry><varname>USE_GECKO</varname></entry> + <entry>Один из бэкэндов Gecko, с которым может работать + порт. Возможные значения: <literal>libxul</literal> + (<filename>libxul.so</filename>), + <literal>seamonkey</literal> + (<filename>libgtkembedmoz.so</filename>, устаревший, + больше не должен использоваться).</entry> + </row> + + <row> + <entry><varname>USE_FIREFOX</varname></entry> + <entry>Для запуска порта требуется Firefox. Возможные + значения: <literal>yes</literal> (версия по умолчанию), + <literal>40</literal>, <literal>36</literal>, + <literal>35</literal>. По умолчанию устанавливает + зависимость от версии <literal>40</literal>.</entry> + </row> + + <row> + <entry><varname>USE_FIREFOX_BUILD</varname></entry> + <entry>Для построения порта требуется Firefox. Возможные + значения: смотрите USE_FIREFOX. Автоматически + устанавливает USE_FIREFOX с присвоением того же + значения.</entry> + </row> + + <row> + <entry><varname>USE_SEAMONKEY</varname></entry> + <entry>Для запуска порта требуется SeaMonkey. Возможные + значения: <literal>yes</literal> (версия по умолчанию), + <literal>20</literal>, <literal>11</literal> (устарело, + больше не должно использоваться). По умолчанию + устанавливает зависимость от версии + <literal>20</literal>.</entry> + </row> + + <row> + <entry><varname>USE_SEAMONKEY_BUILD</varname></entry> + <entry>Для построения порта требуется SeaMonkey. + Возможные значения: смотрите USE_SEAMONKEY. + Автоматически устанавливает USE_SEAMONKEY с присвоением + того же значения.</entry> + </row> + + <row> + <entry><varname>USE_THUNDERBIRD</varname></entry> + <entry>Для запуска порта требуется Thunderbird. + Возможные значения: <literal>yes</literal> (версия по + умолчанию), <literal>31</literal>, + <literal>30</literal> (устарело, больше не должно + использоваться). По умолчанию устанавливает + зависимость от версии <literal>31</literal>.</entry> + </row> + + <row> + <entry><varname>USE_THUNDERBIRD_BUILD</varname></entry> + <entry>Для построения порта требуется Thunderbird. + Возможные значения: смотрите USE_THUNDERBIRD. + Автоматически устанавливает USE_THUNDERBIRD с + присвоением того же значения.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Полный перечень доступных переменных можно получить в файле + <filename>/usr/ports/Mk/bsd.gecko.mk</filename>.</para> + </sect1> + + <sect1 xml:id="using-databases"> + <title>Использование баз данных</title> + + <table frame="none"> + <title>Переменные для портов, использующих базы данных</title> + + <tgroup cols="2"> + <thead> + <row> + <entry>Переменная</entry> + <entry>Значение</entry> + </row> + </thead> + + <tbody> + <row> + <entry><varname>USE_BDB</varname></entry> + <entry>Если переменная установлена в + <literal>yes</literal>, добавляет зависимость от порта + <package role="port">databases/db41</package>. Также + переменной можно присвоить значения: 2, 3, 40, 41, 42, + 43, 44, 46, 47, 48 или 51. Вы можете объявить диапазон + принимаемых значений, <varname>USE_BDB</varname>=42+ + будет искать установленную версию с наибольшим номером, + и, если ничего не установлено, вернется к 42.</entry> + </row> + + <row> + <entry><varname>USE_MYSQL</varname></entry> + <entry>Если переменная установлена в + <literal>yes</literal>, добавляет зависимость от порта + <package + role="port">databases/mysql55-client</package>. Как + связанная переменная, <varname>WANT_MYSQL_VER</varname> + может быть установлена в значение 323, 40, 41, 50, 51, + 52, 55 или 60.</entry> + </row> + + <row> + <entry><varname>USE_PGSQL</varname></entry> + <entry>Если установлена в <literal>yes</literal>, + добавляет зависимость от порта <package + role="port">databases/postgresql90-client</package>. + Как связанная переменная, + <varname>WANT_PGSQL_VER</varname> может быть + установлена в значение 83, 84, 90, 91 или 92. Вы + можете указать максимальное и минимальное значения; + <varname>WANT_PGSQL_VER</varname>= + <literal> 90+</literal> сделает порт зависимым от + минимальной версии 9.0.</entry> + </row> + + <row> + <entry><varname>USE_SQLITE</varname></entry> + <entry>Если переменная имеет значение + <literal>yes</literal>, добавляет зависимость от порта + <package role="port">databases/sqlite3</package>. + Переменная может принимать значения: 3, 2.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Подробнее смотрите в <link + xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.database.mk?view=markup">bsd.database.mk</link>.</para> + </sect1> + + <sect1 xml:id="rc-scripts"> + <title>Запуск и остановка служб (сценарии + <literal>rc</literal>)</title> + + <para>Сценарии <filename>rc.d</filename> используются для запуска + служб при запуске системы и дают администратору стандартный + способ остановки, запуска и перезапуска службы. Порты + интегрируются в системную инфраструктуру + <filename>rc.d</filename>. Подробности по её использованию + можно найти в <link + xlink:href="&url.books.handbook;/configtuning-rcd.html">главе + rc.d Руководства</link>. Подробное объяснение доступных + команд находится в &man.rc.8; и &man.rc.subr.8;. Наконец, есть + <link xlink:href="&url.articles.rc-scripting;">статья</link>о + практических аспектах написания сценариев + <filename>rc.d</filename>.</para> + + <para>Установить можно один или более сценариев + <filename>rc.d</filename>:</para> + + <programlisting>USE_RC_SUBR= doormand</programlisting> + + <para>Сценарии обязаны размещаться в подкаталоге + <filename>files</filename> с обязательным добавлением суффикса + <literal>.in</literal> к имени файла. Для этого файла будут + использоваться стандартные расширения + <varname>SUB_LIST</varname>. Также особенно приветствуется + использование расширений <literal>%%PREFIX%%</literal> и + <literal>%%LOCALBASE%%</literal>. Подробнее о + <varname>SUB_LIST</varname> в <link + linkend="using-sub-files">соответствующей + главе</link>.</para> + + <para>Начиная с &os; 6.1-RELEASE локальные сценарии + <filename>rc.d</filename> (включая установленные из портов) + включены в общий &man.rcorder.8; основной системы.</para> + + <para>Пример простого сценария <filename>rc.d</filename>:</para> + + <programlisting>#!/bin/sh # $FreeBSD$ # @@ -4801,19 +4749,13 @@ post-patch: # 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. +# Set it to YES to enable doorman. # doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf # by default. -# . /etc/rc.subr @@ -4832,229 +4774,239 @@ 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>и тогда произойдет - неуместная подстановка переменной с использованием ":=", - что переопределит намерения пользователя. Переменная - <literal>_enable</literal> является обязательной; значением - по умолчанию должно быть ":".</para> - - <sect2> - <title>Контрольный список перед внесением изменений</title> - - <para>Перед тем, как отсылать порт со сценарием - <filename>rc.d</filename>, и тем более перед его коммитом, - сверьтесь со следующим контрольным списком, чтобы убедиться, - что порт для этого готов.</para> - - <para>Большинство из этих проверок умеет выполнять порт - <package role="port">devel/rclint</package>, но это не - является заменой надлежащему просмотру.</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: &os;</literal>. Это перестало быть - нужным и нежелательно уже много лет. Это также служит - индикатором того, что новый сценарий был скопирован со - старого, поэтому особое внимание должно быть уделено при - проверке.</para> - </step> - - <step> - <para>Если сценарий использует интерпретируемый язык, такой - как <command>perl</command>, <command>python</command> или - <command>ruby</command>, то убедитесь, что значение - <varname>command_interpreter</varname> установлено - должным образом. В противном случае</para> - - <screen>&prompt.root; <userinput>service name 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 xml: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> - переменные <varname>USERS</varname> и <varname>GROUPS</varname>, - и пользователь автоматические создастся при установке порта.</para> - - <para>Текущий перечень зарезервированных UID и GID находится в - <filename>ports/UIDs</filename> и <filename>ports/GIDs</filename>. - </para> - - </sect1> - - <sect1 xml:id="requiring-kernel-sources"> - <title>Порты, требующие наличия исходных текстов ядра</title> - - <para>Некоторым портам (таким как загружаемые модули ядра) для - компиляции нужны файлы с исходными текстами ядра. Ниже указан - корректный способ определения, установлены ли они пользователем:</para> - - <programlisting>USES= kmod</programlisting> - - <para>Кроме этой проверки, <literal>kmod</literal> заботится о - большинстве пунктов, которые должны учитываться в этих - портах.</para> - </sect1> - - </chapter> - + <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>и тогда произойдет неуместная подстановка переменной с + использованием ":=", что переопределит намерения + пользователя. Переменная <literal>_enable</literal> является + обязательной; значением по умолчанию должно быть + ":".</para> + + <sect2> + <title>Контрольный список перед внесением изменений</title> + + <para>Перед тем, как отсылать порт со сценарием + <filename>rc.d</filename>, и тем более перед его коммитом, + сверьтесь со следующим контрольным списком, чтобы убедиться, + что порт для этого готов.</para> + + <para>Большинство из этих проверок умеет выполнять порт + <package role="port">devel/rclint</package>, но это не + является заменой надлежащему просмотру.</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: &os;</literal>. Это перестало быть + нужным и нежелательно уже много лет. Это также служит + индикатором того, что новый сценарий был скопирован со + старого, поэтому особое внимание должно быть уделено при + проверке.</para> + </step> + + <step> + <para>Если сценарий использует интерпретируемый язык, такой + как <command>perl</command>, <command>python</command> + или <command>ruby</command>, то убедитесь, что значение + <varname>command_interpreter</varname> установлено + должным образом. В противном случае</para> + + <screen>&prompt.root; <userinput>service name 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 xml: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> переменные + <varname>USERS</varname> и <varname>GROUPS</varname>, и + пользователь автоматически создастся при установке + порта.</para> + + <programlisting>USERS= pulse +GROUPS= pulse pulse-access pulse-rt</programlisting> + + <para>Текущий перечень зарезервированных UID и GID находится в + <filename>ports/UIDs</filename> и + <filename>ports/GIDs</filename>.</para> + </sect1> + + <sect1 xml:id="requiring-kernel-sources"> + <title>Порты, требующие наличия исходных текстов ядра</title> + + <para>Некоторым портам (таким как загружаемые модули ядра) для + компиляции нужны файлы с исходными текстами ядра. Ниже указан + корректный способ определения, установлены ли они + пользователем:</para> + + <programlisting>USES= kmod</programlisting> + + <para>Кроме этой проверки, <literal>kmod</literal> заботится о + большинстве пунктов, которые должны учитываться в этих + портах.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml index 9dd6dd5b88..8ee56732a5 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/testing/chapter.xml @@ -7,191 +7,208 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="testing"> - - <title>Тестирование вашего порта</title> - - <sect1 xml:id="make-describe"> - <title>Запуск <command>make describe</command></title> - - <para>Некоторые утилиты &os; для сопровождения портов, например, - &man.portupgrade.1;, опираются на базу данных с именем - <filename>/usr/ports/INDEX</filename>, в которой отслеживаются такие - характеристики портов, как их зависимости. Файл - <filename>INDEX</filename> создаётся при помощи - <filename>ports/Makefile</filename> верхнего уровня по команде - <command>make index</command>, спускающейся в подкаталог каждого - порта и выполняющей в нём <command>make describe</command>. Таким - образом, если выполнение <command>make describe</command> с - каким-либо портом завершится неудачно, то никому не удастся создать - <filename>INDEX</filename>, при этом много людей вскоре станут - несчастны.</para> - - <note> - <para>Возможность генерировать этот файл очень важна вне зависимости - от того, какие параметры присутствуют в - <filename>make.conf</filename>, поэтому, пожалуйста, избегайте, - таких вещей, как использование декларации - <literal>.error</literal>, когда (к примеру) требования к - зависимости не было удовлетворено. (Смотрите - <xref linkend="dads-dot-error"/>.)</para> - </note> - - <para>Если команда <command>make describe</command> выдаёт строчку, а - не ошибку, то для вас это пройдёт безболезненно. Обратитесь к файлу - <filename>bsd.port.mk</filename>, чтобы выяснить значение выдаваемых - строк.</para> - - <para>Заметьте также, что запуск последней версии - <command>portlint</command> (как указано в следующем разделе) - приведёт к автоматическому запуску команды - <command>make describe</command>.</para> - </sect1> - - <sect1 xml:id="testing-portlint"> - <title>Portlint</title> - - <para>Проверьте свою работу командой <link linkend="porting-portlint"><command>portlint</command></link> - перед тем, как её отослать или перенести в дерево портов. - <command>portlint</command> предупреждает вас о многих - распространённых ошибках, как функциональных, так и стилистических. - Для нового (или скопированного внутри хранилища) порта самым - подходящим является запуск <command>portlint -A</command>; для - уже существующего порта достаточно будет запустить - <command>portlint -C</command>.</para> - - <para>Так как для обнаружения ошибок <command>portlint</command> - использует эвристические методы, то им могут выдаваться и ошибочные - предупреждения. Кроме того, время от времени нечто, отмечаемое как - некорректность, из-за ограничений механизма создания портов не может - быть сделано никак иначе. Если вы сомневаетесь, то лучше всего - спросить в &a.ports;.</para> - </sect1> - - <sect1 xml:id="testing-porttools"> - <title>Port Tools</title> - - <para>Программа <package role="port">ports-mgmt/porttools</package> - входит в состав Коллекции Портов.</para> - - <para><command>port</command> является сценарием переднего плана, - который может упростить вам задачу тестирования. Если вы хотите - проверить новый порт или обновить существующий, то вы можете - использовать <command>port test</command> для проверки вашего порта, - включая проверку <link linkend="testing-portlint"><command>portlint</command></link>. Эта - команда также находит и отображает любые файлы, которые невключенные - в <filename>pkg-plist</filename>. Смотрите следующий пример:</para> - - <screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen> - </sect1> - - <sect1 xml:id="porting-prefix"> - <title><varname>PREFIX</varname> и <varname>DESTDIR</varname></title> - - <para>Переменная <varname>PREFIX</varname> определяет, куда будет - установлен порт. По умолчанию это <filename>/usr/local</filename>, - но может меняться пользователем на собственный путь, такой как - <filename>/opt</filename>. В вашем порту значение этой переменной - должно учитываться.</para> - - <para>Если пользователь установил переменную <varname>DESTDIR</varname>, - то она определяет полное альтернативное окружение, обычно, это jail - или установленная система, смонтированная в месте, отличном от - <filename>/</filename>. На самом деле порт устанавливается в - <filename>DESTDIR/PREFIX</filename> - и регистрируется в базе данных пакетов в - <filename>DESTDIR/var/db/pkg</filename>. - Поскольку управление <varname>DESTDIR</varname> производится - автоматически инфраструктурой портов с помощью &man.chroot.8;, вам - не нужны никакие изменения или проявление особой осторожности - при написании <varname>DESTDIR</varname>-совместимых портов.</para> - - <para>Значение переменной <varname>PREFIX</varname> будет установлено - в <varname>LOCALBASE</varname> (по умолчанию - <filename>/usr/local</filename>). Если - задана переменная <varname>USE_LINUX_PREFIX</varname>, то - <varname>PREFIX</varname> примет значение <varname>LINUXBASE</varname> - (по умолчанию <filename>/compat/linux</filename>).</para> - - <para>Избегание явно прописываемых путей <filename>/usr/local</filename> - в исходном коде сделает порт гораздо более гибким и способным - удовлетворить потребности других серверов. Часто этого можно - добиться простой заменой строк <filename>/usr/local</filename> - в различных файлах <filename>Makefile</filename> внутри порта на - <literal>${PREFIX}</literal>. Эта переменная - автоматически передаётся далее на каждом этапе построения и - установки.</para> - - <para>Проверьте, что ваше приложение не устанавливает чего-либо в - каталог <filename>/usr/local</filename> вместо - <varname>PREFIX</varname>. Наличие явно указанных путей можно быстро - проверить следующим образом:</para> - - <screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen> - - <para>Если что-то было установлено за пределами - <varname>PREFIX</varname>, то процесс создания пакета сообщит об - отсутствии файлов.</para> - - <para>Это также стоит проверить с использованием поддержки - каталога сборки (смотрите <xref linkend="staging"/>):</para> - - <screen>&prompt.root; <userinput>make stage && make check-orphans && make package</userinput></screen> - - <para>Эти проверки не найдут явно указанных путей внутри файлов порта - и не проверят корректность использования <varname>LOCALBASE</varname> - в качестве ссылки на файлы из других портов. Порт, временно - установленный в <filename>/var/tmp/`make -V PORTNAME`</filename>, - следует проверять на работоспособность, чтобы убедиться в отсутствии - проблем с путями.</para> - - <para>Переменная <varname>PREFIX</varname> не должна задаваться явно в - файле <filename>Makefile</filename> порта. Пользователи при установке - порта могут задать в <varname>PREFIX</varname> свое собственное - место, и порт должен учитывать это значение.</para> - - <para>Обратитесь к программам/файлам из других портов с - переменными, перечисленными выше, без указания явных маршрутов. - Например, если ваш порт требует, чтобы макрос <literal>PAGER</literal> - являлся полным путем утилиты <command>less</command>, не используйте - строковый путь <filename>/usr/local/bin/less</filename>. Вместо - этого используйте <literal>${LOCALBASE}</literal>:</para> - - <programlisting>-DPAGER=\"${LOCALBASE}/bin/less\"</programlisting> - - <para>Путь с использованием <varname>LOCALBASE</varname> имеет больше - шансов оставаться работоспособным, если системный администратор - переместил всё дерево <filename>/usr/local</filename> куда-то в другое - место.</para> - </sect1> - - <sect1 xml:id="testing-tinderbox"> - <title>Tinderbox</title> - - <para>Если вы алчный контрибутор портов, то вы можете захотеть - взглянуть на <application>Tinderbox</application>. Это мощная - система построения и тестирования портов. - <application>Tinderbox</application> можно установить, используя - порт <package role="port">ports-mgmt/tinderbox</package>. - Обязательно прочитайте поставляемую документацию, поскольку - конфигурация не является тривиальной.</para> - - <para>Для получения подробностей посетите - <link xlink:href="http://tinderbox.marcuscom.com/">вебсайт Tinderbox</link>.</para> - </sect1> - - <sect1 xml:id="testing-poudriere"> - <title>Poudriere</title> - - <para>Если вы контрибутор портов, подумайте об установке - <application>poudriere</application>. Это мощная система - для построения и тестирования портов. - <application>Poudriere</application> можно установить из - <package role="port">ports-mgmt/poudriere</package>.</para> - - <para>Для получения подробной информации посетите <link - xlink:href="http://fossil.etoilebsd.net/poudriere">вебсайт - Poudriere</link>.</para> - </sect1> - </chapter> - +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="testing"> + + <title>Тестирование вашего порта</title> + + <sect1 xml:id="make-describe"> + <title>Запуск <command>make describe</command></title> + + <para>Некоторые утилиты &os; для сопровождения портов, например, + &man.portupgrade.1;, опираются на базу данных с именем + <filename>/usr/ports/INDEX</filename>, в которой отслеживаются + такие характеристики портов, как их зависимости. Файл + <filename>INDEX</filename> создаётся при помощи + <filename>ports/Makefile</filename> верхнего уровня по команде + <command>make index</command>, спускающейся в подкаталог + каждого порта и выполняющей в нём <command>make + describe</command>. Таким образом, если выполнение + <command>make describe</command> с каким-либо портом завершится + неудачно, то никому не удастся создать + <filename>INDEX</filename>, при этом много людей вскоре станут + несчастны.</para> + + <note> + <para>Возможность генерировать этот файл очень важна вне + зависимости от того, какие параметры присутствуют в + <filename>make.conf</filename>, поэтому, пожалуйста, + избегайте, таких вещей, как использование декларации + <literal>.error</literal>, когда (к примеру) требования к + зависимости не было удовлетворено. (Смотрите + <xref linkend="dads-dot-error"/>.)</para> + </note> + + <para>Если <command>make describe</command> выдаёт строчку, а не + ошибку, то для вас это пройдёт безболезненно. Обратитесь к + файлу <filename>bsd.port.mk</filename>, чтобы выяснить значение + выдаваемых строк.</para> + + <para>Заметьте также, что запуск последней версии + <command>portlint</command> (как указано в следующем разделе) + приведёт к автоматическому запуску команды + <command>make describe</command>.</para> + </sect1> + + <sect1 xml:id="testing-portlint"> + <title>Portlint</title> + + <para>Проверьте свою работу командой <link + linkend="porting-portlint"><command>portlint</command></link> + перед тем, как её отослать или перенести в дерево портов. + <command>portlint</command> предупреждает вас о многих + распространённых ошибках, как функциональных, так и + стилистических. Для нового (или скопированного внутри + хранилища) порта самым подходящим является запуск + <command>portlint -A</command>; для уже существующего порта + достаточно будет запустить + <command>portlint -C</command>.</para> + + <para>Так как для обнаружения ошибок <command>portlint</command> + использует эвристические методы, то им могут выдаваться и + ошибочные предупреждения. Кроме того, время от времени нечто, + отмечаемое как некорректность, из-за ограничений механизма + создания портов не может быть сделано никак иначе. Если вы + сомневаетесь, то лучше всего спросить в &a.ports;.</para> + </sect1> + + <sect1 xml:id="testing-porttools"> + <title>Port Tools</title> + + <para>Программа <package + role="port">ports-mgmt/porttools</package> входит в состав + Коллекции Портов.</para> + + <para><command>port</command> является сценарием переднего плана, + который может упростить вам задачу тестирования. Если вы + хотите проверить новый порт или обновить существующий, то вы + можете использовать <command>port test</command> для проверки + вашего порта, включая проверку <link + linkend="testing-portlint"><command>portlint</command></link>. + Эта команда также находит и отображает любые файлы, которые + невключенные в <filename>pkg-plist</filename>. Смотрите + следующий пример:</para> + + <screen>&prompt.root; <userinput>port test /usr/ports/net/csup</userinput></screen> + </sect1> + + <sect1 xml:id="porting-prefix"> + <title><varname>PREFIX</varname> и + <varname>DESTDIR</varname></title> + + <para>Переменная <varname>PREFIX</varname> определяет, куда будет + установлен порт. По умолчанию это + <filename>/usr/local</filename>, но может меняться + пользователем на собственный путь, такой как + <filename>/opt</filename>. В вашем порту значение этой + переменной должно учитываться.</para> + + <para>Если пользователь установил переменную + <varname>DESTDIR</varname>, то она определяет полное + альтернативное окружение, обычно, это jail или установленная + система, смонтированная в месте, отличном от + <filename>/</filename>. На самом деле порт устанавливается в + <filename>DESTDIR/PREFIX</filename> и регистрируется в базе + данных пакетов в <filename>DESTDIR/var/db/pkg</filename>. + Поскольку управление <varname>DESTDIR</varname> производится + автоматически инфраструктурой портов с помощью &man.chroot.8;, + вам не нужны никакие изменения или проявление особой + осторожности при написании портов, совместымых с + <varname>DESTDIR</varname>.</para> + + <para>Значение переменной <varname>PREFIX</varname> будет + установлено в <varname>LOCALBASE</varname> (по умолчанию + <filename>/usr/local</filename>). Если задана переменная + <varname>USE_LINUX_PREFIX</varname>, то + <varname>PREFIX</varname> примет значение + <varname>LINUXBASE</varname> (по умолчанию + <filename>/compat/linux</filename>).</para> + + <para>Избегание явно прописываемых путей + <filename>/usr/local</filename> в исходном коде сделает порт + гораздо более гибким и способным удовлетворить потребности + других серверов. Часто этого можно добиться простой заменой + строк <filename>/usr/local</filename> в различных файлах + <filename>Makefile</filename> внутри порта на + <literal>${PREFIX}</literal>. Эта переменная + автоматически передаётся далее на каждом этапе построения и + установки.</para> + + <para>Проверьте, что ваше приложение не устанавливает чего-либо в + каталог <filename>/usr/local</filename> вместо + <varname>PREFIX</varname>. Наличие явно указанных путей можно + быстро проверить следующим образом:</para> + + <screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`</userinput></screen> + + <para>Если что-то было установлено за пределами + <varname>PREFIX</varname>, то процесс создания пакета сообщит + об отсутствии файлов.</para> + + <para>Это также стоит проверить с использованием поддержки + каталога сборки (смотрите <xref linkend="staging"/>):</para> + + <screen>&prompt.root; <userinput>make stage && make check-orphans && make package</userinput></screen> + + <para>Эти проверки не найдут явно указанных путей внутри файлов + порта и не проверят корректность использования + <varname>LOCALBASE</varname> в качестве ссылки на файлы из + других портов. Порт, временно установленный в + <filename>/var/tmp/`make -V PORTNAME`</filename>, следует + проверять на работоспособность, чтобы убедиться в отсутствии + проблем с путями.</para> + + <para>Переменная <varname>PREFIX</varname> не должна задаваться + явно в файле <filename>Makefile</filename> порта. Пользователи + при установке порта могут задать в <varname>PREFIX</varname> + свое собственное место, и порт должен учитывать это + значение.</para> + + <para>Обратитесь к программам/файлам из других портов с + переменными, перечисленными выше, без указания явных маршрутов. + Например, если ваш порт требует, чтобы макрос + <literal>PAGER</literal> являлся полным путем утилиты + <command>less</command>, не используйте строковый путь + <filename>/usr/local/bin/less</filename>. Вместо этого + используйте <literal>${LOCALBASE}</literal>:</para> + + <programlisting>-DPAGER=\"${LOCALBASE}/bin/less\"</programlisting> + + <para>Путь с использованием <varname>LOCALBASE</varname> имеет + больше шансов оставаться работоспособным, если системный + администратор переместил всё дерево + <filename>/usr/local</filename> куда-то в другое место.</para> + </sect1> + + <sect1 xml:id="testing-tinderbox"> + <title>Tinderbox</title> + + <para>Если вы алчный контрибутор портов, то вы можете захотеть + взглянуть на <application>Tinderbox</application>. Это мощная + система построения и тестирования портов. + <application>Tinderbox</application> можно установить, + используя порт <package + role="port">ports-mgmt/tinderbox</package>. Обязательно + прочитайте поставляемую документацию, поскольку конфигурация не + является тривиальной.</para> + + <para>Для получения подробностей посетите <link + xlink:href="http://tinderbox.marcuscom.com/">вебсайт + Tinderbox</link>.</para> + </sect1> + + <sect1 xml:id="testing-poudriere"> + <title>Poudriere</title> + + <para>Если вы контрибутор портов, подумайте об установке + <application>poudriere</application>. Это мощная система для + построения и тестирования портов. + <application>Poudriere</application> можно установить из + <package role="port">ports-mgmt/poudriere</package>.</para> + + <para>Для получения подробной информации посетите <link + xlink:href="http://fossil.etoilebsd.net/poudriere">вебсайт + Poudriere</link>.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml index 7372064ce5..3d49959628 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/upgrading/chapter.xml @@ -7,294 +7,305 @@ Original revision: r43840 --> -<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="port-upgrading"> - - <title>Обновление отдельного порта</title> - - <para>Если вы заметите, что ваш порт устарел по сравнению с последней - авторской версией, первым делом вы должны получить самую - последнюю версия порта. Вы можете найти их в каталоге - <filename>ports/ports-current</filename> на зеркальных FTP-серверах &os;. - Однако если вы работаете с достаточно большим количеством портов, - наверное, будет проще использовать - <application>Subversion</application> или &man.portsnap.8; для - поддержания всей коллекции портов в актуальном состоянии, как это - описано в <link xlink:href="&url.books.handbook;/ports-using.html"> - Руководстве</link>. К тому же это даст возможность отслеживать все - зависимости портов.</para> - - <para>На следующем шаге необходимо выяснить, нет ожидает ли уже это - обновление своей очереди. Для этого у вас есть две возможности. - Существует интерфейс к <link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе - данных сообщений о проблемах FreeBSD (PR)</link> (известной также как - <literal>GNATS</literal>) с поисковыми возможностями. Выберите из - выпадающего списка <literal>ports</literal> и введите название - порта.</para> - - <para>Однако иногда люди забывают поместить название порта в поле - Synopsis в точном виде. В таком случае вы можете воспользоваться - <link linkend="portsmon">Системой мониторинга портов &os;</link> - (которая известна также как - <literal>portsmon</literal>). В рамках этой системы делается попытка - классифицировать PR, касающиеся портов, по имени порта. Для поиска - PR, относящихся к определённому порту, используйте механизм <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Просмотра +<chapter xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" + xml:id="port-upgrading"> + + <title>Обновление отдельного порта</title> + + <para>Если вы заметите, что ваш порт устарел по сравнению с + последней авторской версией, первым делом вы должны получить + самую последнюю версия порта. Вы можете найти их в каталоге + <filename>ports/ports-current</filename> на зеркальных + FTP-серверах &os;. Однако если вы работаете с достаточно большим + количеством портов, наверное, будет проще использовать + <application>Subversion</application> или &man.portsnap.8; для + поддержания всей коллекции портов в актуальном состоянии, как это + описано в <link + xlink:href="&url.books.handbook;/ports-using.html">Руководстве</link>. + К тому же это даст возможность отслеживать все зависимости + портов.</para> + + <para>На следующем шаге необходимо выяснить, нет ожидает ли уже это + обновление своей очереди. Для этого у вас есть две возможности. + Существует интерфейс к <link + xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе + данных сообщений о проблемах FreeBSD (PR)</link> (известной + также как <literal>GNATS</literal>) с поисковыми возможностями. + Выберите из выпадающего списка <literal>ports</literal> и введите + название порта.</para> + + <para>Однако иногда люди забывают поместить название порта в поле + Synopsis в точном виде. В таком случае вы можете воспользоваться + <link linkend="portsmon">Системой мониторинга портов &os;</link> + (которая известна также как <literal>portsmon</literal>). В + рамках этой системы делается попытка классифицировать PR, + касающиеся портов, по имени порта. Для поиска PR, относящихся к + определённому порту, используйте механизм <link + xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Просмотра по одному порту</link>.</para> - <para>Если таких отложенных PR не существует, то на следующем этапе - следует послать сообщение электронной почты человеку, поддерживающему - порт, который выдаётся по команде <command>make maintainer</command>. - Этот человек может уже работать над обновлением, или иметь - причину не обновлять порт прямо сейчас (например, из-за проблем со - стабильностью функционирования новой версии); - вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые - порты перечисляются с адресом сопровождающего - <literal>ports@FreeBSD.org</literal>, который является всего лишь - адресом общего списка рассылки, так что отправка туда сообщений, - скорее всего, в данном случае не поможет.</para> - - <para>Если сопровождающий просит вас выполнить обновление, либо - сопровождающий отсутствует, то у вас появляется шанс помочь &os;, - приготовив обновление самим! Пожалуйста, делайте это с использованием - команды &man.diff.1; в основной системе.</para> - - <para>Чтобы создать подходящий <command>diff</command> для одного патча, - скопируйте файл, который нужно пропатчить, в - <replaceable>something.orig</replaceable>, сохраните ваши изменения в - <replaceable>something</replaceable>, а затем создайте ваше патч:</para> - - <informalexample> - <screen>&prompt.user; <userinput>diff -u something.orig something > something.diff</userinput></screen> - </informalexample> - - <para>В противном случае, вам следует воспользоваться методом - <command>svn diff</command> (<xref linkend="svn-diff"/>), либо - скопировать содержимое порта в - отдельный каталог и применить результат рекурсивной команды &man.diff.1; - между новым и старым каталогами порта (например, если каталог с - модифицированным портом называется <filename>superedit</filename>, - а оригинальный, совпадающий с находящимся в нашем дереве портов, - <filename>superedit.bak</filename>, то сохраните результат выполнения - команды <command>diff -ruN superedit.bak superedit</command>). - Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры - портов обычно предпочитают унифицированный формат. Отметьте - использование опции <literal>-N</literal>—это одобряемый способ - заставить diff корректно работать в случае добавления новых файлов или - удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста, - проверьте его, чтобы убедиться в значимости всех внесённых - изменений. (В частности, убедитесь, что вы очистили рабочие каталоги - командой <command>make clean</command>).</para> - - <para>Для упрощения повторяющихся операций с файлами заплаток - вы можете воспользоваться скриптом - <filename>/usr/ports/Tools/scripts/patchtool.py</filename>. Перед тем, - как его запускать, пожалуйста, прочтите - <filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para> - - <para>Если порт никем не поддерживается, а вы активно его используете, - пожалуйста, подумайте над тем, чтобы добровольно стать его - сопровождающим. Во &os; имеется более 4000 портов без поддержки, и это - как раз та область, где всегда нужны добровольцы. (Детальное описание - обязанностей сопровождающего можно найти в разделе в <link xlink:href="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER"> - Руководстве Разработчика</link>.)</para> - - <para>Лучше всего послать нам diff-файл, включив его в посылку по команде - &man.send-pr.1; (категория <literal>ports</literal>). Если вы - сопровождаете порт, - обязательно поместите текст <literal>[maintainer update]</literal> в - начале строки описания и задайте в поле <quote>Class</quote> - вашего PR строчку <literal>maintainer-update</literal>. - В противном случае в поле <quote>Class</quote> вашего PR должно быть - указано <literal>change-request</literal>. Будьте добры, в сообщении - отметьте все добавленные или удалённые файлы, так как они будут - непосредственно указаны &man.svn.1; при выполнении операции коммита. - Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте - утилитой uuencode; в противном случае просто включите его как есть - в PR.</para> - - <para>Прежде чем пользоваться &man.send-pr.1; просмотрите раздел - о <link xlink:href="&url.articles.problem-reports;/pr-writing.html">Написании - сообщений о проблемах</link> в статье о Сообщениях об ошибках. Он - содержит гораздо больше информации о том, как писать полезные сообщения - о проблемах.</para> - - <important> - <para>Если обновление вызвано соображениями информационной - безопасности или наличием серьёзных ошибок в имеющемся порте, - пожалуйста, оповестите &a.portmgr; о необходимости немедленного - перепостроения и повторного распространения пакета данного порта. - В противном случае ничего не подозревающие пользователи - <command>pkg</command> будут продолжать устанавливать старую - версию по команде <command>pkg install</command> в течение - ещё нескольких недель.</para> - </important> - - <note> - <para>Повторяем еще раз - для посылки обновлений существующих портов - используйте утилиту &man.diff.1;, а не &man.shar.1;! Это поможет - понять коммиттерам портов, что именно было изменено.</para> - </note> - - <para>Теперь, когда вы проделали всё это, прочитайте о том, как - поддерживать актуальное состояние, в <xref linkend="keeping-up"/>.</para> - - <sect1 xml:id="svn-diff"> - <title>Использование <application>Subversion</application> для - создания патчей</title> - - <para>По возможности присылайте исправления в формате &man.svn.1; diff. - В таком виде их проще использовать по сравнению с разницей между - <quote>старым и новым</quote> каталогами. Так проще - увидеть изменения и обновить их в случае, если что-нибудь - изменилось в Коллекции Портов с тех пор, как вы начали работу, - либо если коммиттер просит что-то исправить.</para> - - <screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co xml:id="my-wrkdir"/> + <para>Если таких отложенных PR не существует, то на следующем этапе + следует послать сообщение электронной почты человеку, + поддерживающему порт, который выдаётся по команде <command>make + maintainer</command>. Этот человек может уже работать над + обновлением, или иметь причину не обновлять порт прямо сейчас + (например, из-за проблем со стабильностью функционирования новой + версии); вам нет нужды дублировать их работу. Заметьте, что + неподдерживаемые порты перечисляются с адресом сопровождающего + <literal>ports@FreeBSD.org</literal>, который является всего лишь + адресом общего списка рассылки, так что отправка туда сообщений, + скорее всего, в данном случае не поможет.</para> + + <para>Если сопровождающий просит вас выполнить обновление, либо + сопровождающий отсутствует, то у вас появляется шанс помочь &os;, + приготовив обновление самим! Пожалуйста, делайте это с + использованием команды &man.diff.1; в основной системе.</para> + + <para>Чтобы создать подходящий <command>diff</command> для одного + патча, скопируйте файл, который нужно пропатчить, в + <replaceable>something.orig</replaceable>, сохраните ваши + изменения в <replaceable>something</replaceable>, а затем + создайте ваше патч:</para> + + <informalexample> + <screen>&prompt.user; <userinput>diff -u something.orig something > something.diff</userinput></screen> + </informalexample> + + <para>В противном случае, вам следует воспользоваться методом + <command>svn diff</command> (<xref linkend="svn-diff"/>), либо + скопировать содержимое порта в отдельный каталог и применить + результат рекурсивной команды &man.diff.1; между новым и старым + каталогами порта (например, если каталог с модифицированным + портом называется <filename>superedit</filename>, а оригинальный, + совпадающий с находящимся в нашем дереве портов, + <filename>superedit.bak</filename>, то сохраните результат + выполнения команды <command>diff -ruN superedit.bak + superedit</command>). Подойдёт как унифицированный, так и + контекстный дифф, однако коммиттеры портов обычно предпочитают + унифицированный формат. Отметьте использование опции + <literal>-N</literal>—это одобряемый способ заставить diff + корректно работать в случае добавления новых файлов или удаления + старых. Перед тем, как посылать нам diff-файл, пожалуйста, + проверьте его, чтобы убедиться в значимости всех внесённых + изменений. (В частности, убедитесь, что вы очистили рабочие + каталоги командой <command>make clean</command>).</para> + + <para>Для упрощения повторяющихся операций с файлами заплаток вы + можете воспользоваться скриптом + <filename>/usr/ports/Tools/scripts/patchtool.py</filename>. + Перед тем, как его запускать, пожалуйста, прочтите + <filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para> + + <para>Если порт никем не поддерживается, а вы активно его + используете, пожалуйста, подумайте над тем, чтобы добровольно + стать его сопровождающим. Во &os; имеется более 4000 портов без + поддержки, и это как раз та область, где всегда нужны + добровольцы. (Детальное описание обязанностей сопровождающего + можно найти в разделе <link + xlink:href="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">Руководства + Разработчика</link>.)</para> + + <para>Лучше всего послать нам diff-файл, включив его в посылку по + команде &man.send-pr.1; (категория <literal>ports</literal>). + Если вы сопровождаете порт, обязательно поместите текст + <literal>[maintainer update]</literal> в начале строки описания и + задайте в поле <quote>Class</quote> вашего PR строчку + <literal>maintainer-update</literal>. В противном случае в поле + <quote>Class</quote> вашего PR должно быть указано + <literal>change-request</literal>. Будьте добры, в сообщении + отметьте все добавленные или удалённые файлы, так как они будут + непосредственно указаны &man.svn.1; при выполнении операции + коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите + его и обработайте утилитой uuencode; в противном случае просто + включите его как есть в PR.</para> + + <para>Прежде чем пользоваться &man.send-pr.1; просмотрите раздел о + <link + xlink:href="&url.articles.problem-reports;/pr-writing.html">Написании + сообщений о проблемах</link> в статье о Сообщениях об ошибках. + Он содержит гораздо больше информации о том, как писать полезные + сообщения о проблемах.</para> + + <important> + <para>Если обновление вызвано соображениями информационной + безопасности или наличием серьёзных ошибок в имеющемся порте, + пожалуйста, оповестите &a.portmgr; о необходимости немедленного + перепостроения и повторного распространения пакета данного + порта. В противном случае ничего не подозревающие пользователи + <command>pkg</command> будут продолжать устанавливать старую + версию по команде <command>pkg install</command> в течение ещё + нескольких недель.</para> + </important> + + <note> + <para>Повторяем еще раз - для посылки обновлений существующих + портов используйте утилиту &man.diff.1;, а не &man.shar.1;! + Это поможет понять коммиттерам портов, что именно было + изменено.</para> + </note> + + <para>Теперь, когда вы проделали всё это, прочитайте о том, как + поддерживать актуальное состояние, в <xref + linkend="keeping-up"/>.</para> + + <sect1 xml:id="svn-diff"> + <title>Использование <application>Subversion</application> для + создания патчей</title> + + <para>По возможности присылайте исправления в формате &man.svn.1; + diff. В таком виде их проще использовать по сравнению с + разницей между <quote>старым и новым</quote> каталогами. Так + проще увидеть изменения и обновить их в случае, если что-нибудь + изменилось в Коллекции Портов с тех пор, как вы начали работу, + либо если коммиттер просит что-то исправить.</para> + + <screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co xml:id="my-wrkdir"/> &prompt.user; <userinput>svn co https://svn0.us-west.FreeBSD.org/ports/head/dns/pdnsd</userinput> <co xml:id="svn-FreeBSD-org"/> &prompt.user; <userinput>cd ~/my_wrkdir/pdnsd</userinput></screen> - <calloutlist> - <callout arearefs="my-wrkdir"> - <para>Это может быть где угодно; место, в котором производится - построение портов, не привязано к - <filename>/usr/ports/</filename>.</para> - </callout> - - <callout arearefs="svn-FreeBSD-org"> - <para><link xlink:href="https://svn0.us-west.FreeBSD.org/">svn0.us-west.FreeBSD.org</link> - — это общедоступный сервер - <application>Subversion</application>. - Выберите ближайшее зеркало и проверьте сертификат - зеркалирующего сервера на наличие в перечне <link xlink:href="&url.books.handbook;/svn-mirrors.html">зеркалирующих + <calloutlist> + <callout arearefs="my-wrkdir"> + <para>Это может быть где угодно; место, в котором + производится построение портов, не привязано к + <filename>/usr/ports/</filename>.</para> + </callout> + + <callout arearefs="svn-FreeBSD-org"> + <para><link + xlink:href="https://svn0.us-west.FreeBSD.org/">svn0.us-west.FreeBSD.org</link> + — это общедоступный сервер + <application>Subversion</application>. Выберите ближайшее + зеркало и проверьте сертификат зеркалирующего сервера на + наличие в перечне <link + xlink:href="&url.books.handbook;/svn-mirrors.html">зеркалирующих сайтов Subversion</link>.</para> - </callout> - </calloutlist> + </callout> + </calloutlist> - <para>Находясь в рабочем каталоге, вносите любые изменения, которые - обычно делают для порта. При добавлении или удалении файла - используйте <command>svn</command> для отслеживания этих - изменений:</para> + <para>Находясь в рабочем каталоге, вносите любые изменения, + которые обычно делают для порта. При добавлении или удалении + файла используйте <command>svn</command> для отслеживания этих + изменений:</para> - <screen>&prompt.user; <userinput>svn add new_file</userinput> + <screen>&prompt.user; <userinput>svn add new_file</userinput> &prompt.user; <userinput>svn remove deleted_file</userinput></screen> - <para>Убедитесь, что вы проверяете порт в соответствии с рекомендуемым - порядком проверки, описанным в <xref linkend="porting-testing"/> и - <xref linkend="porting-portlint"/>.</para> + <para>Убедитесь, что вы проверяете порт в соответствии с + рекомендуемым порядком проверки, описанным в + <xref linkend="porting-testing"/> и + <xref linkend="porting-portlint"/>.</para> - <screen>&prompt.user; <userinput>svn status</userinput> + <screen>&prompt.user; <userinput>svn status</userinput> &prompt.user; <userinput>svn update</userinput> <co xml:id="svn-update"/></screen> - <calloutlist> - <callout arearefs="svn-update"> - <para>Эта команда попытается выполнить слияние различий между - вашим патчем и текущей версией репозитория; внимательно проверьте - полученный вывод. Буква перед названием каждого файла означает - тип изменения, сделанного с этим файлом. Для получения полного - списка смотрите <xref linkend="table-svn-up"/>.</para> - </callout> - </calloutlist> - - <table pgwide="1" frame="none" xml:id="table-svn-up"> - <title>Префиксы файлов для <application>Subversion</application> - update</title> - - <tgroup cols="2"> - <tbody> - <row> - <entry>U</entry> - - <entry>Файл обновлен без проблем.</entry> - </row> - - <row> - <entry>G</entry> - - <entry>Файл обновлен без проблем (вы увидите это только - при работе с удаленным репозиторием).</entry> - </row> - - <row> - <entry>M</entry> - - <entry>Файл с локальными изменениями, слияние выполнено - без конфликтов.</entry> - </row> - - <row> - <entry>C</entry> - - <entry>Файл с локальными изменениями, слияние выполнено - с конфликтами.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Если в результате выполнения <literal>svn update</literal> - отображается <literal>C</literal>, то это означает, что что-то - изменилось в репозитории <application>Subversion</application> - и &man.svn.1; не смогла выполнить - слияние локальных изменений с полученными из репозитория. - В любом случае никогда не помешает просмотреть изменения, - поскольку &man.svn.1; ничего не знает о том, каким должен быть - порт, поэтому эта команда может (и, вероятно, будет) делать - слияние тех изменений, которые не имеют смысла.</para> - - <para>Последним шагом является создание унифицированного &man.diff.1; - для полученных изменений:</para> - - <screen>&prompt.user; <userinput>svn diff > ../`basename ${PWD}`.diff</userinput></screen> - - <note> - <para>Информация о любых удаляемых файлов должна быть явным - образом указана в PR, поскольку необходимость в удалении - файла для коммиттера может быть неочевидна.</para> - </note> - - <para>Присылайте свои патчи в соответствии с руководством, описанном в - <xref linkend="port-upgrading"/>.</para> - </sect1> - - <sect1 xml:id="moved-and-updating-files"> - <title>Файлы <filename>UPDATING</filename> и - <filename>MOVED</filename></title> - - <para>Если при обновлении порта требуются специальные шаги, такие как - изменение файлов конфигурации или запуск специальной программы, - то вам следует это задокументировать в файле - <filename>/usr/ports/UPDATING</filename>. Формат записи в этом - файле приводится ниже:</para> - - <programlisting>YYYYMMDD: + <calloutlist> + <callout arearefs="svn-update"> + <para>Эта команда попытается выполнить слияние различий между + вашим патчем и текущей версией репозитория; внимательно + проверьте полученный вывод. Буква перед названием каждого + файла означает тип изменения, сделанного с этим файлом. + Для получения полного списка смотрите <xref + linkend="table-svn-up"/>.</para> + </callout> + </calloutlist> + + <table pgwide="1" frame="none" xml:id="table-svn-up"> + <title>Префиксы файлов для + <application>Subversion</application> Update</title> + + <tgroup cols="2"> + <tbody> + <row> + <entry>U</entry> + <entry>Файл обновлен без проблем.</entry> + </row> + + <row> + <entry>G</entry> + <entry>Файл обновлен без проблем (вы увидите это только + при работе с удаленным репозиторием).</entry> + </row> + + <row> + <entry>M</entry> + <entry>Файл с локальными изменениями, слияние выполнено + без конфликтов.</entry> + </row> + + <row> + <entry>C</entry> + <entry>Файл с локальными изменениями, слияние выполнено + с конфликтами.</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>Если в результате выполнения <literal>svn update</literal> + отображается <literal>C</literal>, то это означает, что что-то + изменилось в репозитории <application>Subversion</application> + и &man.svn.1; не смогла выполнить слияние локальных изменений с + полученными из репозитория. В любом случае никогда не помешает + просмотреть изменения, поскольку &man.svn.1; ничего не знает о + том, каким должен быть порт, поэтому эта команда может (и, + вероятно, будет) делать слияние тех изменений, которые не имеют + смысла.</para> + + <para>Последним шагом является создание унифицированного + &man.diff.1; для полученных изменений:</para> + + <screen>&prompt.user; <userinput>svn diff > ../`basename ${PWD}`.diff</userinput></screen> + + <note> + <para>Информация о любых удаляемых файлов должна быть явным + образом указана в PR, поскольку необходимость в удалении + файла для коммиттера может быть неочевидна.</para> + </note> + + <para>Присылайте свои патчи в соответствии с руководством, + описанном в <xref linkend="port-upgrading"/>.</para> + </sect1> + + <sect1 xml:id="moved-and-updating-files"> + <title>Файлы <filename>UPDATING</filename> и + <filename>MOVED</filename></title> + + <para>Если при обновлении порта требуются специальные шаги, такие + как изменение файлов конфигурации или запуск специальной + программы, то вам следует это задокументировать в файле + <filename>/usr/ports/UPDATING</filename>. Формат записи в этом + файле приводится ниже:</para> + + <programlisting>YYYYMMDD: AFFECTS: users of portcategory/portname AUTHOR: Your name <Your email address> Special instructions</programlisting> - <para>Если вы включаете точные инструкции portmaster или portupgrading, - пожалуйста, убедитесь в правильном экранировании символов внутри - командной оболочки.</para> - - <para>Файл <filename>/usr/ports/MOVED</filename> содержит записи - об удалённых или перемещённых портах. Каждая строка в этом - файле состоит из полей: название порта, место, куда он был - перемещён, дата и причина перемещения. Если порт был удалён, - то поле, указывающее новое место, может оставаться незаполненным. - Поля должны разделяться символом <literal>|</literal> (pipe), - как это показано ниже:</para> + <para>Если вы включаете точные инструкции portmaster или + portupgrade, пожалуйста, убедитесь в правильном экранировании + символов внутри командной оболочки.</para> - <programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting> + <para>Файл <filename>/usr/ports/MOVED</filename> содержит записи + об удалённых или перемещённых портах. Каждая строка в этом + файле состоит из полей: название порта, место, куда он был + перемещён, дата и причина перемещения. Если порт был удалён, + то поле, указывающее новое место, может оставаться + незаполненным. Поля должны разделяться символом + <literal>|</literal> (pipe), как это показано ниже:</para> - <para>Дату следует вводить в формате <literal>YYYY-MM-DD</literal>. - Новые записи следует добавлять в конец файла в хронологическом - порядке.</para> + <programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting> - <para>Если порт был перемещён, но в дальнейшем восстановлен на - прежнем месте, удалите в этом файле строку, содержащую - информацию о перемещении.</para> + <para>Дату следует вводить в формате + <literal>YYYY-MM-DD</literal>. Новые записи следует добавлять + в конец файла в хронологическом порядке.</para> - <para>Полученные изменения можно проверить командой - <command>Tools/scripts/MOVEDlint.awk</command>.</para> - </sect1> - </chapter> + <para>Если порт был перемещён, но в дальнейшем восстановлен на + прежнем месте, удалите в этом файле строку, содержащую + информацию о перемещении.</para> + <para>Полученные изменения можно проверить командой + <command>Tools/scripts/MOVEDlint.awk</command>.</para> + </sect1> +</chapter> diff --git a/ru_RU.KOI8-R/books/porters-handbook/uses.xml b/ru_RU.KOI8-R/books/porters-handbook/uses.xml index 7f63727a71..918d83facd 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/uses.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/uses.xml @@ -156,14 +156,15 @@ <entry>(нет), ARGS</entry> - <entry>Устанавливает окружение виртуального дисплея. Если переменная - окружения <varname>DISPLAY</varname> не установлена, то - <application>Xvfb</application> добавляется как зависимость для - построения и <varname>CONFIGURE_ENV</varname> дополняется номером - порта текущего запущенного экземпляра <application>Xvfb</application>. - Параметр <literal>ARGS</literal> по умолчанию имеет значение - <literal>install</literal> и управляет фазой, в которой запускается - и останавливается виртуальный дисплей.</entry> + <entry>Устанавливает окружение виртуального дисплея. Если + переменная окружения <varname>DISPLAY</varname> не установлена, + то <application>Xvfb</application> добавляется как зависимость + для построения и <varname>CONFIGURE_ENV</varname> дополняется + номером порта текущего запущенного экземпляра + <application>Xvfb</application>. Параметр + <literal>ARGS</literal> по умолчанию имеет значение + <literal>install</literal> и управляет фазой, в которой + запускается и останавливается виртуальный дисплей.</entry> </row> <row xml:id="uses-dos2unix"> @@ -218,7 +219,8 @@ <row xml:id="uses-fortran"> <entry><literal>fortran</literal></entry> - <entry><literal>gcc</literal> (default), <literal>ifort</literal></entry> + <entry><literal>gcc</literal> (default), + <literal>ifort</literal></entry> <entry>Использует компилятор Fortran от GNU или Intel.</entry> </row> @@ -241,7 +243,7 @@ <entry>Использует <package role="port">devel/gettext</package>. По умолчанию, без аргументов или с аргументом <literal>lib</literal>, означает зависимость от библиотеки - <filename>libintl.so</filename>. <literal>build</literal> + <filename>libintl.so</filename>. <literal>build</literal> и <literal>run</literal> соответственно означают зависимости от от <filename>xgettext</filename> для сборки и выполнения.</entry> </row> @@ -265,8 +267,8 @@ <entry>Использует функции <command>iconv</command>, из порта <package role="port">converters/libiconv</package> как зависимость - для сборки и выполнения или же из основной системы на 10-CURRENT после - появления собственного <command>iconv</command> в + для сборки и выполнения или же из основной системы на 10-CURRENT + после появления собственного <command>iconv</command> в <revnumber>254273</revnumber>. По умолчанию, без параметров или с параметром <literal>lib</literal>, <command>iconv</command> означает зависимость для сборки и выполнения, @@ -393,15 +395,16 @@ <row xml:id="uses-openal"> <entry><literal>openal</literal></entry> - <entry><literal>al</literal>, <literal>soft</literal> (по умолчанию), - <literal>si</literal>, <literal>alut</literal></entry> + <entry><literal>al</literal>, <literal>soft</literal> (по + умолчанию), <literal>si</literal>, <literal>alut</literal></entry> <entry>Использует <application>OpenAL</application>. Может быть указан бэкэнд, по умолчанию используется программная реализация. Пользователь может указать предпочитаемый бэкэнд с использованием переключателя <varname>WANT_OPENAL</varname>. Правильными - значениями для этого переключателя являются <literal>soft</literal> - (по умолчанию) и <literal>si</literal>.</entry> + значениями для этого переключателя являются + <literal>soft</literal> (по умолчанию) и + <literal>si</literal>.</entry> </row> <row xml:id="uses-pathfix"> @@ -521,7 +524,7 @@ означает зависимость для сборки и <literal>run</literal> для выполнения. Без аргументов или с аргументом <literal>both</literal> <command>qmail</command> означает - зависимость для сборки и выполнения. <literal>vars</literal> + зависимость для сборки и выполнения. <literal>vars</literal> задает переменные QMAIL для нужд порта.</entry> </row> @@ -567,8 +570,8 @@ из <package role="port">misc/shared-mime-info</package>. Это также добавляет собственный этап post-install и строки в plist для запуска <application>update-mime-data</application> с - подходящими аргументами во время установки и удаления пакета. - </entry> + подходящими аргументами во время установки и удаления + пакета.</entry> </row> <row xml:id="uses-shebangfix"> @@ -578,16 +581,19 @@ <entry>Во многом программном обеспечении указывается неправильный путь к интерпретатору (shebang), в первую очередь это касается - <filename>/usr/bin/perl</filename> и <filename>/bin/bash</filename>. - Это значение исправляет строку shebang в сценариях, перечисленных - в <varname>SHEBANG_FILES</varname>. По умолчанию сейчас + <filename>/usr/bin/perl</filename> и + <filename>/bin/bash</filename>. Это значение исправляет строку + shebang в сценариях, перечисленных в + <varname>SHEBANG_FILES</varname>. По умолчанию сейчас поддерживаются <application>Perl</application>, - <application>Python</application>, <application>Bash</application>, - <application>Ruby</application> и <application>PHP</application>. - Для поддержки других интерпретаторов необходимо соответствующее - значение <varname>SHEBANG_LANG</varname> (например, + <application>Python</application>, + <application>Bash</application>, <application>Ruby</application> + и <application>PHP</application>. Для поддержки других + интерпретаторов необходимо соответствующее значение + <varname>SHEBANG_LANG</varname> (например, <literal>SHEBANG_LANG=lua</literal>), - <varname>lua_OLD_CMD</varname> и <varname>lua_CMD</varname>.</entry> + <varname>lua_OLD_CMD</varname> и + <varname>lua_CMD</varname>.</entry> </row> <row xml:id="uses-tcl"> @@ -606,10 +612,10 @@ <literal>86</literal>) или же минимальный номер версии (на данный момент <literal>84+</literal>, <literal>85+</literal> или <literal>86+</literal>). Может быть указана зависимость для - сборки или выполнения с использованием <literal>PORT,build</literal> - или <literal>PORT,run</literal>. После подключения - <filename>bsd.port.pre.mk</filename> порт может проверить - результат, используя эти переменные: + сборки или выполнения с использованием + <literal>PORT,build</literal> или <literal>PORT,run</literal>. + После подключения <filename>bsd.port.pre.mk</filename> порт может + проверить результат, используя эти переменные: <itemizedlist> <listitem> @@ -670,22 +676,22 @@ <entry>(нет), <literal>ARGS</literal></entry> - <entry>Добавляет зависимость от <application>twistedCore</application>. - Перечень требуемых компонентов можно указать в качестве значения - этой переменной. <literal>ARGS</literal> может принимать одно из - значений: + <entry>Добавляет зависимость от + <application>twistedCore</application>. Перечень требуемых + компонентов можно указать в качестве значения этой переменной. + <literal>ARGS</literal> может принимать одно из значений: <itemizedlist> <listitem> <para><literal>build</literal>: добавляет - <application>twistedCore</application> или любой из указанных - компонентов как зависимость построения.</para> + <application>twistedCore</application> или любой из + указанных компонентов как зависимость построения.</para> </listitem> <listitem> <para><literal>run</literal>: добавляет - <application>twistedCore</application> или любой из указанных - компонентов как зависимость запуска.</para> + <application>twistedCore</application> или любой из + указанных компонентов как зависимость запуска.</para> </listitem> </itemizedlist> @@ -772,7 +778,7 @@ <listitem> <para>(отдельные записи): поддержка только указанных - браузеров</para> + браузеров</para> </listitem> </itemizedlist> diff --git a/ru_RU.KOI8-R/books/porters-handbook/versions.xml b/ru_RU.KOI8-R/books/porters-handbook/versions.xml index 8e1e4dc725..b0be0b7270 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/versions.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/versions.xml @@ -861,8 +861,8 @@ <entry>500018</entry> <entry>24 февраля 2001</entry> <entry>5.0-CURRENT после добавления переменной make CPUTYPE, - позволяющей контролировать специфичные для CPU оптимизации. - </entry> + позволяющей контролировать специфичные для CPU + оптимизации.</entry> </row> <row> @@ -1363,8 +1363,7 @@ <row> <entry>502114</entry> <entry>13 июня 2004</entry> - <entry>5.2-CURRENT после импорта ALTQ инфраструктуры. - </entry> + <entry>5.2-CURRENT после импорта ALTQ инфраструктуры.</entry> </row> <row> @@ -1458,16 +1457,16 @@ <entry>502127</entry> <entry>2 августа 2004</entry> <entry>5.2-CURRENT после изменения в API ядра UMA, разрешающего - конструкторам/инициализаторам (ctors/inits) возвращать неудачу. - </entry> + конструкторам/инициализаторам (ctors/inits) возвращать + неудачу.</entry> </row> <row> <entry>502128</entry> <entry>8 августа 2004</entry> <entry>5.2-CURRENT после изменения в сигнатуре vfs_mount, а также - после общей замены PRISON_ROOT на SUSER_ALLOWJAIL в API suser(9). - </entry> + после общей замены PRISON_ROOT на SUSER_ALLOWJAIL в API + suser(9).</entry> </row> <row> @@ -1498,8 +1497,8 @@ <row> <entry>503102</entry> <entry>13 февраля 2005</entry> - <entry>5.3-STABLE после выполнения MFC импорта nc(1) из OpenBSD. - </entry> + <entry>5.3-STABLE после выполнения MFC импорта nc(1) из + OpenBSD.</entry> </row> <row> @@ -1592,8 +1591,8 @@ <row> <entry>600001</entry> <entry>27 августа 2004</entry> - <entry>6.0-CURRENT после постоянного включения в ядро PFIL_HOOKS. - </entry> + <entry>6.0-CURRENT после постоянного включения в ядро + PFIL_HOOKS.</entry> </row> <row> @@ -1679,8 +1678,8 @@ <entry>6.0-CURRENT после исправлений в <filename><src/include/stdbool.h></filename> и <filename><src/sys/i386/include/_types.h></filename> - для использования совместимости GCC в компиляторе Intel C/C++. - </entry> + для использования совместимости GCC в компиляторе Intel + C/C++.</entry> </row> <row> @@ -1941,8 +1940,8 @@ <entry>602104</entry> <entry>28 января 2007</entry> <entry>6.2-STABLE после выполнения MFC узлов netgraph ng_deflate(4) - и ng_pred1(4) и нового узла ng_ppp(4) со сжатием и шифрованием. - </entry> + и ng_pred1(4) и нового узла ng_ppp(4) со сжатием и + шифрованием.</entry> </row> <row> @@ -2047,8 +2046,8 @@ <row> <entry>603102</entry> <entry>24 апреля 2008</entry> - <entry>6.3-STABLE после добавления l_sysid к структуре flock. - </entry> + <entry>6.3-STABLE после добавления l_sysid к структуре + flock.</entry> </row> <row> @@ -2193,8 +2192,8 @@ <row> <entry>700016</entry> <entry>22 апреля 2006</entry> - <entry>7.0-CURRENT после добавления &man.fcloseall.3; в libc. - </entry> + <entry>7.0-CURRENT после добавления &man.fcloseall.3; в + libc.</entry> </row> <row> @@ -2224,8 +2223,8 @@ <row> <entry>700021</entry> <entry>4 сентября 2006</entry> - <entry>7.0-CURRENT после импорта libpcap 0.9.4 и tcpdump 3.9.4. - </entry> + <entry>7.0-CURRENT после импорта libpcap 0.9.4 и tcpdump + 3.9.4.</entry> </row> <row> @@ -2290,15 +2289,14 @@ <row> <entry>700031</entry> <entry>23 февраля 2007</entry> - <entry>7.0-CURRENT после изменения в bus_setup_intr() (newbus). - </entry> + <entry>7.0-CURRENT после изменения в bus_setup_intr() + (newbus).</entry> </row> <row> <entry>700032</entry> <entry>2 марта 2007</entry> - <entry>7.0-CURRENT после внесения микрокода ipw(4) и iwi(4). - </entry> + <entry>7.0-CURRENT после внесения микрокода ipw(4) и iwi(4).</entry> </row> <row> @@ -2319,8 +2317,7 @@ <entry>700035</entry> <entry>26 марта 2007</entry> <entry>7.0-CURRENT после добавления механизма уведомлений - при изменении частоты CPU. - </entry> + при изменении частоты CPU.</entry> </row> <row> @@ -2341,8 +2338,8 @@ <entry>700038</entry> <entry>30 апреля 2007</entry> <entry>7.0-CURRENT после изменения &man.getenv.3;, &man.putenv.3;, - &man.setenv.3; и &man.unsetenv.3; для совместимости с POSIX. - </entry> + &man.setenv.3; и &man.unsetenv.3; для совместимости с + POSIX.</entry> </row> <row> @@ -2354,8 +2351,8 @@ <row> <entry>700040</entry> <entry>10 мая 2007</entry> - <entry>7.0-CURRENT после добавления &man.flopen.3; в libutil. - </entry> + <entry>7.0-CURRENT после добавления &man.flopen.3; в + libutil.</entry> </row> <row> @@ -2457,8 +2454,8 @@ <row> <entry>700053</entry> <entry>30 сентября 2007</entry> - <entry>7.0-CURRENT после добавления поддержки для доменов PCI. - </entry> + <entry>7.0-CURRENT после добавления поддержки для доменов + PCI.</entry> </row> <row> @@ -2498,8 +2495,8 @@ <row> <entry>700103</entry> <entry>10 апреля 2008</entry> - <entry>7.0-STABLE после добавления l_sysid в структуру flock. - </entry> + <entry>7.0-STABLE после добавления l_sysid в структуру + flock.</entry> </row> <row> @@ -2559,8 +2556,8 @@ <row> <entry>700112</entry> <entry>27 августа 2008</entry> - <entry>7.0-STABLE после выполнения MFC поддержки DTrace в ядре. - </entry> + <entry>7.0-STABLE после выполнения MFC поддержки DTrace в + ядре.</entry> </row> <row> @@ -2578,8 +2575,8 @@ <row> <entry>701101</entry> <entry>10 января 2009</entry> - <entry>7.1-STABLE после бекпорта <function>strndup</function>. - </entry> + <entry>7.1-STABLE после бекпорта + <function>strndup</function>.</entry> </row> <row> @@ -2662,8 +2659,8 @@ <row> <entry>702105</entry> <entry>31 июля 2009</entry> - <entry>7.2-STABLE после выполнения MFC изменения ABI для SYSVIPC. - </entry> + <entry>7.2-STABLE после выполнения MFC изменения ABI для + SYSVIPC.</entry> </row> <row> @@ -2701,15 +2698,15 @@ <row> <entry>800000</entry> <entry>11 октября 2007</entry> - <entry>8.0-CURRENT. Разделение двухбайтовых и однобайтовых ctype. - </entry> + <entry>8.0-CURRENT. Разделение двухбайтовых и однобайтовых + ctype.</entry> </row> <row> <entry>800001</entry> <entry>16 октября 2007</entry> - <entry>8.0-CURRENT после импорта libpcap 0.9.8 и tcpdump 3.9.8. - </entry> + <entry>8.0-CURRENT после импорта libpcap 0.9.8 и tcpdump + 3.9.8.</entry> </row> <row> @@ -2724,8 +2721,8 @@ <entry>24 октября 2007</entry> <entry>8.0-CURRENT после добавления обратной совместимости ABI для IOCTL'ей PCIOCGETCONF, PCIOCREAD и PCIOCWRITE с версиями FreeBSD - 4/5/6, что вызвало повторную поломку ABI для PCIOCGETCONF IOCTL - </entry> + 4/5/6, что вызвало повторную поломку ABI для PCIOCGETCONF + IOCTL</entry> </row> <row> @@ -2771,8 +2768,8 @@ <row> <entry>800010</entry> <entry>10 января 2008</entry> - <entry>8.0-CURRENT после изменения прототипа &man.vn.lock.9;. - </entry> + <entry>8.0-CURRENT после изменения прототипа + &man.vn.lock.9;.</entry> </row> <row> @@ -2793,8 +2790,8 @@ <row> <entry>800013</entry> <entry>23 января 2008</entry> - <entry>8.0-CURRENT после появления кодировки <quote>ASCII</quote>. - </entry> + <entry>8.0-CURRENT после появления кодировки + <quote>ASCII</quote>.</entry> </row> <row> @@ -2808,8 +2805,8 @@ <row> <entry>800015</entry> <entry>26 января 2008</entry> - <entry>8.0-CURRENT после расширения типов для структур &man.fts.3;. - </entry> + <entry>8.0-CURRENT после расширения типов для структур + &man.fts.3;.</entry> </row> <row> @@ -2889,8 +2886,8 @@ <entry>800026</entry> <entry>12 марта 2008</entry> <entry>8.0-CURRENT после изменения параметра приоритета для - cv_broadcastpri так, что 0 означает отсутствие приоритета. - </entry> + cv_broadcastpri так, что 0 означает отсутствие + приоритета.</entry> </row> <row> @@ -2903,8 +2900,8 @@ <row> <entry>800028</entry> <entry>26 марта 2008</entry> - <entry>8.0-CURRENT после добавления l_sysid в структуру flock. - </entry> + <entry>8.0-CURRENT после добавления l_sysid в структуру + flock.</entry> </row> <row> @@ -3012,8 +3009,8 @@ <entry>800043</entry> <entry>13 августа 2008</entry> <entry>8.0-CURRENT после изменения в bpf(4) для использования - единственного узла устройства вместо клонирования устройств. - </entry> + единственного узла устройства вместо клонирования + устройств.</entry> </row> <row> @@ -3128,8 +3125,8 @@ <row> <entry>800059</entry> <entry>15 декабря 2008</entry> - <entry>8.0-CURRENT включает в себя новый переписанный arp-v2. - </entry> + <entry>8.0-CURRENT включает в себя новый переписанный + arp-v2.</entry> </row> <row> @@ -3155,8 +3152,8 @@ <entry>800063</entry> <entry>18 февраля 2009</entry> <entry>8.0-CURRENT после изменения конфига GENERIC для - использования стека USB2, а также после добавления fdevname(3). - </entry> + использования стека USB2, а также после добавления + fdevname(3).</entry> </row> <row> @@ -3169,8 +3166,8 @@ <row> <entry>800065</entry> <entry>26 февраля 2009</entry> - <entry>8.0-CURRENT после переименования всех функций в libmp(3). - </entry> + <entry>8.0-CURRENT после переименования всех функций в + libmp(3).</entry> </row> <row> @@ -3184,15 +3181,15 @@ <entry>800067</entry> <entry>28 февраля 2009</entry> <entry>8.0-CURRENT после добавления getdelim(), getline(), - stpncpy(), strnlen(), wcsnlen(), wcscasecmp() и wcsncasecmp(). - </entry> + stpncpy(), strnlen(), wcsnlen(), wcscasecmp() и + wcsncasecmp().</entry> </row> <row> <entry>800068</entry> <entry>2 марта 2009</entry> - <entry>8.0-CURRENT после переименования devclass ushub в uhub. - </entry> + <entry>8.0-CURRENT после переименования devclass ushub в + uhub.</entry> </row> <row> @@ -3233,8 +3230,8 @@ <row> <entry>800074</entry> <entry>24 марта 2009</entry> - <entry>8.0-CURRENT после импорта tcpdump 4.0.0 и libpcap 1.0.0. - </entry> + <entry>8.0-CURRENT после импорта tcpdump 4.0.0 и libpcap + 1.0.0.</entry> </row> <row> @@ -3247,8 +3244,8 @@ <row> <entry>800076</entry> <entry>9 апреля 2009</entry> - <entry>8.0-CURRENT после добавления профилей задержки в dummynet. - </entry> + <entry>8.0-CURRENT после добавления профилей задержки в + dummynet.</entry> </row> <row> @@ -3277,15 +3274,15 @@ <row> <entry>800080</entry> <entry>15 апреля 2009</entry> - <entry>8.0-CURRENT после изменения раскладки структуры inpcb. - </entry> + <entry>8.0-CURRENT после изменения раскладки структуры + inpcb.</entry> </row> <row> <entry>800081</entry> <entry>19 апреля 2009</entry> - <entry>8.0-CURRENT после изменения раскладки структуры malloc_type. - </entry> + <entry>8.0-CURRENT после изменения раскладки структуры + malloc_type.</entry> </row> <row> @@ -3335,8 +3332,8 @@ <row> <entry>800088</entry> <entry>20 мая 2009</entry> - <entry>8.0-CURRENT после изменений в режиме net80211 monitor. - </entry> + <entry>8.0-CURRENT после изменений в режиме net80211 + monitor.</entry> </row> <row> @@ -3349,8 +3346,8 @@ <row> <entry>800090</entry> <entry>23 мая 2009</entry> - <entry>8.0-CURRENT после клонирования виртуализованных интерфейсов. - </entry> + <entry>8.0-CURRENT после клонирования виртуализованных + интерфейсов.</entry> </row> <row> @@ -3372,8 +3369,8 @@ <row> <entry>800093</entry> <entry>29 мая 2009</entry> - <entry>8.0-CURRENT после добавления mnt_xflag в структуру mount. - </entry> + <entry>8.0-CURRENT после добавления mnt_xflag в структуру + mount.</entry> </row> <row> @@ -3485,8 +3482,8 @@ <row> <entry>800108</entry> <entry>21 ноября 2009</entry> - <entry>8.0-STABLE после реализации kevent-фильтра EVFILT_USER. - </entry> + <entry>8.0-STABLE после реализации kevent-фильтра + EVFILT_USER.</entry> </row> <row> @@ -3570,15 +3567,15 @@ <entry>802501</entry> <entry>28 февраля 2011</entry> <entry>8.2-STABLE после обратного портирования изменений DTrace, - включающих поддержку трассировки пользовательских программ. - </entry> + включающих поддержку трассировки пользовательских + программ.</entry> </row> <row> <entry>802502</entry> <entry>6 марта 2011</entry> - <entry>8.2-STABLE после обратного портирования log2 и log2f в libm. - </entry> + <entry>8.2-STABLE после обратного портирования log2 и log2f в + libm.</entry> </row> <row> @@ -3693,8 +3690,8 @@ <row> <entry>803500</entry> <entry>3 марта 2012</entry> - <entry>8.3-STABLE после отделения ветки releng/8.3 (RELENG_8_3). - </entry> + <entry>8.3-STABLE после отделения ветки releng/8.3 + (RELENG_8_3).</entry> </row> <row> @@ -3765,8 +3762,8 @@ <entry>13 января 2010</entry> <entry>9.0-CURRENT после удаления utmp(5) и добавления utmpx (смотрите <function>getutxent(3)</function>) для улучшенного - протоколирования пользовательских входов и системных событий. - </entry> + протоколирования пользовательских входов и системных + событий.</entry> </row> <row> @@ -3800,15 +3797,15 @@ <row> <entry>900012</entry> <entry>10 мая 2010</entry> - <entry>9.0-CURRENT после добавления liblzma, xz, xzdec и lzmainfo. - </entry> + <entry>9.0-CURRENT после добавления liblzma, xz, xzdec и + lzmainfo.</entry> </row> <row> <entry>900013</entry> <entry>14 мая 2010</entry> - <entry>9.0-CURRENT после привлечения исправлений USB в linux(4). - </entry> + <entry>9.0-CURRENT после привлечения исправлений USB в + linux(4).</entry> </row> <row> @@ -3876,22 +3873,22 @@ <row> <entry>900023</entry> <entry>11 октября 2010</entry> - <entry>9.0-CURRENT после обновления xz до снапшота git 20101010. - </entry> + <entry>9.0-CURRENT после обновления xz до снапшота git + 20101010.</entry> </row> <row> <entry>900024</entry> <entry>11 ноября 2010</entry> - <entry>9.0-CURRENT после замены libgcc.a на libcompiler_rt.a. - </entry> + <entry>9.0-CURRENT после замены libgcc.a на + libcompiler_rt.a.</entry> </row> <row> <entry>900025</entry> <entry>12 ноября 2010</entry> - <entry>9.0-CURRENT после появления модульного контроля перегрузки. - </entry> + <entry>9.0-CURRENT после появления модульного контроля + перегрузки.</entry> </row> <row> @@ -3920,15 +3917,14 @@ <entry>28 декабря 2010</entry> <entry>9.0-CURRENT после изменения стека TCP для взаимодействия с модулями Khelp через вспомогательные точки связи и хранения - данных уровня сетевого соединения в управляющем блоке TCP. - </entry> + данных уровня сетевого соединения в управляющем блоке TCP.</entry> </row> <row> <entry>900030</entry> <entry>12 января 2011</entry> - <entry>9.0-CURRENT после обновления libdialog до версии 20100428. - </entry> + <entry>9.0-CURRENT после обновления libdialog до версии + 20100428.</entry> </row> <row> @@ -3941,22 +3937,22 @@ <row> <entry>900032</entry> <entry>8 февраля 2011</entry> - <entry>9.0-CURRENT после удаления символа и прототипа uio_yield. - </entry> + <entry>9.0-CURRENT после удаления символа и прототипа + uio_yield.</entry> </row> <row> <entry>900033</entry> <entry>18 февраля 2011</entry> - <entry>9.0-CURRENT после обновления binutils до версии 2.17.50. - </entry> + <entry>9.0-CURRENT после обновления binutils до версии + 2.17.50.</entry> </row> <row> <entry>900034</entry> <entry>8 марта 2011</entry> - <entry>9.0-CURRENT после изменений в struct sysvec (sv_schedtail). - </entry> + <entry>9.0-CURRENT после изменений в struct sysvec + (sv_schedtail).</entry> </row> <row> @@ -4041,8 +4037,8 @@ <row> <entry>900045</entry> <entry>2 января 2012</entry> - <entry>9.0-CURRENT после выполнения MFC true/false из 1000002. - </entry> + <entry>9.0-CURRENT после выполнения MFC true/false из + 1000002.</entry> </row> <row> @@ -4104,8 +4100,8 @@ <row> <entry>901500</entry> <entry>6 августа 2012</entry> - <entry>9.1-STABLE после отделения ветки releng/9.1 (RELENG_9_1). - </entry> + <entry>9.1-STABLE после отделения ветки releng/9.1 + (RELENG_9_1).</entry> </row> <row> @@ -4150,16 +4146,16 @@ <entry>902001</entry> <entry>3 августа 2013</entry> <entry>Отделение ветки <literal>releng/9.2</literal> от - <literal>stable/9</literal> (рев. <revnumber>253912</revnumber>). - </entry> + <literal>stable/9</literal> (рев. + <revnumber>253912</revnumber>).</entry> </row> <row> <entry>902501</entry> <entry>August 2, 2013</entry> <entry>9.2-STABLE после создания ветки - <literal>releng/9.2</literal> (рев. <revnumber>253913</revnumber>). - </entry> + <literal>releng/9.2</literal> (рев. + <revnumber>253913</revnumber>).</entry> </row> <row> @@ -4250,8 +4246,8 @@ <entry>1000006</entry> <entry>26 января 2012</entry> <entry>10-CURRENT после появления асинхронных уведомлений о наличии - входных данных в уровне cam(4) (рев. <revnumber>230590</revnumber>). - </entry> + входных данных в уровне cam(4) (рев. + <revnumber>230590</revnumber>).</entry> </row> <row> @@ -4368,8 +4364,8 @@ <entry>22 октября 2012</entry> <entry>10-CURRENT после удаления поддержки файловых систем, не являющихся MPSAFE, и добавления поддержки FUSEFS (рев. - <revnumber>241519</revnumber>, <revnumber>241897</revnumber>). - </entry> + <revnumber>241519</revnumber>, + <revnumber>241897</revnumber>).</entry> </row> <row> @@ -4395,8 +4391,7 @@ <entry>5 ноября 2012</entry> <entry>10-CURRENT после переключения компилятора по умолчанию на clang на платформах i386 и amd64 (рев. - <revnumber>242624</revnumber>). - </entry> + <revnumber>242624</revnumber>).</entry> </row> <row> @@ -4407,8 +4402,8 @@ отправкой структуры в пользовательский режим посредством sysctl или сокета маршрутизации. Это означает, что специфичный для KAME embedded scope id в sin6_addr.s6_addr[2] в пользовательском - приложении всегда очищается (рев. <revnumber>243443</revnumber>). - </entry> + приложении всегда очищается (рев. + <revnumber>243443</revnumber>).</entry> </row> <row> @@ -4462,9 +4457,9 @@ <entry>1000032</entry> <entry>1 мая 2013</entry> <entry>10-CURRENT после появления системных вызовов - <function>accept4</function> (рев. <revnumber>250154</revnumber>) и - <function>pipe2</function> (рев. <revnumber>250159</revnumber>). - </entry> + <function>accept4</function> (рев. <revnumber>250154</revnumber>) + и <function>pipe2</function> (рев. + <revnumber>250159</revnumber>).</entry> </row> <row> @@ -4486,24 +4481,24 @@ <function>catanh</function>, <function>catanhf</function>, <function>logl</function>, <function>log2l</function>, <function>log10l</function>, <function>log1pl</function>, - <function>expm1l</function> (рев. <revnumber>251294</revnumber>). - </entry> + <function>expm1l</function> (рев. + <revnumber>251294</revnumber>).</entry> </row> <row> <entry>1000035</entry> <entry>8 июня 2013</entry> <entry>10-CURRENT после появления системного вызова - <function>aio_mlock</function> (рев. <revnumber>251526</revnumber>). - </entry> + <function>aio_mlock</function> (рев. + <revnumber>251526</revnumber>).</entry> </row> <row> <entry>1000036</entry> <entry>9 июля 2013</entry> <entry>10-CURRENT после добавления новой функции в программный - интерфейс модуля ядра GSSAPI (рев. <revnumber>253049</revnumber>). - </entry> + интерфейс модуля ядра GSSAPI (рев. + <revnumber>253049</revnumber>).</entry> </row> <row> @@ -4519,8 +4514,8 @@ <literal>mrt6stat</literal>, <literal>mrtstat</literal>, <literal>pfkeystat</literal>, <literal>pim6stat</literal>, <literal>pimstat</literal>, <literal>rip6stat</literal>, - <literal>udpstat</literal> (рев. <revnumber>253081</revnumber>). - </entry> + <literal>udpstat</literal> (рев. + <revnumber>253081</revnumber>).</entry> </row> <row> @@ -4528,8 +4523,8 @@ <entry>16 июля 2013</entry> <entry>10-CURRENT после переключения ABI, используемого по умолчанию, на <literal>ARM EABI</literal> для архитектур arm, - armeb, armv6, and armv6eb (рев. <revnumber>253396</revnumber>). - </entry> + armeb, armv6, and armv6eb (рев. + <revnumber>253396</revnumber>).</entry> </row> <row> @@ -4579,8 +4574,8 @@ <entry>15 августа 2013</entry> <entry>10-CURRENT после перевода <literal>libc.so</literal> на использование сценария &man.ld.1; (рев. - <revnumber>251668</revnumber>, <revnumber>254358</revnumber>). - </entry> + <revnumber>251668</revnumber>, + <revnumber>254358</revnumber>).</entry> </row> <row> @@ -4598,8 +4593,8 @@ <entry>10-CURRENT после добавления флагов mbuf <literal>M_PROTO[9-12]</literal> и удаления флагов <literal>M_FRAG|M_FIRSTFRAG|M_LASTFRAG</literal> (рев. - <revnumber>254524</revnumber>, <revnumber>254526</revnumber>). - </entry> + <revnumber>254524</revnumber>, + <revnumber>254526</revnumber>).</entry> </row> <row> @@ -4607,16 +4602,16 @@ <entry>21 августа 2013</entry> <entry>10-CURRENT после обновления &man.stat.2;, позволяюшего сохранять некоторые файловые атрибуты Windows/DOS и CIFS в - качестве флагов &man.stat.2; (рев. <revnumber>254627</revnumber>). - </entry> + качестве флагов &man.stat.2; (рев. + <revnumber>254627</revnumber>).</entry> </row> <row> <entry>1000048</entry> <entry>22 августа 2013</entry> <entry>10-CURRENT после изменения структуры - <literal>xsctp_inpcb</literal> (рев. <revnumber>254672</revnumber>). - </entry> + <literal>xsctp_inpcb</literal> (рев. + <revnumber>254672</revnumber>).</entry> </row> <row> @@ -4632,8 +4627,9 @@ <entry>1000050</entry> <entry>24 августа 2013</entry> <entry>10-CURRENT после изменения структуры <literal>mbuf</literal> - (рев. <revnumber>254780</revnumber>, <revnumber>254799</revnumber>, - <revnumber>254804</revnumber>, <revnumber>254807</revnumber> + (рев. <revnumber>254780</revnumber>, + <revnumber>254799</revnumber>, <revnumber>254804</revnumber>, + <revnumber>254807</revnumber>, <revnumber>254842</revnumber>).</entry> </row> @@ -4641,8 +4637,8 @@ <entry>1000051</entry> <entry>25 августа 2013</entry> <entry>10-CURRENT после импорта драйвера Radeon KMS (рев. - <revnumber>254885</revnumber>, <revnumber>254887</revnumber>). - </entry> + <revnumber>254885</revnumber>, + <revnumber>254887</revnumber>).</entry> </row> <row> @@ -4717,8 +4713,9 @@ <row> <entry>1000700</entry> <entry>7 декабря 2013</entry> - <entry>10-STABLE после отделения ветки <literal>releng/10.0</literal> - (рев. <revnumber>259069</revnumber>).</entry> + <entry>10-STABLE после отделения ветки + <literal>releng/10.0</literal> (рев. + <revnumber>259069</revnumber>).</entry> </row> <row> |