FindPython: Add Python_SOSABI_PLATFORM variable

This variable gives the SABI module extension which include the
platform triplet.

Fixes: #27997
This commit is contained in:
Marc Chevrier
2026-07-31 16:41:01 +02:00
parent 3d0f2256a6
commit 91e227939c
5 changed files with 91 additions and 13 deletions
+37 -11
View File
@@ -14,6 +14,8 @@ cmake_policy(PUSH)
cmake_policy (SET CMP0124 NEW)
# registry view behavior
cmake_policy (SET CMP0134 NEW)
# return(PROPAGATE)
cmake_policy(SET CMP0140 NEW)
# file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
cmake_policy(SET CMP0159 NEW)
@@ -768,7 +770,7 @@ except Exception:
import sys
import re
import importlib.machinery
sys.stdout.write(next(filter(lambda x: re.search('^\\.abi', x), importlib.machinery.EXTENSION_SUFFIXES)))
sys.stdout.write(';'.join(filter(lambda x: re.search('^\\.abi', x), importlib.machinery.EXTENSION_SUFFIXES)))
]==]
RESULT_VARIABLE _result
OUTPUT_VARIABLE _values
@@ -777,7 +779,7 @@ sys.stdout.write(next(filter(lambda x: re.search('^\\.abi', x), importlib.machin
if (_result)
unset (_values)
else()
string (REGEX REPLACE "^\\.(.+)\\.[^.]+$" "\\1" _values "${_values}")
list (TRANSFORM _values REPLACE "^\\.(.+)\\.[^.]+$" "\\1")
endif()
elseif (NAME STREQUAL "ABIFLAGS" AND WIN32)
# config var ABIFLAGS does not exist for version < 3.14, check GIL specific variable
@@ -851,6 +853,18 @@ except Exception:
set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
endfunction()
function (_PYTHON_GET_SOSABI)
_python_get_config_var (sosabi SOSABI)
if (sosabi MATCHES "(^|.+;)(abi${${_PYTHON_PREFIX}_VERSION_MAJOR}t?)(;.+|$)")
set (${_PYTHON_PREFIX}_SOSABI "${CMAKE_MATCH_2}")
endif()
if (sosabi MATCHES "(^|.+;)(abi${${_PYTHON_PREFIX}_VERSION_MAJOR}t?-[^;]+)(;.+|$)")
set (${_PYTHON_PREFIX}_SOSABI_PLATFORM "${CMAKE_MATCH_2}")
endif()
return (PROPAGATE ${_PYTHON_PREFIX}_SOSABI ${_PYTHON_PREFIX}_SOSABI_PLATFORM)
endfunction()
function (_PYTHON_GET_VERSION)
cmake_parse_arguments (PARSE_ARGV 0 _PGV "LIBRARY;SABI_LIBRARY;INCLUDE" "PREFIX" "")
@@ -1728,6 +1742,7 @@ else()
endif()
unset (${_PYTHON_PREFIX}_SOABI)
unset (${_PYTHON_PREFIX}_SOSABI)
unset (${_PYTHON_PREFIX}_SOSABI_PLATFORM)
unset (${_PYTHON_PREFIX}_FREE_THREADED)
# Windows CPython implementation may be requiring a postfix in debug mode
@@ -2456,11 +2471,12 @@ if ("Interpreter" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_SOSABI)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_SOSABI_PLATFORM)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDLIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_STDARCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITELIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 11 ${_PYTHON_PREFIX}_SITEARCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_STDLIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_STDARCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 11 ${_PYTHON_PREFIX}_SITELIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 12 ${_PYTHON_PREFIX}_SITEARCH)
else()
string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
@@ -2595,11 +2611,11 @@ else:
endif()
_python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
_python_get_config_var (${_PYTHON_PREFIX}_SOSABI SOSABI)
_python_get_sosabi ()
# store properties in the cache to speed-up future searches
set (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
"${${_PYTHON_PREFIX}_INTERPRETER_ID};${${_PYTHON_PREFIX}_VERSION_MAJOR};${${_PYTHON_PREFIX}_VERSION_MINOR};${${_PYTHON_PREFIX}_VERSION_PATCH};${_${_PYTHON_PREFIX}_ARCH};${_${_PYTHON_PREFIX}_ABIFLAGS};${${_PYTHON_PREFIX}_SOABI};${${_PYTHON_PREFIX}_SOSABI};${${_PYTHON_PREFIX}_STDLIB};${${_PYTHON_PREFIX}_STDARCH};${${_PYTHON_PREFIX}_SITELIB};${${_PYTHON_PREFIX}_SITEARCH}" CACHE INTERNAL "${_PYTHON_PREFIX} Properties")
"${${_PYTHON_PREFIX}_INTERPRETER_ID};${${_PYTHON_PREFIX}_VERSION_MAJOR};${${_PYTHON_PREFIX}_VERSION_MINOR};${${_PYTHON_PREFIX}_VERSION_PATCH};${_${_PYTHON_PREFIX}_ARCH};${_${_PYTHON_PREFIX}_ABIFLAGS};${${_PYTHON_PREFIX}_SOABI};${${_PYTHON_PREFIX}_SOSABI};${${_PYTHON_PREFIX}_SOSABI_PLATFORM};${${_PYTHON_PREFIX}_STDLIB};${${_PYTHON_PREFIX}_STDARCH};${${_PYTHON_PREFIX}_SITELIB};${${_PYTHON_PREFIX}_SITEARCH}" CACHE INTERNAL "${_PYTHON_PREFIX} Properties")
else()
unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
@@ -4226,7 +4242,7 @@ if (("Development.Module" IN_LIST ${_PYTHON_BASE}_FIND_COMPONENTS
endif()
if (NOT DEFINED ${_PYTHON_PREFIX}_SOSABI)
_python_get_config_var (${_PYTHON_PREFIX}_SOSABI SOSABI)
_python_get_sosabi()
endif()
if (WIN32 AND NOT DEFINED ${_PYTHON_PREFIX}_DEBUG_POSTFIX)
@@ -4604,7 +4620,7 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
# It is used to build modules for python.
#
function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI" "USE_SABI" "")
cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI;PLATFORM" "USE_SABI" "")
if (PYTHON_ADD_LIBRARY_STATIC)
set (type STATIC)
@@ -4670,6 +4686,12 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
get_property (type TARGET ${name} PROPERTY TYPE)
if (type STREQUAL "MODULE_LIBRARY")
if ((NOT PYTHON_ADD_LIBRARY_USE_SABI OR NOT PYTHON_ADD_LIBRARY_WITH_SOABI)
AND PYTHON_ADD_LIBRARY_PLATFORM)
message (AUTHOR_WARNING "Find${prefix}: Option 'PLATFORM' is only valid with options 'USE_SABI' and 'WITH_SOABI'.")
unset(PYTHON_ADD_LIBRARY_PLATFORM)
endif()
if (PYTHON_ADD_LIBRARY_USE_SABI)
if (${prefix}_FREE_THREADED AND
"${major_version}.${minor_version}" VERSION_GREATER_EQUAL "3.15")
@@ -4703,7 +4725,11 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
if (NOT suffix)
set (suffix "${CMAKE_SHARED_MODULE_SUFFIX}")
endif()
set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOSABI}${suffix}")
if (PYTHON_ADD_LIBRARY_PLATFORM AND ${prefix}_SOSABI_PLATFORM)
set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOSABI_PLATFORM}${suffix}")
else()
set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOSABI}${suffix}")
endif()
endif()
endif()
else()