OutWiker, Flatpak и WebKitGTK
Этот пост можно считать продолжением предыдущего, в котором я рассказывал о работе OutWiker в виде flatpak-пакета под Linux. В том посте я обещал рассказать о том, почему OutWiker до сих пор собиралась со старой версией runtime, а если быть более корректным, со старыми версиями org.gnome.Platform и org.gnome.Sdk, и как на днях эта проблема внезапно решилась, благодаря чему следующие версии OutWiker уже будут собираться со свежими версиями этих библиотек.
Чтобы понять, в чем заключается проблема, я нарисовал схему зависимостей OutWiker от библиотек, которую сейчас подробно опишу:
Интерфейс OutWiker создан с использованием библиотеки wxPython, которая, в свою очередь, является оболочкой над библиотекой wxWidgets, написанной на C++. Дальше начинается магия. Для отображения HTML-страниц под Linux wxWidgets использует библиотеку WebKitGTK, которая включает в себя движок WebKit. После компиляции этой библиотеки в системе появляется файл с именем libwebkit2gtk-4.x. А вот что именно будет вместо «x» — «0» или «1» зависит от того, с использованием какой версии еще одной библиотеки libsoup (последняя зависимость на картинке) собирается libwebkit2gtk. Если используется libsoup-2.4, то будет создана библиотека libwebkit2gtk-4.0, а если libsoup-3.0, то libwebkit2gtk-4.1.
На данный момент библиотека wxWidgets умет работать только с libwebkit2gtk-4.0, и если ее нет в системе, то при попытке создать HTML-рендер на основе WebKit будет возникать ошибка. Именно libwebkit2gtk-4.0 и присутствовала в старых версиях runtime org.gnome.Platform и org.gnome.Sdk для Flatpak (до версии 42 включительно). Начиная с версии org.gnome.Platform 43, оттуда выбросили libwebkit2gtk-4.0, а вместо нее появилась libwebkit2gtk-4.1 (тут могу ошибаться, возможно, libwebkit2gtk-4.1 присутствовала и раньше параллельно с libwebkit2gtk-4.0, но это не принципиально). Когда я это заметил (еще в прошлом году), то написал о возникшей проблеме в багтрекере org.gnome.Sdk, на что мне ответили, что это сделано намеренно, чтобы, наконец, избавиться от устаревшей версии библиотеки libsoup-2.4 в пользу libsoup-3.0.
Тогда мне возиться с попытками перейти на новую версию org.gnome.Platform было лень, и я оставался на предыдущей до сих пор.
В эти выходные я все-таки озадачился тем, можно ли как-то запустить OutWiker со свежей версией org.gnome.Platform. Напрашиваются два пути — попытаться скомпилировать wxWidgets с libwebkit2gtk-4.1 или собрать из исходников libwebkit2gtk-4.0 и добавить ее в более новый runtime для Flatpak.
Сначала попытался пойти по первому пути. Я наивно надеялся, что если я найду везде в исходниках упоминание libwebkit2gtk-4.0 и заменю его на libwebkit2gtk-4.1, то проблема будет решена. Упоминания версий libwebkit2gtk нашлись в пяти файлах, еще в одном надо было заменить версию libsoup. К сожалению, это не помогло — компилятор выдал ошибки, связанные с отсутствующими константами из библиотеки libsoup (на картинке эта зависимость тоже показана стрелкой от wxWidgets до libsoup). Погуглив отсутствующие константы (я еще надеялся, что может быть в новой версии libsoup константы просто переименовали), я нашел в документации мануал по поводу несовместимости версий libsoup и перехода на новую версию. Оказалось, что малой кровью это не починишь, и нужно менять логику работы. На такие подвиги я не был готов и пошел жаловаться на жизнь в багтрекер wxWidgets. Суть моего сообщения заключается примерно в следующем: «WxWidgets не работает в свежих runtime Flatpak, сделайте, позялуста, чтобы wxWidgets мог собираться с libwebkit2gtk-4.1. Очень надо.».
Достаточно быстро с комментариях мне ответил пользователь swt2c, что он как раз над этим работает. Ура! Появилась надежда на будущее. Насколько это будущее отдаленное — это другой вопрос, сначала должна выйти новая версия wxWidgets, а потом ее должна начать поддерживать библиотека wxPython. После этого в комментарии пришел пользователь joshua-stone, который сказал: «Да-да, мне тоже это очень надо», сказал, что это сильно облегчит сборку его приложения и кинул ссылку на скрипт упаковки своей программы во Flatpak, в котором он пошел по второму пути, о котором я упомянул выше — собирать libwebkit2gtk-4.0 из исходников и положить его в новую версию runtime.
Таким образом, внезапно моя участь облегчилась, и вместо того, чтобы того, чтобы начинать с нуля попытку сборки libwebkit2gtk, я мог позаимствовать чужой код. В принципе, у меня уже был опыт сборки libwebkit2gtk из исходников, это процесс не очень сложный, но очень долгий.
Код сборки libwebkit2gtk-4.1, на который дали ссылку, заработал с первого раза. Правда, локально на моем компьютере со стареньким процессором i7-3770 Flatpak-пакет OutWiker-а теперь собирается около трех часов (2.5 часа из них собирается libwebkit2gtk, и еще чуть больше, чем полчаса собирается связка wxPython + wxWidgets). Последний шаг — собрать OutWiker на серверах Flathub, там, куда выкладываются Flatpak-пакеты для пользователей. Я не был уверен, что такую долгую сборку не прибьют по таймауту. Но, к счастью, все прошло удачно, в облаке сборка прошла заметно быстрее, чем у меня на компе.
Таким образом, теперь OutWiker может работать с последними версиями (44) org.gnome.Platform и org.gnome.Sdk. С точки зрения пользователя это не должно быть как-то заметно, если не считать, что теперь можно будет удалить из системы устаревшую версию org.gnome.Platform.
Осталось решить еще одну проблему с OutWiker — научиться собирать библиотеку cyhunspell для последних версий Python 3.11 и 3.12 или найти альтернативу этой библиотеки.
PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
Leave a comment