---
title: "Проект FreeBSD GNOME: Как создать порт"
sidenav: gnome
---

include::shared/ru/urls.adoc[]

= Проект FreeBSD GNOME: Как создать порт

В этом документе предполагается, что вы уже знаете, как работает система портов, и поэтому здесь даётся только специфичные для GNOME советы и замечания. Инструкции общего характера можно найти в link:{porters-handbook}[Руководстве по созданию портов FreeBSD].

== Макросы GNOME для Makefile

Приложения GNOME во FreeBSD используют инфраструктуру *USE_GNOME*. Для указания того, какие компоненты системы GNOME нужны вашему порту для построения, просто перечислите их все списком через пробел. Например:

....
USE_X_PREFIX=   yes
USE_GNOME=  gnomeprefix gnomehack libgnomeui
....

Компоненты *USE_GNOME* делятся на две следующие категории:

* link:../gnome2_porting[Компоненты GNOME 2]
* link:../gnome_porting[Компоненты GNOME 1]

Если вашему порту нужны только библиотеки *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`, пожалуйста, обратитесь к http://www.freebsd.org/cgi/man.cgi?query=make&apropos=0&sektion=0&manpath=FreeBSD+4.6-stable&format=html[страницам справочника о 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
....

Если вам нужна помощь при работе с портом, для примера взгляните на некоторые из link:/ports/gnome.html[существующих портов]. К вашим услугам также и mailto:freebsd-gnome@FreeBSD.org[список рассылки freebsd-gnome].
