Опции
Опции
Если программа сложная, то, как правило она предлагает множество различных вариантов построения — с использованием такой-то возможности, без использования такой-то возможности… Некоторые порты сначала проводят «автоматическое обнаружение» некоторых задействуемых компонент, а уже потом устанавливают переменные, включающие или отключающие различные возможности, а некоторые оставляют это на усмотрение пользователя. Если пользователь об этом не подозревает, то он может так никогда ими и не воспользоваться. Одним из примеров того, как делать ни в коем случае не надо, я считаю порт graphics/ImageMagick. Мало того, что там 26 переменных, так еще пользователь даже не оповещается, что они вообще есть!
Рисунок 1. Появилась возможность задавать опции в полноэкранном текстовом режиме
В результате строка запуска сборки порта может выглядеть, например, таким образом:
# make WITHOUT_IMAGEMAGICK_JPEG=yes WITH_WINDOWS_FONT_DIR=/tmp/blabla WITHOUT_IMAGEMAGICK_PNG=yes WITHOUT_IMAGEMAGICK_BZIP2=yes…
Кроме того, что это просто очень долго набирать, попробуйте-ка вспомнить, какие там опции задавались при предыдущей сборке полгода назад? Разумеется, это крайне неудобно, и некоторое время назад в системе появилась возможность задавать опции в полноэкранном текстовом режиме (см. рис. 1).
Все опции, перечисленные на экране, задаются и отменяются простым нажатием пробела, результат выбора будет сохранен и использован при последующих сборках порта. В любое время его можно изменить, выполнив команду:
# make config
Формируется экран опций следующей командой в Makefile:
OPTIONS= LDAP "With LDAP support" on
ADS "With Active Directory support" off
CUPS "With CUPS printing support" on
WINBIND "With WinBIND support" on
ACL_SUPPORT "With ACL support" off
SAM_XML "SAM with XML support" off
Первый параметр задает имя опции, которое потом будет использовано в переменной WITH_*. Например, для первого параметра имя переменной будет WITH_LDAP. Второй параметр задает текст комментария, который будет выведен справа от соответствующей опции, и третий — значение по умолчанию. При указании «on» опция по умолчанию включена, при указании «off» — выключена.
Хорошо, опции заданы. Как их обработать?
Прежде всего необходимо отметить, что при использовании OPTIONS включение файла bsd.port.mk следует заменить на:
include <bsd.port.pre.mk>
# processing WITH_SOMEWHERE here
include <bsd.port.post.mk>
иначе ни одна переменная WITH_SOMEWHERE распознана не будет. Обработка же переменных выполняется стандартным образом — с помощью условия if задаются дополнительные параметры для configure, зависимости, подстановки для pkg-plist и т. д.
if defined(WITH_SAM_XML)
LIB_DEPENDS+= xml2.5:${PORTSDIR}/textproc/libxml2
CONFIGURE_ARGS+= — with-xml-prefix=${LOCALBASE}
WANT_EXPSAM_MODULES+= xml
PLIST_SUB+= SAMXML=""
else
PLIST_SUB+= SAMXML="@comment»
endif
Комбинация проверяемых условий может быть довольно сложной. В качестве примера того, как могут использоваться значения опции, лучше всего рассматривать порт net/samba3 — в нем очень много опций, есть на что посмотреть.
Ну и наконец самый интересный раздел — замена/дополнение стандартных обработчиков Makefile при сборке порта. Как уже было сказано в [1], сборка порта состоит из последовательности выполнения ряда мишеней, которые в свою очередь делятся на подмишени pre-something, do-something и post-something (есть еще специальные мишени, описание их см в bsd.port.mk). Для чего это было сделано? Для того чтобы иметь возможность воздействия на процесс создания порта — что-нибудь изменить, вывести сообщение, создать файл или каталог и т. д. Как следует из названия, подмишени pre-somethnig и post-something выполняются соответственно до и после мишени something. Например, последовательность распаковки будет такова: pre-extract, do-extract, post-extract. При этом, если подмишень do-something не описана, будет выполняться стандартная системная обработка. Обратите внимание, что, если мишень do-something описана, она замещает стандартную мишень и вся ответственность за выполнение данного шага ложится на майнтайнера порта, то есть, например, даже если в Makefile, идущем с программой, есть мишень install, то при наличии в Makefile порта подмишени do-install мишень install из Makefile программы не будет выполнена никогда!
Дополнение стандартных мишеней очень широко используется для вывода различных сообщений в процессе сборки порта, создания каких-либо файлов и т. д. Например:
pre-extract:
@${ECHO_MSG} ""
@${ECHO_MSG} "For debugging information support you should specify"
@${ECHO_MSG} "WITH_DEBUG=yes (press Ctrl-C here and start make WITH_DEBUG=yes)"
@${ECHO_MSG} ""
@sleep 2
post-deinstall:
@${ECHO_MSG} ""
@${ECHO_MSG} "Do not forget delete filter description from /etc/mail/freebsd.mc"
@${ECHO_MSG} "and rebuild sendmail.cf file!"
@${ECHO_MSG} ""
pre-configure:
if defined(WITHOUT_RC_NG)
@${SED} — e "s=%%PREFIX %%=${PREFIX}=" ${FILESDIR}/milter-sid.sh
> ${WRKSRC}/milter-sid.sh
endif
Заменять обработчики мишеней (создавать секции do-something)[2] не рекомендует, но тем не менее это единственный путь для установки программ с закрытым исходным кодом, а также скриптов и программ, упакованных нестандартным образом. Например, мне встречалась программа, дистрибутив которой был упакован в архив формата ZIP, внутри котрого находился архив. tar.bz2 и файл сигнатуры. sig. Для распаковки нужно было сначала распаковать архив ZIP, потом проверить сигнатуру, а только потом — распаковывать. tar.bz2.
Но довольно теории. Рассмотрим в качестве примеров два порта, которые были мной созданы в разное время — порт для скрипта монтирования сетевых ресурсов Windows при входе в систему mountsmb2 и доработка к порту OpenOffice 1.1.4.