On Sat, May 3, 2025 at 2:28 AM Sam James <s...@gentoo.org> wrote:
>
> 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.

Agreed. Removed.

> > +# @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//

Thanks, fixed.

> > +# 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.

Sounds good, fixed.

> > +
> > +[[ ${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?

Thanks, fixed.

> > +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.

After removing the src_compile implementation, there are only two
instances so I'll just keep it as-is for now.

> > +     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?)

Ah, good catch. Indeed, we don't need src_test nor src_compile.
Removed src_compile.

> > +# @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

Thanks, fixed.

>
> > +             ! 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

Reply via email to