QGIS/cmake/Python.cmake
2008-11-11 14:33:01 +00:00

133 lines
4.7 KiB
CMake

# 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.7 (to support universal builds)
SET (SIP_MIN_VERSION 040700)
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.7 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)