「Qtの設定 - CMake」の版間の差分
(→変数) |
|||
438行目: | 438行目: | ||
<br> | <br> | ||
qmakeもCMakeも制御構文を持ち複雑なプロジェクトの作成も可能であるが、プロジェクトでの採用検討という視点から将来性も含めて考慮した場合、CMakeの方が有力である。<br> | qmakeもCMakeも制御構文を持ち複雑なプロジェクトの作成も可能であるが、プロジェクトでの採用検討という視点から将来性も含めて考慮した場合、CMakeの方が有力である。<br> | ||
<br><br> | <br><br> | ||
2024年3月22日 (金) 19:46時点における版
概要
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は、変数、コマンド、マクロ、条件論理、ループ、コメント等の開発者にとって馴染みのある多くのものを備えている。
CMakeで使用されるコマンド名も大文字小文字を区別しないため、以下は全て等価である。
ただし、最近では、コマンド名を全て小文字で記述することが一般的である。(これは、CMakeのドキュメントでビルトインコマンドのために従われている慣習でもある)
add_executable(myExe main.cpp)
ADD_EXECUTABLE(myExe main.cpp)
Add_Executable(myExe main.cpp)
非推奨のコマンドおよび設定
- include_directoriesコマンド
- 指定したディレクトリからヘッダファイルを検索するコマンドである。
- 定義した箇所以降の全てのターゲットが指定したディレクトリをインクルードするため、使用は避けるべきである。
- add_definitionsコマンド
- add_compile_definitionsコマンド
- add_compile_optionsコマンド
- link_directoriesコマンド
- link_librariesコマンド
- キャッシュ変数には、必ず接頭辞を付加する
- キャッシュ変数はグローバル変数であるため、名前の衝突を避けるために接頭辞を付加する。
- 変数CMAKE_<LANG>_FLAGS
- 代わりに、
target_compile_options
を使用する。 target_compile_options(<ターゲット名> PUBLIC -Wall)
- 代わりに、
- 変数
CMAKE_CXX_FLAGS
やtarget_compile_options
コマンドに、-std=c++17
等を指定しない。- 変数
CMAKE_CXX_STANDARD
を使用する(CMake 3.1以降)、または、target_compile_features
コマンドにcxx_std_17
を指定する。(CMake 3.8以降)
- 変数
- 変数CMAKE_SOURCE_DIRを使用しない
- 変数
CMAKE_SOURCE_DIR
は、トップレベルのディレクトリを指す。 - 異なるプロジェクトがネストしている場合、自身のプロジェクトのルートディレクトリ以外のパスを指すため、使用すべきでない。
- 代わりに、変数
CMAKE_CURRENT_SOURCE_DIR
、変数PROJECT_SOURCE_DIR
、変数<プロジェクト名>_SOURCE_DIR
を使用する。
- 変数
- macroコマンドの代わりにfunctionコマンドを使用する
function
コマンドは、関数を定義するためのコマンドである。macro
コマンドは、呼び出す側のスコープにある変数を上書きするため、自身のスコープを持つfunction
コマンドを使用する。- 親ディレクトリのスコープにある変数を上書きする場合は、
set(<変数名> <値> ... PARENT_SCOPE)
コマンドを使用する。
- file(GLOB)コマンド
file(GLOB)
コマンドは、CMakeを実行するたびに条件に合致するファイルのリストを自動的に作成するコマンドである。- ただし、特定のIDEでは正常に動作しない可能性があるため、コマンドラインから実行するような場合ではない限り使用すべきではない。
- IDEで使用する場合は、CMakeLists.txtファイルに
add_subdirectory
コマンドとtarget_sources
コマンドを使用して、再帰的にファイルを明示して追加する。
# CMakeLists.txtファイル
add_executable(<ターゲット名>)
add_subdirectory(<ディレクトリ名1>)
add_subdirectory(<ディレクトリ名2>)
# 同様に子ディレクトリを追加する
# <ディレクトリ名1>/CMakeLists.txtファイル
# CMake 3.12以前
target_sources(<ターゲット名> PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
# 絶対パスで指定しないとエラーになるため注意すること
)
# CMake 3.13以降
cmake_policy(SET CMP0076 NEW) # CMakeが自動的に相対パスを絶対パスへ変換する
target_sources(<ターゲット名> PRIVATE
file1.cpp
file2.cpp
)
# 画像ファイルの取得 (PNG, JPG, SVG)
execute_process(
COMMAND find ${CMAKE_CURRENT_SOURCE_DIR}/Image -iname "*.png" -o -iname "*.jpg" -o -iname "*.svg"
OUTPUT_VARIABLE IMAGES
)
string(REPLACE "\n" ";" IMAGE_FILES "${IMAGES}")
PRIVATE
オプション、PUBLIC
オプション、INTERFACE
オプションを適切に使用する。- これらのオプションは、コマンドのターゲットおよびそのターゲットに依存するターゲットに対する必要性を表す。
- ヘッダファイルのみのライブラリの場合は、
INTERFACE
オプションを使用する。
オプション | ターゲットが必要とする | ターゲットに依存するターゲットが必要とする |
---|---|---|
PRIVATE | ○ | ☓ |
PUBLIC | ○ | ○ |
INTERFACE | ☓ | ○ |
- ライブラリの種類を指定しない
- ビルドするユーザがスタティックライブラリまたはダイナミックライブラリを指定できるようにする。
BUILD_SHARED_LIBS
オプションを付加して選択することもできるが、各ライブラリごとにオプションを設定すべきである。
option(<変数名1> "build library as a shared library" ON)
if(<変数名1>)
add_library(<ターゲット名> SHARED)
else()
add_library(<ターゲット名> STATIC)
endif()
実行ファイルの構築 (add_executableコマンド)
add_executable
コマンドは、CMakeにソースファイルのセットから実行ファイルを作成する。
add_executable(
<ターゲット名>
<ソースコードファイル名 1>
<ソースコードファイル名 2>
# ...略
)
# 例. myAppまたはmyApp.exeという名前の実行ファイルが生成される
add_executable(
myApp
main.cpp
)
<ターゲット名>
には、英数字、アンダースコア、ハイフンを使用することができる。
CMakeプロジェクトのビルドが正常に終了すると、<ターゲット名>
として実行ファイルが作成される。
ターゲット名は、CMakeの機能であるターゲットプロパティでカスタマイズすることもできる。
また、ターゲット名を変更して、add_executable
コマンドを複数回呼び出すことにより、1つのCMakeLists.txtファイル内で複数の実行ファイルを定義することができる。
ただし、同じターゲット名を複数のadd_executable
コマンドで使用する場合は、CMakeは失敗してエラーがハイライトされる。
# CMakeプロジェクトの例
cmake_minimum_required(VERSION 3.2)
# C++コンパイラは未使用とするため、プラットフォームが持っていない場合に備えて、projectコマンドで使用されないように指定する
project(MyApp VERSION 4.7.2 LANGUAGES C)
# メインの実行ファイルを生成
add_executable(
mainTool
main.c
debug.c # リリースビルドのために最適化される
)
# サブの実行ファイルの生成
add_executable(
testTool
testTool.c
)
ライブラリの構築 (add_libraryコマンド)
CMakeは様々な種類のライブラリのビルドをサポートしている。
ライブラリを作成して使用する場合、add_library
コマンドを使用する。
add_library(
<ターゲット名>
[<STATIC または SHARED または MODULE>]
[EXCLUDE_FROM_ALL]
<ソースコードファイル名 1>
<ソースコードファイル名 2>
# ...略
)
<ターゲット名>
は、CMakeLists.txtファイル内でライブラリを参照するために使用される。
ビルドされたライブラリ名は、<ターゲット名>
となる。
EXCLUDE_FROM_ALL
オプションは、add_executable
コマンドと同様、ライブラリがデフォルトのALLターゲットに含まれないようにする。
構築するライブラリの種類は、STATIC
、SHARED
、MODULE
のうちの1つを指定する。
- STATICオプション
- 静的ライブラリまたはアーカイブを指定する。
- Windowsでは、デフォルトのライブラリ名は、<ライブラリファイル名>.libとなる。
- Linuxでは、デフォルトのライブラリ名は、lib<ライブラリファイル名>.aとなる。
- SHARED
- 共有ライブラリまたは動的ライブラリを指定する。
- Windowsでは、デフォルトのライブラリ名は、<ライブラリファイル名>.dllとなる。
- Linuxでは、デフォルトのライブラリ名は、lib<ライブラリファイル名>.soとなる。
- MODULE
- 共有ライブラリに似ているが、ライブラリや実行ファイルに直接リンクされるのではなく、実行時に動的にロードされることを意図しているライブラリを指定する。
- これらは、ユーザがロードするかどうかを選択できるプラグイン、または、オプションのコンポーネントである。
- Windowsでは、DLL向けのインポートライブラリは作成されない。
よほどのことがない限り、STATIC
またはSHARED
オプションは、それが必要であることが分かるまで付加しないことを推奨する。
これにより、プロジェクト全体を通して、スタティックライブラリかダイナミックライブラリかをより柔軟に選択することができる。
ビルドするライブラリの種類を定義するオプションを省略することも可能である。
特定のライブラリが必要でない限り、プロジェクトファイルには指定せずに、プロジェクトの構築時に開発者が選択できるようにすることが望ましい。
そのような場合、ライブラリはSTATIC
かSHARED
のどちらかになり、変数BUILD_SHARED_LIBS
の値により選択される。
変数BUILD_SHARED_LIBS
がtrue
を代入する場合はライブラリのターゲットはダイナミックライブラリ、それ以外の場合はスタティックライブラリとなる。
add_library
コマンドを呼び出すたびに変更する必要がなく、1ヶ所に記述するだけで設定を変更することができる。
ただし、add_library
コマンドを呼び出す前に、変数BUILD_SHARED_LIBS
を記述する必要がある。
set(BUILD_SHARED_LIBS YES)
変数BUILD_SHARED_LIBS
を設定する方法として、cmake
コマンドに-DBUILD_SHARED_LIBS
オプションを付加する方法がある。
cmake -DBUILD_SHARED_LIBS=YES /path/to/source
CMAKEキャッシュ変数
CMAKE_PREFIX_PATH
# ライブラリのインストールディレクトリを指定
## ライブラリのインストールディレクトリを1つ指定する場合
set(CMAKE_PREFIX_PATH "<ライブラリのパス>")
## ライブラリのインストールディレクトリを複数指定する場合
set(CMAKE_PREFIX_PATH "<ライブラリのパス 1>;<ライブラリのパス 2>;<ライブラリのパス 3>")
# find_packageコマンドを使用してライブラリを検索
find_package(<ライブラリ名> REQUIRED)
if(<ライブラリ名>_FOUND)
# ライブラリが見つかった場合
else()
# ライブラリが見つからなかった場合
endif()
find_packageコマンド
find_packageコマンドとは
find_package
コマンドは、特定の名前のCMakeスクリプトを検索して、該当のスクリプトを実行するコマンドである。
対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。
find_package
コマンドは、Module -> Configの順で検索を行う。
具体的な動作は以下のとおりです。
- Module
<パッケージ名>.cmakeファイル、または、Find<パッケージ名>.cmakeファイルを検索する。- CMakeキャッシュ変数である変数
CMAKE_MODULE_PATH
で指定されたパス - CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等)
- CMakeキャッシュ変数である変数
- Config
<パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルを検索する。- CMake変数
<PackageName>_DIR
で指定されたパス - CMakeキャッシュ変数である変数
<パッケージ名>_ROOT
で指定されたパス - 環境変数
<パッケージ名>_ROOT
で指定されたパス - CMakeキャッシュ変数である変数
CMAKE_PREFIX_PATH
、変数CMAKE_FRAMEWORK_PATH
、変数CMAKE_APPBUNDLE_PATH
で指定されたパス - 環境変数
<パッケージ名>_DIR
、環境変数CMAKE_PREFIX_PATH
、環境変数CMAKE_FRAMEWORK_PATH
、環境変数CMAKE_APPBUNDLE_PATH
で指定されたパス - 環境変数
PATH
で指定されたパス (binディレクトリおよびsbinディレクトリで終わるディレクトリの場合は、その親ディレクトリに読み替える) - その他
- CMake変数
なお、コマンド終了時において、CMake変数<パッケージ名>_FOUND
に0
または1
(FALSE
またはTRUE
)が格納されるため、
正常に検索できたかどうかを条件分岐として記述することもできる。
Module (CMakeスクリプト)
Moduleは、以下の2種類に分類される。
- Utility Modules
- よく使用するCMake関数をまとめたもの。
- 例えば、CheckLanguage.cmake(あるプログラミング言語の開発ツールがインストールされているか確認するための機能をまとめたもの)等がある。
- Utility ModulesのCMakeスクリプトを読み込む時、
check_language
コマンド、get_bundle_main_executable
コマンド等の関数が定義されるため、 - それらを呼び出すことで機能を使用することができる。
- Find Modules
- 外部ライブラリの情報を収集するものであり、ファイル名はFind<パッケージ名>.cmakeファイルである。
- 例えば、C++で記述された外部ライブラリをリンクする場合、ヘッダファイルのディレクトリ、ライブラリファイルのディレクトリ、ライブラリファイル名の3つの情報が必要になる。
- これらの情報を自動的に収集するものがFind Modulesである。
- CMakeでは、Boost、BLAS、GLEW、OpenGL、X11、Qt4等のライブラリのFind Modulesがデフォルトで用意されている。
- ほとんどのFind Modulesは、以下に示すようなCMake変数に値が自動的に代入される。
- 変数
<パッケージ名>_INCLUDE_DIRS
- インクルードディレクトリのパス
- 変数
<パッケージ名>_LIBRARY_DIRS
- ライブラリファイルがあるディレクトリのパス
- 変数
<パッケージ名>_LIBRARIES
- ライブラリファイル名のリスト
- 変数
<パッケージ名>_DEFINITIONS
- コンパイル時の
definition
フラグ
- コンパイル時の
- 変数
find_package
コマンドを使用することにより、上記の変数は自動的に代入されるため、その変数をtarget_include_directories
コマンド等に設定を記述する。- ただし、上記の変数名は必ずしもこの通りになっているわけではないため、ライブラリの情報を変数にまとめるのではなくターゲット(ライブラリ)を作成してそのプロパティにまとめる場合もある。
- そのため、各ライブラリのFind Modulesを確認することが必要である。
CMakeでは、初期状態でいくつかのModuleがインストールされている。
Moduleの一覧は、CMakeの公式Webサイトから確認することができる。
また、Moduleが存在しないライブラリでは、開発者がModuleを作成することもできる。
Config (CMakeスクリプト)
Configファイルは、CMakeプロジェクトをビルドしてライブラリをインストールした時に生成される設定ファイルである。
ファイル名は、<パッケージ名>Config.cmake
ファイル、または、<パッケージ名(小文字)>-config.cmake
ファイルである。
ライブラリ情報を提供する点ではFindモジュールと同様であるが、Configファイルはライブラリの開発元が直接提供している設定ファイルである。
ライブラリをインストールした時、cmakeディレクトリやshareディレクトリの中に含まれていることが多い。
Findモジュールと同様、多くのConfigファイルは以下に示すようなCMake変数が存在する。
また、これらの情報を1つのターゲットにまとめている場合もある。
- 変数
<パッケージ名>_INCLUDE_DIRS
- インクルードディレクトリのパス
- 変数
<パッケージ名>_LIBRARY_DIRS
- ライブラリファイルがあるディレクトリのパス
- 変数
<パッケージ名>_LIBRARIES
- ライブラリファイル名のリスト
- 変数
<パッケージ名>_DEFINITIONS
- コンパイル時の
definition
フラグ
- コンパイル時の
Configファイルを使用する場合、開発元が公開しているドキュメントやConfigファイルの内容から、各変数名や各ターゲット名を確認する必要がある。
Linuxにおいて、Configファイルの場所は以下に示すようなディレクトリに配置される。
また、初期設定より、/usr/binディレクトリは環境変数PATH
に設定されているため、CMakeは自動的にConfigファイルを見つけることができる。
- /usr/lib64/cmake/<パッケージ名>
- /usr/share/cmake/<パッケージ名>
したがって、Linuxでは、パッケージ管理システムからインストールしたライブラリは、find_package
コマンドで見つけることができる。
もし、ライブラリにConfigファイルが付属していない場合、開発者自身でFindモジュールを作成する必要がある。
また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<パッケージ名>_DIR
にライブラリのパスを設定することにより、Configファイルを見つけることができる。
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の方が有力である。
条件分岐
if()コマンドおよびelseif()コマンドの引数には、そのブロックを実行する条件式を記述する。
この条件式には、以下に示す種類がある。
- ブール定数
- CMakeの値は全て文字列型であるが、条件式では以下に示す値がBooleanとして認識される。
- これらの値は、大文字・小文字は区別されないことに注意する。
真と解釈される値
- 0でない数値
- ON
- YES
- TRUE
- Y
# 例 if(1) if(TRUE) if(on) if(Yes)
偽と解釈される値
- 空文字列
- 0
- OFF
- NO
- FALSE
- N
- IGNORE
- NOTFOUND
- 末尾が
-NOTFOUND
である文字列
# 例 if(0) if(FALSE) if(off) if(No) if(SamplePackage-NotFound)
ブール演算子
論理積を表すAND、論理和を表すOR、否定を表すNOTが使用できる。
これらは、全て大文字でなければならないことに注意する。
# 例 if(true AND true) if(true OR false) if(NOT false)
変数の確認
変数が定義済みかどうかの確認、および、数値の比較等を行うことができる。
# 例 if(DEFINED variable) if(1 LESS 2)
- 対象の存在の確認
- 対象の存在を判定することができる。
# 例 if(DEFINED value) # value という変数がセットされているかどうか if(COMMAND message) # message というコマンドが存在するかどうか if(POLICY CMP0011) # CMP0011 というポリシーが存在するかどうか if(TARGET test) # test というターゲットが定義されているかどうか if(EXISTS src/a.cpp) # src/a.cpp というパスが存在しているかどうか
- 対象の性質の確認
- 対象の性質を確認することができる。
# 例 if(IS_DIRECTORY src/) # src/ がディレクトリかどうか if(IS_SYMLINK /bin/sh) # /bin/sh がシンボリックリンクかどうか if(IS_ABSOLUTE /) # / が絶対パスかどうか
数値および文字列等の比較
- 数値の比較
- 数値の比較することができる。
# 例 if(1 EQUAL 1) if(1 LESS 2) if(2 GREATER 1)
- 文字列のパターンマッチ
<文字列> MATCHES <正規表現のパターン>
- 文字列正規表現のパターンにマッチするかどうかを確認することができる。
- もし、文字列が空文字列、または、存在しない場合は、
false
を返す。
# 例 # 文字列がa(1文字以上)から始まり、aの次がbで終わる場合 if("aaaab" MATCHES "^a+b$")
- 文字列の比較
- 文字列を比較することができる。
- 辞書順に基づく。
# 例 if("a" STREQUAL "a") # 文字列が同じ if("a" STRLESS "aa") # "a" < "aa" if("b" STRGREATER "a") # "b" > "a"
- バージョンを比較
- バージョンを比較することができる。
- バージョンのフォーマットは、<メジャー>[.<マイナー>[.<パッチ>[.<ビルド>]]]である。
- 数値的な順序や辞書順には基づかない。
- 例えば、0.1という値と0.1.0.0という値は等しいと評価される。
- また、1.19は、1.2より大きいと評価される。
# 例 if(0.1 VERSION_EQUAL 0.1.0.0) # 0.1 == 0.1.0.0 if(0.1 VERSION_LESS 0.1.1) # 0.1 < 0.1.1 if(1.19 VERSION_GREATER 1.2) # 1.19 > 1.2
- ファイルのタイムスタンプの比較
- ファイル1とファイル2のタイムスタンプを比較することができる。
- ファイル1がファイル2より新しい場合、
true
を返す。 - また、いずれかのファイルが存在しない場合も、
true
を返す。
# 例 if(build/my_exe IS_NEWER_THAN /usr/local/bin/my_exe)
ログメッセージの出力
messageコマンドとは
message([<mode>] "message to display" ...)
下表に、<mode>
に指定できる項目を示す。(一部)
modeの種類 | 説明 | 処理の継続 | 出力先 |
---|---|---|---|
省略する場合 | 重要な情報 | CMakeの処理を継続する | STDERR |
STATUS | 情報 | CMakeの処理を継続する | STDOUT |
WARNING | 警告 | CMakeの処理を継続する | STDERR |
SEND_ERROR | エラー | CMakeの処理を継続する | STDERR |
FATAL_ERROR | 致命的なエラー | CMakeの処理を終了する | STDERR |
以下の例では、message
コマンドにおいて、第1引数にFATAL_ERROR
を指定することにより、エラーメッセージを出力して、CMakeコマンドを終了している。
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()
以下の例では、CMakeの特殊変数であるCMAKE_COMMAND
とCMAKE_CTEST_COMMAND
を出力している。
message("${CMAKE_COMMAND}") # /usr/bin/cmake
message("${CMAKE_CTEST_COMMAND}") # /usr/bin/ctest
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)