Рашид Ачилов - Создаем порт для FreeBSD своими руками. Часть I
# make install >& install.log
В данном примере для перенаправления в файл и обьединения выводов stdout и stderr используется синтаксис tcsh, в sh необходимо выполнить:
# make install > install.log 2» install.log
Начинаем. Сразу же необходимо иметь в виду, что существует довольно жесткий порядок, в котором в файле Makefile должны появляться определения переменных. В нижеследующем примере приводится правильный порядок и нарушать его не рекомендуется.
Файл Makefile
В соответствии с рекомендациями [4] Makefile должен иметь следующий заголовок:
# New ports collection makefile for: contactsmenu
# Date created: 01 Mar 2006
# Whom: Rashid N. Achilov [email protected]
#
# $FreeBSD$
На этом заголовок кончается.
Внимание! Для впервые отправляемого порта строка $FreeBSD$ должна выглядеть именно так, как показана!
Первыми строками, идущими за заголовком, должны быть следующие:
PORTNAME= contactsmenu
PORTVERSION= 0.3.4b
CATEGORIES= mail kde
Эти три переменные должны идти первыми и именно в том порядке, в котором они приведены. Первая из них задает имя порта. Она должна совпадать с именем каталога с файлами порта. Вторая задает номер текущей версии программы. Именно по ней будет проводится сравнение существующей и установленной версий. Третья перечисляет список категорий, к которым относится данный порт. Выбор категории, а также требования к составлению данного списка приведены в [2].
MASTER SITES= http://www.kde-apps.org/content/files/
Эта переменная должна идти сразу после CATEGORIES. Она задает список сайтов, с которых будет скачиваться дистрибутив программы.
Откуда взять имя дистрибутива и адрес домашнего сайта проекта? Как правило, первоначальная закачка файла производится вручную, следовательно, имя файла и URL исходного сайта всегда можно найти в логах программ, которыми он закачивался. Можно использовать для этого и другие методы, которые я не буду здесь описывать ввиду их чрезвычайно большого разнообразия. Таким образом, если бы имя дистрибутивного файла нашей программы было contactsmenu-0.3.4b.tar.gz, нам бы больше ничего не потребовалось указывать - вся информация для загрузки уже предоставлена. Но не все так просто, потому что имя нашего файла - 34479-contactsmenu-0.3.4b.tar.bz2.
Что делать? Для таких случаев предусмотрено принудительное задание имени дистрибутивного файла, которое должно быть полным, то есть
DISTNAME= 34479-${PORTNAME}-${PORTVERSION}
Включив в нижеследующие секции «USE_BZIP2=YES» мы сформировали полное имя дистрибутивного файла.
Для многих популярных URL типа www.apahe.org, sourceforge.net, www.kde.org и пр. определены специальные макросы, в которых перечислены все URL, на которых можно найти данную программу. Например, если бы данная программа располагалась на сайте sourceforge.net, то строка MASTER_SITES была бы заменена следующей комбинацией:
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER SITE SUBDIR= contactsmenu
что означало бы загрузку файла с сайтов, входящих в заранее определенный список из подкаталога contactsmenu.
MAINTAINER= [email protected]
COMMENT= KDE 3.x addressbook Kicker applet
Эти строки должны идти в том порядке, в котором приведены. MAINTAINER задает адрес электронной почты лица, которое создало и управляет данным портом. COMMENT содержит краткое (одну строчку) описание данного порта.
Внимание! При использовании нескольких адресов электронной почты в поле MAINTAINER должен быть проставлен тот адрес, который будет указан в поле From: во время отправки подготовленных файлов порта командой send-pr. Если в поле MAINTAINER будет указан один адрес, а обновления порта пойдут с другого адреса, придется дополнительно подтверждать, что данное письмо отправлено именно майнтайнером порта, а не является подделкой.
USE_KDEBASE_VER= 3
USE_GMAKE= yes
USE BZIP2= yes
Начинается секция переменных USE_*. Здесь, как правило, перечисляются неявные зависимости, заранее определенные в системе. USE_KDEBASE задает зависимость порта от пакета kdebase3, USE_GMAKE - от пакета gmake, USE_BZIP2 - от пакета bzip2 (и заодно устанавливает EXTRACT_SUFX в «.tar.bz2»).
Что означает «порт X зависит от порта Y»? Это означает, что в соответствии с тем, к какому типу будет отнесена данная зависимость (EXTRACT_DEPENDS, RUN_DEPENDS и т. д., см. bsd.port.mk для полного списка), то на данном этапе построения порта (extract, install и т. д.) система проверит наличие установленного пакета, который указан как зависимость, и если он не установлен, система автоматически перейдет к его установке. В этом проявляется еще одно преимущество системы портов - имея скоростной канал в Интернете и дешевый трафик, можно не думать, например, о том, какие файлы нужны для установки KDE - достаточно перейти в каталог x11/kde и набрать make. Построение правильного списка зависимостей - одна из задач автора порта. Если указать ненужные программы - порт будет пытаться их поставить, что будет забивать систему мусором, если же забыть нужные - порт в лучшем случае не соберется, в худшем - соберется и не будет работать.
GNU_CONFIGURE= yes
CONFIGURE_ARGS += --with-qt-dir=${QT_PREFIX}
--with-extra-includes=${LOCALBASE}/include
--with-extra-libs=${LOCALBASE}/lib
Эти строки должны присутствовать (если они есть) после всех переменных USE_*. Они определяют, что для создания Makefile, управляющего сборкой программы, будет использоваться configure, и задают дополнительные аргументы, передаваемые при вызове configure. При сборке программы configure получает неявные параметры, задаваемые, например, с помощью PREFIX, но может получать и явные параметры, перечисляемые выше.
Ну и последней строкой нашего Makefile обязательно должна быть:
.include <bsd.port.mk>
которая, собственно, и загрузит основной файл. Вот и все, файл, управляющий сборкой программы создан.
Файл pkg-plist
Файл составляется как раз на основе протокола инсталляции install.log, который был сохранен во время установки программы. Следует также учесть, что программы для KDE часто используют локальные скрипты libtool, которые устанавливают динамические библиотеки, используя свои собственные конфигурационные файлы с расширением .la. Поэтому, если в протоколе установки упоминается, например, kickermenu_contactsmenu.la, нужно открыть его (это текстовый файл) и посмотреть, какая же библиотека там используется. Как правило, ее имя совпадает с именем .la файла (в нашем случае kickermenu_contactsmenu.so), но могут быть отличия, в частности, файлов может быть несколько. В файл pkg-plist компоненты программы вписываются по одному в строке, с указанием пути относительно корня установки (по умолчанию /usr/local).
То есть в нашем случае:
Iib/kde3/kickermenu_contactsmenu.so
Iib/kde3/kickermenu_contactsmenu.la
share/apps/kicker/menuext/contactsmenu.desktop
share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/de/LC MESSAGES/libkiekemenu contactsmenu.mo
share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.mo
share/locale/sv/LC MESSAGES/libkiekemenu contactsmenu.mo
то есть одна динамическая библиотека, один файл .desktop и восемь файлов локализации. Тут надо заметить, что, как правило, с файлами локализации в KDE сплошная морока - их бывает по 20-30 шт. Но пропустить, случайно или намеренно, какой-либо файл нельзя - порт будет впоследствии отослан на тестирование во FreeBSD Team, где проверят все этапы его установки и удаления, и если после удаления в каталоге будут обнаружены оставшиеся файлы, то майнтайнер порта получит сообщение об ошибке, не устранив которую, он никогда не увидит своего порта принятым.
Во второй части файла pkg-plist перечисляются команды, которые необходимо выполнить системе при деинсталляции программы. Как правило, это команды удаления каталогов, которые могли быть созданы в процессе инсталляции. Если в команде упоминается каталог, который к моменту выполнения деинсталляции непустой - он не будет удален.
@dirrm share/locale/bg/LC_MESSAGES
@dirrm share/locale/bg
@dirrm share/locale/br/LC_MESSAGES
@dirrm share/locale/br
@dirrm share/locale/da/LC_MESSAGES
@dirrm share/locale/da
@dirrm share/locale/de/LC_MESSAGES
@dirrm share/locale/de
@dirrm share/locale/ga/LC_MESSAGES
@dirrm share/locale/ga
@dirrm share/locale/fr/LC_MESSAGES
@dirrm share/locale/fr
@dirrm share/locale/pt/LC_MESSAGES
@dirrm share/locale/pt
@dirrm share/locale/sv/LC_MESSAGES
@dirrm share/locale/sv
Опять упоминаются в основном каталоги для сообщений, потому что их могло и не быть. Здесь опять же нельзя пропустить ни одного каталога, который создается исключительно данной программой и больше никем не используется.
Файл pkg-descr
Как уже говорилось выше, это просто текстовый файл с небольшим описанием того, что делает данная программа. Чтобы не сочинять самому описание, в нашем случае мы просто берем описание, приведенное автором на странице kde-apps и заносим его в этот файл, сопровождая ссылкой на собственно страницу программы (файл см. на сайте журнала в разделе «Исходный код»).