FreeBSD The Power to Serve

Проект 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.