Рашид Ачилов
Создаем порт для FreeBSD своими руками
Часть I: основные возможности
Автоматизированная система сборки стороннего программного обеспечения из исходных текстов (система портов) - это то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и этот список постоянно пополняется. Кто их создает - эти пополнения - некие выдающиеся специалисты? Да вовсе нет. Вы тоже сможете стать одним из них.
Рашид Ачилов
Споры о том, что правильнее - собирать программы руками или использовать для этого порты, в эхо-конференции FidoNet RU.UNIX.BSD не утихают никогда. Они могут стихнуть на время, но затем кто-нибудь снова задаст такой вопрос, и они разгораются с новой силой.
И рано или поздно каждый приходит к мнению, что использовать порты удобнее, потому что:
• Система сама ведет список файлов, входящих в порт, что позволяет просто удалить программу, не заботясь о том, что на диске останутся «хвосты».
• Система сохраняет контрольную сумму MD5 по каждому файлу, что позволяет проверить его подлинность в случае возникновения сомнения, а также при удале нии программы. Поскольку при удалении порта проверяются контрольные суммы файлов, его составляющих, система не удалит файл, если его контрольная сумма не совпадает с записанной. Это исключает ситуацию, когда тщательно настроенный, но как обычно нигде не зарезервированный конфигурационный файл программы пропадает при ее удалении.
• Система отслеживает выход новых версий программы (это верно только для портов, которые сопровождаются кем-то еще, а не вами. О своевременном обновлении вашего порта вы должны заботиться сами).
• Значительно проще ответить на вопрос «Установлена ли у меня эта программа?» или «Где у меня такой-то файл от такой-то программы?»
Основные моменты того, как устроена система портов и как с ней эффективно работать, изложены в [1], здесь я приведу только ее краткое описание, необходимое для понимания статьи. Система портов или «коллекция портов» представляет из себя древовидную структуру каталогов, которая обычно размещается в /usr/ports. Имена каталогов первого уровня (находящиеся непосредственно в /usr/ports) образуют наименования «категорий», то есть тематических групп. Например, есть категория mail, в которую входят все программы, связанные с обработкой электронной почты, есть категория dns и т. д. Решение о создании новой категории принимает FreeBSD Team, которая создает на первичных зеркалах новый каталог, переносит в него нужные порты, откуда изменения расходятся по вторичным зеркалам и обычным серверам. Перед тем как приступить к созданию порта, необходимо решить, к какой категории относится программа, которую предстоит внести в дерево портов. Имена категорий и их краткое описание приведено в [2]. Внутри каталога категории размещаются непосредственно порты - по одному в каждом отдельном каталоге. Такая структура несколько замедляет навигацию, когда в каталоге находится много файлов, и именно поэтому постоянно появляются новые и новые категории.
Из чего, собственно, состоит порт для FreeBSD?
Порт для FreeBSD состоит из нескольких файлов, которые сами по себе ничего не делают. Даже несмотря на то, что один из них называется Makefile, все они представляют из себя файлы данных - описания и определения некоторых переменных, используемых системой портов в качестве исходных данных. Механизм работы системы давным-давно отлажен, в простейшем случае необходимо только задать исходные данные. Ниже приводится список файлов, которые необходимы для порта (на самом деле порт может использовать и другие файлы, но они не являются необходимыми):
• Makefile - основной файл порта. В нем задаются все необходимые переменные, которые настраивают работу системы портов в том или ином режиме. Также в этом файле может программироваться собственно поведение системы в той или иной ситуации. Текстовый файл, стандартного формата, распознаваемого программой BSD make (не путать с GNU make! О синтаксисе файлов BSD make см. man make). Данный файл условно делится на четрые секции, которые должны идти строго друг за другом, не нарушая порядка. Определения переменных, которые должны появляться в данной секции, не должны появляться ни в предыдущей, ни в последующей секции. Порядок секций таков: начальная секция -> секция MAINTAINER -> секция USE_* -> секция доопределений.
• Начальная секция идет самой первой. В нее помещаются переменные PORTNAME, PORTVERSION, CATEGORIES, MASTER_SITES и DISTNAME. Также в нее могут быть помещены другие переменные, полный перечень которых приведен в файле bsd.port.mk.
• Секция MAINTAINER идет непосредственно после начальной секции. Как правило, она содержит только две переменные - MAINTAINER и COMMENT. Смысл этой секции в том, что она определяет персону, отвечающую за данный порт, и дает краткое описание этого порта. В целях безопасности все запросы на патчи (да и сами патчи тоже), пришедшие для уже принятого порта не с адреса, указанного в поле MAINTAINER, а с другого адреса, перенаправляются MAINTAINER на утверждение и вносятся в порт только в том случае, если будут им одобрены.