tutorial - cómo usar las funciones cmake get_prerequisites y get_filename_component para la instalación de dependencia de destino?
cmake visual studio 2017 (1)
Hemos configurado un proyecto de cmake con dependencias externas de bibliotecas compartidas. Queremos empaquetar los binarios y las dependencias de nuestro proyecto usando CPack. Sin embargo, estamos obteniendo resultados diferentes en sistemas Windows y Linux cuando tratamos de encontrar dependencias de nuestros objetivos.
Echamos un vistazo al Módulo GetPrerequisites de CMake (2.8.12). Hemos utilizado con éxito el siguiente código CMake para obtener la ruta completa de una dependencia de destino CMake (BINARY) (_libFile) en Linux, sin embargo, no obtenemos un la ruta completa de la dependencia en Windows. En Windows, la variable dependency_realpath contiene algo así como $ {CMAKE_SOURCE_DIR} / DEPENDENCY_FILE, que no es la ruta correcta a la dependencia.
string(TOUPPER "${CMAKE_BUILD_TYPE}" CONFIG)
GET_TARGET_PROPERTY(MY_BINARY_LOCATION ${BINARY} LOCATION_${CONFIG} )
GET_PREREQUISITES(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "")
foreach( DEPENDENCY_FILE ${DEPENDENCIES})
get_filename_component( dependency_realpath ${DEPENDENCY_FILE} REALPATH)
Entonces la pregunta sería: ¿Por qué estamos obteniendo resultados diferentes para las ubicaciones de dependencia en Windows y Linux?
Las referencias que devuelve get_prerequisites no son referencias absolutas de ruta completa, y tampoco son resueltas a referencias absolutas a través de una simple llamada get_filename_component. (En Mac, pueden contener @executable_path, por ejemplo).
Sin embargo, hay otra función en el módulo GetPrerequisites.cmake llamada gp_resolve_item que puede ayudarlo aquí.
Prueba esto:
get_prerequisites(${MY_BINARY_LOCATION} DEPENDENCIES 0 0 "" "")
foreach(DEPENDENCY_FILE ${DEPENDENCIES})
gp_resolve_item("${MY_BINARY_LOCATION}" "${DEPENDENCY_FILE}" "" "" resolved_file)
message("resolved_file=''${resolved_file}''")
endforeach()
Eso debería convertir los nombres de DLL en ubicaciones de ruta completa de las DLL, suponiendo que estén en su RUTA. Si están en otros directorios, puede que necesite proporcionarlos como argumentos "dirs" para get_prerequisites y gp_resolve_item.
La documentación para el módulo GetPrerequisites.cmake está aquí: http://www.cmake.org/cmake/help/v3.0/module/GetPrerequisites.html
Además, posiblemente profundice en el módulo BundleUtilities.cmake para ver cómo usa GetPrerequisites.