2012-01-19 6 views
40

У меня есть проект, который не был разделен на библиотеки, но источник организован в дереве каталогов. Я не знаю, как сказать cmake спуститься по каталогу, а затем добавить источник в этот каталог к ​​проекту, определенному в родительском каталоге. Я попытался следующее:Добавить источник в подкаталог проекта cmake

в проекте/источник/CMakeLists.txt:

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

затем в проекте/источник/folder1/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 
) 

используя какое-то сообщение() Я обнаружил, что дочерняя папка получит содержимое переменной SOURCE, но это новое назначение этой переменной не будет сохраняться при возвращении к родительскому CMakeLists.txt

Ищите примеры и в учебнике cmake привели меня к выводу, что: - Структуры исходных файлов обычно плоские внутри проекта - Если код разделен на папки, он обычно делится на соответствующие библиотеки.

Интересно, существует ли какая-то «лучшая практика», из которой я отклоняюсь от попытки этой структуры.

ответ

32

Как и вторая часть ответа arrowdodger говорит: в проекте/источник/folder1/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

Спасибо за синтаксис! Он работал красиво. – 2NinerRomeo

+0

Является ли это по-прежнему рекомендуемым способом достижения этой цели в последней версии cmake? – lanoxx

4

Не можете ли вы просто указать все источники в проекте/источнике/CMakelists.txt?

В любом случае, вам необходимо указать PARENT_SCOPE или CACHE вариант на set command.

+0

Первая часть вашего ответа, действительно то, что я делал в промежутке времени. – 2NinerRomeo

Смежные вопросы