Дополнение стандартных мишеней очень широко используется для вывода различных сообщений в процессе сборки порта, создания каких-либо файлов и т. д. Например:

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. 

Mountsmb2

Набор скриптов mountsmb2 (там их три) был написан мной достаточно давно и преследовал тольк одну цель – автоматически монтировать SMB/CIFS-сетевые ресурсы от других Samba-серверов и компьютеров под управлением Windows. Поскольку это скрипт, написанный на языке командной оболочки sh, то никакой сборки порта не требуется и именно поэтому этот порт будет рассмотрен в качестве примера.

PORTNAME= mountsmb2

PORTVERSION= 0.90.1

CATEGORIES= sysutils net

MASTER_SITES= ftp://ftp.granch.ru/pub/other/

MAINTAINER= shelton@granch.ru

COMMENT= SMB/CIFS shares mounting scripts to do it at login

RUN_DEPENDS= findsmb:${PORTSDIR}/net/samba3 \

sudo:${PORTSDIR}/security/sudo \

gawk:${PORTSDIR}/lang/gawk

USE_BZIP2= yes

NO_BUILD= yes

.include <bsd.port.pre.mk>

do-install:

.for i in smb2awk smb2nsmbrc mountsmb2

${INSTALL_SCRIPT} ${WRKSRC}/${i} ${PREFIX}/bin

.endfor

-@${MKDIR } ${EXAMPLESDIR}

.for i in sudoers .login .nsmbrc .mssmbrc

${INSTALL_DATA} ${WRKSRC}/${i} ${EXAMPLESDIR}

.endfor

-@${MKDIR } ${DOCSDIR}

${INSTALL_DATA} ${WRKSRC}/README.FreeBSD

${DOCSDIR}

@${SED} -e "s,%%EXAMPLESDIR%%,${EXAMPLESDIR},g" -i .old ${PKGMESSAGE}

@${CAT} ${PKGMESSAGE}

@${RM} -f ${PKGMESSAGE}

@${MV} ${PKGMESSAGE}.old ${PKGMESSAGE}

.include <bsd.port.post.mk>

В RUN_DEPENDS перечисляются все порты, от которых зависит данный скрипт, а именно GNU AWK, sudo и Samba, из которой на самом деле нужна только программа findsmb. «USE_BZIP2=yes» указывает на то, что дистрибутив упакован программой bzip2. «NO_BUILD=yes» указывает на то, что программа не требует сборки. Если этого не указать, то система будет пытаться выполнить команду make в каталоге порта, не найдет Makefile и аварийно завершится.

Инсталляцией порт управляет самостоятельно – в Makefile присутствует заменяющая подмишень do-install. Здесь хорошо видно, как можно организовать цикл, который установит несколько файлов, перечисленных в списке, в указанное место. После первого цикла, который устанавливает собственно скрипты идет команда создания каталога для документации – система сама не будет делать ничего, все необходимые каталоги должны быть созданы портом.

Такая странная форма записи команды означает что:

• если команда завершается неудачно, например, такой каталог уже существует, то make не прекращает работу (минус перед командой);

• команда не отображается на терминале (знак @ перед командой).

Потом идет второй цикл, который устанавливает файлы примеров в каталог, который для этого предварительно создается, создается каталог документации и в него копируется файл README.FreeBSD.

Команда sed подготавливает файл pkg-message к отображению. В файле, который распространяется вместе с портом присутствует макроподстановка %%EXAMPLESDIR%%, которая, перед тем как это сообщение будет показано пользователю, заменяется на значение переменной ${EXAMPLESDIR}. Чтобы не изменять оригинальный файл pkg-message (возможно, в следующий раз установка будет проходить с другим значением ${EXAMPLESDIR}), старый файл сохраняется, измененный файл удаляется, старый файл переименовывается в оригинальное имя. Порт несложный, но он демонстрирует, как можно использовать заменяющие подмишени. При создании таких портов следует быть предельно внимательными – помните, что любой каталог, не входящий в стандартное дерево каталогов, описанное в bsd.local.mk, имеет право не существовать и должен быть предварительно создан. 

Модификация порта OpenOffice 1.1.4

С моей точки зрения, порт для сборки OpenOffice editors/openoffice имел множество недостатков, но эти изменения я никогда не пробовал отправить во FreeBSD Team для помещения их в дерево портов. Какие изменения были внесены мной:

• возможность отказаться от сборки Mozilla Suite, нужной только для работы с адресной книгой формата Mozilla;

• возможность загрузить и применить последний (на тот момент) файл локализации интерфейса;

• возможность загрузить и применить внешние патчи, созданные в «Инфра-Ресурс» для версии для Linux.

Порт на самом деле состоит из двух файлов – editors/openoffice-1.1 и russian/openoffice. Makefile порта russian/openoffice-1.1 достаточно прост:

CATEGORIES= russian

.if !defined (LANG) && !defined(USE_LANG)

USE_LANG= ru_RU.KOI8-R

.endif

LANG_LIST= ru_RU.KOI8-R uk_UA.KOI8-U

LANG_PKGNAME= ru

LANG_EXT= 07

LANG_CONFIGURE_ARG= RUSS

MASTERDIR= ${.CURDIR}/../../editors/openoffice-1.1

USE_RUSSIAN_GSI= yes

USE_INFRA_PATCHSET= yes

.include "${MASTERDIR}/Makefile"

При запуске make в каталоге editors/openoffice-1.1 получаем OpenOffice c английским интерфейсом и справкой, при запуске в каталоге russian/openoffice – с русским интерфейсом. Достигается это таким же образом, как любой порт включает в себя bsd.port.mk, – командой .include. Только здесь параметром команды является имя так называемого «мастер-порта», то есть порта, в котором делается вся обработка. Это очень широко распространённый прием для крупных проектов – создается один мастер-порт и несколько портов, в которых только определяются некоторые переменные. Так работают postgresql, openldap, php и множество других портов. В приведенном выше примере мной были добавлены переменные «USE_RUSSIAN_GSI=yes» и «USE_INFRA_PATCHSET=yes», использование которых будет видно в коде из основного порта. Основной порт чересчур громоздок, чтобы приводить его весь, я приведу только некоторые фрагменты.


Перейти на страницу:
Изменить размер шрифта: