Добавить источник в подкаталог проекта cmake
У меня есть проект, который не был разделен на библиотеки, но источник организован в дереве каталогов. Я не знаю, как сказать cmake спуститься по каталогу, а затем добавить источник в этот каталог к проекту, определенному в родительском каталоге. Я попытался сделать следующее:
в проекте/источнике/CMakelists.txt:
set(SOURCE
${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
)
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})
затем в файле project/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 я пришел к выводу, что:
- Структуры исходных файлов обычно являются плоскими в рамках проекта
- Если код разделен на папки, он обычно делится на соответствующие библиотеки.
Интересно, есть ли какая-то "лучшая практика", от которой я отклоняюсь, пытаясь создать эту структуру.
Ответы
Ответ 1
Как и во второй части стрелка, ответ говорит:
в проекте /source/folder 1/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
)
Ответ 2
Не можете ли вы просто установить все источники в проекте/источнике/CMakelists.txt, а затем?
В любом случае вам нужна опция PARENT_SCOPE
или CACHE
на установить команду.
Ответ 3
Начиная с 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 здесь, посмотрите его, если хотите больше объяснений и примеров