Создаем порт для FreeBSD своими руками. Часть I
Создаем порт для FreeBSD своими руками. Часть I читать книгу онлайн
Автоматизированная система сборки стороннего программного обеспечения из исходных текстов (система портов) - это то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и этот список постоянно пополняется. Кто их создает - эти пополнения - некие выдающиеся специалисты? Да вовсе нет. Вы тоже сможете стать одним из них.
Рашид Ачилов
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Файл pkg-descr
Как уже говорилось выше, это просто текстовый файл с небольшим описанием того, что делает данная программа. Чтобы не сочинять самому описание, в нашем случае мы просто берем описание, приведенное автором на странице 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 был вставлен файл, отсутствующий в данной конфигурации.