みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yoctoで作ったLinuxでQt5 アプリケーションのフォントが表示されない

yoctoでmeta-qt5を組み込んで、Qt5アプリケーションを起動させた時に、次のようなエラーメッセージが表示され、文字が正しく表示されない問題が発生した。

QFontDatabase: Cannot find font directory /usr/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
QFontDatabase: Cannot find font directory /usr/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
QFontDatabase: Cannot find font directory /usr/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
QFontDatabase: Cannot find font directory /usr/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
QFontDatabase: Cannot find font directory /usr/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig

local.confでは次のように定義してあるため、ttf-dejavu関連のパッケージはインストールしてある。

# fonts
IMAGE_INSTALL_append = " \
             ttf-dejavu-common \
             ttf-dejavu-sans \
             ttf-dejavu-serif \
"

これらのパッケージは、/usr/share/fonts/truetype以下にttfファイルをインストールするようになっているが、 Qt5が/usr/lib/fontsにフォントファイルが配置されていることを期待しているため、フォントを見つけられないということらしい。

対策

ここの一連のスレッドを読むと、同じ問題に引っかかっている人が、 フォントのレシピにbbappendを作成して、インストール先を変更することで、問題を解決している。

#
# This method from 
#  https://lists.yoctoproject.org/pipermail/yocto/2016-October/032453.html
#

do_install() {
    install -d ${D}${libdir}/fonts/
    find ./ -name '*.tt[cf]' -exec install -m 0644 {} ${D}${libdir}/fonts/ \;
    install -d ${D}${sysconfdir}/fonts/conf.d/
    install -m 0644 ${WORKDIR}/30-dejavu-aliases.conf ${D}${sysconfdir}/fonts/conf.d/
}

FILES_${PN}-sans            = "${libdir}/fonts/DejaVuSans.ttf ${libdir}/fonts/DejaVuSans-*.ttf"
FILES_${PN}-sans-mono       = "${libdir}/fonts/DejaVuSansMono*.ttf"
FILES_${PN}-sans-condensed  = "${libdir}/fonts/DejaVuSansCondensed*.ttf"
FILES_${PN}-serif           = "${libdir}/fonts/DejaVuSerif.ttf ${libdir}/fonts/DejaVuSerif-*.ttf"
FILES_${PN}-serif-condensed = "${libdir}/fonts/DejaVuSerifCondensed*.ttf"
FILES_${PN}-mathtexgyre     = "${libdir}/fonts/DejaVuMathTeXGyre.ttf"

bbappendは次のコマンドで作成すると適切な場所に空のファイルを作成しエディタで開いてくれるため簡単。

$ recipetool newappend meta-local ttf-dejavu -e

ここでは予めmeta-localというレイヤを作ってあることを前提としている。

meta-localも次のように作ることができる。

$ yocto-layer create local 10
$ bitbake-layers add-layer ./meta-local

ディレクトリ構成は手抜き。