Добавить источник в подкаталог в проект cmake - PullRequest
48 голосов
/ 20 января 2012

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

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

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

затем в проекте / source / 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
)

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

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

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

Ответы [ 3 ]

34 голосов
/ 11 февраля 2012

Как во второй части ответа стрелка гласит: в проекте / source / 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
)
4 голосов
/ 20 января 2012

Разве вы не можете просто установить все свои источники в project / source / CMakelists.txt, тогда?

В любом случае, вам нужна опция PARENT_SCOPE или CACHE в команда set .

2 голосов
/ 21 января 2019

Начиная с CMake 3.1, появился новый способ добавления источника из подкаталогов: target_sources

Скажем, у вас есть root_dir и root_dir / sub_dir и исходные файлы в обоих. С target_sources вы можете сделать это:

В root_dir / CMakeLists.txt определите цель

add_library(some_target main.cpp)
add_subdirectory(sub_dir)

В root_dir / sub_dir / CMakeLists.txt добавить источники:

target_sources(some_target PRIVATE more_cool_stuff.cpp)

some_target теперь будет содержать оба исходных файла.

Также можно использовать другие команды в root_dir / sub_dir / CMakeLists.txt, используя some_target , например target_compile_definitions, что довольно удобно.

Я узнал о target_sources здесь, посмотрите его, если вам нужно больше объяснений и примеров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...