diff --git a/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch b/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch new file mode 100644 index 000000000000..11b554151790 --- /dev/null +++ b/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch @@ -0,0 +1,61 @@ +From 64de7911d2938fc3601fec39c08008465b9d4f6f Mon Sep 17 00:00:00 2001 +From: Nick Cao +Date: Tue, 7 Feb 2023 17:12:50 +0800 +Subject: [PATCH] python: enum: fix build for Python 3.11 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Python 3.9 introduced Py_SET_SIZE function to set size instead of +relying on Py_SIZE() as a macro [3.9]. + +Python 3.10 started to encourage to use Py_SET_SIZE instead of +assigning into return value of Py_SIZE [3.10]. + +Python 3.11 flips the switch, turn Py_SIZE into a function [3.11], +thus Py_SIZE(obj) will be a rvalue. We need to use Py_SET_SIZE +to set size now. + +[3.9]: https://docs.python.org/3.9/c-api/structures.html#c.Py_SET_SIZE +[3.10]: https://docs.python.org/3.10/c-api/structures.html#c.Py_SIZE +[3.11]: https://docs.python.org/3.11/c-api/structures.html#c.Py_SIZE + +Adapted from https://github.com/mchehab/zbar/pull/231 + +Signed-off-by: Đoàn Trần Công Danh +Signed-off-by: Nick Cao +--- + python/enum.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/python/enum.c b/python/enum.c +index dfe1b1e..4833a20 100644 +--- a/python/enum.c ++++ b/python/enum.c +@@ -52,7 +52,11 @@ enumitem_new (PyTypeObject *type, + + /* we assume the "fast path" for a single-digit ints (see longobject.c) */ + /* this also holds if we get a small_int preallocated long */ ++#if PY_VERSION_HEX >= 0x030900A4 ++ Py_SET_SIZE(&self->val, Py_SIZE(longval)); ++#else + Py_SIZE(&self->val) = Py_SIZE(longval); ++#endif + self->val.ob_digit[0] = longval->ob_digit[0]; + Py_DECREF(longval); + #else +@@ -143,7 +147,11 @@ zbarEnumItem_New (PyObject *byname, + + /* we assume the "fast path" for a single-digit ints (see longobject.c) */ + /* this also holds if we get a small_int preallocated long */ ++#if PY_VERSION_HEX >= 0x030900A4 ++ Py_SET_SIZE(&self->val, Py_SIZE(longval)); ++#else + Py_SIZE(&self->val) = Py_SIZE(longval); ++#endif + self->val.ob_digit[0] = longval->ob_digit[0]; + Py_DECREF(longval); + +-- +2.39.1 + diff --git a/pkgs/development/python-modules/python-zbar/default.nix b/pkgs/development/python-modules/python-zbar/default.nix index 7ad125b26ef5..178b1899ef51 100644 --- a/pkgs/development/python-modules/python-zbar/default.nix +++ b/pkgs/development/python-modules/python-zbar/default.nix @@ -1,4 +1,10 @@ -{ lib , buildPythonPackage , fetchFromGitHub , pillow , zbar , pytestCheckHook }: +{ lib +, buildPythonPackage +, fetchFromGitHub +, pillow +, zbar +, pytestCheckHook +}: buildPythonPackage rec { pname = "python-zbar"; @@ -12,6 +18,13 @@ buildPythonPackage rec { sha256 = "sha256-FvV7TMc4JbOiRjWLka0IhtpGGqGm5fis7h870OmJw2U="; }; + patches = [ + # python: enum: fix build for Python 3.11 + # https://github.com/mchehab/zbar/pull/231 + # the patch is reworked as it does not cleanly apply + ./0001-python-enum-fix-build-for-Python-3.11.patch + ]; + propagatedBuildInputs = [ pillow ]; buildInputs = [ zbar ];