Сегфолты Galculator 2.1.3 или мой первый ebuild
Привет, #{username}! Сегодня я хочу написать об одной маленькой проблеме и её решении. Проблема касается пользователей Linux, у которых после одного из последних обновлений стал падать Galculator. Не могу ручаться за достоверность информации, но похоже, что каким-то магическим образом это касается только пользователей Gentoo (но далеко не всех). Проблема неприятная, а решение оказалось очень простым. В официальном portage Galculator перестанет падать только через некоторое время, т.ч. пока можно воспользоваться моим решением.
Чтобы хоть как-то наполнить статью интеллектуальностью, я на примере конкретной проблемы покажу:1. Как сделать свой ebuild-файл.2. Как организовать своё хранилище ebuild’ов. Оно пригодится как раз при подобном случае, ставшем темой для статьи.
Кроме того, я был бы рад, если бы гентоо-менторы подсказали мне, где почитать о том, как вести себя в подобной ситуации. Куда лучше постить патчи к ebuild’ам (и стоит ли это делать вообще), как оформлять эти патчи, какие есть особенности оформления и т.д.
Заранее скажу, что статья окажется полезной и интересной только тем, кто уже по крайней мере уже собрал себе систему самостоятельно.
Описание проблемыДля начала вот линк на баг #463459 в Gentoo Bugzilla: тынц.Проблема воспроизводится не у всех. У меня — отлично воспроизводится.
Проблема заключается в том, что при попытке выполнить некоторые операции в Galculator, последний падает. Gdb даёт такой backtrace.
Сначала я грешил на множественные emerge критичных пакетов без пересборки мира. Но потом обстоятельства всё же меня припёрли к стенке и мир я пересобрал. Калькулятор всё равно падал.
Гугление быстро вывело меня на страницу по ссылке выше. В конце обсуждения Simon — один из maintainer’ов Galculator — сообщал о том, что переписал ту часть кода, которая одновременно использовала malloc и g_free (т.е. функции выделения памяти, находящиеся в разных библиотеках). Память под объекты выделялась функциями одной библиотеки, а освобождалась функциями другой. Выглядело правдоподобно. Сообщение сразу после подтверждало, что проблема была именно в этом (строго говоря, это нельзя считать доказанным; воспринимайте по-дефолту как «скорее всего»). Однако релиза калькулятора до сих пор нет, стало бы и нету нового ebuild’а.
Однако ещё до этого опытным путём выяснили, что отключение библиотеки quadmath решает проблему. Это, честно говоря, вызывает удивление, но на моей машине подтвердилось. Плохо то, что сам пакет Galculator позволяет собирать себя без quadmath, а ebuild эту возможность не использует. У него вообще нет ни одного USE флага. Ситуация тупиковая и глупая: есть SVN, в котором лежит рабочая версия; есть даже флаг, скормив который скрипту configure, можно избавиться от проблемы магическим образом. Но нет возможности воспользоваться ни одной из этих возможностей, не выходя за рамки системы сборки Gentoo…
Решение проблемы или как чукча стал писателем Решения нет только в том случае, если вы только пользуетесь тем, что даёт репозиторий Gentoo. Однако, если вы хоть немного владете Shell’ом и умеете находить ответы на вопросы в стуктурированной документации, то проблема решаема.
«А почему бы мне не взять и поправить ebuild файл для Galculator, добавив в него нужную функциональность?» — подсказывает внутренний голос.
Не стоит это делать. При следующем emerge --sync ваши изменения перетрутся. Интуиция подсказывает, что должна быть возможность создать локальную «песочницу» билдов. И такая возможность действительно имеется.
Если вы ещё не знаете, что такое layman, то прочтите о нём. Всё достаточно просто. При установке layman’а у вас появляется дополнительный репозиторий ебилдов, работающий по несколько другой схеме, нежели production репозиторий. Подробное обяснение того, что такое layman и overlay, не входит в мои платы. Для решения нашей проблемы достаточно знать, что, после установки layman, вы смело можете создать свою папку /usr/local/portage/#{username} и скидывать туда свои сборки, перетирать их никто не станет.
В данном случае решение проблемы выглядит следующим образом:
mkdir /usr/local/portage/#{username} cp -rv /usr/portage/sci-calculators/galculator /usr/local/portage/#{username} cd /usr/local/portage/#{username}/galculator edit galculator-2.1.3.ebuild ebuild galculator-2.1.3.ebuild digest emerge --unmerge galculator emerge -av #{username}/galculator Из приведённых команд прокомментирую только две.
edit — данная команда вызывает не какой-то конкретный редактор. Она вызывает редактор, указанный в переменной окружения EDIT. Если у вас до сих пор не настроена эта переменная и вы не пользуетесь командой edit, то часть вины за глобальное потепление лежит и на вас!
ebuild galculator-2.1.3.ebuild digest — этой командой мы подписываем наши исправления, чтобы подтвердить, что исправления произошли не из-за проблем с ЖД или эффектом случайного редактирования конфигов.
Теперь о том, что конкретно надо писать в ebuild файл. По-хорошему, надо было бы выпустить целую статью о том, как писать ebuild файлы. И я рад был бы, если бы кто-то за меня это сделал. С радостью почитал бы. Но, увы, пока такой доступной и, вместе с тем, грамотной статьи я не видел. Посему приходится пользоваться оригинальной, от производителя. Она, впрочем, для чуть более продвинутого пользователя оказалась бы не плохой. Мне же пока придётся привести здесь просто код того, что надо вставить.
Изначально ebuild Galculator’а не содержит ни одной инструкции сборки. Все выполняется в default-манере. Нам нужно поменять метод конфигурирования. Для этого мы добавим в файл функцию src_configure (), которая вызывается как раз для конфигурирования пакета.
src_configure () { gnome2_src_configure $(use_enable quadmath) } ebuild’ы представляют собой просто Shell-скрипты. Существуют опредедённые соглашения о том, в каком формате эти скрипты пишутся. Сводятся эти соглашения в конечном итоге к трём вещам:1. Какой перечень функций должен быть объявлен в файле, какая функция в какой момент вызывается и для чего она предназначена.2. Какие переменные должны быть определены в файле, каковы их имена и что они означают (когда и как они используются).
Кроме того, конечно, у нас есть библиотеки, реализующие шаблонные действия. econf — вызвать configure скрипт, elog — вывести сообщение в лог сборки и т.д.
В данном случае мы пользуемся функцией gnome2_src_configure вместо стандартной econf. По всей видимости все пакеты из коллекции gnome2 имеют схожие методы конфигурирования и для них написали функцию, которая внутри уже вызывает econf. Я обнаружил это просто посмотрев ebuild похожего по набору используемых библиотек пакета.
Нашей основной задачей является добавление возможности собрать с опцией »--disable--quadmath». --disable-*, --enable-*, --with-* и --without-* — стандартные опции configure. Поэтому для них должны быть готовые обёртки. И они есть. Для enable/disable есть одна обёртка — use_enable. Эта функция вернёт --enable-#{flag}, если «flag» был установлен в списке USE-флагов при сборке, и --disable-#{flag} в противном случае. То, что надо. Осталось только сообщить в описании списка используемых пакетом флагов, что наш пакет использует флаг quadmath и по-умолчанию значение этого флага — disable. Делается это так:
IUSE=»-quadmath» Готово.
Послесловие На самом деле, Gentoo — очень крупная, строго организованная организация. Как и любая крупная, не молодая организация, она имеет много общепринятых вещей, с которыми трудно познакомиться, читая мануалы. Там описано что-то, но далеко не всё. Разработчик Gentoo — это фактически должность. Разработчику предоставляют рабочую почту, рабочий аккаунт на сервере и много других удобных инструментов. Одна процедура принятия в разработчики стоит целой статьи, если бы были люди, которым это оказалось интересно.
Я уже год как пересел с LFS-дистрибутива на Gentoo и недавно окончательно определился, что это то, что мне надо. Поэтому я хочу стать активным участником сообщества Gentoo. Если на хабре есть Gentoo-менторы, я был бы признателен за возможность взять меня под свой патронаж для вступления в Gentoo Developers.
Удачи!