如何仅对某些子目录使用cmake GLOB_RECURSE

时间:2015-01-16 20:34:42

标签: cmake

我的源代码布局如下所示:

TopDir/
    CMakeLists.txt
    A.cpp
    A.hpp
    ...
    File/
        F1.cpp
        F1.hpp
        ...
    Section/
        S1.cpp
        S1.hpp
        ...
    Test/
        CMakeLists.txt
        TestF1S1.cpp
        TestF2S2.cpp
        ...

我想将所有.cpp文件捕获为源文件(ENDF6_SRC),因此在我的TopDir/CMakeLists.txt文件中,我有一行如下所示:

file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)

这会按预期抓取.cppTopDir/File/中的所有Section/个文件,但也会抓取.cpp中的所有Test/个文件也是。

如何在不添加ENDF6_SRC目录中的.cpp文件的情况下创建Test变量?我不想要{{1} } {} {}}或CMakeLists.txt中的文件。

2 个答案:

答案 0 :(得分:22)

如果您在“TopDir / File”或“TopDir / Section”中没有子目录,您可以这样做:

file(GLOB ENDF6_SRC
       ${PROJECT_SOURCE_DIR}/*.cpp
       ${PROJECT_SOURCE_DIR}/File/*.cpp
       ${PROJECT_SOURCE_DIR}/Section/*.cpp)

如果你那里有子目录,你需要多个电话:

file(GLOB ENDF6_SRC_TOP
       ${PROJECT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE ENDF6_SRC_NESTED
       ${PROJECT_SOURCE_DIR}/File/*.cpp
       ${PROJECT_SOURCE_DIR}/Section/*.cpp)
set(ENDF6_SRC ${ENDF6_SRC_TOP} ${ENDF6_SRC_NESTED})

顺便说一句,在源代码构建的情况下,在你的顶级目录中执行file(GLOB_RECURSE ...)也可能会从构建文件夹中获取不需要的cpp文件(即构建根目录在“TopDir”中) “)。

答案 1 :(得分:0)

您还可以通过过滤全局列表来排除测试目录:

file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)
list(FILTER ENDF6_SRC EXCLUDE REGEX "${PROJECT_SOURCE_DIR}/Test/.*" )