LINUX.ORG.RU

Статическая сборка Qt5 и шрифты

 ,


1

1

Привет, ЛОР.

Я сейчас осваиваю статическую сборку Qt5 для линукса. (Для Windows я эту задачу решил давно, в линуксе лично меня устраивает Qt из репозиториев, но понятно, что для пользователей произвольного дистрибутива, хотя бы в рамках x86_64, нужна универсальная сборка.)

Сборку веду из тарболла qt-everywhere-src-5.12.12.tar.xz под старенькой Ubuntu 18.04. Почему именно 5.12, а не 5.15 – в 5.15 поменялись ключи для включения libxcb в сборку (если её не включать, Qt при запуске прикладной программы будет искать xcb-плагин и разумеется, обломается), и новые ключи у меня пока не заработали.

Кроме очевидного build-essential, я доустановил (как раз для xcb) пакеты libx11-*, libxcb-*, libxkbcommon-dev и libxkbcommon-x11-dev, а также (на будущее, для OpenSSL) libssl-dev. Из конфига исключены QtWebEngine, QML и openGL (но QML и openGL я планирую вернуть потом).

Мой текущий configure для Qt:

QTDIR=/opt/Qt/5.12.12.st

sudo mkdir -p ${QTDIR}

./configure -opensource -confirm-license -platform linux-g++ -static -release \
 -skip qtwebengine -no-opengl \
 -qt-xcb -I /usr/include/xcb/ -L /usr/lib/x86_64-linux/gnu/ \
 -qt-zlib -qt-libpng -qt-libjpeg -openssl-linked -nomake examples -prefix ${QTDIR}

Далее понятно, make и sudo make install. Сборка прошла успешно. Далее собираю с этим Qt DoubleContact (пришлось немного пропатчить исходники, чтобы алгоритм прицепливания встроенного в Qt zlib-а работал). Полученный бинарник я вытаскиваю из виртуалки на хост (Manjaro KDE), запускаю. Открывается окно с табличками без единого символа. При этом видно, что логика программы работает, окна вызываются (если помнишь, куда тыкать).

В konsole ругань следующая:

QFontDatabase: Cannot find font directory /opt/Qt/5.12.12.st/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from https://dejavu-fonts.github.io/ for example) or switch to fontconfig.

Вопрос 1. Я правильно понимаю, что Qt именно в этом каталоге и собирается шрифты искать во время выполнения (судя по тому, что путь оказывается захардкожен в бинарник уже моей программы)? Если так, то это не то, что мне надо.

Исходя из этого предположения, я поискал другие пути. В принципе, через QFontDatabase::addApplicationFont() и QApplication::setFont() можно добавить любой нужный шрифт и даже добавить его в ресурсы программы. Программа при этом начинает показывать строки нормально… если ограничиваться одним шрифтом. Но у меня, например, в программе есть ещё и кутешный диалог выбора шрифтов для таблиц, и он при таком решении показывает только один шрифт – именно тот, который я добавил.

Вопрос 2. Можно ли как-то заставить программу искать шрифты уже в той системе, на которой он запускается? В том же QFontDatabase я вижу только методы добавления шрифтов по одному, я так понимаю, работе QFontDialog это не сильно поможет.

Вопрос 3. Формулировку «switch to fontconfig» я не очень понял, fontconfig – это ведь библиотека? И что мне с ней делать?

Интересно, что со статической сборкой под винду этой проблемы нет. Правда, виндовые сборки, которые я раньше распространял, основаны на более ранних версиях Qt (4.8 и 5.10).

Обновление. Проблема решилась по наводке анонимуса. Я поставил пакеты libfreetype6-dev и libfontconfig1-dev и в ./configure дополнительно к указанному выше написал:

-fontconfig -feature-freetype -system-freetype FREETYPE_INCDIR=/usr/include/freetype2

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

Отмечаю тему решённой. Но если у кого есть рабочий комплект ключей к Qt 5.15 (особенно в части libxcb) – будет интересно почитать и скорее всего, не только мне.

★★★★★

Последнее исправление: hobbit (всего исправлений: 9)

Оффтоп, но все же пользователи линукса обленились в край. Подавай им готовые сборки под все дистрибьютивы. Я к этому подошёл просто – на гитхабе собираются установщики для винды и пакеты для дебиана и убунты. Для остальных есть инструкция по сборке.

anonymous
()
Ответ на: комментарий от rumgot

Для Qt6 надо сначала просто добиться, чтобы проект её поддерживал, а потом уже замахиваться на статику. Такая задача стоит, но не прямо сейчас.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от anonymous

и пакеты для дебиана и убунты

:))) А следующий вопрос будет «для каких именно версий дебиана и убунты»? В зависимости от старательности автора это может означать ещё плюс до десятка разных сборок.

Нет, можно и универсальный DEB сделать (так делают некоторые поставщики проприетарного ПО, например), но это означает, что в этот DEB я засуну либо все нужные .so, либо опять-таки статику, возвращаемся к началу темы.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

А следующий вопрос будет «для каких именно версий дебиана и убунты»?

Кратко: для актуальных. Подробнее: для тех, у которых есть готовый образ на докерхабе. Конкретно:

  • Ubuntu: focal, jammy, mantic, noble
  • Debian: bullseye, bookworm, trixie

И yml при этом совсем не монструозный.

anonymous
()
Ответ на: комментарий от anonymous

Итого 7. Ну чуть-чуть ошибся. :) Хотя в дебианы я бы ещё Buster добавил, знаю пользующихся oldoldstable.

Но в принципе, здравое зерно в этом есть, если процесс автоматизировать до такой степени, что он не будет отнимать много времени, почему бы и нет… За yml спасибо, пригодится если не мне, то кому-нибудь ещё.

С другой стороны – обязательно найдётся некоторое количество несправедливо обиженных, у которых дистрибутив окажется в «неактуальных». Так что статику всё-таки желательно иметь. Хотя бы как запасной вариант.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от hobbit

Вообще не отнимает время. Пушим тэг в мастер и github actions делает сборки и черновик релиза. Добавляем описание выпуска и публикуем. И на это все нужно минут десять.

anonymous
()
Ответ на: комментарий от kott

Как ни странно, идея AppImage совершенно не противоречит тому, чтобы внутрь него запихать статическую сборку. Более того, это будет компактнее, чем набор из программы и нужных для неё кутешных библиотек (другая программа в другом AppImage всё равно со своим набором пойдёт).

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от kott

про OBS

Я пробовал когда-то давно. Там слишком много непонятных сущностей (кроме «проекта» и «модуля» есть что-то ещё, и вот на этом чём-то ещё я споткнулся, чем оно отличается от первых двух). Возможно, попробую ещё (дело было давно, AppImage там тогда ещё не было).

Но сейчас я уже тупо хочу пройти путём «сделай сам», тем более, на 80-90% он пройден.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

обязательно найдётся некоторое количество несправедливо обиженных, у которых дистрибутив окажется в «неактуальных»

Конечно найдется. Тот кто на oldoldstable наверняка ещё и на 32 битах. Плюс всякие arm, плюс маководы. И ещё дистры с rpm. А так же Арч и Гента. На всех не угодишь. И со статикой тоже: всегда найдется продвинутый пользователь с вайлендом у которого что-то бородит. Вот для всех них есть инструкция по сборке и «мы принимаем пуллреквесты с вашими преложениями».

anonymous
()

Открывается окно с табличками без единого символа.

Это как же надо описать необходимый шрифт, чтобы не был загружен ни один из установленных в системе…

raspopov
()
Последнее исправление: raspopov (всего исправлений: 1)

Хмм.. Возникли трудности в пакетировании для разных дистров или надоело восстанавливать работоспособность при апгрейде дистра?

anonymous
()
Ответ на: комментарий от rumgot

Кстати, @roxton таки сумел в три мажорные версии Qt без потери совместимости:

TEA is a C++, Qt(4,5,6) text editor with the hundreds of features for Linux, *BSD, Mac, Windows, OS/2 and Haiku.

Пруф для неЪ

Мой ему респект, проторил дорожку. Я тоже попробую.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от anonymous

Нужны всего две версии snap и flatpak. А борцы с ветрянными мельницами в шапочках из фольги пусть истерят в комментариях

Опять-таки, поясни это утверждение.

rumgot ★★★★★
()
Ответ на: комментарий от anonymous

У этого подхода есть и плюсы. В том же флетхабе прога будет не дальше 5 страницы в своей категории, о ней узнают больше людей чем если просто её в какую-то репу засунуть… Те в целях самопиара лучше использовать то что по мнению упоротых «не нужно»

anonymous
()
Ответ на: комментарий от anonymous

в целях самопиара лучше использовать…

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

anonymous
()
Ответ на: комментарий от rumgot

Ну.. «сферический пример», оторванный от реальности:

Злодеи-мантейнеры арча некорректно обновили пустяшную библиотечку ICU, а тебе нужно вносить данные в app - блокнот/бд. )

anonymous
()
Ответ на: комментарий от anonymous

Получилось! Дополнительно пришлось поставить пакеты libfreetype6-dev и libfontconfig1-dev и в ./configure явно указать include-путь к FreeType (см. обновление к ОП).

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от IIIypuk

Я в курсе, 4 и 5 у меня поддерживаются сейчас, и в общем, условных компиляций очень мало. Но 3 ветки это другой уровень (нередко какую-то фичу в N+1 объявляют deprecated, а в N+2 удаляют, вот тут и повеселимся…).

hobbit ★★★★★
() автор топика