87 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			CMake
		
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			CMake
		
	
	
| 
								 | 
							
								cmake_minimum_required(VERSION 3.5)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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()
							 |