[CMake] Sub dependencies?

Doug douglas.linder at gmail.com
Thu Aug 11 23:23:46 EDT 2011


That works if it's all in a single project, but it's not.

I totally understand you can do this:

add_library(foo)
target_link_library(foo bar)
add_executable(exec)
target_link_library(exec foo)

If you have _this_ structure:

.../liba/CMakeLists.txt
....

.../blah/libb/CMakeLists.txt
....

..../some/other/path/exec/CMakeLists.txt

Then in exec you can you use find_package(libb REQUIRED)

However, when I compile it I still get dependency resolution errors on liba
(libpng in my case).

I'm guessing thats because to resolve libb all you get a include path and a
library path; find package has no way to load the CMakeLists.txt in libb/
and parse it, add the dependency to liba.

Seems like there should be a way to do this though.

Am I wrong?

Should the values in libb's CMakeLists.txt be propagating through?

If that's supposed to happen I must be using find_package wrong somehow?

In my specific case libpng and libpng-android are not the same project; they
are completely split and do not even use the same files.

Neither of them are 'child' projects of my library (libnw) via
add_subdirectory or some other weird thing like that.

~
Doug.

On Thu, Aug 11, 2011 at 9:30 PM, Glenn Coombs <glenn.coombs at gmail.com>wrote:

> The target_link_libraries() command would be in the CMakeLists.txt for
> library A, not the one for your executable.  The one for your executable
> would just say target_link_libraries(myExe A).  And cmake would
> automatically know that linking with A also means linking with png.
>
> You say that you have 2 different versions of library A.  Does this mean
> that you have 2 separate CMakeLists.txt files, one for each variant of A.
> Or are both variants built by the same CMakeLists.txt ?  Either way, I would
> have thought that you could add the appropriate target_link_libraries()
> command.  Can you describe your current setup in a bit more detail to
> explain why this approach won't work ?
>
>
> On 11 August 2011 14:02, Doug <douglas.linder at gmail.com> wrote:
>
>> How can I achieve that _without_ editing my own cmake file?
>>
>> What if a swap in a different library for my executable that is abi
>> compatible but uses a different implemented to load images?
>>
>> I'm not talking hypotheticals here: I literally have two versions of the
>> library that use slightly different versions of libpng (one for desktop and
>> one for android) and it's extremely inconvenient to be messing around with
>> my cmake file every time I change my build target.
>>
>> Sure I can do a giant IF(TARGET MATCHES "Android") ... ENDIF, which I
>> guess is what I will do for now, but it seems like a poor solution.
>>
>> Edit: woops; ment that to go to the list.
>>
>> ~
>> Doug.
>>
>> On Thu, Aug 11, 2011 at 7:39 PM, Glenn Coombs <glenn.coombs at gmail.com>wrote:
>>
>>> Add the sub dependencies that library A has with target_link_libraries():
>>>
>>>     target_link_libraries(A png)
>>>
>>> --
>>> Glenn
>>>
>>> On 11 August 2011 10:02, Doug <douglas.linder at gmail.com> wrote:
>>>
>>>> Hrm... this seems like something cmake should be able to do, but I don't
>>>> know how to make it work.
>>>>
>>>> If I have library A, that depends on a library and an executable project
>>>> that depends on library A, how can the executable project resolve the sub
>>>> dependencies from A?
>>>>
>>>> Specifically libpng in my case:
>>>>
>>>> I have a library that depends on libpng.
>>>>
>>>> I run cmake to build the library no problem.
>>>>
>>>> Then I try to compile a program that depends on the library and get a
>>>> heap of errors like:
>>>>
>>>>  undefined reference to `png_set_read_fn'
>>>>  etc. etc.
>>>>
>>>> Presumably this is something about how I depend on the library? I'm
>>>> using the LibFindMacros, so my cmake module looks like this for the library:
>>>>
>>>> include(LibFindMacros)
>>>>
>>>> find_path(LIBNW_INCLUDE_DIR NAMES nw.h PATHS
>>>> ${LIBNW_PKGCONF_INCLUDE_DIRS})
>>>>
>>>> find_library(LIBNW_LIBRARY NAMES nw PATHS ${LIBNW_PKGCONF_LIBRARY_DIRS})
>>>>
>>>> set(LIBNW_PROCESS_INCLUDES LIBNW_INCLUDE_DIR)
>>>> set(LIBNW_PROCESS_LIBS LIBNW_LIBRARY LIBNW_LIBRARIES)
>>>>
>>>> libfind_process(LIBNW)
>>>>
>>>>  I know I can use ADD_SUBDIRECTORY to include stuff for a sub dir, but
>>>> that isn't really appropriate in this case.
>>>>
>>>> ~
>>>> Doug.
>>>>
>>>> _______________________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Please keep messages on-topic and check the CMake FAQ at:
>>>> http://www.cmake.org/Wiki/CMake_FAQ
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.cmake.org/mailman/listinfo/cmake
>>>>
>>>
>>>
>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110812/d409b6cd/attachment.htm>


More information about the CMake mailing list