commit edc3a7181cc275c02476f11f2605cddaf8b4b080 Author: MSVSphere Packaging Team Date: Tue Nov 26 19:05:35 2024 +0300 import qt6-qtdeclarative-6.7.1-6.el10 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..783cce7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/qtdeclarative-everywhere-src-6.7.1.tar.xz diff --git a/.qt6-qtdeclarative.metadata b/.qt6-qtdeclarative.metadata new file mode 100644 index 0000000..a72b08e --- /dev/null +++ b/.qt6-qtdeclarative.metadata @@ -0,0 +1 @@ +495ab434a05a657658718b70397ec5b7df356877 SOURCES/qtdeclarative-everywhere-src-6.7.1.tar.xz diff --git a/SOURCES/qtdeclarative-avoid-asserts-during-dom-construction.patch b/SOURCES/qtdeclarative-avoid-asserts-during-dom-construction.patch new file mode 100644 index 0000000..8cc611f --- /dev/null +++ b/SOURCES/qtdeclarative-avoid-asserts-during-dom-construction.patch @@ -0,0 +1,352 @@ +From 3ed063d2ff6b418e8487bea0d839fd2f768c91b6 Mon Sep 17 00:00:00 2001 +From: Sami Shalayel +Date: Thu, 21 Mar 2024 14:43:19 +0100 +Subject: [PATCH] dom: avoid asserts during dom construction + +Add missing safeguards to avoid crashing when constructing the Dom, also +add some tests. + +Fixes: QTBUG-123871 +Change-Id: Ie5da7c3b7bbf61d49d755ec6c338e2011532e89b +(cherry picked from commit 4c4605be79e564921699a065df58333d3ee10d59) +Reviewed-by: Fabian Kosmale +--- + +diff --git a/src/qmldom/qqmldomastcreator.cpp b/src/qmldom/qqmldomastcreator.cpp +index 1f5db5a..d8e7590 100644 +--- a/src/qmldom/qqmldomastcreator.cpp ++++ b/src/qmldom/qqmldomastcreator.cpp +@@ -495,8 +495,10 @@ + { + if (auto &lastEl = currentNode(); lastEl.kind == DomType::Binding) { + Binding &b = std::get(lastEl.value); +- if (m_enableScriptExpressions && scriptNodeStack.size() != 1) ++ if (m_enableScriptExpressions ++ && (scriptNodeStack.size() != 1 || scriptNodeStack.last().isList())) { + Q_SCRIPTELEMENT_DISABLE(); ++ } + if (m_enableScriptExpressions) { + b.scriptExpressionValue()->setScriptElement(finalizeScriptExpression( + currentScriptNodeEl().takeVariant(), Path().field(Fields::scriptElement), +@@ -1077,7 +1079,7 @@ + if (!m_enableScriptExpressions) + return false; + +- if (scriptNodeStack.empty()) { ++ if (scriptNodeStack.empty() || scriptNodeStack.last().isList()) { + Q_SCRIPTELEMENT_DISABLE(); + return false; + } +@@ -1106,7 +1108,7 @@ + for (auto it = list; it; it = it->next) { + if (it->elision) { + Node::accept(it->elision, this); +- if (scriptNodeStack.empty()) { ++ if (scriptNodeStack.empty() || !scriptNodeStack.last().isList()) { + Q_SCRIPTELEMENT_DISABLE(); + return false; + } +@@ -1115,7 +1117,7 @@ + } + if (it->element) { + Node::accept(it->element, this); +- if (scriptNodeStack.empty()) { ++ if (scriptNodeStack.empty() || scriptNodeStack.last().isList()) { + Q_SCRIPTELEMENT_DISABLE(); + return false; + } +@@ -1142,7 +1144,7 @@ + Node::accept(it->property, this); + if (!m_enableScriptExpressions) + return false; +- if (scriptNodeStack.empty()) { ++ if (scriptNodeStack.empty() || scriptNodeStack.last().isList()) { + Q_SCRIPTELEMENT_DISABLE(); + return false; + } +@@ -1346,7 +1348,7 @@ + auto current = makeScriptList(list); + + for (auto it = list; it; it = it->next) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current.append(scriptNodeStack.takeLast().takeVariant()); + } + +@@ -1364,15 +1366,15 @@ + + void QQmlDomAstCreator::endVisit(AST::BinaryExpression *exp) + { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.size() < 2); +- + if (!m_enableScriptExpressions) + return; + + auto current = makeScriptElement(exp); + current->addLocation(OperatorTokenRegion, exp->operatorToken); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setRight(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setLeft(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + +@@ -1426,19 +1428,19 @@ + current->addLocation(FileLocationRegion::RightParenthesisRegion, forStatement->rparenToken); + + if (forStatement->statement) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setBody(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode(std::nullopt); + } + + if (forStatement->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setExpression(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode(std::nullopt); + } + + if (forStatement->condition) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setCondition(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode(std::nullopt); + } +@@ -1458,7 +1460,7 @@ + } + + if (forStatement->initialiser) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setInitializer(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode(std::nullopt); + } +@@ -1590,7 +1592,7 @@ + Node::accept(it->declaration, this); + if (!m_enableScriptExpressions) + return false; +- if (scriptNodeStack.empty()) { ++ if (scriptNodeStack.empty() || scriptNodeStack.last().isList()) { + Q_SCRIPTELEMENT_DISABLE(); + return false; + } +@@ -1697,18 +1699,18 @@ + current->addLocation(ElseKeywordRegion, ifStatement->elseToken); + + if (ifStatement->ko) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setAlternative(scriptNodeStack.last().takeVariant()); + scriptNodeStack.removeLast(); + } + + if (ifStatement->ok) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setConsequence(scriptNodeStack.last().takeVariant()); + scriptNodeStack.removeLast(); + } + if (ifStatement->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setCondition(scriptNodeStack.last().takeVariant()); + scriptNodeStack.removeLast(); + } +@@ -1733,7 +1735,7 @@ + current->addLocation(ReturnKeywordRegion, returnStatement->returnToken); + + if (returnStatement->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setExpression(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -1759,7 +1761,7 @@ + current->addLocation(FileLocationRegion::OperatorTokenRegion, expression->dotToken); + + if (expression->base) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setLeft(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -1790,7 +1792,7 @@ + current->addLocation(FileLocationRegion::OperatorTokenRegion, expression->lbracketToken); + + if (expression->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + // if scriptNodeStack.last() is fieldmember expression, add expression to it instead of + // creating new one + current->setRight(currentScriptNodeEl().takeVariant()); +@@ -1798,7 +1800,7 @@ + } + + if (expression->base) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->setLeft(currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -1834,7 +1836,7 @@ + } + + if (exp->base) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::callee, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -1924,7 +1926,7 @@ + return; + + if (exp->name) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::name, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2038,7 +2040,7 @@ + } + + if (exp->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::expression, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2062,7 +2064,7 @@ + auto current = makeScriptList(list); + + for (auto it = list; it; it = it->next) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current.append(scriptNodeStack.takeLast().takeVariant()); + } + +@@ -2094,7 +2096,7 @@ + } + + if (exp->defaultClause) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::defaultClause, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2125,12 +2127,12 @@ + current->addLocation(FileLocationRegion::RightParenthesisRegion, exp->rparenToken); + + if (exp->block) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::caseBlock, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } + if (exp->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::expression, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2157,13 +2159,13 @@ + current->addLocation(FileLocationRegion::RightParenthesisRegion, exp->rparenToken); + + if (exp->statement) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::body, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } + + if (exp->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::expression, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2191,13 +2193,13 @@ + current->addLocation(FileLocationRegion::RightParenthesisRegion, exp->rparenToken); + + if (exp->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::expression, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } + + if (exp->statement) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::body, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +@@ -2224,18 +2226,18 @@ + current->addLocation(FileLocationRegion::RightParenthesisRegion, exp->rparenToken); + + if (exp->statement) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::body, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } + if (exp->expression) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::expression, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } + + if (exp->lhs) { +- Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty()); ++ Q_SCRIPTELEMENT_EXIT_IF(scriptNodeStack.isEmpty() || scriptNodeStack.last().isList()); + current->insertChild(Fields::bindingElement, currentScriptNodeEl().takeVariant()); + removeCurrentScriptNode({}); + } +diff --git a/tests/auto/qmldom/domdata/domitem/crashes/lambda.qml b/tests/auto/qmldom/domdata/domitem/crashes/lambda.qml +new file mode 100644 +index 0000000..85f696f +--- /dev/null ++++ b/tests/auto/qmldom/domdata/domitem/crashes/lambda.qml +@@ -0,0 +1,7 @@ ++import QtQuick.Controls ++ ++Action { ++ onTriggered: foo(Bla.Bar, function() { ++ console.log("Hello") ++ }) ++} +diff --git a/tests/auto/qmldom/domdata/domitem/crashes/templateStrings.qml b/tests/auto/qmldom/domdata/domitem/crashes/templateStrings.qml +new file mode 100644 +index 0000000..feb5646 +--- /dev/null ++++ b/tests/auto/qmldom/domdata/domitem/crashes/templateStrings.qml +@@ -0,0 +1,10 @@ ++import QtQuick ++ ++ ++Item { ++ property string verbatim1: 'A "verbatim" string!' ++ property string verbatim2: "A 'verbatim' string\u2757" ++ property string verbatim3: `400 + 300 is ${400 + 300}. ++ ++mutliline` ++} +diff --git a/tests/auto/qmldom/domitem/tst_qmldomitem.h b/tests/auto/qmldom/domitem/tst_qmldomitem.h +index 184dc8e..3673871 100644 +--- a/tests/auto/qmldom/domitem/tst_qmldomitem.h ++++ b/tests/auto/qmldom/domitem/tst_qmldomitem.h +@@ -2813,6 +2813,12 @@ + + QTest::addRow("inactiveVisitorMarkerCrash") + << baseDir + u"/inactiveVisitorMarkerCrash.qml"_s; ++ ++ QTest::addRow("templateStrings") ++ << baseDir + u"/crashes/templateStrings.qml"_s; ++ ++ QTest::addRow("lambda") ++ << baseDir + u"/crashes/lambda.qml"_s; + } + void crashes() + { diff --git a/SOURCES/qv4global_p-multilib.h b/SOURCES/qv4global_p-multilib.h new file mode 100644 index 0000000..09d61d6 --- /dev/null +++ b/SOURCES/qv4global_p-multilib.h @@ -0,0 +1,23 @@ +/* qvglobal_p.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 MULTILIB_QV4GLOBAL_H +#define MULTILIB_QV4GLOBAL_H + +#ifndef __WORDSIZE +#include +#endif + +#if __WORDSIZE == 32 +#include +#elif __WORDSIZE == 64 +#include +#else +#error "unexpected value for __WORDSIZE macro" +#endif + +#endif + diff --git a/SPECS/qt6-qtdeclarative.spec b/SPECS/qt6-qtdeclarative.spec new file mode 100644 index 0000000..dfb4133 --- /dev/null +++ b/SPECS/qt6-qtdeclarative.spec @@ -0,0 +1,548 @@ + +%global qt_module qtdeclarative + +%define _lto_cflags %{nil} + +# definition borrowed from qtbase +%global multilib_archs x86_64 %{ix86} %{?mips} ppc64 ppc s390x s390 sparc64 sparcv9 + +#global unstable 1 +%if 0%{?unstable} +%global prerelease rc2 +%endif + +%global examples 1 +%global build_tests 1 + +Summary: Qt6 - QtDeclarative component +Name: qt6-%{qt_module} +Version: 6.7.1 +Release: 6%{?dist} + +License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +Url: http://www.qt.io +%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 + +# header file to workaround multilib issue +# https://bugzilla.redhat.com/show_bug.cgi?id=1441343 +Source5: qv4global_p-multilib.h + +## upstream patches +# https://codereview.qt-project.org/c/qt/qtdeclarative/+/550241 +Patch0: qtdeclarative-avoid-asserts-during-dom-construction.patch + +## upstreamable patches + +# filter qml provides +%global __provides_exclude_from ^%{_qt6_archdatadir}/qml/.*\\.so$ + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: ninja-build +BuildRequires: qt6-rpm-macros +BuildRequires: qt6-qtbase-devel >= %{version} +BuildRequires: qt6-qtbase-private-devel +BuildRequires: qt6-qtlanguageserver-devel >= %{version} +BuildRequires: qt6-qtshadertools-devel >= %{version} +%{?_qt6:Requires: %{_qt6}%{?_isa} = %{_qt6_version}} +BuildRequires: python%{python3_pkgversion} +BuildRequires: pkgconfig(xkbcommon) >= 0.4.1 + +%if 0%{?tests} +BuildRequires: dbus-x11 +BuildRequires: mesa-dri-drivers +BuildRequires: time +BuildRequires: xorg-x11-server-Xvfb +%endif + +Obsoletes: qt6-qtquickcontrols2 < 6.2.0~beta3-1 +Provides: qt6-qtquickcontrols2 = %{version}-%{release} + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Provides: %{name}-private-devel = %{version}-%{release} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: qt6-qtbase-devel%{?_isa} +Obsoletes: qt6-qtquickcontrols2-devel < 6.2.0~beta3-1 +Provides: qt6-qtquickcontrols2-devel = %{version}-%{release} +%description devel +%{summary}. + +%package static +Summary: Static library files for %{name} +Requires: %{name}-devel%{?_isa} = %{version}-%{release} +%description static +%{summary}. + +%if 0%{?examples} +%package examples +Summary: Programming examples for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Obsoletes: qt6-qtquickcontrols2-examples < 6.2.0~beta3-1 +Provides: qt6-qtquickcontrols2-examples = %{version}-%{release} +# BuildRequires: qt6-qtdeclarative-devel >= %{version} +%description examples +%{summary}. +%endif + +%if 0%{?build_tests} +%package tests +Summary: Unit tests for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description tests +%{summary}. +%endif + +%prep +%autosetup -n %{qt_module}-everywhere-src-%{qt_version}%{?unstable:-%{prerelease}} -p1 + + +%build +# HACK so calls to "python" get what we want +ln -s %{__python3} python +export PATH=`pwd`:$PATH + +%cmake_qt6 \ + -DQT_BUILD_EXAMPLES:BOOL=%{?examples:ON}%{!?examples:OFF} \ + -DQT_BUILD_TESTS=%{?build_tests:ON}%{!?build_tests:OFF} \ + -DQT_INSTALL_EXAMPLES_SOURCES=%{?examples:ON}%{!?examples:OFF} + +# FIXME: tests/auto/qml/qmltc doesn't build +sed -i 's|add_subdirectory(qmltc)||' tests/auto/qml/CMakeLists.txt + +%if 0%{?build_tests} +%qt6_fix_tests +%endif + +%cmake_build + + +%install +%if 0%{?build_tests} +%qt6_dont_autoinstall_tests +%endif + +%cmake_install + +%if 0%{?build_tests} +%qt6_install_tests +%endif + +%ifarch %{multilib_archs} +# multilib: qv4global_p.h + mv %{buildroot}%{_qt6_headerdir}/QtQml/%{qt_version}/QtQml/private/qv4global_p.h \ + %{buildroot}%{_qt6_headerdir}/QtQml/%{qt_version}/QtQml/private/qv4global_p-%{__isa_bits}.h + install -p -m644 -D %{SOURCE5} %{buildroot}%{_qt6_headerdir}/QtQml/%{qt_version}/QtQml/private/qv4global_p.h +%endif + +# hardlink files to %{_bindir}, add -qt6 postfix to not conflict +mkdir %{buildroot}%{_bindir} +pushd %{buildroot}%{_qt6_bindir} +for i in * ; do + case "${i}" in + qmlcachegen|qmlleasing|qmlformat|qmleasing|qmlimportscanner|qmllint| \ + qmlpreview|qmlscene|qmltestrunner|qmltyperegistrar|qmlplugindump| \ + qmlprofiler|qml|qmlbundle|qmlmin|qmltime) + ln -v ${i} %{buildroot}%{_bindir}/${i}-qt6 + ;; + *) + ln -v ${i} %{buildroot}%{_bindir}/${i} + ;; + esac +done +popd + +## .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} + rm -fv "$(basename ${prl_file} .prl).la" + sed -i -e "/^QMAKE_PRL_LIBS/d" ${prl_file} +done +popd + + +%check +%if 0%{?tests} +export CTEST_OUTPUT_ON_FAILURE=1 +export PATH=%{buildroot}%{_qt6_bindir}:$PATH +export LD_LIBRARY_PATH=%{buildroot}%{_qt6_libdir} +make sub-tests-all %{?_smp_mflags} +xvfb-run -a \ +dbus-launch --exit-with-session \ +time \ +make check -k -C tests ||: +%endif + +%ldconfig_scriptlets + +%files +%license LICENSES/LGPL* +%{_qt6_libdir}/libQt6LabsAnimation.so.6* +%{_qt6_libdir}/libQt6LabsFolderListModel.so.6* +%{_qt6_libdir}/libQt6LabsQmlModels.so.6* +%{_qt6_libdir}/libQt6LabsSettings.so.6* +%{_qt6_libdir}/libQt6LabsSharedImage.so.6* +%{_qt6_libdir}/libQt6LabsWavefrontMesh.so.6* +%{_qt6_libdir}/libQt6QmlLocalStorage.so.6* +%{_qt6_libdir}/libQt6QmlNetwork.so.6* +%{_qt6_libdir}/libQt6Qml.so.6* +%{_qt6_libdir}/libQt6QmlCompiler.so.* +%{_qt6_libdir}/libQt6QmlCore.so.6* +%{_qt6_libdir}/libQt6QmlModels.so.6* +%{_qt6_libdir}/libQt6QmlWorkerScript.so.6* +%{_qt6_libdir}/libQt6Quick*.so.6* +%{_qt6_libdir}/libQt6QuickControls2.so.6* +%{_qt6_libdir}/libQt6QuickControls2Impl.so.6* +%{_qt6_libdir}/libQt6QuickDialogs2.so.6* +%{_qt6_libdir}/libQt6QuickDialogs2QuickImpl.so.6* +%{_qt6_libdir}/libQt6QuickDialogs2Utils.so.6* +%{_qt6_libdir}/libQt6QuickEffects.so.6* +%{_qt6_libdir}/libQt6QuickLayouts.so.6* +%{_qt6_libdir}/libQt6QuickWidgets.so.6* +%{_qt6_libdir}/libQt6QuickParticles.so.6* +%{_qt6_libdir}/libQt6QuickShapes.so.6* +%{_qt6_libdir}/libQt6QuickTest.so.6* +%{_qt6_libdir}/libQt6QuickTemplates2.so.6* +%{_qt6_libdir}/libQt6QmlXmlListModel.so.6* +%{_qt6_plugindir}/qmltooling/ +%{_qt6_plugindir}/qmllint/ +%{_qt6_archdatadir}/qml/Qt* +%{_qt6_archdatadir}/qml/QmlTime +%{_qt6_archdatadir}/qml/*.qmltypes + +%files devel +%dir %{_qt6_libdir}/cmake/Qt6PacketProtocolPrivate +%dir %{_qt6_libdir}/cmake/Qt6Qml +%dir %{_qt6_libdir}/cmake/Qt6Qml/QmlPlugins +%dir %{_qt6_libdir}/cmake/Qt6QmlBuiltins +%dir %{_qt6_libdir}/cmake/Qt6QmlCompiler +%dir %{_qt6_libdir}/cmake/Qt6QmlCore +%dir %{_qt6_libdir}/cmake/Qt6QmlDebugPrivate +%dir %{_qt6_libdir}/cmake/Qt6QmlIntegration +%dir %{_qt6_libdir}/cmake/Qt6QmlImportScanner +%dir %{_qt6_libdir}/cmake/Qt6LabsAnimation +%dir %{_qt6_libdir}/cmake/Qt6LabsFolderListModel +%dir %{_qt6_libdir}/cmake/Qt6LabsQmlModels +%dir %{_qt6_libdir}/cmake/Qt6LabsSettings +%dir %{_qt6_libdir}/cmake/Qt6LabsSharedImage +%dir %{_qt6_libdir}/cmake/Qt6LabsWavefrontMesh +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Basic +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2BasicStyleImpl +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Fusion +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2FusionStyleImpl +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Imagine +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2ImagineStyleImpl +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Material +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2MaterialStyleImpl +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Universal +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2UniversalStyleImpl +%dir %{_qt6_libdir}/cmake/Qt6QmlLSPrivate +%dir %{_qt6_libdir}/cmake/Qt6QmlDomPrivate +%dir %{_qt6_libdir}/cmake/Qt6QmlLocalStorage +%dir %{_qt6_libdir}/cmake/Qt6QmlModels +%dir %{_qt6_libdir}/cmake/Qt6QmlNetwork +%dir %{_qt6_libdir}/cmake/Qt6QmlTools +%dir %{_qt6_libdir}/cmake/Qt6QmlToolingSettingsPrivate +%dir %{_qt6_libdir}/cmake/Qt6QmlWorkerScript +%dir %{_qt6_libdir}/cmake/Qt6QmlTypeRegistrarPrivate +%dir %{_qt6_libdir}/cmake/Qt6QuickEffectsPrivate +%dir %{_qt6_libdir}/cmake/Qt6Quick +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2 +%dir %{_qt6_libdir}/cmake/Qt6QuickControls2Impl +%dir %{_qt6_libdir}/cmake/Qt6QuickControlsTestUtilsPrivate +%dir %{_qt6_libdir}/cmake/Qt6QuickDialogs2 +%dir %{_qt6_libdir}/cmake/Qt6QuickDialogs2QuickImpl +%dir %{_qt6_libdir}/cmake/Qt6QuickDialogs2Utils +%dir %{_qt6_libdir}/cmake/Qt6QuickLayouts +%dir %{_qt6_libdir}/cmake/Qt6QuickParticlesPrivate +%dir %{_qt6_libdir}/cmake/Qt6QuickShapesPrivate +%dir %{_qt6_libdir}/cmake/Qt6QuickTest +%dir %{_qt6_libdir}/cmake/Qt6QuickTestUtilsPrivate +%dir %{_qt6_libdir}/cmake/Qt6QuickTemplates2 +%dir %{_qt6_libdir}/cmake/Qt6QmlXmlListModel +%{_bindir}/qml* +%{_qt6_bindir}/qml* +%{_qt6_libexecdir}/qmlcachegen +%{_qt6_libexecdir}/qmlimportscanner +%{_qt6_libexecdir}/qmltyperegistrar +%{_qt6_libexecdir}/qmljsrootgen +%{_qt6_headerdir}/Qt*/ +%{_qt6_libdir}/libQt6LabsAnimation.so +%{_qt6_libdir}/libQt6LabsFolderListModel.so +%{_qt6_libdir}/libQt6LabsQmlModels.so +%{_qt6_libdir}/libQt6LabsSettings.so +%{_qt6_libdir}/libQt6LabsSharedImage.so +%{_qt6_libdir}/libQt6LabsWavefrontMesh.so +%{_qt6_libdir}/libQt6QmlLocalStorage.so +%{_qt6_libdir}/libQt6Qml.so +%{_qt6_libdir}/libQt6QmlNetwork.so +%{_qt6_libdir}/libQt6QmlCompiler.so +%{_qt6_libdir}/libQt6QmlCore.so +%{_qt6_libdir}/libQt6QmlModels.so +%{_qt6_libdir}/libQt6QmlWorkerScript.so +%{_qt6_libdir}/libQt6Quick*.so +%{_qt6_libdir}/libQt6QmlXmlListModel.so +%{_qt6_libdir}/qt6/metatypes/qt6*_metatypes.json +%{_qt6_libdir}/qt6/objects-RelWithDebInfo/QmlTypeRegistrarPrivate_resources_1/.qt/rcc/qrc_jsRootMetaTypes_init.cpp.o +%{_qt6_archdatadir}/mkspecs/modules/*.pri +%{_qt6_archdatadir}/mkspecs/features/*.prf +%{_qt6_libdir}/cmake/Qt6BuildInternals/StandaloneTests/QtDeclarativeTestsConfig.cmake +%{_qt6_libdir}/cmake/Qt6PacketProtocolPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6Qml/*.cmake* +%{_qt6_libdir}/cmake/Qt6Qml/*.cpp.in +%{_qt6_libdir}/cmake/Qt6Qml/*.qrc.in +%{_qt6_libdir}/cmake/Qt6QmlBuiltins/*cmake +%{_qt6_libdir}/cmake/Qt6Qml/QmlPlugins/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlCompiler/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlCore/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlDebugPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlIntegration/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlImportScanner/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsAnimation/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsFolderListModel/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsQmlModels/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsSettings/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsSharedImage/*.cmake +%{_qt6_libdir}/cmake/Qt6LabsWavefrontMesh/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlLSPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlDomPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlLocalStorage/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Basic/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2BasicStyleImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Fusion/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2FusionStyleImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Imagine/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2ImagineStyleImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Material/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2MaterialStyleImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Universal/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2UniversalStyleImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlModels/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlNetwork/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlTools/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlToolingSettingsPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlWorkerScript/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlTypeRegistrarPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickEffectsPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6Quick/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControls2Impl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickControlsTestUtilsPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickDialogs2/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickDialogs2QuickImpl/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickDialogs2Utils/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickLayouts/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickParticlesPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickShapesPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickTest/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickTestUtilsPrivate/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickTemplates2/*.cmake +%{_qt6_libdir}/cmake/Qt6QmlXmlListModel/*.cmake +%{_qt6_libdir}/cmake/Qt6QuickWidgets/*.cmake +%{_qt6_libdir}/qt6/modules/*.json +%{_qt6_libdir}/pkgconfig/*.pc +%{_qt6_libdir}/libQt6*.prl +# FIXME: should be in -static, but looks it's required for all modules + %{_qt6_libdir}/libQt6QmlBuiltins.a + +%files static +%{_qt6_libdir}/libQt6QmlDom.a +%{_qt6_libdir}/libQt6QmlLS.a +%{_qt6_libdir}/libQt6QmlTypeRegistrar.a +%{_qt6_libdir}/libQt6QmlToolingSettings.a +%{_qt6_libdir}/libQt6PacketProtocol.a +%{_qt6_libdir}/libQt6QuickControlsTestUtils.a +%{_qt6_libdir}/libQt6QuickTestUtils.a +%{_qt6_libdir}/libQt6QmlDebug.a + +%if 0%{?examples} +%files examples +%{_qt6_examplesdir}/ +%endif + +%if 0%{?build_tests} +%files tests +%{_qt6_archdatadir}/tests +%endif + +%changelog +* Tue Nov 26 2024 MSVSphere Packaging Team - 6.7.1-6 +- Rebuilt for MSVSphere 10 + +* Mon Jul 22 2024 Jan Grulich - 6.7.1-6 +- Do not own /usr/lib[64]/qml directory + Resolves: RHEL-50036 + +* Mon Jun 24 2024 Troy Dawson - 6.7.1-5 +- Bump release for June 2024 mass rebuild + +* Mon Jun 17 2024 Jan Grulich - 6.7.1-4 +- Move all *.prl files to -devel subpackage + Resolves: RHEL-42429 + +* Thu Jun 06 2024 Jan Grulich - 6.7.1-3 +- Backport upstream fix - dom: avoid asserts during dom construction + Resolves: RHEL-36430 + +* Tue Jun 04 2024 Jan Grulich - 6.7.1-2 +- Add rpminspect.yaml + Resolves: RHEL-36430 + +* Fri May 31 2024 Jan Grulich - 6.7.1-1 +- 6.7.1 + Resolves: RHEL-36430 + +* Thu Apr 18 2024 Jan Grulich - 6.7.0-1 +- 6.7.0 + Resolves: RHEL-27845 + Resolves: RHEL-31151 + Resolves: RHEL-32080 + +* Wed Mar 27 2024 Jan Grulich - 6.6.1-4 +- Add -tests subpackage with unit tests that can run in CI + Resolves: RHEL-28239 + +* Fri Jan 26 2024 Fedora Release Engineering - 6.6.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 6.6.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Nov 27 2023 Jan Grulich - 6.6.1-1 +- 6.6.1 + +* 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 + +* 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 Jan Grulich - 6.5.1-4 +- Rebuild for qtlanguageserver private API version change + +* Wed Jul 12 2023 Jan Grulich - 6.5.1-3 +- Rebuild for qtbase private API version change + +* Wed Jul 12 2023 Jan Grulich - 6.5.1-2 +- Rebuild for qtbase private API version change + +* Mon May 22 2023 Jan Grulich - 6.5.1-1 +- 6.5.1 + +* Mon Apr 03 2023 Yaakov Selkowitz - 6.5.0-2 +- Enable qmlls + +* Mon Apr 03 2023 Jan Grulich - 6.5.0-1 +- 6.5.0 + +* Thu Mar 23 2023 Jan Grulich - 6.4.3-1 +- 6.4.3 + +* Wed Mar 15 2023 Neal Gompa - 6.4.2-5 +- Backport fix for crashes in V4 JIT (#2177696) + +* Fri Mar 03 2023 Jan Grulich - 6.4.2-4 +- Fix directory ownership + +* 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 + +* 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 + +* 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 May 25 2022 Jan Grulich - 6.3.0-2 +- Enable examples + +* 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-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* 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 + +* Mon Sep 13 2021 Jan Grulich - 6.2.0~beta4-1 +- Obsoletes: qt6-qtquickcontrols2 + +* Mon Sep 13 2021 Jan Grulich - 6.2.0~beta4-1 +- 6.2.0 - beta4 + +* 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 + +* 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 + +* Mon Jan 11 2021 Jan Grulich - 6.0.0-1 +- 6.0.0