1
0
Эх сурвалжийг харах

FindPython: python_add_library can now manage SOABI suffix.

Fixes: #20408
Marc Chevrier 5 жил өмнө
parent
commit
0c97b73bc0

+ 3 - 1
Help/release/3.17.rst

@@ -179,7 +179,9 @@ Modules
 
 
 * The :module:`FindPython3` and :module:`FindPython` modules gained,
 * The :module:`FindPython3` and :module:`FindPython` modules gained,
   respectively, variable ``Python3_SOABI`` and ``Python_SOABI`` giving
   respectively, variable ``Python3_SOABI`` and ``Python_SOABI`` giving
-  the standard extension suffix for modules.
+  the standard extension suffix for modules. Moreover, commands
+  ``Python3_add_library`` and ``Python_add_library`` gained the option
+  ``WITH_SOABI`` to prefix the library suffix with the value of ``SOABI``.
 
 
 * The :module:`FindLibXml2` module now provides an imported target for the
 * The :module:`FindLibXml2` module now provides an imported target for the
   ``xmllint`` executable
   ``xmllint`` executable

+ 6 - 2
Modules/FindPython.cmake

@@ -297,9 +297,13 @@ This module defines the command ``Python_add_library`` (when
 when library type is ``MODULE``, to target ``Python::Module`` and takes care of
 when library type is ``MODULE``, to target ``Python::Module`` and takes care of
 Python module naming rules::
 Python module naming rules::
 
 
-  Python_add_library (my_module MODULE src1.cpp)
+  Python_add_library (<name> [STATIC | SHARED | MODULE [WITH_SOABI]]
+                      <source1> [<source2> ...])
 
 
-If library type is not specified, ``MODULE`` is assumed.
+If the library type is not specified, ``MODULE`` is assumed.
+
+For ``MODULE`` library type, if option ``WITH_SOABI`` is specified, the
+module suffix will include the ``Python_SOABI`` value, if any.
 #]=======================================================================]
 #]=======================================================================]
 
 
 
 

+ 23 - 6
Modules/FindPython/Support.cmake

@@ -2514,15 +2514,21 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
     #
     #
     function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
     function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
       cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
       cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
-        "STATIC;SHARED;MODULE" "" "")
+        "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
 
 
-      unset (type)
-      if (NOT (PYTHON_ADD_LIBRARY_STATIC
-            OR PYTHON_ADD_LIBRARY_SHARED
-            OR PYTHON_ADD_LIBRARY_MODULE))
+      if (prefix STREQUAL "Python2" AND PYTHON_ADD_LIBRARY_WITH_SOABI)
+        message (AUTHOR_WARNING "FindPython2: Option `WITH_SOABI` is not supported for Python2 and will be ignored.")
+        unset (PYTHON_ADD_LIBRARY_WITH_SOABI)
+      endif()
+
+      if (PYTHON_ADD_LIBRARY_STATIC)
+        set (type STATIC)
+      elseif (PYTHON_ADD_LIBRARY_SHARED)
+        set (type SHARED)
+      else()
         set (type MODULE)
         set (type MODULE)
       endif()
       endif()
-      add_library (${name} ${type} ${ARGN})
+      add_library (${name} ${type} ${PYTHON_ADD_LIBRARY_UNPARSED_ARGUMENTS})
 
 
       get_property (type TARGET ${name} PROPERTY TYPE)
       get_property (type TARGET ${name} PROPERTY TYPE)
 
 
@@ -2533,7 +2539,18 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
         if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
         if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
           set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
           set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
         endif()
         endif()
+
+        if (PYTHON_ADD_LIBRARY_WITH_SOABI AND ${prefix}_SOABI)
+          get_property (suffix TARGET ${name} PROPERTY SUFFIX)
+          if (NOT suffix)
+            set (suffix "${CMAKE_SHARED_MODULE_SUFFIX}")
+          endif()
+          set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOABI}${suffix}")
+        endif()
       else()
       else()
+        if (PYTHON_ADD_LIBRARY_WITH_SOABI)
+          message (AUTHOR_WARNING "Find${prefix}: Option `WITH_SOABI` is only supported for `MODULE` library type.")
+        endif()
         target_link_libraries (${name} PRIVATE ${prefix}::Python)
         target_link_libraries (${name} PRIVATE ${prefix}::Python)
       endif()
       endif()
     endfunction()
     endfunction()

+ 3 - 2
Modules/FindPython2.cmake

@@ -240,13 +240,14 @@ setting the following variables:
 Commands
 Commands
 ^^^^^^^^
 ^^^^^^^^
 
 
-This module defines the command ``Python_add_library`` (when
+This module defines the command ``Python2_add_library`` (when
 :prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
 :prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
 :command:`add_library` and adds a dependency to target ``Python2::Python`` or,
 :command:`add_library` and adds a dependency to target ``Python2::Python`` or,
 when library type is ``MODULE``, to target ``Python2::Module`` and takes care
 when library type is ``MODULE``, to target ``Python2::Module`` and takes care
 of Python module naming rules::
 of Python module naming rules::
 
 
-  Python2_add_library (my_module MODULE src1.cpp)
+  Python2_add_library (<name> [STATIC | SHARED | MODULE]
+                       <source1> [<source2> ...])
 
 
 If library type is not specified, ``MODULE`` is assumed.
 If library type is not specified, ``MODULE`` is assumed.
 #]=======================================================================]
 #]=======================================================================]

+ 7 - 3
Modules/FindPython3.cmake

@@ -288,15 +288,19 @@ setting the following variables:
 Commands
 Commands
 ^^^^^^^^
 ^^^^^^^^
 
 
-This module defines the command ``Python_add_library`` (when
+This module defines the command ``Python3_add_library`` (when
 :prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
 :prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
 :command:`add_library` and adds a dependency to target ``Python3::Python`` or,
 :command:`add_library` and adds a dependency to target ``Python3::Python`` or,
 when library type is ``MODULE``, to target ``Python3::Module`` and takes care
 when library type is ``MODULE``, to target ``Python3::Module`` and takes care
 of Python module naming rules::
 of Python module naming rules::
 
 
-  Python3_add_library (my_module MODULE src1.cpp)
+  Python3_add_library (<name> [STATIC | SHARED | MODULE [WITH_SOABI]]
+                       <source1> [<source2> ...])
 
 
-If library type is not specified, ``MODULE`` is assumed.
+If the library type is not specified, ``MODULE`` is assumed.
+
+For ``MODULE`` library type, if option ``WITH_SOABI`` is specified, the
+module suffix will include the ``Python3_SOABI`` value, if any.
 #]=======================================================================]
 #]=======================================================================]
 
 
 
 

+ 10 - 0
Tests/FindPython/SOABI/CMakeLists.txt

@@ -10,3 +10,13 @@ endif()
 if(NOT DEFINED Python3_SOABI)
 if(NOT DEFINED Python3_SOABI)
   message(FATAL_ERROR "Python3_SOABI for ${CMake_TEST_FindPython_COMPONENT} not found")
   message(FATAL_ERROR "Python3_SOABI for ${CMake_TEST_FindPython_COMPONENT} not found")
 endif()
 endif()
+
+if (Python3_Development_FOUND AND Python3_SOABI)
+  Python3_add_library (spam3 MODULE WITH_SOABI ../spam.c)
+  target_compile_definitions (spam3 PRIVATE PYTHON3)
+
+  get_property (suffix TARGET spam3 PROPERTY SUFFIX)
+  if (NOT suffix MATCHES "^.${Python3_SOABI}")
+    message(FATAL_ERROR "Module suffix do not include Python3_SOABI")
+  endif()
+endif()