Chapter 3. Медленное портирование

Table of Contents
3.1. Как всё это работает
3.2. Получение исходного кода
3.3. Модификация порта
3.4. Создание патчей
3.5. Конфигурирование
3.6. Обработка пользовательского ввода

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

3.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.

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

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

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