2
2
# Python extension builder
3
3
######################################################################################
4
4
5
- macro (Python_BUILD_EXTENSION Python_BUILD_VERSION )
5
+ cmake_minimum_required ( VERSION 3.12.4 )
6
6
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" )
22
9
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)
39
11
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)
48
16
endif ()
49
17
18
+ find_program (CYTHON_EXECUTABLE cython)
19
+
50
20
# Figure out installation path
21
+ # CMake populates this var automatically but we need to specify prefix
51
22
execute_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)
55
26
56
27
# Figure out numpy include path
28
+ # todo: CMake >= 3.14 populates this var automatically when using COMPONENTS NumPy
57
29
execute_process (COMMAND
58
- ${PYTHON ${Python_BUILD_VERSION} _EXECUTABLE}
30
+ ${Python ${Python_BUILD_VERSION} _EXECUTABLE}
59
31
-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)
61
33
62
34
# How to Cython the .pyx file
63
35
add_custom_command (OUTPUT freenect${Python_BUILD_VERSION} .c
@@ -76,15 +48,15 @@ set_target_properties(cython${Python_BUILD_VERSION}_freenect PROPERTIES
76
48
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /python${Python_BUILD_VERSION} )
77
49
target_link_libraries (cython${Python_BUILD_VERSION} _freenect
78
50
freenect_sync
79
- ${PYTHON ${Python_BUILD_VERSION} _LIBRARIES})
51
+ ${Python ${Python_BUILD_VERSION} _LIBRARIES})
80
52
target_include_directories (cython${Python_BUILD_VERSION} _freenect PRIVATE
81
- ${PYTHON ${Python_BUILD_VERSION} _INCLUDE_PATH }
53
+ ${Python ${Python_BUILD_VERSION} _INCLUDE_DIRS }
82
54
../c_sync/
83
- ${PYTHON ${Python_BUILD_VERSION} _NUMPY_INCLUDE_PATH })
55
+ ${Python ${Python_BUILD_VERSION} _NumPy_INCLUDE_DIRS })
84
56
85
57
# Install the extension
86
58
install (TARGETS cython${Python_BUILD_VERSION} _freenect
87
- DESTINATION ${PYTHON ${Python_BUILD_VERSION} _SITE_PACKAGES })
59
+ DESTINATION ${Python ${Python_BUILD_VERSION} _SITELIB })
88
60
89
61
# TODO: decide on what to do with demo_ scripts and were to install
90
62
# them
0 commit comments