この記事は Qt Blog の "Qt Creator and Clang" を翻訳したものです。
執筆: Erik Verbruggen, 2011年10月19日
「Qt Creator エディタニュース」で触れたように、私たちは今、Qt Creator の独自実装である C++ コードモデルを Clang に置き換えようとしています。まだまだ開発は始まったばかりですが、他の人々にも試してもらい、さらには貢献していただける状態になったと思います。
「でも、コンパイラは既に持っているけど。」と思った方はいらっしゃいませんか。置き換えについて話したところ、たくさんのこのような反応をいただきました。「コードモデル」はコンパイラではありません。ですので、依然として任意のコンパイラは必要です。
コードモデルは IDE が開発中のアプリケーションで使われている言語を「理解」するために使われています。コードモデルを利用して以下のような機能が実現できます。
このためには言語のパーサやセマンティックな解析が必要になります。コードモデルがコンパイラと異なるのは実行形式を生成しないことだけです。
現在使われている独自実装のコードモデルを Clang へ変更することによって、重要な改善が得られます。その中でも特に重要なのが Clang が実際のコンパイラであるため、そこから出る情報が確かなものであるということです。エディタが出す警告やエラーなどの情報は、不完全なものや近似したものではなく、コンパイラが出すものと全く同じものになります。これらの診断に言及するならば、Clang は診断時の詳細な情報にフォーカスしたコンパイラなので、開発者がタイポするというような珍しいケースにおいて非常に役立ちます。 :-)
また、Clang は既に C++98/03 や C89, C99, Objective-C (と Objective-C++) をサポートし、C++11 のサポートも活発に開発されています。
しかし、これらのメリットがただで手に入るわけではありません。Clang をコードモデルとして使う場合、オブジェクトファイルの生成は必要ありませんが、ソースファイルのパースと解析は行わなくてはなりません。STL だけを使うような小さなプロジェクトでは問題ないでしょう。しかし、Qt Creator のように Qt の多くの機能を使うような巨大なプロジェクトでは、一つのソースファイルを処理する際に include されているすべてのファイルも処理されるので時間がかかります。その対応としてはプリコンパイル済みヘッダがあります。現在の実装ではプリコンパイル済みヘッダをプロジェクトに手動で追加するか、Qt Creator に設定する必要があります。詳細を以下に示します。
現在の実装では Clang を下記の機能で使っています。
上記の機能でも限られた状況でだけ動作するものがあることに注意してください。
まず、Clang/LLVM の 3.0 か trunk をコンパイルする必要があります。ビルド方法は LLVM の Web サイト にあります。svn ではなく git を使いたければ、llvm.git と clang.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 がこのヘッダをキャッシュとして使うようにするためには、二つの方法があります。
PRECOMPILED_HEADER = pch.h
qmake の spec ファイルで指定されているコンパイラ次第ですが、プリコンパイル済みヘッダはコンパイル時に使用されることもあります。
この記事の最初に述べたように、このリリースは主に貢献してくれる方々のためのものです。なぜなら、まだ開発途中ですので。まだまだやることは色々あります。開発を助けてくれる方はぜひ連絡してください。qtcreator メーリングリスト や IRC で freenode の #qt-creator チャンネルが主なコミュニケーション手段です。