web-dev-qa-db-fra.com

CMake avec des sous-répertoires

J'essaie de configurer mon projet pour compiler correctement en utilisant CMake.

Mon répertoire ressemble à ceci:

root
 |- bin
 |   |- // Where I want to build CMake from - using 'cmake ..'
 |- build
 |   |-
 |- include
 |   |- database
 |   |    |- database.h
 |- src
     |- database
     |    |- database.cpp
     |- main
          |- main.cpp

Mes sous-répertoires vont certainement grandir à mesure que mon projet s'élargit et que CMake serait probablement une bonne idée d'apprendre. Pour le moment, je ne peux que faire fonctionner CMake sans sous-répertoires dans mon src /. Cependant, je m'attends à ce que ce projet se développe dans de nombreux sous-répertoires.

Aurais-je besoin de plusieurs CMakeLists.txt à l'intérieur de chaque répertoire avec des fichiers .cpp? Est-ce que quelqu'un peut-il me montrer la bonne direction?

Merci!

13
Van

Votre projet ne semble pas avoir besoin de plusieurs CMakeLists.txt. Le but d'avoir plusieurs CMakeLists.txt plusieurs fois est multiple, mais il ne semble pas correspondre à votre projet. Par exemple, un avantage serait l'organisation hiérarchique, de sorte que vous pouvez séparer différentes unités à construire séparément, et éventuellement lié.

Exemple

Considérez la situation si vous avez un autre répertoire dans votre racine appelé tests. Ce répertoire contient des tests unitaires que vous souhaitez que le développeur ait le choix de le compiler ou non. Dans ce cas, vous mettez un CMakeLists.txt dans tests, et vous l'activez dans votre CMakeLists.txt principal avec un add_subdirectory(tests) comme suit:

if(testing_enabled)
    add_subdirectory(tests)
endif()

Dans tests, il y aurait un autre CMakeLists.txt. De cette façon, vous séparez les préoccupations. Le développement de vos tests unitaires est indépendant du développement de votre projet, et le processus de construction est également distinct.

Un autre exemple

Considérez la situation si vous avez deux bibliothèques parmi lesquelles l'utilisateur peut choisir. Dans ce cas, vous avez dans vos root deux répertoires, lib1 et lib2. Vous pouvez maintenant faire quelque chose comme ça dans votre CMakeLists.txt principal:

if(IWantLib1)
    add_subdirectory(lib1)
else()
    add_subdirectory(lib2)
endif()

Et les deux lib1 et lib2 les répertoires contiennent CMakeLists.txt.

11