QtQuickControls2 の依存関係を見直しています

昨年の12月に Qt Advent CalendarQt のソースコードを取得してビルドをする方法について という記事を書きました。

その中の、サブモジュールの依存関係 というセクションで「QtQuickControls2 は QtGraphicalEffects というモジュールに依存しています」と記載をしました。

その当時は Qt 5.11 が最新版で、依存関係の定義は このようになっていました

[submodule "qtquickcontrols2"]
    depends = qtgraphicaleffects
    recommends = qtimageformats
    path = qtquickcontrols2
    url = ../qtquickcontrols2.git
    branch = 5.11
    status = addon

なぜ Qt Quick Controls 2 は QtGraphicalEffects なんかに依存しているの?と不思議に思うわけですが、まぁいいでしょう。

その後リリースされた、Qt 5.12 ではこのように変わっています

[submodule "qtquickcontrols2"]
    depends = qtgraphicaleffects
    recommends = qtimageformats
    path = qtquickcontrols2
    url = ../qtquickcontrols2.git
    branch = 5.12
    status = essential

なぜ Qt Quick Controls 2 は (略) ですが、この場合はこれではいけません

Qt のモジュールには2種類のステータスがあります。

  • Essentials – Qt の基本モジュールで、Qt がサポートするすべてのプラットフォームでテストがなされ、Qt 5 のライフサイクルでのソース互換、バイナリ互換が保証されます。
  • Addons – 用途に応じて利用可能なアドオンで、メンテナンスのステータスや互換性の保証は状況に応じて異なります。

Qt 5.11 では、Qt Quick Controls 1 は essential、2 は addon でしたが、Swap qtquickcontrols vs. qtquickcontrols2 statuses という変更が入り、Qt 5.12 では 1 は addon、2 が essential になりました。

ここで問題となるのは、essential の Qt Quick Controls 2 が、addon である Qt Graphical Effects に依存しているという状況です。

そもそもなぜ依存しているのか

2017年に、Qt 5.9 向けに Remove the qtquickcontrols2 dependency on qtgraphicaleffects というパッチを書いて、この依存を外そうとしたことがあります。

その際には、その機能に依存しているテストがあるので依存関係を外すのが難しいということと、今後どんどん Qt Graphical Effects の機能を使っていくから残しておきたいという旨のコメントがありました。

でもやっぱりおかしいから直そう?

丸2年放置していたパッチですが、5.12 以降の理由により「やっぱり依存関係見直そう?」とコメントを書いたところ、今度は「そうしたほうがいいよね」という雰囲気になりました。

というわけで、上記のパッチを dev ブランチ向けに修正し、現在レビュー中です。

QtQuickControls2 の方も対応が必要となるので とりあえずパッチ は作ってみたものの、一筋縄ではいかないようで頭が痛い。

もし、いいアイディアがありましたらお手伝いいただければと思います。

おすすめ