Qt Creator と Clang

この記事は Qt Blog の "Qt Creator and Clang" を翻訳したものです。
執筆: Erik Verbruggen, 2011年10月19日

Qt Creator エディタニュース」で触れたように、私たちは今、Qt Creator の独自実装である C++ コードモデルを Clang に置き換えようとしています。まだまだ開発は始まったばかりですが、他の人々にも試してもらい、さらには貢献していただける状態になったと思います。

「でも、コンパイラは既に持っているけど。」と思った方はいらっしゃいませんか。置き換えについて話したところ、たくさんのこのような反応をいただきました。「コードモデル」はコンパイラではありません。ですので、依然として任意のコンパイラは必要です。

コードモデルとは何か?

コードモデルは IDE が開発中のアプリケーションで使われている言語を「理解」するために使われています。コードモデルを利用して以下のような機能が実現できます。

  • コード補完
  • シンタックスハイライト (静的およびセマンティック)
  • ナビゲーション (クイックアクセスやシンボル追跡など)
  • イントロスペクション (クラスブラウザやアウトライン表示など)
  • 診断とツールチップ
  • 出現箇所の検索やリネーム
  • リファクタリング

このためには言語のパーサやセマンティックな解析が必要になります。コードモデルがコンパイラと異なるのは実行形式を生成しないことだけです。

Clang へ移行する理由

現在使われている独自実装のコードモデルを Clang へ変更することによって、重要な改善が得られます。その中でも特に重要なのが Clang が実際のコンパイラであるため、そこから出る情報が確かなものであるということです。エディタが出す警告やエラーなどの情報は、不完全なものや近似したものではなく、コンパイラが出すものと全く同じものになります。これらの診断に言及するならば、Clang は診断時の詳細な情報にフォーカスしたコンパイラなので、開発者がタイポするというような珍しいケースにおいて非常に役立ちます。 :-)

また、Clang は既に C++98/03 や C89, C99, Objective-C (と Objective-C++) をサポートし、C++11 のサポートも活発に開発されています。

しかし、これらのメリットがただで手に入るわけではありません。Clang をコードモデルとして使う場合、オブジェクトファイルの生成は必要ありませんが、ソースファイルのパースと解析は行わなくてはなりません。STL だけを使うような小さなプロジェクトでは問題ないでしょう。しかし、Qt Creator のように Qt の多くの機能を使うような巨大なプロジェクトでは、一つのソースファイルを処理する際に include されているすべてのファイルも処理されるので時間がかかります。その対応としてはプリコンパイル済みヘッダがあります。現在の実装ではプリコンパイル済みヘッダをプロジェクトに手動で追加するか、Qt Creator に設定する必要があります。詳細を以下に示します。

現状の実装内容

現在の実装では Clang を下記の機能で使っています。

      • シンタックスハイライト ("キーワードハイライト") およびセマンティックハイライト (型/メソッド/変数/ラベル/etc)
      • コード補完
      • 診断
      • コードナビゲーション

上記の機能でも限られた状況でだけ動作するものがあることに注意してください。

Clang 対応を試す

まず、Clang/LLVM の 3.0 か trunk をコンパイルする必要があります。ビルド方法は LLVM の Web サイト にあります。svn ではなく git を使いたければ、llvm.gitclang.git を使ってください。(最適化された)リリースビルドをするのを忘れずに!

Qt Creator の Clang 対応は gitorious の git リポジトリの wip/clang ブランチにあります。Qt Creator は通常のビルド方法でかまいません。qmake, make の順に実行し、プラットフォーム次第ですが make install してください。Linux や Mac で llvm-config が実行パスに無い場合や、Windows の場合、qmake の LLVM_INSTALL_DIR 変数で qmake に Clang と LLVM のヘッダとライブラリの場所を指示してください。

Qt Creator の実行時に、ライブラリのサーチパス(Linux では LD_LIBRARY_PATH、Windows では PATH)に <llvm-install-prefix>/lib が含まれていて、clang のライブラリがそこにあることを確認してください。

使い方

Clang 対応の Qt Creator はそうでない Qt Creator と同様に使うことができます。しかし、一つだけ気をつけてください。Qt や Boost のような巨大なライブラリをプロジェクトで使用する場合、プリコンパイル済みヘッダを定義することで、コードモデル(すなわちシンタックスハイライトやコード補完)をかなり高速化させることができます。典型的な Qt アプリのプロジェクトでは以下のようなヘッダファイルを作成します。

#ifndef PCH_H
#define PCH_H

#include <QtCore>
#include <QtGui>

#endif // PCH_H

(システムに属するヘッダなど)変更される可能性のないヘッダファイルだけを include してください。ヘッダが変更されるとプリコンパイル済みヘッダを再生成する必要が生じてしまうため、キャッシュする利点をかき消してしまいます。

Qt Creator がこのヘッダをキャッシュとして使うようにするためには、二つの方法があります。

      • qmake を使用している場合、.pro ファイルに PRECOMPILED_HEADER 変数を記述します。PRECOMPILED_HEADER = pch.h

        qmake の spec ファイルで指定されているコンパイラ次第ですが、プリコンパイル済みヘッダはコンパイル時に使用されることもあります。

      • "プロジェクト" モード で指定することもできます。追加された "Code Completion Settings" タブで "custom" ヘッダを選択してください。このオプションを使う場合、コードモデルはそのヘッダをキャッシュとして使います。しかし、コンパイラからは使用されません。

貢献方法

この記事の最初に述べたように、このリリースは主に貢献してくれる方々のためのものです。なぜなら、まだ開発途中ですので。まだまだやることは色々あります。開発を助けてくれる方はぜひ連絡してください。qtcreator メーリングリスト や IRC で freenode の #qt-creator チャンネルが主なコミュニケーション手段です。


Blog Topics:

Comments