2012-01-19 18 views
40

Tengo un proyecto que no se ha dividido en bibliotecas, pero la fuente está organizada en un árbol de directorios. No sé cómo decirle a cmake que baje un directorio, luego agregue la fuente en ese directorio al proyecto definido en el directorio padre. He intentado lo siguiente:Agregar fuente en un subdirectorio a un proyecto de cmake

en el proyecto/fuente/CMakeLists.txt:

set(SOURCE 
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp 
) 
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1") 
add_executable(UnitTestRNG ${SOURCE} ${HEADERS}) 

a continuación en el proyecto/fuente/carpeta1/CMakeLists.txt:

set(SOURCE 
    ${SOURCE} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp 
) 
set(HEADERS 
    ${HEADERS} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp 
) 

utilizando algún mensaje() declaraciones, he encontrado que la carpeta del niño obtendrá el contenido de la variable SOURCE, pero su nueva asignación a esa variable no persistirá al regresar al padre CMakeLists.txt

Buscando ejemplos y en el tutorial cmake me ha llevado a la conclusión de que: - Las estructuras de archivos de origen generalmente son planas dentro de un proyecto - Si el código está dividido en carpetas, por lo general se divide en las bibliotecas correspondientes.

Me pregunto si hay algunas "mejores prácticas" de las cuales me estoy desviando al intentar esta estructura.

Respuesta

32

Al igual que la segunda parte de la respuesta de arrowdodger dice: en el proyecto/fuente/carpeta1/CMakeLists.txt:

set(SOURCE 
    ${SOURCE} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp 
    PARENT_SCOPE 
) 
set(HEADERS 
    ${HEADERS} 
    ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp 
    ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp 
    PARENT_SCOPE 
) 
+0

¡Gracias por la sintaxis! Funcionó bien. – 2NinerRomeo

+0

¿Sigue siendo la forma recomendada de lograr esto en la última versión de cmake? – lanoxx

4

¿No puedes simplemente configurar todas tus fuentes en project/source/CMakelists.txt?

De todos modos, lo que necesita es PARENT_SCOPE o CACHE opción en set command.

+0

La primera parte de su respuesta es de hecho lo que he estado haciendo en el ínterin. – 2NinerRomeo

Cuestiones relacionadas