<!--
     The FreeBSD Russian Documentation Project

     $FreeBSD$
     $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/ports/chapter.sgml,v 1.22 2001/02/09 14:29:17 andy Exp $
     Original revision: 1.111
-->

<chapter id="ports">

<title>Установка приложений: Коллекция портов</title>

<para><emphasis>Переписал &a.jim;, 22 ноября 1999.  Оригинальная работа была
  выполнена различными людьми.</emphasis></para>

<sect1>
  <title>Введение</title>

  <para>Коллекция портов FreeBSD позволяет вам компилировать и устанавливать
    широкий набор приложений с минимальными усилиями.</para>

  <para>В общем-то, она представляет собой группу <link
    linkend="ports-skeleton">скелетных файлов</link>, содержащих минимальный
    набор команд, требуемых для корректной компиляции и установки приложений
    в системе FreeBSD.</para>

  <para>Даже если вы свято верите во все эти якобы открытые стандарты,
    компиляция программ на различных UNIX-платформах бывает весьма хитрой
    задачей.  Случается, что вам везет и нужная программа компилируется на
    вашей системе, устанавливает все файлы в нужные каталоги и запускается
    без проблем <quote>как есть</quote>, однако такое встречается достаточно
    редко.  В большинстве случаев обнаруживается, что вам нужно вносить
    изменения для того, чтобы заставить программу работать.  Здесь-то вам и
    придет на помощь Коллекция портов FreeBSD.</para>

  <para>Общими целями создания Коллекции портов является избавление от всех
    этих телодвижений, которые нужно выполнять для того, чтобы программа
    работала правильно, и создание простого и безболезненного процесса
    установки.	когда вы имеете дело с Коллекцией портов, то вся тяжелая
    работа уже сделана, и вы можете установить любой порт из Коллекции,
    просто дав команду <command>make install</command>.</para>
</sect1>

<sect1 id="ports-using">
  <title>Использование Коллекции Портов</title>

  <para>В этих разделах описаны основные приемы использования коллекции
    портов для установки и удаления программ из вашей системы.</para>

  <sect2 id="ports-skeleton">
    <title>Установка портов</title>

    <para>Когда речь заходит о Коллекции портов, то первым делом вы должны
      понять, что именно подразумевается под словом <quote>скелет</quote>.
      По сути скелетом порта является минимальный набор файлов, которые нужны
      программе для ее корректной компиляции и установки во FreeBSD.  Скелет
      каждого порта включает:</para>

    <itemizedlist>
      <listitem>
	<para><filename>Makefile</filename>.  <filename>Makefile</filename>
	  содержит различные директивы, которые определяют, как приложение
	  должно быть откомпилировано и куда в вашей системе оно должно быть
	  установлено</para>
      </listitem>

      <listitem>
	<para>Каталог <filename>files</filename>.  В каталоге
	  <filename>files</filename> находится файл с именем
	  <filename>md5</filename>.  Этот файл именуется в честь алгоритма,
	  используемого для подсчета контрольных сумм портов.  Контрольная
	  сумма - это число, получаемое после сложения всех данных вашего
	  файла, который вы хотите проверить.  Если меняется какой-либо
	  символ, то контрольная сумма уже будет отличаться от оригинальной
	  и будет выведено сообщение об ошибке, чтобы вы могли выяснить, где
	  произошли изменения.</para>

	<para>В каталоге <filename>files</filename> могут также находиться и
	  другие файлы, необходимые для порта, но которые не подходят для
	  размещения где-то в другом месте структуры каталогов.</para>
      </listitem>

      <listitem>
	<para>Каталог <filename>patches</filename>.  Этот каталог
	  содержит патчи, использование которых необходимо для компиляции и
	  установки программы в вашей системе FreeBSD.	Патчи - это, как
	  правило, маленькие файлы, в которых содержатся изменения, которые
	  нужно внести в какой-то конкретный файл.  Они имеют обычный
	  текстовый формат и в основном содержат указания типа <quote>Удалить
	  строку 10</quote> или <quote>Заменить строку 26 на такую ...</quote>.
	  Патчи также называются <quote>diff-файлами</quote> или просто
	  <quote>диффами</quote>, потому что они генерируются программой
	  <application>diff</application>.</para>
      </listitem>

      <listitem>
	<para>Каталог <filename>pkg</filename>.  В нем, как правило,
	  находятся три файла.	Случается, что там помещают и более трех
	  файлов, но это уже зависит от конкретного порта.  Большинству
	  требуются только три.  Файлы такие:</para>

	<itemizedlist>
	  <listitem>
	    <para><filename>COMMENT</filename>.  Это однострочное описание
	      программы.</para>
	  </listitem>

	  <listitem>
	    <para><filename>DESCR</filename>.  Это более подробное,
	      зачастую многострочное описание программы.</para>
	  </listitem>

	  <listitem>
	    <para><filename>PLIST</filename>.  Это список всех файлов,
	      которые будут установлены портом.  В нем также содержатся
	      указания системе портов на удаление определенных файлов во
	      время удаления порта.</para>
	  </listitem>
	</itemizedlist>
      </listitem>
    </itemizedlist>

    <para>Теперь, когда вы имеете достаточное количество информации о том,
      для чего предназначена Коллекция портов, вы в состоянии установить ваш
      первый порт.  Это может быть сделано двумя способами, каждый из
      которых будет описан ниже.</para>

    <para>Однако, прежде чем мы этим займемся, вам нужно выбрать порт для
      установки.  Есть несколько способов сделать это, самый простой из
      которых заключается в использовании <ulink
      url="http://www.freebsd.org/ports/">списка портов на сайте FreeBSD
      </ulink>.  Вы можете просто полистать весь список портов или
      воспользоваться возможностями поиска на сайте.  Каждый порт также
      включает описание, так что вы можете прочесть некоторую информацию о
      каждом из портов, прежде чем решить его установить.</para>

    <para>Другой метод заключается в использовании команды
      <command>whereis</command>.  Чтобы ей воспользоваться, просто наберите
      в приглашении <quote><command>whereis &lt;программа, которую вы хотите
      установить&gt;</command></quote> и если она имеется в вашей системе, вам
      об этом будет сообщено, примерно так:</para>

    <screen>
&prompt.root; <userinput>whereis xchat</userinput>
xchat: /usr/ports/irc/xchat
&prompt.root;
    </screen>

    <para>Это значит, что xchat (клиентская программа для irc) находится в
      каталоге <filename>/usr/ports/irc/xchat</filename>.</para>

    <para>Еще одним способом поиска конкретного порта является использование
      встроенной возможности поиска Коллекции портов.  Чтобы ею
      воспользоваться, вы должны находиться в каталоге
      <filename>/usr/ports</filename>.	Очутившись в этом каталоге, выполните
      команду <command>make search key=program-name</command>, где
      <quote>program-name</quote> - это название программы, которую вы хотите
      найти.  Например, если вы ищете xchat:</para>

    <screen>
&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make search key=xchat</userinput>
Port:	xchat-1.3.8
Path:	/usr/ports/irc/xchat
Info:	An X11 IRC client using the GTK+ toolkit, and optionally, GNOME
Maint:	jim@FreeBSD.org
Index:	irc
B-deps: XFree86-3.3.5 bzip2-0.9.5d gettext-0.10.35 giflib-4.1.0 glib-1.2.6 gmake-3.77 gtk-1.2.6
		imlib-1.9.8 jpeg-6b png-1.0.3 tiff-3.5.1
R-deps: XFree86-3.3.5 gettext-0.10.35 giflib-4.1.0 glib-1.2.6 gtk-1.2.6 imlib-1.9.8 jpeg-6b
		png-1.0.3 tiff-3.5.1
    </screen>

    <para>Вам следует обратить особое внимание на строчку <quote>Path:</quote>,
      так как в ней указывается, где найти программу.  Остальная сообщаемая
      информация для непосредственно установки порта не нужна, поэтому здесь
      она не описывается.</para>

    <note>
      <para>Для установки портов вы должны иметь привилегии пользователя
	<username>root</username>.</para>
    </note>

    <para>Теперь, когда вы нашли порт, который хотите установить, можно
      выполнять реальную установку.</para>

    <sect3 id="ports-cd">
      <title>Установка портов с компакт-диска</title>

      <para>Как вы, наверное, уже предположили, исходя из названия раздела,
	все, что здесь будет описано, предполагает, что у вас имеется набор
	компакт-дисков FreeBSD.  Если у вас его нет, вы можете заказать его с
	сайта <ulink url="http://www.freebsdmall.com/">
	FreeBSD Mall</ulink>.</para>

      <para>Предположим, что ваш компакт-диск с FreeBSD находится в
	дисководе, он смонтирован в каталог <filename>/cdrom</filename> (а
	точкой монтирования <emphasis>обязан</emphasis> быть каталог
	<filename>/cdrom</filename>), и вы готовы к установке порта.  Чтобы
	начать, смените текущий каталог на тот, в котором находится порт,
	который вы хотите установить:</para>

      <screen>
&prompt.root; <userinput>cd /usr/ports/irc/xchat</userinput>
      </screen>

      <para>Оказавшись в каталоге xchat, вы увидите скелет порта. Следующим
	шагом является шаг компиляции (также называемый шагом построения)
	порта.	Это выполняется простой выдачей команды
	<command>make</command> в ответ на приглашение командного процессора.
	Как только вы это сделаете, вы увидите нечто, выглядящее примерно
	так:</para>

      <screen>
&prompt.root; <userinput>make</userinput>
&gt;&gt; xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from file:/cdrom/ports/distfiles/.
===&gt;  Extracting for xchat-1.3.8
&gt;&gt; Checksum OK for xchat-1.3.8.tar.bz2.
===&gt;   xchat-1.3.8 depends on executable: bzip2 - found
===&gt;   xchat-1.3.8 depends on executable: gmake - found
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
===&gt;  Patching for xchat-1.3.8
===&gt;  Applying FreeBSD patches for xchat-1.3.8
===&gt;  Configuring for xchat-1.3.8
...
[вывод конфигуратора опущен]
...
===&gt;  Building for xchat-1.3.8
...
[компиляция опущена]
...
&prompt.root;
      </screen>

      <para>Заметьте, что, как только компиляция закончится, вы снова
	вернетесь к приглашению вашего командного процессора.  Следующим
	шагом является установка порта.  Чтобы это сделать, вам нужно просто
	добавить одно слово к команде <command>make</command>, а именно слово
	<command>install</command>:</para>

      <screen>
&prompt.root; <userinput>make install</userinput>
===&gt;  Installing for xchat-1.3.8
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
...
[процедуры установки опущены]
...
===&gt;   Generating temporary packing list
===&gt;   Installing xchat docs in /usr/X11R6/share/doc/xchat
===&gt;   Registering installation for xchat-1.3.8
&prompt.root;
      </screen>

      <para>Как только вы вернулись к приглашению вашей оболочки, вы должны
	суметь запустить приложение, которое только что установили.</para>

      <note>
	<para>Вы можете сэкономить лишний шаг, просто выдав команду
	  <command>make install</command> вместо <command>make</command> и
	  последующей <command>make install</command> в двух отдельных
	  шагах.</para>
      </note>

      <note>
	<para>Пожалуйста, будьте готовы к тому, что лицензии некоторых
	  портов не позволяют помещать их на компакт-диск.  Это может
	  делаться по разным причинам, например, из-за обязательности
	  заполнения регистрационной формы перед сгрузкой, если дальнейшее
	  распространение запрещено, и так далее.  Если вы хотите установить
	  порт, которого нет на компакт-диске, вам нужно иметь подключение к
	  Интернет, чтобы это сделать (обратитесь к <link
	  linkend="ports-inet">следующему разделу</link>).</para>
      </note>
    </sect3>

    <sect3 id="ports-inet">
      <title>Установка портов из Интернет</title>

      <para>Как и в предыдущем разделе, здесь предполагается, что у вас
	имеется работающее подключение к Интернет.  Если это не ваш случай,
	вам нужно производить <link linkend="ports-cd">установку с
	компакт-диска</link>.</para>

      <para>Установка порта из Интернет производится точно так же, как если
	бы делали ее с компакт-диска.  Единственным отличием между ними
	является тот факт, что исходный код сгружается из Интернет, а не
	берется с компакт-диска.</para>

      <para>Выполняются те же самые шаги:</para>

      <screen>
&prompt.root; <userinput>make install</userinput>
&gt;&gt; xchat-1.3.8.tar.bz2 doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from http://xchat.org/files/v1.3/.
Receiving xchat-1.3.8.tar.bz2 (305543 bytes): 100%
305543 bytes transferred in 2.9 seconds  (102.81 Kbytes/s)
===&gt;  Extracting for xchat-1.3.8
&gt;&gt; Checksum OK for xchat-1.3.8.tar.bz2.
===&gt;   xchat-1.3.8 depends on executable: bzip2 - found
===&gt;   xchat-1.3.8 depends on executable: gmake - found
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
===&gt;  Patching for xchat-1.3.8
===&gt;  Applying FreeBSD patches for xchat-1.3.8
===&gt;  Configuring for xchat-1.3.8
...
[вывод конфигуратора опущен]
...
===&gt;  Building for xchat-1.3.8
...
[компиляция опущена]
...
===&gt;  Installing for xchat-1.3.8
===&gt;   xchat-1.3.8 depends on shared library: gtk12.2 - found
===&gt;   xchat-1.3.8 depends on shared library: Imlib.5 - found
===&gt;   xchat-1.3.8 depends on shared library: X11.6 - found
...
[процедуры установки опущены]
...
===&gt;   Generating temporary packing list
===&gt;   Installing xchat docs in /usr/X11R6/share/doc/xchat
===&gt;   Registering installation for xchat-1.3.8
&prompt.root;
      </screen>

      <para>Как вы видите, единственным отличием является строка, в которой
	указывается, откуда система сгружает порт.</para>

      <para>Это все об установке портов на вашу систему.  Далее вы узнаете,
	как удалить порт из вашей системы.</para>
    </sect3>
  </sect2>

  <sect2 id="ports-removing">
    <title>Удаление установленных портов</title>

    <para>Теперь, когда вы знаете, как устанавливать порты, вы наверное, уже
      задумывались о том, как же их удалять, просто даже на тот случай, если
      вы установили один из них, а позже решили, что установили не тот порт.
      Следующие несколько абзацев будут посвящены именно
      этому вопросу.</para>

    <para>Сейчас мы займемся удалением порта из нашего предыдущего примера
      (а это была программа xchat, если вы обратили внимание).	Как и при
      установке портов, первым делом вы должны перейти в каталог с портом,
      которым, как вы помните, был <filename>/usr/ports/irc/xchat</filename>.
      После смены каталога вы готовы к удалению xchat.	Это делается командой
      <command>make deinstall</command> (подходящее название?):</para>

    <screen>
&prompt.root; <userinput>cd /usr/ports/irc/xchat</userinput>
&prompt.root; <userinput>make deinstall</userinput>
===&gt;  Deinstalling for xchat-1.3.8
&prompt.root;
    </screen>

    <para>Это было достаточно легко.  Вы успешно удалили xchat из вашей
      системы.	Если вам захочется переустановить эту программу, то это
      можно будет сделать, выдав команду <command>make reinstall</command>
      из каталога <filename>/usr/ports/irc/xchat</filename>.</para>
  </sect2>
</sect1>

<sect1 id="ports-trouble">
  <title>Устранение некоторых проблем</title>

  <para>В этом разделе затронуты некоторые из наиболее часто задаваемых
    вопросов о Коллекции портов и описаны основные методы устранения
    проблем, а также рассказано, что делать, если <link
    linkend="ports-broken">порт не работает.</link></para>

  <sect2 id="ports-questions">
    <title>Некоторые Вопросы и Ответы</title>

    <qandaset>
      <qandaentry>
	<question>
	  <para>Я думал, здесь будут обсуждаться модемы??!</para>
	</question>

	<answer>
	  <para>А, вы, наверное, имеете в виду последовательные порты на
	    задней панели вашего компьютера.  Здесь мы используем слово
	    <quote>порт</quote> в смысле результата <quote>портирования</quote>
	    (переноса) программы с одной версии UNIX на другую.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я думал, что для установки дополнительных программ
	    вы посоветуете использовать пакаджи?</para>
	</question>

	<answer>
	  <para>Да, обычно это самый легкий и быстрый способ сделать
	    это.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Если так, то зачем тогда возиться с портами?</para>
	</question>

	<answer>
	  <para>На это есть несколько причин:</para>

	  <orderedlist>
	    <listitem>
	      <para>Условия лицензирования некоторых пакетов программного
		обеспечения запрещают распространение в виде двоичного кода.
		Они должны распространяться в виде исходного кода.</para>
	    </listitem>

	    <listitem>
	      <para>Некоторые не доверяют дистрибутивам в виде двоичного
		кода.  В конце концов, исходный код вы можете (теоретически)
		прочесть сами и найти причины появления возможных
		проблем.</para>
	    </listitem>

	    <listitem>
	      <para>Если у вас есть свои собственные патчи, то вам нужен
		исходный код для того, чтобы их применить.</para>
	    </listitem>

	    <listitem>
	      <para>У Вас может быть своё мнение по поводу того, как именно
		должна быть скомпилирована программа, и это мнение может
		отличаться от мнения того человека, который создавал
		пакадж&mdash;некоторые очень строго придерживаются
		определённых настроек параметров оптимизации, а также того,
		строить ли отладочные версии, а затем убирать отладочную
		информацию командой strip или нет, и так далее.</para>
	    </listitem>

            <listitem>
              <para>Как правило. пакаджи строятся с весьма консервативными,
                стандартными настройками.  Если в порте присутствует параметр
                компиляции, задающий использование кода, специфичного для
                некоторого процессора или нестандартного адаптера, то Вы
                можете включить его использование сами, не привлекая людей,
                создающих порты, к генерации множества различных версий
                пакаджей.</para>

              <para>Самым обычным исключением их этого правила являются размеры
                бумаги.  Хотя может быть создан пакадж с поддержкой по
                умолчанию различных размеров бумаги, зачастую мы делаем
                несколько пакаджей, по одному на конкретный размер
                бумаги.</para>
            </listitem>

	    <listitem>
	      <para>Некоторым нравится иметь всегда под рукой исходный код,
		так что они могут его читать, если им станет скучно, хакать
		его, заимствовать оттуда что-либо (конечно, если это
		позволяет лицензионное соглашение), и так далее.</para>
	    </listitem>

	    <listitem>
	      <para>Если у вас нет исходных текстов, то это не программы!
		<!-- smiley -->;-)</para>
	    </listitem>
	  </orderedlist>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para id="ports-patch">Что такое патч?</para>
	</question>

	<answer>
	  <para>Патч - это маленький файл, в котором указано, как перейти от
	    одной версии файла к другой.  Он имеет формат обычного текста, и,
	    как правило, содержит указания типа <quote>удалить строку
	    23</quote>, <quote>добавить вот эти две строки после строки
	    468</quote> или <quote>заменить строку 197 вот на такую</quote>.
	    Их также называют дифф-файлами или просто диффами, потому что
	    они создаются программой <application>diff</application>.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para id="ports-tarball">Что это за tar-файлы?</para>
	</question>

	<answer>
	  <para>Это файлы, оканчивающиеся на <filename>.tar</filename> или,
	    как вариант, на <filename>.tar.gz</filename>,
	    <filename>.tar.Z</filename>, <filename>.tar.bz2</filename> и даже
	    <filename>.tgz</filename>.</para>

	  <para>В основном такие файлы представляют собой дерево каталогов,
	    которое было заархивировано в один файл
	    (<filename>.tar</filename>) и (может быть) подвергнуто сжатию
	    (<filename>.gz</filename>).  Такая методика первоначально
	    использовалась для архивов на лентах <emphasis>T</emphasis>ape
	    <emphasis>AR</emphasis>chives (откуда, собственно, и пошло слово
	    <command>tar</command>), и она широко используется для
	    распространения исходного кода программ в Интернет.</para>

	  <para>Вы можете просмотреть, какие файлы находятся в этих архивах,
	    или даже самостоятельно извлечь их с помощью стандартной для UNIX
	    программы tar, включенной в стандартную поставку системы FreeBSD,
	    как здесь:</para>

	  <screen>
&prompt.user; <userinput>tar tvzf foobar.tar.gz</userinput>
&prompt.user; <userinput>tar xzvf foobar.tar.gz</userinput>
&prompt.user; <userinput>tar tvf foobar.tar</userinput>
&prompt.user; <userinput>tar xvf foobar.tar</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para id="ports-checksum">А контрольная сумма?</para>
	</question>

	<answer>
	  <para>Это число, получаемое в результате сложения содержимого того
	    файла, который вы хотите проконтролировать.  Если меняется хоть
	    один символ, контрольные суммы перестают совпадать, так что
	    простое их сравнение поможет выявить изменение.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я делал все, что здесь сказано, при компиляции портов с
	    компакт-диска и все прекрасно работало до тех пор, пока я не
	    попытался установить порт программы kermit.</para>

	  <screen>
&prompt.root; <userinput>make install</userinput>
&gt;&gt; cku190.tar.gz doesn't seem to exist on this system.
&gt;&gt; Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.
	  </screen>

	  <para>Почему он не может быть найден?  У меня не тот
	    компакт-диск?</para>
	</question>

	<answer>
	  <para>Как уже было сказано в главе о <link
	    linkend="ports-cd">компиляции портов с компакт-диска</link>,
	    некоторые порты не могут быть помещены на CDROM из-за их
	    лицензионных ограничений.  Kermit является примером такого
	    приложения.  Его условия лицензирования не позволяют нам
	    поместить его tar-файл на компакт-диск, так что вам придется
	    скачать его вручную&mdash;извините!</para>

	  <para>Причиной, по которой вы получили все эти сообщения об
	    ошибках, является то, что в тот момент вы не были подключены к
	    Интернет.  Как только вы скачаете этот файл с любого из
	    MASTER_SITES (перечисленных в Makefile), то сможете начать
	    процесс установки заново.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я это сделал, но, когда я попытался поместить этот файл в
	    каталог <filename>/usr/ports/distfiles</filename>, то получил
	    сообщение об ошибке, сообщающее об отсутствии прав
	    доступа.</para>
	</question>

	<answer>
	  <para>При работе система портов ищет tar-файл в каталоге
	    <filename>/usr/ports/distfiles</filename>, однако вы не сможете
	    скопировать туда ничего, потому что это на самом деле это
	    символическая ссылка на компакт-диск, который доступен только для
	    чтения.  Вы можете заставить систему выполнять поиск в другом
	    месте, сделав следующее:</para>

	  <screen>
&prompt.root; <userinput>make DISTDIR=<replaceable>/where/you/put/it</replaceable> install</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Система портов работает, только когда все находится в
	    каталоге <filename>/usr/ports</filename>?  Администратор нашей
	    системы сказал, что я должен держать все свои файлы в
	    <filename>/u/people/guests/wurzburger</filename>, но тогда ничего
	    не работает.</para>
	</question>

	<answer>
	  <para>Для того, чтобы указать системе построения портов на
	    использование других каталогов, вы можете использовать переменные
	    <makevar>PORTSDIR</makevar> и <makevar>PREFIX</makevar>.  В
	    частности,</para>

	  <screen>
&prompt.root; <userinput>make PORTSDIR=/u/people/guests/wurzburger/ports install</userinput>
	  </screen>

	  <para>будет строить порт в каталоге
	    <filename>/u/people/guests/wurzburger/ports</filename>, а
	    устанавливать все в <filename>/usr/local</filename>.</para>

	  <screen>
&prompt.root; <userinput>make PREFIX=/u/people/guests/wurzburger/local install</userinput>
	  </screen>

	  <para>будет строить порт в каталоге <filename>/usr/ports</filename>
	    и устанавливать в
	    <filename>/u/people/guests/wurzburger/local</filename>.</para>

	  <para>И, наконец,</para>

	  <screen>
&prompt.root; <userinput>make PORTSDIR=../ports PREFIX=../local install</userinput>
	  </screen>

	  <para>использует обе переменные (этот пример слишком длинен для
	    помещения на страницу полностью, но вы должны уловить общую
	    идею).</para>

          <para>Некоторые порты, использующие &man.imake.1; (часть X Windows
            System), не очень хорошо работают с <makevar>PREFIX</makevar>, и
            всё равно будут пытыться устанавливаться в каталог
            <filename>/usr/X11R6</filename>.  Подобным же образом некоторые
            порты на языке Perl игнорируют значение <makevar>PREFIX</makevar> и
            устанавливаются в дерево Perl.  Заставить такие порты работать с
            <makevar>PREFIX</makevar> трудно или невозможно.</para>

	  <para>Если вам не нравится набирать все это каждый раз при
	    установке портов, можно поместить эти переменные в ваше
	    окружение.	Прочтите страницы Справочника по вашему командному
	    процессору и найдите, как это сделать.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>У меня нет компакт-диска с FreeBSD, но я хочу скопировать все
	  tar-файлы вручную на мою систему, чтобы при установке порта не
	  ждать каждый раз, когда же он скачается.  Есть ли способ получить
	  все эти файлы сразу?</para>
	</question>

	<answer>
	  <para>Чтобы скачать все tar-файлы для Коллекции портов,
	    сделайте вот что:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make fetch</userinput>
	  </screen>

	  <para>Чтобы скачать все tar-файлы для какого-то одного каталога
	    из дерева портов, выполните следующее:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make fetch</userinput>
	  </screen>

	  <para>ну а что касается одного конкретного порта&mdash;ну, я думаю,
	    вы уже догадались, что вам нужно сделать.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я знаю, что, скорее всего, быстрее получится скачивать
	    tar-файлы с одного из ближайших зеркальных серверов FreeBSD.
	    Есть ли способ указать, что порты нужно сгружать оттуда, а не
	    с серверов, указанных в качестве MASTER_SITES?</para>
	</question>

	<answer>
	  <para>Да.  Если вы, например, знаете, что <hostid
	    role="fqdn">ftp.FreeBSD.org</hostid> гораздо ближе к вам, чем
	    сайты, перечисленные в строке <makevar>MASTER_SITES</makevar>, то
	    сделайте так:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports/<replaceable>directory</replaceable></userinput>
&prompt.root; <userinput>make MASTER_SITE_OVERRIDE= \
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я хочу знать, какие файлы нужно будет скачать при выполнении
	    команды <command>make</command> до того, как они начнут
	    скачиваться.</para>
	</question>

	<answer>
	  <para>Команда <command>make fetch-list</command> выдаст список
	    файлов, которые нужны для построения порта.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Есть ли способ предотвратить компиляцию порта?	Я хочу
	    немножко покопаться в исходных текстах до того, как буду
	    устанавливать порт, однако несколько поднадоедает каждый раз
	    следить и нажимать в нужный момент control-C.</para>
	</question>

	<answer>
	  <para>При выполнении команды <command>make extract</command>
	    процесс построения остановится после того, как будет сгружен и
	    распакован исходный код порта.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я пытаюсь создать собственный порт и хочу отключить
	    компиляцию до тех пор, пока не увижу, что мои патчи работают
	    нормально.	Есть ли команда типа <command>make extract</command>,
	    но работающая для патчей?</para>
	</question>

	<answer>
	  <para>Ага, <command>make patch</command> - это то, что вы ищете.
	    Также вам может оказаться полезным параметр
	    <makevar>PATCH_DEBUG</makevar>.  И кстати, благодарим вас за ваши
	    усилия!</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я слышал, что некоторые параметры работы компилятора могут
	    приводить к ошибкам.  Это правда?  Как я могу быть уверенным, что
	    порт компилируется с правильными параметрами?</para>
	</question>

	<answer>
	  <para>Да, в версии 2.6.3 компилятора <command>gcc</command>
	    (которая поставлялась с FreeBSD 2.1.0 и 2.1.5), параметр
	    <option>-O2</option> мог приводить к генерации ошибочного кода,
	    если вы не использовали также опцию
	    <option>-fno-strength-reduce</option>.  (Большинство портов не
	    используют параметр <option>-O2</option>).	У вас
	    <emphasis>должно</emphasis> получиться указание используемых
	    параметров компилятора примерно следующим образом:</para>

	  <screen>
&prompt.root; <userinput>make CFLAGS='-O2 -fno-strength-reduce' install</userinput>
	  </screen>

	  <para>или посредством редактирования
	    <filename>/etc/make.conf</filename>, но, к сожалению, не все
	    порты это поддерживают.  Самый надежный способ - это выполнить
	    команду <command>make configure</command>, а затем перейти в
	    каталог с исходными текстами и изучить файлы Makefile
	    вручную, но это может оказаться утомительным занятием, если
	    исходный код имеет много подкаталогов, каждый с собственными
	    make-файлами.</para>

          <para>Параметры компиляции по умолчанию во FreeBSD достаточно
            консервативны, так что если Вы их не меняли, то и проблем возникнуть
            не должно.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Портов так много, что трудно найти именно тот, который мне
	    нужен.  Есть ли где-нибудь список всех имеющихся портов?</para>
	</question>

	<answer>
	  <para>Взгляните на файл <filename>INDEX</filename> в каталоге
	    <filename>/usr/ports</filename>.  Если вы хотите выполнить поиск
	    в коллекции портов по ключевому слову, вы это тоже осуществимо.
	    Например, вы можете найти порты, связанные с языком
	    программирования LISP, с помощью команды:</para>

	  <screen>
&prompt.user; <userinput>cd /usr/ports</userinput>
&prompt.user; <userinput>make search key=lisp</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я начал устанавливать порт <literal>foo</literal>, однако
	    система неожиданно остановила компиляцию и стала компилировать
	    порт <literal>bar</literal>.  Что, собственно, произошло?</para>
	</question>

	<answer>
	  <para>Порту <literal>foo</literal> требуется что-то, имеющееся в
	    порту <literal>bar</literal> &mdash; например, если
	    <literal>foo</literal> использует графику, в
	    <literal>bar</literal> может присутствовать библиотека с
	    полезными функциями обработки графики.  Или
	    <literal>bar</literal> может быть инструментом, который необходим
	    для компиляции порта <literal>foo</literal>.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para id="ports-remove">
	    Я установил программу <literal>grizzle</literal> из портов и
	    оказалось, что это бесполезная трата дискового пространства. Я
	    хочу удалить ее, но не знаю, где находятся все файлы этой
	    программы.	Что посоветуете?</para>
	</question>

	<answer>
	  <para>Нет проблем, просто сделайте следующее:</para>

	  <screen>
&prompt.root; <userinput>pkg_delete grizzle-6.5</userinput>
	  </screen>

	  <para>Альтернативным способом является:</para>

	  <screen>
&prompt.root; <userinput>cd <replaceable>/usr/ports/somewhere/grizzle</replaceable></userinput>
&prompt.root; <userinput>make deinstall</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Минуточку, вы же должны знать номер версии для использования
	    в этой команде.  Вы всерьез полагаете, что я должен их все
	    помнить??</para>
	</question>

	<answer>
	  <para>Вовсе нет, вы можете выяснить это с помощью:</para>

	  <screen>
&prompt.root; <userinput>pkg_info -a | grep grizzle</userinput>
Information for grizzle-6.5:
grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up
arcade game.
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Если говорить о дисковом пространстве, то каталог с портами,
	    похоже, занимает ужасно много места.  Можно ли удалять отсюда
	    что-нибудь?</para>
	</question>

	<answer>
	  <para>Да, если вы установили программу и достаточно уверены,
	    что ее исходные тексты вам больше не понадобятся, то хранить их
	    вовсе не обязательно.  Лучше сделать это так:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make clean</userinput>
	  </screen>

	  <para>в результате чего будет сделан проход по всем подкаталогам и
	    произойдет удаление всего, кроме скелетов каждого порта.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я попробовал сделать так, но все равно все эти архивы или как
	    там вы их называете, остались в каталоге
	    <filename>distfiles</filename>.  Могу ли я удалить и их
	    тоже?</para>
	</question>

	<answer>
	  <para>Да, если вы уверены, что с ними покончено, то их тоже можно
	    удалить.  Их можно удалить вручную, или командой
	    <command>make distclean</command>.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Мне нравится иметь все больше и больше программ для того,
	    чтобы поиграться с ними.  Есть ли способ установить все порты за
	    раз?</para>
	</question>

	<answer>
	  <para>Просто сделайте вот так:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make install</userinput>
	  </screen>

          <para>Будьте внимательны, потому что некоторые порты могут
            устанавливать файлы с уже имеющимися именами.  Если Вы
            устанавливаете два работающих с графикой приложения, и оба они
            устанавливают файл <filename>/usr/local/bin/plot</filename>, то
            у вас однозначно возникнут проблемы.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>OK, я попробовал сделать это, но подумал, что этот процесс
	    займет очень много времени, так что пошел спать, оставив все
	    работать.  Когда же я посмотрел утром на компьютер, то было
	    откомпилировано только три с половиной порта.  Что-то было
	    сделано не так?</para>
	</question>

	<answer>
	  <para>Нет, проблема в том, что некоторые порты задают вам вопросы,
	    на которые мы не можем ответить за вас (например, <quote>Хотите
	    ли вы печатать на листы формата A4 или US letter?</quote>), но
            на эти вопросы кто-то должен ответить.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Я вовсе не хочу провести весь день, пялясь в монитор.  Есть
	    идеи получше?</para>
	</question>

	<answer>
	  <para>OK, перед тем, как идти в кроватку/на работу/парк отдыха,
	    сделайте вот что:</para>

	  <screen>
&prompt.root <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DBATCH install</userinput>
	  </screen>

	  <para>При этом будут установлены все порты, которым
	    <emphasis>не</emphasis> нужно взаимодействовать с пользователем.
	    Затем, когда вы вернетесь, сделайте:</para>

	  <screen>
&prompt.root; <userinput>cd /usr/ports</userinput>
&prompt.root; <userinput>make -DIS_INTERACTIVE install</userinput>
	  </screen>

	  <para>чтобы завершить работу.</para>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>На моей работе используется программа
	    <literal>frobble</literal>, которая есть в вашей Коллекции
	    портов, однако мы ее несколько исправили, чтобы получить то, что
	    нужно.  Есть ли способ создания наших собственных пакаджей для их
	    распространения по нашим сайтам?</para>
	</question>

	<answer>
	  <para>Нет проблем, полагая, что вы знаете, как сделать патчи
	    с вашими изменениями:</para>

	  <screen>
&prompt.root; <userinput>cd <replaceable>/usr/ports/somewhere/frobble</replaceable></userinput>
&prompt.root; <userinput>make extract</userinput>
&prompt.root; <userinput>cd work/frobble-2.8</userinput>
[Apply your patches]
&prompt.root; <userinput>cd ../..</userinput>
&prompt.root; <userinput>make package</userinput>
	  </screen>
	</answer>
      </qandaentry>

      <qandaentry>
	<question>
	  <para>Эта система портов - весьма хитрая штука.  Я не могу понять,
	    как вы это делаете.  В чем секрет?</para>
	</question>

	<answer>
	  <para>Здесь нет никакого секрета, просто взгляните на файлы
	    <filename>bsd.port.mk</filename> и
	    <filename>bsd.port.subdir.mk</filename> в <ulink
	    url="file://localhost/usr/ports/Mk/">каталоге с
	    make-файлами</ulink>.</para>

	  <para>(Читателям, испытывающим дурноту при чтении скриптов,
	    советуем не переходить по этой ссылке...)</para>
	</answer>
      </qandaentry>
    </qandaset>
  </sect2>

  <sect2 id="ports-broken">
    <title>Помогите!  Этот порт не работает!</title>

    <para>Если вы встретили порт, который у вас не работает, есть несколько
      вещей, которые вы можете сделать, а именно:</para>

    <orderedlist>
      <listitem>
	<para>Исправьте его!
	  Раздел <link linkend="porting"><quote>о создании
	  портов</quote></link> должен вам помочь.</para>
      </listitem>

      <listitem>
	<para>Надавите&mdash;<emphasis>только по электронной почте!</emphasis>
	  Сначала пошлите письмо человеку, сопровождающему порт.  Наберите
	  команду <command>make maintainer</command> или прочтите
	  <filename>Makefile</filename>, чтобы найти его адрес.  Не забудьте
	  указать имя и версию порта (скопировав строчку
	  <literal>$FreeBSD:</literal> из файла <filename>Makefile</filename>)
	  и включите в письмо весь вывод, предшествующий возникновению ошибки.
	  Если вы не получили ответа от этого человека, то можете
	  воспользоваться командой <command>send-pr</command> для посылки
	  сообщения об ошибке.</para>
      </listitem>

      <listitem>
	<para>Забудьте об этом.  Это самый простой путь&mdash;лишь весьма
	  незначительное число портов можно отнести к разряду <quote>жизненно
	  необходимых</quote>.  Также имеется большая вероятность того, что
	  все проблемы будут исправлены в следующей версии при обновлении
	  порта.</para>
      </listitem>

      <listitem>
	<para>Сгрузите пакадж с ближайшего к вам сервера.
	  <quote>Основная</quote> коллекция пакаджей находится на сервере
	  <hostid role="fqdn">ftp.FreeBSD.org</hostid> в <ulink
	  URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/">каталоге
	  с пакаджами</ulink>, но <emphasis>первым делом</emphasis> проверьте
	  местное зеркало!  Это, скорее всего, будет работать, и сделать это,
	  кроме того, будет гораздо быстрее, чем пытаться компилировать порты
	  из исходного кода.  Воспользуйтесь программой &man.pkg.add.1; для
	  установки пакаджа в вашей системе.</para>
      </listitem>
    </orderedlist>
  </sect2>
</sect1>

<sect1 id="porting">
  <title>Вопросы повышенной сложности</title>

  <para>Описание, которое здесь было, для удобства перемещено в отдельное <ulink
    url="../porters-handbook/index.html">Руководство по портированию</ulink>.
    Пожалуйста, обращайтесь к нему, если вы собираетесь создавать и присылать
    нам ваши порты.</para>
</sect1>

</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "part" "chapter")
     End:
-->
