22# Python extension builder
33######################################################################################
44
5- macro (Python_BUILD_EXTENSION Python_BUILD_VERSION )
5+ cmake_minimum_required ( VERSION 3.12.4 )
66
7- # Unfortunately, we can't use the cache because it treats 2 and 3 the same, so
8- # we wouldn't be able to compile against both.
9- foreach (_python_var
10- PYTHONINTERP_FOUND PYTHON_EXECUTABLE PYTHON_VERSION_STRING
11- PYTHON_VERSION_MAJOR PYTHON_VERSION_MINOR PYTHON_VERSION_PATCH)
12- unset (${_python_var} )
13- unset (${_python_var} CACHE )
14- endforeach (_python_var)
15- foreach (_python_var
16- PYTHONLIBS_FOUND PYTHONLIBS_VERSION_STRING PYTHON_DEBUG_LIBRARIES
17- PYTHON_INCLUDE_DIR PYTHON_INCLUDE_DIRS PYTHON_INCLUDE_PATH PYTHON_LIBRARIES
18- PYTHON_LIBRARY PYTHON_LIBRARY_DEBUG)
19- unset (${_python_var} )
20- unset (${_python_var} CACHE )
21- endforeach (_python_var)
7+ set (Python2_EXACTVERSION CACHE STRING "exact version of python2" )
8+ set (Python3_EXACTVERSION CACHE STRING "exact version of python3" )
229
23- set (Python_ADDITIONAL_VERSIONS ${Python_BUILD_VERSION} )
24- find_package (PythonInterp)
25- set (PYTHON${Python_BUILD_VERSION} INTERP_FOUND ${PYTHONINTERP_FOUND} )
26- set (PYTHON${Python_BUILD_VERSION} _EXECUTABLE ${PYTHON_EXECUTABLE} )
27- set (PYTHON${Python_BUILD_VERSION} _VERSION_STRING ${PYTHON_VERSION_STRING} )
28- set (PYTHON${Python_BUILD_VERSION} _VERSION_MAJOR ${PYTHON_VERSION_MAJOR} )
29- set (PYTHON${Python_BUILD_VERSION} _VERSION_MINOR ${PYTHON_VERSION_MINOR} )
30- set (PYTHON${Python_BUILD_VERSION} _VERSION_PATCH ${PYTHON_VERSION_PATCH} )
31- find_package (PythonLibs)
32- set (PYTHON${Python_BUILD_VERSION} LIBS_FOUND ${PYTHONLIBS_FOUND} )
33- set (PYTHON${Python_BUILD_VERSION} LIBS_VERSION_STRING ${PYTHONLIBS_VERSION_STRING} )
34- set (PYTHON${Python_BUILD_VERSION} _DEBUG_LIBRARIES ${PYTHON_DEBUG_LIBRARIES} )
35- set (PYTHON${Python_BUILD_VERSION} _INCLUDE_PATH ${PYTHON_INCLUDE_PATH} )
36- set (PYTHON${Python_BUILD_VERSION} _INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} )
37- set (PYTHON${Python_BUILD_VERSION} _LIBRARIES ${PYTHON_LIBRARIES} )
38- find_program (CYTHON_EXECUTABLE cython)
10+ macro (Python_BUILD_EXTENSION Python_BUILD_VERSION)
3911
40- if (NOT ${PYTHON${Python_BUILD_VERSION} _VERSION_MAJOR} EQUAL ${Python_BUILD_VERSION} )
41- message (FATAL_ERROR "Unable to find Python ${Python_BUILD_VERSION} interpreter." )
42- endif ()
43- if (NOT ${PYTHON${Python_BUILD_VERSION} _VERSION_STRING} EQUAL ${PYTHON${Python_BUILD_VERSION} LIBS_VERSION_STRING})
44- message (FATAL_ERROR
45- "Unable to find consistent Python ${Python_BUILD_VERSION} libraries. "
46- "Python interpreter is ${PYTHON${Python_BUILD_VERSION} _VERSION_STRING}, "
47- "but libraries are ${PYTHON${Python_BUILD_VERSION} LIBS_VERSION_STRING}." )
12+ if (NOT ${Python${Python_BUILD_VERSION} _EXACTVERSION} STREQUAL "" )
13+ find_package (Python${Python_BUILD_VERSION} ${Python${Python_BUILD_VERSION} _EXACTVERSION} EXACT REQUIRED COMPONENTS Interpreter Development)
14+ else ()
15+ find_package (Python${Python_BUILD_VERSION} REQUIRED COMPONENTS Interpreter Development)
4816endif ()
4917
18+ find_program (CYTHON_EXECUTABLE cython)
19+
5020# Figure out installation path
21+ # CMake populates this var automatically but we need to specify prefix
5122execute_process (COMMAND
52- ${PYTHON ${Python_BUILD_VERSION} _EXECUTABLE}
53- -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(prefix='${CMAKE_INSTALL_PREFIX} '))"
54- OUTPUT_VARIABLE PYTHON ${Python_BUILD_VERSION} _SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
23+ ${Python ${Python_BUILD_VERSION} _EXECUTABLE}
24+ -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(plat_specific=False, standard_lib=False, prefix='${CMAKE_INSTALL_PREFIX} '))"
25+ OUTPUT_VARIABLE Python ${Python_BUILD_VERSION} _SITELIB OUTPUT_STRIP_TRAILING_WHITESPACE)
5526
5627# Figure out numpy include path
28+ # todo: CMake >= 3.14 populates this var automatically when using COMPONENTS NumPy
5729execute_process (COMMAND
58- ${PYTHON ${Python_BUILD_VERSION} _EXECUTABLE}
30+ ${Python ${Python_BUILD_VERSION} _EXECUTABLE}
5931 -c "import numpy; print(numpy.get_include())"
60- OUTPUT_VARIABLE PYTHON ${Python_BUILD_VERSION} _NUMPY_INCLUDE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
32+ OUTPUT_VARIABLE Python ${Python_BUILD_VERSION} _NumPy_INCLUDE_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE)
6133
6234# How to Cython the .pyx file
6335add_custom_command (OUTPUT freenect${Python_BUILD_VERSION} .c
@@ -76,15 +48,15 @@ set_target_properties(cython${Python_BUILD_VERSION}_freenect PROPERTIES
7648 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /python${Python_BUILD_VERSION} )
7749target_link_libraries (cython${Python_BUILD_VERSION} _freenect
7850 freenect_sync
79- ${PYTHON ${Python_BUILD_VERSION} _LIBRARIES})
51+ ${Python ${Python_BUILD_VERSION} _LIBRARIES})
8052target_include_directories (cython${Python_BUILD_VERSION} _freenect PRIVATE
81- ${PYTHON ${Python_BUILD_VERSION} _INCLUDE_PATH }
53+ ${Python ${Python_BUILD_VERSION} _INCLUDE_DIRS }
8254 ../c_sync/
83- ${PYTHON ${Python_BUILD_VERSION} _NUMPY_INCLUDE_PATH })
55+ ${Python ${Python_BUILD_VERSION} _NumPy_INCLUDE_DIRS })
8456
8557# Install the extension
8658install (TARGETS cython${Python_BUILD_VERSION} _freenect
87- DESTINATION ${PYTHON ${Python_BUILD_VERSION} _SITE_PACKAGES })
59+ DESTINATION ${Python ${Python_BUILD_VERSION} _SITELIB })
8860
8961# TODO: decide on what to do with demo_ scripts and were to install
9062# them
0 commit comments