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)
文字列の比較
- 文字列の比較
- 文字列を比較することができる。
- 辞書順に基づく。
# 例 if("a" STREQUAL "a") # 文字列が同じ if("a" STRLESS "aa") # "a" < "aa" if("b" STRGREATER "a") # "b" > "a"
- 文字列のパターンマッチ
<文字列> MATCHES <正規表現のパターン>
- 文字列正規表現のパターンにマッチするかどうかを確認することができる。
- もし、文字列が空文字列、または、存在しない場合は、
false
を返す。
# 例 # 文字列がa(1文字以上)から始まり、aの次がbで終わる場合 if("aaaab" MATCHES "^a+b$")
バージョンの比較
バージョンのフォーマットは、<メジャー>[.<マイナー>[.<パッチ>[.<ビルド>]]]である。
バージョンの比較では、以下に示すような特徴がある。
- 数値的な順序や辞書順には基づかない。
例えば、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)
その他の条件分岐
OSでの分岐
Linuxのみビルドを可能にする場合は、条件分岐により現在のプラットフォームがLinuxであるかどうかを確認する。
LinuxおよびMacOS以外のUNIX系OSは含まれないため、CMake変数CMAKE_SYSTEM_NAME
を使用してより詳細な条件を設定することもできる。
# OSの確認
if(UNIX AND NOT APPLE)
# Linuxの場合
message("Linux detected. Proceeding with CMake configuration...")
else()
# Linux以外の場合
message(FATAL_ERROR "This project requires Linux to build.")
endif()