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

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

4.10.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).

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

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

4.10.2. RUN_DEPENDS

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

Например,

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

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

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

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

4.10.3. BUILD_DEPENDS

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

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

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

4.10.4. FETCH_DEPENDS

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

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

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

4.10.5. DEPENDS

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

4.10.6. Переменные зависимостей общего вида

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

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

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

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

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

    BUILD_DEPENDS=   ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract

всегда будет переходить в каталог с портом JPEG и распаковывать его.

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

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <[email protected]>.
По вопросам связанным с этом документацией, пишите по адресу <[email protected]>.