CMake - 条件分岐

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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()