dev-python/shiboken2: add Python 3.11 compatibility

Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James
2022-06-30 13:58:29 +00:00
parent 22422f80d5
commit f83c31ac85
3 changed files with 344 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
The Fedora / upstream fixes (shiboken2-5.15.2-python311.patch) end up breaking
Python 3.8 compatibility (maybe 3.9 too, but didn't get that far).
Wrap them with PY_VERSION_HEX for Python 3.11.
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -366,7 +366,11 @@ SbkObjectType *SbkObject_TypeF(void)
static PyTypeObject *type = nullptr;
if (!type) {
type = reinterpret_cast<PyTypeObject *>(SbkType_FromSpec(&SbkObject_Type_spec));
- Py_SET_TYPE(type, SbkObjectType_TypeF());
+ #if PY_VERSION_HEX < 0x030B00A1
+ Py_TYPE(type) = SbkObjectType_TypeF();
+ #else
+ Py_SET_TYPE(type, SbkObjectType_TypeF());
+ #endif
Py_INCREF(Py_TYPE(type));
type->tp_weaklistoffset = offsetof(SbkObject, weakreflist);
type->tp_dictoffset = offsetof(SbkObject, ob_dict);
@@ -1110,7 +1114,11 @@ introduceWrapperType(PyObject *enclosingObject,
typeSpec->slots[0].pfunc = reinterpret_cast<void *>(baseType ? baseType : SbkObject_TypeF());
PyObject *heaptype = SbkType_FromSpecWithBases(typeSpec, baseTypes);
- Py_SET_TYPE(heaptype, SbkObjectType_TypeF());
+ #if PY_VERSION_HEX < 0x030B00A1
+ Py_TYPE(heaptype) = SbkObjectType_TypeF();
+ #else
+ Py_SET_TYPE(heaptype, SbkObjectType_TypeF());
+ #endif
Py_INCREF(Py_TYPE(heaptype));
auto *type = reinterpret_cast<SbkObjectType *>(heaptype);
#if PY_VERSION_HEX < 0x03000000
--- a/libshiboken/sbkenum.cpp
+++ b/libshiboken/sbkenum.cpp
@@ -741,7 +741,11 @@ newTypeWithName(const char *name,
copyNumberMethods(numbers_fromFlag, newslots, &idx);
newspec.slots = newslots;
auto *type = reinterpret_cast<PyTypeObject *>(SbkType_FromSpec(&newspec));
- Py_SET_TYPE(type, SbkEnumType_TypeF());
+ #if PY_VERSION_HEX < 0x030B00A1
+ Py_TYPE(type) = SbkEnumType_TypeF();
+ #else
+ Py_SET_TYPE(type, SbkEnumType_TypeF());
+ #endif
auto *enumType = reinterpret_cast<SbkEnumType *>(type);
PepType_SETP(enumType)->cppName = cppName;

View File

@@ -0,0 +1,125 @@
https://src.fedoraproject.org/fork/pviktori/rpms/python-pyside2/raw/5da9902bd8732b49eb722d71f306d4ab197c84b8/f/python3.11.patch
https://code.qt.io/cgit/pyside/pyside-setup.git/patch/?id=52df3b8f64
https://code.qt.io/cgit/pyside/pyside-setup.git/patch/?id=73adefe22f
https://code.qt.io/cgit/pyside/pyside-setup.git/patch/?id=a09a1db839
From b64ad27d8dfeeecaaa8a98051252a32c9d998df4 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@qt.io>
Date: Thu, 9 Jun 2022 16:50:41 +0200
Subject: [PATCH] libshiboken: Fix a crash in Shiboken::Object::isValid() for
Python 3.11
The function is passed type objects for class methods, which caused
it to crash.
The first clause did not catch this, and so it was cast to SbkObject
below.
Add a type check to prevent this.
Pick-to: 6.3 6.2 5.15
Task-number: PYSIDE-1960
Change-Id: Icfdd6fefb7156ac5961444bd5395109849a1d66e
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -1468,6 +1468,7 @@ bool setCppPointer(SbkObject *sbkObj, PyTypeObject *desiredType, void *cptr)
bool isValid(PyObject *pyObj)
{
if (!pyObj || pyObj == Py_None
+ || PyType_Check(pyObj) != 0
|| Py_TYPE(Py_TYPE(pyObj)) != SbkObjectType_TypeF()) {
return true;
}
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -366,7 +366,7 @@ SbkObjectType *SbkObject_TypeF(void)
static PyTypeObject *type = nullptr;
if (!type) {
type = reinterpret_cast<PyTypeObject *>(SbkType_FromSpec(&SbkObject_Type_spec));
- Py_TYPE(type) = SbkObjectType_TypeF();
+ Py_SET_TYPE(type, SbkObjectType_TypeF());
Py_INCREF(Py_TYPE(type));
type->tp_weaklistoffset = offsetof(SbkObject, weakreflist);
type->tp_dictoffset = offsetof(SbkObject, ob_dict);
@@ -1110,7 +1110,7 @@ introduceWrapperType(PyObject *enclosingObject,
typeSpec->slots[0].pfunc = reinterpret_cast<void *>(baseType ? baseType : SbkObject_TypeF());
PyObject *heaptype = SbkType_FromSpecWithBases(typeSpec, baseTypes);
- Py_TYPE(heaptype) = SbkObjectType_TypeF();
+ Py_SET_TYPE(heaptype, SbkObjectType_TypeF());
Py_INCREF(Py_TYPE(heaptype));
auto *type = reinterpret_cast<SbkObjectType *>(heaptype);
#if PY_VERSION_HEX < 0x03000000
--- a/libshiboken/sbkenum.cpp
+++ b/libshiboken/sbkenum.cpp
@@ -741,7 +741,7 @@ newTypeWithName(const char *name,
copyNumberMethods(numbers_fromFlag, newslots, &idx);
newspec.slots = newslots;
auto *type = reinterpret_cast<PyTypeObject *>(SbkType_FromSpec(&newspec));
- Py_TYPE(type) = SbkEnumType_TypeF();
+ Py_SET_TYPE(type, SbkEnumType_TypeF());
auto *enumType = reinterpret_cast<SbkEnumType *>(type);
PepType_SETP(enumType)->cppName = cppName;
From a09a1db8391243e6bb290ee66bb6e3afbb114c61 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@qt.io>
Date: Fri, 24 Jun 2022 09:22:01 +0200
Subject: libshiboken: Fix crashes with static strings in Python 3.11
In Python 3.11, some strings come with a refcount above decimal
1000000000, apparently indicating that they are interned. Replace the
mechanism by PyUnicode_InternFromString().
Task-number: PYSIDE-1960
Pick-to: 6.3 6.2 5.15
Change-Id: I6436afee351f89da5814b5d6bc76970b1b508168
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Tismer <tismer@stackless.com>
Upstream: https://code.qt.io/cgit/pyside/pyside-setup.git/commit/?id=a09a1db8391243e6bb290ee66bb6e3afbb114c61
--- a/libshiboken/sbkstring.cpp
+++ b/libshiboken/sbkstring.cpp
@@ -5,8 +5,14 @@
#include "sbkstaticstrings_p.h"
#include "autodecref.h"
-#include <vector>
-#include <unordered_set>
+#if PY_VERSION_HEX >= 0x030B0000 || defined(Py_LIMITED_API)
+# define USE_INTERN_STRINGS
+#endif
+
+#ifndef USE_INTERN_STRINGS
+# include <vector>
+# include <unordered_set>
+#endif
namespace Shiboken
{
@@ -179,6 +185,13 @@ Py_ssize_t len(PyObject *str)
// PyObject *attr = PyObject_GetAttr(obj, name());
//
+#ifdef USE_INTERN_STRINGS
+PyObject *createStaticString(const char *str)
+{
+ return PyUnicode_InternFromString(str);
+}
+#else
+
using StaticStrings = std::unordered_set<PyObject *>;
static void finalizeStaticStrings(); // forward
@@ -225,6 +238,8 @@ PyObject *createStaticString(const char *str)
return result;
}
+#endif // !USE_INTERN_STRINGS
+
///////////////////////////////////////////////////////////////////////
//
// PYSIDE-1019: Helper function for snake_case vs. camelCase names
cgit v1.2.1

View File

@@ -0,0 +1,172 @@
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
# TODO: Split the "/usr/bin/shiboken2" binding generator from the
# "/usr/lib64/libshiboken2-*.so" family of shared libraries. The former
# requires everything (including Clang) at runtime; the latter only requires
# Qt and Python at runtime. Note that "pip" separates these two as well. See:
# https://doc.qt.io/qtforpython/shiboken2/faq.html#is-there-any-runtime-dependency-on-the-generated-binding
# Once split, the PySide2 ebuild should be revised to require
# "/usr/bin/shiboken2" at build time and "libshiboken2-*.so" at runtime.
# TODO: Add PyPy once officially supported. See also:
# https://bugreports.qt.io/browse/PYSIDE-535
PYTHON_COMPAT=( python3_{8..11} )
inherit cmake llvm python-r1 toolchain-funcs
MY_P=pyside-setup-opensource-src-${PV}
DESCRIPTION="Python binding generator for C++ libraries"
HOMEPAGE="https://wiki.qt.io/PySide2"
SRC_URI="https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-${PV}-src/${MY_P}.tar.xz"
S="${WORKDIR}/${MY_P}/sources/shiboken2"
# The "sources/shiboken2/libshiboken" directory is triple-licensed under the
# GPL v2, v3+, and LGPL v3. All remaining files are licensed under the GPL v3
# with version 1.0 of a Qt-specific exception enabling shiboken2 output to be
# arbitrarily relicensed. (TODO)
LICENSE="|| ( GPL-2 GPL-3+ LGPL-3 ) GPL-3"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~x86"
IUSE="+docstrings numpy test vulkan"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
# 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):5"
# Since Clang is required at both build- and runtime, BDEPEND is omitted here.
RDEPEND="${PYTHON_DEPS}
>=dev-qt/qtcore-${QT_PV}
sys-devel/clang:=
sys-devel/clang-runtime:=
docstrings? (
>=dev-libs/libxml2-2.6.32
>=dev-libs/libxslt-1.1.19
>=dev-qt/qtxml-${QT_PV}
>=dev-qt/qtxmlpatterns-${QT_PV}
)
numpy? ( dev-python/numpy[${PYTHON_USEDEP}] )
vulkan? ( dev-util/vulkan-headers )
"
DEPEND="${RDEPEND}
test? ( >=dev-qt/qttest-${QT_PV} )
"
DOCS=( AUTHORS )
PATCHES=(
"${FILESDIR}/${P}-python310.patch"
"${FILESDIR}/${P}-numpy-1.23.patch"
"${FILESDIR}/${P}-python311.patch"
"${FILESDIR}"/${PN}-5.15.2-python311-fixups.patch
)
# Ensure the path returned by get_llvm_prefix() contains clang as well.
llvm_check_deps() {
has_version "sys-devel/clang:${LLVM_SLOT}"
}
src_prepare() {
# TODO: File upstream issue requesting a sane way to disable NumPy support.
if ! use numpy; then
sed -i -e '/\bprint(os\.path\.realpath(numpy))/d' \
libshiboken/CMakeLists.txt || die
fi
# Shiboken2 assumes Vulkan headers live under either "$VULKAN_SDK/include"
# or "$VK_SDK_PATH/include" rather than "${EPREFIX}/usr/include/vulkan".
if use vulkan; then
sed -i -e "s~\bdetectVulkan(&headerPaths);~headerPaths.append(HeaderPath{QByteArrayLiteral(\"${EPREFIX}/usr/include/vulkan\"), HeaderType::System});~" \
ApiExtractor/clangparser/compilersupport.cpp || die
fi
# Shiboken2 assumes the "/usr/lib/clang/${CLANG_NEWEST_VERSION}/include/"
# subdirectory provides Clang builtin includes (e.g., "stddef.h") for the
# currently installed version of Clang, where ${CLANG_NEWEST_VERSION} is
# the largest version specifier that exists under the "/usr/lib/clang/"
# subdirectory. This assumption is false in edge cases, including when
# users downgrade from newer Clang versions but fail to remove those
# versions with "emerge --depclean". See also:
# https://github.com/leycec/raiagent/issues/85
#
# Sadly, the clang-* family of functions exported by the "toolchain-funcs"
# eclass are defective, returning nonsensical placeholder strings if the
# end user has *NOT* explicitly configured their C++ compiler to be Clang.
# PySide2 does *NOT* care whether the end user has done so or not, as
# PySide2 unconditionally requires Clang in either case. See also:
# https://bugs.gentoo.org/619490
sed -i -e 's~(findClangBuiltInIncludesDir())~(QStringLiteral("'"${EPREFIX}"'/usr/lib/clang/'$(CPP=clang clang-fullversion)'/include"))~' \
ApiExtractor/clangparser/compilersupport.cpp || die
cmake_src_prepare
}
src_configure() {
# Minimal tests for now, 2 failing with the extended version
# FIXME Subscripted generics cannot be used with class and instance checks
local mycmakeargs=(
-DBUILD_TESTS=$(usex test)
-DDISABLE_DOCSTRINGS=$(usex !docstrings)
)
shiboken2_configure() {
local mycmakeargs=(
"${mycmakeargs[@]}"
-DPYTHON_CONFIG_SUFFIX="-${EPYTHON}"
-DPYTHON_EXECUTABLE="${PYTHON}"
-DUSE_PYTHON_VERSION="${EPYTHON#python}"
)
# CMakeLists.txt expects LLVM_INSTALL_DIR as an environment variable.
local -x LLVM_INSTALL_DIR="$(get_llvm_prefix)"
cmake_src_configure
}
python_foreach_impl shiboken2_configure
}
src_compile() {
python_foreach_impl cmake_src_compile
}
src_test() {
python_foreach_impl cmake_src_test
}
src_install() {
shiboken2_install() {
cmake_src_install
python_optimize
# Uniquify the "shiboken2" executable for the current Python target,
# preserving an unversioned "shiboken2" file arbitrarily associated
# with the last Python target.
cp "${ED}"/usr/bin/${PN}{,-${EPYTHON}} || die
# Uniquify the Shiboken2 pkgconfig file for the current Python target,
# preserving an unversioned "shiboken2.pc" file arbitrarily associated
# with the last Python target. See also:
# https://github.com/leycec/raiagent/issues/73
cp "${ED}/usr/$(get_libdir)"/pkgconfig/${PN}{,-${EPYTHON}}.pc || die
}
python_foreach_impl shiboken2_install
# CMakeLists.txt installs a "Shiboken2Targets-gentoo.cmake" file forcing
# downstream consumers (e.g., PySide2) to target one "libshiboken2-*.so"
# library and one "shiboken2" executable 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~shiboken2-python[[:digit:]]\+\.[[:digit:]]\+~shiboken2${PYTHON_CONFIG_SUFFIX}~g' \
-e 's~/bin/shiboken2~/bin/shiboken2${PYTHON_CONFIG_SUFFIX}~g' \
"${ED}/usr/$(get_libdir)"/cmake/Shiboken2-${PV}/Shiboken2Targets-${CMAKE_BUILD_TYPE,,}.cmake || die
# Remove the broken "shiboken_tool.py" script. By inspection, this script
# reduces to a noop. Moreover, this script raises the following exception:
# FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/../shiboken_tool.py': '/usr/bin/../shiboken_tool.py'
rm "${ED}"/usr/bin/shiboken_tool.py || die
}