Создаем порт для FreeBSD своими руками. Часть II - Страница 3

Изменить размер шрифта:

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

pre-extract:

@$ ""

@$ "For debugging information support you should specify"

@$ "WITH_DEBUG=yes (press Ctrl-C here and start make WITH_DEBUG=yes)"

@$ ""

@sleep 2

post-deinstall:

@$ ""

@$ "Do not forget delete filter description from /etc/mail/freebsd.mc"

@$ "and rebuild sendmail.cf file!"

@$ ""

pre-configure:

.if defined(WITHOUT_RC_NG)

@$ -e "s=%%PREFIX%%=$=" $/milter-sid.sh

> $/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= [email protected]

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

RUN_DEPENDS= findsmb:$/net/samba3

sudo:$/security/sudo

gawk:$/lang/gawk

USE_BZIP2= yes

NO_BUILD= yes

.include

do-install:

.for i in smb2awk smb2nsmbrc mountsmb2

$ $/$ $/bin

.endfor

[email protected]${MKDIR } $

.for i in sudoers .login .nsmbrc .mssmbrc

$ $/$ $

.endfor

[email protected]${MKDIR } $

$ $/README.FreeBSD

$

@$ -e "s,%%EXAMPLESDIR%%,$,g" -i .old $

@$ $

@$ -f $

@$ $.old $

.include

В 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%%, которая, перед тем как это сообщение будет показано пользователю, заменяется на значение переменной $. Чтобы не изменять оригинальный файл pkg-message (возможно, в следующий раз установка будет проходить с другим значением $), старый файл сохраняется, измененный файл удаляется, старый файл переименовывается в оригинальное имя. Порт несложный, но он демонстрирует, как можно использовать заменяющие подмишени. При создании таких портов следует быть предельно внимательными – помните, что любой каталог, не входящий в стандартное дерево каталогов, описанное в 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 "$/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», использование которых будет видно в коде из основного порта. Основной порт чересчур громоздок, чтобы приводить его весь, я приведу только некоторые фрагменты.

Оригинальный текст книги читать онлайн бесплатно в онлайн-библиотеке Knigger.com