cmake_minimum_required(VERSION 3.29) project(ext_qt) include(${CMAKE_SOURCE_DIR}/../cmake/base-dep-options.cmake) set(QT_GIT_TAG "33896011f4c9463462f9e6fd1d70c2d5440d01a3") if (MINGW) set(QT_BUILD_COMMAND mingw32-make -j${SUBMAKE_JOBS}) set(QT_INSTALL_COMMAND ${CMAKE_COMMAND} -DMAKE_COMMAND=mingw32-make -P ${KRITA_CI_RUN_MAKE_WITH_INSTALL_ROOT} -- -j${SUBMAKE_JOBS} install) elseif (MSVC) set(QT_BUILD_COMMAND jom -j${SUBMAKE_JOBS}) set(QT_INSTALL_COMMAND ${CMAKE_COMMAND} -DMAKE_COMMAND=jom -P ${KRITA_CI_RUN_MAKE_WITH_INSTALL_ROOT} -- -j${SUBMAKE_JOBS} install) set(QT_INSTALL_COMMAND jom -j${SUBMAKE_JOBS} install) elseif (CMAKE_GENERATOR MATCHES "Makefiles") set (QT_BUILD_COMMAND $(MAKE) -j${SUBMAKE_JOBS}) set(QT_INSTALL_COMMAND ${CMAKE_COMMAND} -DMAKE_COMMAND=$(MAKE) -P ${KRITA_CI_RUN_MAKE_WITH_INSTALL_ROOT} -- -j${SUBMAKE_JOBS} install) else() set (QT_BUILD_COMMAND make -j${SUBMAKE_JOBS}) set(QT_INSTALL_COMMAND ${CMAKE_COMMAND} -DMAKE_COMMAND=make -P ${KRITA_CI_RUN_MAKE_WITH_INSTALL_ROOT} -- install) endif() if (WIN32) if(MINGW) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(QT_CONFIG_PLATFORM win32-clang-g++) else() set(QT_CONFIG_PLATFORM win32-g++) endif() elseif(MSVC) ExternalProject_Add(ext_jom DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} URL https://download.qt.io/official_releases/jom/jom_1_1_3.zip URL_HASH SHA256=128fdd846fe24f8594eed37d1d8929a0ea78df563537c0c1b1861a635013fff8 BUILD_COMMAND ${CMAKE_COMMAND} -E echo Deploying Jom CONFIGURE_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} -E copy /jom.exe ${EXTPREFIX}/bin UPDATE_COMMAND "" ) set(QT_CONFIG_PLATFORM win32-msvc) list(APPEND QT_EXTRA_DEPS ext_jom) endif(MINGW) list(APPEND _QT_conf -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdoc -skip qtlocation -skip qtsensors -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtxmlpatterns -nomake examples -nomake tools -no-compile-examples -no-dbus -no-iconv -no-qml-debug -no-libproxy -no-system-proxies -icu -no-mtdev -skip qtcharts -skip qtdatavis3d -skip qtgamepad -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscxml -skip qtserialbus -skip qtspeech -skip qtvirtualkeyboard -qt-sqlite # -system-zlib -qt-pcre -system-libpng -system-libjpeg -openssl-linked -system-freetype -system-harfbuzz -I ${EXTPREFIX}/include -L ${EXTPREFIX}/lib # -opensource -confirm-license -feature-relocatable -no-feature-d3d12 -no-feature-qdoc -no-direct2d # disable building Windows Vista style, it looks broken # when used in Krita -no-style-windowsvista # -release -platform ${QT_CONFIG_PLATFORM} -prefix ${EXTPREFIX} QMAKE_LFLAGS_APP+=${SECURITY_EXE_LINKER_FLAGS} QMAKE_LFLAGS_SHLIB+=${SECURITY_SHARED_LINKER_FLAGS} QMAKE_LFLAGS_SONAME+=${SECURITY_SHARED_LINKER_FLAGS} ) if (MSVC) list(APPEND _QT_conf QMAKE_CFLAGS+=${SECURITY_C_FLAGS} QMAKE_CXXFLAGS+=${SECURITY_CXX_FLAGS} ) endif (MSVC) if(QT_ENABLE_DEBUG_INFO OR WIN32) # Set the option to build Qt with debugging info enabled list(APPEND _QT_conf -force-debug-info) endif(QT_ENABLE_DEBUG_INFO OR WIN32) if (QT_ENABLE_ASAN) list(APPEND _QT_conf -sanitize address) endif () if (MINGW) if (NOT QT_ENABLE_DEBUG_INFO) # Generate minimal debug info for backtraces list(APPEND _QT_conf QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO-=-g QMAKE_CFLAGS+=-g1 QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO-=-g QMAKE_CXXFLAGS+=-g1 ) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # This is needed for proper C++ function signatures list(APPEND _QT_conf QMAKE_CFLAGS+=-fdebug-info-for-profiling QMAKE_CXXFLAGS+=-fdebug-info-for-profiling ) endif () endif () if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Workaround for DrMingw, see parent CMakeLists.txt list(APPEND _QT_conf QMAKE_CFLAGS+=-gdwarf-aranges QMAKE_CXXFLAGS+=-gdwarf-aranges ) endif () elseif (MSVC) if (NOT QT_ENABLE_DEBUG_INFO) # Generate minimal debug info for backtraces list(APPEND _QT_conf QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO-=-Zi QMAKE_CFLAGS+=-Zi QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO-=-Zi QMAKE_CXXFLAGS+=-Zi ) endif () endif () list(APPEND _QT_conf -opengl dynamic) if (NOT PERL_FOUND) # Implies strawberry perl list(APPEND QT_EXTRA_DEPS ext_strawberryperl) endif() # we store our patch perl separately in Krita if (EXISTS ${EXTPREFIX}/Strawberry/perl/bin/perl.exe) set(EXTRA_PERL_ENV $ENV{PATH};${EXTPREFIX}/Strawberry/perl/bin/) else() set(EXTRA_PERL_ENV $ENV{PATH}) endif() list(JOIN EXTRA_PERL_ENV $ PERL_PATH) ExternalProject_Add( ext_qt DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} GIT_REPOSITORY https://invent.kde.org/szaman/qt5.git GIT_TAG ${QT_GIT_TAG} GIT_SUBMODULES qtbase qtdeclarative qtimageformats qttools qtsvg qtwinextras qttranslations qtquickcontrols2 qtgraphicaleffects GIT_SUBMODULES_RECURSE false GIT_PROGRESS true GIT_REMOTE_UPDATE_STRATEGY REBASE INSTALL_DIR ${EXTPREFIX} PATCH_COMMAND ${PATCH_COMMAND} -d qtdeclarative -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/qtdeclarative-clang21-registerid-enum-fix.patch # unset QMAKEFEATURES to allow incremental builds with run-ci-build.py CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PATH=${PERL_PATH} --unset=QMAKEFEATURES /configure.bat ${_QT_conf} BUILD_COMMAND ${CMAKE_COMMAND} -E env PATH=${PERL_PATH} ${QT_BUILD_COMMAND} INSTALL_COMMAND ${CMAKE_COMMAND} -E env PATH=${PERL_PATH} ${QT_INSTALL_COMMAND} UPDATE_COMMAND "" # Use a short name to reduce the chance of exceeding path length limit SOURCE_DIR s BINARY_DIR b ) elseif (ANDROID) set(PAGE_ALIGNMENT_PATCH_ARG) if (PAGE_ALIGN_16K_LINKER_FLAGS) message(STATUS "Enable 16K page alignment for Qt5") set(PAGE_ALIGNMENT_PATCH_ARG COMMAND ${PATCH_COMMAND} -d qtbase -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0001-Force-enable-16K-alignment-on-Android.patch) endif() ExternalProject_Add( ext_qt DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} GIT_REPOSITORY https://invent.kde.org/szaman/qt5.git GIT_TAG ${QT_GIT_TAG} GIT_SUBMODULES qtbase qtdeclarative qtimageformats qttools qtsvg qttranslations qtandroidextras qtquickcontrols2 qtgraphicaleffects GIT_SUBMODULES_RECURSE false GIT_PROGRESS true GIT_REMOTE_UPDATE_STRATEGY REBASE # unset QMAKEFEATURES to allow incremental builds with run-ci-build.py # TODO(sh_zam): We can probably skip the skipping now. CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env --unset=QMAKEFEATURES /configure -prefix ${EXTPREFIX} -opensource -confirm-license -verbose -android-sdk ${ANDROID_SDK_ROOT} -android-ndk ${CMAKE_ANDROID_NDK} -android-arch ${ANDROID_ABI} -xplatform android-clang -android-ndk-platform android-24 -make libs -qt-sqlite -openssl-linked OPENSSL_PREFIX=${EXTPREFIX} -system-zlib -nomake examples -nomake tests -nomake tools -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtlocation -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtserialport -skip qtvirtualkeyboard -skip qtspeech -skip qtsensors -skip qtscxml -skip qtremoteobjects -skip qtxmlpatterns -skip qtnetworkauth -skip qtcharts -skip qtdatavis3d -skip qtgamepad -skip qtpurchasing -skip qtserialbus -icu # disable building Android style, it looks broken # when used in Krita -no-style-android -I ${EXTPREFIX}/include -L ${EXTPREFIX}/lib ${QT_PAGE_ALIGNMENT_OPTION} PATCH_COMMAND ${PATCH_COMMAND} -d qtbase -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0001-android-Fix-build-with-NDK-27.patch COMMAND ${PATCH_COMMAND} -d qtbase -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0002-android-Fix-ranlib-path-for-NDK-27.patch COMMAND ${PATCH_COMMAND} -d qtbase -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0001-androiddeloyqt-fix-needed-libs-argument-for-llvm-rea.patch ${PAGE_ALIGNMENT_PATCH_ARG} BUILD_COMMAND ${QT_BUILD_COMMAND} INSTALL_COMMAND ${QT_INSTALL_COMMAND} INSTALL_DIR ${EXTPREFIX} UPDATE_COMMAND "" BUILD_IN_SOURCE 0 ) elseif (NOT APPLE) if (QT_ENABLE_DEBUG_INFO) # Set the option to build Qt with debugging info enabled set(QT_DEBUG_OPTIONS -force-debug-info) endif() if (QT_ENABLE_ASAN) list(APPEND QT_DEBUG_OPTIONS -sanitize address) endif () ExternalProject_Add( ext_qt DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} GIT_REPOSITORY https://invent.kde.org/szaman/qt5.git GIT_TAG ${QT_GIT_TAG} GIT_SUBMODULES qtbase qtdeclarative qtimageformats qttools qtsvg qtx11extras qttranslations qtquickcontrols2 qtgraphicaleffects GIT_SUBMODULES_RECURSE false GIT_PROGRESS true GIT_REMOTE_UPDATE_STRATEGY REBASE CMAKE_ARGS -DOPENSSL_LIBS='-L${EXTPREFIX}/lib -lssl -lcrypto' # unset QMAKEFEATURES to allow incremental builds with run-ci-build.py CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env --unset=QMAKEFEATURES /configure -prefix ${EXTPREFIX} -opensource -confirm-license -feature-relocatable -openssl-linked OPENSSL_PREFIX=${EXTPREFIX} -verbose -nomake examples -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtlocation -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtandroidextras -skip qtserialport -skip qtdatavis3d -skip qtvirtualkeyboard -skip qtspeech -skip qtsensors -skip qtgamepad -skip qtscxml -skip qtremoteobjects -skip qtxmlpatterns -skip qtnetworkauth -skip qtcharts -skip qtdatavis3d -skip qtgamepad -skip qtpurchasing -skip qtscxml -skip qtserialbus -skip qtspeech -skip qtvirtualkeyboard -qt-sqlite -system-zlib -system-libpng -system-libjpeg -system-freetype -system-harfbuzz ${QT_DEBUG_OPTIONS} BUILD_COMMAND ${QT_BUILD_COMMAND} INSTALL_COMMAND ${QT_INSTALL_COMMAND} UPDATE_COMMAND "" BUILD_IN_SOURCE OFF ) else( APPLE ) set(MACOS_QT_CONFIGURE_OPS -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdoc -skip qtlocation -skip qtsensors -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebsockets -skip qtwebview -skip qtwebengine -skip qtxmlpatterns -skip qtcharts -skip qtdatavis3d -skip qtgamepad -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscxml -skip qtserialbus -skip qtspeech -skip qtvirtualkeyboard -nomake examples -nomake tools -no-compile-examples -no-dbus -no-iconv -no-qml-debug -no-libproxy -no-system-proxies -icu -no-mtdev -system-zlib -qt-pcre -qt-sqlite -system-libpng -system-libjpeg -system-freetype -system-harfbuzz -opensource -confirm-license -openssl-linked -prefix ${EXTPREFIX} OPENSSL_PREFIX=${EXTPREFIX} -I ${EXTPREFIX}/include -L ${EXTPREFIX}/lib ) kis_ExternalProject_Add_macos( ext_qt GIT_REPOSITORY https://invent.kde.org/szaman/qt5.git GIT_TAG ${QT_GIT_TAG} GIT_SUBMODULES qtbase qtdeclarative qtimageformats qttools qtsvg qtmacextras qttranslations qtquickcontrols2 qtgraphicaleffects GIT_SUBMODULES_RECURSE false GIT_PROGRESS true GIT_REMOTE_UPDATE_STRATEGY REBASE WORKING_DIRECTORY -@ARCH@ PATCH_COMMAND ${PATCH_COMMAND} -d qtbase -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0001-macos-Fix-building-on-MacOS-26.patch # unset QMAKEFEATURES to allow incremental builds with run-ci-build.py CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env "OPENSSL_LIBS=-L${EXTPREFIX}/lib -lssl -lcrypto" --unset=QMAKEFEATURES /configure ${MACOS_QT_CONFIGURE_OPS} -device-option QMAKE_APPLE_DEVICE_ARCHS=@ARCH@ BUILD_COMMAND ${QT_BUILD_COMMAND} ) # Qt needs separate builds for universal compilation before qt6 foreach(ARCH ${CMAKE_OSX_ARCHITECTURES}) mkdir_build_arch_dir(ext_qt ${ARCH}) endforeach() endif() krita_add_to_ci_targets(ext_qt)