package/zfs: fix python3 version check

Backport a patch to fix the python 3 version check that
broke the build since the python 3.10 version bump.

Add host-python-packaging dependency since the backport
add "from packaging import version" while checking the
python version.

Fixes:
https://gitlab.com/buildroot.org/buildroot/-/jobs/1935414730
https://gitlab.com/buildroot.org/buildroot/-/jobs/1935415049

Signed-off-by: Romain Naour <romain.naour@gmail.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
This commit is contained in:
Romain Naour 2022-01-03 23:54:50 +01:00 committed by Arnout Vandecappelle (Essensium/Mind)
parent 4cc445fd5f
commit 0197eb3a71
2 changed files with 109 additions and 2 deletions

View file

@ -0,0 +1,106 @@
From 4dc82e9d503518a00e54972be7c0cb5f342f985e Mon Sep 17 00:00:00 2001
From: Rich Ercolani <214141+rincebrain@users.noreply.github.com>
Date: Tue, 8 Jun 2021 20:20:16 -0400
Subject: [PATCH] Correct a flaw in the Python 3 version checking
It turns out the ax_python_devel.m4 version check assumes that
("3.X+1.0" >= "3.X.0") is True in Python, which is not when X+1
is 10 or above and X is not. (Also presumably X+1=100 and ...)
So let's remake the check to behave consistently, using the
"packaging" or (if absent) the "distlib" modules.
(Also, update the Github workflows to use the new packages.)
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: John Kennedy <john.kennedy@delphix.com>
Signed-off-by: Rich Ercolani <rincebrain@gmail.com>
Closes: #12073
(cherry picked from commit 08cd0717359b1a18693e3c8e6d6e5a2819b35a48)
[Romain: drop rpm spec and github workflows changes]
Signed-off-by: Romain Naour <romain.naour@gmail.com>
---
config/always-pyzfs.m4 | 15 +++++++++++++++
config/ax_python_devel.m4 | 33 +++++++++++++++++++++++++++------
2 files changed, 42 insertions(+), 6 deletions(-)
diff --git a/config/always-pyzfs.m4 b/config/always-pyzfs.m4
index 76e07b593..fa39fd885 100644
--- a/config/always-pyzfs.m4
+++ b/config/always-pyzfs.m4
@@ -46,6 +46,21 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYZFS], [
])
AC_SUBST(DEFINE_PYZFS)
+ dnl #
+ dnl # Python "packaging" (or, failing that, "distlib") module is required to build and install pyzfs
+ dnl #
+ AS_IF([test "x$enable_pyzfs" = xcheck -o "x$enable_pyzfs" = xyes], [
+ ZFS_AC_PYTHON_MODULE([packaging], [], [
+ ZFS_AC_PYTHON_MODULE([distlib], [], [
+ AS_IF([test "x$enable_pyzfs" = xyes], [
+ AC_MSG_ERROR("Python $PYTHON_VERSION packaging and distlib modules are not installed")
+ ], [test "x$enable_pyzfs" != xno], [
+ enable_pyzfs=no
+ ])
+ ])
+ ])
+ ])
+
dnl #
dnl # Require python-devel libraries
dnl #
diff --git a/config/ax_python_devel.m4 b/config/ax_python_devel.m4
index c51b45b7d..cdfbbf81f 100644
--- a/config/ax_python_devel.m4
+++ b/config/ax_python_devel.m4
@@ -97,9 +97,18 @@ AC_DEFUN([AX_PYTHON_DEVEL],[
# Check for a version of Python >= 2.1.0
#
AC_MSG_CHECKING([for a version of Python >= '2.1.0'])
- ac_supports_python_ver=`$PYTHON -c "import sys; \
- ver = sys.version.split ()[[0]]; \
- print (ver >= '2.1.0')"`
+ ac_supports_python_ver=`cat<<EOD | $PYTHON -
+from __future__ import print_function;
+import sys;
+try:
+ from packaging import version;
+except ImportError:
+ from distlib import version;
+ver = sys.version.split ()[[0]];
+(tst_cmp, tst_ver) = ">= '2.1.0'".split ();
+tst_ver = tst_ver.strip ("'");
+eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))")
+EOD`
if test "$ac_supports_python_ver" != "True"; then
if test -z "$PYTHON_NOVERSIONCHECK"; then
AC_MSG_RESULT([no])
@@ -126,9 +135,21 @@ to something else than an empty string.
#
if test -n "$1"; then
AC_MSG_CHECKING([for a version of Python $1])
- ac_supports_python_ver=`$PYTHON -c "import sys; \
- ver = sys.version.split ()[[0]]; \
- print (ver $1)"`
+ # Why the strip ()? Because if we don't, version.parse
+ # will, for example, report 3.10.0 >= '3.11.0'
+ ac_supports_python_ver=`cat<<EOD | $PYTHON -
+
+from __future__ import print_function;
+import sys;
+try:
+ from packaging import version;
+except ImportError:
+ from distlib import version;
+ver = sys.version.split ()[[0]];
+(tst_cmp, tst_ver) = "$1".split ();
+tst_ver = tst_ver.strip ("'");
+eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))")
+EOD`
if test "$ac_supports_python_ver" = "True"; then
AC_MSG_RESULT([yes])
else
--
2.31.1

View file

@ -11,6 +11,7 @@ ZFS_LICENSE_FILES = LICENSE COPYRIGHT
ZFS_CPE_ID_VENDOR = openzfs
ZFS_CPE_ID_PRODUCT = openzfs
# 0001-Correct-a-flaw-in-the-Python-3-version-checking.patch
ZFS_AUTORECONF = YES
ZFS_DEPENDENCIES = libaio openssl udev util-linux zlib
@ -39,7 +40,7 @@ endif
# The optional PyZFS uses different scripts depending on the python
# version (ex: arc_summary2 or arc_summary3).
ifeq ($(BR2_PACKAGE_PYTHON),y)
ZFS_DEPENDENCIES += python python-setuptools host-python-cffi
ZFS_DEPENDENCIES += python python-setuptools host-python-cffi host-python-packaging
ZFS_CONF_ENV += \
PYTHON=$(HOST_DIR)/usr/bin/python2 \
PYTHON_CPPFLAGS="`$(STAGING_DIR)/usr/bin/python2-config --includes`" \
@ -47,7 +48,7 @@ ZFS_CONF_ENV += \
PYTHON_SITE_PKG="/usr/lib/python$(PYTHON_VERSION_MAJOR)/site-packages"
ZFS_CONF_OPTS += --enable-pyzfs
else ifeq ($(BR2_PACKAGE_PYTHON3),y)
ZFS_DEPENDENCIES += python3 python-setuptools host-python-cffi
ZFS_DEPENDENCIES += python3 python-setuptools host-python-cffi host-python-packaging
ZFS_CONF_ENV += \
PYTHON=$(HOST_DIR)/usr/bin/python3 \
PYTHON_CPPFLAGS="`$(STAGING_DIR)/usr/bin/python3-config --includes`" \