@@ -71,8 +71,17 @@ if(PYBIND11_MASTER_PROJECT)
7171endif ()
7272
7373# Debug check - see https://stackoverflow.com/questions/646518/python-how-to-detect-debug-Interpreter
74- execute_process (COMMAND ${_Python} ::Python -c "import sys; print(hasattr(sys, 'gettotalrefcount'))"
75- OUTPUT_VARIABLE PYTHON_IS_DEBUG)
74+ execute_process (
75+ COMMAND "${${_Python} _EXECUTABLE}" "-c" "import sys; sys.exit(hasattr(sys, 'gettotalrefcount'))"
76+ RESULT_VARIABLE PYTHON_IS_DEBUG)
77+
78+ # Get the suffix - SO is deprecated, should use EXT_SUFFIX, but this is
79+ # required for PyPy3 (as of 7.3.1)
80+ execute_process (
81+ COMMAND "${${_Python} _EXECUTABLE}" "-c"
82+ "from distutils import sysconfig; print(sysconfig.get_config_var('SO'))"
83+ OUTPUT_VARIABLE PYTHON_MODULE_EXTENSION
84+ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
7685
7786# Python debug libraries expose slightly different objects before 3.8
7887# https://docs.python.org/3.6/c-api/intro.html#debugging-builds
@@ -121,8 +130,11 @@ else()
121130 PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python_link_helper)
122131endif ()
123132
133+ # WITHOUT_SOABI and WITH_SOABI will disable the custom extension handling used by pybind11.
134+ # WITH_SOABI is passed on to python_add_library.
124135function (pybind11_add_module target_name)
125- cmake_parse_arguments (PARSE_ARGV 1 ARG "STATIC;SHARED;MODULE;THIN_LTO;NO_EXTRAS" "" "" )
136+ cmake_parse_arguments (PARSE_ARGV 1 ARG "STATIC;SHARED;MODULE;THIN_LTO;NO_EXTRAS;WITHOUT_SOABI"
137+ "" "" )
126138
127139 if (ARG_ADD_LIBRARY_STATIC)
128140 set (type STATIC )
@@ -133,11 +145,11 @@ function(pybind11_add_module target_name)
133145 endif ()
134146
135147 if ("${_Python} " STREQUAL "Python" )
136- python_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS} )
148+ python_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS} )
137149 elseif ("${_Python} " STREQUAL "Python3" )
138- python3_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS} )
150+ python3_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS} )
139151 elseif ("${_Python} " STREQUAL "Python2" )
140- python2_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS} )
152+ python2_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS} )
141153 else ()
142154 message (FATAL_ERROR "Cannot detect FindPython version: ${_Python} " )
143155 endif ()
@@ -161,6 +173,11 @@ function(pybind11_add_module target_name)
161173 set_target_properties (${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden"
162174 CUDA_VISIBILITY_PRESET "hidden" )
163175
176+ # If we don't pass a WITH_SOABI or WITHOUT_SOABI, use our own default handling of extensions
177+ if (NOT ARG_WITHOUT_SOABI OR "WITH_SOABI" IN_LIST ARG_UNPARSED_ARGUMENTS)
178+ pybind11_extension(${target_name} )
179+ endif ()
180+
164181 if (ARG_NO_EXTRAS)
165182 return ()
166183 endif ()
@@ -184,20 +201,7 @@ function(pybind11_add_module target_name)
184201endfunction ()
185202
186203function (pybind11_extension name )
187- set_property (TARGET ${name} PROPERTY PREFIX "" )
188-
189- if (CMAKE_SYSTEM_NAME STREQUAL "Windows" )
190- set_property (TARGET ${name} PROPERTY SUFFIX ".pyd" )
191- endif ()
204+ # The extension is precomputed
205+ set_target_properties (${name} PROPERTIES PREFIX "" SUFFIX "${PYTHON_MODULE_EXTENSION} " )
192206
193- if (${_Python} _SOABI)
194- get_property (
195- suffix
196- TARGET ${name}
197- PROPERTY SUFFIX )
198- if (NOT suffix )
199- set (suffix "${CMAKE_SHARED_MODULE_SUFFIX} " )
200- endif ()
201- set_property (TARGET ${name} PROPERTY SUFFIX ".${${_Python} _SOABI}${suffix} " )
202- endif ()
203207endfunction ()
0 commit comments