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

jlc*_*lin 25 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
        ...
Run Code Online (Sandbox Code Playgroud)

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

file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)
Run Code Online (Sandbox Code Playgroud)

这抓住了所有.cpp的文件TopDir/,File/,Section/符合市场预期,但也抓住所有.cpp的文件Test/也是如此.

如何在ENDF6_SRC不添加目录中的.cpp文件的情况下创建变量Test我不想要CMakeLists.txt文件File/Section/.

Fra*_*ser 26

如果"TopDir/File"或"TopDir/Section"中没有子目录,则可以执行以下操作:

file(GLOB ENDF6_SRC
       ${PROJECT_SOURCE_DIR}/*.cpp
       ${PROJECT_SOURCE_DIR}/File/*.cpp
       ${PROJECT_SOURCE_DIR}/Section/*.cpp)
Run Code Online (Sandbox Code Playgroud)

如果您确实有子目录,则需要多个调用:

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})
Run Code Online (Sandbox Code Playgroud)

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


小智 15

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

file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)
list(FILTER ENDF6_SRC EXCLUDE REGEX "${PROJECT_SOURCE_DIR}/Test/.*" )
Run Code Online (Sandbox Code Playgroud)