CMake正则表达式匹配列表中的目录

时间:2013-03-22 15:07:46

标签: regex list cmake

所以我有像这样的文件(或值)列表

set(HEADER_FILES DirA/header1.h DirA/header2.hpp
                DirB/header3.h DirB/stuff.hpp)

那么如何才能在DirA中获取文件的子列表?我正在使用CMake 2.8.x而且我累了正则表达式匹配:

string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})

但结果只是原始字符串的副本,如:“DirA / header1.h DirA / header2.hpp DirB / header3.h DirB / stuff.hpp”或者什么也没有。

再一次,在写这个问题时,我解决了它:

set(SubListMatch)
foreach(ITR ${HEADER_FILES})
    if(ITR MATCHES "(.*)DirA/(.*)")
        list(APPEND SubListMatch ${ITR})
    endif()
endforeach()

但是CMake对我来说是一件很新鲜的事情,那么如何将该代码包装成函数呢?到目前为止,我从未编写任何CMake函数。

1 个答案:

答案 0 :(得分:6)

你可以把它变成这样的函数:

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