Это немного длинно для комментария - поэтому я делаю его ответом:
В одном из моих проектов (библиотека), у меня есть столько источников, что я начал перемещать некоторые из них вподкаталог util
.
Для этого я создал отдельные переменные:
file(GLOB headers *.h)
file(GLOB sources *.cc)
file(GLOB utilHeaders
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/util/*.h)
file(GLOB utilSources
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/util/*.cc)
Чтобы сделать его более привлекательным / более удобным в VisualStudio, я вставил source_group
s, который генерирует соответствующиеподпапки в проекте VS.Я считаю, что они называются «Фильтры».
source_group("Header Files\\Utilities" FILES ${utilHeaders})
source_group("Source Files\\Utilities" FILES ${utilSources})
Конечно, я должен учитывать также переменные utilHeaders
и utilSources
, где должны быть указаны источники:
add_library(libName
${sources} ${headers}
${utilSources} ${utilHeaders})
Вот и все.
Фред напомнил в своем комментарии, что я не должен забывать упомянуть, что у file(GLOB
есть определенная слабость (хотя я нахожу это очень ценным внаша ежедневная работа).Это даже упоминается в CMake doc. :
Примечание : мы не рекомендуем использовать GLOB для сбора списка исходных файлов из вашего исходного дерева,Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда попросить CMake сгенерировать заново.Флаг CONFIGURE_DEPENDS
может работать не надежно на всех генераторах, или если в будущем будет добавлен новый генератор, который не сможет его поддерживать, проекты, использующие его, будут заблокированы.Даже если CONFIGURE_DEPENDS
работает надежно, проверка каждой перестройки все еще требует затрат.
Поэтому, используя file(GLOB
, вы никогда не должны забывать повторно запускать CMake один раз для файловбыли добавлены, перемещены или удалены.Альтернативой также может быть добавление, перемещение, удаление файлов непосредственно в сгенерированных встроенных скриптах (например, файлах проекта VS) и полагаться на тот факт, что при следующем повторном запуске CMake эти файлы также будут покрыты.И последнее, но не менее важное: git pull
- это еще кое-что, что стоит рассмотреть повторный запуск CMake.