[CMake] intercomponent link dependencies?
Michael Wild
themiwi at gmail.com
Thu Jan 7 06:47:34 EST 2010
Hi Nico
In that case you need to do this:
add_library(${COMPONENT} IMPORTED)
set_target_properties(${COMPONENT} PROPERTIES
IMPORTED_LOCATION "${${COMPONENT}_LIBRARY}"
LINK_INTERFACE_LIBRARIES "${${COMPONENT}_LINK_INTERFACE_LIBRARIES}"
)
where each of the components X has a variable X_LIBRARY containing its path on the system (e.g. determined by find_library(X_LIBRARY ...)) and a variable X_LINK_INTERFACE_LIBRARIES which you have to set outside the foreach loop.
HTH
Michael
On 7. Jan, 2010, at 11:51 , Nico Schlömer wrote:
> Hi Michael,
>
> thanks for the explanations.
>
> I'm indeed about to write a FindModule.cmake for a library which I did
> *not* write, but to certain components of which I'd like to link
> against using CMake (in a clean fashion).
> I'm FOREACHing through the components of the library, and upon trying to set
>
> ADD_LIBRARY( ${COMPONENT} )
>
> cmake complains about
>
> add_library cannot create target "A" because another target with the
> same name already exists. The existing target is a static library created
> in source directory "/path/to/A". See
> documentation for policy CMP0002 for more details.
>
> Okay, so it exists already? Fine. Let's then
>
> SET_TARGET_PROPERTIES( ${COMPONENT} PROPERTIES
> LINK_INTERFACE_LIBRARIES "B;C;" )
>
> -- but again, cmake complains that
>
> set_target_properties Can not find target to add properties to: A
>
> TARGET_LINK_LIBRARIES doesn't work anyway as I'm not *building the
> libraries (cmake says).
>
> Hmmm...
> Nico
>
>
>
> On Thu, Jan 7, 2010 at 11:08 AM, Michael Wild <themiwi at gmail.com> wrote:
>>
>> One quick question: Are these libraries created by you? In that case you shouldn't write a FindMymodule.cmake, but a MymoduleConfig.cmake (see the documentation of find_package).
>>
>> Anyhow, to define the transitive link dependencies you can either use target_link_libraries(A LINK_INTERFACE_LIBRARIES B C) if your CMake is new enough, or you can use set_target_properties(A PROPERTIES LINK_INTERFACE_LIBRARIES "B;C"). Both solutions require that you use add_library(X IMPORTED) (where X = A, B and C) and set their IMPORTED_LOCATION property to the location on the file system. All of this is full automatic if you write a MymoduleConfig.cmake, because then you can use
>>
>> install_targets(A B C EXPORT MymoduleExports
>> ARCHIVE DESTINATION lib
>> LIBRARY DESTINATION lib
>> RUNTIME DESTINATION bin
>> PUBLIC_HEADER DESTINATION include
>> )
>>
>> install(EXPORT MymoduleExports
>> NAMESPACE Mymodule_
>> DESTINATION share/mymodule/cmake
>> )
>>
>> which will install a file ${CMAKE_INSTALL_PREFIX}/share/mymodule/cmake/MymoduleExports.cmake containing all the IMPORT stuff and which you can INCLUDE in your MymoduleConfig.cmake.
>>
>>
>> I hope I could help a bit, otherwise tell us which case it is and I'll be able to help more.
>>
>> Michael
>>
>>
More information about the CMake
mailing list