]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cmake: remove cython 0.29's subinterpreter check
authorTim Serong <tserong@suse.com>
Mon, 17 Dec 2018 11:01:25 +0000 (22:01 +1100)
committerTim Serong <tserong@suse.com>
Mon, 17 Dec 2018 12:27:06 +0000 (23:27 +1100)
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 <tserong@suse.com>
cmake/modules/Distutils.cmake

index 272bd10fa700e01d808920d481183df308bab06d..5697dff85fe91676ac8c3281b5749f4ffcfda500 100644 (file)
@@ -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")