diary/Kojima

・meinproc

年明けくらいからGCC-5.3ベースでQt5/KDE5をビルドしているのだけれど、 kpackage-5.15.0をビルドしようとすると、kdoctools catalog が見つからない、というエラーになる。

Scanning dependencies of target po-nl-docs-kpackagetool-kpackagetool5-1
[  4%] Generating po/de/docs/kpackagetool/kpackagetool5.1
[  4%] Generating po/ca/docs/kpackagetool/kpackagetool5.1
[  4%] Generating po/nl/docs/kpackagetool/kpackagetool5.1
Could not locate file "kf5/kdoctools/customization" in ("/home/kojima2/.local/share", "/opt/kde/share", "/usr/share")
Could not locate file "kf5/kdoctools/customization" in ("/home/kojima2/.local/share", "/opt/kde/share", "/usr/share")
...Error: Could not find kdoctools catalogs
Error: Could not find kdoctools catalogs
Could not locate file "kf5/kdoctools/customization" in ("/home/kojima2/.localn/share", "/opt/kde/share", "/usr/share")
Error: Could not find kdoctools catalogs

kdoctoolsはこのパッケージの直前にビルド、インストールしているのにおかしいなぁ、、と追いかけてみたところ、どうやらこのエラーは kdoctoolsの xslt.cpp の、getKDocToolsCatalogs() で起きているらしいことが分かった。

このファイルを見ると、locateFilesInDtdResource()の中で、QStandardPaths::GenericDatalocation を使って、カタログファイルを探しているらしい。

今ビルドしている環境は、Qt4/KDE4と共存させようと、Qt5は/opt/qt5/、KDE Framework5は/opt/kf5/にインストールしているので、カタログファイルは /opt/kf5/share/kf5/kdoctools/customization/ にインストールされているのだけれど、このディレクトリは QStandardPaths::GenericDatalocation のチェック対象にはなっていないらしい。

この指定はQt5のレベルだよなぁ、、とQt5のソースまで追いかけてみたところ、qtbase/src/corelib/io/qstandardpaths_unix.cpp の中で GenericDatalocation の定義を見つけた。

    case AppDataLocation:
    case AppLocalDataLocation:
    case GenericDataLocation:
    {
        QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
        if (isTestModeEnabled())
            xdgDataHome = QDir::homePath() + QLatin1String("/.qttest/share");
        if (xdgDataHome.isEmpty())
            xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
        if (type == AppDataLocation || type == AppLocalDataLocation)
            appendOrganizationAndApp(xdgDataHome);
        return xdgDataHome;

この定義を見るかぎり、カタログファイルの探し先は "XDG_DATA_HOME" な環境変数で指定できることが分かったので、kpackageをビルドする際に export "XDG_DATA_HOME"=/opt/kf5/share を追加してやれば無事カタログファイルが見つかってビルドが通るようになった。

この環境変数を見つけるために、半日がかかりでkdoctoolsのソースからQt5のソースコードまで追いかけていったわけで、はたから見れば「わざわざ何やってるんだか、、」な話ではあるのだけれど、あれこれ仮説を立てて試行錯誤しながら「これだ!」というのを見つけた瞬間って、アルキメデスが「エウレカ!」といって風呂から裸で飛び出した時同様、テンション上がるんだよな(w

こういう「エウレカ!」感が研究者が研究を進める醍醐味だと思うけど、わざわざそのためによそから金を貰ってこなくても、ソフトウェアの世界だと、こういう風にささやかながらいくらでも「エウレカ!」感を味わえるなぁ、、ということに気づいたのが研究職を辞めたきっかけだったり(苦笑)



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:43