[PATCH gpgme 1/2] build: Support Python 3.10 version detection without distutils

Ben Greiner code at bnavigator.de
Thu Dec 23 16:33:23 CET 2021


* m4/ax_python_devel.m4: update to serial 23, remove distutils usage

-- 
This version removes the usage of Python distutils where possible.
Python 3.10 deprecated distutils and prints warnings that it will
be removed in Python 3.12

Keep GPGME overrides for finding multiple versions
---
  m4/ax_python_devel.m4 | 123 ++++++++++++++++++++++++++++--------------
  1 file changed, 84 insertions(+), 39 deletions(-)

diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4
index 55f0cfff..f4d20b33 100644
--- a/m4/ax_python_devel.m4
+++ b/m4/ax_python_devel.m4
@@ -1,5 +1,5 @@
  # 
===========================================================================
-#https://www.gnu.org/software/autoconf-archive/ax_python_devel.html
+#https://www.gnu.org/software/autoconf-archive/ax_python_devel.html
  # 
===========================================================================
  #
  # SYNOPSIS
@@ -12,8 +12,8 @@
  #   in your configure.ac.
  #
  #   This macro checks for Python and tries to get the include path to
-#   'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS)
-#   output variables. It also exports $(PYTHON_EXTRA_LIBS) and
+#   'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) 
output
+#   variables. It also exports $(PYTHON_EXTRA_LIBS) and
  #   $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code.
  #
  #   You can search for some particular version of Python by passing a
@@ -67,7 +67,7 @@
  #   modified version of the Autoconf Macro, you may extend this special
  #   exception to the GPL to apply to your modified version as well.

-#serial 17
+#serial 23

  AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL])
  AC_DEFUN([AX_PYTHON_DEVEL],[
@@ -99,7 +99,7 @@ AC_DEFUN([AX_PYTHON_DEVEL],[
  This version of the AC@&t at _PYTHON_DEVEL macro
  doesn't work properly with versions of Python before
  2.1.0. You may need to re-run configure, setting the
-variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG,
+variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG,
  PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
  Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
  to something else than an empty string.
@@ -135,16 +135,25 @@ variable to configure. See ``configure --help'' 
for reference.
      #
      # Check if you have distutils, else fail
      #
-    AC_MSG_CHECKING([for the distutils Python package])
-    ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
-    if test -z "$ac_distutils_result"; then
+    AC_MSG_CHECKING([for the sysconfig Python package])
+    ac_sysconfig_result=`$PYTHON -c "import sysconfig" 2>&1`
+    if test $? -eq 0; then
          AC_MSG_RESULT([yes])
+        IMPORT_SYSCONFIG="import sysconfig"
      else
          AC_MSG_RESULT([no])
-        AC_MSG_ERROR([cannot import Python module "distutils".
+
+        AC_MSG_CHECKING([for the distutils Python package])
+        ac_sysconfig_result=`$PYTHON -c "from distutils import 
sysconfig" 2>&1`
+        if test $? -eq 0; then
+            AC_MSG_RESULT([yes])
+            IMPORT_SYSCONFIG="from distutils import sysconfig"
+        else
+            AC_MSG_ERROR([cannot import Python module "distutils".
  Please check your Python installation. The error was:
-$ac_distutils_result])
-        PYTHON_VERSION=""
+$ac_sysconfig_result])
+            PYTHON_VERSION=""
+        fi
      fi

      #
@@ -152,10 +161,19 @@ $ac_distutils_result])
      #
      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));"`
+        if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+            # sysconfig module has different functions
+            python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_path ('include'));"`
+            plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_path ('platinclude'));"`
+        else
+            # old distutils way
+            python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_python_inc ());"`
+            plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_python_inc (plat_specific=1));"`
+        fi
          if test -n "${python_path}"; then
              if test "${plat_python_path}" != "${python_path}"; then
                  python_path="-I$python_path -I$plat_python_path"
@@ -172,14 +190,14 @@ $ac_distutils_result])
      # Check for Python library path
      #
      AC_MSG_CHECKING([for Python library path])
-    if test -z "$PYTHON_LDFLAGS"; then
+    if test -z "$PYTHON_LIBS"; then
          # (makes two attempts to ensure we've got a version number
          # from the interpreter)
          ac_python_version=`cat<<EOD | $PYTHON -

  # 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)
@@ -197,7 +215,7 @@ EOD`
          # Make the versioning information available to the compiler

          # JW: We don't need it and it interferes with the hack
-        # to detect multiple Pyhton versions
+        # to detect multiple Python versions
          #AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"],
                  #                  [If available, contains the Python 
version number currently in use.])

@@ -205,8 +223,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`
@@ -214,8 +232,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:
@@ -230,44 +248,67 @@ EOD`
          then
              # use the official shared library
              ac_python_library=`echo "$ac_python_library" | sed 
"s/^lib//"`
-            PYTHON_LDFLAGS="-L$ac_python_libdir -l$ac_python_library"
+            PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library"
          else
              # old way: use libpython from python_configdir
              ac_python_libdir=`$PYTHON -c \
-              "from distutils.sysconfig import get_python_lib as f; \
+              "from sysconfig import get_python_lib as f; \
                import os; \
                print (os.path.join(f(plat_specific=1, standard_lib=1), 
'config'));"`
-            PYTHON_LDFLAGS="-L$ac_python_libdir 
-lpython$ac_python_version"
+            PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version"
          fi

-        if test -z "PYTHON_LDFLAGS"; then
+        if test -z "PYTHON_LIBS"; then
              AC_MSG_ERROR([
    Cannot determine location of your Python DSO. Please check it was 
installed with
-  dynamic libraries enabled, or try setting PYTHON_LDFLAGS by hand.
+  dynamic libraries enabled, or try setting PYTHON_LIBS by hand.
              ])
          fi
      fi
-    AC_MSG_RESULT([$PYTHON_LDFLAGS])
-    AC_SUBST([PYTHON_LDFLAGS])
+    AC_MSG_RESULT([$PYTHON_LIBS])
+    AC_SUBST([PYTHON_LIBS])

      #
      # Check for site packages
      #
      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));"`
+        if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+            PYTHON_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_path('purelib'));"`
+        else
+            # distutils.sysconfig way
+            PYTHON_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_python_lib(0,0));"`
+        fi
      fi
      AC_MSG_RESULT([$PYTHON_SITE_PKG])
      AC_SUBST([PYTHON_SITE_PKG])

+    #
+    # Check for platform-specific site packages
+    #
+    AC_MSG_CHECKING([for Python platform specific site-packages path])
+    if test -z "$PYTHON_SITE_PKG"; then
+        if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+            PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_path('platlib'));"`
+        else
+            # distutils.sysconfig way
+            PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                print (sysconfig.get_python_lib(1,0));"`
+        fi
+    fi
+    AC_MSG_RESULT([$PYTHON_PLATFORM_SITE_PKG])
+    AC_SUBST([PYTHON_PLATFORM_SITE_PKG])
+
      #
      # libraries which must be linked in when embedding
      #
      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])
@@ -278,8 +319,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])
@@ -291,8 +332,10 @@ EOD`
      AC_MSG_CHECKING([consistency of all components of python 
development environment])
      # save current global flags
      ac_save_LIBS="$LIBS"
+    ac_save_LDFLAGS="$LDFLAGS"
      ac_save_CPPFLAGS="$CPPFLAGS"
-    LIBS="$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS 
$PYTHON_EXTRA_LIBS"
+    LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS 
$PYTHON_EXTRA_LIBS"
+    LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS"
      CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
      AC_LANG_PUSH([C])
      AC_LINK_IFELSE([
@@ -303,15 +346,17 @@ EOD`
      # turn back to default flags
      CPPFLAGS="$ac_save_CPPFLAGS"
      LIBS="$ac_save_LIBS"
+    LDFLAGS="$ac_save_LDFLAGS"

      AC_MSG_RESULT([$pythonexists])

          if test ! "x$pythonexists" = "xyes"; then
+        # gpgme: only warn here, no error, as we are looking for 
multiple versions
         AC_MSG_WARN([
    Could not link test program to Python. Maybe the main Python library 
has been
    installed in some non-standard library path. If so, pass it to 
configure,
-  via the LDFLAGS environment variable.
-  Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib"
+  via the LIBS environment variable.
+  Example: ./configure LIBS="-L/usr/non-standard-path/python/lib"
============================================================================
     You probably have to install the development version of the Python 
package
     for your distribution.  The exact name of this package varies among 
them.
@@ -323,4 +368,4 @@ EOD`
      #
      # all done!
      #
-])
+])
\ No newline at end of file
-- 2.34.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 236 bytes
Desc: OpenPGP digital signature
URL: <https://lists.gnupg.org/pipermail/gnupg-devel/attachments/20211223/62297310/attachment-0001.sig>


More information about the Gnupg-devel mailing list