aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/modules/LocatePythonModule.cmake
blob: 3fbe0c793de4e64834f5a3d257fc880b70b8d396 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#LOCATE_PYTHON_MODULE(<module> [PATHS <path1> ... <pathN>] [REQUIRED])
#
# This function tries to find the given python module.
# If found the path is provided in <PY_<module> and <<module>_FOUND> is set to TRUE.
#
# After PATHS additional paths for python to search can be provided.
# When REQUIRED is set, the function will abort the cmake execution is the module is not found
function(LOCATE_PYTHON_MODULE module)
	if(NOT PYTHON_EXECUTABLE)
		find_package(PythonInterp)
	endif()

	# Parse (additional) arguments
	set(options REQUIRED)
	set(multiValueArgs PATHS)
	cmake_parse_arguments(LPM "${options}" "" "${multiValueArgs}" ${ARGN})

	string(TOUPPER ${module} module_upper)
	if(NOT PY_${module_upper})

		if(LPM_PATHS)
			# Append LPM_PATHS to PYTHONPATH to search at provided location (first)
			file(TO_CMAKE_PATH "$ENV{PYTHONPATH}" CMAKE_PATH)
			list(INSERT CMAKE_PATH 0 ${LPM_PATHS})
			file(TO_NATIVE_PATH "${CMAKE_PATH}" NATIVE_PATH)
			if(UNIX)
				string(REPLACE ";" ":" NATIVE_PATH "${NATIVE_PATH}")
			endif(UNIX)
			set(ENV{PYTHONPATH} "${NATIVE_PATH}")
		endif(LPM_PATHS)

		# Use the (native) python impl module to find the location of the requested module
		execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
			"import imp; print(imp.find_module('${module}')[1])"
			RESULT_VARIABLE _${module}_status
			OUTPUT_VARIABLE _${module}_location
			ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

		if(NOT _${module}_status)
			set(PY_${module_upper} ${_${module}_location} CACHE STRING
				"Location of Python module ${module}")
			set(${module_upper}_FOUND TRUE)
			message(STATUS "Found python module ${module}: ${PY_${module_upper}}")
		else(NOT _${module}_status)
			set(${module_upper}_FOUND FALSE)
			if(LPM_REQUIRED)
				message(FATAL_ERROR "Could NOT find python module ${module}")
			else(LPM_REQUIRED)
				message(STATUS "Could NOT find python module ${module}")
			endif(LPM_REQUIRED)
		endif(NOT _${module}_status)
	endif(NOT PY_${module_upper})
endfunction(LOCATE_PYTHON_MODULE)