From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 65922@debbugs.gnu.org
Cc: "Maxim Cournoyer" <maxim.cournoyer@gmail.com>,
"Maxim Cournoyer" <maxim.cournoyer@gmail.com>,
"Andreas Enge" <andreas@enge.fr>, 宋文武 <iyzsong@envs.net>
Subject: [bug#65922] [qt-team PATCH v3 3/5] gnu: qtbase: Reinstate date related tests.
Date: Sun, 17 Sep 2023 13:26:15 -0400 [thread overview]
Message-ID: <931555dfc97a20c94e7ca50d61373a4d10548a17.1694971566.git.maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <cover.1694971566.git.maxim.cournoyer@gmail.com>
* gnu/packages/qt.scm (qtbase) [native-inputs]: Add tzdata-for-tests.
[arguments]: Set the TZDIR and TZ environment variables, and reinstate the
tst_qdate, tst_qtimezone and tst_qdatetime tests in the check phase.
(qtbase-5) [source]: Replace qtbase-use-TZDIR.patch with
qtbase-5-use-TZDIR.patch.
* gnu/packages/patches/qtbase-use-TZDIR.patch: Refresh patch with upstream
version, and preserve the old one for qtbase@5 as...
* gnu/packages/patches/qtbase-5-use-TZDIR.patch: ... this.
* gnu/local.mk (dist_patch_DATA): Register new patch.
---
(no changes since v2)
Changes in v2:
- Use old TZDIR patch for qtbase@5 (the new one doesn't apply)
gnu/local.mk | 1 +
gnu/packages/patches/qtbase-5-use-TZDIR.patch | 39 +++++
gnu/packages/patches/qtbase-use-TZDIR.patch | 162 ++++++++++++++----
gnu/packages/qt.scm | 33 ++--
4 files changed, 189 insertions(+), 46 deletions(-)
create mode 100644 gnu/packages/patches/qtbase-5-use-TZDIR.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index 4f8637418ad..2d8ddf5716c 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1878,6 +1878,7 @@ dist_patch_DATA = \
%D%/packages/patches/qtbase-absolute-runpath.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 \
diff --git a/gnu/packages/patches/qtbase-5-use-TZDIR.patch b/gnu/packages/patches/qtbase-5-use-TZDIR.patch
new file mode 100644
index 00000000000..b6c377b133c
--- /dev/null
+++ b/gnu/packages/patches/qtbase-5-use-TZDIR.patch
@@ -0,0 +1,39 @@
+Use $TZDIR to search for time-zone data. Thus avoid depending on package
+"tzdata", which often introduces changes with near-immediate effects, so it's
+important to be able to update it fast.
+
+Based on a patch fron NixOS.
+===================================================================
+--- qtbase-opensource-src-5.14.2.orig/src/corelib/time/qtimezoneprivate_tz.cpp
++++ qtbase-opensource-src-5.15.2/src/corelib/time/qtimezoneprivate_tz.cpp
+@@ -70,7 +70,11 @@
+ // Parse zone.tab table, assume lists all installed zones, if not will need to read directories
+ static QTzTimeZoneHash loadTzTimeZones()
+ {
+- QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
++ // Try TZDIR first, in case we're running on GuixSD.
++ QString path = QFile::decodeName(qgetenv("TZDIR")) + QStringLiteral("/zone.tab");
++ // Fallback to traditional paths in case we are not on GuixSD.
++ if (!QFile::exists(path))
++ path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
+ if (!QFile::exists(path))
+ path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
+
+@@ -645,6 +649,9 @@
+ if (!tzif.open(QIODevice::ReadOnly))
+ return;
+ } else {
++ // Try TZDIR first, in case we're running on GuixSD.
++ tzif.setFileName(QFile::decodeName(qgetenv("TZDIR")) + QStringLiteral("/") + QString::fromLocal8Bit(ianaId));
++ if (!tzif.open(QIODevice::ReadOnly)) {
+ // Open named tz, try modern path first, if fails try legacy path
+ tzif.setFileName(QLatin1String("/usr/share/zoneinfo/") + QString::fromLocal8Bit(ianaId));
+ if (!tzif.open(QIODevice::ReadOnly)) {
+@@ -652,6 +659,7 @@
+ if (!tzif.open(QIODevice::ReadOnly))
+ return;
+ }
++ }
+ }
+
+ QDataStream ds(&tzif);
diff --git a/gnu/packages/patches/qtbase-use-TZDIR.patch b/gnu/packages/patches/qtbase-use-TZDIR.patch
index b6c377b133c..98bf7493e9f 100644
--- a/gnu/packages/patches/qtbase-use-TZDIR.patch
+++ b/gnu/packages/patches/qtbase-use-TZDIR.patch
@@ -1,39 +1,141 @@
-Use $TZDIR to search for time-zone data. Thus avoid depending on package
-"tzdata", which often introduces changes with near-immediate effects, so it's
-important to be able to update it fast.
+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
-Based on a patch fron NixOS.
-===================================================================
---- qtbase-opensource-src-5.14.2.orig/src/corelib/time/qtimezoneprivate_tz.cpp
-+++ qtbase-opensource-src-5.15.2/src/corelib/time/qtimezoneprivate_tz.cpp
-@@ -70,7 +70,11 @@
- // Parse zone.tab table, assume lists all installed zones, if not will need to read directories
+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");
-+ // Try TZDIR first, in case we're running on GuixSD.
-+ QString path = QFile::decodeName(qgetenv("TZDIR")) + QStringLiteral("/zone.tab");
-+ // Fallback to traditional paths in case we are not on GuixSD.
-+ if (!QFile::exists(path))
-+ path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
- if (!QFile::exists(path))
- path = QStringLiteral("/usr/lib/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();
-@@ -645,6 +649,9 @@
+ 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;
- } else {
-+ // Try TZDIR first, in case we're running on GuixSD.
-+ tzif.setFileName(QFile::decodeName(qgetenv("TZDIR")) + QStringLiteral("/") + QString::fromLocal8Bit(ianaId));
-+ if (!tzif.open(QIODevice::ReadOnly)) {
- // Open named tz, try modern path first, if fails try legacy path
- tzif.setFileName(QLatin1String("/usr/share/zoneinfo/") + QString::fromLocal8Bit(ianaId));
- if (!tzif.open(QIODevice::ReadOnly)) {
-@@ -652,6 +659,7 @@
- if (!tzif.open(QIODevice::ReadOnly))
- return;
+ 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;
}
-+ }
}
- QDataStream ds(&tzif);
+@@ -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 8324beef6fc..c06f27c03e2 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -365,7 +365,7 @@ (define-public qtbase-5
(base32
"1fcg3kx5akvj0kqxd99h5lv3kv4pw2cj0makmpvhpw90inqnrl60"))
;; Use TZDIR to avoid depending on package "tzdata".
- (patches (search-patches "qtbase-use-TZDIR.patch"
+ (patches (search-patches "qtbase-5-use-TZDIR.patch"
"qtbase-moc-ignore-gcc-macro.patch"
"qtbase-absolute-runpath.patch"))
(modules '((guix build utils)))
@@ -747,7 +747,8 @@ (define-public qtbase
(assoc-ref %standard-phases 'configure))
(delete 'check) ;move after patch-prl-files
(add-after 'patch-prl-files 'check
- (lambda* (#:key tests? parallel-tests? #:allow-other-keys)
+ (lambda* (#:key tests? parallel-tests?
+ native-inputs inputs #:allow-other-keys)
(when tests?
;; The tests expect to find the modules provided by this
;; package; extend the environment variables needed to do so.
@@ -770,6 +771,18 @@ (define-public qtbase
;; /tree/src/testlib/qtestblacklist.cpp).
(setenv "QTEST_ENVIRONMENT" "linux ci 32bit")
(setenv "HOME" "/tmp") ;some tests require a writable HOME
+
+ ;; Note: the search path specified for TZDIR is only
+ ;; effective for users of the package, not while it's being
+ ;; built.
+ (setenv "TZDIR" (search-input-directory
+ (or native-inputs inputs) "share/zoneinfo"))
+
+ ;; This is to avoid QTimeZone::systemTimeZone() returning
+ ;; invalid QDate objects due to missing /etc/timezone or
+ ;; /etc/localtime.
+ (setenv "TZ" "Etc/UTC")
+
(invoke
"xvfb-run" "ctest" "--output-on-failure"
"-j" (if parallel-tests?
@@ -783,11 +796,6 @@ (define-public qtbase
;; The 'tst_moc' test fails with "'fi.exists()' returned FALSE".
"tst_moc"
- ;; The 'tst_qdate' test fails because the current time
- ;; is reported as an invalid date (see:
- ;; https://bugreports.qt.io/browse/QTBUG-116017).
- "tst_qdate"
-
;; The qgraphicsview and qopenglwidget tests fail with a
;; segfault for unknown reasons (see:
;; https://bugreports.qt.io/browse/QTBUG-116018).
@@ -826,14 +834,6 @@ (define-public qtbase
;; The 'test_import_plugins' fails with "Could NOT find
;; Qt6MockPlugins1".
"test_import_plugins"
- ;; The 'tst_QTimeZone::systemZone' validates the
- ;; currently set timezone and fails.
- "tst_qtimezone"
- ;; The 'tst_qdatetime' fails with:
- ;; FAIL! : tst_QDateTime::offsetFromUtc() Compared values are not the same
- ;; Actual (dt5.offsetFromUtc()): 0
- ;; Expected (46800) : 46800
- "tst_qdatetime"
;; The tst_QObjectRace::destroyRace is flaky (see:
;; https://bugreports.qt.io/browse/QTBUG-103489).
"tst_qobjectrace"
@@ -910,7 +910,8 @@ (define-public qtbase
(("\\$\\$\\[QT_HOST_DATA/src\\]") archdata)))))))))
(native-inputs
(modify-inputs (package-native-inputs qtbase-5)
- (prepend wayland-protocols
+ (prepend tzdata-for-tests
+ wayland-protocols
xvfb-run)))
(inputs
(modify-inputs (package-inputs qtbase-5)
--
2.41.0
next prev parent reply other threads:[~2023-09-17 17:28 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-13 16:56 [bug#65922] [qt-team PATCH 0/4] Avoid capturing python in qtbase, reinstate tests Maxim Cournoyer
2023-09-13 16:58 ` [bug#65922] [qt-team PATCH 1/4] gnu: qtbase: Do not capture Python (again) Maxim Cournoyer
2023-09-13 16:58 ` [bug#65922] [qt-team PATCH 2/4] gnu: qtbase: Add $TZDIR to native search paths Maxim Cournoyer
2023-09-13 16:58 ` [bug#65922] [qt-team PATCH 3/4] gnu: qtbase: Reinstate date related tests Maxim Cournoyer
2023-09-13 16:58 ` [bug#65922] [qt-team PATCH 4/4] gnu: qtdeclarative: Add a debug output Maxim Cournoyer
2023-09-13 17:33 ` [bug#65922] [qt-team PATCH v2 0/4] Avoid capturing python in qtbase, reinstate tests Maxim Cournoyer
2023-09-13 17:33 ` [bug#65922] [qt-team PATCH v2 1/4] gnu: qtbase: Do not capture Python (again) Maxim Cournoyer
2023-09-14 9:07 ` Andreas Enge
2023-09-17 2:51 ` Maxim Cournoyer
2023-09-17 10:12 ` Andreas Enge
2023-09-17 12:55 ` Maxim Cournoyer
2023-09-13 17:33 ` [bug#65922] [qt-team PATCH v2 2/4] gnu: qtbase: Add $TZDIR to native search paths Maxim Cournoyer
2023-09-13 17:33 ` [bug#65922] [qt-team PATCH v2 3/4] gnu: qtbase: Reinstate date related tests Maxim Cournoyer
2023-09-13 17:33 ` [bug#65922] [qt-team PATCH v2 4/4] gnu: qtdeclarative: Add a debug output Maxim Cournoyer
2023-09-17 17:26 ` [bug#65922] [qt-team PATCH v3 0/5] Avoid capturing python in qtbase, reinstate tests Maxim Cournoyer
2023-09-17 17:26 ` [bug#65922] [qt-team PATCH v3 1/5] gnu: qtbase: Do not capture Python (again) Maxim Cournoyer
2023-09-17 17:26 ` [bug#65922] [qt-team PATCH v3 2/5] gnu: qtbase: Add $TZDIR to native search paths Maxim Cournoyer
2023-09-17 17:26 ` Maxim Cournoyer [this message]
2023-09-17 17:26 ` [bug#65922] [qt-team PATCH v3 4/5] gnu: qtbase: Disable problematic tests on powerpc64le Maxim Cournoyer
2023-09-17 17:26 ` [bug#65922] [qt-team PATCH v3 5/5] gnu: qtdeclarative: Add a debug output Maxim Cournoyer
2023-10-16 21:45 ` bug#65922: [qt-team PATCH 0/4] Avoid capturing python in qtbase, reinstate tests Maxim Cournoyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=931555dfc97a20c94e7ca50d61373a4d10548a17.1694971566.git.maxim.cournoyer@gmail.com \
--to=maxim.cournoyer@gmail.com \
--cc=65922@debbugs.gnu.org \
--cc=andreas@enge.fr \
--cc=iyzsong@envs.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).