Qtブログ(日本語)

Qt Creator 14 - CMakeアップデート

作成者: Qt Group 日本オフィス|Jul 16, 2024 1:07:34 PM
本稿は「Qt Creator 14 - CMake Update」の抄訳です。
 

以下、Qt Creator 14の新しいCMakeの機能と修正点を紹介します。

プロジェクトごとのCMake設定

Qt Creator 14では、プロジェクトごとにCMakeの設定を指定することができます。

以下のようにGUIで行うことができます。

また、設定はCMakePresets.jsonファイルを使用して、vendorフィールドで指定できます。

{
  "version": 4,
  "configurePresets": [
    {
      "name": "default",
      "displayName": "Default Config",
      "description": "Default build using Ninja generator",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/default"
    }
  ],
  "vendor": {
    "qt.io/QtCreator/1.0": {
       "AskBeforePresetsReload": false,
       "AskReConfigureInitialParams": false,
       "AutorunCMake": false,
       "PackageManagerAutoSetup": false,
       "ShowAdvancedOptionsByDefault": true,
       "ShowSourceSubFolders": false,
       "UseJunctionsForSourceAndBuildDirectories": true
    }
  }
}

CMakePresets.jsonを使用しないプロジェクトの場合、代わりにCMakeLists.txt.sharedファイルを使用できます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<qtcreator>
  <data>
  <variable>ProjectExplorer.Project.PluginSettings</variable>
   <valuemap type="QVariantMap">
    <valuemap type="QVariantMap" key="CMakeSpecificSettings">
      <value type="bool" key="AskBeforePresetsReload">false</value>
      <value type="bool" key="AskReConfigureInitialParams">false</value>
      <value type="bool" key="AutorunCMake">false</value>
      <value type="bool" key="PackageManagerAutoSetup">false</value>
      <value type="bool" key="ShowAdvancedOptionsByDefault">true</value>
      <value type="bool" key="ShowSourceSubFolders">false</value>
      <value type="bool" key="UseGlobalSettings">false</value>
      <value type="bool" key="UseJunctionsForSourceAndBuildDirectories">true</value>
    </valuemap>
  </valuemap>
 </data>
 <data>
  <variable>Version</variable>
  <value type="int">22</value>
 </data>
</qtcreator>

CMake Presets用のデバッガー登録

 CMake Presets の仕様にはデバッガー設定についての記述がありません。

Qt Creator 14では、vendorフィールドを使用して、CMake Presetsでデバッガーを指定することができます。

   "vendor": {
     "qt.io/QtCreator/1.0": {
       "debugger": "C:/Qt/Tools/mingw1120_64/bin/gdb.exe"
     }
   }

また、書き通りデバッガーのすべての詳細を含めることができます。

  "vendor": {
    "qt.io/QtCreator/1.0": {
      "debugger": {
        "Id": "debugger.gdb.11.2.0.win64",
        "DisplayName": "GNU gdb 11.2.0 for MinGW 11.2.0 64-bit",
        "Abis": ["x86-windows-msys-pe-64bit"],
        "Binary": "C:/Qt/Tools/mingw1120_64/bin/gdb.exe",
        "EngineType": 1,
        "Version": "11.2.0"
      }
    }
  }

Idが指定されていない場合、GUIDが自動的に生成されます。

上記画像で使用されているCMakePresets.jsonは以下の通りです。

{
  "version": 4,
  "configurePresets":
      [
        {
          "name": "llvm-mingw",
          "displayName": "Qt LLVM MinGW 6.7.2 x64",
          "generator": "Ninja",
          "binaryDir": "${sourceDir}/build",
          "cacheVariables": {
            "CMAKE_BUILD_TYPE": "Debug",
            "CMAKE_PREFIX_PATH": "C:/Qt/6.7.2/llvm-mingw_64",
            "CMAKE_C_COMPILER": "C:/Qt/Tools/llvm-mingw1706_64/bin/clang.exe",
            "CMAKE_CXX_COMPILER": "C:/Qt/Tools/llvm-mingw1706_64/bin/clang++.exe"
          },
          "vendor":
              {
                "qt.io/QtCreator/1.0": {
                  "debugger": {
                    "DisplayName": "LLDB 17.0.6 Debugger",
                    "Abis": [
                      "x86-windows-msys-pe-64bit"
                    ],
                    "Binary": "C:/Qt/Tools/llvm-mingw1706_64/bin/lldb.exe",
                    "EngineType": 256,
                    "Version": "17.0.6"
                  }
                }
              }
        }
      ]
}

デバッガーの正しい値を見つけるには、%appdata%\QtProject\qtcreator\debuggers.xmlファイルを参照してください。ここにQt Creatorがデバッガーの設定情報を保存しています。

EngineTypeには、以下の値を指定できます。

  • 1:GDB
  • 4:CDB
  • 8:PDB
  • 256:LLDB
  • 512:GDB DAP
  • 1024:LLDB DAP
  • 4096: µVision デバッガー

クロスコンパイラーエミュレータ

この機能はRalf Habackerによって提供され、 QTCREATORBUG-29880で追跡されました。

以下では、ローカルで$HOME/llvm-mingwの下に配置した LLVM-MinGW 17.0.6 ツールチェーンを使用して、LinuxホストからWindows x64用にクロスコンパイルする方法を紹介します。

CMakePresets.jsonは以下のようになります。

{
  "version": 4,
  "configurePresets":
      [
        {
          "name": "llvm-mingw",
          "displayName": "LLVM MinGW 17.0.6 x64",
          "generator": "Ninja",
          "binaryDir": "${sourceDir}/build",
          "toolchainFile": "llvm-mingw.cmake",
          "cacheVariables": {
            "CMAKE_BUILD_TYPE": "Debug",
            "CMAKE_CROSSCOMPILING_EMULATOR": "/usr/bin/wine64"
          }
        }
      ]
}

llvm-mingw.cmake ツールチェーンファイルは、wrappers: add CMake toolchain files のLLVM-MinGW リポジトリから取得した簡略化されたバージョンです。

また、CMakeLists.txtには、LLVM-MinGW の C++ランタイムを C++ 実行ファイルで利用可能にするためのワークアラウンドが含まれています。

cmake_minimum_required(VERSION 3.16)
project(Hello LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable
(Hello main.cpp)
add_custom_command
( TARGET Hello POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SYSROOT}/bin/libc++.dll" ${CMAKE_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SYSROOT}/bin/libunwind.dll" ${CMAKE_BINARY_DIR} )

そして、Windows固有の要素を持つC++の例をご紹介します。

#include <iostream>
#include <windows.h>
#if !defined(_M_X64) #error "not a x86_64 compiler" #endif
int main() { OSVERSIONINFO info{.dwOSVersionInfoSize = sizeof(OSVERSIONINFO)}; ::GetVersionEx(&info); std::cout << "Hello Windows " << info.dwMajorVersion << "." << info.dwMinorVersion << "." << info.dwBuildNumber << " " << info.szCSDVersion << "\n"; }

LLVM-MinGWのLLDBデバッガは、Debugging Wine with LLDB and VSCode のブログ記事で説明されているように、いくつかのパッチが必要になるので、デバッガを登録していません。

グロブ化されたプロジェクトでファイル操作

Qt Creator 14 では、CMake プロジェクトで file(GLOB|_RECURSE) を使用して *.cpp *.h のグロビングパターンにより実行ファイルやライブラリをすばやく作成する場合、CMakeLists.txt プロジェクトファイルが変更されなくなりました。

cmake_minimum_required(VERSION 3.18)
project(HelloWidgetsGlob)
set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package
(Qt6 REQUIRED COMPONENTS Widgets)
file
(GLOB_RECURSE sources RELATIVE ${CMAKE_CURRENT_LIST_DIR} CONFIGURE_DEPENDS "*.c" "*.h" "*.cpp" "*.hpp" "*.cxx" "*.hxx")
file
(RELATIVE_PATH buildDir ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_BINARY_DIR}) list(FILTER sources EXCLUDE REGEX "${buildDir}/*")
add_executable
(HelloWidgetsGlob ${sources}) target_link_libraries(HelloWidgetsGlob PRIVATE Qt6::Widgets)