Tenho um Projeto A que exporta uma biblioteca estática como destino:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Agora, quero usar o Projeto A como um projeto externo do Projeto B e incluir seus alvos construídos:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
O problema é que o arquivo de inclusão ainda não existe quando CMakeLists do Projeto B é executado.
Existe uma maneira de tornar a inclusão dependente do projeto externo que está sendo construído?
Atualização : escrevi um breve tutorial CMake por Exemplo baseado neste e em outros problemas comuns que encontrei.
fonte
ExternalProject_Add
apenas se comportasse comoadd_subdirectory
e expusesse todos os alvos. A solução que você descreveu acima provavelmente ainda é a mais limpa.ExternalProject
. É consistência, ou mais canônica, ou outra coisa? Tenho certeza de que estou perdendo algo fundamental aqui.Esta postagem tem uma resposta razoável:
CMakeLists.txt.in
:CMakeLists.txt
:No entanto, parece bastante hacky. Eu gostaria de propor uma solução alternativa - usar submódulos Git.
Então
MyProject/dependencies/gtest/CMakeList.txt
você pode fazer algo como:Ainda não tentei extensivamente, mas parece mais limpo.
Edit: Há uma desvantagem nesta abordagem: O subdiretório pode executar
install()
comandos que você não deseja. Este post tem uma abordagem para desativá-los, mas tinha bugs e não funcionou para mim.Editar 2: se você usar
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
parece, significa que osinstall()
comandos no subdiretório não são usados por padrão.fonte
GIT_TAG
durante a clonagem, você pode perder a repetibilidade da compilação porque daqui a 2 anos alguém executando o script de compilação terá um versão diferente da que você fez. Os documentos do CMake também recomendam isso.Edit: CMake agora tem suporte embutido para isso. Veja a nova resposta .
Você também pode forçar a construção do destino dependente em um processo de criação secundário
Veja minha resposta em um tópico relacionado.
fonte
De
ExternalProject_Add
fato, o cmake pode ser usado, mas o que eu não gostei nele - é que ele executa algo durante a construção, pesquisa contínua, etc ... Eu preferiria construir o projeto durante a fase de construção, nada mais. Tentei substituirExternalProject_Add
em várias tentativas, infelizmente sem sucesso.Em seguida, tentei também adicionar o submódulo git, mas isso arrasta todo o repositório git, enquanto em certos casos eu preciso apenas de um subconjunto de todo o repositório git. O que eu verifiquei - é realmente possível realizar uma verificação git esparsa, mas isso requer uma função separada, que escrevi abaixo.
Eu adicionei duas chamadas de função abaixo apenas para ilustrar como usar a função.
Alguém pode não gostar de checkout master / trunk, pois aquele pode estar quebrado - então é sempre possível especificar uma tag específica.
A verificação será realizada apenas uma vez, até que você limpe a pasta de cache.
fonte
Eu estava procurando uma solução semelhante. As respostas aqui e o tutorial no topo são informativos. Estudei posts / blogs aqui referidos para construir o meu com sucesso. Estou postando CMakeLists.txt completo que funcionou para mim. Eu acho que isso seria útil como um modelo básico para iniciantes.
"CMakeLists.txt"
fonte