Skip to main content

Qt Creator 21 - CMakeの変更点

コメント
このブログは「Qt Creator 21 - CMake Changes」の抄訳です。 

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 を実行できます:

  • ct -R timeline

これにより、-R パラメーターの後ろに指定した正規表現に一致するテストを実行できます。

プロファイラー

Qt Creator 21 の CMake プロファイラーでは、プロファイラーのタイムライン上で関数をクリックすると、その関数の定義位置にジャンプするようになりました。

オフラインヘルプ

CMake は、ドキュメントを Qt Help ファイル(doc/cmake/CMake.qch)としても同梱しています。CMake 4.5.0-rc1 以降では、公式の CMake ドキュメントに合わせたスタイルシートを持つ Qt Help ファイルが提供されます。ダークテーマ用のスタイルシートも含まれており、アプリケーションがダークテーマを使用している場合は、Qt Creator や Qt Assistant が自動的にそちらを選択します。

コメント

ブログを購読

Qt 6.12 を
今すぐ試そう!

最新リリースはこちらからダウンロードできます。 www.qt.io/download

Qt 6.12 LTS がリリースされました!アプリケーション開発者やデバイス開発者向けに、多くの新機能と改善が追加されています。 

採用情報 

現在、さまざまなポジションで採用を行っています。募集職種はこちら をご覧ください。また、Instagram をフォローして #QtPeople の働き方もぜひチェックしてください。