qt-compatibility-build について
Deepin V25/V20向けのQt/CMakeプロジェクトで、Qt6とQt5を同じコードベースからサポートするためのスキルです。Qtのバージョンを検出して対応するDTKのバージョンを割り当て、CMake内の固定参照を避けます。
主な機能
- 01Qt5またはQt6の自動検出
- 02Qtのバージョンに応じたDTKの割り当て
- 03依存関係とリンクの動的設定
- 04V25とV20の制御ファイルの分離
- 05翻訳生成設定のガイド
活用シーン
- 011つのプロジェクトでV25とV20をサポート
- 02CMakeの固定されたQt/DTK参照を置き換え
- 03検出したQtバージョンに応じたリンク設定
- 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/control | V25 | Qt6 |
debian/control.1 | V20 | Qt5 |
理由: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-dev | qtbase5-dev |
| ツール | qt6-tools-dev | qttools5-dev |
| SVG | qt6-svg-dev | libqt5svg5-dev |
| DTK Widget | libdtk6widget-dev | libdtkwidget-dev |
| DTK Core | libdtk6core-dev | libdtkcore-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 ...)を使用していない → 両方のバージョンを検出できません
コメント
Markdown 対応