誰にも見えないブログ

雑なメモ。まとまってない文章等

cmake-tuorialその3:実行環境の確認

cmake力の高まりを感じる

Introspection

  • Adding System Introspection (Step 5)の内容
  • introspectionというのはリフレクションみたいな意味らしい。(見出しにしか使われていない。システム用語というより一般用語な使い方をしている)

    • 処理系や環境が特定の機能を持っているか、上位のレイヤー (ビルドシステム(cmake))がチェックできる
      • 例:log()exp()関数はデフォルトで提供されているか?
  • 特定のシンボルが存在しているかを確認するには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で指定することで参照可能
    • 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)