public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Michał Górny" <mgorny@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Subject: Re: [gentoo-dev] [PATCH 1/3] ecm-utils.eclass: New eclass
Date: Tue, 05 Nov 2019 22:20:46 +0100	[thread overview]
Message-ID: <759405ee4e4ae48d65cbac336e23f91ceec53ea1.camel@gentoo.org> (raw)
In-Reply-To: <2344877.D1iEJ5bPx9@tuxbrain>

[-- Attachment #1: Type: text/plain, Size: 14474 bytes --]

On Tue, 2019-11-05 at 00:30 +0100, Andreas Sturmlechner wrote:
> Support eclass for packages that use KDE extra-cmake-modules.
> 
> 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 cmake-utils.eclass and all its public
> variables and helper functions (not phase functions) may be considered as part
> of this eclass's API.
> 
> When used together with kde.org.eclass this will replace kde5.eclass and
> kde5-functions.eclass, most of the latter is becoming obsolete.
> 
> --- /dev/null
> +++ b/eclass/ecm-utils.eclass

I know we historically screwed this up repeatedly but please don't use
'-utils' for eclasses that export phases.

> @@ -0,0 +1,549 @@
> +# Copyright 1999-2019 Gentoo Authors
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: ecm-utils.eclass
> +# @MAINTAINER:
> +# kde@gentoo.org
> +# @SUPPORTED_EAPIS: 7
> +# @BLURB: Support eclass for packages that use KDE extra-cmake-modules.
> +# @DESCRIPTION:
> +# 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 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 ${_ECM_UTILS_ECLASS} ]]; then
> +_ECM_UTILS_ECLASS=1
> +
> +# @ECLASS-VARIABLE: VIRTUALX_REQUIRED
> +# @DESCRIPTION:
> +# For proper description see virtualx.eclass manpage.
> +# Here we redefine default value to be manual, if your package needs virtualx
> +# for tests you should proceed with setting VIRTUALX_REQUIRED=test.
> +: ${VIRTUALX_REQUIRED:=manual}
> +
> +inherit cmake-utils flag-o-matic toolchain-funcs virtualx xdg
> +
> +case ${EAPI} in
> +	7) ;;
> +	*) die "EAPI=${EAPI:-0} is not supported" ;;
> +esac
> +
> +if [[ -v KDE_GCC_MINIMAL ]]; then
> +	EXPORT_FUNCTIONS pkg_pretend
> +fi
> +
> +EXPORT_FUNCTIONS pkg_setup src_prepare src_configure src_test pkg_preinst 
> pkg_postinst pkg_postrm
> +
> +# @ECLASS-VARIABLE: ECM_KDEINSTALLDIRS
> +# @DESCRIPTION:
> +# If set to "false", do nothing.
> +# 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: ECM_NONGUI
> +# @DESCRIPTION:
> +# If set to "false", add dependency on kde-frameworks/breeze-icons
> +# or kde-frameworks/oxygen-icons and run the xdg.eclass routines for
> +# pkg_preinst, pkg_postinst and pkg_postrm.
> +# For any other value, do nothing.
> +if [[ ${CATEGORY} = kde-frameworks ]]; then
> +	: ${ECM_NONGUI:=true}
> +fi
> +: ${ECM_NONGUI:=false}

I don't think eclassdoc is going to parse this correctly.

> +
> +# @ECLASS-VARIABLE: ECM_DEBUG
> +# @DESCRIPTION:
> +# If set to "false", add -DNDEBUG (via cmake-utils_src_configure) and
> +# -DQT_NO_DEBUG to CPPFLAGS.
> +# Otherwise, add debug to IUSE.
> +: ${ECM_DEBUG:=true}

To be honest, I don't really like this 'anything-or-false' logic.  It's
rather confusing and error-prone.  For example, if I misspell 'false'
the eclass is going to silently assume true.

> +
> +# @ECLASS-VARIABLE: ECM_DESIGNERPLUGIN
> +# @DESCRIPTION:
> +# If set to "false", do nothing.
> +# Otherwise, add "designer" to IUSE to toggle build of designer plugins
> +# and add the necessary BDEPEND.
> +: ${ECM_DESIGNERPLUGIN:=false}
> +
> +# @ECLASS-VARIABLE: ECM_EXAMPLES
> +# @DESCRIPTION:
> +# If set to "false", unconditionally ignore a top-level examples 
> subdirectory.
> +# Otherwise, add "examples" to IUSE to toggle adding that subdirectory.
> +: ${ECM_EXAMPLES:=false}
> +
> +# @ECLASS-VARIABLE: ECM_HANDBOOK
> +# @DESCRIPTION:
> +# If set to "false", do nothing.
> +# Otherwise, add "+handbook" to IUSE, add the appropriate dependency, and let
> +# KF5DocTools generate and install the handbook from docbook file(s) found in
> +# ECM_HANDBOOK_DIR. However if USE handbook is disabled, disable build of
> +# ECM_HANDBOOK_DIR in CMakeLists.txt.
> +# If set to "optional", config with -
> DCMAKE_DISABLE_FIND_PACKAGE_KF5DocTools=ON
> +# when USE=!handbook. In case package requires KF5KDELibs4Support, see next:
> +# If set to "forceoptional", remove a KF5DocTools dependency from the root
> +# CMakeLists.txt in addition to the above.
> +: ${ECM_HANDBOOK:=false}
> +
> +# @ECLASS-VARIABLE: ECM_HANDBOOK_DIR
> +# @DESCRIPTION:
> +# Specifies the directory containing the docbook file(s) relative to ${S} to 
> be
> +# processed by KF5DocTools (kdoctools_install) if not the default.
> +: ${ECM_HANDBOOK_DIR:=doc}
> +
> +# @ECLASS-VARIABLE: ECM_PO_DIRS
> +# @DESCRIPTION:
> +# Specifies the top-level directories of l10n files relative to ${S} to be
> +# processed by KF5I18n (ki18n_install) if not the default. If IUSE nls exists
> +# and is disabled then disable build of these directories in CMakeLists.txt.
> +: ${ECM_PO_DIRS:="po poqm"}
> +
> +# @ECLASS-VARIABLE: ECM_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
> +	: ${ECM_QTHELP:=true}
> +fi
> +: ${ECM_QTHELP:=false}

Again, I believe this and below won't be processed by eclassdoc
correctly.

> +
> +# @ECLASS-VARIABLE: ECM_TEST
> +# @DESCRIPTION:
> +# If set to "false", do nothing.
> +# For any other value, add test to IUSE and add a dependency on dev-qt/
> qttest:5.
> +# If set to "optional", configure with -
> DCMAKE_DISABLE_FIND_PACKAGE_Qt5Test=ON
> +# 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 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
> +	: ${ECM_TEST:=true}
> +fi
> +: ${ECM_TEST:=false}
> +
> +case ${ECM_NONGUI} in

There's a @PRE_INHERIT thingie to indicate variables that need to be set
before 'inherit' to work correctly.

> +	false)
> +		# gui applications need breeze or oxygen icons for basic iconset, 
> bug #564838
> +		RDEPEND+=" || ( kde-frameworks/breeze-icons:5 kde-frameworks/
> oxygen-icons:* )"
> +		;;
> +	*)	;;
> +esac
> +
> +case ${ECM_DEBUG} in
> +	false)	;;
> +	*)
> +		IUSE+=" debug"
> +		;;
> +esac
> +
> +case ${ECM_DESIGNERPLUGIN} in
> +	false)	;;
> +	*)
> +		IUSE+=" designer"
> +		BDEPEND+=" designer? ( dev-qt/designer:5 )"
> +		;;
> +esac
> +
> +# @ECLASS-VARIABLE: KDE_DESIGNERPLUGIN
> +# @DESCRIPTION:
> +# If set to "false", do nothing.
> +# Otherwise, add "designer" to IUSE to toggle build of designer plugins
> +# and add the necessary BDEPEND.
> +# TODO: drop after KDE Applications 19.08.3 removal
> +: ${KDE_DESIGNERPLUGIN:=false}
> +case ${KDE_DESIGNERPLUGIN} in
> +	false)	;;
> +	*)
> +		IUSE+=" designer"
> +		BDEPEND+=" designer? ( kde-frameworks/kdesignerplugin:5 )"
> +		;;
> +esac
> +
> +case ${ECM_EXAMPLES} in
> +	false)	;;
> +	*)
> +		IUSE+=" examples"
> +		;;
> +esac
> +
> +case ${ECM_HANDBOOK} in
> +	false)	;;
> +	*)
> +		IUSE+=" +handbook"
> +		BDEPEND+=" handbook? ( kde-frameworks/kdoctools:5 )"
> +		;;
> +esac
> +
> +case ${ECM_QTHELP} in
> +	false)	;;
> +	*)
> +		IUSE+=" doc"
> +		COMMONDEPEND+=" doc? ( dev-qt/qt-docs:5 )"
> +		BDEPEND+=" doc? (
> +			>=app-doc/doxygen-1.8.13-r1
> +			dev-qt/qthelp:5
> +		)"
> +		;;
> +esac
> +
> +case ${ECM_TEST} in
> +	false)	;;
> +	*)
> +		IUSE+=" test"
> +		DEPEND+=" test? ( dev-qt/qttest:5 )"
> +		RESTRICT+=" !test? ( test )"
> +		;;
> +esac
> +
> +BDEPEND+=" >=kde-frameworks/extra-cmake-modules-5.60.0"
> +RDEPEND+=" >=kde-frameworks/kf-env-4"
> +COMMONDEPEND+=" dev-qt/qtcore:5"
> +
> +DEPEND+=" ${COMMONDEPEND}"
> +RDEPEND+=" ${COMMONDEPEND}"
> +unset COMMONDEPEND
> +
> +# @ECLASS-VARIABLE: KDE_GCC_MINIMAL
> +# @DEFAULT_UNSET
> +# @DESCRIPTION:
> +# Minimum version of active GCC to require. This is checked in
> +# ecm-utils_pkg_pretend and ecm-utils_pkg_setup.
> +
> +# @FUNCTION: _check_gcc_version

Would be nice to prefix it with _ecm*.

> +# @INTERNAL
> +# @DESCRIPTION:
> +# Determine if the current GCC version is acceptable, otherwise die.
> +_check_gcc_version() {
> +	if [[ ${MERGE_TYPE} != binary && -v KDE_GCC_MINIMAL ]] && tc-is-gcc; 
> then
> +
> +		local version=$(gcc-version)
> +		local major=${version%.*}
> +		local minor=${version#*.}
> +		local min_major=${KDE_GCC_MINIMAL%.*}
> +		local min_minor=${KDE_GCC_MINIMAL#*.}
> +
> +		debug-print "GCC version check activated"
> +		debug-print "Version detected:"
> +		debug-print "	- Full: ${version}"
> +		debug-print "	- Major: ${major}"
> +		debug-print "	- Minor: ${minor}"
> +		debug-print "Version required:"
> +		debug-print "	- Major: ${min_major}"
> +		debug-print "	- Minor: ${min_minor}"
> +
> +		[[ ${major} -lt ${min_major} ]] || \
> +				( [[ ${major} -eq ${min_major} && ${minor} -lt $
> {min_minor} ]] ) \
> +			&& die "Sorry, but gcc-${KDE_GCC_MINIMAL} or later is 
> required for this package (found ${version})."

Why not use ver_cmp from EAPI 7?

> +	fi
> +}
> +
> +# @FUNCTION: ecm_punt_bogus_dep
> +# @USAGE: <prefix> <dependency>
> +# @DESCRIPTION:
> +# Removes a specified dependency from a find_package call with multiple 
> components.
> +ecm_punt_bogus_dep() {
> +	local prefix=${1}
> +	local dep=${2}
> +
> +	if [[ ! -e "CMakeLists.txt" ]]; then

Can this really ever happen in a valid use case?  Maybe it should be
an error instead.

> +		return
> +	fi
> +
> +	pcregrep -Mni "(?s)find_package\s*\(\s*${prefix}[^)]*?${dep}.*?\)" 
> CMakeLists.txt > "${T}/bogus${dep}"
> +
> +	# pcregrep returns non-zero on no matches/error
> +	if [[ $? != 0 ]] ; then

-ne

> +		return
> +	fi
> +
> +	local length=$(wc -l "${T}/bogus${dep}" | cut -d " " -f 1)

'wc -l < ...' and you won't have to cut.

> +	local first=$(head -n 1 "${T}/bogus${dep}" | cut -d ":" -f 1)
> +	local last=$(( ${length} + ${first} - 1))

$(( length + first - 1 ))

> +
> +	sed -e "${first},${last}s/${dep}//" -i CMakeLists.txt || die
> +
> +	if [[ ${length} = 1 ]] ; then

-eq

> +		sed -e "/find_package\s*(\s*${prefix}\(\s\+\(REQUIRED\|CONFIG\|
> COMPONENTS\|\${[A-Z0-9_]*}\)\)\+\s*)/Is/^/# removed by kde5-functions.eclass - 
> /" -i CMakeLists.txt || die
> +	fi
> +}
> +
> +# @FUNCTION: ecm-utils_pkg_pretend
> +# @DESCRIPTION:
> +# Checks if the active compiler meets the minimum version requirements.
> +# phase function is only exported if KDE_GCC_MINIMAL is defined.
> +ecm-utils_pkg_pretend() {
> +	debug-print-function ${FUNCNAME} "$@"
> +	_check_gcc_version
> +}
> +
> +# @FUNCTION: ecm-utils_pkg_setup
> +# @DESCRIPTION:
> +# Checks if the active compiler meets the minimum version requirements.
> +ecm-utils_pkg_setup() {
> +	debug-print-function ${FUNCNAME} "$@"
> +	_check_gcc_version
> +}
> +
> +# @FUNCTION: ecm-utils_src_prepare
> +# @DESCRIPTION:
> +# Wrapper for cmake-utils_src_prepare with lots of extra logic for magic
> +# handling of linguas, tests, handbook etc.
> +ecm-utils_src_prepare() {
> +	debug-print-function ${FUNCNAME} "$@"
> +
> +	cmake-utils_src_prepare
> +
> +	# only build examples when required
> +	if ! { in_iuse examples && use examples; } ; then
> +		cmake_comment_add_subdirectory examples
> +	fi
> +
> +	# only enable handbook when required
> +	if in_iuse handbook && ! use handbook ; then
> +		cmake_comment_add_subdirectory ${ECM_HANDBOOK_DIR}
> +
> +		if [[ ${ECM_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 in_iuse nls && ! use nls ; then
> +		local po
> +		for po in ${ECM_PO_DIRS}; do
> +			if [[ -d ${po} ]] ; then

Do you have a valid case for ${po} not being a directory?  If not,
I think the whole thing could be simplified to:

rm -rf ${ECM_PO_DIRS}

> +				rm -r ${po} || die
> +			fi
> +		done
> +	fi
> +
> +	# 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 ${ECM_PO_DIRS}; do
> +		if [[ -d ${po} ]] ; then

Missing indent?

> +			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
> +			done
> +			popd > /dev/null || die
> +		fi
> +		done
> +	fi
> +

Overall, I find this whole thing disgusting and fragile but up to you.

> 

-- 
Best regards,
Michał Górny


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 618 bytes --]

  parent reply	other threads:[~2019-11-05 21:20 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-24 17:17 [gentoo-dev] [PATCH] font.eclass: Port to EAPI-7 Andreas Sturmlechner
2019-03-24 18:41 ` Michał Górny
2019-04-09 19:41   ` Andreas Sturmlechner
2019-04-10 13:21     ` Michał Górny
2019-10-15 21:58       ` [gentoo-dev] [PATCH v2] " Andreas Sturmlechner
2019-10-15 22:05       ` Andreas Sturmlechner
2019-10-16  6:52         ` Michał Górny
2019-10-16 12:01       ` [gentoo-dev] [PATCH 1/2] kde.org.eclass: New eclass, split from kde5.eclass Andreas Sturmlechner
2019-10-16 12:01       ` [gentoo-dev] [PATCH 2/2] kde5.eclass: Inherit kde.org.eclass and drop moved functions/vars Andreas Sturmlechner
2019-11-04 23:30       ` [gentoo-dev] [PATCH 1/3] ecm-utils.eclass: New eclass Andreas Sturmlechner
2019-11-04 23:37         ` [gentoo-dev] [PATCH 2/3] kde5.eclass: Inherit ecm-utils.eclass and drop moved functions/vars Andreas Sturmlechner
2019-11-04 23:42           ` [gentoo-dev] [PATCH 3/3] kde5-functions.eclass: Drop functions/vars moved to ecm-utils Andreas Sturmlechner
2019-11-05 21:20         ` Michał Górny [this message]
2019-11-06  1:19           ` [gentoo-dev] [PATCH 1/3] ecm-utils.eclass: New eclass Andreas Sturmlechner
2019-11-06  7:15             ` Michał Górny
2019-11-10 13:27               ` [gentoo-dev] [PATCH v2 1/3] ecm.eclass: " Andreas Sturmlechner
2019-11-10 16:26                 ` Gokturk Yuksek
2019-07-08 20:14   ` [gentoo-dev] [PATCH] profiles: desktop: Add USE icu to make.defaults Andreas Sturmlechner
2019-07-08 20:14   ` Andreas Sturmlechner
2019-07-08 20:14   ` Andreas Sturmlechner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=759405ee4e4ae48d65cbac336e23f91ceec53ea1.camel@gentoo.org \
    --to=mgorny@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox