Haciendo que una biblioteca CMake sea accesible por otros paquetes CMake automáticamente

Tengo un proyecto que produce una biblioteca:

project (myCoolLibrary) ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC}) 

Y otro proyecto que debería usar esta biblioteca:

 find_package (myCoolLibrary REQUIRED) INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" ) add_executable(myCoolExe ${my_sources_SRC} ) TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} ) 

¿Hay alguna manera de que pueda cambiar el primer archivo para que el segundo archivo funcione automáticamente? Que ejecutando CMake en el primer archivo y luego ejecutando make en la salida, y luego ejecutando CMake en el segundo archivo, CMake puede encontrar el paquete?

También es aceptable una respuesta en la que solo proporcione la dirección de donde se construyó el primer proyecto para el segundo paquete.

Tomando el código encontrado en una publicación de blog por @daniperez – Use las bibliotecas habilitadas para CMake en su proyecto CMake (III) – He encontrado la siguiente solución mínima:

myCoolLibrary / CMakeLists.txt

 cmake_minimum_required(VERSION 3.3) project(myCoolLibrary) function(my_export_target _target _include_dir) file( WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Config.cmake" " include(\"\$\{CMAKE_CURRENT_LIST_DIR\}/${_target}Targets.cmake\") set_property( TARGET ${_target} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES \"${_include_dir}\" ) " ) export(TARGETS ${_target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Targets.cmake") # NOTE: The following call can pollute your PC's CMake package registry # See comments/alternatives below export(PACKAGE ${_target}) endfunction(my_export_target) ... add_library(${PROJECT_NAME} SHARED ${mysources_SRC}) my_export_target(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}") 

myCoolExe / CMakeLists.txt

 cmake_minimum_required(VERSION 3.3) project(myCoolExe) find_package(myCoolLibrary REQUIRED) ... add_executable(${PROJECT_NAME} ${my_sources_SRC}) target_link_libraries(${PROJECT_NAME} myCoolLibrary) 

Para que sea reutilizable, he empacado todo en my_export_target() . Y soy amigo de propiedades de autopropagación como INTERFACE_INCLUDE_DIRECTORIES .

Como comentó @ruslo, el uso de export(PACKAGE ...) puede contaminar el registro de su paquete. Entonces alternativamente puedes:

  1. Escriba los archivos de configuración de destino directamente en algún lugar dedicado específico para una determinada cadena de herramientas

    Consulte, por ejemplo, Cómo instalar su módulo CMake-Find personalizado y 0003659: Mejoras del comando FIND_PACKAGE .

  2. Establezca CMAKE_MODULE_PATH través de la línea de comando CMake del segundo proyecto (inyectando la (s) ruta (s) de búsqueda desde el exterior). Si construye los dos proyectos de todos modos con un script de comstackción, esta es la forma más directa de propagar las rutas de búsqueda del módulo.

Referencias adicionales

  • exportar()
  • CMake / Tutoriales / Registro de paquetes
  • No se puede encontrar Eigen3 con CMake
  • Cómo instruir a CMake para usar el comstackdor de architecture de comstackción