diff options
author | orbea <orbea@riseup.net> | 2023-07-21 13:46:09 -0700 |
---|---|---|
committer | orbea <orbea@riseup.net> | 2023-07-21 13:46:09 -0700 |
commit | fbbe6f58b487453ab7f68a80e439249e4395bc9c (patch) | |
tree | 985e3304a91d41ae152d689a668451fdb1adc6f1 /dev-qt | |
parent | dev-lang/rust: add 1.71.0 (diff) | |
download | libressl-fbbe6f58b487453ab7f68a80e439249e4395bc9c.tar.gz libressl-fbbe6f58b487453ab7f68a80e439249e4395bc9c.tar.bz2 libressl-fbbe6f58b487453ab7f68a80e439249e4395bc9c.zip |
dev-qt/qtbase: add 6.5.2
Signed-off-by: orbea <orbea@riseup.net>
Diffstat (limited to 'dev-qt')
-rw-r--r-- | dev-qt/qtbase/Manifest | 1 | ||||
-rw-r--r-- | dev-qt/qtbase/files/qtbase-6.5.2-CVE-2023-38197.patch | 404 | ||||
-rw-r--r-- | dev-qt/qtbase/qtbase-6.5.2.ebuild | 196 |
3 files changed, 601 insertions, 0 deletions
diff --git a/dev-qt/qtbase/Manifest b/dev-qt/qtbase/Manifest index 3c5bf4d..f18d34b 100644 --- a/dev-qt/qtbase/Manifest +++ b/dev-qt/qtbase/Manifest @@ -1 +1,2 @@ DIST qtbase-everywhere-src-6.5.1.tar.xz 48287392 BLAKE2B 47872492f21a936d980891c28df61591380bc236adc66b57a90fbb87dd292cdeb3c632fb1159231ba40142d25e02944e4c5e8568153f1286e0a1abc8c5b26699 SHA512 7f7b20bbc25cda65266d6067cdd68e3e077636988d67dbf5783f79a61186135fb3a36d57ac72cfe4501012035b630ab1f5849148e4817726d4f459fa1937e91a +DIST qtbase-everywhere-src-6.5.2.tar.xz 48410716 BLAKE2B 578c69ede6f45a8b21cba0a24674d5d8801722503d13ab9578b06b2446ce15e6a84bcdbd0c5d2c9aa868ec70862f0845406c959ed79b695f82bb398ecf299c63 SHA512 8d97029aae5b73a3e03624c9a8495dbf2fe54a4f5e992071c06f3d93935e64c80f2121b33eeb60a92d96ceb288cb25d74906a5bf47b45bb018d859d4a2d13f20 diff --git a/dev-qt/qtbase/files/qtbase-6.5.2-CVE-2023-38197.patch b/dev-qt/qtbase/files/qtbase-6.5.2-CVE-2023-38197.patch new file mode 100644 index 0000000..220e94d --- /dev/null +++ b/dev-qt/qtbase/files/qtbase-6.5.2-CVE-2023-38197.patch @@ -0,0 +1,404 @@ +Upstream: https://codereview.qt-project.org/c/qt/qtbase/+/490550 +Upstream: https://lists.qt-project.org/pipermail/development/2023-July/044166.html + +From c216c3d9859a20b3aeec985512e89316423fc3a8 Mon Sep 17 00:00:00 2001 +From: Axel Spoerl <axel.spoerl@qt.io> +Date: Fri, 30 Jun 2023 12:43:59 +0200 +Subject: [PATCH] QXmlStreamReader: Raise error on unexpected tokens + +QXmlStreamReader accepted multiple DOCTYPE elements, containing DTD +fragments in the XML prolog, and in the XML body. +Well-formed but invalid XML files - with multiple DTD fragments in +prolog and body, combined with recursive entity expansions - have +caused infinite loops in QXmlStreamReader. + +This patch implements a token check in QXmlStreamReader. +A stream is allowed to start with an XML prolog. StartDocument +and DOCTYPE elements are only allowed in this prolog, which +may also contain ProcessingInstruction and Comment elements. +As soon as anything else is seen, the prolog ends. +After that, the prolog-specific elements are treated as unexpected. +Furthermore, the prolog can contain at most one DOCTYPE element. + +Update the documentation to reflect the new behavior. +Add an autotest that checks the new error cases are correctly detected, +and no error is raised for legitimate input. + +The original OSS-Fuzz files (see bug reports) are not included in this +patch for file size reasons. They have been tested manually. Each of +them has more than one DOCTYPE element, causing infinite loops in +recursive entity expansions. The newly implemented functionality +detects those invalid DTD fragments. By raising an error, it aborts +stream reading before an infinite loop occurs. + +Thanks to OSS-Fuzz for finding this. + +Fixes: QTBUG-92113 +Fixes: QTBUG-95188 +Change-Id: I0a082b9188b2eee50b396c4d5b1c9e1fd237bbdd +Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> +(cherry picked from commit c4301be7d5f94852e1b17f2c2989d5ca807855d4) +--- + src/corelib/serialization/qxmlstream.cpp | 145 +++++++++++++++++++-- + src/corelib/serialization/qxmlstream_p.h | 11 ++ + .../qxmlstream/tokenError/dtdInBody.xml | 20 +++ + .../qxmlstream/tokenError/multipleDtd.xml | 20 +++ + .../qxmlstream/tokenError/wellFormed.xml | 15 +++ + .../serialization/qxmlstream/tst_qxmlstream.cpp | 39 ++++++ + 6 files changed, 242 insertions(+), 8 deletions(-) + create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/dtdInBody.xml + create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/multipleDtd.xml + create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/wellFormed.xml + +diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp +index 6e34d4da6e5a..cf46d690f122 100644 +--- a/src/corelib/serialization/qxmlstream.cpp ++++ b/src/corelib/serialization/qxmlstream.cpp +@@ -185,7 +185,7 @@ WRAP(indexOf, QLatin1StringView) + addData() or by waiting for it to arrive on the device(). + + \value UnexpectedElementError The parser encountered an element +- that was different to those it expected. ++ or token that was different to those it expected. + + */ + +@@ -322,13 +322,34 @@ QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const + + QXmlStreamReader is a well-formed XML 1.0 parser that does \e not + include external parsed entities. As long as no error occurs, the +- application code can thus be assured that the data provided by the +- stream reader satisfies the W3C's criteria for well-formed XML. For +- example, you can be certain that all tags are indeed nested and +- closed properly, that references to internal entities have been +- replaced with the correct replacement text, and that attributes have +- been normalized or added according to the internal subset of the +- DTD. ++ application code can thus be assured, that ++ \list ++ \li the data provided by the stream reader satisfies the W3C's ++ criteria for well-formed XML, ++ \li tokens are provided in a valid order. ++ \endlist ++ ++ Unless QXmlStreamReader raises an error, it guarantees the following: ++ \list ++ \li All tags are nested and closed properly. ++ \li References to internal entities have been replaced with the ++ correct replacement text. ++ \li Attributes have been normalized or added according to the ++ internal subset of the \l DTD. ++ \li Tokens of type \l StartDocument happen before all others, ++ aside from comments and processing instructions. ++ \li At most one DOCTYPE element (a token of type \l DTD) is present. ++ \li If present, the DOCTYPE appears before all other elements, ++ aside from StartDocument, comments and processing instructions. ++ \endlist ++ ++ In particular, once any token of type \l StartElement, \l EndElement, ++ \l Characters, \l EntityReference or \l EndDocument is seen, no ++ tokens of type StartDocument or DTD will be seen. If one is present in ++ the input stream, out of order, an error is raised. ++ ++ \note The token types \l Comment and \l ProcessingInstruction may appear ++ anywhere in the stream. + + If an error occurs while parsing, atEnd() and hasError() return + true, and error() returns the error that occurred. The functions +@@ -659,6 +680,7 @@ QXmlStreamReader::TokenType QXmlStreamReader::readNext() + d->token = -1; + return readNext(); + } ++ d->checkToken(); + return d->type; + } + +@@ -743,6 +765,11 @@ static constexpr auto QXmlStreamReader_tokenTypeString = qOffsetStringArray( + "ProcessingInstruction" + ); + ++static constexpr auto QXmlStreamReader_XmlContextString = qOffsetStringArray( ++ "Prolog", ++ "Body" ++); ++ + /*! + \property QXmlStreamReader::namespaceProcessing + \brief the namespace-processing flag of the stream reader. +@@ -777,6 +804,15 @@ QString QXmlStreamReader::tokenString() const + return QLatin1StringView(QXmlStreamReader_tokenTypeString.at(d->type)); + } + ++/*! ++ \internal ++ \return \param loc (Prolog/Body) as a string. ++ */ ++static constexpr QLatin1StringView contextString(QXmlStreamReaderPrivate::XmlContext ctxt) ++{ ++ return QLatin1StringView(QXmlStreamReader_XmlContextString.at(static_cast<int>(ctxt))); ++} ++ + #endif // QT_NO_XMLSTREAMREADER + + QXmlStreamPrivateTagStack::QXmlStreamPrivateTagStack() +@@ -864,6 +900,8 @@ void QXmlStreamReaderPrivate::init() + + type = QXmlStreamReader::NoToken; + error = QXmlStreamReader::NoError; ++ currentContext = XmlContext::Prolog; ++ foundDTD = false; + } + + /* +@@ -3838,6 +3876,97 @@ void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader) + } + } + ++static constexpr bool isTokenAllowedInContext(QXmlStreamReader::TokenType type, ++ QXmlStreamReaderPrivate::XmlContext loc) ++{ ++ switch (type) { ++ case QXmlStreamReader::StartDocument: ++ case QXmlStreamReader::DTD: ++ return loc == QXmlStreamReaderPrivate::XmlContext::Prolog; ++ ++ case QXmlStreamReader::StartElement: ++ case QXmlStreamReader::EndElement: ++ case QXmlStreamReader::Characters: ++ case QXmlStreamReader::EntityReference: ++ case QXmlStreamReader::EndDocument: ++ return loc == QXmlStreamReaderPrivate::XmlContext::Body; ++ ++ case QXmlStreamReader::Comment: ++ case QXmlStreamReader::ProcessingInstruction: ++ return true; ++ ++ case QXmlStreamReader::NoToken: ++ case QXmlStreamReader::Invalid: ++ return false; ++ } ++ ++ // GCC 8.x does not treat __builtin_unreachable() as constexpr ++#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900) ++ Q_UNREACHABLE_RETURN(false); ++#else ++ return false; ++#endif ++} ++ ++/*! ++ \internal ++ \brief QXmlStreamReader::isValidToken ++ \return \c true if \param type is a valid token type. ++ \return \c false if \param type is an unexpected token, ++ which indicates a non-well-formed or invalid XML stream. ++ */ ++bool QXmlStreamReaderPrivate::isValidToken(QXmlStreamReader::TokenType type) ++{ ++ // Don't change currentContext, if Invalid or NoToken occur in the prolog ++ if (type == QXmlStreamReader::Invalid || type == QXmlStreamReader::NoToken) ++ return false; ++ ++ // If a token type gets rejected in the body, there is no recovery ++ const bool result = isTokenAllowedInContext(type, currentContext); ++ if (result || currentContext == XmlContext::Body) ++ return result; ++ ++ // First non-Prolog token observed => switch context to body and check again. ++ currentContext = XmlContext::Body; ++ return isTokenAllowedInContext(type, currentContext); ++} ++ ++/*! ++ \internal ++ Checks token type and raises an error, if it is invalid ++ in the current context (prolog/body). ++ */ ++void QXmlStreamReaderPrivate::checkToken() ++{ ++ Q_Q(QXmlStreamReader); ++ ++ // The token type must be consumed, to keep track if the body has been reached. ++ const XmlContext context = currentContext; ++ const bool ok = isValidToken(type); ++ ++ // Do nothing if an error has been raised already (going along with an unexpected token) ++ if (error != QXmlStreamReader::Error::NoError) ++ return; ++ ++ if (!ok) { ++ raiseError(QXmlStreamReader::UnexpectedElementError, ++ QObject::tr("Unexpected token type %1 in %2.") ++ .arg(q->tokenString(), contextString(context))); ++ return; ++ } ++ ++ if (type != QXmlStreamReader::DTD) ++ return; ++ ++ // Raise error on multiple DTD tokens ++ if (foundDTD) { ++ raiseError(QXmlStreamReader::UnexpectedElementError, ++ QObject::tr("Found second DTD token in %1.").arg(contextString(context))); ++ } else { ++ foundDTD = true; ++ } ++} ++ + /*! + \fn bool QXmlStreamAttributes::hasAttribute(QAnyStringView qualifiedName) const + +diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h +index 070424a9f523..f09adaa37e66 100644 +--- a/src/corelib/serialization/qxmlstream_p.h ++++ b/src/corelib/serialization/qxmlstream_p.h +@@ -297,6 +297,17 @@ public: + QStringDecoder decoder; + bool atEnd; + ++ enum class XmlContext ++ { ++ Prolog, ++ Body, ++ }; ++ ++ XmlContext currentContext = XmlContext::Prolog; ++ bool foundDTD = false; ++ bool isValidToken(QXmlStreamReader::TokenType type); ++ void checkToken(); ++ + /*! + \sa setType() + */ +diff --git a/tests/auto/corelib/serialization/qxmlstream/tokenError/dtdInBody.xml b/tests/auto/corelib/serialization/qxmlstream/tokenError/dtdInBody.xml +new file mode 100644 +index 000000000000..1c3ca4e2711f +--- /dev/null ++++ b/tests/auto/corelib/serialization/qxmlstream/tokenError/dtdInBody.xml +@@ -0,0 +1,20 @@ ++<!DOCTYPE TEST [ ++ <!ELEMENT TESTATTRIBUTE (CASE+)> ++ <!ELEMENT CASE (CLASS, FUNCTION)> ++ <!ELEMENT CLASS (#PCDATA)> ++ ++ <!-- adding random ENTITY statement, as this is typical DTD content --> ++ <!ENTITY unite "∪"> ++ ++ <!ATTLIST CASE CLASS CDATA #REQUIRED> ++]> ++<TEST> ++ <CASE> ++ <CLASS>tst_QXmlStream</CLASS> ++ </CASE> ++ <!-- invalid DTD in XML body follows --> ++ <!DOCTYPE DTDTEST [ ++ <!ELEMENT RESULT (CASE+)> ++ <!ATTLIST RESULT OUTPUT CDATA #REQUIRED> ++ ]> ++</TEST> +diff --git a/tests/auto/corelib/serialization/qxmlstream/tokenError/multipleDtd.xml b/tests/auto/corelib/serialization/qxmlstream/tokenError/multipleDtd.xml +new file mode 100644 +index 000000000000..cd398c0f9fde +--- /dev/null ++++ b/tests/auto/corelib/serialization/qxmlstream/tokenError/multipleDtd.xml +@@ -0,0 +1,20 @@ ++<!DOCTYPE TEST [ ++ <!ELEMENT TESTATTRIBUTE (CASE+)> ++ <!ELEMENT CASE (CLASS, FUNCTION, DATASET, COMMENTS)> ++ <!ELEMENT CLASS (#PCDATA)> ++ ++ <!-- adding random ENTITY statements, as this is typical DTD content --> ++ <!ENTITY iff "⇔"> ++ ++ <!ATTLIST CASE CLASS CDATA #REQUIRED> ++]> ++<!-- invalid second DTD follows --> ++<!DOCTYPE SECOND [ ++ <!ELEMENT SECONDATTRIBUTE (#PCDATA)> ++ <!ENTITY on "∘"> ++]> ++<TEST> ++ <CASE> ++ <CLASS>tst_QXmlStream</CLASS> ++ </CASE> ++</TEST> +diff --git a/tests/auto/corelib/serialization/qxmlstream/tokenError/wellFormed.xml b/tests/auto/corelib/serialization/qxmlstream/tokenError/wellFormed.xml +new file mode 100644 +index 000000000000..1b61a3f06225 +--- /dev/null ++++ b/tests/auto/corelib/serialization/qxmlstream/tokenError/wellFormed.xml +@@ -0,0 +1,15 @@ ++<!DOCTYPE TEST [ ++ <!ELEMENT TESTATTRIBUTE (CASE+)> ++ <!ELEMENT CASE (CLASS, FUNCTION, DATASET, COMMENTS)> ++ <!ELEMENT CLASS (#PCDATA)> ++ ++ <!-- adding random ENTITY statements, as this is typical DTD content --> ++ <!ENTITY unite "∪"> ++ ++ <!ATTLIST CASE CLASS CDATA #REQUIRED> ++]> ++<TEST> ++ <CASE> ++ <CLASS>tst_QXmlStream</CLASS> ++ </CASE> ++</TEST> +diff --git a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp +index 2a340e11bff5..30f54999e7c8 100644 +--- a/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp ++++ b/tests/auto/corelib/serialization/qxmlstream/tst_qxmlstream.cpp +@@ -590,6 +590,9 @@ private slots: + + void entityExpansionLimit() const; + ++ void tokenErrorHandling_data() const; ++ void tokenErrorHandling() const; ++ + private: + static QByteArray readFile(const QString &filename); + +@@ -1855,5 +1858,41 @@ void tst_QXmlStream::test_fastScanName() const + QCOMPARE(reader.error(), errorType); + } + ++void tst_QXmlStream::tokenErrorHandling_data() const ++{ ++ QTest::addColumn<QString>("fileName"); ++ QTest::addColumn<QXmlStreamReader::Error>("expectedError"); ++ QTest::addColumn<QString>("errorKeyWord"); ++ ++ constexpr auto invalid = QXmlStreamReader::Error::UnexpectedElementError; ++ constexpr auto valid = QXmlStreamReader::Error::NoError; ++ QTest::newRow("DtdInBody") << "dtdInBody.xml" << invalid << "DTD"; ++ QTest::newRow("multipleDTD") << "multipleDtd.xml" << invalid << "second DTD"; ++ QTest::newRow("wellFormed") << "wellFormed.xml" << valid << ""; ++} ++ ++void tst_QXmlStream::tokenErrorHandling() const ++{ ++ QFETCH(const QString, fileName); ++ QFETCH(const QXmlStreamReader::Error, expectedError); ++ QFETCH(const QString, errorKeyWord); ++ ++ const QDir dir(QFINDTESTDATA("tokenError")); ++ QFile file(dir.absoluteFilePath(fileName)); ++ ++ // Cross-compiling: File will be on host only ++ if (!file.exists()) ++ QSKIP("Testfile not found."); ++ ++ file.open(QIODevice::ReadOnly); ++ QXmlStreamReader reader(&file); ++ while (!reader.atEnd()) ++ reader.readNext(); ++ ++ QCOMPARE(reader.error(), expectedError); ++ if (expectedError != QXmlStreamReader::Error::NoError) ++ QVERIFY(reader.errorString().contains(errorKeyWord)); ++} ++ + #include "tst_qxmlstream.moc" + // vim: et:ts=4:sw=4:sts=4 +-- +2.16.3 + diff --git a/dev-qt/qtbase/qtbase-6.5.2.ebuild b/dev-qt/qtbase/qtbase-6.5.2.ebuild new file mode 100644 index 0000000..6ce1c77 --- /dev/null +++ b/dev-qt/qtbase/qtbase-6.5.2.ebuild @@ -0,0 +1,196 @@ +# Copyright 2021-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit qt6-build + +DESCRIPTION="Cross-platform application development framework" + +if [[ ${QT6_BUILD_TYPE} == release ]]; then + KEYWORDS="~amd64" +fi + +# Qt Modules +IUSE="+concurrent +dbus +gui +network +sql opengl +widgets +xml zstd" +REQUIRED_USE=" + opengl? ( gui ) + widgets? ( gui ) + X? ( || ( evdev libinput ) ) +" + +QTGUI_IUSE="accessibility egl eglfs evdev gles2-only +jpeg +libinput tslib tuio vulkan +X" +QTNETWORK_IUSE="brotli gssapi libproxy sctp +ssl vnc" +QTSQL_IUSE="freetds mysql oci8 odbc postgres +sqlite" +IUSE+=" ${QTGUI_IUSE} ${QTNETWORK_IUSE} ${QTSQL_IUSE} cups gtk icu systemd +udev wayland" +# QtPrintSupport = QtGui + QtWidgets enabled. +# ibus = xkbcommon + dbus, and xkbcommon needs either libinput or X +REQUIRED_USE+=" + $(printf '%s? ( gui ) ' ${QTGUI_IUSE//+/}) + $(printf '%s? ( network ) ' ${QTNETWORK_IUSE//+/}) + $(printf '%s? ( sql ) ' ${QTSQL_IUSE//+/}) + accessibility? ( dbus X ) + cups? ( gui widgets ) + eglfs? ( egl ) + gtk? ( widgets ) + gui? ( || ( eglfs X ) || ( libinput X ) ) + libinput? ( udev ) + sql? ( || ( freetds mysql oci8 odbc postgres sqlite ) ) + vnc? ( gui ) + X? ( gles2-only? ( egl ) ) +" + +# TODO: +# qtimageformats: mng not done yet, qtimageformats.git upstream commit 9443239c +# qtnetwork: connman, networkmanager +DEPEND=" + app-crypt/libb2 + dev-libs/double-conversion:= + dev-libs/glib:2 + dev-libs/libpcre2:=[pcre16,unicode] + dev-util/gtk-update-icon-cache + media-libs/fontconfig + >=media-libs/freetype-2.6.1:2 + >=media-libs/harfbuzz-1.6.0:= + media-libs/tiff:= + >=sys-apps/dbus-1.4.20 + sys-libs/zlib:= + brotli? ( app-arch/brotli:= ) + evdev? ( sys-libs/mtdev ) + freetds? ( dev-db/freetds ) + gles2-only? ( media-libs/libglvnd ) + !gles2-only? ( media-libs/libglvnd[X] ) + gssapi? ( virtual/krb5 ) + gtk? ( + x11-libs/gtk+:3 + x11-libs/libX11 + x11-libs/pango + ) + gui? ( media-libs/libpng:= ) + icu? ( dev-libs/icu:= ) + !icu? ( virtual/libiconv ) + jpeg? ( media-libs/libjpeg-turbo:= ) + libinput? ( + dev-libs/libinput:= + >=x11-libs/libxkbcommon-0.5.0 + ) + libproxy? ( net-libs/libproxy ) + mysql? ( dev-db/mysql-connector-c:= ) + oci8? ( dev-db/oracle-instantclient:=[sdk] ) + odbc? ( dev-db/unixODBC ) + postgres? ( dev-db/postgresql:* ) + sctp? ( kernel_linux? ( net-misc/lksctp-tools ) ) + sqlite? ( dev-db/sqlite:3 ) + ssl? ( dev-libs/openssl:= ) + systemd? ( sys-apps/systemd:= ) + tslib? ( >=x11-libs/tslib-1.21 ) + udev? ( virtual/libudev:= ) + vulkan? ( dev-util/vulkan-headers ) + X? ( + x11-libs/libdrm + x11-libs/libICE + x11-libs/libSM + x11-libs/libX11 + >=x11-libs/libxcb-1.12:= + >=x11-libs/libxkbcommon-0.5.0[X] + x11-libs/xcb-util-cursor + x11-libs/xcb-util-image + x11-libs/xcb-util-keysyms + x11-libs/xcb-util-renderutil + x11-libs/xcb-util-wm + ) + zstd? ( app-arch/zstd:= ) +" +RDEPEND="${DEPEND}" +PDEPEND="wayland? ( =dev-qt/qtwayland-${PV}* )" + +PATCHES=( + "${FILESDIR}/${PN}-6.5.0-libressl.patch" + "${FILESDIR}/${PN}-6.5.2-CVE-2023-38197.patch" +) + +src_configure() { + local mycmakeargs=( + -DINSTALL_ARCHDATADIR=${QT6_ARCHDATADIR} + -DINSTALL_BINDIR=${QT6_BINDIR} + -DINSTALL_DATADIR=${QT6_DATADIR} + -DINSTALL_DOCDIR=${QT6_DOCDIR} + -DINSTALL_EXAMPLESDIR=${QT6_EXAMPLESDIR} + -DINSTALL_INCLUDEDIR=${QT6_HEADERDIR} + -DINSTALL_LIBDIR=${QT6_LIBDIR} + -DINSTALL_LIBEXECDIR=${QT6_LIBEXECDIR} + -DINSTALL_MKSPECSDIR=${QT6_ARCHDATADIR}/mkspecs + -DINSTALL_PLUGINSDIR=${QT6_PLUGINDIR} + -DINSTALL_QMLDIR=${QT6_QMLDIR} + -DINSTALL_SYSCONFDIR=${QT6_SYSCONFDIR} + -DINSTALL_TRANSLATIONSDIR=${QT6_TRANSLATIONDIR} + -DQT_FEATURE_androiddeployqt=OFF + $(qt_feature concurrent) + $(qt_feature dbus) + $(qt_feature gui) + $(qt_feature gui testlib) + $(qt_feature icu) + $(qt_feature network) + $(qt_feature sql) + $(qt_feature systemd journald) + $(qt_feature udev libudev) + $(qt_feature xml) + $(qt_feature zstd) + ) + use gui && mycmakeargs+=( + $(qt_feature accessibility accessibility_atspi_bridge) + $(qt_feature egl) + $(qt_feature egl xcb_egl_plugin) + $(qt_feature eglfs eglfs_egldevice) + $(qt_feature eglfs eglfs_gbm) + $(qt_feature evdev) + $(qt_feature evdev mtdev) + -DQT_FEATURE_gif=ON + $(qt_feature jpeg) + $(qt_feature opengl) + $(qt_feature gles2-only opengles2) + $(qt_feature libinput) + $(qt_feature tslib) + $(qt_feature tuio tuiotouch) + $(qt_feature vulkan) + $(qt_feature widgets) + $(qt_feature X xcb) + $(qt_feature X xcb_xlib) + ) + use widgets && mycmakeargs+=( + $(qt_feature cups) + $(qt_feature gtk gtk3) + ) + if use libinput || use X; then + mycmakeargs+=( -DQT_FEATURE_xkbcommon=ON ) + fi + use network && mycmakeargs+=( + $(qt_feature brotli) + $(qt_feature gssapi) + $(qt_feature libproxy) + $(qt_feature sctp) + $(qt_feature vnc) + + # Required for LibreSSL + -DQT_FEATURE_dtls=OFF + $(qt_feature ssl openssl_linked) + ) + use sql && mycmakeargs+=( + $(qt_feature freetds sql_tds) + $(qt_feature mysql sql_mysql) + $(qt_feature oci8 sql_oci) + $(qt_feature odbc sql_odbc) + $(qt_feature postgres sql_psql) + $(qt_feature sqlite sql_sqlite) + $(qt_feature sqlite system_sqlite) + ) + + qt6-build_src_configure +} + +src_install() { + qt6-build_src_install + + # https://bugs.gentoo.org/863395 + qt6_symlink_binary_to_path qmake 6 +} |