Organizacja katalogów repozytorium CMake (C ++) zawierającego kilka projektów

12

Chciałbym uzyskać porady dotyczące organizacji zestawu powiązanych, ale niezależnych projektów C ++ przechowywanych w jednym repozytorium (git). Projekty wykorzystują CMake.

Dla uproszczonego przykładu wyobrażamy sobie 2 projekty A i B, A w zależności od B. Większość osób rozwijających A otrzyma B poprzez system pakowania. W ten sposób skompilują tylko A. Jednak powinniśmy pozwolić programistom na kompilację zarówno A, jak i B (i zainstalowanie go), osobno lub razem.

Oto propozycja:

└── 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) Zdefiniuj wspólne zmienne cmake dla wszystkich projektów (jeśli istnieją) i obejmuje podkatalogi. (2) Definiuje sam projekt i wymagane w projekcie zmienne cmake. (3) Definiuje nagłówki do zainstalowania i wymagane do kompilacji. (4) Konfiguruje bibliotekę i pliki binarne. (5) Konfiguruje pliki wykonywalne i przypadki testowe.

Jak rozumiem, każdy projekt powinien wygenerować plik XXXConfig.cmake i zainstalować go w / usr / local / share / cmake. Pisanie tych plików wydaje się dość skomplikowane podczas czytania dokumentacji CMake.

Co myślisz ? Czy struktura ma sens?

Czy zdarza ci się mieć działający przykład takiego zestawu projektów?

Barth
źródło
Wydaje mi się, że możesz tutaj przeskakiwać - właśnie wprowadziliśmy cmake dla jednej aplikacji z jednym projektem biblioteki zależnej i do tej pory jesteśmy zadowoleni z jednego CMakeLists.txtpliku na projekt: A/CMakeLists.txt(aplikacja B/CMakeLists.txt) używa (biblioteki) add_subdirectory(...).
ssc

Odpowiedzi:

12

Po kilku lekturach i testach stworzyłem podstawowy projekt demonstracyjny C ++ demonstrujący użycie CMake, CTest + boost.test, CPack i Doxygen i wykorzystujący mniej więcej organizację, o której wspomniałem w moim pytaniu.

Projekt pokazuje, jak tworzyć zależności od podprojektu, jak skompilować całe repozytorium lub tylko podprojekt, jak się pakować, jak testować i jak tworzyć dokumentację.

Zobacz tutaj: https://github.com/Barthelemy/CppProjectTemplate

Barth
źródło