Skip to content

Commit 013e80e

Browse files
committed
Support python stable ABI
1 parent b0f15af commit 013e80e

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ set(CMAKE_CXX_FLAGS_DEBUG ${SYMENGINE_CXX_FLAGS_DEBUG})
2323
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SYMENGINE_CXX_FLAGS}")
2424
include_directories(${SYMENGINE_INCLUDE_DIRS})
2525

26+
set(WITH_PY_LIMITED_API OFF CACHE STRING "Use CPython's limited API")
2627
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
2728
find_package(Python REQUIRED)
2829
find_package(Cython REQUIRED)

cmake/FindPython.cmake

+22-9
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ message(STATUS "Python version: ${PYTHON_VERSION}")
3838
string(REPLACE "." "" PYTHON_VERSION_WITHOUT_DOTS ${PYTHON_VERSION})
3939

4040
if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
41-
FIND_LIBRARY(PYTHON_LIBRARY NAMES
42-
python${PYTHON_VERSION}
43-
python${PYTHON_VERSION}m
44-
python${PYTHON_VERSION_WITHOUT_DOTS}
45-
PATHS ${PYTHON_LIB_PATH} ${PYTHON_PREFIX_PATH}/lib ${PYTHON_PREFIX_PATH}/libs
46-
PATH_SUFFIXES ${CMAKE_LIBRARY_ARCHITECTURE}
47-
NO_DEFAULT_PATH
48-
NO_SYSTEM_ENVIRONMENT_PATH
49-
)
41+
if (WITH_PY_LIMITED_API)
42+
set(PYTHON_LIBRARY_NAMES python3)
43+
else()
44+
set(PYTHON_LIBRARY_NAMES python${PYTHON_VERSION} python${PYTHON_VERSION}m python${PYTHON_VERSION_WITHOUT_DOTS})
45+
endif()
46+
FIND_LIBRARY(PYTHON_LIBRARY NAMES ${PYTHON_LIBRARY_NAMES}
47+
PATHS ${PYTHON_LIB_PATH} ${PYTHON_PREFIX_PATH}/lib ${PYTHON_PREFIX_PATH}/libs
48+
PATH_SUFFIXES ${CMAKE_LIBRARY_ARCHITECTURE}
49+
NO_DEFAULT_PATH
50+
NO_SYSTEM_ENVIRONMENT_PATH
51+
)
5052
endif()
5153

5254
execute_process(
@@ -64,6 +66,12 @@ execute_process(
6466
)
6567
string(STRIP ${PYTHON_EXTENSION_SOABI_tmp} PYTHON_EXTENSION_SOABI_tmp)
6668

69+
if (WITH_PY_LIMITED_API)
70+
if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
71+
set(PYTHON_EXTENSION_SOABI_tmp ".abi3")
72+
endif()
73+
endif()
74+
6775
set(PYTHON_EXTENSION_SOABI ${PYTHON_EXTENSION_SOABI_tmp}
6876
CACHE STRING "Suffix for python extensions")
6977

@@ -130,4 +138,9 @@ macro(ADD_PYTHON_LIBRARY name)
130138
target_link_libraries(${name} ${PYTHON_LIBRARY})
131139
set_target_properties(${name} PROPERTIES SUFFIX ".pyd")
132140
ENDIF()
141+
IF(WITH_PY_LIMITED_API)
142+
target_compile_definitions(${name} PRIVATE
143+
Py_LIMITED_API=${WITH_PY_LIMITED_API}
144+
CYTHON_LIMITED_API=1)
145+
ENDIF()
133146
endmacro(ADD_PYTHON_LIBRARY)

setup.py

+9
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def get_build_dir(dist):
6565
('build-type=', None, 'build type: Release or Debug'),
6666
('define=', 'D',
6767
'options to cmake <var>:<type>=<value>'),
68+
('py-limited-api=', None, 'Use Py_LIMITED_API with given version.'),
6869
]
6970

7071
def _process_define(arg):
@@ -91,6 +92,7 @@ def initialize_options(self):
9192
self.symengine_dir = None
9293
self.generator = None
9394
self.build_type = "Release"
95+
self.py_limited_api = None
9496

9597
def finalize_options(self):
9698
_build_ext.finalize_options(self)
@@ -122,6 +124,13 @@ def cmake_build(self):
122124
cmake_cmd.extend(process_opts(cmake_opts))
123125
if not path.exists(path.join(build_dir, "CMakeCache.txt")):
124126
cmake_cmd.extend(self.get_generator())
127+
128+
if self.py_limited_api:
129+
assert self.py_limited_api.startswith("cp3")
130+
py_ver_minor = int(self.py_limited_api[3:])
131+
h = 3 * 16**6 + py_ver_minor * 16**4
132+
cmake_cmd.append(f"-DWITH_PY_LIMITED_API={h}")
133+
125134
if subprocess.call(cmake_cmd, cwd=build_dir) != 0:
126135
raise OSError("error calling cmake")
127136

0 commit comments

Comments
 (0)