~ruther/guix-local

074ddc321c00cfb1bd1a784ce6ee60a20e518bcd — Zheng Junjie 2 years ago 629614c
gnu: qtbase: Update to 6.6.2.

* 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
Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
5 files changed, 114 insertions(+), 151 deletions(-)

M gnu/local.mk
A gnu/packages/patches/qtbase-find-tools-in-PATH.patch
A gnu/packages/patches/qtbase-qmake-fix-includedir.patch
D gnu/packages/patches/qtbase-use-TZDIR.patch
M gnu/packages/qt.scm
M gnu/local.mk => gnu/local.mk +2 -1
@@ 1965,10 1965,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	\

A gnu/packages/patches/qtbase-find-tools-in-PATH.patch => gnu/packages/patches/qtbase-find-tools-in-PATH.patch +49 -0
@@ 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 <luhongxu@deepin.org>
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


A gnu/packages/patches/qtbase-qmake-fix-includedir.patch => gnu/packages/patches/qtbase-qmake-fix-includedir.patch +29 -0
@@ 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 <nickcao@nichi.co>
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


D gnu/packages/patches/qtbase-use-TZDIR.patch => gnu/packages/patches/qtbase-use-TZDIR.patch +0 -141
@@ 1,141 0,0 @@
From 1075606f8b2f9e153c82f8e50cbd69cea9c72e87 Mon Sep 17 00:00:00 2001
From: Edward Welbourne <edward.welbourne@qt.io>
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


M gnu/packages/qt.scm => gnu/packages/qt.scm +34 -9
@@ 67,6 67,7 @@
  #: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)


@@ 714,27 715,26 @@ developers using C++ or QML, a CSS & JavaScript like language.")
  (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"
                                  "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-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)


@@ 812,6 812,12 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                               "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")))))


@@ 874,6 880,24 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                    (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"



@@ 1044,6 1068,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                bash-minimal
                coreutils-minimal
                md4c
                libb2
                libice
                libsm
                libxcb