如何仅对某些子目录使用 cmake GLOB_RECURSE
How to use cmake GLOB_RECURSE for only some subdirectories
我的源代码布局如下所示:
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
文件,但也会抓取 [=] 中的所有 .cpp
文件21=] 还有。
如何在不从 Test
目录添加 .cpp
文件的情况下创建我的 ENDF6_SRC
变量? 我不想要CMakeLists.txt
文件在 File/
或 Section/
.
如果您在 "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").
您还可以通过过滤全局列表来排除测试目录:
file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)
list(FILTER ENDF6_SRC EXCLUDE REGEX "${PROJECT_SOURCE_DIR}/Test/.*" )
我的源代码布局如下所示:
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
文件,但也会抓取 [=] 中的所有 .cpp
文件21=] 还有。
如何在不从 Test
目录添加 .cpp
文件的情况下创建我的 ENDF6_SRC
变量? 我不想要CMakeLists.txt
文件在 File/
或 Section/
.
如果您在 "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").
您还可以通过过滤全局列表来排除测试目录:
file(GLOB_RECURSE ENDF6_SRC ${PROJECT_SOURCE_DIR} *.cpp)
list(FILTER ENDF6_SRC EXCLUDE REGEX "${PROJECT_SOURCE_DIR}/Test/.*" )