MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの設定 - CMakeのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの設定 - CMake
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == CMakeは、アメリカ国立医学図書館の出資により医療系画像解析に利用されるITK(Insight Toolkit)のために開発されたクロスプラットフォーム向けのメタビルドシステムであり、<br> qmakeと同様、クロスプラットフォーム向けに各種ビルドシステムのためのレシピファイルを生成する。<br> qmakeがQtのために開発されているのに対して、CMakeはITKのためにと開発されたが、メタビルドシステムとして独立のオープンソースプロジェクトとして単独で提供されている。<br> <br> このため、KDE、LLVM、OpenCVをはじめ多数のプロジェクトで採用されている。<br> <br> CMakeは、主に、C/C++等のプログラム言語のビルドに使用される。<br> CMakeが存在する以前では、C系言語のビルドには多数のビルドシステム(MakefileやNinjaやIDE等)が乱立していた。<br> これを隠蔽して、包括的に扱える様にしたものがCMakeである。<br> <br> また、CMakeには、CUI版とGUI版が存在する。<br> <br> CMakeは、変数、コマンド、マクロ、条件論理、ループ、コメント等の開発者にとって馴染みのある多くのものを備えている。<br> CMakeで使用されるコマンド名も大文字小文字を区別しないため、以下は全て等価である。<br> ただし、最近では、コマンド名を全て小文字で記述することが一般的である。(これは、CMakeのドキュメントでビルトインコマンドのために従われている慣習でもある)<br> <syntaxhighlight lang="cmake"> add_executable(myExe main.cpp) ADD_EXECUTABLE(myExe main.cpp) Add_Executable(myExe main.cpp) </syntaxhighlight> <br><br> == CMakeのバージョン管理 == CMakeは、新しいツールやプラットフォーム、機能のサポートを追加するために継続的に更新および拡張されている。<br> 開発者は、新しいリリースごとに後方互換性を維持することに非常に注意を払うことになる。<br> そのため、ユーザがCMakeの新しいバージョンに更新した時、プロジェクトは以前と同じようにビルドし続けることができる。<br> <br> 時には、CMakeの特定の動作を変更する必要があったり、より厳しいチェックや警告が新しいバージョンで導入されたりすることがある。<br> 全てのプロジェクトに直ちにこのような対応を要求するのではなく、CMakeは、プロジェクトが"CMakeのバージョン X.Y.Zのように振る舞う"というようなポリシー機構を提供する。<br> <br> CMakeのバージョン動作の詳細を指定する主な方法は、<code>cmake_minimum_required</code>コマンドを使用することである。<br> これは、CMakeLists.txtファイルの最初の行で記述するべきであり、プロジェクトの要件が他の何よりも先にチェックされ、確立されるようにするものである。<br> <code>cmake_minimum_required</code>コマンドは、以下に示す2つのことを実行する。<br> * プロジェクトが必要とするCMakeの最小バージョンを指定する。<br>CMakeLists.txtファイルが指定されたバージョンより古いCMakeのバージョンで処理された場合、エラーが発生して直ちに停止する。<br>これにより、処理を進める前に、CMakeの機能の特定の最小セットが利用可能であることが保証される。 * CMakeの動作を指定されたバージョンに一致させるためのポリシー設定を強制するものである。 <br> もし、<code>cmake_minimum_required</code>コマンドを記述しなかった場合は警告を出力する。<br> ほとんどのプロジェクトでは、<code>cmake_minimum_required</code>コマンドは、単に必要最小限のCMakeのバージョンを指定するものとして扱えば十分である。<br> <br> 詳細を知りたい場合は、[[Qtの設定 - CMake#CMakeのポリシー設定]]において、<code>cmake_minimum_required</code>コマンドの挙動を調整する方法を参照すること。<br> これにより、CMakeは内部でバグを修正し、新しい機能を導入しながらも、過去の特定のリリースの期待される振る舞いを維持することができる。<br> <br><br> == CMakeとqmakeの特徴 == <center> {| class="wikitable" | style="background-color:#fefefe;" |- ! style="background-color:#66CCFF;width: 30%;" | ! style="background-color:#66CCFF;width: 35%;" | qmake ! style="background-color:#66CCFF;width: 35%;" | CMake |- | style="background-color:#EEEEEE;" | レシピファイル || <Qtプロジェクト名>.pro || CMakeLists.txt |- | style="background-color:#EEEEEE;" | レシピの呼び方 || プロジェクトファイル || CMakeソースコード |- | style="background-color:#EEEEEE;" | 特徴 || 変数ベース || コマンドベース |- | style="background-color:#EEEEEE;" | ターゲット || 1ファイル 1ターゲット || 1ファイル 複数ターゲット |- | style="background-color:#EEEEEE;" | プロジェクト間の連携 || 不可 || ターゲット名でリンク可能 |- | style="background-color:#EEEEEE;" | Qtのサポート || ◎ || ○ |- | style="background-color:#EEEEEE;" | Qt Creatorの対応 || ◎ || ファイルの追加等の対応がイマイチ |- | style="background-color:#EEEEEE;" | カスタムコンパイラの対応 || △ || ◎ |- | style="background-color:#EEEEEE;" | Packageの作成 || △ || ○ |} </center> <br> ==== レシピファイルの違い ==== qmakeとCMakeは、レシピの考え方が異なる。<br> qmakeは、変数<code>SOURCES</code>等のような変数に適切な値を設定していくことにより、対応するアーキテクチャの設定ファイル等から取得した値を使用して、<br> MakefileやVisual Studio / XCode向けのプロジェクトファイルを生成する。<br> CMakeは、コマンドと呼ばれる関数の引数に、ターゲットの情報、Define情報、インクルードパス等をプログラムして、Makefileや各種プロジェクトファイルを生成する。<br> <syntaxhighlight lang="cmake"> # 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) </syntaxhighlight> <br> 以下の例は、Qt Coreライブラリのみを使用するQtソフトウェアにおける最低限のレシピファイルである。<br> <br> CMakeは汎用的なツールのため、Qtライブラリを使用する場合、CMakeのコマンド量が増加する。<br> <code>find_package</code>関数を使用してQtライブラリ全体からQt Coreライブラリを要求することにより、<br> Qt Coreライブラリを変数Qt5::Core(Qt6では、Qt6::Coreとなる)経由で、<code>target_link_libraries</code>に指定してリンクを指示する。<br> <syntaxhighlight lang="cmake"> # 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 ) </syntaxhighlight> <br> ==== 共通の機能 ==== * サブディレクトリ(サブプロジェクト)に対応 * ファイルの読み書き * 独自関数の定義 * 別ファイルに分割したレシピをインクルードできる * 自動的にmocを呼び出す * Qtのリソースファイル対応 * インストールの定義 * 繰り返し文や条件分岐文 * プラットフォームの判定 * インストール * テストの設定および実行 * 追加機能およびモジュール等の提供 <br> CMakeの強みは、カスタムコンパイラ、機能の拡張性、パッケージ作成まで行う機能が提供されていることである。<br> qmakeでは、QTestによりテストの設定および実行もできるが、ビルドを補助するツールとしての特色が強い。<br> CMakeでは、CTest、CPack等の機能により、テストやパッケージ作成も可能である。<br> <br> qmakeもCMakeも制御構文を持ち複雑なプロジェクトの作成も可能であるが、プロジェクトでの採用検討という視点から将来性も含めて考慮した場合、CMakeの方が有力である。<br> <br><br> == 変数 == ==== 変数の宣言と代入 ==== 変数は、<code>set</code>コマンドを使用して、変数を宣言および代入することができる。<br> <syntaxhighlight lang="cmake"> set(value 1) # 値が1の変数valueを宣言 </syntaxhighlight> <br> 既存の変数への代入も<code>set</code>コマンドを使用する。<br> 変数の値の参照は、入れ子にすることもできる。<br> <syntaxhighlight lang="cmake"> set(value 1) # 値が1の変数valueを生成 set(value 2) # 既存の変数valueに値1を代入 set(value_name value) # 変数value_nameに変数valueの値を代入 message(${${value_name}}) # ${value_name}が展開されて、${${value_name}}が${value}になり、これが展開されて2になる </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> set(USE_CCACHE OFF CACHE BOOL "") </syntaxhighlight> <br> ==== 変数の削除 ==== 変数の削除する場合は、<code>unset</code>コマンドを使用する。<br> <syntaxhighlight lang="cmake"> set(value 1) # 変数valueを宣言 unset(value) # 変数valueを削除 </syntaxhighlight> <br> ==== 定義された全ての変数を出力 ==== <syntaxhighlight lang="cmake"> get_cmake_property(variableNames VARIABLES) foreach(variableName ${variableNames}) message(STATUS "${variableName}=${${variableName}}") endforeach() </syntaxhighlight> <br><br> == ログメッセージの出力 == ==== messageコマンドとは ==== <syntaxhighlight lang="cmake"> message([<mode>] "message to display" ...) </syntaxhighlight> <br> 下表に、<code><mode></code>に指定できる項目を示す。(一部)<br> <center> {| class="wikitable" | style="background-color:#fefefe;text-align: center;" |- ! style="background-color:#66CCFF;width: 20%;" | modeの種類 ! style="background-color:#66CCFF;width: 30%;" | 説明 ! style="background-color:#66CCFF;width: 30%;" | 処理の継続 ! style="background-color:#66CCFF;width: 20%;" | 出力先 |- | 省略する場合 || 重要な情報 || CMakeの処理を継続する || STDERR |- | STATUS || 情報 || CMakeの処理を継続する || STDOUT |- | WARNING || 警告 || CMakeの処理を継続する || STDERR |- | SEND_ERROR || エラー || CMakeの処理を継続する || STDERR |- | FATAL_ERROR || 致命的なエラー || CMakeの処理を終了する || STDERR |} </center> <br> 以下の例では、<code>message</code>コマンドにおいて、第1引数に<code>FATAL_ERROR</code>を指定することにより、エラーメッセージを出力して、CMakeコマンドを終了している。<br> <syntaxhighlight lang="cmake"> message(FATAL_ERROR "cmake to terminate.") </syntaxhighlight> <br> また、<code>message</code>コマンドにおいて、第1引数に<code>SEND_ERROR</code>を指定することにより、エラーメッセージを出力して動作を継続する。<br> <syntaxhighlight lang="cmake"> message(SEND_ERROR "Continue cmake.") </syntaxhighlight> <br> 以下の例では、Linux以外のOSの場合は、エラーメッセージを出力して、<code>cmake</code>コマンドを終了している。<br> <syntaxhighlight lang="cmake"> if(NOT (UNIX AND NOT APPLE)) message(FATAL_ERROR "ERROR! Only Linux can build this software.") else() set(LINUX TRUE) endif() </syntaxhighlight> <br> 以下の例では、CMakeの特殊変数である<code>CMAKE_COMMAND</code>と<code>CMAKE_CTEST_COMMAND</code>を出力している。<br> <syntaxhighlight lang="cmake"> message("${CMAKE_COMMAND}") # /usr/bin/cmake message("${CMAKE_CTEST_COMMAND}") # /usr/bin/ctest </syntaxhighlight> <br><br> == インクルードパスの指定 == インクルードパスを指定する場合、<code>include_directories</code>コマンドを使用する。<br> <syntaxhighlight lang="cmake"> include_directories(/path/to/include) </syntaxhighlight> <br> <code>include_directories</code>コマンドを複数使用する場合、デフォルトでは、指定したパスは最後尾となる。<br> ただし、<code>include_directories</code>コマンドに<code>BEFORE</code>オプションを付加した場合は最前となる。<br> <br> 以下の例では、"-I/path1/to/include -I/path2/to/include"となる。<br> <syntaxhighlight lang="cmake"> include_directories(/path1/to/include) include_directories(/path2/to/include) </syntaxhighlight> <br> 以下の例では、"-I/path2/to/include -I/path1/to/include" となる。<br> <syntaxhighlight lang="cmake"> include_directories(/path1/to/include) include_directories(BEFORE /path2/to/include) </syntaxhighlight> <br><br> == ライブラリパスの指定 == ライブラリパスを指定する場合、<code>link_directories</code>コマンドを使用する。<br> <syntaxhighlight lang="cmake"> link_directories(/path/to/lib) </syntaxhighlight> <br> <code>link_directories</code>コマンドを複数使用する場合、デフォルトでは、指定したパスは最後尾となる。<br> ただし、<code>link_directories</code>コマンドに<code>BEFORE</code>オプションを付加した場合は最前となる。<br> <br> 以下の例では、"-I/path1/to/lib -I/path2/to/lib"となる。<br> <syntaxhighlight lang="cmake"> link_directories(/path1/to/lib) link_directories(/path2/to/lib) </syntaxhighlight> <br> 以下の例では、"-I/path2/to/lib -I/path1/to/lib" となる。<br> <syntaxhighlight lang="cmake"> link_directories(/path1/to/lib) link_directories(BEFORE /path2/to/lib) </syntaxhighlight> <br><br> == qt5_create_translation == TSファイルやTSファイルがあるディレクトリを指定して、Qt LinguistからTSファイルを生成する。<br> TSファイルは、ビルドディレクトリに保存される同じベースネームのQMファイルにコンパイルされる。<br> <br> 生成されたQMファイルへのパスは、<変数名>に追加される。<br> <br> 作成または更新する翻訳ファイルの拡張子は<code>.ts</code>である必要がある。<br> 与えられたTSファイルのパスが相対パスの場合、現在のプロジェクトのトップディレクトリからの相対パスで解決される。<br> <br> TSファイルが存在しない場合、<code>qt5_create_translation</code>は何もしない。<br> <br> <code>lupdate</code>コマンドは、ソースファイルまたはディレクトリを入力として受け付ける。<br> <オプション>は、<code>lupdate</code>コマンドの実行時に使用するオプションを指定することができる。<br> 指定可能なオプションは、[[Qtの設定 - Qt Linguist#lupdateコマンド]]を参照すること。<br> <syntaxhighlight lang="cmake"> 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) </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの設定 - CMake
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse