Руководство FreeBSD по созданию портов
Пред. |  | След.

# Глава 4. Медленное портирование

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

# 4.1. Как всё это работает

Во-первых, когда пользователь дает в своем каталоге с портом команду `make`, происходит целая череда событий. Во время чтения этого текста может оказаться полезным иметь файл `bsd.port.mk` открытым в другом окне, что сильно поможет в их понимании.

Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в `bsd.port.mk`, не так уж много людей его понимает... :->

1. Запускается цель `fetch`. Цель `fetch` отвечает за то, что архив исходных текстов имеется в наличии локально в каталоге `DISTDIR`. Если цель `fetch` не может найти требуемые файлы в каталоге `DISTDIR`, то он будет искаться по указателю URL `MASTER_SITES`, который устанавливается в Makefile, а также на нашем основном FTP-сервере по адресу ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/, куда мы по возможности помещаем дистрибутивные файлы для архива. Затем она попытается сгрузить указанный файл с помощью `FETCH`, полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если файл скачается удачно, то он будет помещен в каталог `DISTDIR` для последующего использования и обработки.

2. Выполняется цель `extract`. Она ищет дистрибутивный файл порта (как правило, tar-архив gzip) в каталоге `DISTDIR` и распаковывает его во временный каталог, задаваемый переменной `WRKDIR` (по умолчанию `work`).

3. Выполняется цель `patch`. Во-первых, применяются все патчи, заданные переменной `PATCHFILES`. Во-вторых, если какие-либо файлы с патчами, носящие имена `patch-`*``, имеются в подкаталоге `PATCHDIR` (по умолчанию это каталог `files`), то они применяются в этот момент в алфавитном порядке.

4. Запускается цель `configure`. Здесь может выполняться любая из многих различных вещей.

   1. Если существует скрипт `scripts/configure`, то он запускается.

   2. Если задана переменная `HAS_CONFIGURE` или `GNU_CONFIGURE`, то запускается скрипт ``WRKSRC`/configure`.

   3. Если задана переменная `USE_IMAKE`, то запускается команда `XMKMF` (по умолчанию это `xmkmf -a`).

5. Выполняется цель `build`. Она отвечает за переход в собственный рабочий каталог порта (`WRKSRC`) и его построение. Если задана переменная `USE_GMAKE`, будет использоваться GNU-версия утилиты `make`, в противном случае будет использована системная утилита `make`.

Выше перечислены стандартные действия. Кроме того, вы сами можете определить цели `pre-`что-то`` или `post-`что-то``, или создать скрипты с такими именами в подкаталоге `scripts`, и они будут запущены до или после выполнения действий по умолчанию.

Например, если у вас есть цель `post-extract`, определённая в вашем файле `Makefile` и файл `pre-build` в подкаталоге `scripts`, то после выполнения обычных действий по распаковке, будет вызвана цель `post-extract` а скрипт `pre-build` будет выполнен перед запуском стандартных правил построения. Рекомендуется использовать цели из `Makefile`, если действия достаточно просты, потому что в дальнейшем будет проще определить, какие нестандартные действия требует порт.

Действия по умолчанию выполняются целями `do-`что-то`` из `bsd.port.mk`. Например, команды для распаковки порта находятся в цели `do-extract`. Если вам не хватает цели по умолчанию, вы можете ее исправить, переопределив цель `do-`something`` в вашем файле `Makefile`.

> Замечание: ``Основные'' цели (к примеру, `extract`, `configure` и так далее) не делают ничего больше, чем проверяют успешность завершения всех предыдущих шагов и вызывают настоящие цели или скрипты, и их не нужно менять. Если вам нужно изменить распаковку, исправляйте `do-extract`, но никогда не меняйте способ работы `extract`!

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

Пред. | Начало | След.
Посылка порта |  | Получение исходного кода

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