error人生は試行錯誤の連続。2022-03-08C++,CMakeTwitterFacebookB!HatenaLINELINECopy前回の記事で作成したCMakeLists.txtには、$<...>で囲まれた式(Generator-Expressions)が唐突に出てきました。今回は、このGenerator-Expressionsについて少し細かく書いてみたいと思います。...https://izadori.net/entry/cmake_1サブディレクトリを含む場合のCMakeLists.txtの書き方についてはこちら。まとめGenerator-ExpressionsとはGenerator-Expressionsはビルドシステムの設定ファイルの生成中に評価される式で、コンパイルオプションなど、ビルド構成に固有の情報を生成するために使われるものです。CMakeではGenerator-Expressionsの使用が推奨されています。大きく分けて値を返すものと、値を評価して0か1を返すものの2種類があります。使えるGenerator-Expressionsの一覧と詳細は公式ドキュメントを参照してください。値同士の比較$<キーワード:比較対象1,比較対象2>よく使うと思われるGenerator-Expressions$<式:値>式(Generator-Expressions)が1の時のみ値を返す。-Wextra>の外側の$<...>のこと。$<IF:式,式が1の時の値,式が0の時の値>条件分岐。$<IF:$<CONFIG:Debug>,DEBUG,NDEBUG>みたいに使う。$<REMOVE_DUPULICATES:リスト>リスト中の重複した値を1つを残してすべて取り除いたリストを返してくれる。$<GENEX_EVAL:文字列>文字列をGenerator-Expressionsとして評価する。変数GENEXSTRにGenerator-Expressionsが文字列として代入されているとして、$<GENEX_EVAL:${GENEXSTR}>のように使用する。$<CONFIG:ビルドタイプ>CMAKE_BUILD_TYPEの値が指定したものか評価する。...]>コンパイラの種類が指定したものか評価する。カンマで複数指定した場合は、そのうちのどれかに一致すれば1を返す。GCCの場合はGNU、VC++の場合はMSVC、LLVM/Clangの場合はClangとする。何が使えるかはこちらを参照。$<NOT:式>式の値を反転する。0なら1に、1なら0にする。$<NOT:$<CXX_COMPILER_ID:MSVC>>とすると、VC++以外のコンパイラの時に1を返す。$<BOOL:値>値が次の時0を返す。NOTFOUND(大文字小文字は問わない)文字列の末尾に-NOTFOUNDが付加されたもの(大文字小文字を区別する)$<STREQUAL:値1,値2>2つの文字列を比較する。大文字小文字は区別される。$<IN_LIST:値,リスト>リスト中に値が含まれていれば1を返す。大文字小文字は区別される。条件分岐との違いGenerator-Expressionsと似たもので、if()で始まる条件分岐も存在します。...endif()これも条件にしたがって動作を変えるために使われるものですが、評価のタイミングがGenerator-Expressionsとは異なるので注意が必要です。StudioやXcodeのように1つの設定ファイルに複数のビルドタイプの設定が保存されるものでは、実際のビルド時までどのビルドタイプを使うのか分かりません。このようなシステムに対しては、if()による分岐では特定のビルドタイプの設定しか設定ファイルに反映できません。このような場合には、Generator-Expressionsを使用します。Qiitaなお、条件分岐を使わざるを得ない場合もあります。コンパイルオプションの初期値自体を書き換える場合です。VC++ではCMAKE_CXX_FLAGSで警告オプションの初期値が/W3となっているので、それを/W4に変更したい時、以下のようにすることで書き換えられます。"${CMAKE_CXX_FLAGS}")endif()Generator-Expressionsの注意点Generator-Expressionsは、すべてのコマンドで使えるとは限らない点に注意が必要です。set()ではGenerator-Expressionsは単なる文字列のリストとして扱われてしまいます。コマンド内でGenerator-Expressionsが使用可能かどうかは、公式ドキュメントを参照してください。Generator-ExpressionsのデバッグGenerator-Expressionsは式が評価されるタイミングの関係上、message()を使って結果を確認することができません。思った通りの動作をしない時の確認が難しいです。デバッグのためには、公式ドキュメントにあるようにファイルに出力するのが良いと思います。"$<...>")まとめCMakeのGenerator-Expressionsについてまとめてみました。式の書き方にクセがあって少々わかりにくいのが難点ですが、設定や環境によってコンパイルオプション等を簡単に切り替えられるようになるので、便利な機能です。【C++】【Eigen】Levenberg-Marquardt法を実装する観測データをあるモデルで回帰する場合に、最小二乗法がよく使われます。...当サイトは「さくらのVPS」上で動作しています。コメントをキャンセルメールアドレスが公開されることはありません。次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。