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> == 非推奨のコマンドおよび設定 == * include_directoriesコマンド *: 指定したディレクトリからヘッダファイルを検索するコマンドである。 *: 定義した箇所以降の全てのターゲットが指定したディレクトリをインクルードするため、使用は避けるべきである。 <br> * add_definitionsコマンド <br> * add_compile_definitionsコマンド <br> * add_compile_optionsコマンド <br> * link_directoriesコマンド <br> * link_librariesコマンド <br> * キャッシュ変数には、必ず接頭辞を付加する *: キャッシュ変数はグローバル変数であるため、名前の衝突を避けるために接頭辞を付加する。 <br> * 変数CMAKE_<LANG>_FLAGS *: 代わりに、<code>target_compile_options</code>を使用する。 *: <code>target_compile_options(<ターゲット名> PUBLIC -Wall)</code> <br> * 変数<code>CMAKE_CXX_FLAGS</code>や<code>target_compile_options</code>コマンドに、<code>-std=c++17</code>等を指定しない。 *: 変数<code>CMAKE_CXX_STANDARD</code>を使用する(CMake 3.1以降)、または、<code>target_compile_features</code>コマンドに<code>cxx_std_17</code>を指定する。(CMake 3.8以降) <br> * 変数CMAKE_SOURCE_DIRを使用しない *: 変数<code>CMAKE_SOURCE_DIR</code>は、トップレベルのディレクトリを指す。 *: 異なるプロジェクトがネストしている場合、自身のプロジェクトのルートディレクトリ以外のパスを指すため、使用すべきでない。 *: 代わりに、変数<code>CMAKE_CURRENT_SOURCE_DIR</code>、変数<code>PROJECT_SOURCE_DIR</code>、変数<code><プロジェクト名>_SOURCE_DIR</code>を使用する。 <br> * macroコマンドの代わりにfunctionコマンドを使用する *: <code>function</code>コマンドは、関数を定義するためのコマンドである。 *: <code>macro</code>コマンドは、呼び出す側のスコープにある変数を上書きするため、自身のスコープを持つ<code>function</code>コマンドを使用する。 *: 親ディレクトリのスコープにある変数を上書きする場合は、<code>set(<変数名> <値> ... PARENT_SCOPE)</code>コマンドを使用する。 <br> * file(GLOB)コマンド *: <code>file(GLOB)</code>コマンドは、CMakeを実行するたびに条件に合致するファイルのリストを自動的に作成するコマンドである。 *: ただし、特定のIDEでは正常に動作しない可能性があるため、コマンドラインから実行するような場合ではない限り使用すべきではない。 *: IDEで使用する場合は、CMakeLists.txtファイルに<code>add_subdirectory</code>コマンドと<code>target_sources</code>コマンドを使用して、再帰的にファイルを明示して追加する。 <syntaxhighlight lang="cmake"> # CMakeLists.txtファイル add_executable(<ターゲット名>) add_subdirectory(<ディレクトリ名1>) add_subdirectory(<ディレクトリ名2>) # 同様に子ディレクトリを追加する </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # <ディレクトリ名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 ) </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # 画像ファイルの取得 (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}") </syntaxhighlight> <br> * <code>PRIVATE</code>オプション、<code>PUBLIC</code>オプション、<code>INTERFACE</code>オプションを適切に使用する。 *: これらのオプションは、コマンドのターゲットおよびそのターゲットに依存するターゲットに対する必要性を表す。 *: ヘッダファイルのみのライブラリの場合は、<code>INTERFACE</code>オプションを使用する。 <center> {| class="wikitable" | style="background-color:#fefefe;text-align: center;" |- ! style="background-color:#66CCFF;" | オプション ! style="background-color:#66CCFF;" | ターゲットが必要とする ! style="background-color:#66CCFF;" | ターゲットに依存するターゲットが必要とする |- | PRIVATE || ○ || ☓ |- | PUBLIC || ○ || ○ |- | INTERFACE || ☓ || ○ |} </center> <br> * ライブラリの種類を指定しない *: ビルドするユーザがスタティックライブラリまたはダイナミックライブラリを指定できるようにする。 *: <code>BUILD_SHARED_LIBS</code>オプションを付加して選択することもできるが、各ライブラリごとにオプションを設定すべきである。 <syntaxhighlight lang="cmake"> option(<変数名1> "build library as a shared library" ON) if(<変数名1>) add_library(<ターゲット名> SHARED) else() add_library(<ターゲット名> STATIC) endif() </syntaxhighlight> <br><br> == ソースツリーおよびビルドツリー == ビルドに使用されるソースコードを含むトップレベルディレクトリをソースツリーと呼ぶ。<br> ソースツリーは、トップレベルのCMakeLists.txtが配置され、プロジェクトが定義される。<br> <br> ビルドの生成物を保管するためのディレクトリをビルドツリーと呼ぶ。<br> ビルドツリーは、CMakeCache.txtが作成・保管され、キャッシュ変数やオプション等が格納される。<br> <br> 同一ディレクトリを両方の用途に使用することも可能であるが、ビルドツリーをソースツリーと分離(out-of-source build)して、ソースツリーを綺麗に保つことが推奨されている。<br> <br> <code>cmake</code>コマンドの実行中において、実行時の情報を提供する変数が多数提供されている。<br> 例えば、処理中の位置を取得する場合は、次のような変数がある。<br> * <code>CMAKE_SOURCE_DIR</code> (非推奨) *: ソースツリーの絶対パス *: <br> * <code>CMAKE_BINARY_DIR</code> *: バイナリツリーの絶対パス *: <br> * <code>CMAKE_CURRENT_SOURCE_DIR</code> *: ソースツリーにおける現在処理中のディレクトリの絶対パス *: <br> * <code>CMAKE_CURRENT_BINARY_DIR</code> *: ビルドツリー内における現在処理中のディレクトリの絶対パス <br><br> == CMakeのバージョン管理 (cmake_minimum_requiredコマンド) == 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> cmake_minimum_required(VERSION <メジャー番号>.<マイナー番号>[.<バグフィックス番号>.<ビルド番号>]) <br> <code>VERSION</code>オプションは常に必要であり、<code><メジャー番号></code>および<code><マイナー番号></code>も記述する必要がある。<br> ほとんどのCMakeプロジェクトでは、<code><バグフィックス番号></code>および<code><ビルド番号></code>を指定する必要はない。(CMakeの新しい機能はマイナー番号のアップデートでのみ現れるため)<br> 特定のバグフィックスが必要な場合のみ、<code><バグフィックス番号></code>を指定すべきである。 <br> さらに、CMake 3.0以降では、<code><ビルド番号></code>を使用していないため、指定する必要はない。<br> <br> 詳細を知りたい場合は、[[Qtの設定 - CMake#CMakeのポリシー設定]]において、<code>cmake_minimum_required</code>コマンドの挙動を調整する方法を参照すること。<br> これにより、CMakeは内部でバグを修正し、新しい機能を導入しながらも、過去の特定のリリースの期待される振る舞いを維持することができる。<br> <br><br> == projectコマンド == 全てのCMakeプロジェクトは、<code>project</code>コマンドを含む必要があり、<code>cmake_minimum_required</code>コマンドの後に記述する。<br> <syntaxhighlight lang="cmake"> # CMake 3.0以降 project( <プロジェクト名> [VERSION <メジャー番号>[.<マイナー番号>.<バグフィックス番号>.<ビルド番号>]] [LANGUAGES <プログラム言語名 例. CやCXX等>] ) # CMake 2.x以前 project( <プロジェクト名> [<プログラム言語名 例. CやCXX等>] ) </syntaxhighlight> <br> <code><プロジェクト名></code>オプションは必須であり、英数字、アンダースコア(<code>_</code>)、ハイフン(<code>-</code>)が使用できる。<br> ただし、空白は使用できない。<br> <code><プロジェクト名></code>は、引用符で囲む必要はない。<br> <br> <code>VERSION</code>オプションは、CMake 3.0以降でのみサポートされている。<br> <br> <code>LANGUAGES</code>オプションは、CMakeプロジェクトで有効にするプログラム言語を指定する。(<code>C</code>、<code>CXX</code>、<code>Fortran</code>、<code>ASM</code>、<code>Java</code>等)<br> 複数の言語を指定する場合は、それぞれをスペースで区切る。<br> <br> 特殊な状況下では、CMakeプロジェクトはプログラム言語を使用しないことを示す必要がある場合が存在する。<br> このような場合、<code>LANGUAGES NONE</code>を指定する。 <br> CMake 2.x以前では、<code>LANGUAGES</code>オプションがサポートされていないため、<code><プロジェクト名></code>の後にプログラム言語を指定する。<br> <br> <code>project</code>コマンドの重要な役割の1つは、有効化された各言語のコンパイラをチェックして、正常にコンパイルとリンクを行えるかどうかを確認することである。<br> コンパイラやリンカのチェックが正常に終了した後、その結果はキャッシュされて、ビルドディレクトリのCMakeCache.txtファイルに保存される。<br> その後、CMakeは有効化された機能を制御する多くの変数とプロパティをセットアップする。<br> <br><br> == 実行ファイルの構築 (add_executableコマンド) == <code>add_executable</code>コマンドは、CMakeにソースファイルのセットから実行ファイルを作成する。<br> <syntaxhighlight lang="cmake"> add_executable( <ターゲット名> <ソースコードファイル名 1> <ソースコードファイル名 2> # ...略 ) # 例. myAppまたはmyApp.exeという名前の実行ファイルが生成される add_executable( myApp main.cpp ) </syntaxhighlight> <br> <code><ターゲット名></code>には、英数字、アンダースコア、ハイフンを使用することができる。<br> CMakeプロジェクトのビルドが正常に終了すると、<code><ターゲット名></code>として実行ファイルが作成される。<br> <br> ターゲット名は、CMakeの機能であるターゲットプロパティでカスタマイズすることもできる。<Br> また、ターゲット名を変更して、<code>add_executable</code>コマンドを複数回呼び出すことにより、1つのCMakeLists.txtファイル内で複数の実行ファイルを定義することができる。<br> <br> ただし、同じターゲット名を複数の<code>add_executable</code>コマンドで使用する場合は、CMakeは失敗してエラーがハイライトされる。<br> <br> <syntaxhighlight lang="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 ) </syntaxhighlight> <br><br> == ライブラリの構築 (add_libraryコマンド) == CMakeは様々な種類のライブラリのビルドをサポートしている。<br> ライブラリを作成して使用する場合、<code>add_library</code>コマンドを使用する。<br> <syntaxhighlight lang="cmake"> add_library( <ターゲット名> [<STATIC または SHARED または MODULE>] [EXCLUDE_FROM_ALL] <ソースコードファイル名 1> <ソースコードファイル名 2> # ...略 ) </syntaxhighlight> <br> <code><ターゲット名></code>は、CMakeLists.txtファイル内でライブラリを参照するために使用される。<br> ビルドされたライブラリ名は、<code><ターゲット名></code>となる。<br> <br> <code>EXCLUDE_FROM_ALL</code>オプションは、<code>add_executable</code>コマンドと同様、ライブラリがデフォルトのALLターゲットに含まれないようにする。<br> 構築するライブラリの種類は、<code>STATIC</code>、<code>SHARED</code>、<code>MODULE</code>のうちの1つを指定する。<br> <br> * STATICオプション *: 静的ライブラリまたはアーカイブを指定する。 *: Windowsでは、デフォルトのライブラリ名は、<u><ライブラリファイル名>.lib</u>となる。 *: Linuxでは、デフォルトのライブラリ名は、<u>lib<ライブラリファイル名>.a</u>となる。 * SHARED *: 共有ライブラリまたは動的ライブラリを指定する。 *: Windowsでは、デフォルトのライブラリ名は、<u><ライブラリファイル名>.dll</u>となる。 *: Linuxでは、デフォルトのライブラリ名は、<u>lib<ライブラリファイル名>.so</u>となる。 * MODULE *: 共有ライブラリに似ているが、ライブラリや実行ファイルに直接リンクされるのではなく、実行時に動的にロードされることを意図しているライブラリを指定する。 *: これらは、ユーザがロードするかどうかを選択できるプラグイン、または、オプションのコンポーネントである。 *: Windowsでは、DLL向けのインポートライブラリは作成されない。 <br> よほどのことがない限り、<code>STATIC</code>または<code>SHARED</code>オプションは、それが必要であることが分かるまで付加しないことを推奨する。<br> これにより、プロジェクト全体を通して、スタティックライブラリかダイナミックライブラリかをより柔軟に選択することができる。<br> <br> ビルドするライブラリの種類を定義するオプションを省略することも可能である。<br> 特定のライブラリが必要でない限り、プロジェクトファイルには指定せずに、プロジェクトの構築時に開発者が選択できるようにすることが望ましい。<br> そのような場合、ライブラリは<code>STATIC</code>か<code>SHARED</code>のどちらかになり、変数<code>BUILD_SHARED_LIBS</code>の値により選択される。<br> <br> 変数<code>BUILD_SHARED_LIBS</code>が<code>true</code>を代入する場合はライブラリのターゲットはダイナミックライブラリ、それ以外の場合はスタティックライブラリとなる。<br> <code>add_library</code>コマンドを呼び出すたびに変更する必要がなく、1ヶ所に記述するだけで設定を変更することができる。<br> ただし、<code>add_library</code>コマンドを呼び出す前に、変数<code>BUILD_SHARED_LIBS</code>を記述する必要がある。<br> <syntaxhighlight lang="cmake"> set(BUILD_SHARED_LIBS YES) </syntaxhighlight> <br> 変数<code>BUILD_SHARED_LIBS</code>を設定する方法として、<code>cmake</code>コマンドに<code>-DBUILD_SHARED_LIBS</code>オプションを付加する方法がある。<br> cmake -DBUILD_SHARED_LIBS=YES /path/to/source <br><br> == ターゲットのリンク == 例えば、ライブラリAがライブラリBを必要とする時、ライブラリ間に存在し得る依存関係には、いくつかの異なる種類がある。<br> <br> * PRIVATE *: プライベートな依存関係とは、ライブラリAが自身の内部実装でライブラリBを使用することを指定する。 *: ライブラリAにリンクする他のものは、ライブラリBについて知る必要はない。なぜなら、ライブラリBはライブラリAの内部実装だからである。 * PUBLIC *: パブリックな依存関係とは、ライブラリAが内部でライブラリBを使用するだけでなく、そのインターフェイスでもライブラリBを使用することを指定する。 *: 例えば、ライブラリAで定義された関数が、ライブラリBで定義・実装された型のパラメータを少なくとも1つ持つ場合、 *: ライブラリBの型を持つパラメータを提供しなければ、ライブラリAからその関数を呼び出すことができない。 * INTERFACE *: インターフェースな依存関係とは、ライブラリAを使用するために、ライブラリBの一部も使用しなければならないことを指定する。 *: これは、ライブラリAが内部的にライブラリBを必要とせず、そのインターフェイスでライブラリBを使用するだけであるという点で、<code>PUBLIC</code>とは異なる。 *: <br> *: <code>add_library</code>コマンドのINTERFACE形式を使用して定義されたライブラリターゲットを使用する場合に便利である。 *: 例えば、ヘッダファイルのみのライブラリの依存関係を表すためにターゲットを使用する場合等が挙げられる。 <br> <code>target_link_libraries</code>コマンドを使用して、リンクだけではなく、依存関係を捉えることができる。<br> <syntaxhighlight lang="cmake"> target_link_libraries( <ターゲット名> <PRIVATE または PUBLIC または INTERFACE> item 1 item 2 # ...略 [<PRIVATE または PUBLIC または INTERFACE>] item 3 item 4 # ...略 ) </syntaxhighlight> <br> これにより、あるライブラリが他のライブラリにどのように依存するかをプロジェクトで定義することができる。<br> CMakeは、この方法でリンクされたライブラリの連鎖を通して依存関係を管理する。<br> <br> 以下の例では、uiライブラリは<code>PUBLIC</code>としてcollectorライブラリとリンクされているため、myAppが直接collectorにリンクしているだけでも、その<code>PUBLIC</code>関係からmyAppはuiにもリンクされる。<br> 一方、algoライブラリとengineライブラリは、<code>PRIVATE</code>としてcollectorにリンクされているため、myAppはそれらに直接リンクされるわけではない。<br> これらのコマンドにより、ターゲット間で<code>target_link_libraries</code>コマンドで接続された場合、コンパイラやリンカのフラグやヘッダ検索パスもターゲット間で伝達されるようになる。<br> <syntaxhighlight lang="cmake"> add_library(collector src1.cpp) add_library(algo src2.cpp) add_library(engine src3.cpp) add_library(ui src4.cpp) add_executable(myApp main.cpp) target_link_libraries( collector PUBLIC ui PRIVATE algo engine ) target_link_libraries(myApp PRIVATE collector) </syntaxhighlight> <br> このような場合、<code>target_link_libraries</code>コマンドで使用するターゲット名は、<br> <code>target_link_libraries</code>コマンドが呼び出されている同じディレクトリにおいて、<code>add_executable</code>コマンドまたは<code>add_library</code>コマンドにより定義されている必要がある。<br> <br><br> == 非ターゲットのリンク (target_link_librariesコマンド) == <code>target_link_libraries</code>コマンドを呼び出す時は、常に、<code>PRIVATE</code>、<code>PUBLIC</code>、<code>INTERFACE</code>オプションを指定する。<br> <br> <code>target_link_libraries</code>コマンドは、CMakeのターゲット以外にも、以下に示すものを指定することが可能である。<br> <br> * ライブラリファイルへのフルパス *: CMakeはそのライブラリファイルをリンカコマンドに追加する。 *: ライブラリファイルが変更された場合、CMakeはその変更を検出して、ターゲットを再リンクする。 *: CMake 3.3以降では、リンカコマンドは指定されたフルパスを使用するが、CMake 3.2以前では、CMakeが代わりにライブラリを検索するようリンカに要求する場合がある。 *: (例. /usr/lib/libfoo.soファイルを-lfooに置換する等) * 単純なライブラリ名 *: パスなしでライブラリ名だけを指定する場合、リンカコマンドはそのライブラリを検索する。 *: (例えば、プラットフォームによって、fooは-lfoo、または、foo.libになる) * リンクフラグ *: 特殊なケースとして、-lや-framework以外のハイフンで始まる項目は、リンカコマンドに追加されるフラグとして扱われる。 *: <br> *: ただし、これらは<code>PRIVATE</code>項目にのみ使用するように警告している。 *: <code>PUBLIC</code>や<code>INTERFACE</code>として定義する場合は、他のターゲットに引き継がれてしまい、必ずしも安全とは言えないからである。 <br> 上記に加え、項目の前に<code>debug</code>、<code>optimized</code>、<code>general</code>のいずれかのオプションを付加することができる。<br> これらのオプションは、ビルドがデバッグビルドとして設定されているかどうかに基づいて、それに続く項目が含まれるべき時をさらに絞り込むことである。<br> <u>ただし、これらのオプションは、同様の機能をより明確で柔軟かつ堅牢な方法が別に存在するため、現在は使用しない方がよい。</u><br> * debugオプション *: 項目の前にdebugオプションを付加する場合、そのビルドがデバッグビルドである場合にのみ追加される。 * optimizedオプション *: 項目の前にoptimizedオプションを付加する場合、ビルドがデバッグビルドでない場合のみ追加される。 * generalオプション *: 項目の前にgeneralオプションを付加する場合、全てのビルド構成に対して項目を追加するように指定する。 <br><br> == 非ターゲットのインクルード (target_include_directoriesコマンド) == <code>find_package</code>コマンドは、<code>include</code>コマンドで手動で行う設定を、<code>REQUIRED</code>オプション等を使用して自動で行うことができる。<br> find_package(PkgConfig) <br> <code>find_package</code>コマンドは、<code>pkg_search_module</code>コマンドよりも柔軟でより多くのオプションが存在する。<br> また、CMakeには豊富なパッケージ定義が付属しており、パッケージ管理システムからインストールしたソフトウェアは/usr/share/cmake/Modules/Find*.cmakeファイルにある。<br> <br> <code>target_include_directories(<ターゲット名> PUBLIC ...)</code>コマンドは、<br> <ターゲット名>を使用する全てのターゲットにおいて、自動的にインクルードディレクトリが使用されるようになる。<br> ただし、CMakeLists.txtファイル内にターゲットにのみ有効であり、<code>pkg_search_module</code>コマンドで取得したライブラリに対しては機能しない。<br> <syntaxhighlight lang="cmake"> find_package(PkgConfig REQUIRED) pkg_check_modules(<任意の変数名> <.pcファイル内の[Name]セクション名 例. sdl2> REQUIRED IMPORTED_TARGET) # ...略 target_link_libraries(<ターゲット名> ${<任意の変数名>_LIBRARIES} ) target_include_directories(<ターゲット名> PUBLIC ${<任意の変数名>_INCLUDE_DIRS} ) target_compile_options(<ターゲット名> PUBLIC ${<任意の変数名>_CFLAGS} # または ${<任意の変数名>_CFLAGS_OTHER} ) </syntaxhighlight> <br><br> == CMAKEキャッシュ変数 == ==== CMAKE_PREFIX_PATH ==== <syntaxhighlight lang="cmake"> # ライブラリのインストールディレクトリを指定 ## ライブラリのインストールディレクトリを1つ指定する場合 set(CMAKE_PREFIX_PATH "<ライブラリのパス>") ## ライブラリのインストールディレクトリを複数指定する場合 set(CMAKE_PREFIX_PATH "<ライブラリのパス 1>;<ライブラリのパス 2>;<ライブラリのパス 3>") # find_packageコマンドを使用してライブラリを検索 find_package(<ライブラリ名> REQUIRED) if(<ライブラリ名>_FOUND) # ライブラリが見つかった場合 else() # ライブラリが見つからなかった場合 endif() </syntaxhighlight> <br><br> == find_packageコマンド == ==== find_packageコマンドとは ==== <code>find_package</code>コマンドは、特定の名前のCMakeスクリプトを検索して、該当のスクリプトを実行するコマンドである。<br> <br> 対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。<br> <code>find_package</code>コマンドは、Module -> Configの順で検索を行う。<br> <br> 具体的な動作は以下のとおりです。 * Module<br><パッケージ名>.cmakeファイル、または、Find<パッケージ名>.cmakeファイルを検索する。 ** CMakeキャッシュ変数である変数<code>CMAKE_MODULE_PATH</code>で指定されたパス ** CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等) *: <br> * Config<br><パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルを検索する。 ** CMake変数<code><PackageName>_DIR</code>で指定されたパス ** CMakeキャッシュ変数である変数<code><パッケージ名>_ROOT</code>で指定されたパス ** 環境変数<code><パッケージ名>_ROOT</code>で指定されたパス ** CMakeキャッシュ変数である変数<code>CMAKE_PREFIX_PATH</code>、変数<code>CMAKE_FRAMEWORK_PATH</code>、変数<code>CMAKE_APPBUNDLE_PATH</code>で指定されたパス ** 環境変数<code><パッケージ名>_DIR</code>、環境変数<code>CMAKE_PREFIX_PATH</code>、環境変数<code>CMAKE_FRAMEWORK_PATH</code>、環境変数<code>CMAKE_APPBUNDLE_PATH</code>で指定されたパス ** 環境変数<code>PATH</code>で指定されたパス (binディレクトリおよびsbinディレクトリで終わるディレクトリの場合は、その親ディレクトリに読み替える) ** その他 <br> なお、コマンド終了時において、CMake変数<code><パッケージ名>_FOUND</code>に<code>0</code>または<code>1</code>(<code>FALSE</code>または<code>TRUE</code>)が格納されるため、<br> 正常に検索できたかどうかを条件分岐として記述することもできる。<br> <br> ==== Module (CMakeスクリプト) ==== Moduleは、以下の2種類に分類される。<br> * Utility Modules *: よく使用するCMake関数をまとめたもの。 *: 例えば、CheckLanguage.cmake(あるプログラミング言語の開発ツールがインストールされているか確認するための機能をまとめたもの)等がある。 *: Utility ModulesのCMakeスクリプトを読み込む時、<code>check_language</code>コマンド、<code>get_bundle_main_executable</code>コマンド等の関数が定義されるため、 *: それらを呼び出すことで機能を使用することができる。 *: <br> * Find Modules *: 外部ライブラリの情報を収集するものであり、ファイル名はFind<パッケージ名>.cmakeファイルである。 *: 例えば、C++で記述された外部ライブラリをリンクする場合、ヘッダファイルのディレクトリ、ライブラリファイルのディレクトリ、ライブラリファイル名の3つの情報が必要になる。 *: これらの情報を自動的に収集するものがFind Modulesである。 *: <br> *: CMakeでは、Boost、BLAS、GLEW、OpenGL、X11、Qt4等のライブラリのFind Modulesがデフォルトで用意されている。 *: <br> *: ほとんどのFind Modulesは、以下に示すようなCMake変数に値が自動的に代入される。 *:* 変数<code><パッケージ名>_INCLUDE_DIRS</code> *:*: インクルードディレクトリのパス *:* 変数<code><パッケージ名>_LIBRARY_DIRS</code> *:*: ライブラリファイルがあるディレクトリのパス *:* 変数<code><パッケージ名>_LIBRARIES</code> *:*: ライブラリファイル名のリスト *:* 変数<code><パッケージ名>_DEFINITIONS</code> *:*: コンパイル時の<code>definition</code>フラグ *: <br> *: <code>find_package</code>コマンドを使用することにより、上記の変数は自動的に代入されるため、その変数を<code>target_include_directories</code>コマンド等に設定を記述する。 *: ただし、上記の変数名は必ずしもこの通りになっているわけではないため、ライブラリの情報を変数にまとめるのではなくターゲット(ライブラリ)を作成してそのプロパティにまとめる場合もある。 *: そのため、各ライブラリのFind Modulesを確認することが必要である。 <br> CMakeでは、初期状態でいくつかのModuleがインストールされている。<br> <br> Moduleの一覧は、[https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html CMakeの公式Webサイト]から確認することができる。<br> <br> また、Moduleが存在しないライブラリでは、開発者がModuleを作成することもできる。<br> <br> ==== Config (CMakeスクリプト) ==== Configファイルは、CMakeプロジェクトをビルドしてライブラリをインストールした時に生成される設定ファイルである。<br> ファイル名は、<code><パッケージ名>Config.cmake</code>ファイル、または、<code><パッケージ名(小文字)>-config.cmake</code>ファイルである。<br> <br> ライブラリ情報を提供する点ではFindモジュールと同様であるが、Configファイルはライブラリの開発元が直接提供している設定ファイルである。<br> ライブラリをインストールした時、cmakeディレクトリやshareディレクトリの中に含まれていることが多い。<br> <br> Findモジュールと同様、多くのConfigファイルは以下に示すようなCMake変数が存在する。<br> また、これらの情報を1つのターゲットにまとめている場合もある。<br> * 変数<code><パッケージ名>_INCLUDE_DIRS</code> *: インクルードディレクトリのパス * 変数<code><パッケージ名>_LIBRARY_DIRS</code> *: ライブラリファイルがあるディレクトリのパス * 変数<code><パッケージ名>_LIBRARIES</code> *: ライブラリファイル名のリスト * 変数<code><パッケージ名>_DEFINITIONS</code> *: コンパイル時の<code>definition</code>フラグ <br> <u>Configファイルを使用する場合、開発元が公開しているドキュメントやConfigファイルの内容から、各変数名や各ターゲット名を確認する必要がある。</u><br> <br> Linuxにおいて、Configファイルの場所は以下に示すようなディレクトリに配置される。<br> また、初期設定より、/usr/binディレクトリは環境変数<code>PATH</code>に設定されているため、CMakeは自動的にConfigファイルを見つけることができる。<br> * /usr/lib64/cmake/<パッケージ名> * /usr/share/cmake/<パッケージ名> <br> したがって、Linuxでは、パッケージ管理システムからインストールしたライブラリは、<code>find_package</code>コマンドで見つけることができる。<br> もし、ライブラリにConfigファイルが付属していない場合、開発者自身でFindモジュールを作成する必要がある。<br> <br> <u>また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<code><パッケージ名>_DIR</code>にライブラリのパスを設定することにより、Configファイルを見つけることができる。</u><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> CMakeでは、全ての変数を文字列として扱っており、変数名には、英数字、<code>_</code>、<code>.</code>、<code>/</code>、<code>-</code>、<code>+</code>を含めることができる。<br> また、大文字と小文字が区別される。<br> <br> 変数の値を代入する時、値にスペースが含まれていない限り、引用符で囲む必要はない。<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> 1つの変数に複数の値を指定する場合、各値はセミコロンで区切って結合される。(<u>文字列リストとして代入される</u>)<br> また、未定義の変数を参照する場合は、空の文字列となる。<br> <syntaxhighlight lang="cmake"> set(myVar a b c) # myVarの値: a;b;c set(myVar a;b;c) # myVarの値: a;b;c set(myVar "a b c") # myVarの値: a b c set(myVar a b;c) # myVarの値: a;b;c set(myVar a "b c") # myVarの値: a;b c </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> ==== キャッシュ変数 ==== キャッシュ変数とは、ビルドディレクトリのCMakeCache.txtに記録される変数のことである。<br> グローバルスコープで参照可能であり、生存期間が<code>cmake</code>コマンドの終了後も継続する。<br> <br> 次の<code>cmake</code>コマンドの実行でも値を保つため、生成したビルドの構成情報を保存するような用途にも使用される。<br> <br> 例えば、キャッシュ変数VAR1の値は$CHACHE{VAR1}で参照できる。<br> 同名の通常変数が存在しない場合は、${VAR1}でも参照することができる。<br> <br> <code>set(CACHE)</code>コマンドで初回の変数が定義ができる。<br> <br> 既に定義されているキャッシュ変数を変更する場合は、<code>FORCE</code>オプションが必要である。<br> 指定されていない場合、<code>set(CACHE)</code>コマンドは無視される。<br> また、<code>cmake</code>コマンドの実行時に<code>-D<オプション名></code>でも定義や変更が可能である。<br> <br> 他の変数と異なり、キャッシュ変数は型を持つ。<br> <code>cmake</code>コマンドの<code>-D<オプション名></code>オプションで型を指定せずに定義することにより、型のない状態で使用することもできる。<br> この場合、<code>set(CACHE)</code>コマンドを実行した時点で型が確定する。<br> <br> ==== リスト(配列) ==== 変数は全て文字列として扱われるが、複数の変数をまとめて扱う場合はリストを使用する。<br> これは、複数の文字列をセミコロン<code>;</code>で連結したものである。<br> <br> リストという型は無く文字列であるが、関数の引数が暗黙的に連結されてリストとして扱うことができ、操作関数により言語レベルでのサポートがあるため、<br> 不定個数の変数をまとめて扱う場合に便利である。<br> <br> <syntaxhighlight lang="cmake"> set(LIST1 "AA" "BB" "CC") # 3つの文字列からなるリストを作成 message("${LIST1}") # -> AA;BB;CC list(APPEND LIST1 "DD") # リスト末尾に要素を追加 message("${LIST1}") # -> AA;BB;CC;DD list(LENGTH LIST1 LEN) # リスト要素の個数を取得 message("${LEN}") # -> 4 list(GET LIST1 2 ITEM) # 2番目の要素を取得 message("${ITEM}") # -> CC </syntaxhighlight> <br> ==== 定義された全ての変数を出力 ==== <syntaxhighlight lang="cmake"> get_cmake_property(variableNames VARIABLES) foreach(variableName ${variableNames}) message(STATUS "${variableName}=${${variableName}}") endforeach() </syntaxhighlight> <br><br> == 条件分岐 == if()コマンドおよびelseif()コマンドの引数には、そのブロックを実行する条件式を記述する。<br> この条件式には、以下に示す種類がある。<br> <br> * ブール定数 *: CMakeの値は全て文字列型であるが、条件式では以下に示す値がBooleanとして認識される。 *: <u>これらの値は、大文字・小文字は区別されないことに注意する。</u> <br> ==== 真と解釈される値 ==== * 0でない数値 * ON * YES * TRUE * Y # 例 if(1) if(TRUE) if(on) if(Yes) <br> ==== 偽と解釈される値 ==== * 空文字列 * 0 * OFF * NO * FALSE * N * IGNORE * NOTFOUND * 末尾が<code>-NOTFOUND</code>である文字列 <br> # 例 if(0) if(FALSE) if(off) if(No) if(SamplePackage-NotFound) <br> ==== ブール演算子 ==== 論理積を表すAND、論理和を表すOR、否定を表すNOTが使用できる。<br> <u>これらは、全て大文字でなければならないことに注意する。</u> # 例 if(true AND true) if(true OR false) if(NOT false) <br> ==== 変数の確認 ==== 変数が定義済みかどうかの確認、および、数値の比較等を行うことができる。<br> # 例 if(DEFINED variable) if(1 LESS 2) <br> * 対象の存在の確認 *: 対象の存在を判定することができる。 # 例 if(DEFINED value) # value という変数がセットされているかどうか if(COMMAND message) # message というコマンドが存在するかどうか if(POLICY CMP0011) # CMP0011 というポリシーが存在するかどうか if(TARGET test) # test というターゲットが定義されているかどうか if(EXISTS src/a.cpp) # src/a.cpp というパスが存在しているかどうか <br> * 対象の性質の確認 *: 対象の性質を確認することができる。 # 例 if(IS_DIRECTORY src/) # src/ がディレクトリかどうか if(IS_SYMLINK /bin/sh) # /bin/sh がシンボリックリンクかどうか if(IS_ABSOLUTE /) # / が絶対パスかどうか <br> ==== 数値および文字列等の比較 ==== * 数値の比較 *: 数値の比較することができる。 # 例 if(1 EQUAL 1) if(1 LESS 2) if(2 GREATER 1) <br> * 文字列のパターンマッチ *: <code><文字列> MATCHES <正規表現のパターン></code> *: 文字列正規表現のパターンにマッチするかどうかを確認することができる。 *: もし、文字列が空文字列、または、存在しない場合は、<code>false</code>を返す。 # 例 # 文字列がa(1文字以上)から始まり、aの次がbで終わる場合 if("aaaab" MATCHES "^a+b$") <br> * 文字列の比較 *: 文字列を比較することができる。 *: 辞書順に基づく。 # 例 if("a" STREQUAL "a") # 文字列が同じ if("a" STRLESS "aa") # "a" < "aa" if("b" STRGREATER "a") # "b" > "a" <br> * バージョンを比較 *: バージョンを比較することができる。 *: バージョンのフォーマットは、<メジャー>[.<マイナー>[.<パッチ>[.<ビルド>]]]である。 *: 数値的な順序や辞書順には基づかない。 *: 例えば、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 <br> * ファイルのタイムスタンプの比較 *: ファイル1とファイル2のタイムスタンプを比較することができる。 *: ファイル1がファイル2より新しい場合、<code>true</code>を返す。 *: また、いずれかのファイルが存在しない場合も、<code>true</code>を返す。 # 例 if(build/my_exe IS_NEWER_THAN /usr/local/bin/my_exe) <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