Многие порты зависят от других портов. Это очень удобная замечательная особенность большинства Unix-подобных операционных систем, включая FreeBSD. Множество портов могут использовать общую зависимость совместно, а не включать её в состав каждого порта или пакета, который в ней нуждается. Имеется семь переменных, которые вы можете использовать для обеспечения того, что всё требуемое находится на машине пользователя. Имеется также несколько предопределённых переменных, отражающих зависимости для общих случаев, плюс ещё несколько для управления поведением зависимостей.
Эта переменная указывает, от каких совместно используемых
библиотек зависит порт. Это список пар
lib
:dir
,
где lib
- это имя библиотеки,
dir
- это каталог, в котором можно
ее найти в случае, если ее нет на машине. Например,
LIB_DEPENDS= libjpeg.so:${PORTSDIR}/graphics/jpeg
проверит наличие библиотеки jpeg с любым номером версии и
перейдет в подкаталог graphics/jpeg
вашего дерева портов для ее построения и установки, если
библиотека отсутствует.
Зависимость проверяется дважды, один раз внутри цели
build
, а затем из цели
install
. Кроме того, имя
зависимости помещается в пакет, так что
pkg install
(см. pkg-install(8))
будет автоматически её устанавливать, если её нет на
пользовательской системе.
В этой переменной перечисляются выполнимые файлы или
файлы, от которых зависит работа порта. Это список пар вида
path
:dir
[:target],
где path
- это имя программы или
файла, а dir
- каталог, в котором
можно найти порт в случае, если его нет в системе, и
target
- это цель, которую нужно
вызвать в этом каталоге. Если
path
начинается со слэша
(/
), он воспринимается как файл и его
существование проверяется командой
test -e
; в противном случае
предполагается, что это выполнимый файл, и для определения
того, имеется ли программа в пути поиска, используется
команда which -s
.
Например,
RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:${PORTSDIR}/news/inn \ xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr
проверит существование файла или каталога
/usr/local/news/bin/innd
, и если ничего
не будет найдено, то построит и установит порт из подкаталога
news/inn
дерева портов. Также будет
выполнена проверка, присутствует ли в пути поиска исполняемый
файл с именем xmlcatmgr
, и перейдет в
подкаталог textproc/xmlcatmgr
вашего
дерева портов для его построения и установки, если он не
будет найден.
В приведенном примере innd
является
выполнимым файлом; если выполнимый файл находится в месте,
которое отсутствует в списке путей файлов, то вы должны
указать полный путь к файлу.
Официальным значением переменной поиска
PATH
, используемым в кластере построения
портов является
/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
Зависимость проверяется внутри цели
install
. Кроме того, имя
зависимости помещается в пакет, так что
pkg install
(см. pkg-install(8))
будет автоматически его устанавливать, если он не будет
найден в пользовательской системе. Часть
target
может быть опущена, если
она совпадает с DEPENDS_TARGET
.
Довольно распространенной является ситуация, когда
RUN_DEPENDS
буквально такая же как
BUILD_DEPENDS
, особенно если переносимое
программное обеспечение написано на языке сценариев, или если
оно требует такое же окружение для исполнения, как и
используемое во время построения. В этом случае, очень
заманчивым или довольно естественным является присвоение
одного другому:
RUN_DEPENDS= ${BUILD_DEPENDS}
Тем не менее, подобные присвоения могут загрязнять
зависимости времени исполнения содержимым, не заданным в
BUILD_DEPENDS
исходного порта. Такое
случается из-за ленивого вычисления в make(1)
присваиваемых переменных. Представьте
Makefile
с переменными
USE_
, которые
обрабатываются в *
ports/Mk/bsd.*.mk
для
пополнения первоначальных зависимостей построения. Например,
USES= gmake
добавляет devel/gmake в
BUILD_DEPENDS
. Для предотвращения
загрязнения RUN_DEPENDS
подобными
дополнительными зависимостями проявляйте осторожность с
присвоением с раскрытием, т.е. с раскрытием значения перед
его присвоением переменной:
RUN_DEPENDS:= ${BUILD_DEPENDS}
В этой переменной перечисляются выполнимые или обычные
файлы, которые требуются порту для его построения. Как и
RUN_DEPENDS
, это список пар
path
:dir
[:target].
Например,
BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие выполнимого фала с именем
unzip
и перейдет в подкаталог
archivers/unzip
вашего дерева портов для
его построения и установки, если последний не будет
найден.
Под <<построением>> здесь понимается всё, от
распаковки до компиляции. Зависимость проверяется из цели
extract
. Часть
target
может быть опущена, если
она совпадает с DEPENDS_TARGET
.
В этой переменной перечисляются выполняемые файлы или
просто файлы, которые требуются порту для сгрузки. Как и
предыдущие две переменные, это список пар
path
:dir
[:target].
Например,
FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
будет проверять наличие выполняемого файла с именем
ncftp2
и перейдет в каталог
net/ncftp2
вашего дерева портов для его
построения и установки, если тот не будет найден.
Зависимость проверяется при выполнении цели
fetch
. Часть
target
может быть опущена, если
она совпадает с DEPENDS_TARGET
.
В этой переменной указываются программы или файлы,
которые требуются для распаковки порта. Как и в предыдущих
случаях, это список пар вида
path
:dir
[:target].
Например,
EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие программы с именем
unzip
, и перейдёт в подкаталог
archivers/unzip
вашего дерева портов для
её построения и установки, если такой программы не будет
найдено.
Зависимость проверяется внутри цели
extract
. Часть
target
может быть опущена, если
она совпадает с DEPENDS_TARGET
.
Используйте эту переменную, только если распаковка не
работает (по умолчанию предполагается использование
gzip
) и это не исправляется при помощи
USE_ZIP
или
USE_BZIP2
, которые описаны в Раздел 5.8.8, <<USE_
>>.*
Эта переменная указывает на программы или файлы, которые
нужны порту для применения патчей. Как и в предыдущих
случаях, это список пар вида
path
:dir
[:target].
Например,
PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
будет переходить в подкаталог
java/jfc
вашего дерева портов для
распаковки.
Зависимость проверяется внутри цели
patch
. Часть
target
может быть опущена, если
она совпадает с DEPENDS_TARGET
.
Могут быть добавлены параметры для определения различных
характерных особенностей и зависимостей, которыми обладает
данный порт. Они указываются путём добавления в
Makefile
этой строки:
USES= feature[:arguments]
Для получения полного списка значений смотрите
Раздел 15.1, <<Значения USES
>>.
Значение USES
нельзя присваивать
после подключения
bsd.port.pre.mk
.
Для определения общих зависимостей, совместно
используемых многими портами, предназначено несколько
переменных. Их использование является необязательным, но
помогает упростить избыточность файлов
Makefile
порта. Каждый из них
оформляется как
USE_
. Эти
переменные можно использовать только в
*
Makefile
порта и
ports/Mk/bsd.*.mk
. Они не предназначены
для установки пользователями параметров - используйте
для этих целей PORT_OPTIONS
.
Установка любых
USE_
в
*
/etc/make.conf
всегда является ошибочным действием.
В частности, установка
USE_GCC=X.Y
(где X.Y соответствует версии) добавит зависимость от
gccXY к каждому порту, включая и сам
lang/gccXY
!
USE_*
Переменная | Значение |
---|---|
USE_BZIP2 | tar-архивы порта упакованы при помощи
bzip2 . |
USE_ZIP | tar-архивы порта упакованы при помощи
zip . |
USE_GCC | Для сборки порта требуется GCC
(gcc или g++ ).
Некоторым портам подходит любая версия, для других
требуются последние современные версии. Обычно
используется со значением any (в
этом случае используется встроенный GCC в тех версиях
FreeBSD, в состав которых он всё ещё входит, или
устанавливается порт lang/gcc ,
когда Clang является компилятором C/C++ по умолчанию)
или yes (всегда используется
стабильная современная версия GCC из порта
lang/gcc ). Также в значении
переменной можно указать точную версию, например
4.7 . Минимально допустимую версию
можно указать как 4.6+ .
GCC из основной системы используется в случае, если
его версия удовлетворяет запрошенной, иначе
собирается подходящая версии компилятора из порта с
соответствующей коррекцией переменных
CC и
CXX . |
Переменные, относящиеся к
gmake и сценарию
configure
, описаны в Раздел 6.4, <<Механизмы построения>>, а
autoconf,
automake и
libtool описаны в Раздел 6.5, <<Использование GNU Autotools>>. Переменные, связанные с
Perl, описаны в Раздел 6.7, <<Использование Perl>>. Переменные X11 перечислены в Раздел 6.8, <<Использование X11>>. Раздел 6.9, <<Использование GNOME>>
работает с переменными GNOME и Раздел 6.11, <<Использование KDE>> с
KDE. Раздел 6.12, <<Использование Java>> описывает переменные Java,
а Раздел 6.13, <<Веб-приложения, Apache и PHP>> содержит информацию об
Apache,
PHP и модулях PEAR.
Python обсуждается в Раздел 6.14, <<Использование Python>>, а Ruby
в Раздел 6.17, <<Использование Ruby>>. Раздел 6.18, <<Использование SDL>>
предоставляет переменные, используемые для приложений
SDL, и, наконец, Раздел 6.22, <<Использование Xfce>> содержит информацию о приложении
Xfce.
Минимальная версия зависимости может быть указана в любой
переменной *_DEPENDS
, за исключением
LIB_DEPENDS
, с использованием следующего
синтаксиса:
p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy
Первое поле содержит название зависимого пакета, которое обязано совпадать с записью в базе данные пакетов, знак сравнения и версию пакета. Зависимость удовлетворяется, если на машине установлен p5-Spiffy-0.26 или новее.
Как уже отмечено выше, целью, которая вызывается по
умолчанию в случае, когда это требует зависимость, является
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
и распаковывать его.
Не помещайте зацикливающиеся зависимости в дерево портов!
Технология построения портов не защищена от зацикленных
зависимостей. Если вы создадите такую, то у кого-нибудь и
где-нибудь установка FreeBSD будет немедленно сломана, а у
остальных сломается несколько позже. Это на самом деле очень
трудно распознать; если вы сомневаетесь, то перед внесением
изменений проверьте, что выполнили следующее:
cd /usr/ports; make index
. Этот процесс
может быть достаточно медленным на старых машинах, хотя вы
сможете спасти большое количество людей-включая
себя-от грядущих бед.
Зависимости должны быть указаны либо явно, либо с использованием фреймворка OPTIONS. Использование прочих методов, таких как автоматическое обнаружение зависимостей, усложняет индексирование, что вызывает проблемы в управлении портами и пакетами.
.include <bsd.port.pre.mk> .if exists(${LOCALBASE}/bin/foo) LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar .endif
Проблема автоматического добавления зависимостей заключается в том, что файлы и настройки за пределами порта могут произвольно меняться. Пример: после построения индекса устанавливается набор портов. При этом один из них устанавливает проверяемый файл. На этом этапе индекс будет неправильным, потому что установленный порт неожиданно получит новую зависимость. Индекс может быть по прежнему неправильным даже после его перестроения, в случае если другие порты также определят дополнительные зависимости, основываясь на существовании других файлов.
OPTIONS_DEFINE= BAR BAR_DESC= Bar support .include <bsd.port.options.mk> .if ${PORT_OPTIONS:MBAR} LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar .endif
Правильным способом является проверка переменных параметров. Этот способ не приводит к несоответствиям в индексе набора портов, поскольку параметры определены до построения индекса. При этом можно использовать простые скрипты для автоматизации построения, установки и обновления этих портов и соответствующих им пакетов.
Переменные USE_
задаются мейнтейнером
порта для определения программного обеспечения, от которого
этот порт зависит. Порт, для которого нужен Firefox,
укажет
USE_FIREFOX= yes
Некоторые переменные USE_
могут
принимать номера версий или другие параметры. Например,
порт, который требует Apache 2.2, укажет
USE_APACHE= 22
В некоторых случаях для большего контроля над
зависимостями используются переменные
WANT_
, которые позволяют указывать
требования в более точной форме. Например, взгляните на порт
mail/squirrelmail. Этому
порту нужны несколько модулей PHP, которые перечислены в
переменной USE_PHP
:
USE_PHP= session mhash gettext mbstring pcre openssl xml
Эти модули доступны в версиях CLI и web, поэтому версия
web выбрана с переменной WANT_
:
WANT_PHP_WEB= yes
Имеющиеся переменные USE_
и
WANT_
определены в файлах в
/usr/ports/Mk
.
Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.