Skip to content

Commit 7dcffee

Browse files
committed
fix: use classic extension handling unless otherwise requested
1 parent 72b06b8 commit 7dcffee

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

tools/pybind11NewTools.cmake

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,18 @@ if(PYBIND11_MASTER_PROJECT)
7171
endif()
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"
76+
"import sys; sys.exit(1 - hasattr(sys, 'gettotalrefcount'))"
77+
RESULT_VARIABLE PYTHON_IS_DEBUG)
78+
79+
# Get the suffix - SO is deprecated, should use EXT_SUFFIX, but this is
80+
# required for PyPy3 (as of 7.3.1)
81+
execute_process(
82+
COMMAND "${${_Python}_EXECUTABLE}" "-c"
83+
"from distutils import sysconfig; print(sysconfig.get_config_var('SO'))"
84+
OUTPUT_VARIABLE PYTHON_MODULE_EXTENSION
85+
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
7686

7787
# Python debug libraries expose slightly different objects before 3.8
7888
# https://docs.python.org/3.6/c-api/intro.html#debugging-builds
@@ -121,8 +131,11 @@ else()
121131
PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python_link_helper)
122132
endif()
123133

134+
# WITHOUT_SOABI and WITH_SOABI will disable the custom extension handling used by pybind11.
135+
# WITH_SOABI is passed on to python_add_library.
124136
function(pybind11_add_module target_name)
125-
cmake_parse_arguments(PARSE_ARGV 1 ARG "STATIC;SHARED;MODULE;THIN_LTO;NO_EXTRAS" "" "")
137+
cmake_parse_arguments(PARSE_ARGV 1 ARG "STATIC;SHARED;MODULE;THIN_LTO;NO_EXTRAS;WITHOUT_SOABI"
138+
"" "")
126139

127140
if(ARG_ADD_LIBRARY_STATIC)
128141
set(type STATIC)
@@ -133,11 +146,11 @@ function(pybind11_add_module target_name)
133146
endif()
134147

135148
if("${_Python}" STREQUAL "Python")
136-
python_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS})
149+
python_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS})
137150
elseif("${_Python}" STREQUAL "Python3")
138-
python3_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS})
151+
python3_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS})
139152
elseif("${_Python}" STREQUAL "Python2")
140-
python2_add_library(${target_name} ${type} WITH_SOABI ${ARG_UNPARSED_ARGUMENTS})
153+
python2_add_library(${target_name} ${type} ${ARG_UNPARSED_ARGUMENTS})
141154
else()
142155
message(FATAL_ERROR "Cannot detect FindPython version: ${_Python}")
143156
endif()
@@ -161,6 +174,11 @@ function(pybind11_add_module target_name)
161174
set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden"
162175
CUDA_VISIBILITY_PRESET "hidden")
163176

177+
# If we don't pass a WITH_SOABI or WITHOUT_SOABI, use our own default handling of extensions
178+
if(NOT ARG_WITHOUT_SOABI OR "WITH_SOABI" IN_LIST ARG_UNPARSED_ARGUMENTS)
179+
pybind11_extension(${target_name})
180+
endif()
181+
164182
if(ARG_NO_EXTRAS)
165183
return()
166184
endif()
@@ -184,20 +202,7 @@ function(pybind11_add_module target_name)
184202
endfunction()
185203

186204
function(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()
205+
# The extension is precomputed
206+
set_target_properties(${name} PROPERTIES PREFIX "" SUFFIX "${PYTHON_MODULE_EXTENSION}")
192207

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()
203208
endfunction()

0 commit comments

Comments
 (0)