Как уже говорилось выше, это просто текстовый файл с небольшим описанием того, что делает данная программа. Чтобы не сочинять самому описание, в нашем случае мы просто берем описание, приведенное автором на странице kde-apps и заносим его в этот файл, сопровождая ссылкой на собственно страницу программы (файл см. на сайте журнала в разделе «Исходный код»).

На этом этап первоначального формирования файлов можно считать законченным. Мы еще не сформировали distinfo, но он формируется автоматически после того, как порт будет проверен. Переходим к проверке порта.

Для проверки правильности написания файлов порта существует специальная программа portlint, которую необходимо установить каждому, кто собирается заниматься разработкой собственных портов. Это небольшой скрипт, написанный на языке Perl, устанавливается он из devel/portlint:

cd /usr/ports/devel/portlint

make all install

После установки запускаем portlint в текущем каталоге с ключами, которые включают все возможные проверки:

# portlint -abvtAN

. . .

WARN: /usr/ports/mail/contactsmenu/pkg-plist [4]: installing gettext translation files, please define USE_GETTEXT as appropriate

. . .

0 fatal errors and 9 warnings found.

Здесь приведена часть вывода portlint, в которой выводится замечание. В последней строке приводится итог - сколько ошибок и сколько замечаний было обнаружено. Отмечу сразу, что необходимо добиться устранения всех ошибок и желательно всех замечаний. В данном случае portlint предупреждает о том, что устанавливаются файлы сообщений gettext, но в порт не включено неявной зависимости от devel/gettext (это может привести к невозможности работы с данными файлами). Для исправления данной ситуации добавляем в секцию USE_* строку «USE_GETTEXT=YES» и повторно запускаем portlint.

# portlint -abvtAN

. . .

WARN: Makefile: Consider adding support for a WITHOUT_NLS knob to conditionally disable gettext support.

. . .

WARN: Makefile: only one MASTER_SITE configured. Consider adding additional mirrors.

. . .

0 fatal errors and 2 warnings found.

Что нам советуют сейчас? Добавить поддержку параметра WITHOUT_NLS для тех, кто не хочет устанавливать файлы языковых сообщений и увеличить количество зеркал, на которых размещен данный файл. Здесь надо заметить, что любой дистрибутив порта после его принятия в систему дополнительно зеркалится на сайте проекта FreeBSD, так что замечание о дополнительных зеркалах мы игнорируем, а вот замечание о WITHOUT_NLS исправим. Для этого добавим в Makefile следующий код:

.if defined(WITHOUT_NLS)

PLIST_SUB+= NLS="@comment "

.else

USE_GETTEXT= yes

PLIST_SUB+= NLS=""

.endif

а в файле pkg-plist изменим строки, описывающие файлы языковой поддержки таким образом:

%%NLS%%share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/de/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu. mo

%%NLS%%share/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu. mo

Как это будет работать? Параметр PLIST_SUB содержит список подстановок, которые выполняются, когда система обрабатывает файл pkg-plist. Если при сборке порта будет задан параметр «WITHOUT_NLS=yes», то в pkg-plist будет подставлено значение, превращающее строки с «%%NLS%%» в строки комментария. Обратите внимание, что в этом случае зависимость от devel/gettext не вставляется. В противном случае NLS принимает значение пустой строки, и зависимость от devel/gettext вставляется. Этот прием (модификация pkg-plist в зависимости от параметров сборки порта) является очень широко распространенным.

Запускаем portlint еще раз, получаем одно замечание про MASTER_SITES, которое игнорируем. Осталось создать файл distinfo. Это просто. Система сама его создаст, если ее об этом попросить:

# make makesum

Созданный файл имеет следующий вид:

MD5 (34479-contactsmenu-0.3.4b.tar.bz2) =

65af4e3103c906edl3508bflb2dd217a

SHA256 (34479-contactsmenu-0.3.4b.tar.bz2) =

88e05096b2f9C8d659be61daed5e6da977a056033a52c79789dade217709afee

SIZE (34479-contactsmenu-0.3.4b.tar.bz2) = 457076

Теперь пробуем собрать программу, используя порт. Для проверки правильности составления файла pkg-plist в качестве корневого каталога сборки назначим /tmp/1 (после деинсталляции программы не должно оставаться файлов или каталогов, которые она создает).

# make PREFIX=/tmp/l

=> Vulnerability check disabled, database not found

=> Extracting for contactsmenu-0.3.4b

=> MD5 Checksum OK for 34479-contactsmenu-0.3.4b.tar.bz2.

=> SHA256 Checksum OK for 34479-contactsmenu-0.3.4b.tar.bz2.

=> Patching for contactsmenu-0.3.4b

=> contactsmenu-0.3.4b depends on file: /usr/XllR6/qt33/bin/moc - found

=> contactsmenu-0.3.4b depends on executable: gmake - found

=> contactsmenu-0.3.4b depends on shared library: kfontinst - found

=> contactsmenu-0.3.4b depends on shared library: kimproxy - found

=> contactsmenu-0.3.4b depends on shared library: intl - found

=> Configuring for contactsmenu-0.3.4b

=> Building for contactsmenu-0.3.4b

cd: can't cd to /usr/ports/mail/contactsmenu/work/34479-contactsmenu-0.3.4b

*** Error code 2

Stop in /usr/ports/mail/contactsmenu.

Вот мы и получили первую ошибку. Она связана с некоторой бестолковостью имен дистрибутивных файлов на http://www.kde-apps.org, когда сам файл имеет имя с числом впереди, а каталог, упакованный внутри него, - без этого числа. Для решения этой проблемы следует указать системе, что имя каталога, в которую будет распакован дистрибутив, будет задано вручную. После (!!) переменной MAINTAINER впишем следующую строчку:

WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}

указывая таким образом, что дистрибутив будет распакован в каталог с именем, состоящим из имени и номера версии пакета. Повторяем сборку. Сборка проходит нормально. Запускаем установку. Видим, что в каталоге /tmp/1 появились все нужные файлы. Создаем пакет с помощью pkg_create (хотя можно то же самое проделать через make package):

# cd /var/db/pkg

# pkg_create -b contactsmenu-0.3.4b

Проверяем файл +CONTENTS внутри архива - под каждой строчкой, описывающей файл программы, должна располагаться строчка комментария с контрольной суммой:

Iib/kde3/kickermenu_contactsmenu.so

@comment MD5:fd3cf198770bac4elb8453f3ba2d6f90

Iib/kde3/kickermenu_contactsmenu.la

@comment MD5:4de2541c36ea248066aecb851aedbbe5

Если такой строчки нет - значит, в файле pkg-plist ошибка - при установке файл не был найден. Это может быть тривиальная опечатка или же ошибка в Makefile, при которой в pkg-plist был вставлен файл, отсутствующий в данной конфигурации.

Проверяем удаление пакета через plg_delete (или make deinstall в каталоге порта). При удалении не должно выдаваться сообщений о том, что файл не найден. Если такие сообщения выдаются, значит файл pkg-plist содержит ссылки на файлы, которые на самом деле не были установлены.

Ну вот, все проверки проделаны. Что дальше?

Последним этапом нашей работы будет отправка порта во FreeBSD Team и получение оттуда ответа об успешном помещении его в дерево портов или сообщение об ошибке. Порядок действий при этом такой:

• Удаляется каталог work и все файлы, которые не входят в отсылаемый порт (отладка и пр.).

• Создается shell-архив командой «shar 'find contactsmenif». При это нужно находиться в корневом каталоге категории (в нашем случае/usr/ports/mail), а не в каталоге порта!

• Shell-архив отсылается во FreeBSD Team с помощью ко манды send-pr (помните, что email в поле MAINTAINER должен совпадать с email в поле From:, иначе замучают расспросами). О том, как использовать send-pr см. man send-pr. Некоторая информация о том, как отправить порт приведена также в [].

• Дожидаетесь ответа от одного из коммиттеров FreeBSD о том, что порт успешно помещен в дерево портов или же о том, что при тестировании порта возникли ошибки. Все присылаемые в FreeBSD Team порты тестируются ими на предмет правильной сборки, установки и удаления под всеми поддерживаемыми в данный момент ветками FreeBSD. Сообщение об ошибке может выглядеть, например так:

Synopsis: [maintainer-update] Updating mail/sccmilter up to 0.94.9 version

State-Changed-From-To: open->feedback

State-Changed-By: krion

State-Changed-When: Fri Feb 18 14:33:28 GMT 2005

State-Changed-Why:

It does not honour PREFIX, it's not very critical since it builds

for LOCALBASE,

but I'd like to see the PREFIX honoured though.

cc -pthread -L/var/tmp/ttt/lib -L.libs -o sccmilter sccmilter.o globals.o utilites.o mlficatch.o parseconfig.о commandline.о -lmilter -lconf /usr/bin/ld: cannot find -lconf

679

В этом сообщении всегда указывается причина ошибки и диагностика. Все общение с FreeBSD Team происходит, естественно, на английском языке, несмотря на то, что есть и русскоязычные коммиттеры (например, письмо, приведенное выше, получено от Кирилла Пономарева ([email protected]). Сообщение об успешном помещении в дерево портов может выглядеть так:

Synopsis: new port: sysutils/spassgen

State-Changed-From-To: open->closed

State-Changed-By: pav

State-Changed-When: Sat Jul 31 09:26:28 GMT 2004

State-Changed-Why:

New port added, thank you!

После чего останется только обновить дерево портов и убедиться, что да, на самом деле порт в нем присутствует. С этого момента майнтайнер порта отвечает за его актуальное состояние- своевременное обновление в соответствии с новыми версиями программы, внесение нужных патчей и удаление устаревших. Как скоро ожидать ответа от FreeBSD Team? На этот вопрос трудно дать определенный ответ. Иногда они реагируют буквально в течение недели, а иногда приходится ждать несколько месяцев. Внесения в дерево своего первого порта, kavmilter, я ждал больше года, а например, spassgen прошел за неделю.

Кроме того, FreeBSD Team временами самостоятельно вносит некоторые изменения в файлы портов, когда проводится какая-либо глобальная модификация системы в целом. Если вдруг по каким-либо причинам порт перестанет собираться, майнтайнеру будет отправлено соответствующее извещение. Если майнтайнер не устранит ошибку и не пришлет соответствующий патч, исправляющий ситуацию, порт может быть помечен как BROKEN. Как правило, порты, помеченные как BROKEN, удаляются из дерева если они находятся в таком состоянии более 3 месяцев.