Bladeren bron

FindPython: enhance SOABI computation

Fixes: #24121, #23651
Marc Chevrier 2 jaren geleden
bovenliggende
commit
328d847f70
3 gewijzigde bestanden met toevoegingen van 40 en 19 verwijderingen
  1. 5 6
      Modules/FindPython.cmake
  2. 31 8
      Modules/FindPython/Support.cmake
  3. 4 5
      Modules/FindPython3.cmake

+ 5 - 6
Modules/FindPython.cmake

@@ -139,12 +139,11 @@ This module will set the following variables in your project
 
   Extension suffix for modules.
 
-  Information returned by
-  ``distutils.sysconfig.get_config_var('SOABI')`` or computed from
-  ``distutils.sysconfig.get_config_var('EXT_SUFFIX')`` or
-  ``python-config --extension-suffix``. If package ``distutils.sysconfig`` is
-  not available, ``sysconfig.get_config_var('SOABI')`` or
-  ``sysconfig.get_config_var('EXT_SUFFIX')`` are used.
+  Information computed from ``distutils.sysconfig.get_config_var('EXT_SUFFIX')``
+  or ``distutils.sysconfig.get_config_var('SOABI')`` or
+  ``python3-config --extension-suffix``. If package ``distutils.sysconfig`` is
+  not available, ``sysconfig.get_config_var('EXT_SUFFIX')`` or
+  ``sysconfig.get_config_var('SOABI')`` are used.
 
 ``Python_Compiler_FOUND``
   System has the Python compiler.

+ 31 - 8
Modules/FindPython/Support.cmake

@@ -508,21 +508,16 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
         list (REMOVE_DUPLICATES _values)
       endif()
     elseif (NAME STREQUAL "SOABI")
+      # first step: compute SOABI form EXT_SUFFIX config variable
       execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
-                               "import sys\ntry:\n   from distutils import sysconfig\n   sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))\nexcept Exception:\n   import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))"
+                               "import sys\ntry:\n   from distutils import sysconfig\n   sys.stdout.write(sysconfig.get_config_var('EXT_SUFFIX') or '')\nexcept Exception:\n   import sysconfig;sys.stdout.write(sysconfig.get_config_var('EXT_SUFFIX') or '')"
                        RESULT_VARIABLE _result
-                       OUTPUT_VARIABLE _soabi
+                       OUTPUT_VARIABLE _values
                        ERROR_QUIET
                        OUTPUT_STRIP_TRAILING_WHITESPACE)
       if (_result)
         unset (_values)
       else()
-        foreach (_item IN LISTS _soabi)
-          if (_item)
-            set (_values "${_item}")
-            break()
-          endif()
-        endforeach()
         if (_values)
           # clean-up: remove prefix character and suffix
           if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$")
@@ -532,6 +527,34 @@ function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
           endif()
         endif()
       endif()
+
+      # second step: use SOABI or SO config variables as fallback
+      if (NOT _values)
+        execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
+          "import sys\ntry:\n   from distutils import sysconfig\n   sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('SO') or '']))\nexcept Exception:\n   import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('SO') or '']))"
+          RESULT_VARIABLE _result
+          OUTPUT_VARIABLE _soabi
+          ERROR_QUIET
+          OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (_result)
+          unset (_values)
+        else()
+          foreach (_item IN LISTS _soabi)
+            if (_item)
+              set (_values "${_item}")
+              break()
+            endif()
+          endforeach()
+          if (_values)
+            # clean-up: remove prefix character and suffix
+            if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$")
+              set(_values "")
+            else()
+              string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
+            endif()
+          endif()
+        endif()
+      endif()
     else()
       set (config_flag "${NAME}")
       if (NAME STREQUAL "CONFIGDIR")

+ 4 - 5
Modules/FindPython3.cmake

@@ -140,12 +140,11 @@ This module will set the following variables in your project
 
   Extension suffix for modules.
 
-  Information returned by
-  ``distutils.sysconfig.get_config_var('SOABI')`` or computed from
-  ``distutils.sysconfig.get_config_var('EXT_SUFFIX')`` or
+  Information computed from ``distutils.sysconfig.get_config_var('EXT_SUFFIX')``
+  or ``distutils.sysconfig.get_config_var('SOABI')`` or
   ``python3-config --extension-suffix``. If package ``distutils.sysconfig`` is
-  not available, ``sysconfig.get_config_var('SOABI')`` or
-  ``sysconfig.get_config_var('EXT_SUFFIX')`` are used.
+  not available, ``sysconfig.get_config_var('EXT_SUFFIX')`` or
+  ``sysconfig.get_config_var('SOABI')`` are used.
 
 ``Python3_Compiler_FOUND``
   System has the Python 3 compiler.