web-dev-qa-db-fra.com

cmake: comment créer des filtres dans Visual Studio

J'ai déjà regardé autour de moi (StackOverflow et plus) et j'essaie d'utiliser cmake pour générer des filtres Visual Studio. J'ai les dossiers suivants:

src/math
src/import
src/ui 

Je voudrais générer les filtres comme ci-dessus.
"math": contient tous les fichiers cpp & h dans src/math
"import": contient tous les fichiers cpp & h dans src/import
"ui": contient tous les fichiers cpp & h de src/ui

J'ai essayé plusieurs solutions, mais aucune ne semble fonctionner !!! 

Voici la dernière version du code dans 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})

Toute aide est la bienvenue!

13
ClubberLang

Voir Comment définir des filtres Visual Studio pour les sous-répertoires imbriqués à l'aide de cmake

Sachez simplement que 

  • la commande source_group() fonctionne uniquement avec les commandes add_library() ou add_executable() / répertoriant les mêmes sources (les chemins doivent correspondre)
  • la commande source_group() ne vérifie pas si le fichier existe réellement (donc, tout ce que vous lui donnez est utilisé et tente de faire correspondre les noms de fichier du groupe source avec les fichiers utilisés dans le projet)

J'ai essayé votre code en ajoutant une cible add_library() correspondante et il fonctionne comme prévu (CMake 3.3.2 et 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})

Résulte en

 Solution Explorer with Filters

Voici une version plus générale tirée de Visual Studio en tant qu'éditeur pour le projet convivial de 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()
22
Florian

J'ai trouvé cela plus facile et j'ai pensé que cela pourrait être utile aux autres. Assurez-vous que vous utilisez la dernière version de CMAKE.

file(GLOB_RECURSE _source_list *.cpp* *.h* *.hpp*)
foreach(_source IN ITEMS ${_source_list})
    get_filename_component(_source_path "${_source}" PATH)
    string(REPLACE "${CMAKE_SOURCE_DIR}" "" _group_path "${_source_path}")
    string(REPLACE "/" "\\" _group_path "${_group_path}")
    source_group("${_group_path}" FILES "${_source}")
endforeach()
1
Langerz