Organisation des répertoires d'un référentiel CMake (C ++) contenant plusieurs projets

12

J'aimerais avoir des conseils sur l'organisation d'un ensemble de projets C ++ associés mais indépendants stockés dans un seul référentiel (git). Les projets utilisent CMake.

Pour un exemple simplifié, nous imaginons 2 projets A et B, A selon B. La plupart des personnes développant A obtiendront B via le système d'emballage. Ainsi, ils ne compileront que A. Cependant, nous devons permettre aux développeurs de compiler A et B eux-mêmes (et de les installer), séparément ou ensemble.

Voici une proposition:

└── Repo1
    ├── CMakeLists.txt (1)
    ├── A
       ├── CMakeLists.txt (2)
       ├── include
          ├── aaa.h
          ├── aaaa.h
          └── CMakeLists.txt (3)
       └── src
           ├── aaa.cpp
           ├── aaaa.cpp
           └── CMakeLists.txt (4)
    ├── B
       ├── CMakeLists.txt (2)
       ├── include
          ├── bbb.h
          ├── bbbb.h
          └── CMakeLists.txt (3)
       └── src
           ├── bbb.cpp
           ├── bbbb.cpp
           └── CMakeLists.txt (4)
    └── test
        ├── CMakeLists.txt (5)
        └── testaaaa.cpp

(1) Définissez les variables cmake communes pour tous les projets (le cas échéant) et inclut les sous-répertoires. (2) Définit le projet lui-même et les variables cmake requises du projet. (3) Définit les en-têtes à installer et ceux requis pour la compilation. (4) Configure la bibliothèque et les binaires. (5) Configure les exécutables de test et les cas de test.

Si je comprends bien, chaque projet devrait produire un fichier XXXConfig.cmake et l'installer dans / usr / local / share / cmake. L'écriture de ces fichiers semble assez compliquée lors de la lecture de la documentation de CMake.

Qu'est-ce que tu penses ? La structure a-t-elle un sens?

Avez-vous un exemple concret d'un tel ensemble de projets?

Barth
la source
Je pense que vous dépassez peut-être ici - nous venons de présenter cmake pour une application avec un projet de bibliothèque dépendante et jusqu'à présent, nous sommes satisfaits d'un CMakeLists.txtfichier par projet: A/CMakeLists.txt(l'application) inclut B/CMakeLists.txt(la bibliothèque) en utilisant add_subdirectory(...).
ssc

Réponses:

12

Après pas mal de lecture et de tests, j'ai réalisé un projet de démonstration de base en C ++ démontrant l'utilisation de CMake, CTest + boost.test, CPack et Doxygen et utilisant plus ou moins l'organisation que j'ai mentionnée dans ma question.

Le projet montre comment créer des dépendances de sous-projet, comment compiler l'ensemble du référentiel ou uniquement un sous-projet, comment créer un package, comment tester et comment produire de la documentation.

Voir ici: https://github.com/Barthelemy/CppProjectTemplate

Barth
la source