Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 28 |
Nodes: | 6 (0 / 6) |
Uptime: | 55:41:26 |
Calls: | 422 |
Files: | 1,025 |
Messages: | 90,709 |
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.
- 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
---
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:
+# x11@gentoo.org
+# @AUTHOR:
+# Author: Matt Turner <mattst88@gentoo.org>
+# @SUPPORTED_EAPIS: 8
+# @PROVIDES: meson meson-multilib
+# @BLURB: Reduces code duplication in the modularized X11 ebuilds.
+# @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
+# before inheriting this eclass.
+: "${XORG_MULTILIB:="no"}"
+
+inherit flag-o-matic ${GIT_ECLASS}
+unset GIT_ECLASS
+
+[[ ${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
+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 "$@"
+ 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
+}
+
+# @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
+ ! 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
---
eclass/xorg-3.eclass | 4 ++++
1 file changed, 4 insertions(+)
diff --git ./eclass/xorg-3.eclass ./eclass/xorg-3.eclass
index 4947cb86b8b0..81df265c922f 100644
--- ./eclass/xorg-3.eclass
+++ ./eclass/xorg-3.eclass
@@ -285,6 +285,10 @@ xorg-3_reconf_source() {
xorg-3_src_prepare() {
debug-print-function ${FUNCNAME} "$@"
+ if [[ -e meson.build ]]; then
+ eqawarn "Package contains a meson.build and should be migrated to xorg-meson.eclass if possible"
+ fi
+
default
xorg-3_reconf_source
}
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.
- 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
---
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:
+# x11@gentoo.org
+# @AUTHOR:
+# Author: Matt Turner <mattst88@gentoo.org>
+# @SUPPORTED_EAPIS: 8
+# @PROVIDES: meson meson-multilib
+# @BLURB: Reduces code duplication in the modularized X11 ebuilds.
+# @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
+# before inheriting this eclass.
+: "${XORG_MULTILIB:="no"}"
+
+inherit flag-o-matic ${GIT_ECLASS}
+unset GIT_ECLASS
+
+[[ ${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
+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 "$@"
+ 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
+}
+
+# @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
+ ! 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
On Tue, 2025-04-29 at 14:28 -0400, Matt Turner wrote:
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.
- 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
---
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:
+# x11@gentoo.org
+# @AUTHOR:
+# Author: Matt Turner <mattst88@gentoo.org>
+# @SUPPORTED_EAPIS: 8
+# @PROVIDES: meson meson-multilib
+# @BLURB: Reduces code duplication in the modularized X11 ebuilds.
+# @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 +# before inheriting this eclass.
+: "${XORG_MULTILIB:="no"}"
+
+inherit flag-o-matic ${GIT_ECLASS}
+unset GIT_ECLASS
+
+[[ ${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"
At this point, I'd suggest removing COMMON_DEPEND entirely and just
inlining that stuff twice. In the end, xorg-server is explicitly
in RDEPEND already, and listing libpciaccess twice doesn't seem like
a big deal to me.
+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"}"
What if I wanted to name the USE flag 'no'? xP
+
+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
+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
All tags must go before @DESCRIPTION.
+
+# @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 "$@"
+ 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
+}
+
+# @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
Maybe add '&& ! in_iuse doc' to the if?
+ ! 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
|| die
+ rmdir "${D}"/usr{/share{/man,},} 2>/dev/null
I generally prefer 'find -type d -empty -delete || die' over ignoring
errors.
+ fi
+}
+
+fi
+
+EXPORT_FUNCTIONS src_configure src_unpack src_compile src_install
--
Best regards,
Michał Górny
Matt Turner <mattst88@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:
+# x11@gentoo.org
+# @AUTHOR:
+# Author: Matt Turner <mattst88@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