【问题标题】:How to use cmake GLOB_RECURSE for only some subdirectories如何仅对某些子目录使用 cmake GLOB_RECURSE
【发布时间】:2015-01-16 20:34:41
【问题描述】:

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

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)

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

如何在不添加Test 目录中的.cpp 文件的情况下创建我的ENDF6_SRC 变量? 我不希望File/ 或@987654337 中的CMakeLists.txt 文件@。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    如果您在“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”内) .

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多