Organização de diretório de um repositório CMake (C ++) contendo vários projetos


12

Gostaria de alguns conselhos sobre a organização de um conjunto de projetos C ++ relacionados, mas independentes, armazenados em um único repositório (git). Os projetos usam o CMake.

Para um exemplo simplificado, imaginamos 2 projetos A e B, A, dependendo de B. A maioria das pessoas que desenvolve A recebe B através do sistema de empacotamento. Portanto, eles compilarão apenas A. No entanto, devemos permitir que os desenvolvedores compilem ambos A e B (e instale), separadamente ou juntos.

Aqui está uma proposta:

└── 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 as variáveis ​​cmake comuns para todos os projetos (se houver) e inclui os subdiretórios. (2) Define o próprio projeto e as variáveis ​​cmake necessárias do projeto. (3) Define os cabeçalhos a serem instalados e os necessários para a compilação. (4) Configura a biblioteca e os binários. (5) Configura os executáveis ​​e os casos de teste.

Pelo que entendi, cada projeto deve produzir um arquivo XXXConfig.cmake e instalá-lo em / usr / local / share / cmake. A gravação desses arquivos parece bastante complicada ao ler a documentação do CMake.

O que você acha ? A estrutura faz sentido?

Você tem um exemplo de trabalho desse conjunto de projetos?


Eu acho que você pode estar superando aqui - acabamos de apresentar o cmake para um aplicativo com um projeto de biblioteca de dependentes e até agora estamos satisfeitos com um CMakeLists.txtarquivo por projeto: A/CMakeLists.txt(o aplicativo) inclui B/CMakeLists.txt(a biblioteca) usando add_subdirectory(...).
ssc

Respostas:


12

Após algumas leituras e testes, fiz um projeto básico de demonstração em C ++ demonstrando o uso do CMake, CTest + boost.test, CPack e Doxygen e usando mais ou menos a organização que mencionei na minha pergunta.

O projeto mostra como criar dependências de subprojetos, como compilar todo o repositório ou apenas um subprojeto, como empacotar, como testar e como produzir documentação.

Veja aqui: https://github.com/Barthelemy/CppProjectTemplate

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.