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?
CMakeLists.txt
arquivo por projeto:A/CMakeLists.txt
(o aplicativo) incluiB/CMakeLists.txt
(a biblioteca) usandoadd_subdirectory(...)
.Respostas:
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
fonte