From Gentoo Wiki
< Qt
Jump to: navigation, search

Why do I need qt3support?

First of all, qt3support is a useflag that enables the dev-qt/qt3support module in Qt4, as well as needed code in other Qt4 modules. It does in no way depend on Qt3. It contains classes that make porting Qt3 applications and libraries to Qt4 easier. They are Qt4 classes that emulate Qt3 behavior. This is really only interesting for the developer of that package, not for the user.

Any Qt4-based package that uses these classes from Qt4's qt3support will require the qt3support useflag to be enabled. This means the useflag needs to be enabled for all Qt4 modules that have this useflag. Enabling it for one but not other modules would break things, either at compile time or at runtime, so we force the usage: it must be either enabled or disabled for all Qt ebuilds. And as there is no package other than the Qt libraries themselves that use this useflag, the recommendation is to enable (or disable) it globally in make.conf.

As kdelibs-4 uses these qt3support classes internally, there is a genuine requirement for qt3support to be enabled. There is no way you can have KDE4 without qt3support in Qt4. But this does not at all mean you need to keep Qt3 itself around. We strongly recommend you to remove x11-libs/qt:3.

Users who do not use KDE, or anything that depends on kde-base/kdelibs, should be able to have most other Qt4 applications work without qt3support.

Why do I get blockers when trying to emerge Qt?

Gentoo uses split ebuilds of the various components of Qt to allow finer-grained control of dependencies from other packages and reduced compilation time for revision bumps or useflag changes. However, despite there being separate ebuilds all those components must be of the same version, which means they must all be upgraded together.

If some of the updated version packages are keyworded but others are not, you get those blockers.

Another source of Qt blocks is incompatible USE flag combinations, the portage output should tell you which those are.

qt-webkit vs chromium block because of icu

A block might appear between www-client/chromium and dev-qt/qtwebkit, because we don't set the icu useflag by default, since it can cause problems. If you want to install chromium as well as qt-webkit, then you have to set custom useflags for qt-webkit (or set them globally if you like). This can be done in two ways:

File/etc/portage/package.use/icublockDisable both icu and gstreamer

dev-qt/qtwebkit -gstreamer -icu
File/etc/portage/package.use/icublockEnable both icu and gstreamer

dev-qt/qtwebkit gstreamer icu

Disabling gstreamer means you will not get HTML5 audio and video capability in qt-webkit based applications.

Solving the block

After you have checked your keywords and useflags are set correctly, if you still get unresolvable blocks, then the easiest (not necessarily the best, but the one with the least headaches) way to get the blocks out of the way for a Qt upgrade is to uninstall all Qt components, and then emerge the new version:

This obviously will break everything using the Qt libraries until they have finished emerging.

1. List all installed qt packages:

root # export INSTALLED_QT_PACKAGES=$(eix --only-names -IC dev-qt)

2. Save tarballs of the old versions should we have to roll back:

root # quickpkg ${INSTALLED_QT_PACKAGES}

3. Unmerge old version and emerge new version:

root # emerge -Ca ${INSTALLED_QT_PACKAGES} && emerge -av1 ${INSTALLED_QT_PACKAGES}

Should we need to roll back, then we can emerge the packaged versions:

root # emerge -av1 --usepkgonly ${INSTALLED_QT_PACKAGES}
the eix command is provided by app-portage/eix

What does the exceptions useflag do?

The useflag description is technical, because the issue is technical. It is enabled by default, because this is the recommended setting for Qt. See bug #240185 for a discussion. When a developer uses exceptions in his program, it will then produce a warning on certain errors, instead of a crash. This is a good thing, which we generally want. The downside is that the application will use some more memory and diskspace. So in cases where those are limited (think for example of embedded environments) it could be useful to turn this off. That is why we have decided to offer a useflag to disable this feature, after some users requested this.