13,060
回編集
(→概要) |
|||
| 23行目: | 23行目: | ||
== 非推奨のコマンドおよび設定 == | == 非推奨のコマンドおよび設定 == | ||
* 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> | |||
* <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><br> | ||