Всем доброго дня! В предыдущей статье Kawai-Focus 2.3: логика приложения на TypeScript:

  1. Переписана логика с JS на TS;

  2. Разобрана проблема запуска на Arch по issue Сергея (отключена сборка AppImage).

Сегодня я покажу, какие есть адекватные способы собрать приложение под Arch Linux без боли и лишних проблем. Для удобства тестирования и сборки я установил операционную систему Cachy OS, которая базируется на Arch Linux.

Сам я никогда раньше не использовал Arch Linux, поэтому буду обучаться сборке и всем необходимым инструментам на ходу и делиться своим опытом, а также опытом других, с вами.

Заваривайте чай, доставайте вкусняшки — пора «снимать урожай помидоров сорта Arch»! 🍅


Немного об Arch Linux

Я взялся за Arch Linux, так как он довольно востребован среди опытных разработчиков и продолжает набирать популярность. Даже в нашем комьюнити "Кот на салфетке" я знаю как минимум двух разработчиков, которые используют эту операционную систему.

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

Arch Linux — это минималистичный и гибкий дистрибутив операционной системы на базе Linux, ориентированный на опытных пользователей, которым важен полный контроль над системой. Проект был создан в 2002 году канадским разработчиком Judd Vinet. Основная идея Arch Linux отражена в принципе KISS (Keep It Simple, Stupid) — система должна быть максимально простой по структуре и прозрачной для пользователя. Вместо преднастроенной среды Arch предоставляет минимальную базовую установку, которую пользователь постепенно настраивает под свои задачи.

Об инструментах для пакетов

Одной из ключевых особенностей Arch Linux является собственная система управления пакетами — Pacman. Этот инструмент отвечает за установку, обновление и удаление программ, а также за работу с зависимостями. Pacman использует бинарные пакеты и позволяет управлять всей системой одной командой, включая её полное обновление. Для сборки пакетов под Arch Linux используется система PKGBUILD и утилита makepkg, которая автоматизирует процесс загрузки исходного кода, компиляции и упаковки программы в формат пакета, понятный pacman.

Помимо официальных репозиториев, пользователи активно используют Arch User Repository (AUR) — огромную пользовательскую базу рецептов сборки программ. Для работы с AUR существует несколько популярных помощников. Один из самых известных — yay, который объединяет возможности pacman и сборку пакетов из AUR в одном интерфейсе. Также широко используется paru — современный помощник, написанный на Rust и ориентированный на безопасность и скорость. Третий популярный инструмент — trizen, который предоставляет удобный интерфейс для поиска, сборки и установки пакетов из AUR.

AUR-helper — это утилита, которая автоматизирует поиск, загрузку, сборку и установку пакетов из Arch User Repository, используя стандартные инструменты makepkg и Pacman. Если в Arch User Repository есть PKGBUILD, то любой AUR-helper сможет собрать и установить пакет, потому что все они используют один и тот же механизм сборки — стандартные инструменты makepkg и Pacman.

Схема работы примерно такая:

  1. AUR-helper (например yay или paru) скачивает PKGBUILD из AUR;

  2. Проверяет зависимости;

  3. Устанавливает зависимости через pacman;

  4. Запускает makepkg;

  5. makepkg собирает пакет и создаёт файл .pkg.tar.zst;

  6. Pacman устанавливает получившийся пакет в систему.

То есть AUR-helper — это просто удобная оболочка, а реальная сборка происходит стандартными инструментами Arch.

Важно понимать одну вещь:
в AUR хранится не сам пакет, а рецепт сборки (PKGBUILD). Поэтому любой помощник, который умеет работать с AUR, сможет использовать этот рецепт.

Именно поэтому пакет, опубликованный в AUR, становится доступен пользователям через разные инструменты одновременно: yay, paru, trizen или даже через ручную сборку makepkg.

Мои дальнейшие шаги

Исходя из полученной мной информации о данной операционной системе и особенностей сборки под неё я наметил следующие дальнейшие шаги:

  1. Собрать приложение под Arch Linux вручную с помощью makepkg;

  2. Установить приложение и протестировать его;

  3. Добавить рецепт сборки в Arch User Repository (AUR);

  4. Собрать приложение с помощью AUR-helper (например yay).

Также Сергей (бывалый arch-юзер) уже собирал моё приложение у себя на Arch и дал мне несколько ценных советов. Один из них — использовать для сборки через Tauri deb-пакет, который уже был собран мной для предыдущей статьи.

Использование готового deb-пакета упрощает установку приложения для пользователей Arch Linux. В таком подходе PKGBUILD фактически лишь скачивает подготовленный пакет и устанавливает его, не требуя компиляции проекта на стороне пользователя. Это даёт несколько преимуществ:

  • Установка проходит значительно быстрее;

  • Не требуется установка всех инструментов разработки и зависимостей для сборки;

  • Снижается вероятность ошибок компиляции на разных системах.

В отличие от варианта с клонированием репозитория и сборкой из исходников, пользователю не нужно тратить время на полноценный процесс сборки — пакет устанавливается почти так же быстро, как обычные бинарные пакеты через Pacman.

На мой взгляд, это отличный совет, который экономит время как мне, так и пользователям.


Сборка и установка под Arch

Теперь, когда я имею представление об Arch Linux и его инструментах для работы с пакетами и сборки, мне гораздо легче начать сам процесс. Для сборки и тестирования приложения я установил Cachy OS, которую активно использует для работы и игр Иван. Он предпочитает оболочку Gnome, так как она потребляет минимум ресурсов. Ну а я, как всегда, выбираю KDE Plasma, которую некоторые называют «кедами», потому что она нравится мне внешне, хоть и может потреблять немного больше ресурсов.

Первое, что необходимо сделать — это клонировать репозиторий для работы с ним:

git@github.com:Arduinum/kawai-focus-v2.git

Затем перехожу в папку проекта:

cd kawai-focus-v2

Файл рецепта PKGBUILD

Для удобства сборки и установки пакета создаю файл рецепта PKGBUILD.

pkgname=kawai-focus
pkgver=0.1.0
pkgrel=1
pkgdesc="Kawai-Focus is a focus-training app based on the Pomodoro timer."
arch=('x86_64')
url="https://github.com/Arduinum/kawai-focus-v2"
license=('MIT')

depends=('webkit2gtk-4.1' 'libsoup3' 'gtk3' 'cairo' 'gdk-pixbuf2' 'glib2' 'pango')

source=("Kawai-Focus_${pkgver}_amd64.deb::https://github.com/Arduinum/kawai-focus-v2/releases/download/${pkgver}-alpha.1/Kawai-Focus\_${pkgver}\_amd64.deb")

sha256sums=('SKIP')

package() {

  cd "$srcdir"

  # распаковываем deb
  ar x Kawai-Focus_${pkgver}_amd64.deb

  # извлекаем файлы пакета
  tar -xf data.tar.*

  # копируем всё в pkgdir
  cp -r usr "$pkgdir"
}

Разбор PKGBUILD

  • pkgname=kawai-focus — задаёт имя пакета. В Arch Linux это имя будет использоваться для установки и идентификации пакета;

  • pkgver=0.1.0 — версия программы, которую мы упаковываем. Обычно совпадает с версией релиза в проекте;

  • pkgrel=1 — номер сборки пакета для данной версии. Если соберёшь пакет заново без изменения pkgver, увеличиваешь pkgrel, чтобы система понимала, что это новый билд;

  • pkgdesc="Kawai-Focus is a focus-training app based on the Pomodoro timer." — краткое описание пакета, показывается в списках и при запросе информации о пакете;

  • arch=('x86_64') — архитектура пакета. Здесь указана только 64-битная версия Linux;

  • url="https://github.com/Arduinum/kawai-focus-v2" — ссылка на домашнюю страницу или репозиторий проекта;

  • license=('MIT') — лицензия программного обеспечения, по которой распространяется пакет;

  • depends=('webkit2gtk-4.1' 'libsoup3' 'gtk3' 'cairo' 'gdk-pixbuf2' 'glib2' 'pango') — список зависимостей, которые должны быть установлены для работы приложения;

  • source=("Kawai-Focus_${pkgver}_amd64.deb::https://github.com/Arduinum/kawai-focus-v2/releases/download/${pkgver}-alpha.1/Kawai-Focus_${pkgver}_amd64.deb") — источник пакета для сборки. Здесь указывается конкретный .deb файл с GitHub, который будет скачан;

  • sha256sums=('SKIP') — хеш-сумма файла для проверки целостности. SKIP используется, если проверка не нужна или невозможна;

  • package() — функция сборки пакета. Всё, что внутри, выполняется для подготовки файлов к установке в систему:

    • cd "$srcdir" — переходим в директорию, куда был скачан источник;

    • ar x Kawai-Focus_${pkgver}_amd64.deb — распаковываем .deb архив (формат Debian);

    • tar -xf data.tar.* — извлекаем содержимое пакета .deb (основные файлы приложения);

    • cp -r usr "$pkgdir" — копируем содержимое в директорию пакета Arch Linux ($pkgdir), чтобы оно корректно установилось через pacman.

Запуск сборки и установки

Перед непосредственной сборкой нужно получить хеш-суммы. Для этого необходимо установить pacman-contrib, в котором содержится утилита updpkgsums для подсчёта хеша.

sudo pacman -S pacman-contrib

Теперь подсчитаем сам хеш:

updpkgsums

Вывод в terminal:

> Получение исходных файлов...
  -> Найден Kawai-Focus_0.1.0_amd64.deb
> Подсчёт контрольных сумм исходных файлов...

После выполнения команды updpkgsums в файле рецепта перезапишется строка SKIP на строку хеша. В моём случае она теперь выглядит так.

sha256sums=('3ff49a4e124daafb5e660738c275b53ccf3116e759cd6cafde8b77b2257799a6')

Теперь можно запускать сам процесс сборки.

makepkg -si

Что делает makepkg?

  1. Читает переменные из PKGBUILD (pkgname, pkgver, depends и т.д.);

  2. Скачивает файлы из source;

  3. Запускает функции в порядке: prepare(), build(), package() (если они определены);

  4. Создаёт пакет Arch Linux — .pkg.tar.zst;

  5. -s — автоматически ищет и устанавливает зависимости (depends) через pacman перед сборкой;

  6. -i — после сборки устанавливает созданный пакет через pacman

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

> Сборка пакета kawai-focus 0.1.0-1 (Вт 10 мар 2026 16:52:14)
> Проверка зависимостей для запуска...
> Установка недостающих зависимостей...
[sudo] пароль для user_name: 
разрешение зависимостей...
проверка конфликтов...

Пакет (8)                      Новая версия         Изменение размера  Размер загрузки

cachyos-extra-v3/enchant       2.8.14-1.1                    0,27 MiB         0,07 MiB
cachyos-extra-v3/harfbuzz-icu  12.3.2-1.1                    0,02 MiB         0,01 MiB
cachyos-extra-v3/hyphen        2.8.8-6.2                     0,04 MiB         0,02 MiB
cachyos-extra-v3/libavif       1.3.0-5.1                     0,82 MiB         0,30 MiB
cachyos-extra-v3/libmanette    0.2.13-1.1                    0,40 MiB         0,06 MiB
cachyos-extra-v3/libyuv        r2426+464c51a03-1.1           3,08 MiB         0,55 MiB
cachyos-extra-v3/woff2         1.0.2-6.1                     0,19 MiB         0,06 MiB
extra/webkit2gtk-4.1           2.50.5-1                    127,87 MiB        34,27 MiB

Будет загружено:     35,34 MiB
Будет установлено:  132,68 MiB

:: Приступить к установке? [Y/n]

Разбор зависимостей:

  • enchant 2.8.14-1.1 — библиотека для проверки орфографии, позволяет работать с разными словарями (Hunspell, Aspell и т.д.);

  • harfbuzz-icu 12.3.2-1.1 — модуль HarfBuzz для сложной текстовой раскладки (OpenType, шрифты) с поддержкой Unicode через ICU;

  • hyphen 2.8.8-6.2 — библиотека для автоматического переноса слов, используется при рендеринге текста;

  • libavif 1.3.0-5.1 — библиотека для работы с изображениями в формате AVIF (эффективный формат сжатия изображений);

  • libmanette 0.2.13-1.1 — библиотека для работы с игровыми контроллерами (геймпадами);

  • libyuv r2426+464c51a03-1.1 — библиотека для обработки видео/изображений (конвертация форматов, масштабирование, цветокоррекция);

  • woff2 1.0.2-6.1 — библиотека для работы с веб-шрифтами WOFF2 (Web Open Font Format 2);

  • webkit2gtk-4.1 2.50.5-1 — движок WebKit для рендеринга HTML/CSS/JS в GTK-приложениях, позволяет встроить полноценный веб-браузер в приложение.

Интерфейс предлагает либо приступить, либо отказаться от установки зависимостей, введя [Y/n].

После установки зависимостей начинается процесс самой сборки.

> Сборка пакета kawai-focus 0.1.0-1 (Вт 10 мар 2026 17:06:45)
> Проверка зависимостей для запуска...
> Проверка зависимостей для сборки...
> Получение исходных файлов...
  -> Найден Kawai-Focus_0.1.0_amd64.deb
> Проверка файлов source с использованием sha256sums...
    Kawai-Focus_0.1.0_amd64.deb ... Готово
> Распаковка исходных файлов...
  -> Распаковка 'Kawai-Focus_0.1.0_amd64.deb' с помощью bsdtar
> Удаление директории '$pkgdir/'...
> Вход в окружение fakeroot...
> Запускается package()...
> Очистка...
  -> Удаление файлов libtool...
  -> Удаление статических библиотек...
  -> Удаление ненужных файлов...
  -> Удаление отладочной информации из бинарников и библиотек...
  -> Сжатие документации (man и info)...
> Проверка сборки на ошибки...
> Создание пакета "kawai-focus"...
  -> Создание файла '.PKGINFO'...
  -> Создание файла '.BUILDINFO'...
  -> Создание файла '.MTREE'...
  -> Сжатие пакета...
> Выход из окружения fakeroot.
> Завершена сборка пакета kawai-focus 0.1.0-1 (Вт 10 мар 2026 17:06:47)

Сборка прошла успешно, и у меня появился файл kawai-focus-0.1.0-1-x86_64.pkg.tar.zst.

Разберём формат файла:

  • .pkg — это пакет Arch Linux;

  • .tar — внутри пакет просто архив с файлами программы;

  • .zst — сжатие с помощью Zstandard, современного и эффективного алгоритма сжатия.

Далее происходит процесс установки пакета.

> Установка пакета 'kawai-focus' с помощью 'pacman -U'...
[sudo] пароль для user_name: 
загрузка пакетов...
разрешение зависимостей...
проверка конфликтов...

Пакет (1)        Новая версия  Изменение размера

kawai-focus  0.1.0-1                9,96 MiB

Будет установлено:  9,96 MiB

:: Приступить к установке? [Y/n] y
(1/1) проверка ключей                                              [------------------------------------] 100%
(1/1) проверка целостности пакета                                  [------------------------------------] 100%
(1/1) загрузка файлов пакетов                                      [------------------------------------] 100%
(1/1) проверка конфликтов файлов                                   [------------------------------------] 100%
:: Обработка изменений пакета...
(1/1) установка kawai-focus                                  [------------------------------------] 100%
:: Запуск post-transaction hooks...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Updating icon theme caches...
(3/3) Updating the desktop file MIME type cache...

Все этапы установки прошли успешно. После этого естественно возникает вопрос: работает ли пакет в Arch? Как часто бывает, без багов и проблем редко обходится. В моём случае именно это и произошло.

О результатах тестирования и исправлении багов будет рассказано далее в статье.


Баги запуска и их исправление

Как я писал в предыдущем разделе, у меня возникли некоторые проблемы при запуске. При запуске приложения через ярлык оно открывалось с пустым экраном и тут же вылетало. Как обычно в таких ситуациях, я решил запускать приложение через терминал, чтобы увидеть ошибки, которые не видны при обычном запуске через ярлык.

Ошибка в названии приложения

Первая ошибка довольно банальна и связана с именем приложения. Я узнал о ней, как только попытался запустить приложение по его предполагаемому названию kawai-focus. Система выдала сообщение:

command not found: kawai-focus

Это означает, что команда с названием kawai-focus не найдена.

Оказалось, что в файле Cargo.toml я оставил дефолтное название приложения — app. Из-за этого система не может физически найти приложение по имени kawai-focus. К счастью, эту ошибку легко исправить: нужно переименовать приложение, затем заново пересобрать его в deb-пакет, опубликовать на GitHub и пересобрать под Arch. Что я и сделаю после исправления всех багов запуска.

[package]
name = "kawai-focus"

Error 71 (Ошибка протокола)

Прежде чем пересобрать приложение ради имени, я хотел убедиться, что оно вообще работает. Поэтому я решил запустить приложение для отладки напрямую через бинарник app.

❯ /usr/bin/app

И получил сообщение с ошибкой:

Gdk-Message: 18:15:42.584: Error 71 (Ошибка протокола) dispatching to Wayland display.

Эта ошибка возникает, когда приложение отправляет некорректный или неожиданный запрос Wayland-композитору. Чаще всего это происходит из-за несовместимости версий библиотек GTK/WebKit с сервером Wayland или из-за бага в приложении. Иногда ошибка появляется при запуске X11-приложения через слой совместимости XWayland.

Далее я изучал операционную систему и интернет в поисках причин и решений. Не буду перечислять весь путь, который я прошёл, а сразу перейду к конкретным причинам и решению.

Перебирая возможные причины, я обнаружил, что в системе нет GBM и GDK. Узнал я это, посмотрев содержимое соответствующих переменных, которые оказались пустыми:

echo $GBM_BACKEND
echo $GDK_BACKEND

GBM — это библиотека (Generic Buffer Management), которая используется графическим стеком Linux для управления видеобуферами между драйверами GPU, Mesa и Wayland.

GDK — это библиотека (GIMP Drawing Kit), являющаяся низкоуровневым слоем графической системы GTK, которая взаимодействует с оконными системами вроде X11 или Wayland.

Более подробно можно узнать, какой backend используется GBM, посмотрев файл nvidia-drm_gbm.so.

❯ ls -la /usr/lib/gbm/nvidia-drm_gbm.so

Результат команды:

lrwxrwxrwx - root  4 фев 18:46  /usr/lib/gbm/nvidia-drm_gbm.so -> ../libnvidia-allocator.so.590.48.01

В итоге видно, что он ссылается на библиотеку NVIDIA libnvidia-allocator.so.590.48.01.

libnvidia-allocator.so — это внутренняя библиотека драйвера NVIDIA, отвечающая за выделение и управление видеопамятью GPU для графических приложений.

В ней нет реализаций GBM или GDK, поскольку драйвер NVIDIA использует собственный механизм работы с видеобуферами, а не стандартную реализацию Mesa.

Исправление ошибки 71

В моём случае есть несколько способов исправить данную ошибку: установить другой драйвер (например, Nouveau) или попытаться отключить использование GBM и GDK во время запуска, задав соответствующие переменные окружения.

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

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

flags.rs

Первое, что я сделал — написал функции, отвечающие за работу флагов, и создал для них отдельный файл flags.rs. Идея проста: если в аргументах командной строки (args) появляется флаг с нужным названием (например, --help), задаём переменной значение 1, иначе игнорируем. Дополнительно я сделал так, чтобы эти функции работали только на Linux; на остальных системах их не будет.

Функция apply_linux_cli_flags()

Эта функция отвечает за включение нужных переменных окружения:

#[cfg(target_os = "linux")]
pub fn apply_linux_cli_flags() {
    let disable_webkit_compositing_mode = std::env::args().any(|a| a  "--webkit-disable-compositing-mode");
    if disable_webkit_compositing_mode {
        unsafe { std::env::set_var("WEBKIT_DISABLE_COMPOSITING_MODE", "1"); }
    }

    let webkit_disable_dmabuf_renderer = std::env::args().any(|a| a  "--webkit-disable-dmabuf-renderer");
    if webkit_disable_dmabuf_renderer {
        unsafe { std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); }
    }

    let nv_disable_explicit_sync = std::env::args().any(|a| a  "--nv-disable-explicit-sync");
    if nv_disable_explicit_sync {
        unsafe { std::env::set_var("__NV_DISABLE_EXPLICIT_SYNC", "1"); }
    }
}

Функция обрабатывает CLI-флаги, переданные при запуске программы в Linux.
Она проверяет аргументы командной строки (std::env::args()) и, если находит определённые флаги, устанавливает соответствующие переменные окружения.

  • --webkit-disable-compositing-mode — станавливает переменную WEBKIT_DISABLE_COMPOSITING_MODE=1, отключая compositing-режим WebKit. Может помочь при графических артефактах;

  • --webkit-disable-dmabuf-renderer — устанавливает WEBKIT_DISABLE_DMABUF_RENDERER=1, отключая рендерер DMA-BUF в WebKit. Используется для обхода проблем Wayland и GBM;

  • --nv-disable-explicit-sync — устанавливает __NV_DISABLE_EXPLICIT_SYNC=1, отключая механизм explicit sync в драйверах NVIDIA, что иногда устраняет зависания интерфейса.

Функция компилируется только для Linux благодаря атрибуту #[cfg(target_os = "linux")]. Хочу обратить внимание, что перед функцией стоит pub, а значит они публичные и их можно импортировать. Без этого Rust не даст произвести импорт этих функций.

Функция print_help()

Эта функция содержит текстовое описание команд и помощь по флагам. Я вынес её отдельно, так как текста очень много.

#[cfg(target_os = "linux")]
pub fn print_help() {
    println!(
r#"Kawai Focus — Pomodoro таймер

Использование:
    kawai-focus [FLAGS]

Флаги (Linux):

    --webkit-disable-compositing-mode
        Отключает WebKit compositing mode.
        Помогает при графических артефактах на некоторых GPU.

    --webkit-disable-dmabuf-renderer
        Отключает DMA-BUF renderer WebKit.
        Полезно при проблемах с Wayland и с отсутствием GBM.

    --nv-disable-explicit-sync
        Отключает explicit sync драйвера NVIDIA.
        Иногда исправляет: зависания интерфейса, проблемы с отсутствием GBM.

    --help
        Показать эту справку и выйти.
"#);
}

Функция печатает:

  • Название программы;

  • Пример использования (kawai-focus [FLAGS]);

  • Описание доступных флагов для Linux;

  • Краткое объяснение, что делает каждый флаг.

Фрагмент функции lib.rs

Настало время ��одключить новые функции в код файла lib.rs.

mod flags;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    #[cfg(target_os = "linux")]
    if std::env::args().any(|a| a  "--help" || a  "-h") {
        flags::print_help();
        std::process::exit(0);
    }

    #[cfg(target_os = "linux")]
    flags::apply_linux_cli_flags();
    // Другой код
}

Разбор нового кода:

  • mod flags; — подключает модуль flags, в котором находятся функции для работы с CLI-флагами (print_help, apply_linux_cli_flags).

  • Проверка --help или -h — если пользователь запускает программу с этим флагом:

    • вызывается flags::print_help() для вывода справки,

    • затем std::process::exit(0) завершает программу (для того чтоб не запустилась сама программа после запуска help).

  • flags::apply_linux_cli_flags(); — обрабатывает остальные CLI-флаги и устанавливает соответствующие переменные окружения.

  • // Другой код — далее продолжается обычная логика запуска приложения.

Переименование lib_app

Финальным штрихом я переименовал lib_app в kawai_focus, чтобы имя крейта совпадало с названием проекта, а вызов выглядел понятнее и чище (kawai_focus::run() вместо lib_app::run()). Это улучшает читаемость и делает структуру проекта более логичной.

Имя крейта — это имя библиотеки или пакета в языке Rust, под которым её можно подключать и использовать в коде. Крейтом в Rust называют единицу компиляции: это может быть либо библиотека (lib.rs), либо исполняемая программа (main.rs).

[lib]
name = "kawai_focus"

name в секции [lib] файла Cargo.toml задаёт имя библиотечного крейта, под которым он будет импортироваться в коде. По умолчанию Cargo использует имя пакета, но его можно переопределить через этот параметр.

Обновлённый код в функции main():

kawai_focus::run();

Выражение kawai_focus::run(); означает вызов функции run, которая находится в корневом модуле библиотечного крейта kawai_focus. То есть бинарный файл (main.rs) обращается к коду библиотеки и запускает основную логику приложения.

Теперь всё готово для пересборки и проверки запуска.


Проверка запуска

Процесс пересборки я показывать не буду, так как уже рассказал о нём ранее, а перейду сразу к проверке запуска.

флаг --help
флаг --help

Как видно из скриншота, команда kawai-focus теперь распознаётся системой. Также видно, что приложение, запущенное без флагов, по-прежнему не стартует из-за ошибки 71 — это нормально для моей ситуации.

Приложение, запущенное с флагом --help, успешно показывает подсказки по флагам без вылетов, так как в этом режиме не происходит работа с дисплеем, и само приложение не стартует.

Теперь приступлю к самой важной проверке — проверке работы остальных флагов, которые должны помочь с проблемой отсутствия GBM и GDK на NVIDIA в м��ей системе.

app c флагами
app c флагами

Как видно из скриншота, флаги сработали, и приложение успешно стартует. Причём в моём случае работает любой из трёх флагов. Для NVIDIA лучше использовать флаг --nv-disable-explicit-sync, так как он оказывает минимальное влияние на систему. На других видеокартах лучше использовать один из двух других.

Я также написал инструкцию и залил файл рецепта PKGBUILD на свой GitHub в releases для удобства пользователей. Теперь ещё до установки программы пользователи будут знать о существовании флагов, которые помогают с возможными проблемами приложения.

рецепт на github
рецепт на github

Есть хорошие новости по поводу запуска: мою инструкцию успел испытать Сергей и успешно запустил приложение у себя. В его случае запуск прошёл без использования флагов, так как у него видеокарта AMD, и в системе есть все необходимые компоненты для успешного старта. Это подтверждает, что данные флаги не нужно применять всем пользователям.

Тест приложения Сергеем
Тест приложения Сергеем

Иван также помогал с тестированием, но он делал его ещё до исправления бага. Его пример хорошо показывает, как запуск выглядел до фиксов.

Тест приложения Иваном
Тест приложения Иваном

В первой строке видно, что он пытался использовать устаревший X11 в качестве сессии, и приложение вылетело с ошибкой 71. Прямое использование WEBKIT_DISABLE_DMABUF_RENDERER=1 дало возможность успешно запустить приложение.

Хочу поблагодарить Сергея и Ивана за помощь в тестировании. Сергей также рассказал о WEBKIT_DISABLE_COMPOSITING_MODE в issue, а Иван делал ревью предыдущих статей и рассказывал о существовании yay и других AUR-helper.


Анонс на следующие статьи

Рубеж сборки под Linux почти пройден. Теперь моё приложение поддерживает довольно большое количество популярных дистрибутивов, таких как Debian, Ubuntu, Fedora и сегодняшний герой — Arch. Также я залил обновлённый .rpm файл после пересборки. Если у кого-то есть желание и возможность проверить работу моего приложения на одной из систем, поддерживающих .rpm пакеты, напишите о результатах своих тестов в комментариях на Хабр или на «Кот на салфетке».

В этой статье я не включил добавление рецепта сборки в Arch User Repository (AUR) и проверку сборки приложения с помощью AUR-helper (например, yay). Эти темы я перенесу в следующую статью.

Ещё в следующей статье предстоит раскрыть довольно интересную и для меня пока непознанную тему — сборку приложения Tauri под Windows! Я пока даже не догадываюсь, какие возможные баги и проблемы могут меня поджидать на этой операционной системе от Microsoft, которую редко любят линуксоиды.


Ссылки к статье