CPack Dependencies Shared Library

Hello,

I’m trying to package my shared library with dependencies and I’m using the below code:

#
# CPack Properties
#
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "1")
set(CPACK_PACKAGE_VERSION_PATCH "2")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
set(CPACK_GENERATOR "RPM")
set(CPACK_RPM_COMPONENT_INSTALL ON)
set(CPACK_RPM_PACKAGE_AUTOREQ YES)
set(CPACK_RPM_PACKAGE_AUTOREQPROV YES)
set(CPACK_RPM_PACKAGE_AUTOPROV YES)

include(CPack)

add_library(sharedlib_ SHARED ${PROJECT_SRCS})
target_link_libraries(sharedlib_ ${PROJECT_LIBS})
target_link_libraries(sharedlib_ ${OpenCV_LIBS} )
target_link_libraries(sharedlib_ amqpcpp )
target_link_libraries(sharedlib_ ssl ev)
set_target_properties(sharedlib_ PROPERTIES VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}" OUTPUT_NAME ${PROJECT_BIN} CLEAN_DIRECT_OUTPUT 1)

install(TARGETS sharedlib_ DESTINATION lib)

What i need for to add .so dependencies to rpm file? like:

 	linux-vdso.so.1 (0x00007ffc35937000)
	libamqpcpp.so.4.1 => not found
	libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007fa39b27d000)
	libev.so.4 => /lib64/libev.so.4 (0x00007fa39b26a000)
	libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007fa39b1a8000)
	libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007fa39b0c6000)

Thanks!

1 Like

There is a mechanism in RPM to discover and add .so dependencies automatically. Why would you need to put them into your package directly? If you do, you can use file(GET_RUNTIME_DEPENDENCIES) to find and put them into your package as well. Depending on your install prefix, an rpath of $ORIGIN would likely be helpful.

2 Likes

Ben,

I implemented something like this:

install(TARGETS ${BIN} DESTINATION bin)

include(GetPrerequisites)

set(BINARY_LOCATION "${MAINFOLDER}/bin/${BIN}")
get_prerequisites(${BINARY_LOCATION} DEPENDENCIES 0 0 "" "")

foreach(DEPENDENCY_FILE ${DEPENDENCIES})
  get_filename_component(DEPENDENCY_NAME "${DEPENDENCY_FILE}" NAME)
  get_filename_component(DEPENDENCY "${DEPENDENCY_FILE}" REALPATH)
  get_filename_component(DEPENDENCY_PATH "${DEPENDENCY}" DIRECTORY)
  install(FILES ${DEPENDENCY} DESTINATION "${DEPENDENCY_PATH}" )
endforeach()

This work fine! but I don’t know if I’m on the right track

1 Like

It looks sufficient to me. You might want to filter that ${DEPENDENCIES} list to avoid installing something like libc.so, but I don’t know your deployment.

You are right I’ll need to filter some dependencies like libc.so, I need to do that.