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 が無効化されている場合)でのみプリセット設定を提供します。
これらは、cmake-presets Version 1 の一部です。
<sourceDir>/build-release
CMAKE_BUILD_TYPE
as Release
MinGW Makefiles
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 のサンプルをクリーンな構成でテストしてみました。
上記のように、Qt CreatorはLLVM-MinGW 15.0.0 (CMake preset)というKitを作成し、コンパイラの設定、Qtバージョンの登録、CMakeツールの登録、そして最後に初期構成プロジェクトの設定ページにcacheVariablesが追加しています。
その後、プロジェクトをビルドし、正常に実行することができました。
なお、このWindows 11 Arm64ノートパソコンでは、Qt SDKが使えない場合を想定して、Qt、Qt CreatorをArm64用にネイティブで自分でビルドしています。
上記のconfigureプリセットでは、cacheVariablesセクションのCMAKE_C_COMPILERとCMAKE_CXX_COMPILER変数でコンパイラが指定されていませんでした。
この場合、Qt Creator は CMake コンパイラプローブプロジェクトを作成し、プリセットで指定された環境を設定し、コンパイラ情報を抽出します。
Windowsでは、この操作は重要ではなく、定義されたプリセットの数だけ追加されることに注意してください。
これらは CMake presets Version 2 の一部です。これらは、ビルドステップを設定することができます。
Ninja Multi-Config
Debug
and Release
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" } ] }
上記のように、Qt Creator 9 は 2 つのビルドステップでプロジェクトを構成し、2 つ目のビルドステップを有効にすると、2 つの構成 Debug と Release を一度にビルドすることができました。
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" } ] }
そして、ここではその実行をご覧いただくことができます:
上記の環境変数は、Qt Creator の Environment -> System settings でも設定でき、他のオペレーティングシステムで gcc や clang が存在するのと同じように、Windows のデフォルトコンパイラとして機能します。
上記の手順は、vcvarsall.bat で設定したシェルから Qt Creator を呼び出すのと同じです。
このようなvcvarsall.batが設定されたシェルから、バージョン番号を集めて実行したところ、以下のような結果が得られました。
$ set | findstr Ver
$ where cl
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のプリセットのみが表示されます:
Linux (WSLg on WLS2 - Windows Subsystem for Linuxで動作) では、Linuxプリセットのみが表示されます:
ジェネレーターフィールドを指定しなかったので、Qt CreatorはCMakeがプラットフォーム用にデフォルトで選択したジェネレーターを選択したことに注意してください。
プリセットの再読み込みは、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 ファイルの場所をログに記録することができるようになりました。
Qt Creator 9 は CMake プリセットをサポートする Qt Creator の最初のバージョンであり、実装にはバグが含まれる可能性があります。
Vendor 固有の設定について触れていませんが、これは Qt Creator 9 が何も使用していないためです。
CMakePresets.json ファイルで指定できるようにしたい設定は何ですか?