Qt Creator 21 における CMake 関連の新機能と変更点は次のとおりです:
エディター
Qt Creator 21 には、新しい CMake 言語パーサーが搭載されています。このパーサーは、QML でも使われているパーサージェネレーター qlalr を使用しています。これにより、IDE での CMake 編集が改善されます。
この新しいパーサーのおかげで、CMake のインデンターとフォーマッターも実現できるようになりました。
クイックフィックス
CMake エディターがクイックフィックスに対応しました。実装されているクイックフィックスは次のとおりです:
- ソースファイルが存在しない場合に、新規作成する
- add_subdirectory の呼び出しに対応する CMakeLists.txt を作成する
- find_package(Qt6 COMPONENTS) の呼び出しに対応する Qt コンポーネントをインストールする
ドキュメント
Qt Creator 21 は、CMake の関数 / マクロの reStructuredText(.rst)形式のドキュメントが提供されている場合、それを解析します。これにより、プロジェクトで使用している CMake API をドキュメント化できます。
関数の引数
CMake の関数とマクロについて、内部の cmake_parse_arguments 呼び出しから引数が検出されるようになりました。
引数はエディター上で別の色でハイライト表示されます。
QMake には、ホスト OS 以外のオペレーティングシステム向けのソースファイルも表示できる機能がありました。
CMake プロジェクトでもこの機能に対応しました。add_executable、add_library、target_sources で参照されていて、現在の構成では見つからないソースファイルは、すべてプロジェクトツリー上でグレーアウトして表示されます。
使用箇所の検索 / リネーム
使用箇所の検索(Find Usages)(Ctrl+Shift+U)とリネーム(Rename)(Ctrl+Shift+R)が、CMake ターゲットに対して使えるようになりました。
インストール
CMake プロジェクトでは、これまで、デバイスにデプロイするファイルを定義する方法は QtCreatorDeployment.txt だけでした。
現在は、CMake File API から得られるインストール情報が使われます。ただし、install(CODE) や install(SCRIPT) によってインストール時に実行される CMake コードには対応していません。
CMake では、プロジェクトをビルドするためにヘッダーファイルをソースファイルとして指定する必要はありません。
しかし Qt Creator は、プロジェクトツリー内のどこにヘッダーファイルを表示するかを判断するために、ヘッダーファイルを必要とします。
新しい設定 Find header files by asking the compiler(デフォルトではオフ)を有効にすると、Qt Creator がコンパイラを呼び出してソースファイルの依存関係を一覧取得し、その結果をデータベース(.qtcreator/header-deps)に保存します。これは Ninja などのビルドツールの動作と似ています。
利点は、CMake にヘッダーファイルを指定しなくて済むことです。欠点は、追加のコンパイラ呼び出しによるオーバーヘッドが発生することです。
CMake Presets 向けのベンダー拡張
runDevice
Windows ホスト上で、uname -a に相当する内容を出力する Linux アプリケーションをクロスコンパイルする、という課題を取り上げます。
Linux マシンは仮想マシンです:
-
Windows Subsystem for Linux(WSL2)経由でインストールした Ubuntu 24.04.5 LTS
-
WSL の仮想マシンに openssh-server をインストール済み
-
Qt Creator にそのマシン用の Remote Linux デバイスを設定済み
コンパイラは、winget install llvm.llvm でインストールした公式の Windows 版 LLVM パッケージです。
clang で Linux 向けにクロスコンパイルするため、WSL ターミナルから linux-sysroot を作成しました:
$ mkdir -p /mnt/c/linux-sysroot/usr
$ cp -r /usr/include /mnt/c/linux-sysroot/usr
$ cp -r /usr/lib /mnt/c/linux-sysroot/usr
$ cd /mnt/c/linux-sysroot
$ ln -s usr/lib lib
次に、linux-wsl.cmake というツールチェーンファイルを使いました:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(triple aarch64-linux-gnu)
set(gcc_version 13)
set(CMAKE_C_COMPILER "$ENV{ProgramFiles}/LLVM/bin/clang.exe")
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER "$ENV{ProgramFiles}/LLVM/bin/clang++.exe")
set(CMAKE_CXX_COMPILER_TARGET ${triple})
set(CMAKE_SYSROOT c:/linux-sysroot)
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES
${CMAKE_SYSROOT}/usr/include/${triple}
${CMAKE_SYSROOT}/usr/include
)
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
${CMAKE_SYSROOT}/usr/include/${triple}/c++/${gcc_version}
${CMAKE_SYSROOT}/usr/include/c++/${gcc_version}
${CMAKE_C_STANDARD_INCLUDE_DIRECTORIES}
)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
最後に、runDevice ベンダー拡張を使った CMake Preset です:
{
"version": 10,
"cmakeMinimumRequired": {
"major": 4,
"minor": 0,
"patch": 0
},
"configurePresets": [
{
"name": "crosscompile-linux-wsl",
"generator": "Ninja",
"toolchainFile": "linux-wsl.cmake",
"cacheVariables": {
"CMAKE_C_COMPILER": "$env{ProgramFiles}/LLVM/bin/clang.exe",
"CMAKE_CXX_COMPILER": "$env{ProgramFiles}/LLVM/bin/clang++.exe",
"CMAKE_SYSROOT": "c:/linux-sysroot",
"CMAKE_INSTALL_PREFIX": "/tmp",
"CMAKE_BUILD_TYPE": "Debug"
},
"vendor": {
"qt.io/QtCreator/1.0": {
"runDevice": {
"type": "GenericLinuxOsType",
"name": "WSL"
}
}
}
}
]
}
runSettings
CMake Presets の最後のピースが揃いました。
CMake Presets から、次の対象に対する*実行構成(Run Configuration)*を作成できます:
- 既存のターゲット(作業ディレクトリとコマンドライン引数を指定)
- カスタム CMake ターゲット
以下は、Visual C++ Arm64 用の CMake Preset でビルドした Same Game の例です。Qt Creator による PATH 環境変数の自動変更を無効にし、代わりに PATH を手動で設定する実行構成を含んでいます。
"vendor": {
"qt.io/QtCreator/1.0": {
"runSettings": [
{
"target": "samegame",
"displayName": "samegame (manual PATH)",
"useLibraryPaths": false,
"environment": {
"PATH": "C:/Qt/6.12.0/msvc2022_arm64/bin;${PATH}"
},
"active": true
}
]
}
}
ロケーター
「cm」ロケーターフィルターを使うと、次のようにカスタムパラメーター付きで cmake コマンドを実行できます:
cm --install . --prefix myinstall
cm -LAH
cm --trace-expand --trace-redirect=cmake.log .
「ct」ロケーターフィルターを使うと、ビルドディレクトリで、次のようにカスタムパラメーター付きの ctest を実行できます:
これにより、-R パラメーターの後ろに指定した正規表現に一致するテストを実行できます。
プロファイラー
Qt Creator 21 の CMake プロファイラーでは、プロファイラーのタイムライン上で関数をクリックすると、その関数の定義位置にジャンプするようになりました。
オフラインヘルプ
CMake は、ドキュメントを Qt Help ファイル(doc/cmake/CMake.qch)としても同梱しています。CMake 4.5.0-rc1 以降では、公式の CMake ドキュメントに合わせたスタイルシートを持つ Qt Help ファイルが提供されます。ダークテーマ用のスタイルシートも含まれており、アプリケーションがダークテーマを使用している場合は、Qt Creator や Qt Assistant が自動的にそちらを選択します。