Qtブログ(日本語)

Qt Creator 13 - CMake アップデート

作成者: Qt Group 日本オフィス|Apr 10, 2024 5:32:48 AM
本記事は「Qt Creator 13 - CMake Update」の抄訳です。
 

この記事では Qt Creator 13 の CMake 新機能と修正点の概要を紹介します。すべての CMake変更点については 変更ログ をご覧ください。

Windows の長いパスの回避

Windows では、2015 年 8 月にリリースされた Windows 10 バージョン 1607 以降、255 文字を超える長いパス がサポートされています。しかし、アプリケーションは新しい機能を使用するために明示的に選択する必要がありました。

CreateDirectoryWCreateFileWFindFirstFileWのようなWWin32 API関数を使用するアプリケーションは、例えばLLVM Clangコンパイラのように、すぐに動作します。

残りのアプリケーションは、レジストリ・キーKEY_LOCAL_MACHINE_SYSTEM\CurrentControlSet\ControlFileSystem\LongPathsEnabledを 1に設定し、アプリケーションの manifest

<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>

の部分を追加します。

GCCと異なり、Visual C++コンパイラーはアプリケーション・マニフェストを更新しても修正できません。この問題は検討されていますが、まだ修正されていません(2024年4月)。

Ninjaのビルドシステムは修正されましたが、1.12.0のリリースはまだ行われていません。最新のリリースは2022年8月30日のv1.11.1です。

QTCREATORBUG-26786 で、Qt Creator 自体のコンパイルに問題があります。QTBUG-117413 には、より広範な Qt アプリケーションの問題に関するバグレポートがあります。

Hello World

以下は、長いパスC:\Projects\ThisPathWasArtificiallyMadeLongInOrderToTestHowAWindowsCompilerWouldBehaveWhenHavingAPathLongerThanWhatMAXPATHIsAllowingNamelyLongerThan255Characters
にあるHello World のC++ アプリケーションのスクリーンキャストです。

このプロジェクトは CMake で構成できず、コンパイラの検出で失敗します。通常のアドバイスとしては、c:\devのような短いパスを使用するか、subst でディレクトリを短いパスに割り当てることです。

Qt Creator 13 には、ソース ディレクトリとビルドディレクトリに ジャンクションを使用するという、 異なる回避策が用意されています。

実行またはデバッグされる実行ファイルがフルパスであることに注目してください。ジャンクションはプロジェクトの設定とビルドにのみ使用されます。

Qt CreatorはジャンクションポイントをC:\ProgramData\QtCreator\Linksに保存します。別のパスを使用するには、QTC_CMAKE_JUNCTIONS_DIR環境変数の値として設定します。

QTC_CMAKE_JUNCTIONS_HASH_LENGTH 環境変数を設定して、MD5ハッシュ長をデフォルト長さの32から短くします。

ジャンクションの使用はデフォルトでは有効になっていません。ジャンクションの使用は、CMake 設定でグローバルに有効にするか、以下の通りソース・ディレクトリー内のCMakeLists.txt.sharedファイルでプロジェクトごとに有効にすることができます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<qtcreator>
  <data>
  <variable>ProjectExplorer.Project.PluginSettings</variable>
  <valuemap type="QVariantMap">
   <valuelist type="QVariantList" key="ProjectExplorer.Project.Environment">
    <value type="QString">QTC_CMAKE_USE_JUNCTIONS=1</value>
   </valuelist>
  </valuemap>
 </data>
 <data>
  <variable>Version</variable>
  <value type="int">22</value>
 </data>
</qtcreator>

QTCREATORBUG-30385は、ジャンクションを有効にする CMakePresets オプションのタスクを追跡します。これは将来の Qt Creator バージョンに含まれる予定です。

CMake プリセットキット

プロジェクトが CMakePresets を使用している場合、設定ページにはプリセットキットのみが表示されます。通常のキットは左のキットリストから選択できます。

例えば、次のプリセットは、Visual C++ 2022 Arm64 のキットを Arm64 CMake と Ninja ツールで設定します。

{
  "version": 4,
  "configurePresets": [
    {
      "name": "visualc-arm64",
      "displayName": "Visual C++ 2022 Arm64",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build-release",
      "cmakeExecutable": "C:/Program Files/CMake/bin/cmake.exe",
      "toolset": {
        "value": "v143,host=arm64",
        "strategy": "external"
      },
      "architecture": {
        "value": "arm64",
        "strategy": "external"
      },
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_PREFIX_PATH": "C:/Qt/6.6.0/msvc2022_arm64",
        "CMAKE_MAKE_PROGRAM": "C:/Tools/Ninja/ninja.exe",
        "CMAKE_C_COMPILER": "cl.exe",
        "CMAKE_CXX_COMPILER": "cl.exe"
      }
    }
  ]
}

CMake 出力の解析

CMake 設定ステップ中にコンパイラの警告やエラーが発生する場合があります。このようなコンパイラの警告やエラーは Issues パネルに表示されるようになりました。

以下のCMakeLists.txtプロジェクトファイルはその一例です。

cmake_minimum_required(VERSION 3.5)

project(HelloWeirdWorld LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/main.cpp [[
    #include <iostream>

    .

    int main()
    {
        std::cout << "Hello World!" << std::endl;
        return 0;
    }
]])

execute_process(
    COMMAND ${CMAKE_CXX_COMPILER} main.cpp -o main.exe)