]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Python3: replace `distutils` with `sysconfig`
authorDamian Szuberski <szuberskidamian@gmail.com>
Mon, 28 Nov 2022 19:39:41 +0000 (05:39 +1000)
committerGitHub <noreply@github.com>
Mon, 28 Nov 2022 19:39:41 +0000 (11:39 -0800)
- `distutils` module is long time deprecated and already deleted
  from the CPython mainline.

- To remain compatible with Debian/Ubuntu Python3 packaging style,
  try
  `distutils.sysconfig.get_python_path(0,0)`
  first with fallback on
  `sysconfig.get_path('purelib')`

- pyzfs_unittest suite is run unconditionally as a part of ZTS.

- Add pyzfs_unittest suite to sanity tests.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: szubersk <szuberskidamian@gmail.com>
Closes #12833
Closes #13280
Closes #14177

config/ax_python_devel.m4
rpm/generic/zfs.spec.in
tests/runfiles/sanity.run
tests/test-runner/bin/zts-report.py.in
tests/zfs-tests/tests/functional/pyzfs/pyzfs_unittest.ksh.in

index 7adcf01a04cd04445b8cd01efc1aff247d3f0cb4..e6cee04288b877972d0f1889ec2c56d5e8d26917 100644 (file)
@@ -165,31 +165,16 @@ variable to configure. See ``configure --help'' for reference.
                fi
        fi
 
-       #
-       # Check if you have distutils, else fail
-       #
-       AC_MSG_CHECKING([for the distutils Python package])
-       if ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`; then
-               AC_MSG_RESULT([yes])
-       else
-               AC_MSG_RESULT([no])
-               m4_ifvaln([$2],[$2],[
-                       AC_MSG_ERROR([cannot import Python module "distutils".
-Please check your Python installation. The error was:
-$ac_distutils_result])
-                       PYTHON_VERSION=""
-               ])
-       fi
-
        #
        # Check for Python include path
        #
+       #
        AC_MSG_CHECKING([for Python include path])
        if test -z "$PYTHON_CPPFLAGS"; then
-               python_path=`$PYTHON -c "import distutils.sysconfig; \
-                       print (distutils.sysconfig.get_python_inc ());"`
-               plat_python_path=`$PYTHON -c "import distutils.sysconfig; \
-                       print (distutils.sysconfig.get_python_inc (plat_specific=1));"`
+               python_path=`$PYTHON -c "import sysconfig; \
+                       print (sysconfig.get_path('include'));"`
+               plat_python_path=`$PYTHON -c "import sysconfig; \
+                       print (sysconfig.get_path('platinclude'));"`
                if test -n "${python_path}"; then
                        if test "${plat_python_path}" != "${python_path}"; then
                                python_path="-I$python_path -I$plat_python_path"
@@ -213,7 +198,7 @@ $ac_distutils_result])
 
 # join all versioning strings, on some systems
 # major/minor numbers could be in different list elements
-from distutils.sysconfig import *
+from sysconfig import *
 e = get_config_var('VERSION')
 if e is not None:
        print(e)
@@ -236,8 +221,8 @@ EOD`
                ac_python_libdir=`cat<<EOD | $PYTHON -
 
 # There should be only one
-import distutils.sysconfig
-e = distutils.sysconfig.get_config_var('LIBDIR')
+import sysconfig
+e = sysconfig.get_config_var('LIBDIR')
 if e is not None:
        print (e)
 EOD`
@@ -245,8 +230,8 @@ EOD`
                # Now, for the library:
                ac_python_library=`cat<<EOD | $PYTHON -
 
-import distutils.sysconfig
-c = distutils.sysconfig.get_config_vars()
+import sysconfig
+c = sysconfig.get_config_vars()
 if 'LDVERSION' in c:
        print ('python'+c[['LDVERSION']])
 else:
@@ -265,9 +250,9 @@ EOD`
                else
                        # old way: use libpython from python_configdir
                        ac_python_libdir=`$PYTHON -c \
-                         "from distutils.sysconfig import get_python_lib as f; \
+                         "import sysconfig; \
                          import os; \
-                         print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"`
+                         print (os.path.join(sysconfig.get_path('platstdlib'), 'config'));"`
                        PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version"
                fi
 
@@ -289,7 +274,9 @@ EOD`
        AC_MSG_CHECKING([for Python site-packages path])
        if test -z "$PYTHON_SITE_PKG"; then
                PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
-                       print (distutils.sysconfig.get_python_lib(0,0));"`
+                       print (distutils.sysconfig.get_python_lib(0,0));" 2>/dev/null || \
+                       $PYTHON -c "import sysconfig; \
+                       print (sysconfig.get_path('purelib'));"`
        fi
        AC_MSG_RESULT([$PYTHON_SITE_PKG])
        AC_SUBST([PYTHON_SITE_PKG])
@@ -299,8 +286,8 @@ EOD`
        #
        AC_MSG_CHECKING(python extra libraries)
        if test -z "$PYTHON_EXTRA_LIBS"; then
-          PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
-                conf = distutils.sysconfig.get_config_var; \
+          PYTHON_EXTRA_LIBS=`$PYTHON -c "import sysconfig; \
+                conf = sysconfig.get_config_var; \
                 print (conf('LIBS') + ' ' + conf('SYSLIBS'))"`
        fi
        AC_MSG_RESULT([$PYTHON_EXTRA_LIBS])
@@ -311,8 +298,8 @@ EOD`
        #
        AC_MSG_CHECKING(python extra linking flags)
        if test -z "$PYTHON_EXTRA_LDFLAGS"; then
-               PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \
-                       conf = distutils.sysconfig.get_config_var; \
+               PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import sysconfig; \
+                       conf = sysconfig.get_config_var; \
                        print (conf('LINKFORSHARED'))"`
        fi
        AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS])
index aea82d241781f1a3acf2ac36c5f81de01e89cd2b..166411d91ad755a536d9d4591821a01f76c21d74 100644 (file)
@@ -78,7 +78,7 @@
 %define __python                  %{__use_python}
 %define __python_pkg_version      %{__use_python_pkg_version}
 %endif
-%define __python_sitelib          %(%{__python} -Esc "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
+%define __python_sitelib          %(%{__python} -Esc "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 2>/dev/null || %{__python} -Esc "import sysconfig; print(sysconfig.get_path('purelib'))")
 
 Name:           @PACKAGE@
 Version:        @VERSION@
index f115f0b578c6dc8749f6266e04478afa7af1683c..51423966206f8126de2868e91d40359b3a94f2fa 100644 (file)
@@ -624,3 +624,7 @@ tags = ['functional', 'zvol', 'zvol_swap']
 [tests/functional/zpool_influxdb]
 tests = ['zpool_influxdb']
 tags = ['functional', 'zpool_influxdb']
+
+[tests/functional/pyzfs]
+tests = ['pyzfs_unittest']
+tags = ['functional', 'pyzfs']
index e5b1ae0f65e13281cfbe5de3c73ed978b1839d6f..a2324d4b52eafbbf7163a42113a78e8a044cb990 100755 (executable)
@@ -61,14 +61,6 @@ known_reason = 'Known issue'
 #
 exec_reason = 'Test user execute permissions required for utilities'
 
-#
-# Some tests require a minimum python version of 3.6 and will be skipped when
-# the default system version is too old.  There may also be tests which require
-# additional python modules be installed, for example python3-cffi is required
-# by the pyzfs tests.
-#
-python_deps_reason = 'Python modules missing: python3-cffi'
-
 #
 # Some tests require that the kernel supports renameat2 syscall.
 #
@@ -232,7 +224,6 @@ maybe = {
     'io/mmap': ['SKIP', fio_reason],
     'largest_pool/largest_pool_001_pos': ['FAIL', known_reason],
     'mmp/mmp_on_uberblocks': ['FAIL', known_reason],
-    'pyzfs/pyzfs_unittest': ['SKIP', python_deps_reason],
     'pool_checkpoint/checkpoint_discard_busy': ['FAIL', 11946],
     'projectquota/setup': ['SKIP', exec_reason],
     'removal/removal_condense_export': ['FAIL', known_reason],
index d55c4f3270ae049475860fac18ee126b0378367a..7fa14161a538ef17b05ed3bec74ce144e7424925 100755 (executable)
@@ -18,6 +18,8 @@
 
 if [ -n "$ASAN_OPTIONS" ]; then
        export LD_PRELOAD=$(ldd "$(command -v zfs)" | awk '/libasan\.so/ {print $3}')
+       # ASan reports leaks in CPython 3.10
+       ASAN_OPTIONS="$ASAN_OPTIONS:detect_leaks=false"
 fi
 
 #
@@ -30,20 +32,6 @@ fi
 #
 
 verify_runnable "global"
-
-# Verify that the required dependencies for testing are installed.
-@PYTHON@ -c "import cffi" 2>/dev/null ||
-       log_unsupported "python3-cffi not found by Python"
-
-# We don't just try to "import libzfs_core" because we want to skip these tests
-# only if pyzfs was not installed due to missing, build-time, dependencies; if
-# we cannot load "libzfs_core" due to other reasons, for instance an API/ABI
-# mismatch, we want to report it.
-@PYTHON@ -c '
-import pkgutil, sys
-sys.exit(pkgutil.find_loader("libzfs_core") is None)' ||
-       log_unsupported "libzfs_core not found by Python"
-
 log_assert "Verify the nvlist and libzfs_core Python unittest run successfully"
 
 # log_must buffers stderr, which interacts badly with