Sí, tienes dos opciones. Supongamos que la estructura de la carpeta es similar a esto.
├── autopilot
│ ├── _AutoPilot.cpp
│ ├── _AutoPilot.h
│ └── action
│ ├── ActionBase.cpp
│ ├── ActionBase.h
│ ├── APcopter
│ │ ├── APcopter_avoid.cpp
│ │ ├── APcopter_avoid.h
Si va a utilizar AUX_SOURCE_DIRECTORY
hay que añadir CMakeLists.txt cada uno de los subdirectorios. Luego debe incluir y vincular todos esos subdirectorios. Esta es una tarea bastante difícil. Entonces puedes GLOB y hacer el trabajo muy fácilmente. Así es como se hace.
file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c)
SET(autopilot ${autopilot_sources})
Si desea crear una biblioteca utilizando por encima de código fuente Este es el comando:
ADD_LIBRARY (autopilot ${autopilot})
TARGET_LINK_LIBRARIES (autopilot)
Si desea crear un archivo ejecutable utilizando por encima de código fuente Este es el comando:
ADD_EXECUTABLE(autopilot ${autopilot})
Tenga en cuenta que "recopilar todos los archivos fuente con glob" ** no es recomendado ** en CMake: * No recomendamos usar 'GLOB' para recopilar una lista de archivos fuente de su árbol fuente. Si no se cambia ningún archivo 'CMakeLists.txt' cuando se agrega o elimina una fuente, el sistema de compilación generado no puede saber cuándo solicitar la regeneración de CMake. * - a partir de [documentación] (https://cmake.org/cmake/help/ v3.7/command/file.html) –
@FranklinYu ¿existe una alternativa que no requiera escribir cada nombre de archivo manualmente? –
@Ciro Si quiere evitar escribir cada nombre de archivo, entonces creo que 'foreach' mencionado por OP es el camino a seguir. Sin embargo, el equipo de CMake parece recomendar * escribir manualmente cada nombre de archivo *. –