Hacer que una biblioteca CMake sea accesible por otros paquetes CMake automáticamente
(1)
Tomando el código encontrado en una publicación de blog de @daniperez - Use bibliotecas habilitadas para CMake en su proyecto CMake (III) - Se me ocurrió 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 empaquetado todo en
my_export_target()
.
Y soy amigo de propiedades de autopropagación como
INTERFACE_INCLUDE_DIRECTORIES
.
Como comentó @ruslo, usar
export(PACKAGE ...)
puede contaminar su registro de paquetes.
Entonces, alternativamente, usted puede:
-
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 .
-
Establezca
CMAKE_MODULE_PATH
través de la línea de comando CMake del segundo proyecto (inyectando las rutas de búsqueda desde el exterior). Si de todos modos está compilando los dos proyectos con un script de compilación, esta es la forma más directa de propagar las rutas de búsqueda del módulo.
Referencias Adicionales
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, luego ejecutando CMake en el segundo archivo, ¿CMake puede encontrar el paquete?
También es aceptable una respuesta donde solo doy la dirección de donde se construye el primer proyecto para el segundo paquete.