<div dir="ltr"><div><div><div><div><div><div>The FooBarConfig.cmake is something that should be generated by FooBar's build.   The reason you don't get absolute paths for the "libraries" from a package config file is that they're not actually libraries but imported targets.  The imported target let's you treat "foo" as though it were a library built by your project.  It then has the appropriate target properties set on it ti define the full path to it's library, etc.  That being said, if you're manually creating the FooBarConfig.cmake that's not really the right approach.  If the FooBar buil;d doesn't actually generate it's own FooBarConfig.cmake file then you'll want to create you're own FindFooBar.cmake.  A bare bones find module that creates an imported target would look something like this:<br><span style="font-family:monospace,monospace"><br>if(NOT FooBar_FOUND AND NOT TARGET FooBar::FooBar)<br>  find_path(FooBar_INCLUDE_DIR FooBar.h)<br>  find_library(FooBar_LIBRARY FooBar)<br><br>  include(FindPackageHandleStandardArgs)<br>  find_package_handle_standard_args(FooBar<br>    FOUND_VAR FooBar_FOUND<br>    REQUIRED_VARS FooBar_INCLUDE_DIR FooBar_LIBRARY<br>  )<br>endif()<br><br>if(FooBar_FOUND AND NOT TARGET FooBar::FooBar)<br>  add_library(FooBar::FooBar UNKNOWN IMPORTED)<br>  set_target_properties(FooBar::FooBar PROPERTIES<br>    IMPORTED_LOCATION ${FooBar_LIBRARY}<br>    INTERFACE_INCLUDE_DIRECTORIES ${FooBar_INCLUDE_DIR}<br>  )<br>endif()</span><br><br></div>Then in your project you can use:<br><br></div><span style="font-family:monospace,monospace">find_package(FooBar)<br></span></div><span style="font-family:monospace,monospace">add_library(MyLib supercoolfiles.cxx)<br></span></div><span style="font-family:monospace,monospace">target_libkLibraries(MyLib FooBar::FooBar)<br></span><br></div>Where this starts to get really helpful in your situation is if you have an imported target for A, B, and C, then you can create the appropriate dependencies.  Say, for example, you have a FindA.cmake that follows the pattern above and generates an A::A target.  Then in your FindB.cmake you can have:<br><br><span style="font-family:monospace,monospace">if(NOT B_FOUND AND NOT TARGET B::B)<br>  find_path(B_INCLUDE_DIR B.h) <br>  find_library(B_LIBRARY B)<br><br>  include(FindPackageHandleStandardArgs)<br>  find_package_handle_standard_args(B<br>    FOUND_VAR B_FOUND<br>    REQUIRED_VARS B_INCLUDE_DIR B_LIBRARY<br>  )<br><br><b>  find_package(A QUIET)<br>  if(A_FOUND)<br>    set(B_Extra_Deps A::A)<br>  endif()</b><br>endif()<br><br>if(B_FOUND AND NOT TARGET B::B)<br>  add_library(B::B UNKNOWN IMPORTED) <br>  set_target_properties(B::B PROPERTIES<br>    IMPORTED_LOCATION ${B_LIBRARY}<br>    INTERFACE_INCLUDE_DIRECTORIES ${B_INCLUDE_DIR}<br>  )<br><b>  if(B_Extra_Deps)<br>    set_target_properties(B::B PROPERTIES<br>      INTERFACE_LINK_LIBRARIES ${B_Extra_Deps}<br>    )<br>  endif()</b><br>endif()</span><br><br></div>and similarly for FindC.cmake.  Since A::A, B::B, and C::C are actual proper CMake targets and not just library files then they carry with them associated target dependency information.  In CMake vernacular we refer this as "target usage requirements" since the target caries with it all the necessary information for something to actually use it, whether that's just extra link libraries or also extra include directories and compile definitions needed.  The <span style="font-family:monospace,monospace">Package::Target</span> naming convention is the idea that each package has it's own namespace where you may define multiple targets.<br></div>