[CMake] Creating relocatable packages

Guillaume Dumont dumont.guillaume at gmail.com
Wed Oct 21 13:57:33 EDT 2015


Great! Always happy to help!

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

> Yes, that was exactly what I needed.
>
> Now my installed targets file has IMPORTED_LINK_INTERFACE_LIBRARIES "PCAP"
> instead of an absolute path, and the FindPCAP.cmake module kicks in and
> does what I would expect.
>
> Thanks again for your time - much appreciated.
>
> Zac
>
> On Tue, Oct 20, 2015 at 9:25 AM, Guillaume Dumont <
> dumont.guillaume at gmail.com> wrote:
>
>> 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
>>
>
>


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


More information about the CMake mailing list