# 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)