CMake的正则表达式匹配的目录
问题描述:
所以我有文件(或价值)的名单像这样CMake的正则表达式匹配的目录
set(HEADER_FILES DirA/header1.h DirA/header2.hpp
DirB/header3.h DirB/stuff.hpp)
那么我怎么只在DIRA文件的子列表?我使用的CMake 2.8.x和我累了正则表达式匹配:“迪拉/那么header1.h迪拉/ header2.hpp DIRB/header3.h DIRB /:
string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})
但结果是一样的原单串的复制stuff.hpp“或者什么也没有。
好再次一如既往地在写这个问题我解决了它:
set(SubListMatch)
foreach(ITR ${HEADER_FILES})
if(ITR MATCHES "(.*)DirA/(.*)")
list(APPEND SubListMatch ${ITR})
endif()
endforeach()
但CMake的是很新的东西给我,让我怎么换行代码到功能?到目前为止,我从来没有写过任何CMake函数。
答
你可以把它变成像这样的功能:
# Define function
function(GetSubList resultVar)
set(result)
foreach(ITR ${ARGN}) # ARGN holds all arguments to function after last named one
if(ITR MATCHES "(.*)DirA/(.*)")
list(APPEND result ${ITR})
endif()
endforeach()
set(${resultVar} ${result} PARENT_SCOPE)
endfunction()
# Call it
GetSubList(SubListMatch ${HEADER_FILES})
运行此代码时,SubListMatch
将持有匹配的元素。
你可以通过例如改进功能。给它一个额外的目录名称参数,这样DirA
以外的其他可以匹配:
function(GetSubList resultVar dirName)
# as before, except the if()
if(ITR MATCHES "(.*)${dirName}/(.*)")
# same as before
endfunction()