Matt Turner <matts...@gentoo.org> writes: > To be used by X.Org packages with a meson build system. Largely a copy > of xorg-3.eclass with changes necessary to switch from autotools to > meson. > > Compared with xorg-3, I've dropped a few things that I don't think are > necessary (at least initially), namely: > > - font support (media-libs/font-* packages); packages change very > rarely and don't have meson build systems upstream.
Seems reasonable. We can add that later if needed (or give them their own eclass if things necessitated that). > - XORG_DOC dependencies. This actually looks wrong in xorg-3? > - asciidoc is used to generate docbook documentation (which I > don't think we ever do in the ebuilds) > - xmlto is used to create some man pages from XML, but the man pages > are checked into git so we don't ever need to generate them Heh, I think I remember being confused about this before. > --- > eclass/xorg-meson.eclass | 224 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 224 insertions(+) > create mode 100644 eclass/xorg-meson.eclass > > diff --git ./eclass/xorg-meson.eclass ./eclass/xorg-meson.eclass > new file mode 100644 > index 000000000000..5c0a7d582479 > --- /dev/null > +++ ./eclass/xorg-meson.eclass > @@ -0,0 +1,224 @@ > +# Copyright 2025 Gentoo Authors > +# Distributed under the terms of the GNU General Public License v2 > + > +# @ECLASS: xorg-meson.eclass > +# @MAINTAINER: > +# x...@gentoo.org > +# @AUTHOR: > +# Author: Matt Turner <matts...@gentoo.org> > +# @SUPPORTED_EAPIS: 8 > +# @PROVIDES: meson meson-multilib > +# @BLURB: Reduces code duplication in the modularized X11 ebuilds. IMO "modularized" in 2025 looks odd, it's obvious, but feel free to keep it. > +# @DESCRIPTION: > +# This eclass makes trivial X ebuilds possible for apps, drivers, > +# and more. Many things that would normally be done in various functions > +# can be accessed by setting variables instead, such as patching, > +# passing options to meson and installing docs. > +# > +# All you need to do in a basic ebuild is inherit this eclass and set > +# DESCRIPTION, KEYWORDS and RDEPEND/DEPEND. If your package is hosted > +# with the other X packages, you don't need to set SRC_URI. Pretty much > +# everything else should be automatic. > + > +case ${EAPI} in > + 8) ;; > + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; > +esac > + > +if [[ -z ${_XORG_MESON_ECLASS} ]]; then > +_XORG_MESON_ECLASS=1 > + > +GIT_ECLASS="" > +if [[ ${PV} == *9999* ]]; then > + GIT_ECLASS="git-r3" > +fi > + > +# @ECLASS_VARIABLE: XORG_MULTILIB > +# @PRE_INHERIT > +# @DESCRIPTION: > +# If set to 'yes', the multilib support for package will be enabled. Set s/the// > +# before inheriting this eclass. > +: "${XORG_MULTILIB:="no"}" > + > +inherit flag-o-matic ${GIT_ECLASS} > +unset GIT_ECLASS Just call inherit twice (once earlier on), let's not bother with the variable and then having to unset it. > + > +[[ ${XORG_MULTILIB} == yes ]] && inherit meson-multilib || inherit meson > + > +# @ECLASS_VARIABLE: XORG_BASE_INDIVIDUAL_URI > +# @PRE_INHERIT > +# @DESCRIPTION: > +# Set up SRC_URI for individual modular releases. If set to an empty > +# string, no SRC_URI will be provided by the eclass. > +: "${XORG_BASE_INDIVIDUAL_URI="https://www.x.org/releases/individual"}" > + > +# @ECLASS_VARIABLE: XORG_MODULE > +# @PRE_INHERIT > +# @DESCRIPTION: > +# The subdirectory to download source from. Possible settings are app, > +# doc, data, util, driver, font, lib, proto, xserver. Set above the > +# inherit to override the default autoconfigured module. > +: "${XORG_MODULE:="auto"}" > +if [[ ${XORG_MODULE} == auto ]]; then > + case "${CATEGORY}/${P}" in > + app-doc/*) XORG_MODULE=doc/ ;; > + media-fonts/*) XORG_MODULE=font/ ;; > + x11-apps/*|x11-wm/*) XORG_MODULE=app/ ;; > + x11-misc/*|x11-themes/*) XORG_MODULE=util/ ;; > + x11-base/*) XORG_MODULE=xserver/ ;; > + x11-drivers/*) XORG_MODULE=driver/ ;; > + x11-libs/*) XORG_MODULE=lib/ ;; > + *) XORG_MODULE= ;; > + esac > +fi > + > +# @ECLASS_VARIABLE: XORG_PACKAGE_NAME > +# @PRE_INHERIT > +# @DESCRIPTION: > +# For git checkout the git repository might differ from package name. > +# This variable can be used for proper directory specification > +: "${XORG_PACKAGE_NAME:=${PN}}" > + > +HOMEPAGE="https://www.x.org/wiki/ > https://gitlab.freedesktop.org/xorg/${XORG_MODULE}${XORG_PACKAGE_NAME}" > + > +# @ECLASS_VARIABLE: XORG_TARBALL_SUFFIX > +# @PRE_INHERIT > +# @DESCRIPTION: > +# Most X11 projects provide tarballs as tar.xz. This eclass defaults to xz. > +: "${XORG_TARBALL_SUFFIX:="xz"}" > + > +if [[ ${PV} == *9999* ]]; then > + : > "${EGIT_REPO_URI:="https://gitlab.freedesktop.org/xorg/${XORG_MODULE}${XORG_PACKAGE_NAME}.git"}" > +elif [[ -n ${XORG_BASE_INDIVIDUAL_URI} ]]; then > + > SRC_URI="${XORG_BASE_INDIVIDUAL_URI}/${XORG_MODULE}${P}.tar.${XORG_TARBALL_SUFFIX}" > +fi > + > +: "${SLOT:=0}" > + > +# Set the license for the package. This can be overridden by setting > +# LICENSE after the inherit. Nearly all FreeDesktop-hosted X packages > +# are under the MIT license. > +: "${LICENSE:=MIT}" > + > +if [[ ${PN} == xf86-video-* || ${PN} == xf86-input-* ]]; then > + DEPEND+=" x11-base/xorg-proto" > + RDEPEND+=" x11-base/xorg-server:=" > + COMMON_DEPEND+=" >=x11-base/xorg-server-1.20[xorg]" > + [[ ${PN} == xf86-video-* ]] && COMMON_DEPEND+=" > >=x11-libs/libpciaccess-0.14" > +fi > +BDEPEND+=" virtual/pkgconfig" > + > +# @ECLASS_VARIABLE: XORG_DOC > +# @PRE_INHERIT > +# @DESCRIPTION: > +# Controls the installation of man3 developer documentation. Possible values > +# are the name of the useflag or "no". Default value is "no". > +: "${XORG_DOC:="no"}" > + > +case ${XORG_DOC} in > + no) > + ;; > + *) > + IUSE+=" ${XORG_DOC}" > + ;; > +esac > + > +DEPEND+=" ${COMMON_DEPEND}" > +RDEPEND+=" ${COMMON_DEPEND}" > +unset COMMON_DEPEND > + > +debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: DEPEND=${DEPEND}" > +debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: RDEPEND=${RDEPEND}" > +debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: PDEPEND=${PDEPEND}" > +debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: BDEPEND=${BDEPEND}" > + > +# @FUNCTION: xorg-meson_src_unpack > +# @DESCRIPTION: > +# Simply unpack source code. > +xorg-meson_src_unpack() { > + debug-print-function ${FUNCNAME} "$@" > + > + if [[ ${PV} == *9999* ]]; then > + git-r3_src_unpack > + else > + unpack ${A} > + fi > +} > + > +# @FUNCTION: xorg-meson_flags_setup > +# @DESCRIPTION: > +# Set up CFLAGS for a debug build Make this an internal function, maybe? > +xorg-meson_flags_setup() { > + debug-print-function ${FUNCNAME} "$@" > + > + # Hardened flags break module autoloading et al (also fixes #778494) > + if [[ ${PN} == xorg-server || ${PN} == xf86-video-* || ${PN} == > xf86-input-* ]]; then > + filter-flags -fno-plt > + append-ldflags -Wl,-z,lazy > + fi > +} > + > +# @VARIABLE: XORG_CONFIGURE_OPTIONS > +# @DESCRIPTION: > +# Array of an additional options to pass to meson setup. > +# @DEFAULT_UNSET > + > +# @FUNCTION: xorg-meson_src_configure > +# @DESCRIPTION: > +# Perform any necessary pre-configuration steps, then run configure > +xorg-meson_src_configure() { > + debug-print-function ${FUNCNAME} "$@" > + > + xorg-meson_flags_setup > + > + local emesonargs=( > + -Ddefault_library=shared > + "${XORG_CONFIGURE_OPTIONS[@]}" > + ) > + > + if [[ ${XORG_MULTILIB} == yes ]]; then > + meson-multilib_src_configure "$@" If you wanted, you could (earlier on) set ${_XORG_MESON} or something, and then use that like: ${_XORG_MESON}_src_configure ... but who cares. > + else > + meson_src_configure "$@" > + fi > +} > + > +# @FUNCTION: xorg-meson_src_compile > +# @DESCRIPTION: > +# Compile a package, performing all X-related tasks. > +xorg-meson_src_compile() { > + debug-print-function ${FUNCNAME} "$@" > + > + if [[ ${XORG_MULTILIB} == yes ]]; then > + meson-multilib_src_compile "$@" > + else > + meson_src_compile "$@" > + fi > +} > + You're missing src_test? Does it Just Work? (If so, why do we need xorg-meson_src_compile then?) > +# @FUNCTION: xorg-meson_src_install > +# @DESCRIPTION: > +# Install a built package to ${D}, performing any necessary steps. > +xorg-meson_src_install() { > + debug-print-function ${FUNCNAME} "$@" > + > + if [[ ${XORG_MULTILIB} == yes ]]; then > + meson-multilib_src_install "$@" > + else > + meson_src_install "$@" > + fi > + > + # Many X11 libraries unconditionally install developer documentation > + if [[ -d "${D}"/usr/share/man/man3 ]]; then ${ED} and below > + ! in_iuse doc && eqawarn "ebuild should set XORG_DOC=doc since > package installs man3 documentation" > + fi > + > + if in_iuse doc && ! use doc; then > + rm -rf "${D}"/usr/share/man/man3 > + rmdir "${D}"/usr{/share{/man,},} 2>/dev/null > + fi > +} > + > +fi > + > +EXPORT_FUNCTIONS src_configure src_unpack src_compile src_install