/config/FindVIGRANUMPY_DEPENDENCIES.cmake

https://github.com/hzg1/vigra · CMake · 174 lines · 107 code · 19 blank · 48 comment · 7 complexity · 31f368888baed325753b3e785c707d5f MD5 · raw file

  1. # - Find VIGRANUMPY_DEPENDENCIES
  2. #
  3. MESSAGE(STATUS "Checking VIGRANUMPY_DEPENDENCIES")
  4. FIND_PACKAGE(PythonInterp)
  5. IF(PYTHONINTERP_FOUND)
  6. # check that Python version 2.x is used
  7. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  8. "import sys; print (sys.version[0])"
  9. OUTPUT_VARIABLE PYTHON_MAJOR_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
  10. IF(${PYTHON_MAJOR_VERSION} EQUAL 2 OR ${PYTHON_MAJOR_VERSION} EQUAL 3)
  11. SET(PYTHONINTERP_V2_FOUND 1)
  12. ELSE()
  13. MESSAGE(STATUS "vigranumpy currently requires Python 2.x. or 3.x.")
  14. MESSAGE(STATUS "Make sure that Python 2 or 3 is in your PATH or use 'cmake_gui' to set the PYTHON_EXECUTABLE variable manually.")
  15. SET(PYTHONINTERP_V2_FOUND 0)
  16. ENDIF()
  17. ELSE()
  18. SET(PYTHONINTERP_V2_FOUND 0)
  19. ENDIF()
  20. IF(PYTHONINTERP_V2_FOUND)
  21. # this command cannot be used because its results are often inconsistent
  22. # with the Python interpreter found previously (e.g. libraries or includes
  23. # from incompatible installations)
  24. # FIND_PACKAGE(PythonLibs)
  25. # find Python library
  26. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  27. "import sys; print (sys.exec_prefix)"
  28. OUTPUT_VARIABLE PYTHON_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
  29. IF(APPLE AND ${PYTHON_PREFIX} MATCHES ".*framework.*")
  30. SET(PYTHON_LIBRARIES "${PYTHON_PREFIX}/Python"
  31. CACHE FILEPATH "Python libraries"
  32. FORCE)
  33. ELSE()
  34. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  35. "import sys; skip = 2 if sys.platform.startswith('win') else 1; print ('python' + sys.version[0:3:skip])"
  36. OUTPUT_VARIABLE PYTHON_LIBRARY_NAME OUTPUT_STRIP_TRAILING_WHITESPACE)
  37. FIND_LIBRARY(PYTHON_LIBRARIES ${PYTHON_LIBRARY_NAME} PATHS "${PYTHON_PREFIX}"
  38. PATH_SUFFIXES lib lib64 libs DOC "Python libraries" NO_DEFAULT_PATH)
  39. ENDIF()
  40. # find Python includes
  41. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  42. "from distutils.sysconfig import *; print (get_python_inc())"
  43. OUTPUT_VARIABLE PYTHON_INCLUDE OUTPUT_STRIP_TRAILING_WHITESPACE)
  44. SET(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE}
  45. CACHE PATH "Path to Python include files"
  46. FORCE)
  47. IF(PYTHON_LIBRARIES AND PYTHON_INCLUDE_PATH)
  48. MESSAGE(STATUS "Found Python libraries: ${PYTHON_LIBRARIES}")
  49. MESSAGE(STATUS "Found Python includes: ${PYTHON_INCLUDE_PATH}")
  50. SET(PYTHONLIBS_FOUND TRUE)
  51. ELSE()
  52. MESSAGE(STATUS "Could NOT find Python libraries and/or includes")
  53. ENDIF()
  54. VIGRA_FIND_PACKAGE( Boost 1.40.0 COMPONENTS python )
  55. ######################################################################
  56. #
  57. # find default install directory for Python modules
  58. # (usually PYTHONDIR/Lib/site-packages)
  59. #
  60. ######################################################################
  61. IF(NOT DEFINED VIGRANUMPY_INSTALL_DIR OR VIGRANUMPY_INSTALL_DIR MATCHES "^$")
  62. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  63. "from distutils.sysconfig import *; print (get_python_lib(1))"
  64. OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
  65. FILE(TO_CMAKE_PATH ${PYTHON_SITE_PACKAGES} VIGRANUMPY_INSTALL_DIR)
  66. ENDIF()
  67. SET(VIGRANUMPY_INSTALL_DIR ${VIGRANUMPY_INSTALL_DIR}
  68. CACHE PATH "where to install the VIGRA Python package" FORCE)
  69. # this is the install path relative to CMAKE_INSTALL_PREFIX,
  70. # use this in INSTALL() commands to get packaging right
  71. FILE(RELATIVE_PATH VIGRANUMPY_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} ${VIGRANUMPY_INSTALL_DIR})
  72. ######################################################################
  73. #
  74. # find numpy include directory
  75. # (usually below PYTHONDIR/Lib/site-packages/numpy)
  76. #
  77. ######################################################################
  78. IF(NOT PYTHON_NUMPY_INCLUDE_DIR)
  79. # Note: we must suppress possible output of the 'from numpy... import *' command,
  80. # because the output cannot be interpreted correctly otherwise
  81. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  82. "import sys, os; sys.stdout = open(os.devnull, 'w'); from numpy.distutils.misc_util import *; sys.__stdout__.write(' '.join(get_numpy_include_dirs()))"
  83. RESULT_VARIABLE PYTHON_NUMPY_NOT_FOUND
  84. OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR
  85. OUTPUT_STRIP_TRAILING_WHITESPACE)
  86. IF(NOT PYTHON_NUMPY_NOT_FOUND)
  87. FILE(TO_CMAKE_PATH ${PYTHON_NUMPY_INCLUDE_DIR} PYTHON_NUMPY_INCLUDE_DIR)
  88. ELSE()
  89. SET(PYTHON_NUMPY_INCLUDE_DIR "PYTHON_NUMPY_INCLUDE_DIR-NOTFOUND")
  90. ENDIF()
  91. ENDIF()
  92. SET(PYTHON_NUMPY_INCLUDE_DIR ${PYTHON_NUMPY_INCLUDE_DIR}
  93. CACHE PATH "Path to numpy include files" FORCE)
  94. IF(PYTHON_NUMPY_INCLUDE_DIR)
  95. MESSAGE(STATUS "Searching for Python numpy: ok")
  96. ELSE()
  97. MESSAGE(STATUS "Could NOT find Python numpy ('import numpy.distutils.misc_util' failed)")
  98. ENDIF()
  99. ######################################################################
  100. #
  101. # check if nosetests are installed
  102. #
  103. ######################################################################
  104. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  105. "import nose"
  106. RESULT_VARIABLE PYTHON_NOSETESTS_NOT_FOUND)
  107. IF(NOT PYTHON_NOSETESTS_NOT_FOUND)
  108. MESSAGE(STATUS "Searching for Python nosetests: ok")
  109. ELSE()
  110. MESSAGE(STATUS "Could NOT find Python nosetests ('import nose' failed)")
  111. ENDIF()
  112. ######################################################################
  113. #
  114. # check if sphinx documentation generator is installed
  115. #
  116. ######################################################################
  117. find_program(PYTHON_SPHINX sphinx-build "${PYTHON_PREFIX}/Scripts")
  118. IF(NOT PYTHON_SPHINX)
  119. MESSAGE(STATUS "Could NOT find sphinx documentation generator")
  120. ELSE()
  121. MESSAGE(STATUS "Searching for sphinx documentation generator: ok")
  122. ENDIF()
  123. ######################################################################
  124. #
  125. # find Python platform
  126. #
  127. ######################################################################
  128. execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
  129. "import sys; p = sys.platform; print ('windows' if p.startswith('win') else p)"
  130. OUTPUT_VARIABLE PYTHON_PLATFORM OUTPUT_STRIP_TRAILING_WHITESPACE)
  131. ######################################################################
  132. #
  133. # set outputs
  134. #
  135. ######################################################################
  136. INCLUDE(FindPackageHandleStandardArgs)
  137. FIND_PACKAGE_HANDLE_STANDARD_ARGS(VIGRANUMPY_DEPENDENCIES DEFAULT_MSG
  138. PYTHONINTERP_V2_FOUND PYTHONLIBS_FOUND
  139. Boost_PYTHON_FOUND PYTHON_NUMPY_INCLUDE_DIR VIGRANUMPY_INSTALL_DIR)
  140. IF(NOT VIGRANUMPY_INCLUDE_DIRS OR VIGRANUMPY_INCLUDE_DIRS MATCHES "-NOTFOUND")
  141. #note that the numpy include dir is set _before_ the python include dir, such that
  142. #installing a more recent version of numpy on top of an existing python installation
  143. #works (otherwise, numpy includes are picked up from ${PYTHON_INCLUDE_PATH}/numpy )
  144. SET(VIGRANUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_INCLUDE_DIR} ${PYTHON_INCLUDE_PATH} ${Boost_INCLUDE_DIR})
  145. ENDIF()
  146. SET(VIGRANUMPY_INCLUDE_DIRS ${VIGRANUMPY_INCLUDE_DIRS}
  147. CACHE PATH "include directories needed by VIGRA Python bindings"
  148. FORCE)
  149. IF(NOT VIGRANUMPY_LIBRARIES OR VIGRANUMPY_LIBRARIES MATCHES "-NOTFOUND")
  150. SET(VIGRANUMPY_LIBRARIES ${PYTHON_LIBRARIES} ${Boost_PYTHON_LIBRARY})
  151. ENDIF()
  152. SET(VIGRANUMPY_LIBRARIES ${VIGRANUMPY_LIBRARIES}
  153. CACHE FILEPATH "libraries needed by VIGRA Python bindings"
  154. FORCE)
  155. ENDIF()