"execute_process(COMMAND ${PYTHON_EXECUTABLE} setup.py install ${options} --root=$DESTDIR
WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")")
endfunction(distutils_install_module)
+
+function(distutils_add_cython_module name src)
+ get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
+ get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
+ set(PY_CC \"${compiler_launcher} ${CMAKE_C_COMPILER}\")
+ set(PY_CXX \"${compiler_launcher} ${CMAKE_CXX_COMPILER}\")
+ set(PY_LDSHARED \"${link_launcher} ${CMAKE_C_COMPILER} -shared\")
+ add_custom_target(${name} ALL
+ COMMAND
+ env
+ CC=${PY_CC}
+ CXX=${PY_CXX}
+ LDSHARED=${PY_LDSHARED}
+ OPT=\"-DNDEBUG -g -fwrapv -O2 -Wall\"
+ LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+ CYTHON_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
+ CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
+ ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${src})
+endfunction(distutils_add_cython_module)
+
+function(distutils_install_cython_module name)
+ install(CODE "
+ set(options --prefix=/usr)
+ if(DEFINED ENV{DESTDIR})
+ if(EXISTS /etc/debian_version)
+ set(options --install-layout=deb)
+ endif()
+ set(root --root=\$ENV{DESTDIR})
+ else()
+ set(options \"--prefix=${CMAKE_INSTALL_PREFIX}\")
+ set(root --root=/)
+ endif()
+ execute_process(
+ COMMAND env
+ CYTHON_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
+ CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
+ ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py
+ build --build-base ${CYTHON_MODULE_DIR} --verbose
+ install \${options} \${root} --verbose
+ --single-version-externally-managed --record /dev/null
+ WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"
+ RESULT_VARIABLE install_res)
+ if(NOT \"\${install_res}\" STREQUAL 0)
+ message(FATAL_ERROR \"Failed to build and install ${name} python module\")
+ endif()
+ ")
+endfunction(distutils_install_cython_module)
# 2) to compile assembly.pyx and something.cpp to assembly.so:
# CYTHON_ADD_MODULE(assembly something.cpp)
-if(NOT CYTHON_INCLUDE_DIRECTORIES)
- set(CYTHON_INCLUDE_DIRECTORIES .)
-endif(NOT CYTHON_INCLUDE_DIRECTORIES)
-
# Cythonizes the .pyx files into .cpp file (but doesn't compile it)
macro(CYTHON_ADD_MODULE_PYX name)
- if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pxd)
- set(DEPENDS ${name}.pyx ${name}.pxd)
- else(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pxd)
- set(DEPENDS ${name}.pyx)
- endif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pxd)
- # Allow the user to specify dependencies as optional arguments
- set(DEPENDS ${DEPENDS} ${ARGN})
- add_custom_command(
- OUTPUT ${name}.cpp
- COMMAND ${CYTHON_BIN}
- ARGS ${CYTHON_FLAGS} -I ${CYTHON_INCLUDE_DIRECTORIES} -o ${name}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pyx
- DEPENDS ${DEPENDS}
- COMMENT "Cythonizing ${name}.pyx")
+ set(depends ${name}.pyx)
+ if(CYTHON_INCLUDE_DIRECTORIES)
+ foreach(dir ${CYTHON_INCLUDE_DIRECTORIES})
+ file(GLOB pxd_srcs ${CYTHON_INCLUDE_DIRECTORIES}/*.pxd)
+ list(APPEND depends ${pxd_srcs})
+ endforeach()
+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pxd)
+ list(APPEND depends ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pxd)
+ set(CYTHON_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
+ endif()
+ # Allow the user to specify dependencies as optional arguments
+ list(APPEND depends ${ARGN})
+ add_custom_command(
+ OUTPUT ${name}.cpp
+ COMMAND ${CYTHON_BIN}
+ ARGS ${CYTHON_FLAGS} -I ${CYTHON_INCLUDE_DIRECTORIES} -o ${name}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${name}.pyx
+ DEPENDS ${depends}
+ COMMENT "Cythonizing ${name}.pyx")
endmacro(CYTHON_ADD_MODULE_PYX)
# Cythonizes and compiles a .pyx file
-macro(CYTHON_ADD_MODULE name)
- CYTHON_ADD_MODULE_PYX(${name})
- # We need Python for this:
- find_package(Python REQUIRED)
- add_python_library(${name} ${name}.cpp ${ARGN})
+macro(CYTHON_ADD_MODULE name pyx)
+ CYTHON_ADD_MODULE_PYX(${pyx})
+ add_library(${name} MODULE ${pyx}.cpp)
+ target_include_directories(${name} PRIVATE ${PYTHON_INCLUDE_PATH})
+ target_link_libraries(${name} ${PYTHON_LIBRARIES})
+ set_target_properties(${name} PROPERTIES
+ PREFIX "${PYTHON_MODULE_PREFIX}"
+ OUTPUT_NAME ${pyx})
endmacro(CYTHON_ADD_MODULE)
-
if(NOT PYTHONINTERP_FOUND)
message(FATAL_ERROR "Python 2 interpreter not found.")
endif(NOT PYTHONINTERP_FOUND)
+find_package(PythonLibs REQUIRED)
# if CMAKE_INSTALL_PREFIX is an empty string, must replace
# it with "/" to make PYTHON_INSTALL_TEMPLATE an absolute path to be
+find_package(Cython REQUIRED)
+include(Distutils)
+
set(CYTHON_MODULE_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cython_modules)
-get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
-get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
-set(PY_CC \"${compiler_launcher} ${CMAKE_C_COMPILER}\")
-set(PY_CXX \"${compiler_launcher} ${CMAKE_CXX_COMPILER}\")
-set(PY_LDSHARED \"${link_launcher} ${CMAKE_C_COMPILER} -shared\")
add_subdirectory(rados)
add_subdirectory(rbd)
-add_custom_target(cython_cephfs
- COMMAND
- env
- CC=${PY_CC}
- CXX=${PY_CXX}
- LDSHARED=${PY_LDSHARED}
- OPT=\"-DNDEBUG -g -fwrapv -O2 -Wall\"
- LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
- CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/cephfs
- CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
- python ${CMAKE_SOURCE_DIR}/src/pybind/cephfs/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/cephfs
- DEPENDS rados cephfs)
-
+distutils_add_cython_module(cython_cephfs ${CMAKE_CURRENT_SOURCE_DIR}/cephfs.pyx)
+add_dependencies(cython_cephfs cephfs)
+distutils_install_cython_module(cython_cephfs)
-add_custom_target(cython_rados
- COMMAND
- env
- CC=${PY_CC}
- CXX=${PY_CXX}
- LDSHARED=${PY_LDSHARED}
- OPT=\"-DNDEBUG -g -fwrapv -O2 -Wall\"
- LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
- CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/rados
- CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
- python ${CMAKE_SOURCE_DIR}/src/pybind/rados/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/rados
- DEPENDS rados)
-
+distutils_add_cython_module(cython_rados ${CMAKE_CURRENT_SOURCE_DIR}/rados.pyx)
+add_dependencies(cython_rados rados)
+distutils_install_cython_module(cython_rados)
-add_custom_target(cython_rbd
- COMMAND
- env
- CC=${PY_CC}
- CXX=${PY_CXX}
- LDSHARED=${PY_LDSHARED}
- OPT=\"-DNDEBUG -g -fwrapv -O2 -Wall\"
- LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
- CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/rbd
- CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
- python ${CMAKE_SOURCE_DIR}/src/pybind/rbd/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/rbd
- DEPENDS rbd)
-
+distutils_add_cython_module(cython_rbd ${CMAKE_CURRENT_SOURCE_DIR}/rbd.pyx)
+add_dependencies(cython_rbd rbd)
+distutils_install_cython_module(cython_rbd)