[CMake] Creating relocatable packages

Pau Garcia i Quiles pgquiles at elpauer.org
Mon Oct 19 19:06:10 EDT 2015


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)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20151020/ea7770ee/attachment.html>


More information about the CMake mailing list