gnu: qtbase: Reinstate date related tests.
* 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. Series-changes: 2 - Use old TZDIR patch for qtbase@5 (the new one doesn't apply)
parent
3eba1dc655
commit
6b8e35ce23
|
@ -1901,6 +1901,7 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/qtbase-absolute-runpath.patch \
|
%D%/packages/patches/qtbase-absolute-runpath.patch \
|
||||||
%D%/packages/patches/qtbase-moc-ignore-gcc-macro.patch \
|
%D%/packages/patches/qtbase-moc-ignore-gcc-macro.patch \
|
||||||
%D%/packages/patches/qtbase-qmake-use-libname.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/qtbase-use-TZDIR.patch \
|
||||||
%D%/packages/patches/qtscript-disable-tests.patch \
|
%D%/packages/patches/qtscript-disable-tests.patch \
|
||||||
%D%/packages/patches/quagga-reproducible-build.patch \
|
%D%/packages/patches/quagga-reproducible-build.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);
|
|
@ -1,39 +1,141 @@
|
||||||
Use $TZDIR to search for time-zone data. Thus avoid depending on package
|
From 1075606f8b2f9e153c82f8e50cbd69cea9c72e87 Mon Sep 17 00:00:00 2001
|
||||||
"tzdata", which often introduces changes with near-immediate effects, so it's
|
From: Edward Welbourne <edward.welbourne@qt.io>
|
||||||
important to be able to update it fast.
|
Date: Mon, 11 Sep 2023 11:41:39 +0200
|
||||||
|
Subject: [PATCH] Support the TZDIR environment variable
|
||||||
|
|
||||||
Based on a patch fron NixOS.
|
On Linux / glibc, this overrides the default system location for the
|
||||||
===================================================================
|
zone info. So check for files there first. Break out a function to
|
||||||
--- qtbase-opensource-src-5.14.2.orig/src/corelib/time/qtimezoneprivate_tz.cpp
|
manage the trying of (now three) zoneinfo directories when opening a
|
||||||
+++ qtbase-opensource-src-5.15.2/src/corelib/time/qtimezoneprivate_tz.cpp
|
file by name relative to there.
|
||||||
@@ -70,7 +70,11 @@
|
|
||||||
// Parse zone.tab table, assume lists all installed zones, if not will need to read directories
|
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()
|
static QTzTimeZoneHash loadTzTimeZones()
|
||||||
{
|
{
|
||||||
- QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
|
- QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
|
||||||
+ // Try TZDIR first, in case we're running on GuixSD.
|
- if (!QFile::exists(path))
|
||||||
+ QString path = QFile::decodeName(qgetenv("TZDIR")) + QStringLiteral("/zone.tab");
|
- path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
|
||||||
+ // Fallback to traditional paths in case we are not on GuixSD.
|
-
|
||||||
+ if (!QFile::exists(path))
|
- QFile tzif(path);
|
||||||
+ path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
|
- if (!tzif.open(QIODevice::ReadOnly))
|
||||||
if (!QFile::exists(path))
|
+ QFile tzif;
|
||||||
path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
|
+ if (!openZoneInfo("zone.tab"_L1, &tzif))
|
||||||
|
return QTzTimeZoneHash();
|
||||||
|
|
||||||
@@ -645,6 +649,9 @@
|
QTzTimeZoneHash zonesHash;
|
||||||
if (!tzif.open(QIODevice::ReadOnly))
|
@@ -91,6 +115,7 @@ static QTzTimeZoneHash loadTzTimeZones()
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ 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
|
||||||
|
|
||||||
QDataStream ds(&tzif);
|
|
||||||
|
|
|
@ -365,7 +365,7 @@ system, and the core design of Django is reused in Grantlee.")
|
||||||
(base32
|
(base32
|
||||||
"1fcg3kx5akvj0kqxd99h5lv3kv4pw2cj0makmpvhpw90inqnrl60"))
|
"1fcg3kx5akvj0kqxd99h5lv3kv4pw2cj0makmpvhpw90inqnrl60"))
|
||||||
;; Use TZDIR to avoid depending on package "tzdata".
|
;; 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-moc-ignore-gcc-macro.patch"
|
||||||
"qtbase-absolute-runpath.patch"))
|
"qtbase-absolute-runpath.patch"))
|
||||||
(modules '((guix build utils)))
|
(modules '((guix build utils)))
|
||||||
|
@ -747,7 +747,8 @@ developers using C++ or QML, a CSS & JavaScript like language.")
|
||||||
(assoc-ref %standard-phases 'configure))
|
(assoc-ref %standard-phases 'configure))
|
||||||
(delete 'check) ;move after patch-prl-files
|
(delete 'check) ;move after patch-prl-files
|
||||||
(add-after 'patch-prl-files 'check
|
(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?
|
(when tests?
|
||||||
;; The tests expect to find the modules provided by this
|
;; The tests expect to find the modules provided by this
|
||||||
;; package; extend the environment variables needed to do so.
|
;; package; extend the environment variables needed to do so.
|
||||||
|
@ -770,6 +771,18 @@ developers using C++ or QML, a CSS & JavaScript like language.")
|
||||||
;; /tree/src/testlib/qtestblacklist.cpp).
|
;; /tree/src/testlib/qtestblacklist.cpp).
|
||||||
(setenv "QTEST_ENVIRONMENT" "linux ci 32bit")
|
(setenv "QTEST_ENVIRONMENT" "linux ci 32bit")
|
||||||
(setenv "HOME" "/tmp") ;some tests require a writable HOME
|
(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
|
(invoke
|
||||||
"xvfb-run" "ctest" "--output-on-failure"
|
"xvfb-run" "ctest" "--output-on-failure"
|
||||||
"-j" (if parallel-tests?
|
"-j" (if parallel-tests?
|
||||||
|
@ -783,11 +796,6 @@ developers using C++ or QML, a CSS & JavaScript like language.")
|
||||||
;; The 'tst_moc' test fails with "'fi.exists()' returned FALSE".
|
;; The 'tst_moc' test fails with "'fi.exists()' returned FALSE".
|
||||||
"tst_moc"
|
"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
|
;; The qgraphicsview and qopenglwidget tests fail with a
|
||||||
;; segfault for unknown reasons (see:
|
;; segfault for unknown reasons (see:
|
||||||
;; https://bugreports.qt.io/browse/QTBUG-116018).
|
;; https://bugreports.qt.io/browse/QTBUG-116018).
|
||||||
|
@ -826,14 +834,6 @@ developers using C++ or QML, a CSS & JavaScript like language.")
|
||||||
;; The 'test_import_plugins' fails with "Could NOT find
|
;; The 'test_import_plugins' fails with "Could NOT find
|
||||||
;; Qt6MockPlugins1".
|
;; Qt6MockPlugins1".
|
||||||
"test_import_plugins"
|
"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:
|
;; The tst_QObjectRace::destroyRace is flaky (see:
|
||||||
;; https://bugreports.qt.io/browse/QTBUG-103489).
|
;; https://bugreports.qt.io/browse/QTBUG-103489).
|
||||||
"tst_qobjectrace"
|
"tst_qobjectrace"
|
||||||
|
@ -910,7 +910,8 @@ developers using C++ or QML, a CSS & JavaScript like language.")
|
||||||
(("\\$\\$\\[QT_HOST_DATA/src\\]") archdata)))))))))
|
(("\\$\\$\\[QT_HOST_DATA/src\\]") archdata)))))))))
|
||||||
(native-inputs
|
(native-inputs
|
||||||
(modify-inputs (package-native-inputs qtbase-5)
|
(modify-inputs (package-native-inputs qtbase-5)
|
||||||
(prepend wayland-protocols
|
(prepend tzdata-for-tests
|
||||||
|
wayland-protocols
|
||||||
xvfb-run)))
|
xvfb-run)))
|
||||||
(inputs
|
(inputs
|
||||||
(modify-inputs (package-inputs qtbase-5)
|
(modify-inputs (package-inputs qtbase-5)
|
||||||
|
|
Reference in New Issue