Skip to content

Commit

Permalink
produce and install pyqgis.pap (superceeds #51429)
Browse files Browse the repository at this point in the history
  • Loading branch information
jef-n committed Jan 25, 2023
1 parent c513bad commit d7846a8
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 34 deletions.
5 changes: 2 additions & 3 deletions cmake/QsciAPI.cmake
Expand Up @@ -22,12 +22,11 @@ ENDIF(EXISTS "${CMAKE_BINARY_DIR}/python/qgis.gui.api")
# add qgis.core.NULL attribute defined in <src>/python/__init__.py for QPyNullVariant
FILE(APPEND "${QGIS_PYTHON_API_FILE}" "qgis.core.NULL?7\n")

FOREACH(apiFile qgis.core.api qgis.gui.api qgis.analysis.api qgis.server.api qgis.qgis3d.api)
SET(api "${CMAKE_BINARY_DIR}/python/${apiFile}")
FOREACH(api ${APIS})
IF(EXISTS "${api}")
FILE(READ "${api}" FILE_CONTENT)
STRING(REGEX REPLACE "([^\n]+)" "qgis.\\1" MODIFIED_CONTENT "${FILE_CONTENT}")
STRING(REPLACE "qgis._" "qgis." REPLACE_CONTENT "${MODIFIED_CONTENT}")
FILE(APPEND "${QGIS_PYTHON_API_FILE}" "${REPLACE_CONTENT}")
ENDIF(EXISTS "${api}")
ENDFOREACH(apiFile)
ENDFOREACH(api)
2 changes: 1 addition & 1 deletion cmake/SIPMacros.cmake
Expand Up @@ -101,7 +101,7 @@ MACRO(GENERATE_SIP_PYTHON_MODULE_CODE MODULE_NAME MODULE_SIP SIP_FILES CPP_FILES
ENDIF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} )
ENDFOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} )

SET(SIPCMD ${SIP_BUILD_EXECUTABLE} --no-protected-is-public --pep484-pyi --no-make --concatenate=${SIP_CONCAT_PARTS} --qmake=${QMAKE_EXECUTABLE} --include-dir=${CMAKE_CURRENT_BINARY_DIR} --include-dir=${PYQT_SIP_DIR} ${SIP_BUILD_EXTRA_OPTIONS})
SET(SIPCMD ${SIP_BUILD_EXECUTABLE} --no-protected-is-public --pep484-pyi --no-make --concatenate=${SIP_CONCAT_PARTS} --qmake=${QMAKE_EXECUTABLE} --include-dir=${CMAKE_CURRENT_BINARY_DIR} --include-dir=${PYQT_SIP_DIR} --api-dir ${CMAKE_BINARY_DIR}/python ${SIP_BUILD_EXTRA_OPTIONS})

ADD_CUSTOM_COMMAND(
OUTPUT ${_sip_output_files}
Expand Down
53 changes: 30 additions & 23 deletions python/CMakeLists.txt
Expand Up @@ -233,7 +233,7 @@ if (WITH_3D)

file(GLOB_RECURSE sip_files_3d 3d/*.sip 3d/*.sip.in)
set(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_3d})
set(SIP_EXTRA_OPTIONS ${PYQT_SIP_FLAGS} -g -o -a ${CMAKE_BINARY_DIR}/python/qgis.qgis3d.api)
set(SIP_EXTRA_OPTIONS ${PYQT_SIP_FLAGS} -g -o -a ${CMAKE_BINARY_DIR}/python/qgis.3d.api)
if((${SIP_VERSION_STR} VERSION_EQUAL 4.19.11) OR (${SIP_VERSION_STR} VERSION_GREATER 4.19.11))
set(SIP_EXTRA_OPTIONS ${SIP_EXTRA_OPTIONS} -n ${PYQT_SIP_IMPORT})
endif()
Expand Down Expand Up @@ -312,36 +312,43 @@ if(WITH_ANALYSIS)
endif()

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")
set(APIS_SRC_DIR "${CMAKE_SOURCE_DIR}/python/qsci_apis")
set(APIS_OUT_DIR "${CMAKE_BINARY_DIR}/python/qsci_apis")

add_custom_target(qsci-api ALL
DEPENDS python_module_qgis__gui python_module_qgis__core python_module_qgis__analysis)
# wait until after python module builds for api files to be available
set(QGIS_PYTHON_API_FILE "${APIS_OUT_DIR}/PyQGIS.api")
set(QGIS_PYTHON_PAP_FILE "${APIS_OUT_DIR}/PyQGIS.pap")

set(api_modules)
set(api_files)
foreach(module ${PY_MODULES})
set(api_modules ${api_modules} python_module_qgis__${module})
if(NOT SIP_BUILD_EXECUTABLE)
set(api_files ${api_files} "${CMAKE_BINARY_DIR}/python/qgis.${module}.api")
else()
set(api_files ${api_files} "${CMAKE_BINARY_DIR}/python/${module}/build/QGIS.api")
endif()
endforeach()

# run update/concatenate command
add_custom_command(TARGET qsci-api
POST_BUILD
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/cmake/QsciAPI.cmake"
add_custom_command(
OUTPUT "${QGIS_PYTHON_API_FILE}"
DEPENDS ${api_modules}
COMMAND "${CMAKE_COMMAND}" -D "APIS=${api_files}" -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}"
add_custom_command(
OUTPUT "${QGIS_PYTHON_PAP_FILE}"
DEPENDS "${QGIS_PYTHON_API_FILE}"
COMMAND ${Python_EXECUTABLE} "${APIS_SRC_DIR}/generate_console_pap.py" "${QGIS_PYTHON_PAP_FILE}" "${APIS_SRC_DIR}" "${APIS_OUT_DIR}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMENT "Generating ${PAP_NAME} for console auto-completion (MAY TAKE > 1 MINUTE!)" VERBATIM)
COMMENT "Generating pap file for console auto-completion" VERBATIM)

add_custom_target(pyqgis-pap ALL DEPENDS ${QGIS_PYTHON_API_FILE} ${QGIS_PYTHON_PAP_FILE})

install(FILES ${QGIS_PYTHON_API_FILE} ${QGIS_PYTHON_PAP_FILE} DESTINATION "${QGIS_DATA_DIR}/python/qsci_apis")
endif()

if(WITH_CUSTOM_WIDGETS)
Expand Down
10 changes: 4 additions & 6 deletions python/qsci_apis/generate_console_pap.py
Expand Up @@ -22,9 +22,9 @@
import sys
import os

from qgis.PyQt.Qsci import QsciLexerPython, QsciAPIs
from qgis.PyQt.QtWidgets import QApplication
from qgis.PyQt.QtCore import QObject
from PyQt5.Qsci import QsciLexerPython, QsciAPIs
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QObject


class PrepareAPIs(QObject):
Expand Down Expand Up @@ -84,10 +84,8 @@ def prepareAPI(self):
os.path.join(api_src_dir, 'OSGeo_GEOS-3.6.2.api'),
os.path.join(api_src_dir, 'OSGeo_GDAL-OGR-2.2.3.api')
]
# print api_files.__repr__()
# print pap_file.__repr__()

app = QApplication(sys.argv, False) # just start a non-gui console app
app = QApplication(sys.argv) # just start a non-gui console app
api_lexer = QsciLexerPython()
prepap = PrepareAPIs(api_lexer, api_files, pap_file)
prepap.prepareAPI()
Expand Down
Binary file removed python/qsci_apis/pyqgis.pap
Binary file not shown.
2 changes: 1 addition & 1 deletion src/gui/codeeditors/qgscodeeditorpython.cpp
Expand Up @@ -119,7 +119,7 @@ void QgsCodeEditorPython::initializeLexer()
{
if ( settings.value( QStringLiteral( "pythonConsole/preloadAPI" ), true ).toBool() )
{
mPapFile = QgsApplication::pkgDataPath() + QStringLiteral( "/python/qsci_apis/pyqgis.pap" );
mPapFile = QgsApplication::pkgDataPath() + QStringLiteral( "/python/qsci_apis/PyQGIS.pap" );
apis->loadPrepared( mPapFile );
}
else if ( settings.value( QStringLiteral( "pythonConsole/usePreparedAPIFile" ), false ).toBool() )
Expand Down

0 comments on commit d7846a8

Please sign in to comment.