cmake: как создать фильтры visual studio

Я уже осмотрелся (StackOverflow и многое другое), и я пытаюсь использовать cmake для создания фильтров Visual Studio. У меня есть следующие папки:

src / math
src / import
src / ui

Я хотел бы создать фильтры, как указано выше.
"math": содержит все файлы cpp & h в src / math
"импорт": содержит все файлы cpp & h в src/import
"ui": содержит все cpp & H файлы в src / ui

Я пробовал несколько решений, но ни одно из них не работает!!!

вот последняя версия кода в CMakeList.txt:

set(VD_SRC "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")

file(GLOB_RECURSE SRC_UI
    "${VD_SRC}/ui/*.cpp", "${VD_SRC}/ui/*.h")
file(GLOB_RECURSE SRC_IMPORT
    "${VD_SRC}/import/*.cpp",
    "${VD_SRC}/import/*.h")

source_group("ui"            FILES ${SRC_UI})
source_group("import"        FILES ${SRC_IMPORT})

любая помощь приветствуется!

1 ответов


посмотреть как установить фильтры Visual Studio для вложенного подкаталога с помощью cmake

просто имейте в виду, что

  • the source_group() работает только в сочетании с add_library() или add_executable() команды с перечислением тех же источников (пути должны совпадать)
  • the source_group() команда не проверяет, существует ли файл на самом деле (поэтому он принимает все, что вы ему даете, и во время генерации файла проекта он пытается сопоставить заданные имена файлов исходной группы с файлами, используемыми в проекте)

Я дал вашему коду попробовать, добавив соответствующий add_library() target и он работает так, как ожидалось (CMake 3.3.2 и VS2015):

set(VD_SRC "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")

file(GLOB_RECURSE SRC_UI
    "${VD_SRC}/ui/*.cpp"
    "${VD_SRC}/ui/*.h"
)
file(GLOB_RECURSE SRC_IMPORT
    "${VD_SRC}/import/*.cpp"
    "${VD_SRC}/import/*.h"
)

add_library(VisalDesigner ${SRC_UI} ${SRC_IMPORT})

source_group("ui"            FILES ${SRC_UI})
source_group("import"        FILES ${SRC_IMPORT})

результаты

Solution Explorer with Filters

вот более обобщенная версия, взятая из Visual Studio в качестве редактора для дружественного проекта CMake:

set(_src_root_path "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")
file(
    GLOB_RECURSE _source_list 
    LIST_DIRECTORIES false
    "${_src_root_path}/*.c*"
    "${_src_root_path}/*.h*"
)

add_library(VisualDesigner ${_source_list})

foreach(_source IN ITEMS ${_source_list})
    get_filename_component(_source_path "${_source}" PATH)
    file(RELATIVE_PATH _source_path_rel "${_src_root_path}" "${_source_path}")
    string(REPLACE "/" "\" _group_path "${_source_path_rel}")
    source_group("${_group_path}" FILES "${_source}")
endforeach()