Browse Source

Merge topic 'FindPython-ABI-handling'

c504b1c638 FindPython: Ensure correct handling of Python_FIND_ABI variable

Acked-by: Kitware Robot <[email protected]>
Merge-request: !11145
Brad King 1 month ago
parent
commit
9af1de9409

+ 15 - 8
Modules/FindPython/Support.cmake

@@ -3001,8 +3001,8 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
                            OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
                            OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
                            ERROR_QUIET
                            ERROR_QUIET
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
                            OUTPUT_STRIP_TRAILING_WHITESPACE)
-          if (_${_PYTHON_PREFIX}_RESULT)
-            # assume ABI is not supported
+          if (_${_PYTHON_PREFIX}_RESULT OR NOT __${_PYTHON_PREFIX}_ABIFLAGS )
+            # assume ABI is not supported or not used
             set (__${_PYTHON_PREFIX}_ABIFLAGS "<none>")
             set (__${_PYTHON_PREFIX}_ABIFLAGS "<none>")
           endif()
           endif()
           if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
           if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
@@ -3947,12 +3947,19 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
       _python_set_development_module_found (SABIModule)
       _python_set_development_module_found (SABIModule)
       _python_set_development_module_found (Embed)
       _python_set_development_module_found (Embed)
     endif()
     endif()
-    if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND
-        (NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS
-          OR (NOT WIN32 AND NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)))
-      set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
-      set (${_PYTHON_PREFIX}_Development.SABIModule_FOUND FALSE)
-      set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
+    if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI)
+      if ((_${_PYTHON_PREFIX}_LIBRARY_RELEASE OR _${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE)
+          AND NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
+        set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
+        set (${_PYTHON_PREFIX}_Development.SABIModule_FOUND FALSE)
+        set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
+      endif()
+      if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND
+          NOT WIN32 AND NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
+        set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
+        set (${_PYTHON_PREFIX}_Development.SABIModule_FOUND FALSE)
+        set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
+      endif()
     endif()
     endif()
   endif()
   endif()
 
 

+ 2 - 0
Tests/RunCMake/FindPython/RunCMakeTest.cmake

@@ -178,6 +178,8 @@ endif()
 if(CMake_TEST_FindPython3_CPython)
 if(CMake_TEST_FindPython3_CPython)
   run_cmake(Python3-BadComponent)
   run_cmake(Python3-BadComponent)
   run_cmake(DifferentComponents)
   run_cmake(DifferentComponents)
+  run_python(SpecifyABI TYPE Python3 VARIANT Python3)
+  run_python(SpecifyABI TYPE Python VARIANT Python.V3 OPTIONS -DPython_REQUESTED_VERSION=3)
   run_python(Python3Module ACTION RUN)
   run_python(Python3Module ACTION RUN)
   if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8)
   if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8)
     run_python(Python3Embedded ACTION RUN)
     run_python(Python3Embedded ACTION RUN)

+ 5 - 0
Tests/RunCMake/FindPython/SpecifyABI.cmake

@@ -0,0 +1,5 @@
+enable_language(C)
+
+set(${PYTHON}_FIND_ABI "ANY;ANY;ANY")
+
+find_package(${PYTHON} REQUIRED COMPONENTS Development.Module)