[CMake] Creating relocatable packages

Guillaume Dumont dumont.guillaume at gmail.com
Tue Oct 20 09:25:31 EDT 2015


Hi Zac,

target_link_libraries will work with either full library paths or target
names including imported targets.

You need to use target_link_libraries in your CMakeLists.txt and
find_dependency in your PackageConfig.cmake. Like so:

in CMakeLists.txt:

target_link_libraries(mylib ${PCAP_LIBRARIES})

in PackageConfig.cmake

include(CMakeFindDependencyMacro)
find_depdency(PCAP)

this way your exported targets will carry a link dependency to an imported
target called PCAP and your PackageConfig.cmake will resolve that
dependency for consuming projects. (Provided you install your
FindPCAP.cmake and add the path to this file to CMAKE_MODULE_PATH)

Clearer now?




On Tue, Oct 20, 2015 at 8:24 AM, Zac Bergquist <zbergquist99 at gmail.com>
wrote:

> I think I'm on the right track now.  I was definitely missing the
> add_library(PCAP IMPORTED) section.
>
> Could you elaborate on the last part?  I thought target_link_libraries()
> is the reason I'm getting absolute paths.  Should I be using the
> FindDependency macro instead of target_link_libraries()?
>
>
> On Mon, Oct 19, 2015 at 9:54 PM, Guillaume Dumont <
> dumont.guillaume at gmail.com> wrote:
>
>> Hi Zac,
>>
>> Sorry I read your post very quickly the first time... If your library
>> uses its own FindPCAP.cmake then you can define an imported target for the
>> PCAP libraries like so:
>>
>> # FindPCAP.cmake
>>
>> find_path(PCAP_INCLUDE_DIR pcap.h ... )
>> find_library(PCAP_LIBRARY pcap ... )
>>
>> include(FindPackageHandleStandardArgs)
>> find_package_handle_standard_args(PCAP  DEFAULT_MSG PCAP_LIBRARY
>> PCAP_INCLUDE_DIR)
>>
>> if(PCAP_FOUND AND NOT TARGET PCAP)
>>   add_library(PCAP IMPORTED) # you can(or should) also specify if it's a
>> shared or static library
>>   set_target_properties(PCAP PROPERTIES IMPORTED_LOCATION ${PCAP_LIBRARY})
>>   # also add the interface include directories here via
>> set_target_properties
>>   set(PCAP_LIBRARIES PCAP)
>> endif()
>>
>> then in your CMakeLists.txt:
>>
>> find_package(PCAP)
>>
>> target_link_libraries(mylib ${PCAP_LIBRARIES})
>>
>> Install your FindPCAP.cmake with your exported targets so that you can
>> use the FindDependencyMacro to resolve the dependency when a consuming
>> project finds your  library.
>>
>> Would that work for you?
>>
>> HTH
>>
>> Guillaume
>>
>>
>>
>> On Mon, Oct 19, 2015 at 7:06 PM, Pau Garcia i Quiles <
>> pgquiles at elpauer.org> wrote:
>>
>>> Hello,
>>>
>>> In your case, what you need to do is to modify the config file
>>> generation in the library (i. e. you will need to patch the third-party
>>> library) so that the generated config file is relative.
>>>
>>> As an alternative, if you do not want to patch the third-party library,
>>> try modifying the generated config file by replacing absolute prefixes with
>>> a variable (to the cross-compilation sysroot) or relative paths.
>>>
>>> On Tue, Oct 20, 2015 at 1:02 AM, Zac Bergquist <zbergquist99 at gmail.com>
>>> wrote:
>>>
>>>> Yes, Pau, this is exactly my problem. Or more specifically, as the
>>>> author of a library that uses CMake and depends on libpcap, how can I best
>>>> structure and distribute the library to make it easy to use (and cross
>>>> compile)?  I would say using the system libpcap is strongly preferred over
>>>> distributing a copy of it.
>>>>
>>>> That tutorial is very interesting.  I'll have to take a closer look at
>>>> it because the solution isn't jumping out at me.  The tutorial shows a
>>>> project that contains both a library and a program that links to that
>>>> library in the same list file.  In my case that would not be possible.
>>>> Also, the library in the example has no dependencies so it wouldn't suffer
>>>> from the absolute path issue I'm encountering.
>>>> On Oct 19, 2015 5:36 PM, "Pau Garcia i Quiles" <pgquiles at elpauer.org>
>>>> wrote:
>>>>
>>>>> Hi Dan,
>>>>>
>>>>> On a second read, it seems Zac's problem was actually finding the
>>>>> dependency (libpcap) of a dependency. Or rather, making if findable,
>>>>> because the second depenency contains an absolute path which is broken due
>>>>> to cross-compilation.
>>>>>
>>>>> I have never used it but this page contains information on how to fix
>>>>> the paths in the config file to be relative instead of absolute. That
>>>>> should fix the problem:
>>>>>
>>>>>
>>>>> https://cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Oct 19, 2015 at 11:15 PM, Dan Kegel <dank at kegel.com> wrote:
>>>>>
>>>>>> Well, that's one answer.  But if you want to use system libpcap, it's
>>>>>> not a very satisfying one.
>>>>>>
>>>>>> It's odd that pcap doesn't ship with a .pc file.
>>>>>> I guess the pcap folks are hostile to pkgconfig because it's LGPL; see
>>>>>> https://github.com/the-tcpdump-group/libpcap/issues/374
>>>>>> - Dan
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Mon, Oct 19, 2015 at 2:04 PM, Pau Garcia i Quiles <
>>>>>> pgquiles at elpauer.org> wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>>
>>>>>>> Use ExternalProject to build libpcap as part of your project. Make
>>>>>>> sure you use $ORIGIN in rpath everywhere. Install your application (and
>>>>>>> your bundled libpcap) to /opt to avoid polluting the system.
>>>>>>>
>>>>>>> On Mon, Oct 19, 2015 at 10:37 PM, Zac Bergquist <
>>>>>>> zbergquist99 at gmail.com> wrote:
>>>>>>>
>>>>>>>> Thank you for your reply, Guillaume.
>>>>>>>>
>>>>>>>> I understand that this is the expected behavior.  I even linked to
>>>>>>>> the documentation that says this is the expected behavior.  What I don't
>>>>>>>> understand is how to resolve it.  Are you saying it is not possible to
>>>>>>>> create a relocatable package unless all dependencies are also using CMake?
>>>>>>>> That doesn't seem right.
>>>>>>>>
>>>>>>>> Should I be trying to write a package config file for libpcap, or
>>>>>>>> is there a better way to approach this?
>>>>>>>>
>>>>>>>> On Sat, Oct 17, 2015 at 8:19 AM, Guillaume Dumont <
>>>>>>>> dumont.guillaume at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> What you are seeing is the expected behavior. You can get a
>>>>>>>>> relocatable package if all your dependencies (in your case libcap) have
>>>>>>>>> themselves relocatable package config files with exported targets. Then you
>>>>>>>>> package should make use of find_dependency macro.
>>>>>>>>>
>>>>>>>>> On Fri, Oct 16, 2015 at 4:56 PM, Zac Bergquist <
>>>>>>>>> zbergquist99 at gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> I've created a sample project to replicate my issue in hopes that
>>>>>>>>>> it would make it easier to troubleshoot.
>>>>>>>>>>
>>>>>>>>>> Thanks for any help,
>>>>>>>>>> Zac
>>>>>>>>>>
>>>>>>>>>> https://github.com/zmb3/cmaketest
>>>>>>>>>>
>>>>>>>>>> On Mon, Oct 12, 2015 at 8:53 AM, Zac Bergquist <
>>>>>>>>>> zbergquist99 at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hello,
>>>>>>>>>>>
>>>>>>>>>>> I'm trying to fix a project so that its output is relocatable.
>>>>>>>>>>> The project is a library that itself depends on libpcap.  My goal is to be
>>>>>>>>>>> able to import the library into my CMake application and have CMake
>>>>>>>>>>> automatically link libpcap with it.
>>>>>>>>>>>
>>>>>>>>>>> I'm using a toolchain file that invokes an ARM cross compiler,
>>>>>>>>>>> sets CMAKE_INSTALL_PREFIX and appends it to CMAKE_FIND_ROOT_PATH.  This all
>>>>>>>>>>> seems to work well.
>>>>>>>>>>>
>>>>>>>>>>> What I'm seeing is that the exported files that get installed to
>>>>>>>>>>> CMAKE_INSTALL_PREFIX contain absolute paths to libpcap on my machine, which
>>>>>>>>>>> make them useless to other team members.
>>>>>>>>>>>
>>>>>>>>>>> The first thing I changed was to use
>>>>>>>>>>> CONFIGURE_PACKAGE_CONFIG_FILE instead of CONFIGURE_FILE.  This got rid of
>>>>>>>>>>> absolute paths in the generated CMake config file.
>>>>>>>>>>>
>>>>>>>>>>> However, I still have absolute paths in the CMake target import
>>>>>>>>>>> file that gets generated.  The IMPORTED_LINK_INTERFACE_LIBRARIES target
>>>>>>>>>>> property has an absolute path instead of one relative to
>>>>>>>>>>> CMAKE_INSTALL_PREFIX.
>>>>>>>>>>>
>>>>>>>>>>> I've read the "Creating Relocatable Packages" [1] section of the
>>>>>>>>>>> CMake packages documentation. I'm pretty sure this is what I'm running
>>>>>>>>>>> into, but I don't quite understand how to solve it.  The documentation says
>>>>>>>>>>> that I should be using imported targets, but I'm not sure how to do so.
>>>>>>>>>>> The library is just using its own FindPCAP.cmake file to locate libpcap.
>>>>>>>>>>>
>>>>>>>>>>> Does anyone know of an example of a CMake package that imports
>>>>>>>>>>> other libraries?  I could also try to create a minimal example project with
>>>>>>>>>>> this setup if it would be helpful.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Zac
>>>>>>>>>>>
>>>>>>>>>>> [1]:
>>>>>>>>>>> https://cmake.org/cmake/help/v3.3/manual/cmake-packages.7.html#creating-relocatable-packages
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>>
>>>>>>>>>> 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:
>>>>>>>>>> http://public.kitware.com/mailman/listinfo/cmake
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Guillaume Dumont
>>>>>>>>> =========================
>>>>>>>>> dumont.guillaume at gmail.com
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>>
>>>>>>>> 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:
>>>>>>>> http://public.kitware.com/mailman/listinfo/cmake
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Pau Garcia i Quiles
>>>>>>> http://www.elpauer.org
>>>>>>> (Due to my workload, I may need 10 days to answer)
>>>>>>>
>>>>>>> --
>>>>>>>
>>>>>>> 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:
>>>>>>> http://public.kitware.com/mailman/listinfo/cmake
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Pau Garcia i Quiles
>>>>> http://www.elpauer.org
>>>>> (Due to my workload, I may need 10 days to answer)
>>>>>
>>>>
>>>
>>>
>>> --
>>> Pau Garcia i Quiles
>>> http://www.elpauer.org
>>> (Due to my workload, I may need 10 days to answer)
>>>
>>> --
>>>
>>> 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:
>>> http://public.kitware.com/mailman/listinfo/cmake
>>>
>>
>>
>>
>> --
>> Guillaume Dumont
>> =========================
>> dumont.guillaume at gmail.com
>>
>
>


-- 
Guillaume Dumont
=========================
dumont.guillaume at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20151020/b5994935/attachment-0001.html>


More information about the CMake mailing list