summaryrefslogtreecommitdiff
blob: 943a1897d3de195a80a0d32fd8b25e16e7662fe1 (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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

# TODO: Add PyPy once officially supported. See also:
#     https://bugreports.qt.io/browse/PYSIDE-535
PYTHON_COMPAT=( python3_{10..11} )

inherit cmake python-r1 virtualx

# TODO: Add conditional support for "QtRemoteObjects" via a new "remoteobjects"
# USE flag after an external "dev-qt/qtremoteobjects" package has been created.
# TODO: Add conditional support for apidoc generation via a new "doc" USE flag.
# Note that doing so requires the Qt source tree, sphinx, and graphviz. Once
# ready, pass the ${QT_SRC_DIR} variable to cmake to enable this support.
# TODO: Disable GLES support if the "gles2-only" USE flag is disabled. Note
# that the "PySide6/QtGui/CMakeLists.txt" and
# "PySide6/QtOpenGLFunctions/CMakeLists.txt" files test for GLES support by
# testing whether the "Qt5::Gui" list property defined by
# "/usr/lib64/cmake/Qt5Gui/Qt5GuiConfig.cmake" at "dev-qt/qtgui" installation
# time contains the substring "opengles2". Since cmake does not permit
# properties to be overridden from the command line, these files must instead
# be conditionally patched to avoid these tests. An issue should be filed with
# upstream requesting a CLI-settable variable to control this.

MY_PN="pyside-setup-everywhere-src"

DESCRIPTION="Python bindings for the Qt framework"
HOMEPAGE="https://wiki.qt.io/PySide6"
SRC_URI="https://download.qt.io/official_releases/QtForPython/pyside6/PySide6-${PV}-src/${MY_PN}-${PV}.tar.xz"
S="${WORKDIR}/${MY_PN}-$(ver_cut 1-3)/sources/pyside6"

# See "sources/pyside6/PySide6/licensecomment.txt" for licensing details.
# Shall we allow essential modules to be disabled? They are:
# (core), gui, widgets, printsupport, sql, network, testlib, concurrent,
# x11extras (for X)
LICENSE="|| ( GPL-2 GPL-3+ LGPL-3 )"
SLOT="0"
KEYWORDS="~amd64"
IUSE="
	+dbus charts +concurrent designer gles2-only +gui help multimedia
	+network network-auth +opengl positioning +printsupport qml quick
	quick3d serialport +sql svg test +testlib webchannel webengine
	websockets +widgets +xml
"

# Manually reextract these requirements on version bumps by running the
# following one-liner from within "${S}":
#     $ grep 'set.*_deps' PySide6/Qt*/CMakeLists.txt
# Note that the "designer" USE flag corresponds to the "Qt6UiTools" module.
REQUIRED_USE="${PYTHON_REQUIRED_USE}
	charts? ( gui widgets )
	designer? ( widgets )
	gles2-only? ( gui )
	gui? ( dbus opengl )
	help? ( network sql widgets )
	multimedia? ( gui network )
	network-auth? ( network )
	opengl? ( gui )
	printsupport? ( widgets )
	qml? ( network )
	quick? ( gui network opengl qml )
	quick3d? ( gui network opengl qml quick )
	sql? ( widgets )
	svg? ( gui )
	testlib? ( widgets )
	webchannel? ( qml )
	webengine? ( network gui printsupport quick webchannel )
	websockets? ( network )
	widgets? ( gui )
"

# Tests fail pretty bad and I'm not fixing them right now
RESTRICT="test"

# Minimal supported version of Qt.
QT_PV="$(ver_cut 1-2)*:6"

RDEPEND="${PYTHON_DEPS}
	~dev-python/shiboken6-${PV}[${PYTHON_USEDEP}]
	=dev-qt/qtbase-${QT_PV}[concurrent?,dbus?,gles2-only=,network?,opengl?,sql?,widgets?,xml?]
	charts? ( =dev-qt/qtcharts-${QT_PV} )
	designer? ( =dev-qt/qttools-${QT_PV}[designer] )
	gui? (
		=dev-qt/qtbase-${QT_PV}[gui,jpeg]
		x11-libs/libxkbcommon
	)
	help? ( =dev-qt/qttools-${QT_PV}[assistant] )
	multimedia? ( =dev-qt/qtmultimedia-${QT_PV} )
	network-auth? ( =dev-qt/qtnetworkauth-${QT_PV} )
	positioning? ( =dev-qt/qtpositioning-${QT_PV} )
	printsupport? ( =dev-qt/qtbase-${QT_PV}[gui,widgets] )
	qml? ( =dev-qt/qtdeclarative-${QT_PV}[widgets?] )
	quick3d? ( =dev-qt/qtquick3d-${QT_PV} )
	serialport? ( =dev-qt/qtserialport-${QT_PV} )
	svg? ( =dev-qt/qtsvg-${QT_PV} )
	testlib? ( =dev-qt/qtbase-${QT_PV}[gui] )
	webchannel? ( =dev-qt/qtwebchannel-${QT_PV} )
	webengine? ( =dev-qt/qtwebengine-${QT_PV}[widgets?] )
	websockets? ( =dev-qt/qtwebsockets-${QT_PV} )
"
DEPEND="${RDEPEND}
	test? ( =dev-qt/qtbase-${QT_PV}[gui] )
"
# testlib is toggled by the gui flag on qtbase

PATCHES=(
	"${FILESDIR}/${PN}-6.3.1-no-strip.patch"
	"${FILESDIR}/${PN}-6.3.1-fix-designer-plugin-install-location.patch"
)

src_configure() {
	# See collect_module_if_found macros in PySideHelpers.cmake
	local mycmakeargs=(
		-DBUILD_TESTS=$(usex test)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DAnimation=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DCore=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DExtras=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DInput=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DLogic=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt63DRender=yes
		#-DCMAKE_DISABLE_FIND_PACKAGE_Qt6AxContainer=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Bluetooth=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Charts=$(usex !charts)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Concurrent=$(usex !concurrent)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6DataVisualization=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6DBus=$(usex !dbus)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Designer=$(usex !designer)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Gui=$(usex !gui)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Help=$(usex !help)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6HttpServer=yes
		#-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Location=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Multimedia=$(usex !multimedia)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6MultimediaWidgets=$(usex !multimedia yes $(usex !widgets))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6NetworkAuth=$(usex !network-auth)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Network=$(usex !network)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Nfc=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6OpenGL=$(usex !opengl)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6OpenGLWidgets=$(usex !opengl yes $(usex !widgets))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Pdf=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6PdfWidgets=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Positioning=$(usex !positioning)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6PrintSupport=$(usex !printsupport)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Qml=$(usex !qml)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Quick3D=$(usex !quick3d)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Quick=$(usex !quick)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6QuickControls2=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6QuickWidgets=$(usex !quick yes $(usex !widgets))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6RemoteObjects=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Scxml=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Sensors=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6SerialPort=$(usex !serialport)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6SpatialAudio=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Sql=$(usex !sql)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6StateMachine=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Svg=$(usex !svg)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6SvgWidgets=$(usex !svg yes $(usex !widgets))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Test=$(usex !testlib)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6TextToSpeech=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6UiTools=$(usex !designer)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WebChannel=$(usex !webchannel)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WebEngineCore=$(usex !webengine)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WebEngineQuick=$(usex !webengine yes $(usex !quick))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WebEngineWidgets=$(usex !webengine yes $(usex !widgets))
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WebSockets=$(usex !websockets)
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Widgets=$(usex !widgets)
		#-DCMAKE_DISABLE_FIND_PACKAGE_Qt6WinExtras=yes
		-DCMAKE_DISABLE_FIND_PACKAGE_Qt6Xml=$(usex !xml)
		# try to avoid pre-stripping
		-DQFP_NO_OVERRIDE_OPTIMIZATION_FLAGS=yes
		-DQFP_NO_STRIP=yes

	)

	pyside6_configure() {
		local mycmakeargs=(
			"${mycmakeargs[@]}"
			-DPYTHON_CONFIG_SUFFIX="-${EPYTHON}"
			-DPYTHON_EXECUTABLE="${PYTHON}"
			-DPYTHON_SITE_PACKAGES="$(python_get_sitedir)"
			-DSHIBOKEN_PYTHON_SHARED_LIBRARY_SUFFIX="-${EPYTHON}"
		)
		cmake_src_configure
	}
	python_foreach_impl pyside6_configure
}

src_compile() {
	python_foreach_impl cmake_src_compile
}

src_test() {
	local -x PYTHONDONTWRITEBYTECODE
	python_foreach_impl virtx cmake_src_test
}

src_install() {
	pyside6_install() {
		cmake_src_install
		python_optimize

		# Uniquify the shiboken6 pkgconfig dependency in the PySide6 pkgconfig
		# file for the current Python target. See also:
		#     https://github.com/leycec/raiagent/issues/73
		sed -i -e 's~^Requires: shiboken6$~&-'${EPYTHON}'~' \
			"${ED}/usr/$(get_libdir)"/pkgconfig/${PN}.pc || die

		# Uniquify the PySide6 pkgconfig file for the current Python target,
		# preserving an unversioned "pyside6.pc" file arbitrarily associated
		# with the last Python target. (See the previously linked issue.)
		cp "${ED}/usr/$(get_libdir)"/pkgconfig/${PN}{,-${EPYTHON}}.pc || die
	}
	python_foreach_impl pyside6_install

	# CMakeLists.txt installs a "PySide6Targets-gentoo.cmake" file forcing
	# downstream consumers (e.g., pyside6-tools) to target one
	# "libpyside6-*.so" library linked to one Python interpreter. See also:
	#     https://bugreports.qt.io/browse/PYSIDE-1053
	#     https://github.com/leycec/raiagent/issues/74
	sed -i -e 's~pyside6-python[[:digit:]]\+\.[[:digit:]]\+~pyside6${PYTHON_CONFIG_SUFFIX}~g' \
		"${ED}/usr/$(get_libdir)/cmake/PySide6/PySide6Targets-${CMAKE_BUILD_TYPE,,}.cmake" || die
}