Index: cmake/SIPMacros.cmake =================================================================== --- cmake/SIPMacros.cmake (revision 0) +++ cmake/SIPMacros.cmake (revision 0) @@ -0,0 +1,121 @@ +# Macros for SIP +# ~~~~~~~~~~~~~~ +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php +# +# This file defines the following macros: +# +# ADD_SIP_PYTHON_MODULE (MODULE_NAME MODULE_SIP [library1, libaray2, ...]) +# Specifies a SIP file to be built into a Python module and installed. +# MODULE_NAME is the name of Python module including any path name. (e.g. +# os.sys, Foo.bar etc). MODULE_SIP the path and filename of the .sip file +# to process and compile. libraryN are libraries that the Python module, +# which is typically a shared library, should be linked to. The built +# module will also be install into Python's site-packages directory. +# +# The behaviour of the ADD_SIP_PYTHON_MODULE macro can be controlled by a +# number of variables: +# +# SIP_INCLUDES - List of directories which SIP will scan through when looking +# for included .sip files. (Corresponds to the -I option for SIP.) +# +# SIP_TAGS - List of tags to define when running SIP. (Corresponds to the -t +# option for SIP.) +# +# SIP_CONCAT_PARTS - An integer which defines the number of parts the C++ code +# of each module should be split into. Defaults to 8. (Corresponds to the +# -j option for SIP.) +# +# SIP_DISABLE_FEATURES - List of feature names which should be disabled +# running SIP. (Corresponds to the -x option for SIP.) +# +# SIP_EXTRA_OPTIONS - Extra command line options which should be passed on to +# SIP. + +SET(SIP_INCLUDES) +SET(SIP_TAGS) +SET(SIP_CONCAT_PARTS 8) +SET(SIP_DISABLE_FEATURES) +SET(SIP_EXTRA_OPTIONS) + +MACRO(ADD_SIP_PYTHON_MODULE MODULE_NAME MODULE_SIP) + + SET(EXTRA_LINK_LIBRARIES ${ARGN}) + + STRING(REPLACE "." "/" _x ${MODULE_NAME}) + GET_FILENAME_COMPONENT(_parent_module_path ${_x} PATH) + GET_FILENAME_COMPONENT(_child_module_name ${_x} NAME) + + GET_FILENAME_COMPONENT(_module_path ${MODULE_SIP} PATH) + GET_FILENAME_COMPONENT(_abs_module_sip ${MODULE_SIP} ABSOLUTE) + + # We give this target a long logical target name. + # (This is to avoid having the library name clash with any already + # install library names. If that happens then cmake dependancy + # tracking get confused.) + STRING(REPLACE "." "_" _logical_name ${MODULE_NAME}) + SET(_logical_name "python_module_${_logical_name}") + + FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_module_path}) # Output goes in this dir. + + SET(_sip_includes) + FOREACH (_inc ${SIP_INCLUDES}) + GET_FILENAME_COMPONENT(_abs_inc ${_inc} ABSOLUTE) + LIST(APPEND _sip_includes -I ${_abs_inc}) + ENDFOREACH (_inc ) + + SET(_sip_tags) + FOREACH (_tag ${SIP_TAGS}) + LIST(APPEND _sip_tags -t ${_tag}) + ENDFOREACH (_tag) + + SET(_sip_x) + FOREACH (_x ${SIP_DISABLE_FEATURES}) + LIST(APPEND _sip_x -x ${_x}) + ENDFOREACH (_x ${SIP_DISABLE_FEATURES}) + + SET(_message "-DMESSAGE=Generating CPP code for module ${MODULE_NAME}") + SET(_sip_output_files) + FOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) + IF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) + SET(_sip_output_files ${_sip_output_files} ${CMAKE_CURRENT_BINARY_DIR}/${_module_path}/sip${_child_module_name}part${CONCAT_NUM}.cpp ) + ENDIF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) + ENDFOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) + + IF(NOT WIN32) + SET(TOUCH_COMMAND touch) + ELSE(NOT WIN32) + SET(TOUCH_COMMAND echo) + # instead of a touch command, give out the name and append to the files + # this is basically what the touch command does. + FOREACH(filename ${_sip_output_files}) + FILE(APPEND filename "") + ENDFOREACH(filename ${_sip_output_files}) + ENDIF(NOT WIN32) + ADD_CUSTOM_COMMAND( + OUTPUT ${_sip_output_files} + COMMAND ${CMAKE_COMMAND} -E echo ${message} + COMMAND ${TOUCH_COMMAND} ${_sip_output_files} + COMMAND ${SIP_EXECUTABLE} ${_sip_tags} ${_sip_x} ${SIP_EXTRA_OPTIONS} -j ${SIP_CONCAT_PARTS} -c ${CMAKE_CURRENT_BINARY_DIR}/${_module_path} ${_sip_includes} ${_abs_module_sip} + DEPENDS ${_abs_module_sip} ${SIP_EXTRA_FILES_DEPEND} + ) + # not sure if type MODULE could be uses anywhere, limit to cygwin for now + IF (CYGWIN) + ADD_LIBRARY(${_logical_name} MODULE ${_sip_output_files} ) + ELSE (CYGWIN) + ADD_LIBRARY(${_logical_name} SHARED ${_sip_output_files} ) + ENDIF (CYGWIN) + TARGET_LINK_LIBRARIES(${_logical_name} ${PYTHON_LIBRARY}) + TARGET_LINK_LIBRARIES(${_logical_name} ${EXTRA_LINK_LIBRARIES}) + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES PREFIX "" OUTPUT_NAME ${_child_module_name}) + + IF (WIN32) + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES SUFFIX ".pyd") + ENDIF (WIN32) + + INSTALL(TARGETS ${_logical_name} DESTINATION "${PYTHON_SITE_PACKAGES_DIR}/${_parent_module_path}") + +ENDMACRO(ADD_SIP_PYTHON_MODULE) Index: cmake/PythonCompile.py =================================================================== --- cmake/PythonCompile.py (revision 0) +++ cmake/PythonCompile.py (revision 0) @@ -0,0 +1,4 @@ +# By Simon Edwards +# This file is in the public domain. +import py_compile +py_compile.main() Index: cmake/FindSIP.py =================================================================== --- cmake/FindSIP.py (revision 0) +++ cmake/FindSIP.py (revision 0) @@ -0,0 +1,15 @@ +# FindSIP.py +# +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +import sys +import sipconfig + +sipcfg = sipconfig.Configuration() +print("sip_version:%06.0x" % sipcfg.sip_version) +print("sip_version_str:%s" % sipcfg.sip_version_str) +print("sip_bin:%s" % sipcfg.sip_bin) +print("default_sip_dir:%s" % sipcfg.default_sip_dir) +print("sip_inc_dir:%s" % sipcfg.sip_inc_dir) Index: cmake/FindPyQt.py =================================================================== --- cmake/FindPyQt.py (revision 0) +++ cmake/FindPyQt.py (revision 0) @@ -0,0 +1,24 @@ +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +import PyQt4.pyqtconfig + +pyqtcfg = PyQt4.pyqtconfig.Configuration() +print("pyqt_version:%06.0x" % pyqtcfg.pyqt_version) +print("pyqt_version_str:%s" % pyqtcfg.pyqt_version_str) + +pyqt_version_tag = "" +in_t = False +for item in pyqtcfg.pyqt_sip_flags.split(' '): + if item=="-t": + in_t = True + elif in_t: + if item.startswith("Qt_4"): + pyqt_version_tag = item + else: + in_t = False +print("pyqt_version_tag:%s" % pyqt_version_tag) + +print("pyqt_sip_dir:%s" % pyqtcfg.pyqt_sip_dir) +print("pyqt_sip_flags:%s" % pyqtcfg.pyqt_sip_flags) Index: cmake/FindPythonLibrary.cmake =================================================================== --- cmake/FindPythonLibrary.cmake (revision 0) +++ cmake/FindPythonLibrary.cmake (revision 0) @@ -0,0 +1,94 @@ +# Find Python +# ~~~~~~~~~~~ +# Find the Python interpreter and related Python directories. +# +# This file defines the following variables: +# +# PYTHON_EXECUTABLE - The path and filename of the Python interpreter. +# +# PYTHON_SHORT_VERSION - The version of the Python interpreter found, +# excluding the patch version number. (e.g. 2.5 and not 2.5.1)) +# +# PYTHON_LONG_VERSION - The version of the Python interpreter found as a human +# readable string. +# +# PYTHON_SITE_PACKAGES_DIR - Location of the Python site-packages directory. +# +# PYTHON_INCLUDE_PATH - Directory holding the python.h include file. +# +# PYTHON_LIBRARY, PYTHON_LIBRARIES- Location of the Python library. + +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + + +INCLUDE(CMakeFindFrameworks) + +if(EXISTS PYTHON_LIBRARY) + # Already in cache, be silent + set(PYTHONLIBRARY_FOUND TRUE) +else(EXISTS PYTHON_LIBRARY) + + FIND_PACKAGE(PythonInterp) + + if(PYTHONINTERP_FOUND) + + FIND_FILE(_find_lib_python_py FindLibPython.py PATHS ${CMAKE_MODULE_PATH}) + + EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_lib_python_py} OUTPUT_VARIABLE python_config) + if(python_config) + STRING(REGEX REPLACE ".*exec_prefix:([^\n]+).*$" "\\1" PYTHON_PREFIX ${python_config}) + STRING(REGEX REPLACE ".*\nshort_version:([^\n]+).*$" "\\1" PYTHON_SHORT_VERSION ${python_config}) + STRING(REGEX REPLACE ".*\nlong_version:([^\n]+).*$" "\\1" PYTHON_LONG_VERSION ${python_config}) + STRING(REGEX REPLACE ".*\npy_inc_dir:([^\n]+).*$" "\\1" PYTHON_INCLUDE_PATH ${python_config}) + if(NOT PYTHON_SITE_PACKAGES_DIR) + if(NOT PYTHON_LIBS_WITH_KDE_LIBS) + STRING(REGEX REPLACE ".*\nsite_packages_dir:([^\n]+).*$" "\\1" PYTHON_SITE_PACKAGES_DIR ${python_config}) + else(NOT PYTHON_LIBS_WITH_KDE_LIBS) + set(PYTHON_SITE_PACKAGES_DIR ${KDE4_LIB_INSTALL_DIR}/python${PYTHON_SHORT_VERSION}/site-packages) + endif(NOT PYTHON_LIBS_WITH_KDE_LIBS) + endif(NOT PYTHON_SITE_PACKAGES_DIR) + STRING(REGEX REPLACE "([0-9]+).([0-9]+)" "\\1\\2" PYTHON_SHORT_VERSION_NO_DOT ${PYTHON_SHORT_VERSION}) + set(PYTHON_LIBRARY_NAMES python${PYTHON_SHORT_VERSION} python${PYTHON_SHORT_VERSION_NO_DOT}) + if(WIN32) + STRING(REPLACE "\\" "/" PYTHON_SITE_PACKAGES_DIR ${PYTHON_SITE_PACKAGES_DIR}) + endif(WIN32) + FIND_LIBRARY(PYTHON_LIBRARY NAMES ${PYTHON_LIBRARY_NAMES} PATHS ${PYTHON_PREFIX}/lib ${PYTHON_PREFIX}/libs NO_DEFAULT_PATH) + set(PYTHONLIBRARY_FOUND TRUE) + endif(python_config) + + # adapted from cmake's builtin FindPythonLibs + if(APPLE) + CMAKE_FIND_FRAMEWORKS(Python) + set(PYTHON_FRAMEWORK_INCLUDES) + if(Python_FRAMEWORKS) + # If a framework has been selected for the include path, + # make sure "-framework" is used to link it. + if("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework") + set(PYTHON_LIBRARY "") + set(PYTHON_DEBUG_LIBRARY "") + endif("${PYTHON_INCLUDE_PATH}" MATCHES "Python\\.framework") + if(NOT PYTHON_LIBRARY) + set (PYTHON_LIBRARY "-framework Python" CACHE FILEPATH "Python Framework" FORCE) + endif(NOT PYTHON_LIBRARY) + set(PYTHONLIBRARY_FOUND TRUE) + endif(Python_FRAMEWORKS) + endif(APPLE) + endif(PYTHONINTERP_FOUND) + + if(PYTHONLIBRARY_FOUND) + set(PYTHON_LIBRARIES ${PYTHON_LIBRARY}) + if(NOT PYTHONLIBRARY_FIND_QUIETLY) + message(STATUS "Found Python executable: ${PYTHON_EXECUTABLE}") + message(STATUS "Found Python version: ${PYTHON_LONG_VERSION}") + message(STATUS "Found Python library: ${PYTHON_LIBRARY}") + endif(NOT PYTHONLIBRARY_FIND_QUIETLY) + else(PYTHONLIBRARY_FOUND) + if(PYTHONLIBRARY_FIND_REQUIRED) + message(FATAL_ERROR "Could not find Python") + endif(PYTHONLIBRARY_FIND_REQUIRED) + endif(PYTHONLIBRARY_FOUND) + +endif (EXISTS PYTHON_LIBRARY) Index: cmake/FindLibPython.py =================================================================== --- cmake/FindLibPython.py (revision 0) +++ cmake/FindLibPython.py (revision 0) @@ -0,0 +1,13 @@ + +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +import sys +import distutils.sysconfig + +print("exec_prefix:%s" % sys.exec_prefix) +print("short_version:%s" % sys.version[:3]) +print("long_version:%s" % sys.version.split()[0]) +print("py_inc_dir:%s" % distutils.sysconfig.get_python_inc()) +print("site_packages_dir:%s" % distutils.sysconfig.get_python_lib(plat_specific=1)) Index: cmake/Python.cmake =================================================================== --- cmake/Python.cmake (revision 12765) +++ cmake/Python.cmake (working copy) @@ -1,216 +0,0 @@ - -# 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 - -IF(NOT PYUIC4_PROGRAM) - IF (MSVC) - FIND_PROGRAM(PYUIC4_PROGRAM - NAMES pyuic4.bat - PATHS $ENV{LIB_DIR}/bin - ) - ELSE(MSVC) - FIND_PROGRAM(PYUIC4_PROGRAM pyuic4) - ENDIF (MSVC) - - IF (NOT PYUIC4_PROGRAM) - MESSAGE(FATAL_ERROR "pyuic4 not found - aborting") - ENDIF (NOT PYUIC4_PROGRAM) -ENDIF(NOT PYUIC4_PROGRAM) - -# Adapted from QT4_WRAP_UI -MACRO(PYQT4_WRAP_UI outfiles ) - FOREACH(it ${ARGN}) - GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) - GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) - SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.py) - ADD_CUSTOM_COMMAND(OUTPUT ${outfile} - COMMAND ${PYUIC4_PROGRAM} ${infile} -o ${outfile} - MAIN_DEPENDENCY ${infile} - ) - SET(${outfiles} ${${outfiles}} ${outfile}) - ENDFOREACH(it) -ENDMACRO(PYQT4_WRAP_UI) - -IF(NOT PYRCC4_PROGRAM) - IF (MSVC) - FIND_PROGRAM(PYRCC4_PROGRAM - NAMES pyrcc4.exe - PATHS $ENV{LIB_DIR}/bin - ) - ELSE(MSVC) - FIND_PROGRAM(PYRCC4_PROGRAM pyrcc4) - ENDIF (MSVC) - - IF (NOT PYRCC4_PROGRAM) - MESSAGE(FATAL_ERROR "pyrcc4 not found - aborting") - ENDIF (NOT PYRCC4_PROGRAM) -ENDIF(NOT PYRCC4_PROGRAM) - -# Adapted from QT4_ADD_RESOURCES -MACRO (PYQT4_ADD_RESOURCES outfiles ) - FOREACH (it ${ARGN}) - GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) - GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) - GET_FILENAME_COMPONENT(rc_path ${infile} PATH) - SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}_rc.py) - # parse file for dependencies - # all files are absolute paths or relative to the location of the qrc file - FILE(READ "${infile}" _RC_FILE_CONTENTS) - STRING(REGEX MATCHALL "]*>" "" _RC_FILE "${_RC_FILE}") - STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}") - IF(NOT _ABS_PATH_INDICATOR) - SET(_RC_FILE "${rc_path}/${_RC_FILE}") - ENDIF(NOT _ABS_PATH_INDICATOR) - SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}") - ENDFOREACH(_RC_FILE) - ADD_CUSTOM_COMMAND(OUTPUT ${outfile} - COMMAND ${PYRCC4_PROGRAM} -name ${outfile} -o ${outfile} ${infile} - MAIN_DEPENDENCY ${infile} - DEPENDS ${_RC_DEPENDS}) - SET(${outfiles} ${${outfiles}} ${outfile}) - ENDFOREACH (it) -ENDMACRO (PYQT4_ADD_RESOURCES) - -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) - -IF(MSVC) - FIND_PROGRAM(SIP_MAKE_PROGRAM - NAMES nmake.exe - PATHS "$ENV{VCINSTALLDIR}/bin" "$ENV{PROGRAMFILES}/Microsoft Visual 9.0/VC/bin" - ) - IF(NOT SIP_MAKE_PROGRAM) - MESSAGE(FATAL_ERROR "nmake not found") - ENDIF(NOT SIP_MAKE_PROGRAM) -ELSE (MSVC) - SET(SIP_MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM}) -ENDIF (MSVC) - - -# 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) Index: cmake/FindPyQt4.cmake =================================================================== --- cmake/FindPyQt4.cmake (revision 0) +++ cmake/FindPyQt4.cmake (revision 0) @@ -0,0 +1,53 @@ +# Find PyQt4 +# ~~~~~~~~~~ +# Copyright (c) 2007-2008, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# PyQt4 website: http://www.riverbankcomputing.co.uk/pyqt/index.php +# +# Find the installed version of PyQt4. FindPyQt4 should only be called after +# Python has been found. +# +# This file defines the following variables: +# +# PYQT4_VERSION - The version of PyQt4 found expressed as a 6 digit hex number +# suitable for comparision as a string +# +# PYQT4_VERSION_STR - The version of PyQt4 as a human readable string. +# +# PYQT4_VERSION_TAG - The PyQt version tag using by PyQt's sip files. +# +# PYQT4_SIP_DIR - The directory holding the PyQt4 .sip files. +# +# PYQT4_SIP_FLAGS - The SIP flags used to build PyQt. + +IF(EXISTS PYQT4_VERSION) + # Already in cache, be silent + SET(PYQT4_FOUND TRUE) +ELSE(EXISTS PYQT4_VERSION) + + FIND_FILE(_find_pyqt_py FindPyQt.py PATHS ${CMAKE_MODULE_PATH}) + + EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_pyqt_py} OUTPUT_VARIABLE pyqt_config) + IF(pyqt_config) + STRING(REGEX REPLACE "^pyqt_version:([^\n]+).*$" "\\1" PYQT4_VERSION ${pyqt_config}) + STRING(REGEX REPLACE ".*\npyqt_version_str:([^\n]+).*$" "\\1" PYQT4_VERSION_STR ${pyqt_config}) + STRING(REGEX REPLACE ".*\npyqt_version_tag:([^\n]+).*$" "\\1" PYQT4_VERSION_TAG ${pyqt_config}) + STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT4_SIP_DIR ${pyqt_config}) + STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT4_SIP_FLAGS ${pyqt_config}) + + SET(PYQT4_FOUND TRUE) + ENDIF(pyqt_config) + + IF(PYQT4_FOUND) + IF(NOT PYQT4_FIND_QUIETLY) + MESSAGE(STATUS "Found PyQt4 version: ${PYQT4_VERSION_STR}") + ENDIF(NOT PYQT4_FIND_QUIETLY) + ELSE(PYQT4_FOUND) + IF(PYQT4_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Python") + ENDIF(PYQT4_FIND_REQUIRED) + ENDIF(PYQT4_FOUND) + +ENDIF(EXISTS PYQT4_VERSION) Index: cmake/PythonMacros.cmake =================================================================== --- cmake/PythonMacros.cmake (revision 0) +++ cmake/PythonMacros.cmake (revision 0) @@ -0,0 +1,61 @@ +# Python macros +# ~~~~~~~~~~~~~ +# Copyright (c) 2007, Simon Edwards +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# This file defines the following macros: +# +# PYTHON_INSTALL (SOURCE_FILE DESINATION_DIR) +# Install the SOURCE_FILE, which is a Python .py file, into the +# destination directory during install. The file will be byte compiled +# and both the .py file and .pyc file will be installed. + +GET_FILENAME_COMPONENT(PYTHON_MACROS_MODULE_PATH ${CMAKE_CURRENT_LIST_FILE} PATH) + +MACRO(PYTHON_INSTALL SOURCE_FILE DESINATION_DIR) + + FIND_FILE(_python_compile_py PythonCompile.py PATHS ${CMAKE_MODULE_PATH}) + + + # Install the source file. + INSTALL(FILES ${SOURCE_FILE} DESTINATION ${DESINATION_DIR}) + + # Byte compile and install the .pyc file. + GET_FILENAME_COMPONENT(_absfilename ${SOURCE_FILE} ABSOLUTE) + GET_FILENAME_COMPONENT(_filename ${SOURCE_FILE} NAME) + GET_FILENAME_COMPONENT(_filenamebase ${SOURCE_FILE} NAME_WE) + GET_FILENAME_COMPONENT(_basepath ${SOURCE_FILE} PATH) + + if(WIN32) + string(REGEX REPLACE ".:/" "/" _basepath "${_basepath}") + endif(WIN32) + + SET(_bin_py ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filename}) + SET(_bin_pyc ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filenamebase}.pyc) + + FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}) + + SET(_message "-DMESSAGE=Byte-compiling ${_bin_py}") + + GET_FILENAME_COMPONENT(_abs_bin_py ${_bin_py} ABSOLUTE) + IF(_abs_bin_py STREQUAL ${_absfilename}) # Don't copy the file onto itself. + ADD_CUSTOM_COMMAND( + TARGET compile_python_files + COMMAND ${CMAKE_COMMAND} -E echo ${message} + COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} + DEPENDS ${_absfilename} + ) + ELSE(_abs_bin_py STREQUAL ${_absfilename}) + ADD_CUSTOM_COMMAND( + TARGET compile_python_files + COMMAND ${CMAKE_COMMAND} -E echo ${message} + COMMAND ${CMAKE_COMMAND} -E copy ${_absfilename} ${_bin_py} + COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} + DEPENDS ${_absfilename} + ) + ENDIF(_abs_bin_py STREQUAL ${_absfilename}) + + INSTALL(FILES ${_bin_pyc} DESTINATION ${DESINATION_DIR}) +ENDMACRO(PYTHON_INSTALL) Index: cmake/PyQt4Macros.cmake =================================================================== --- cmake/PyQt4Macros.cmake (revision 0) +++ cmake/PyQt4Macros.cmake (revision 0) @@ -0,0 +1,73 @@ + + +IF(NOT PYUIC4_PROGRAM) + IF (MSVC) + FIND_PROGRAM(PYUIC4_PROGRAM + NAMES pyuic4.bat + PATHS $ENV{LIB_DIR}/bin + ) + ELSE(MSVC) + FIND_PROGRAM(PYUIC4_PROGRAM pyuic4) + ENDIF (MSVC) + + IF (NOT PYUIC4_PROGRAM) + MESSAGE(FATAL_ERROR "pyuic4 not found - aborting") + ENDIF (NOT PYUIC4_PROGRAM) +ENDIF(NOT PYUIC4_PROGRAM) + +# Adapted from QT4_WRAP_UI +MACRO(PYQT4_WRAP_UI outfiles ) + FOREACH(it ${ARGN}) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.py) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${PYUIC4_PROGRAM} ${infile} -o ${outfile} + MAIN_DEPENDENCY ${infile} + ) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH(it) +ENDMACRO(PYQT4_WRAP_UI) + +IF(NOT PYRCC4_PROGRAM) + IF (MSVC) + FIND_PROGRAM(PYRCC4_PROGRAM + NAMES pyrcc4.exe + PATHS $ENV{LIB_DIR}/bin + ) + ELSE(MSVC) + FIND_PROGRAM(PYRCC4_PROGRAM pyrcc4) + ENDIF (MSVC) + + IF (NOT PYRCC4_PROGRAM) + MESSAGE(FATAL_ERROR "pyrcc4 not found - aborting") + ENDIF (NOT PYRCC4_PROGRAM) +ENDIF(NOT PYRCC4_PROGRAM) + +# Adapted from QT4_ADD_RESOURCES +MACRO (PYQT4_ADD_RESOURCES outfiles ) + FOREACH (it ${ARGN}) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(rc_path ${infile} PATH) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}_rc.py) + # parse file for dependencies + # all files are absolute paths or relative to the location of the qrc file + FILE(READ "${infile}" _RC_FILE_CONTENTS) + STRING(REGEX MATCHALL "]*>" "" _RC_FILE "${_RC_FILE}") + STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}") + IF(NOT _ABS_PATH_INDICATOR) + SET(_RC_FILE "${rc_path}/${_RC_FILE}") + ENDIF(NOT _ABS_PATH_INDICATOR) + SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}") + ENDFOREACH(_RC_FILE) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${PYRCC4_PROGRAM} -name ${outfile} -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile} + DEPENDS ${_RC_DEPENDS}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) +ENDMACRO (PYQT4_ADD_RESOURCES) Index: cmake/FindSIP.cmake =================================================================== --- cmake/FindSIP.cmake (revision 0) +++ cmake/FindSIP.cmake (revision 0) @@ -0,0 +1,56 @@ +# Find SIP +# ~~~~~~~~ +# +# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php +# +# Find the installed version of SIP. FindSIP should be called after Python +# has been found. +# +# This file defines the following variables: +# +# SIP_VERSION - The version of SIP found expressed as a 6 digit hex number +# suitable for comparision as a string. +# +# SIP_VERSION_STR - The version of SIP found as a human readable string. +# +# SIP_EXECUTABLE - Path and filename of the SIP command line executable. +# +# SIP_INCLUDE_DIR - Directory holding the SIP C++ header file. +# +# SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed +# into. + +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + + +IF(SIP_VERSION) + # Already in cache, be silent + SET(SIP_FOUND TRUE) +ELSE(SIP_VERSION) + + FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH}) + + EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_sip_py} OUTPUT_VARIABLE sip_config) + IF(sip_config) + STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config}) + STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config}) + STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_EXECUTABLE ${sip_config}) + STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) + STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) + SET(SIP_FOUND TRUE) + ENDIF(sip_config) + + IF(SIP_FOUND) + IF(NOT SIP_FIND_QUIETLY) + MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}") + ENDIF(NOT SIP_FIND_QUIETLY) + ELSE(SIP_FOUND) + IF(SIP_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find SIP") + ENDIF(SIP_FIND_REQUIRED) + ENDIF(SIP_FOUND) + +ENDIF(SIP_VERSION) Index: python/qgisconfig.py.in =================================================================== --- python/qgisconfig.py.in (revision 12765) +++ python/qgisconfig.py.in (working copy) @@ -1,40 +0,0 @@ -import PyQt4.pyqtconfig - -# These are installation specific values created when QGIS was configured. -# The following line will be replaced when this template is used to create -# the final configuration module. -# @SIP_CONFIGURATION@ - -class Configuration(pyqtconfig.Configuration): - """The class that represents QGIS configuration values. - """ - def __init__(self, sub_cfg=None): - """Initialise an instance of the class. - - sub_cfg is the list of sub-class configurations. It should be None - when called normally. - """ - # This is all standard code to be copied verbatim except for the - # name of the module containing the super-class. - if sub_cfg: - cfg = sub_cfg - else: - cfg = [] - - cfg.append(_pkg_config) - - pyqtconfig.Configuration.__init__(self, cfg) - -class QgisModuleMakefile(pyqtconfig.QtModuleMakefile): - """The Makefile class for modules that %Import qgis_core. - """ - def finalise(self): - """Finalise the macros. - """ - # Make sure our C++ library is linked. - self.extra_libs.append("qgis_core") - self.extra_libs.append("qgis_gui") - self.extra_libs.append("qgis_analysis") - - # Let the super-class do what it needs to. - pyqtconfig.QtModuleMakefile.finalise(self) Index: python/CMakeLists.txt =================================================================== --- python/CMakeLists.txt (revision 12765) +++ python/CMakeLists.txt (working copy) @@ -1,105 +1,75 @@ + SUBDIRS(plugins) -IF (WIN32) - SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.pyd) - SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.pyd) - SET(BINDINGS_ANALYSIS_LIB ${CMAKE_CURRENT_BINARY_DIR}/analysis/analysis.pyd) - IF (NOT MSVC) - SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dll) - SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dll) - SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.dll) - ELSE (NOT MSVC) - SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/${CMAKE_CFG_INTDIR}/qgis_core.lib) - SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/${CMAKE_CFG_INTDIR}/qgis_gui.lib) - SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/${CMAKE_CFG_INTDIR}/qgis_analysis.lib) - ENDIF (NOT MSVC) -ELSE (WIN32) - SET(BINDINGS_CORE_LIB ${CMAKE_CURRENT_BINARY_DIR}/core/core.so) - SET(BINDINGS_GUI_LIB ${CMAKE_CURRENT_BINARY_DIR}/gui/gui.so) - SET(BINDINGS_ANALYSIS_LIB ${CMAKE_CURRENT_BINARY_DIR}/analysis/analysis.so) - IF (APPLE) - SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.dylib) - SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.dylib) - SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.dylib) - ELSE (APPLE) - SET(QGIS_CORE_LIB ${CMAKE_BINARY_DIR}/src/core/libqgis_core.so) - SET(QGIS_GUI_LIB ${CMAKE_BINARY_DIR}/src/gui/libqgis_gui.so) - SET(QGIS_ANALYSIS_LIB ${CMAKE_BINARY_DIR}/src/analysis/libqgis_analysis.so) - ENDIF (APPLE) -ENDIF (WIN32) -SET (BINDINGS_LIBS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB} ${BINDINGS_ANALYSIS_LIB}) -SET (BINDINGS_CORE_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/core/Makefile) -SET (BINDINGS_GUI_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/gui/Makefile) -SET (BINDINGS_ANALYSIS_MAKEFILE ${CMAKE_CURRENT_BINARY_DIR}/analysis/Makefile) +SET (QT_INCLUDES + ${QT_QTCORE_INCLUDE_DIR} + ${QT_QTGUI_INCLUDE_DIR} + ${QT_QTNETWORK_INCLUDE_DIR} + ${QT_QTSVG_INCLUDE_DIR} + ${QT_QTXML_INCLUDE_DIR} +) -# 'python' target will force to build bindings libs for core and gui -ADD_CUSTOM_TARGET (python ALL DEPENDS ${BINDINGS_CORE_LIB} ${BINDINGS_GUI_LIB} ${BINDINGS_ANALYSIS_LIB}) +SET (QT_LIBS + ${QT_QTCORE_LIBRARY} + ${QT_QTGUI_LIBRARY} + ${QT_QTNETWORK_LIBRARY} + ${QT_QTSVG_LIBRARY} + ${QT_QTXML_LIBRARY} +) -# don't run python before the libs are built -ADD_DEPENDENCIES (python qgis_core qgis_gui qgis_analysis) +INCLUDE_DIRECTORIES( + ${PYTHON_INCLUDE_PATH} + ${SIP_INCLUDE_DIR} + ${QT_INCLUDES} + ${GDAL_INCLUDE_DIR} + ${GEOS_INCLUDE_DIR} -FILE(GLOB CORE_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/core/*.sip") -FILE(GLOB GUI_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/gui/*.sip") -FILE(GLOB ANALYSIS_SIP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/analysis/*.sip") + ../src/core + ../src/core/composer + ../src/core/raster + ../src/core/renderer + ../src/core/spatialindex + ../src/core/symbology + ../src/core/symbology-ng + ${CMAKE_BINARY_DIR} # qgsconfig.h, qgssvnversion.h +) -# Step 1: during configuration -# create file configure.py from configure.py.in -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/configure.py.in - ${CMAKE_CURRENT_BINARY_DIR}/configure.py) - -IF (MSVC) - SET(EXPORT "__declspec(dllimport)") -ELSE (MSVC) - SET(EXPORT "") -ENDIF (MSVC) -# Step 2: during make -# run python configure.py -# it will run SIP utility to generate sources and will prepare makefiles -# should be run everytime core or gui library has been changed -ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_MAKEFILE} ${BINDINGS_GUI_MAKEFILE} ${BINDINGS_ANALYSIS_MAKEFILE} PRE_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS ${CMAKE_CURRENT_BINARY_DIR}/configure.py ${CMAKE_CFG_INTDIR} ${EXPORT} - DEPENDS ${QGIS_CORE_LIB} ${QGIS_GUI_LIB} ${QGIS_ANALYSIS_LIB} - ${CMAKE_CURRENT_BINARY_DIR}/configure.py - ${CORE_SIP_FILES} ${GUI_SIP_FILES} ${ANALYSIS_SIP_FILES}) +# core module +FILE(GLOB sip_files_core core/*.sip) +set(SIP_EXTRA_FILES_DEPEND ${sip_files_core}) +ADD_SIP_PYTHON_MODULE(qgis.core core/core.sip qgis_core ${QT_LIBS}) -# Step 3: run make in core and gui subdirs -ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_CORE_LIB} PRE_LINK - COMMAND ${SIP_MAKE_PROGRAM} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/core - DEPENDS ${BINDINGS_CORE_MAKEFILE}) -ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_GUI_LIB} PRE_LINK - COMMAND ${SIP_MAKE_PROGRAM} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gui - DEPENDS ${BINDINGS_GUI_MAKEFILE}) -ADD_CUSTOM_COMMAND(OUTPUT ${BINDINGS_ANALYSIS_LIB} PRE_LINK - COMMAND ${SIP_MAKE_PROGRAM} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/analysis - DEPENDS ${BINDINGS_ANALYSIS_MAKEFILE}) +# additional gui includes +INCLUDE_DIRECTORIES( + ../src/gui + ../src/gui/symbology-ng + ../src/plugins + ${CMAKE_BINARY_DIR}/src/gui + ${CMAKE_BINARY_DIR}/src/ui +) -IF (BINDINGS_GLOBAL_INSTALL) +# gui module +FILE(GLOB sip_files_gui gui/*.sip) +set(SIP_EXTRA_FILES_DEPEND ${sip_files_gui}) +ADD_SIP_PYTHON_MODULE(qgis.gui gui/gui.sip qgis_core qgis_gui ${QT_LIBS}) -# python's site-packages dir: bindings will be installed here -IF (UNIX) - SET (CMD "from distutils.sysconfig import get_python_lib; print get_python_lib(1)") -ELSE (UNIX) - SET (CMD " -import sys -print sys.exec_prefix + '/lib/site-packages' -") -ENDIF (UNIX) +# additional analysis includes +INCLUDE_DIRECTORIES( + ../src/analysis/vector + ${CMAKE_BINARY_DIR}/src/analysis/vector +) -EXEC_PROGRAM(${PYTHON_EXECUTABLE} ARGS -c "\"${CMD}\"" OUTPUT_VARIABLE SITE_PKG_PATH) +# analysis module +FILE(GLOB sip_files_analysis analysis/*.sip) +set(SIP_EXTRA_FILES_DEPEND ${sip_files_analysis}) +ADD_SIP_PYTHON_MODULE(qgis.analysis analysis/analysis.sip qgis_core qgis_analysis ${QT_LIBS}) -ELSE (BINDINGS_GLOBAL_INSTALL) - SET (SITE_PKG_PATH ${QGIS_DATA_DIR}/python) - -ENDIF (BINDINGS_GLOBAL_INSTALL) +SET (QGIS_PYTHON_DIR ${PYTHON_SITE_PACKAGES_DIR}/qgis) +ADD_CUSTOM_TARGET(compile_python_files ALL) - -# Step 4: install built libs to python's site packages -INSTALL(FILES __init__.py utils.py console.py ${CMAKE_CURRENT_BINARY_DIR}/qgisconfig.py ${BINDINGS_LIBS} DESTINATION ${SITE_PKG_PATH}/qgis) - +PYTHON_INSTALL(__init__.py ${QGIS_PYTHON_DIR}) +PYTHON_INSTALL(utils.py ${QGIS_PYTHON_DIR}) +PYTHON_INSTALL(console.py ${QGIS_PYTHON_DIR}) Index: python/configure.py.in =================================================================== --- python/configure.py.in (revision 12765) +++ python/configure.py.in (working copy) @@ -1,213 +0,0 @@ - -import os, os.path -import copy, glob, sys -import sipconfig -import PyQt4.pyqtconfig - -src_path = '@CMAKE_SOURCE_DIR@' -build_path = '@CMAKE_BINARY_DIR@' -python_path = src_path + '/python' -gdal_inc_dir = '@GDAL_INCLUDE_DIR@' -geos_inc_dir = '@GEOS_INCLUDE_DIR@' - -qt_libs = ["QtCore","QtGui","QtNetwork","QtSvg","QtXml"] -if sys.platform == 'darwin': - qt_libs.append("QtSql") - # possibility of universal build of bindings, if more than 1 arch - osx_archs = '@CMAKE_OSX_ARCHITECTURES@' - osx_archs = osx_archs.strip(';') - if osx_archs.count(';') > 0: - osx_universal = '@CMAKE_OSX_SYSROOT@' - else: - osx_universal = '' -else: - osx_universal = '' - -if len(sys.argv)>1: - intdir = "/" + sys.argv[1] -else: - intdir = "" - -if len(sys.argv)>2: - export = sys.argv[2] -else: - export = "" - -# create paths for temporary files if don't exist -if not os.path.isdir("./core"): - os.mkdir("./core") -if not os.path.isdir("./gui"): - os.mkdir("./gui") -if not os.path.isdir("./analysis"): - os.mkdir("./analysis") - -########################################################################## -# SIP -> *.CPP + *.H - -# The name of the SIP build file generated by SIP and used by the build -# system. -build_file_core = build_path + "/python/core/core.sbf" -build_file_gui = build_path + "/python/gui/gui.sbf" -build_file_analysis = build_path + "/python/analysis/analysis.sbf" - -# Get the SIP configuration information. -config = PyQt4.pyqtconfig.Configuration() - -# Get the extra SIP flags needed by the imported qt module. Note that -# this normally only includes those flags (-x and -t) that relate to SIP's -# versioning system. -qt_sip_flags = config.pyqt_sip_flags - -# directory where modules will be installed -mod_dir = os.path.join(config.default_mod_dir, "qgis") - -# directory where sip files will be installed -sip_dir_core = os.path.join(config.default_sip_dir, "qgis/core") -sip_dir_gui = os.path.join(config.default_sip_dir, "qgis/gui") -sip_dir_analysis = os.path.join(config.default_sip_dir, "qgis/analysis") - -# Run SIP to generate the code. -print "Parsing SIP files for 'core' library..." -cmd = " ".join([config.sip_bin, "-c", "core", "-b", build_file_core, "-I", config.pyqt_sip_dir, qt_sip_flags, python_path + "/core/core.sip"]) -print cmd -os.system(cmd) - -print "Parsing SIP files for 'gui' library..." -cmd = " ".join([config.sip_bin, "-c", "gui", "-b", build_file_gui, "-I", python_path, "-I", config.pyqt_sip_dir, qt_sip_flags, python_path + "/gui/gui.sip"]) -print cmd -os.system(cmd) - -print "Parsing SIP files for 'analysis' library..." -cmd = " ".join([config.sip_bin, "-c", "analysis", "-b", build_file_analysis, "-I", python_path, "-I", config.pyqt_sip_dir, qt_sip_flags, python_path + "/analysis/analysis.sip"]) -print cmd -os.system(cmd) - - -########################################################################## -# MAKEFILES - -print "Creating makefiles..." - -# We are going to install the SIP specification file for this module and -# its configuration module. -installs = [] - -# directories relative to core (gui, analysis) directories -installs.append([[python_path + "__init__.py", python_path + "qgisconfig.py"], mod_dir]) - - -installs_core = copy.copy(installs) -installs_gui = copy.copy(installs) -installs_analysis = copy.copy(installs) - -# install all sip files -sips_core = glob.glob(python_path + "/core/*.sip") -for sip in sips_core: - installs_core.append([os.path.basename(sip), sip_dir_core]) - -sips_gui = glob.glob(python_path + "/gui/*.sip") -for sip in sips_gui: - installs_gui.append([os.path.basename(sip), sip_dir_gui]) - -sips_analysis = glob.glob(python_path + "/analysis/*.sip") -for sip in sips_analysis: - installs_analysis.append([os.path.basename(sip), sip_dir_analysis]) - - -# Create the Makefile. The QtModuleMakefile class provided by the -# pyqtconfig module takes care of all the extra preprocessor, compiler and -# linker flags needed by the Qt library. -makefile_core = sipconfig.ModuleMakefile( - configuration=config, - qt=qt_libs, - build_file=build_file_core, - installs=installs_core, - install_dir=mod_dir, - dir="core", - universal=osx_universal) - -makefile_gui = sipconfig.ModuleMakefile( - configuration=config, - qt=qt_libs, - build_file=build_file_gui, - installs=installs_gui, - install_dir=mod_dir, - dir="gui", - universal=osx_universal) - -makefile_analysis = sipconfig.ModuleMakefile( - configuration=config, - qt=qt_libs, - build_file=build_file_analysis, - installs=installs_analysis, - install_dir=mod_dir, - dir="analysis", - universal=osx_universal) - -# common settings for core, gui and analysis libs -for mk in [ makefile_core, makefile_gui, makefile_analysis ]: - mk.extra_lflags.extend( "@CMAKE_MODULE_LINKER_FLAGS@".strip(' ').split(' ') ) - mk.extra_libs = ["qgis_core"] - mk.extra_lib_dirs = [build_path+"/src/core"+intdir] - mk.extra_include_dirs = [src_path+"/src/core", src_path+"/src/core/composer", - src_path+"/src/core/raster", - src_path+"/src/core/renderer", - src_path+"/src/core/spatialindex", - src_path+"/src/core/symbology", - src_path+"/src/core/symbology-ng", - build_path, # qgsconfig.h, qgssvnversion.h - gdal_inc_dir, - geos_inc_dir] - mk.extra_cxxflags = ["-DCORE_EXPORT="+export] - -# more settings for gui lib -makefile_gui.extra_libs.append("qgis_gui") -makefile_gui.extra_lib_dirs.append(build_path+"/src/gui"+intdir) -makefile_gui.extra_include_dirs.append(src_path+"/src/gui") -makefile_gui.extra_include_dirs.append(src_path+"/src/gui/symbology-ng") -makefile_gui.extra_include_dirs.append(build_path+"/src/gui") -makefile_gui.extra_include_dirs.append(build_path+"/src/ui") -makefile_gui.extra_include_dirs.append(src_path+"/src/plugins") # because of qgisplugin.h TODO: sort out -makefile_gui.extra_cxxflags.append("-DGUI_EXPORT="+export) - -# more settings for analysis lib -makefile_analysis.extra_libs.append("qgis_analysis") -makefile_analysis.extra_lib_dirs.append(build_path+"/src/analysis"+intdir) -makefile_analysis.extra_include_dirs.append(src_path+"/src/analysis/vector") -makefile_analysis.extra_include_dirs.append(build_path+"/src/analysis/vector") -makefile_analysis.extra_include_dirs.append(src_path+"/src/plugins") # because of qgisplugin.h TODO: sort out -makefile_analysis.extra_cxxflags.append("-DANALYSIS_EXPORT="+export) - -# Generate the Makefile itself. -makefile_core.generate() -makefile_gui.generate() -makefile_analysis.generate() - -########################################################################## -# QGIS CONFIG - -print "Creating qgisconfig.py..." - -# Now we create the configuration module. This is done by merging a Python -# dictionary (whose values are normally determined dynamically) with a -# (static) template. -content = { - # Publish where the SIP specifications for this module will be - # installed. - "qgis_sip_dir": config.default_sip_dir, - - "qgis_mod_dir": mod_dir, - - # Publish the set of SIP flags needed by this module. As these are the - # same flags needed by the qt module we could leave it out, but this - # allows us to change the flags at a later date without breaking - # scripts that import the configuration module. - "qgis_sip_flags": qt_sip_flags -} - -# This creates the qgisconfig.py module from the qgisconfig.py.in -# template and the dictionary. -sipconfig.create_config_module(build_path+"/python/qgisconfig.py", src_path+"/python/qgisconfig.py.in", content) - -print "Done" - Index: CMakeLists.txt =================================================================== --- CMakeLists.txt (revision 12765) +++ CMakeLists.txt (working copy) @@ -157,13 +157,6 @@ FIND_PACKAGE(SPATIALITE) ENDIF (WITH_SPATIALITE AND NOT WITH_INTERNAL_SPATIALITE) -IF (WITH_BINDINGS) - # python support: - # - mapserver export tool - # - bindings - INCLUDE (Python) # file cmake/Python.cmake -ENDIF (WITH_BINDINGS) - IF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND) MESSAGE (SEND_ERROR "Some dependencies were not found!") ENDIF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND) @@ -351,6 +344,32 @@ ENDIF (UNIX) ############################################################# +# Python bindings + +IF (WITH_BINDINGS) + + # python support: check for interpreter, sip, pyqt4 + FIND_PACKAGE(PythonInterp REQUIRED) + FIND_PACKAGE(PythonLibrary REQUIRED) + FIND_PACKAGE(SIP REQUIRED) + FIND_PACKAGE(PyQt4 REQUIRED) + INCLUDE(PythonMacros) + INCLUDE(SIPMacros) + INCLUDE(PyQt4Macros) + + # setup SIP variables + separate_arguments(PYQT4_SIP_FLAGS) # convert space separated values to a list + set(SIP_INCLUDES ${PYQT4_SIP_DIR} ${CMAKE_SOURCE_DIR}/python) + set(SIP_CONCAT_PARTS 4) + set(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS}) + + IF (NOT BINDINGS_GLOBAL_INSTALL) + set(PYTHON_SITE_PACKAGES_DIR ${QGIS_DATA_DIR}/python) + ENDIF (NOT BINDINGS_GLOBAL_INSTALL) + +ENDIF (WITH_BINDINGS) + +############################################################# # create qgsconfig.h CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake_templates/qgsconfig.h.in ${CMAKE_BINARY_DIR}/qgsconfig.h) @@ -401,11 +420,9 @@ SUBDIRS(src doc images resources i18n) -IF (HAVE_PYTHON AND WITH_BINDINGS) +IF (WITH_BINDINGS) SUBDIRS (python) -ELSE (HAVE_PYTHON AND WITH_BINDINGS) - MESSAGE (STATUS "Python not being built") -ENDIF (HAVE_PYTHON AND WITH_BINDINGS) +ENDIF (WITH_BINDINGS) IF (ENABLE_TESTS) #create a variable to specify where our test data is