Skip to content

Commit 29b4829

Browse files
committed
build(wrappers/python): improve python detection
Signed-off-by: Benn Snyder <[email protected]>
1 parent 48a5c66 commit 29b4829

File tree

2 files changed

+22
-50
lines changed

2 files changed

+22
-50
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Notice: If you have the newer Kinect v2 (XBox One), use [OpenKinect/libfreenect2
1818
To build libfreenect, you'll need
1919

2020
- [libusb](http://libusb.info) >= 1.0.18 (Windows needs >= 1.0.22)
21-
- [CMake](http://cmake.org) >= 3.1.0
21+
- [CMake](http://cmake.org) >= 3.12.4
2222
- [python](http://python.org) >= 2.7 or >= 3.3 (only if BUILD_PYTHON=ON or BUILD_PYTHON2=ON or BUILD_PYTHON3=ON or BUILD_REDIST_PACKAGE=OFF)
2323

2424
For the examples, you'll need

wrappers/python/CMakeLists.txt

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,62 +2,34 @@
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)
4816
endif()
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
5122
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)
5526

5627
# Figure out numpy include path
28+
# todo: CMake >= 3.14 populates this var automatically when using COMPONENTS NumPy
5729
execute_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
6335
add_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})
7749
target_link_libraries(cython${Python_BUILD_VERSION}_freenect
7850
freenect_sync
79-
${PYTHON${Python_BUILD_VERSION}_LIBRARIES})
51+
${Python${Python_BUILD_VERSION}_LIBRARIES})
8052
target_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
8658
install(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

Comments
 (0)