From 3bde34af8a84d76744887b2cf10ee4ef36e3925b Mon Sep 17 00:00:00 2001 From: Tim Serong Date: Mon, 17 Dec 2018 22:01:25 +1100 Subject: [PATCH] cmake: remove cython 0.29's subinterpreter check cython 0.29 introduced a check which prevents multiple python subinterpreters from loading the same module: https://github.com/cython/cython/commit/7e27c7c Unfortunately, this completely breaks ceph-mgr. Until we can figure out a better long term solution, this commit removes cython's subinterpreter check, via some careful abuse of the C preprocessor. This works because when cython is invoked, it first generates some C code, then compiles it. We know it's going to generate C code including: int __Pyx_check_single_interpreter(void) { ... } and: if (__Pyx_check_single_interpreter()) return NULL; So, we can do the following: #define void0 dead_function(void) #define __Pyx_check_single_interpreter(ARG)=ARG ## 0 This replaces the call to __Pyx_check_single_interpreter() with a literal 0, removing the subinterpreter check. The void0 dead_function(void) thing is necessary because the __Pyx_check_single_interpreter() macro also clobbers that function definition, so we need to make sure it's replaced with something that works as a function definition. Fixes: https://tracker.ceph.com/issues/37472 Signed-off-by: Tim Serong --- cmake/modules/Distutils.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/modules/Distutils.cmake b/cmake/modules/Distutils.cmake index 272bd10fa700e..5697dff85fe91 100644 --- a/cmake/modules/Distutils.cmake +++ b/cmake/modules/Distutils.cmake @@ -49,6 +49,9 @@ function(distutils_add_cython_module name src) # CMake's implicit conversion between strings and lists is wonderful, isn't it? string(REPLACE " " ";" cflags ${CMAKE_C_FLAGS}) list(APPEND cflags -iquote${CMAKE_SOURCE_DIR}/src/include -w) + # This little bit of magic wipes out __Pyx_check_single_interpreter() + list(APPEND cflags -D'void0=dead_function\(void\)') + list(APPEND cflags -D'__Pyx_check_single_interpreter\(ARG\)=ARG \#\# 0') set(PY_CC ${compiler_launcher} ${CMAKE_C_COMPILER} ${c_compiler_arg1} ${cflags}) set(PY_CXX ${compiler_launcher} ${CMAKE_CXX_COMPILER} ${cxx_compiler_arg1}) set(PY_LDSHARED ${link_launcher} ${CMAKE_C_COMPILER} ${c_compiler_arg1} "-shared") -- 2.39.5