Проект FreeBSD GNOME: Как создать порт
В этом документе предполагается, что вы уже знаете, как работает система портов, и поэтому здесь даётся только специфичные для GNOME советы и замечания. Инструкции общего характера можно найти в Руководстве по созданию портов FreeBSD.
Макросы GNOME для Makefile
Приложения GNOME во FreeBSD используют инфраструктуру USE_GNOME. Для указания того, какие компоненты системы GNOME нужны вашему порту для построения, просто перечислите их все списком через пробел. Например:
USE_X_PREFIX= yes USE_GNOME= gnomeprefix gnomehack libgnomeui
Компоненты USE_GNOME делятся на две следующие категории:
Если вашему порту нужны только библиотеки GTK2, то кратчайшим способом указать на это является следующий:
USE_X_PREFIX= yes USE_GNOME= gtk20
Если вашему порту требуются только библиотеки GTK1, то кратчайшим способом указать на это является следующий:
USE_X_PREFIX= yes USE_GNOME= gtk12
Даже если ваше приложение требует только библиотеки GTK, другие компоненты USE_GNOME могут оказаться полезными. Пожалуйста, просмотрите весь список, чтобы удостовериться в том, что ваш порт использует все нужные компоненты.
Как только вы закончите работу над своим портом, не помешает
проверить, что он зависит от правильного списка компонентов. Чтобы
увидеть перечень пакаджей, от которых действительно зависит ваш
порт, воспользуйтесь командой make package-depends
,
которую нужно выдать из каталога вашего порта.
В облегчении создания перечня необходимых компонентов может
помочь анализ выдачи команды make configure
. В конце
списка checking for…
будет находиться строка вроде
следующей:
checking for libgnomeui-2.0 >= 2.0.0 cspi-1.0 >= 1.1.7 libspi-1.0 >= 1.1.7 libbonobo-2.0 >= 2.0.0 atk >= 1.0.0 gtk+-2.0 >= 2.0.0 gail libwnck-1.0 esound... yes
Это список компонентов, которые используются приложением при
построении. Обратите особое внимание на иерархический характер
системы USE_GNOME; многие компоненты включаются из
других директив USE_GNOME. В примере выше
USE_GNOME= libgnomeui
подразумевает использование
libbonoboui
, что приводит к использованию
libgnomecanvas
, что приводит к использованию
libglade2
, которая использует gtk20
.
Таким образом, даже если gtk+-2.0
появляется в списке
необходимых компонентов, gtk20
можно исключить из
списка USE_GNOME. Имеется некоторое количество
других таких случаев избыточности, которые можно исключить из этого
списка.
Для списка выше (взятого из sysutils/gok
), в
Makefile
определено следующее:
USE_GNOME= gnomehack gnomeprefix libgnomeui atspi libwnck
Оболочка GNOME 1 против Оболочки GNOME 2
Изначально была только GNOME 1
. Когда появилась
оболочка GNOME 2
, была обеспечена максимальная
совместимость с предыдущей версией, по понятным причинам.
Приложения GNOME 1
могли нормально работать в оболочке
GNOME 2
, при условии, что они не используют
специфичную для оболочки GNOME 1
функциональность.
Оболочка GNOME 1
и все приложения, которые не
работали в оболочке GNOME 2
, были удалены из дерева
портов.
Для вас, как создателя порта приложения, это означает, что вы
просто не должны добавлять приложения, специфичные для GNOME
1
, в дерево портов.
Если вы хотите определить, какая версия оболочки GNOME
используется на машине пользователя, вы можете проверить значение
переменной GNOME_DESKTOP_VERSION. Значение этой
переменной устанавливается в значение "1"
или
"2"
, в зависимости от того, установлена ли версия
оболочки GNOME 1
или GNOME 2
.
Опциональные зависимости GNOME
Если ваш порт может опционально использовать GNOME, вы должны
задать WANT_GNOME= yes
в вашем файле Makefile, а затем
проверить, задана ли переменная HAVE_GNOME
для каждого
компонента из списка выше, которые может использовать ваш порт. Так
как это проверка выполнения условия, вам нужно поместить её между
bsd.port.pre.mk
и bsd.port.post.mk
.
Например:
WANT_GNOME= yes .include <bsd.port.pre.mk> .if ${HAVE_GNOME:Mgnomepanel}!="" USE_GNOME+= gnomeprefix gnomepanel CONFIGURE_ARGS+= --with-gnome PKGNAMESUFFIX= -gnome PLIST_SUB= DATADIR="share/gnome" .else CONFIGURE_ARGS+= --without-gnome PLIST_SUB= DATADIR="share" .endif .include <bsd.port.post.mk>
Здесь WANT_GNOME
указывает системе портов на
проверку существования различных компонент GNOME, перечисленных
выше. Для каждого найденного компонента его имя добавляется к
HAVE_GNOME
. Так как этот порт может использовать
gnomepanel
, мы проверяем переменную
HAVE_GNOME
на предмет включения в неё
gnomepanel
(для выяснения более полной информации о
синтаксисе make-строки :M`pattern`, пожалуйста, обратитесь к
страницам справочника о make(1)). Если будет найден компонент
gnomepanel
, то он будет добавлен к списку зависимостей
USE_GNOME
, и будут переданы специфичные для порта
--with-gnome
CONFIGURE_ARG
. В старой
инфраструктуре GNOME переменная PKGNAMESUFFIX
автоматически перенастраивалась на полноценный макрос
USE_*
. Теперь это отдано человеку, создающему порт. В
нашем примерном порте к его имени добавляется -gnome
для указания на то, что он строится с поддержкой GNOME. То же самое
имеет место и для DATADIR
PLIST_SUB
.
Создатель порта должен решить, когда выполнять подстановку
DATADIR
. Хорошим правилом является добавление
DATADIR
PLIST_SUB
при использовании
компонента gnomeprefix
.
Замечание: Вы не можете добавлять
дополнительные компоненты USE_GNOME
, используемые по
умолчанию, после .include <bsd.port.pre.mk>
.
Поэтому следующее использование будет
неправильным:
.include <bsd.port.pre.mk> .if ${HAVE_GNOME:Mgnomelibs}!="" USE_GNOME+= libgnome .else USE_GNOME+= gtk12 # ОШИБКА! .endif
Это заставит систему построения думать, что требуется
использование GNOME, и тогда pkg-plist
будет изменён
соответствующим образом, что приведёт к ошибке при построении
пакаджа. Если вы хотите добавить используемые по умолчанию
компоненты USE_GNOME
, сделайте это
перед строкой ` .include
<bsd.port.pre.mk>`.
Чтобы принудительно вызвать безусловное использование
опциональных зависимостей GNOME, вы можете добавить
WITH_GNOME= yes
в файл /etc/make.conf
или
в командную строку make. При этом при проверке зависимости от GNOME
будет всегда возвращаться возвращаться положительное значение. Если
вы хотите, чтобы система всегда возвращала отрицательный результат
при проверке на зависимость от GNOME, вы можете добавить
WITHOUT_GNOME= yes
в /etc/make.conf
или
командную строку make.
Дополнительную информацию об инфраструктуре USE_GNOME можно
найти при просмотре исходных текстов и комментариев в файле
${PORTSDIR}/Mk/bsd.gnome.mk
.
Установка OMF
Большое количество приложений GNOME (особенно приложения GNOME
2) устанавливают файлы Open Source Metadata Framework (OMF),
которые содержат информацию о файлах справки для этих приложений,
Эти OMF-файлы требуют особой обработки через ScrollKeeper для того,
чтобы такие приложения, как Yelp могли находить справочную
документацию. Для выполнения полноценной регистрации этих файлов
OMF при установке приложений GNOME из пакаджей вы должны проверить,
что файл pkg-plist
вашего порта имеет следующие
описания для каждого перечисленного файла OMF.
@exec scrollkeeper-install -q \ %D/path/to/help_file.omf \ 2>/dev/null || /usr/bin/true @unexec scrollkeeper-uninstall -q \ %D/path/to/help_file.omf \ 2>/dev/null || /usr/bin/true
К примеру:
@exec scrollkeeper-install -q \ %D/share/gnome/bug-buddy/bug-buddy-C.omf \ 2>/dev/null || /usr/bin/true @unexec scrollkeeper-uninstall -q \ %D/share/gnome/bug-buddy/bug-buddy-C.omf \ 2>/dev/null || /usr/bin/true
Проблемы с libtool
Большинство, если не все, приложений GNOME зависит от GNU
libtool. Они также используют систему конфигурации GNU configure.
Если ваш порт устанавливает совместно используемые библиотеки, вы
должны добавить строку USE_LIBTOOL= yes
к Makefile
вашего порта. При этом будут учтены все требования при
использовании libtool, но это не избавит от таких вещей, как
установка файлов .la. Для обеспечения корректной установки
совместно используемой библиотеки не забудьте также добавить
следующую строку в скрипт configure
вашего порта
непосредственно после строки
LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
:
$ac_aux_dir/ltconfig $LIBTOOL_DEPS
Это отменит установку файлов .la и обеспечит передачу параметра
${PTHREAD_LIBS}
компоновщику.
Дистрибутивные файлы
Для отделения дистрибутивных файлов GNOME 2 от дистрибутивных
файлов GNOME 1 и для обеспечения чистоты каталога с дистрибутивными
файлами, порты GNOME 1, которые сгружают свои дистрибутивные файлы
с ${MASTER_SITE_GNOME}
, должны иметь следующую строку
в своём Makefile:
DIST_SUBDIR= gnome
Порты GNOME 2, которые сгружают свои дистрибутивные файлы с
${MASTER_SITE_GNOME}
, должны иметь следующую строку в
своём Makefile:
DIST_SUBDIR= gnome2
Некоторые дистрибутивные файлы GNOME распространяются как в формате tar gzip, так и tar bzip2. Для экономии времени при сгрузке дистрибутивных файлов по медленным каналам связи вы должны использовать дистрибутивные файлы bzip2 там, где это возможно. Для этого добавьте следующую строку в Makefile вашего порта:
USE_BZIP2= yes
Если вам нужна помощь при работе с портом, для примера взгляните на некоторые из существующих портов. К вашим услугам также и список рассылки freebsd-gnome.