cmake-tuorialその3:実行環境の確認
cmake力の高まりを感じる
Introspection
- Adding System Introspection (Step 5)の内容
introspectionというのはリフレクションみたいな意味らしい。(見出しにしか使われていない。システム用語というより一般用語な使い方をしている)
- 処理系や環境が特定の機能を持っているか、上位のレイヤー (ビルドシステム(cmake))がチェックできる
- 例:
log()
やexp()
関数はデフォルトで提供されているか?
- 例:
- 処理系や環境が特定の機能を持っているか、上位のレイヤー (ビルドシステム(cmake))がチェックできる
特定のシンボルが存在しているかを確認するには
CheckSymbolExists
を使う
include(CheckSymbolExists) set(CMAKE_REQUIRED_LIBRARIES "m") check_symbol_exists(log "math.h" HAVE_LOG) check_symbol_exists(exp "math.h" HAVE_EXP)
解説
include()
:document- cmakeコード(
.cmake
)をロードし、実行する。 - 標準ロードパスみたいなのがあるらしく、今回はそこの
Modules/CheckSymbolExists.cmake
が実行されているものと思われる- 自分で書いた
.cmake
は格納ディレクトリをCMAKE_MODULE_PATH
で指定することで参照可能
- 自分で書いた
- cmakeコード(
- CheckSymbolExists:document
check_symbol_exists(<symbol> <files> <variable>)
<files>
で指定したヘッダファイルのinclude後に<symbol>
が使えるかどうかをに代入する <file>
はセミコロン区切りで列挙可能。
consumerがproducerに依存するビルドになっていたので、cmakeを書き換えて対処している(内容略)
- 一個気になる点が→プリプロセッサ変数は
.h.in
ファイル経由ではなくtarget_compile_definitions()
で渡している?
- 一個気になる点が→プリプロセッサ変数は
if(HAVE_LOG AND HAVE_EXP) target_compile_definitions(MathFunctions PRIVATE "HAVE_LOG" "HAVE_EXP")
- ターゲットはこれ
add_library(MathFunctions mysqrt.cxx)
mysqrt.cxx
内や#include
先のヘッダファイルでは#define
していないがHAVE_EXP
などが普通に使えている
#if defined(HAVE_LOG) && defined(HAVE_EXP)