「CMake - プリプロセッサ」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == <br><br> == プリプロセッサの定義 == 特定のビルドタイプに基づいて、プリプロセッサ定義を設定することがよくある。<br> <br> 例えば、デバッグビルドの場合にプリプロセッサマクロとして_DEBUGを定義する場合、<br> <code>target_compile_definitions</code>コマンドを使用して、その定義をデバッグビルドにのみ適用するように指定する。<br> <syntaxhighli…」) |
|||
26行目: | 26行目: | ||
* INTERFACE | * INTERFACE | ||
*: 定義がそのターゲットをリンクする他のターゲットにのみ適用される。 | *: 定義がそのターゲットをリンクする他のターゲットにのみ適用される。 | ||
<br><br> | |||
== 使用例 == | |||
==== バージョンによりプリプロセッサを定義する ==== | |||
バージョンが特定の値未満の場合に特定のプリプロセッサを定義する場合、<br> | |||
CMakeのバージョン比較機能と<code>target_compile_definitions</code>コマンドを組み合わせて使用する。<br> | |||
<br> | |||
# まず、プロジェクトのバージョンを定義する。 | |||
# 次に、条件分岐でバージョンを比較して、条件に合致する場合にのみプリプロセッサを定義する。 | |||
<syntaxhighlight lang="cmake"> | |||
project(MyProject VERSION 0.1.0) | |||
# ターゲットを定義 | |||
add_executable(MyProject | |||
main.cpp | |||
) | |||
# バージョンを比較して、条件に合致する場合はプリプロセッサを定義 | |||
# 以下の例では、バージョンが0.1.0未満かどうかを確認して、合致している場合はMY_VERSION_BELOW_0_1_0プリプロセッサを定義 | |||
if(PROJECT_VERSION VERSION_LESS 0.1.0) | |||
target_compile_definitions(MyProject PRIVATE | |||
MY_VERSION_BELOW_0_1_0 | |||
) | |||
endif() | |||
</syntaxhighlight> | |||
<br> | |||
上記のようなプリプロセッサは、プリプロセッサディレクティブを使用して条件付きで特定のソースコードを含めたり除外する場合に使用できる。<br> | |||
例えば、C++のソースコードにおいて、以下に示すように使用することができる。<br> | |||
<br> | |||
この方法により、異なるバージョンのプロジェクトに対して、条件付きでソースコードをコンパイルする複雑なロジックが実装できる。<br> | |||
<syntaxhighlight lang="c++"> | |||
#ifdef MY_VERSION_BELOW_0_1_0 | |||
// バージョンが0.1.0未満の場合にのみコンパイルされるコード | |||
#endif | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
2024年3月22日 (金) 21:11時点における版
概要
プリプロセッサの定義
特定のビルドタイプに基づいて、プリプロセッサ定義を設定することがよくある。
例えば、デバッグビルドの場合にプリプロセッサマクロとして_DEBUGを定義する場合、
target_compile_definitions
コマンドを使用して、その定義をデバッグビルドにのみ適用するように指定する。
# デバッグビルドの場合にのみ_DEBUGを定義する
target_compile_definitions(<プロジェクト名> PRIVATE
$<$<CONFIG:Debug>:_DEBUG>
)
上記の例では、$<CONFIG:Debug>ジェネレータ式を使用している。
これは、現在のビルドがデバッグビルド(Debug)である場合に_DEBUGマクロを定義するものである。
target_compile_definitions
の第2引数にPRIVATE
キーワードを使用しているため、このプリプロセッサはこのターゲットにのみ適用されて、他のターゲットには影響を与えない。
もし、ライブラリ等で他のターゲットにもこの定義を適用する場合は、PUBLIC
またはINTERFACE
キーワードを使用する。
この機能を使用することにより、デバッグビルドとリリースビルドで異なるプリプロセッサマクロを簡単に管理できる。
- PUBLIC
- 定義がそのターゲット自身とそれをリンクするターゲットの両方に適用される。
- INTERFACE
- 定義がそのターゲットをリンクする他のターゲットにのみ適用される。
使用例
バージョンによりプリプロセッサを定義する
バージョンが特定の値未満の場合に特定のプリプロセッサを定義する場合、
CMakeのバージョン比較機能とtarget_compile_definitions
コマンドを組み合わせて使用する。
- まず、プロジェクトのバージョンを定義する。
- 次に、条件分岐でバージョンを比較して、条件に合致する場合にのみプリプロセッサを定義する。
project(MyProject VERSION 0.1.0)
# ターゲットを定義
add_executable(MyProject
main.cpp
)
# バージョンを比較して、条件に合致する場合はプリプロセッサを定義
# 以下の例では、バージョンが0.1.0未満かどうかを確認して、合致している場合はMY_VERSION_BELOW_0_1_0プリプロセッサを定義
if(PROJECT_VERSION VERSION_LESS 0.1.0)
target_compile_definitions(MyProject PRIVATE
MY_VERSION_BELOW_0_1_0
)
endif()
上記のようなプリプロセッサは、プリプロセッサディレクティブを使用して条件付きで特定のソースコードを含めたり除外する場合に使用できる。
例えば、C++のソースコードにおいて、以下に示すように使用することができる。
この方法により、異なるバージョンのプロジェクトに対して、条件付きでソースコードをコンパイルする複雑なロジックが実装できる。
#ifdef MY_VERSION_BELOW_0_1_0
// バージョンが0.1.0未満の場合にのみコンパイルされるコード
#endif