Tengo un Proyecto A que exporta una biblioteca estática como objetivo:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Ahora quiero usar el Proyecto A como un proyecto externo del Proyecto B e incluir sus objetivos construidos:
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)
El problema es que el archivo de inclusión aún no existe cuando se ejecuta CMakeLists del Proyecto B.
¿Hay alguna forma de hacer que la inclusión dependa del proyecto externo que se está construyendo?
Actualización : escribí un breve tutorial de CMake por ejemplo basado en este y otros problemas comunes que encontré.
fuente
ExternalProject_Add
simplemente se comportaraadd_subdirectory
y expusiera todos los objetivos. La solución que describió anteriormente es probablemente la más limpia.ExternalProject
. ¿Es coherente, más canónico o algo más? Estoy seguro de que me estoy perdiendo algo fundamental aquí.Esta publicación tiene una respuesta razonable:
CMakeLists.txt.in
:CMakeLists.txt
:Sin embargo, parece bastante hacky. Me gustaría proponer una solución alternativa: use submódulos de Git.
Luego
MyProject/dependencies/gtest/CMakeList.txt
, puedes hacer algo como:Todavía no lo he probado mucho, pero parece más limpio.
Editar: hay una desventaja en este enfoque: el subdirectorio puede ejecutar
install()
comandos que no desea. Esta publicación tiene un enfoque para deshabilitarlos, pero tenía errores y no funcionó para mí.Edición 2: si lo usas
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
, parece que losinstall()
comandos del subdirectorio no se usan por defecto.fuente
GIT_TAG
durante la clonación, podría perder la repetibilidad de compilación porque dentro de 2 años alguien que ejecute el script de compilación obtendrá un versión diferente a la que hiciste. Los documentos de CMake también recomiendan esto.Editar: CMake ahora tiene soporte incorporado para esto. Ver nueva respuesta .
También puede forzar la construcción del objetivo dependiente en un proceso de creación secundario
Vea mi respuesta sobre un tema relacionado.
fuente
De
ExternalProject_Add
hecho , cmake se puede usar, pero lo que no me gustó de él es que realiza algo durante la compilación, la encuesta continua, etc. Preferiría compilar el proyecto durante la fase de compilación, nada más. He intentado anularExternalProject_Add
en varios intentos, desafortunadamente sin éxito.Luego también intenté agregar el submódulo git, pero eso arrastra todo el repositorio de git, mientras que en ciertos casos solo necesito un subconjunto de todo el repositorio de git. Lo que he comprobado: de hecho, es posible realizar un pago de git escaso, pero eso requiere una función separada, que escribí a continuación.
He agregado dos llamadas de función a continuación solo para ilustrar cómo usar la función.
Es posible que a alguien no le guste pagar el master / trunk, ya que ese podría estar roto, entonces siempre es posible especificar una etiqueta específica.
El pago se realizará solo una vez, hasta que borre la carpeta de caché.
fuente
Estaba buscando una solución similar. Las respuestas aquí y el tutorial en la parte superior son informativos. Estudié publicaciones / blogs referidos aquí para construir el mío con éxito. Estoy publicando CMakeLists.txt completo que funcionó para mí. Supongo que esto sería útil como plantilla básica para principiantes.
"CMakeLists.txt"
fuente