Mailing List Archive

[PATCH gpgme 1/2] build: Support Python 3.10 version detection without distutils
* 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@_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