Меня бесит когда я тыкаю в файловом менеджере по бинарнику, и он не запускается, не выдавая никакой ошибки. А потом запускать его из консоли, и видеть что-то типа этого:
[username@localhost utorrent-linux-x86_64]$ ./utserver
utserver: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.16' not found (required by utserver)
Винда хотя бы окошко выдавала.
Поэтому, когда я решил собирать бинарь с лаунчером Minecraft для сервера Ttyh, я решил не просто положить Qt5 в архив с программой, но ещё и собрать его с максимально старой версией GLIBC: последняя версия имеет обратную совместимость со всеми старыми, а старая версия не имеет совместимости с новыми. Сказано - сделано, вот бинарь (если кому-нибудь нужен набор патчей для запуска Qt5 в CentOS 5 - говорите мне, я дам вам их). Работает абсолютно во всех версиях Linux, где есть Glibc 2.4 (а это 2006 год), Java и OpenGL. Осталось только дошлифовать детали, и можно делать RPM/DEB/tar.gz и выкладывать в раздел «Скачать лаунчер» сервера.
Что это за детали? Сглаживание шрифтов, внешний вид в GNOME и курсор мыши выглядят как говно. Как это можно починить? 1). Пропатчить Qtbase так, чтобы он научился старым fontconfig и GTK. 2). Собрать новые fontconfig и GTK, а затем таскать их в архиве с программой. Дело в том что есть некий набор библиотек, который обязан оставаться во всех десктопных дистрибутивах Linux, даже если вышла новая версия. Например у многих из нас все программы собраны с libjpeg8, но в /usr/lib по-прежнему остаётся лежать libjpeg62 - для совместимости со старыми приложениями. Поэтому freetype и fontconfig я не таскаю с игрой. Если же я соберу лаунчер с fontconfig 2.5 и не положу библиотеку с игрой, то все дистры с fontconfig 2.4 заругаются и не запустят игру - а это RHEL 5 и SLES 10, у которых немало пользователей.
Однако я решил сначала попробовать исправить ошибку компиляции с fontconfig 2.4.
fontdatabases/fontconfig/qtfontconfigdatabase.cpp:94: error:
'FC_WEIGHT_ULTRABLACK' was not declared in this scope
Вот тут советуют обновиться до fontconfig 2.5. Я же решил просто найти коммит, добавляющий эту строку кода, и откатить его. Вот список коммитов, изменяющих именно этот файл, вот тот самый, вот получившийся патч. Вот что получается:
fontdatabases/fontconfig/qfontconfigdatabase.cpp: In function ‘void populateFromPattern(FcPattern*)’:
fontdatabases/fontconfig/qfontconfigdatabase.cpp:400:34: error: ‘fonts’ was not declared in this scope
fontdatabases/fontconfig/qfontconfigdatabase.cpp:400:47: error: ‘i’ was not declared in this scope
Что дальше? Дальше добавлять поддержку GTK 2.10 в gtkstyle, либо класть более новый GTK в архив с игрой. Именно из-за того что таскать с собой GTK нехорошо Google прекратила поддержку Chrome в RHEL. Был скандал, Red Hat спросила Google «почему Windows XP 2001 года поддерживается, а RHEL 2011 нет?». А если ещё и заставить видеть старый CUPS и линковаться с Xinput 2 и PulseAudio через dlopen(), то вообще идеально будет, но для лаунчера они не нужны.
Системные курсоры не подхватываются скорее всего потому что нужно добавить параметр запуска, указывающий на директорию с ними. Мне пришлось делать аналогично для шрифтов, указав путь к ним с помощью QT_QPA_FONTDIR.
И наконец, RPM и DEB пакеты. Я собираюсь сделать всего лишь три зависимости: lsb-desktop, мета-пакеты для OpenGL и Java. Я решил выпендриться, и установить игру в /usr/games. В связи с этим вопросы:
- В Gentoo есть ибилд games-misc/games-envd, добавляющий директорию /usr/games (а по умолчанию её нет). Задумка такая: если юзерам на компе запрещено играть, то они не состоят в группе games. Есть ли такие пакеты в Fedora, Opensuse и Debian, и если да, как называются?
- Есть ли GID группы games, общий для всех дистрибутивов? Можно ли запаковать tar.gz так, чтобы root:games было прописано буковками, а не цифрами?
- Состоят ли пользователи в группе games по умолчанию, например в Ubuntu?
- Как называются мета-пакеты для OpenGL и Java? Допустим, у меня нет Java в системе, и пакет подтягивает openjdk. А если есть Oracle JDK, то openjdk тянуться не должен.