commit cdfaef20828f1bcf59e8d3bfbc581e12493ff2fc Author: MSVSphere Packaging Team Date: Tue Nov 26 19:05:07 2024 +0300 import qt6-qtbase-6.7.1-5.el10 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dca4afb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/qtbase-everywhere-src-6.7.1.tar.xz diff --git a/.qt6-qtbase.metadata b/.qt6-qtbase.metadata new file mode 100644 index 0000000..31705fd --- /dev/null +++ b/.qt6-qtbase.metadata @@ -0,0 +1 @@ +d056b7d9ab0a16c15dbfac5a4d8e489af2ea23df SOURCES/qtbase-everywhere-src-6.7.1.tar.xz diff --git a/SOURCES/10-qt6-check-opengl2.sh b/SOURCES/10-qt6-check-opengl2.sh new file mode 100755 index 0000000..747fa07 --- /dev/null +++ b/SOURCES/10-qt6-check-opengl2.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ -z "$QT_XCB_FORCE_SOFTWARE_OPENGL" ]; then + +QT6_CHECK_OPENGL_VERSION=`LANG=C glxinfo 2> /dev/null | grep '^OpenGL version string: ' | head -n 1 | sed -e 's/^OpenGL version string: \([0-9]\).*$/\1/g'` ||: + +if [ "$QT6_CHECK_OPENGL_VERSION" == "1" ]; then + QT_XCB_FORCE_SOFTWARE_OPENGL=1 + export QT_XCB_FORCE_SOFTWARE_OPENGL +fi + +unset QT6_CHECK_OPENGL_VERSION + +fi diff --git a/SOURCES/CVE-2024-39936.patch b/SOURCES/CVE-2024-39936.patch new file mode 100644 index 0000000..9f3494d --- /dev/null +++ b/SOURCES/CVE-2024-39936.patch @@ -0,0 +1,232 @@ +From b1e75376cc3adfc7da5502a277dfe9711f3e0536 Mon Sep 17 00:00:00 2001 +From: Mårten Nordheim +Date: Tue, 25 Jun 2024 17:09:35 +0200 +Subject: [PATCH] HTTP2: Delay any communication until encrypted() can be responded to + +We have the encrypted() signal that lets users do extra checks on the +established connection. It is emitted as BlockingQueued, so the HTTP +thread stalls until it is done emitting. Users can potentially call +abort() on the QNetworkReply at that point, which is passed as a Queued +call back to the HTTP thread. That means that any currently queued +signal emission will be processed before the abort() call is processed. + +In the case of HTTP2 it is a little special since it is multiplexed and +the code is built to start requests as they are available. This means +that, while the code worked fine for HTTP1, since one connection only +has one request, it is not working for HTTP2, since we try to send more +requests in-between the encrypted() signal and the abort() call. + +This patch changes the code to delay any communication until the +encrypted() signal has been emitted and processed, for HTTP2 only. +It's done by adding a few booleans, both to know that we have to return +early and so we can keep track of what events arose and what we need to +resume once enough time has passed that any abort() call must have been +processed. + +Fixes: QTBUG-126610 +Pick-to: 6.8 6.7 6.5 6.2 5.15 5.12 +Change-Id: Ic25a600c278203256e35f541026f34a8783235ae +Reviewed-by: Marc Mutz +Reviewed-by: Volker Hilsheimer +--- + +diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp +index 0abd99b9..3631b13d 100644 +--- a/src/network/access/qhttp2protocolhandler.cpp ++++ b/src/network/access/qhttp2protocolhandler.cpp +@@ -303,12 +303,12 @@ bool QHttp2ProtocolHandler::sendRequest() + } + } + +- if (!prefaceSent && !sendClientPreface()) +- return false; +- + if (!requests.size()) + return true; + ++ if (!prefaceSent && !sendClientPreface()) ++ return false; ++ + m_channel->state = QHttpNetworkConnectionChannel::WritingState; + // Check what was promised/pushed, maybe we do not have to send a request + // and have a response already? +diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp +index 67669896..1e4161d1 100644 +--- a/src/network/access/qhttpnetworkconnectionchannel.cpp ++++ b/src/network/access/qhttpnetworkconnectionchannel.cpp +@@ -209,6 +209,10 @@ void QHttpNetworkConnectionChannel::abort() + bool QHttpNetworkConnectionChannel::sendRequest() + { + Q_ASSERT(protocolHandler); ++ if (waitingForPotentialAbort) { ++ needInvokeSendRequest = true; ++ return false; // this return value is unused ++ } + return protocolHandler->sendRequest(); + } + +@@ -221,21 +225,28 @@ bool QHttpNetworkConnectionChannel::sendRequest() + void QHttpNetworkConnectionChannel::sendRequestDelayed() + { + QMetaObject::invokeMethod(this, [this] { +- Q_ASSERT(protocolHandler); + if (reply) +- protocolHandler->sendRequest(); ++ sendRequest(); + }, Qt::ConnectionType::QueuedConnection); + } + + void QHttpNetworkConnectionChannel::_q_receiveReply() + { + Q_ASSERT(protocolHandler); ++ if (waitingForPotentialAbort) { ++ needInvokeReceiveReply = true; ++ return; ++ } + protocolHandler->_q_receiveReply(); + } + + void QHttpNetworkConnectionChannel::_q_readyRead() + { + Q_ASSERT(protocolHandler); ++ if (waitingForPotentialAbort) { ++ needInvokeReadyRead = true; ++ return; ++ } + protocolHandler->_q_readyRead(); + } + +@@ -1239,7 +1250,18 @@ void QHttpNetworkConnectionChannel::_q_encrypted() + if (!h2RequestsToSend.isEmpty()) { + // Similar to HTTP/1.1 counterpart below: + const auto &pair = std::as_const(h2RequestsToSend).first(); ++ waitingForPotentialAbort = true; + emit pair.second->encrypted(); ++ ++ // We don't send or handle any received data until any effects from ++ // emitting encrypted() have been processed. This is necessary ++ // because the user may have called abort(). We may also abort the ++ // whole connection if the request has been aborted and there is ++ // no more requests to send. ++ QMetaObject::invokeMethod(this, ++ &QHttpNetworkConnectionChannel::checkAndResumeCommunication, ++ Qt::QueuedConnection); ++ + // In case our peer has sent us its settings (window size, max concurrent streams etc.) + // let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection). + } +@@ -1257,6 +1279,28 @@ void QHttpNetworkConnectionChannel::_q_encrypted() + QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); + } + ++ ++void QHttpNetworkConnectionChannel::checkAndResumeCommunication() ++{ ++ Q_ASSERT(connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ++ || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct); ++ ++ // Because HTTP/2 requires that we send a SETTINGS frame as the first thing we do, and respond ++ // to a SETTINGS frame with an ACK, we need to delay any handling until we can ensure that any ++ // effects from emitting encrypted() have been processed. ++ // This function is called after encrypted() was emitted, so check for changes. ++ ++ if (!reply && h2RequestsToSend.isEmpty()) ++ abort(); ++ waitingForPotentialAbort = false; ++ if (needInvokeReadyRead) ++ _q_readyRead(); ++ if (needInvokeReceiveReply) ++ _q_receiveReply(); ++ if (needInvokeSendRequest) ++ sendRequest(); ++} ++ + void QHttpNetworkConnectionChannel::requeueHttp2Requests() + { + const auto h2RequestsToSendCopy = std::exchange(h2RequestsToSend, {}); +diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h +index c42290fe..061f20fd 100644 +--- a/src/network/access/qhttpnetworkconnectionchannel_p.h ++++ b/src/network/access/qhttpnetworkconnectionchannel_p.h +@@ -74,6 +74,10 @@ public: + QAbstractSocket *socket; + bool ssl; + bool isInitialized; ++ bool waitingForPotentialAbort = false; ++ bool needInvokeReceiveReply = false; ++ bool needInvokeReadyRead = false; ++ bool needInvokeSendRequest = false; + ChannelState state; + QHttpNetworkRequest request; // current request, only used for HTTP + QHttpNetworkReply *reply; // current reply for this request, only used for HTTP +@@ -146,6 +150,8 @@ public: + void closeAndResendCurrentRequest(); + void resendCurrentRequest(); + ++ void checkAndResumeCommunication(); ++ + bool isSocketBusy() const; + bool isSocketWriting() const; + bool isSocketWaiting() const; +diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp +index 74be5afd..9e5f94e3 100644 +--- a/tests/auto/network/access/http2/tst_http2.cpp ++++ b/tests/auto/network/access/http2/tst_http2.cpp +@@ -106,6 +106,8 @@ private slots: + + void duplicateRequestsWithAborts(); + ++ void abortOnEncrypted(); ++ + protected slots: + // Slots to listen to our in-process server: + void serverStarted(quint16 port); +@@ -1479,6 +1481,48 @@ void tst_Http2::duplicateRequestsWithAborts() + QCOMPARE(finishedCount, ExpectedSuccessfulRequests); + } + ++void tst_Http2::abortOnEncrypted() ++{ ++#if !QT_CONFIG(ssl) ++ QSKIP("TLS support is needed for this test"); ++#else ++ clearHTTP2State(); ++ serverPort = 0; ++ ++ ServerPtr targetServer(newServer(defaultServerSettings, H2Type::h2Direct)); ++ ++ QMetaObject::invokeMethod(targetServer.data(), "startServer", Qt::QueuedConnection); ++ runEventLoop(); ++ ++ nRequests = 1; ++ nSentRequests = 0; ++ ++ const auto url = requestUrl(H2Type::h2Direct); ++ QNetworkRequest request(url); ++ request.setAttribute(QNetworkRequest::Http2DirectAttribute, true); ++ ++ std::unique_ptr reply{manager->get(request)}; ++ reply->ignoreSslErrors(); ++ connect(reply.get(), &QNetworkReply::encrypted, reply.get(), [reply = reply.get()](){ ++ reply->abort(); ++ }); ++ connect(reply.get(), &QNetworkReply::errorOccurred, this, &tst_Http2::replyFinishedWithError); ++ ++ runEventLoop(); ++ STOP_ON_FAILURE ++ ++ QCOMPARE(nRequests, 0); ++ QCOMPARE(reply->error(), QNetworkReply::OperationCanceledError); ++ ++ const bool res = QTest::qWaitFor( ++ [this, server = targetServer.get()]() { ++ return serverGotSettingsACK || prefaceOK || nSentRequests > 0; ++ }, ++ 500); ++ QVERIFY(!res); ++#endif // QT_CONFIG(ssl) ++} ++ + void tst_Http2::serverStarted(quint16 port) + { + serverPort = port; diff --git a/SOURCES/macros.qt6-qtbase b/SOURCES/macros.qt6-qtbase new file mode 100644 index 0000000..164f760 --- /dev/null +++ b/SOURCES/macros.qt6-qtbase @@ -0,0 +1,4 @@ +%_qt6 @@NAME@@ +%_qt6_epoch @@EPOCH@@ +%_qt6_version @@VERSION@@ +%_qt6_evr @@EVR@@ diff --git a/SOURCES/qconfig-multilib.h b/SOURCES/qconfig-multilib.h new file mode 100644 index 0000000..a104c37 --- /dev/null +++ b/SOURCES/qconfig-multilib.h @@ -0,0 +1,23 @@ +/* qconfig.h */ +/* This file is here to prevent a file conflict on multiarch systems. A + * conflict will occur because qconfig.h has arch-specific definitions. + * + * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */ + +#ifndef QCONFIG_MULTILIB_H +#define QCONFIG_MULTILIB_H + +#ifndef __WORDSIZE +#include +#endif + +#if __WORDSIZE == 32 +#include "QtCore/qconfig-32.h" +#elif __WORDSIZE == 64 +#include "QtCore/qconfig-64.h" +#else +#error "unexpected value for __WORDSIZE macro" +#endif + +#endif + diff --git a/SOURCES/qtbase-CMake-Install-objects-files-into-ARCHDATADIR.patch b/SOURCES/qtbase-CMake-Install-objects-files-into-ARCHDATADIR.patch new file mode 100644 index 0000000..5d7bc91 --- /dev/null +++ b/SOURCES/qtbase-CMake-Install-objects-files-into-ARCHDATADIR.patch @@ -0,0 +1,51 @@ +From 4e517492a03b6c0b710a2d9a3df05922ac233992 Mon Sep 17 00:00:00 2001 +From: Christophe Marin +Date: Wed, 24 May 2023 11:23:39 +0200 +Subject: [PATCH] CMake: Install objects files into 'ARCHDATADIR' + +Change-Id: I917a9ef4d83f93eb5c3e47964bf1814d1b53fdab +--- + cmake/QtResourceHelpers.cmake | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/cmake/QtResourceHelpers.cmake b/cmake/QtResourceHelpers.cmake +index 2df1fed50f..e4f34b5ff1 100644 +--- a/cmake/QtResourceHelpers.cmake ++++ b/cmake/QtResourceHelpers.cmake +@@ -38,7 +38,7 @@ function(qt_internal_add_resource target resourceName) + if (out_targets) + qt_install(TARGETS ${out_targets} + EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" +- DESTINATION "${INSTALL_LIBDIR}" ++ DESTINATION "${INSTALL_ARCHDATADIR}" + ) + qt_internal_add_targets_to_additional_targets_export_file( + TARGETS ${out_targets} +@@ -47,7 +47,7 @@ function(qt_internal_add_resource target resourceName) + + qt_internal_install_resource_pdb_files("${out_targets}") + qt_internal_record_rcc_object_files("${target}" "${out_targets}" +- INSTALL_DIRECTORY "${INSTALL_LIBDIR}") ++ INSTALL_DIRECTORY "${INSTALL_ARCHDATADIR}") + endif() + + if (arg_OUTPUT_TARGETS) +@@ -77,7 +77,7 @@ function(qt_internal_record_rcc_object_files target resource_targets) + # It's comprised of thee following path parts: + # + # part (1) INSTALL_DIRECTORY. +- # A usual value is '${INSTALL_LIBDIR}/' for libraries ++ # A usual value is '${INSTALL_ARCHDATADIR}/' for libraries + # and '${INSTALL_QMLDIR}/foo/bar/' for qml plugin resources. + # + # part (2) the value computed by CMake's computeInstallObjectDir comprised of an +@@ -128,6 +128,6 @@ function(qt_internal_install_resource_pdb_files objlib_targets) + _qt_resource_generated_cpp_relative_path) + get_filename_component(rel_obj_file_dir "${generated_cpp_file_relative_path}" DIRECTORY) + qt_internal_install_pdb_files(${target} +- "${INSTALL_LIBDIR}/objects-$/${target}/${rel_obj_file_dir}") ++ "${INSTALL_ARCHDATADIR}/objects-$/${target}/${rel_obj_file_dir}") + endforeach() + endfunction() +-- +2.40.1 diff --git a/SOURCES/qtbase-cxxflag.patch b/SOURCES/qtbase-cxxflag.patch new file mode 100644 index 0000000..321f051 --- /dev/null +++ b/SOURCES/qtbase-cxxflag.patch @@ -0,0 +1,13 @@ +diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf +index e7e6ee1..ff2a939 100644 +--- a/mkspecs/common/gcc-base.conf ++++ b/mkspecs/common/gcc-base.conf +@@ -32,7 +32,7 @@ + # + + QMAKE_CFLAGS_OPTIMIZE = -O2 +-QMAKE_CFLAGS_OPTIMIZE_FULL = -O3 ++QMAKE_CFLAGS_OPTIMIZE_FULL = -O2 + QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Og + QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os + diff --git a/SOURCES/qtbase-libglvnd.patch b/SOURCES/qtbase-libglvnd.patch new file mode 100644 index 0000000..c5aa7e5 --- /dev/null +++ b/SOURCES/qtbase-libglvnd.patch @@ -0,0 +1,16 @@ +diff --git a/src/gui/configure.cmake b/src/gui/configure.cmake +index 0bf250ea..2d1bb645 100644 +--- a/src/gui/configure.cmake ++++ b/src/gui/configure.cmake +@@ -174,9 +174,9 @@ qt_config_compile_test(egl_x11 + int main(void) + { + /* BEGIN TEST: */ +-Display *dpy = EGL_DEFAULT_DISPLAY; ++Display *dpy = reinterpret_cast(EGL_DEFAULT_DISPLAY); + EGLNativeDisplayType egldpy = XOpenDisplay(\"\"); +-dpy = egldpy; ++dpy = reinterpret_cast(egldpy); + EGLNativeWindowType w = XCreateWindow(dpy, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + XDestroyWindow(dpy, w); + XCloseDisplay(dpy); diff --git a/SOURCES/qtbase-moc-macros.patch b/SOURCES/qtbase-moc-macros.patch new file mode 100644 index 0000000..8f5f4d6 --- /dev/null +++ b/SOURCES/qtbase-moc-macros.patch @@ -0,0 +1,16 @@ +diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp +index 1cb383c9..6bfdee55 100644 +--- a/src/tools/moc/main.cpp ++++ b/src/tools/moc/main.cpp +@@ -230,6 +230,11 @@ int runMoc(int argc, char **argv) + Moc moc; + pp.macros["Q_MOC_RUN"]; + pp.macros["__cplusplus"]; ++ pp.macros["_SYS_SYSMACROS_H_OUTER"]; ++ Macro macro; ++ macro.symbols = Preprocessor::tokenize(QByteArray::number(Q_PROCESSOR_WORDSIZE*8), 1, Preprocessor::TokenizeDefine); ++ macro.symbols.removeLast(); // remove the EOF symbol ++ pp.macros.insert("__WORDSIZE", macro); + + // Don't stumble over GCC extensions + Macro dummyVariadicFunctionMacro; diff --git a/SOURCES/qtbase-mysql.patch b/SOURCES/qtbase-mysql.patch new file mode 100644 index 0000000..c190ca6 --- /dev/null +++ b/SOURCES/qtbase-mysql.patch @@ -0,0 +1,12 @@ +diff -up qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql.cpp.than qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +diff -up qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h.than qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h +--- qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h.than 2017-07-14 13:43:50.831203768 +0200 ++++ qtbase-opensource-src-5.9.0/src/plugins/sqldrivers/mysql/qsql_mysql_p.h 2017-07-14 13:44:24.364948006 +0200 +@@ -58,6 +58,7 @@ + #endif + + #include ++#include + + #ifdef QT_PLUGIN + #define Q_EXPORT_SQLDRIVER_MYSQL diff --git a/SOURCES/qtbase-qgtk3theme-add-support-for-xdp-to-get-color-scheme.patch b/SOURCES/qtbase-qgtk3theme-add-support-for-xdp-to-get-color-scheme.patch new file mode 100644 index 0000000..1011da7 --- /dev/null +++ b/SOURCES/qtbase-qgtk3theme-add-support-for-xdp-to-get-color-scheme.patch @@ -0,0 +1,310 @@ +From d0b4e8a601bc2f81ddb23c124acc99defa26c02f Mon Sep 17 00:00:00 2001 +From: Jan Grulich +Date: Fri, 22 Mar 2024 12:12:51 +0100 +Subject: [PATCH] QGtk3Theme: Add support for xdg-desktop-portal to get color scheme + +Use xdg-desktop-portal to get color scheme used by GNOME. Recent GNOME +versions use this as primary way to switch between light and dark theme. +Make this a preferred way to get color scheme and fallback to previous +methods in case xdg-desktop-portal cannot be used. Also update app theme +on runtime when color scheme changes, not only when theme is changed. + +[ChangeLog][Platform Specific Changes][Linux] Add support for +xdg-desktop-portal to get color scheme in QGtk3Theme. + +Fixes: QTBUG-116197 +Change-Id: Ib3ffad405bc795ed6f4de4af411efc45721662b9 +Reviewed-by: Qt CI Bot +Reviewed-by: Axel Spoerl +Reviewed-by: Santhosh Kumar +--- + +diff --git a/src/plugins/platformthemes/gtk3/CMakeLists.txt b/src/plugins/platformthemes/gtk3/CMakeLists.txt +index becfccc..6d3c7bf 100644 +--- a/src/plugins/platformthemes/gtk3/CMakeLists.txt ++++ b/src/plugins/platformthemes/gtk3/CMakeLists.txt +@@ -35,6 +35,13 @@ + Qt::GuiPrivate + ) + ++qt_internal_extend_target(QGtk3ThemePlugin CONDITION QT_FEATURE_dbus ++ SOURCES ++ qgtk3portalinterface.cpp ++ LIBRARIES ++ Qt::DBus ++) ++ + qt_internal_extend_target(QGtk3ThemePlugin CONDITION QT_FEATURE_xlib + LIBRARIES + X11::X11 +diff --git a/src/plugins/platformthemes/gtk3/qgtk3portalinterface.cpp b/src/plugins/platformthemes/gtk3/qgtk3portalinterface.cpp +new file mode 100644 +index 0000000..1ffdda7 +--- /dev/null ++++ b/src/plugins/platformthemes/gtk3/qgtk3portalinterface.cpp +@@ -0,0 +1,123 @@ ++// Copyright (C) 2024 The Qt Company Ltd. ++// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt API. It exists purely as an ++// implementation detail. This header file may change from version to ++// version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#include "qgtk3portalinterface_p.h" ++#include "qgtk3storage_p.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++Q_LOGGING_CATEGORY(lcQGtk3PortalInterface, "qt.qpa.gtk"); ++ ++using namespace Qt::StringLiterals; ++ ++static constexpr QLatin1StringView appearanceInterface("org.freedesktop.appearance"); ++static constexpr QLatin1StringView colorSchemeKey("color-scheme"); ++ ++const QDBusArgument &operator>>(const QDBusArgument &argument, QMap &map) ++{ ++ argument.beginMap(); ++ map.clear(); ++ ++ while (!argument.atEnd()) { ++ QString key; ++ QVariantMap value; ++ argument.beginMapEntry(); ++ argument >> key >> value; ++ argument.endMapEntry(); ++ map.insert(key, value); ++ } ++ ++ argument.endMap(); ++ return argument; ++} ++ ++QGtk3PortalInterface::QGtk3PortalInterface(QGtk3Storage *s) ++ : m_storage(s) { ++ qRegisterMetaType(); ++ qDBusRegisterMetaType>(); ++ ++ queryColorScheme(); ++ ++ if (!s) { ++ qCDebug(lcQGtk3PortalInterface) << "QGtk3PortalInterface instantiated without QGtk3Storage." ++ << "No reaction to runtime theme changes."; ++ } ++} ++ ++Qt::ColorScheme QGtk3PortalInterface::colorScheme() const ++{ ++ return m_colorScheme; ++} ++ ++void QGtk3PortalInterface::queryColorScheme() { ++ QDBusConnection connection = QDBusConnection::sessionBus(); ++ QDBusMessage message = QDBusMessage::createMethodCall( ++ "org.freedesktop.portal.Desktop"_L1, ++ "/org/freedesktop/portal/desktop"_L1, ++ "org.freedesktop.portal.Settings"_L1, "ReadAll"_L1); ++ message << QStringList{ appearanceInterface }; ++ ++ QDBusPendingCall pendingCall = connection.asyncCall(message); ++ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this); ++ QObject::connect( ++ watcher, &QDBusPendingCallWatcher::finished, this, ++ [this](QDBusPendingCallWatcher *watcher) { ++ QDBusPendingReply> reply = *watcher; ++ if (reply.isValid()) { ++ QMap settings = reply.value(); ++ if (!settings.isEmpty()) { ++ settingChanged(appearanceInterface, colorSchemeKey, ++ QDBusVariant(settings.value(appearanceInterface).value(colorSchemeKey))); ++ } ++ } else { ++ qCDebug(lcQGtk3PortalInterface) << "Failed to query org.freedesktop.portal.Settings: " ++ << reply.error().message(); ++ } ++ watcher->deleteLater(); ++ }); ++ ++ QDBusConnection::sessionBus().connect( ++ "org.freedesktop.portal.Desktop"_L1, "/org/freedesktop/portal/desktop"_L1, ++ "org.freedesktop.portal.Settings"_L1, "SettingChanged"_L1, this, ++ SLOT(settingChanged(QString, QString, QDBusVariant))); ++} ++ ++void QGtk3PortalInterface::settingChanged(const QString &group, const QString &key, ++ const QDBusVariant &value) ++{ ++ if (group == appearanceInterface && key == colorSchemeKey) { ++ const uint colorScheme = value.variant().toUInt(); ++ // From org.freedesktop.portal.Settings.xml ++ // "1" - Prefer dark appearance ++ Qt::ColorScheme newColorScheme = colorScheme == 1 ? Qt::ColorScheme::Dark : Qt::ColorScheme::Light; ++ if (m_colorScheme != newColorScheme) { ++ m_colorScheme = newColorScheme; ++ if (m_storage) ++ m_storage->handleThemeChange(); ++ } ++ } ++} ++ ++QT_END_NAMESPACE ++ ++#include "moc_qgtk3portalinterface_p.cpp" +diff --git a/src/plugins/platformthemes/gtk3/qgtk3portalinterface_p.h b/src/plugins/platformthemes/gtk3/qgtk3portalinterface_p.h +new file mode 100644 +index 0000000..25a5f58 +--- /dev/null ++++ b/src/plugins/platformthemes/gtk3/qgtk3portalinterface_p.h +@@ -0,0 +1,49 @@ ++// Copyright (C) 2024 The Qt Company Ltd. ++// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only ++ ++#ifndef QGTK3PORTALINTERFACE_H ++#define QGTK3PORTALINTERFACE_H ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt API. It exists purely as an ++// implementation detail. This header file may change from version to ++// version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#include ++#include ++ ++QT_BEGIN_NAMESPACE ++ ++class QDBusVariant; ++class QGtk3Storage; ++ ++Q_DECLARE_LOGGING_CATEGORY(lcQGtk3PortalInterface); ++ ++class QGtk3PortalInterface : public QObject ++{ ++ Q_OBJECT ++public: ++ QGtk3PortalInterface(QGtk3Storage *s); ++ ~QGtk3PortalInterface() = default; ++ ++ Qt::ColorScheme colorScheme() const; ++ ++private Q_SLOTS: ++ void settingChanged(const QString &group, const QString &key, ++ const QDBusVariant &value); ++private: ++ void queryColorScheme(); ++ ++ Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown; ++ QGtk3Storage *m_storage = nullptr; ++}; ++ ++QT_END_NAMESPACE ++ ++#endif // QGTK3PORTALINTERFACE_H +diff --git a/src/plugins/platformthemes/gtk3/qgtk3storage.cpp b/src/plugins/platformthemes/gtk3/qgtk3storage.cpp +index 90c0282..2877b28 100644 +--- a/src/plugins/platformthemes/gtk3/qgtk3storage.cpp ++++ b/src/plugins/platformthemes/gtk3/qgtk3storage.cpp +@@ -21,6 +21,9 @@ + QGtk3Storage::QGtk3Storage() + { + m_interface.reset(new QGtk3Interface(this)); ++#if QT_CONFIG(dbus) ++ m_portalInterface.reset(new QGtk3PortalInterface(this)); ++#endif + populateMap(); + } + +@@ -273,7 +276,6 @@ + */ + void QGtk3Storage::handleThemeChange() + { +- clear(); + populateMap(); + QWindowSystemInterface::handleThemeChange(); + } +@@ -331,21 +333,32 @@ + static QString m_themeName; + + // Distiguish initialization, theme change or call without theme change ++ Qt::ColorScheme newColorScheme = Qt::ColorScheme::Unknown; + const QString newThemeName = themeName(); +- if (m_themeName == newThemeName) ++ ++#if QT_CONFIG(dbus) ++ // Prefer color scheme we get from xdg-desktop-portal as this is what GNOME ++ // relies on these days ++ newColorScheme = m_portalInterface->colorScheme(); ++#endif ++ ++ if (newColorScheme == Qt::ColorScheme::Unknown) { ++ // Derive color scheme from theme name ++ newColorScheme = newThemeName.contains("dark"_L1, Qt::CaseInsensitive) ++ ? Qt::ColorScheme::Dark : m_interface->colorSchemeByColors(); ++ } ++ ++ if (m_themeName == newThemeName && m_colorScheme == newColorScheme) + return; + + clear(); + +- // Derive color scheme from theme name +- m_colorScheme = newThemeName.contains("dark"_L1, Qt::CaseInsensitive) +- ? Qt::ColorScheme::Dark : m_interface->colorSchemeByColors(); +- + if (m_themeName.isEmpty()) { +- qCDebug(lcQGtk3Interface) << "GTK theme initialized:" << newThemeName << m_colorScheme; ++ qCDebug(lcQGtk3Interface) << "GTK theme initialized:" << newThemeName << newColorScheme; + } else { +- qCDebug(lcQGtk3Interface) << "GTK theme changed to:" << newThemeName << m_colorScheme; ++ qCDebug(lcQGtk3Interface) << "GTK theme changed to:" << newThemeName << newColorScheme; + } ++ m_colorScheme = newColorScheme; + m_themeName = newThemeName; + + // create standard mapping or load from Json file? +diff --git a/src/plugins/platformthemes/gtk3/qgtk3storage_p.h b/src/plugins/platformthemes/gtk3/qgtk3storage_p.h +index 37c5bf5..4519226 100644 +--- a/src/plugins/platformthemes/gtk3/qgtk3storage_p.h ++++ b/src/plugins/platformthemes/gtk3/qgtk3storage_p.h +@@ -16,6 +16,9 @@ + // + + #include "qgtk3interface_p.h" ++#if QT_CONFIG(dbus) ++#include "qgtk3portalinterface_p.h" ++#endif + + #include + #include +@@ -205,7 +208,9 @@ + PaletteMap m_palettes; + + std::unique_ptr m_interface; +- ++#if QT_CONFIG(dbus) ++ std::unique_ptr m_portalInterface; ++#endif + + Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown; + diff --git a/SOURCES/qtbase-use-only-major-minor-for-private-api-tag.patch b/SOURCES/qtbase-use-only-major-minor-for-private-api-tag.patch new file mode 100644 index 0000000..54e38a3 --- /dev/null +++ b/SOURCES/qtbase-use-only-major-minor-for-private-api-tag.patch @@ -0,0 +1,13 @@ +diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake +index 6a62b85c..1fc1f88d 100644 +--- a/cmake/QtFlagHandlingHelpers.cmake ++++ b/cmake/QtFlagHandlingHelpers.cmake +@@ -71,7 +71,7 @@ function(qt_internal_add_linker_version_script target) + + string(APPEND contents "\n};\nQt_${PROJECT_VERSION_MAJOR}") + if(QT_FEATURE_elf_private_full_version) +- string(APPEND contents ".${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") ++ string(APPEND contents ".${PROJECT_VERSION_MINOR}") + endif() + string(APPEND contents "_PRIVATE_API { qt_private_api_tag*;\n") + if(arg_PRIVATE_HEADERS) diff --git a/SOURCES/qtbase-version-check.patch b/SOURCES/qtbase-version-check.patch new file mode 100644 index 0000000..9343ade --- /dev/null +++ b/SOURCES/qtbase-version-check.patch @@ -0,0 +1,13 @@ +diff --git a/src/corelib/global/qtversionchecks.h b/src/corelib/global/qtversionchecks.h +index d3b7a7b0..a8b9c6f3 100644 +--- a/src/corelib/global/qtversionchecks.h ++++ b/src/corelib/global/qtversionchecks.h +@@ -26,7 +26,7 @@ + /* + can be used like #if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)) + */ +-#define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch)) ++#define QT_VERSION_CHECK(qt_version_check_major, qt_version_check_minor, qt_version_check_patch) ((qt_version_check_major<<16)|(qt_version_check_minor<<8)|(qt_version_check_patch)) + + /* + Helper macros to make some simple code active in Qt 6 or Qt 7 only, diff --git a/SOURCES/qtlogging.ini b/SOURCES/qtlogging.ini new file mode 100644 index 0000000..ead33b6 --- /dev/null +++ b/SOURCES/qtlogging.ini @@ -0,0 +1,3 @@ +[Rules] +*.debug=false +qt.qpa.xcb.xcberror.warning=false diff --git a/SPECS/qt6-qtbase.spec b/SPECS/qt6-qtbase.spec new file mode 100644 index 0000000..3715f22 --- /dev/null +++ b/SPECS/qt6-qtbase.spec @@ -0,0 +1,1114 @@ +# See http://bugzilla.redhat.com/223663 +%global multilib_archs x86_64 %{ix86} %{?mips} ppc64 ppc s390x s390 sparc64 sparcv9 +%global multilib_basearchs x86_64 %{?mips64} ppc64 s390x sparc64 + +%ifarch s390x ppc64le aarch64 armv7hl riscv64 +%global no_sse2 1 +%endif + +%if 0%{?rhel} && 0%{?rhel} < 9 +%ifarch %{ix86} +%global no_sse2 1 +%endif +%endif + +%if 0%{?rhel} >= 10 +# Use mutter on RHEL 10+ since it's the only shipped compositor +%global wlheadless_compositor mutter +%else +# Use the simple reference compositor to simplify dependencies +%global wlheadless_compositor weston +%endif + +%global platform linux-g++ + +%if 0%{?use_clang} +%global platform linux-clang +%endif + +%global qt_module qtbase + +# use external qt_settings pkg +%if 0%{?fedora} +%global qt_settings 1 +%endif + +%global journald 1 +BuildRequires: pkgconfig(libsystemd) + +%global examples 1 +## skip for now, until we're better at it --rex +#global tests 0 +%global build_tests 1 + +#global unstable 0 +%global prerelease rc2 + +Name: qt6-qtbase +Summary: Qt6 - QtBase components +Version: 6.7.1 +Release: 5%{?dist} + +License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +Url: http://qt-project.org/ +%global majmin %(echo %{version} | cut -d. -f1-2) +%global qt_version %(echo %{version} | cut -d~ -f1) + +%if 0%{?unstable} +Source0: https://download.qt.io/development_releases/qt/%{majmin}/%{qt_version}/submodules/%{qt_module}-everywhere-src-%{qt_version}-%{prerelease}.tar.xz +%else +Source0: https://download.qt.io/official_releases/qt/%{majmin}/%{version}/submodules/%{qt_module}-everywhere-src-%{version}.tar.xz +%endif + +# https://bugzilla.redhat.com/show_bug.cgi?id=1227295 +Source1: qtlogging.ini + +# header file to workaround multilib issue +# https://bugzilla.redhat.com/show_bug.cgi?id=1036956 +Source5: qconfig-multilib.h + +# xinitrc script to check for OpenGL 1 only drivers and automatically set +# QT_XCB_FORCE_SOFTWARE_OPENGL for them +Source6: 10-qt6-check-opengl2.sh + +# macros +Source10: macros.qt6-qtbase + +Patch1: qtbase-CMake-Install-objects-files-into-ARCHDATADIR.patch +Patch2: qtbase-use-only-major-minor-for-private-api-tag.patch + +# upstreamable patches +# namespace QT_VERSION_CHECK to workaround major/minor being pre-defined (#1396755) +Patch50: qtbase-version-check.patch + +# 1. Workaround moc/multilib issues +# https://bugzilla.redhat.com/show_bug.cgi?id=1290020 +# https://bugreports.qt.io/browse/QTBUG-49972 +# 2. Workaround sysmacros.h (pre)defining major/minor a breaking stuff +Patch51: qtbase-moc-macros.patch + +# drop -O3 and make -O2 by default +Patch54: qtbase-cxxflag.patch + +# fix for new mariadb +Patch56: qtbase-mysql.patch + +# fix FTBFS against libglvnd-1.3.4+ +Patch58: qtbase-libglvnd.patch + +# Bug 1954359 - Many emoji don't show up in Qt apps because qt does not handle 'emoji' font family +# FIXME: this change seems to completely break font rendering for some people +# Patch60: qtbase-cache-emoji-font.patch + +%if 0%{?fedora} && 0%{?fedora} < 39 +# Latest QGnomePlatform needs to be specified to be used +Patch100: qtbase-use-qgnomeplatform-as-default-platform-theme-on-gnome.patch +%endif + +## upstream patches +Patch200: qtbase-qgtk3theme-add-support-for-xdp-to-get-color-scheme.patch +Patch201: CVE-2024-39936.patch + +## RHEL specific patches +# Patch300: qtbase-fix-tests.patch + +# Do not check any files in %%{_qt6_plugindir}/platformthemes/ for requires. +# Those themes are there for platform integration. If the required libraries are +# not there, the platform to integrate with isn't either. Then Qt will just +# silently ignore the plugin that fails to load. Thus, there is no need to let +# RPM drag in gtk3 as a dependency for the GTK+3 dialog support. +%global __requires_exclude_from ^%{_qt6_plugindir}/platformthemes/.*$ +# filter plugin provides +%global __provides_exclude_from ^%{_qt6_plugindir}/.*\\.so$ + +%if 0%{?use_clang} +BuildRequires: clang >= 6.0.0 +%else +BuildRequires: gcc-c++ +%endif +BuildRequires: cmake +BuildRequires: ninja-build +BuildRequires: cups-devel +BuildRequires: desktop-file-utils +BuildRequires: findutils +%if 0%{?fedora} || 0%{?epel} +BuildRequires: double-conversion-devel +%else +Provides: bundled(double-conversion) +%endif +%if 0%{?fedora} || 0%{?epel} +BuildRequires: libb2-devel +%else +Provides: bundled(libb2) +%endif +BuildRequires: libjpeg-devel +BuildRequires: libmng-devel +BuildRequires: libtiff-devel +BuildRequires: libzstd-devel +BuildRequires: mtdev-devel +%if 0%{?fedora} || 0%{?epel} +BuildRequires: tslib-devel +%endif +BuildRequires: pkgconfig(alsa) +# required for -accessibility +BuildRequires: pkgconfig(atspi-2) +# http://bugzilla.redhat.com/1196359 +%global dbus_linked 1 +BuildRequires: pkgconfig(dbus-1) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(gl) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gtk+-3.0) +BuildRequires: pkgconfig(libproxy-1.0) +BuildRequires: pkgconfig(libsctp) +# xcb-sm +BuildRequires: pkgconfig(ice) pkgconfig(sm) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libudev) +BuildRequires: openssl-devel +BuildRequires: pkgconfig(libpulse) pkgconfig(libpulse-mainloop-glib) +BuildRequires: pkgconfig(libinput) +BuildRequires: pkgconfig(xcb-xkb) >= 1.10 +BuildRequires: pkgconfig(xcb-util) +BuildRequires: pkgconfig(xkbcommon) >= 0.4.1 +BuildRequires: pkgconfig(xkbcommon-x11) >= 0.4.1 +BuildRequires: pkgconfig(xkeyboard-config) +%global vulkan 1 +BuildRequires: pkgconfig(vulkan) +%global egl 1 +BuildRequires: mesa-libEGL-devel +BuildRequires: pkgconfig(egl) +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(libglvnd) +BuildRequires: pkgconfig(x11) +# only needed for GLES2 and GLES3 builds +#BuildRequires: pkgconfig(glesv2) + +%global sqlite 1 +BuildRequires: pkgconfig(sqlite3) >= 3.7 +BuildRequires: pkgconfig(harfbuzz) >= 0.9.42 +BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(libpcre2-16) >= 10.20 +%global pcre 1 +BuildRequires: pkgconfig(xcb-xkb) +BuildRequires: pkgconfig(xcb) pkgconfig(xcb-glx) pkgconfig(xcb-icccm) pkgconfig(xcb-image) pkgconfig(xcb-keysyms) pkgconfig(xcb-renderutil) pkgconfig(xcb-cursor) +BuildRequires: pkgconfig(zlib) +BuildRequires: perl +BuildRequires: perl-generators +# see patch68 +BuildRequires: python3 +BuildRequires: qt6-rpm-macros + +%if 0%{?tests} +BuildRequires: dbus-x11 +BuildRequires: mesa-dri-drivers +BuildRequires: time +BuildRequires: (wlheadless-run and %{wlheadless_compositor}) +%endif + +Requires: qt6-filesystem + +Requires: %{name}-common = %{version}-%{release} + +## Sql drivers +%if 0%{?fedora} || 0%{?epel} +%global ibase 1 +%endif + + +%description +Qt is a software toolkit for developing applications. + +This package contains base tools, like string, xml, and network +handling. + +%package common +Summary: Common files for Qt6 +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +%description common +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-gui%{?_isa} +%if 0%{?egl} +Requires: libEGL-devel +%endif +Requires: pkgconfig(gl) +%if 0%{?vulkan} +Requires: pkgconfig(vulkan) +%endif +# Optional dev dependency of Qt6::Gui +Requires: pkgconfig(xkbcommon) +Requires: qt6-rpm-macros +%if 0%{?use_clang} +Requires: clang >= 3.7.0 +%endif +%if 0%{?ibase} +Requires: %{name}-ibase%{?_isa} = %{version}-%{release} +%endif +Requires: %{name}-mysql%{?_isa} = %{version}-%{release} +Requires: %{name}-odbc%{?_isa} = %{version}-%{release} +Requires: %{name}-postgresql%{?_isa} = %{version}-%{release} +%description devel +%{summary}. + +%package private-devel +Summary: Development files for %{name} private APIs +Requires: %{name}-devel%{?_isa} = %{version}-%{release} +# QtPrintSupport/private requires cups/ppd.h +Requires: cups-devel +%description private-devel +%{summary}. + +%package examples +Summary: Programming examples for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-gui%{?_isa} = %{version}-%{release} +%description examples +%{summary}. + +%package static +Summary: Static library files for %{name} +Requires: %{name}-devel%{?_isa} = %{version}-%{release} +Requires: pkgconfig(fontconfig) +Requires: pkgconfig(glib-2.0) +Requires: pkgconfig(libinput) +Requires: pkgconfig(xkbcommon) +Requires: pkgconfig(zlib) + +%description static +%{summary}. + +%if 0%{?build_tests} +%package tests +Summary: Unit tests for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-gui%{?_isa} = %{version}-%{release} + +%description tests +%{summary}. +%endif + +%if 0%{?ibase} +%package ibase +Summary: IBase driver for Qt6's SQL classes +BuildRequires: firebird-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +%description ibase +%{summary}. +%endif + +%package mysql +Summary: MySQL driver for Qt6's SQL classes +%if 0%{?fedora} > 27 || 0%{?rhel} > 8 +BuildRequires: mariadb-connector-c-devel +%else +BuildRequires: mysql-devel +%endif +Requires: %{name}%{?_isa} = %{version}-%{release} +%description mysql +%{summary}. + +%package odbc +Summary: ODBC driver for Qt6's SQL classes +BuildRequires: unixODBC-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +%description odbc +%{summary}. + +%package postgresql +Summary: PostgreSQL driver for Qt6's SQL classes +BuildRequires: libpq-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +%description postgresql +%{summary}. + +# debating whether to do 1 subpkg per library or not -- rex +%package gui +Summary: Qt6 GUI-related libraries +Requires: %{name}%{?_isa} = %{version}-%{release} +Recommends: mesa-dri-drivers%{?_isa} +Recommends: qt6-qtwayland%{?_isa} +# Required for some locales: https://pagure.io/fedora-kde/SIG/issue/311 +Recommends: qt6-qttranslations +# for Source6: 10-qt6-check-opengl2.sh: +# glxinfo +Requires: glx-utils +%description gui +Qt6 libraries used for drawing widgets and OpenGL items. + + +%prep +%autosetup -n %{qt_module}-everywhere-src-%{qt_version}%{?unstable:-%{prerelease}} -p1 + +# move some bundled libs to ensure they're not accidentally used +pushd src/3rdparty +mkdir UNUSED +mv harfbuzz-ng freetype libjpeg libpng sqlite zlib UNUSED/ +popd + +# builds failing mysteriously on f20 +# ./configure: Permission denied +# check to ensure that can't happen -- rex +test -x configure || chmod +x configure + + +%build +# QT is known not to work properly with LTO at this point. Some of the issues +# are being worked on upstream and disabling LTO should be re-evaluated as +# we update this change. Until such time... +# Disable LTO +# https://bugzilla.redhat.com/1900527 +%define _lto_cflags %{nil} + +## FIXME/TODO: +# * for %%ix86, add sse2 enabled builds for Qt6Gui, Qt6Core, QtNetwork, see also: +# http://anonscm.debian.org/cgit/pkg-kde/qt/qtbase.git/tree/debian/rules (234-249) + +## adjust $RPM_OPT_FLAGS +# remove -fexceptions +RPM_OPT_FLAGS=`echo $RPM_OPT_FLAGS | sed 's|-fexceptions||g'` +RPM_OPT_FLAGS="$RPM_OPT_FLAGS %{?qt6_arm_flag} %{?qt6_deprecated_flag} %{?qt6_null_flag}" + +%if 0%{?use_clang} +RPM_OPT_FLAGS=`echo $RPM_OPT_FLAGS | sed 's|-fno-delete-null-pointer-checks||g'` +%endif + +export CFLAGS="$CFLAGS $RPM_OPT_FLAGS" +export CXXFLAGS="$CXXFLAGS $RPM_OPT_FLAGS" +export LDFLAGS="$LDFLAGS $RPM_LD_FLAGS" +export MAKEFLAGS="%{?_smp_mflags}" + +%cmake_qt6 \ + -DQT_FEATURE_accessibility=ON \ + -DQT_FEATURE_fontconfig=ON \ + -DQT_FEATURE_glib=ON \ + -DQT_FEATURE_sse2=%{?no_sse2:OFF}%{!?no_sse2:ON} \ + -DQT_FEATURE_icu=ON \ + -DQT_FEATURE_enable_new_dtags=ON \ + -DQT_FEATURE_journald=%{?journald:ON}%{!?journald:OFF} \ + -DQT_FEATURE_openssl_linked=ON \ + -DQT_FEATURE_openssl_hash=ON \ + -DQT_FEATURE_libproxy=ON \ + -DQT_FEATURE_sctp=ON \ + -DQT_FEATURE_separate_debug_info=OFF \ + -DQT_FEATURE_reduce_relocations=OFF \ + -DQT_FEATURE_relocatable=OFF \ + -DQT_FEATURE_system_jpeg=ON \ + -DQT_FEATURE_system_png=ON \ + -DQT_FEATURE_system_zlib=ON \ + %{?ibase:-DQT_FEATURE_sql_ibase=ON} \ + -DQT_FEATURE_sql_odbc=ON \ + -DQT_FEATURE_sql_mysql=ON \ + -DQT_FEATURE_sql_psql=ON \ + -DQT_FEATURE_sql_sqlite=ON \ + -DQT_FEATURE_rpath=OFF \ + -DQT_FEATURE_zstd=ON \ + -DQT_FEATURE_elf_private_full_version=ON \ + %{?dbus_linked:-DQT_FEATURE_dbus_linked=ON} \ + %{?pcre:-DQT_FEATURE_system_pcre2=ON} \ + %{?sqlite:-DQT_FEATURE_system_sqlite=ON} \ + -DBUILD_SHARED_LIBS=ON \ + -DQT_BUILD_EXAMPLES=%{?examples:ON}%{!?examples:OFF} \ + -DQT_INSTALL_EXAMPLES_SOURCES=%{?examples:ON}%{!?examples:OFF} \ + -DQT_BUILD_TESTS=%{?build_tests:ON}%{!?build_tests:OFF} \ + -DQT_QMAKE_TARGET_MKSPEC=%{platform} + +# FIXME +# -DQT_FEATURE_directfb=ON \ + +%cmake_build + + +%install +%if 0%{?build_tests} +%qt6_dont_autoinstall_tests +%endif + +%cmake_install + +%if 0%{?build_tests} +%qt6_install_tests +%endif + +install -m644 -p -D %{SOURCE1} %{buildroot}%{_qt6_datadir}/qtlogging.ini + +# Qt6.pc +mkdir -p %{buildroot}%{_libdir}/pkgconfig +cat << EOF > %{buildroot}%{_libdir}/pkgconfig/Qt6.pc +prefix=%{_qt6_prefix} +archdatadir=%{_qt6_archdatadir} +bindir=%{_qt6_bindir} +datadir=%{_qt6_datadir} + +docdir=%{_qt6_docdir} +examplesdir=%{_qt6_examplesdir} +headerdir=%{_qt6_headerdir} +importdir=%{_qt6_importdir} +libdir=%{_qt6_libdir} +libexecdir=%{_qt6_libexecdir} +moc=%{_qt6_libexecdir}/moc +plugindir=%{_qt6_plugindir} +qmake=%{_qt6_bindir}/qmake +settingsdir=%{_qt6_settingsdir} +sysconfdir=%{_qt6_sysconfdir} +translationdir=%{_qt6_translationdir} + +Name: Qt6 +Description: Qt6 Configuration +Version: 6.7.1 +EOF + +# rpm macros +install -p -m644 -D %{SOURCE10} \ + %{buildroot}%{_rpmmacrodir}/macros.qt6-qtbase +sed -i \ + -e "s|@@NAME@@|%{name}|g" \ + -e "s|@@EPOCH@@|%{?epoch}%{!?epoch:0}|g" \ + -e "s|@@VERSION@@|%{version}|g" \ + -e "s|@@EVR@@|%{?epoch:%{epoch:}}%{version}-%{release}|g" \ + %{buildroot}%{_rpmmacrodir}/macros.qt6-qtbase + +# create/own dirs +mkdir -p %{buildroot}%{_qt6_plugindir}/{designer,iconengines,script,styles} +mkdir -p %{buildroot}%{_sysconfdir}/xdg/QtProject + +# hardlink files to {_bindir}, add -qt6 postfix to not conflict +mkdir %{buildroot}%{_bindir} +pushd %{buildroot}%{_qt6_bindir} +for i in * ; do + case "${i}" in + qdbuscpp2xml|qdbusxml2cpp|qtpaths) + ln -v ${i} %{buildroot}%{_bindir}/${i}-qt6 + ;; + *) + ln -v ${i} %{buildroot}%{_bindir}/${i} + ;; + esac +done +popd + + +%ifarch %{multilib_archs} +# multilib: qconfig.h + mv %{buildroot}%{_qt6_headerdir}/QtCore/qconfig.h %{buildroot}%{_qt6_headerdir}/QtCore/qconfig-%{__isa_bits}.h + install -p -m644 -D %{SOURCE5} %{buildroot}%{_qt6_headerdir}/QtCore/qconfig.h +%endif + + +## .prl/.la file love +# nuke .prl reference(s) to %%buildroot, excessive (.la-like) libs +pushd %{buildroot}%{_qt6_libdir} +for prl_file in libQt6*.prl ; do + sed -i -e "/^QMAKE_PRL_BUILD_DIR/d" ${prl_file} + if [ -f "$(basename ${prl_file} .prl).so" ]; then + rm -fv "$(basename ${prl_file} .prl).la" + sed -i -e "/^QMAKE_PRL_LIBS/d" ${prl_file} + fi +done +popd + +install -p -m755 -D %{SOURCE6} %{buildroot}%{_sysconfdir}/X11/xinit/xinitrc.d/10-qt6-check-opengl2.sh + +# install privat headers for qtxcb +mkdir -p %{buildroot}%{_qt6_headerdir}/QtXcb +install -m 644 src/plugins/platforms/xcb/*.h %{buildroot}%{_qt6_headerdir}/QtXcb/ + +rm %{buildroot}/%{_qt6_libexecdir}/qt-cmake-private-install.cmake + +# Use better location for some new scripts in qtbase-6.0.1 +mv %{buildroot}/%{_qt6_libexecdir}/ensure_pro_file.cmake %{buildroot}/%{_qt6_libdir}/cmake/Qt6/ensure_pro_file.cmake + +%check +# verify Qt6.pc +export PKG_CONFIG_PATH=%{buildroot}%{_libdir}/pkgconfig +test "$(pkg-config --modversion Qt6)" = "%{qt_version}" +%if 0%{?tests} +## see tests/README for expected environment (running a plasma session essentially) +## we are not quite there yet +export CTEST_OUTPUT_ON_FAILURE=1 +export PATH=%{buildroot}%{_qt6_bindir}:$PATH +export LD_LIBRARY_PATH=%{buildroot}%{_qt6_libdir} +# dbus tests error out when building if session bus is not available +dbus-launch --exit-with-session \ +wlheadless-run -c %{wlheadless_compositor} -- \ +dbus-launch --exit-with-session \ +time \ +make check -k ||: +%endif + +%ldconfig_scriptlets + +%files +%license LICENSES/GPL* +%license LICENSES/LGPL* +%dir %{_sysconfdir}/xdg/QtProject/ +%{_qt6_libdir}/libQt6Concurrent.so.6* +%{_qt6_libdir}/libQt6Core.so.6* +%{_qt6_libdir}/libQt6DBus.so.6* +%{_qt6_libdir}/libQt6Network.so.6* +%{_qt6_libdir}/libQt6Sql.so.6* +%{_qt6_libdir}/libQt6Test.so.6* +%{_qt6_libdir}/libQt6Xml.so.6* +%{_qt6_docdir}/global/ +%{_qt6_docdir}/config/ +%{_qt6_datadir}/qtlogging.ini +%dir %{_qt6_plugindir}/designer/ +%dir %{_qt6_plugindir}/generic/ +%dir %{_qt6_plugindir}/iconengines/ +%dir %{_qt6_plugindir}/imageformats/ +%dir %{_qt6_plugindir}/platforminputcontexts/ +%dir %{_qt6_plugindir}/platforms/ +%dir %{_qt6_plugindir}/platformthemes/ +%dir %{_qt6_plugindir}/printsupport/ +%dir %{_qt6_plugindir}/script/ +%dir %{_qt6_plugindir}/sqldrivers/ +%dir %{_qt6_plugindir}/styles/ +%{_qt6_plugindir}/networkinformation/libqglib.so +%{_qt6_plugindir}/networkinformation/libqnetworkmanager.so +%{_qt6_plugindir}/sqldrivers/libqsqlite.so +%{_qt6_plugindir}/tls/libqcertonlybackend.so +%{_qt6_plugindir}/tls/libqopensslbackend.so +%{_bindir}/qtpaths* +%{_qt6_bindir}/qtpaths* + +%files common +# mostly empty for now, consider: filesystem/dir ownership, licenses +%{_rpmmacrodir}/macros.qt6-qtbase + +%files devel +%dir %{_qt6_libdir}/cmake/Qt6 +%dir %{_qt6_libdir}/cmake/Qt6/platforms +%dir %{_qt6_libdir}/cmake/Qt6/platforms/Platform +%dir %{_qt6_libdir}/cmake/Qt6/config.tests +%dir %{_qt6_libdir}/cmake/Qt6/3rdparty/extra-cmake-modules +%dir %{_qt6_libdir}/cmake/Qt6/3rdparty/kwin +%dir %{_qt6_libdir}/cmake/Qt6BuildInternals +%dir %{_qt6_libdir}/cmake/Qt6BuildInternals/StandaloneTests +%dir %{_qt6_libdir}/cmake/Qt6Concurrent +%dir %{_qt6_libdir}/cmake/Qt6Core +%dir %{_qt6_libdir}/cmake/Qt6CoreTools +%dir %{_qt6_libdir}/cmake/Qt6DBus +%dir %{_qt6_libdir}/cmake/Qt6DBusTools +%dir %{_qt6_libdir}/cmake/Qt6DeviceDiscoverySupportPrivate +%dir %{_qt6_libdir}/cmake/Qt6EglFSDeviceIntegrationPrivate +%dir %{_qt6_libdir}/cmake/Qt6EglFsKmsGbmSupportPrivate +%dir %{_qt6_libdir}/cmake/Qt6EglFsKmsSupportPrivate +%dir %{_qt6_libdir}/cmake/Qt6ExampleIconsPrivate +%dir %{_qt6_libdir}/cmake/Qt6FbSupportPrivate +%dir %{_qt6_libdir}/cmake/Qt6Gui +%dir %{_qt6_libdir}/cmake/Qt6GuiTools +%dir %{_qt6_libdir}/cmake/Qt6HostInfo +%dir %{_qt6_libdir}/cmake/Qt6KmsSupportPrivate +%dir %{_qt6_libdir}/cmake/Qt6Network +%dir %{_qt6_libdir}/cmake/Qt6OpenGL +%dir %{_qt6_libdir}/cmake/Qt6OpenGLWidgets +%dir %{_qt6_libdir}/cmake/Qt6PrintSupport +%dir %{_qt6_libdir}/cmake/Qt6Sql +%dir %{_qt6_libdir}/cmake/Qt6Test +%dir %{_qt6_libdir}/cmake/Qt6Widgets +%dir %{_qt6_libdir}/cmake/Qt6WidgetsTools +%dir %{_qt6_libdir}/cmake/Qt6Xml +%{_bindir}/androiddeployqt +%{_bindir}/androiddeployqt6 +%{_bindir}/androidtestrunner +%{_bindir}/qdbuscpp2xml* +%{_bindir}/qdbusxml2cpp* +%{_bindir}/qmake* +%{_bindir}/qt-cmake +%{_bindir}/qt-cmake-create +%{_bindir}/qt-configure-module +%{_libdir}/qt6/bin/qmake6 +%{_qt6_bindir}/androiddeployqt +%{_qt6_bindir}/androiddeployqt6 +%{_qt6_bindir}/androidtestrunner +%{_qt6_bindir}/qdbuscpp2xml +%{_qt6_bindir}/qdbusxml2cpp +%{_qt6_bindir}/qmake +%{_qt6_bindir}/qt-cmake +%{_qt6_bindir}/qt-cmake-create +%{_qt6_bindir}/qt-configure-module +%{_qt6_libexecdir}/qt-cmake-private +%{_qt6_libexecdir}/qt-cmake-standalone-test +%{_qt6_libexecdir}/cmake_automoc_parser +%{_qt6_libexecdir}/qt-internal-configure-examples +%{_qt6_libexecdir}/qt-internal-configure-tests +%{_qt6_libexecdir}/sanitizer-testrunner.py +%{_qt6_libexecdir}/syncqt +%{_qt6_libexecdir}/moc +%{_qt6_libexecdir}/tracegen +%{_qt6_libexecdir}/tracepointgen +%{_qt6_libexecdir}/qlalr +%{_qt6_libexecdir}/qvkgen +%{_qt6_libexecdir}/rcc +%{_qt6_libexecdir}/uic +%{_qt6_libexecdir}/qt-testrunner.py +%{_qt6_libdir}/qt6/modules/*.json +%{_qt6_headerdir}/QtConcurrent/ +%{_qt6_headerdir}/QtCore/ +%{_qt6_headerdir}/QtDBus/ +%{_qt6_headerdir}/QtInputSupport +%{_qt6_headerdir}/QtExampleIcons +%{_qt6_headerdir}/QtGui/ +%{_qt6_headerdir}/QtNetwork/ +%{_qt6_headerdir}/QtOpenGL/ +%{_qt6_headerdir}/QtOpenGLWidgets +%{_qt6_headerdir}/QtPrintSupport/ +%{_qt6_headerdir}/QtSql/ +%{_qt6_headerdir}/QtTest/ +%{_qt6_headerdir}/QtWidgets/ +%{_qt6_headerdir}/QtXcb/ +%{_qt6_headerdir}/QtXml/ +%{_qt6_headerdir}/QtEglFSDeviceIntegration +%{_qt6_headerdir}/QtEglFsKmsGbmSupport +%{_qt6_headerdir}/QtEglFsKmsSupport +%{_qt6_mkspecsdir}/ +%{_qt6_libdir}/libQt6Concurrent.prl +%{_qt6_libdir}/libQt6Concurrent.so +%{_qt6_libdir}/libQt6Core.prl +%{_qt6_libdir}/libQt6Core.so +%{_qt6_libdir}/libQt6DBus.prl +%{_qt6_libdir}/libQt6DBus.so +%{_qt6_libdir}/libQt6Gui.prl +%{_qt6_libdir}/libQt6Gui.so +%{_qt6_libdir}/libQt6Network.prl +%{_qt6_libdir}/libQt6Network.so +%{_qt6_libdir}/libQt6OpenGL.prl +%{_qt6_libdir}/libQt6OpenGL.so +%{_qt6_libdir}/libQt6OpenGLWidgets.prl +%{_qt6_libdir}/libQt6OpenGLWidgets.so +%{_qt6_libdir}/libQt6PrintSupport.prl +%{_qt6_libdir}/libQt6PrintSupport.so +%{_qt6_libdir}/libQt6Sql.prl +%{_qt6_libdir}/libQt6Sql.so +%{_qt6_libdir}/libQt6Test.prl +%{_qt6_libdir}/libQt6Test.so +%{_qt6_libdir}/libQt6Widgets.prl +%{_qt6_libdir}/libQt6Widgets.so +%{_qt6_libdir}/libQt6XcbQpa.prl +%{_qt6_libdir}/libQt6XcbQpa.so +%{_qt6_libdir}/libQt6Xml.prl +%{_qt6_libdir}/libQt6Xml.so +%{_qt6_libdir}/libQt6EglFSDeviceIntegration.prl +%{_qt6_libdir}/libQt6EglFSDeviceIntegration.so +%{_qt6_libdir}/libQt6EglFsKmsGbmSupport.prl +%{_qt6_libdir}/libQt6EglFsKmsGbmSupport.so +%{_qt6_libdir}/cmake/Qt6/*.h.in +%{_qt6_libdir}/cmake/Qt6/*.cmake +%{_qt6_libdir}/cmake/Qt6/*.cmake.in +%{_qt6_libdir}/cmake/Qt6/PkgConfigLibrary.pc.in +%{_qt6_libdir}/cmake/Qt6/config.tests/* +%{_qt6_libdir}/cmake/Qt6/libexec/* +%{_qt6_libdir}/cmake/Qt6/platforms/*.cmake +%{_qt6_libdir}/cmake/Qt6/platforms/Platform/*.cmake +%{_qt6_libdir}/cmake/Qt6/qbatchedtestrunner.in.cpp +%{_qt6_libdir}/cmake/Qt6/ModuleDescription.json.in +%{_qt6_libdir}/cmake/Qt6/QtFileConfigure.txt.in +%{_qt6_libdir}/cmake/Qt6/QtConfigureTimeExecutableCMakeLists.txt.in +%{_qt6_libdir}/cmake/Qt6/QtSeparateDebugInfo.Info.plist.in +%{_qt6_libdir}/cmake/Qt6/3rdparty/extra-cmake-modules/COPYING-CMAKE-SCRIPTS +%{_qt6_libdir}/cmake/Qt6/3rdparty/extra-cmake-modules/find-modules/*.cmake +%{_qt6_libdir}/cmake/Qt6/3rdparty/extra-cmake-modules/modules/*.cmake +%{_qt6_libdir}/cmake/Qt6/3rdparty/extra-cmake-modules/qt_attribution.json +%{_qt6_libdir}/cmake/Qt6/3rdparty/kwin/COPYING-CMAKE-SCRIPTS +%{_qt6_libdir}/cmake/Qt6/3rdparty/kwin/*.cmake +%{_qt6_libdir}/cmake/Qt6/3rdparty/kwin/qt_attribution.json +%{_qt6_libdir}/cmake/Qt6BuildInternals/*.cmake +%{_qt6_libdir}/cmake/Qt6BuildInternals/QtStandaloneTestTemplateProject/CMakeLists.txt +%{_qt6_libdir}/cmake/Qt6BuildInternals/StandaloneTests/QtBaseTestsConfig.cmake +%{_qt6_libdir}/cmake/Qt6BuildInternals/QtStandaloneTestTemplateProject/Main.cmake +%{_qt6_libdir}/cmake/Qt6Concurrent/*.cmake +%{_qt6_libdir}/cmake/Qt6Core/*.cmake +%{_qt6_libdir}/cmake/Qt6Core/Qt6CoreResourceInit.in.cpp +%{_qt6_libdir}/cmake/Qt6Core/Qt6CoreConfigureFileTemplate.in +%{_qt6_libdir}/cmake/Qt6CoreTools/*.cmake +%{_qt6_libdir}/cmake/Qt6DBus/*.cmake +%{_qt6_libdir}/cmake/Qt6DBusTools/*.cmake +%{_qt6_libdir}/cmake/Qt6DeviceDiscoverySupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6EglFSDeviceIntegrationPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6EglFsKmsGbmSupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6EglFsKmsSupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6ExampleIconsPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6FbSupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6Gui/*.cmake +%{_qt6_libdir}/cmake/Qt6GuiTools/*.cmake +%{_qt6_libdir}/cmake/Qt6HostInfo/*.cmake +%{_qt6_libdir}/cmake/Qt6InputSupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6KmsSupportPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6Network/*.cmake +%{_qt6_libdir}/cmake/Qt6OpenGL/*.cmake +%{_qt6_libdir}/cmake/Qt6OpenGLWidgets/*.cmake +%{_qt6_libdir}/cmake/Qt6PrintSupport/*.cmake +%{_qt6_libdir}/cmake/Qt6Sql/Qt6Sql*.cmake +%{_qt6_libdir}/cmake/Qt6Sql/Qt6QSQLiteDriverPlugin*.cmake +%{_qt6_libdir}/cmake/Qt6Test/*.cmake +%{_qt6_libdir}/cmake/Qt6Widgets/*.cmake +%{_qt6_libdir}/cmake/Qt6WidgetsTools/*.cmake +%{_qt6_libdir}/cmake/Qt6XcbQpaPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6Xml/*.cmake +%{_qt6_libdir}/qt6/metatypes/*.json +%{_qt6_libdir}/qt6/objects-RelWithDebInfo/ExampleIconsPrivate_resources_1/.qt/rcc/qrc_example_icons_init.cpp.o +%{_qt6_libdir}/pkgconfig/*.pc + +%if 0%{?egl} +%{_qt6_libdir}/libQt6EglFsKmsSupport.prl +%{_qt6_libdir}/libQt6EglFsKmsSupport.so +%endif +## private-devel globs +%exclude %{_qt6_headerdir}/*/%{qt_version}/ + +%files private-devel +%{_qt6_headerdir}/*/%{qt_version}/ + +%files static +%{_qt6_headerdir}/QtDeviceDiscoverySupport +%{_qt6_libdir}/libQt6DeviceDiscoverySupport.*a +%{_qt6_libdir}/libQt6DeviceDiscoverySupport.prl +%{_qt6_libdir}/libQt6ExampleIcons.a +%{_qt6_libdir}/libQt6ExampleIcons.prl +%{_qt6_headerdir}/QtFbSupport +%{_qt6_libdir}/libQt6FbSupport.*a +%{_qt6_libdir}/libQt6FbSupport.prl +%{_qt6_libdir}/libQt6InputSupport.*a +%{_qt6_libdir}/libQt6InputSupport.prl +%{_qt6_headerdir}/QtKmsSupport +%{_qt6_libdir}/libQt6KmsSupport.*a +%{_qt6_libdir}/libQt6KmsSupport.prl + +%if 0%{?examples} +%files examples +%{_qt6_examplesdir}/ +%endif + +%if 0%{?ibase} +%files ibase +%{_qt6_plugindir}/sqldrivers/libqsqlibase.so +%{_qt6_libdir}/cmake/Qt6Sql/Qt6QIBaseDriverPlugin*.cmake +%endif + +%files mysql +%{_qt6_plugindir}/sqldrivers/libqsqlmysql.so +%{_qt6_libdir}/cmake/Qt6Sql/Qt6QMYSQLDriverPlugin*.cmake + +%files odbc +%{_qt6_plugindir}/sqldrivers/libqsqlodbc.so +%{_qt6_libdir}/cmake/Qt6Sql/Qt6QODBCDriverPlugin*.cmake + +%files postgresql +%{_qt6_plugindir}/sqldrivers/libqsqlpsql.so +%{_qt6_libdir}/cmake/Qt6Sql/Qt6QPSQLDriverPlugin*.cmake + +%ldconfig_scriptlets gui + +%files gui +%dir %{_sysconfdir}/X11/xinit +%dir %{_sysconfdir}/X11/xinit/xinitrc.d/ +%{_sysconfdir}/X11/xinit/xinitrc.d/10-qt6-check-opengl2.sh +%{_qt6_libdir}/libQt6Gui.so.6* +%{_qt6_libdir}/libQt6OpenGL.so.6* +%{_qt6_libdir}/libQt6OpenGLWidgets.so.6* +%{_qt6_libdir}/libQt6PrintSupport.so.6* +%{_qt6_libdir}/libQt6Widgets.so.6* +%{_qt6_libdir}/libQt6XcbQpa.so.6* +# Generic +%{_qt6_plugindir}/generic/libqevdevkeyboardplugin.so +%{_qt6_plugindir}/generic/libqevdevmouseplugin.so +%{_qt6_plugindir}/generic/libqevdevtabletplugin.so +%{_qt6_plugindir}/generic/libqevdevtouchplugin.so +%{_qt6_plugindir}/generic/libqlibinputplugin.so +%if 0%{?fedora} || 0%{?epel} +%{_qt6_plugindir}/generic/libqtslibplugin.so +%endif +%{_qt6_plugindir}/generic/libqtuiotouchplugin.so +# Imageformats +%{_qt6_plugindir}/imageformats/libqico.so +%{_qt6_plugindir}/imageformats/libqjpeg.so +%{_qt6_plugindir}/imageformats/libqgif.so +# Platforminputcontexts +%{_qt6_plugindir}/platforminputcontexts/libcomposeplatforminputcontextplugin.so +%{_qt6_plugindir}/platforminputcontexts/libibusplatforminputcontextplugin.so +# EGL +%if 0%{?egl} +%{_qt6_libdir}/libQt6EglFSDeviceIntegration.so.6* +%{_qt6_libdir}/libQt6EglFsKmsSupport.so.6* +%{_qt6_libdir}/libQt6EglFsKmsGbmSupport.so.6* +%{_qt6_plugindir}/platforms/libqeglfs.so +%{_qt6_plugindir}/platforms/libqminimalegl.so +%dir %{_qt6_plugindir}/egldeviceintegrations/ +%{_qt6_plugindir}/egldeviceintegrations/libqeglfs-kms-integration.so +%{_qt6_plugindir}/egldeviceintegrations/libqeglfs-x11-integration.so +%{_qt6_plugindir}/egldeviceintegrations/libqeglfs-kms-egldevice-integration.so +%{_qt6_plugindir}/egldeviceintegrations/libqeglfs-emu-integration.so +%{_qt6_plugindir}/xcbglintegrations/libqxcb-egl-integration.so +%endif +# Platforms +%{_qt6_plugindir}/platforms/libqlinuxfb.so +%{_qt6_plugindir}/platforms/libqminimal.so +%{_qt6_plugindir}/platforms/libqoffscreen.so +%{_qt6_plugindir}/platforms/libqxcb.so +%{_qt6_plugindir}/platforms/libqvnc.so +%{_qt6_plugindir}/platforms/libqvkkhrdisplay.so +%{_qt6_plugindir}/xcbglintegrations/libqxcb-glx-integration.so +# Platformthemes +%{_qt6_plugindir}/platformthemes/libqxdgdesktopportal.so +%{_qt6_plugindir}/platformthemes/libqgtk3.so +%{_qt6_plugindir}/printsupport/libcupsprintersupport.so + +%if 0%{?build_tests} +%files tests +%{_qt6_archdatadir}/tests +%endif + +%changelog +* Tue Nov 26 2024 MSVSphere Packaging Team - 6.7.1-5 +- Rebuilt for MSVSphere 10 + +* Mon Jul 22 2024 Jan Grulich - 6.7.1-5 +- Use qt6-filesystem + Resolves: RHEL-50035 + +* Mon Jul 08 2024 Jan Grulich - 6.7.1-4 +- HTTP2: Delay any communication until encrypted() can be responded to + Resolves: RHEL-46346 + +* Mon Jun 24 2024 Troy Dawson - 6.7.1-3 +- Bump release for June 2024 mass rebuild + +* Tue Jun 04 2024 Jan Grulich - 6.7.1-2 +- Add rpminspect.yaml and fix some rpminspect issues + Resolves: RHEL-36430 + + +* Fri May 31 2024 Jan Grulich - 6.7.1-1 +- 6.7.1 + Resolves: RHEL-36430 + +* Mon May 13 2024 Jan Grulich - 6.7.0-3 +- QGtk3Theme: Add support for xdg-desktop-portal to get color scheme + Resolves: RHEL-36168 + +* Wed Apr 24 2024 Jan Grulich - 6.7.0-2 +- Use bundled double-conversion in RHEL builds + Resolves: RHEL-32788 + +* Wed Apr 17 2024 Jan Grulich - 6.7.0-1 +- 6.7.0 + + sync with Fedora + Resolves: RHEL-27845 + Resolves: RHEL-32788 + +* Wed Mar 27 2024 Jan Grulich - 6.6.1-6 +- Add -tests subpackage with unit tests that can run in CI + Resolves: RHEL-28239 + +* Wed Jan 31 2024 Pete Walter - 6.6.1-5 +- Rebuild for ICU 74 + +* Fri Jan 26 2024 Fedora Release Engineering - 6.6.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 6.6.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Tue Dec 12 2023 Timothée Ravier - 6.6.1-2 +- Recommend qt6-qttranslations + +* Mon Nov 27 2023 Jan Grulich - 6.6.1-1 +- 6.6.1 + +* Fri Nov 10 2023 Alessandro Astone - 6.6.0-7 +- Add xkbcommon as a devel dependency + +* Thu Nov 09 2023 Jan Grulich - 6.6.0-6 +- Revert: Fix Qt not showing up emoji by handling emoji font family + +* Tue Nov 07 2023 Jan Grulich - 6.6.0-5 +- Fix Qt not showing up emoji by handling emoji font family + +* Mon Nov 06 2023 Jan Grulich - 6.6.0-4 +- Upstream backports + - a11y - fix race condition on atspi startup on Wayland + +* Mon Oct 23 2023 Jan Grulich - 6.6.0-3 +- Do not use tslib on RHEL builds + +* Sun Oct 15 2023 Neal Gompa - 6.6.0-2 +- Add qtwayland weak dep to -gui subpackage and use arched weak deps + +* Tue Oct 10 2023 Jan Grulich - 6.6.0-1 +- 6.6.0 + +* Sun Oct 01 2023 Justin Zobel - 6.5.3-1 +- new version + +* Sun Sep 03 2023 LuK1337 - 6.5.2-5 +- Unbreak CMake Qt6::ExampleIconsPrivate package + +* Mon Aug 28 2023 Yaakov Selkowitz - 6.5.2-4 +- Use bundled libb2 in RHEL builds + +* Fri Aug 11 2023 Jan Grulich - 6.5.2-3 +- Don't use QGnomePlatform by default on F39+ + +* Fri Jul 21 2023 Fedora Release Engineering - 6.5.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Fri Jul 21 2023 Jan Grulich - 6.5.2-1 +- 6.5.2 + +* Wed Jul 12 2023 František Zatloukal - 6.5.1-4 +- Rebuilt for ICU 73.2 + +* Wed Jul 12 2023 Jan Grulich - 6.5.1-3 +- Bump build for private API version change + +* Tue Jul 11 2023 František Zatloukal - 6.5.1-2 +- Rebuilt for ICU 73.2 + +* Mon May 22 2023 Jan Grulich - 6.5.1-1 +- 6.5.1 + +* Fri Apr 7 2023 Marie Loise Nolden - 6.5.0-2 +- fix xcb plugin with new dependency xcb-cursor instead of Xcursor + introduction with qt 6.5, add firebird sql plugin cleanly, clean up spec file + +* Mon Apr 03 2023 Jan Grulich - 6.5.0-1 +- 6.5.0 + +* Mon Apr 03 2023 Jan Grulich - 6.4.3-2 +- Enable zstd support + +* Thu Mar 23 2023 Jan Grulich - 6.4.3-1 +- 6.4.3 + +* Sun Mar 05 2023 Jan grulich - 6.4.2-5 +- Use QGnomePlatform as default platform theme on GNOME + Resolves: bz#2174905 + +* Wed Feb 08 2023 Jan Grulich - 6.4.2-4 +- Fix possible DOS involving the Qt SQL ODBC driver plugin + CVE-2023-24607 + +* Tue Jan 31 2023 Jan Grulich - 6.4.2-3 +- migrated to SPDX license + +* Fri Jan 20 2023 Fedora Release Engineering - 6.4.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Mon Jan 16 2023 Jan Grulich - 6.4.2-1 +- 6.4.2 + +* Mon Jan 02 2023 Jan Grulich - 6.4.1-4 +- Make -devel package to require database plugins + +* Sat Dec 31 2022 Pete Walter - 6.4.1-3 +- Rebuild for ICU 72 + +* Wed Nov 30 2022 Pavel Raiskup - 6.4.1-2 +- rebuild for the new PostgreSQL 15 + +* Wed Nov 23 2022 Jan Grulich - 6.4.1-1 +- 6.4.1 + +* Mon Oct 31 2022 Jan Grulich - 6.4.0-1 +- 6.4.0 + +* Mon Aug 01 2022 Frantisek Zatloukal - 6.3.1-4 +- Rebuilt for ICU 71.1 + +* Fri Jul 29 2022 Jan Grulich - 6.3.1-3 +- Fix moc location in pkgconfig file + Resolves: bz#2112029 + +* Sat Jul 23 2022 Fedora Release Engineering - 6.3.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jul 13 2022 Jan Grulich - 6.3.1-1 +- 6.3.1 + +* Wed Apr 13 2022 Jan Grulich - 6.3.0-1 +- 6.3.0 + +* Fri Feb 25 2022 Jan Grulich - 6.2.3-2 +- Enable s390x builds + +* Mon Jan 31 2022 Jan Grulich - 6.2.3-1 +- 6.2.3 + +* Fri Jan 21 2022 Fedora Release Engineering - 6.2.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Thu Jan 06 2022 Filip Januš - 6.2.2-2 +- Rebuild for Postgresql 14 + +* Tue Dec 14 2021 Jan Grulich - 6.2.2-1 +- 6.2.2 + +* Fri Oct 29 2021 Jan Grulich - 6.2.1-1 +- 6.2.1 + +* Thu Sep 30 2021 Jan Grulich - 6.2.0-1 +- 6.2.0 + +* Mon Sep 27 2021 Jan Grulich - 6.2.0~rc2-1 +- 6.2.0 - rc2 + +* Sat Sep 18 2021 Jan Grulich - 6.2.0~rc-1 +- 6.2.0 - rc + +* Tue Sep 14 2021 Sahana Prasad - 6.2.0~beta4-3 +- Rebuilt with OpenSSL 3.0.0 + +* Mon Sep 13 2021 Jan Grulich - 6.2.0~beta4-2 +- Skip s390x for qtdeclarative issue + +* Fri Sep 10 2021 Jan Grulich - 6.2.0~beta4-1 +- 6.2.0 - beta4 + +* Wed Sep 08 2021 Rex Dieter - 6.2.0~beta3-4 +- rebuild + +* Tue Sep 07 2021 Jan Grulich - 6.2.0~beta3-3 +- Disable rpath + Resolves: bz#1982699 + +* Tue Aug 31 2021 Jan Grulich - 6.2.0~beta3-2 +- Fix file conflict with qt5-qttools +- Rebuild against older libglvnd + +* Mon Aug 30 2021 Jan Grulich - 6.2.0~beta3-1 +- 6.2.0 - beta3 + +* Thu Aug 12 2021 Jan Grulich - 6.1.2-1 +- 6.1.2 + +* Fri Jul 23 2021 Fedora Release Engineering - 6.1.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Mon Jun 07 2021 Jan Grulich - 6.1.1-1 +- 6.1.1 + +* Mon May 24 2021 Jan Grulich - 6.1.0-3 +- Rebuild with correct libexecdir path + +* Thu May 20 2021 Pete Walter - 6.1.0-2 +- Rebuild for ICU 69 + +* Thu May 06 2021 Jan Grulich - 6.1.0-1 +- 6.1.0 + +* Mon Apr 05 2021 Jan Grulich - 6.0.3-1 +- 6.0.3 + +* Thu Feb 04 2021 Jan Grulich - 6.0.1-1 +- 6.0.1 + +* Wed Jan 27 2021 Fedora Release Engineering - 6.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jan 06 2021 Jan Grulich - 6.0.0-1 +- 6.0.0