Skip to content

Commit

Permalink
Merge pull request #45303 from kadas-albireo/master
Browse files Browse the repository at this point in the history
Assorted cmake improvements
  • Loading branch information
lbartoletti committed Oct 1, 2021
2 parents 3dffaa3 + 69b9450 commit 994d1a4
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 101 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -929,12 +929,12 @@ if (WITH_CORE AND WITH_BINDINGS AND NOT WITH_QT6)
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})
separate_arguments(PYQT_SIP_FLAGS) # convert space separated values to a list

find_package(SIP REQUIRED)
find_package(Qsci REQUIRED)
include(PythonMacros)
include(PyQtMacros)
Expand Down
72 changes: 45 additions & 27 deletions cmake/FindPyQt5.cmake
Expand Up @@ -11,40 +11,58 @@
#
# This file defines the following variables:
#
# PYQT5_VERSION - The version of PyQt5 found expressed as a 6 digit hex number
# suitable for comparison as a string
#
# PYQT5_VERSION_STR - The version of PyQt5 as a human readable string.
#
# PYQT5_VERSION_TAG - The PyQt version tag using by PyQt's sip files.
#
# PYQT5_SIP_DIR - The directory holding the PyQt5 .sip files.
#
# PYQT5_SIP_FLAGS - The SIP flags used to build PyQt.

IF(EXISTS PYQT5_VERSION)
IF(EXISTS PYQT5_VERSION_STR)
# Already in cache, be silent
SET(PYQT5_FOUND TRUE)
ELSE(EXISTS PYQT5_VERSION)

FIND_FILE(_find_pyqt5_py FindPyQt5.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)

EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_pyqt5_py} OUTPUT_VARIABLE pyqt_config)
IF(pyqt_config)
STRING(REGEX REPLACE "^pyqt_version:([^\n]+).*$" "\\1" PYQT5_VERSION ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_version_str:([^\n]+).*$" "\\1" PYQT5_VERSION_STR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_version_tag:([^\n]+).*$" "\\1" PYQT5_VERSION_TAG ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_version_num:([^\n]+).*$" "\\1" PYQT5_VERSION_NUM ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_mod_dir:([^\n]+).*$" "\\1" PYQT5_MOD_DIR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT5_SIP_DIR ${pyqt_config})
IF(EXISTS ${PYQT5_SIP_DIR}/Qt5)
SET(PYQT5_SIP_DIR ${PYQT5_SIP_DIR}/Qt5)
ENDIF(EXISTS ${PYQT5_SIP_DIR}/Qt5)
STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT5_SIP_FLAGS ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_bin_dir:([^\n]+).*$" "\\1" PYQT5_BIN_DIR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_sip_module:([^\n]+).*$" "\\1" PYQT5_SIP_IMPORT ${pyqt_config})
SET(PYQT5_FOUND TRUE)
ENDIF(pyqt_config)
ELSE(EXISTS PYQT5_VERSION_STR)

IF(SIP_BUILD_EXECUTABLE)
# SIP >= 5.0 path


FILE(GLOB _pyqt5_metadata "${Python_SITEARCH}/PyQt5*.dist-info/METADATA")
IF(_pyqt5_metadata)
FILE(READ ${_pyqt5_metadata} _pyqt5_metadata_contents)
STRING(REGEX REPLACE ".*\nVersion: ([^\n]+).*$" "\\1" PYQT5_VERSION_STR ${_pyqt5_metadata_contents})
ELSE(_pyqt5_metadata)
EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} -c "from PyQt5.QtCore import PYQT_VERSION_STR; print(PYQT_VERSION_STR)" OUTPUT_VARIABLE PYQT5_VERSION_STR)
ENDIF(_pyqt5_metadata)

IF(PYQT5_VERSION_STR)
SET(PYQT5_MOD_DIR "${Python_SITEARCH}/PyQt5")
SET(PYQT5_SIP_DIR "${Python_SITEARCH}/PyQt5/bindings")
FIND_PROGRAM(__pyuic5 "pyuic5")
GET_FILENAME_COMPONENT(PYQT5_BIN_DIR ${__pyuic5} DIRECTORY)

SET(PYQT5_FOUND TRUE)
ENDIF(PYQT5_VERSION_STR)

ELSE(SIP_BUILD_EXECUTABLE)
# SIP 4.x path

FIND_FILE(_find_pyqt5_py FindPyQt5.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)

EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_pyqt5_py} OUTPUT_VARIABLE pyqt_config)
IF(pyqt_config)
STRING(REGEX REPLACE "^pyqt_version_str:([^\n]+).*$" "\\1" PYQT5_VERSION_STR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_mod_dir:([^\n]+).*$" "\\1" PYQT5_MOD_DIR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT5_SIP_DIR ${pyqt_config})
IF(EXISTS ${PYQT5_SIP_DIR}/Qt5)
SET(PYQT5_SIP_DIR ${PYQT5_SIP_DIR}/Qt5)
ENDIF(EXISTS ${PYQT5_SIP_DIR}/Qt5)
STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT5_SIP_FLAGS ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_bin_dir:([^\n]+).*$" "\\1" PYQT5_BIN_DIR ${pyqt_config})
STRING(REGEX REPLACE ".*\npyqt_sip_module:([^\n]+).*$" "\\1" PYQT5_SIP_IMPORT ${pyqt_config})
SET(PYQT5_FOUND TRUE)
ENDIF(pyqt_config)

ENDIF(SIP_BUILD_EXECUTABLE)

IF(PYQT5_FOUND)
IF(NOT PyQt5_FIND_QUIETLY)
Expand All @@ -56,4 +74,4 @@ ELSE(EXISTS PYQT5_VERSION)
ENDIF(PyQt5_FIND_REQUIRED)
ENDIF(PYQT5_FOUND)

ENDIF(EXISTS PYQT5_VERSION)
ENDIF(EXISTS PYQT5_VERSION_STR)
63 changes: 15 additions & 48 deletions cmake/FindPyQt5.py
Expand Up @@ -32,57 +32,24 @@

import os.path
import PyQt5.QtCore
import sipconfig
import sys

cfg = sipconfig.Configuration()
sip_dir = cfg.default_sip_dir
for p in (os.path.join(sip_dir, "PyQt5"),
os.path.join(sip_dir, "PyQt5-3"),
sip_dir,
os.path.join(cfg.default_mod_dir, "PyQt5", "bindings")):
if os.path.exists(os.path.join(p, "QtCore", "QtCoremod.sip")):
sip_dir = p
break

try:
__import__('sipbuild')
except ImportError:
import sipconfig # won't work for SIP v5
import sys

cfg = sipconfig.Configuration()
sip_dir = cfg.default_sip_dir
for p in (os.path.join(sip_dir, "PyQt5"),
os.path.join(sip_dir, "PyQt5-3"),
sip_dir,
os.path.join(cfg.default_mod_dir, "PyQt5", "bindings")):
if os.path.exists(os.path.join(p, "QtCore", "QtCoremod.sip")):
sip_dir = p
break
cfg = {
'pyqt_mod_dir': os.path.join(cfg.default_mod_dir, "PyQt5"),
'pyqt_sip_dir': sip_dir,
'pyqt_bin_dir': cfg.default_bin_dir,
}
else: # Code for SIP v5
from distutils.sysconfig import get_python_lib
import shutil
cfg = {
'pyqt_mod_dir': os.path.dirname(PyQt5.__file__),
'pyqt_sip_dir': os.path.join(get_python_lib(plat_specific=1), "PyQt5", "bindings"),
'pyqt_bin_dir': os.path.dirname(shutil.which("pyuic5")),
}

print("pyqt_version:%06.0x" % PyQt5.QtCore.PYQT_VERSION)
print("pyqt_version_num:%d" % PyQt5.QtCore.PYQT_VERSION)
print("pyqt_version_str:%s" % PyQt5.QtCore.PYQT_VERSION_STR)

pyqt_version_tag = ""
in_t = False
pyqt_config_list = PyQt5.QtCore.PYQT_CONFIGURATION["sip_flags"].split(' ')
for item in pyqt_config_list:
if item == "-t":
in_t = True
elif in_t:
if item.startswith("Qt_5"):
pyqt_version_tag = item
else:
in_t = False
print("pyqt_version_tag:%s" % pyqt_version_tag)

print("pyqt_mod_dir:%s" % cfg['pyqt_mod_dir'])
print("pyqt_sip_dir:%s" % cfg['pyqt_sip_dir'])
print("pyqt_mod_dir:%s" % os.path.join(cfg.default_mod_dir, "PyQt5"))
print("pyqt_sip_dir:%s" % sip_dir)
print("pyqt_sip_flags:%s" % PyQt5.QtCore.PYQT_CONFIGURATION['sip_flags'])
print("pyqt_bin_dir:%s" % cfg['pyqt_bin_dir'])
print("pyqt_bin_dir:%s" % cfg.default_bin_dir)

try:
import PyQt5.sip
Expand Down
44 changes: 32 additions & 12 deletions cmake/FindQsci.cmake
Expand Up @@ -21,23 +21,43 @@ IF(QSCI_MOD_VERSION_STR)
SET(QSCI_FOUND TRUE)
ELSE(QSCI_MOD_VERSION_STR)

FIND_FILE(_find_qsci_py FindQsci.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)
IF(SIP_BUILD_EXECUTABLE)
# SIP >= 5.0 path

SET(QSCI_VER 5)
FILE(GLOB _qsci_metadata "${Python_SITEARCH}/QScintilla*.dist-info/METADATA")
IF(_qsci_metadata)
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)
ENDIF(_qsci_metadata)

EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_qsci_py} ${QSCI_VER} OUTPUT_VARIABLE qsci_ver)
IF(QSCI_MOD_VERSION_STR)
SET(QSCI_SIP_DIR "${PYQT5_SIP_DIR}")
SET(QSCI_FOUND TRUE)
ENDIF(QSCI_MOD_VERSION_STR)

IF(qsci_ver)
STRING(REGEX REPLACE "^qsci_version_str:([^\n]+).*$" "\\1" QSCI_MOD_VERSION_STR ${qsci_ver})
SET(QSCI_FOUND TRUE)
ENDIF(qsci_ver)
ELSE(SIP_BUILD_EXECUTABLE)
# SIP 4.x path

IF(QSCI_FOUND)
FIND_PATH(QSCI_SIP_DIR
NAMES Qsci/qscimod5.sip
PATHS ${PYQT5_SIP_DIR} ${SIP_DEFAULT_SIP_DIR}
)
FIND_FILE(_find_qsci_py FindQsci.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)

SET(QSCI_VER 5)

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

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}
)
SET(QSCI_FOUND TRUE)
ENDIF(qsci_ver)

ENDIF(SIP_BUILD_EXECUTABLE)

IF(QSCI_FOUND)
IF(NOT QSCI_FIND_QUIETLY)
MESSAGE(STATUS "Found QScintilla2 PyQt module: ${QSCI_MOD_VERSION_STR}")
ENDIF(NOT QSCI_FIND_QUIETLY)
Expand Down
2 changes: 1 addition & 1 deletion cmake/FindQwt.cmake
Expand Up @@ -37,7 +37,7 @@ FIND_PATH(QWT_INCLUDE_DIR NAMES qwt.h PATHS
/usr/local/include/qt5
"$ENV{LIB_DIR}/include"
"$ENV{INCLUDE}"
PATH_SUFFIXES qwt-qt5 qwt qwt6
PATH_SUFFIXES qwt-qt5 qwt qwt6 qt5/qwt
)

IF (QWT_INCLUDE_DIR AND QWT_LIBRARY)
Expand Down
3 changes: 3 additions & 0 deletions cmake/FindZSTD.cmake
Expand Up @@ -13,10 +13,13 @@

FIND_PATH(ZSTD_INCLUDE_DIR
zstd.h
PATHS
"$ENV{LIB_DIR}/include"
"$ENV{INCLUDE}"
/usr/local/include
/usr/include
PATH_SUFFIXES
zstd
)

FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd PATHS "$ENV{LIB_DIR}/lib" "$ENV{LIB}" /usr/local/lib /usr/lib )
Expand Down
12 changes: 9 additions & 3 deletions cmake/PyQtMacros.cmake
Expand Up @@ -17,6 +17,8 @@ ENDIF(NOT PYUIC_PROGRAM)

# Adapted from QT4_WRAP_UI
MACRO(PYQT_WRAP_UI outfiles )
SET(PYUIC_WRAPPER_OUTPUT_DIRECTORY "${PYTHON_OUTPUT_DIRECTORY}")
SET(PYUIC_WRAPPER_PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
IF(CMAKE_HOST_WIN32)
IF(USING_NINJA OR USING_NMAKE)
SET(PYUIC_WRAPPER "${CMAKE_SOURCE_DIR}/scripts/pyuic_wrapper.bat")
Expand All @@ -25,18 +27,22 @@ MACRO(PYQT_WRAP_UI outfiles )
SET(PYUIC_WRAPPER "${CMAKE_SOURCE_DIR}/scripts/pyuic_wrapper.bat")
SET(PYUIC_WRAPPER_PATH "${QGIS_OUTPUT_DIRECTORY}/bin/${CMAKE_BUILD_TYPE}")
ENDIF(USING_NINJA OR USING_NMAKE)
ELSE(CMAKE_HOST_WIN32)
ELSEIF(MINGW)
# Clear all variables to invoke PYUIC_PROGRAM directly
SET(PYUIC_WRAPPER_OUTPUT_DIRECTORY "")
SET(PYUIC_WRAPPER_PYTHON_EXECUTABLE "")
ELSE()
# TODO osx
SET(PYUIC_WRAPPER "${CMAKE_SOURCE_DIR}/scripts/pyuic_wrapper.sh")
SET(PYUIC_WRAPPER_PATH "${QGIS_OUTPUT_DIRECTORY}/lib")
ENDIF(CMAKE_HOST_WIN32)
ENDIF()

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 ${PYUIC_WRAPPER} "${PYUIC_PROGRAM}" "${PYUIC_WRAPPER_PATH}" "${PYTHON_OUTPUT_DIRECTORY}" "${Python_EXECUTABLE}" ${infile} -o ${outfile}
COMMAND ${PYUIC_WRAPPER} "${PYUIC_PROGRAM}" "${PYUIC_WRAPPER_PATH}" "${PYUIC_WRAPPER_OUTPUT_DIRECTORY}" "${PYUIC_WRAPPER_PYTHON_EXECUTABLE}" ${infile} -o ${outfile}
MAIN_DEPENDENCY ${infile}
DEPENDS pygui pycore pyqtcompat
)
Expand Down
8 changes: 0 additions & 8 deletions ms-windows/mingw/build.sh
Expand Up @@ -76,17 +76,11 @@ mkdir -p "$BUILDDIR"
(
CRSSYNC_BIN=$(readlink -f "$SRCDIR")/build/output/bin/crssync
cd "$BUILDDIR"
QSCI_VER=$(grep -Eo '\s*([0-9]+\.[0-9]+\.[0-9]+)' "$MINGWROOT/include/qt5/Qsci/qsciglobal.h")
mingw$bits-cmake \
-DCMAKE_CROSS_COMPILING=1 \
-DUSE_CCACHE=ON \
-DCMAKE_BUILD_TYPE=$buildtype \
-DNATIVE_CRSSYNC_BIN="$CRSSYNC_BIN" \
-DQSCINTILLA_VERSION_STR="$QSCI_VER" \
-DQSCINTILLA_LIBRARY="$MINGWROOT/lib/libqscintilla2_qt5.dll.a" \
-DQSCI_MOD_VERSION_STR="$QSCI_VER" \
-DQWT_INCLUDE_DIR="$MINGWROOT/include/qt5/qwt" \
-DQSCI_SIP_DIR="$MINGWROOT/share/sip/PyQt5/Qsci/" \
-DBUILD_TESTING=OFF \
-DENABLE_TESTS=OFF \
-DQGIS_BIN_SUBDIR=bin \
Expand All @@ -101,8 +95,6 @@ mkdir -p "$BUILDDIR"
-DBINDINGS_GLOBAL_INSTALL=ON \
-DSIP_GLOBAL_INSTALL=ON \
-DWITH_SERVER=ON \
-DZSTD_INCLUDE_DIR="$MINGWROOT/include/zstd" \
-DZSTD_LIBRARY="$MINGWROOT/lib/libzstd.dll.a" \
-DTXT2TAGS_EXECUTABLE= \
..
)
Expand Down
1 change: 1 addition & 0 deletions ms-windows/mingw/qgis3-build-deps-mingw.dockerfile
Expand Up @@ -39,6 +39,7 @@ dnf install -y --nogpgcheck \
mingw64-python3-pillow \
mingw64-python3-psycopg2 \
mingw64-python3-pygments \
mingw64-python3-PyQt-builder \
mingw64-python3-pytz \
mingw64-python3-pyyaml \
mingw64-python3-qscintilla-qt5 \
Expand Down
4 changes: 3 additions & 1 deletion python/CMakeLists.txt
Expand Up @@ -167,9 +167,11 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_definitions(-std=c++14)
endif()

if(UNIX AND NOT SIP_VERSION_NUM LESS 265984)
if((UNIX OR MINGW) AND SIP_VERSION_STR VERSION_GREATER_EQUAL 4.10 AND SIP_VERSION_STR VERSION_LESS 5.0)
set(SIP_EXTRA_OPTIONS -P ${SIP_EXTRA_OPTIONS})
add_definitions(-Dprotected=public)
elseif((UNIX OR MINGW) AND SIP_VERSION_STR VERSION_GREATER_EQUAL 5.0)
add_definitions(-Dprotected=public)
endif()

set (PY_MODULES core)
Expand Down

0 comments on commit 994d1a4

Please sign in to comment.