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.guilla...@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 <zbergquis...@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.guilla...@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 < >>> pgqui...@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 <zbergquis...@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" <pgqui...@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 <d...@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 < >>>>>>> pgqui...@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 < >>>>>>>> zbergquis...@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.guilla...@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 < >>>>>>>>>> zbergquis...@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 < >>>>>>>>>>> zbergquis...@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.guilla...@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.guilla...@gmail.com >>> >> >> > > > -- > Guillaume Dumont > ========================= > dumont.guilla...@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