web-dev-qa-db-ja.com

cmake文字列トークンの包含チェック

Cmakeで、文字列トークンが別の文字列に含まれているかどうかを確認するにはどうすればよいですか?

私の場合、コンパイラの名前に文字列「Clang」が含まれているかどうかを知りたいです(例:「clang」、「AppleClang」など)。これまでにできることは次のとおりです。

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...

部分文字列の存在を確認するなど、より柔軟なアプローチが必要です。

これは私がドキュメントで見つけることができたものです:

if(MATCHES regex)指定された文字列または変数の値が指定された正規表現と一致する場合はTrue。
if(LESS)指定された文字列または変数の値が有効な数値であり、右側の値よりも小さい場合はTrue。
if(GREATER)指定された文字列または変数の値が有効な数値であり、右側の値より大きい場合はTrue。
if(EQUAL)指定された文字列または変数の値が有効な数値であり、右側の値と等しい場合はTrue。
if(STRLESS)指定された文字列または変数の値が辞書式順序で右側の文字列または変数よりも小さい場合はTrue。
if(STRGREATER)指定された文字列または変数の値が辞書式順序で右側の文字列または変数よりも大きい場合はTrue。
if(STREQUUAL)指定された文字列または変数の値が辞書式順序で右側の文字列または変数と等しい場合はTrue。

11
Pietro

if(<variable|string> MATCHES regex)はおそらくあなたが探しているものでしょう。

この特定のケースでは(ClangAppleClangのブロック内で同じことをしていると仮定して)、次を置き換えることができます。

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...

と:

if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$")
20
Fraser