8 votes

Spécifier comment cmake crée le projet Visual Studio

Je suis en train de configurer cmake pour mon projet et j'ai mis en place un projet de test pour celui-ci. Quand il génère mon projet Visual Studio 2010, je veux qu'il soit comme le projet que j'ai eu précédemment.

  • cela crée un projet ALL_BUILD et ZERO_CHECK que je ne veux pas.
  • il place les fichiers .h dans le dossier External Dependencies. Je veux un dossier Include Files où tous les fichiers .h seront placés.
  • Je souhaite également regrouper certains fichiers sous différents filtres. Par exemple, dans ma bibliothèque centrale, je veux regrouper tous les fichiers relatifs aux mathématiques dans un dossier et tous les fichiers relatifs à la gestion des événements dans un autre.
  • Sur le système de fichiers, il place les fichiers du projet dans /Lib/src. Probablement parce que je l'ai organisé de cette façon dans le dossier du code, mais je ne veux pas de cela pour les fichiers du projet.
  • Je veux mettre en place différentes configurations : DebugOpenGL, DebugDirectX, ReleaseOpenGL, ReleaseDirectX, puis définir un indicateur USE_OPENGL ou USE_DIRECTX pour les deux types de configurations.

Comment puis-je exclure certains fichiers lorsque je construis sur Windows et d'autres lorsque je construis sur linux ? Par exemple, j'ai WindowWin.cpp et WindowLinux.cpp.


J'ai essayé ce que vous avez suggéré mais je n'arrive pas à le faire fonctionner :

#LibProject/src

FILE(GLOB test0_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test.h)
source_group(include0 FILES ${test0_headers})
FILE(GLOB test0_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)
source_group(source0 FILES ${test0_source})

FILE(GLOB test1_headers $CMakeTest_SOURCE_DIR/LibProject/inc/test1.h)
source_group(include1 FILES ${test1_headers})
FILE(GLOB test1_source ${CMakeTest_SOURCE_DIR}/LibProject/src/test1.cpp)
source_group(source1 FILES ${test1_source})

include_directories(${test0_headers} ${test1_headers})

add_library(LibProject  ${test0_headers} ${test1_headers} ${test0_source} ${test
1_source})

J'ai réussi à le faire fonctionner maintenant seulement je veux des sous-dossiers pour les en-têtes et les fichiers sources à l'intérieur du groupe source.

set(test_source0 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)
source_group(TEST FILES ${test_source0})

set(test_source1 ${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h ${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp)
source_group(TEST2 FILES ${test_source1})

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc)
add_library(LibProject  ${test_source0} ${test_source1})

Voici ma solution :)

set(test_header
${CMakeTest_SOURCE_DIR}/LibProject/inc/test.h)
set(test_source
${CMakeTest_SOURCE_DIR}/LibProject/src/test.cpp)

source_group(TEST\\Headers FILES ${test_header})
source_group(TEST\\Source FILES ${test_source})

set(test2_header
${CMakeTest_SOURCE_DIR}/LibProject/inc/test2.h)
set(test2_source
${CMakeTest_SOURCE_DIR}/LibProject/src/test2.cpp)
source_group(TEST2\\Headers FILES ${test2_header})
source_group(TEST2\\Source FILES ${test2_source})

include_directories(${CMakeTest_SOURCE_DIR}/LibProject/inc)

add_library(LibProject
${test_header}
${test_source}
${test2_header}
${test2_source})

7voto

mantler Points 634

Pour regrouper des fichiers dans un dossier dans Visual Studio, vous pouvez utiliser :

# Include files
FILE(GLOB all_headers "include/*.h*")
source_group("include" FILES ${all_headers})

# Source files
FILE(GLOB all_srcs "src/*.cpp")
source_group("source" FILES ${all_srcs})

Ainsi, tous vos fichiers .h qui se trouvent dans le dossier include apparaîtront dans un dossier appelé include dans Visual Studio. De même pour vos fichiers cpp. Vous pouvez utiliser cette technique pour créer votre propre structure dans CMake, si c'est ce que vous voulez.

Pour les besoins de ALL_BUILD et ZERO_CHECK, lire cette réponse . Pour désactiver la génération de ZERO_CHECK, utilisez set(CMAKE_SUPPRESS_REGENERATION true) .

Pour choisir entre OpenGL et DirectX et pour configurer les dossiers appropriés, vous pouvez utiliser la même technique que celle utilisée ci-dessus, mais en les plaçant à l'intérieur d'un fichier

if(${USE_OPENGL})
    FILE(GLOB ....)
endif()

Je pense que vous avez compris l'idée.

4voto

Nathan Monteleone Points 3182

Je vais répondre à celles que je connais :

ALL_BUILD et ZERO_CHECK sont utilisés pour garder vos projets en synchronisation avec les changements apportés aux CMakeFiles. Je ne pense pas qu'il y ait un moyen de s'en débarrasser.

Pour obtenir les fichiers .h où vous le souhaitez, vous devez les inclure dans les sources. J'utilise quelque chose comme ceci :

file(GLOB LocalProjectIncludes "${yourheaderdirectory}/*.h")

Ensuite, j'ajoute ${LocalProjectIncludes} aux fichiers sources du projet. CMake comprendra qu'il s'agit d'en-têtes ; il n'essaiera pas de les construire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X