Qt Creator 9 - CMakePresets

このブログはQt Creator 9 - CMakePresetsを翻訳・編集したものです
 

CMake Version 3.19 で cmake-presets というコンセプトが導入されました。

CMakeのドキュメントではcmake-presetsを次のように紹介しています:

CMakeユーザーがしばしば直面する問題の一つに、プロジェクトのビルド構成を他の人と共有したいということがあります。これは、CI ビルドをサポートするため、あるいは同じビルドを頻繁に使用するユーザーが直面する問題かもしれません。CMake は CMakePresets.json と CMakeUserPresets.json という二つのファイルをサポートすることで、ユーザーが共通の構成オプションを指定し、他の人と共有できるようにしました。

cmake-presetsには Version という項目があり、新機能が追加されるたびにこの項目がインクリメントされます。

Qt Creator はVersion 3 (CMake 3.21 で導入) までのCMakeプリセットをサポートしていますが、Versionのチェックは強制されていません。Version 3 のすべてのフィールドが読み込まれ、存在すれば使用されます。

CMakeプリセットのサポートは、Qt Creator の Build import 機能の上に実装されています。

つまり、Qt Creator 9 は、最初の CMake プロジェクト設定(CMakeLists.txt.user ファイルが存在しないか、プロジェクトですべての Kits が無効化されている場合)でのみプリセット設定を提供します。

Configure presets

これらは、cmake-presets Version 1 の一部です。

  • LLVM-MinGW compiler
  • build directory – <sourceDir>/build-release
  • build type – CMAKE_BUILD_TYPE as Release
  • generator – MinGW Makefiles
  • explicit CMake executable
  • path to Qt installation via CMAKE_PREFIX_PATH

以下は、Qtプロジェクトに.CMakeプリセットを設定する例です:

{
  "version": 1,
  "configurePresets": [
    {
      "name": "llvm-mingw",
      "displayName": "LLVM-MinGW 15.0.0",
      "generator": "MinGW Makefiles",
      "binaryDir": "${sourceDir}/build-release",
      "cmakeExecutable": "C:/Tools/cmake-3.24.2-windows-arm64/bin/cmake.exe",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_PREFIX_PATH": "C:/Qt/6.4.0/llvm-mingw_arm64"
      },
      "environment": {
        "PATH": "C:/llvm-mingw/bin;$penv{PATH}"
      }
    }
  ]
}

Qt Creator 9 で Qt Widgets のサンプルをクリーンな構成でテストしてみました。

  • No CMake tool
  • No Kit
  • No Compilers
  • No Qt

cmake-presets-llvm-mingw

上記のように、Qt CreatorはLLVM-MinGW 15.0.0 (CMake preset)というKitを作成し、コンパイラの設定、Qtバージョンの登録、CMakeツールの登録、そして最後に初期構成プロジェクトの設定ページにcacheVariablesが追加しています。

その後、プロジェクトをビルドし、正常に実行することができました。

なお、このWindows 11 Arm64ノートパソコンでは、Qt SDKが使えない場合を想定して、Qt、Qt CreatorをArm64用にネイティブで自分でビルドしています。

Compiler detection

上記のconfigureプリセットでは、cacheVariablesセクションのCMAKE_C_COMPILERとCMAKE_CXX_COMPILER変数でコンパイラが指定されていませんでした。

この場合、Qt Creator は CMake コンパイラプローブプロジェクトを作成し、プリセットで指定された環境を設定し、コンパイラ情報を抽出します。

Windowsでは、この操作は重要ではなく、定義されたプリセットの数だけ追加されることに注意してください。

Build presets

これらは CMake presets Version 2 の一部です。これらは、ビルドステップを設定することができます。

  • generator Ninja Multi-Config
  • defines two build steps Debug and Release
  • specifies the path to ninja.exe as part of the CMAKE_MAKE_PROGRAM variable

以下は、同じQtプロジェクトを設定する例です:

{
  "version": 2,
  "configurePresets": [
    {
      "name": "ninja-nmc",
      "displayName": "Ninja Multi-Config LLVM-MinGW",
      "generator": "Ninja Multi-Config",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_CONFIGURATION_TYPES": "Debug;Release",
        "CMAKE_PREFIX_PATH": "C:/Qt/6.4.0/llvm-mingw_arm64",
        "CMAKE_MAKE_PROGRAM": "C:/Tools/ninja-1.10.2/ninja.exe"
      },
      "environment": {
        "PATH": "C:/llvm-mingw/bin;$penv{PATH}"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "release",
      "displayName": "Ninja Release",
      "configurePreset": "ninja-nmc",
      "configuration": "Release"
    },
    {
      "name": "debug",
      "displayName": "Ninja Debug",
      "configurePreset": "ninja-nmc",
      "configuration": "Debug"
    }
  ]
}

cmake-presets-multi-ninja

上記のように、Qt Creator 9 は 2 つのビルドステップでプロジェクトを構成し、2 つ目のビルドステップを有効にすると、2 つの構成 Debug と Release を一度にビルドすることができました。

Visual C++ and the Ninja generator

CMakeはVisual Studio 17 2022のジェネレータでVisual C++コンパイラを簡単に使用することができます:

      "generator": "Visual Studio 17 2022",
      "architecture": "ARM64"

しかし、これではMSBuildのプロジェクトが生成されてしまいます。

Visual C++コンパイラを正常に使用するためには、起動時に適切な環境が必要です。

これは、通常、vcvarsall.batバッチファイルによって行われます。

Qt Creator は CMake コンパイラをシステム環境と一緒に起動しますので、Visual C++ コンパイラの環境は明示的に指定する必要があります。

以下は、そのようなプリセットの例です:

{
  "version": 3,
  "configurePresets": [
    {
      "name": "visualc-ninja",
      "displayName": "Visual C++ 2022 arm64 Ninja",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build-${presetName}",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_PREFIX_PATH": "C:/Qt/6.4.0/msvc2019_arm64"
      },
      "environment" : {
        "VCToolsVersion": "14.34.31931",
        "WindowsSDKVersion" : "10.0.22621.0",
        "VCArch": "arm64",
        "VCHostArch": "HostARM64",
        "VCToolsInstallDir": "$env{ProgramFiles}/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/$env{VCToolsVersion}",
        "WindowsSdkDir" : "$env{ProgramFiles(x86)}/Windows Kits/10",
        "WindowsSdkIncVerDir": "$env{WindowsSdkDir}/Include/$env{WindowsSDKVersion}",
        "WindowsSdkLibVerDir": "$env{WindowsSdkDir}/Lib/$env{WindowsSDKVersion}",

        "INCLUDE": "$env{VCToolsInstallDir}/ATLMFC/include;$env{VCToolsInstallDir}/include;$env{WindowsSdkIncVerDir}/ucrt;$env{WindowsSdkIncVerDir}/shared;$env{WindowsSdkIncVerDir}/um;$env{WindowsSdkIncVerDir}/winrt;$env{WindowsSdkIncVerDir}/cppwinrt",
        "LIB": "$env{VCToolsInstallDir}/ATLMFC/lib/$env{VCArch};$env{VCToolsInstallDir}/lib/$env{VCArch};$env{WindowsSdkLibVerDir}/ucrt/$env{VCArch};$env{WindowsSdkLibVerDir}/um/$env{VCArch}",
        "PATH": "C:/Tools/ninja-1.10.2/;$env{VCToolsInstallDir}/bin/$env{VCHostArch}/$env{VCArch};$env{WindowsSdkDir}/bin/$env{WindowsSDKVersion}/$env{VCArch};$penv{PATH}"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "visualc-ninja",
      "configurePreset": "visualc-ninja"
    }
  ]
}

そして、ここではその実行をご覧いただくことができます:

cmake-presets-visualc-ninja

上記の環境変数は、Qt Creator の Environment -> System settings でも設定でき、他のオペレーティングシステムで gcc や clang が存在するのと同じように、Windows のデフォルトコンパイラとして機能します。

上記の手順は、vcvarsall.bat で設定したシェルから Qt Creator を呼び出すのと同じです。

このようなvcvarsall.batが設定されたシェルから、バージョン番号を集めて実行したところ、以下のような結果が得られました。

$ set | findstr Ver
$ where cl

Conditions

TestプリセットはCMakeプリセット Version 3 に含まれていますが、Qt Creator 9はそれらをサポートしていません。

以下は、LinuxとWindowsのプリセットの例です:

{
  "version": 3,
  "configurePresets": [
    {
      "name": "linux",
      "displayName": "Linux GCC",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_PREFIX_PATH": "$env{HOME}/Qt/6.4.0/gcc_aarch64"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      }
    },
    {
      "name": "windows",
      "displayName": "Windows MSVC",
      "binaryDir": "${sourceDir}/build",
      "cacheVariables": {
        "CMAKE_PREFIX_PATH": "$env{SYSTEMDRIVE}/Qt/6.4.0/msvc2019_arm64"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Windows"
      }
    }
  ]
}

Windowsの場合は、Windowsのプリセットのみが表示されます:

cmake-presets-cross-platform-windows

Linux (WSLg on WLS2 - Windows Subsystem for Linuxで動作) では、Linuxプリセットのみが表示されます:

cmake-presets-cross-platform-linux

ジェネレーターフィールドを指定しなかったので、Qt CreatorはCMakeがプラットフォーム用にデフォルトで選択したジェネレーターを選択したことに注意してください。

Debugging

プリセットの再読み込みは、Qt Creator 9 では、ビルドディレクトリと CMakeLists.txt.user ファイルを削除することによってのみ手動で行うことができます。

Qt Creator 9 では、File system view (Alt+Y, Alt+F) でフォルダーを削除できるようになったので、このタスクに役立つと思われます。

Qt Creator を起動する前に、環境変数 QT_LOGGING_RULES=qtc.cmake.import*=true によって CMake コンパイラープローブの呼び出しと CMakeCache.txt ファイルの場所をログに記録することができるようになりました。

Conclusion

Qt Creator 9 は CMake プリセットをサポートする Qt Creator の最初のバージョンであり、実装にはバグが含まれる可能性があります。

Vendor 固有の設定について触れていませんが、これは Qt Creator 9 が何も使用していないためです。

CMakePresets.json ファイルで指定できるようにしたい設定は何ですか?


Blog Topics:

Comments