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

b91juud3  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(192)

因此,我有这样的文件(或值)列表

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

但结果只是原始字符串的副本,如:“目录A/标题1. h目录A/标题2. hpp目录B/标题3. h目录B/内容.hpp”或者什么都不做。
好吧,又像往常一样,在写这个问题时我解决了它:

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

但是CMake对我来说是一个很新的东西,那么我如何将代码 Package 成函数呢?到目前为止,我还没有写过任何CMake函数。

pn9klfpd

pn9klfpd1#

您可以将其转换为如下函数:


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

h7appiyu2#

这样如何?

file(GLOB DIRA_H_FILES DirA/*.cpp)

相关问题