2014年5月12日月曜日

cmake: add_custom_target や add_custom_command の引数にスペース区切りの引数群文字列の入った変数を上手く与える方法

例として、 ${CMAKE_CXX_FLAGS} "-std=c++11 -Wall -pedantic-errors"とかふつーにスペース区切りでパラメーターリストが入っているとします。これは、 add_executable する場合には問題無く動作します。

しかし、何らかの事情により add_custom_commandadd_custom_target でこのようにスペース区切りで準備された変数を使いたい場合、そのまま変数をこれらの引数として渡すと、変数文字列内のスペースが\でエスケープされてしまい、結果的にすべてのパラメーターリストは完全に繋がった1つの、つまり "-std=c++11-Wall-pedantic-errors" などと書いたかのように動作します。cmakeの限界というか無駄な器用さによる制限をを感じます(´・ω・`)

そこで困ってしまった時のこんなこともあろうかと、かどうかは知りませんが、 separate_arguments なるものがこの事態に対処する方法を与えてくれます。
separate_arguments(SEPARATED_CMAKE_CXX_FLAGS UNIX_COMMAND ${CMAKE_CXX_FLAGS})
こうすると、 ${SEPARATED_CMAKE_CXX_FLAGS} に ${CMAKE_CXX_FLAGS} のスペース文字をセミコロン文字に置換した文字列が与えられます。そして、このセミコロン区切りに変換されたパラメーターリスト ${SEPARATED_CMAKE_CXX_FLAGS} を add_custom_command や add_custom_target のコマンドの引数として与えると、ビルド実行時のコマンドではセミコロンがスペースに戻り、妙なエスケープも入らずに、当初の期待通りのパラメーターリストを展開したコマンド与えることができます。

ちょっと気持ち悪い気もするけれど、対処方法があるだけよしとしましょう(╹◡╹)

0 件のコメント:

コメントを投稿