[CMake] Install libraries defined in INTERFACE targets

Robert Maynard robert.maynard at kitware.com
Wed May 16 18:12:10 EDT 2018


BUILD_INTERFACE explicitly means that only consumers inside the same
buildsystem should use these libraries. To specify the libraries that
should be used when linking to an installed version of a library you need
to use INSTALL_INTERFACE.

The reason for BUILD and INSTALL interface is to make sure you can build
relocatable libraries and not embed absolute paths into a libraries
specification.

On Wed, May 16, 2018 at 7:03 AM <rozelak at volny.cz> wrote:

> Hallo,
> I have created a simple project simulating the issue.
>
> There is 'run.sh' script which first builds an executable using
> 'add_subdirectory()' CMake command. It works without issues, as expected
> (the libraries required by Module1 and Module2 are passed to the Module4
> builder).
> Then, it first builds a STATIC library (defined by Module3) which is then
> used by Module4. This fails, since I do not know how to export a list of
> libraries required by Module1 and Module2.
>
> Could someone, please, look at the project (which is really simple) and
> give me a hint how Module3 should export (when install iss called) a CMake
> script, which would containt the libraries to link with?
>
> Thank you very much.
> Best regards,
>
> Dan
>
>
> ______________________________________________________________
> > Od: <rozelak at volny.cz>
> > Komu: <cmake at cmake.org>
> > Datum: 04.05.2018 13:25
> > Předmět: Install libraries defined in INTERFACE targets
> >
>
>  Hello,
>  I build a project which consists of several "modules" with various mutual
> dependencies. Each module defines its OBJECT target as:
>
>
>      # Module 1:
>      add_library(Module1 OBJECT ....)
>      target_include_directories(Module1 PRIVATE
> ${CMAKE_CURRENT_SOURCE_DIR})
>
>      add_library(Module1_LIBRARIES INTERFACE)
>      target_link_libraries(Module1_LIBRARIES INTERFACE
> $<BUILD_INTERFACE:....>)
>
>
>      # Module 2:
>      add_library(Module2 OBJECT ....)
>      target_include_directories(Module2 PUBLIC
> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
>
>      add_library(Module2_LIBRARIES INTERFACE)
>      target_link_libraries(Module2_LIBRARIES INTERFACE
> $<BUILD_INTERFACE:....> $<BUILD_INTERFACE:Module1_LIBRARIES>)
>
>      add_library(Module2_INCLUDES  INTERFACE)
>      target_include_directories(Module2_INCLUDES  INTERFACE
> $<TARGET_PROPERTY:Module2,INCLUDE_DIRECTORIES>)
>      target_sources(Module2_INCLUDES  INTERFACE ....)
>
>      add_library(Module_CONFFILE  INTERFACE)
>      target_sources(Module2_CONFFILE  INTERFACE Module.config)
>
>
>  And when building a final product (or one of the final products), I use
> the individual targets:
>
>      add_library(Product1 STATIC $<TARGET_OBJECTS:Module1>
> $<TARGET_OBJECTS:Module2> ...)
>      target_link_libraries(Product1 LINK_INTERFACE_LIBRARIES
> $<BUILD_INTERFACE:Module1_LIBRARIES> $<BUILD_INTERFACE:Module2_LIBRARIES>
> ...)
>
>
>
>  It works perfectly, the library is built using all the sources. Even when
> defining INSTALL, all the properties of the targets (include files, config
> files, etc.) can be accessed and are installed correctly
>
>      install(TARGETS Product1  DESTINATION "./" EXPORT "libProduct1")
>      install(FILES $<TARGET_PROPERTY:Module2_CONFFILE,INTERFACE_SOURCES>
>         DESTINATION "./config")
>      install(FILES $<TARGET_PROPERTY:Module2_INCLUDES,INTERFACE_SOURCES>
>         DESTINATION "./include")
>
>
>  The problem starts when I want to export a CMake file listing all the
> libraries which were defined by the individual modules (and are accessed by
> $<BUILD_INTERFACE:Module2_LIBRARIES>) since they know what they need (how
> they were configured).
>
>  When building a static library (which is shown here), I need to export a
> list of additional libraries necessary to link the Product1 correctly. But
> using $<BUILD_INTERFACE:Module[]_LIBRARIES> in the INSTALL() command does
> not work, neither works something like:
>
>      install(EXPORT "llibProduct1" DESTINATION "."
> EXPORT_LINK_INTERFACE_LIBRARIES)
>
>
>  So the question is: how to export the libraries defined by the individual
> modules to an CMake file which would be installed together with the
> Product1 library and header files?
>
>
>  Thank you very much,
>  Dan
>
>  P.S. I use CMake 3.6.2.
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180516/cd3eb5c9/attachment.html>


More information about the CMake mailing list