toolchain.eclass: move gentoo patches into own helper
[gentoo.git] / eclass / kde5.eclass
index 4876d7c3bc61a74dc12fa310819e1ee38b126614..ee1d3b35aa8c659a03fb4ef47ae93aa0f74a0eee 100644 (file)
@@ -1,13 +1,26 @@
-# Copyright 1999-2016 Gentoo Foundation
+# Copyright 1999-2019 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
-# $Id$
 
 # @ECLASS: kde5.eclass
 # @MAINTAINER:
 # kde@gentoo.org
-# @BLURB: Support eclass for KDE 5-related packages.
+# @SUPPORTED_EAPIS: 7
+# @BLURB: Support eclass for packages that follow KDE packaging conventions.
 # @DESCRIPTION:
-# The kde5.eclass provides support for building KDE 5-related packages.
+# This eclass is intended to streamline the creation of ebuilds for packages
+# that follow KDE upstream packaging conventions. It's primarily intended for
+# the three upstream release groups (Frameworks, Plasma, Applications) but
+# is also for any package that follows similar conventions.
+#
+# This eclass unconditionally inherits kde5-functions.eclass and all its public
+# functions and variables may be considered as part of this eclass's API.
+#
+# This eclass unconditionally inherits cmake-utils.eclass and all its public
+# variables and helper functions (not phase functions) may be considered as part
+# of this eclass's API.
+#
+# This eclass's phase functions are not intended to be mixed and matched, so if
+# any phase functions are overridden the version here should also be called.
 
 if [[ -z ${_KDE5_ECLASS} ]]; then
 _KDE5_ECLASS=1
@@ -19,12 +32,10 @@ _KDE5_ECLASS=1
 # for tests you should proceed with setting VIRTUALX_REQUIRED=test.
 : ${VIRTUALX_REQUIRED:=manual}
 
-inherit cmake-utils eutils flag-o-matic gnome2-utils kde5-functions versionator virtualx xdg
+inherit cmake-utils flag-o-matic kde5-functions virtualx xdg
 
 if [[ ${KDE_BUILD_TYPE} = live ]]; then
-       case ${KDE_SCM} in
-               git) inherit git-r3 ;;
-       esac
+       inherit git-r3
 fi
 
 if [[ -v KDE_GCC_MINIMAL ]]; then
@@ -33,22 +44,26 @@ fi
 
 EXPORT_FUNCTIONS pkg_setup pkg_nofetch src_unpack src_prepare src_configure src_compile src_test src_install pkg_preinst pkg_postinst pkg_postrm
 
-# @ECLASS-VARIABLE: KDE_AUTODEPS
+# @ECLASS-VARIABLE: ECM_KDEINSTALLDIRS
 # @DESCRIPTION:
 # If set to "false", do nothing.
-# For any other value, add a dependency on dev-qt/qtcore:5 and kde-frameworks/extra-cmake-modules:5.
-: ${KDE_AUTODEPS:=true}
+# For any other value, assume the package is using KDEInstallDirs macro and switch
+# KDE_INSTALL_USE_QT_SYS_PATHS to ON.
+: ${ECM_KDEINSTALLDIRS:=true}
 
-# @ECLASS-VARIABLE: KDE_BLOCK_SLOT4
+# @ECLASS-VARIABLE: KDE_AUTODEPS
 # @DESCRIPTION:
-# This variable is used when KDE_AUTODEPS is set.
-# If set to "true", add RDEPEND block on kde-apps/${PN}:4
-: ${KDE_BLOCK_SLOT4:=true}
+# If set to "false", do nothing.
+# For any other value, add dependencies on dev-qt/qtcore:5, kde-frameworks/kf-env
+# and kde-frameworks/extra-cmake-modules:5. Additionally, required blockers may
+# be set depending on the value of CATEGORY.
+: ${KDE_AUTODEPS:=true}
 
 # @ECLASS-VARIABLE: KDE_DEBUG
 # @DESCRIPTION:
-# If set to "false", unconditionally build with -DNDEBUG.
-# Otherwise, add debug to IUSE to control building with that flag.
+# If set to "false", add -DNDEBUG (via cmake-utils_src_configure) and -DQT_NO_DEBUG
+# to CPPFLAGS.
+# Otherwise, add debug to IUSE.
 : ${KDE_DEBUG:=true}
 
 # @ECLASS-VARIABLE: KDE_DESIGNERPLUGIN
@@ -77,9 +92,24 @@ EXPORT_FUNCTIONS pkg_setup pkg_nofetch src_unpack src_prepare src_configure src_
 
 # @ECLASS-VARIABLE: KDE_DOC_DIR
 # @DESCRIPTION:
-# Defaults to "doc". Otherwise, use alternative KDE handbook path.
+# Specifies the location of the KDE handbook if not the default.
 : ${KDE_DOC_DIR:=doc}
 
+# @ECLASS-VARIABLE: KDE_PO_DIRS
+# @DESCRIPTION:
+# Specifies the possible locations of KDE l10n files if not the default.
+: ${KDE_PO_DIRS:="po poqm"}
+
+# @ECLASS-VARIABLE: KDE_QTHELP
+# @DESCRIPTION:
+# If set to "false", do nothing.
+# Otherwise, add "doc" to IUSE, add the appropriate dependency, generate
+# and install Qt compressed help files with -DBUILD_QCH=ON when USE=doc.
+if [[ ${CATEGORY} = kde-frameworks ]]; then
+       : ${KDE_QTHELP:=true}
+fi
+: ${KDE_QTHELP:=false}
+
 # @ECLASS-VARIABLE: KDE_TEST
 # @DESCRIPTION:
 # If set to "false", do nothing.
@@ -88,23 +118,14 @@ EXPORT_FUNCTIONS pkg_setup pkg_nofetch src_unpack src_prepare src_configure src_
 # when USE=!test.
 # If set to "forceoptional", remove a Qt5Test dependency and comment test
 # subdirs from the root CMakeLists.txt in addition to the above.
-# If set to "forceoptional-recursive", remove a Qt5Test dependency and comment
-# test subdirs from *any* CMakeLists.txt in addition to the above.
+# If set to "forceoptional-recursive", remove Qt5Test dependencies and make
+# autotest(s), unittest(s) and test(s) subdirs from *any* CMakeLists.txt in ${S}
+# and below conditional on BUILD_TESTING. This is always meant as a short-term
+# fix and creates ${T}/${P}-tests-optional.patch to refine and submit upstream.
 if [[ ${CATEGORY} = kde-frameworks ]]; then
        : ${KDE_TEST:=true}
-else
-       : ${KDE_TEST:=false}
-fi
-
-# @ECLASS-VARIABLE: KDE_L10N
-# @DESCRIPTION:
-# This is an array of translations this ebuild supports. These translations
-# are automatically added to IUSE.
-if [[ ${KDEBASE} = kdel10n ]]; then
-       if [[ -n ${KDE_L10N} ]]; then
-               IUSE="${IUSE} $(printf 'l10n_%s ' ${KDE_L10N[@]})"
-       fi
 fi
+: ${KDE_TEST:=false}
 
 # @ECLASS-VARIABLE: KDE_SELINUX_MODULE
 # @DESCRIPTION:
@@ -113,6 +134,14 @@ fi
 # add a dependency on sec-policy/selinux-${KDE_SELINUX_MODULE} to (R)DEPEND.
 : ${KDE_SELINUX_MODULE:=none}
 
+# @ECLASS-VARIABLE: KDE_SUBSLOT
+# @DESCRIPTION:
+# If set to "false", do nothing.
+# If set to "true", add a subslot to the package, where subslot is either
+# defined as major.minor version for kde-*/ categories or ${PV} if other.
+# For any other value, that value will be used as subslot.
+: ${KDE_SUBSLOT:=false}
+
 # @ECLASS-VARIABLE: KDE_UNRELEASED
 # @INTERNAL
 # @DESCRIPTION
@@ -121,37 +150,44 @@ fi
 # a proper error message via pkg_nofetch.
 KDE_UNRELEASED=( )
 
-if [[ ${KDEBASE} = kdevelop ]]; then
-       HOMEPAGE="https://www.kdevelop.org/"
-elif [[ ${KDEBASE} = kdel10n ]]; then
-       HOMEPAGE="http://l10n.kde.org"
-elif [[ ${KMNAME} = kdepim ]]; then
-       HOMEPAGE="https://www.kde.org/applications/office/kontact/"
-else
-       HOMEPAGE="https://www.kde.org/"
-fi
-
+HOMEPAGE="https://kde.org/"
 LICENSE="GPL-2"
 
+SLOT=5
+
 if [[ ${CATEGORY} = kde-frameworks ]]; then
-       SLOT=5/$(get_version_component_range 1-2)
-else
-       SLOT=5
+       KDE_SUBSLOT=true
 fi
 
+case ${KDE_SUBSLOT} in
+       false)  ;;
+       true)
+               case ${CATEGORY} in
+                       kde-frameworks | \
+                       kde-plasma | \
+                       kde-apps)
+                               SLOT+="/$(ver_cut 1-2)"
+                               ;;
+                       *)
+                               SLOT+="/${PV}"
+                               ;;
+               esac
+               ;;
+       *)
+               SLOT+="/${KDE_SUBSLOT}"
+               ;;
+esac
+
 case ${KDE_AUTODEPS} in
        false)  ;;
        *)
-               DEPEND+=" $(add_frameworks_dep extra-cmake-modules)"
-               RDEPEND+=" >=kde-frameworks/kf-env-3"
+               BDEPEND+=" $(add_frameworks_dep extra-cmake-modules)"
+               RDEPEND+=" >=kde-frameworks/kf-env-4"
                COMMONDEPEND+=" $(add_qt_dep qtcore)"
 
-               if [[ ${CATEGORY} = kde-frameworks || ${CATEGORY} = kde-plasma && ${PN} != polkit-kde-agent ]]; then
-                       RDEPEND+=" !<kde-apps/kde4-l10n-15.12.3-r1"
-               fi
-
-               if [[ ${KDE_BLOCK_SLOT4} = true && ${CATEGORY} = kde-apps ]]; then
-                       RDEPEND+=" !kde-apps/${PN}:4"
+               # all packages need breeze/oxygen icons for basic iconset, bug #564838
+               if [[ ${PN} != breeze-icons && ${PN} != oxygen-icons ]]; then
+                       RDEPEND+=" || ( $(add_frameworks_dep breeze-icons) kde-frameworks/oxygen-icons:* )"
                fi
                ;;
 esac
@@ -167,11 +203,11 @@ case ${KDE_DESIGNERPLUGIN} in
        false)  ;;
        *)
                IUSE+=" designer"
-               DEPEND+=" designer? (
-                       $(add_frameworks_dep kdesignerplugin)
-                       $(add_qt_dep designer)
-               )"
-               ;;
+               if [[ ${CATEGORY} = kde-apps && ${PV} = 19.0[48]* ]]; then
+                       BDEPEND+=" designer? ( $(add_frameworks_dep kdesignerplugin) )"
+               else
+                       BDEPEND+=" designer? ( $(add_qt_dep designer) )"
+               fi
 esac
 
 case ${KDE_EXAMPLES} in
@@ -185,7 +221,19 @@ case ${KDE_HANDBOOK} in
        false)  ;;
        *)
                IUSE+=" +handbook"
-               DEPEND+=" handbook? ( $(add_frameworks_dep kdoctools) )"
+               BDEPEND+=" handbook? ( $(add_frameworks_dep kdoctools) )"
+               ;;
+esac
+
+case ${KDE_QTHELP} in
+       false)  ;;
+       *)
+               IUSE+=" doc"
+               COMMONDEPEND+=" doc? ( $(add_qt_dep qt-docs) )"
+               BDEPEND+=" doc? (
+                       $(add_qt_dep qthelp)
+                       >=app-doc/doxygen-1.8.13-r1
+               )"
                ;;
 esac
 
@@ -205,7 +253,7 @@ case ${KDE_SELINUX_MODULE} in
                ;;
 esac
 
-DEPEND+=" ${COMMONDEPEND} dev-util/desktop-file-utils"
+DEPEND+=" ${COMMONDEPEND}"
 RDEPEND+=" ${COMMONDEPEND}"
 unset COMMONDEPEND
 
@@ -213,19 +261,6 @@ if [[ -n ${KMNAME} && ${KMNAME} != ${PN} && ${KDE_BUILD_TYPE} = release ]]; then
        S=${WORKDIR}/${KMNAME}-${PV}
 fi
 
-# FIXME: Drop this when kdepim-16.08.x is no more
-if [[ -n ${KMNAME} && ${KMNAME} != ${PN} && ${KMNAME} = kdepim ]]; then
-       S="${S}/${PN}"
-fi
-
-if [[ -n ${KDEBASE} && ${KDEBASE} = kdevelop && ${KDE_BUILD_TYPE} = release ]]; then
-       if [[ -n ${KMNAME} ]]; then
-               S=${WORKDIR}/${KMNAME}-${PV%.0} # kdevelop missing trailing .0 in first release
-       else
-               S=${WORKDIR}/${PN}-${PV%.0}     # kdevelop missing trailing .0 in first release
-       fi
-fi
-
 _kde_is_unreleased() {
        local pair
        for pair in "${KDE_UNRELEASED[@]}" ; do
@@ -251,6 +286,7 @@ _calculate_src_uri() {
 
        case ${PN} in
                kdelibs4support | \
+               kdewebkit | \
                khtml | \
                kjs | \
                kjsembed | \
@@ -258,10 +294,11 @@ _calculate_src_uri() {
                kross)
                        _kmname="portingAids/${_kmname}"
                        ;;
+               kdesignerplugin)
+                       [[ ${PV} = 5.6[01].* ]] || _kmname="portingAids/${_kmname}"
+                       ;;
        esac
 
-       DEPEND+=" app-arch/xz-utils"
-
        case ${CATEGORY} in
                kde-apps)
                        case ${PV} in
@@ -276,10 +313,10 @@ _calculate_src_uri() {
                kde-frameworks)
                        SRC_URI="mirror://kde/stable/frameworks/${PV%.*}/${_kmname}-${PV}.tar.xz" ;;
                kde-plasma)
-                       local plasmapv=$(get_version_component_range 1-3)
+                       local plasmapv=$(ver_cut 1-3)
 
                        case ${PV} in
-                               5.?.[6-9]? )
+                               5.?.[6-9]? | 5.??.[6-9]? )
                                        # Plasma 5 beta releases
                                        SRC_URI="mirror://kde/unstable/plasma/${plasmapv}/${_kmname}-${PV}.tar.xz"
                                        RESTRICT+=" mirror"
@@ -291,38 +328,15 @@ _calculate_src_uri() {
                        ;;
        esac
 
-       if [[ -z ${SRC_URI} && -n ${KDEBASE} ]] ; then
-               local _kdebase
-               case ${PN} in
-                       kdevelop-pg-qt)
-                               _kdebase=${PN} ;;
-                       *)
-                               _kdebase=${KDEBASE} ;;
-               esac
+       if [[ ${PN} = kdevelop* ]]; then
                case ${PV} in
                        *.*.[6-9]? )
-                               SRC_URI="mirror://kde/unstable/${_kdebase}/${PV}/src/${_kmname}-${PV}.tar.xz"
+                               SRC_URI="mirror://kde/unstable/kdevelop/${PV}/src/${_kmname}-${PV}.tar.xz"
                                RESTRICT+=" mirror"
                                ;;
                        *)
-                               SRC_URI="mirror://kde/stable/${_kdebase}/${PV}/src/${_kmname}-${PV%.0}.tar.xz" ;;
+                               SRC_URI="mirror://kde/stable/kdevelop/${PV}/src/${_kmname}-${PV}.tar.xz" ;;
                esac
-               unset _kdebase
-       fi
-
-       if [[ ${KDEBASE} = kdel10n ]] ; then
-               local uri_base="${SRC_URI/${_kmname}-${PV}.tar.xz/}kde-l10n/kde-l10n"
-               SRC_URI=""
-               for my_l10n in ${KDE_L10N[@]} ; do
-                       case ${my_l10n} in
-                               sr | sr-ijekavsk | sr-Latn-ijekavsk | sr-Latn)
-                                       SRC_URI="${SRC_URI} l10n_${my_l10n}? ( ${uri_base}-sr-${PV}.tar.xz )"
-                                       ;;
-                               *)
-                                       SRC_URI="${SRC_URI} l10n_${my_l10n}? ( ${uri_base}-$(kde_l10n2lingua ${my_l10n})-${PV}.tar.xz )"
-                                       ;;
-                       esac
-               done
        fi
 
        if _kde_is_unreleased ; then
@@ -336,40 +350,40 @@ _calculate_live_repo() {
 
        SRC_URI=""
 
-       case ${KDE_SCM} in
-               git)
-                       # @ECLASS-VARIABLE: EGIT_MIRROR
-                       # @DESCRIPTION:
-                       # This variable allows easy overriding of default kde mirror service
-                       # (anongit) with anything else you might want to use.
-                       EGIT_MIRROR=${EGIT_MIRROR:=https://anongit.kde.org}
-
-                       local _kmname
-
-                       # @ECLASS-VARIABLE: EGIT_REPONAME
-                       # @DESCRIPTION:
-                       # This variable allows overriding of default repository
-                       # name. Specify only if this differ from PN and KMNAME.
-                       if [[ -n ${EGIT_REPONAME} ]]; then
-                               # the repository and kmname different
-                               _kmname=${EGIT_REPONAME}
-                       elif [[ -n ${KMNAME} ]]; then
-                               _kmname=${KMNAME}
-                       else
-                               _kmname=${PN}
-                       fi
+       # @ECLASS-VARIABLE: EGIT_MIRROR
+       # @DESCRIPTION:
+       # This variable allows easy overriding of default kde mirror service
+       # (anongit) with anything else you might want to use.
+       EGIT_MIRROR=${EGIT_MIRROR:=https://anongit.kde.org}
 
-                       if [[ ${PV} == ??.??.49.9999 && ${CATEGORY} = kde-apps ]]; then
-                               EGIT_BRANCH="Applications/$(get_version_component_range 1-2)"
-                       fi
+       local _kmname
 
-                       if [[ ${PV} != 9999 && ${CATEGORY} = kde-plasma ]]; then
-                               EGIT_BRANCH="Plasma/$(get_version_component_range 1-2)"
-                       fi
+       # @ECLASS-VARIABLE: EGIT_REPONAME
+       # @DESCRIPTION:
+       # This variable allows overriding of default repository
+       # name. Specify only if this differ from PN and KMNAME.
+       if [[ -n ${EGIT_REPONAME} ]]; then
+               # the repository and kmname different
+               _kmname=${EGIT_REPONAME}
+       elif [[ -n ${KMNAME} ]]; then
+               _kmname=${KMNAME}
+       else
+               _kmname=${PN}
+       fi
 
-                       EGIT_REPO_URI="${EGIT_MIRROR}/${_kmname}"
-                       ;;
-       esac
+       if [[ ${PV} == ??.??.49.9999 && ${CATEGORY} = kde-apps ]]; then
+               EGIT_BRANCH="Applications/$(ver_cut 1-2)"
+       fi
+
+       if [[ ${PV} != 9999 && ${CATEGORY} = kde-plasma ]]; then
+               EGIT_BRANCH="Plasma/$(ver_cut 1-2)"
+       fi
+
+       if [[ ${PV} != 9999 && ${PN} = kdevelop* ]]; then
+               EGIT_BRANCH="$(ver_cut 1-2)"
+       fi
+
+       EGIT_REPO_URI="${EGIT_MIRROR}/${_kmname}"
 }
 
 case ${KDE_BUILD_TYPE} in
@@ -381,7 +395,8 @@ debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: SRC_URI is ${SRC_URI}"
 
 # @FUNCTION: kde5_pkg_pretend
 # @DESCRIPTION:
-# Do some basic settings
+# Checks if the active compiler meets the minimum version requirements.
+# phase function is only exported if KDE_GCC_MINIMAL is defined.
 kde5_pkg_pretend() {
        debug-print-function ${FUNCNAME} "$@"
        _check_gcc_version
@@ -389,7 +404,7 @@ kde5_pkg_pretend() {
 
 # @FUNCTION: kde5_pkg_setup
 # @DESCRIPTION:
-# Do some basic settings
+# Checks if the active compiler meets the minimum version requirements.
 kde5_pkg_setup() {
        debug-print-function ${FUNCNAME} "$@"
        _check_gcc_version
@@ -397,7 +412,9 @@ kde5_pkg_setup() {
 
 # @FUNCTION: kde5_pkg_nofetch
 # @DESCRIPTION:
-# Display package publication status
+# Intended for use in the KDE overlay. If this package matches something in
+# KDE_UNRELEASED, display a giant warning that the package has not yet been
+# released upstream and should not be used.
 kde5_pkg_nofetch() {
        if ! _kde_is_unreleased ; then
                return
@@ -427,26 +444,12 @@ kde5_pkg_nofetch() {
 
 # @FUNCTION: kde5_src_unpack
 # @DESCRIPTION:
-# Function for unpacking KDE 5.
+# Unpack the sources, automatically handling both release and live ebuilds.
 kde5_src_unpack() {
        debug-print-function ${FUNCNAME} "$@"
 
        if [[ ${KDE_BUILD_TYPE} = live ]]; then
-               case ${KDE_SCM} in
-                       git)
-                               git-r3_src_unpack
-                               ;;
-               esac
-       elif [[ ${KDEBASE} = kdel10n ]]; then
-               local l10npart=5
-               [[ ${PN} = kde4-l10n ]] && l10npart=4
-               mkdir -p "${S}" || die "Failed to create source dir ${S}"
-               cd "${S}"
-               for my_tar in ${A}; do
-                       tar -xpf "${DISTDIR}/${my_tar}" --xz \
-                               "${my_tar/.tar.xz/}/CMakeLists.txt" "${my_tar/.tar.xz/}/${l10npart}" 2> /dev/null ||
-                               elog "${my_tar}: tar extract command failed at least partially - continuing"
-               done
+               git-r3_src_unpack
        else
                default
        fi
@@ -454,81 +457,66 @@ kde5_src_unpack() {
 
 # @FUNCTION: kde5_src_prepare
 # @DESCRIPTION:
-# Function for preparing the KDE 5 sources.
+# Wrapper for cmake-utils_src_prepare with lots of extra logic for magic
+# handling of linguas, tests, handbook etc.
 kde5_src_prepare() {
        debug-print-function ${FUNCNAME} "$@"
 
-       if [[ ${KDEBASE} = kdel10n ]]; then
-               local l10npart=5
-               [[ ${PN} = kde4-l10n ]] && l10npart=4
-               # move known variant subdirs to root dir, currently sr@*
-               use_if_iuse l10n_sr-ijekavsk && _l10n_variant_subdir2root sr-ijekavsk sr
-               use_if_iuse l10n_sr-Latn-ijekavsk && _l10n_variant_subdir2root sr-Latn-ijekavsk sr
-               use_if_iuse l10n_sr-Latn && _l10n_variant_subdir2root sr-Latn sr
-               if use_if_iuse l10n_sr; then
-                       rm -rf kde-l10n-sr-${PV}/${l10npart}/sr/sr@* || die "Failed to cleanup L10N=sr"
-                       _l10n_variant_subdir_buster sr
-               elif [[ -d kde-l10n-sr-${PV} ]]; then
-                       # having any variant selected means parent lingua will be unpacked as well
-                       rm -r kde-l10n-sr-${PV} || die "Failed to remove sr parent lingua"
-               fi
-
-               # add all l10n directories to cmake
-               cat <<-EOF > CMakeLists.txt || die
-project(${PN})
-cmake_minimum_required(VERSION 2.8.12)
-$(printf "add_subdirectory( %s )\n" \
-       `find . -mindepth 1 -maxdepth 1 -type d | sed -e "s:^\./::"`)
-EOF
-
-               # for KF5: drop KDE4-based part; for KDE4: drop KF5-based part
-               case ${l10npart} in
-                       5) find -maxdepth 2 -type f -name CMakeLists.txt -exec \
-                               sed -i -e "/add_subdirectory(4)/ s/^/#DONT/" {} + || die ;;
-                       4) find -maxdepth 2 -type f -name CMakeLists.txt -exec \
-                               sed -i -e "/add_subdirectory(5)/ s/^/#DONT/" {} + || die ;;
-               esac
-       fi
-
        cmake-utils_src_prepare
 
        # only build examples when required
-       if ! use_if_iuse examples || ! use examples ; then
+       if ! { in_iuse examples && use examples; } ; then
                cmake_comment_add_subdirectory examples
        fi
 
        # only enable handbook when required
-       if ! use_if_iuse handbook ; then
+       if in_iuse handbook && ! use handbook ; then
                cmake_comment_add_subdirectory ${KDE_DOC_DIR}
 
                if [[ ${KDE_HANDBOOK} = forceoptional ]] ; then
                        punt_bogus_dep KF5 DocTools
+                       sed -i -e "/kdoctools_install/ s/^/#DONT/" CMakeLists.txt || die
                fi
        fi
 
        # drop translations when nls is not wanted
-       if [[ -d po ]] && in_iuse nls && ! use nls ; then
-               rm -r po || die
+       if in_iuse nls && ! use nls ; then
+               local po
+               for po in ${KDE_PO_DIRS}; do
+                       if [[ -d ${po} ]] ; then
+                               rm -r ${po} || die
+                       fi
+               done
        fi
 
-       # enable only the requested translations
-       # when required
-       if [[ -d po && -v LINGUAS ]] ; then
-               pushd po > /dev/null || die
-               local lang
-               for lang in *; do
-                       if [[ -d ${lang} ]] && ! has ${lang} ${LINGUAS} ; then
-                               rm -r ${lang} || die
-                               if [[ -e CMakeLists.txt ]] ; then
-                                       cmake_comment_add_subdirectory ${lang}
-                               fi
-                       elif [[ -f ${lang} ]] && ! has ${lang/.po/} ${LINGUAS} ; then
-                               if [[ ${lang} != CMakeLists.txt && ${lang} != ${PN}.pot ]] ; then
-                                       rm ${lang} || die
+       # enable only the requested translations when required
+       # always install unconditionally for kconfigwidgets - if you use language
+       # X as system language, and there is a combobox with language names, the
+       # translated language name for language Y is taken from /usr/share/locale/Y/kf5_entry.desktop
+       if [[ -v LINGUAS && ${PN} != kconfigwidgets ]] ; then
+               local po
+               for po in ${KDE_PO_DIRS}; do
+               if [[ -d ${po} ]] ; then
+                       pushd ${po} > /dev/null || die
+                       local lang
+                       for lang in *; do
+                               if [[ -e ${lang} ]] && ! has ${lang/.po/} ${LINGUAS} ; then
+                                       case ${lang} in
+                                               cmake_modules | \
+                                               CMakeLists.txt | \
+                                               ${PN}.pot)      ;;
+                                               *) rm -r ${lang} || die ;;
+                                       esac
+                                       if [[ -e CMakeLists.txt ]] ; then
+                                               cmake_comment_add_subdirectory ${lang}
+                                               sed -e "/add_subdirectory([[:space:]]*${lang}\/.*[[:space:]]*)/d" \
+                                                       -i CMakeLists.txt || die
+                                       fi
                                fi
-                       fi
+                       done
+                       popd > /dev/null || die
+               fi
                done
-               popd > /dev/null || die
        fi
 
        if [[ ${KDE_BUILD_TYPE} = release && ${CATEGORY} != kde-apps ]] ; then
@@ -544,46 +532,58 @@ EOF
                fi
        fi
 
-       # in frameworks, tests = manual tests so never build them
-       if [[ ${CATEGORY} = kde-frameworks ]] && [[ ${PN} != extra-cmake-modules ]]; then
-               cmake_comment_add_subdirectory tests
-       fi
-
        # only build unit tests when required
-       if ! use_if_iuse test ; then
+       if ! { in_iuse test && use test; } ; then
                if [[ ${KDE_TEST} = forceoptional ]] ; then
                        punt_bogus_dep Qt5 Test
                        # if forceoptional, also cover non-kde categories
                        cmake_comment_add_subdirectory autotests test tests
                elif [[ ${KDE_TEST} = forceoptional-recursive ]] ; then
                        punt_bogus_dep Qt5 Test
-                       local d
-                       for d in $(find . -type d -name "autotests" -or -name "tests" -or -name "test" -or -name "unittests"); do
-                               pushd ${d%/*} > /dev/null || die
+                       local f pf="${T}/${P}"-tests-optional.patch
+                       touch ${pf} || die "Failed to touch patch file"
+                       for f in $(find . -type f -name "CMakeLists.txt" -exec \
+                               grep -l "^\s*add_subdirectory\s*\(\s*.*\(auto|unit\)\?tests\?\s*)\s*\)" {} \;); do
+                               cp ${f} ${f}.old || die "Failed to prepare patch origfile"
+                               pushd ${f%/*} > /dev/null || die
                                        punt_bogus_dep Qt5 Test
-                                       cmake_comment_add_subdirectory autotests test tests
+                                       sed -i CMakeLists.txt -e \
+                                               "/^#/! s/add_subdirectory\s*\(\s*.*\(auto|unit\)\?tests\?\s*)\s*\)/if(BUILD_TESTING)\n&\nendif()/" \
+                                               || die
                                popd > /dev/null || die
+                               diff -Naur ${f}.old ${f} 1>>${pf}
+                               rm ${f}.old || die "Failed to clean up"
                        done
+                       einfo "Build system was modified by KDE_TEST=forceoptional-recursive."
+                       einfo "Unified diff file ready for pickup in:"
+                       einfo "  ${pf}"
+                       einfo "Push it upstream to make this message go away."
                elif [[ ${CATEGORY} = kde-frameworks || ${CATEGORY} = kde-plasma || ${CATEGORY} = kde-apps ]] ; then
                        cmake_comment_add_subdirectory autotests test tests
                fi
        fi
+
+       # in frameworks, tests = manual tests so never build them
+       if [[ ${CATEGORY} = kde-frameworks ]] && [[ ${PN} != extra-cmake-modules ]]; then
+               cmake_comment_add_subdirectory tests
+       fi
 }
 
 # @FUNCTION: kde5_src_configure
 # @DESCRIPTION:
-# Function for configuring the build of KDE 5.
+# Wrapper for cmake-utils_src_configure with extra logic for magic handling of
+# handbook, tests etc.
 kde5_src_configure() {
        debug-print-function ${FUNCNAME} "$@"
 
        # we rely on cmake-utils.eclass to append -DNDEBUG too
-       if ! use_if_iuse debug; then
+       if in_iuse debug && ! use debug; then
                append-cppflags -DQT_NO_DEBUG
        fi
 
        local cmakeargs
 
-       if ! use_if_iuse test ; then
+       if in_iuse test && ! use test ; then
                cmakeargs+=( -DBUILD_TESTING=OFF )
 
                if [[ ${KDE_TEST} = optional ]] ; then
@@ -591,16 +591,30 @@ kde5_src_configure() {
                fi
        fi
 
-       if ! use_if_iuse handbook && [[ ${KDE_HANDBOOK} = optional ]] ; then
+       if in_iuse handbook && ! use handbook && [[ ${KDE_HANDBOOK} = optional ]] ; then
                cmakeargs+=( -DCMAKE_DISABLE_FIND_PACKAGE_KF5DocTools=ON )
        fi
 
-       if ! use_if_iuse designer && [[ ${KDE_DESIGNERPLUGIN} != false ]] ; then
-               cmakeargs+=( -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Designer=ON )
+       if in_iuse designer && [[ ${KDE_DESIGNERPLUGIN} != false ]] ; then
+               if [[ ${CATEGORY} = kde-frameworks ]]; then
+                       cmakeargs+=( -DBUILD_DESIGNERPLUGIN=$(usex designer) )
+               else
+                       cmakeargs+=( $(cmake-utils_use_find_package designer KF5DesignerPlugin) )
+               fi
+       fi
+
+       if [[ ${KDE_QTHELP} != false ]]; then
+               cmakeargs+=( -DBUILD_QCH=$(usex doc) )
        fi
 
-       # install mkspecs in the same directory as qt stuff
-       cmakeargs+=(-DKDE_INSTALL_USE_QT_SYS_PATHS=ON)
+       if [[ ${ECM_KDEINSTALLDIRS} != false ]] ; then
+               cmakeargs+=(
+                       # install mkspecs in the same directory as qt stuff
+                       -DKDE_INSTALL_USE_QT_SYS_PATHS=ON
+                       # move handbook outside of doc dir, bug 667138
+                       -DKDE_INSTALL_DOCBUNDLEDIR="${EPREFIX}/usr/share/help"
+               )
+       fi
 
        # allow the ebuild to override what we set here
        mycmakeargs=("${cmakeargs[@]}" "${mycmakeargs[@]}")
@@ -610,7 +624,8 @@ kde5_src_configure() {
 
 # @FUNCTION: kde5_src_compile
 # @DESCRIPTION:
-# Function for compiling KDE 5.
+# Wrapper for cmake-utils_src_compile. Currently doesn't do anything extra, but
+# is included as part of the API just in case it's needed in the future.
 kde5_src_compile() {
        debug-print-function ${FUNCNAME} "$@"
 
@@ -619,7 +634,8 @@ kde5_src_compile() {
 
 # @FUNCTION: kde5_src_test
 # @DESCRIPTION:
-# Function for testing KDE 5.
+# Wrapper for cmake-utils_src_test with extra logic for magic handling of dbus
+# and virtualx.
 kde5_src_test() {
        debug-print-function ${FUNCNAME} "$@"
 
@@ -650,36 +666,28 @@ kde5_src_test() {
 
 # @FUNCTION: kde5_src_install
 # @DESCRIPTION:
-# Function for installing KDE 5.
+# Wrapper for cmake-utils_src_install. Currently doesn't do anything extra.
 kde5_src_install() {
        debug-print-function ${FUNCNAME} "$@"
 
        cmake-utils_src_install
-
-       # We don't want ${PREFIX}/share/doc/HTML to be compressed,
-       # because then khelpcenter can't find the docs
-       if [[ -d ${ED}/${PREFIX}/share/doc/HTML ]]; then
-               docompress -x ${PREFIX}/share/doc/HTML
-       fi
 }
 
 # @FUNCTION: kde5_pkg_preinst
 # @DESCRIPTION:
-# Function storing icon caches
+# Sets up environment variables required in kde5_pkg_postinst.
 kde5_pkg_preinst() {
        debug-print-function ${FUNCNAME} "$@"
 
-       gnome2_icon_savelist
        xdg_pkg_preinst
 }
 
 # @FUNCTION: kde5_pkg_postinst
 # @DESCRIPTION:
-# Function to rebuild the KDE System Configuration Cache after an application has been installed.
+# Updates the various XDG caches (icon, desktop, mime) if necessary.
 kde5_pkg_postinst() {
        debug-print-function ${FUNCNAME} "$@"
 
-       gnome2_icon_cache_update
        xdg_pkg_postinst
 
        if [[ -z ${I_KNOW_WHAT_I_AM_DOING} ]]; then
@@ -689,61 +697,16 @@ kde5_pkg_postinst() {
                        einfo "Use it at your own risk."
                        einfo "Do _NOT_ file bugs at bugs.gentoo.org because of this ebuild!"
                fi
-               # for kf5-based applications tell user that he SHOULD NOT be using kde-base/plasma-workspace
-               if [[ ${KDEBASE} != kde-base || ${CATEGORY} = kde-apps ]]  && \
-                               has_version 'kde-base/plasma-workspace'; then
-                       echo
-                       ewarn "WARNING! Your system configuration still contains \"kde-base/plasma-workspace\","
-                       ewarn "indicating a Plasma 4 setup. With this setting you are unsupported by KDE team."
-                       ewarn "Please consider upgrading to Plasma 5."
-               fi
        fi
 }
 
 # @FUNCTION: kde5_pkg_postrm
 # @DESCRIPTION:
-# Function to rebuild the KDE System Configuration Cache after an application has been removed.
+# Updates the various XDG caches (icon, desktop, mime) if necessary.
 kde5_pkg_postrm() {
        debug-print-function ${FUNCNAME} "$@"
 
-       gnome2_icon_cache_update
        xdg_pkg_postrm
 }
 
-_l10n_variant_subdir2root() {
-       local l10npart=5
-       [[ ${PN} = kde4-l10n ]] && l10npart=4
-       local lingua=$(kde_l10n2lingua ${1})
-       local src=kde-l10n-${2}-${PV}
-       local dest=kde-l10n-${lingua}-${PV}/${l10npart}
-
-       # create variant rootdir structure from parent lingua and adapt it
-       mkdir -p ${dest} || die "Failed to create ${dest}"
-       mv ${src}/${l10npart}/${2}/${lingua} ${dest}/${lingua} || die "Failed to create ${dest}/${lingua}"
-       cp -f ${src}/CMakeLists.txt kde-l10n-${lingua}-${PV} || die "Failed to prepare L10N=${1} subdir"
-       echo "add_subdirectory(${lingua})" > ${dest}/CMakeLists.txt ||
-               die "Failed to prepare ${dest}/CMakeLists.txt"
-       cp -f ${src}/${l10npart}/${2}/CMakeLists.txt ${dest}/${lingua} ||
-               die "Failed to create ${dest}/${lingua}/CMakeLists.txt"
-       sed -e "s/${2}/${lingua}/" -i ${dest}/${lingua}/CMakeLists.txt ||
-               die "Failed to prepare ${dest}/${lingua}/CMakeLists.txt"
-
-       _l10n_variant_subdir_buster ${1}
-}
-
-_l10n_variant_subdir_buster() {
-       local l10npart=5
-       [[ ${PN} = kde4-l10n ]] && l10npart=4
-       local dir=kde-l10n-$(kde_l10n2lingua ${1})-${PV}/${l10npart}/$(kde_l10n2lingua ${1})
-
-       case ${l10npart} in
-               5) sed -e "/^add_subdirectory(/d" -i ${dir}/CMakeLists.txt || die "Failed to cleanup ${dir} subdir" ;;
-               4) sed -e "/^macro.*subdirectory(/d" -i ${dir}/CMakeLists.txt || die "Failed to cleanup ${dir} subdir" ;;
-       esac
-
-       for subdir in $(find ${dir} -mindepth 1 -maxdepth 1 -type d | sed -e "s:^\./::"); do
-               echo "add_subdirectory(${subdir##*/})" >> ${dir}/CMakeLists.txt
-       done
-}
-
 fi