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()