Qtの設定 - CMake
概要
CMakeは、アメリカ国立医学図書館の出資により医療系画像解析に利用されるITK(Insight Toolkit)のために開発されたクロスプラットフォーム向けのメタビルドシステムであり、
qmakeと同様、クロスプラットフォーム向けに各種ビルドシステムのためのレシピファイルを生成する。
qmakeがQtのために開発されているのに対して、CMakeはITKのためにと開発されたが、メタビルドシステムとして独立のオープンソースプロジェクトとして単独で提供されている。
このため、KDE、LLVM、OpenCVをはじめ多数のプロジェクトで採用されている。
CMakeは、主に、C/C++等のプログラム言語のビルドに使用される。
CMakeが存在する以前では、C系言語のビルドには多数のビルドシステム(MakefileやNinjaやIDE等)が乱立していた。
これを隠蔽して、包括的に扱える様にしたものがCMakeである。
また、CMakeには、CUI版とGUI版が存在する。
CMakeとqmakeの特徴
qmake | CMake | |
---|---|---|
レシピファイル | <Qtプロジェクト名>.pro | CMakeLists.txt |
レシピの呼び方 | プロジェクトファイル | CMakeソースコード |
特徴 | 変数ベース | コマンドベース |
ターゲット | 1ファイル 1ターゲット | 1ファイル 複数ターゲット |
プロジェクト間の連携 | 不可 | ターゲット名でリンク可能 |
Qtのサポート | ◎ | ○ |
Qt Creatorの対応 | ◎ | ファイルの追加等の対応がイマイチ |
カスタムコンパイラの対応 | △ | ◎ |
Packageの作成 | △ | ○ |
レシピファイルの違い
qmakeとCMakeは、レシピの考え方が異なる。
qmakeは、変数SOURCES
等のような変数に適切な値を設定していくことにより、対応するアーキテクチャの設定ファイル等から取得した値を使用して、
MakefileやVisual Studio / XCode向けのプロジェクトファイルを生成する。
CMakeは、コマンドと呼ばれる関数の引数に、ターゲットの情報、Define情報、インクルードパス等をプログラムして、Makefileや各種プロジェクトファイルを生成する。
# qmakeの場合
TEMPLATE = app
CONFIG -= qt # Qtライブラリを使用しない場合は、変数CONFIGからqtを削除する
SOURCES = main.cpp
# CMakeの場合
cmake_minimum_required(VERSION 3.15)
project(HelloWorld LANGUAGES CXX)
add_executable(helloworld main.cpp)
以下の例は、Qt Coreライブラリのみを使用するQtソフトウェアにおける最低限のレシピファイルである。
CMakeは汎用的なツールのため、Qtライブラリを使用する場合、CMakeのコマンド量が増加する。
find_package
関数を使用してQtライブラリ全体からQt Coreライブラリを要求することにより、
Qt Coreライブラリを変数Qt5::Core(Qt6では、Qt6::Coreとなる)経由で、target_link_libraries
に指定してリンクを指示する。
# qmakeの場合
TEMPLATE = app
QT -= gui # qmakeの初期状態はGUIが有効なため、変数QTからguiを削除することにより、Qt Coreライブラリのみとなる
SOURCES = main.cpp hello.cpp
HEADERS = hello.h
# CMakeの場合
cmake_minimum_required(VERSION 3.15)
project(HelloWorld LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5 COMPONENTS Core REQUIRED)
add_executable(helloworld
main.cpp
hello.cpp
hello.h
)
target_link_libraries(helloworld
Qt5::Core
)
共通の機能
- サブディレクトリ(サブプロジェクト)に対応
- ファイルの読み書き
- 独自関数の定義
- 別ファイルに分割したレシピをインクルードできる
- 自動的にmocを呼び出す
- Qtのリソースファイル対応
- インストールの定義
- 繰り返し文や条件分岐文
- プラットフォームの判定
- インストール
- テストの設定および実行
- 追加機能およびモジュール等の提供
CMakeの強みは、カスタムコンパイラ、機能の拡張性、パッケージ作成まで行う機能が提供されていることである。
qmakeでは、QTestによりテストの設定および実行もできるが、ビルドを補助するツールとしての特色が強い。
CMakeでは、CTest、CPack等の機能により、テストやパッケージ作成も可能である。
qmakeもCMakeも制御構文を持ち複雑なプロジェクトの作成も可能であるが、プロジェクトでの採用検討という視点から将来性も含めて考慮した場合、CMakeの方が有力である。
CMakeコマンドの停止
message
関数において、第1引数にFATAL_ERROR
を指定することにより、エラーメッセージを出力して停止する。
message(FATAL_ERROR "cmake to terminate.")
また、message
関数において、第1引数にSEND_ERROR
を指定することにより、エラーメッセージを出力して動作を継続する。
message(SEND_ERROR "Continue cmake.")
以下の例では、Linux以外のOSの場合は、エラーメッセージを出力して、cmake
コマンドを停止している。
if(NOT (UNIX AND NOT APPLE))
message(FATAL_ERROR "ERROR! Only Linux can build this software.")
else()
set(LINUX TRUE)
endif()
qt5_create_translation
TSファイルやTSファイルがあるディレクトリを指定して、Qt LinguistからTSファイルを生成する。
TSファイルは、ビルドディレクトリに保存される同じベースネームのQMファイルにコンパイルされる。
生成されたQMファイルへのパスは、<変数名>に追加される。
作成または更新する翻訳ファイルの拡張子は.ts
である必要がある。
与えられたTSファイルのパスが相対パスの場合、現在のプロジェクトのトップディレクトリからの相対パスで解決される。
TSファイルが存在しない場合、qt5_create_translation
は何もしない。
lupdate
コマンドは、ソースファイルまたはディレクトリを入力として受け付ける。
<オプション>は、lupdate
コマンドの実行時に使用するオプションを指定することができる。
指定可能なオプションは、Qtの設定 - Qt Linguist#lupdateコマンドを参照すること。
qt5_create_translation(<変数名> <TSファイル 1> <TSファイル 2> <TSファイル 3> ... <オプション>)
# 例.
# まず、プロジェクトのトップディレクトリにあるTSファイルを検索する。(helloworld_en.tsファイルとhelloworld_ja.tsファイル)
# 次に、lupdateコマンドを実行してTSファイルをコンパイルすることにより、helloworld_en.qmファイルとhelloworld.ja.qmファイルを生成または更新する。
qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} helloworld_en.ts helloworld_de.ts)