[Development] Qt 6 co-installability with Qt 5
Kevin Kofler
kevin.kofler at chello.at
Sun Nov 1 01:19:10 CET 2020
Shawn Rutledge wrote:
> I get the impression qtchooser is not popular among distro maintainers; in
> practice it’s mainly been up to people who want to be able to switch
> quickly and often between qt versions to install it themselves. (There was
> a period when Arch had it; then they took it away again.)
The reason it is not popular among distro maintainers is that, while the
approach may make sense to someone only compiling their own projects, as
soon as you need to compile someone else's software, you realize that
qtchooser's way of working does not match reality.
The thing is, most software projects need a specific major version of Qt to
compile, and different software projects need different versions of Qt. So,
what do you think makes more sense from the user's point of view:
a) the user needs to look up in the software's documentation which version
of Qt it expects, and manually configure qtchooser to point to that
version of Qt to get the software to compile, OR
b) the build system, which *knows* which version of Qt is needed, simply
invokes the correct version-suffixed Qt binary and everything just works
for the user with no manual setup needed
?
I would clearly choose option b. And while there is some support for a setup
like this in qtchooser (build systems can override the configured choice of
qtchooser by passing command-line arguments to the tools), that support is
more of an afterthought and has a major design flaw: if the tool is not
actually being wrapped by qtchooser, the build system will attempt to pass
arguments meant for qtchooser directly to the tool, and the tool will choke
on those arguments. Hence, it is not a portable mechanism. (I have had to
sed -i -e 's/qmake -qt5/qmake-qt5/g' (or moc-qt5 etc.) in more than one
upstream project's build system when packaging, to get it to build at all.)
The suffixed binaries, which have been used by distros for years and which
are now finally being officially adopted in Qt 6, solve this nicely and
cleanly: qmake-qt6, if it exists, is always QMake from Qt 6. The build
system of software developed for Qt 6 just needs to call this binary and
will get the QMake from the correct version of Qt without requiring any
magic command-line arguments to a wrapper that may or may not actually be
installed. And likewise for the other tools with version suffixes. And now
that the suffixes are officially supported, build systems no longer need to
support all the much more complicated competing setups (such as qtchooser).
> Consequently I have to install the symlinks pointing to qtchooser into
> some place that comes earlier in the path than /usr/bin, and it’s easier
> if that is a location where I don’t need sudo to make the links either.
> Usually I have /usr/local/bin and ~/bin both coming earlier in my PATH, so
> installing qtchooser in either of those is OK for me. But I’m open to
> better ideas.
Well yes, if you want to use qtchooser, that is the way to go. I do not see
why you need distro support for it, given that you can easily set it up that
way if you absolutely need this tool (with all its limitations).
> On Debian there’s /etc/alternatives, so what’s wrong if Qt binaries get
> installed into some location that’s not in the PATH, the /usr/bin symlinks
> point to Qt 6 binaries by default (via /etc/alternatives on distros that
> have it), and then you switch Qt versions with the standard distro
> mechanism?
Several things are wrong with this idea, in particular:
1. As you point out with your question below, this is a system-wide
mechanism, requiring root permissions to select the version of Qt.
2. The choice is a global system state, so one cannot compile software
requiring different versions of Qt in parallel.
3. As pointed out above, the user should not have to select a version of Qt
to begin with, that is the job of the build system of the software the
user is trying to compile, which *knows* what version of Qt it needs.
> (Is there a user-specific alternative?)
There are environment modules, but they also suffer from issue 3 above, and
to some extent from issue 2 (though with environment variables, you can at
least runtime-override the global selection locally within a shell).
Really, it is this whole concept of the user choosing a version of Qt that
is flawed. The right place to make this choice is the build system of the
software using Qt.
> Meanwhile, applications that need Qt 5 link against Qt 5 libs (different
> mechanisms might apply), and don’t necessarily need any Qt-installed
> binaries from PATH, right?
Once compiled, usually yes, but you need to compile them first. Unless you
use the distro packages, in which case the distro needs to compile the
applications for you, and as a distro packager, I can tell you that anything
that requires me to "select" a Qt version is extra boilerplate I do not want
in my package specfiles.
Distro packages need to compile on systems with more than one version of Qt
installed. (Technically, most distros build the production packages in
chroots containing only the explicitly listed build requirements, which will
in most cases include only one version of Qt, but a well-designed package
ought to also build locally in a full, non-chroot system.) A few distro
packages also need to compile different parts against different versions of
Qt, at once. (E.g., poppler has bindings for multiple versions of Qt, so the
package needs to install them all at build time to build the subpackages for
the different bindings.) Anything that requires explicitly selecting a
specific version of Qt in that situation is just extra boilerplate that is
absolutely avoidable, because the software being built already *knows* which
version(s) of Qt it needs.
> And those who want to install qtchooser just need to set up its config
> files if the distro doesn’t provide them; it works with any lib path and
> any binary path, but can’t deal with binaries being renamed AFAIK.
If any changes are needed to make qtchooser work with Qt 6, then I suggest
that those like you who want to keep using it fork it and make those
required changes. It is Free Software.
> In any case I don’t particularly want to need to type “qml6” on the
> command line to run the qml interpreter, if it can be avoided. When I
> think about how often I have had to switch the python symlink to point to
> either python2 or python3 because of some script that made an assumption
> or was written before python3 existed: that’s an anti-pattern IMO.
The anti-pattern there is really that you as the user have to pick the
version of Python at all. The Python scripts ought to have the correct
#!/usr/bin/env python2 or #!/usr/bin/env python3 shebang. (There too, the
script *knows* which version of Python it needs and ought to just work.)
Can you also use shebangs for QML? (If not, then the interpreter ought to be
fixed to allow them, it just needs to ignore the shebang line if it is not
already treated as a comment.)
> And I hope our transition is not going to take as long as that one has,
> either. ;-)
I think it will take longer. ;-) I still use some software using Qt 3!
Kevin Kofler
More information about the Development
mailing list