qmake2cmakeの紹介

本稿は「Introducing qmake2cmake」の抄訳です。

Qt独自のQMakeプロジェクトファイルは、qtbaseに存在するpro2cmakeというPythonスクリプトを使用して変換されます。このスクリプトは、Qtリポジトリ内のプロジェクトを変換するために特別に作成されており、ユーザープロジェクトの変換にはほとんど役立ちません。

このスクリプトをフォークして、お客様のプロジェクトに適用できる変換ツールにしました。それがqmake2cmakeです。

機能

qmake2cmakeツールは、変換された.proファイルの一般的な機能をカバーするCMakeLists.txtを作成します。生成されたCMakeプロジェクトはベースラインとして使用できますが、おそらく手動で調整が必要になるでしょう。

変換できないQMake構文は、CMakeプロジェクト内のコメントとして表示されます。これらのコメントは、該当部分を手動で変換する際に役立ちます。

多くのプロジェクトには複数の.proファイルがあります。QMakeのSUBDIRS階層に対しては、qmake2cmake_allがあり、プロジェクトのルートディレクトリ内で起動し、その下のすべてを変換します。

Qt自体では、変換速度が無視できない要素でした。そのため、qmake2cmake_allはサブプロジェクトの変換を並列化しています。

変換できない構造

変換できない箇所はいくつかあります。

  • TEMPLATE = aux プロジェクト
  • カスタム .prf ファイル
  • カスタムコンパイラ
  • カスタムターゲット

このすべては、手動で変換する必要があります。

変換ツールの入手

qmake2cmakeのインストールは非常に簡単で、次のコマンドを実行するだけです。

python -m pip install qmake2cmake

ソースコードが必要な場合は、下記リポジトリをクローンしてください。

git://code.qt.io/qt/qmake2cmake.git 

インストールの要件やその他の詳細については、README.mdを参照してください。

使い方

プロジェクト構造の全体を変換するには、プロジェクトディレクトリをqmake2cmake_allに渡してください。
qmake2cmake_all ~/projects/myapp --min-qt-version 6.3

プロジェクトがビルドに使用する最低Qtバージョンを指定する必要があります。これにより、正しいCMake APIがQtバージョンに選択されます。

各呼び出しでこのパラメータを渡すことを避けるために、QMAKE2CMAKE_MIN_QT_VERSION 環境変数を設定することもできます。

次の呼び出しによって、単一のQMakeプロジェクトファイルをCMakeに変換します。
qmake2cmake ~/projects/myapp/myapp.pro

デフォルトでは、CMakeLists.txt.proファイルと同じ場所に配置されます。別の場所に作成するには、-o オプションを使用してください。
qmake2cmake ~/projects/myapp/myapp.pro -o ~/projects/myapp-converted/CMakeLists.txt

サンプル変換結果

次のコードは、gui/analogclock example のサンプルを最小Qtバージョン6.3でCMakeに変換した結果を示しています。

cmake_minimum_required(VERSION 3.16) 
project(analogclock VERSION 1.0 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

qt_standard_project_setup()

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui)

qt_add_executable(analogclock WIN32 MACOSX_BUNDLE
   ../rasterwindow/rasterwindow.cpp ../rasterwindow/rasterwindow.h
   main.cpp
)
target_include_directories(analogclock PRIVATE
   ../rasterwindow
)

target_link_libraries(analogclock PRIVATE
   Qt::Core
   Qt::Gui
)

install(TARGETS analogclock
   BUNDLE DESTINATION .
   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_app_script(
   TARGET analogclock
   FILENAME_VARIABLE deploy_script
   NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script}

貢献について

qmake2cmakeツールはQtプロジェクトによってホストされており、通常の貢献ルールが適用されます。

バグは、プロジェクト「Qt(QTBUG)」およびコンポーネント「Build Tools: other」を使用して、https://bugreports.qt.io/ に報告してください。


Blog Topics:

Comments