diff options
author | Sergey Kandaurov <pluknet@FreeBSD.org> | 2014-02-22 12:30:10 +0000 |
---|---|---|
committer | Sergey Kandaurov <pluknet@FreeBSD.org> | 2014-02-22 12:30:10 +0000 |
commit | b2690733d46ca8cfe01edcc23d13e7e15c7a8506 (patch) | |
tree | e7244df884946928f4ce27adeb3e7169e75fc18c /ru_RU.KOI8-R | |
parent | c6739bc4d1dec34d8c7d4f7e1c586a2e2ab8388f (diff) | |
download | doc-b2690733d46ca8cfe01edcc23d13e7e15c7a8506.tar.gz doc-b2690733d46ca8cfe01edcc23d13e7e15c7a8506.zip |
MFen r43840 et al.
Break the porters handbook out into individual chapters.
Notes
Notes:
svn path=/head/; revision=44029
Diffstat (limited to 'ru_RU.KOI8-R')
34 files changed, 13186 insertions, 12715 deletions
diff --git a/ru_RU.KOI8-R/books/porters-handbook/Makefile b/ru_RU.KOI8-R/books/porters-handbook/Makefile index a2baf81498..3590f2ed80 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/Makefile +++ b/ru_RU.KOI8-R/books/porters-handbook/Makefile @@ -4,7 +4,7 @@ # $FreeBSD$ # $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/Makefile,v 1.7 2003/09/26 02:34:16 andy Exp $ # -# Original revision: r42686 +# Original revision: r43849 # # @@ -27,6 +27,21 @@ INSTALL_ONLY_COMPRESSED?= # XML content SRCS= book.xml +SRCS+= porting-why/chapter.xml +SRCS+= new-port/chapter.xml +SRCS+= quick-porting/chapter.xml +SRCS+= slow-porting/chapter.xml +SRCS+= makefiles/chapter.xml +SRCS+= special/chapter.xml +SRCS+= plist/chapter.xml +SRCS+= pkg-files/chapter.xml +SRCS+= testing/chapter.xml +SRCS+= upgrading/chapter.xml +SRCS+= security/chapter.xml +SRCS+= porting-dads/chapter.xml +SRCS+= porting-samplem/chapter.xml +SRCS+= keeping-up/chapter.xml +SRCS+= appendices/chapter.xml SRCS+= uses.xml SRCS+= versions.xml @@ -55,4 +70,14 @@ IMAGES_LIB+= callouts/21.png DOC_PREFIX?= ${.CURDIR}/../../.. +# Entities +SRCS+= chapters.ent + +SYMLINKS= ${DESTDIR} index.html handbook.html + +# Turn on all the chapters. +CHAPTERS?= ${SRCS:M*chapter.xml} + +XMLFLAGS+= ${CHAPTERS:S/\/chapter.xml//:S/^/-i chap./} + .include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/ru_RU.KOI8-R/books/porters-handbook/appendices/Makefile b/ru_RU.KOI8-R/books/porters-handbook/appendices/Makefile new file mode 100644 index 0000000000..fabed18c42 --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/appendices/Makefile @@ -0,0 +1,17 @@ +# +# Build the Porters Handbook with just the content from this chapter. +# +# $FreeBSD$ +# +# Original revision: r43840 +# + +CHAPTERS= appendices/chapter.xml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" diff --git a/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml new file mode 100644 index 0000000000..00e7ce81a5 --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/appendices/chapter.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="koi8-r"?> +<!-- + The FreeBSD Russian Documentation Project + + $FreeBSD$ + + Original revision: r43844 +--> + +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="appendices"> + + <title>Приложения</title> + + <sect1 xml:id="uses-values"> + <title>Значения <varname>USES</varname></title> + + <table> + <title>Значения <varname>USES</varname></title> + + <tgroup cols="3"> + <thead> + <row> + <entry>Наименование</entry> + <entry>Аргументы</entry> + <entry>Описание</entry> + </row> + </thead> + <tbody valign="top"> + &values.uses; + </tbody> + </tgroup> + </table> + </sect1> + + <sect1 xml:id="freebsd-versions"> + <title>Значения <literal>__FreeBSD_version</literal></title> + + <para>Ниже для справки приводится перечень значений + <literal>__FreeBSD_version</literal> в виде, который определён в + <link xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para> + + <table frame="none"> + <title>Значения <literal>__FreeBSD_version</literal></title> + + <tgroup cols="3"> + <thead> + <row> + <entry>Значение</entry> + <entry>Дата</entry> + <entry>Релиз</entry> + </row> + </thead> + + <tbody> + &values.versions; + </tbody> + </tgroup> + </table> + + <note> + <para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как + <quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой принцип + использовался год и месяц, но мы решили изменить его на более + однозначную систему нумерации старший/младший, начиная с версии + 2.2. Это объясняется тем, что параллельная разработка в нескольких + ветках делает непрактичным идентификацию релизов просто по их + реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит + заботиться о старых версиях -CURRENT; они перечислены здесь просто + в информационных целях.</para> + </note> + </sect1> + </chapter> + diff --git a/ru_RU.KOI8-R/books/porters-handbook/book.xml b/ru_RU.KOI8-R/books/porters-handbook/book.xml index 50339b5cbf..e956c545e8 100644 --- a/ru_RU.KOI8-R/books/porters-handbook/book.xml +++ b/ru_RU.KOI8-R/books/porters-handbook/book.xml @@ -3,16 +3,20 @@ "http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd" [ <!ENTITY values.uses SYSTEM "uses.xml"> <!ENTITY values.versions SYSTEM "versions.xml"> -]> + <!-- The FreeBSD Russian Documentation Project $FreeBSD$ $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/book.xml,v 1.136 2006/10/20 09:25:00 marck Exp $ - Original revision: r43827 + Original revision: r43840 --> +<!ENTITY % chapters SYSTEM "chapters.ent"> +%chapters; +]> + <book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="ru"> @@ -59,12671 +63,19 @@ <releaseinfo>$FreeBSD$</releaseinfo> </info> - <chapter xml:id="why-port"> - <title>Введение</title> - - <para>Коллекция портов &os; является способом, используемым - практически каждым для установки приложений ("портов") на &os;. - Как и почти всё остальное во &os;, эта система в основном является - добровольно поддерживаемым начинанием. Важно иметь это в виду при - чтении данного документа.</para> - - <para>Во &os; каждый может прислать новый порт либо изъявить желание - поддерживать существующий порт, если его никто ещё никто не - поддерживает—вам не нужно иметь никаких особых привилегий на - внесение изменений, чтобы это делать.</para> - </chapter> - - <chapter 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 xml:id="quick-porting"> - <title>Быстрое портирование</title> - - <para>В этом разделе описано, как создать новый порт на скорую руку. - Во многих случаях этого бывает не достаточно, так что вам нужно будет - прочитать документ дальше.</para> - - <para>Во-первых, скачайте оригинальный tar-файл и поместите его в каталог - <varname>DISTDIR</varname>, который по умолчанию есть не что иное, как - <filename>/usr/ports/distfiles</filename>.</para> - - <note> - <para>Здесь предполагается, что программное обеспечение компилируется - без проблем как есть, то есть для работы приложения на вашей системе - &os; не потребовалось абсолютно никаких изменений. Если - требовалось что-то изменить, то вам придется обратиться также и к - следующему разделу.</para> - </note> - - <note> - <para>Перед началом портирования рекомендуется установить - переменную &man.make.1; <varname>DEVELOPER</varname> в - <filename>/etc/make.conf</filename>.</para> - - <screen>&prompt.root; <userinput>echo DEVELOPER=yes >> /etc/make.conf</userinput></screen> - - <para>Эта настройка включает <quote>режим разработчика</quote>, - в котором отображаются предупреждения при использовании - устаревших конструкций и задействуются некоторые дополнительные - проверки при вызове команды <command>make</command>.</para> - </note> - - <sect1 xml:id="porting-makefile"> - <title>Создание файла <filename>Makefile</filename></title> - - <para>Минимальный <filename>Makefile</filename> будет выглядеть - примерно так:</para> - - <programlisting># $FreeBSD$ - -PORTNAME= oneko -PORTVERSION= 1.1b -CATEGORIES= games -MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/ - -MAINTAINER= youremail@example.com -COMMENT= Cat chasing a mouse all over the screen - -.include <bsd.port.mk></programlisting> - - <note> - <para>В некоторых случаях в заголовке <filename>Makefile</filename> - существующего порта могут содержаться дополнительные строки, - такие как название порта и дата его создания. - Эта дополнительная информация была объявлена устаревшей - и находится в процессе удаления.</para> - </note> - - <para>Посмотрим, сможете ли вы его понять. Не обращайте внимание на - содержимое строчки <literal>$FreeBSD$</literal>, она - будет заполнена автоматически системой - <application>Subversion</application>, когда порт будет - импортирован в наше дерево портов. Вы можете найти более подробный - пример в разделе <link linkend="porting-samplem">пример - Makefile</link>.</para> - </sect1> - - <sect1 xml:id="porting-desc"> - <title>Создание информационных файлов</title> - - <para>Имеется два информационных файла, которые требуются для любого - порта, вне зависимости от того, является ли он пакетом или нет. Это - <filename>pkg-descr</filename> и <filename>pkg-plist</filename>. - Префикс <filename>pkg-</filename> отличает их от других файлов.</para> - - <sect2> - <title><filename>pkg-descr</filename></title> - - <para>Это более подробное краткое описание порта. От одного до - нескольких абзацев, кратко описывающих, что представляет собой - порт, будет достаточно.</para> - - <note> - <para>Это <emphasis>не</emphasis> руководство и не подробнейшее - описание того, как использовать или компилировать порт! - <emphasis>Пожалуйста, будьте внимательны при копировании текста - из <filename>README</filename> или страниц - справочника</emphasis>; слишком часто они не являются кратким - описанием порта или имеют неудобный формат (например, страницы - справочника выровнены пробелами, что особенно плохо - смотрится с моноширинными шрифтами).</para> - </note> - - <para>Хорошо составленный <filename>pkg-descr</filename> - описывает порт достаточно полно, чтобы пользователю не - приходилось сверяться с документацией или посещать вебсайт - для понимания того, что делает данное программное обеспечение, - чем оно может быть полезно или какие хорошие функции у него - имеются. Упоминание про определённые требования, такие как - используемый графический инструментарий, тяжёлые зависимости, - окружение для запуска или используемый язык программирования - помогут пользователям определиться, будет ли этот порт для - них работать.</para> - - <para>Включите сюда URL официальной домашней страницы Интернет. - Перед <emphasis>одним</emphasis> из сайтов (выберите основной) - добавьте <literal>WWW:</literal> (с последующим единичным - пробелом) для того, чтобы вспомогательные утилиты работали - правильно. Если URI является корнем сайта или каталогом, - то значение должно быть дополнено косой чертой.</para> - - <note> - <para>Если указанная для порта веб-страница не доступна, - попытайтесь сперва поискать, был ли официальный сайт - перемещён, переименован или размещён в другом месте.</para> - </note> - - <para>Следующий пример показывает, как должен выглядеть ваш - <filename>pkg-descr</filename>:</para> - - <programlisting>This is a port of oneko, in which a cat chases a poor mouse all over -the screen. - : -(etc.) - -WWW: http://www.oneko.org/</programlisting> - </sect2> - - <sect2> - <title><filename>pkg-plist</filename></title> - - <para>Здесь перечисляются все файлы, устанавливаемые портом. Его - также называют <quote>списком для упаковки</quote>, потому что - пакет генерируется упаковкой файлов, которые здесь указаны. - Имена путей указываются относительно установочного префикса - (обычно <filename>/usr/local</filename>). - Если порт во время установки создает каталоги, убедитесь, - что добавлены строки <literal>@dirrm</literal> для удаления - каталогов при удалении пакета.</para> - - <para>Вот маленький пример:</para> - - <programlisting>bin/oneko -man/man1/oneko.1.gz -lib/X11/app-defaults/Oneko -lib/X11/oneko/cat1.xpm -lib/X11/oneko/cat2.xpm -lib/X11/oneko/mouse.xpm -@dirrm lib/X11/oneko</programlisting> - - <para>Обратитесь к странице справочной системы по команде - &man.pkg-create.8; с подробным описанием формата списка - упаковки.</para> - - <note> - <para>Рекомендуется, чтобы имена файлов в этом списке были - отсортированы в алфавитном порядке. Это позволит значительно - облегчить сверку изменений при обновлении порта.</para> - </note> - - <note> - <para>Создание списка упаковки вручную может оказаться весьма - трудоёмкой задачей. Если порт устанавливает большое количество - файлов, раздел об <link linkend="plist-autoplist">автоматическом построении списка - упаковки</link> может помочь сэкономить время.</para> - </note> - - <para>Существует только одно исключение, когда у порта может - отсутствовать <filename>pkg-plist</filename>. Если порт - устанавливает лишь несколько файлов, а возможно, и каталогов, то - они могут быть перечислены в переменных - <varname>PLIST_FILES</varname> и <varname>PLIST_DIRS</varname>, - соответственно, внутри файла <filename>Makefile</filename> порта. - К примеру, мы можем обойтись без файла - <filename>pkg-plist</filename> у приведённого выше порта - <filename>oneko</filename>, добавив следующие строки в - <filename>Makefile</filename>:</para> - - <programlisting>PLIST_FILES= bin/oneko \ - man/man1/oneko.1.gz \ - lib/X11/app-defaults/Oneko \ - lib/X11/oneko/cat1.xpm \ - lib/X11/oneko/cat2.xpm \ - lib/X11/oneko/mouse.xpm -PLIST_DIRS= lib/X11/oneko</programlisting> - - <para>Конечно, переменная <varname>PLIST_DIRS</varname> не должна - задаваться, если порт не устанавливает никаких каталогов.</para> - - <note> - <para>Несколько портов могут совместно использовать общий - каталог. В этом случае <varname>PLIST_DIRS</varname> - следует заменить на <varname>PLIST_DIRSTRY</varname>, так - чтобы каталог удалялся только если он пуст, а иначе - игнорировался. Использование <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname> аналогично - <literal>@dirrm</literal> и <literal>@dirrmtry</literal> - в <filename>pkg-plist</filename>, описание которых - входит в <xref linkend="plist-dir-cleaning"/>.</para> - </note> - - <para>Обратной стороной такого способа перечисления файлов и - каталогов порта является невозможность использования - последовательностей команд, описанных в &man.pkg-create.8;. - Поэтому он подходит для простых портов, что делает их ещё более - простыми. Одновременно с этим положительным моментом является - уменьшение количества файлов в коллекции портов. Пожалуйста, - подумайте над использованием этой техники, прежде чем создавать - <filename>pkg-plist</filename>.</para> - - <para>Далее мы увидим, как можно использовать файлы - <filename>pkg-plist</filename> и <varname>PLIST_FILES</varname> - выполнения <link linkend="plist">более сложных - задач</link>.</para> - </sect2> - </sect1> - - <sect1 xml:id="porting-checksum"> - <title>Создание файла с контрольной суммой</title> - - <para>Просто введите команду <command>make makesum</command>. - Правила утилиты make автоматически сгенерируют файл - <filename>distinfo</filename>.</para> - - <para>Если у извлекаемого файла регулярно меняется контрольная - сумма и вы не сомневаетесь в надежности источника (т.е. он получен - из CD производителя, либо ежедневно обновляется документация), то вы - должны указать эти файлы в переменной <varname>IGNOREFILES</varname>. - Тогда контрольная сумма при выполнении <command>make makesum</command> - для этого файла создаваться не будет, а вместо этого для него будет - установлено значение <literal>IGNORE</literal>.</para> - </sect1> - - <sect1 xml:id="porting-testing"> - <title>Тестирование порта</title> - - <para>Вы должны удостовериться, что правила построения порта выполняют - именно то, что вы хотите, включая создание пакета для порта. Вот - те важные вещи, которые вы должны проверить.</para> - - <itemizedlist> - <listitem> - <para><filename>pkg-plist</filename> не содержит ничего сверх того, - что устанавливается портом</para> - </listitem> - - <listitem> - <para><filename>pkg-plist</filename> содержит абсолютно все, что - устанавливается портом</para> - </listitem> - - <listitem> - <para>Порт может быть установлен с помощью - указания цели <buildtarget>install</buildtarget>. Это - позволяет убедиться в правильной работе сценария - установки.</para> - </listitem> - - <listitem> - <para>Порт может быть правильным образом удалён с помощью - указания цели <buildtarget>deinstall</buildtarget>. Это - позволяет убедиться в правильной работе сценария - удаления.</para> - </listitem> - - <listitem> - <para>Следует убедиться, что <command>make package</command> - можно запустить из-под обычного пользователя (то есть, - не из-под <systemitem class="username">root</systemitem>). - Если это не так, в <filename>Makefile</filename> порта - должно быть добавлено <literal>NEED_ROOT=yes</literal>.</para> - </listitem> - </itemizedlist> - - <procedure> - <title>Рекомендуемый порядок проверки</title> - - <step> - <para><command>make stage</command></para> - </step> - - <step> - <para><command>make check-orphans</command></para> - </step> - - <step> - <para><command>make package</command></para> - </step> - - <step> - <para><command>make install</command></para> - </step> - - <step> - <para><command>make deinstall</command></para> - </step> - - <step> - <para><command>pkg add package-filename</command></para> - </step> - - <step> - <para><command>make package</command> (из-под - пользователя)</para> - </step> - </procedure> - - <para>Убедитесь, что на любом из этапов не выдается никаких - предупреждений.</para> - - <para>Основательное автоматизированное тестирование может быть - выполнено при помощи - <package role="port">ports-mgmt/tinderbox</package> или - <package role="port">ports-mgmt/poudriere</package> из Коллекции - Портов. Эти приложения используют <literal>jails</literal>, - в которых проверяются все перечисленные выше этапы без - изменения состояния основной системы.</para> - </sect1> - - <sect1 xml:id="porting-portlint"> - <title>Проверка вашего порта утилитой - <command>portlint</command></title> - - <para>Будьте добры, пользуйтесь утилитой <command>portlint</command> - для проверки того, что ваш порт соответствует нашим рекомендациям. - Программа <package role="port">ports-mgmt/portlint</package> - является частью Коллекции - Портов. В частности, вы можете захотеть проверить, правильно ли - сформирован файл <link linkend="porting-samplem">Makefile</link> и - соответствующим ли образом именован <link linkend="porting-pkgname">пакет</link>.</para> - </sect1> - - <sect1 xml:id="porting-submitting"> - <title>Посылка нового порта</title> - - <para>Перед посылкой нового порта прочитайте раздел о том, что - <link linkend="porting-dads">можно и нельзя</link> делать.</para> - - <para>Когда вы наконец довольны своим первым портом, единственное, - что осталось сделать, это включить его в основное дерево портов - &os; и осчастливить этим всех остальных. Нам не нужен ни - каталог <filename>work</filename>, ни пакет - <filename>pkgname.tgz</filename>, так что удалите их прямо - сейчас.</para> - - <para>Затем получите файл &man.shar.1;. Предполагая, что порт - называется oneko, перейдите в каталог выше, где находится - каталог <literal>oneko</literal>, и наберите: - <command>shar `find oneko` > oneko.shar</command></para> - - <para>Включите <filename>oneko.shar</filename> в сообщение об - ошибке и пошлите его с помощью &man.send-pr.1;. Обратитесь к - разделу <link - xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL"> - Сообщения об ошибках и общие замечания</link> для получения - подробной информации о &man.send-pr.1;).</para> - - <para>Укажите в сообщении категорию <literal>ports</literal> и - класс <literal>change-request</literal>. - <emphasis>Не</emphasis> указывайте, что сообщение имеет статус - <literal>confidential</literal>! Добавьте краткое описание - программы в поле <quote>Description</quote> отправляемого PR - (например, содержимое <varname>COMMENT</varname> в сокращённом - варианте) и сам файл в виде архива <filename>.shar</filename> - в поле <quote>Fix</quote>.</para> - - <note> - <para>Хорошее описание в заголовке сообщения о проблеме - значительно облегчает работу коммиттеров портов. Для новых - портов мы предпочитаем нечто вроде <quote>New port: - <категория>/<название порта> <краткое - описание порта></quote>. Следование этой схеме - упрощает и ускоряет начало работы по добавлению нового - порта.</para> - </note> - - <para>Повторим ещё раз, что <emphasis>не нужно включать ни оригинальный - файл с дистрибутивом, ни каталог <filename>work</filename>, - ни пакет, построенный вами командой - <command>make package</command></emphasis>; для новых портов - используйте &man.shar.1;, но не &man.diff.1;.</para> - - <para>После отправки порта, пожалуйста, потерпите. Время, - необходимое для включения нового порта во &os;, может занимать - от нескольких дней до нескольких месяцев. <link - xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports"> - Здесь</link> можно увидеть список ожидающих PR для портов.</para> - - <para>После рассмотрения нового порта мы при необходимости вам - ответим, а затем включим порт в наше дерево. Ваше имя также - будет добавлено в список <link - xlink:href="&url.articles.contributors;/contrib-additional.html"> - Дополнительных контрибуторов проекта &os;</link> и другие - файлы.</para> - </sect1> - </chapter> - - <chapter xml:id="slow"> - <title>Медленное портирование</title> - - <para>Итак, все оказалось не так уж и просто, и порт потребовал - некоторых модификаций для того, чтобы заставить его работать. В этом - разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он - работал с нашей системой портов.</para> - - <sect1 xml:id="slow-work"> - <title>Как всё это работает</title> - - <para>Во-первых, когда пользователь дает в своем каталоге с портом - команду <command>make</command>, происходит целая череда событий. - Во время чтения этого текста может оказаться полезным иметь файл - <filename>bsd.port.mk</filename> открытым в другом окне, что сильно - поможет в их понимании.</para> - - <para>Но не волнуйтесь сильно, если вы не до конца понимаете, что - делается в <filename>bsd.port.mk</filename>, не так уж много людей - его понимает... <!-- smiley --><emphasis>:-></emphasis></para> - - <procedure> - <step> - <para>Запускается цель <buildtarget>fetch</buildtarget>. Цель - <buildtarget>fetch</buildtarget> отвечает за то, что архив исходных - текстов имеется в наличии локально в каталоге - <varname>DISTDIR</varname>. Если цель - <buildtarget>fetch</buildtarget> не может найти требуемые файлы в - каталоге <varname>DISTDIR</varname>, то они будут искаться по - указателю URL <varname>MASTER_SITES</varname>, который - устанавливается в Makefile, а также на наших FTP зеркалах, - куда мы по возможности помещаем дистрибутивные файлы для архива. - Затем она попытается сгрузить указанный файл с помощью - <varname>FETCH</varname>, полагая, что запрашивающая машина имеет - прямое подключение к Интернет. Если файл скачается удачно, то - он будет помещен в каталог <varname>DISTDIR</varname> для - последующего использования и обработки.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>extract</buildtarget>. Она ищет - дистрибутивный файл порта (как правило, tar-архив - <command>gzip</command>) в - каталоге <varname>DISTDIR</varname> и распаковывает его во - временный каталог, задаваемый переменной - <varname>WRKDIR</varname> (по умолчанию - <filename>work</filename>).</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>patch</buildtarget>. Во-первых, - применяются все патчи, заданные переменной - <varname>PATCHFILES</varname>. Во-вторых, если какие-либо файлы с - патчами, носящие имена - <filename>patch-*</filename>, имеются в - подкаталоге <varname>PATCHDIR</varname> (по умолчанию это каталог - <filename>files</filename>), то они применяются в этот момент в - алфавитном порядке.</para> - </step> - - <step> - <para>Запускается цель <buildtarget>configure</buildtarget>. Здесь - может выполняться любая из многих различных вещей.</para> - - <orderedlist> - <listitem> - <para>Если существует скрипт - <filename>scripts/configure</filename>, то он запускается. - </para> - </listitem> - - <listitem> - <para>Если задана переменная <varname>HAS_CONFIGURE</varname> - или <varname>GNU_CONFIGURE</varname>, то запускается скрипт - <filename>WRKSRC/configure</filename>. - </para> - </listitem> - </orderedlist> - </step> - - <step> - <para>Выполняется цель <buildtarget>build</buildtarget>. Она - отвечает за переход в собственный рабочий каталог порта - (<varname>WRKSRC</varname>) и его построение.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>stage</buildtarget>. - Конечный набор построенных файлов помещается во временный - каталог (<varname>STAGEDIR</varname>, смотрите - <xref linkend="staging"/>). Иерархия этого - каталога отражает иерархию каталогов системы, в которую - данный пакет будет устанавливаться.</para> - </step> - - <step> - <para>Выполняется цель <buildtarget>install</buildtarget>. - В систему копируются файлы, перечисленные в pkg-plist - порта.</para> - </step> - </procedure> - - <para>Выше перечислены стандартные действия. Кроме того, вы сами - можете определить цели - <buildtarget>pre-<replaceable>что-то</replaceable></buildtarget> или - <buildtarget>post-<replaceable>что-то</replaceable></buildtarget>, - или создать скрипты с такими именами в подкаталоге - <filename>scripts</filename>, и они будут запущены до или после - выполнения действий по умолчанию.</para> - - <para>Например, если у вас есть цель - <buildtarget>post-extract</buildtarget>, определённая в вашем файле - <filename>Makefile</filename> и файл <filename>pre-build</filename> в - подкаталоге - <filename>scripts</filename>, то после выполнения обычных действий по - распаковке, будет вызвана цель <buildtarget>post-extract</buildtarget> - а скрипт <filename>pre-build</filename> будет выполнен перед - запуском стандартных правил построения. Рекомендуется использовать - цели из <filename>Makefile</filename>, если действия достаточно - просты, потому что в дальнейшем будет проще определить, какие - нестандартные действия требует порт.</para> - - <para>Действия по умолчанию выполняются целями - <buildtarget>do-<replaceable>что-то</replaceable></buildtarget> из - <filename>bsd.port.mk</filename>. Например, команды для - распаковки порта находятся в цели - <buildtarget>do-extract</buildtarget>. Если вам не хватает цели по - умолчанию, вы можете ее исправить, переопределив цель - <buildtarget>do-<replaceable>something</replaceable></buildtarget> - в вашем файле <filename>Makefile</filename>.</para> - - <note> - <para><quote>Основные</quote> цели (к примеру, - <buildtarget>extract</buildtarget>, <buildtarget>configure</buildtarget> - и так далее) не делают ничего больше, - чем проверяют успешность завершения всех предыдущих шагов и - вызывают настоящие цели или скрипты, и их не нужно менять. Если - вам нужно изменить распаковку, исправляйте - <buildtarget>do-extract</buildtarget>, но никогда не меняйте способ - работы <buildtarget>extract</buildtarget>! Кроме того, цель - <buildtarget>post-deinstall</buildtarget> является недействительной - и не выполняется инфраструктурой портов.</para> - </note> - - <para>Теперь, когда вы представляете, что происходит, когда - пользователь набирает команду <command>make install</command>, - давайте пройдемся - через шаги, рекомендуемые для создания настоящего порта.</para> - </sect1> - - <sect1 xml:id="slow-sources"> - <title>Получение исходного кода</title> - - <para>Получите оригинальные исходные тексты (обычно) в виде - упакованного tar-архива - (<filename>foo.tar.gz</filename> или - <filename>foo.tar.bz2</filename>) - и скопируйте его в каталог <varname>DISTDIR</varname>. Всегда - используйте исходные тексты <emphasis>основной ветки - разработки</emphasis> везде, где это возможно.</para> - - <para>Вам потребуется задать значение переменной - <varname>MASTER_SITES</varname> так, чтобы оно указывало на - местоположение оригинального tar-архива. В файле - <filename>bsd.sites.mk</filename> вы найдёте краткие обозначения - для большинства популярных сайтов. Пожалуйста, используйте эти - сайты—и соответствующие определения—везде, где это - возможно, чтобы избежать проблем повторения одной и той же информации - в базе источников. Так как эти сайты со временем меняются, для - всех причастных поддержка становится настоящим кошмаром.</para> - - <para>Если вы не можете найти FTP/HTTP сайт с хорошим подключением к - сети, или находите только сайты, которые имеют раздражающе - нестандартные форматы, то можете захотеть поместить копию на надежный - сервер FTP или HTTP, который вам доступен (например, ваша домашняя - страница).</para> - - <para>Если вы не можете найти доступного и надёжного места для - помещения дистрибутивного файла, то мы сами сможем разместить его на - сервере <systemitem>ftp.FreeBSD.org</systemitem>; однако это наименее - рекомендуемое решение. Дистрибутивный файл должен - быть помещён в каталог <filename>~/public_distfiles/</filename> - одного из пользователей машины <systemitem>freefall</systemitem>. Попросите - того, кто коммиттил ваш порт, сделать это. Этот человек также задаст - переменной <varname>MASTER_SITES</varname> значение - <varname>MASTER_SITE_LOCAL</varname>, а в переменной - <varname>MASTER_SITE_SUBDIR</varname> укажет своё имя пользователя - с машины <systemitem>freefall</systemitem>.</para> - - <para>Если дистрибутивные файлы вашего порта постоянно меняются по - неизвестным причинам без изменения версий со стороны автора, остаётся - только поместить дистрибутив на вашу домашнюю Web-страницу и указать - её первой в списке <varname>MASTER_SITES</varname>. Если можете, - попытайтесь договориться с автором порта об этом; это действительно - помогает в достижении некоторого управления исходным кодом. - Размещение собственной версии поможет избежать появления ошибок у - пользователей типа <errorname>checksum mismatch</errorname>, а - также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер. - Также, если у порта имеется только один основной сервер, то - рекомендуется поместить архивную копию на свой сайт и указать его в - списке <varname>MASTER_SITES</varname> вторым.</para> - - <para>Если вашему порту требуются дополнительные `патчи', доступные - в Интернет, скачайте также и их, поместив в каталог - <varname>DISTDIR</varname>. Не волнуйтесь, если они находятся не - на том же сайте, откуда взят дистрибутивный архив, мы умеем - обрабатывать такие ситуации (смотрите описание <link linkend="porting-patchfiles">PATCHFILES</link> ниже).</para> - </sect1> - - <sect1 xml:id="slow-modifying"> - <title>Модификация порта</title> - - <para>Распакуйте копию дистрибутивного файла в отдельный каталог и - внесите изменения, которые необходимы для того, чтобы порт - компилировался нормально в текущей версии &os;. - <emphasis>Тщательно отслеживайте</emphasis> все, что вы делаете, - этот процесс вам предстоит автоматизировать. Все, включая удаление, - добавление или модификацию в файлах должны будут выполняться - автоматически с помощью скриптов или файлов патчей, когда вы - завершите работу над портом.</para> - - <para>Если вашему порту во время компиляции, установки и настройки - требуется довольно много взаимодействовать с пользователем, то - посмотрите на один из классических скриптов - <application>Configure</application> Лэрри Уолла (Larry Wall) и - сделайте сами что-либо подобное. Предназначение новой коллекции - портов - это сделать каждое приложение в стиле - <quote>plug-and-play</quote> настолько, насколько это вообще возможно - для конечного пользователя при минимальном использовании дискового - пространства.</para> - - <note> - <para>Если явно не указано обратное, то патчи, скрипты и другие - файлы, которые вы создали и предоставили для Коллекции Портов - &os;, неявно подпадают под стандартные условия лицензии - BSD.</para> - </note> - </sect1> - - <sect1 xml:id="slow-patch"> - <title>Создание патчей</title> - - <para>Файлы, которые добавлялись или изменялись в процессе создания - порта, могут быть выявлены программой &man.diff.1;, - а результат работы этой программы может быть в дальнейшем передан - программе &man.patch.1;. Такое действие с обычным файлом - подразумевает сохранение копии файла с первоначальным содержимым - перед внесением каких-либо изменений.</para> - - <screen>&prompt.user; <userinput>cp <replaceable>file</replaceable> <replaceable>file</replaceable>.orig</userinput></screen> - - <para>Патчи сохраняются в виде файлов с именем - <filename>patch-*</filename>, где - <replaceable>*</replaceable> обозначает путь к файлу, - к которому применяется патч, такой как - <filename>patch-Imakefile</filename> или - <filename>patch-src-config.h</filename>.</para> - - <para>После того как файл был изменён, используется &man.diff.1; - для получения разницы между первоначальной и изменённой - версиями. Параметр <option>-u</option> указывает &man.diff.1; - выводить разницу в <quote>унифицированном</quote> формате, - который также является предпочтительным.</para> - - <screen>&prompt.user; <userinput>diff -u <replaceable>file</replaceable>.orig <replaceable>file</replaceable> > patch-<replaceable>pathname-file</replaceable></userinput></screen> - - <para>Для порождении патчей для новых добавляемых файлов - используется параметр <option>-N</option>, который заставляет - &man.diff.1; трактовать несуществующие прежде файлы как если - бы они существовали, но имели пустое содержимое:</para> - - <screen>&prompt.user; <userinput>diff -u -N <replaceable>newfile</replaceable>.orig <replaceable>newfile</replaceable> > patch-<replaceable>pathname-newfile</replaceable></userinput></screen> - - <para>Файлы с патчами помещаются в - каталоге <varname>PATCHDIR</varname> - (как правило, это <filename class="directory">files/</filename>), - откуда они будут взяты автоматически. Все патчи обязаны быть сделаны - относительно каталога <varname>WRKSRC</varname> (как правило, - это каталог, в который распаковывается исходный архив и где будет - выполняться построение). Для упрощения внесения изменений и - обновлений избегайте наличия более чем одного патча для - одного и того же файла (например, патчей - <filename>patch-file</filename> и <filename>patch-file2</filename>, - оба меняющих файл <filename>WRKSRC/foobar.c</filename>). - Обратите внимание, что если путь к изменяемому файлу содержит символ - подчеркивания (<literal>_</literal>), то патч должен содержать в своем - имени два подчеркивания вместо одного. Например, для применения патча - на файл с именем <filename>src/freeglut_joystick.c</filename> - соответствующий патч следует назвать - <filename>patch-src-freeglut__joystick.c</filename>.</para> - - <para>Пожалуйста, используйте для именования патчей только символы - <literal>[-+._a-zA-Z0-9]</literal>. Не используйте любые другие - символы, кроме этих. Не называйте патчи как - <filename>patch-aa</filename> или <filename>patch-ab</filename>, - всегда ссылайтесь на путь и название файла в названиях самих - патчей.</para> - - <para>Существует альтернативный упрощённый способ создания - патчей для существующих файлов. Первые шаги те же самые: - создание копии неизменённого файла с расширением - <filename>.orig</filename> и внесение изменений. После этого - используйте <command>make makepatch</command>, чтобы обновить - файлы с патчами в каталоге <filename>files</filename> данного - порта.</para> - - <para>Не помещайте строки RCS в патчи. - <application>Subversion</application> будет изменять их при - помещении файлов в дерево портов, и когда мы будем их оттуда - извлекать, они будут уже другие, поэтому применение патчей - окончится неудачей. Строчки RCS предваряются знаком доллара - (<literal>$</literal>), и обычно начинаются с - <literal>$Id</literal> или - <literal>$RCS</literal>.</para> - - <para>Использование параметра рекурсии (<option>-r</option>) с командой - &man.diff.1; для генерации патчей - это хорошо, но всё же, - пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в - отсутствии ненужного мусора. В частности, diff-разниц между двумя - резервными копиями файлов, файлы <filename>Makefile</filename>, когда - как порт использует <command>Imake</command> или - GNU-версию программы <command>configure</command>, и так далее, - не нужны, и должны быть удалены. Если было необходимо - отредактировать файл <filename>configure.in</filename> и - запустить <command>autoconf</command> для перегенерации - <command>configure</command>, не нужно включать файлы diff для - <command>configure</command> (они частенько вырастают до нескольких - тысяч строк!). Вместо этого задайте - <literal>USE_AUTOTOOLS=autoconf:261</literal> и - включите diff-файл для <filename>configure.in</filename>.</para> - - <para>Старайтесь минимизировать в патчах объём - нефункциональных изменений с пустыми символами. В мире Открытого - Исходного Кода является распространенным совместное использование - проектами больших объемов кодовой базы, но с различными стилями - и правилами отступов. При копировании работающей функциональной - части из одного проекта для исправления похожей области в другом, - будьте аккуратны, пожалуйста: получаемый однострочный патч - может указаться полон нефункциональных изменений. Это не только - увеличивает размер репозитория <application>Subversion</application>, - но также усложняет поиск того, - что конкретно вызвало проблему и что вообще поменялось.</para> - - <para>Если нужно удалить файл, сделайте это при выполнении цели - <buildtarget>post-extract</buildtarget>, вместо того чтобы - оформлять это как часть патча.</para> - - <para>Простые перемещения могут быть выполнены непосредственно из - <filename>Makefile</filename> порта с использованием &man.sed.1; в - режиме in-place. Это удобно, когда при изменении используется - значение переменной:</para> - - <programlisting>post-patch: - @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README</programlisting> - - <para>Довольно часто в исходных файлах портируемого программного - обеспечения используется конвенция CR/LF. Это может стать - причиной проблем с дальнейшей упаковкой, предупреждениями - компилятора или выполнением скриптов (таких как - <literal>/bin/sh^M not found</literal>). Для быстрого - преобразования всех файлов из CR/LF просто в LF добавьте - в <filename>Makefile</filename> порта эту запись:</para> - - <programlisting>USES= dos2unix</programlisting> - - <para>Может быть задан точный список преобразуемых файлов:</para> - - <programlisting>USES= dos2unix -DOS2UNIX_FILES= util.c util.h</programlisting> - - <para>Используйте <varname>DOS2UNIX_REGEX</varname>, чтобы - преобразовать группу файлов в разных подкаталогах. - Его параметром является регулярное выражение, совместимое с - &man.find.1;. Подробнее о формате в &man.re.format.7;. - Такой вариант удобен для преобразования всех файлов заданного - расширения. Для примера, преобразуем все исходные файлы, - не затрагивая двоичные файлы:</para> - - <programlisting>USES= dos2unix -DOS2UNIX_REGEX= .*\.([ch]|cpp)</programlisting> - - <para>Другим вариантом является использование - <varname>DOS2UNIX_GLOB</varname>, который вызывает - <command>find</command> для каждого из перечисленных в нём - элементов.</para> - - <programlisting>USES= dos2unix -DOS2UNIX_GLOB= *.c *.cpp *.h</programlisting> - </sect1> - - <sect1 xml:id="slow-configure"> - <title>Конфигурирование</title> - - <para>Поместите все дополнительные команды, требуемые для настройки, - в ваш скрипт <filename>configure</filename> и сохраните его в - подкаталоге <filename>scripts</filename>. Как отмечено выше, вы - можете сделать это целями в файле <filename>Makefile</filename> - и/или скриптами с именами <filename>pre-configure</filename> или - <filename>post-configure</filename>.</para> - </sect1> - - <sect1 xml:id="slow-user-input"> - <title>Обработка пользовательского ввода</title> - - <para>Если для построения, конфигурации или установки вашего порта - требуется некоторый ввод со стороны пользователя, то вы должны задать - переменную <varname>IS_INTERACTIVE</varname> в вашем файле - <filename>Makefile</filename>. В случае <quote>ночного - построения</quote> это позволит пропустить - ваш порт, если пользователь в своем окружении задал переменную - <envar>BATCH</envar> (и если пользователь установил переменную - <envar>INTERACTIVE</envar>, то будут строиться - <emphasis>только</emphasis> порты, которые требуют взаимодействия - с пользователем. Это сэкономит значительное количество времени на - части машин, которые постоянно строят порты (смотрите ниже).</para> - - <para>При наличии разумных ответов на задаваемые вопросы, подходящих по - умолчанию, также рекомендуется проверять переменную - <varname>PACKAGE_BUILDING</varname> и выключать интерактивный скрипт, - если он есть. Это позволит нам строить пакеты для помещения на - компакт-диски и FTP-серверы.</para> - </sect1> - </chapter> - - <chapter xml:id="makefile"> - <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> - - <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> - - <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> - - <itemizedlist> - <listitem> - <para>Первая категория должна быть физической категорий (смотрите - <link linkend="porting-categories">выше</link>). Это - необходимо для создания пакетов. После этого виртуальные - и физические категории могут смешиваться.</para> - </listitem> - - <listitem> - <para>Сначала всегда идут категории, специфичные для языков. - Например, если ваш порт устанавливает японские шрифты для X11, - то строчка <varname>CATEGORIES</varname> должна иметь вид - <filename>japanese x11-fonts</filename>.</para> - </listitem> - - <listitem> - <para>Более конкретные категории идут первыми перед более - общими. В частности, редактор HTML должен быть описан как - <filename>www editors</filename>, а не наоборот. Кроме того, вы - не должны указывать категорию <filename>net</filename>, если порт - относится к одной из категорий <filename>irc</filename>, - <filename>mail</filename>, - <filename>news</filename>, <filename>security</filename> или - <filename>www</filename>, так как <filename>net</filename> - включается автоматически.</para> - </listitem> - - <listitem> - <para><filename>x11</filename> используется как вторичная категория - только в случае, если в качестве основной категории указан - естественный язык. В частности, вам не нужно указывать - <filename>x11</filename> в качестве категории для - приложений X.</para> - </listitem> - - <listitem> - <para>Режимы для редактора <application>Emacs</application> должны - помещаться в ту же категорию, что и приложение, которое - поддерживается этим режимом, а не в <filename>editors</filename>. - Например, режим <application>Emacs</application> для - редактирования исходного кода некоторого языка программирования - должен быть помещен в категорию <filename>lang</filename>.</para> - </listitem> - - <listitem> - <para>Порты, устанавливающие загружаемые модули ядра, должны - содержать виртуальную категорию <filename>kld</filename> в - строке <varname>CATEGORIES</varname>. Это одно из действий, - выполняемых автоматически с добавлением - <literal>kmod</literal> в строке <varname>USES</varname>. - </para> - </listitem> - - <listitem> - <para><filename>misc</filename> - не должна указываться вместе с любой другой невиртуальной - категорией. Если вы указываете <literal>misc</literal> - вместе с чем-то ещё в строке <varname>CATEGORIES</varname>, - это значит, что вы можете спокойно удалить - <literal>misc</literal> и просто поместить порт в этот - другой подкаталог!</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> - - <tbody> - <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> - - <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> - </listitem> - - <listitem> - <para>Элементы, за которыми следуют <literal>:n</literal>, - принадлежат группе <literal>n</literal>, - <literal>:m</literal> относится к группе <literal>m</literal> и - так далее.</para> - </listitem> - - <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> - - <para>Следующие примеры равнозначны, но первый более - предпочтителен:</para> - - <programlisting>MASTER_SITES= alpha</programlisting> - - <programlisting>MASTER_SITES= alpha:DEFAULT</programlisting> - </listitem> - - <listitem> - <para>Группы не являются эксклюзивными, элемент может - принадлежать к нескольким отличающимся группам одновременно, а - группа может либо иметь несколько различных элементов, либо не - иметь их вовсе. Повторяющиеся элементы в одной и той же группе - будут являться просто повторяющимися элементами.</para> - </listitem> - - <listitem xml:id="porting-master-sites-n-comma-operator"> - <para>Если в хотите, чтобы элемент принадлежал к нескольким - группам одновременно, вы можете использовать - запятую (<literal>,</literal>).</para> - - <para>Вместо того, чтобы повторять их несколько раз, каждый раз с - разным постфиксом, мы можем перечислить несколько групп за раз - в одном постфиксе. Например, <literal>:m,n,o</literal> - определяет элемент, принадлежащий группам <literal>m</literal>, - <literal>n</literal> и <literal>o</literal>.</para> - - <para>Все следующие примеры имеют один смысл, но последний - является предпочтительным:</para> - - <programlisting>MASTER_SITES= alpha alpha:SOME_SITE</programlisting> - - <programlisting>MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE</programlisting> - - <programlisting>MASTER_SITES= alpha:SOME_SITE,DEFAULT</programlisting> - - <programlisting>MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting> - </listitem> - - <listitem> - <para>Все серверы внутри определённой группы сортируются в - соответствии с <varname>MASTER_SORT_AWK</varname>. Все группы - в <varname>MASTER_SITES</varname> и - <varname>PATCH_SITES</varname> тоже сортируются.</para> - </listitem> - - <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> - - <listitem> - <para>Как мне сгруппировать одну из специальных переменных из - <filename>bsd.sites.mk</filename>, например, - <varname>MASTER_SITE_SOURCEFORGE</varname>?</para> - - <para>Посмотрите <xref linkend="ports-master-sites-n-example-detailed-use-master-site-sourceforge"/>.</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> - - <programlisting>MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/} -DISTFILES= something.tar.gz:sourceforge</programlisting> - </example> - - <para><filename>something.tar.gz</filename> будет сгружаться со - всех сайтов из - <varname>MASTER_SITE_SOURCEFORGE</varname>.</para> - </listitem> - - <listitem> - <para>Как мне использовать это с переменными - <varname>PATCH*</varname>?</para> - - <para>Все примеры выполнялись с переменными - <varname>MASTER*</varname>, и они работают точно также и для - <varname>PATCH*</varname>, как это можно видеть в <xref linkend="ports-master-sites-n-example-detailed-use-patch-sites"/>.</para> - - <example xml:id="ports-master-sites-n-example-detailed-use-patch-sites"> - <title>Упрощённое использование - <literal>MASTER_SITES:n</literal> с - <varname>PATCH_SITES</varname>.</title> - - <programlisting>PATCH_SITES= http://site1/ http://site2/:test -PATCHFILES= patch1:test</programlisting> - </example> - </listitem> - </orderedlist> - </sect3> - - <sect3> - <title>Что изменится для портов? А что не изменится?</title> - - <orderedlist numeration="lowerroman"> - <listitem> - <para>Все имеющиеся порты остаются без изменений. Код для - механизма <literal>MASTER_SITES:n</literal> активируется, если - только есть элементы, которые заканчиваются на - <literal>:n</literal>, как и - элементы в соответствии с вышеописанным синтаксисом, особенно - как это показано в пункте <xref linkend="porting-master-sites-n-group-semantics"/>.</para> - </listitem> - - <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> - - <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> - - <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> - - <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> - - <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>Cat chasing a mouse all over the screen</programlisting> - - <para>В файле <filename>Makefile</filename> переменная COMMENT должна - следовать сразу за переменной MAINTAINER.</para> - </sect1> - - <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> - - <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>В приведенном примере <command>innd</command> является - выполнимым файлом; если выполнимый файл находится в месте, - которое отсутствует в списке путей файлов, то вы должны указать - полный путь к файлу.</para> - </note> - - <note> - <para>Официальным значением переменной поиска <envar>PATH</envar>, - используемым в кластере построения портов является</para> - - <programlisting>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</programlisting> - </note> - - <para>Зависимость проверяется внутри цели - <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>Под <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> - - <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> - - <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> - - <example> - <title>Некорректное объявление необязательной зависимости</title> - - <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 -BAR_DESC= Bar support - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MBAR} -LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar -.endif</programlisting> - </example> - - <para>Правильным способом является проверка переменных параметров. - Этот способ не приводит к несоответствиям в индексе набора - портов, поскольку параметры определены до построения индекса. - При этом можно использовать простые скрипты для автоматизации - построения, установки и обновления этих портов и соответствующих - им пакетов.</para> - </sect2> - - <sect2 xml:id="use-want"> - <title><varname>USE_</varname> и - <varname>WANT_</varname></title> - - <para>Переменные <varname>USE_</varname> задаются мейнтейнером - порта для определения программного обеспечения, от которого - этот порт зависит. Порт, для которого нужен Firefox, - укажет</para> - - <programlisting>USE_FIREFOX= yes</programlisting> - - <para>Некоторые переменные <varname>USE_</varname> могут - принимать номера версий или другие параметры. Например, - порт, который требует Apache 2.2, укажет</para> - - <programlisting>USE_APACHE= 22</programlisting> - - <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> - - <para>Эти модули доступны в версиях CLI и web, поэтому версия - web выбрана с переменной <varname>WANT_</varname>:</para> - - <programlisting>WANT_PHP_WEB= yes</programlisting> - - <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>japanese/xdvi300/Makefile</filename>:</para> - - <programlisting> -PORTNAME= xdvi -PORTVERSION= 17 -PKGNAMEPREFIX= ja- -PKGNAMESUFFIX= ${RESOLUTION} - : -# default -RESOLUTION?= 300 -.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \ - ${RESOLUTION} != 300 && ${RESOLUTION} != 400 - @${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\"" - @${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400." - @${FALSE} -.endif - </programlisting> - - <para>Порт <package role="port">japanese/xdvi300</package> содержит - также все обычные патчи, файлы для пакета и так далее. Если вы введете - здесь команду <command>make</command>, она возьмет в качестве разрешения - значение по умолчанию (300) и построит порт обычным образом.</para> - - <para>Для другого разрешения приведем <emphasis>полный</emphasis> - <filename>xdvi118/Makefile</filename>:</para> - - <programlisting>RESOLUTION= 118 -MASTERDIR= ${.CURDIR}/../xdvi300 - -.include "${MASTERDIR}/Makefile"</programlisting> - - <para>(<filename>xdvi240/Makefile</filename> и - <filename>xdvi400/Makefile</filename> похожи). Задание - <varname>MASTERDIR</varname> говорит <filename>bsd.port.mk</filename>, - что обычный набор подкаталогов типа <varname>FILESDIR</varname> и - <varname>SCRIPTDIR</varname> находится в каталоге - <filename>xdvi300</filename>. Строчка - <literal>RESOLUTION=118</literal> переопределят строку - <literal>RESOLUTION=300</literal> в файле - <filename>xdvi300/Makefile</filename> и порт будет построен с - разрешением 118.</para> - </sect1> - - <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> - </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> - </sect1> - - <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> - - <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 -OPTIONS_SINGLE_SG1= OPT3 OPT4</programlisting> - - <para><varname>OPTIONS</varname> можно группировать в виде - переключателей, для которых разрешен выбор единственного - варианта (или ни одного) в каждой группе:</para> - - <programlisting>OPTIONS_RADIO= RG1 -OPTIONS_RADIO_RG1= OPT7 OPT8</programlisting> - - <para><varname>OPTIONS</varname> также можно группировать - в виде списков со множественным выбором, для которых - обязан быть включен <emphasis>по крайней мере - один</emphasis> из параметров:</para> - - <programlisting>OPTIONS_MULTI= MG1 -OPTIONS_MULTI_MG1= OPT5 OPT6</programlisting> - - <para><varname>OPTIONS</varname> также можно группировать - в виде списков со множественным выбором, для которых - могут быть включены любые параметры, включая отсутствие - выбора:</para> - - <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 -FOO_DESC= Enable option foo -BAR_DESC= Support feature bar - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MFOO} -CONFIGURE_ARGS+=--with-foo -.else -CONFIGURE_ARGS+=--without-foo -.endif - -.if ${PORT_OPTIONS:MBAR} -RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar -.endif - -.include <bsd.port.mk></programlisting> - </example> - - <example xml:id="ports-options-check-unset"> - <title>Проверка незаданных значений - <varname>OPTIONS</varname></title> - - <programlisting>.if ! ${PORT_OPTIONS:MEXAMPLES} -CONFIGURE_ARGS+=--without-examples -.endif</programlisting> - </example> - - <example xml:id="ports-options-practical-use"> - <title>Пример реального использования - <varname>OPTIONS</varname></title> - - <programlisting>OPTIONS_DEFINE= EXAMPLES - -OPTIONS_SINGLE= BACKEND -OPTIONS_SINGLE_BACKEND= MYSQL PGSQL BDB - -OPTIONS_MULTI= AUTH -OPTIONS_MULTI_AUTH= LDAP PAM SSL - -EXAMPLES_DESC= Install extra examples -MYSQL_DESC= Use MySQL as backend -PGSQL_DESC= Use PostgreSQL as backend -BDB_DESC= Use Berkeley DB as backend -LDAP_DESC= Build with LDAP authentication support -PAM_DESC= Build with PAM support -SSL_DESC= Build with OpenSSL support - -OPTIONS_DEFAULT= PGSQL LDAP SSL - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MPGSQL} -USE_PGSQL= yes -CONFIGURE_ARGS+= --with-postgres -.else -CONFIGURE_ARGS+= --without-postgres -.endif - -.if ${PORT_OPTIONS:MICU} -LIB_DEPENDS+= libicuuc.so:${PORTSDIR}/devel/icu -.endif - -.if ! ${PORT_OPTIONS:MEXAMPLES} -CONFIGURE_ARGS+= --without-examples -.endif - -# Проверка других параметров 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> - - <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> - - <para>Во втором примере библиотека libfoo отключена явным образом. - Сценарий configure не включает соответствующие функции в приложении, - несмотря на присутствие библиотеки в системе.</para> - - <note> - <para>При определенных условиях сокращенный синтаксис записи - условий может вызывать проблемы со сложными конструкциями. - Если вы получаете ошибки, такие как <literal>Malformed - conditional</literal>, то может быть использован - альтернативный синтаксис.</para> - - <programlisting>.if !empty(VARIABLE:MVALUE) -# as an alternative to -.if ${VARIABLE:MVALUE}</programlisting> - </note> - </sect2> - - <sect2> - <title>Вспомогательные макросы</title> - - <para>Существует несколько макросов, упрощающих запись условных - значений, которые отличаются в зависимости от набора - параметров.</para> - - <para>Если переменная <varname>OPTIONS_SUB</varname> имеет - значение <literal>yes</literal>, то каждый из указанных в - <varname>OPTIONS_DEFINE</varname> параметров будет добавлен - в <varname>PLIST_SUB</varname>. Следующая запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPTIONS_SUB= yes</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -PLIST_SUB+= OPT1="" -.else -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> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CONFIGURE_ENABLE= test</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -CONFIGURE_ARGS+= --enable-test -.else -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> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CONFIGURE_WITH= test</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -CONFIGURE_ARGS+= --with-test -.else -CONFIGURE_ARGS+= --without-test -.endif</programlisting> - - <para>Значение переменной <varname>X_CONFIGURE_ON</varname> - будет дописано в <varname>CONFIGURE_ARGS</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CONFIGURE_ON= --add-test</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -CONFIGURE_ARGS+= --add-test -.endif</programlisting> - - <para>Значение переменной <varname>X_CONFIGURE_OFF</varname> - будет дописано в <varname>CONFIGURE_ARGS</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CONFIGURE_OFF= --no-test</programlisting> - - <para>соответствует:</para> - - <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> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CMAKE_ON= -DTEST:BOOL=true</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -CMAKE_ARGS+= -DTEST:BOOL=true -.endif</programlisting> - - <para>Значение переменной <varname>X_CMAKE_OFF</varname> будет - дописано в <varname>CMAKE_ARGS</varname> в соответствии с - состоянием <varname>X</varname>. Следующая запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_CMAKE_OFF= -DTEST:BOOL=false</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ! ${PORT_OPTIONS:MOPT1} -CMAKE_ARGS+= -DTEST:BOOL=false -.endif</programlisting> - - <para>Для любой из следующих переменных:</para> - - <itemizedlist> - <listitem> - <para><varname>ALL_TARGET</varname></para> - </listitem> - - <listitem> - <para><varname>CATEGORIES</varname></para> - </listitem> - - <listitem> - <para><varname>CFLAGS</varname></para> - </listitem> - - <listitem> - <para><varname>CPPFLAGS</varname></para> - </listitem> - - <listitem> - <para><varname>CXXFLAGS</varname></para> - </listitem> - - <listitem> - <para><varname>CONFIGURE_ENV</varname></para> - </listitem> - - <listitem> - <para><varname>DISTFILES</varname></para> - </listitem> - - <listitem> - <para><varname>EXTRA_PATCHES</varname></para> - </listitem> - - <listitem> - <para><varname>INSTALL_TARGET</varname></para> - </listitem> - - <listitem> - <para><varname>LDFLAGS</varname></para> - </listitem> - - <listitem> - <para><varname>MAKE_ARGS</varname></para> - </listitem> - - <listitem> - <para><varname>MAKE_ENV</varname></para> - </listitem> - - <listitem> - <para><varname>PATCH_SITES</varname></para> - </listitem> - - <listitem> - <para><varname>PATCHFILES</varname></para> - </listitem> - - <listitem> - <para><varname>PLIST_FILES</varname></para> - </listitem> - - <listitem> - <para><varname>PLIST_DIRS</varname></para> - </listitem> - - <listitem> - <para><varname>PLIST_DIRSTRY</varname></para> - </listitem> - - <listitem> - <para><varname>USES</varname></para> - </listitem> - </itemizedlist> - - <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> - будет дописано в <varname>ABOVEVARIABLE</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_USES= gmake -OPT1_CFLAGS= -DTEST</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -USES+= gmake -CFLAGS+= -DTEST -.endif</programlisting> - - <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, - то флаг <literal>ABOVEVARIABLE</literal> будет автоматически - выставлен при выключенном параметре <literal>X</literal>. - Например:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_USES_OFF=gmake</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ! ${PORT_OPTIONS:MOPT1} -USES+= gmake -.endif</programlisting> - - <para>Для любого из следующих типов зависимости:</para> - - <itemizedlist> - <listitem> - <para><varname>PKG_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>EXTRACT_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>PATCH_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>FETCH_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>BUILD_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>LIB_DEPENDS</varname></para> - </listitem> - - <listitem> - <para><varname>RUN_DEPENDS</varname></para> - </listitem> - </itemizedlist> - - <para>Значение переменной <varname>X_ABOVEVARIABLE</varname> - будет дописано в <varname>ABOVEVARIABLE</varname> в - соответствии с состоянием <varname>X</varname>. Следующая - запись:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_LIB_DEPENDS= liba.so:${PORTSDIR}/devel/a</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -.if ${PORT_OPTIONS:MOPT1} -LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a -.endif</programlisting> - - <para>Если установлена <varname>X_ABOVEVARIABLE_OFF</varname>, - то зависимость типа <literal>ABOVEVARIABLE</literal> будет - добавлена при выключенном параметре <literal>X</literal>. - Например:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 -OPT1_LIB_DEPENDS_OFF= liba.so:${PORTSDIR}/devel/a</programlisting> - - <para>соответствует:</para> - - <programlisting>OPTIONS_DEFINE= OPT1 - -.include <bsd.port.options.mk> - -. if ! ${PORT_OPTIONS:MOPT1} -LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a -.endif</programlisting> - </sect2> - </sect1> - - <sect1 xml:id="makefile-wrkdir"> - <title>Задание рабочего каталога</title> - - <para>Каждый порт распаковывается в рабочий каталог, который должен быть - доступным для записи. В системе портов по умолчанию - <varname>DISTFILES</varname> распаковываются в каталог с именем - <literal>${DISTNAME}</literal>. Другими словами, если вы - задали:</para> - - <programlisting>PORTNAME= foo -PORTVERSION= 1.0</programlisting> - - <para>то дистрибутивные файлы порта содержат каталог верхнего уровня, - <filename>foo-1.0</filename>, и все файлы расположены в этом - каталоге.</para> - - <para>Если это не ваш случай, то имеется несколько переменных, которые - вы можете переопределить.</para> - - <sect2> - <title><varname>WRKSRC</varname></title> - - <para>Эта переменная задаёт имя каталога, который создаётся при - распаковке исходных файлов приложения. В нашем предыдущем - примере если бы распаковка происходила в каталог с именем - <filename>foo</filename> (а не - <filename>foo-1.0</filename>), то вы должны написать:</para> - - <programlisting>WRKSRC= ${WRKDIR}/foo</programlisting> - - <para>или, как вариант</para> - - <programlisting>WRKSRC= ${WRKDIR}/${PORTNAME}</programlisting> - </sect2> - - <sect2> - <title><varname>NO_WRKSUBDIR</varname></title> - - <para>Если порт вообще не распаковывается ни в какой каталог, то вы - должны задать переменную <varname>NO_WRKSUBDIR</varname> для указания - на этот факт.</para> - - <programlisting>NO_WRKSUBDIR= yes</programlisting> - </sect2> - </sect1> - - <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> - - <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> - - <itemizedlist> - <listitem> - <para><varname>INSTALL_PROGRAM</varname> - это команда для - установки бинарных выполнимых файлов.</para> - </listitem> - - <listitem> - <para><varname>INSTALL_SCRIPT</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_DATA</varname> - это команда для установки - совместно используемых файлов данных.</para> - </listitem> - - <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: - ${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: - ${MKDIR} ${STAGEDIR}${EXAMPLESDIR} - (cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})</programlisting> - - <para>В этом примере устанавливается содержимое каталога - <filename>examples</filename> из установочных файлов производителя - в надлежащее место для примеров вашего порта.</para> - - <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>В качестве третьего параметра в макросе - <varname>COPYTREE_*</varname> можно передать дополнительные - параметры <command>find</command>. Например, чтобы в первом - примере установить все файлы кроме файлов Makefile, можно - использовать следующую команду.</para> - - <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> - - <listitem> - <para><varname>DOCSDIR</varname> преобразуется в - <filename>PREFIX/share/doc/PORTNAME</filename>.</para> - </listitem> - - <listitem> - <para><varname>DOCSDIR_REL</varname> преобразуется в - <filename>share/doc/PORTNAME</filename>.</para> - </listitem> - - <listitem> - <para><varname>EXAMPLESDIR</varname> преобразуется в - <filename>PREFIX/share/examples/PORTNAME</filename>.</para> - </listitem> - - <listitem> - <para><varname>EXAMPLESDIR_REL</varname> преобразуется в - <filename>share/examples/PORTNAME</filename>.</para> - </listitem> - </itemizedlist> - - <note> - <para>Параметр <literal>DOCS</literal> управляет установкой - дополнительной документации в <varname>DOCSDIR</varname>. Это - не относится к стандартным страницам справочника и страницам info. - Все, что устанавливается в <varname>DATADIR</varname> и - <varname>EXAMPLESDIR</varname>, соответственно управляется - через параметры <literal>DATA</literal> и - <literal>EXAMPLES</literal>.</para> - </note> - - <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> - - <chapter 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> - - <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> - -.if ${PORT_OPTIONS:MNLS} -USES+= gettext -PLIST_SUB+= NLS="" -.else -CONFIGURE_ARGS+= --disable-nls -PLIST_SUB+= NLS="@comment " -.endif - -.include <bsd.port.mk></programlisting> - - <para>Следующий пункт в вашем списке дел разобраться, чтобы файлы - каталога сообщения включались в список упаковки по условию. Часть, - входящая в <filename>Makefile</filename>, уже обеспечена этой - идиомой. Остальное объясняется в главе <link linkend="plist-sub"> - продвинутые практики <filename>pkg-plist</filename></link>. Вкратце, - каждое вхождение <literal>%%NLS%%</literal> в - <filename>pkg-plist</filename> будет заменено на - <quote><literal>@comment </literal></quote>, если NLS выключен, - или пустой строкой, если включен. В результате строки, - предваряемые <literal>%%NLS%%</literal>, станут комментариями - в итоговом листе упаковки, если NLS выключен; иначе, префикс будет - просто удален. Всё, что вам нужно, это вставить - <literal>%%NLS%%</literal> перед каждым путем к файлу каталога - сообщений в <filename>pkg-plist</filename>. Например:</para> - - <programlisting>%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo -%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo</programlisting> - - <para>В особо сложных случаях вам понадобиться использовать более - продвинутые техники, чем данный рецепт, такие как <link linkend="plist-dynamic">динамические списки упаковки</link>.</para> - </sect2> - - <sect2> - <title>Управление каталогами сообщений</title> - - <para>Существует момент, который следует учитывать при установке - файлов каталогов сообщений. Целевые каталоги для размещения, - расположенные под - <filename>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> - - <tgroup cols="2"> - <tbody> - <row> - <entry><varname>USES= imake</varname></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> - </row> - </tbody> - </tgroup> - </table> - - <example xml:id="using-x11-vars"> - <title>Использование переменных X11 в порте</title> - - <programlisting># Использовать некоторые библиотеки X11 -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> - - <entry>Устанавливает путь к <command>uic</command> - (переменная только для чтения).</entry> - </row> - - <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 -CONFIGURE_ENV+= MOC="${MOC}" UIC="${UIC}" LIBS="${QTCFGLIBS}" \ - QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}" QTDIR="${QT_PREFIX}" -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} - -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>HTTPD</varname></entry> - - <entry>Полный путь к исполняемому файлу <command>httpd</command>. - Может быть переопределен в вашем порту.</entry> - </row> - - <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>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> - - </tbody> - </tgroup> - </table> - - <table frame="none"> - <title>Используемые переменные при портировании модулей - Apache</title> - - <tgroup cols="2"> - <tbody> - - <row> - <entry><varname>MODULENAME</varname></entry> - - <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><varname>AP_GENPLIST</varname></entry> - - <entry>Также автоматически создает - <filename>pkg-plist</filename>.</entry> - </row> - - <row> - <entry><varname>AP_INC</varname></entry> - - <entry>Добавляет каталог к пути поиска заголовков - во время компиляции.</entry> - </row> - - <row> - <entry><varname>AP_LIB</varname></entry> - - <entry>Добавляет каталог к пути поиска библиотек - во время компиляции.</entry> - </row> - - <row> - <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> - - <table frame="none"> - <title>Переменные для портов, использующих PHP</title> - - <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>DEFAULT_PHP_VER</varname></entry> - - <entry>Выбирает старший номер версии, с которым будет - установлен PHP как зависимость в случае, когда PHP еще - не установлен. По умолчанию <literal>5</literal>. - Возможные значения: <literal>4</literal>, - <literal>5</literal></entry> - </row> - - <row> - <entry><varname>IGNORE_WITH_PHP</varname></entry> - - <entry>Порт не работает с PHP данной версии. Возможные - значения: <literal>4</literal>, <literal>5</literal></entry> - </row> - - <row> - <entry><varname>USE_PHPIZE</varname></entry> - - <entry>Порт будет построен как расширение PHP.</entry> - </row> - - <row> - <entry><varname>USE_PHPEXT</varname></entry> - - <entry>Порт будет считаться расширением PHP, включая установку - и регистрацию в реестре расширений.</entry> - </row> - - <row> - <entry><varname>USE_PHP_BUILD</varname></entry> - - <entry>Установить PHP как зависимость времени построения.</entry> - </row> - - <row> - <entry><varname>WANT_PHP_CLI</varname></entry> - - <entry>Хочет CLI (командная строка) версию PHP.</entry> - </row> - - <row> - <entry><varname>WANT_PHP_CGI</varname></entry> - - <entry>Хочет CGI версию PHP.</entry> - </row> - - <row> - <entry><varname>WANT_PHP_MOD</varname></entry> - - <entry>Хочет PHP как модуль Apache.</entry> - </row> - - <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= . - -.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> - - <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> - <para>gfx: <package - role="port">graphics/sdl_gfx</package></para> - </listitem> - - <listitem> - <para>image: <package - role="port">graphics/sdl_image</package></para> - </listitem> - - <listitem> - <para>mixer: <package - role="port">audio/sdl_mixer</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>pango: <package - role="port">x11-toolkits/sdl_pango</package></para> - </listitem> - - <listitem> - <para>sound: <package - role="port">audio/sdl_sound</package></para> - </listitem> - - <listitem> - <para>ttf: <package - role="port">graphics/sdl_ttf</package></para> - </listitem> - </itemizedlist> - - <para>Для версии 2.0 - на данный момент распознаются следующие SDL-библиотеки:</para> - - <itemizedlist> - <listitem> - <para>sdl: <package - role="port">devel/sdl20</package></para> - </listitem> - - <listitem> - <para>gfx: <package - role="port">graphics/sdl2_gfx</package></para> - </listitem> - - <listitem> - <para>image: <package - role="port">graphics/sdl2_image</package></para> - </listitem> - - <listitem> - <para>mixer: <package - role="port">audio/sdl2_mixer</package></para> - </listitem> - - <listitem> - <para>net: <package - role="port">net/sdl2_net</package></para> - </listitem> - - <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 - -.include <bsd.port.pre.mk> - -.if ${HAVE_SDL:Mmixer}!="" -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> - - <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> - - <para>Перечень доступных версий <application>wxWidgets</application> - и соответствующих им портов в дереве:</para> - - <table frame="none"> - <title>Доступные версии <application>wxWidgets</application></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Версия</entry> - - <entry>Порт</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>2.4</literal></entry> - - <entry><package - role="port">x11-toolkits/wxgtk24</package></entry> - </row> - - <row> - <entry><literal>2.6</literal></entry> - - <entry><package - role="port">x11-toolkits/wxgtk26</package></entry> - </row> - - <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> - - <entry><literal>2.4-2.6</literal></entry> - </row> - - <row> - <entry><literal>mozilla</literal></entry> - - <entry><application>wxMozilla</application></entry> - - <entry><literal>2.4</literal></entry> - </row> - <row> - <entry><literal>svg</literal></entry> - - <entry><application>wxSVG</application></entry> - - <entry><literal>2.6</literal></entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Тип добавляемой зависимости при выборе каждого компонента - может быть указан вручную путем добавления суффикса, отделенного - точкой с запятой. Если таковой отсутствует, но будет использовано - значение по умолчанию (смотрите <xref linkend="wx-def-dep-types"/>). - Доступные типы зависимости:</para> - - <table frame="none"> - <title>Доступные типы зависимости - <application>wxWidgets</application></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Название</entry> - - <entry>Описание</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>build</literal></entry> - - <entry>Компонент требуется для построения, эквивалентен - <varname>BUILD_DEPENDS</varname></entry> - </row> - - <row> - <entry><literal>run</literal></entry> - - <entry>Компонент требуется для запуска, эквивалентен - <varname>RUN_DEPENDS</varname></entry> - </row> - - <row> - <entry><literal>lib</literal></entry> - - <entry>Компонент требуется для построения и запуска, - эквивалентен <varname>LIB_DEPENDS</varname></entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Значения по умолчанию для компонентов подробно рассматриваются - в следующей таблице:</para> - - <table xml:id="wx-def-dep-types" frame="none"> - <title>Типы зависимости <application>wxWidgets</application>, - используемые по умолчанию</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Компонент</entry> - - <entry>Тип зависимости</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>wx</literal></entry> - - <entry><literal>lib</literal></entry> - </row> - - <row> - <entry><literal>contrib</literal></entry> - - <entry><literal>lib</literal></entry> - </row> - - <row> - <entry><literal>python</literal></entry> - - <entry><literal>run</literal></entry> - </row> - - <row> - <entry><literal>mozilla</literal></entry> - - <entry><literal>lib</literal></entry> - </row> - - <row> - <entry><literal>svg</literal></entry> - - <entry><literal>lib</literal></entry> - </row> - </tbody> - </tgroup> - </table> - - <example xml:id="wx-components-example"> - <title>Выбор компонентов - <application>wxWidgets</application></title> - - <para>Следующий фрагмент относится к порту, в котором используется - <application>wxWidgets</application> версии 2.4 с его сторонними - библиотеками.</para> - - <programlisting>USE_WX= 2.4 -WX_COMPS= wx contrib</programlisting> - </example> - </sect2> - <sect2 xml:id="wx-unicode"> - <title>Unicode</title> - - <para>Библиотека <application>wxWidgets</application> поддерживает - Unicode начиная с версии <literal>2.5</literal>. В дереве портов - доступны обе версии и могут быть выбраны с использованием - следующих переменных:</para> - - <table xml:id="wx-unicode-var-table" frame="none"> - <title>Переменные для выбора версии - <application>wxWidgets</application> с Unicode</title> - - <tgroup cols="3"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Описание</entry> - - <entry>Предназначение</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>WX_UNICODE</varname></entry> - - <entry>Порт работает <emphasis>только</emphasis> с версией - Unicode</entry> - - <entry>порт</entry> - </row> - - <row> - <entry><varname>WANT_UNICODE</varname></entry> - - <entry>Порт работает с обеими версиями, но предпочитает - версию с Unicode</entry> - - <entry>порт</entry> - </row> - <row> - <entry><varname>WITH_UNICODE</varname></entry> - - <entry>Порт будет использовать версию Unicode</entry> - - <entry>пользователь</entry> - </row> - <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> - - <sect2 xml:id="wx-version-detection"> - <title>Обнаружение установленных версий</title> - - <para>Для обнаружения установленной версии вам необходимо задать - переменную <varname>WANT_WX</varname>. Если вы не присвоите ей - определенную версию, то компоненты получат суффикс версии. - Переменная <varname>HAVE_WX</varname> будет заполнена после - обнаружения.</para> - - <example xml:id="wx-ver-det-example"> - <title>Обнаружение установленных версий и компонентов - <application>wxWidgets</application></title> - - <para>Следующий фрагмент может быть использован в порту, который - использует <application>wxWidgets</application>, в случае если - он установлен или выбран соответствующий параметр.</para> - - <programlisting>WANT_WX= yes - -.include <bsd.port.pre.mk> - -.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.4) -USE_WX= 2.4 -CONFIGURE_ARGS+=--enable-wx -.endif</programlisting> - - <para>Следующий фрагмент может быть использован в порту, который - задействует поддержку <application>wxPython</application>, - в случае если он установлен или выбран соответствующий параметр, - в дополнение к <application>wxWidgets</application>, обе версии - <literal>2.6</literal>.</para> - - <programlisting>USE_WX= 2.6 -WX_COMPS= wx -WANT_WX= 2.6 - -.include <bsd.port.pre.mk> - -.if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython) -WX_COMPS+= python -CONFIGURE_ARGS+=--enable-wxpython -.endif</programlisting> - </example> - </sect2> - - <sect2 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> - - <tbody> - <row> - <entry><varname>WX_CONFIG</varname></entry> - - <entry>Путь к сценарию <application>wxWidgets</application> - <command>wx-config</command> (с другим именем)</entry> - </row> - - <row> - <entry><varname>WXRC_CMD</varname></entry> - - <entry>Путь к программе <application>wxWidgets</application> - <command>wxrc</command> (с другим именем)</entry> - </row> - - <row> - <entry><varname>WX_VERSION</varname></entry> - - <entry>Версия <application>wxWidgets</application>, которая - будет использоваться (например, - <literal>2.6</literal>)</entry> - </row> - - <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> - - <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> - - <example xml:id="wx-premk-example"> - <title>Использование переменных <application>wxWidgets</application> - в командах</title> - - <para>Следующий фрагмент иллюстрирует использование переменной - <varname>WX_PREMK</varname> посредством запуска сценария - <command>wx-config</command> для получения строки с полной версией - с присвоением ее переменной и передачей в программу.</para> - - <programlisting>USE_WX= 2.4 -WX_PREMK= yes - -.include <bsd.port.pre.mk> - -.if exists(${WX_CONFIG}) -VER_STR!= ${WX_CONFIG} --release - -PLIST_SUB+= VERSION="${VER_STR}" -.endif</programlisting> - </example> - - <note> - <para>Переменные <application>wxWidgets</application> можно - безопасно использовать в командах внутри целей без необходимости - в использовании <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> - - <table frame="none"> - <title>Допустимые значения <varname>WX_CONF_ARGS</varname></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Возможное значение</entry> - - <entry>Получаемый параметр</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>absolute</literal></entry> - - <entry><literal>--with-wx-config=${WX_CONFIG}</literal></entry> - </row> - - <row> - <entry><literal>relative</literal></entry> - - <entry><literal>--with-wx=${LOCALBASE} - --with-wx-config=${WX_CONFIG:T}</literal></entry> - </row> - </tbody> - </tgroup> - </table> - </sect2> - </sect1> - - <sect1 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> - - <tgroup cols="3"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Описание</entry> - - <entry>Значение по умолчанию</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>USE_LUA</varname></entry> - - <entry>Перечень версий, которые порт может использовать</entry> - - <entry>Все доступные версии</entry> - </row> - - <row> - <entry><varname>USE_LUA_NOT</varname></entry> - - <entry>Перечень версий, которые порт не может - использовать</entry> - - <entry>Пусто</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Перечень доступных версий <application>Lua</application> и - соответствующих портов в дереве:</para> - - <table frame="none"> - <title>Доступные версии <application>Lua</application></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Версия</entry> - - <entry>Порт</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>4.0</literal></entry> - - <entry><package - role="port">lang/lua4</package></entry> - </row> - - <row> - <entry><literal>5.0</literal></entry> - - <entry><package - role="port">lang/lua50</package></entry> - </row> - - <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> - - <para>Следующий фрагмент взят из порта, который использует - <application>Lua</application> версий <literal>5.0</literal> - или <literal>5.1</literal>, по умолчанию <literal>5.0</literal>. - Значение может быть переопределено пользователем с использованием - переменной <varname>WITH_LUA_VER</varname>.</para> - - <programlisting>USE_LUA= 5.0-5.1 -WANT_LUA_VER= 5.0</programlisting> - </example> - </sect2> - - <sect2 xml:id="lua-components"> - <title>Выбор компонентов</title> - - <para>Существуют другие приложения, которые хотя и не являются - библиотеками <application>Lua</application>, но относятся к ним. - Эти приложения можно указать в переменной - <varname>LUA_COMPS</varname>. Доступны следующие компоненты:</para> - - <table frame="none"> - <title>Доступные компоненты <application>Lua</application></title> - - <tgroup cols="3"> - <thead> - <row> - <entry>Название</entry> - - <entry>Описание</entry> - - - <entry>Ограничение версии</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>lua</literal></entry> - - <entry>Основная библиотека</entry> - - <entry>нет</entry> - </row> - - <row> - <entry><literal>tolua</literal></entry> - - <entry>Библиотека доступа к коду C/C++</entry> - - <entry>4.0-5.0</entry> - </row> - - <row> - <entry><literal>ruby</literal></entry> - - <entry>Привязка к Ruby</entry> - - <entry>4.0-5.0</entry> - </row> - </tbody> - </tgroup> - </table> - - <note> - <para>Есть и другие компоненты, но они относятся к модулям для - интерпретатора и не используются приложениями (только другими - модулями).</para> - </note> - - <para>Тип зависимости можно выбрать для каждого компонента через - добавление суффикса, отделенного точкой с запятой. В случае - отсутствия будет использован тип по умолчанию (смотрите - <xref linkend="lua-def-dep-types"/>). Доступные следующие - типы:</para> - - <table frame="none"> - <title>Доступные типы зависимости - <application>Lua</application></title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Название</entry> - - <entry>Описание</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>build</literal></entry> - - <entry>Компонент требуется для построения, эквивалентен - <varname>BUILD_DEPENDS</varname></entry> - </row> - - <row> - <entry><literal>run</literal></entry> - - <entry>Компонент требуется для запуска, эквивалентен - <varname>RUN_DEPENDS</varname></entry> - </row> - - <row> - <entry><literal>lib</literal></entry> - - <entry>Компонент требуется для построения и запуска, - эквивалентен <varname>LIB_DEPENDS</varname></entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Значения по умолчанию для компонентов подробно рассматриваются - в следующей таблице:</para> - - <table xml:id="lua-def-dep-types" frame="none"> - <title>Типы зависимости <application>Lua</application>, - используемые по умолчанию</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Компонент</entry> - - <entry>Тип зависимости</entry> - </row> - </thead> - - <tbody> - <row> - <entry><literal>lua</literal></entry> - - <entry><literal>lib</literal> для <literal>4.0-5.0</literal> - (динамическая) и <literal>build</literal> для - <literal>5.1</literal> (статическая)</entry> - </row> - - <row> - <entry><literal>tolua</literal></entry> - - <entry><literal>build</literal> (статическая)</entry> - </row> - - <row> - <entry><literal>ruby</literal></entry> - - <entry><literal>lib</literal> (динамическая)</entry> - </row> - </tbody> - </tgroup> - </table> - - <example 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> - - <para>Для обнаружения установленной версии вам необходимо задать - переменную <varname>WANT_LUA</varname>. Если вы не присвоите ей - определенную версию, то компоненты получат суффикс версии. - Переменная <varname>HAVE_LUA</varname> будет заполнена после - обнаружения.</para> - - <example xml:id="lua-ver-det-example"> - <title>Обнаружение установленных версий и компонентов - <application>Lua</application></title> - - <para>Следующий фрагмент можно использовать для порта, использующего - <application>Lua</application>, если она установлена, или был - выбран соответствующий параметр.</para> - - <programlisting>WANT_LUA= yes - -.include <bsd.port.pre.mk> - -.if defined(WITH_LUA5) || !empty(PORT_OPTIONS:MLUA5) || !empty(HAVE_LUA:Mlua-5.[01]) -USE_LUA= 5.0-5.1 -CONFIGURE_ARGS+=--enable-lua5 -.endif</programlisting> - - <para>Следующий фрагмент можно использовать для порта, который - включает поддержку <application>tolua</application>, если - такой компонент установлен, или был выбран соответствующий - параметр в дополнение к <application>Lua</application>, оба - имеют версию <literal>4.0</literal>.</para> - - <programlisting>USE_LUA= 4.0 -LUA_COMPS= lua -WANT_LUA= 4.0 - -.include <bsd.port.pre.mk> - -.if defined(WITH_TOLUA) || !empty(PORT_OPTIONS:MTOLUA) || !empty(HAVE_LUA:Mtolua) -LUA_COMPS+= tolua -CONFIGURE_ARGS+=--enable-tolua -.endif</programlisting> - </example> - </sect2> - - <sect2 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> - - <row> - <entry><varname>LUA_MODLIBDIR</varname></entry> - - <entry>Каталог, в который установлены модули библиотеки - <application>Lua</application> - (<filename>.so</filename>)</entry> - </row> - - <row> - <entry><varname>LUA_MODSHAREDIR</varname></entry> - - <entry>Каталог, в который установлены модули - <application>Lua</application> - (<filename>.lua</filename>)</entry> - </row> - - <row> - <entry><varname>LUA_PKGNAMEPREFIX</varname></entry> - - <entry>Префикс с именем пакета, используемый модулями - <application>Lua</application></entry> - </row> - - <row> - <entry><varname>LUA_CMD</varname></entry> - - <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> - - <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 - -.include <bsd.port.pre.mk> - -.if exists(${LUA_CMD}) -VER_STR!= ${LUA_CMD} -v - -CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}" -.endif</programlisting> - </example> - - <note> - <para>Переменные <application>Lua</application> можно безопасно - использовать в командах внутри целей без необходимости в - использовании <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>Как показано выше, <varname>ICONV_LIB</varname> имеет - пустое значение с собственным <command>iconv</command>. Эту - особенность можно использовать для обнаружения собственного - <command>iconv</command> с соответствующими действиями.</para> - - <para>Иногда в программе параметр <command>ld</command> или путь - поиска жёстко заданы в <filename>Makefile</filename> или - сценарии конфигурации. Для решения этой проблемы можно - использовать следующий подход:</para> - - <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> - - <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> - - <programlisting>USES= iconv - -.include <bsd.port.pre.mk> - -post-patch: -.if empty(ICONV_LIB) - # обнаружен собственный iconv - @${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh -.endif - -.include <bsd.port.post.mk></programlisting> - </example> - </sect1> - - <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>В настоящее время распознаются следующие библиотеки и приложения - Xfce:</para> - - <itemizedlist> - <listitem> - <para>libexo: <package - role="port">x11/libexo</package></para> - </listitem> - - <listitem> - <para>libgui: <package - role="port">x11-toolkits/libxfce4gui</package></para> - </listitem> - - <listitem> - <para>libutil: <package - role="port">x11/libxfce4util</package></para> - </listitem> - - <listitem> - <para>libmcs: <package - role="port">x11/libxfce4mcs</package></para> - </listitem> - - <listitem> - <para>mcsmanager: <package - role="port">sysutils/xfce4-mcs-manager</package></para> - </listitem> - - <listitem> - <para>panel: <package - role="port">x11-wm/xfce4-panel</package></para> - </listitem> - - <listitem> - <para>thunar: <package - role="port">x11-fm/thunar</package></para> - </listitem> - - <listitem> - <para>wm: <package - role="port">x11-wm/xfce4-wm</package></para> - </listitem> - - <listitem> - <para>xfdev: <package - role="port">dev/xfce4-dev-tools</package></para> - </listitem> - </itemizedlist> - - <para>Распознаются следующие дополнительные параметры:</para> - - <itemizedlist> - <listitem> - <para>configenv: Используйте, если ваш порт требует специально - измененного значения <varname>CONFIGURE_ENV</varname> для поиска - требуемых для порта библиотек.</para> - - <programlisting>-I${LOCALBASE}/include -L${LOCALBASE}/lib</programlisting> - - <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$ -# -# PROVIDE: doormand -# REQUIRE: LOGIN -# KEYWORD: shutdown -# -# -# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable doorman: -# doorman_enable (bool): Set to "NO" by default. -# Set it to "YES" to enable doorman -# doorman_config (path): Set to "%%PREFIX%%/etc/doormand/doormand.cf" by default. -# Add the following lines to /etc/rc.conf.local or /etc/rc.conf -# to enable this service: -# -# doormand_enable (bool): Set to NO by default. -# Set it to YES to enable doormand. -# doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf -# by default. -# - -. /etc/rc.subr - -name=doormand -rcvar=doormand_enable - -load_rc_config $name - -: ${doormand_enable:="NO"} -: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"} - -command=%%PREFIX%%/sbin/${name} -pidfile=/var/run/${name}.pid - -command_args="-p $pidfile -f $doormand_config" - -run_rc_command "$1"</programlisting> - - <para>Если нет стоящей причины запускать службы раньше всех портов, - сценарии должны использовать</para> - - <programlisting>REQUIRE: LOGIN</programlisting> - - <para>Если служба - работает под определенным пользователем (отличным от root), то - это делается принудительно. В сценарий выше включена конструкция</para> - - <programlisting>KEYWORD: shutdown</programlisting> - - <para>потому что - вымышленный порт, который мы используем в качестве примера, запускает - службу, и она должна корректно завершиться при выключении системы. - Если сценарий не запускает постоянную службу, то это не является - необходимым.</para> - - <para>Для необязательных элементов конфигурации - присвоение переменной по умолчанию в стиле "=" - является более предпочтительным по сравнению со стилем ":=", - используемым здесь, поскольку первый устанавливает значение по - умолчанию только если переменная не установлена, а последний - устанавливает её, если переменная не установлена - <emphasis>или</emphasis> обнулена. Пользователь вполне может - написать в своем файле <filename>rc.conf.local</filename> - что-нибудь типа</para> - - <programlisting>doormand_flags=""</programlisting> - - <para>и тогда произойдет - неуместная подстановка переменной с использованием ":=", - что переопределит намерения пользователя. Переменная - <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> - - <chapter xml:id="plist"> - <title>Продвинутые практики <filename>pkg-plist</filename></title> - <sect1 xml:id="plist-sub"> - <title>Изменение содержимого <filename>pkg-plist</filename> в зависимости - от make-переменных</title> - - <para>Некоторые порты, в частности, порты <literal>p5-</literal>, должны - менять содержимое своих файлов <filename>pkg-plist</filename> в - зависимости от того, с какими параметрами они были отконфигурированы - (или в зависимости от версии языка <literal>perl</literal> в случае - портов <literal>p5-</literal>). Чтобы облегчить этот - процесс, любые вхождения ключевых слов <literal>%%OSREL%%</literal>, - <literal>%%PERL_VER%%</literal> и <literal>%%PERL_VERSION%%</literal> - в файле <filename>pkg-plist</filename> будут заменяться соответствующими - значениями. Значением <literal>%%OSREL%%</literal> является номер - версии операционной системы (например, <literal>4.9</literal>). - <literal>%%PERL_VERSION%%</literal> и <literal>%%PERL_VER%%</literal> - обозначают полный номер версии <command>perl</command> (например, - <literal>5.8.9</literal>). Некоторые - другие <literal>%%VARS%%</literal>, имеющие - отношение к файлам документации порта, описаны в <link linkend="install-documentation">соответствующем разделе</link>.</para> - - <para>Если вам нужно сделать другие подстановки, вы можете указать в - переменной <varname>PLIST_SUB</varname> список пар - <literal>VAR=VALUE</literal>, - и все вхождения <literal>%%VAR%%</literal> - в файле <filename>pkg-plist</filename> будут заменяться на значение - <replaceable>VALUE</replaceable>.</para> - - <para>Например, если у вас имеется порт, который устанавливает много - файлов в каталог, зависящий от версии, вы можете задать нечто - типа</para> - - <programlisting>OCTAVE_VERSION= 2.0.13 -PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> - - <para>в файле <filename>Makefile</filename> и использовать - <literal>%%OCTAVE_VERSION%%</literal> везде, где нужно указать - номер версии в файле <filename>pkg-plist</filename>. Таким образом, - при обновлении порта вам не нужно будет менять десятки (а в некоторых - случаях и сотни) строк в файле <filename>pkg-plist</filename>.</para> - - <para>Если ваш порт устанавливает файлы в соответствии с установленными - в порту опциями, то обычным способом управления является добавление - префиксов <literal>%%TAG%%</literal> для строк - <filename>pkg-plist</filename> с добавлением этого - <literal>TAG</literal> в переменную <varname>PLIST_SUB</varname> - внутри <filename>Makefile</filename> со специальным значением - <literal>@comment</literal>, которое указывает пакетным инструментам - игнорировать эти строки:</para> - - <programlisting>.if defined(WITH_X11) -PLIST_SUB+= X11="" -.else -PLIST_SUB+= X11="@comment " -.endif</programlisting> - - <para>и в самом <filename>pkg-plist</filename>:</para> - - <programlisting>%%X11%%bin/foo-gui</programlisting> - - <para>Эта подстановка будет сделана - между выполнением целей <buildtarget>pre-install</buildtarget> и - <buildtarget>do-install</buildtarget>, посредством чтения файла - <filename>PLIST</filename> и записью в файл - <filename>TMPPLIST</filename> - (по умолчанию это файл - <filename>WRKDIR/.PLIST.mktmp</filename>). Так - что если ваш порт строит <filename>PLIST</filename> на лету, делайте - это во время или до выполнения цели - <buildtarget>pre-install</buildtarget>. Кроме того, если вашему порту - требуется отредактировать получающийся файл, делайте это в цели - <buildtarget>post-install</buildtarget> изменением файла - <filename>TMPPLIST</filename>.</para> - - <para>Другой способ изменения списка сборки порта основан на - определении значений переменных <varname>PLIST_FILES</varname>, - <varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname>. - Каждое из них рассматривается как перечень путей для записи в - <filename>TMPPLIST</filename> содержимого - <filename>PLIST</filename>. Имена, перечисленные - в <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname> подвергаются подстановке - <literal>%%VAR%%</literal>, как описано - выше. За исключением этого, имена из <varname>PLIST_FILES</varname> - будут появляться в окончательном варианте перечня сборки без - изменений, тогда как <literal>@dirrm</literal> и - <literal>@dirrmtry</literal> будут соответственно предшествовать - именам из <varname>PLIST_DIRS</varname> и - <varname>PLIST_DIRSTRY</varname>. Для того чтобы изменения - вступили в силу, <varname>PLIST_FILES</varname>, - <varname>PLIST_DIRS</varname> и <varname>PLIST_DIRSTRY</varname> - должны задаваться до того, как будет - записываться <filename>TMPPLIST</filename>, то - есть в цели <buildtarget>pre-install</buildtarget> или ещё - раньше.</para> - </sect1> - - <sect1 xml:id="plist-cleaning"> - <title>Пустые каталоги</title> - - <sect2 xml:id="plist-dir-cleaning"> - <title>Очистка пустых каталогов</title> - - <para>Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это - достигается добавлением строк <literal>@dirrm</literal> для всех - каталогов, которые создаются этим портом. Вам нужно удалить - подкаталоги до того, как вы сможете удалить родительские - каталоги.</para> - - <programlisting> - : -lib/X11/oneko/pixmaps/cat.xpm -lib/X11/oneko/sounds/cat.au - : -@dirrm lib/X11/oneko/pixmaps -@dirrm lib/X11/oneko/sounds -@dirrm lib/X11/oneko - </programlisting> - - <para>Однако, иногда <literal>@dirrm</literal> будет выдавать ошибки, - потому что другие порты используют тот же самый подкаталог. Вы - можете использовать <literal>@dirrmtry</literal> для удаления - только пустых каталогов без выдачи предупреждений.</para> - - <programlisting>@dirrmtry share/doc/gimp</programlisting> - - <para>Эта команда не выведет никаких сообщений об ошибках и не вызовет - аварийного завершения работы <command>pkg delete</command> - (см. &man.pkg-delete.8;), даже если - каталог <filename>${PREFIX}/share/doc/gimp</filename> - не пуст из-за того, что другие порты установили сюда какие-то - файлы.</para> - </sect2> - - <sect2 xml:id="plist-dir-empty"> - <title>Создание пустых каталогов</title> - - <para>Пустым каталогам, создаваемым во время установки порта, нужно - особое внимание. Они не будут созданы при установке пакета, потому - что пакеты содержат только файлы, а <command>pkg add</command> - и <command>pkg install</command> создают для них - каталоги по мере надобности. Чтобы убедиться, что пустой каталог - создается при установке пакета, добавьте эту строку в - <filename>pkg-plist</filename> перед соответствующей строкой - <literal>@dirrm</literal>:</para> - - <programlisting>@exec mkdir -p %D/share/foo/templates</programlisting> - </sect2> - - </sect1> - - <sect1 xml:id="plist-config"> - <title>Конфигурационные файлы</title> - - <para>Если ваш порт устанавливает конфигурационные файлы в каталог - <filename>PREFIX/etc</filename> (или куда-то еще), - <emphasis>не</emphasis> делайте их простого перечисления в файле - <filename>pkg-plist</filename>. Это приведёт к тому, что по команде - <command>pkg delete</command> или при новой установке файлы, - тщательно отредактированные и настроенные пользователем, будут - уничтожены.</para> - - <para>Вместо этого установите файл(ы) с примерами с расширением - <filename>filename.sample</filename>. - Затем скопируйте файл с примером на место настоящего файла - конфигурации, если таковой ещё не существует. При деинсталляции - удаляйте файл конфигурации только в том случае, если он идентичен - файлу с расширением <filename>.sample</filename>. Вам - нужно управлять этим в <filename>Makefile</filename> и в - <filename>pkg-plist</filename> (для установки из пакета).</para> - - <para>Пример части <filename>Makefile</filename>:</para> - - <programlisting>post-install: - @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \ - ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${STAGEDIR}${PREFIX}/etc/orbit.conf ; \ - fi</programlisting> - - <para>Добавьте по три строки в <filename>pkg-plist</filename> для - каждого конфигурационного файла, как показано ниже:</para> - - <programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi -etc/orbit.conf.sample -@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi</programlisting> - - <para>Данные строки являются упорядоченными. На этапе удаления - файл с примером сравнивается с рабочим конфигурационным файлом. - Полное совпадение означает отсутствие каких-либо изменений в - рабочем файле со стороны пользователя, и следовательно этот файл - может быть безопасно удалён. Так как файл с примером всё ещё - должен существовать для сравнения, строка <literal>@unexec</literal> - следует перед именем файла с примером конфигурации. На этапе - установки, если рабочий файл конфигурации отсутствует, он - копируется из файла с примером. Файл с примером обязательно - должен быть установлен до операции копирования, поэтому строка - <literal>@exec</literal> следует после имени файла с примером - конфигурации.</para> - - <para>Для получения дополнительного отладочного вывода на экран - можно временно удалить параметр <literal>-s</literal> из команды - &man.cmp.1;.</para> - - <para>Для получения дополнительной инфорации по использованию - <literal>%D</literal> и прочих маркеров подстановки обратитесь - к странице Справочника &man.pkg-create.8;.</para> - - <para>Если существует действительно стоящая причина не устанавливать - рабочий файл конфигурации по умолчанию, уберите строку - <literal>@exec</literal> из <filename>pkg-plist</filename> и - добавьте <link linkend="porting-message">сообщение</link>, - указывающее на то, что пользователь обязан скопировать и - отредактировать этот файл перед тем, как программное обеспечение - начнёт работать.</para> - </sect1> - - <sect1 xml:id="plist-dynamic"> - <title>Динамический или статический список упаковки</title> - - <para><emphasis>Статический список упаковки</emphasis> — это список - упаковки, который доступен в Коллекции Портов или как файл - <filename>pkg-plist</filename> (с подстановкой переменных или без - неё), или как встроенный в <filename>Makefile</filename> посредством - <varname>PLIST_FILES</varname>, <varname>PLIST_DIRS</varname> - и <varname>PLIST_DIRSTRY</varname>. - Даже если содержимое является автоматически порождаемым при помощи - инструмента или в результате выполнения цели в Makefile - <emphasis>до</emphasis> включения в Коллекцию Портов коммиттером, - то список всё ещё будет считаться статическим, поскольку его - можно узнать без необходимости скачивания или компиляции - дистрибутива.</para> - - <para><emphasis>Динамический список упаковки</emphasis> это список - упаковки, который получается во время компиляции порта и строится - на основе устанавливаемых файлов и каталогов. Узнать такой список - невозможно до того, как исходный код портируемого приложения - будет скачен и скомпилирован, или после запуска - <literal>make clean</literal>.</para> - - <para>Хотя использование динамических список упаковки не запрещено, - сопровождающие должны использовать статические списки упаковки - везде, где это возможно, поскольку это позволяет пользователям - выполнять &man.grep.1; по доступным портам для обнаружения, например, - который порт устанавливает определенный файл. Динамические списки - должны быть использованы в основном для сложных портов, для которых - изменения в списке упаковки кардинальным образом основаны на - необязательных возможностях порта (и, таким образом, делая - сопровождение статических списков упаковки невозможным), или портов, - которые изменяют список упаковки на основе версии используемого - им программного обеспечения (например, порты, которые порождают - документы при помощи <application>Javadoc</application>).</para> - </sect1> - - <sect1 xml:id="plist-autoplist"> - <title>Автоматическое создание списка упаковки</title> - - <para>Первым делом убедитесь, что ваш порт практически полностью - завершён и осталось создать только <filename>pkg-plist</filename>. - После этого вы можете запустить <command>make makeplist</command> - для автоматического создания <filename>pkg-plist</filename>. - Содержимое этого файла должно быть дважды перепроверено.</para> - - <para>Пользовательские конфигурационные файлы должны быть удалены - или быть установлены как - <filename>filename.sample</filename>. - Файл <filename>info/dir</filename> включать в список не нужно, но - должны быть добавлены соответствующие строчки - <filename>install-info</filename>, так, как это описано в разделе о <link linkend="makefile-info">файлах в формате info</link>. Все - библиотеки, устанавливаемые портом, должны быть перечислены так, как - это описано в разделе о <link linkend="porting-shlibs">динамических библиотеках</link>.</para> - </sect1> - - </chapter> - - <chapter xml:id="pkg-files"> - <title>Файлы <filename>pkg-*</filename></title> - - <para>Есть несколько приёмов работы с файлами - <filename>pkg-*</filename>, которые мы ещё не - описали, но они иногда могут быть очень кстати.</para> - - <sect1 xml:id="porting-message"> - <title><filename>pkg-message</filename></title> - - <para>Если вам нужно вывести сообщение для человека, устанавливающего - приложение, то вы можете поместить сообщение в файл - <filename>pkg-message</filename>. Эта возможность часто оказывается - полезной для вывода дополнительных шагов установки, которые нужно - предпринять после выполнения команды <command>pkg install</command>, - или для вывода информации о лицензировании.</para> - - <para>Если должны выводиться некоторые строки о knobs времени построения - или предупреждения, используйте <varname>ECHO_MSG</varname>. Файл - <filename>pkg-message</filename> только для послеустановочных шагов. - Также следует иметь в виду различие между <varname>ECHO_MSG</varname> - и <varname>ECHO_CMD</varname>. Первое предназначено для вывода на - экран информационного текста, а второе для конвейера команд:</para> - - <programlisting>update-etc-shells: - @${ECHO_MSG} "updating /etc/shells" - @${CP} /etc/shells /etc/shells.bak - @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \ - ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells - @${RM} /etc/shells.bak</programlisting> - - <note> - <para>Файл <filename>pkg-message</filename> не нужно добавлять в - <filename>pkg-plist</filename>.</para> - </note> - </sect1> - - <sect1 xml:id="pkg-install"> - <title><filename>pkg-install</filename></title> - - <para>Если при установке бинарного пакета по команде - <command>pkg add</command> или <command>pkg install</command> - вашему порту нужно выполнить какие-то команды, то вы можете - это сделать с помощью скрипта <filename>pkg-install</filename>. - Этот скрипт будет автоматически добавлен к пакету и будет - дважды запускаться командой <command>pkg</command>: первый раз - в виде <literal>${SH} pkg-install ${PKGNAME} - PRE-INSTALL</literal>, а второй раз как - <literal>${SH} {PKGNAME} POST-INSTALL</literal>. - Для распознавания того, в каком режиме запущен скрипт, можно - использовать параметр <literal>$2</literal>. Переменная - окружения <envar>PKG_PREFIX</envar> будет принимать значение, - соответствующее каталогу, в который устанавливается пакет.</para> - - <note> - <para>Этот скрипт не запускается автоматически, если вы - устанавливаете порт командой <command>make install</command>. - Если же вам действительно необходимо его запустить, то запустите - его явно из файла <filename>Makefile</filename> порта строкой - вида <literal>PKG_PREFIX=${PREFIX} ${SH} $ - {PKGINSTALL}${PKGNAME} PRE-INSTALL</literal>.</para> - </note> - </sect1> - - <sect1 xml:id="pkg-deinstall"> - <title><filename>pkg-deinstall</filename></title> - - <para>Этот скрипт вызывается при удалении пакета.</para> - - <para>Этот скрипт будет дважды запускаться командой - <command>pkg delete</command>. - Первый раз как <literal>${SH} pkg-deinstall - ${PKGNAME} DEINSTALL</literal>, а второй раз как - <literal>${SH} pkg-deinstall ${PKGNAME} - POST-DEINSTALL</literal>.</para> - </sect1> - - <sect1 xml:id="pkg-names"> - <title xml:id="porting-pkgfiles">Изменение имён файлов - <filename>pkg-*</filename></title> - - <para>Все имена файлов - <filename>pkg-*</filename> - определяются с помощью переменных, так что вы можете изменить их, - если это нужно, в вашем файле <filename>Makefile</filename>. Это - особенно полезно, если вы используете одни и те же файлы - <filename>pkg-*</filename> - совместно между несколькими портами или - пишете в один из вышеперечисленных файлов (в главе о <link linkend="porting-wrkdir">записи в каталоги, отличные от - <varname>WRKDIR</varname></link> объяснено, почему не рекомендуется - осуществлять запись непосредственно в файлы - <filename>pkg-*</filename>.</para> - - <para>Вот список имён переменных и их значений по умолчанию. (Значение - <varname>PKGDIR</varname> по умолчанию равно - <varname>${MASTERDIR}</varname>.)</para> - - <informaltable frame="none" pgwide="0"> - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - - <entry>Значение по умолчанию</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>DESCR</varname></entry> - <entry><literal>${PKGDIR}/pkg-descr</literal></entry> - </row> - - <row> - <entry><varname>PLIST</varname></entry> - <entry><literal>${PKGDIR}/pkg-plist</literal></entry> - </row> - - <row> - <entry><varname>PKGINSTALL</varname></entry> - <entry><literal>${PKGDIR}/pkg-install</literal></entry> - </row> - - <row> - <entry><varname>PKGMESSAGE</varname></entry> - <entry><literal>${PKGDIR}/pkg-message</literal></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Пожалуйста, изменяйте значения этих переменных, а не - переопределяйте <varname>PKG_ARGS</varname>. Если вы измените - значение переменных <varname>PKG_ARGS</varname>, то эти файлы при - установке из порта будут установлены в каталог - <filename>/var/db/pkg</filename> некорректно.</para> - </sect1> - - <sect1 xml:id="using-sub-files"> - <title>Использование <varname>SUB_FILES</varname> и - <varname>SUB_LIST</varname></title> - - <para>Переменные <varname>SUB_FILES</varname> и - <varname>SUB_LIST</varname> подходят для задания в файлах порта - динамических значений, таких как <varname>PREFIX</varname> установки - в <filename>pkg-message</filename>.</para> - - <para>В переменной <varname>SUB_FILES</varname> указывается перечень - файлов для автоматического изменения. Каждый - <replaceable>file</replaceable> из перечня <varname>SUB_FILES</varname> - обязан иметь соответствующий - <filename>file.in</filename>, - присутствующий в <varname>FILESDIR</varname>. Измененная версия - будет создана в <varname>WRKDIR</varname>. Файлы, определенные в - качестве значения <varname>USE_RC_SUBR</varname> (или устаревшего - <varname>USE_RCORDER</varname>), автоматически добавляются в - <varname>SUB_FILES</varname>. Для файлов - <filename>pkg-message</filename>, <filename>pkg-install</filename> - и <filename>pkg-deinstall</filename> - устанавливается соответствующая переменная Makefile, указывающая на - обработанную версию.</para> - - <para>Переменная <varname>SUB_LIST</varname> содержит перечень пар - <literal>VAR=VALUE</literal>. В каждом файле из - <varname>SUB_FILES</varname> для каждой пары будет произведена - замена <literal>%%VAR%%</literal> на <literal>VALUE</literal>. - Некоторые общие пары определяются автоматически: - <varname>PREFIX</varname>, <varname>LOCALBASE</varname>, - <varname>DATADIR</varname>, - <varname>DOCSDIR</varname>, <varname>EXAMPLESDIR</varname>, - <varname>WWWDIR</varname> и <varname>ETCDIR</varname>. - Любая строка, начинающаяся с <literal>@comment</literal>, будет - удалена из конечного файла после подстановки переменной.</para> - - <para>В следующем примере в <filename>pkg-message</filename> - будет сделана замена <literal>%%ARCH%%</literal> на системную - архитектуру:</para> - - <programlisting>SUB_FILES= pkg-message -SUB_LIST= ARCH=${ARCH}</programlisting> - - <para>Обратите внимание, что в этом примере в <varname>FILESDIR</varname> - обязательно существование файла <filename>pkg-message.in</filename>. - </para> - - <para>Пример хорошего <filename>pkg-message.in</filename>:</para> - - <programlisting>Now it's time to configure this package. -Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory -as .putsy.conf and edit it.</programlisting> - - </sect1> - </chapter> - - <chapter 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 xml:id="port-upgrading"> - <title>Обновление отдельного порта</title> - - <para>Если вы заметите, что ваш порт устарел по сравнению с последней - авторской версией, первым делом вы должны получить самую - последнюю версия порта. Вы можете найти их в каталоге - <filename>ports/ports-current</filename> на зеркальных FTP-серверах &os;. - Однако если вы работаете с достаточно большим количеством портов, - наверное, будет проще использовать - <application>Subversion</application> или &man.portsnap.8; для - поддержания всей коллекции портов в актуальном состоянии, как это - описано в <link xlink:href="&url.books.handbook;/ports-using.html"> - Руководстве</link>. К тому же это даст возможность отслеживать все - зависимости портов.</para> - - <para>На следующем шаге необходимо выяснить, нет ожидает ли уже это - обновление своей очереди. Для этого у вас есть две возможности. - Существует интерфейс к <link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе - данных сообщений о проблемах FreeBSD (PR)</link> (известной также как - <literal>GNATS</literal>) с поисковыми возможностями. Выберите из - выпадающего списка <literal>ports</literal> и введите название - порта.</para> - - <para>Однако иногда люди забывают поместить название порта в поле - Synopsis в точном виде. В таком случае вы можете воспользоваться - <link linkend="portsmon">Системой мониторинга портов &os;</link> - (которая известна также как - <literal>portsmon</literal>). В рамках этой системы делается попытка - классифицировать PR, касающиеся портов, по имени порта. Для поиска - PR, относящихся к определённому порту, используйте механизм <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Просмотра - по одному порту</link>.</para> - - <para>Если таких отложенных PR не существует, то на следующем этапе - следует послать сообщение электронной почты человеку, поддерживающему - порт, который выдаётся по команде <command>make maintainer</command>. - Этот человек может уже работать над обновлением, или иметь - причину не обновлять порт прямо сейчас (например, из-за проблем со - стабильностью функционирования новой версии); - вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые - порты перечисляются с адресом сопровождающего - <literal>ports@FreeBSD.org</literal>, который является всего лишь - адресом общего списка рассылки, так что отправка туда сообщений, - скорее всего, в данном случае не поможет.</para> - - <para>Если сопровождающий просит вас выполнить обновление, либо - сопровождающий отсутствует, то у вас появляется шанс помочь &os;, - приготовив обновление самим! Пожалуйста, делайте это с использованием - команды &man.diff.1; в основной системе.</para> - - <para>Чтобы создать подходящий <command>diff</command> для одного патча, - скопируйте файл, который нужно пропатчить, в - <replaceable>something.orig</replaceable>, сохраните ваши изменения в - <replaceable>something</replaceable>, а затем создайте ваше патч:</para> - - <informalexample> - <screen>&prompt.user; <userinput>diff -u something.orig something > something.diff</userinput></screen> - </informalexample> - - <para>В противном случае, вам следует воспользоваться методом - <command>svn diff</command> (<xref linkend="svn-diff"/>), либо - скопировать содержимое порта в - отдельный каталог и применить результат рекурсивной команды &man.diff.1; - между новым и старым каталогами порта (например, если каталог с - модифицированным портом называется <filename>superedit</filename>, - а оригинальный, совпадающий с находящимся в нашем дереве портов, - <filename>superedit.bak</filename>, то сохраните результат выполнения - команды <command>diff -ruN superedit.bak superedit</command>). - Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры - портов обычно предпочитают унифицированный формат. Отметьте - использование опции <literal>-N</literal>—это одобряемый способ - заставить diff корректно работать в случае добавления новых файлов или - удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста, - проверьте его, чтобы убедиться в значимости всех внесённых - изменений. (В частности, убедитесь, что вы очистили рабочие каталоги - командой <command>make clean</command>).</para> - - <para>Для упрощения повторяющихся операций с файлами заплаток - вы можете воспользоваться скриптом - <filename>/usr/ports/Tools/scripts/patchtool.py</filename>. Перед тем, - как его запускать, пожалуйста, прочтите - <filename>/usr/ports/Tools/scripts/README.patchtool</filename>.</para> - - <para>Если порт никем не поддерживается, а вы активно его используете, - пожалуйста, подумайте над тем, чтобы добровольно стать его - сопровождающим. Во &os; имеется более 4000 портов без поддержки, и это - как раз та область, где всегда нужны добровольцы. (Детальное описание - обязанностей сопровождающего можно найти в разделе в <link xlink:href="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER"> - Руководстве Разработчика</link>.)</para> - - <para>Лучше всего послать нам diff-файл, включив его в посылку по команде - &man.send-pr.1; (категория <literal>ports</literal>). Если вы - сопровождаете порт, - обязательно поместите текст <literal>[maintainer update]</literal> в - начале строки описания и задайте в поле <quote>Class</quote> - вашего PR строчку <literal>maintainer-update</literal>. - В противном случае в поле <quote>Class</quote> вашего PR должно быть - указано <literal>change-request</literal>. Будьте добры, в сообщении - отметьте все добавленные или удалённые файлы, так как они будут - непосредственно указаны &man.svn.1; при выполнении операции коммита. - Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте - утилитой uuencode; в противном случае просто включите его как есть - в PR.</para> - - <para>Прежде чем пользоваться &man.send-pr.1; просмотрите раздел - о <link xlink:href="&url.articles.problem-reports;/pr-writing.html">Написании - сообщений о проблемах</link> в статье о Сообщениях об ошибках. Он - содержит гораздо больше информации о том, как писать полезные сообщения - о проблемах.</para> - - <important> - <para>Если обновление вызвано соображениями информационной - безопасности или наличием серьёзных ошибок в имеющемся порте, - пожалуйста, оповестите &a.portmgr; о необходимости немедленного - перепостроения и повторного распространения пакета данного порта. - В противном случае ничего не подозревающие пользователи - <command>pkg</command> будут продолжать устанавливать старую - версию по команде <command>pkg install</command> в течение - ещё нескольких недель.</para> - </important> - - <note> - <para>Повторяем еще раз - для посылки обновлений существующих портов - используйте утилиту &man.diff.1;, а не &man.shar.1;! Это поможет - понять коммиттерам портов, что именно было изменено.</para> - </note> - - <para>Теперь, когда вы проделали всё это, прочитайте о том, как - поддерживать актуальное состояние, в <xref linkend="keeping-up"/>.</para> - - <sect1 xml:id="svn-diff"> - <title>Использование <application>Subversion</application> для - создания патчей</title> - - <para>По возможности присылайте исправления в формате &man.svn.1; diff. - В таком виде их проще использовать по сравнению с разницей между - <quote>старым и новым</quote> каталогами. Так проще - увидеть изменения и обновить их в случае, если что-нибудь - изменилось в Коллекции Портов с тех пор, как вы начали работу, - либо если коммиттер просит что-то исправить.</para> - - <screen>&prompt.user; <userinput>cd ~/my_wrkdir</userinput> <co xml:id="my-wrkdir"/> -&prompt.user; <userinput>svn co https://svn0.us-west.FreeBSD.org/ports/head/dns/pdnsd</userinput> <co xml:id="svn-FreeBSD-org"/> -&prompt.user; <userinput>cd ~/my_wrkdir/pdnsd</userinput></screen> - - <calloutlist> - <callout arearefs="my-wrkdir"> - <para>Это может быть где угодно; место, в котором производится - построение портов, не привязано к - <filename>/usr/ports/</filename>.</para> - </callout> - - <callout arearefs="svn-FreeBSD-org"> - <para><link xlink:href="https://svn0.us-west.FreeBSD.org/">svn0.us-west.FreeBSD.org</link> - — это общедоступный сервер - <application>Subversion</application>. - Выберите ближайшее зеркало и проверьте сертификат - зеркалирующего сервера на наличие в перечне <link xlink:href="&url.books.handbook;/svn-mirrors.html">зеркалирующих - сайтов Subversion</link>.</para> - </callout> - </calloutlist> - - <para>Находясь в рабочем каталоге, вносите любые изменения, которые - обычно делают для порта. При добавлении или удалении файла - используйте <command>svn</command> для отслеживания этих - изменений:</para> - - <screen>&prompt.user; <userinput>svn add new_file</userinput> -&prompt.user; <userinput>svn remove deleted_file</userinput></screen> - - <para>Убедитесь, что вы проверяете порт в соответствии с рекомендуемым - порядком проверки, описанным в <xref linkend="porting-testing"/> и - <xref linkend="porting-portlint"/>.</para> - - <screen>&prompt.user; <userinput>svn status</userinput> -&prompt.user; <userinput>svn update</userinput> <co xml:id="svn-update"/></screen> - - <calloutlist> - <callout arearefs="svn-update"> - <para>Эта команда попытается выполнить слияние различий между - вашим патчем и текущей версией репозитория; внимательно проверьте - полученный вывод. Буква перед названием каждого файла означает - тип изменения, сделанного с этим файлом. Для получения полного - списка смотрите <xref linkend="table-svn-up"/>.</para> - </callout> - </calloutlist> - - <table pgwide="1" frame="none" xml:id="table-svn-up"> - <title>Префиксы файлов для <application>Subversion</application> - update</title> - - <tgroup cols="2"> - <tbody> - <row> - <entry>U</entry> - - <entry>Файл обновлен без проблем.</entry> - </row> - - <row> - <entry>G</entry> - - <entry>Файл обновлен без проблем (вы увидите это только - при работе с удаленным репозиторием).</entry> - </row> - - <row> - <entry>M</entry> - - <entry>Файл с локальными изменениями, слияние выполнено - без конфликтов.</entry> - </row> - - <row> - <entry>C</entry> - - <entry>Файл с локальными изменениями, слияние выполнено - с конфликтами.</entry> - </row> - </tbody> - </tgroup> - </table> - - <para>Если в результате выполнения <literal>svn update</literal> - отображается <literal>C</literal>, то это означает, что что-то - изменилось в репозитории <application>Subversion</application> - и &man.svn.1; не смогла выполнить - слияние локальных изменений с полученными из репозитория. - В любом случае никогда не помешает просмотреть изменения, - поскольку &man.svn.1; ничего не знает о том, каким должен быть - порт, поэтому эта команда может (и, вероятно, будет) делать - слияние тех изменений, которые не имеют смысла.</para> - - <para>Последним шагом является создание унифицированного &man.diff.1; - для полученных изменений:</para> - - <screen>&prompt.user; <userinput>svn diff > ../`basename ${PWD}`.diff</userinput></screen> - - <note> - <para>Информация о любых удаляемых файлов должна быть явным - образом указана в PR, поскольку необходимость в удалении - файла для коммиттера может быть неочевидна.</para> - </note> - - <para>Присылайте свои патчи в соответствии с руководством, описанном в - <xref linkend="port-upgrading"/>.</para> - </sect1> - - <sect1 xml:id="moved-and-updating-files"> - <title>Файлы <filename>UPDATING</filename> и - <filename>MOVED</filename></title> - - <para>Если при обновлении порта требуются специальные шаги, такие как - изменение файлов конфигурации или запуск специальной программы, - то вам следует это задокументировать в файле - <filename>/usr/ports/UPDATING</filename>. Формат записи в этом - файле приводится ниже:</para> - - <programlisting>YYYYMMDD: - AFFECTS: users of portcategory/portname - AUTHOR: Your name <Your email address> - - Special instructions</programlisting> - - <para>Если вы включаете точные инструкции portmaster или portupgrading, - пожалуйста, убедитесь в правильном экранировании символов внутри - командной оболочки.</para> - - <para>Файл <filename>/usr/ports/MOVED</filename> содержит записи - об удалённых или перемещённых портах. Каждая строка в этом - файле состоит из полей: название порта, место, куда он был - перемещён, дата и причина перемещения. Если порт был удалён, - то поле, указывающее новое место, может оставаться незаполненным. - Поля должны разделяться символом <literal>|</literal> (pipe), - как это показано ниже:</para> - - <programlisting>old name|new name (blank for deleted)|date of move|reason</programlisting> - - <para>Дату следует вводить в формате <literal>YYYY-MM-DD</literal>. - Новые записи следует добавлять в конец файла в хронологическом - порядке.</para> - - <para>Если порт был перемещён, но в дальнейшем восстановлен на - прежнем месте, удалите в этом файле строку, содержащую - информацию о перемещении.</para> - - <para>Полученные изменения можно проверить командой - <command>Tools/scripts/MOVEDlint.awk</command>.</para> - </sect1> - </chapter> - - <chapter xml:id="security"> - <title>Безопасность портов</title> - - <sect1 xml:id="security-intro"> - <title>Почему безопасность так важна</title> - - <para>Ошибки в программном обеспечении появляются случайно. Возможно, - самые опасные из них те, что создают уязвимости безопасности. С - технической точки зрения подобные уязвимости должны быть закрыты - путем исправления вызывающих их ошибок. Тем не менее, политики - обработки несущественных ошибок и уязвимостей очень различаются. - </para> - - <para>Обычная небольшая ошибка затрагивает только тех пользователей, - которые задействуют некоторые комбинации настроек, активирующие эту - ошибку. Разработчик в конечном счете выпустит патч, а зачтем новую - версию программного обеспечения, свободного от ошибки, но большинство - пользователей не посчитают нужным сразу же произвести обновление, - поскольку эта ошибка никогда у них не проявлялась. Критическая - ошибка, которая может приводить к потере данных, представляет - серьезную проблему. Тем не менее, предусмотрительные пользователи - знают, что большинство возможных происшествий, и среди них программные - ошибки, скорее всего приводят к потере данных, поэтому они выполняют - резервное копирование важных данных; дополнительно, критическая - ошибка будет обнаружена очень скоро.</para> - - <para>С уязвимостью безопасности всё иначе. Во-первых, она может - сохраняться необнаруженной целые годы, потому что чаще всего не - вызывает ошибок в работе. Во-вторых, компания злоумышленников - может использовать ее для получения неавторизованного доступа к - уязвимой системе, уничтожить или подменить важные данные; в худшем - случае пользователь даже не заметит нанесенный урон. В-третьих, - взлом уязвимой системы часто упрощает задачу проникновения атакующих - в другие системы, которые не могут быть скомпрометированы иначе. - Таким образом, устранение уязвимости как таковой недостаточно: - следует разослать всем заинтересованным уведомления в наиболее - понятной и исчерпывающей форме, что позволит оценить риск и - предпринять подходящие меры.</para> - </sect1> - - <sect1 xml:id="security-fix"> - <title>Исправление уязвимостей безопасности</title> - - <para>Что касается портов и пакетов, уязвимость безопасности - изначально может появиться в исходном дистрибутиве или файлах - порта. В первом случае, разработчик исходного программного - обеспечения скорее всего сразу же выпустит патч или новую версию, - и вам лишь понадобится сразу обновить порт в соответствии с - исправлением автора. Если исправление по какой-то причине - задерживается, вам следует либо <link linkend="dads-noinstall">пометить - порт как <varname>FORBIDDEN</varname></link>, либо добавить в порт - ваш собственный патч. В случае уязвимости порта просто исправьте - этот порт как можно скорее. В любом случае нужно следовать - <link linkend="port-upgrading">стандартной процедуре отправки вашего - изменения</link>, если вы не обладаете правами на коммит изменения - непосредственно в дерево портов.</para> - - <important> - <para>Быть коммиттером портов недостаточно для коммита произвольного - порта. Помните, что обычно у портов есть сопровождающие, мнение - которых вы должны учитывать.</para> - </important> - - <para>Пожалуйста, убедитесь, что ревизия порта после закрытия - уязвимости увеличена. Вот как пользователи, обновляющие - установленные пакеты на постоянной основе, увидят, что им нужно - запустить обновление. Кроме того, новый пакет будет собран и - распространен через FTP и WWW зеркала, замещая уязвимый. - Если в процессе исправления уязвимости не было изменено значение - <varname>PORTVERSION</varname>, то должно быть увеличено значение - <varname>PORTREVISION</varname>. Вам следует увеличить значение - <varname>PORTREVISION</varname> после добавления в порт файла с - патчем, но не когда вы обновили порт до последней версии - программного обеспечения, попутно затронув при этом - <varname>PORTVERSION</varname>. За дальнейшей информацией - обращайтесь к - <link linkend="makefile-naming-revepoch">соответствующему - разделу</link>.</para> - </sect1> - - <sect1 xml:id="security-notify"> - <title>Обеспечение сообщества информацией</title> - - <sect2 xml:id="security-notify-vuxml-db"> - <title>База данных VuXML</title> - - <para>Очень важным и первостепенным шагом при действии как можно - раньше после раскрытия уязвимости является уведомление сообщества - пользователей порта об опасности. Такие уведомления служат двум - целям. Во-первых, в случае действительно серьезной угрозы, будет - посоветовано применить мгновенное воздействие. Например, остановить - затрагиваемый сетевой сервис или даже удалить порт целиком, - пока уязвимость не будет устранена. Во-вторых, масса - пользователей имеет тенденцию обновлять установленные пакеты только от - случая к случаю. Из уведомления они узнают, что - <emphasis>должны</emphasis> обновить пакет без промедления сразу - же после появления исправленной версии.</para> - - <para>Учитывая огромное число портов в дереве, невозможно по - каждому случаю выпускать бюллетень безопасности без создания - флуда и потери внимания сообщества к моменту появления - действительно серьезных причин. Поэтому уязвимости безопасности, - обнаруженные в портах, записываются в - <link xlink:href="http://vuxml.freebsd.org/">базу данных - &os; VuXML</link>. - Члены Команды Офицеров Безопасности также отслеживают её на - предмет появления вопросов, требующих их вмешательства.</para> - - <para>Если вы обладаете правами коммиттера, вы можете сам обновить - базу данных VuXML. Так вы поможете Команде Офицеров Безопасности - и своевременно пошлете ценную информацию сообществу. Тем не - менее, если вы не являетесь коммиттером или верите, что нашли - исключительно серьезную уязвимость, то не - задумываясь свяжитесь с Командой Офицеров Безопасности напрямую - как это описано на странице - <link xlink:href="http://www.freebsd.org/security/#how">информационной - безопасности &os;</link>.</para> - - <para>База данных VuXML является документом <acronym>XML</acronym>. - Его исходный файл <filename>vuln.xml</filename> содержится - прямо внутри порта <package role="port">security/vuxml</package>. - Следовательно, полное имя пути к файлу будет - <filename>PORTSDIR/security/vuxml/vuln.xml</filename>. - Каждый раз, при обнаружении вами в порте уязвимости безопасности - добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML, - лучшее, что вы можете сделать, это найти существующую запись, - подпадающую под ваш случай, затем скопировать ее и использовать - в качестве шаблона.</para> - </sect2> - - <sect2 xml:id="security-notify-vuxml-intro"> - <title>Короткое вступление в VuXML</title> - - <para>В совокупности <acronym>XML</acronym> является очень - сложным форматом, и его описание выходит далеко за рамки - этой книги. Тем не менее, для достижения основного понимания - структуры записи VuXML вам понадобится всего лишь понять теги. - Имена тегов XML обрамляются в угловые скобки. Каждый открывающий - <tag> должен иметь совпадающий закрывающий </tag>. - Теги могут быть вложенными. При вложенности внутренние теги - должны быть закрыты до закрытия внешних. Существует иерархия - тегов, т.е. более сложные правила вкладывания тегов. Это - похоже на HTML. Основное отличие в расширяемости XML, - т.е. в определении собственных тегов. Из-за своей характерной - структуры XML придает форму разрозненным данным. В частности, - XML подходит для разметки описаний уязвимостей безопасности.</para> - - <para>Теперь рассмотрим настоящую запись VuXML:</para> - - <programlisting><vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> <co xml:id="co-vx-vid"/> - <topic>Several vulnerabilities found in Foo</topic> <co xml:id="co-vx-top"/> - <affects> - <package> - <name>foo</name> <co xml:id="co-vx-nam"/> - <name>foo-devel</name> - <name>ja-foo</name> - <range><ge>1.6</ge><lt>1.9</lt></range> <co xml:id="co-vx-rng"/> - <range><ge>2.*</ge><lt>2.4_1</lt></range> - <range><eq>3.0b1</eq></range> - </package> - <package> - <name>openfoo</name> <co xml:id="co-vx-nm2"/> - <range><lt>1.10_7</lt></range> <co xml:id="co-vx-epo"/> - <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range> - </package> - </affects> - <description> - <body xmlns="http://www.w3.org/1999/xhtml"> - <p>J. Random Hacker reports:</p> <co xml:id="co-vx-bdy"/> - <blockquote - cite="http://j.r.hacker.com/advisories/1"> - <p>Several issues in the Foo software may be exploited - via carefully crafted QUUX requests. These requests will - permit the injection of Bar code, mumble theft, and the - readability of the Foo administrator account.</p> - </blockquote> - </body> - </description> - <references> <co xml:id="co-vx-ref"/> - <freebsdsa>SA-10:75.foo</freebsdsa> <co xml:id="co-vx-fsa"/> - <freebsdpr>ports/987654</freebsdpr> <co xml:id="co-vx-fpr"/> - <cvename>CAN-2010-0201</cvename> <co xml:id="co-vx-cve"/> - <cvename>CAN-2010-0466</cvename> - <bid>96298</bid> <co xml:id="co-vx-bid"/> - <certsa>CA-2010-99</certsa> <co xml:id="co-vx-cts"/> - <certvu>740169</certvu> <co xml:id="co-vx-ctv"/> - <uscertsa>SA10-99A</uscertsa> <co xml:id="co-vx-ucs"/> - <uscertta>SA10-99A</uscertta> <co xml:id="co-vx-uct"/> - <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <co xml:id="co-vx-mls"/> - <url>http://j.r.hacker.com/advisories/1</url> <co xml:id="co-vx-url"/> - </references> - <dates> - <discovery>2010-05-25</discovery> <co xml:id="co-vx-dsc"/> - <entry>2010-07-13</entry> <co xml:id="co-vx-ent"/> - <modified>2010-09-17</modified> <co xml:id="co-vx-mod"/> - </dates> -</vuln></programlisting> - - <para>Имена тегов должны быть самодокументируемыми, чтобы мы - сфокусировались только на полях, нужных нам для заполнения:</para> - - <calloutlist> - <callout arearefs="co-vx-vid"> - <para>Это тег верхнего уровня записи VuXML. У него есть - обязательный атрибут <literal>vid</literal>, указывающий на - универсальный уникальный идентификатор (UUID) для этой записи - (в кавычках). Вы должны формировать UUID для каждой новой - записи VuXML (и не забудьте заменить ее для шаблона UUID, - если вы не пишете запись с нуля). Для получения VuXML UUID - вы можете использовать &man.uuidgen.1;.</para> - </callout> - - <callout arearefs="co-vx-top"> - <para>Однострочное описание найденной проблемы.</para> - </callout> - - <callout arearefs="co-vx-nam"> - <para>Здесь перечислены имена затронутых пакетов. - Может быть дано несколько имен, поскольку некоторые пакеты - могут быть основаны на одном главном порте или программном - продукте. Сюда можно включить стабильную ветвь и ветвь - разработки, локализованные версии и подчиненные порты, - зависящие от различного выбора важных вариантов конфигурации, - указанных на этапе построения.</para> - - <important> - <para>Поиск всех подобных пакетов при написании записи VuXML - входит в зону вашей ответственности. Имейте в виду, что - <literal>make search name=foo</literal> это ваш друг. - Первичные точки для поиска следующие:</para> - - <itemizedlist> - <listitem> - <para>вариант <filename>foo-devel</filename> для порта - <filename>foo</filename>;</para> - </listitem> - - <listitem> - <para>другие варианты с суффиксами вида - <literal>-a4</literal> (для пакетов, связанных с печатью), - <literal>-without-gui</literal> (для пакетов с - отключенной поддержкой X), или подобных;</para> - </listitem> - - <listitem> - <para><literal>jp-</literal>, <literal>ru-</literal>, - <literal>zh-</literal> и другие возможные локализованные - варианты в соответствующих национальных категориях - коллекции портов.</para> - </listitem> - </itemizedlist> - </important> - </callout> - - <callout arearefs="co-vx-rng"> - <para>Здесь указаны затронутые версии пакета(-ов) как один или - более диапазонов с использованием комбинации элементов - <literal><lt></literal>, <literal><le></literal>, - <literal><eq></literal>, <literal><ge></literal>, - и <literal><gt></literal>. Диапазоны внесённых версий - не должны пересекаться.</para> - - <para>В спецификации диапазонов <literal>*</literal> (звёздочка) - означает наименьший номер версии. В частности, - <literal>2.*</literal> меньше, чем <literal>2.a</literal>. - Поэтому звездочка может быть использована в диапазоне для - совпадения со всеми возможными <literal>alpha</literal>, - <literal>beta</literal> и <literal>RC</literal> версиями. - Как вариант, - <literal><ge>2.*</ge><lt>3.*</lt></literal> - выборочно совпадет с версией <literal>2.x</literal>, а - <literal><ge>2.0</ge><lt>3.0</lt></literal> - - нет, поскольку последнее не включает - <literal>2.r3</literal> и совпадает с <literal>3.b</literal>. - </para> - - <para>Пример выше указывает, что к затронутым относятся версии с - <literal>1.6</literal> до <literal>1.9</literal> включительно, - версии <literal>2.x</literal> до <literal>2.4_1</literal> и - версия <literal>3.0b1</literal>.</para> - </callout> - - <callout arearefs="co-vx-nm2"> - <para>Некоторые связанные группы пакетов (в конечном счете, порты) - могут быть указаны в разделе <literal><affected></literal>. - Это можно использовать, если некоторые программные продукты - (скажем, FooBar, FreeBar and OpenBar) являются производными - от общей кодовой базы и всё еще совместно используют её ошибки - и уязвимости. Имейте в виду отличие от перечисления - множественных имён в одном разделе <package>.</para> - </callout> - - <callout arearefs="co-vx-epo"> - <para>Диапазоны версий должны учитывать - <varname>PORTEPOCH</varname> и <varname>PORTREVISION</varname>, - если это применимо. Пожалуйста, помните, что в соответствии - с правилами сравнения строк версия с ненулевым значением - <varname>PORTEPOCH</varname> выше, чем любая версия без - <varname>PORTEPOCH</varname>, например, <literal>3.0,1</literal> - выше, чем <literal>3.1</literal> или даже <literal>8.9</literal>. - </para> - </callout> - - <callout arearefs="co-vx-bdy"> - <para>Сводная информация о проблеме. В этом поле - используется XHTML. По крайней мере, должны быть обрамляющие - <literal><p></literal> и <literal></p></literal>. - Может быть использована более сложная разметка, но только в - целях аккуратности и ясности: без эстетства, пожалуйста. - </para> - </callout> - - <callout arearefs="co-vx-ref"> - <para>Этот раздел содержит ссылки на имеющие отношение документы. - Приветствуется как можно большее количество ссылок.</para> - </callout> - - <callout arearefs="co-vx-fsa"> - <para>Это - <link xlink:href="http://www.freebsd.org/security/#adv">бюллетень - безопасности &os;</link>.</para> - </callout> - - <callout arearefs="co-vx-fpr"> - <para>Это - <link xlink:href="http://www.freebsd.org/support.html#gnats">сообщение - об ошибке &os;</link>.</para> - </callout> - - <callout arearefs="co-vx-cve"> - <para>Идентификатор - <link xlink:href="http://www.cve.mitre.org/">MITRE - CVE</link>.</para> - </callout> - - <callout arearefs="co-vx-bid"> - <para>Это - <link xlink:href="http://www.securityfocus.com/bid">SecurityFocus - Bug ID</link>.</para> - </callout> - - <callout arearefs="co-vx-cts"> - <para>Бюллетень безопасности - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-ctv"> - <para>Примечание к уязвимости - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-ucs"> - <para>Уведомление системы Cyber Security Alert - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-uct"> - <para>Уведомление системы Technical Cyber Security Alert - <link xlink:href="http://www.cert.org/">US-CERT</link>.</para> - </callout> - - <callout arearefs="co-vx-mls"> - <para>URL к архивному сообщению в списке рассылки. - Атрибут <literal>msgid</literal> является необязательным - и может указывать на message ID сообщения.</para> - </callout> - - <callout arearefs="co-vx-url"> - <para>Основной URL. Должен быть использован в случае, если - не подходит ни одна из категорий источника.</para> - </callout> - - <callout arearefs="co-vx-dsc"> - <para>Дата последнего изменения любой информации данной записи - (<replaceable>YYYY-MM-DD</replaceable>). Новые записи не - должны включать это поле. Поле должно быть добавлено после - редактирования существующей записи.</para> - </callout> - </calloutlist> - </sect2> - - <sect2 xml:id="security-notify-vuxml-testing"> - <title>Тестирование ваших изменений в базе данных VuXML</title> - - <para>Предположим, что вы только что написали или заполнили запись - об уязвимости в пакете <literal>clamav</literal>, которая была - исправлена в версии <literal>0.65_7</literal>.</para> - - <para>Прежде всего, вам нужно <emphasis>установить</emphasis> - последние версии портов - <package role="port">ports-mgmt/portaudit</package>, - <package role="port">ports-mgmt/portaudit-db</package> и - <package role="port">security/vuxml</package>.</para> - - <note> - <para>Для запуска <command>packaudit</command> вы должны обладать - правами на запись в - <filename>DATABASEDIR</filename>; как правило, - это <filename>/var/db/portaudit</filename>.</para> - - <para>Для использования другого каталога присвойте переменной - окружения <filename>DATABASEDIR</filename> - другой путь.</para> - - <para>Если вы работаете в каталоге, отличном от - <filename>${PORTSDIR}/security/vuxml</filename>, присвойте - переменной окружения - <filename>VUXMLDIR</filename> путь к каталогу, - в котором находится <filename>vuln.xml</filename>.</para> - </note> - - <para>Во-первых, проверьте, нет ли уже записи об этой уязвимости. - Если такая запись есть, она совпадёт с предыдущей версией - пакета <literal>0.65_6</literal>:</para> - - <screen>&prompt.user; <userinput>packaudit</userinput> -&prompt.user; <userinput>portaudit clamav-0.65_6</userinput></screen> - - <para>Если ничего не найдено, значит вы получили зеленый свет для - добавления новой записи для этой уязвимости.</para> - - <screen>&prompt.user; <userinput>cd ${PORTSDIR}/security/vuxml</userinput> -&prompt.user; <userinput>make newentry</userinput></screen> - - <para>Когда вы закончите, проверьте синтаксис и форматирование.</para> - - <screen>&prompt.user; <userinput>make validate</userinput></screen> - - <note> - <para>Вам понадобится установить по крайней мере один из следующих - пакетов: <package role="port">textproc/libxml2</package>, - <package role="port">textproc/jade</package>.</para> - </note> - - <para>Теперь выполните перепостроение базы данных - <command>portaudit</command> из файла VuXML:</para> - - <screen>&prompt.user; <userinput>packaudit</userinput></screen> - - <para>Чтобы убедиться, что раздел <literal><affected></literal> - в вашей записи совпадает с правильными пакетами, выполните - следующую команду:</para> - - <screen>&prompt.user; <userinput>portaudit -f /usr/ports/INDEX -r uuid</userinput></screen> - - <note> - <para>Для лучшего понимания синтаксиса этой команды обращайтесь - к &man.portaudit.1;.</para> - </note> - - <para>Убедитесь, что ваша запись не производит ложных совпадений - в выводе.</para> - - <para>Теперь проверьте, совпадает ли ваша запись с нужными версиями - пакета:</para> - - <screen>&prompt.user; <userinput>portaudit clamav-0.65_6 clamav-0.65_7</userinput> -Affected package: clamav-0.65_6 (matched by clamav<0.65_7) -Type of problem: clamav remote denial-of-service. -Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html> - -1 problem(s) found.</screen> - - <para>Первая версия должна совпасть, а последняя - нет.</para> - - <para>В заключение проверьте, что веб-страница, сформированная из - базы данных VuXML, выглядит как положено:</para> - - <screen>&prompt.user; <userinput>mkdir -p ~/public_html/portaudit</userinput> -&prompt.user; <userinput>packaudit</userinput> -&prompt.user; <userinput>lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html</userinput></screen> - </sect2> - </sect1> - </chapter> - - <chapter xml:id="porting-dads"> - <title>Что делать нужно, и что делать нельзя</title> - - <sect1 xml:id="dads-intro"> - <title>Введение</title> - - <para>Вот список часто встречающихся действий, которые нужно и которые - нельзя делать во время процесса портирования. Проверьте - порт по этому списку, и также проверьте порты в - <link xlink:href="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">базе - сообщений PR</link>, которые присланы другими людьми. Присылайте - любые комментарии о портах, которые вы проверили, так, как это описано - в статье о <link xlink:href="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL"> - Сообщениях об ошибках и общих замечаниях</link>. Проверка портов в - базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, - что вы знаете, что делаете.</para> - </sect1> - - <sect1 xml:id="porting-wrkdir"> - <title><varname>WRKDIR</varname></title> - - <para>Не пишите ничего в файлы вне каталога <varname>WRKDIR</varname>. - Каталог <varname>WRKDIR</varname> является единственным местом, - которое гарантированно будет доступно для записи во время построения - порта (обратитесь к главе о <link xlink:href="&url.books.handbook;/ports-using.html#PORTS-CD">установке портов с - CDROM</link> за - примером построения портов из дерева, доступного только для чтения). - Если вам нужно изменить какой-либо из файлов - <filename>pkg-*</filename>, сделайте это, - <link linkend="porting-pkgfiles">переопределив переменную</link>, но не - перезаписывая их.</para> - </sect1> - - <sect1 xml:id="porting-wrkdirprefix"> - <title><varname>WRKDIRPREFIX</varname></title> - - <para>Добейтесь того, чтобы ваш порт принимал во внимание значение - переменной <varname>WRKDIRPREFIX</varname>. Большинство портов об - этом не заботятся. В частности, если вы обращаетесь к каталогу - <varname>WRKDIR</varname> другого порта, заметьте, что его правильным - местоположением является - <filename>WRKDIRPREFIXPORTSDIR/subdir/name/work</filename> not <filename>PORTSDIR/subdir/work</filename> - или <filename>.CURDIR/../../subdir/name/work</filename> - или что-то подобное.</para> - - <para>Кроме того, если вы сами задаете <varname>WRKDIR</varname>, то - должны поставить перед ним знак - <literal>${WRKDIRPREFIX}${.CURDIR}</literal>.</para> - </sect1> - - <sect1 xml:id="porting-versions"> - <title>Различение операционных систем и версий ОС</title> - - <para>Вы можете встретиться с кодом, который требует модификаций - или условной компиляции в зависимости от того, с какой версией &os; - Unix он работает. Предпочтительным способом отделения кода для - версий &os; является использование макросов - <literal>__FreeBSD_version</literal> и - <literal>__FreeBSD__</literal>, определённых в <link - xlink:href="http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>. - Если этот файл не подключен, добавьте код</para> - - <programlisting>#include <sys/param.h></programlisting> - - <para>в соответствующем месте файла <filename>.c</filename>. - <literal>__FreeBSD__</literal> определён во всех версиях &os; - в качестве старшего номера версии системы. Например, в &os; - 9.x <literal>__FreeBSD__</literal> определён со значением - <literal>9</literal>.</para> - - <programlisting>#if __FreeBSD__ >= 9 -# if __FreeBSD_version >= 901000 - /* здесь особый код для версий 9.1+ */ -# endif -#endif</programlisting> - </sect1> - - <sect1 xml:id="dads-after-port-mk"> - <title>Написание чего-либо после - <filename>bsd.port.mk</filename></title> - - <para>Не пишите ничего после строки - <literal>.include <bsd.port.mk></literal>. Этой строки можно - избежать, включив в где-то в середину вашего файла - <filename>Makefile</filename> файл - <filename>bsd.port.pre.mk</filename>, и - файл <filename>bsd.port.post.mk</filename> в конец.</para> - - <note> - <para>Вам нужно включить либо пару файлов - <filename>bsd.port.pre.mk</filename>/<filename>bsd.port.post.mk</filename>, - либо только <filename>bsd.port.mk</filename>; не используйте оба этих - метода одновременно.</para> - </note> - - <para>В файле <filename>bsd.port.pre.mk</filename> определяются лишь - несколько переменных, которые могут быть использованы в тестах из - файла <filename>Makefile</filename>, в файле - <filename>bsd.port.post.mk</filename> заданы остальные.</para> - - <para>Вот некоторые важные переменные, определенные в файле - <filename>bsd.port.pre.mk</filename> (это не полный список, для - выяснения полного списка прочтите, пожалуйста, сам файл - <filename>bsd.port.mk</filename>).</para> - - <informaltable frame="none" pgwide="0"> - <tgroup cols="2"> - <thead> - <row> - <entry>Переменная</entry> - <entry>Описание</entry> - </row> - </thead> - - <tbody> - <row> - <entry><varname>ARCH</varname></entry> - <entry>Архитектура машины в виде, получаемом по команде - <command>uname -m</command> (например, - <literal>i386</literal>)</entry> - </row> - - <row> - <entry><varname>OPSYS</varname></entry> - <entry>Тип операционной системы, получаемый по команде - <command>uname -s</command> (например, - <literal>FreeBSD</literal>)</entry> - </row> - - <row> - <entry><varname>OSREL</varname></entry> - <entry>Версия релиза операционной системы (например, - <literal>2.1.5</literal> или <literal>2.2.7</literal>)</entry> - </row> - - <row> - <entry><varname>OSVERSION</varname></entry> - - <entry>Версия операционной системы в виде числа, та же, что и <link linkend="freebsd-versions"> - <literal>__FreeBSD_version</literal></link>.</entry> - </row> - - <row> - <entry><varname>LOCALBASE</varname></entry> - <entry>Корень дерева <quote>local</quote> (например, - <literal>/usr/local</literal>)</entry> - </row> - - <row> - <entry><varname>PREFIX</varname></entry> - <entry>Куда, собственно, устанавливается порт (обратитесь к <link linkend="porting-prefix"> - подробной информации о <varname>PREFIX</varname></link>).</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <note> - <para>Если вы задаете переменную - <varname>MASTERDIR</varname>, делайте это до - подключения <filename>bsd.port.pre.mk</filename>.</para> - </note> - - <para>Вот несколько примеров того, что вы можете написать после - <filename>bsd.port.pre.mk</filename>:</para> - - <programlisting># no need to compile lang/perl5 if perl5 is already in system -.if ${OSVERSION} > 300003 -BROKEN= perl is in system -.endif</programlisting> - - <para>Вы не забываете об использовании табуляции вместо пробелов - после <literal>BROKEN=</literal>, - не так ли? <!-- улыбка -->:-).</para> - </sect1> - - <sect1 xml:id="dads-sh-exec"> - <title>Использование выражения <function>exec</function> - в сценариях обёртках</title> - - <para>Если порт устанавливает сценарий на языке shell, который служит - для запуска другой программы, и если запуск этой программы является - последним действием сценария, убедитесь, что запуск программы - производится с использованием выражения <function>exec</function>, - например:</para> - - <programlisting>#!/bin/sh -exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"</programlisting> - - <para>Выражение <function>exec</function> заменяет процесс сценария - на указанную программу. Если <function>exec</function> опущен, - то процесс сценария во время работы программы остается в памяти, - без бесполезно потребляя системные ресурсы.</para> - - </sect1> - - <sect1 xml:id="dads-rational"> - <title>Поступайте разумно</title> - - <para>Файл <filename>Makefile</filename> должен выполнять действия - просто и небеспричинно. Если вы можете сделать что-то на несколько - строк короче или более читабельно, сделайте это. В качестве примеров - можно привести использование конструкций <literal>.if</literal> - утилиты make вместо соответствующей конструкции <literal>if</literal> - командного процессора, ненужность переопределения цели - <buildtarget>do-extract</buildtarget> при возможности переопределения - <varname>EXTRACT*</varname> и использование - <varname>GNU_CONFIGURE</varname> вместо - <literal>CONFIGURE_ARGS+= --prefix=${PREFIX}</literal>.</para> - - <para>Если вы обнаружите, что для выполнения чего-то приходится писать - много нового кода, то, пожалуйста, просмотрите файл - <filename>bsd.port.mk</filename> на предмет того, не содержит ли он - реализацию именно вашей проблемы. Хотя его трудно читать, имеется - много проблем, выглядящих сложными, для которых файл - <filename>bsd.port.mk</filename> уже содержит быстрое решение.</para> - </sect1> - - <sect1 xml:id="dads-cc"> - <title>Работа как с <varname>CC</varname>, так и - <varname>CXX</varname></title> - - <para>Порт должен принимать во внимание как переменную - <varname>CC</varname>, так и <varname>CXX</varname>. - Под этим мы подразумеваем, что порт ни в коем случае не должен - устанавливать значения этих переменных, переопределяя имеющиеся - значения; вместо этого можно добавлять нужные значения к уже - имеющимся. Это связано с тем, что параметры построения, - относящиеся ко всем портам, могут быть заданы глобально.</para> - - <para>Если порты не учитывают значения этих переменных, добавьте - строку <literal>NO_PACKAGE=ignores either cc or cxx</literal> - в файл <filename>Makefile</filename>.</para> - - <para>Далее следует пример файла <filename>Makefile</filename>, - использующего как переменную <varname>CC</varname>, так и - <varname>CXX</varname>. Обратите внимание на использование символов - <varname>?=</varname>:</para> - - <programlisting>CC?= gcc</programlisting> - - <programlisting>CXX?= g++</programlisting> - - <para>Вот пример, в котором не принимаются во внимание ни переменная - <varname>CC</varname>, ни <varname>CXX</varname>:</para> - - <programlisting>CC= gcc</programlisting> - - <programlisting>CXX= g++</programlisting> - - <para>В системах &os; обе переменные <varname>CC</varname> и - <varname>CXX</varname> могут быть определены в файле - <filename>/etc/make.conf</filename>. В первом примере задаётся - значение, если оно ранее не было определено в - <filename>/etc/make.conf</filename>, что сохраняет любые определения, - данные на уровне системы в целом. Второй пример переопределяет всё, - что было задано ранее.</para> - </sect1> - - <sect1 xml:id="dads-cflags"> - <title>Использование <varname>CFLAGS</varname></title> - - <para>Порт должен принимать во внимание переменную - <varname>CFLAGS</varname>. - Под этим мы подразумеваем, что порт ни в коем случае не должен - устанавливать значения этих переменных, переопределяя имеющиеся - значения; вместо этого можно добавлять нужные значения к уже - имеющимся. Это связано с тем, что параметры построения, - относящиеся ко всем портам, могут быть заданы глобально.</para> - - <para>Если порты не учитывают значения этой переменной, добавьте - строку <literal>NO_PACKAGE=ignores cflags</literal> в файл - <filename>Makefile</filename>.</para> - - <para>Далее следует пример файла <filename>Makefile</filename>, - использующего переменную <varname>CFLAGS</varname>. Обратите - внимание на использование символов <varname>+=</varname>:</para> - - <programlisting> -CFLAGS+= -Wall -Werror - </programlisting> - - <para>А вот пример, в котором не учитывается значение переменной - <varname>CFLAGS</varname>:</para> - - <programlisting> -CFLAGS= -Wall -Werror - </programlisting> - - <para>В системе &os; переменная <varname>CFLAGS</varname> определена - в файле <filename>/etc/make.conf</filename>. В первом примере к - переменной <varname>CFLAGS</varname> добавляются дополнительные флаги, - при этом сохраняются все определения, данные ранее на уровне системы. - Во втором примере всё, что было задано ранее, игнорируется.</para> - - <para>Из сторонних файлов <filename>Makefile</filename> следует удалить - флаги оптимизации. Общесистемные флаги оптимизации находятся в - системной переменной <varname>CFLAGS</varname>. Пример из - немодифицированного <filename>Makefile</filename>:</para> - - <programlisting>CFLAGS= -O3 -funroll-loops -DHAVE_SOUND</programlisting> - - <para>При использовании системных флагов оптимизации - <filename>Makefile</filename> станет похожим на следующий пример:</para> - - <programlisting>CFLAGS+= -DHAVE_SOUND</programlisting> - - </sect1> - - <sect1 xml:id="dads-pthread"> - <title>Библиотеки потоков</title> - - <para>Во &os; библиотека потоков обязана быть скомпонована с - исполняемыми файлами с использованием специального флага - <literal>-pthread</literal>. Если порт настаивает - на прямой компоновке с <literal>-lpthread</literal>, - создайте патч для использования <literal>-pthread</literal> - </para> - - <note> - <para>Если построение порта заканчивается ошибкой - <literal>unrecognized option '-pthread'</literal>, - то может быть желательно использование <command>cc</command> - в качестве компоновщика через установку - <varname>CONFIGURE_ENV</varname> в <literal>LD=${CC}</literal>. - Параметр <literal>-pthread</literal> напрямую командой - <command>ld</command> не поддерживается.</para> - </note> - - </sect1> - - <sect1 xml:id="dads-feedback"> - <title>Пожелания</title> - - <para>Посылайте подходящие изменения/патчи авторам/сопровождающему - для включения в следующий релиз. Это только сделает вашу работу - гораздо легче при выходе следующего релиза.</para> - </sect1> - - <sect1 xml:id="dads-readme"> - <title><filename>README.html</filename></title> - - <para><filename>README.html</filename> не является частью порта - и генерируется при помощи <command>make readme</command>. - Не включайте этот файл в патчи или коммиты.</para> - - <note> - <para>Если не удается выполнить <command>make readme</command>, - убедитесь, что значение по умолчанию <varname>ECHO_MSG</varname> - не было изменено внутри порта.</para> - </note> - </sect1> - - <sect1 xml:id="dads-noinstall"> - <title>Пометка неустанавливаемого порта как <varname>BROKEN</varname>, - <varname>FORBIDDEN</varname> или <varname>IGNORE</varname></title> - - <para>В некоторых случаях пользователи не должны допускаться к - установке порта. Для того, чтобы сообщить пользователю, что порт - не следует устанавливать, имеется несколько - <command>make</command>-переменных, которые могут быть использованы - в файле <filename>Makefile</filename> порта. Значения следующих - <command>make</command>-переменных будут причиной, возвращаемой - пользователям, по которой порт отказывает в установке. - Пожалуйста, используйте корректные <command>make</command>-переменные, - так как каждая переменная make передает абсолютно различный смысл - как для пользователей, так и для автоматизированных систем, которые - полагаются на файлы <filename>Makefile</filename>, таких как - <link linkend="build-cluster">кластер построения портов</link>, - <link linkend="freshports">FreshPorts</link> и - <link linkend="portsmon">portsmon</link>.</para> - - <sect2 xml:id="dads-noinstall-variables"> - <title>Переменные</title> - - <itemizedlist> - <listitem> - <para><varname>BROKEN</varname> предназначена для портов, которые - в настоящее время не компилируются, не устанавливаются или не - удаляются правильно. Следует использовать для портов, - когда проблема считается временной.</para> - - <para>В особых случаях кластер - построения будет продолжать попытки собрать их, чтобы показать, - решена ли основная проблема. (Однако, как правило, кластер - запускается без этой возможности.)</para> - - <para>В частности, используйте - <varname>BROKEN</varname>, когда порт:</para> - - <itemizedlist> - <listitem> - <para>не компилируется</para> - </listitem> - - <listitem> - <para>не выполняет процесс своей конфигурации или - установки</para> - </listitem> - - <listitem> - <para>устанавливает файлы вовне - <filename>${LOCALBASE}</filename></para> - </listitem> - - <listitem> - <para>не удаляет полностью все свои файлы при деинсталляции - (тем не менее, это может быть допустимо, и подходит - для портов, оставляющих после себя файлы, измененные - пользователем)</para> - </listitem> - </itemizedlist> - - </listitem> - - <listitem> - <para><varname>FORBIDDEN</varname> используется для портов, которые - содержат уязвимости в информационной безопасности или - являются потенциально вредными в плане обеспечения информационной - безопасности системы &os; при установке данного порта - (например: заведомо небезопасная программа или программа, которая - предоставляет легко взламываемые сервисы). Порты должны - помечаться как <varname>FORBIDDEN</varname>, как только в - конкретном программном обеспечении обнаружилась уязвимость, но - обновление выпущено не было. В идеальном случае порты должны - обновляться максимально быстро после обнаружения уязвимости, - чтобы уменьшить число уязвимых хостов &os; (нам нравится иметь - репутацию безопасной системы), однако иногда случается - значительный временной разрыв между обнаружением уязвимости и - выходом обновлённого релиза уязвимого программного обеспечения. - Не помечайте порт как <varname>FORBIDDEN</varname>, если причина - не вызвана соображениями информационной безопасности.</para> - </listitem> - - <listitem> - <para><varname>IGNORE</varname> предназначена для портов, которые - не должны строиться по какой-либо другой причине. Следует - использовать для портов, в случае когда проблема считает - конструктивной. Кластер построения - ни при каких условиях не будет строить порты, помеченные как - <varname>IGNORE</varname>. В частности, используйте - <varname>IGNORE</varname>, когда порт:</para> - - <itemizedlist> - <listitem> - <para>компилируется, но работает неправильно</para> - </listitem> - - <listitem> - <para>не работает на установленной версии &os;</para> - </listitem> - - <listitem> - <para>имеет distfile, который не может быть автоматически - извлечен из-за лицензионных ограничений</para> - </listitem> - - <listitem> - <para>не работает с каким-либо другим портом, установленным - в настоящее время (например, порт зависит от - <package role="port">www/apache20</package>, но установлен - <package role="port">www/apache22</package>) - </para> - </listitem> - </itemizedlist> - - <note> - <para>Если порт будет конфликтовать с уже установленным портом, - (например, если они устанавливают файл в то же место, но - с иным функциональным назначением), то - <link linkend="conflicts">используйте - вместо этого <varname>CONFLICTS</varname></link>. - <varname>CONFLICTS</varname> сам установит значение - <varname>IGNORE</varname>.</para> - </note> - </listitem> - - <listitem> - <para>Если порт нужно пометить как <varname>IGNORE</varname> - только на некоторых архитектурах, для этого есть две другие - удобные переменные, которые автоматически установят для вас - значения: <varname>ONLY_FOR_ARCHS</varname> и - <varname>NOT_FOR_ARCHS</varname>. Примеры:</para> - - <programlisting>ONLY_FOR_ARCHS= i386 amd64</programlisting> - - <programlisting>NOT_FOR_ARCHS= ia64 sparc64</programlisting> - - <para>Собственное сообщение <varname>IGNORE</varname> можно задать - с использованием <varname>ONLY_FOR_ARCHS_REASON</varname> и - <varname>NOT_FOR_ARCHS_REASON</varname>. Отдельно для каждой - архитектуры это возможно с использованием - <varname>ONLY_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname> - и - <varname>NOT_FOR_ARCHS_REASON_<replaceable>ARCH</replaceable></varname>.</para> - </listitem> - - <listitem> - <para>Если порт загружает и устанавливает исполняемые файлы i386, - то следует установить <varname>IA32_BINARY_PORT</varname>. - Если эта переменная установлена, будет выполнена проверка - доступности каталога <filename>/usr/lib32</filename> для - библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении - любого из этих условий будет автоматически установлена - переменная <varname>IGNORE</varname>.</para> - </listitem> - - </itemizedlist> - - </sect2> - <sect2 xml:id="dads-noinstall-notes"> - <title>Замечания по реализации</title> - - <para>Строки не следует брать в кавычки. - Также построение строки должно несколько различаться из-за - способа отображения информации пользователю. Примеры:</para> - - <programlisting>BROKEN= fails to link with base -lcrypto</programlisting> - - <programlisting>IGNORE= unsupported on recent versions</programlisting> - - <para>получаемые в результате следующего вывода - <command>make describe</command>:</para> - - <programlisting>===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.</programlisting> - - <programlisting>===> foobar-0.1 is unsupported on recent versions.</programlisting> - </sect2> - </sect1> - - <sect1 xml:id="dads-deprecated"> - <title>Пометка порта на удаление с <varname>DEPRECATED</varname> - или <varname>EXPIRATION_DATE</varname></title> - - <para>Помните, что <varname>BROKEN</varname> и - <varname>FORBIDDEN</varname> будут использованы как временное - средство, если порт не является работающим. Постоянно - неработоспособные порты должны полностью удаляться из дерева.</para> - - <para>В подходящих ситуациях пользователи могут быть оповещены о - предстоящем удалении через переменные <varname>DEPRECATED</varname> - и <varname>EXPIRATION_DATE</varname>. Первое - это просто строка, - сообщающая причину запланированного удаления порта; вторая является - строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны - пользователю.</para> - - <para>Переменную <varname>DEPRECATED</varname> можно установить без - использования <varname>EXPIRATION_DATE</varname> (в частности, при - рекомендации новой версии порта), но обратный порядок не имеет - никакого смысла.</para> - - <para>Не существует устоявшейся политики, как долго следует продолжать - уведомления. Текущая практика дает около месяца для решения проблем - безопасности и два месяца для проблем построения. Это также дает - немного времени на исправление проблем любым заинтересованным - коммиттерам.</para> - </sect1> - - <sect1 xml:id="dads-dot-error"> - <title>Избегайте использования конструкции - <literal>.error</literal></title> - - <para>Правильным способом подать сигнал для <filename>Makefile</filename> - о том, что порт не может быть установлен из-за какого-то внешнего - фактора (например, пользователь указал недопустимую комбинацию - опций построения), является установка непустого значения для - <varname>IGNORE</varname>. Это значение будет сформатировано и - показано пользователю во время <command>make install</command>.</para> - - <para>Использование для этих целей <literal>.error</literal> является - распространенной ошибкой. Проблема в том, что в этой ситуации - будут повреждены многие инструменты автоматизации, работающие с - деревом портов. Наибольшим образом это распространено при попытке - построить <filename>/usr/ports/INDEX</filename> (смотрите <xref linkend="make-describe"/>). Тем не менее, даже более простые команды, - такие как <command>make maintainer</command>, в этом случае также - вернут ошибку. Это не является приемлемым.</para> - - <example xml:id="dot-error-breaks-index"> - <title>Как избегать использование <literal>.error</literal></title> - - <para>Из следующих двух вариантов строки файла - <filename>Makefile</filename> первый приведёт к неудачному - завершению работы <command>make index</command>, а второй - - нет:</para> - - <programlisting>.error "option is not supported"</programlisting> - - <programlisting>IGNORE=option is not supported</programlisting> - </example> - </sect1> - - <sect1 xml:id="dads-sysctl"> - <title>Использование <filename>sysctl</filename></title> - - <para>Использование <filename>sysctl</filename> не рекомендуется, - кроме как при выполнении целей. Это вызвано тем, что вычисление - любых <literal>makevar</literal>, таких как во время команды - <command>make index</command>, с необходимостью запуска этой - команды, еще больше замедляет весь процесс.</para> - - <para>&man.sysctl.8; следует всегда использовать через переменную - <varname>SYSCTL</varname>, поскольку она содержит полностью заданный - путь, и при необходимости может быть переопределена.</para> - </sect1> - - <sect1 xml:id="dads-rerolling-distfiles"> - <title>Меняющиеся дистрибутивные файлы</title> - - <para>Иногда авторы программного обеспечения меняют содержимое - выпущенных дистрибутивных файлов без смены названия. Вы должны - проверять, что изменения являются официальными и произведены - автором. В прошлом бывало, что дистрибутивный файл молча изменялся - на сайтах загрузки с намерением нанести вред или скомпрометировать - безопасность конечного пользователя.</para> - - <para>Отложите старый файл с дистрибутивом в сторону, загрузите новый, - распакуйте его и сравните содержимое при помощи &man.diff.1;. - Если вы не видите ничего подозрительного, то можете обновить файл - <filename>distinfo</filename>. Убедитесь, что вы подытожили различия - в вашем PR или описании коммита, чтобы другие люди были в курсе, что - вы позаботились о том, что ничего плохого не случилось.</para> - - <para>Возможно вы также захотите связаться с автором этого программного - обеспечения для подтверждения изменений.</para> - </sect1> - - <sect1 xml:id="dads-avoiding-linuxisms"> - <title>Избегание линуксизмов</title> - - <para>Не используйте <filename>/proc</filename>, если доступны - любые другие источники получения информации, например, - <function>setprogname(argv[0])</function> в - <function>main()</function> и &man.getprogname.3;, в случае - если вы хотите <quote>знать своё имя</quote>.</para> - - <para>Не полагайтесь на поведение, не регламентированное - <acronym>POSIX</acronym>.</para> - - <para>Не выполняйте запись временных меток в критических путях - выполнения приложения, если можно обойтись без этого. Получение - временных меток может быть медленным, в зависимости от степени - точности используемых часов в операционной системе. Если - временные метки действительно нужны, определите степень - требуемой точности и используйте тот <acronym>API</acronym>, - в котором документируется получение достаточной точности.</para> - - <para>Ряд простых системных вызовов (например, &man.gettimeofday.2;, - &man.getpid.2;) работают намного быстрее в &linux; по сравнению - с любой другой операционной системой из-за кеширования и - используемой оптимизации vsyscall. Не полагайтесь на их - дешевизну в критичных к производительности приложениях. В - целом, старайтесь избегать системных вызовов там, где это - возможно.</para> - - <para>Не полагайтесь на специфичное для &linux; поведение сокета. - В частности, отличаются размеры буфера сокета по умолчанию - (выполните вызов &man.setsockopt.2; с <literal>SO_SNDBUF</literal> - и <literal>SO_RCVBUF</literal>, и в то время как в &linux; - при заполнении буфера сокета &man.send.2; блокируется, &os; - возвращает ошибку и устанавливает <literal>ENOBUFS</literal> - в качестве значения errno.</para> - - <para>Если требуется рассчитывать на нестандартное поведение, - инкапсулируйте это должным образом в общий для всех - <acronym>API</acronym> с проверкой поведения на этапе - конфигурации, и если требуемое поведение не найдено, - прекращайте выполнение.</para> - - <para>Используйте <link xlink:href="http://www.freebsd.org/cgi/man.cgi">страницы - справочника</link> для проверки, относится ли функция к - интерфейсу <acronym>POSIX</acronym> (ищите раздел - <quote>STANDARDS</quote> на странице справочника).</para> - - <para>Не рассчитывайте на то, что в качестве - <filename>/bin/sh</filename> используется - <application>bash</application>. Убедитесь, что командная - строка, переданная в &man.system.3;, будет работать в - <acronym>POSIX</acronym>-совместимой оболочке.</para> - - <para>Список основных <application>bash</application>-измов - расположен <link xlink:href="https://wiki.ubuntu.com/DashAsBinSh">здесь</link>.</para> - - <para>Проверьте, что используемые заголовочные файлы включены в - <acronym>POSIX</acronym> или список, рекомендуемый страницей - справочника, т.к. например, забыть подключить - <filename>sys/types.h</filename> — не такая уж проблема - в &linux;, однако это не так во &os;.</para> - - <para>Компилируйте многопоточные приложения с ключом - <quote>-pthread</quote>, а не <quote>-lpthread</quote> или - как-либо ещё.</para> - </sect1> - - <sect1 xml:id="dads-misc"> - <title>Разное</title> - - <para>Файлы <filename>pkg-descr</filename> и - <filename>pkg-plist</filename> должны проверяться дважды. Если вы - пересматриваете порт и думаете, что его можно описать иначе, - сделайте это.</para> - - <para>Пожалуйста, не создавайте дополнительных копий лицензии GNU - General Public License в нашей системе.</para> - - <para>Будьте внимательны с юридическими вопросами! Не делайте из нас - нелегальных распространителей ПО!</para> - </sect1> - - </chapter> - - <chapter xml:id="porting-samplem"> - <title>Примерный <filename>Makefile</filename></title> - - <para>Вот примерный <filename>Makefile</filename>, который можно - использовать при создании нового порта. Обязательно удалите все - дополнительные комментарии (те, которые в скобках)!</para> - - <para>Вам рекомендуется следовать этому формату (соблюдая порядок - следования переменных, пустые строки между разделами, и так далее). - Этот формат разработан для того, чтобы важная информация была легко - найдена. Мы рекомендуем вам воспользоваться утилитой <link linkend="porting-portlint">portlint</link> для проверки файла - <filename>Makefile</filename>.</para> - - <programlisting>[заголовок...просто чтобы нам было легче идентифицировать порт.] -# Created by: Satoshi Asami <asami@FreeBSD.org> -[Необязательная строка <emphasis>Created by:</emphasis> содержит имя -человека, создавшего первоначальную версию порта. Следует отметить, -что за <quote>:</quote> следует пробел, но не символ табуляции. Если -эта строка присутствует, будущие сопровождающие не должны её менять -или удалять, кроме как по запросу первоначального автора.] - -# $FreeBSD$ -[ ^^^^^^^^^ Эта строка будет автоматически заменена на строчку RCS ID -системой SVN при выполнении операции коммита в наше хранилище. При -обновлении порта не приводите эту строку обратно к виду -"$FreeBSD$". SVN сделает это автоматически.] - -[секция описания собственно порта и основного сервера - сначала всегда - PORTNAME и PORTVERSION, за ним следует CATEGORIES, а затем - MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR. - PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними. - Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно, - EXTRACT_ONLY.] -PORTNAME= xdvi -PORTVERSION= 18.2 -CATEGORIES= print -[не забывайте про завершающую косую черту ("/")! - если вы не используете макросы MASTER_SITE_*] -MASTER_SITES= ${MASTER_SITE_XCONTRIB} -MASTER_SITE_SUBDIR= applications -PKGNAMEPREFIX= ja- -DISTNAME= xdvi-pl18 -[задайте это, если исходный код поставляется не в виде - стандартного файла ".tar.gz"] -EXTRACT_SUFX= .tar.Z - -[секция патчей -- может быть пустой] -PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ -PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz - -[сопровождающий; *обязательное поле*! Это человек, который добровольно - занимается обновлениями порта и неисправностями при построении, и которому - пользователь может направлять вопросы и сообщения об ошибках. Для - сохранения как можно более высокого качества Коллекции Портов мы больше - не принимаем новые порты, назначенные на "ports@FreeBSD.org".] -MAINTAINER= asami@FreeBSD.org -COMMENT= DVI Previewer for the X Window System - -[зависимости -- могут быть пустыми] -RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript - -[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме - тех, что перечислены выше] -[Если порт задает вопросы во время этапов настройки, построения, - установки...] -IS_INTERACTIVE= yes -[Если распаковка происходит в каталог, отличных от ${DISTNAME}...] -WRKSRC= ${WRKDIR}/xdvi-new -[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не - придется изменять эту переменную] -PATCH_DIST_STRIP= -p1 -[Если порт требует скрипта "configure", генерируемого GNU-версией программы - autoconf] -GNU_CONFIGURE= yes -[Если для построения порту требуется GNU-версия утилиты make, а не - /usr/bin/make...] -USES= gmake -[Если это приложение X и требует запуска "xmkmf -a"...] -USES= imake -[и так далее] - -[В правилах ниже используются нестандартные переменные] -MY_FAVORITE_RESPONSE= "yeah, right" - -[теперь специальные правила, в порядке их вызова] -pre-fetch: - я что-то выкачиваю, точно - -post-patch: - мне кое-что сделать после применения патча, великолепно - -pre-install: - и потом еще кое-что перед установкой, ого - -[и, наконец, эпилог] - -.include <bsd.port.mk> - </programlisting> - </chapter> - - - <chapter 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 xml:id="appendices"> - <title>Приложения</title> - - <sect1 xml:id="uses-values"> - <title>Значения <varname>USES</varname></title> - - <table> - <title>Значения <varname>USES</varname></title> - - <tgroup cols="3"> - <thead> - <row> - <entry>Наименование</entry> - <entry>Аргументы</entry> - <entry>Описание</entry> - </row> - </thead> - <tbody valign="top"> - &values.uses; - </tbody> - </tgroup> - </table> - </sect1> - - <sect1 xml:id="freebsd-versions"> - <title>Значения <literal>__FreeBSD_version</literal></title> - - <para>Ниже для справки приводится перечень значений - <literal>__FreeBSD_version</literal> в виде, который определён в - <link xlink:href="http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup">sys/param.h</link>:</para> - - <table frame="none"> - <title>Значения <literal>__FreeBSD_version</literal></title> - - <tgroup cols="3"> - <thead> - <row> - <entry>Значение</entry> - <entry>Дата</entry> - <entry>Релиз</entry> - </row> - </thead> - - <tbody> - &values.versions; - </tbody> - </tgroup> - </table> - - <note> - <para>Заметьте, что 2.2-STABLE иногда идентифицирует себя как - <quote>2.2.5-STABLE</quote> после 2.2.5-RELEASE. Такой принцип - использовался год и месяц, но мы решили изменить его на более - однозначную систему нумерации старший/младший, начиная с версии - 2.2. Это объясняется тем, что параллельная разработка в нескольких - ветках делает непрактичным идентификацию релизов просто по их - реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит - заботиться о старых версиях -CURRENT; они перечислены здесь просто - в информационных целях.</para> - </note> - </sect1> - </chapter> +&chap.porting-why; +&chap.new-port; +&chap.quick-porting; +&chap.slow-porting; +&chap.makefiles; +&chap.special; +&chap.plist; +&chap.pkg-files; +&chap.testing; +&chap.upgrading; +&chap.security; +&chap.porting-dads; +&chap.porting-samplem; +&chap.keeping-up; +&chap.appendices; </book> diff --git a/ru_RU.KOI8-R/books/porters-handbook/chapters.ent b/ru_RU.KOI8-R/books/porters-handbook/chapters.ent new file mode 100644 index 0000000000..875b323a32 --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/chapters.ent @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="koi8-r"?> +<!-- + $FreeBSD$ + + Original revision: r43840 +--> + +<!ENTITY chap.porting-why SYSTEM "porting-why/chapter.xml"> +<!ENTITY chap.new-port SYSTEM "new-port/chapter.xml"> +<!ENTITY chap.quick-porting SYSTEM "quick-porting/chapter.xml"> +<!ENTITY chap.slow-porting SYSTEM "slow-porting/chapter.xml"> +<!ENTITY chap.makefiles SYSTEM "makefiles/chapter.xml"> +<!ENTITY chap.special SYSTEM "special/chapter.xml"> +<!ENTITY chap.plist SYSTEM "plist/chapter.xml"> +<!ENTITY chap.pkg-files SYSTEM "pkg-files/chapter.xml"> +<!ENTITY chap.testing SYSTEM "testing/chapter.xml"> +<!ENTITY chap.upgrading SYSTEM "upgrading/chapter.xml"> +<!ENTITY chap.security SYSTEM "security/chapter.xml"> +<!ENTITY chap.porting-dads SYSTEM "porting-dads/chapter.xml"> +<!ENTITY chap.porting-samplem SYSTEM "porting-samplem/chapter.xml"> +<!ENTITY chap.keeping-up SYSTEM "keeping-up/chapter.xml"> +<!ENTITY chap.appendices SYSTEM "appendices/chapter.xml"> diff --git a/ru_RU.KOI8-R/books/porters-handbook/keeping-up/Makefile b/ru_RU.KOI8-R/books/porters-handbook/keeping-up/Makefile new file mode 100644 index 0000000000..4a9f0d2f7b --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/keeping-up/Makefile @@ -0,0 +1,17 @@ +# +# Build the Porters Handbook with just the content from this chapter. +# +# $FreeBSD$ +# +# Original revision: r43840 +# + +CHAPTERS= keeping-up/chapter.xml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" 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 new file mode 100644 index 0000000000..80c2359ba9 --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/keeping-up/chapter.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="koi8-r"?> +<!-- + The FreeBSD Russian Documentation Project + + $FreeBSD$ + + Original revision: r43840 +--> + +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="keeping-up"> + + <title>Актуализация</title> + + <para>Коллекция Портов &os; постоянно изменяется. Здесь находится + некоторая информация о том, как поддерживать её в актуальном + состоянии.</para> + + <sect1 xml:id="freshports"> + <title>FreshPorts</title> + + <para>Самым простым способом отслеживать уже произошедшие обновления + является подписка на <link xlink:href="http://www.FreshPorts.org/"> + FreshPorts</link>. Для мониторинга вы можете выбрать несколько + портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь, + потому что они будут получать уведомления не только о собственных + изменениях, но и об изменениях, сделанных любым другим коммиттером + &os;. (Это часто необходимо для синхронизации с изменениями на более + низком технологическом уровне—хотя более корректным было бы + получение предупреждений от тех, кто вносит подобные изменения, + иногда этот этап пропускается или он просто непрактичен. Кроме того, + в некоторых случаях изменения по своей природе весьма незначительны. + Мы полагаем, что любой разработчик в таких ситуациях будет + руководствоваться здравым смыслом).</para> + + <para>Если вы хотите использовать FreshPorts, то вам нужна только + учётная запись. Если регистрационный адрес вашей электронной почты + будет иметь вид <literal>@FreeBSD.org</literal>, то справа на + Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто + уже получил учётную запись FreshPorts, но не использовал собственный + адрес электронной почты <literal>@FreeBSD.org</literal>, достаточно + сменить адрес на <literal>@FreeBSD.org</literal>, подписаться, а + затем сменить его обратно.</para> + + <para>Во FreshPorts имеется также функция проверки правильности, + которая автоматически проверяет каждое изменение, внесённое в дерево + портов &os;. Если вы подпишетесь на эту услугу, то будете + оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке + внесённых вами изменений.</para> + </sect1> + + <sect1 xml:id="svnweb"> + <title>Web-интерфейс к хранилищу исходных текстов</title> + + <para>Файлы в хранилище исходных текстов можно просматривать при помощи + Web-интерфейса. Изменения, которые касаются в целом всей системы + портов, теперь документируются в файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/CHANGES">CHANGES</link>. + Изменения, касающиеся отдельных портов, отражаются теперь в + файле <link xlink:href="http://svnweb.FreeBSD.org/ports/head/UPDATING">UPDATING</link>. + Однако однозначный ответ на любой вопрос можно найти, только + прочитав исходных код <link xlink:href="http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk">bsd.port.mk</link> + и связанных с ним файлов.</para> + </sect1> + + <sect1 xml:id="ports-mailing-list"> + <title>Список рассылки &os;, посвящённый портам</title> + + <para>Если вы поддерживаете порты, то должны следить за &a.ports;. + О важных изменениях, отражающихся на работе портов, будет сообщаться + здесь, а затем они переносятся в <filename>CHANGES</filename>.</para> + + <para>Если данный список рассылки слишком загружен сообщениями, + вы можете отслеживать &a.ports-announce.name;, который модерируется + и не является местом для дискуссий.</para> + </sect1> + + <sect1 xml:id="build-cluster"> + <title>Кластер построения портов &os;</title> + + <para>Одной из наименее известных сильных сторон &os; является тот + факт, что для непрерывного построения Коллекции Портов для каждого + из основных релизов ОС для каждой архитектуры уровня поддержки + Tier-1 выделен целый кластер машин.</para> + + <para>Отдельные порты собираются, если они специально не помечены как + <varname>IGNORE</varname>. Для портов, помеченных как + <varname>BROKEN</varname>, попытки будут продолжены для того, + чтобы увидеть, если основная проблема была решена. (Это сделано + через использование переменной <varname>TRYBROKEN</varname> для + <filename>Makefile</filename> порта.)</para> + + </sect1> + + <sect1 xml:id="distfile-survey"> + <title>Portscout: сканер дистрибутивных файлов портов &os;</title> + + <para>Кластер построения выделен для выполнения самого последнего + релиза каждого из портов, дистрибутивные файлы которых уже были + сгружены. Однако из-за постоянных изменений в Internet + дистрибутивные файлы могут быстро исчезать. <link xlink:href="http://portscout.FreeBSD.org">Portscout</link>, средство + сканирования дистрибутивных файлов &os; пытается опросить + каждый из сайтов, доступных для сгрузки каждого из портов, + для определения того, доступны ли ещё дистрибутивные файлы. + <application>Portscout</application> может готовить отчёты + в <acronym>HTML</acronym> и рассылать электронные письма об + имеющихся обновлениях для портов тем, кто это запрашивает. + Мейнтейнеры периодически запрашивают наличие изменений, либо + вручную, либо используя ленту <acronym>RSS</acronym>.</para> + + <para>Главная страница <application>Portscout</application> + отображает email мейнтейнера порта, количество портов, за + которые ответственен мейнтейнер, количество портов с новыми + дистрибутивными файлами и процент устаревших портов. Функция + поиска выполняет поиск мейнтейнера по адресу электронной почты + и позволяет выбирать между всеми портами или только + устаревшими.</para> + + <para>При щелчке по адресу электронной почты мейнтейнера + отображается список всех его портов, разделённых по категориям, + вместе с текущим номером версии, информацией о наличии новой + версии, временем последнего обновления порта и временем его + последней проверки. Функция поиска на этой странице позволяет + пользователю выполнять поиск конкретного порта.</para> + + <para>По щелчку на название порта в списке отображается информация + о порте <link xlink:href="http://freshports.org">FreshPorts</link>.</para> + </sect1> + + <sect1 xml:id="portsmon"> + <title>Система мониторинга портов &os;</title> + + <para>Другим полезным ресурсом является + <link xlink:href="http://portsmon.FreeBSD.org">Система мониторинга + портов &os;</link> (известная также как <literal>portsmon</literal>). + Система представляет собой базу данных, обрабатывающую информацию из + нескольких источников и позволяющую просматривать их при помощи + Web-интерфейса. На данный момент задействованы база сообщений об + ошибках (PR), протоколы ошибок кластера построения и отдельные файлы + из коллекции портов. В будущем в этот список будет добавлена система + проверки дистрибутивных файлов и другие ресурсы.</para> + + <para>Для начала вы можете просмотреть всю информацию о некотором порте + при помощи средства <link xlink:href="http://portsmon.FreeBSD.org/portoverview.py">Обзор + отдельного порта</link>.</para> + + <para>На момент написания это единственный доступный ресурс, который + для имени порта ставит в соответствие записи PR GNATS. + (Отправители PR не всегда добавляют в название имя порта, хотя + мы предпочитаем, чтобы они это делали.) Таким образом, + <literal>portsmon</literal> это хорошее место для начала, если вы + хотите найти присланные PR и/или ошибки построения для существующего + порта; либо поискать, был ли уже прислан новый порт, который вы + подумывали создать сами.</para> + </sect1> + </chapter> + diff --git a/ru_RU.KOI8-R/books/porters-handbook/makefiles/Makefile b/ru_RU.KOI8-R/books/porters-handbook/makefiles/Makefile new file mode 100644 index 0000000000..6a35c6f691 --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/makefiles/Makefile @@ -0,0 +1,17 @@ +# +# Build the Porters Handbook with just the content from this chapter. +# +# $FreeBSD$ +# +# Original revision: r43840 +# + +CHAPTERS= makefiles/chapter.xml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" diff --git a/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml b/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml new file mode 100644 index 0000000000..12e66950df --- /dev/null +++ b/ru_RU.KOI8-R/books/porters-handbook/makefiles/chapter.xml @@ -0,0 +1,4315 @@ +<?xml version="1.0" encoding="koi8-r"?> +<!-- + The FreeBSD Russian Documentation Project + + $FreeBSD$ + + Original revision: r43840 +--> + +<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="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> + + <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> + + <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> + + <itemizedlist> + <listitem> + <para>Первая категория должна быть физической категорий (смотрите + <link linkend="porting-categories">выше</link>). Это + необходимо для создания пакетов. После этого виртуальные + и физические категории могут смешиваться.</para> + </listitem> + + <listitem> + <para>Сначала всегда идут категории, специфичные для языков. + Например, если ваш порт устанавливает японские шрифты для X11, + то строчка <varname>CATEGORIES</varname> должна иметь вид + <filename>japanese x11-fonts</filename>.</para> + </listitem> + + <listitem> + <para>Более конкретные категории идут первыми перед более + общими. В частности, редактор HTML должен быть описан как + <filename>www editors</filename>, а не наоборот. Кроме того, вы + не должны указывать категорию <filename>net</filename>, если порт + относится к одной из категорий <filename>irc</filename>, + <filename>mail</filename>, + <filename>news</filename>, <filename>security</filename> или + <filename>www</filename>, так как <filename>net</filename> + включается автоматически.</para> + </listitem> + + <listitem> + <para><filename>x11</filename> используется как вторичная категория + только в случае, если в качестве основной категории указан + естественный язык. В частности, вам не нужно указывать + <filename>x11</filename> в качестве категории для + приложений X.</para> + </listitem> + + <listitem> + <para>Режимы для редактора <application>Emacs</application> должны + помещаться в ту же категорию, что и приложение, которое + поддерживается этим режимом, а не в <filename>editors</filename>. + Например, режим <application>Emacs</application> для + редактирования исходного кода некоторого языка программирования + должен быть помещен в категорию <filename>lang</filename>.</para> + </listitem> + + <listitem> + <para>Порты, устанавливающие загружаемые модули ядра, должны + содержать виртуальную категорию <filename>kld</filename> в + строке <varname>CATEGORIES</varname>. Это одно из действий, + выполняемых автоматически с добавлением + <literal>kmod</literal> в строке <varname>USES</varname>. + </para> + </listitem> + + <listitem> + <para><filename>misc</filename> + не должна указываться вместе с любой другой невиртуальной + категорией. Если вы указываете <literal>misc</literal> + вместе с чем-то ещё в строке <varname>CATEGORIES</varname>, + это значит, что вы можете спокойно удалить + <literal>misc</literal> и просто поместить порт в этот + другой подкаталог!</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> + + <tbody> + <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> + + <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> + </listitem> + + <listitem> + <para>Элементы, за которыми следуют <literal>:n</literal>, + принадлежат группе <literal>n</literal>, + <literal>:m</literal> относится к группе <literal>m</literal> и + так далее.</para> + </listitem> + + <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> + + <para>Следующие примеры равнозначны, но первый более + предпочтителен:</para> + + <programlisting>MASTER_SITES= alpha</programlisting> + + <programlisting>MASTER_SITES= alpha:DEFAULT</programlisting> + </listitem> + + <listitem> + <para>Группы не являются эксклюзивными, элемент может + принадлежать к нескольким отличающимся группам одновременно, а + группа может либо иметь несколько различных элементов, либо не + иметь их вовсе. Повторяющиеся элементы в одной и той же группе + будут являться просто повторяющимися элементами.</para> + </listitem> + + <listitem xml:id="porting-master-sites-n-comma-operator"> + <para>Если в хотите, чтобы элемент принадлежал к нескольким + группам одновременно, вы можете использовать + запятую (<literal>,</literal>).</para> + + <para>Вместо того, чтобы повторять их несколько раз, каждый раз с + разным постфиксом, мы можем перечислить несколько групп за раз + в одном постфиксе. Например, <literal>:m,n,o</literal> + определяет элемент, принадлежащий группам <literal>m</literal>, + <literal>n</literal> и <literal>o</literal>.</para> + + <para>Все следующие примеры имеют один смысл, но последний + является предпочтительным:</para> + + <programlisting>MASTER_SITES= alpha alpha:SOME_SITE</programlisting> + + <programlisting>MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE</programlisting> + + <programlisting>MASTER_SITES= alpha:SOME_SITE,DEFAULT</programlisting> + + <programlisting>MASTER_SITES= alpha:DEFAULT,SOME_SITE</programlisting> + </listitem> + + <listitem> + <para>Все серверы внутри определённой группы сортируются в + соответствии с <varname>MASTER_SORT_AWK</varname>. Все группы + в <varname>MASTER_SITES</varname> и + <varname>PATCH_SITES</varname> тоже сортируются.</para> + </listitem> + + <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>. Если какие-то + элементы прина |