Немного в сторону от CMakeProjectManager2, в направлении стокового плагина.
Дискуссия на LOR навела на мысль. Ради спортивного интереса попробовал реализовать и… получилось! :)
За подробностями под кат.
Итак, идея была, использовать скрипт для первоначальной инициализации кеша. Это тот, который cmake передаётся через параметр -C
. Не получилось. От туда процесятся только set(...)
команды.
Следущий шаг, использовать параметр CMAKE_TOOLCHAIN_FILE
и задать свой псевдо тулчейн, в котором генерировать список и формировать фейковый таргет со списком файлов. Забегая вперёд - этот вариант сработал.
У этого подхода есть плюс и минус:
- плюс: для использования не нужно модифицировать исходный код. Совсем. В новых версиях QtC достаточно отредактировать настройки Kit.
- минус: возникают сложности, если нужно использовать реальный тулчейн файл.
Про плюс всё понятно, а вот минус можно обрулить более менее красиво: завести параметр CMAKE_TOOLCHAIN_FILE_FORWARD
и обрабатывать его в нашем всевдо-тулчейне, если поставлен - значит просто включить его директивой include(...)
.
Собственно результат (или gist):
#
# Open QtC :: Tools -> Options, Go to Build & Run page, Switch to the Kits page.
# Select needed Kit and press Change... for CMake Configuration item
# Add Parameter:
# CMAKE_TOOLCHAIN_FILE=/path/to/qtc-scan-all.cmake
#
# If you need real toolchain file, just pass it as:
# CMAKE_TOOLCHAIN_FILE_FORWARD=...
#
# Rescan tree: Build -> Clear CMake Configuration.
#
# There is next configuration parameters (can be pass via -DPARAM=value)
# SCAN_GLOB_EXPR - globbing expression for included files, default: *
# SCAN_DUMMY_PROG - dummy executable for dummy target, default: true (aka /bin/true)
#
if (NOT TARGET ALL_PROJECT_FILES)
set(SCAN_GLOB_EXPR * CACHE STRING "Setup file system scanning pattern to display all needed files, default: *")
set(SCAN_DUMMY_PROG "true" CACHE STRING "Dummy prog for dummy target, default: true")
file(GLOB_RECURSE ALL_RPOJECT_FILES_LIST LIST_DIRECTORIES false RELATIVE ${CMAKE_SOURCE_DIR} ${SCAN_GLOB_EXPR})
add_custom_target(ALL_PROJECT_FILES ${SCAN_DUMMY_PROG} SOURCES ${ALL_RPOJECT_FILES_LIST})
endif()
# Forward real toolchain file
if (CMAKE_TOOLCHAIN_FILE_FORWARD)
include(${CMAKE_TOOLCHAIN_FILE_FORWARD})
endif()
Можно даже задать маску для сканирования, изменив параметр SCAN_GLOB_EXPR
. В новых версиях QtC это сделано удобно. При определённых доработках можно добавить и исключающие маски.
Для того, что бы запустить этот хак, нужно в настройках QtC (Tools -> Options…) выбрать пункт “Build & Run” и вкладку “Kits”, после чего выбрать нужный кит и отредактировать параметры CMake (CMake Configuration), добавив строчку:
CMAKE_TOOLCHAIN_FILE=/path/to/qtc-scan-all.cmake
Проделать это для всех желаемых тулчейнов.
Пересканировать дерево теперь можно будет, выбрав “Build -> Clear CMake Configuration”, так как параметры тулчейн-файла применяются только на чистых запусках cmake.
А выглядеть это будет как-то так:
Что ещё можно сделать:
- Добавить исключающие маски
- Задать параметром имя псевдо-таргета
- Можно завести несколько таргетов и реализовывать различные варианты группировок
Естественно, что такой подход не позволит добавлять и удалять файлы через дерево, но он же позволяет использовать всякие оптимизации типа пересканирования только при очистке кеша вместе с полной конфигурацией. Ещё данных подход не позволяет исключать нежелательные файлы из вывода в локаторе