Przeglądaj źródła

FindPython: fix the definition of SABI artifacts

Fixes: #26881
Marc Chevrier 6 miesięcy temu
rodzic
commit
bd7a27bcc7

+ 8 - 5
Modules/FindPython/Support.cmake

@@ -3214,7 +3214,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
         if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
           # library names
           _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 POSIX LIBRARY)
-          _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 DEBUG)
+          _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 DEBUG LIBRARY)
           # Paths suffixes
           _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} LIBRARY)
 
@@ -3281,7 +3281,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
         else()
           foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
             _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
-            _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
+            _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG LIBRARY)
 
             _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
             _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
@@ -3379,7 +3379,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
     if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
       # search for debug library
       # use release library location as a hint
-      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
+      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG LIBRARY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
       find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
                     NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
@@ -3407,7 +3407,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
                                     PATH_SUFFIXES bin)
     endif()
     if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
-      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
+      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG LIBRARY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
       _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
@@ -3423,7 +3423,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
     if (NOT _${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE)
       ## compute artifact names
       _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} WIN32 POSIX LIBRARY)
-      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} WIN32 DEBUG)
+      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} WIN32 DEBUG LIBRARY)
 
       if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
           AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
@@ -3639,6 +3639,8 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
 
     if (WIN32 AND _${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE)
       # search for debug library
+      # use release library location as a hint
+      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} WIN32 DEBUG LIBRARY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE}" DIRECTORY)
       find_library (_${_PYTHON_PREFIX}_SABI_LIBRARY_DEBUG
                     NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
@@ -3655,6 +3657,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
 
     # retrieve runtime libraries
     if (_${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE)
+      _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} WIN32 POSIX LIBRARY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_SABI_LIBRARY_RELEASE}" DIRECTORY)
       get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
       _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_SABI_LIBRARY_RELEASE

+ 1 - 1
Tests/RunCMake/FindPython/Python3SABIModule.cmake

@@ -33,7 +33,7 @@ if(NOT TARGET Python3::SABIModule)
   message(SEND_ERROR "Python3::SABIModule not found")
 endif()
 
-if (Python3_VERSION VERSION_GREATER_EQUAL "3.2" AND NOT Python3_SOSABI)
+if (Python3_VERSION VERSION_GREATER_EQUAL "3.2" AND NOT DEFINED Python3_SOSABI)
   message(FATAL_ERROR "Python3_SOSABI unexpectedly not defined")
 endif()
 

+ 12 - 0
Tests/RunCMake/FindPython/PythonArtifacts.cmake.in

@@ -14,6 +14,12 @@ if(CHECK_LIBRARY)
     set(Python3_LIBRARY "@USER_LIBRARY@")
   else()
     set(Python3_LIBRARY "@_Python3_LIBRARY_RELEASE@")
+    set(PYTHON_LIBRARY_RELEASE "@_Python3_LIBRARY_RELEASE@")
+    set(PYTHON_LIBRARY_DEBUG "@_Python3_LIBRARY_DEBUG@")
+    if(WIN32)
+      set(PYTHON_RUNTIME_LIBRARY_RELEASE "@_Python3_RUNTIME_LIBRARY_RELEASE@")
+      set(PYTHON_RUNTIME_LIBRARY_DEBUG "@_Python3_RUNTIME_LIBRARY_DEBUG@")
+    endif()
   endif()
 endif()
 if(CHECK_INCLUDE)
@@ -28,5 +34,11 @@ if(CHECK_SABI_LIBRARY)
     set(Python3_SABI_LIBRARY "@USER_LIBRARY@")
   else()
     set(Python3_SABI_LIBRARY "@_Python3_SABI_LIBRARY_RELEASE@")
+    set(PYTHON_SABI_LIBRARY_RELEASE "@_Python3_SABI_LIBRARY_RELEASE@")
+    set(PYTHON_SABI_LIBRARY_DEBUG "@_Python3_SABI_LIBRARY_DEBUG@")
+    if(WIN32)
+      set(PYTHON_RUNTIME_SABI_LIBRARY_RELEASE "@_Python3_RUNTIME_SABI_LIBRARY_RELEASE@")
+      set(PYTHON_RUNTIME_SABI_LIBRARY_DEBUG "@_Python3_RUNTIME_SABI_LIBRARY_DEBUG@")
+    endif()
   endif()
 endif()

+ 18 - 3
Tests/RunCMake/FindPython/RequiredArtifactsCheck.cmake

@@ -31,12 +31,19 @@ if (NOT PYTHON_IS_FOUND AND Python3_FOUND)
   message (FATAL_ERROR "Python3 unexpectedly found")
 endif()
 
-
 if (CHECK_INTERPRETER AND NOT Python3_EXECUTABLE STREQUAL required_interpreter)
   message (FATAL_ERROR "Failed to use input variable Python3_EXECUTABLE")
 endif()
 
-if (CHECK_LIBRARY AND NOT Python3_LIBRARY_RELEASE STREQUAL required_library)
+if (CHECK_LIBRARY AND PYTHON_IS_FOUND AND
+    (NOT Python3_LIBRARY_RELEASE STREQUAL PYTHON_LIBRARY_RELEASE
+      OR (WIN32 AND NOT Python3_RUNTIME_LIBRARY_RELEASE STREQUAL PYTHON_RUNTIME_LIBRARY_RELEASE)
+      OR (PYTHON_LIBRARY_DEBUG AND NOT Python3_LIBRARY_DEBUG STREQUAL PYTHON_LIBRARY_DEBUG)
+      OR (WIN32 AND PYTHON_RUNTIME_LIBRARY_DEBUG AND NOT Python3_RUNTIME_LIBRARY_DEBUG STREQUAL PYTHON_RUNTIME_LIBRARY_DEBUG)))
+  message (FATAL_ERROR "Failed to use input variable Python3_LIBRARY")
+endif()
+if (CHECK_LIBRARY AND NOT PYTHON_IS_FOUND AND
+    NOT Python3_LIBRARY_RELEASE STREQUAL required_library)
   message (FATAL_ERROR "Failed to use input variable Python3_LIBRARY")
 endif()
 
@@ -44,6 +51,14 @@ if (CHECK_INCLUDE AND NOT Python3_INCLUDE_DIRS STREQUAL required_include)
   message (FATAL_ERROR "Failed to use input variable Python3_INCLUDE_DIR")
 endif()
 
-if (CHECK_SABI_LIBRARY AND NOT Python3_SABI_LIBRARY_RELEASE STREQUAL required_sabi_library)
+if (CHECK_SABI_LIBRARY AND PYTHON_IS_FOUND AND
+    (NOT Python3_SABI_LIBRARY_RELEASE STREQUAL PYTHON_SABI_LIBRARY_RELEASE
+      OR (WIN32 AND NOT Python3_RUNTIME_SABI_LIBRARY_RELEASE STREQUAL PYTHON_RUNTIME_SABI_LIBRARY_RELEASE)
+      OR (PYTHON_SABI_LIBRARY_DEBUG AND NOT Python3_SABI_LIBRARY_DEBUG STREQUAL PYTHON_SABI_LIBRARY_DEBUG)
+      OR (WIN32 AND PYTHON_RUNTIME_SABI_LIBRARY_DEBUG AND NOT Python3_RUNTIME_SABI_LIBRARY_DEBUG STREQUAL PYTHON_RUNTIME_SABI_LIBRARY_DEBUG)))
   message (FATAL_ERROR "Failed to use input variable Python3_SABI_LIBRARY")
 endif()
+if (CHECK_SABI_LIBRARY AND NOT PYTHON_IS_FOUND AND
+    NOT Python3_SABI_LIBRARY_RELEASE STREQUAL required_sabi_library)
+    message (FATAL_ERROR "Failed to use input variable Python3_SABI_LIBRARY")
+endif()