mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-03 00:14:12 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			270 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
SET(PYTHON_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/python)
 | 
						|
 | 
						|
IF (WITH_INTERNAL_SPATIALITE)
 | 
						|
  INCLUDE_DIRECTORIES(
 | 
						|
    ../src/core/spatialite/headers
 | 
						|
    ../src/core/spatialite/headers/spatialite
 | 
						|
  )
 | 
						|
ENDIF (WITH_INTERNAL_SPATIALITE)
 | 
						|
 | 
						|
SET (QGIS_PYTHON_OUTPUT_DIRECTORY ${PYTHON_OUTPUT_DIRECTORY}/qgis)
 | 
						|
FILE (MAKE_DIRECTORY ${QGIS_PYTHON_OUTPUT_DIRECTORY})
 | 
						|
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${QGIS_PYTHON_OUTPUT_DIRECTORY})
 | 
						|
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${QGIS_PYTHON_OUTPUT_DIRECTORY})
 | 
						|
 | 
						|
# Python plugins and support packages can be staged to PYTHON_OUTPUT_DIRECTORY
 | 
						|
# so plugins will function when app is run from build directory
 | 
						|
 | 
						|
# When staging all plugins, use the following make targets:
 | 
						|
#   staged-plugins - stage plugins (usually after repo pull/build and project make)
 | 
						|
#   staged-plugins-pyc - stage and byte-compile all
 | 
						|
#   clean-staged-plugins - removes the staged plugins' directories
 | 
						|
#
 | 
						|
# NOTE: regular project 'make install' is unaffected
 | 
						|
 | 
						|
# Other target dependenciess will be added, per staged resource
 | 
						|
ADD_CUSTOM_TARGET(staged-plugins)
 | 
						|
 | 
						|
# Plugins can also be staged with CMake option at build time
 | 
						|
IF(WITH_STAGED_PLUGINS)
 | 
						|
  ADD_CUSTOM_TARGET(staged-plugins-on-build ALL DEPENDS staged-plugins)
 | 
						|
ENDIF(WITH_STAGED_PLUGINS)
 | 
						|
 | 
						|
# Non-default/non-option-controlled target to stage and compile plugins and extras
 | 
						|
ADD_CUSTOM_TARGET(staged-plugins-pyc DEPENDS staged-plugins
 | 
						|
  COMMAND ${PYTHON_EXECUTABLE} -m compileall -q "${PYTHON_OUTPUT_DIRECTORY}"
 | 
						|
  WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
 | 
						|
  COMMENT "Byte-compiling build output/python directory..."
 | 
						|
)
 | 
						|
 | 
						|
# Other custom commands will be added, per staged resource
 | 
						|
ADD_CUSTOM_TARGET(clean-staged-plugins
 | 
						|
  COMMAND ${CMAKE_COMMAND} -E remove_directory "${PYTHON_OUTPUT_DIRECTORY}/plugins"
 | 
						|
)
 | 
						|
 | 
						|
# Macro to byte-compile a target's staged Python resource(s)
 | 
						|
MACRO(PY_COMPILE TARGET_NAME RESOURCE_PATHS)
 | 
						|
  IF(WITH_PY_COMPILE)
 | 
						|
    ADD_CUSTOM_COMMAND(TARGET ${TARGET_NAME}
 | 
						|
      POST_BUILD
 | 
						|
      COMMAND ${PYTHON_EXECUTABLE} -m compileall -q ${RESOURCE_PATHS}
 | 
						|
      WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
 | 
						|
      COMMENT "Byte-compiling staged resource..."
 | 
						|
    )
 | 
						|
  ENDIF(WITH_PY_COMPILE)
 | 
						|
ENDMACRO(PY_COMPILE)
 | 
						|
 | 
						|
ADD_SUBDIRECTORY(plugins)
 | 
						|
ADD_SUBDIRECTORY(qsci_apis)
 | 
						|
ADD_SUBDIRECTORY(console)
 | 
						|
ADD_SUBDIRECTORY(pyplugin_installer)
 | 
						|
ADD_SUBDIRECTORY(ext-libs)
 | 
						|
 | 
						|
INCLUDE_DIRECTORIES(
 | 
						|
  ${PYTHON_INCLUDE_PATH}
 | 
						|
  ${SIP_INCLUDE_DIR}
 | 
						|
  ${QT_QTCORE_INCLUDE_DIR}
 | 
						|
  ${QT_QTGUI_INCLUDE_DIR}
 | 
						|
  ${QT_QTNETWORK_INCLUDE_DIR}
 | 
						|
  ${QT_QTSVG_INCLUDE_DIR}
 | 
						|
  ${QT_QTXML_INCLUDE_DIR}
 | 
						|
  ${GDAL_INCLUDE_DIR}
 | 
						|
  ${GEOS_INCLUDE_DIR}
 | 
						|
  ${QWT_INCLUDE_DIR}
 | 
						|
  ${QEXTSERIALPORT_INCLUDE_DIR}
 | 
						|
  ${QSCINTILLA_INCLUDE_DIR}
 | 
						|
 | 
						|
  ../src/core
 | 
						|
  ../src/core/pal
 | 
						|
  ../src/core/composer
 | 
						|
  ../src/core/diagram
 | 
						|
  ../src/core/dxf
 | 
						|
  ../src/core/gps
 | 
						|
  ../src/core/layertree
 | 
						|
  ../src/core/raster
 | 
						|
  ../src/core/symbology-ng
 | 
						|
 | 
						|
  ../src/gui/raster
 | 
						|
  ../src/gui/attributetable
 | 
						|
  ../src/gui/editorwidgets
 | 
						|
  ../src/gui/editorwidgets/core
 | 
						|
  ../src/gui/layertree
 | 
						|
 | 
						|
  ${CMAKE_BINARY_DIR}  # qgsconfig.h, qgsversion.h
 | 
						|
)
 | 
						|
 | 
						|
IF(NOT ANDROID)
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} ANDROID)
 | 
						|
ENDIF(NOT ANDROID)
 | 
						|
 | 
						|
IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
 | 
						|
ELSE(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} ARM)
 | 
						|
ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
 | 
						|
 | 
						|
IF(NOT WITH_TOUCH)
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} HAVE_TOUCH)
 | 
						|
ENDIF(NOT WITH_TOUCH)
 | 
						|
 | 
						|
IF(NOT QT_MOBILITY_LOCATION_FOUND)
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} MOBILITY_LOCATION)
 | 
						|
ENDIF(NOT QT_MOBILITY_LOCATION_FOUND)
 | 
						|
 | 
						|
IF(PYQT4_VERSION_NUM LESS 263680)	# 0x040600
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} PROXY_FACTORY)
 | 
						|
ENDIF(PYQT4_VERSION_NUM LESS 263680)
 | 
						|
 | 
						|
IF(NOT PYQT4_VERSION_NUM LESS 263941)	# 0x040705
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} QSETINT_CONVERSION)
 | 
						|
ENDIF(NOT PYQT4_VERSION_NUM LESS 263941)
 | 
						|
 | 
						|
IF(NOT PYQT4_VERSION_NUM LESS 264194)	# 0x040802
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} QSETTYPE_CONVERSION)
 | 
						|
ENDIF(NOT PYQT4_VERSION_NUM LESS 264194)
 | 
						|
 | 
						|
IF(PYQT4_VERSION_NUM LESS 264196)       # 0x040804
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} QLISTCONSTPTR_CONVERSION)
 | 
						|
ENDIF(PYQT4_VERSION_NUM LESS 264196)
 | 
						|
 | 
						|
IF(NOT PYQT4_VERSION_NUM LESS 264453)	# 0x040905
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} QVECTORINT_CONVERSION)
 | 
						|
ENDIF(NOT PYQT4_VERSION_NUM LESS 264453)
 | 
						|
 | 
						|
# core module
 | 
						|
FILE(GLOB_RECURSE sip_files_core core/*.sip)
 | 
						|
SET(SIP_EXTRA_FILES_DEPEND ${sip_files_core})
 | 
						|
SET(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS} -o -a ${CMAKE_BINARY_DIR}/python/qgis.core.api)
 | 
						|
ADD_SIP_PYTHON_MODULE(qgis._core core/core.sip qgis_core)
 | 
						|
 | 
						|
# additional gui includes
 | 
						|
INCLUDE_DIRECTORIES(
 | 
						|
  ../src/gui
 | 
						|
  ../src/gui/symbology-ng
 | 
						|
  ../src/plugins
 | 
						|
  ${CMAKE_BINARY_DIR}/src/gui
 | 
						|
  ${CMAKE_BINARY_DIR}/src/ui
 | 
						|
)
 | 
						|
 | 
						|
# gui module
 | 
						|
FILE(GLOB_RECURSE sip_files_gui gui/*.sip)
 | 
						|
SET(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_gui})
 | 
						|
SET(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS} -o -a ${CMAKE_BINARY_DIR}/python/qgis.gui.api)
 | 
						|
IF(QSCI_SIP_DIR)
 | 
						|
  SET(SIP_EXTRA_OPTIONS ${SIP_EXTRA_OPTIONS} -I ${QSCI_SIP_DIR})
 | 
						|
ELSE(QSCI_SIP_DIR)
 | 
						|
  MESSAGE(STATUS "Qsci sip file not found - disabling bindings for derived classes")
 | 
						|
  SET(SIP_DISABLE_FEATURES ${SIP_DISABLE_FEATURES} HAVE_QSCI_SIP)
 | 
						|
ENDIF(QSCI_SIP_DIR)
 | 
						|
 | 
						|
IF(UNIX AND NOT SIP_VERSION_NUM LESS 265984)
 | 
						|
  SET(SIP_EXTRA_OPTIONS -P ${SIP_EXTRA_OPTIONS})
 | 
						|
  ADD_DEFINITIONS(-Dprotected=public)
 | 
						|
ENDIF(UNIX AND NOT SIP_VERSION_NUM LESS 265984)
 | 
						|
 | 
						|
ADD_SIP_PYTHON_MODULE(qgis._gui gui/gui.sip qgis_core qgis_gui)
 | 
						|
 | 
						|
# additional analysis includes
 | 
						|
INCLUDE_DIRECTORIES(
 | 
						|
  ../src/analysis/vector
 | 
						|
  ../src/analysis/raster
 | 
						|
  ../src/analysis/network
 | 
						|
  ../src/analysis/interpolation
 | 
						|
  ${CMAKE_BINARY_DIR}/src/analysis/vector
 | 
						|
  ${CMAKE_BINARY_DIR}/src/analysis/network
 | 
						|
  ${CMAKE_BINARY_DIR}/src/analysis/raster
 | 
						|
  ${CMAKE_BINARY_DIR}/src/analysis/interpolation
 | 
						|
)
 | 
						|
 | 
						|
# analysis module
 | 
						|
FILE(GLOB sip_files_analysis
 | 
						|
  analysis/*.sip
 | 
						|
  analysis/raster/*.sip
 | 
						|
  analysis/vector/*.sip
 | 
						|
  analysis/interpolation/*.sip
 | 
						|
)
 | 
						|
SET(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_analysis})
 | 
						|
SET(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS} -o -a ${CMAKE_BINARY_DIR}/python/qgis.analysis.api)
 | 
						|
ADD_SIP_PYTHON_MODULE(qgis._analysis analysis/analysis.sip qgis_core qgis_analysis)
 | 
						|
 | 
						|
# network-analysis module
 | 
						|
FILE(GLOB_RECURSE sip_files_network_analysis analysis/network/*.sip)
 | 
						|
SET(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_network_analysis})
 | 
						|
SET(SIP_EXTRA_OPTIONS ${PYQT4_SIP_FLAGS} -o -a ${CMAKE_BINARY_DIR}/python/qgis.networkanalysis.api)
 | 
						|
ADD_SIP_PYTHON_MODULE(qgis._networkanalysis analysis/network/networkanalysis.sip qgis_core qgis_networkanalysis)
 | 
						|
 | 
						|
SET(QGIS_PYTHON_DIR ${PYTHON_SITE_PACKAGES_DIR}/qgis)
 | 
						|
 | 
						|
IF(WITH_QSCIAPI)
 | 
						|
  # wait until after python module builds for api files to be available
 | 
						|
  SET(QGIS_PYTHON_API_FILE "${CMAKE_BINARY_DIR}/python/qsci_apis/PyQGIS.api")
 | 
						|
 | 
						|
  ADD_CUSTOM_TARGET(qsci-api ALL
 | 
						|
    DEPENDS python_module_qgis__gui python_module_qgis__core python_module_qgis__analysis python_module_qgis__networkanalysis)
 | 
						|
 | 
						|
  # run update/concatenate command
 | 
						|
  ADD_CUSTOM_COMMAND(TARGET qsci-api
 | 
						|
    POST_BUILD
 | 
						|
    COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/cmake/QsciAPI.cmake"
 | 
						|
    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
 | 
						|
    COMMENT "Generating pyqgis api file" VERBATIM)
 | 
						|
 | 
						|
  INSTALL(FILES ${QGIS_PYTHON_API_FILE} DESTINATION "${QGIS_DATA_DIR}/python/qsci_apis")
 | 
						|
 | 
						|
  # create target for generating console auto-completion *.pap binary file
 | 
						|
  # takes too long to build (> 1 minute) for targets to have ALL property
 | 
						|
  SET(APIS_SRC_DIR "${CMAKE_SOURCE_DIR}/python/qsci_apis")
 | 
						|
  SET(APIS_BIN_DIR "${CMAKE_BINARY_DIR}/python/qsci_apis")
 | 
						|
 | 
						|
  # generate a .pap file to be immediately installed in QGIS source tree (the default .pap)
 | 
						|
  ADD_CUSTOM_TARGET(qsci-pap-src
 | 
						|
    DEPENDS qsci-api ${QGIS_PYTHON_API_FILE})
 | 
						|
 | 
						|
  SET(PAP_NAME "pyqgis.pap")
 | 
						|
  ADD_CUSTOM_COMMAND(TARGET qsci-pap-src
 | 
						|
    POST_BUILD
 | 
						|
    COMMAND ${PYTHON_EXECUTABLE} "${APIS_SRC_DIR}/generate_console_pap.py" "${APIS_SRC_DIR}/${PAP_NAME}" "${APIS_SRC_DIR}" "${APIS_BIN_DIR}"
 | 
						|
    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
 | 
						|
    COMMENT "Generating ${PAP_NAME} for console auto-completion (MAY TAKE > 1 MINUTE!)" VERBATIM)
 | 
						|
ENDIF(WITH_QSCIAPI)
 | 
						|
 | 
						|
IF(WITH_CUSTOM_WIDGETS)
 | 
						|
  INSTALL(FILES custom_widgets/qgis_customwidgets.py DESTINATION "${PYUIC_WIDGET_PLUGIN_DIRECTORY}")
 | 
						|
ENDIF(WITH_CUSTOM_WIDGETS)
 | 
						|
 | 
						|
# Plugin utilities files to copy to staging or install
 | 
						|
SET(PY_FILES
 | 
						|
  __init__.py
 | 
						|
  utils.py
 | 
						|
)
 | 
						|
 | 
						|
ADD_CUSTOM_TARGET(pyutils ALL)
 | 
						|
INSTALL(FILES ${PY_FILES} DESTINATION "${QGIS_PYTHON_DIR}")
 | 
						|
 | 
						|
# stage to output to make available when QGIS is run from build directory
 | 
						|
FOREACH(pyfile ${PY_FILES})
 | 
						|
  ADD_CUSTOM_COMMAND(TARGET pyutils
 | 
						|
    POST_BUILD
 | 
						|
    COMMAND ${CMAKE_COMMAND} -E copy ${pyfile} "${QGIS_PYTHON_OUTPUT_DIRECTORY}"
 | 
						|
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
						|
    DEPENDS ${pyfile}
 | 
						|
  )
 | 
						|
  PY_COMPILE(pyutils "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${pyfile}")
 | 
						|
ENDFOREACH(pyfile)
 | 
						|
 | 
						|
FOREACH(module core gui analysis networkanalysis)
 | 
						|
  ADD_CUSTOM_TARGET(py${module} ALL)
 | 
						|
  ADD_DEPENDENCIES(py${module} python_module_qgis__${module})
 | 
						|
  FILE(GLOB_RECURSE PY_FILES "${module}/*.py")
 | 
						|
  INSTALL(FILES ${PY_FILES} DESTINATION "${QGIS_PYTHON_DIR}/${module}")
 | 
						|
  FOREACH(pyfile ${PY_FILES})
 | 
						|
    ADD_CUSTOM_COMMAND(TARGET py${module}
 | 
						|
      POST_BUILD
 | 
						|
      COMMAND ${CMAKE_COMMAND} -E make_directory "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}"
 | 
						|
      COMMAND ${CMAKE_COMMAND} -E copy ${pyfile} "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}"
 | 
						|
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
						|
      DEPENDS ${PY_FILES}
 | 
						|
    )
 | 
						|
  ENDFOREACH(pyfile)
 | 
						|
  PY_COMPILE(py${module} "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}")
 | 
						|
ENDFOREACH(module)
 |