Руководство FreeBSD по созданию портов
Пред. | Глава 6. Особые соглашения | След.

# 6.3. Механизмы построения

## 6.3.1. Параллельное построение портов

Инфраструктура портов FreeBSD поддерживает параллельное построение с использованием множественных подпроцессов `make`, что позволяет системам SMP задействовать всю доступную мощность CPU, тем самым делая построение портов более быстрым и эффективным.

Это достигается путем передачи флага `-jX` команде make(1). К сожалению, не все порты поддерживают параллельную сборку достаточно хорошо. Поэтому требуется включать этот механизм явным образом путем добавления строки `MAKE_JOBS_SAFE=yes` в `Makefile` где-нибудь после раздела с объявлениями зависимостей.

Другой опцией управления этим механизмом с точки зрения сопровождающего является `MAKE_JOBS_UNSAFE=yes`. Эта переменная используется в случае, когда известно, что порт ломается с `-jX`, и пользователь форсирует использование многопроцессорной компиляции для всех портов с переменной `FORCE_MAKE_JOBS=yes` в `/etc/make.conf`.

## 6.3.2. `make`, `gmake` и `imake`

Если ваш порт использует GNU make, то установите `USE_GMAKE=yes`.

Таблица 6-1. Переменные для портов, использующих gmake

Переменная | Значение
--- | ---
`USE_GMAKE` | Для сборки порта требуется `gmake`.
`GMAKE` | Полный путь к команде `gmake`, если отсутствует в `PATH`.

Если ваш порт является приложением X, которое создает файлы `Makefile` из `Imakefile`, используя imake, то установите `USE_IMAKE=yes`. Это заставит стадию конфигурирования автоматически выполнить `xmkmf -a`. Если флаг `-a` представляет для вашего порта проблему, то установите `XMKMF=xmkmf`. Если порт использует imake, но не понимает цель `install.man`, то следует установить `NO_INSTALL_MANPAGES=yes`.

Если исходный `Makefile` вашего порта имеет что-нибудь помимо `all` в качестве основной цели построения, то задайте соответствующее значение `ALL_TARGET`. То же касается `install` и `INSTALL_TARGET`.

## 6.3.3. Сценарий `configure`

Если ваш порт использует сценарий `configure` для получения файлов `Makefile` из файлов `Makefile.in`, то установите `GNU_CONFIGURE=yes`. Если вы хотите дать дополнительные параметры сценарию `configure` (аргументом по умолчанию является `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}`), установите эти параметры в `CONFIGURE_ARGS`. Дополнительные переменные окружения можно передать, используя переменную `CONFIGURE_ENV`.

Таблица 6-2. Переменные для портов, использующих `configure`

Переменная |
`GNU_CONFIGURE` | Порт использует сценарий `configure` для подготовки построения.
`HAS_CONFIGURE` | То же, что и `GNU_CONFIGURE`, кроме того, что цель configure по умолчанию не добавляется в `CONFIGURE_ARGS`.
`CONFIGURE_ARGS` | Дополнительные параметры, передаваемые сценарию `configure`.
`CONFIGURE_ENV` | Дополнительные переменные окружения, задаваемые для запуска сценария `configure`.
`CONFIGURE_TARGET` | Переопределить цель configure по умолчанию. Значением по умолчанию является `${MACHINE_ARCH}-portbld-freebsd${OSREL}`.

## 6.3.4. Использование `scons`

Если ваш порт использует SCons, определите `USE_SCONS=yes`.

Таблица 6-3. Переменные для портов, использующих `scons`

Переменная | Значения
--- | ---
`SCONS_ARGS` | Специфичные для порта флаги SCons, передаваемые окружению SCons.
`SCONS_BUILDENV` | Переменные для установки в системном окружении.
`SCONS_ENV` | Переменные для установки в окружении SCons.
`SCONS_TARGET` | Последний параметр для передачи SCons, похожий на `MAKE_TARGET`.

Для того, чтобы сторонний `SConstruct` соответствовал всему, что передается SCons в переменной `SCONS_ENV` (самое главное, это `CC/CXX/CFLAGS/CXXFLAGS`), примените патч к `SConstruct`, так чтобы переменная построения `Environment` выглядела следующим образом:

    env = Environment(**ARGUMENTS)

В дальнейшем ее можно изменить при помощи `env.Append` и `env.Replace`.

Пред. | Начало | След.
Порты с ограничениями на распространение | Уровень выше | Использование GNU autotools

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