はじめに
みなさん、こんにちは。今回は、CMake における正規表現について書いていきます。
使用できるメタ文字
CMake では、string(REGEX MATCH)コマンドやctestコマンドの-Rオプションなど、幾つかの文脈で正規表現ができます。この正規表現は、Ruby や Perl などのそれと比較すると低機能なものとなっており、たとえば英数字とアンダースコア_にマッチする\wや、数字にマッチする\dなどは使用できません。また、繰り返しを表す{n}なども使用できません。使用できるメタ文字は以下となります。
- 先頭
^ - 末尾
$ - 任意の文字
. - ブラケット内に列挙された文字
[ ]、およびその範囲- - ブラケット内に列挙されているもの以外の文字
[^ ] - 0回以上の繰り返し
* - 1回以上の繰り返し
+ - 0回、もしくは1回
? - 指定されたパターンのいずれか
| - グループ化
()
また、\によってメタ文字をエスケープすることができますが、Unquated Argument および Quated Argument で用いる場合は、CMake のエスケープとバッティングするため\\としないといけないことに注意してください。
後方参照
CMake の正規表現で、グループ化されたものはCMAKE_MATCH_<n>変数で参照することができます(<n>は0から9)。CMAKE_MATCH_0にはマッチした文字列全体が格納されています。また、string(REGEX REPLACE)コマンドでは、置換後の文字列内で\<n>という形(<n>は0から9)で後方参照することができます。このとき、Unquated Argument および Quated Argument の場合は\\としないといけないことに注意してください。
if("123-dd" MATCHES [[([0-9]+)-dd]])
message("$1: ${CMAKE_MATCH_1}") # $1: 123
endif()
string(REGEX REPLACE [[([0-9]+)-dd]] [[\1]] replaced "123-dd")
message("replaced: ${replaced}") # replaced: 123
正規表現が使える場所
以下の場所で正規表現が使用できます。
コマンド
string(REGEX MATCH)コマンドstring(REGEX MATCHALL)コマンドstring(REGEX REPLACE)コマンドfile(STRINGS)コマンドif(MATCHES)コマンドinstall(DIRECTORY)コマンドsource_group()コマンドinclude_regular_expression()コマンドctest_test()コマンドctest_memcheck()コマンド
変数・プロパティ
CMAKE_LIBRARY_ARCHITECTURE_REGEX変数INCLUDE_REGULAR_EXPRESSIONディレクトリプロパティFAIL_REGULAR_EXPRESSIONテストプロパティPASS_REGULAR_EXPRESSIONテストプロパティ
モジュール
ExternalDataモジュールCMakeGraphVizOptionsモジュールCPackモジュールCheckCSourceCompilesモジュールCheckCXXSourceCompilesモジュール
コマンドライン
おわりに
以上、CMake における正規表現についてでした。CMake の正規表現は、Ruby や Perl などと比べると貧弱なので高度なことはできないことに注意が必要です。
明日は、mrk_21 さんの『CMake: 便利なコマンド・変数』です。