[CMake] Transitive dependencies of header libraries

paul pfultz2 at yahoo.com
Fri Sep 29 15:26:51 EDT 2017


You need to do add the dependencies in the config.cmake file, which means you
need to seperate the config and export file. So in your CMakeLists.txt, you
would do:

install(TARGETS myheaderonlylib EXPORT myheaderonlylib-targets DESTINATION
include)
install(EXPORT myheaderonlylib-targets DESTINATION
share/myheaderonlylib/cmake)
install(FILES myheaderonlylib-config.cmake DESTINATION
share/myheaderonlylib/cmake)

And then in myheaderonlylib-config.cmake you would write:

include(CMakeFindDependencyMacro)
find_dependency(Eigen)
include("${CMAKE_CURRENT_LIST_DIR}/myheaderonlylib-targets.cmake")

This calls `find_dependency`, which is just a wrapper around `find_package`
that makes it more friendly inside of package config cmake file. This the user
just needs to call `find_package(myheaderonlylib)` and Eigen will be found
automatically.


On Fri, 2017-09-29 at 13:40 +0200, Alberto Luaces wrote:
> Hi, I have a header-only library which itself depends on another
> header-only library:
> 
> ```
> add_library(myheaderonlylib INTERFACE)
> 
> target_include_directories(myheaderonlylib INTERFACE
>   $<INSTALL_INTERFACE:include/myheaderonlylib>
>   )
> 
> target_link_libraries(myheaderonlylib INTERFACE Eigen3::Eigen)
> 
> install(TARGETS myheaderonlylib EXPORT myheaderonlylib-config DESTINATION
> include)
> 
> install(EXPORT myheaderonlylib-config DESTINATION
> share/myheaderonlylib/cmake)
> ```
> 
> When a third library links to "myheaderonlylib", cmake adds the target
>  Eigen3::Eigen, but since it is not known there, the configuration step
>  fails.
> 
> I understand this is a difficult one, but I wonder if there is any other
> way instead of finding Eigen3::Eigen from the client package.
> 
> Thanks!
> 
> -- 
> Alberto
> 

.


More information about the CMake mailing list