[PATCH 7/8] Use setup.py from cmake to build the Python bindings
Sebastian Ramacher
sebastian at ramacher.at
Mon Oct 8 19:33:46 UTC 2012
Run the appropriate setup.py targets to build, test and install the Python
bindings from cmake.
Signed-off-by: Sebastian Ramacher <sebastian at ramacher.at>
---
python-bindings/CMakeLists.txt | 61 +++++++++++++++++++++------
python-bindings/setup_py_with_destdir.cmake | 25 +++++++++++
2 files changed, 72 insertions(+), 14 deletions(-)
create mode 100644 python-bindings/setup_py_with_destdir.cmake
diff --git a/python-bindings/CMakeLists.txt b/python-bindings/CMakeLists.txt
index 4200cf4..176a982 100644
--- a/python-bindings/CMakeLists.txt
+++ b/python-bindings/CMakeLists.txt
@@ -1,19 +1,52 @@
-find_package (SWIG REQUIRED)
-include (${SWIG_USE_FILE})
+FIND_PACKAGE(PythonInterp REQUIRED)
-find_package (PythonLibs)
-include_directories (${PYTHON_INCLUDE_PATH})
+# build
-include_directories (${CMAKE_CURRENT_SOURCE_DIR})
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/..)
+FILE(COPY
+ ${CMAKE_CURRENT_SOURCE_DIR}/py-kdtree.hpp.tmpl
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+FILE(COPY
+ ${CMAKE_CURRENT_SOURCE_DIR}/py-kdtree.i.tmpl
+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
-# Build the _kdtree python module
-set_source_files_properties (py-kdtree.i PROPERTIES CPLUSPLUS ON)
-swig_add_module (kdtree python py-kdtree.i)
-swig_link_libraries (kdtree ${PYTHON_LIBRARIES})
+ADD_CUSTOM_COMMAND(OUTPUT py-kdtree.hpp py-kdtree.i
+ COMMAND ${PYTHON_EXECUTABLE}
+ ${CMAKE_SOURCE_DIR}/python-bindings/gen-swig-hpp.py
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ DEPENDS gen-swig-hpp.py py-kdtree.hpp.tmpl py-kdtree.i.tmpl
+)
-# Copy the test file into the build dir
-install (FILES py-kdtree_test.py DESTINATION ${CMAKE_INSTALL_PREFIX}/python)
-install (FILES ${CMAKE_BINARY_DIR}/python-bindings/kdtree.py DESTINATION ${CMAKE_INSTALL_PREFIX}/python)
-install (FILES ${CMAKE_BINARY_DIR}/python-bindings/_kdtree.so DESTINATION ${CMAKE_INSTALL_PREFIX}/python)
+ADD_CUSTOM_COMMAND(OUTPUT _kdtree.so kdtree.py
+ COMMAND ${PYTHON_EXECUTABLE}
+ ${CMAKE_SOURCE_DIR}/python-bindings/setup.py
+ build_ext
+ --include-dir=${CMAKE_SOURCE_DIR}
+ build
+ DEPENDS py-kdtree.hpp py-kdtree.i setup.py
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
+ADD_CUSTOM_TARGET(python-kdtree ALL DEPENDS _kdtree.so kdtree.py)
+
+# install
+
+INSTALL(CODE "execute_process(
+ COMMAND ${CMAKE_COMMAND}
+ -DSETUP_PY=${CMAKE_CURRENT_SOURCE_DIR}/setup.py
+ -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
+ -DPREFIX=${CMAKE_INSTALL_PREFIX}
+ -DWDIR=${CMAKE_CURRENT_BINARY_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/setup_py_with_destdir.cmake)"
+ DEPENDS python-kdtree
+)
+
+# tests
+
+ADD_TEST(NAME python-kdtree
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE}
+ ${CMAKE_CURRENT_SOURCE_DIR}/setup.py test
+)
+SET_TESTS_PROPERTIES(python-kdtree
+ PROPERTIES ENVIRONMENT
+ "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
diff --git a/python-bindings/setup_py_with_destdir.cmake b/python-bindings/setup_py_with_destdir.cmake
new file mode 100644
index 0000000..6114fad
--- /dev/null
+++ b/python-bindings/setup_py_with_destdir.cmake
@@ -0,0 +1,25 @@
+# This is a ugly workaround to be able to pass DESTDIR as --root to setup.py.
+# cmake expands any occurence of $ENV{foo} with the value of foo while runing
+# cmake and not while running make afterwards.
+
+SET(PYTHON_EXECUTABLE "" CACHE FORCE "Python executable")
+SET(PREFIX ${CMAKE_INSTALL_PREFIX} CACHE FORCE "cmake install prefix")
+SET(WDIR "" CACHE FORCE "working directory")
+SET(SETUP_PY "" CACHE FORCE "setup.py path")
+SET(EXTRA_ARGS $ENV{SETUP_PY_EXTRA_ARGS} CACHE FORCE "extra arguments for setup.py")
+
+SET(INSTALL_ROOT $ENV{DESTDIR})
+IF(INSTALL_ROOT)
+ SET(INSTALL_ROOT_ARGS "--root=$ENV{DESTDIR}")
+ELSE(INSTALL_ROOT)
+ SET(INSTALL_ROOT_ARGS "")
+ENDIF(INSTALL_ROOT)
+
+EXECUTE_PROCESS(
+ COMMAND ${PYTHON_EXECUTABLE}
+ ${SETUP_PY}
+ install
+ --prefix=${PREFIX}
+ ${INSTALL_ROOT_ARGS}
+ ${EXTRA_ARGS}
+ WORKING_DIRECTORY ${WDIR})
--
1.7.10.4
More information about the libkdtree-devel
mailing list