Organización del directorio de un repositorio CMake (C ++) que contiene varios proyectos

12

Quisiera algunos consejos sobre la organización de un conjunto de proyectos C ++ relacionados pero independientes almacenados en un único repositorio (git). Los proyectos usan CMake.

Para un ejemplo simplificado, imaginamos 2 proyectos A y B, A dependiendo de B. La mayoría de las personas que desarrollan A obtendrán B a través del sistema de empaque. Por lo tanto, solo compilarán A. Sin embargo, debemos permitir que los desarrolladores compilen tanto A como B (e instalarlo), por separado o en conjunto.

Aquí hay una propuesta:

└── 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) Defina las variables comunes de cmake para todos los proyectos (si corresponde) e incluye los subdirectorios. (2) Define el proyecto en sí y las variables de cmake requeridas del proyecto. (3) Define los encabezados para instalar y los necesarios para la compilación. (4) Configura la biblioteca y los binarios. (5) Configura los ejecutables de prueba y los casos de prueba.

Según tengo entendido, cada proyecto debe producir un archivo XXXConfig.cmake e instalarlo en / usr / local / share / cmake. Escribir estos archivos parece bastante complicado al leer la documentación de CMake.

Qué piensas ? ¿Tiene sentido la estructura?

¿Tienes un ejemplo funcional de un conjunto de proyectos así?

Barth
fuente
Creo que podría estar superando aquí: acabamos de presentar cmake para una aplicación con un proyecto de biblioteca dependiente y hasta ahora estamos contentos con un CMakeLists.txtarchivo por proyecto: A/CMakeLists.txt(la aplicación) incluye B/CMakeLists.txt(la biblioteca) usando add_subdirectory(...).
ssc

Respuestas:

12

Después de leer y probar bastante, hice un proyecto básico de demostración de C ++ que demuestra el uso de CMake, CTest + boost.test, CPack y Doxygen y utilizo más o menos la organización que mencioné en mi pregunta.

El proyecto muestra cómo hacer dependencias de subproyectos, cómo compilar todo el repositorio o solo un subproyecto, cómo empaquetar, cómo probar y cómo producir documentación.

Ver aquí: https://github.com/Barthelemy/CppProjectTemplate

Barth
fuente