Как использовать cmake GLOB_RECURSE только для некоторых подкаталогов

У меня есть исходный код, который выглядит следующим образом:

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)

Это захватывает все .cpp файлы в TopDir/, File/, Section/, как ожидалось, но также захватывает все .cpp файлы в Test/.

Как я могу создать свою переменную ENDF6_SRC без добавления файлов .cpp из каталога Test? Я не хочу, чтобы файл CMakeLists.txt находился в File/ или Section/.

Ответы

Ответ 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" ).