summaryrefslogtreecommitdiff
path: root/eclass/xorg-meson.eclass
blob: afb77e34861883cbd2d51443571c9cd65063fd45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# 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 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

inherit flag-o-matic

if [[ ${PV} == *9999* ]]; then
	inherit git-r3
fi

# @ECLASS_VARIABLE: XORG_MULTILIB
# @PRE_INHERIT
# @DESCRIPTION:
# If set to 'yes', multilib support for package will be enabled. Set
# before inheriting this eclass.
: "${XORG_MULTILIB:="no"}"

[[ ${XORG_MULTILIB} == yes ]] && inherit meson-multilib || inherit meson

# @ECLASS_VARIABLE: XORG_BASE_INDIVIDUAL_URI
# @PRE_INHERIT
# @DESCRIPTION:
# Set up SRC_URI for individual 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"
	DEPEND+="  >=x11-base/xorg-server-1.20:=[xorg]"
	RDEPEND+=" >=x11-base/xorg-server-1.20:=[xorg]"
	if [[ ${PN} == xf86-video-* ]]; then
		DEPEND+="  >=x11-libs/libpciaccess-0.14"
		RDEPEND+=" >=x11-libs/libpciaccess-0.14"
	fi
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

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
# @INTERNAL
# @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
# @DEFAULT_UNSET
# @DESCRIPTION:
# Array of an additional options to pass to meson setup.

# @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_install
# @DESCRIPTION:
# Install a built package to ${ED}, 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 ! in_iuse doc && [[ -d "${ED}"/usr/share/man/man3 ]]; then
		eqawarn "ebuild should set XORG_DOC=doc since package installs man3 documentation"
	fi

	if in_iuse doc && ! use doc; then
		rm -rf "${ED}"/usr/share/man/man3 || die
		find "${ED}"/usr -type d -empty -delete || die
	fi
}

fi

EXPORT_FUNCTIONS src_unpack src_configure src_install