CMake: find_package() sin instalar la dependencia
Tengo un proyecto de cmake. La estructura es algo así:
SharedLib
- lib1
- lib2
Donde lib2
depende de lib1
, de tal manera que en su archivo CMakeLists.txt, utiliza find_package(lib1 REQUIRED)
. Ambas librerías son estáticas, y tanto SharedLib como lib2 usan lib1.
El archivo CMakeLists.txt principal es:
add_subdirectory("mypath/lib1" ${CMAKE_BINARY_DIR}/lib1)
add_subdirectory("mypath/lib2" ${CMAKE_BINARY_DIR}/lib2)
Ahora, find_package()
falla durante la configuración ya que lib1
no está compilada en este punto, ni instalada en un lugar que cmake pueda encontrar.
La pregunta es, ¿cómo puedo hacer que find_package()
encuentre mi lib1
, que está en el proyecto, con el código fuente?
Nota: si es relevante, lib1
es zlib
y lib2
es libzip
.
davy.ai
Una solución es utilizar la función
ExternalProject_Add
en CMake para construir e instalarlib1
. Esta función permite descargar o clonar el código fuente de un proyecto externo, construirlo como un proyecto separado e instalarlo en un directorio que tú puedas especificar. Luego puedes usarfind_package()
para encontrar tulib1
instalada. Aquí tienes un ejemplo de cómo puedes modificar tu archivo CMakeLists.txt de nivel superior para utilizarExternalProject_Add
:Este código primero incluye el módulo
ExternalProject
y luego define un nuevo proyecto externo llamadolib1_project
. El argumentoSOURCE_DIR
apunta al código fuente delib1
, y el argumentoCMAKE_ARGS
establece el prefijo de instalación en${CMAKE_CURRENT_BINARY_DIR}/lib1
. Esto significa quelib1
se instalará en${CMAKE_CURRENT_BINARY_DIR}/lib1/include
y${CMAKE_CURRENT_BINARY_DIR}/lib1/lib
. Luego, el código agregalib1_project
como una dependencia delib2
para quelib1
se construya antes delib2
.El código también agrega
${CMAKE_CURRENT_BINARY_DIR}/lib1/include
a los directorios de inclusión y${CMAKE_CURRENT_BINARY_DIR}/lib1/lib
a los directorios de enlace deSharedLib
ylib2
. Esto asegura quelib1
se encuentre en tiempo de enlace. Finalmente, el código llama afind_package()
para asegurarse de quelib1
sea encontrada por otros proyectos que dependen deSharedLib
.Ten en cuenta que esta solución asume que tienes acceso de escritura a
lib1
y puedes modificar su archivo CMakeLists.txt para utilizarExternalProject_Add
. También asume quelib1
tiene un archivoCMakeLists.txt
estándar que puede ser construido usando CMake. Silib1
no se construye ya utilizando CMake o tiene requisitos de construcción no estándar, es posible que necesites modificar los argumentos deExternalProject_Add
para construirlo correctamente.