Qtブログ(日本語)

Qt のモジュール化プロジェクトの状況報告

作成者: 朝木卓見|Jan 24, 2011 7:26:48 AM

この記事は、昨年の十月に公開した「Qt のモジュール化プロジェクト」の続報になります。作業は順調に進み、大部分を大きなモジュールに分割することが出来ました。

下図に現在の分割の状況を示します。なお、元々の Qt には含まれていないモジュールは図示していません。

分割の設計方針:

  • モジュール間でのソース依存は禁止されています。ヘッダの依存については問題ありません。
  • QtKernel リポジトリには、未だ多くのモジュールが含まれています。これは技術的に、それらのモジュールを別々に分割するのが困難であるためです。たとえば、いくつものプライベートな API への依存(特に QtGui から QtCore)が存在しており、それらが重度の依存であるため、別々のリポジトリに分割するのは適切ではありません。依存を解消しソースコードを分割するには、長い時間を要するでしょう。それよりも今は、Qt の他のモジュールを分割する方が重要です。その後のプロジェクトで、さらに分割を進めていくことには問題はありません。
  • 各クラスのドキュメントはそれぞれのモジュールに分割されます。これはそれらのドキュメントが .cpp ファイルに記述されており、そのままそのモジュールに属するのが自然であるためです。Qt 全体に関するドキュメントや qdoc ツールそのものに関しては別のリポジトリに分割されます。
  • サンプルプログラムやデモは、それぞれが関連するモジュールに分割されます。複数のモジュールに依存するプログラムは例外として doc リポジトリに属します。qtdemo はその例外の一例です。
  • 各プラットフォームの機能確認は、それが別のモジュールで必要な機能であっても QtKernel の configure スクリプトで引き続き行います。これによって、各プロジェクトが費やす時間を削減します。Qt のモジュール化が終了したときには、各モジュールの新しいメンテナがそれぞれ独自のスクリプトやその他の方法に移行するのが目標です。たとえば、QtWebKit には既に build-webkit スクリプトが存在します。
  • “git submodule” を使って、全ての分割されたモジュールを含む master リポジトリを提供します。

現状報告:

Qt のほとんどはモジュールに分割され、Linux 上でビルドの確認を行っています。現在行っている作業は大きく三つあります。それ以外のプラットフォームでのビルド、オートテストの実行、モジュール化プロセスの Qt master ブランチへの適用です(現在は Qt 4.7 リポジトリを分割しています)。

モジュール分割後の予定

モジュール化は非常に重要なプロジェクトであるため、可能な限り早くそれを終わらせて、移行を終了したいと考えています。なぜなら、移行作業が開発に影響しなくなるまで、いくつかの開発が延期される可能性があるからです。正確な日程は決まっておりませんが、あと 1 〜 2ヶ月程度はかかるのではないかと思います。具体的な日程が見え始めたら、より具体的なことをお知らせします。

移行が終了したときには、Qt の既存のリポジトリに対する開発は全て終了します。コミットは一切禁止されます。その後、新しい Qt リポジトリを使った開発がスタートします。古い Qt リポジトリはアーカイブされ、"Git graft" を使ってログの確認用にのみ残されます。新しいリポジトリはログを全く持たない状態でスタートすると思います。ただし、QtWebKit は既にオリジナルの WebKit のリポジトリで開発されているため、例外としてログを持ちます。

その際、マージリクエスト(Merge Request)はそれぞれのモジュール毎に受け付けることとなります。残念ながら既存のマージリクエストは、新しいモジュールの配置に従って再提出していただくことになります。

この第一段階にいくつかの困難があるのは確かです。しかし、それを乗り越えたとき、Qt のリポジトリ構成はよりわかりやすく、ハックしがいのあるものになるに違いありません。