/
Python.cmake
132 lines (107 loc) · 4.67 KB
/
Python.cmake
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# CMake module which checks for python and some its modules
# there is a two-stage support for python:
# -
FIND_PACKAGE(PythonLibs) # MapServer export tool
FIND_PACKAGE(PythonInterp) # test for sip and PyQt4
MACRO (TRY_RUN_PYTHON RESULT CMD)
IF (PYTHONINTERP_FOUND)
EXEC_PROGRAM(${PYTHON_EXECUTABLE} ARGS -c "\"${CMD}\""
OUTPUT_VARIABLE out
RETURN_VALUE retval)
# optional last parameter to save the output
SET (OUTPUT ${ARGV2})
IF (OUTPUT)
SET(${OUTPUT} ${out})
ENDIF (OUTPUT)
IF (retval EQUAL 0)
SET (${RESULT} TRUE)
ELSE (retval EQUAL 0)
SET (${RESULT} FALSE)
ENDIF (retval EQUAL 0)
ELSE (PYTHONINTERP_FOUND)
SET (${RESULT} FALSE)
ENDIF (PYTHONINTERP_FOUND)
ENDMACRO (TRY_RUN_PYTHON)
# enable/disable python support (mapserver export tool and bindings)
IF (PYTHON_LIBRARIES AND PYTHON_INCLUDE_PATH)
SET (PYTHON_FOUND TRUE)
MESSAGE(STATUS "Python libraries found")
# TODO: should not be needed, report it to CMake devs
IF (UNIX AND NOT APPLE)
SET (PYTHON_LIBRARIES ${PYTHON_LIBRARIES} util)
ENDIF (UNIX AND NOT APPLE)
IF (WITH_BINDINGS)
# check for SIP (3 steps)
# 1. can import python module?
TRY_RUN_PYTHON (HAVE_SIP_MODULE "from sip import wrapinstance")
IF (APPLE)
SET (SIP_MAC_PATH
/System/Library/Frameworks/Python.framework/Versions/2.5/bin
/System/Library/Frameworks/Python.framework/Versions/2.4/bin
/System/Library/Frameworks/Python.framework/Versions/2.3/bin)
ENDIF (APPLE)
# 2. is there sip binary? (for creating wrappers)
FIND_PROGRAM (SIP_BINARY_PATH sip PATHS ${SIP_MAC_PATH})
# 3. is there sip include file? (necessary for compilation of bindings)
FIND_PATH (SIP_INCLUDE_DIR sip.h ${PYTHON_INCLUDE_PATH})
IF (HAVE_SIP_MODULE AND SIP_BINARY_PATH AND SIP_INCLUDE_DIR)
# check for SIP version
# minimal version is 4.5
SET (SIP_MIN_VERSION 040500)
TRY_RUN_PYTHON (RES "import sip\nprint '%x' % sip.SIP_VERSION" SIP_VERSION)
IF (SIP_VERSION EQUAL "${SIP_MIN_VERSION}" OR SIP_VERSION GREATER "${SIP_MIN_VERSION}")
SET (SIP_IS_GOOD TRUE)
ENDIF (SIP_VERSION EQUAL "${SIP_MIN_VERSION}" OR SIP_VERSION GREATER "${SIP_MIN_VERSION}")
IF (NOT SIP_IS_GOOD)
MESSAGE (STATUS "SIP is required in version 4.5 or later!")
ENDIF (NOT SIP_IS_GOOD)
ELSE (HAVE_SIP_MODULE AND SIP_BINARY_PATH AND SIP_INCLUDE_DIR)
IF (NOT HAVE_SIP_MODULE)
MESSAGE (STATUS "SIP python module is missing!")
ENDIF (NOT HAVE_SIP_MODULE)
IF (NOT SIP_BINARY_PATH)
MESSAGE (STATUS "SIP executable is missing!")
ENDIF (NOT SIP_BINARY_PATH)
IF (NOT SIP_INCLUDE_DIR)
MESSAGE (STATUS "SIP header file is missing!")
ENDIF (NOT SIP_INCLUDE_DIR)
ENDIF (HAVE_SIP_MODULE AND SIP_BINARY_PATH AND SIP_INCLUDE_DIR)
# check for PyQt4
TRY_RUN_PYTHON (HAVE_PYQT4 "from PyQt4 import QtCore, QtGui, QtNetwork, QtSvg, QtXml")
# check whether directory with PyQt4 sip files exists
IF (HAVE_PYQT4)
TRY_RUN_PYTHON (RES "import PyQt4.pyqtconfig\nprint PyQt4.pyqtconfig._pkg_config['pyqt_sip_dir']" PYQT_SIP_DIR)
IF (IS_DIRECTORY ${PYQT_SIP_DIR})
SET (HAVE_PYQT4_SIP_DIR TRUE)
ENDIF (IS_DIRECTORY ${PYQT_SIP_DIR})
ENDIF (HAVE_PYQT4)
IF (HAVE_PYQT4 AND HAVE_PYQT4_SIP_DIR)
# check for PyQt4 version
# minimal version is 4.1
SET (PYQT_MIN_VERSION 040100)
TRY_RUN_PYTHON (RES "from PyQt4 import QtCore\nprint '%x' % QtCore.PYQT_VERSION" PYQT_VERSION)
IF (PYQT_VERSION EQUAL "${PYQT_MIN_VERSION}" OR PYQT_VERSION GREATER "${PYQT_MIN_VERSION}")
SET (PYQT_IS_GOOD TRUE)
ENDIF (PYQT_VERSION EQUAL "${PYQT_MIN_VERSION}" OR PYQT_VERSION GREATER "${PYQT_MIN_VERSION}")
IF (NOT PYQT_IS_GOOD)
MESSAGE (STATUS "PyQt4 is needed in version 4.1 or later!")
ENDIF (NOT PYQT_IS_GOOD)
ELSE (HAVE_PYQT4 AND HAVE_PYQT4_SIP_DIR)
IF (HAVE_PYQT4)
MESSAGE (STATUS "PyQt4 development files are missing!")
ELSE (HAVE_PYQT4)
MESSAGE (STATUS "PyQt4 not found!")
ENDIF (HAVE_PYQT4)
ENDIF (HAVE_PYQT4 AND HAVE_PYQT4_SIP_DIR)
# if SIP and PyQt4 are found, enable bindings
IF (SIP_IS_GOOD AND PYQT_IS_GOOD)
SET (HAVE_PYTHON TRUE)
MESSAGE(STATUS "Python bindings enabled")
ELSE (SIP_IS_GOOD AND PYQT_IS_GOOD)
SET (HAVE_PYTHON FALSE)
MESSAGE(STATUS "Python bindings disabled due dependency problems!")
ENDIF (SIP_IS_GOOD AND PYQT_IS_GOOD)
ELSE (WITH_BINDINGS)
MESSAGE(STATUS "Python bindings disabled")
ENDIF (WITH_BINDINGS)
ENDIF (PYTHON_LIBRARIES AND PYTHON_INCLUDE_PATH)