Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

CMake `INSTALL` for targets and its SO dependencies

Writer Andrew Mclaughlin

My target linked with several libraries using TARGET_LINK_LIBRARIES with PUBLIC keyword, The INSTALL command looks like INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin). I want somehow to force the cmake to include all (preferably excluding system libraries) libraries (SOs only) I link with to be included in the installation process. I've tried EXPORT keyword but looks like it affects only libraries which I build with in my project and marked with the same EXPORT as foo library.
Is it possible?
EDIT001: Additional information that may affect answer. I'm using vcpkg to manage third parties. So the TARGET_LINK_LIBRARIES looks like

TARGET_LINK_LIBRARIES(foo PUBLIC GTest::GTest GTest::Main ${GOOGLE_MOCK} event ${THRIFT_LIBRARIES} ${Boost_LIBRARIES} lzo2 sqlite3 ${ZeroMQ_LIBRARY} gRPC::grpc gRPC::grpc++ xml2 stdc++fs bfd -l:libisal.so.2 sgutils2 pthread uuid rt )

So, essentially what I want to achieve is to take all these libraries which are macro'ed by vcpkg, like ${THRIFT_LIBRARIES}, ${Boost_LIBRARIES} and gRPC::grpc and so on

2

2 Answers

As of cmake 3.21, you can now do with:

install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})

etc.

See new Install command.

3

CMake itself does not allow to install dependencies automatically. This would be a rather hard task, because it would have to consider a lot of corner cases.

Just think of transitive dependencies (I don't know if this is the right word), like: Your libA depends on libB, which depends on libC. How should CMake get this from the CMakeLists, where only libB is listed?

Or: What do you consider a system library? Everything that is not in PATH? How do you know which libraries are installed system-wide on the client's machine?

You see, there are some really tricky things to consider.

Here are some possibilities you have:

  • Ask your users to install the dependencies.
  • Statically link libraries into your binary.
  • Copy library files using install(FILES files... DESTINATION <dir>). Maybe your dependency manager can help creating the list of files.
  • Write a script that does something like windeployqt for Qt-based applications on Windows: Analyze the binary file (e.g. using ldd myApp) and automatically copy over the required dependencies.
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.