Skip to content

CMake

パッケージの探索結果で分岐する

find_package(pkg_name)の結果はpkg_name_FOUNDに出力されるのを利用する。 REQUIRED指定すると見つからなかった場合、ビルドエラーになっていしまうので注意

find_package(Boost)
if( Boost_FOUND )
  # do something
endif()

cmakeの関数の引数

基礎

  • 名前をつけた引数は${引数名}の形で関数内参照可能
  • ↑からはみ出た引数は${ARGN}にセミコロン区切りで詰め込まれる
function(関数名 引数名1 引数名2)
 message("ARG1 = ${引数名1}")
 message("ARG2 = ${引数名2}")
 message("ARGN = ${ARGN}")
endfunction()

パース

cmake_parse_arguments(
 MYFUNC           # 変数のプレフィックス
 "BOOL_VAR"         # 真偽値をとる変数の名前
 "VAR1;VAR2"        # 値を1つだけとる変数の名前
 "MULTIPLE_OUTPUT"  # 値を複数とる変数の名前
 ${ARGN}       # パース元
)
  • 変数はセミコロン区切りで複数指定可能
  • CMakeには名前空間がないのでプレフィックスをつけることで名前の衝突を回避
    • 今回はMYFUNC_VAR1とかになる
  • パースされなかったものはPREFIX_UNPARSED_ARGUMENTSに詰められる