[devel] Нехватка зависимостей на утилиты обслуживания общесистемных баз.

Igor Vlasenko vlasenko на imath.kiev.ua
Пн Ноя 22 23:48:32 MSK 2021


Нехватка зависимостей на утилиты обслуживания общесистемных баз.

Уважаемые коллеги,

приглашаю продолжить обсуждение политики
https://www.altlinux.org/Упаковка_WM.

Тезис.

В разделе Упаковка_WM#Зависимости_на_общие_утилиты_freedesktop
требовалось, чтобы DE вытягивали пакеты с утилитами
update-mime-database (пакет shared-mime-info),
update-desktop-database (пакет desktop-file-utils).
Это было введено еще в версии 1.0, но соблюдалось не всеми.

Мотивация была такая, что эти утилиты нужны для нормальной работы с
mime типами и их обработчиками в desktop файлах.

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

С утилитами выше ситуация хитрее, так как на них есть зависимости с пакетов.
Те же desktop-file-utils скорее всего придут в образ дистрибутива то
ли как зависимости wine, то ли как зависимости flatpak.

А могут и не прийти или быть снесены пользователями в простоте своей.
Надо как-то принуждать их наличие,
и(ли) на высшем уровне mkimage-profiles, и(ли) на среднем уровне DE,
и(ли) на низком уровне тулкитов.

Антитезис.

Оппонентом в дискуссии выступил уважаемый Сергей Турчин (zerg@),
который высказался за то, что в целом все это не нужно:

В обсуждении
https://lists.altlinux.org/pipermail/devel/2021-November/215821.html
> эти "системные БД" корявы самим своим существованием.

Я начал в ответ махать спецификацией freedesktop.org/shared-mime-info,
но в https://lists.altlinux.org/pipermail/devel/2021-November/215832.html
Сергей отметил, что из спецификации необходимость этих утилит не следует:

> > https://specifications.freedesktop.org/shared-mime-info-spec
> > и база и кеш в ~/.local/share/mime ее не заменяют, а дополняют.
> Нет там такого. Особенно про кэш.

> > Хотелось бы пруфы, действительно ли спецификация не рабочая в части
> > необходимиости общесистемных кешей.
> Там вообще нигде не сказано, что кэши должен кто-то читать. Только xml-данные.

что действительно так,
из спецификации необходимость этих утилит не следует.

Однако меня не покидало чувство, что где-то мы здесь накалываемся,
поэтому по пословице "raise your force, use the source" я взял паузу
на погружение в исходники.

И здесь меня ждал ряд открытий чудных.

Разбор полетов.

проследив за _xdg_mime_glob_read_from_file в
 glib-2.68.4/gio/xdgmime/xdgmime*
пришел к выводу, что в glib libgio вообще не читает xml-данные,
а только mmap-ит в память сгенерированный с помощью update-mime-database
кеш /mime.cache (который якобы не нужен) и другие сгенерированные
с помощью update-mime-database файлы: globs, magic, aliases, icons.

И это действительно хорошее дизайнерское решение. Приложениям не нужно
мониторить дерево в /usr/share/mime/ с десятками каталогов и тысячами файлов.
Достаточно менеджера пакетов и файл-триггера.

Получается, libgio без mime.cache корректно работать не будет.

Но при этом в libgio есть явная зависимость на update-mime-database
(пакет shared-mime-info), так что все в порядке.

Далее я полез в qt5, что вотчина уважаемого zerg на .
Оказалось, см.
qtbase-everywhere-src-5.15.2/src/corelib/mimetypes/qmime*
что "не нужный" /mime.cache предательски просочился и туда.
Если qt5 собран на нормальном Unix'е (#define QT_USE_MMAP)
то провайдер по умолчанию для базы mime просто mmap-ит mime.cache!

Да, если shared-mime-info не будет, или их снесет наивный
пользователь (а ведь из-за несоблюдения полиси пакет
shared-mime-info в KDE втягивается чудом, сбоку,
через кривую зависимость в plasma5-bluedevil)
то в qt5 на этот случай предусмотрен альтернативный провайдер,
который ползает по дереву /usr/share/mime и парсит xml'ы.
К сожалению, он не будет работать, так как пакет shared-mime-info
снесет большую часть этих самых xml'ов.

Но на этот случай в qt предусмотрена сферическая в вакууме
"mimetype-database". это готовый абстрактный набор типов mime, для
Windows, \macos, and iOS systems, у которых своей системной XDG MIME
database нету.
Она статически влинковывается в libQt5Core.so.5 через файл
qmimeprovider_database.cpp (1.5Mb), генерируемый из xml исходника
src/corelib/mimetypes/mime/packages/freedesktop.org.xml (2.2Mb)
в итоге утяжеляя получившийся бинарник libQt5Core.so.5 (6Mb) на 256Kb
сжатого блоба (~ 5%).

Так что, по хорошему, в qt5base надо добавить явную зависимость на
update-mime-database (пакет shared-mime-info).

Тогда по сути зависимости на update-mime-database уйдут на нижний
уровень (тулкитов), и на среднем уровне требование зависимости на них
можно будет ослабить до рекомендации.

И чтобы 2 раза не вставать, хотел бы отметить, что начиная с qt 5.13
появилась опция сборки -no-mimetype-database,
смысл которой не таскать внутри libQt5Core.so.5 блоб из сжатого
freedesktop.org.xml, так как все равно используется /usr/share/mime.

Хорошо бы собирать libqt5-core c этой опцией.

 - QMimeDatabase:
   * Added configure option -no-mimetype-database that tells Qt not to
     bundle its own copy of the XDG MIME database. If this option is
     passed, QMimeDatabase will only work if there's a system copy in
     $XDG_DATA_DIRS/mime. This option is useful for Linux distributions
     that ensure the data is always present.

qtbase-everywhere-src-5.15.2/src/corelib/mimetypes/qmimedatabase.cpp

/*!
    \class QMimeDatabase
    \inmodule QtCore
    \brief The QMimeDatabase class maintains a database of MIME types.

    \since 5.0

    The MIME type database is provided by the freedesktop.org shared-mime-info
    project. If the MIME type database cannot be found on the system, as is the case
    on most Windows, \macos, and iOS systems, Qt will use its own copy of it.
    ...
    On Unix systems, a binary cache is used for more performance. This cache is generated
    by the command "update-mime-database path", where path would be /opt/myapp/share/mime
    in the above example. Make sure to run this command when installing the MIME type
    definition file.
 */

Аналогично было бы хорошо добавить зависимость на desktop-file-utils в
libgio. В libgio кеш от update-desktop-database используется, для
случаев, не покрываемых mimeapps.list.
В qt5 и kde5 кеш от update-desktop-database не используется, и понятно
почему - нет поддержки системы специальных для KDE desktop файлов.

Будь прописаны зависимости на нижнем уровне тулкитов, требования к DE
можно было бы ослабить.

Но не следует их выбрасывать. Не забываем, что кроме glib+gtk и qt
есть и другие тулкиты (начиная с Enligtenment), и для них справедлива
та же петрушка: Разработчики либо уже внедрили, либо внедряют,
либо собираются внедрять стандарты Freedesktop.
Поэтому они либо уже должны бы тащить ту же update-mime-database,
либо собираются зависеть от update-mime-database,
либо будут зависеть от update-mime-database в будущем.

Поэтому условие, чтобы в дистрибутив вытягивались
update-mime-database (пакет shared-mime-info),
update-desktop-database (пакет desktop-file-utils)
стоит, IMHO, продублировать и на более высоких уровнях,
чтобы не стоять с палкой над каждым тулкитом.

В том числе в mkimage-profiles, как минимум для дистрибутивов с графической средой.

-- 

I V


Подробная информация о списке рассылки Devel