cmake_minimum_required(VERSION 3.15...3.30) function(pybind11_guess_python_module_extension python) # The SETUPTOOLS_EXT_SUFFIX environment variable takes precedence: if(NOT DEFINED PYTHON_MODULE_EXT_SUFFIX AND DEFINED ENV{SETUPTOOLS_EXT_SUFFIX}) message( STATUS "Getting Python extension suffix from ENV{SETUPTOOLS_EXT_SUFFIX}: $ENV{SETUPTOOLS_EXT_SUFFIX}" ) set(PYTHON_MODULE_EXT_SUFFIX "$ENV{SETUPTOOLS_EXT_SUFFIX}" CACHE STRING "Extension suffix for Python extension modules (Initialized from SETUPTOOLS_EXT_SUFFIX)") endif() # If that didn't work, use the Python_SOABI variable: if(NOT DEFINED PYTHON_MODULE_EXT_SUFFIX AND DEFINED ${python}_SOABI) message( STATUS "Determining Python extension suffix based on ${python}_SOABI: ${${python}_SOABI}") # The final extension depends on the system set(_PY_BUILD_EXTENSION "${CMAKE_SHARED_MODULE_SUFFIX}") if(CMAKE_SYSTEM_NAME STREQUAL "Windows") set(_PY_BUILD_EXTENSION ".pyd") endif() # If the SOABI already has an extension, use it as the full suffix # (used for debug versions of Python on Windows) if(${python}_SOABI MATCHES "\\.") set(PYTHON_MODULE_EXT_SUFFIX "${${python}_SOABI}") # If the SOABI is empty, this is usually a bug, but we generate a # correct extension anyway, which is the best we can do elseif("${${python}_SOABI}" STREQUAL "") message( WARNING "${python}_SOABI is defined but empty. You may want to set PYTHON_MODULE_EXT_SUFFIX explicitly." ) set(PYTHON_MODULE_EXT_SUFFIX "${_PY_BUILD_EXTENSION}") # Otherwise, add the system-dependent extension to it else() set(PYTHON_MODULE_EXT_SUFFIX ".${${python}_SOABI}${_PY_BUILD_EXTENSION}") endif() endif() # If we could not deduce the extension suffix, unset the results: if(NOT DEFINED PYTHON_MODULE_EXT_SUFFIX) unset(PYTHON_MODULE_DEBUG_POSTFIX PARENT_SCOPE) unset(PYTHON_MODULE_EXTENSION PARENT_SCOPE) unset(PYTHON_IS_DEBUG PARENT_SCOPE) return() endif() # Sanity checks: if(${python}_SOABI AND NOT (PYTHON_MODULE_EXT_SUFFIX STREQUAL ${python}_SOABI OR PYTHON_MODULE_EXT_SUFFIX MATCHES "\\.${${python}_SOABI}\\.")) message( WARNING "Python extension suffix (${PYTHON_MODULE_EXT_SUFFIX}) does not match ${python}_SOABI (${${python}_SOABI})." ) endif() # Separate file name postfix from extension: (https://github.com/pybind/pybind11/issues/4699) get_filename_component(_PYTHON_MODULE_DEBUG_POSTFIX "${PYTHON_MODULE_EXT_SUFFIX}" NAME_WE) get_filename_component(_PYTHON_MODULE_EXTENSION "${PYTHON_MODULE_EXT_SUFFIX}" EXT) # Try to deduce the debug ABI from the extension suffix: if(NOT DEFINED _PYTHON_IS_DEBUG) if(_PYTHON_MODULE_EXTENSION MATCHES "^\\.(cpython-|cp|pypy)[0-9]+dm?-" OR _PYTHON_MODULE_DEBUG_POSTFIX MATCHES "^_d") set(_PYTHON_IS_DEBUG On) else() set(_PYTHON_IS_DEBUG Off) endif() endif() # Return results set(PYTHON_MODULE_DEBUG_POSTFIX "${_PYTHON_MODULE_DEBUG_POSTFIX}" PARENT_SCOPE) set(PYTHON_MODULE_EXTENSION "${_PYTHON_MODULE_EXTENSION}" PARENT_SCOPE) set(PYTHON_IS_DEBUG "${_PYTHON_IS_DEBUG}" PARENT_SCOPE) endfunction()