Ich möchte einige Ratschläge zur Organisation einer Reihe von verwandten, aber unabhängigen C ++ - Projekten, die in einem einzigen (Git-) Repository gespeichert sind. Die Projekte verwenden CMake.
Für ein vereinfachtes Beispiel stellen wir uns 2 Projekte A und B vor, wobei A von B abhängt. Die meisten Leute, die A entwickeln, erhalten B über das Verpackungssystem. Daher kompilieren sie nur A. Wir sollten Entwicklern jedoch erlauben, sowohl A als auch B selbst zu kompilieren (und zu installieren), separat oder zusammen.
Hier ist ein Vorschlag:
└── 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) Definieren Sie die allgemeinen cmake-Variablen für alle Projekte (falls vorhanden) und schließen Sie die Unterverzeichnisse ein. (2) Definiert das Projekt selbst und die erforderlichen cmake-Variablen des Projekts. (3) Definiert die zu installierenden Header und die für die Kompilierung erforderlichen Header. (4) Konfiguriert die Bibliothek und die Binärdateien. (5) Konfiguriert die ausführbaren Testdateien und Testfälle.
Soweit ich weiß, sollte jedes Projekt eine XXXConfig.cmake-Datei erstellen und in / usr / local / share / cmake installieren. Das Schreiben dieser Dateien scheint beim Lesen der Dokumentation von CMake recht kompliziert zu sein.
Was denkst du ? Ist die Struktur sinnvoll?
Haben Sie zufällig ein funktionierendes Beispiel für eine solche Reihe von Projekten?
CMakeLists.txt
Datei pro Projekt zufrieden :A/CMakeLists.txt
(die App) enthältB/CMakeLists.txt
(die Bibliothek) usingadd_subdirectory(...)
.Antworten:
Nach einigem Lesen und Testen habe ich ein grundlegendes Demo-C ++ - Projekt erstellt, das die Verwendung von CMake, CTest + boost.test, CPack und Doxygen demonstriert und mehr oder weniger die Organisation verwendet, die ich in meiner Frage erwähnt habe.
Das Projekt zeigt, wie man Unterprojektabhängigkeiten herstellt, wie man das gesamte Repo kompiliert oder nur ein Unterprojekt, wie man es verpackt, wie man es testet und wie man Dokumentation erstellt.
Siehe hier: https://github.com/Barthelemy/CppProjectTemplate
quelle