Como lidar com um conflito de dependência transitiva usando sub-módulos Git e CMake?
Temos vários repositórios Git, alguns contendo nosso próprio código e outros contendo código de biblioteca de terceiros ligeiramente modificado. Um gráfico de dependência simplificado se parece com isso:
executable_A
| |
| v
| library_B
| |
v v
library_C
Portanto, o executável tem duas dependências emlibrary_C
, um direto e um transitivo. Espero unir tudo isso usando os sub-módulos Git e CMake, para que uma estrutura de diretórios simplificada se pareça com isso:
executable_A/
CMakeListst.txt
library_B/
CMakeLists.txt
library_C/
CMakeLists.txt
library_C/
CMakeLists.txt
Como você pode ver, olibrary_C
repositório é incluído como um submódulo duas vezes. Vamos supor que ambos os submódulos estejam apontando para o mesmo commit (qualquer idéia sobre como aplicar isso seria bem-vinda, mas não é o tópico desta pergunta).
Estamos usandoadd_subdirectory
, target_link_libraries
etarget_include_directories
para gerenciar essas interdependências. Bastante padrão.
O problema é que o CMake não gosta se você criar um destino com o mesmo nome duas vezes, por isso reclama:
Erro do CMake em library_C / CMakeLists.txt: 13 (add_library):
A add_library não pode criar o destino "library_C" porque já existe outro destino com o mesmo nome. O destino existente é uma biblioteca estática criada no diretório de origem "... / library_B / library_C".
Consulte a documentação da política CMP0002 para obter mais detalhes.
Prefiro não remover a dependência direta deexecutable_A
emlibrary_C
, porque o fato de ser puxado vialibrary_B
é um detalhe de implementação delibrary_B
isso não deve ser invocado. Além disso, essa abordagem será quebrada assim que adicionarmos outra dependência, comoexecutable_A --> library_D --> library_C
.
(Essa questão é o mais próximo que pude encontrar, mas é um pouco mais geral e permanece sem resposta.)