Subject: [bug#69628] [PATCH qt-team v4 01/24] gnu: qtbase: Update to 6.6.2.

From: Zheng Junjie <[email-masked]>
Date: Wed, 13 Mar 2024 16:57:55 +0800

* gnu/packages/qt.scm (qtbase): Update to 6.6.2.
[source]: Unbundle pcre2, md4c. Remove qtbase-use-TZDIR.patch. Add
qtbase-find-tools-in-PATH.patch,
qtbase-qmake-fix-includedir.patch,
[arguments]<#:phases>: Adjust 'patch-more-paths phase, skip tst_selftests test.
[inputs]: Add libb2

* gnu/packages/patches/qtbase-use-TZDIR.patch: Remove this.
* gnu/packages/patches/qtbase-find-tools-in-PATH.patch: New file.
* gnu/packages/patches/qtbase-qmake-fix-includedir.patch: New file.

* gnu/local.mk (dist_patch_DATA): Remove qtbase-use-TZDIR.patch.
Register qtbase-find-tools-in-PATH.patch,
qtbase-qmake-fix-includedir.patch.

Change-Id: I72af9c8f2e930bcae18f36ceca18a0a53f5c3e15
---
 gnu/local.mk                                  |   3 +-
 .../patches/qtbase-find-tools-in-PATH.patch   |  49 ++++++
 .../patches/qtbase-qmake-fix-includedir.patch |  29 ++++
 gnu/packages/patches/qtbase-use-TZDIR.patch   | 141 ------------------
 gnu/packages/qt.scm                           |  47 ++++--
 5 files changed, 117 insertions(+), 152 deletions(-)
 create mode 100644 gnu/packages/patches/qtbase-find-tools-in-PATH.patch
 create mode 100644 gnu/packages/patches/qtbase-qmake-fix-includedir.patch
 delete mode 100644 gnu/packages/patches/qtbase-use-TZDIR.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index e8b0a0e7be..0d8f4d28fe 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1951,10 +1951,11 @@ dist_patch_DATA =						\
   %D%/packages/patches/qemu-fix-agent-paths.patch 		\
   %D%/packages/patches/qrcodegen-cpp-make-install.patch		\
   %D%/packages/patches/qtbase-absolute-runpath.patch		\
+  %D%/packages/patches/qtbase-find-tools-in-PATH.patch		\
+  %D%/packages/patches/qtbase-qmake-fix-includedir.patch \
   %D%/packages/patches/qtbase-moc-ignore-gcc-macro.patch	\
   %D%/packages/patches/qtbase-qmake-use-libname.patch		\
   %D%/packages/patches/qtbase-5-use-TZDIR.patch			\
-  %D%/packages/patches/qtbase-use-TZDIR.patch			\
   %D%/packages/patches/qtscript-disable-tests.patch		\
   %D%/packages/patches/quagga-reproducible-build.patch          \
   %D%/packages/patches/quickswitch-fix-dmenu-check.patch	\
diff --git a/gnu/packages/patches/qtbase-find-tools-in-PATH.patch b/gnu/packages/patches/qtbase-find-tools-in-PATH.patch
new file mode 100644
index 0000000000..d5e38b09be
--- /dev/null
+++ b/gnu/packages/patches/qtbase-find-tools-in-PATH.patch
@@ -0,0 +1,49 @@
+Patch retrieved from NixOS
+
+https://github.com/NixOS/nixpkgs/blob/93ecdaa1f34354c9476062dc4fe323b442c087d5/pkgs/development/libraries/qt-6/patches/0006-qtbase-find-tools-in-PATH.patch
+
+From a8b9fae710a2bd5e743f5e16364eaa8c38dbd784 Mon Sep 17 00:00:00 2001
+From: rewine <[email-masked]>
+Date: Wed, 29 Mar 2023 11:51:33 +0800
+Subject: [PATCH 06/11] qtbase-find-tools-in-PATH
+
+1. find qt's tools in `QTTOOLSPATH` env
+   qt assumes that all components use the same install prefix
+   we can't get the real prefix for qttools when build qtbase
+   we will add /libexec to `QTTOOLSPATH` in qtToolsHook
+   find_path will also search in 'PATH' by default
+   see `CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`
+
+2. disable tool_dependencies_enabled
+   We can guarantee the build order of qt components in nixpkgs
+   tools in qttools always build before qtdoc
+   qdoc_bin is not a build target now, since we find it in `QTTOOLSPATH`
+---
+ cmake/QtDocsHelpers.cmake | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/cmake/QtDocsHelpers.cmake b/cmake/QtDocsHelpers.cmake
+index 48ed5a324bf..91d8d41fb1f 100644
+--- a/cmake/QtDocsHelpers.cmake
++++ b/cmake/QtDocsHelpers.cmake
+@@ -47,9 +47,14 @@ function(qt_internal_add_docs)
+         set(doc_tools_libexec "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${INSTALL_LIBEXECDIR}")
+     endif()
+ 
+-    set(qdoc_bin "${doc_tools_bin}/qdoc${CMAKE_EXECUTABLE_SUFFIX}")
+-    set(qtattributionsscanner_bin "${doc_tools_libexec}/qtattributionsscanner${CMAKE_EXECUTABLE_SUFFIX}")
+-    set(qhelpgenerator_bin "${doc_tools_libexec}/qhelpgenerator${CMAKE_EXECUTABLE_SUFFIX}")
++    set(tool_dependencies_enabled FALSE)
++
++    find_path(qdoc_path name qdoc PATHS ENV QTTOOLSPATH)
++    find_path(qtattributionsscanner_path name qtattributionsscanner PATHS ENV QTTOOLSPATH)
++    find_path(qhelpgenerator_path name qhelpgenerator PATHS ENV QTTOOLSPATH)
++    set(qdoc_bin "${qdoc_path}/qdoc${CMAKE_EXECUTABLE_SUFFIX}")
++    set(qtattributionsscanner_bin "${qtattributionsscanner_path}/qtattributionsscanner${CMAKE_EXECUTABLE_SUFFIX}")
++    set(qhelpgenerator_bin "${qhelpgenerator_path}/qhelpgenerator${CMAKE_EXECUTABLE_SUFFIX}")
+ 
+     get_target_property(target_type ${target} TYPE)
+     if (NOT target_type STREQUAL "INTERFACE_LIBRARY")
+-- 
+2.42.0
+
diff --git a/gnu/packages/patches/qtbase-qmake-fix-includedir.patch b/gnu/packages/patches/qtbase-qmake-fix-includedir.patch
new file mode 100644
index 0000000000..766689c4fd
--- /dev/null
+++ b/gnu/packages/patches/qtbase-qmake-fix-includedir.patch
@@ -0,0 +1,29 @@
+Patch retrieved from NixOS
+https://github.com/NixOS/nixpkgs/blob/93ecdaa1f34354c9476062dc4fe323b442c087d5/pkgs/development/libraries/qt-6/patches/0003-qtbase-qmake-fix-includedir-in-generated-pkg-config.patch
+
+From 6088085d3074316dd74639fc6c1233e5862aff11 Mon Sep 17 00:00:00 2001
+From: Nick Cao <[email-masked]>
+Date: Fri, 14 Apr 2023 09:34:46 +0800
+Subject: [PATCH 03/11] qtbase: qmake: fix includedir in generated pkg-config
+
+---
+ qmake/generators/makefile.cpp | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
+index 11d2f0ff7df..c78ed0d3485 100644
+--- a/qmake/generators/makefile.cpp
++++ b/qmake/generators/makefile.cpp
+@@ -3412,8 +3412,7 @@ MakefileGenerator::writePkgConfigFile()
+       << varGlue("QMAKE_PKGCONFIG_CFLAGS", "", " ", " ")
+         //      << varGlue("DEFINES","-D"," -D"," ")
+          ;
+-    if (!project->values("QMAKE_DEFAULT_INCDIRS").contains(includeDir))
+-        t << "-I${includedir}";
++    t << "-I${includedir}";
+     if (target_mode == TARG_MAC_MODE && project->isActiveConfig("lib_bundle")
+         && libDir != QLatin1String("/Library/Frameworks")) {
+             t << " -F${libdir}";
+-- 
+2.42.0
+
diff --git a/gnu/packages/patches/qtbase-use-TZDIR.patch b/gnu/packages/patches/qtbase-use-TZDIR.patch
deleted file mode 100644
index 98bf7493e9..0000000000
--- a/gnu/packages/patches/qtbase-use-TZDIR.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From 1075606f8b2f9e153c82f8e50cbd69cea9c72e87 Mon Sep 17 00:00:00 2001
-From: Edward Welbourne <[email-masked]>
-Date: Mon, 11 Sep 2023 11:41:39 +0200
-Subject: [PATCH] Support the TZDIR environment variable
-
-On Linux / glibc, this overrides the default system location for the
-zone info. So check for files there first. Break out a function to
-manage the trying of (now three) zoneinfo directories when opening a
-file by name relative to there.
-
-Pick-to: 6.6 6.5
-Task-number: QTBUG-116017
-Change-Id: I1f97107aabd9015c0a5543639870f1d70654ca67
----
-* Rebased on top of v6.5.2.
-
- src/corelib/time/qtimezoneprivate_tz.cpp | 73 ++++++++++++++++--------
- 1 file changed, 49 insertions(+), 24 deletions(-)
-
-diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
-index 067191d816..a8b2fc894e 100644
---- a/src/corelib/time/qtimezoneprivate_tz.cpp
-+++ b/src/corelib/time/qtimezoneprivate_tz.cpp
-@@ -51,17 +51,41 @@ typedef QHash<QByteArray, QTzTimeZone> QTzTimeZoneHash;
- 
- static bool isTzFile(const QString &name);
- 
-+// Open a named file under the zone info directory:
-+static bool openZoneInfo(QString name, QFile *file)
-+{
-+    // At least on Linux / glibc (see man 3 tzset), $TZDIR overrides the system
-+    // default location for zone info:
-+    const QString tzdir = qEnvironmentVariable("TZDIR");
-+    if (!tzdir.isEmpty()) {
-+        file->setFileName(QDir(tzdir).filePath(name));
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    // Try modern system path first:
-+    constexpr auto zoneShare = "/usr/share/zoneinfo/"_L1;
-+    if (tzdir != zoneShare && tzdir != zoneShare.chopped(1)) {
-+        file->setFileName(zoneShare + name);
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    // Fall back to legacy system path:
-+    constexpr auto zoneLib = "/usr/lib/zoneinfo/"_L1;
-+    if (tzdir != zoneLib && tzdir != zoneLib.chopped(1)) {
-+        file->setFileName(zoneShare + name);
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    return false;
-+}
-+
- // Parse zone.tab table for territory information, read directories to ensure we
- // find all installed zones (many are omitted from zone.tab; even more from
- // zone1970.tab).
- static QTzTimeZoneHash loadTzTimeZones()
- {
--    QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
--    if (!QFile::exists(path))
--        path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
--
--    QFile tzif(path);
--    if (!tzif.open(QIODevice::ReadOnly))
-+    QFile tzif;
-+    if (!openZoneInfo("zone.tab"_L1, &tzif))
-         return QTzTimeZoneHash();
- 
-     QTzTimeZoneHash zonesHash;
-@@ -91,6 +115,7 @@ static QTzTimeZoneHash loadTzTimeZones()
-         }
-     }
- 
-+    const QString path = tzif.fileName();
-     const qsizetype cut = path.lastIndexOf(u'/');
-     Q_ASSERT(cut > 0);
-     const QDir zoneDir = QDir(path.first(cut));
-@@ -761,20 +786,13 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
-         tzif.setFileName(QStringLiteral("/etc/localtime"));
-         if (!tzif.open(QIODevice::ReadOnly))
-             return ret;
--    } else {
--        // Open named tz, try modern path first, if fails try legacy path
--        tzif.setFileName("/usr/share/zoneinfo/"_L1 + QString::fromLocal8Bit(ianaId));
--        if (!tzif.open(QIODevice::ReadOnly)) {
--            tzif.setFileName("/usr/lib/zoneinfo/"_L1 + QString::fromLocal8Bit(ianaId));
--            if (!tzif.open(QIODevice::ReadOnly)) {
--                // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
--                auto check = validatePosixRule(ianaId);
--                if (check.isValid) {
--                    ret.m_hasDst = check.hasDst;
--                    ret.m_posixRule = ianaId;
--                }
--                return ret;
--            }
-+    } else if (!openZoneInfo(QString::fromLocal8Bit(ianaId), &tzif)) {
-+        // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
-+        auto check = validatePosixRule(ianaId);
-+        if (check.isValid) {
-+            ret.m_hasDst = check.hasDst;
-+            ret.m_posixRule = ianaId;
-+            return ret;
-         }
-     }
- 
-@@ -1317,7 +1335,8 @@ private:
-     {
-         // On most distros /etc/localtime is a symlink to a real file so extract
-         // name from the path
--        const auto zoneinfo = "/zoneinfo/"_L1;
-+        const QString tzdir = qEnvironmentVariable("TZDIR");
-+        constexpr auto zoneinfo = "/zoneinfo/"_L1;
-         QString path = QStringLiteral("/etc/localtime");
-         long iteration = getSymloopMax();
-         // Symlink may point to another symlink etc. before being under zoneinfo/
-@@ -1325,9 +1344,15 @@ private:
-         // symlink, like America/Montreal pointing to America/Toronto
-         do {
-             path = QFile::symLinkTarget(path);
--            int index = path.indexOf(zoneinfo);
--            if (index >= 0) // Found zoneinfo file; extract zone name from path:
--                return QStringView{ path }.mid(index + zoneinfo.size()).toUtf8();
-+            // If it's a zoneinfo file, extract the zone name from its path:
-+            int index = tzdir.isEmpty() ? -1 : path.indexOf(tzdir);
-+            if (index >= 0) {
-+                const auto tail = QStringView{ path }.sliced(index + tzdir.size()).toUtf8();
-+                return tail.startsWith(u'/') ? tail.sliced(1) : tail;
-+            }
-+            index = path.indexOf(zoneinfo);
-+            if (index >= 0)
-+                return QStringView{ path }.sliced(index + zoneinfo.size()).toUtf8();
-         } while (!path.isEmpty() && --iteration > 0);
- 
-         return QByteArray();
-
-base-commit: af457a9f0f7eb1a2a7d11f495da508faab91a442
--- 
-2.41.0
-
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 9df49d7fb3..e195df670d 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -67,6 +67,7 @@ (define-module (gnu packages qt)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages crypto)
   #:use-module (gnu packages check)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
@@ -654,27 +655,28 @@ (define-public qtbase
   (package
     (inherit qtbase-5)
     (name "qtbase")
-    (version "6.5.2")
+    (version "6.6.2")
     (source (origin
               (inherit (package-source qtbase-5))
               (uri (qt-url name version))
               (sha256
                (base32
-                "0s8jwzdcv97dfy8n3jjm8zzvllv380l73mwdva7rs2nqnhlwgd1x"))
+                "0yv78bwqzy975854h53rbiilsms62f3v02i3jqz7v8ajk1ml56xq"))
               (modules '((guix build utils)))
               (snippet
                ;; corelib uses bundled harfbuzz, md4, md5, sha3
                '(with-directory-excursion "src/3rdparty"
                   (for-each delete-file-recursively
-                            ;; The bundled pcre2 copy is kept, as its headers
-                            ;; are required by some internal bootstrap target
-                            ;; used for the tools.
                             (list "double-conversion" "freetype" "harfbuzz-ng"
-                                  "libpng" "libjpeg" "sqlite" "xcb" "zlib"))))
-              (patches (search-patches "qtbase-use-TZDIR.patch"
-                                       "qtbase-moc-ignore-gcc-macro.patch"
-                                       "qtbase-absolute-runpath.patch"
-                                       "qtbase-qmake-use-libname.patch"))))
+                                  "pcre2" "md4c" "libpng" "libjpeg"
+                                  "sqlite" "xcb" "zlib"))))
+              (patches
+               (search-patches
+                "qtbase-moc-ignore-gcc-macro.patch"
+                "qtbase-absolute-runpath.patch"
+                "qtbase-qmake-use-libname.patch"
+                "qtbase-find-tools-in-PATH.patch"
+                "qtbase-qmake-fix-includedir.patch"))))
     (build-system cmake-build-system)
     (arguments
      (substitute-keyword-arguments (package-arguments qtbase-5)
@@ -752,6 +754,12 @@ (define-public qtbase
                                "qmake/library/qmakebuiltins.cpp")
                   (("/bin/sh")
                    (search-input-file inputs "bin/bash")))
+
+                (substitute* "tests/auto/tools/qt_cmake_create/\
+tst_qt_cmake_create.cpp"
+                  (("/bin/sh")
+                   (which "sh")))
+
                 (substitute* "src/corelib/CMakeLists.txt"
                   (("/bin/ls")
                    (search-input-file inputs "bin/ls")))))
@@ -814,6 +822,24 @@ (define-public qtbase
                     (string-join
                      (append
                       (list
+                       ;; The 'tst_selftests' fails with the following error:
+                       ;; with expansion:
+                       ;; false
+                       ;; with messages:
+                       ;; test := "keyboard"
+                       ;; arguments := QList("-o", "-,tap")
+                       ;; Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8.
+                       ;; Qt depends on a UTF-8 locale, but has failed to switch to one.
+                       ;; If this causes problems, reconfigure your locale. See the locale(1) manual
+                       ;; for more information.
+
+                       ;; See https://bugreports.qt.io/browse/QTBUG-113371
+                       ;; Add glibc-utf8-locales to native-inpus is no help.
+                       ;; TODO: when core-updates merge, check again.
+                       "tst_selftests"
+
+                       ;; Sometimes it fails.
+                       "tst_qsystemsemaphore"
                        ;; The 'tst_moc' test fails with "'fi.exists()' returned FALSE".
                        "tst_moc"
 
@@ -984,6 +1010,7 @@ (define-public qtbase
                 bash-minimal
                 coreutils-minimal
                 md4c
+                libb2
                 libice
                 libsm
                 libxcb
-- 
2.41.0