[Development] Qt5*Config.cmake files: _qt5_*_check_file_exists macros and plugins
Stephen Kelly
steveire at gmail.com
Sun Oct 19 14:58:38 CEST 2014
Kevin Kofler wrote:
>
> Those _qt5_*_check_file_exists checks look unnecessary to me in the first
> place.
Part of the intention of the way CMake config-packages and IMPORTED targets
work is that if the FooConfig.cmake is present and found, and the Foo
IMPORTED target is present, then you can use it without further checks.
http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
> * If a file is NOT actually required to build against the library, then it
> should NOT be checked for (as is the case for those plugins).
The intention of the check is to verify that the things defined/"exported"
by the package actually exist - it's not about whether the files are
required to build against the library, per se. That's not the intention of
the check.
> But I also don't see the checks being useful for self-built Qt (where
> "make install" will just install everything) nor your upstream binaries
> (which also contain everything that is needed).
1) If I reference a plugin in my buildsystem (so I can make a mac bundle or
whatever), and I have not installed the Fedora package for the plugin,
things might seem fine in the buildsystem, but the plugin won't be packaged,
and I'll have runtime bugs to debug. The check turns that into a build-time
report.
2) Other people can also create packages for use within an organization, and
they may not do it right, may not have the rules/guarantees that you provide
with your packages etc.
In saying that though, the check is probably relatively low value.
> So the question there is:
> Why were those checks added in the first place? Can they be removed in
> upstream Qt?
My suggestion is similar to the idea behind
https://codereview.qt-project.org/61334
Namely, add a component to the *Config.cmake packages such that the user can
write
find_package(Qt5Core REQUIRED Plugins)
to express that the plugins are needed in the buildsystem (for whatever
reason).
The semantic might be,
* if the Plugins component is specified, then check for existence, otherwise
don't.
or
* if the Plugins component is specified, then load the *PluginConfig.cmake
files, otherwise don't. This has the side-effect that the existence check
won't be done.
I prefer the second option (and there may be more options). The problem is
backward compatibility though - currently people are not specifying the
Plugins component and the plugin IMPORTED targets are defined and usable.
After such a change they wouldn't be. However, users would have to update
their Qt to get the new behavior and it would be immediately noticable, and
maybe something like a CMake policy could be emulated for it.
So I think that would be ok. What do you think? Then, afaiu, you could
continue to ship the *Config.cmake files in your -devel package, but they
won't cause a fatal error if the plugin is not present, unless the user
specifies that they want the plugin, and then the fatal error is
appropriate.
> 3.b. One subpackage per *Plugin.cmake file, i.e. for every
> qt5-modulename-pluginname package, we'd have a
> qt5-modulename-pluginname-devel. That means many subpackages.
This looks to me like the most correct but probably least convenient
solution.
Thanks,
Steve.
More information about the Development
mailing list