5.7. Зависимости

Многие порты зависят от других портов. Имеется семь переменных, которые вы можете использовать для обеспечения того, что всё требуемое находится на машине пользователя. Имеется также несколько предопределённых переменных, отражающих зависимости для общих случаев, плюс ещё несколько для управления поведением зависимостей.

5.7.1. LIB_DEPENDS

Эта переменная указывает, от каких совместно используемых библиотек зависит порт. Это список пар lib:dir[:target] где lib - это имя библиотеки, dir - это каталог, в котором можно ее найти в случае, если ее нет на машине, и target - это цель, которую нужно вызвать в этом каталоге. Например,

 LIB_DEPENDS=
  jpeg.9:${PORTSDIR}/graphics/jpeg:install
проверит наличие библиотеки jpeg со старшим номером версии 9 и перейдет в подкаталог graphics/jpeg вашего дерева портов для ее построения и установки, если библиотека отсутствует. Часть target может быть опущена, если она равна DEPENDS_TARGET (по умолчанию install).

Замечание: Часть lib - это аргумент, который передается команде ldconfig -r | grep -wF. В этой переменной не должно быть регулярных выражений.

Зависимость проверяется дважды, один раз внутри цели extract, а затем из цели install. Кроме того, имя зависимости помещается в пакет, так что pkg_add(1) будет автоматически его устанавливать, если его нет на пользовательской системе.

5.7.2. RUN_DEPENDS

В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir[:target] где path - это имя программы или файла, а dir - каталог, в котором можно найти порт в случае, если его нет в системе, и target - это цель, которую нужно вызвать в этом каталоге. Если path начинается со слэша (/), он воспринимается как файл и его существование проверяется командой test -e; в противном случае предполагается, что это выполнимый файл и для определения того, имеется ли программа в пути поиска пользователя, используется команда which -s.

Например,

RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn 
   wish8.0:${PORTSDIR}/x11-toolkits/tk80
 

проверит, существует ли файл или каталог /usr/local/etc/innd и построит и установит его из подкаталога news/inn дерева портов, если он не будет найден. Он также проверит, имеется ли выполнимый файл с именем wish8.0 в вашем пути поиска, перейдет в подкаталог x11-toolkits/tk80 вашего дерева портов для его построения и установки, если он не будет найден.

Замечание: В приведенном примере innd является выполнимым файлом; если выполнимый файл находится в необычном для пользовательского маршрута поиска файлов месте, вы должны указать полный путь к файлу.

Зависимость проверяется внутри цели install. Кроме того, имя зависимости помещается в пакет, так что программа pkg_add(1) будет автоматически его устанавливать, если он не будет найден в пользовательской системе. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

5.7.3. BUILD_DEPENDS

В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и RUN_DEPENDS, это список пар path:dir[:target] Например,

 BUILD_DEPENDS=
  unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие выполнимого фала с именем unzip и перейдет в подкаталог archivers/unzip вашего дерева портов для его построения и установки, если последний не будет найден.

Замечание: Под ``построением'' здесь понимается всё, от распаковки до компиляции. Зависимость проверяется из цели extract. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

5.7.4. FETCH_DEPENDS

В этой переменной перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки. Как и предыдущие две переменные, это список пар path:dir[:target] Например,

 FETCH_DEPENDS=
  ncftp2:${PORTSDIR}/net/ncftp2
будет проверять наличие выполняемого файла с именем ncftp2 и перейдет в каталог net/ncftp2 вашего дерева портов для его построения и установки, если тот не будет найден.

Зависимость проверяется при выполнении цели fetch. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

5.7.5. EXTRACT_DEPENDS

В этой переменной указываются программы или файлы, которые требуются для распаковки порта. Как и в предыдущих случаях, это список пар вида path:dir[:target]. Например,

EXTRACT_DEPENDS=
   unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие программы с именем unzip, и перейдёт в подкаталог archivers/unzip вашего дерева портов для её построения и установки, если такой программы не будет найдено.

Зависимость проверяется внутри цели extract. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

Замечание: Используйте эту переменную, только если распаковка не работает (по умолчанию предполагается использование gzip) и это не исправляется при помощи USE_ZIP или USE_BZIP2, которые описаны в Разд. 5.7.8.

5.7.6. PATCH_DEPENDS

Эта переменная указывает на программы или файлы, которые нужны порту для применения патчей. Как и в предыдущих случаях, это список пар вида path:dir[:target]. Например,

PATCH_DEPENDS=
   ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
будет переходить в подкаталог java/jfc вашего дерева портов для построения и установки, если не найдёт нужной программы.

Зависимость проверяется внутри цели patch. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

5.7.7. DEPENDS

Если имеется зависимость, которая не подпадает ни под одну из вышеперечисленных категорий, или ваш порт требует наличия исходных текстов другого порта в распакованном виде кроме того, что этот порт должен быть установлен, то воспользуйтесь этой переменной. Это список пар вида dir[:target], потому что, в отличие от предыдущих случаев, ничего не проверяется. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

5.7.8. USE_*

Для объединения нескольких зависимостей, которые есть во многих портах, предназначено несколько переменных.

Таблица 5-1. Переменные USE_*

Переменная Смысл
USE_BZIP2 tar-архивы порта упакованы при помощи bzip2.
USE_ZIP tar-архивы порта упакованы при помощи zip.
USE_GMAKE Для построения порт требует наличия gmake.
USE_PERL5 Для построения и установки порта требуется perl 5. Обратитесь к Разд. 6.3 для получения информации о дополнительных переменных, которые связаны с perl.
USE_X_PREFIX Порт устанавливается в каталог X11BASE, а не в PREFIX. Обратитесь к Разд. 6.4 для получения информации о дополнительных переменных, которые связаны с X11.
USE_AUTOMAKE_VER В процессе своего построения порт использует GNU automake. Обратитесь к Разд. 6.5 для получения информации о дополнительных переменных, которые связаны с automake.
USE_AUTOCONF_VER В процессе своего построения порт использует GNU autoconf. Обратитесь к Разд. 6.5 для получения информации о дополнительных переменных, которые связаны с autoconf.
USE_LIBTOOL_VER В процессе своего построения порт использует GNU libtool. Обратитесь к Разд. 6.5 для получения информации о дополнительных переменных, которые связаны с libtool.
GMAKE Полный маршрут до gmake, если он отсутствует в переменной окружения PATH.
USE_BISON Для построения порт использует bison.
USE_SDL Для построения и работы порт использует SDL. Обратитесь к разделу Разд. 6.13 для получения информации о том, как использовать USE_SDL.
NO_INSTALL_MANPAGES Не использовать цель install.man.

Определите переменную USE_XLIB=yes, если ваш порт для установки требует X Window System (что подразумевается при использовании переменной USE_IMAKE). Определите переменную USE_GMAKE=yes, если ваш порт требует вместо стандартной для BSD утилиты make ее GNU-аналог. Задайте USE_AUTOCONF_VER=213, если порту для работы требуется GNU autoconf. Определите переменную USE_QT=yes, если ваш порт использует самую последнюю версию пакета qt. Укажите USE_PERL5=yes в случае, если вашему порту требуется версия 5 языка perl. (Последнее особенно важно, так как некоторые версии FreeBSD имеют perl5 в составе системы, когда как другие - нет.)

5.7.9. Замечания касательно зависимостей

Как уже отмечено выше, целью, которая вызывается по умолчанию в случае, когда это требует зависимость, является DEPENDS_TARGET. Она по умолчанию есть install. Это пользовательская переменная; она нигде не определена в файле Makefile порта. Если вашему порту требуется особый метод обработки зависимости, воспользуйтесь частью :target переменной *_DEPENDS вместо того, чтобы переопределять DEPENDS_TARGET.

Когда вы набираете команду make clean, эта операция также выполняется и над зависимостями этого порта. Если вы не хотите, чтобы это случилось, определите переменную NOCLEANDEPENDS в вашем окружении. Это может быть особенно нужным, если порт имеет нечто, что занимает много времени на построение, в своём списке зависимостей, например, KDE, GNOME или Mozilla.

Чтобы безусловно зависеть от другого порта, укажите переменную ${NONEXISTENT} в качестве первого поля переменной BUILD_DEPENDS или RUN_DEPENDS. Пользуйтесь этим, только когда вам нужно иметь исходный код другого порта. Вы можете сэкономить время на компиляции, указав также и цель. Например,

BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
всегда будет переходить в каталог с портом jpeg и распаковывать его.

Не нужно использовать DEPENDS, если есть другой способ получить требуемый результат. Это может привести к тому, что какой-то другой порт всегда будет строиться (и по умолчанию устанавливаться). и такая зависимость отразится и на пакете. Если это именно то, что вам нужно, то вам, наверное, следует описывать это через BUILD_DEPENDS и RUN_DEPENDS--по крайней мере смысл будет более понятен.

5.7.10. Необязательные зависимости

Некоторые большие приложения могут быть построены в различных конфигурациях, с дополнительной функциональностью, зависящей от наличия в системе определённых библиотек или приложений. Так как не всем пользователям требуются эти библиотеки или приложения, то в системе портов предусмотрен механизм, позволяющий автору порта принимать решение о конфигурации, которая будет строиться. Полная поддержка этого механизма облегчает пользователям жизнь и даёт два или более порта ценой создания одного.

Самым простым из этих механизмом является использование WITHOUT_X11. Если порт может быть построен как с поддержкой X, так и без оной, то обычно он должен строиться с поддержкой X. Если определена переменная WITHOUT_X11, то должна строиться версия, не поддерживающая X.

Различные части пакета GNOME имеют такие зависимости, хотя их гораздо труднее использовать. В Makefile можно использовать переменные WANT_* и HAVE_*. Если приложение может быть построено как с зависимостями, так и без зависимостей, перечисленных ниже, то в Makefile должна быть задана переменная WANT_PKG и версия, которая использует пакет PKG, будет строиться, если определена переменная HAVE_PKG.

На данный момент так работают переменные WANT_*, WANT_GLIB, WANT_GTK, WANT_ESOUND, WANT_IMLIB и WANT_GNOME.

5.7.11. Зацикленные зависимости фатальны

Важно: Не помещайте зацикливающиеся зависимости в дерево портов!

Технология построения портов не защищена от зацикленных зависимостей. Если вы создадите такую, то у кого-нибудь и где-нибудь установка FreeBSD будет немедленно сломана, а у остальных сломается несколько позже. Это на самом деле очень трудно распознать; если вы сомневаетесь, то перед внесением изменений проверьте, что выполнили следующее: cd /usr/ports; make index. Этот процесс может быть достаточно медленным на старых машинах, хотя мы сможете спасти большое количество людей--включая себя--от грядущих бед.

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>. Обновлено: 12.03.2015