[CMake] Where is QT_USE_IMPORTED_TARGETS not safe to use?

Clinton Stimpson clinton at elemtech.com
Wed Jun 22 10:41:44 EDT 2011


On Jun 22, 2011, at 7:01 AM, Stephen Kelly wrote:

> Wups, sent a moment to early...
> 
> Stephen Kelly wrote:
> 
>> Clinton Stimpson wrote:
>>> It means the target must be created again with something like
>>> add_library(Qt4::QtCore UNKNOWN IMPORTED)
>>> 
>>> If GrantleeConfig.cmake were to do this:
>>> SET(QT_USE_IMPORTED_TARGETS 1)
>>> find_package(Qt4 REQUIRED)
>>> 
>>> then the imported targets would satisfy the Qt4::QtCore reference and
>>> others from your GrantleeTargets-debug.
>>> 
>>>> 
>>>>> The GrantleeConfig.cmake could set QT_USE_IMPORTED_TARGETS and a
>>>>> find_package(Qt4) to recreated those imported targets.
>>>> 
>>>> Ok, so maybe setting cis the thing that needs to
>>>> be done 'again' by project B?
>>> 
>>> Yes, or preferably in your GrantleeConfig.cmake so project B doesn't have
>>> to do it.
>>> 
>> 
>> I tried creating the error scenario, but it does work even if the
>> downstream does not set QT_USE_IMPORTED_TARGETS and even if I don't put it
>> in GrantleeConfig either. Qt4::QtCore is never interpreted as a file path
>> because FindQt4.cmake sets it unconditionally, and only conditionally sets
>> QT_QTCORE_LIBRARY to Qt4::QtCore based on QT_USE_IMPORTED_TARGETS.
> 
> 
> That means that if GrantleeTarget-debug uses
> 
> IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "Qt4::QtCore"
> 
> then the Qt4::QtCore will never be interpreted as a file on disk and the 
> comment in the file:
> 
>> This
>> means when a project B then uses project A, these imported targets must be
>> created again, otherwise e.g. "Qt4__QtCore" will be interpreted as name of 
>> a library file on disk, and not as a target, and linking will fail.
> 
> is not correct. Right?
> 
> Also, it means that I don't have to use 
> 
> SET(QT_USE_IMPORTED_TARGETS 1)
> find_package(Qt4 REQUIRED)
> 
> in my GrantleeConfig?


Yeah, I just looked again to verify what you are seeing... you don't need to do this
SET(QT_USE_IMPORTED_TARGETS 1)
in GrantleeConfig.cmake, but you can still do 
find_package(Qt4 REQUIRED)
to create the imported targets.

Clint


More information about the CMake mailing list