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.)

questionAnswers(1)

yourAnswerToTheQuestion