mcpField
Q
qt-compatibility-build

qt-compatibility-build

github.com/re2zero開発777 回インストール13 週間前に更新
リポジトリ

qt-compatibility-build について

Deepin V25/V20向けのQt/CMakeプロジェクトで、Qt6とQt5を同じコードベースからサポートするためのスキルです。Qtのバージョンを検出して対応するDTKのバージョンを割り当て、CMake内の固定参照を避けます。

主な機能

  1. 01Qt5またはQt6の自動検出
  2. 02Qtのバージョンに応じたDTKの割り当て
  3. 03依存関係とリンクの動的設定
  4. 04V25とV20の制御ファイルの分離
  5. 05翻訳生成設定のガイド

活用シーン

  1. 011つのプロジェクトでV25とV20をサポート
  2. 02CMakeの固定されたQt/DTK参照を置き換え
  3. 03検出したQtバージョンに応じたリンク設定
  4. 04デュアルバージョンビルドのDebian依存関係を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/re2zero/deepin-skills --skill qt-compatibility-build

インストール後、Claude Code で/qt-compatibility-buildを入力して読み込まれたか確認します。

詳細

qt-compatibility-build

概要

Qt5/Qt6 を自動検出し、DTK のバージョンを動的に対応付けることで、deepin V25/V20 のデュアルバージョン対応に向けた CMake 設定を統一します。ビルドシステム全体でバージョンをハードコードする必要がなくなります。

ファイル規則

ファイルdeepin のバージョンQt のバージョン
debian/controlV25Qt6
debian/control.1V20Qt5

理由:control(接尾辞なし)は最新バージョン(V25)、control.1(接尾辞あり)は以前のバージョン(V20)です。

使用する場面

digraph when_to_use {
    "Qt/CMake project?" [shape=diamond];
    "V25/V20 dual support?" [shape=diamond];
    "Hard-coded Qt/DTK?" [shape=diamond];
    "Use this skill" [shape=box];
    "Wrong tool" [shape=box];

    "Qt/CMake project?" -> "V25/V20 dual support?" [label="yes"];
    "V25/V20 dual support?" -> "Hard-coded Qt/DTK?" [label="yes"];
    "Hard-coded Qt/DTK?" -> "Use this skill" [label="yes"];
}

次の場合に使用します:

  • CMakeLists.txt の target_link_libraries に Qt5:: または Qt6:: がハードコードされている
  • CMakeLists.txt の find_package またはリンク指定に Dtk:: または Dtk6:: がハードコードされている
  • 同じコードから V25(Qt6)と V20(Qt5)の両方をビルドする必要がある
  • 検出した Qt のバージョンに基づいて、ライブラリを動的にリンクする必要がある
  • DTK の依存関係を、インストール済みの Qt のバージョンに自動的に対応付ける必要がある

次の場合は使用しないでください:

  • CMake ビルドシステムを使用していないプロジェクト
  • Qt に依存しないプロジェクト
  • 単一バージョンのみをサポートする場合(V25 のみ、または V20 のみ)

クイックリファレンス

タスクコマンド/パターン
Qt の自動検出find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
DTK を Qt に対応付けるif (QT_VERSION_MAJOR MATCHES 6) set(DTK_VERSION_MAJOR 6)
Qt の動的な検索find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${QT} REQUIRED)
DTK の動的な検索find_package(Dtk${DTK_VERSION_MAJOR}Widget REQUIRED)
Qt の動的なリンクQt${QT_VERSION_MAJOR}::Core
DTK の動的なリンクDtk${DTK_VERSION_MAJOR}::Core
V25 のビルドcmake -B build -DQT_DIR=/usr/lib/x86_64-linux-gnu/cmake/Qt6
V20 のビルドcmake -B build5 -DQT_DIR=/usr/lib/x86_64-linux-gnu/cmake/Qt5

注:-DQT_DIR はローカルビルドを簡単にするための省略可能な指定です。指定しない場合、CMake が自動検出します。

実装

手順 1:Qt の検出を追加する(CMakeLists.txt の先頭)
# Auto-detect Qt version (tries Qt6 first, falls back to Qt5)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
message(STATUS "Found Qt version: ${QT_VERSION_MAJOR}")

# Map to DTK version (Qt6→DTK6, Qt5→DTK5)
if (QT_VERSION_MAJOR MATCHES 6)
    set(DTK_VERSION_MAJOR 6)
else()
    set(DTK_VERSION_MAJOR "")
endif()
message(STATUS "Build with DTK: ${DTK_VERSION_MAJOR}")
手順 2:すべての find_package 呼び出しを更新する

変更前(ハードコード):

find_package(Qt6 COMPONENTS Core Gui Widgets Network REQUIRED)
find_package(DtkWidget REQUIRED)

変更後(動的):

set(QT Core Gui Widgets Network DBus Sql Svg Test WebChannel WebSockets)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${QT} REQUIRED)

find_package(Dtk${DTK_VERSION_MAJOR}Widget REQUIRED)
find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED)
find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED)
手順 3:すべての target_link_libraries を更新する

変更前(ハードコード):

target_link_libraries(mylib
    Dtk::Core
    Dtk::Gui
    Qt6::Network
)

変更後(動的):

target_link_libraries(mylib
    Dtk${DTK_VERSION_MAJOR}::Core
    Dtk${DTK_VERSION_MAJOR}::Gui
    Qt${QT_VERSION_MAJOR}::Network
)

置換パターン:

  • Qt5:: → Qt${QT_VERSION_MAJOR}::
  • Qt6:: → Qt${QT_VERSION_MAJOR}::
  • Dtk:: → Dtk${DTK_VERSION_MAJOR}::
  • Dtk6:: → Dtk${DTK_VERSION_MAJOR}::
手順 4:翻訳を生成する(必要な場合)

cmake/translation-generate.cmake を作成します:

function(TRANSLATION_GENERATE QMS)
  find_package(Qt${QT_VERSION_MAJOR}LinguistTools QUIET)

  if (NOT Qt${QT_VERSION_MAJOR}_LRELEASE_EXECUTABLE)
    set(QT_LRELEASE "/lib/qt${QT_VERSION_MAJOR}/bin/lrelease")
    message(STATUS "NOT found lrelease, set QT_LRELEASE = ${QT_LRELEASE}")
  else()
    set(QT_LRELEASE "${Qt${QT_VERSION_MAJOR}_LRELEASE_EXECUTABLE}")
  endif()

  if(NOT ARGN)
    message(SEND_ERROR "Error: TRANSLATION_GENERATE() called without any .ts path")
    return()
  endif()

  file(GLOB TS_FILES "${ARGN}/*.ts")
  set(${QMS})
  foreach(TSFIL ${TS_FILES})
      get_filename_component(FIL_WE ${TSFIL} NAME_WE)
      set(QMFIL ${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.qm)
      list(APPEND ${QMS} ${QMFIL})
      add_custom_command(
          OUTPUT ${QMFIL}
          COMMAND ${QT_LRELEASE} ${TSFIL} -qm ${QMFIL}
          DEPENDS ${TSFIL}
          COMMENT "Running ${QT_LRELEASE} on ${TSFIL}"
          VERBATIM
      )
  endforeach()

  set_source_files_properties(${${QMS}} PROPERTIES GENERATED TRUE)
  set(${QMS} ${${QMS}} PARENT_SCOPE)
endfunction()

使用方法:

include(translation-generate)
TRANSLATION_GENERATE(QM_FILES ${CMAKE_SOURCE_DIR}/translations)
add_custom_target(${PROJECT_NAME}_qm_files DEPENDS ${QM_FILES})
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_qm_files)
install(FILES ${QM_FILES} DESTINATION share/${PROJECT_NAME}/translations)
手順 5:control ファイルを作成する

debian/control(V25/Qt6):

Build-Depends:
 cmake,
 pkg-config,
 qt6-base-dev,
 qt6-tools-dev,
 qt6-svg-dev,
 libdtk6widget-dev,
 libdtk6core-dev

debian/control.1(V20/Qt5):

Build-Depends:
 cmake,
 pkg-config,
 qtbase5-dev,
 qttools5-dev,
 libqt5svg5-dev,
 libdtkwidget-dev,
 libdtkcore-dev

依存関係の対応表

用途V25 (Qt6)V20 (Qt5)
基本qt6-base-devqtbase5-dev
ツールqt6-tools-devqttools5-dev
SVGqt6-svg-devlibqt5svg5-dev
DTK Widgetlibdtk6widget-devlibdtkwidget-dev
DTK Corelibdtk6core-devlibdtkcore-dev

よくある間違い

間違い問題となる理由修正方法
Qt5::Core/Qt6::Core をハードコードする特定の Qt バージョンを強制しますQt${QT_VERSION_MAJOR}::Core を使用します
Dtk::Core/Dtk6::Core をハードコードする特定の DTK バージョンを強制しますDtk${DTK_VERSION_MAJOR}::Core を使用します
DTK_VERSION_MAJOR がないDTK が Qt のバージョンに対応付けられませんQt の検出結果から変数を対応付けます
control のみを使用し、control.1 を作成しないV20 をサポートできません両方の control ファイルを作成します
単一の control ファイルで OR 依存関係を使用するファイルを分ける必要がありますcontrol と control.1 に分けます
Qt のバージョンを 1 つだけテストするデュアルバージョン対応には両方での動作が必要ですV25 と V20 のビルドをテストします
find_package(QT NAMES Qt6 Qt5 ...) を使用しない両方を自動検出できません正しい find_package パターンを使用します

要注意事項 — 作業を中断して確認してください

  • CMakeLists.txt で Qt5/Qt6 をハードコードしている → QT_VERSION_MAJOR 変数を使用してください
  • CMakeLists.txt で DTK5/DTK6 をハードコードしている → DTK_VERSION_MAJOR 変数を使用してください
  • DTK_VERSION_MAJOR 変数がない → DTK が Qt のバージョンに対応付けられません
  • 個別の制御ファイルではなく OR 依存関係を使用している → control/control.1 を使用してください
  • Qt のバージョンを1つだけテストしている → 両方のバージョンで動作する必要があります
  • Qt の検出に find_package(QT NAMES Qt6 Qt5 ...) を使用していない → 両方のバージョンを検出できません

コメント