detect the Qt version KF5 frameworks were build against in CMake?

Friedrich W. H. Kossebau kossebau at kde.org
Wed Aug 28 19:36:46 BST 2019


Am Mittwoch, 28. August 2019, 19:19:21 CEST schrieb René J.V. Bertin:
> Hi,
> 
> Some KF5 framework libraries pull in Qt5 headers and/or libraries via their
> CMake modules, right?

Can you specifiy some more what you mean by "pull in"?

> Take the somewhat unusual situation where you have your KF5 frameworks built
> against, say, Qt 5.9 from the system and you want to test an application
> against a different, newer Qt build installed with Qt's installer. Qt
> guarantees this should work as long as you don't use private APIs. 

It also assumes you use compatible build flags for Qt and do not have e.g. 
different feature flags like for deprecated methods or things like D-Bus or 
other flags which affect symbol names, e.g. Qt namespacing.

> Those
> aforementioned KF5 frameworks will pull in "their" Qt5 headers (e.g. for
> Qt5Network in the project I'm tinkering with), meaning that QT_VERSION
> #ifdefs can behave in an unexpected way.

This sounds like you are talking about "pulling in" at build time, right?
KF modules install CMake config files to be found via cmake's 
find_package(KFFoo). Those ensure that required dependencies for the public 
interface are found as well, by having lines like

find_dependency(Qt5Core "5.9.0")

where the number is generated at build time of the KF5Foo module, taken 
usually from the min version variable via @@ substitution from a templare 
file.
This find_dependency() call will find whatever Qt is to be found first in the 
environment where find_package(KF5Foo) is called. So not necessarily the Qt 
installation which was used to build KF5Foo.

> Is there a way to detect this kind of situation at the cmake level, i.e. is
> there some constant that holds the Qt value the frameworks were built
> against?

Not that I am aware, the installed CMake config files currently just forward 
which minimum version would be expected at build time.

Talking about, this actually could be also wrong sometimes, both in case 
someone accidentally combines an older, yet old enough for the minimum Qt 
version, which would fail only at link/load time then if symbols only 
available in the newer Qt version had been used before.

Or in the case of relying on private Qt symbols, even if in non-published API, 
the CMake config file should actually require the exact version already from 
the start, to also catch unexpected surprises at link/load time.
E.g. by adding "EXACT" to the find_dependency call, with the very version 
found and used at build time:

CMakeLists.txt:
set(USED_QT_VERSION ${Qt5Core_VERSION})

KF5XmlGuiConfig.cmake.in:
find_dependency(Qt5Core @USED_QT_VERSION@ EXACT)

Guess we should change things at least for those KF modules using private Qt 
symbolds, will do and prepare some patches for review and discussion.
This should also improve things for KDE CI when bumping installed Qt versions 
and wondering why some things might fail when reusing previously built 
binaries.

So for the actual question, how to know which Qt version a KF module was build 
again, I think there is no direct info to query.

And the question would be, what is your actual case you need the info for?
In general any variant of the API should be queryable directly by properties 
of the build system or config.h files, not indirectly over knowing which Qt 
version was build against. So perhaps your need could/should be solved some 
other way.

Cheers
Friedrich




More information about the Kde-frameworks-devel mailing list