diff --git a/CMake/FindNumPy.cmake b/CMake/FindNumPy.cmake index 31b0d052..b5ba8aef 100644 --- a/CMake/FindNumPy.cmake +++ b/CMake/FindNumPy.cmake @@ -16,7 +16,7 @@ FIND_PACKAGE(PythonInterp REQUIRED) # Look for the include path # WARNING: The variable PYTHON_EXECUTABLE is defined by the script FindPythonInterp.cmake -EXECUTE_PROCESS(COMMAND "${PYTHON_EXECUTABLE}" -c "import numpy; print numpy.get_include(); print numpy.version.version" +EXECUTE_PROCESS(COMMAND "${PYTHON_EXECUTABLE}" -c "from __future__ import print_function; import numpy; print(numpy.get_include()); print(numpy.version.version)" OUTPUT_VARIABLE NUMPY_OUTPUT ERROR_VARIABLE NUMPY_ERROR) @@ -30,4 +30,4 @@ INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(NumPy DEFAULT_MSG NUMPY_VERSION NUMPY_INCLUDE_DIR) -MARK_AS_ADVANCED(NUMPY_INCLUDE_DIR) \ No newline at end of file +MARK_AS_ADVANCED(NUMPY_INCLUDE_DIR) diff --git a/Packaging/CMakeLists.txt b/Packaging/CMakeLists.txt index 4ba0be8b..07371400 100644 --- a/Packaging/CMakeLists.txt +++ b/Packaging/CMakeLists.txt @@ -24,5 +24,8 @@ IF(BTK_WRAP_PYTHON) GET_TARGET_PROPERTY(BTK_SWIG_PYTHON_MODULE_LOCATION "_btk" LOCATION) ADD_CUSTOM_TARGET(Package_Python COMMAND ${CMAKE_COMMAND} -D BTK_SWIG_PYTHON_MODULE_LOCATION:STRING=${BTK_SWIG_PYTHON_MODULE_LOCATION} -D ARCH_64_BIT:BOOL=${HAVE_64_BIT} -D BTK_VERSION_STRING:STRING=${BTK_VERSION_STRING} -D BTK_BINARY_DIR:STRING=${BTK_BINARY_DIR} -D BTK_SOURCE_DIR:STRING=${BTK_SOURCE_DIR} -P "${BTK_SOURCE_DIR}/Packaging/Python/btkPackagePythonBinding.cmake") - ADD_DEPENDENCIES(package Package_Python) + ADD_DEPENDENCIES(package Package_Python) + ADD_CUSTOM_TARGET(python-wheel + COMMAND ${CMAKE_COMMAND} -D BTK_VERSION_STRING=${BTK_VERSION_STRING} -D BTK_SOURCE_DIR:STRING=${BTK_SOURCE_DIR} -D BTK_BINARY_DIR:STRING=${BTK_BINARY_DIR} -P "${BTK_SOURCE_DIR}/Packaging/Python/btkPackagePythonWheel.cmake") + ADD_DEPENDENCIES(package python-wheel) ENDIF(BTK_WRAP_PYTHON) diff --git a/Packaging/Python/btkPackagePythonWheel.cmake b/Packaging/Python/btkPackagePythonWheel.cmake new file mode 100644 index 00000000..dc498d80 --- /dev/null +++ b/Packaging/Python/btkPackagePythonWheel.cmake @@ -0,0 +1,44 @@ +SET(CMAKE_MODULE_PATH "${BTK_SOURCE_DIR}/CMake") +FIND_PACKAGE(PythonInterp REQUIRED QUIET) +FIND_PACKAGE(SWIG 2.0 REQUIRED) +FIND_PACKAGE(PythonLibs REQUIRED) +FIND_PACKAGE(NumPy REQUIRED) + +SET(BTK_PYTHON_WRAPPING_SOURCE_DIR "${BTK_SOURCE_DIR}/Wrapping/Python") +SET(BTK_PYTHON_WHEEL_SOURCE_DIR "${BTK_SOURCE_DIR}/Packaging/Python/wheel") +SET(BTK_PYTHON_WHEEL_BINARY_DIR "${BTK_BINARY_DIR}/Packaging/Python/wheel") + +MESSAGE(STATUS "---------------------------") +MESSAGE(STATUS "Packaging Python Wheel ...") +MESSAGE(STATUS "---------------------------") + +FILE(MAKE_DIRECTORY "${BTK_PYTHON_WHEEL_BINARY_DIR}") + +MESSAGE(STATUS "Preparing sources in ${BTK_PYTHON_WHEEL_BINARY_DIR}") + +# btk.py file +FILE(MAKE_DIRECTORY "${BTK_PYTHON_WHEEL_BINARY_DIR}/btk") +FILE(COPY "${BTK_BINARY_DIR}/bin/btk.py" DESTINATION "${BTK_PYTHON_WHEEL_BINARY_DIR}/btk") +FILE(RENAME "${BTK_PYTHON_WHEEL_BINARY_DIR}/btk/btk.py" "${BTK_PYTHON_WHEEL_BINARY_DIR}/btk/__init__.py") + +SET(BTKSWIG_SOURCES + libBTKBasicFilters.a + libBTKCommon.a + libBTKIO.a + btkSwigPYTHON_wrap.cxx) + +# .a files and cxx file +FOREACH(dep IN LISTS BTKSWIG_SOURCES) + MESSAGE(STATUS " - ${dep}") + FILE(COPY "${BTK_BINARY_DIR}/bin/${dep}" DESTINATION "${BTK_PYTHON_WHEEL_BINARY_DIR}") +ENDFOREACH(dep) + + +MESSAGE(STATUS "Creating setup.py for build") +CONFIGURE_FILE(${BTK_PYTHON_WHEEL_SOURCE_DIR}/setup.py.in + ${BTK_PYTHON_WHEEL_BINARY_DIR}/setup.py @ONLY IMMEDIATE) + +# Package files +MESSAGE(STATUS "Creating Python wheel using setup.py bdist_wheel in ${BTK_PYTHON_WHEEL_BINARY_DIR}") +EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} setup.py bdist_wheel + WORKING_DIRECTORY "${BTK_PYTHON_WHEEL_BINARY_DIR}/") diff --git a/Packaging/Python/wheel/setup.py.in b/Packaging/Python/wheel/setup.py.in new file mode 100644 index 00000000..72cdc12e --- /dev/null +++ b/Packaging/Python/wheel/setup.py.in @@ -0,0 +1,50 @@ +# coding=utf-8 +from setuptools import setup, Extension +import glob +import os.path + +version = '@BTK_VERSION_STRING@' + +WRAPPER_SOURCES = '@BTK_PYTHON_WRAPPING_SOURCE_DIR@' +WRAPPER_OBJECTS = '@BTK_PYTHON_WHEEL_BINARY_DIR@' + + +def get_wrapper_sources(): + sources = [ + 'btkBasicFiltersSwig.cpp', + 'btkCommonSwig.cpp', + 'btkIOSwig.cpp' + ] + return [os.path.join(WRAPPER_SOURCES, s) for s in sources] + + +_btk = Extension('_btk', + include_dirs=[ + '.', + '..', + '@CMAKE_CURRENT_SOURCE_DIR@', + '@BTK_BINARY_DIR@', + '@BTK_SOURCE_DIR@/Wrapping/Python/', + '@BTK_SOURCE_DIR@/Code/BasicFilters', + '@BTK_SOURCE_DIR@/Code/Common', + '@BTK_SOURCE_DIR@/Code/IO', + '@BTK_SOURCE_DIR@/Utilities/boost', + '@BTK_SOURCE_DIR@/Utilities/eigen3', + '@BTK_SOURCE_DIR@/Utilities/SWIG', + '@NUMPY_INCLUDE_DIR@' + ], + sources=get_wrapper_sources() + ['btkSwigPYTHON_wrap.cxx'], + extra_objects=['libBTKBasicFilters.a', 'libBTKCommon.a', 'libBTKIO.a']) + + +setup(name='btk', + version=version, + description='BTK Python bindings', + long_description='''@BTK_PYTHON_PACKAGE_LONG_DESCRIPTION@''', + author='Arnaud Barré', + author_email='arnaud.barre@gmail.com', + url='https://code.google.com/p/b-tk/', + license='New BSD License', + packages=['btk'], + setup_requires=['wheel'], + ext_modules=[_btk])