Hatred's Log Place

DON'T PANIC!

Jan 18, 2017 - 3 minute read - programming

Qt Creator, CMake: отображение всех файлов в стоковом плагине

Немного в сторону от 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.

А выглядеть это будет как-то так:

Что ещё можно сделать:

  1. Добавить исключающие маски
  2. Задать параметром имя псевдо-таргета
  3. Можно завести несколько таргетов и реализовывать различные варианты группировок

Естественно, что такой подход не позволит добавлять и удалять файлы через дерево, но он же позволяет использовать всякие оптимизации типа пересканирования только при очистке кеша вместе с полной конфигурацией. Ещё данных подход не позволяет исключать нежелательные файлы из вывода в локаторе