Skip to content

Commit

Permalink
Assorted fixes towards PyQt6 support
Browse files Browse the repository at this point in the history
  • Loading branch information
manisandro committed Nov 30, 2022
1 parent 53715c3 commit ff9f283
Show file tree
Hide file tree
Showing 15 changed files with 104 additions and 58 deletions.
32 changes: 24 additions & 8 deletions CMakeLists.txt
Expand Up @@ -356,9 +356,6 @@ if(WITH_CORE)
find_package(GDAL)
find_package(Expat REQUIRED)
find_package(Spatialindex REQUIRED)
if (WITH_GUI)
find_package(Qwt REQUIRED)
endif()
find_package(LibZip REQUIRED)

find_package(Sqlite3)
Expand Down Expand Up @@ -445,9 +442,13 @@ if(WITH_CORE)
if (BUILD_WITH_QT6)
set(QT_MIN_VERSION 6.0.0)
set(QT_VERSION_BASE "Qt6")
set(QT_VERSION_BASE_LOWER "qt6")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
else()
set(QT_MIN_VERSION 5.14.0)
set(QT_VERSION_BASE "Qt5")
set(QT_VERSION_BASE_LOWER "qt5")
set(HAS_KDE_QT5_PDF_TRANSFORM_FIX FALSE CACHE BOOL "Using KDE's Qt 5.15 fork with the PDF brush transform fix")
set(HAS_KDE_QT5_SMALL_CAPS_FIX FALSE CACHE BOOL "Using KDE's Qt 5.15 fork with the QFont::SmallCaps fix")
set(HAS_KDE_QT5_FONT_STRETCH_FIX FALSE CACHE BOOL "Using KDE's Qt 5.15 fork with the QFont stretch fix")
Expand Down Expand Up @@ -507,6 +508,7 @@ if(WITH_CORE)
# search for QScintilla2 (C++ lib)
if (WITH_GUI)
find_package(QScintilla REQUIRED)
find_package(Qwt REQUIRED)
endif()

# Password helper
Expand Down Expand Up @@ -968,15 +970,29 @@ message("-- Found Python executable: ${Python_EXECUTABLE} (version ${Python_VERS
message("-- Python library: ${Python_LIBRARIES}")
message("-- Python site-packages: ${Python_SITEARCH}")

if (WITH_CORE AND WITH_BINDINGS AND NOT BUILD_WITH_QT6)
if (WITH_CORE AND WITH_BINDINGS)
set(PYTHON_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/python)
set (QGIS_PYTHON_OUTPUT_DIRECTORY ${PYTHON_OUTPUT_DIRECTORY}/qgis)

# python support: check for interpreter, sip, pyqt5
find_package(SIP REQUIRED)
find_package(PyQt5 REQUIRED)
set(PYQT_SIP_FLAGS ${PYQT5_SIP_FLAGS})
set(PYQT_SIP_DIR ${PYQT5_SIP_DIR})
if(BUILD_WITH_QT6)
find_package(PyQt6 REQUIRED)
set(PYQT_FOUND ${PYQT6_FOUND})
set(PYQT_SIP_FLAGS ${PYQT6_SIP_FLAGS})
set(PYQT_SIP_DIR ${PYQT6_SIP_DIR})
set(PYQT_SIP_IMPORT ${PYQT6_SIP_IMPORT})
set(PYQT_VERSION_STR ${PYQT6_VERSION_STR})
set(PYQT_MOD_DIR ${PYQT6_MOD_DIR})
else()
find_package(PyQt5 REQUIRED)
set(PYQT_FOUND ${PYQT5_FOUND})
set(PYQT_SIP_FLAGS ${PYQT5_SIP_FLAGS})
set(PYQT_SIP_DIR ${PYQT5_SIP_DIR})
set(PYQT_SIP_IMPORT ${PYQT5_SIP_IMPORT})
set(PYQT_VERSION_STR ${PYQT5_VERSION_STR})
set(PYQT_MOD_DIR ${PYQT5_MOD_DIR})
endif()
separate_arguments(PYQT_SIP_FLAGS) # convert space separated values to a list

find_package(Qsci REQUIRED)
Expand All @@ -992,7 +1008,7 @@ if (WITH_CORE AND WITH_BINDINGS AND NOT BUILD_WITH_QT6)
endif()

if (WITH_CUSTOM_WIDGETS)
set(PYUIC_WIDGET_PLUGIN_DIRECTORY ${PYQT5_MOD_DIR}/uic/widget-plugins/)
set(PYUIC_WIDGET_PLUGIN_DIRECTORY ${PYQT_MOD_DIR}/uic/widget-plugins/)
endif()
endif()

Expand Down
5 changes: 3 additions & 2 deletions cmake/FindQCA.cmake
Expand Up @@ -20,7 +20,8 @@ if(QCA_INCLUDE_DIR AND QCA_LIBRARY)

else(QCA_INCLUDE_DIR AND QCA_LIBRARY)

set(QCA_LIBRARY_NAMES qca-qt5 qca2-qt5 qca-qt6 qca)
set(QCA_LIBRARY_NAMES qca-${QT_VERSION_BASE_LOWER} qca2-${QT_VERSION_BASE_LOWER} qca)
set(QCA_PATH_SUFFIXES ${QT_VERSION_BASE_LOWER}/QtCrypto Qca-${QT_VERSION_BASE_LOWER}/QtCrypto qt/Qca-${QT_VERSION_BASE_LOWER}/QtCrypto ${QT_VERSION_BASE_LOWER}/Qca-${QT_VERSION_BASE_LOWER}/QtCrypto QtCrypto)

find_library(QCA_LIBRARY
NAMES ${QCA_LIBRARY_NAMES}
Expand All @@ -45,7 +46,7 @@ else(QCA_INCLUDE_DIR AND QCA_LIBRARY)
"$ENV{LIB_DIR}/include"
$ENV{INCLUDE}
/usr/local/include
PATH_SUFFIXES QtCrypto qt5/QtCrypto Qca-qt5/QtCrypto qt/Qca-qt5/QtCrypto qt5/Qca-qt5/QtCrypto Qca-qt6/QtCrypto
PATH_SUFFIXES ${QCA_PATH_SUFFIXES}
)

if(QCA_LIBRARY AND QCA_INCLUDE_DIR)
Expand Down
16 changes: 8 additions & 8 deletions cmake/FindQScintilla.cmake
Expand Up @@ -25,12 +25,12 @@ IF(QSCINTILLA_VERSION_STR)
ELSE(QSCINTILLA_VERSION_STR)

set(QSCINTILLA_LIBRARY_NAMES
qscintilla2-qt5
qscintilla2_qt5
libqt5scintilla2
libqscintilla2-qt5
qt5scintilla2
libqscintilla2-qt5.dylib
qscintilla2-${QT_VERSION_BASE_LOWER}
qscintilla2_${QT_VERSION_BASE_LOWER}
lib${QT_VERSION_BASE_LOWER}scintilla2
libqscintilla2-${QT_VERSION_BASE_LOWER}
${QT_VERSION_BASE_LOWER}scintilla2
libqscintilla2-${QT_VERSION_BASE_LOWER}.dylib
qscintilla2
)

Expand All @@ -40,7 +40,7 @@ ELSE(QSCINTILLA_VERSION_STR)
"${QT_LIBRARY_DIR}"
$ENV{LIB_DIR}/lib
/usr/local/lib
/usr/local/lib/qt5
/usr/local/lib/${QT_VERSION_BASE_LOWER}
/usr/lib
)

Expand All @@ -53,7 +53,7 @@ ELSE(QSCINTILLA_VERSION_STR)
NAMES Qsci/qsciglobal.h
PATHS
"${_qsci_fw}/Headers"
${Qt5Core_INCLUDE_DIRS}
${${QT_VERSION_BASE}Core_INCLUDE_DIRS}
"${QT_INCLUDE_DIR}"
$ENV{LIB_DIR}/include
/usr/local/include
Expand Down
14 changes: 10 additions & 4 deletions cmake/FindQsci.cmake
Expand Up @@ -29,11 +29,11 @@ ELSE(QSCI_MOD_VERSION_STR)
FILE(READ ${_qsci_metadata} _qsci_metadata_contents)
STRING(REGEX REPLACE ".*\nVersion: ([^\n]+).*$" "\\1" QSCI_MOD_VERSION_STR ${_qsci_metadata_contents})
ELSE(_qsci_metadata)
EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} -c "from PyQt5.Qsci import QSCINTILLA_VERSION_STR; print(QSCINTILLA_VERSION_STR)" OUTPUT_VARIABLE QSCI_MOD_VERSION_STR)
EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} -c "from Py${QT_VERSION_BASE}.Qsci import QSCINTILLA_VERSION_STR; print(QSCINTILLA_VERSION_STR)" OUTPUT_VARIABLE QSCI_MOD_VERSION_STR)
ENDIF(_qsci_metadata)

IF(QSCI_MOD_VERSION_STR)
SET(QSCI_SIP_DIR "${PYQT5_SIP_DIR}")
SET(QSCI_SIP_DIR "${PYQT_SIP_DIR}")
SET(QSCI_FOUND TRUE)
ENDIF(QSCI_MOD_VERSION_STR)

Expand All @@ -46,11 +46,17 @@ ELSE(QSCI_MOD_VERSION_STR)

EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_qsci_py} ${QSCI_VER} OUTPUT_VARIABLE qsci_ver)

IF(BUILD_WITH_QT6)
SET(QSCI_SIP_MOD_NAME Qsci/qscimod6.sip)
ELSE()
SET(QSCI_SIP_MOD_NAME Qsci/qscimod5.sip)
ENDIF()

IF(qsci_ver)
STRING(REGEX REPLACE "^qsci_version_str:([^\n]+).*$" "\\1" QSCI_MOD_VERSION_STR ${qsci_ver})
FIND_PATH(QSCI_SIP_DIR
NAMES Qsci/qscimod5.sip
PATHS ${PYQT5_SIP_DIR} ${SIP_DEFAULT_SIP_DIR}
NAMES ${QSCI_SIP_MOD_NAME}
PATHS ${PYQT_SIP_DIR} ${SIP_DEFAULT_SIP_DIR}
)
SET(QSCI_FOUND TRUE)
ENDIF(qsci_ver)
Expand Down
11 changes: 9 additions & 2 deletions cmake/FindQsci.py
Expand Up @@ -41,9 +41,12 @@
if sys.argv[1] == "4":
from PyQt4.Qsci import QSCINTILLA_VERSION_STR
VER = QSCINTILLA_VERSION_STR
else:
if sys.argv[1] == "5":
from PyQt5.Qsci import QSCINTILLA_VERSION_STR
VER = QSCINTILLA_VERSION_STR
else:
from PyQt6.Qsci import QSCINTILLA_VERSION_STR
VER = QSCINTILLA_VERSION_STR
else:
try:
from PyQt4.Qsci import QSCINTILLA_VERSION_STR
Expand All @@ -53,6 +56,10 @@
from PyQt5.Qsci import QSCINTILLA_VERSION_STR
VER = QSCINTILLA_VERSION_STR
except ImportError:
pass
try:
from PyQt6.Qsci import QSCINTILLA_VERSION_STR
VER = QSCINTILLA_VERSION_STR
except ImportError:
pass

print("qsci_version_str:%s" % VER)
4 changes: 2 additions & 2 deletions cmake/FindQtKeychain.cmake
Expand Up @@ -21,10 +21,10 @@ FIND_PATH(QTKEYCHAIN_INCLUDE_DIR keychain.h
$ENV{INCLUDE}
/usr/local/include
/usr/include
PATH_SUFFIXES qt5keychain qtkeychain qt6keychain
PATH_SUFFIXES ${QT_VERSION_BASE_LOWER}keychain qtkeychain
)

FIND_LIBRARY(QTKEYCHAIN_LIBRARY NAMES qt5keychain qtkeychain qt6keychain
FIND_LIBRARY(QTKEYCHAIN_LIBRARY NAMES ${QT_VERSION_BASE_LOWER}keychain qtkeychain
PATHS
${LIB_DIR}
"$ENV{LIB_DIR}"
Expand Down
10 changes: 5 additions & 5 deletions cmake/FindQwt.cmake
Expand Up @@ -12,14 +12,14 @@
#


set(QWT_LIBRARY_NAMES qwt-qt5 qwt6-qt5 qwt qwt6)
set(QWT_LIBRARY_NAMES qwt-${QT_VERSION_BASE_LOWER} qwt)

find_library(QWT_LIBRARY
NAMES ${QWT_LIBRARY_NAMES}
PATHS
/usr/lib
/usr/local/lib
/usr/local/lib/qt5
/usr/local/lib/${QT_VERSION_BASE_LOWER}
"$ENV{LIB_DIR}/lib"
"$ENV{LIB}"
)
Expand All @@ -32,12 +32,12 @@ endif()
FIND_PATH(QWT_INCLUDE_DIR NAMES qwt.h PATHS
"${_qwt_fw}/Headers"
/usr/include
/usr/include/qt5
/usr/include/${QT_VERSION_BASE_LOWER}
/usr/local/include
/usr/local/include/qt5
/usr/local/include/${QT_VERSION_BASE_LOWER}
"$ENV{LIB_DIR}/include"
"$ENV{INCLUDE}"
PATH_SUFFIXES qwt-qt5 qwt qwt6 qt5/qwt
PATH_SUFFIXES qwt-${QT_VERSION_BASE_LOWER} ${QT_VERSION_BASE_LOWER}/qwt qwt
)

IF (QWT_INCLUDE_DIR AND QWT_LIBRARY)
Expand Down
30 changes: 21 additions & 9 deletions cmake/PyQtMacros.cmake
Expand Up @@ -4,9 +4,14 @@
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.

SET(PYUIC_PROG_NAME pyuic5)
SET(PYUIC_PROG_NAMES pyuic5)
SET(PYRCC_PROG_NAME pyrcc5)
IF(BUILD_WITH_QT6)
SET(PYUIC_PROG_NAME pyuic6)
SET(PYUIC_PROG_NAMES pyuic6)
ELSE()
SET(PYUIC_PROG_NAME pyuic5)
SET(PYUIC_PROG_NAMES pyuic5)
SET(PYRCC_PROG_NAME pyrcc5)
ENDIF()

IF(NOT PYUIC_PROGRAM)
FIND_PROGRAM(PYUIC_PROGRAM NAMES ${PYUIC_PROG_NAMES} PATHS $ENV{LIB_DIR}/bin)
Expand Down Expand Up @@ -50,12 +55,12 @@ MACRO(PYQT_WRAP_UI outfiles )
ENDFOREACH(it)
ENDMACRO(PYQT_WRAP_UI)

IF(NOT PYRCC_PROGRAM)
IF(NOT PYRCC_PROGRAM AND NOT BUILD_WITH_QT6)
FIND_PROGRAM(PYRCC_PROGRAM NAMES ${PYRCC_PROG_NAME} PATHS $ENV{LIB_DIR}/bin)
IF (NOT PYRCC_PROGRAM)
MESSAGE(FATAL_ERROR "pyrcc5 not found - aborting")
ENDIF (NOT PYRCC_PROGRAM)
ENDIF(NOT PYRCC_PROGRAM)
ENDIF(NOT PYRCC_PROGRAM AND NOT BUILD_WITH_QT6)

# Adapted from QT4_ADD_RESOURCES
MACRO (PYQT_ADD_RESOURCES outfiles )
Expand All @@ -77,10 +82,17 @@ MACRO (PYQT_ADD_RESOURCES outfiles )
ENDIF(NOT _ABS_PATH_INDICATOR)
SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}")
ENDFOREACH(_RC_FILE)
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
COMMAND ${PYRCC_PROGRAM} ${_name_opt} -o ${outfile} ${infile}
MAIN_DEPENDENCY ${infile}
DEPENDS ${_RC_DEPENDS})
IF (BUILD_WITH_QT6)
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
COMMAND Qt6::rcc -g python -o ${outfile} ${infile}
MAIN_DEPENDENCY ${infile}
DEPENDS ${_RC_DEPENDS})
ELSE()
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
COMMAND ${PYRCC_PROGRAM} ${_name_opt} -o ${outfile} ${infile}
MAIN_DEPENDENCY ${infile}
DEPENDS ${_RC_DEPENDS})
ENDIF()
SET(${outfiles} ${${outfiles}} ${outfile})
ENDFOREACH (it)
ENDMACRO (PYQT_ADD_RESOURCES)
10 changes: 5 additions & 5 deletions cmake/QCAMacros.cmake
Expand Up @@ -12,9 +12,9 @@

function(FIND_QCAOSSL_PLUGIN_CPP PLUGIN_REQUIRED)

FIND_PACKAGE(Qt5Core QUIET)
FIND_PACKAGE(${QT_VERSION_BASE}Core QUIET)
# requires Qt and QCA packages to be found
if(Qt5Core_INCLUDE_DIRS AND Qt5Core_LIBRARIES
if(${QT_VERSION_BASE}Core_INCLUDE_DIRS AND ${QT_VERSION_BASE}Core_LIBRARIES
AND QCA_INCLUDE_DIR AND QCA_LIBRARY
AND NOT CMAKE_CROSSCOMPILING)

Expand All @@ -39,8 +39,8 @@ function(FIND_QCAOSSL_PLUGIN_CPP PLUGIN_REQUIRED)
set(TESTCPP "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/qcaossl.cpp")
file(WRITE ${TESTCPP} "${CODE}")

set(QCA_INCLUDE_DIRECTORIES "-DINCLUDE_DIRECTORIES:STRING=${Qt5Core_INCLUDE_DIRS};${QCA_INCLUDE_DIR}")
get_target_property(_QtCore_path Qt5::Core LOCATION)
set(QCA_INCLUDE_DIRECTORIES "-DINCLUDE_DIRECTORIES:STRING=${${QT_VERSION_BASE}Core_INCLUDE_DIRS};${QCA_INCLUDE_DIR}")
get_target_property(_QtCore_path ${QT_VERSION_BASE}::Core LOCATION)
set(QCA_LINK_LIBRARIES "-DLINK_LIBRARIES:STRING=${_QtCore_path};${QCA_LIBRARY}")

IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
Expand Down Expand Up @@ -107,7 +107,7 @@ function(FIND_QCATOOL TOOL_REQUIRED)
$ENV{OSGEO4W_ROOT}/bin
)
else()
find_program(QCATOOL_EXECUTABLE NAMES qcatool-qt5 qcatool2 qcatool)
find_program(QCATOOL_EXECUTABLE NAMES qcatool-${QT_VERSION_BASE_LOWER} qcatool2 qcatool)
endif()

if(NOT QCATOOL_EXECUTABLE)
Expand Down
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=${PYQT5_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} ${SIP_BUILD_EXTRA_OPTIONS})

ADD_CUSTOM_COMMAND(
OUTPUT ${_sip_output_files}
Expand Down
2 changes: 1 addition & 1 deletion i18n/CMakeLists.txt
Expand Up @@ -27,7 +27,7 @@ set(TS_FILES qgis_ar.ts qgis_bg.ts qgis_bs.ts qgis_ca.ts qgis_cs.ts qgis_da.ts q

ADD_TRANSLATION_FILES (QM_FILES ${TS_FILES})

if (UNIX AND NOT APPLE AND PYQT5_FOUND)
if (UNIX AND NOT APPLE AND PYQT_FOUND)
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/org.qgis.qgis.desktop ${CMAKE_BINARY_DIR}/org.qgis.qgis.appdata.xml
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
Expand Down

0 comments on commit ff9f283

Please sign in to comment.