Сборка GIMP из Git и подготовка патчей

Эта статья написана для самых любопытных пользователей программы — тех, кто готов самостоятельно собирать её из текущего исходного кода.

Статья подразумевает использование Linux, в частности, Ubuntu 11.04. Общие принципы, тем не менее, применимы и к другим дистрибутивам.

Используемые библиотеки

GIMP опирается на некоторое количество библиотек, предоставляющих разнообразную функциональность. Некоторые из них в свою очередь опираются на другие библиотеки и приложения.

Для GIMP ключевыми являются следующие библиотеки:

  • GTK+, набор элементов графического интерфейса;
  • babl, библиотека преобразования между растровыми форматами;
  • GEGL, новый движок обработки и рендеринга графики.

Чтобы не искать все нужные библиотеки по очереди, можно просто установить все зависимости. В Ubuntu это делается следующей командой:

$ sudo apt-get build-dep gimp

Если вы никогда ничего не собирали, вместе с библиотеками будет установлен компилятор и базовые вспомогательные инструменты для сборки приложений в Linux.

Обратите внимание: вместе с ними будут установлены библиотеки babl и GEGL. Если вы планируете собирать их самостоятельной, после выполнения предыдущей команды их нужно удалить. Но сначала установим библиотеки, необходимые для сборки и функционирования babl и GEGL:

$ sudo apt-get build-dep babl
$ sudo apt-get build-dep gimp

Поскольку GIMP зависит от GEGL, а GEGL зависит от babl, удаляем babl:

$ sudo apt-get remove libbabl-0.0-0

Теперь у нас есть все основные библиотеки, необходимые для сборки babl, GEGL и GIMP. Есть некоторое количество дополнительных библиотек и приложений, обеспечивающих работу необязательных функций GEGL и GIMP. Вот они:

  • enscript и asciidoc, сборка документации GEGL;
  • exiv2, определение экспозиции при сборке HDR в GEGL;
  • lua5.0, поддержка языка программирования Lua в GEGL;
  • ruby1.8поддержка языка программирования Ruby в GEGL;,
  • gtk-doc-tools, сборка документации для разработчиков GIMP.

Обращаю ваше внимание на то, что описанные выше действия по большому счёту предполагают самостоятельную сборку всего, что связано с GIMP. Т.е. если вы захотите установить из репозитория Ubuntu какое-то дополнение, вам придётся держать установленной стабильную версию GIMP и сопутствующих библиотек из репозитория, а нестабильную версию устанавливать в другой каталог. Ну или вовсе отказаться от стабильной версии и собирать всё самостоятельно.

Получение и обновление файлов из Git

Теперь нам необходимо получить копию репозиториев с исходным кодом babl, GEGL и GIMP. Репозиторий — это хранилище данных с контролем версий файлов для возможности отката изменений. Для обеспечения совместной работы программистов и переводчиков проектом используется децентрализованная система контроля версий Git.

Децентрализованность Git выражается в том, что вы можете сохранять свои изменения локально. Ближе к концу статьи вы увидите, зачем это нужно.

Итак, вытаскиваем babl:

$ git clone git://git.gnome.org/babl

Затем GEGL:

$ git clone git://git.gnome.org/gegl

Наконец, GIMP:

$ git clone git://git.gnome.org/gimp

В каждом случае будет создан локальный клон сетевого репозитория.

Для синхронизации локального клона с текущим сетевым репозиторием используется команда pull. Здесь есть очень важный момент, который нужно понимать, если вы вносите какие-то изменения в существующие файлы.

У команды pull есть ключ --rebase. Если вы его не используете, git просто добавит в ваш локальный клон изменения из сетевого репозитория. Но если вы используете --rebase, ваш локальный клон будет полностью синхронизирован с сетевым, а все лично ваши изменения придётся либо отложить, либо внести в локальный клон.

Изменения откладываются следующим образом:

$ git stash

После это команды вы сможете запустить

$ git pull --rebase

а затем вернуть отложенные изменения:

$ git stash apply

Внести изменения можно командой commit:

$ git commit изменённый_файл -m "Описание изменения"

Хотите вы собирать библиотеки и GIMP прямо в локальных клонах, или же предпочитаете копировать их в другой каталог и собирать уже там — ваше личное дело.

Сборка

У разработчиков babl, GEGL и GIMP не совсем обычный подход к испоользованию типовых сценариев сборки. Когда вы собираете взятый из Git код, сценарий ./configure вы не запускаете в принципе. Команда конфигурации, сборки и установки для всех трёх выглядит так:

$ ./autogen.sh && make && sudo make install

Вы можете указать префикс сборки — в какой каталог будут установлены библиотеки и программа. По умолчанию это /usr/local, что считается достаточно безопасным. Но если вы уверены в своих действиях, можно сделать так:

$ ./autogen.sh --prefix=/usr && make && sudo make install

В этом случае библиотеки попадут в /usr/lib, а исполняемые файлы — в /usr/bin.

Префикс может быть абсолютно любым, надо только помнить, что не все каталоги по умолчанию находятся в окружении PATH. Поэтому если для вас критична возможность набрать из консоли

$ gimp имя_файла

переменную PATH придётся скорректировать. В подавляющем же большинстве случаев установки в /usr/local по умолчанию более чем достаточно.

Для ./autogen.sh в GEGL можно также указать ключ --enable-workshop. В этом случае вы соберёте дополнительные операции (актуально для проекта GSoC2011 по портированию фильтров).

Создание собственных веток

В проекте часто параллельно ведётся разработка разных интересных новшеств, для чего используются так называемые ветки — своего рода ответвления от основного «дерева» с исходным кодом, которое в Git называется master.

Каждый раз переключаться между ветками для тестирования несколько утомительно. Этого можно избежать, если создать собственную локальную ветку, в которую можно просто по мере надобности вносить изменения из выбранных веток.

Давайте рассмотрим это на примере GEGL и создадим собственную ветку, основанную на master и объединяющую все ветки с кодом Google Summer of Code

1. Обновляем активный клон основного репозитория:

$ git pull --rebase

2. Создаём собственную ветку с отслеживанием изменений в master:

$ git branch -t gsoc2011-all

3. Переключаемся на неё:

$ git checkout gsoc2011-all

4. Получаем список доступных веток:

$ git branch -a

К примеру, вы увидите ветку remotes/origin/soc-2011-warp с операциями GEGL, обеспечивающими работу интерактивной версии фильтра iWarp. Префикс «remotes» в названии просто указывает на то, что это ветка в сетевом репозитории, и она в вашем локальном репозитории неактивна.

5. Теперь вносим изменения из этой ветки:

git merge origin/soc-2011-warp

6. Вносим изменения из ветки с портом фильтров GIMP в операции GEGL:

$ git merge origin/soc-2011-ops

7. Вносим изменения из ветки с реализацией поддержки OpenCL:

$ git merge origin/gsoc2011-opencl

Далее вам нужно будет просто запускать

$ git pull --rebase

для получения и применения изменений и

$ git merge origin/ветка

для внесения очередных изменений из выбранных веток.

Остаётся лишь собрать GEGL в этой ветке и повторить процедуру для GIMP.

В принципе, можно работать прямо в клоне основной ветки master, и если что-то поломается, вы сможете начать заново, не вытаскивая весь репозиторий с нуля:

$ git reset --hard origin/master

Если же вы предпочитаете работать в своей ветке, при возникновении каких-то проблем её можно просто удалить и начать заново:

$ git branch -d gsoc2011-all

Создание патчей

Раз уж речь зашла об использовании Git, давайте осветим вопрос создания сформатированных для Git патчей.

Что значит патч, сформатированный для Git? Это значит, что в файл патча также влючается ваше имя, дата изменения и комментарий к нему. В децентрализованных системах контроля версий это означает, что ваше имя будет автоматически фигурировать в журнале изменений.

Если вы никогда ранее не пользовались Git, начните с конфигурации. Укажите имя латиницей:

$ git config --global user.name "Имя Фамилия"

Затем укажите адрес почты, который будет виден в журнале изменений:

$ git config --global user.email адрес@почты.com

После этого можно готовить патчи. Сначала вносим изменения в систему контроля версий:

$ git commit изменённый файл -m "Комментарий на английском"

Создаём патч. Будем считать, что вы сейчас в локальном клоне master:

$ git format-patch origin/master

Git создаст файл 0001-Комментарий-на-английском.patch, который можно отправить разработчикам на рассмотрение.

Обязательно ли пользоваться консолью? Вовсе нет. Вы можете установить любой из существующих графических интерфейсов, например, gitg:

GitG, графический интерфейс к Git

Так или иначе, теперь вы знаете, как самостоятельно собирать GIMP из Git и готовить изменения. Если же вам достаточно сборки только нестабильной версии из master, в случае с Ubuntu достаточно подключить репозиторий с готовыми сборками
$ sudo apt-add-repository ppa:matthaeus123/mrw-gimp-svn
$ sudo apt-get update
$ sudo apt-get install gimp

Следует лишь помнить, что сборки в нём не всегда актуальны.

Add a comment