diff options
author | Maxim Cournoyer <maxim.cournoyer@gmail.com> | 2023-09-12 10:14:32 -0400 |
---|---|---|
committer | Maxim Cournoyer <maxim.cournoyer@gmail.com> | 2023-10-16 11:16:01 -0400 |
commit | 6b8e35ce23d6fc1aa4525005063345d221b42730 (patch) | |
tree | 43e63845eebd4c823fe221d6adb16cd48525e1d4 /gnu | |
parent | 3eba1dc655c8bb4c2b609fce8ddab05c083a8a60 (diff) |
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)
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/local.mk | 1 | ||||
-rw-r--r-- | gnu/packages/patches/qtbase-5-use-TZDIR.patch | 39 | ||||
-rw-r--r-- | gnu/packages/patches/qtbase-use-TZDIR.patch | 162 | ||||
-rw-r--r-- | gnu/packages/qt.scm | 33 |
4 files changed, 189 insertions, 46 deletions
diff --git a/gnu/local.mk b/gnu/local.mk index 9db0c171e5..daacd786a7 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1901,6 +1901,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 0000000000..b6c377b133 --- /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 b6c377b133..98bf7493e9 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 8324beef6f..c06f27c03e 100644 --- a/gnu/packages/qt.scm +++ b/gnu/packages/qt.scm @@ -365,7 +365,7 @@ system, and the core design of Django is reused in Grantlee.") (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 @@ developers using C++ or QML, a CSS & JavaScript like language.") (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 @@ developers using C++ or QML, a CSS & JavaScript like language.") ;; /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 @@ developers using C++ or QML, a CSS & JavaScript like language.") ;; 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 @@ developers using C++ or QML, a CSS & JavaScript like language.") ;; 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 @@ developers using C++ or QML, a CSS & JavaScript like language.") (("\\$\\$\\[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) |