summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.patman10
-rw-r--r--Makefile.am1
-rw-r--r--doc/guix.texi16
-rw-r--r--etc/kernels-manifest.scm33
-rw-r--r--etc/teams.scm.in40
-rw-r--r--gnu/bootloader/u-boot.scm2
-rw-r--r--gnu/local.mk6
-rw-r--r--gnu/packages/admin.scm4
-rw-r--r--gnu/packages/aspell.scm7
-rw-r--r--gnu/packages/audio.scm52
-rw-r--r--gnu/packages/bioinformatics.scm47
-rw-r--r--gnu/packages/bootloaders.scm103
-rw-r--r--gnu/packages/containers.scm7
-rw-r--r--gnu/packages/cran.scm277
-rw-r--r--gnu/packages/dlang.scm40
-rw-r--r--gnu/packages/education.scm4
-rw-r--r--gnu/packages/emacs-xyz.scm257
-rw-r--r--gnu/packages/engineering.scm4
-rw-r--r--gnu/packages/file-systems.scm24
-rw-r--r--gnu/packages/game-development.scm120
-rw-r--r--gnu/packages/games.scm4
-rw-r--r--gnu/packages/gnome.scm5
-rw-r--r--gnu/packages/guile-xyz.scm6
-rw-r--r--gnu/packages/hardware.scm28
-rw-r--r--gnu/packages/haskell.scm154
-rw-r--r--gnu/packages/image-processing.scm277
-rw-r--r--gnu/packages/kde-games.scm3
-rw-r--r--gnu/packages/kodi.scm231
-rw-r--r--gnu/packages/linux.scm8
-rw-r--r--gnu/packages/lisp-xyz.scm117
-rw-r--r--gnu/packages/llvm.scm15
-rw-r--r--gnu/packages/logging.scm16
-rw-r--r--gnu/packages/mail.scm8
-rw-r--r--gnu/packages/maths.scm5
-rw-r--r--gnu/packages/mes.scm13
-rw-r--r--gnu/packages/messaging.scm10
-rw-r--r--gnu/packages/music.scm2
-rw-r--r--gnu/packages/node.scm2
-rw-r--r--gnu/packages/parallel.scm4
-rw-r--r--gnu/packages/patches/kodi-increase-test-timeout.patch18
-rw-r--r--gnu/packages/patches/kodi-set-libcurl-ssl-parameters.patch13
-rw-r--r--gnu/packages/patches/kodi-skip-test-449.patch53
-rw-r--r--gnu/packages/patches/u-boot-infodocs-target.patch84
-rw-r--r--gnu/packages/patches/u-boot-patman-fix-help.patch40
-rw-r--r--gnu/packages/patches/u-boot-patman-get-maintainer.patch104
-rw-r--r--gnu/packages/patches/u-boot-patman-local-conf.patch176
-rw-r--r--gnu/packages/pdf.scm35
-rw-r--r--gnu/packages/python-xyz.scm47
-rw-r--r--gnu/packages/samba.scm22
-rw-r--r--gnu/packages/statistics.scm22
-rw-r--r--gnu/packages/sync.scm16
-rw-r--r--gnu/packages/terminals.scm19
-rw-r--r--gnu/packages/video.scm46
-rw-r--r--gnu/packages/wm.scm21
-rw-r--r--gnu/services/desktop.scm9
-rw-r--r--gnu/services/sound.scm18
-rw-r--r--guix/import/cran.scm157
-rw-r--r--guix/import/crate.scm3
-rw-r--r--guix/import/egg.scm3
-rw-r--r--guix/import/elm.scm2
-rw-r--r--guix/import/gem.scm3
-rw-r--r--guix/import/gnu.scm3
-rw-r--r--guix/import/go.scm5
-rw-r--r--guix/import/hackage.scm5
-rw-r--r--guix/import/hexpm.scm2
-rw-r--r--guix/import/minetest.scm5
-rw-r--r--guix/import/opam.scm2
-rw-r--r--guix/import/pypi.scm2
-rw-r--r--guix/import/stackage.scm5
-rw-r--r--guix/import/texlive.scm4
-rw-r--r--guix/import/utils.scm15
-rw-r--r--guix/scripts/import/cran.scm21
-rw-r--r--guix/scripts/refresh.scm133
-rw-r--r--guix/ui.scm4
-rw-r--r--guix/upstream.scm17
-rw-r--r--tests/gnu-maintenance.scm6
-rw-r--r--tests/import-utils.scm10
77 files changed, 2407 insertions, 705 deletions
diff --git a/.patman b/.patman
new file mode 100644
index 0000000000..20c3362ac1
--- /dev/null
+++ b/.patman
@@ -0,0 +1,10 @@
+# This config file allows for Patchwork integration with
+# https://patches.guix-patches.cbaines.net/.
+
+[settings]
+project: guix-patches
+patchwork_url: https://patches.guix-patches.cbaines.net
+add_signoff: False
+get_maintainer_script: etc/teams.scm get-maintainer
+# TODO: enable check_patch
+check_patch: False
diff --git a/Makefile.am b/Makefile.am
index b54288c0fc..8b026b6da6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -689,6 +689,7 @@ EXTRA_DIST +=						\
   etc/guix-install.sh					\
   etc/historical-authorizations				\
   etc/news.scm						\
+  etc/kernels-manifest.scm				\
   etc/release-manifest.scm				\
   etc/source-manifest.scm				\
   etc/system-tests.scm					\
diff --git a/doc/guix.texi b/doc/guix.texi
index 053cd1ad41..5c85680831 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -5614,6 +5614,18 @@ add a meta-data file @file{.guix-channel} that contains:
   (directory "guix"))
 @end lisp
 
+The modules must be @b{underneath} the specified directory, as the
+@code{directory} changes Guile's @code{load-path}.  For example, if
+@file{.guix-channel} has @code{(directory "base")}, then a module
+defined as @code{(define-module (gnu packages fun))} must be located at
+@code{base/gnu/packages/fun.scm}.
+
+Doing this allows for only parts of a repository to be used as a
+channel, as Guix expects valid Guile modules when pulling.  For
+instance, @command{guix deploy} machine configuration files are not
+valid Guile modules, and treating them as such would make @command{guix
+pull} fail.
+
 @node Declaring Channel Dependencies
 @section Declaring Channel Dependencies
 
@@ -13487,6 +13499,10 @@ definitions are to be appended to existing user modules, as the list of
 used package modules need not be changed.  The default is
 @option{--style=variable}.
 
+When @option{--prefix=license:} is added, the importer will prefix
+license atoms with @code{license:}, allowing a prefixed import of
+@code{(guix licenses)}.
+
 When @option{--archive=bioconductor} is added, metadata is imported from
 @uref{https://www.bioconductor.org/, Bioconductor}, a repository of R
 packages for the analysis and comprehension of high-throughput
diff --git a/etc/kernels-manifest.scm b/etc/kernels-manifest.scm
new file mode 100644
index 0000000000..6da7e374c5
--- /dev/null
+++ b/etc/kernels-manifest.scm
@@ -0,0 +1,33 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 Leo Famulari <leo@famulari.name>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; This file returns a manifest of packages related to linux-libre.
+;;; Simplistically, it selects packages whose names begin with "linux-libre".
+;;; It is used to assist continuous integration of the kernel packages.
+
+(use-modules (guix packages))
+
+(manifest
+  (map package->manifest-entry
+       (fold-packages
+         (lambda (package lst)
+           (if (string-prefix? "linux-libre"
+                               (package-name package))
+             (cons package lst)
+             lst))
+         '())))
diff --git a/etc/teams.scm.in b/etc/teams.scm.in
index f42a7f6f28..96a04aca3d 100644
--- a/etc/teams.scm.in
+++ b/etc/teams.scm.in
@@ -5,6 +5,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2022 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2022 Mathieu Othacehe <othacehe@gnu.org>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -34,6 +35,7 @@
              (ice-9 format)
              (ice-9 regex)
              (ice-9 match)
+             (ice-9 rdelim)
              (guix ui)
              (git))
 
@@ -623,14 +625,38 @@ and REV-END, two git revision strings."
      (const 0))
     files))
 
+(define (git-patch->commit-id file)
+  "Parse the commit ID from the first line of FILE, a patch produced with git."
+  (call-with-input-file file
+    (lambda (port)
+      (let ((m (string-match "^From ([0-9a-f]{40})" (read-line port))))
+        (unless m
+          (error "invalid patch file:" file))
+        (match:substring m 1)))))
+
+(define (git-patch->revisions file)
+  "Return the start and end revisions of FILE, a patch file produced with git."
+  (let* ((rev-end (git-patch->commit-id file))
+         (rev-start (string-append rev-end "^")))
+    (list rev-start rev-end)))
+
 
 (define (main . args)
   (match args
     (("cc" . team-names)
      (apply cc (map find-team team-names)))
+    (("cc-members" patch-file)
+     (unless (file-exists? patch-file)
+       (error "patch file does not exist:" patch-file))
+     (apply main "cc-members" (git-patch->revisions patch-file)))
     (("cc-members" rev-start rev-end)
      (apply cc (find-team-by-scope
                 (diff-revisions rev-start rev-end))))
+    (("get-maintainer" patch-file)
+     (apply main "list-members"
+            (map (compose symbol->string team-id)
+                 (find-team-by-scope (apply diff-revisions
+                                            (git-patch->revisions patch-file))))))
     (("list-teams" . args)
      (list-teams))
     (("list-members" . team-names)
@@ -643,9 +669,15 @@ and REV-END, two git revision strings."
              "Usage: etc/teams.scm <command> [<args>]
 
 Commands:
-  cc <team-name>            get git send-email flags for cc-ing <team-name>
-  cc-members <start> <end>  cc teams related to files changed between revisions
-  list-teams                list teams and their members
-  list-members <team-name>  list members belonging to <team-name>~%"))))
+  cc <team-name>
+      get git send-email flags for cc-ing <team-name>
+  cc-members <start> <end> | patch
+      cc teams related to files changed between revisions or in a patch file
+  list-teams
+      list teams and their members
+  list-members <team-name>
+      list members belonging to <team-name>
+  get-maintainer <patch>
+      compatibility mode with Linux get_maintainer.pl~%"))))
 
 (apply main (cdr (command-line)))
diff --git a/gnu/bootloader/u-boot.scm b/gnu/bootloader/u-boot.scm
index de3a43ed70..6cad33b741 100644
--- a/gnu/bootloader/u-boot.scm
+++ b/gnu/bootloader/u-boot.scm
@@ -144,7 +144,7 @@
 (define u-boot-beaglebone-black-bootloader
   (bootloader
    (inherit u-boot-bootloader)
-   (package u-boot-am335x-evm-boneblack)
+   (package u-boot-am335x-boneblack)
    (disk-image-installer install-beaglebone-black-u-boot)))
 
 (define u-boot-allwinner-bootloader
diff --git a/gnu/local.mk b/gnu/local.mk
index a9b823eec3..f73f8f8423 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1399,9 +1399,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/kobodeluxe-manpage-minus-not-hyphen.patch	\
   %D%/packages/patches/kobodeluxe-midicon-segmentation-fault.patch	\
   %D%/packages/patches/kobodeluxe-graphics-window-signed-char.patch	\
-  %D%/packages/patches/kodi-increase-test-timeout.patch		\
   %D%/packages/patches/kodi-set-libcurl-ssl-parameters.patch		\
-  %D%/packages/patches/kodi-skip-test-449.patch		\
   %D%/packages/patches/kwayland-skip-flaky-test.patch		\
   %D%/packages/patches/laby-make-install.patch			\
   %D%/packages/patches/ldns-drill-examples.patch		\
@@ -1916,6 +1914,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/tuxpaint-stamps-path.patch		\
   %D%/packages/patches/twinkle-bcg729.patch			\
   %D%/packages/patches/u-boot-allow-disabling-openssl.patch	\
+  %D%/packages/patches/u-boot-infodocs-target.patch		\
+  %D%/packages/patches/u-boot-patman-fix-help.patch		\
+  %D%/packages/patches/u-boot-patman-get-maintainer.patch	\
+  %D%/packages/patches/u-boot-patman-local-conf.patch		\
   %D%/packages/patches/u-boot-nintendo-nes-serial.patch		\
   %D%/packages/patches/u-boot-rockchip-inno-usb.patch		\
   %D%/packages/patches/u-boot-sifive-prevent-reloc-initrd-fdt.patch	\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index b9fd3dab27..589b2c92a6 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -2608,14 +2608,14 @@ characters can be replaced as well, as can UTF-8 characters.")
 (define-public tree
   (package
     (name "tree")
-    (version "2.0.4")
+    (version "2.1.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
                     "https://mama.indstate.edu/users/ice/tree/src/tree-"
                     version ".tgz"))
               (sha256
-               (base32 "0x7s9wxvf83fw4qah16kapswl2277pybw3d514zrlms9g0cr5smh"))))
+               (base32 "1xmbxgx72w7ddjlqsx1yys076hp3h7ll968bhdmdrc7jpwswaq01"))))
     (build-system gnu-build-system)
     (arguments
      (list
diff --git a/gnu/packages/aspell.scm b/gnu/packages/aspell.scm
index 9a5a9c6bcc..76deb7cdce 100644
--- a/gnu/packages/aspell.scm
+++ b/gnu/packages/aspell.scm
@@ -171,6 +171,13 @@ dictionaries, including personal ones.")
                      (base32
                       "1svls9p7rsfi3hs0afh0cssj006qb4v1ik2yzqgj8hm10c6as2sm")))
 
+(define-public aspell-dict-bn
+  (aspell-dictionary "bn" "Bengali"
+                     #:version "0.01.1-1"
+                     #:sha256
+                     (base32
+                      "1nc02jd67iggirwxnhdvlvaqm0xfyks35c4psszzj3dhzv29qgxh")))
+
 (define-public aspell-dict-ca
   (let ((version "2.5.0")
         (sha256
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 78bd0e1446..4702d5d124 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -39,6 +39,7 @@
 ;;; Copyright © 2022 Arjan Adriaanse <arjan@adriaan.se>
 ;;; Copyright © 2022 Juliana Sims <jtsims@protonmail.com>
 ;;; Copyright © 2022 Simon Streit <simon@netpanic.org>
+;;; Copyright © 2022 Andy Tai <atai@atai.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -731,7 +732,7 @@ purposes developed at Queen Mary, University of London.")
 (define-public ardour
   (package
     (name "ardour")
-    (version "7.1")
+    (version "7.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -748,7 +749,7 @@ purposes developed at Queen Mary, University of London.")
 namespace ARDOUR { const char* revision = \"" version "\" ; const char* date = \"\"; }")))))
               (sha256
                (base32
-                "11ca9xpzmzafl8xl0r0w32lxjqwy532hfd2bzb0d73bdpngpvcbq"))
+                "1gv0wkzyx59lbnaf5iz9yva4akrd2zkhsmdk8wda3wz06zmk4w1r"))
               (file-name (string-append name "-" version))))
     (build-system waf-build-system)
     (arguments
@@ -2463,6 +2464,49 @@ synchronous execution of all clients, and low latency operation.")
     ;; Most files are under GPLv2+, but some headers are under LGPLv2.1+
     (license (list license:gpl2+ license:lgpl2.1+))))
 
+(define-public jacktrip
+  (package
+    (name "jacktrip")
+    (version "1.6.8")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/jacktrip/jacktrip/")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32 "0719ng799kingv0y9yk07bvnmprk25c09ph3yaia5dhapg0jz17m"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (invoke "qmake"
+                     (string-append "PREFIX="
+                                    (assoc-ref outputs "out"))
+                     "-config" "novs"
+                     "-config" "noupdater"
+                     "jacktrip.pro"))))))
+    (inputs
+     (list jack-2
+           python
+           python-jinja2
+           python-pyyaml
+           qtbase-5
+           rtaudio))
+    (native-inputs
+     (list pkg-config qtbase-5)) ;for qmake
+    (home-page "https://jacktrip.github.io/jacktrip/")
+    (synopsis "Multi-machine audio system for network music performance")
+    (description
+     "JackTrip is a multi-machine audio system used for network music
+performance over the Internet.  It supports any number of channels (as many as
+the computer/network can handle) of bidirectional, high quality, uncompressed
+audio signal streaming.")
+    (license (list license:gpl3+ license:lgpl3 license:expat))))
+
 (define-public jalv
   (package
     (name "jalv")
@@ -4936,7 +4980,7 @@ library supports sample rates up to 96 kHz and up to eight channels (7.1
 (define-public libopenshot-audio
   (package
     (name "libopenshot-audio")
-    (version "0.2.2")
+    (version "0.3.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4945,7 +4989,7 @@ library supports sample rates up to 96 kHz and up to eight channels (7.1
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "03dygh85riljk7dpn5a5a0d22a2kz45fs13gzwqgnbzzr1k17p2y"))))
+                "1y3apyn71ysks88bv71knjvk832imnbpbb8mgib3q9b8pvdmjw3g"))))
     (build-system cmake-build-system)
     (inputs
      (list alsa-lib
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 8cdce01e73..46febf579a 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -12710,6 +12710,31 @@ known and yet unknown splice junctions.  Circular-to-linear ratios of circRNAs
 can be calculated, and a number of descriptive plots easily generated.")
     (license license:artistic2.0)))
 
+(define-public r-domultibarheatmap
+  (let ((commit "9e65afa0aa69fee631c61b7bf3e7742632c9cb95")
+        (revision "1"))
+    (package
+      (name "r-domultibarheatmap")
+      (version (git-version "0.1.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/elliefewings/DoMultiBarHeatmap")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0q9mrc6md08aff6hhzlw3igvv3w7pr1wildzm8i0km9xvbi9iyy9"))))
+      (properties `((upstream-name . "DoMultiBarHeatmap")))
+      (build-system r-build-system)
+      (propagated-inputs (list r-ggplot2 r-magrittr r-rlang r-seurat))
+      (home-page "https://github.com/elliefewings/DoMultiBarHeatmap")
+      (synopsis "Produce heatmap from a Seurat object with multiple annotation bars")
+      (description "This package builds on Seurat's @code{Doheatmap} function
+code to produce a heatmap from a Seurat object with multiple annotation
+bars.")
+      (license license:cc0))))
+
 (define-public r-doubletfinder
   (let ((commit "554097ba4e2c0ed7c28dc7f0b5b75277f3a50551")
         (revision "1"))
@@ -12785,20 +12810,20 @@ is then merged.")
       (license license:gpl2))))
 
 (define-public r-giotto
-  (let ((commit "68d7390dce87223cac11d4d8f31705fe0144d011")
+  (let ((commit "3c8067cedbf6e3112edcac2ae796de05fd9d6fe4")
         (revision "1"))
     (package
       (name "r-giotto")
-      (version (git-version "1.1.1" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/RubD/Giotto/")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32 "0mv60khc05wrxzr4ir6cirn7dpqvgwan5hm00lmafsyalr51nf5i"))))
+      (version (git-version "1.1.2" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/RubD/Giotto/")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1nbbqs0jk07wafshvqsdp8ds3kr9bwq88aafc5m0kdiqs7winb0d"))))
       (properties `((upstream-name . "Giotto")))
       (build-system r-build-system)
       (propagated-inputs
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index 89f051f337..e3a63882e9 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
 ;;; Copyright © 2021 Stefan <stefan-guix@vodafonemail.de>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -62,12 +63,16 @@
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages sdl)
+  #:use-module (gnu packages sphinx)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages swig)
   #:use-module (gnu packages valgrind)
   #:use-module (gnu packages virtualization)
   #:use-module (gnu packages xorg)
+  #:use-module (gnu packages python-web)
+  #:use-module (gnu packages python-xyz)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
   #:use-module (guix gexp)
@@ -638,7 +643,11 @@ tree binary files.  These are board description files used by Linux and BSD.")
                (list %u-boot-rockchip-inno-usb-patch
                      %u-boot-allow-disabling-openssl-patch
                      %u-boot-sifive-prevent-relocating-initrd-fdt
-                     %u-boot-rk3399-enable-emmc-phy-patch))
+                     %u-boot-rk3399-enable-emmc-phy-patch
+                     (search-patch "u-boot-infodocs-target.patch")
+                     (search-patch "u-boot-patman-fix-help.patch")
+                     (search-patch "u-boot-patman-local-conf.patch")
+                     (search-patch "u-boot-patman-get-maintainer.patch")))
               (method url-fetch)
               (uri (string-append
                     "https://ftp.denx.de/pub/u-boot/"
@@ -669,6 +678,42 @@ tree binary files.  These are board description files used by Linux and BSD.")
 also initializes the boards (RAM etc).")
     (license license:gpl2+)))
 
+;;; This is very similar to the linux-libre-documentation package, since it
+;;; reuses the same Makefile-based build system.
+(define-public u-boot-documentation
+  (package
+    (inherit u-boot)
+    (name "u-boot-documentation")
+    (arguments
+     (list
+      #:make-flags #~(list "HOSTCC=gcc"
+                           ;; Avoid treating Sphinx warnings as errors.
+                           "SPHINXOPTS=")
+      #:tests? #f
+      #:phases #~(modify-phases %standard-phases
+                   (delete 'configure)
+                   (replace 'build
+                     (lambda* (#:key make-flags #:allow-other-keys)
+                       (apply invoke "make" "infodocs" make-flags)))
+                   (replace 'install
+                     (lambda* (#:key make-flags #:allow-other-keys)
+                       (let* ((info-dir (string-append #$output "/share/info"))
+                              (info (string-append info-dir
+                                                   "/DasUBoot.info.gz")))
+                         (with-directory-excursion "doc/output"
+                           (apply invoke "make" "-C" "texinfo" "install-info"
+                                  (string-append "infodir=" info-dir)
+                                  make-flags))))))))
+    (native-inputs
+     (modify-inputs (package-native-inputs u-boot)
+       (append fontconfig
+               python-sphinx
+               texinfo
+               which)))
+    (synopsis "U-Boot documentation")
+    (description "This package provides the documentation for U-Boot, as an
+Info manual.")))
+
 (define-public u-boot-tools
   (package
     (inherit u-boot)
@@ -777,6 +822,34 @@ def test_ctrl_c"))
                   "  This package provides board-independent tools "
                   "of U-Boot."))))
 
+;;; This is packaged separately, as it can be used in other contexts than for
+;;; U-Boot development.
+(define-public patman
+  (package
+    (inherit u-boot)
+    (name "patman")
+    (build-system pyproject-build-system)
+    (arguments
+     ;; The test suite strongly relies on the git metadata being available (23
+     ;; failed, 14 passed).
+     (list
+      #:tests? #f
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'chdir
+            (lambda _
+              (chdir "tools/patman"))))))
+    (inputs (list python-pygit2 python-requests))
+    (synopsis "Patch automation tool")
+    (description "Patman is a patch automation script which:
+@itemize
+@item Creates patches directly from your branch
+@item Cleans them up by removing unwanted tags
+@item Inserts a cover letter with change lists
+@item Runs the patches through automated checks
+@item Optionally emails them out to selected people.
+@end itemize")))
+
 (define*-public (make-u-boot-package board triplet
                                      #:key
                                      defconfig
@@ -890,17 +963,23 @@ appended to the package description."
 (define-public u-boot-malta
   (make-u-boot-package "malta" "mips64el-linux-gnuabi64"))
 
-(define-public u-boot-am335x-evm-boneblack
-  (make-u-boot-package
-   "am335x_evm" "arm-linux-gnueabihf"
-   ;; Patch out other device trees to build an image small enough to fit
-   ;; within typical partitioning schemes where the first partition begins at
-   ;; sector 2048.
-   #:configs '("CONFIG_OF_LIST=\"am335x-evm am335x-boneblack\"")
-   #:name-suffix "-boneblack"
-   #:append-description "This U-Boot is built for the BeagleBone Black, which
-was removed upstream, adjusted from the am335x_evm build with several device
-trees removed so that it fits within common partitioning schemes."))
+(define-public u-boot-am335x-boneblack
+  (let ((base (make-u-boot-package
+               "am335x_evm" "arm-linux-gnueabihf"
+               ;; Patch out other device trees to build an image small enough
+               ;; to fit within typical partitioning schemes where the first
+               ;; partition begins at sector 2048.
+               #:configs '("CONFIG_OF_LIST=\"am335x-evm am335x-boneblack\"")
+               #:append-description
+               "This U-Boot is built for the BeagleBone Black, which was
+removed upstream, adjusted from the am335x_evm build with several device trees
+removed so that it fits within common partitioning schemes.")))
+    (package
+      (inherit base)
+      ;; The name is not derived from the board name on purpose, as the config
+      ;; is modified per the comment above, parting from the default
+      ;; am335x_evm configuration.
+      (name "u-boot-am335x-boneblack"))))
 
 (define-public u-boot-am335x-evm
   (make-u-boot-package "am335x_evm" "arm-linux-gnueabihf"))
diff --git a/gnu/packages/containers.scm b/gnu/packages/containers.scm
index e2d698dcc2..985dea7bdb 100644
--- a/gnu/packages/containers.scm
+++ b/gnu/packages/containers.scm
@@ -274,7 +274,7 @@ configure network interfaces in Linux containers.")
 (define-public podman
   (package
     (name "podman")
-    (version "4.2.1")
+    (version "4.3.1")
     (source
      (origin
        (method git-fetch)
@@ -282,7 +282,7 @@ configure network interfaces in Linux containers.")
              (url "https://github.com/containers/podman")
              (commit (string-append "v" version))))
        (sha256
-        (base32 "0ph8gf5gk9z1hm1v5kv924dipswvgrz0sgk23plnh2q0vbnh4wvv"))
+        (base32 "05hv4xdf06n728lmsx793zygypc9i404bgcgpy0fyrg8c2s11q2h"))
        (file-name (git-file-name name version))))
 
     (build-system gnu-build-system)
@@ -346,7 +346,8 @@ configure network interfaces in Linux containers.")
            git
            go
            ; strace ; XXX debug
-           pkg-config))
+           pkg-config
+           python))
     (home-page "https://podman.io")
     (synopsis "Manage containers, images, pods, and their volumes")
     (description
diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
index fccf0002a7..7a17f995db 100644
--- a/gnu/packages/cran.scm
+++ b/gnu/packages/cran.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2018, 2019 Brett Gilio <brettg@gnu.org>
 ;;; Copyright © 2019 Nicolò Balzarotti <anothersms@gmail.com>
-;;; Copyright © 2019, 2020, 2021 Wiktor Żelazny <wzelazny@vurv.cz>
+;;; Copyright © 2019, 2020, 2021, 2022 Wiktor Żelazny <wzelazny@vurv.cz>
 ;;; Copyright © 2019 Arne Babenhauserheide <arne_bab@web.de>
 ;;; Copyright © 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020 Todor Kondić <tk.code@protonmail.com>
@@ -1124,6 +1124,61 @@ isolated functions, also called crates, print to the console with their total
 size and can be easily tested locally before being sent to a remote.")
     (license license:gpl3)))
 
+(define-public r-climaemet
+  (package
+    (name "r-climaemet")
+    (version "1.0.2")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "climaemet" version))
+              (sha256
+               (base32
+                "1z0i8iz7f32kns8j1yb3sp2m0zhl4pgp4bf52aiqykjp9i791dqm"))))
+    (properties `((upstream-name . "climaemet")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-dplyr
+           r-ggplot2
+           r-httr
+           r-jsonlite
+           r-rappdirs
+           r-readr
+           r-rlang
+           r-tibble
+           r-tidyr))
+    (native-inputs (list r-knitr))
+    (home-page "https://ropenspain.github.io/climaemet/")
+    (synopsis "Climate AEMET Tools")
+    (description
+     "This package provides tools to download the climatic data of the Spanish
+Meteorological Agency (AEMET) directly from R using their API and create
+scientific graphs (climate charts, trend analysis of climate time series,
+temperature and precipitation anomalies maps, warming stripes graphics,
+climatograms, etc.).")
+    (license license:gpl3)))
+
+(define-public r-climatol
+  (package
+    (name "r-climatol")
+    (version "3.1.2")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "climatol" version))
+              (sha256
+               (base32
+                "0p3nk4n7izj0cmmqd9apa1gix5lfdzp08ydy0n7rkl5kbkmrkb6n"))))
+    (properties `((upstream-name . "climatol")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-mapdata r-maps))
+    (home-page "http://www.climatol.eu/")
+    (synopsis "Climate tools")
+    (description
+     "This package provides functions for the quality control, homogenization
+and missing data infilling of climatological series, and to obtain
+climatological summaries and grids from the results.  Also functions to draw
+wind-roses and Walter&Lieth climate diagrams are included.")
+    (license license:gpl2+)))
+
 (define-public r-clipr
   (package
     (name "r-clipr")
@@ -4015,6 +4070,26 @@ work well on small screens.")
 data store designed for maximum speed.")
     (license license:asl2.0)))
 
+(define-public r-mapdata
+  (package
+    (name "r-mapdata")
+    (version "2.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "mapdata" version))
+              (sha256
+               (base32
+                "1m2r4c8f7fp900g3sdjbfxxnxjla86hn75jd8hi96ms188p0j8b0"))))
+    (properties `((upstream-name . "mapdata")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-maps))
+    (home-page "https://cran.r-project.org/package=mapdata")
+    (synopsis "Extra map databases")
+    (description
+     "This is a supplement to the @code{maps} package providing the larger
+and/or higher-resolution databases.")
+    (license license:gpl2)))
+
 (define-public r-maps
   (package
     (name "r-maps")
@@ -4645,13 +4720,13 @@ and Francois (2011, JSS), and the book by Eddelbuettel (2013, Springer); see
 (define-public r-rcppde
   (package
     (name "r-rcppde")
-    (version "0.1.6")
+    (version "0.1.7")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RcppDE" version))
               (sha256
                (base32
-                "1i9jj595nqpb16y22z2b8fcf0gq1fg0pbiisbd837p1cyw4nff69"))))
+                "1846pl9gxikycdvwfgy1gw41z0fx4ycjp5p4295v8k2pgvlqw8sa"))))
     (properties `((upstream-name . "RcppDE")))
     (build-system r-build-system)
     (propagated-inputs
@@ -5776,14 +5851,14 @@ data).  Weighted versions of MLE, MME and QME are available.")
 (define-public r-energy
   (package
     (name "r-energy")
-    (version "1.7-10")
+    (version "1.7-11")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "energy" version))
        (sha256
         (base32
-         "19xyw5bkyzfk22gly2ca2nsznqnrhaq4a77727kr1k26bj3y8gal"))))
+         "04b55ckmaqbnlpifg4w7smvly03kqycklvbg9x8d4yf902q8z7y2"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-boot r-gsl r-rcpp))
@@ -6181,6 +6256,38 @@ to access PostgreSQL database systems.")
     ;; under the PostgreSQL license.
     (license license:gpl2)))
 
+(define-public r-rpostgres
+  (package
+    (name "r-rpostgres")
+    (version "1.4.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "RPostgres" version))
+       (sha256
+        (base32
+         "1z6diaq4kwinl97d1v9cb96j8mrkj2s2v4ml1vykgy1jqi40dk69"))))
+    (properties `((upstream-name . "RPostgres")))
+    (build-system r-build-system)
+    (inputs (list postgresql))
+    (propagated-inputs
+     (list r-bit64
+           r-blob
+           r-dbi
+           r-hms
+           r-lubridate
+           r-plogr
+           r-rcpp
+           r-withr))
+    (native-inputs
+     (list pkg-config r-knitr))
+    (home-page "https://rpostgres.r-dbi.org")
+    (synopsis "Rcpp Interface to PostgreSQL")
+    (description
+     "This package provides a fully @code{DBI}-compliant @code{Rcpp}-backed
+interface to @code{PostgreSQL}, a relational database.")
+    (license license:gpl3)))
+
 (define-public r-linprog
   (package
     (name "r-linprog")
@@ -6269,14 +6376,14 @@ multivariate and 5 functional classification problems are included.")
 (define-public r-gower
   (package
     (name "r-gower")
-    (version "1.0.0")
+    (version "1.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gower" version))
        (sha256
         (base32
-         "0p9qx9aafkdm7wibfwk59jzw6vspsff6zwp84bc40lg0myxbf737"))))
+         "1z0mhfp8xp7rk9i820pkvspm6mwih24g6b5rqs63m37sbs79ssi9"))))
     (build-system r-build-system)
     (home-page "https://github.com/markvanderloo/gower")
     (synopsis "Gower's distance")
@@ -7367,14 +7474,14 @@ multivariate function estimation using smoothing splines.")
 (define-public r-cli
   (package
     (name "r-cli")
-    (version "3.4.1")
+    (version "3.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "cli" version))
        (sha256
         (base32
-         "0kklv5zy9rhly8fr7fdl3dlm3hr81yvbqd5cdz38b1lbzpxmwn0w"))))
+         "1p3gzq30f7hpr3v2s555z18r0y57zq2h03kijv7rl48lqzbnrjwc"))))
     (build-system r-build-system)
     (home-page "https://github.com/r-lib/cli#readme")
     (synopsis "Helpers for developing command line interfaces")
@@ -7641,13 +7748,13 @@ iVAT).")
 (define-public r-xfun
   (package
     (name "r-xfun")
-    (version "0.35")
+    (version "0.36")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "xfun" version))
        (sha256
-        (base32 "04x6y7f3f105fzxn2kzmvfz0zqf2v28g8aqnsln6q9n4lm74vz45"))))
+        (base32 "1vk930bn7rp2qp8yvmd9d3lgi10rgf20n62jr3lfwi6hf7jhs5x8"))))
     (build-system r-build-system)
     ;; knitr itself depends on xfun
     #;
@@ -7813,6 +7920,28 @@ annotation file.  This package is intended to be used as example data for
 packages that work with genomic data.")
    (license license:gpl2+)))
 
+(define-public r-piton
+  (package
+    (name "r-piton")
+    (version "1.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "piton" version))
+       (sha256
+        (base32 "1krf6zi238m275nxjlpyayv8y2drbgs2kg19dpkqm0lmlz5y5ar8"))))
+    (properties `((upstream-name . "piton")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-rcpp))
+    (home-page "https://github.com/Ironholds/piton")
+    (synopsis "Parsing expression grammars in Rcpp")
+    (description
+     "This package provides a wrapper around the Parsing Expression Grammar
+Template Library, a C++11 library for generating parsing expression grammars,
+that makes it accessible within Rcpp.  With this, developers can implement
+their own grammars and easily expose them in R packages.")
+    (license license:expat)))
+
 (define-public r-uuid
   (package
     (name "r-uuid")
@@ -10928,14 +11057,14 @@ references and Rd files.")
 (define-public r-officer
   (package
     (name "r-officer")
-    (version "0.4.4")
+    (version "0.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "officer" version))
        (sha256
         (base32
-         "1h6fcqw4bg644lwr5jggphyxp2d0ycya9q869z8099a50gc6h03f"))))
+         "19kms5pjgb5mjqyqzgnpykd5divbkrs5apz8z27ivgw78iizsqh6"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-r6 r-uuid r-xml2 r-zip))
@@ -17380,6 +17509,33 @@ library.")
 profiling R code.")
     (license license:gpl3)))
 
+(define-public r-prospectr
+  (package
+    (name "r-prospectr")
+    (version "0.2.6")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "prospectr" version))
+              (sha256
+               (base32
+                "1p53hcgcs2p09zhc2n7byjzrgvcgz6w7q00mlsn4kmnz7l4p7rrm"))))
+    (properties `((upstream-name . "prospectr")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-foreach
+           r-iterators
+           r-lifecycle
+           r-mathjaxr
+           r-rcpp
+           r-rcpparmadillo))
+    (home-page "https://github.com/l-ramirez-lopez/prospectr")
+    (synopsis "Functions for processing and sample selection of spectroscopic data")
+    (description
+     "@code{prospectr} provides miscellaneous functions to preprocess
+spectroscopic data and conduct representative sample selection, or calibration
+sampling.")
+    (license license:expat)))
+
 (define-public r-protviz
   (package
     (name "r-protviz")
@@ -18961,6 +19117,26 @@ methods.")
     ;; Any version of the GPL
     (license license:gpl2+)))
 
+(define-public r-unglue
+  (package
+    (name "r-unglue")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "unglue" version))
+       (sha256
+        (base32 "0w8ld4xllx0lj1jz8i2sj92f8136hlwri1d8ldpg1ymxj7aw93vg"))))
+    (properties `((upstream-name . "unglue")))
+    (build-system r-build-system)
+    (home-page "https://cran.r-project.org/package=unglue")
+    (synopsis "Extract matched substrings using a pattern")
+    (description
+     "This package lets you use syntax inspired by the package @code{glue} to
+extract matched substrings in a more intuitive and compact way than by using
+standard regular expressions.")
+    (license license:gpl3)))
+
 (define-public r-untb
   (package
     (name "r-untb")
@@ -20286,14 +20462,14 @@ package.")
 (define-public r-yulab-utils
   (package
     (name "r-yulab-utils")
-    (version "0.0.5")
+    (version "0.0.6")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "yulab.utils" version))
        (sha256
         (base32
-         "0sq5wc0mp84h6fs4wa2smvf7dcn0p0xarzb2ljvqc3p4vb2lvkbf"))))
+         "09bvj97xz9gishyhi1dzpjfl70v7xag8952fqfp60h18s6w52flp"))))
     (properties `((upstream-name . "yulab.utils")))
     (build-system r-build-system)
     (home-page "https://cran.r-project.org/package=yulab.utils")
@@ -24732,6 +24908,34 @@ dissimilarity useful for clustering mixed data, and, optionally, perform the
 clustering.")
     (license license:gpl2+)))
 
+(define-public r-treemap
+  (package
+    (name "r-treemap")
+    (version "2.4-3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "treemap" version))
+       (sha256
+        (base32 "1fg8gygw38x7msn32barx2irvcv8flm6wqvipnbj1qkh9w89y3q4"))))
+    (properties `((upstream-name . "treemap")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-colorspace
+           r-data-table
+           r-ggplot2
+           r-gridbase
+           r-igraph
+           r-rcolorbrewer
+           r-shiny))
+    (native-inputs (list r-knitr))
+    (home-page "https://cran.r-project.org/package=treemap")
+    (synopsis "Treemap visualization")
+    (description
+     "A treemap is a space-filling visualization of hierarchical structures.
+This package offers great flexibility to draw treemaps.")
+    (license license:gpl3+)))
+
 (define-public r-acrosstic
   (package
     (name "r-acrosstic")
@@ -27330,14 +27534,14 @@ output in R.")
 (define-public r-bdgraph
   (package
     (name "r-bdgraph")
-    (version "2.71")
+    (version "2.72")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "BDgraph" version))
        (sha256
         (base32
-         "1lihsbliq7f91ywdq5cabzd5fbyhb10h62ss3n2l7i2fdglb77d1"))))
+         "1kc3icd7glivbjlhl9fbmxqza5w2x000w0w8ii8np9gjrhdwrybw"))))
     (properties `((upstream-name . "BDgraph")))
     (build-system r-build-system)
     (propagated-inputs
@@ -28174,14 +28378,14 @@ Encyclopedia of Integer Sequences} (OEIS) in the function help page.")
 (define-public r-isoband
   (package
     (name "r-isoband")
-    (version "0.2.6")
+    (version "0.2.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "isoband" version))
        (sha256
         (base32
-         "18s3mdzl9y8v5fpvdy6iyqp3j57kw8bwhgan94373xjkaya61r17"))))
+         "0qfzkkvh4a97qlifhdqjgdnzmnph93qqyqsv5gg8cnxl8crj54vn"))))
     (properties `((upstream-name . "isoband")))
     (build-system r-build-system)
     (native-inputs
@@ -29935,14 +30139,14 @@ formal inference.")
 (define-public r-gaston
   (package
     (name "r-gaston")
-    (version "1.5.8")
+    (version "1.5.9")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gaston" version))
        (sha256
         (base32
-         "1pv37csq3gvkld7hfxgbq72n35gx1wg3bvrcvzzzf0qsfb6g42cc"))))
+         "1f4pr5s4p4rw1smvsh2gwjxp7hh43j1fpadl286ma9i62kirpyq7"))))
     (properties `((upstream-name . "gaston")))
     (build-system r-build-system)
     (inputs (list zlib))
@@ -30278,14 +30482,14 @@ censored data.")
 (define-public r-flexsurv
   (package
     (name "r-flexsurv")
-    (version "2.2")
+    (version "2.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "flexsurv" version))
        (sha256
         (base32
-         "0244amsyf2izih6008n2535r3ddksgdnys8pyslrcb1c09spmjrw"))))
+         "1xqsihvrb8b5mzkr3mhg0ydm8kkcw1k0kgp6ndyavw8yahl059as"))))
     (properties `((upstream-name . "flexsurv")))
     (build-system r-build-system)
     (propagated-inputs
@@ -31233,14 +31437,14 @@ thinking for the fun stuff.")
 (define-public r-tokenizers
   (package
     (name "r-tokenizers")
-    (version "0.2.3")
+    (version "0.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tokenizers" version))
        (sha256
         (base32
-         "01s2bx35r8kc7c68jnhcbrk963v2mhd21gmf630w7i4xnx46nvb2"))))
+         "0a8wm4cff3hrll991h2rimw79kpf2jsn78y7yksdk8m18931wmr4"))))
     (properties `((upstream-name . "tokenizers")))
     (build-system r-build-system)
     (propagated-inputs
@@ -31297,20 +31501,20 @@ vignettes in all common formats.")
 (define-public r-tidytext
   (package
     (name "r-tidytext")
-    (version "0.3.4")
+    (version "0.4.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tidytext" version))
        (sha256
         (base32
-         "0mk75wdiy4mixj1xlksw9ns4ajlj8ak90sgchjcg1zb90qp7gg56"))))
+         "1ywx4zhx1a0r1lyd11w3cbz33silpx5m1sk9rd3kvj21wvfdramk"))))
     (properties `((upstream-name . "tidytext")))
     (build-system r-build-system)
     (propagated-inputs
-     (list r-dplyr
+     (list r-cli
+           r-dplyr
            r-generics
-           r-hunspell
            r-janeaustenr
            r-lifecycle
            r-matrix
@@ -32499,13 +32703,13 @@ annealing.")
 (define-public r-mlr3tuning
   (package
     (name "r-mlr3tuning")
-    (version "0.17.1")
+    (version "0.17.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "mlr3tuning" version))
               (sha256
                (base32
-                "03habi7dm5xgwfb4zjn9nhvyym46qcljy31jz32fxalsap1mk9jb"))))
+                "1w08bwk843nfs3d810lnfh3wmd7gkq9141m7lcn9ail2x4ib91bb"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-bbotk
@@ -34394,14 +34598,14 @@ Tensorflow graphs.")
 (define-public r-tensorflow
   (package
     (name "r-tensorflow")
-    (version "2.9.0")
+    (version "2.11.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tensorflow" version))
        (sha256
         (base32
-         "12c6ndxx4g6fqjakpzp9pgl29ghswhqyr6q9jahpk0cawizh2znj"))))
+         "1nqb3vgsw1xrpi1skw6yqwgdri3i8d9np0jylzfj7plizx63z64b"))))
     (properties `((upstream-name . "tensorflow")))
     (build-system r-build-system)
     (inputs (list tensorflow))
@@ -34425,19 +34629,18 @@ between them.")
 (define-public r-keras
   (package
     (name "r-keras")
-    (version "2.9.0")
+    (version "2.11.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "keras" version))
        (sha256
         (base32
-         "06513d1fp7cxk4v03xm9lhgj6xmp9dqqvw3lnzwbzjwdkfj948yc"))))
+         "19r11mlxpdl09f7sfwzflnjhx2a6jgm57hjzg81pk8kprk4w7lvp"))))
     (properties `((upstream-name . "keras")))
     (build-system r-build-system)
     (propagated-inputs
-     (list r-ellipsis
-           r-generics
+     (list r-generics
            r-glue
            r-magrittr
            r-r6
diff --git a/gnu/packages/dlang.scm b/gnu/packages/dlang.scm
index 9a972182cc..462a61a29f 100644
--- a/gnu/packages/dlang.scm
+++ b/gnu/packages/dlang.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017, 2019, 2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
-;;; Copyright © 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2021-2023 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 ( <paren@disroot.org>
 ;;; Copyright © 2022 Esther Flashner <esther@flashner.co.il>
@@ -149,14 +149,14 @@ to a minimal test case.")
 (define ldc-bootstrap
   (package
     (name "ldc")
-    (version "1.27.1")
+    (version "1.30.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/ldc-developers/ldc/releases"
                            "/download/v" version "/ldc-" version "-src.tar.gz"))
        (sha256
-        (base32 "1775001ba6n8w46ln530kb5r66vs935ingnppgddq8wqnc0gbj4k"))))
+        (base32 "1kfs4fpr1525sv2ny10hlfppy8c075vjm8m649wr2b9411pkgfzx"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f                  ;skip in the bootstrap
@@ -190,10 +190,7 @@ to a minimal test case.")
        ("tzdata" ,tzdata)
        ("zlib" ,zlib)))
     (native-inputs
-     ;; Importing (gnu packages commencement) would introduce a cycle.
-     `(("ld-gold-wrapper" ,(module-ref (resolve-interface
-                                        '(gnu packages commencement))
-                                       'ld-gold-wrapper))
+     `(("lld-wrapper" ,(make-lld-wrapper lld-11 #:lld-as-ld? #t))
        ("llvm" ,llvm-11)
        ("ldc" ,gdmd)
        ("ninja" ,ninja)
@@ -260,7 +257,7 @@ bootstrapping more recent compilers written in D.")
                  ;; find the compiler-rt libraries they need to be linked with
                  ;; for the tests.
                  (substitute* (find-files "." "^ldc2.*\\.conf\\.in$")
-                   ((".*lib-dirs = \\[\n" all)
+                   ((".*LIB_SUFFIX.*" all)
                     (string-append all
                                    "        \"" clang-runtime
                                    "/lib/linux\",\n"))))))
@@ -294,12 +291,15 @@ bootstrapping more recent compilers written in D.")
                   ""))
                ;; The GDB tests suite fails; there are a few bug reports about
                ;; it upstream.
-               (for-each delete-file (find-files "tests" "gdb.*\\.(d|sh)$"))
+               (for-each delete-file (find-files "tests" "gdb.*\\.(c|d|sh)$"))
                (delete-file "tests/d2/dmd-testsuite/runnable/debug_info.d")
                (delete-file "tests/d2/dmd-testsuite/runnable/b18504.d")
                (substitute* "runtime/druntime/test/exceptions/Makefile"
                  ((".*TESTS\\+=rt_trap_exceptions_drt_gdb.*")
                   ""))
+               ;; Drop gdb_dflags from the test suite.
+               (substitute* "tests/d2/CMakeLists.txt"
+                 (("\\$\\{gdb_dflags\\}") ""))
                ;; The following tests fail on some systems, not all of
                ;; which are tested upstream.
                (with-directory-excursion "tests"
@@ -346,7 +346,8 @@ bootstrapping more recent compilers written in D.")
                    (invoke "ctest" "--output-on-failure" "-j" job-count
                            "-R" "lit-tests")
                    (display "running the dmd test suite...\n")
-                   (invoke "ctest" "--output-on-failure" "-j" job-count
+                   ;; This test has a race condition so run it with 1 core.
+                   (invoke "ctest" "--output-on-failure" "-j" "1"
                            "-R" "dmd-testsuite")
                    (display "running the defaultlib unit tests and druntime \
 integration tests...\n")
@@ -412,20 +413,20 @@ needed.")
 (define-public gtkd
   (package
     (name "gtkd")
-    (version "3.9.0")
+    (version "3.10.0")
     (source
      (origin
       (method url-fetch/zipbomb)
       (uri (string-append "https://gtkd.org/Downloads/sources/GtkD-"
                           version ".zip"))
       (sha256
-       (base32 "0qv8qlpwwb1d078pnrf0a59vpbkziyf53cf9p6m8ms542wbcxllp"))))
+       (base32 "0vc5ssb3ar02mg2pngmdi1xg4qjaya8332a9mk0sv97x6b4ddy3g"))))
     (build-system gnu-build-system)
     (native-inputs
-     `(("unzip" ,unzip)
-       ("ldc" ,ldc)
-       ("pkg-config" ,pkg-config)
-       ("xorg-server-for-tests" ,xorg-server-for-tests)))
+     (list unzip
+           ldc
+           pkg-config
+           xorg-server-for-tests))
     (arguments
      `(#:test-target "test"
        #:make-flags
@@ -443,13 +444,12 @@ needed.")
                (("default-goal: libs test") "default-goal: libs")
                (("all: libs shared-libs test") "all: libs shared-libs")
                ;; Work around upstream bug.
-               (("\\$\\(prefix\\)\\/\\$\\(libdir\\)") "$(libdir)"))
-             #t))
-         (add-before 'check 'prepare-x
+               (("\\$\\(prefix\\)\\/\\$\\(libdir\\)") "$(libdir)"))))
+         (add-before 'check 'pre-check
            (lambda _
              (system "Xvfb :1 &")
              (setenv "DISPLAY" ":1")
-             #t)))))
+             (setenv "CC" ,(cc-for-target)))))))
     (home-page "https://gtkd.org/")
     (synopsis "D binding and OO wrapper of GTK+")
     (description "This package provides bindings to GTK+ for D.")
diff --git a/gnu/packages/education.scm b/gnu/packages/education.scm
index c6829738c4..78e70bf27c 100644
--- a/gnu/packages/education.scm
+++ b/gnu/packages/education.scm
@@ -384,8 +384,8 @@ to open the application in a web browser, for offline usage.")
        (method url-fetch)
        (uri (list
              ;; XXX: Upstream does not exist anymore.
-             (string-append "http://www.bipede.fr/downloads/logiciels/"
-                            "ToutEnClic-" version "-src.zip")
+             ;; (string-append "http://www.bipede.fr/downloads/logiciels/"
+             ;;                "ToutEnClic-" version "-src.zip")
              (string-append "https://archive.org/download/tout-en-clic-" version
                             "-src/ToutEnClic-" version "-src.zip")))
        (sha256
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index fb4c9b70f9..12ee83104b 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2016, 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016, 2017 Nikita <nikita@n0.is>
 ;;; Copyright © 2016, 2019 Alex Griffin <a@ajgrf.com>
-;;; Copyright © 2016-2022 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2016-2023 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2016, 2017, 2018 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2016-2022 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
@@ -81,7 +81,7 @@
 ;;; Copyright © 2020, 2021, 2022 Niklas Eklund <niklas.eklund@posteo.net>
 ;;; Copyright © 2020 Marco Grassi <marco.au.grassi98@protonmail.com>
 ;;; Copyright © 2020 Tomás Ortín Fernández <tomasortin@mailbox.org>
-;;; Copyright © 2020, 2021 Zhu Zihao <all_but_last@163.com>
+;;; Copyright © 2020-2022 Zhu Zihao <all_but_last@163.com>
 ;;; Copyright © 2020 Adam Kandur <rndd@tuta.io>
 ;;; Copyright © 2020 Tim Howes <timhowes@lavabit.com>
 ;;; Copyright © 2020 Noah Landis <noahlandis@posteo.net>
@@ -261,7 +261,7 @@
 (define-public emacs-geiser
   (package
     (name "emacs-geiser")
-    (version "0.28.1")
+    (version "0.28.2")
     (source
      (origin
        (method git-fetch)
@@ -270,7 +270,7 @@
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "111as99278vbv6pwj8rpl308g327f8iznnrz71mngl6d5mr0xpa1"))))
+        (base32 "01sif1pw3shhdzcg9vidc2j5cqmrgjh5kynicf5mh3kmlvvsg9k6"))))
     (build-system emacs-build-system)
     (arguments
      '(#:phases
@@ -647,6 +647,26 @@ current buffer.")
        "Abstract Emacs Lisp framework for tree navigation.")
       (license license:gpl3+))))
 
+(define-public emacs-hide-lines
+  (package
+    (name "emacs-hide-lines")
+    (version "20210513.1636")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/vapniks/hide-lines.git")
+                    (commit "f0828c15e50db5eddb905de783e7683b04d1eca3")))
+              (sha256
+               (base32
+                "1pw0wp1pzy6snycvz12nj0q7jxxj07h3lqas184w44nhrira7qhj"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/vapniks/hide-lines")
+    (synopsis "Commands for hiding lines based on a regexp")
+    (description
+     "This package provides commands to hide lines based on a regular
+expression.")
+    (license license:gpl3+)))
+
 (define-public emacs-hgignore-mode
   ;; From 2021-03-14.
   ;; No releases available.
@@ -673,6 +693,33 @@ editing @file{.hgignore} files used by the Mercurial version control
 system.")
       (license license:gpl3+))))
 
+(define-public emacs-hsluv
+  (package
+    (name "emacs-hsluv")
+    (version "20181127.1206")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/hsluv/hsluv-emacs.git")
+                    (commit "c3bc5228e30d66e7dee9ff1a0694c2b976862fc0")))
+              (sha256
+               (base32
+                "19q8qlq4s2kfydpadkq1zd92611dvq7dr8vlhlbd9gplzpx7dhfd"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-seq))
+    (home-page "https://github.com/hsluv/hsluv-emacs")
+    (synopsis "HSLuv color space conversions")
+    (description
+     "This package provides an elisp implementation of the HSLUV colorspace
+conversions documented on @url{http://www.hsluv.org/}.  HSLuv is a
+human-friendly alternative to HSL.  CIELUV is a color space designed for
+perceptual uniformity based on human experiments.  When accessed by polar
+coordinates, it becomes functionally similar to HSL with a single problem: its
+chroma component doesn't fit into a specific range.  HSLuv extends CIELUV with
+a new saturation component that allows you to span all the available chroma as
+a neat percentage.")
+    (license license:expat)))
+
 (define-public emacs-platformio-mode
   (package
     (name "emacs-platformio-mode")
@@ -3733,7 +3780,7 @@ be regarded as @code{emacs-company-quickhelp} for @code{emacs-corfu}.")
 (define-public emacs-cape
   (package
     (name "emacs-cape")
-    (version "0.11")
+    (version "0.12")
     (source
      (origin
        (method git-fetch)
@@ -3742,7 +3789,7 @@ be regarded as @code{emacs-company-quickhelp} for @code{emacs-corfu}.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0z6ixw7gsx1g7x2xpj5ilslrjrlp6x2ynzh731hs3yf3n281715b"))))
+        (base32 "1855wi6ghi42ngjq3qyjr3p1nc57s257v9c98wqmb2n6vca5p2lp"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/minad/cape")
     (synopsis "Completion at point extensions for Emacs")
@@ -7412,14 +7459,14 @@ user.")
 (define-public emacs-subed
   (package
     (name "emacs-subed")
-    (version "1.0.28")
+    (version "1.0.29")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://elpa.nongnu.org/nongnu/subed-"
                                   version ".tar"))
               (sha256
                (base32
-                "0z1bxg5sqvvm9zblbjyfp5llq0v1pkjq9c7ygais8ad68ck1b51f"))))
+                "0q2sfdypj929y4fllk97rsb2bxm9a1izjy1f0z2viz5hz0hpqp26"))))
     (arguments
      (list
       #:tests? #t
@@ -8053,7 +8100,7 @@ features:
 (define-public emacs-company-math
   (package
     (name "emacs-company-math")
-    (version "1.5")
+    (version "1.5.1")
     (source
      (origin
        (method git-fetch)
@@ -8062,10 +8109,10 @@ features:
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "010p3rhb7win6ndx3ilz2lcg69d2qyxfvpi0hcid2srzxffpwn3i"))))
+        (base32 "1pj10i7ml5d2spcmf8035ngcq5zc6rs3lqx09d0qj6bsghglr6j3"))))
     (build-system emacs-build-system)
     (propagated-inputs
-     (list emacs-math-symbol-lists emacs-company))
+     (list emacs-company emacs-math-symbol-lists))
     (home-page "https://github.com/vspinu/company-math")
     (synopsis "Completion backends for math symbols and @code{LaTeX} tags")
     (description
@@ -10167,7 +10214,7 @@ interface.")
   (let ((commit "004cee6b8e01f8eb0cb1c683d0a637b14890600f"))
     (package
       (name "emacs-orderless")
-      (version "0.8")
+      (version "1.0")
       (source
        (origin
          (method git-fetch)
@@ -10368,6 +10415,37 @@ call.")
 library with Eglot instead of Yasnippet.")
       (license license:gpl3+))))
 
+(define-public emacs-consult-xdg-recent-files
+  (let ((commit "593023ffb99a368152ebd4e739488fa560bdfdea")
+        (revision "0"))
+    (package
+      (name "emacs-consult-xdg-recent-files")
+      (version (git-version "0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/hrehfeld/consult-xdg-recent-files")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0nd23n67dmlflw52dc1rbhy04mc9ymydnsmvfr75hqb7sznn3343"))))
+      (build-system emacs-build-system)
+      (propagated-inputs (list emacs-consult))
+      (home-page "https://github.com/hrehfeld/consult-xdg-recent-files")
+      (synopsis "Include files used by other programs than Emacs in Consult")
+      (description
+       "This package provides the ability to include files used by other
+programs in the candidate lists of commands like @code{consult-recent-file}
+and @code{consult-buffer}.  This allows to use the same interface for file
+opening.
+
+On systems that comply with the XDG specification, these files are listed in
+the file @file{recently-used.xbel}, which is found in the directory
+@file{~/.local/share} or the location described by the environment variable
+@code{XDG_DATA_HOME}.")
+      (license license:gpl3+))))
+
 (define-public emacs-consult-yasnippet
   (let ((commit "ae0450889484f23dc4ec37518852a2c61b89f184")
         (revision "0"))
@@ -15471,7 +15549,7 @@ been adapted to also work with mu4e.")
 (define-public emacs-tempel
   (package
     (name "emacs-tempel")
-    (version "0.5")
+    (version "0.6")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -15480,7 +15558,7 @@ been adapted to also work with mu4e.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1za73zszj373r8pxf89cwwfrwsf8dy6nxciw11adcccrm92xwdsz"))))
+                "1jgsjhrfdd72a0na4s1qp8yc24mbgrpxkv8yqac0vgqipg98cdg6"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/minad/tempel")
     (synopsis "Simple templates for Emacs")
@@ -15489,6 +15567,29 @@ been adapted to also work with mu4e.")
 the Emacs Tempo library.  You may also write your templates in Lisp.")
     (license license:gpl3+)))
 
+(define-public emacs-tempel-collection
+  (let ((commit "cd9529b2a2fdfd49010117d2a1fc49adf9725051")
+        (revision "0"))
+    (package
+      (name "emacs-tempel-collection")
+      (version (git-version "0.1" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/Crandel/tempel-collection")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "02x6jq5k7fa46ni64qf8wrmkay6zfbmkildb727zs6wchmyg2znn"))))
+      (build-system emacs-build-system)
+      (propagated-inputs (list emacs-tempel))
+      (home-page "https://github.com/Crandel/tempel-collection")
+      (synopsis "Collection of TempEl templates")
+      (description "This package provides a collection of templates for
+the Emacs TempEl package.")
+      (license license:gpl3+))))
+
 (define-public emacs-yasnippet
   (package
     (name "emacs-yasnippet")
@@ -16502,13 +16603,13 @@ containing words from the Rime project.")
 (define-public emacs-pyim
   (package
     (name "emacs-pyim")
-    (version "5.2.8")
+    (version "5.2.9")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://elpa.gnu.org/packages/pyim-" version ".tar"))
        (sha256
-        (base32 "1klarzr5lfga09ysq3c7gkgmzl6r08gpl4519x5damxd82x4r3y2"))))
+        (base32 "0blsz344jq1zx4qs73zinb8fhh2a35k5nx12i2wn76902qx2qc6j"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-async emacs-popup emacs-posframe emacs-xr))
@@ -17916,7 +18017,7 @@ multiplexer.")
 (define-public emacs-plz
   (package
     (name "emacs-plz")
-    (version "0.2.1")
+    (version "0.3")
     (source
      (origin
        (method git-fetch)
@@ -17925,7 +18026,7 @@ multiplexer.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0p0xd532xa8icysyxwqk481lr9xanmp68gf97fd9n2936gp12chv"))))
+        (base32 "1ack4rajjdmb3fqz5v394rqpvn9mfvbkrxra27yrcqz97mma1ki7"))))
     (build-system emacs-build-system)
     (inputs (list curl))
     (arguments
@@ -22179,7 +22280,7 @@ powerful Org contents.")
 (define-public emacs-org-re-reveal
   (package
     (name "emacs-org-re-reveal")
-    (version "3.16.1")
+    (version "3.17.0")
     (source
      (origin
        (method git-fetch)
@@ -22188,7 +22289,7 @@ powerful Org contents.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1jzr7xlzinhfb0197anbkrr5zrs13f7kyznr5q3zyxdndhg6a53n"))))
+        (base32 "1bp3kz2awy2mizs59qsa2yl7wfa0197fklnramzifz6z2zv5kbrx"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-htmlize emacs-org))
@@ -26458,7 +26559,7 @@ comments.")
 (define-public emacs-libmpdel
   (package
     (name "emacs-libmpdel")
-    (version "1.3.1")
+    (version "2.0.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -26467,7 +26568,7 @@ comments.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0fsg2si7afrnsz91i0ziza6nbc4ds9kpnr2z71wf6896zb1afhfx"))))
+                "03bavca89cf7dsjmg7hb48qnvca41ndiij33iw5yjjhbq1zyj8r4"))))
     (build-system emacs-build-system)
     (arguments
      (list
@@ -26538,13 +26639,57 @@ developers to define user-interfaces based on tablists (also known as
 tabulated-lists).")
     (license license:gpl3+)))
 
+(define-public emacs-eat
+  (package
+    (name "emacs-eat")
+    (version "0.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://codeberg.org/akib/emacs-eat")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0zs1fwbapgsap8vai97f1inginb896gl15kyjm521nvaywk4rc12"))
+       (modules '((guix build utils)))
+       (snippet
+        #~(begin
+            ;; Remove generated terminfo database.
+            (delete-file-recursively "terminfo")))))
+    (build-system emacs-build-system)
+    (arguments
+     (list
+      #:tests? #t
+      #:include #~(cons* "^term/"
+                         "^terminfo/"
+                         "^integration/"
+                         "\\.ti$"
+                         %default-include)
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'install 'build-info
+            (lambda _
+              (invoke "make" "info")))
+          (add-before 'install 'build-terminfo-database
+            (lambda _
+              (invoke "make" "terminfo"))))))
+    (native-inputs
+     (list ncurses texinfo))
+    (home-page "https://codeberg.org/akib/emacs-eat")
+    (synopsis "Terminal emulator in Emacs")
+    (description
+     "Eat (Emulate A Terminal) is a terminal emulator in Emacs, written in
+pure Elisp.  It has features like complete mouse support and shell
+integration.")
+    (license license:gpl3+)))
+
 (define-public emacs-vterm
-  (let ((version "0.0.1")
-        (revision "1")
-        (commit "b44723552f86407d528c4a6c8057382c061b008e"))
+  (let ((commit "e19dc2bb9859a75616bf068c341a540d0d329e4d"))
     (package
       (name "emacs-vterm")
-      (version (git-version version revision commit))
+      (version "0.0.2")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -26553,7 +26698,7 @@ tabulated-lists).")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "0rq2skwylvc7s4vfpbbsdykws4akyp9sc6xgrh2ql5yydhhnv2h3"))))
+                  "0iqlzpy83ra6xz406fmddfj72bmkdb5b1j59m1dbxf3wxn55320d"))))
       (build-system emacs-build-system)
       (arguments
        `(#:modules ((guix build emacs-build-system)
@@ -28911,7 +29056,7 @@ well as an option for visually flashing evaluated s-expressions.")
 (define-public emacs-counsel-tramp
   (package
     (name "emacs-counsel-tramp")
-    (version "0.7.5")
+    (version "0.7.6")
     (source
      (origin
        (method git-fetch)
@@ -28920,7 +29065,7 @@ well as an option for visually flashing evaluated s-expressions.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "18qlwyjqxap2qfbz14ma6yqp4p3v4q2y8idc355s4szjdd2as2lr"))))
+        (base32 "02dhchmyaqv6855mafjxizzgpl32rmnwdmw0nbm6rkckr13cgjl1"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-counsel))
@@ -28933,14 +29078,14 @@ well as an option for visually flashing evaluated s-expressions.")
 (define-public emacs-tramp
   (package
     (name "emacs-tramp")
-    (version "2.5.4")
+    (version "2.6.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://elpa.gnu.org/packages/"
                            "tramp-" version ".tar"))
        (sha256
-        (base32 "1ap2niqskbj81xqhdi4lzh3646g9rwh3iw5qgyl3fw7cfq945fsl"))))
+        (base32 "1y58k0qdc9i3av61p9ks7hg5vynsi2zslv5mswcbd1wf23iggr7c"))))
     (build-system emacs-build-system)
     (arguments
      (list
@@ -30075,6 +30220,28 @@ challenge the three computer opponents in one player mode.  You can
 even train opponent slimes.")
     (license license:gpl3+)))
 
+(define-public emacs-syslog-mode
+  (package
+    (name "emacs-syslog-mode")
+    (version "20210910.1952")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/vapniks/syslog-mode.git")
+                    (commit "072664784dae41a573a9de8d178bf577b7526b82")))
+              (sha256
+               (base32
+                "04ddpn6il6mh1f992x3fxl6yljryghi51q4845lx08cbc74wnfz0"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-hide-lines emacs-ov emacs-hsluv))
+    (home-page "https://github.com/vapniks/syslog-mode")
+    (synopsis "Major-mode for viewing log files and strace output")
+    (description "This library provides a major-mode for viewing syslog and
+strace files.  You can highlight and filter the lines of the file by regular
+expressions and by timestamp, view notes associated with files, extract text,
+count matches, etc.")
+    (license license:gpl3+)))
+
 (define-public emacs-systemd-mode
   (package
     (name "emacs-systemd-mode")
@@ -30295,7 +30462,7 @@ Emacs that integrate with major modes like Org-mode.")
 (define-public emacs-modus-themes
   (package
     (name "emacs-modus-themes")
-    (version "3.0.0")
+    (version "4.0.1")
     (source
      (origin
        (method git-fetch)
@@ -30304,7 +30471,7 @@ Emacs that integrate with major modes like Org-mode.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1468y1ra4w4ihq68mfvddyijppj5sz143aawzg2nxdzphy9a84l2"))))
+        (base32 "16m8y56jyf44rj541fqb243pmbz9bk5py5zl1xhzal4fsk5bsfrg"))))
     (native-inputs (list texinfo))
     (build-system emacs-build-system)
     (arguments
@@ -30321,17 +30488,19 @@ Emacs that integrate with major modes like Org-mode.")
               (install-file "doc/modus-themes.info"
                             (string-append #$output "/share/info")))))))
     (home-page "https://protesilaos.com/modus-themes/")
-    (synopsis "Accessible themes (WCAG AAA)")
+    (synopsis "Accessible themes for Emacs (WCAG AAA standard)")
     (description
      "The Modus themes are designed for accessible readability.  They conform
 with the highest standard for color contrast between any given combination of
 background and foreground values.  This corresponds to the WCAG AAA standard,
 which specifies a minimum rate of distance in relative luminance of 7:1.
 
-Modus Operandi (modus-operandi) is a light theme, while Modus
-Vivendi (modus-vivendi) is dark.  Each theme’s color palette is designed to
-meet the needs of the numerous interfaces that are possible in the Emacs
-computing environment.")
+The Modus themes consist of six themes.  Modus Operandi is a light theme,
+while Modus Vivendi is dark.  Modus Operandi Tinted and Modus Vivendi Tinted
+are variants of the two main themes.  They slightly tone down the intensity of
+the background and provide a bit more color variety.  Modus Operandi
+Deuteranopia and its companion Modus Vivendi Deuteranopia are optimized for
+users with red-green color deficiency.")
     (license (list license:gpl3+
                    license:fdl1.3+)))) ; GFDLv1.3+ for the manual
 
@@ -30832,7 +31001,7 @@ icon support, git integration, and several other utilities.")
 (define-public emacs-mood-line
   (package
     (name "emacs-mood-line")
-    (version "2.0.0")
+    (version "2.1.0")
     (source
      (origin
        (method git-fetch)
@@ -30841,7 +31010,7 @@ icon support, git integration, and several other utilities.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0g29di2g8w8639z8d73kq9x2p8krzmjfn1bqd5jsv28v77j80k8h"))))
+        (base32 "1j2fjsqbv2f7m1hrrb18gl4cj4kn749xkvpm2p82d7rh4a37q2pr"))))
     (build-system emacs-build-system)
     (home-page "https://gitlab.com/jessieh/mood-line")
     (synopsis "Minimal mode-line for Emacs")
@@ -34039,7 +34208,7 @@ Fennel code within Emacs.")
 (define-public emacs-org-modern
   (package
    (name "emacs-org-modern")
-   (version "0.6")
+   (version "0.7")
    (source
      (origin
        (method git-fetch)
@@ -34047,7 +34216,7 @@ Fennel code within Emacs.")
              (url "https://github.com/minad/org-modern")
              (commit version)))
        (sha256
-        (base32 "03zpwb475rpbhq1s6101clj0j9mcxdg033clvvybp0p7hm4inwaz"))
+        (base32 "0bqps8dpvqd2dfw3bamnnf1ikvd48vn8hgb08975f0wski54xh5n"))
        (file-name (git-file-name name version))))
    (build-system emacs-build-system)
    (home-page "https://github.com/minad/org-modern")
@@ -34152,7 +34321,7 @@ hacker.")
 (define-public emacs-osm
   (package
     (name "emacs-osm")
-    (version "0.8")
+    (version "0.9")
     (home-page "https://github.com/minad/osm")
     (source (origin
               (method git-fetch)
@@ -34162,7 +34331,7 @@ hacker.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "039ac364f00slx1dxxgsgfcr4x47v9ymn8arcs0fyhdhw7jnky5j"))))
+                "0iacf3mqjq8vfhd0nyzry0spishyvn92zgd55ivqxb9xfdr3lx9x"))))
     (build-system emacs-build-system)
     (arguments
      (list #:phases #~(modify-phases %standard-phases
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index b995366978..ac6f18d879 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -3363,7 +3363,9 @@ visualization, matrix manipulation.")
            pango
            tbb
            eudev
-           wxwidgets
+           ;; prusa-slicer 2.5 segfaults on startup with wxwidgets 3.2
+           ;; See https://github.com/prusa3d/PrusaSlicer/issues/8299
+           wxwidgets-3.0
            zlib))
     (home-page "https://www.prusa3d.com/prusaslicer/")
     (synopsis "G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)")
diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index 57a25a0d90..3d45634169 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -1766,3 +1766,27 @@ and modifying @acronym{UDF, Universal Disk Format} file systems.
 and other optical media.  It supports read-only media (DVD/CD-R)
 and rewritable media that wears out (DVD/CD-RW).")
     (license license:gpl2+)))
+
+(define-public fuse-overlayfs
+  (package
+    (name "fuse-overlayfs")
+    (version "1.10")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/containers/fuse-overlayfs")
+                    (commit (string-append "v" version))))
+              (sha256
+               (base32
+                "085hrz0nrdsjfjci0z2qfyqrydn8wwdp790dx2x67hwdw1kib3wp"))
+              (file-name (git-file-name name version))))
+    (build-system gnu-build-system)
+    (native-inputs
+     (list automake autoconf libtool pkg-config))
+    (inputs
+     (list fuse-3))
+    (home-page "https://github.com/containers/fuse-overlayfs")
+    (synopsis "FUSE implementation of overlayfs")
+    (description "This package provides an implementation of overlay+shiftfs
+in FUSE for rootless containers.")
+    (license license:gpl3)))
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 8fec474d0b..0f96784dd3 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -1194,93 +1194,61 @@ interface (API).")
 (define-public python-pygame
   (package
     (name "python-pygame")
-    (version "1.9.4")
+    (version "2.1.2")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "pygame" version))
               (sha256
                (base32
-                "1dn0nb86jl7yr8709cncxdr0yrmviqakw7zx3g8jbbwrr60if3bh"))))
+                "0g6j79naab7583kymf1bgxc5l5c9h5laq887rmvh8vw8iyifrl6n"))))
     (build-system python-build-system)
     (arguments
-     `(#:tests? #f                ; tests require pygame to be installed first
-       #:phases
-       (modify-phases %standard-phases
-         ;; Set the paths to the dependencies manually because
-         ;; the configure script does not allow passing them as
-         ;; parameters.  This also means we can skip the configure
-         ;; phase.
-         (add-before 'build 'set-library-paths
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((sdl-ref   (assoc-ref inputs "sdl"))
-                   (font-ref  (assoc-ref inputs "sdl-ttf"))
-                   (image-ref (assoc-ref inputs "sdl-image"))
-                   (mixer-ref (assoc-ref inputs "sdl-mixer"))
-                   (smpeg-ref (assoc-ref inputs "libsmpeg"))
-                   (png-ref   (assoc-ref inputs "libpng"))
-                   (jpeg-ref  (assoc-ref inputs "libjpeg"))
-                   (freetype-ref (assoc-ref inputs "freetype"))
-                   (v4l-ref   (assoc-ref inputs "v4l-utils"))
-                   (out-ref   (assoc-ref outputs "out")))
-               (substitute* "Setup.in"
-                 (("SDL = -I/usr/include/SDL")
-                  (string-append "SDL = -I" sdl-ref "/include/SDL -I.")))
-               (substitute* "Setup.in"
-                 (("FONT = -lSDL_ttf")
-                  (string-append "FONT = -I" font-ref "/include/SDL -L"
-                                 font-ref "/lib -lSDL_ttf")))
-               (substitute* "Setup.in"
-                 (("IMAGE = -lSDL_image")
-                  (string-append "IMAGE = -I" image-ref "/include/SDL -L"
-                                 image-ref "/lib -lSDL_image")))
-               (substitute* "Setup.in"
-                 (("MIXER = -lSDL_mixer")
-                  (string-append "MIXER = -I" mixer-ref "/include/SDL -L"
-                                 mixer-ref "/lib -lSDL_mixer")))
-               (substitute* "Setup.in"
-                 (("SMPEG = -lsmpeg")
-                  (string-append "SMPEG = -I" smpeg-ref "/include/smpeg -L"
-                                 smpeg-ref "/lib -lsmpeg")))
-               (substitute* "Setup.in"
-                 (("PNG = -lpng")
-                  (string-append "PNG = -I" png-ref "/include -L"
-                                 png-ref "/lib -lpng")))
-               (substitute* "Setup.in"
-                 (("JPEG = -ljpeg")
-                  (string-append "JPEG = -I" jpeg-ref "/include -L"
-                                 jpeg-ref "/lib -ljpeg")))
-
-               (substitute* "Setup.in"
-                 (("FREETYPE = -lfreetype")
-                  (string-append "FREETYPE = -I" freetype-ref "/include/freetype2 -L"
-                                 freetype-ref "/lib -lfreetype")))
-
-               (substitute* "Setup.in"
-                 (("^pypm") "#pypm"))
-               ;; Create a path to a header file provided by v4l-utils.
-               (system* "mkdir" "linux")
-               (system* "ln" "--symbolic"
-                        (string-append v4l-ref "/include/libv4l1-videodev.h")
-                        "linux/videodev.h")
-               (system* "ln" "--symbolic" "Setup.in" "Setup")))))))
+     (list
+      #:tests? #f                 ; tests require pygame to be installed first
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-build-config
+            (lambda _
+              (substitute* "buildconfig/config_unix.py"
+                (("origincdirs = \\[.*\\]")
+                 "origincdirs = os.environ['C_INCLUDE_PATH'].split(\":\")")
+                (("ORIGLIBDIRS") "LIBRARY_PATH")
+                (("incdirs = \\[\\]") "incdirs = origincdirs")
+                (("libdirs = \\[\\]") "libdirs = origlibdirs"))))
+          (add-after 'unpack 'fix-sdl2-headers
+            (lambda _
+              (substitute* "buildconfig/config_unix.py"
+                (("SDL_ttf.h") "SDL2/SDL_ttf.h")
+                (("SDL_image.h") "SDL2/SDL_image.h")
+                (("SDL_mixer.h") "SDL2/SDL_mixer.h"))
+              (substitute* "src_c/imageext.c"
+                (("SDL_image.h") "SDL2/SDL_image.h"))
+              (substitute* "src_c/font.h"
+                (("SDL_ttf.h") "SDL2/SDL_ttf.h"))
+              (substitute* "src_c/mixer.h"
+                (("SDL_mixer.h") "SDL2/SDL_mixer.h"))
+              (substitute* "src_c/_sdl2/mixer.c"
+                (("SDL_mixer.h") "SDL2/SDL_mixer.h")))))))
+    (native-inputs
+     (list pkg-config))
     (inputs
-     `(("freetype" ,freetype)
-       ("sdl" ,sdl)
-       ("sdl-image" ,sdl-image)
-       ("sdl-mixer" ,sdl-mixer)
-       ("sdl-ttf" ,sdl-ttf)
-       ("sdl-gfx" ,sdl-gfx)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libpng" ,libpng)
-       ("libX11" ,libx11)
-       ("libsmpeg" ,libsmpeg)
-       ("portmidi" ,portmidi)
-       ("v4l-utils" ,v4l-utils)))
+     (list freetype
+           sdl2
+           sdl2-image
+           sdl2-mixer
+           sdl2-ttf
+           sdl2-gfx
+           libjpeg-turbo
+           libpng
+           libx11
+           libsmpeg
+           portmidi
+           v4l-utils))
     (home-page "https://www.pygame.org")
     (synopsis "SDL wrapper for Python")
     (description "Pygame is a set of Python modules designed for writing games.
-Pygame adds functionality on top of the excellent SDL library. This allows you
-to create fully featured games and multimedia programs in the python language.")
+It adds functionality on top of the SDL library, allowing you to create games
+and multimedia programs in the Python language.")
     (license (list license:bsd-2
                    ;; python numeric license as listed by Debian looks like
                    ;; an Expat-style license with a warranty disclaimer for
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 19c689dee1..e0660ba850 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -7930,7 +7930,7 @@ ncurses for text display.")
 (define-public naev
   (package
     (name "naev")
-    (version "0.10.0")
+    (version "0.10.1")
     (source
      (origin
        (method git-fetch)
@@ -7940,7 +7940,7 @@ ncurses for text display.")
              (recursive? #t))) ; for game data
        (file-name (git-file-name name version))
        (sha256
-        (base32 "183dbi4a91xggxm1rmn7vr8rq519yz7b3zhrd03azsg6fxylv9wn"))))
+        (base32 "0kvfv2ra0jq1ggf4apsx1j1xhrhjz3fn1j8p4q3a9c4m19fq4qzr"))))
     (build-system meson-build-system)
     (arguments
      ;; XXX: Do not add debugging symbols, which cause the build to fail.
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 2078e91c23..47a0f237fe 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -13160,7 +13160,7 @@ profiler via Sysprof, debugging support, and more.")
 (define-public komikku
   (package
     (name "komikku")
-    (version "1.4.0")
+    (version "1.6.1")
     (source
      (origin
        (method git-fetch)
@@ -13170,7 +13170,7 @@ profiler via Sysprof, debugging support, and more.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1sawvmni28qnca8lmw6li3ad36lb7sbf22zqbzp5f9wjwx7q609k"))))
+         "0ppd9cl16zwqsmpy0pry43qsfrm2xal77y4339qwbnas74gcl1wh"))))
     (build-system meson-build-system)
     (arguments
      (list
@@ -13209,6 +13209,7 @@ profiler via Sysprof, debugging support, and more.")
            python-brotli
            python-cloudscraper
            python-dateparser
+           python-emoji
            python-keyring
            python-lxml
            python-magic
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 50872b3f36..9c94764ab3 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -4308,7 +4308,7 @@ over, or update a value in arbitrary data structures.")
 (define-public guile-xapian
   (package
     (name "guile-xapian")
-    (version "0.2.0")
+    (version "0.3.0")
     (home-page "https://git.systemreboot.net/guile-xapian")
     (source
      (origin
@@ -4318,7 +4318,7 @@ over, or update a value in arbitrary data structures.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "140cwzpzk4y16ajxrg5zd2d7q60f5ivx5jk8w1h0qfjq2mp14sh7"))))
+         "0k18navsd0rqx2zbqgvhzscvbls2sxs9k06n195s4bvyd50acfm5"))))
     (build-system gnu-build-system)
     (arguments
      '(#:make-flags '("GUILE_AUTO_COMPILE=0"))) ; to prevent guild warnings
@@ -4331,6 +4331,8 @@ over, or update a value in arbitrary data structures.")
            libtool
            pkg-config
            swig))
+    (propagated-inputs
+     (list guile-lib))
     (synopsis "Guile bindings for Xapian")
     (description "@code{guile-xapian} provides Guile bindings for Xapian, a
 search engine library.  Xapian is a highly adaptable toolkit which allows
diff --git a/gnu/packages/hardware.scm b/gnu/packages/hardware.scm
index f73896460b..81f38d069b 100644
--- a/gnu/packages/hardware.scm
+++ b/gnu/packages/hardware.scm
@@ -491,6 +491,22 @@ RGB animations.")
        (sha256
         (base32 "0hm0cm4m4hk1jjy7kddg613mynvwlii3kp8al0j9v3c6mcx3p4mx"))))
     (build-system gnu-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'install 'install-udev-rules
+            (lambda* (#:key outputs #:allow-other-keys)
+              ;; Move the udev rules to their expected location in Guix
+              ;; System, so they can be more easily used.
+              (let ((rules.d (string-append #$output "/lib/udev/rules.d")))
+                (mkdir-p (dirname rules.d))
+                (rename-file (string-append #$output "/share/ddcutil/data")
+                             rules.d)
+                ;; Patch a reference to the ddcutil command.
+                (substitute* (string-append rules.d "/45-ddcutil-usb.rules")
+                  (("/usr/bin/ddcutil")
+                   (search-input-file outputs "bin/ddcutil")))))))))
     (native-inputs
      (list pkg-config))
     (inputs
@@ -498,9 +514,9 @@ RGB animations.")
            glib
            kmod
            i2c-tools
-           libdrm ; enhanced diagnostics
-           libusb ; support USB monitors
-           libx11 ; enhanced diagnostics
+           libdrm                       ;enhanced diagnostics
+           libusb                       ;support USB monitors
+           libx11                       ;enhanced diagnostics
            libxrandr
            zlib))
     (home-page "https://www.ddcutil.com/")
@@ -519,7 +535,11 @@ communicate over USB as per the USB Monitor Control Class Specification.
 One particular use case is in colour profile management.  Monitor calibration
 is relative to the monitor colour settings currently in effect, e.g. red gain.
 ddcutil allows colour-related settings to be saved at the time a monitor is
-calibrated, and restored when the calibration is applied.")
+calibrated, and restored when the calibration is applied.
+
+This package includes udev rules that can be used by adding this package to
+the @code{rules} field of the @code{udev-configuration} record.  It gives
+read/write access to i2c devices to users in the @samp{i2c} group.")
     (license (list license:bsd-3        ; FindDDCUtil.cmake
                    license:gpl2+))))    ; everything else
 
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index 692b27a097..91610a1f2e 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -63,6 +63,7 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages version-control)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system haskell)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix gexp)
@@ -1241,6 +1242,8 @@ interactive environment for the functional language Haskell.")
 
 (define-public ghc-8 ghc-8.10)
 
+(define-public ghc ghc-8)
+
 (define-public ghc-9.0
   (package
     (inherit ghc-8.10)
@@ -1277,6 +1280,155 @@ interactive environment for the functional language Haskell.")
             (file-pattern ".*\\.conf\\.d$")
             (file-type 'directory))))))
 
-(define-public ghc ghc-8)
+(define-public ghc-9.2
+  ;; Use 8.10 to shorten the build chain.
+  (let ((base ghc-8.10))
+    (package
+      (inherit base)
+      (name "ghc-next")
+      (version "9.2.5")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "https://www.haskell.org/ghc/dist/" version
+                                    "/ghc-" version "-src.tar.xz"))
+                (sha256
+                 (base32
+                  "07028i0hm74svvq9b3jpkczaj6lsdgn3hgr4wa7diqiq3dypj1h6"))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base)
+         ((#:phases phases '%standard-phases)
+          #~(modify-phases #$phases
+             ;; File Common.hs has been moved to src/ in this release.
+             (replace 'fix-cc-reference
+               (lambda _
+                 (substitute* "utils/hsc2hs/src/Common.hs"
+                   (("\"cc\"") "\"gcc\""))))))))
+      (native-inputs
+       `(;; GHC 9.2 must be built with GHC >= 8.6.
+         ("ghc-bootstrap" ,base)
+         ("ghc-testsuite"
+          ,(origin
+             (method url-fetch)
+             (uri (string-append
+                    "https://www.haskell.org/ghc/dist/"
+                    version "/ghc-" version "-testsuite.tar.xz"))
+             (sha256
+              (base32
+               "19ha0hidrijawy53vm2r0sgml5zkl8126mqy7p0pyacmw3k7913l"))))
+         ,@(filter (match-lambda
+                     (("ghc-bootstrap" . _) #f)
+                     (("ghc-testsuite" . _) #f)
+                     (_ #t))
+                   (package-native-inputs base))))
+      (native-search-paths
+       (list (search-path-specification
+              (variable "GHC_PACKAGE_PATH")
+              (files (list (string-append "lib/ghc-" version)))
+              (file-pattern ".*\\.conf\\.d$")
+              (file-type 'directory)))))))
+
+;; 9.4 is the last version to support the make-based build system,
+;; but it boot with 9.2, only 9.0 is supported.
+(define ghc-bootstrap-for-9.4 ghc-9.0)
+
+;; We need two extra dependencies built with ghc-bootstrap-for-9.4,
+;; which are duplicated here from haskell-xyz to make sure the
+;; bootstraping process always works.
+(define ghc-alex-bootstrap-for-9.4
+  (hidden-package
+    (package
+     (name "ghc-alex")
+     (version "3.2.6")
+     (source
+      (origin
+        (method url-fetch)
+        (uri (hackage-uri "alex" version))
+        (sha256
+         (base32
+          "042lrkn0dbpjn5ivj6j26jzb1fwrj8c1aj18ykxja89isg0hiali"))))
+     (build-system haskell-build-system)
+     (arguments
+       (list #:tests? #f
+             #:haskell ghc-bootstrap-for-9.4))
+     (native-inputs
+      (list which))
+     (home-page "https://www.haskell.org/alex/")
+     (synopsis
+      "Tool for generating lexical analysers in Haskell")
+     (description
+      "Alex is a tool for generating lexical analysers in Haskell.  It takes a
+ description of tokens based on regular expressions and generates a Haskell
+ module containing code for scanning text efficiently.  It is similar to the
+ tool lex or flex for C/C++.")
+     (license license:bsd-3))))
+
+(define ghc-happy-bootstrap-for-9.4
+  (hidden-package
+    (package
+     (name "ghc-happy")
+     (version "1.20.0")
+     (source
+      (origin
+        (method url-fetch)
+        (uri (hackage-uri "happy" version))
+        (sha256
+         (base32
+          "1346r2x5ravs5fqma65bzjragqbb2g6v41wz9maknwm2jf7kl79v"))))
+     (build-system haskell-build-system)
+     (arguments
+       (list #:haskell ghc-bootstrap-for-9.4
+             #:tests? #f))
+     (home-page "https://hackage.haskell.org/package/happy")
+     (synopsis "Parser generator for Haskell")
+     (description "Happy is a parser generator for Haskell.  Given a grammar
+ specification in BNF, Happy generates Haskell code to parse the grammar.
+ Happy works in a similar way to the yacc tool for C.")
+     (license license:bsd-3))))
+
+(define-public ghc-9.4
+  ;; Inherit from 9.2, which added a few fixes, but boot from 9.0 (see above).
+  (let ((base ghc-9.2))
+    (package
+      (inherit base)
+      (name "ghc-next")
+      (version "9.4.4")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "https://www.haskell.org/ghc/dist/" version
+                                    "/ghc-" version "-src.tar.xz"))
+                (sha256
+                 (base32
+                  "1qk7rlqf02s3b6m6sqqngmjq1mxnrz88h159lz6k25gddmdg5kp8"))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments base)
+         ((#:phases phases '%standard-phases)
+          #~(modify-phases #$phases
+             ;; Files don’t exist any more.
+             (delete 'skip-tests)))))
+      (native-inputs
+       `(;; GHC 9.4 must be built with GHC >= 9.0.
+         ("ghc-bootstrap" ,ghc-bootstrap-for-9.4)
+         ("ghc-testsuite"
+          ,(origin
+             (method url-fetch)
+             (uri (string-append
+                    "https://www.haskell.org/ghc/dist/"
+                    version "/ghc-" version "-testsuite.tar.xz"))
+             (sha256
+              (base32
+               "04p2lawxxg3nyv6frzhyjyh3arhqqyh5ka3alxa2pxhcd2hdcja3"))))
+         ("ghc-alex" ,ghc-alex-bootstrap-for-9.4)
+         ("ghc-happy" ,ghc-happy-bootstrap-for-9.4)
+         ,@(filter (match-lambda
+                     (("ghc-bootstrap" . _) #f)
+                     (("ghc-testsuite" . _) #f)
+                     (_ #t))
+                   (package-native-inputs base))))
+      (native-search-paths
+       (list (search-path-specification
+              (variable "GHC_PACKAGE_PATH")
+              (files (list (string-append "lib/ghc-" version)))
+              (file-pattern ".*\\.conf\\.d$")
+              (file-type 'directory)))))))
 
 ;;; haskell.scm ends here
diff --git a/gnu/packages/image-processing.scm b/gnu/packages/image-processing.scm
index ab796d7719..85acc3f5b5 100644
--- a/gnu/packages/image-processing.scm
+++ b/gnu/packages/image-processing.scm
@@ -21,6 +21,7 @@
 ;;; Copyright © 2021 Ivan Gankevich <i.gankevich@spbu.ru>
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 Tomasz Jeneralczyk <tj@schwi.pl>
+;;; Copyright © 2022 Paul A. Patience <paul@apatience.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -60,6 +61,8 @@
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages game-development)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages geo)
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages gimp)
@@ -75,16 +78,21 @@
   #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages maths)
+  #:use-module (gnu packages mpi)
   #:use-module (gnu packages pdf)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-check)
+  #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages qt)
+  #:use-module (gnu packages sdl)
   #:use-module (gnu packages serialization)
+  #:use-module (gnu packages sphinx)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages tbb)
   #:use-module (gnu packages textutils)
@@ -958,6 +966,275 @@ and quantitative techniques.  The data exploration can be done interactively
 in 3D or programmatically using ParaView’s batch processing capabilities.")
     (license license:bsd-3)))
 
+(define-public paraview
+  (package
+    (name "paraview")
+    (version "5.11.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.kitware.com/paraview/paraview.git")
+             (commit (string-append "v" version))
+             (recursive? #t)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0qifzsbgg8f7zvg5a4934nql6nv5b6sm1f59bylyc6v5bqd0myas"))
+       (modules '((guix build utils)))
+       (snippet
+        ;; TODO: Also remove unused bundled libraries and plugins?
+        #~(begin
+            ;; Remove bundled ParaView libraries which are available in Guix
+            ;; or undesired.
+            (for-each (lambda (dir)
+                        (delete-file-recursively
+                         (string-append "ThirdParty/" dir "/vtk"
+                                        (string-downcase dir))))
+                      '(;;"CosmoHaloFinder"
+                        ;;"IceT"
+                        "NvPipe"        ; Don't want NvPipe support
+                        ;;"QtTesting"
+                        ;;"cinema"
+                        ;;"cinemasci"
+                        "protobuf"))
+            ;; Remove undesired ParaView plugins.
+            (delete-file-recursively "Plugins/pvNVIDIAIndeX")
+            ;; Remove bundled VTK libraries which are available in Guix.
+            (for-each (lambda (dir)
+                        (delete-file-recursively
+                         (string-append "VTK/ThirdParty/" dir "/vtk" dir)))
+                      '(;;"cgns"
+                        "cli11"
+                        ;;"diy2"
+                        "doubleconversion"
+                        "eigen"
+                        ;;"exodusII"
+                        "expat"
+                        ;;"exprtk"
+                        ;;"fides"
+                        "fmt"
+                        "freetype"
+                        "gl2ps"
+                        "glew"
+                        ;;"h5part"
+                        "hdf5"
+                        ;;"ioss"
+                        "jpeg"
+                        "jsoncpp"
+                        ;;"kissfft"
+                        ;;"libharu" ; Requires some PRs applied to 2.3.0
+                        "libproj"
+                        "libxml2"
+                        ;;"loguru"
+                        "lz4"
+                        "lzma"
+                        "mpi4py"
+                        "netcdf"
+                        ;;"nlohmannjson" ; ParFlow build fails even with bundled
+                        "ogg"
+                        ;;"pegtl"
+                        "png"
+                        "pugixml"
+                        "sqlite"
+                        "theora"
+                        "tiff"
+                        "utf8"
+                        ;;"verdict"
+                        ;;"vpic"
+                        ;;"vtkm"
+                        ;;"xdmf2"
+                        ;;"xdmf3"
+                        ;;"zfp"
+                        "zlib"))))))
+    (build-system qt-build-system)
+    (arguments
+     (list
+      #:build-type "Release"            ; 542 MiB in release mode
+      #:tests? #f                       ; Downloads test data
+      #:configure-flags
+      #~(let ((doc (string-append #$output "/share/doc/" #$name "-" #$version)))
+          (list
+           (string-append "-DCMAKE_INSTALL_DOCDIR=" doc) ; For paraview.qch
+
+           ;; ParaView build options
+           "-DPARAVIEW_BUILD_DEVELOPER_DOCUMENTATION=ON"
+           (string-append "-DPARAVIEW_GENERATED_DOCUMENTATION_OUTPUT_DIRECTORY=" doc)
+
+           ;; ParaView capability options
+           ;;"-DPARAVIEW_USE_EXTERNAL_VTK=ON" ; Unsupported by ParaView
+           "-DPARAVIEW_USE_MPI=ON"
+           "-DPARAVIEW_USE_PYTHON=ON"
+           "-DPARAVIEW_USE_QTWEBENGINE=ON"
+
+           ;; ParaView features
+           ;;
+           ;; Enable those that are disabled by default.
+           ;; Commented means the dependencies are missing from Guix
+           ;; (or are otherwise described).
+           ;;"-DPARAVIEW_ENABLE_ADIOS2=ON"
+           ;;"-DPARAVIEW_ENABLE_COSMOTOOLS=ON"
+           ;;"-DPARAVIEW_ENABLE_CATALYST=ON"
+           "-DPARAVIEW_ENABLE_FFMPEG=ON"
+           ;;"-DPARAVIEW_ENABLE_FIDES=ON"
+           "-DPARAVIEW_ENABLE_GDAL=ON"
+           ;;"-DPARAVIEW_ENABLE_LAS=ON"
+           ;;"-DPARAVIEW_ENABLE_LOOKINGGLASS=ON" ; Downloads dependency
+           ;;"-DPARAVIEW_ENABLE_MOMENTINVARIANTS=ON" ; Downloads dependency
+           "-DPARAVIEW_ENABLE_MOTIONFX=ON"
+           ;;"-DPARAVIEW_ENABLE_OPENTURNS=ON"
+           ;;"-DPARAVIEW_ENABLE_OPENVDB=ON" ; Dependency not found
+           ;;"-DPARAVIEW_ENABLE_PDAL=ON"
+           ;;"-DPARAVIEW_ENABLE_RAYTRACING=ON"
+           "-DPARAVIEW_ENABLE_VISITBRIDGE=ON"
+           "-DPARAVIEW_ENABLE_XDMF3=ON"
+
+           ;; ParaView miscellaneous options
+           ;;
+           ;; Without -DPARAVIEW_DATA_EXCLUDE_FROM_ALL=OFF, test data is
+           ;; downloaded even with tests disabled.
+           "-DPARAVIEW_VERSIONED_INSTALL=OFF"
+           "-DPARAVIEW_DATA_EXCLUDE_FROM_ALL=OFF"
+
+           ;; ParaView plugins
+           ;;
+           ;; Enable those that are disabled by default.
+           ;; Commented means the dependencies are missing from Guix
+           ;; (or are otherwise described).
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_AdiosReaderPixie=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_AdiosReaderStaging=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_CAVEInteraction=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_CDIReader=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_GeographicalMap=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_GmshIO=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_InSituExodus=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_LookingGlass=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_NetCDFTimeAnnotationPlugin=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_ParFlow=ON" ; Build fails
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_PythonQtPlugin=ON"
+           "-DPARAVIEW_PLUGIN_ENABLE_SpaceMouseInteractor=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_VDFReaderPlugin=ON"
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_XRInterface=ON" ; Build fails
+           ;;"-DPARAVIEW_PLUGIN_ENABLE_zSpace=ON"
+
+           ;; VTK options
+           "-DVTK_SMP_IMPLEMENTATION_TYPE=TBB"
+           "-DVTKm_ENABLE_MPI=ON"
+
+           ;; External libraries for ParaView and VTK
+           "-DVTK_MODULE_USE_EXTERNAL_ParaView_protobuf=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_cli11=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_doubleconversion=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_eigen=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_expat=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_fmt=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_freetype=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_gl2ps=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_glew=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_hdf5=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_jpeg=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_jsoncpp=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_libproj=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_libxml2=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_lz4=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_lzma=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_mpi4py=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_netcdf=ON"
+           ;;"-DVTK_MODULE_USE_EXTERNAL_VTK_nlohmannjson=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_ogg=ON"
+           ;;"-DVTK_MODULE_USE_EXTERNAL_VTK_pegtl=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_png=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_pugixml=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_sqlite=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_theora=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_tiff=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_utf8=ON"
+           "-DVTK_MODULE_USE_EXTERNAL_VTK_zlib=ON"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'set-paths 'hide-gfortran
+            (lambda _
+              (setenv "CPLUS_INCLUDE_PATH"
+                      (string-join
+                       (delete (string-append #$(this-package-native-input "gfortran")
+                                              "/include/c++")
+                               (string-split (getenv "CPLUS_INCLUDE_PATH") #\:))
+                       ":"))))
+          (replace 'install-license-files
+            (lambda _
+              (let ((src (string-append #$output "/share/licenses/ParaView"))
+                    (dst (string-append #$output "/share/doc/"
+                                        #$name "-" #$version "/licenses")))
+                (copy-recursively src dst)
+                (delete-file-recursively (dirname src))))))))
+    (native-inputs
+     (list gfortran
+           ;; For the documentation
+           doxygen
+           graphviz
+           perl
+           python-sphinx))
+    (inputs
+     (list boost
+           cli11
+           curl
+           double-conversion
+           eigen
+           expat
+           ffmpeg
+           fmt
+           freetype
+           gdal
+           gl2ps
+           glew
+           gmsh
+           hdf5
+           ;;json-modern-cxx              ;For ParFlow; build fails
+           jsoncpp
+           libjpeg-turbo
+           libogg
+           libpng
+           libtheora
+           libtiff
+           libxcursor
+           libxml2
+           libxt
+           lz4
+           lzip
+           mesa
+           netcdf
+           openmpi
+           ;;openvdb                      ;For OpenVDB; dependency not found
+           ;;openvr                       ;For XRInterface; build fails
+           ;;pegtl                        ;For VTK; build fails
+           proj
+           protobuf
+           pugixml
+           python-cftime
+           python-matplotlib
+           python-mpi4py
+           python-numpy
+           python-wrapper
+           qtbase-5
+           qtdeclarative-5
+           qtmultimedia-5
+           qtsvg-5
+           qttools-5
+           qtwebchannel-5
+           qtwebengine-5
+           qtx11extras
+           qtxmlpatterns
+           sdl2
+           sqlite
+           tbb
+           utfcpp
+           zlib))
+    (home-page "https://www.paraview.org/")
+    (synopsis "VTK-based, parallel data analyzer and visualizer")
+    (description "ParaView is a VTK-based, parallel data analyzer and
+visualizer which allows exploring data interactively in 3D or
+programmatically.")
+    (license license:bsd-3)))
+
 (define-public vxl
   (package
     (name "vxl")
diff --git a/gnu/packages/kde-games.scm b/gnu/packages/kde-games.scm
index 60c4d839d6..b0df2cf3d2 100644
--- a/gnu/packages/kde-games.scm
+++ b/gnu/packages/kde-games.scm
@@ -322,8 +322,9 @@ This package is part of the KDE games module.")
            ki18n
            libkmahjongg
            python
+           python-pyqt-without-qtwebkit
            python-twisted
-           python-pyqt
+           python-qtpy
            python-zope-interface
            qtbase-5
            qtsvg-5))
diff --git a/gnu/packages/kodi.scm b/gnu/packages/kodi.scm
index 18791359f2..1411f147cd 100644
--- a/gnu/packages/kodi.scm
+++ b/gnu/packages/kodi.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2018, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2021 Greg Hogan <code@greghogan.com>
+;;; Copyright © 2022 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -39,6 +40,7 @@
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages cdrom)
+  #:use-module (gnu packages check)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages curl)
@@ -55,12 +57,14 @@
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages groff)
+  #:use-module (gnu packages groovy)
   #:use-module (gnu packages gnunet)
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages image)
   #:use-module (gnu packages java)
   #:use-module (gnu packages libusb)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages logging)
   #:use-module (gnu packages mp3)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages pkg-config)
@@ -270,43 +274,40 @@ alternatives. In compilers, this can reduce the cascade of secondary errors.")
 (define-public kodi
   (package
     (name "kodi")
-    (version "18.8")
+    (version "19.5")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url "https://github.com/xbmc/xbmc")
-                    (commit (string-append version "-Leia"))))
+                    (commit (string-append version "-Matrix"))))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0qpkpz43s207msvv3qkiy6vzqwcgmydxv3py7vc29mv6h30chrva"))
-              (patches (search-patches "kodi-skip-test-449.patch"
-                                       "kodi-increase-test-timeout.patch"
-                                       "kodi-set-libcurl-ssl-parameters.patch"))
+                "1pfd1ajivr865h0fkpbv778626c4czrvq8650bzqv9aqzh8f36my"))
+              (patches (search-patches "kodi-set-libcurl-ssl-parameters.patch"))
+              (modules '((guix build utils)))
               (snippet
                '(begin
                   (use-modules (guix build utils))
                   (for-each delete-file-recursively
                             '("project/BuildDependencies/"
-                              ;; TODO: Purge these jars.
-                              ;;"tools/codegenerator/groovy"
-                              ;; And these sources:
+                              "tools/codegenerator/groovy/commons-lang-2.6.jar"
+                              "tools/codegenerator/groovy/groovy-all-2.4.4.jar"
+                              ;; Purge these sources:
                               ;; "tools/depend/native/JsonSchemaBuilder"
                               ;; "tools/depend/native/TexturePacker"
-                              ;; "lib/gtest"
-                              ;; "lib/cpluff"
                               ;; "lib/libUPnP"
                               "lib/libUPnP/Neptune/ThirdParty"
-                              "project/Win32BuildSetup/tools/7z"))
-                  #t))
-              (modules '((guix build utils)))))
+                              "project/Win32BuildSetup/tools/7z"))))))
     (build-system cmake-build-system)
     (arguments
      '(#:modules ((srfi srfi-1)
                   (guix build cmake-build-system)
                   (guix build utils))
        #:configure-flags
-       (list "-DENABLE_INTERNAL_FFMPEG=OFF"
+       (list "-DCORE_PLATFORM_NAME=x11"
+             "-DAPP_RENDER_SYSTEM=gl"
+             "-DENABLE_INTERNAL_FFMPEG=OFF"
              "-DENABLE_INTERNAL_CROSSGUID=OFF"
              (string-append "-Dlibdvdread_URL="
                             (assoc-ref %build-inputs "libdvdread-bootstrapped"))
@@ -324,28 +325,36 @@ alternatives. In compilers, this can reduce the cascade of secondary errors.")
          ;; bootstrap it on our own instead.
          (add-after 'unpack 'bootstrap-bundled-software
            (lambda _
-             (let ((dirs '("tools/depends/native/JsonSchemaBuilder/src"
-                           "lib/cpluff")))
+             (let ((dirs '("tools/depends/native/JsonSchemaBuilder/src")))
                (every (lambda (third-party)
                         (with-directory-excursion third-party
                           (invoke "autoreconf" "-vif")))
                       dirs))))
          (add-after 'bootstrap-bundled-software 'patch-stuff
            (lambda* (#:key inputs #:allow-other-keys)
+             ;; Run groovy executable directly.
+             (substitute* "xbmc/interfaces/swig/CMakeLists.txt"
+               (("COMMAND \\$\\{Java_JAVA_EXECUTABLE\\}")
+                "COMMAND groovy")
+               (("ARGS \\$\\{JAVA_OPEN_OPTS\\} -cp \"\\$\\{classpath\\}\" groovy.ui.GroovyMain")
+                "ARGS -cp \"${classpath}\" ")
+               (("classpath \\$\\{GROOVY_DIR\\}/groovy-all-\\$\\{GROOVY_VER\\}.jar")
+                "classpath ")
+               (("\\$\\{GROOVY_DIR\\}/commons-lang-\\$\\{COMMONS_VER\\}.jar")
+                (search-input-file inputs "/share/java/commons-lang-2.6.jar"))
+               (("^set\\(GROOVY_VER.*")
+                (string-append "set(GROOVY_VER 3.0.5)\n")))
+
              ;; Prevent the build scripts from calling autoreconf in the
              ;; build stage.  Otherwise, it would undo the bootstrapping
              ;; and shebang patching that we worked so hard for.
-             (substitute* "cmake/modules/FindCpluff.cmake"
-               (("autoreconf -vif") "true"))
-             (substitute* "lib/cpluff/po/Makefile.in.in"
-               (("/bin/sh") (which "sh")))
              (substitute* "cmake/modules/FindLibDvd.cmake"
                ;; The libdvd* sources that we bootstrapped separately are
                ;; unpacked in the build phase. This is our best opportunity
                ;; to make them writable before the build process starts.
                (("autoreconf -vif") "chmod -R u+w ."))
 
-             (substitute* "xbmc/platform/linux/LinuxTimezone.cpp"
+             (substitute* "xbmc/platform/posix/PosixTimezone.cpp"
                (("/usr/share/zoneinfo")
                 (search-input-directory inputs "share/zoneinfo")))
 
@@ -357,20 +366,21 @@ alternatives. In compilers, this can reduce the cascade of secondary errors.")
              ;; Let's disable some tests that are known not to work here.
              ;; Doing this later while in the cmake "../build" directory
              ;; is trickier.
-             (substitute* '("xbmc/utils/test/TestSystemInfo.cpp")
+             (substitute* "xbmc/utils/test/TestSystemInfo.cpp"
                (("TEST_F\\(TestSystemInfo, GetOsPrettyNameWithVersion\\)")
                 "TEST_F(TestSystemInfo, DISABLED_GetOsPrettyNameWithVersion)")
                (("TEST_F\\(TestSystemInfo, GetOsName\\)")
                 "TEST_F(TestSystemInfo, DISABLED_GetOsName)")
                (("TEST_F\\(TestSystemInfo, GetOsVersion\\)")
                 "TEST_F(TestSystemInfo, DISABLED_GetOsVersion)"))
-             #t))
+             (substitute* "xbmc/utils/test/TestCPUInfo.cpp"
+               (("TEST_F\\(TestCPUInfo, GetCPUFrequency\\)")
+                "TEST_F(TestCPUInfo, DISABLED_GetCPUFrequency)"))))
          (add-before 'build 'set-build-environment
            (lambda _
              ;; Some bundled build scripts fall back to /bin/sh
              ;; if this is not set.
-             (setenv "CONFIG_SHELL" (which "sh"))
-             #t))
+             (setenv "CONFIG_SHELL" (which "sh"))))
          (add-before 'check 'build-kodi-test
            (lambda _
              (invoke "make" "kodi-test"))))))
@@ -379,77 +389,81 @@ alternatives. In compilers, this can reduce the cascade of secondary errors.")
     ;; - plist
     ;; - shairplay
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("gettext" ,gettext-minimal)
-       ("icedtea" ,icedtea) ; needed at build-time only, mandatory
-       ("libdvdcss-bootstrapped" ,libdvdcss/kodi)
-       ("libdvdnav-bootstrapped" ,libdvdnav/kodi)
-       ("libdvdread-bootstrapped" ,libdvdread/kodi)
-       ("libtool" ,libtool)
-       ("pkg-config" ,pkg-config)
-       ("swig" ,swig)
-       ("yasm" ,yasm)))
+     (list autoconf
+           automake
+           gettext-minimal
+           googletest
+           groovy
+           openjdk9                     ;like groovy
+           java-commons-lang
+           libdvdcss/kodi
+           libdvdnav/kodi
+           libdvdread/kodi
+           libtool
+           pkg-config
+           swig
+           yasm))
     (inputs
-     `(("alsa-lib" ,alsa-lib)
-       ("avahi" ,avahi)
-       ("bluez" ,bluez)
-       ("crossguid" ,crossguid)
-       ("curl" ,curl)
-       ("dcadec" ,dcadec)
-       ("dbus" ,dbus)
-       ("eudev" ,eudev)
-       ("ffmpeg" ,ffmpeg-4)
-       ("flac" ,flac)
-       ("flatbuffers" ,flatbuffers)
-       ("fmt" ,fmt-7)
-       ("fontconfig" ,fontconfig)
-       ("freetype" ,freetype)
-       ("fribidi" ,fribidi)
-       ("fstrcmp" ,fstrcmp)
-       ("giflib" ,giflib)
-       ("glew" ,glew)
-       ("gnutls" ,gnutls)
-       ("lame" ,lame)
-       ("lcms" ,lcms)
-       ("libass" ,libass)
-       ("libbluray" ,libbluray)
-       ("libcap" ,libcap)
-       ("libcdio" ,libcdio)
-       ("libdrm" ,libdrm)
-       ("libgcrypt" ,libgcrypt)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libltdl" ,libltdl)
-       ("libmad" ,libmad)
-       ("libmicrohttpd" ,libmicrohttpd)
-       ("libmpeg2" ,libmpeg2)
-       ("libnfs" ,libnfs)
-       ("libogg" ,libogg)
-       ("libpng" ,libpng)
-       ("libssh" ,libssh)
-       ("libtiff" ,libtiff)
-       ("libva" ,libva)
-       ("libvorbis" ,libvorbis)
-       ("libxml2" ,libxml2)
-       ("libxrandr" ,libxrandr)
-       ("libxrender" ,libxrender)
-       ("libxslt" ,libxslt)
-       ("lzo" ,lzo)
-       ("mariadb-dev" ,mariadb "lib")
-       ("mariadb-dev" ,mariadb "dev")
-       ("openssl" ,openssl)
-       ("pcre" ,pcre)
-       ("pulseaudio" ,pulseaudio)
-       ("python" ,python-2)
-       ("rapidjson" ,rapidjson)
-       ("samba" ,samba)
-       ("sqlite" ,sqlite)
-       ("taglib" ,taglib)
-       ("tinyxml" ,tinyxml)
-       ("tzdata" ,tzdata)
-       ("util-linux" ,util-linux)
-       ("zip" ,zip)
-       ("zlib" ,zlib)))
+     (list alsa-lib
+           avahi
+           bluez
+           crossguid
+           curl
+           dcadec
+           dbus
+           eudev
+           ffmpeg-4
+           flac
+           flatbuffers
+           fmt-6
+           fontconfig
+           freetype
+           fribidi
+           fstrcmp
+           giflib
+           glew
+           gnutls
+           lame
+           lcms
+           libass
+           libbluray
+           libcap
+           libcdio
+           libdrm
+           libgcrypt
+           libjpeg-turbo
+           libltdl
+           libmad
+           libmicrohttpd
+           libmpeg2
+           libnfs
+           libogg
+           libpng
+           libssh
+           libtiff
+           libva
+           libvorbis
+           libxml2
+           libxrandr
+           libxrender
+           libxslt
+           lzo
+           (list mariadb "lib")
+           (list mariadb "dev")
+           openssl
+           pcre
+           pulseaudio
+           python
+           rapidjson
+           samba
+           spdlog-for-kodi
+           sqlite
+           taglib
+           tinyxml
+           tzdata
+           util-linux
+           zip
+           zlib))
     (synopsis "Media center for home theater computers")
     (description "Kodi is a media center application for playing videos,
 music, games, etc.  Kodi is highly customizable and features a theme and
@@ -458,11 +472,11 @@ plug-in system.")
     ;; XBMC is largely GPL2+, with some library components as LGPL2.1+, but
     ;; there are some other licenses spread throughout.
     (license (list license:gpl2+ license:lgpl2.1+
-                   license:gpl3+                  ;WiiRemote client
-                   license:expat                  ;cpluff, dbwrappers
-                   license:public-domain          ;cpluff/examples
-                   license:bsd-3                  ;misc, gtest
-                   license:bsd-2))))              ;xbmc/freebsd
+                   license:gpl3+         ;WiiRemote client
+                   license:expat         ;cpluff, dbwrappers
+                   license:public-domain ;cpluff/examples
+                   license:bsd-3         ;misc
+                   license:bsd-2))))     ;xbmc/freebsd
 
 (define-public kodi/wayland
   (package/inherit kodi
@@ -470,15 +484,14 @@ plug-in system.")
     (arguments
      (substitute-keyword-arguments (package-arguments kodi)
        ((#:configure-flags flags)
-        `(append '("-DCORE_PLATFORM_NAME=wayland"
-                   "-DWAYLAND_RENDER_SYSTEM=gl")
-                   ,flags))))
+        `(cons "-DCORE_PLATFORM_NAME=wayland"
+               (delete "-DCORE_PLATFORM_NAME=x11" ,flags)))))
     (inputs
-     `(("libinput" ,libinput)
-       ("libxkbcommon" ,libxkbcommon)
-       ("waylandpp" ,waylandpp)
-       ("waylandp-protocols" ,wayland-protocols)
-       ,@(package-inputs kodi)))
+     (modify-inputs (package-inputs kodi)
+       (prepend (list libinput
+                      libxkbcommon
+                      waylandpp
+                      wayland-protocols))))
     (synopsis "Kodi with Wayland rendering backend")))
 
 (define-public kodi-cli
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 0830cc5ed7..ed5cb524ac 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -480,7 +480,7 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The current "stable" kernels. That is, the most recently released major
 ;; versions that are still supported upstream.
 
-(define-public linux-libre-6.0-version "6.0.15")
+(define-public linux-libre-6.0-version "6.0.16")
 (define-public linux-libre-6.0-gnu-revision "gnu")
 (define deblob-scripts-6.0
   (linux-libre-deblob-scripts
@@ -490,7 +490,7 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "16g2bin3xay30zfss1vlb7pwcss5giaxaksp4v1gk05wn51wjrqr")))
 (define-public linux-libre-6.0-pristine-source
   (let ((version linux-libre-6.0-version)
-        (hash (base32 "08389890gq4b9vkvrb22lzkr4blkn3a5ma074ns19gl89wyyp16l")))
+        (hash (base32 "1r2wf3hf7yxl7lxma7plyi8pk3dmlsrpm763rf0g1h8ilsy72844")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-6.0)))
@@ -498,7 +498,7 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The "longterm" kernels — the older releases with long-term upstream support.
 ;; Here are the support timelines:
 ;; <https://www.kernel.org/category/releases.html>
-(define-public linux-libre-5.15-version "5.15.85")
+(define-public linux-libre-5.15-version "5.15.86")
 (define-public linux-libre-5.15-gnu-revision "gnu")
 (define deblob-scripts-5.15
   (linux-libre-deblob-scripts
@@ -508,7 +508,7 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "1m73pgx8v047xb2gck2g7j7khniis8c9akn9vhzgsdfglrf8p6fj")))
 (define-public linux-libre-5.15-pristine-source
   (let ((version linux-libre-5.15-version)
-        (hash (base32 "024qhjh9mgfnanr1qd8002n6a4wpn98lajli12a0m3n9z8lsw2rc")))
+        (hash (base32 "1vpjnmwqsx6akph2nvbsv2jl7pp8b7xns3vmwbljsl23lkpxkz40")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.15)))
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index a41eb845df..db20ad00c0 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2018, 2019 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2019, 2020 Katherine Cox-Buday <cox.katherine.e@gmail.com>
 ;;; Copyright © 2019 Jesse Gildersleve <jessejohngildersleve@protonmail.com>
-;;; Copyright © 2019, 2020, 2021, 2022 Guillaume Le Vaillant <glv@posteo.net>
+;;; Copyright © 2019-2023 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2019 Brett Gilio <brettg@gnu.org>
 ;;; Copyright © 2020 Konrad Hinsen <konrad.hinsen@fastmail.net>
 ;;; Copyright © 2020 Dimakis Dimakakos <me@bendersteed.tech>
@@ -23,7 +23,7 @@
 ;;; Copyright © 2020, 2021, 2022 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2021, 2022 Aurora <rind38@disroot.org>
 ;;; Copyright © 2021 Matthew James Kraai <kraai@ftbfs.org>
-;;; Copyright © 2021, 2022 André A. Gomes <andremegafone@gmail.com>
+;;; Copyright © 2021, 2022, 2023 André A. Gomes <andremegafone@gmail.com>
 ;;; Copyright © 2021, 2022 Cage <cage-dev@twistfold.it>
 ;;; Copyright © 2021 Cameron Chaparro <cameron@cameronchaparro.com>
 ;;; Copyright © 2021 Charles Jackson <charles.b.jackson@protonmail.com>
@@ -70,6 +70,7 @@
   #:use-module (guix build-system asdf)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
+  #:use-module (gnu packages audio)
   #:use-module (gnu packages base)
   #:use-module (gnu packages c)
   #:use-module (gnu packages compression)
@@ -4036,6 +4037,38 @@ package.")
 (define-public ecl-cffi-c-ref
   (sbcl-package->ecl-package sbcl-cffi-c-ref))
 
+(define-public sbcl-ffa
+  (let ((commit "b7012f51c4c37d1e759ff9cf78cea178504d8e07")
+        (revision "1"))
+    (package
+      (name "sbcl-ffa")
+      (version (git-version "0.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/tpapp/ffa")
+               (commit commit)))
+         (file-name (git-file-name "cl-ffa" version))
+         (sha256
+          (base32 "0l7kqcjp3sn1129hpwq6zhjqc0ydx9gc53z7k13i38x3z1asap7a"))))
+      (build-system asdf-build-system/sbcl)
+      (inputs
+       (list sbcl-cffi sbcl-cl-utilities sbcl-iterate sbcl-metabang-bind))
+      (synopsis "Foreign friendly arrays for Common Lisp")
+      (description
+       "This package provides a macro that allows foreign functions to access
+the contents of the array at a given pointer, using the best available method
+given the Common Lisp implementation.")
+      (home-page "https://cliki.net/ffa")
+      (license license:llgpl))))
+
+(define-public cl-ffa
+  (sbcl-package->cl-source-package sbcl-ffa))
+
+(define-public ecl-ffa
+  (sbcl-package->ecl-package sbcl-ffa))
+
 (define-public sbcl-cl-sqlite
   (package
     (name "sbcl-cl-sqlite")
@@ -11050,6 +11083,46 @@ them as PNG files.")
 (define-public ecl-hdf5-cffi
   (sbcl-package->ecl-package sbcl-hdf5-cffi))
 
+(define-public sbcl-history-tree
+  (package
+    (name "sbcl-history-tree")
+    (version "0.1.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/atlas-engineer/history-tree")
+             (commit version)))
+       (file-name (git-file-name "cl-history-tree" version))
+       (sha256
+        (base32 "0z4mfgswfbpkh496qqk130yk6d0q0q5imqybw9n58aq4ygfhibhz"))))
+    (build-system asdf-build-system/sbcl)
+    (inputs
+     (list
+      sbcl-alexandria
+      sbcl-custom-hash-table
+      sbcl-local-time
+      sbcl-hu.dwim.defclass-star
+      sbcl-trivial-package-local-nicknames))
+    (native-inputs (list sbcl-lisp-unit2))
+    (home-page "https://github.com/atlas-engineer/history-tree")
+    (synopsis "Store the history of a browser's visited paths")
+    (description
+     "This data structure can be used to store the history of visited paths or
+URLs with a file or web browser, in a way that no “forward” element is ever
+forgotten.
+
+The history tree is “global” in the sense that multiple owners (e.g. tabs) can
+have overlapping histories.  On top of that, an owner can spawn another one,
+starting from one of its nodes (typically when you open a URL in a new tab).")
+    (license license:bsd-3)))
+
+(define-public cl-history-tree
+  (sbcl-package->cl-source-package sbcl-history-tree))
+
+(define-public ecl-history-tree
+  (sbcl-package->ecl-package sbcl-history-tree))
+
 (define-public sbcl-cl-randist
   (package
     (name "sbcl-cl-randist")
@@ -13073,6 +13146,46 @@ cross-platform audio playback.")
 (define-public cl-out123
   (sbcl-package->cl-source-package sbcl-cl-out123))
 
+(define-public sbcl-cl-portaudio
+  (let ((commit "c50cd061c25216a736f684e45101f5c0188a384f")
+        (revision "1"))
+    (package
+      (name "sbcl-cl-portaudio")
+      (version (git-version "1.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/filonenko-mikhail/cl-portaudio")
+               (commit commit)))
+         (file-name (git-file-name "cl-portaudio" version))
+         (sha256
+          (base32 "177c6bgf30caj5qpzfnzhbamax7c5zm2p4911mw7fay94vjs7zyb"))))
+      (build-system asdf-build-system/sbcl)
+      (inputs
+       (list portaudio sbcl-cffi sbcl-ffa))
+      (arguments
+       (list #:tests? #f ; Tests need access to sound cards
+             #:phases
+             #~(modify-phases %standard-phases
+                 (add-after 'unpack 'fix-paths
+                   (lambda* (#:key inputs #:allow-other-keys)
+                     (substitute* "src/portaudio.lisp"
+                       (("libportaudio\\.so")
+                        (search-input-file inputs "/lib/libportaudio.so"))))))))
+      (synopsis "Common Lisp bindings to portaudio")
+      (description
+       "This package provides audio input and output functions to Common Lisp
+using bindings to the portaudio library.")
+      (home-page "https://github.com/filonenko-mikhail/cl-portaudio")
+      (license license:expat))))
+
+(define-public cl-portaudio
+  (sbcl-package->cl-source-package sbcl-cl-portaudio))
+
+(define-public ecl-cl-portaudio
+  (sbcl-package->ecl-package sbcl-cl-portaudio))
+
 (define-public sbcl-cl-random-forest
   (let ((commit "fedb36ce99bb6f4d7e3a7dd6d8b058f331308f91")
         (revision "1"))
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 7de7177b77..33e9b5611e 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2018–2022 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2018, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2018, 2021-2023 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Tim Gesthuizen <tim.gesthuizen@yahoo.de>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2019 Rutger Helling <rhelling@mykolab.com>
@@ -1585,6 +1585,19 @@ components which highly leverage existing libraries in the larger LLVM Project."
     (inputs (modify-inputs (package-inputs lld)
               (replace "llvm" llvm-12)))))
 
+(define-public lld-11
+  (package
+    (inherit lld-12)
+    (version "11.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (llvm-uri "lld" version))
+              (sha256
+               (base32
+                "077xyh7sij6mhp4dc4kdcmp9whrpz332fa12rwxnzp3wgd5bxrzg"))))
+    (inputs (modify-inputs (package-inputs lld)
+              (replace "llvm" llvm-11)))))
+
 (define-public lld lld-14)
 
 (define* (make-lld-wrapper lld #:key lld-as-ld?)
diff --git a/gnu/packages/logging.scm b/gnu/packages/logging.scm
index 58af70c7c5..76b8f6a6b7 100644
--- a/gnu/packages/logging.scm
+++ b/gnu/packages/logging.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2022 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2017 Eric Bavier <bavier@member.fsf.org>
@@ -252,6 +252,20 @@ library.")
        (sha256
         (base32 "02xz017ba9fssm1rp1fcfld7h79awbr6fqai9dxaqp02akp3davk"))))))
 
+(define-public spdlog-for-kodi
+  (package
+    (inherit spdlog)
+    (version "1.5.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/gabime/spdlog")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name "spdlog" version))
+       (sha256
+        (base32 "0dn44r3xbw1w0bk9yflnxkh3rzdq2bpxkks44skfmqig0rsj1f1x"))))))
+
 (define-public rsyslog
   (package
     (name "rsyslog")
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index c9916c2e93..de868e948b 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -4026,11 +4026,11 @@ It is a replacement for the @command{urlview} program.")
     (license license:gpl2+)))
 
 (define-public mumi
-  (let ((commit "0a90eeda9b5e12a2f83e3917c46fa539f308d0c8")
-        (revision "2"))
+  (let ((commit "b2a8280f158957e18d714dea78637f6504dd7613")
+        (revision "1"))
     (package
       (name "mumi")
-      (version (git-version "0.0.4" revision commit))
+      (version (git-version "0.0.5" revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -4039,7 +4039,7 @@ It is a replacement for the @command{urlview} program.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1yxi1vvygrk8qd0mqh65qh1g99r5d4rlymj8amcn80ggi3z32byk"))))
+                  "1ygcbrnwvqa4zi93mbry5afw6dr4fbm7pgkn1gbsydp6qjfsm88q"))))
       (build-system gnu-build-system)
       (arguments
        (list
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 5ff7389a02..d9bc2922c5 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -3221,8 +3221,7 @@ ASCII text files using Gmsh's own scripting language.")
              ((@@ (guix build python-build-system) call-setuppy)
               "build_ext"
               (list (string-append "--sip-dir="
-                                   (assoc-ref inputs "python-pyqt")
-                                   "/share/sip"))
+                                   (search-input-directory inputs "share/sip")))
               #t)))
          ;; Ensure that icons are found at runtime.
          (add-after 'install 'wrap-executable
@@ -3240,7 +3239,7 @@ ASCII text files using Gmsh's own scripting language.")
      (list ghostscript ;optional, for EPS/PS output
            python-dbus
            python-h5py ;optional, for HDF5 data
-           python-pyqt
+           python-pyqt-without-qtwebkit
            qtbase-5
            qtsvg-5))
     (propagated-inputs
diff --git a/gnu/packages/mes.scm b/gnu/packages/mes.scm
index 4487b1b6eb..9ec506a1ed 100644
--- a/gnu/packages/mes.scm
+++ b/gnu/packages/mes.scm
@@ -98,29 +98,20 @@ extensive examples, including parsers for the Javascript and C99 languages.")
 (define-public nyacc
   (package
     (inherit nyacc-0.99)
-    (version "1.07.4")
+    (version "1.08.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://savannah/nyacc/nyacc-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1kr3b88sx0g9zy52algxqpvnkjm76qdyld7pasbbajkph2zhcj92"))
+                "1vrz3pnlr3njwk6ksz85slcwawi8ngiqbw94wd9x3mgv85vsfmys"))
               (modules '((guix build utils)))
               (snippet
                '(substitute* "configure"
                   (("GUILE_GLOBAL_SITE=\\$prefix.*")
                    "GUILE_GLOBAL_SITE=\
 $prefix/share/guile/site/$GUILE_EFFECTIVE_VERSION\n")))))
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         ;; See https://savannah.nongnu.org/bugs/index.php?60474
-         (add-after 'unpack 'fix-60474
-           (lambda _
-             (substitute* "module/nyacc/lang/c99/parser.scm"
-               (("\\(memq \\(car stmt\\) '\\(include include-next\\)\\)")
-                "(memq (car stmt) '(include include-next define))")))))))
     (inputs (list guile-3.0))
     (propagated-inputs (list guile-bytestructures))
     (description
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 27a68439ef..7b693a07fa 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -1398,13 +1398,18 @@ Encryption to Gajim.")
            #:phases
            #~(modify-phases %standard-phases
                ;; For A/V support.
+               (add-after 'unpack 'generate-gdk-pixbuf-loaders-cache-file
+                 (assoc-ref glib-or-gtk:%standard-phases
+                            'generate-gdk-pixbuf-loaders-cache-file))
                (add-after 'install 'wrap
                  (lambda* (#:key outputs #:allow-other-keys)
                    (let* ((out (assoc-ref outputs "out"))
                           (dino (string-append out "/bin/dino"))
                           (gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH")))
                      (wrap-program dino
-                       `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path))))))
+                       `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path))
+                       `("GDK_PIXBUF_MODULE_FILE" =
+                         (,(getenv "GDK_PIXBUF_MODULE_FILE")))))))
                (add-after 'install 'glib-or-gtk-wrap
                  (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap))
                (replace 'check
@@ -1421,7 +1426,8 @@ Encryption to Gajim.")
            pkg-config
            vala))
     (inputs
-     (list atk
+     (list adwaita-icon-theme
+           atk
            cairo
            librsvg
            glib
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 5be767a138..99b4fd4ec0 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -2947,7 +2947,7 @@ using a system-independent interface.")
            python-ly
            python-poppler-qt5
            python-pyportmidi
-           python-pyqt
+           python-pyqt-without-qtwebkit
            python-sip))
     (home-page "https://www.frescobaldi.org/")
     (synopsis "LilyPond sheet music text editor")
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 4e9daa522d..be39f3b25a 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -224,6 +224,8 @@
                                          "x64")
                                         ((? (cut string-prefix? "powerpc64" <>))
                                          "ppc64")
+                                        ((? (cut string-prefix? "riscv64" <>))
+                                         "riscv64")
                                         (_ "unsupported"))))
                                  ''()))
                     (flags (cons (string-append "--prefix=" prefix)
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
index 410f7321e0..853fdaaa5f 100644
--- a/gnu/packages/parallel.scm
+++ b/gnu/packages/parallel.scm
@@ -64,14 +64,14 @@
 (define-public parallel
   (package
     (name "parallel")
-    (version "20221122")
+    (version "20221222")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://gnu/parallel/parallel-"
                           version ".tar.bz2"))
       (sha256
-       (base32 "17akk6nskyqp3ckggli2dadp49m164ij79pijgb4iwad8ci9sgda"))
+       (base32 "0zsrz25yyhkvrkvlblmgrqhcyr9zavflknz3nhql9a8qxixhraad"))
       (snippet
        '(begin
           (use-modules (guix build utils))
diff --git a/gnu/packages/patches/kodi-increase-test-timeout.patch b/gnu/packages/patches/kodi-increase-test-timeout.patch
deleted file mode 100644
index 8fb149ff9d..0000000000
--- a/gnu/packages/patches/kodi-increase-test-timeout.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Increase thread timeout to reduce flakiness.
-
-Taken from upstream:
-https://github.com/xbmc/xbmc/commit/574b0182d8b641fd24029f372ebdcccc897123e2
-
-diff --git a/xbmc/threads/test/TestEvent.cpp b/xbmc/threads/test/TestEvent.cpp
-index 42fb8c2fc609..40e644c0ed3c 100644
---- a/xbmc/threads/test/TestEvent.cpp
-+++ b/xbmc/threads/test/TestEvent.cpp
-@@ -484,7 +484,7 @@ TEST(TestEvent, GroupTimedWait)
-   EXPECT_TRUE(w3.result == NULL);
- 
-   // this should end given the wait is for only 50 millis
--  EXPECT_TRUE(waitThread3.timed_join(MILLIS(100)));
-+  EXPECT_TRUE(waitThread3.timed_join(MILLIS(200)));
- 
-   EXPECT_TRUE(!w3.waiting);
-   EXPECT_TRUE(w3.result == NULL);
diff --git a/gnu/packages/patches/kodi-set-libcurl-ssl-parameters.patch b/gnu/packages/patches/kodi-set-libcurl-ssl-parameters.patch
index 2f60737e30..99d8a45de6 100644
--- a/gnu/packages/patches/kodi-set-libcurl-ssl-parameters.patch
+++ b/gnu/packages/patches/kodi-set-libcurl-ssl-parameters.patch
@@ -3,15 +3,16 @@ connections work we can set them based on SSL_CERT_DIR and SSL_CERT_FILE.
 
 --- a/xbmc/filesystem/CurlFile.cpp
 +++ b/xbmc/filesystem/CurlFile.cpp
-@@ -626,5 +626,9 @@
+@@ -626,8 +626,12 @@
    if (!m_cipherlist.empty())
      g_curlInterface.easy_setopt(h, CURLOPT_SSL_CIPHER_LIST, m_cipherlist.c_str());
- 
+
 +  // Load certificate data from environment paths
 +  g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_CAPATH, getenv("SSL_CERT_DIR"));
 +  g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_CAINFO, getenv("SSL_CERT_FILE"));
 +
-   // enable HTTP2 support. default: CURL_HTTP_VERSION_1_1. Curl >= 7.62.0 defaults to CURL_HTTP_VERSION_2TLS
-   g_curlInterface.easy_setopt(h, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
--
- }
+   if (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_curlDisableHTTP2)
+     g_curlInterface.easy_setopt(h, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+   else
+     // enable HTTP2 support. default: CURL_HTTP_VERSION_1_1. Curl >= 7.62.0 defaults to CURL_HTTP_VERSION_2TLS
+     g_curlInterface.easy_setopt(h, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
diff --git a/gnu/packages/patches/kodi-skip-test-449.patch b/gnu/packages/patches/kodi-skip-test-449.patch
deleted file mode 100644
index a418239a7c..0000000000
--- a/gnu/packages/patches/kodi-skip-test-449.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-This test fails regularly between 18.0rc3 and 18.0rc5.2
-
-449/520 Test #449: TestWebServer.CanHeadFile................................................***Failed    0.90 sec
-Note: Google Test filter = TestWebServer.CanHeadFile
-[==========] Running 1 test from 1 test case.
-[----------] Global test environment set-up.
-[----------] 1 test from TestWebServer
-[ RUN      ] TestWebServer.CanHeadFile
-/tmp/guix-build-kodi-18.0rc5.2.drv-0/kodi-18.0rc5.2-checkout/xbmc/network/test/TestWebServer.cpp:156: Failure
-      Expected: "4"
-To be equal to: httpHeader.GetValue("Content-Length").c_str()
-      Which is: "0"
-[  FAILED  ] TestWebServer.CanHeadFile (6 ms)
-[----------] 1 test from TestWebServer (6 ms total)
-
-[----------] Global test environment tear-down
-[==========] 1 test from 1 test case ran. (635 ms total)
-[  PASSED  ] 0 tests.
-[  FAILED  ] 1 test, listed below:
-[  FAILED  ] TestWebServer.CanHeadFile
-
----
- xbmc/network/test/TestWebServer.cpp | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/xbmc/network/test/TestWebServer.cpp b/xbmc/network/test/TestWebServer.cpp
-index a87d9f4..b2240f4 100644
---- a/xbmc/network/test/TestWebServer.cpp
-+++ b/xbmc/network/test/TestWebServer.cpp
-@@ -520,13 +520,13 @@ TEST_F(TestWebServer, CanNotHeadNonExistingFile)
-   ASSERT_FALSE(curl.Exists(CURL(GetUrlOfTestFile("file_does_not_exist"))));
- }
- 
--TEST_F(TestWebServer, CanHeadFile)
--{
--  CCurlFile curl;
--  ASSERT_TRUE(curl.Exists(CURL(GetUrlOfTestFile(TEST_FILES_HTML))));
--
--  CheckHtmlTestFileResponse(curl);
--}
-+//TEST_F(TestWebServer, CanHeadFile)
-+//{
-+//  CCurlFile curl;
-+//  ASSERT_TRUE(curl.Exists(CURL(GetUrlOfTestFile(TEST_FILES_HTML))));
-+//
-+//  CheckHtmlTestFileResponse(curl);
-+//}
- 
- TEST_F(TestWebServer, CanNotGetNonExistingFile)
- {
--- 
-2.20.1
-
diff --git a/gnu/packages/patches/u-boot-infodocs-target.patch b/gnu/packages/patches/u-boot-infodocs-target.patch
new file mode 100644
index 0000000000..5b21a99de3
--- /dev/null
+++ b/gnu/packages/patches/u-boot-infodocs-target.patch
@@ -0,0 +1,84 @@
+Upstream status: https://patchwork.ozlabs.org/project/uboot/list/?series=333259
+
+diff --git a/Makefile b/Makefile
+index de5746399a..597a8886c3 100644
+--- a/Makefile
++++ b/Makefile
+@@ -2372,7 +2372,7 @@ tcheck:
+ # Documentation targets
+ # ---------------------------------------------------------------------------
+ DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \
+-	       linkcheckdocs dochelp refcheckdocs
++	       linkcheckdocs dochelp refcheckdocs texinfodocs infodocs
+ PHONY += $(DOC_TARGETS)
+ $(DOC_TARGETS): scripts_basic FORCE
+ 	$(Q)$(MAKE) $(build)=doc $@
+diff --git a/doc/Makefile b/doc/Makefile
+index f5de65e927..d0904a9f99 100644
+--- a/doc/Makefile
++++ b/doc/Makefile
+@@ -69,6 +69,14 @@ quiet_cmd_sphinx = SPHINX  $@ --> file://$(abspath $(BUILDDIR)/$3/$4)
+ htmldocs:
+ 	@+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var)))
+ 
++texinfodocs:
++	@+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,texinfo,$(var),texinfo,$(var)))
++
++# Note: the 'info' Make target is generated by sphinx itself when
++# running the texinfodocs target defined above.
++infodocs: texinfodocs
++	$(MAKE) -C $(BUILDDIR)/texinfo info
++
+ linkcheckdocs:
+ 	@$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,linkcheck,$(var),,$(var)))
+ 
+@@ -109,6 +117,8 @@ cleandocs:
+ dochelp:
+ 	@echo  ' U-Boot documentation in different formats from ReST:'
+ 	@echo  '  htmldocs        - HTML'
++	@echo  '  texinfodocs     - Texinfo'
++	@echo  '  infodocs        - Info'
+ 	@echo  '  latexdocs       - LaTeX'
+ 	@echo  '  pdfdocs         - PDF'
+ 	@echo  '  epubdocs        - EPUB'
+diff --git a/doc/conf.py b/doc/conf.py
+index 62c8d31270..3db70f80c1 100644
+--- a/doc/conf.py
++++ b/doc/conf.py
+@@ -449,7 +449,7 @@ for fn in os.listdir('.'):
+ # One entry per manual page. List of tuples
+ # (source start file, name, description, authors, manual section).
+ man_pages = [
+-    (master_doc, 'dasuboot', 'The U-Boot Documentation',
++    (master_doc, 'u-boot', 'The U-Boot Documentation',
+      [author], 1)
+ ]
+ 
+@@ -463,8 +463,8 @@ man_pages = [
+ # (source start file, target name, title, author,
+ #  dir menu entry, description, category)
+ texinfo_documents = [
+-    (master_doc, 'DasUBoot', 'The U-Boot Documentation',
+-     author, 'DasUBoot', 'One line description of project.',
++    (master_doc, 'u-boot', 'The U-Boot Documentation',
++     author, 'U-Boot', 'Boot loader for embedded systems',
+      'Miscellaneous'),
+ ]
+ 
+diff --git a/doc/media/Makefile b/doc/media/Makefile
+index b9b43a34c3..9b32258696 100644
+--- a/doc/media/Makefile
++++ b/doc/media/Makefile
+@@ -22,10 +22,11 @@ $(BUILDDIR)/linker_lists.h.rst: ${API}/linker_lists.h ${PARSER} $(SRC_DIR)/linke
+ 
+ # Media build rules
+ 
+-.PHONY: all html epub xml latex
++.PHONY: all html texinfo epub xml latex
+ 
+ all: $(IMGDOT) $(BUILDDIR) ${TARGETS}
+ html: all
++texinfo: all
+ epub: all
+ xml: all
+ latex: $(IMGPDF) all
diff --git a/gnu/packages/patches/u-boot-patman-fix-help.patch b/gnu/packages/patches/u-boot-patman-fix-help.patch
new file mode 100644
index 0000000000..89bac06c2f
--- /dev/null
+++ b/gnu/packages/patches/u-boot-patman-fix-help.patch
@@ -0,0 +1,40 @@
+Upstream status: https://patchwork.ozlabs.org/project/uboot/list/?series=333156
+
+diff --git a/tools/patman/main.py b/tools/patman/main.py
+index 5a7756a221..bf300c6e64 100755
+--- a/tools/patman/main.py
++++ b/tools/patman/main.py
+@@ -7,6 +7,7 @@
+ """See README for more information"""
+ 
+ from argparse import ArgumentParser
++import importlib.resources
+ import os
+ import re
+ import shutil
+@@ -163,11 +164,8 @@ elif args.cmd == 'send':
+         fd.close()
+ 
+     elif args.full_help:
+-        tools.print_full_help(
+-            os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])),
+-                         'README.rst')
+-        )
+-
++        with importlib.resources.path('patman', 'README.rst') as readme:
++            tools.print_full_help(str(readme))
+     else:
+         # If we are not processing tags, no need to warning about bad ones
+         if not args.process_tags:
+diff --git a/tools/patman/setup.py b/tools/patman/setup.py
+index 43fdc00ce6..ce9bb4aa63 100644
+--- a/tools/patman/setup.py
++++ b/tools/patman/setup.py
+@@ -7,6 +7,6 @@ setup(name='patman',
+       scripts=['patman'],
+       packages=['patman'],
+       package_dir={'patman': ''},
+-      package_data={'patman': ['README']},
++      package_data={'patman': ['README.rst']},
+       classifiers=['Environment :: Console',
+                    'Topic :: Software Development'])
diff --git a/gnu/packages/patches/u-boot-patman-get-maintainer.patch b/gnu/packages/patches/u-boot-patman-get-maintainer.patch
new file mode 100644
index 0000000000..4377f8394e
--- /dev/null
+++ b/gnu/packages/patches/u-boot-patman-get-maintainer.patch
@@ -0,0 +1,104 @@
+Upstream status: https://patchwork.ozlabs.org/project/uboot/list/?series=333427
+
+diff --git a/tools/patman/patman.rst b/tools/patman/patman.rst
+index 7828899879..95b6c9c3f0 100644
+--- a/tools/patman/patman.rst
++++ b/tools/patman/patman.rst
+@@ -88,7 +88,7 @@ To add your own, create a file `~/.patman` like this::
+ Patman will also look for a `.patman` configuration file at the root
+ of the current project git repository, which makes it possible to
+ override the `project` settings variable or anything else in a
+-project-specific way.  The values of this "local" configuration file
++project-specific way. The values of this "local" configuration file
+ take precedence over those of the "global" one.
+ 
+ Aliases are recursive.
+diff --git a/tools/patman/test_settings.py b/tools/patman/test_settings.py
+index 9c14b4aaa3..c768a2fc64 100644
+--- a/tools/patman/test_settings.py
++++ b/tools/patman/test_settings.py
+@@ -6,38 +6,62 @@
+ import argparse
+ import contextlib
+ import os
+-import subprocess
++import sys
+ import tempfile
+ 
+ from patman import settings
++from patman import tools
+ 
+ 
+ @contextlib.contextmanager
+ def empty_git_repository():
+     with tempfile.TemporaryDirectory() as tmpdir:
+         os.chdir(tmpdir)
+-        subprocess.check_call(['git', 'init'])
++        tools.run('git', 'init', raise_on_error=True)
+         yield tmpdir
+ 
+ 
++@contextlib.contextmanager
++def cleared_command_line_args():
++    old_value = sys.argv[:]
++    sys.argv = [sys.argv[0]]
++    try:
++        yield
++    finally:
++        sys.argv = old_value
++
++
+ def test_git_local_config():
+-    with empty_git_repository():
+-        with tempfile.NamedTemporaryFile() as global_config:
+-            global_config.write(b'[settings]\n'
+-                                b'project=u-boot\n')
+-            global_config.flush()
+-            parser = argparse.ArgumentParser()
+-            parser.add_argument('-p', '--project', default='unknown')
+-
+-            # Test "global" config is used.
+-            settings.Setup(parser, 'unknown', global_config.name)
+-            args, _ = parser.parse_known_args()
+-            assert args.project == 'u-boot'
+-
+-            # Test local config can shadow it.
+-            with open('.patman', 'w', buffering=1) as f:
+-                f.write('[settings]\n'
+-                        'project=guix-patches\n')
+-            settings.Setup(parser, 'unknown', global_config.name)
+-            args, _ = parser.parse_known_args([])
+-            assert args.project == 'guix-patches'
++    # Clearing the command line arguments is required, otherwise
++    # arguments passed to the test running such as in 'pytest -k
++    # filter' would be processed by _UpdateDefaults and fail.
++    with cleared_command_line_args():
++        with empty_git_repository():
++            with tempfile.NamedTemporaryFile() as global_config:
++                global_config.write(b'[settings]\n'
++                                    b'project=u-boot\n')
++                global_config.flush()
++                parser = argparse.ArgumentParser()
++                parser.add_argument('-p', '--project', default='unknown')
++                subparsers = parser.add_subparsers(dest='cmd')
++                send = subparsers.add_parser('send')
++                send.add_argument('--no-check', action='store_false',
++                                  dest='check_patch', default=True)
++
++                # Test "global" config is used.
++                settings.Setup(parser, 'unknown', global_config.name)
++                args, _ = parser.parse_known_args([])
++                assert args.project == 'u-boot'
++                send_args, _ = send.parse_known_args([])
++                assert send_args.check_patch
++
++                # Test local config can shadow it.
++                with open('.patman', 'w', buffering=1) as f:
++                    f.write('[settings]\n'
++                            'project: guix-patches\n'
++                            'check_patch: False\n')
++                settings.Setup(parser, 'unknown', global_config.name)
++                args, _ = parser.parse_known_args([])
++                assert args.project == 'guix-patches'
++                send_args, _ = send.parse_known_args([])
++                assert not send_args.check_patch
diff --git a/gnu/packages/patches/u-boot-patman-local-conf.patch b/gnu/packages/patches/u-boot-patman-local-conf.patch
new file mode 100644
index 0000000000..3400982356
--- /dev/null
+++ b/gnu/packages/patches/u-boot-patman-local-conf.patch
@@ -0,0 +1,176 @@
+Upstream status: https://patchwork.ozlabs.org/project/uboot/list/?series=333354
+
+diff --git a/tools/patman/main.py b/tools/patman/main.py
+index bf300c6e64..3616b28f27 100755
+--- a/tools/patman/main.py
++++ b/tools/patman/main.py
+@@ -116,7 +116,7 @@ status.add_argument('-f', '--force', action='store_true',
+ argv = sys.argv[1:]
+ args, rest = parser.parse_known_args(argv)
+ if hasattr(args, 'project'):
+-    settings.Setup(gitutil, parser, args.project, '')
++    settings.Setup(parser, args.project)
+     args, rest = parser.parse_known_args(argv)
+ 
+ # If we have a command, it is safe to parse all arguments
+diff --git a/tools/patman/patman.rst b/tools/patman/patman.rst
+index 8c5c9cc2cc..7828899879 100644
+--- a/tools/patman/patman.rst
++++ b/tools/patman/patman.rst
+@@ -74,7 +74,7 @@ out where to send patches pretty well.
+ During the first run patman creates a config file for you by taking the default
+ user name and email address from the global .gitconfig file.
+ 
+-To add your own, create a file ~/.patman like this::
++To add your own, create a file `~/.patman` like this::
+ 
+     # patman alias file
+ 
+@@ -85,6 +85,12 @@ To add your own, create a file ~/.patman like this::
+     wolfgang: Wolfgang Denk <wd@denx.de>
+     others: Mike Frysinger <vapier@gentoo.org>, Fred Bloggs <f.bloggs@napier.net>
+ 
++Patman will also look for a `.patman` configuration file at the root
++of the current project git repository, which makes it possible to
++override the `project` settings variable or anything else in a
++project-specific way.  The values of this "local" configuration file
++take precedence over those of the "global" one.
++
+ Aliases are recursive.
+ 
+ The checkpatch.pl in the U-Boot tools/ subdirectory will be located and
+diff --git a/tools/patman/settings.py b/tools/patman/settings.py
+index 903d6fcb0b..e8e2908f1f 100644
+--- a/tools/patman/settings.py
++++ b/tools/patman/settings.py
+@@ -1,5 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0+
+ # Copyright (c) 2011 The Chromium OS Authors.
++# Copyright (c) 2022 Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+ #
+ 
+ try:
+@@ -11,8 +12,7 @@ import argparse
+ import os
+ import re
+ 
+-from patman import command
+-from patman import tools
++from patman import gitutil
+ 
+ """Default settings per-project.
+ 
+@@ -190,7 +190,8 @@ def ReadGitAliases(fname):
+ 
+     fd.close()
+ 
+-def CreatePatmanConfigFile(gitutil, config_fname):
++
++def CreatePatmanConfigFile(config_fname):
+     """Creates a config file under $(HOME)/.patman if it can't find one.
+ 
+     Args:
+@@ -328,26 +329,46 @@ def GetItems(config, section):
+     except:
+         raise
+ 
+-def Setup(gitutil, parser, project_name, config_fname=''):
++def Setup(parser, project_name, config_fname=None):
+     """Set up the settings module by reading config files.
+ 
++    Unless `config_fname` is specified, a `.patman` config file local
++    to the git repository is consulted, followed by the global
++    `$HOME/.patman`. If none exists, the later is created. Values
++    defined in the local config file take precedence over those
++    defined in the global one.
++
+     Args:
+-        parser:         The parser to update
++        parser:         The parser to update.
+         project_name:   Name of project that we're working on; we'll look
+             for sections named "project_section" as well.
+-        config_fname:   Config filename to read ('' for default)
++        config_fname:   Config filename to read.  An error is raised if it
++            does not exist.
+     """
+     # First read the git alias file if available
+     _ReadAliasFile('doc/git-mailrc')
+     config = _ProjectConfigParser(project_name)
+-    if config_fname == '':
++
++    if config_fname and not os.path.exists(config_fname):
++        raise Exception(f'provided {config_fname} does not exist')
++
++    if not config_fname:
+         config_fname = '%s/.patman' % os.getenv('HOME')
++    has_config = os.path.exists(config_fname)
++
++    git_local_config_fname = os.path.join(gitutil.get_top_level(), '.patman')
++    has_git_local_config = os.path.exists(git_local_config_fname)
+ 
+-    if not os.path.exists(config_fname):
+-        print("No config file found ~/.patman\nCreating one...\n")
+-        CreatePatmanConfigFile(gitutil, config_fname)
++    # Read the git local config last, so that its values override
++    # those of the global config, if any.
++    if has_config:
++        config.read(config_fname)
++    if has_git_local_config:
++        config.read(git_local_config_fname)
+ 
+-    config.read(config_fname)
++    if not (has_config or has_git_local_config):
++        print("No config file found.\nCreating ~/.patman...\n")
++        CreatePatmanConfigFile(config_fname)
+ 
+     for name, value in GetItems(config, 'alias'):
+         alias[name] = value.split(',')
+diff --git a/tools/patman/test_settings.py b/tools/patman/test_settings.py
+new file mode 100644
+index 0000000000..9c14b4aaa3
+--- /dev/null
++++ b/tools/patman/test_settings.py
+@@ -0,0 +1,43 @@
++# SPDX-License-Identifier: GPL-2.0+
++#
++# Copyright (c) 2022 Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
++#
++
++import argparse
++import contextlib
++import os
++import subprocess
++import tempfile
++
++from patman import settings
++
++
++@contextlib.contextmanager
++def empty_git_repository():
++    with tempfile.TemporaryDirectory() as tmpdir:
++        os.chdir(tmpdir)
++        subprocess.check_call(['git', 'init'])
++        yield tmpdir
++
++
++def test_git_local_config():
++    with empty_git_repository():
++        with tempfile.NamedTemporaryFile() as global_config:
++            global_config.write(b'[settings]\n'
++                                b'project=u-boot\n')
++            global_config.flush()
++            parser = argparse.ArgumentParser()
++            parser.add_argument('-p', '--project', default='unknown')
++
++            # Test "global" config is used.
++            settings.Setup(parser, 'unknown', global_config.name)
++            args, _ = parser.parse_known_args()
++            assert args.project == 'u-boot'
++
++            # Test local config can shadow it.
++            with open('.patman', 'w', buffering=1) as f:
++                f.write('[settings]\n'
++                        'project=guix-patches\n')
++            settings.Setup(parser, 'unknown', global_config.name)
++            args, _ = parser.parse_known_args([])
++            assert args.project == 'guix-patches'
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 19e10649f3..4b9d0623fe 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -23,6 +23,7 @@
 ;;; Copyright © 2020, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;; Copyright © 2022 Paul A. Patience <paul@apatience.com>
+;;; Copyright © 2022 Petr Hodina <phodina@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -183,7 +184,10 @@ information.")
                    (,(string-append qtbase "/lib/qt5/plugins/platforms"))))
                #t))))))
     (inputs
-     (list python-pypdf2 python-pyqt python-poppler-qt5 qtbase-5))
+     (list python-poppler-qt5
+           python-pypdf2
+           python-pyqt-without-qtwebkit
+           qtbase-5))
     (home-page "http://crazy-compilers.com/flyer-composer")
     (synopsis "Rearrange PDF pages to print as flyers on one sheet")
     (description "@command{flyer-composer} can be used to prepare one- or
@@ -1203,6 +1207,35 @@ information for every pixel as the input.")
 the framebuffer.")
     (license license:gpl2+)))
 
+(define-public pdfcrack
+  (package
+    (name "pdfcrack")
+    (version "0.20")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/pdfcrack/pdfcrack/"
+                                  "pdfcrack-" version "/"
+                                  "pdfcrack-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1d751n38cbagxqpw6ncvf3jfv7zhxl3fwh5nms2bjp6diyqjk2vv"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list #:tests? #f                  ;no test suite
+           #:make-flags #~(list (string-append "CC="
+                                               #$(cc-for-target)))
+           #:phases #~(modify-phases %standard-phases
+                        (delete 'configure) ;no configure script
+                        (replace 'install
+                          (lambda _
+                            (install-file "pdfcrack"
+                                          (string-append #$output "/bin")))))))
+    (home-page "https://pdfcrack.sourceforge.net/")
+    (synopsis "Password recovery tool for PDF files")
+    (description "PDFCrack is a simple tool for recovering passwords from PDF
+documents that use the standard security handler.")
+    (license license:gpl2+)))
+
 (define-public pdf2svg
   (package
     (name "pdf2svg")
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 2fc4db0d10..6e8ec0a25b 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -52,7 +52,7 @@
 ;;; Copyright © 2018-2022 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2018, 2019, 2021 Clément Lassieur <clement@lassieur.org>
-;;; Copyright © 2018, 2019, 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2018, 2019, 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2018 Luther Thompson <lutheroto@gmail.com>
 ;;; Copyright © 2018 Vagrant Cascadian <vagrant@debian.org>
 ;;; Copyright © 2015, 2018 Pjotr Prins <pjotr.guix@thebird.nl>
@@ -3158,12 +3158,12 @@ Prefix) - Encode and decode data structures.")
     (propagated-inputs
      (list python-pygobject python-pycairo python-pyatspi))
     (native-inputs
-     `(("python-nose" ,python-nose)
-       ("gtk+" ,gtk+)
-       ("xvfb" ,xorg-server)
-       ("dbus" ,dbus)
-       ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
-       ("gobject-introspection" ,gobject-introspection)))
+     (list python-nose
+           gtk+
+           xorg-server-for-tests
+           dbus
+           gsettings-desktop-schemas
+           gobject-introspection))
     (home-page "https://gitlab.com/dogtail/dogtail/")
     (synopsis "GUI test tool and automation framework written in Python")
     (description
@@ -4885,6 +4885,31 @@ via commands such as @command{rst2man}, as well as supporting Python code.")
     ;; tests contain Python 2 syntax.
     (arguments '(#:tests? #false))))
 
+(define-public python-docx
+  (package
+    (name "python-docx")
+    (version "0.8.11")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "python-docx" version))
+              (sha256
+               (base32
+                "1i7bxghb7knlyjain101qg1jmmz2b6qj03bi3vfxhvcml0rx418i"))))
+    (build-system pyproject-build-system)
+    (native-inputs
+     (list behave
+           python-flake8
+           python-mock
+           python-pyparsing
+           python-pytest))
+    (propagated-inputs
+     (list python-lxml))
+    (home-page "https://github.com/python-openxml/python-docx/")
+    (synopsis "Python library to create and modify Microsoft Word documents")
+    (description "This Python library can be used to create and update
+Microsoft Word (.docx) documents.")
+    (license license:expat)))
+
 (define-public python-restructuredtext-lint
   (package
     (name "python-restructuredtext-lint")
@@ -18887,13 +18912,13 @@ numbers, real numbers, mixed types and more, and comes with a shell command
 (define-public glances
   (package
   (name "glances")
-  (version "3.1.7")
+  (version "3.3.0.4")
   (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "Glances" version))
       (sha256
-        (base32 "020vb38qrb0m3sdr7xjr43cmcfxpnyg4hmb97wgxsa9zvwsjwa5x"))
+        (base32 "0klyyxqc7cbrf1i741304i3rrwan19qm2v58xmrlgqsmxac542la"))
       (modules '((guix build utils)))
       (snippet
        '(begin
@@ -18907,7 +18932,7 @@ numbers, real numbers, mixed types and more, and comes with a shell command
           #t))))
   (build-system python-build-system)
   (propagated-inputs
-   (list python-future python-psutil))
+   (list python-defusedxml python-future python-packaging python-psutil))
   (home-page "https://github.com/nicolargo/glances")
   (synopsis "Cross-platform curses-based monitoring tool")
   (description
@@ -23542,7 +23567,7 @@ tool).")
      (list python-entrypoints
            python-numpy
            python-msgpack
-           python-typing-extensions-next))
+           python-typing-extensions))
     (native-inputs
      (list python-cython python-pytest python-setuptools-scm))
     (home-page "https://github.com/zarr-developers/numcodecs")
diff --git a/gnu/packages/samba.scm b/gnu/packages/samba.scm
index 2a01279161..6e2c4d4f78 100644
--- a/gnu/packages/samba.scm
+++ b/gnu/packages/samba.scm
@@ -187,7 +187,7 @@ external dependencies.")
 (define-public samba
   (package
     (name "samba")
-    (version "4.16.4")
+    (version "4.16.8")
     (source
      ;; For updaters: the current PGP fingerprint is
      ;; 81F5E2832BD2545A1897B713AA99442FB680B620.
@@ -196,7 +196,7 @@ external dependencies.")
        (uri (string-append "https://download.samba.org/pub/samba/stable/"
                            "samba-" version ".tar.gz"))
        (sha256
-        (base32 "0bvhqinxwpbwp4ayhd9q8ga0w89gnkl1m3nrwpj1fnhjzd4ghclm"))))
+        (base32 "11a1vikbijaq7csg49h5ivn25gx84v6wx8z8kgsj1wmkhsf9bcmv"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -295,7 +295,9 @@ Desktops into Active Directory environments using the winbind daemon.")
 (define-public samba/fixed
   ;; Version that rarely changes, depended on by libsoup.
   (hidden-package
-   (package/inherit samba
+   (package
+     (inherit samba)
+     (replacement samba/fixed-patched)
      (version "4.15.3")
      (source
       (origin
@@ -319,6 +321,20 @@ Desktops into Active Directory environments using the winbind daemon.")
             libxslt
             libxml2)))))
 
+(define-public samba/fixed-patched
+  (package
+    (inherit samba/fixed)
+    ;; This is 4.15.13, but we need to trim the store file name to have
+    ;; the same length as the one we are grafting above.
+    (version "4.15.A")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://download.samba.org/pub/samba/stable/"
+                           "samba-4.15.13.tar.gz"))
+       (sha256
+        (base32 "0s29vzn5f42vjhx6h25c7v67n14ymqxn8glqa97d0rajd99y64n4"))))))
+
 (define-public talloc
   (package
     (name "talloc")
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index 52d081b47a..6332789fc7 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -1450,13 +1450,13 @@ adapted for other output formats, such as HTML or LaTeX.")
 (define-public r-formatr
   (package
     (name "r-formatr")
-    (version "1.12")
+    (version "1.13")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "formatR" version))
               (sha256
                (base32
-                "12wch1774113nlrc0lihfn5rbh4hln9sg6dv6zc2bvyb8fzyyllb"))))
+                "09z5wvbhrr2s2d196cxwzvjn0qr6pf4czrfqwdzqgqrdpwrxq1xj"))))
     (build-system r-build-system)
     (native-inputs
      (list r-knitr))
@@ -1472,13 +1472,13 @@ There is also a Shiny app as a user interface in this package.")
 (define-public r-highr
   (package
     (name "r-highr")
-    (version "0.9")
+    (version "0.10")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "highr" version))
               (sha256
                (base32
-                "0kgdv2vf1lz3b5kbal9s83gg6812nw7fvrq0rkyr0v4k1lwi3zxy"))))
+                "0yrlpjs8qzq1d7iy4gypnf4x1gvxq6vaghkdh1kfv433yqgvqmgc"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-xfun))
@@ -1930,14 +1930,14 @@ side.")
 (define-public r-locfit
   (package
     (name "r-locfit")
-    (version "1.5-9.6")
+    (version "1.5-9.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "locfit" version))
        (sha256
         (base32
-         "0xilf6gp3m8xla2fvxr491j31pvim707mnhswvm9yxnb0d09xs0y"))))
+         "1zvsa7hvnp0pvjyy0nnrg8bdv8gv4l23jb66wkc0kipvi78grra8"))))
     (build-system r-build-system)
     (propagated-inputs
      (list r-lattice))
@@ -2968,13 +2968,13 @@ a column in data frame.")
 (define-public r-rsqlite
   (package
     (name "r-rsqlite")
-    (version "2.2.19")
+    (version "2.2.20")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RSQLite" version))
               (sha256
                (base32
-                "11jzg3ywzaql3zwp7cwql1nilz8pvbz903whyh0d447rs0xnn3vj"))))
+                "1km7rg2yg3lmjz7lplypw61sx78mykyksgbdq3j5kjpcvirdbdaj"))))
     (properties `((upstream-name . "RSQLite")))
     (build-system r-build-system)
     (propagated-inputs
@@ -4318,17 +4318,17 @@ It uses and relies on grid graphics and formal (S4) classes and methods.")
 (define-public r-purrr
   (package
     (name "r-purrr")
-    (version "0.3.5")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "purrr" version))
        (sha256
         (base32
-         "1vzwajjw9h6jg5l82j7nkf3iraqmzwzh40s7q6wkq14awzbnqf52"))))
+         "1hm6lylx05s43rdk9q7xqdcydz495aim16c7xlw94lyw7v5l81kz"))))
     (build-system r-build-system)
     (propagated-inputs
-     (list r-magrittr r-rlang))
+     (list r-cli r-lifecycle r-magrittr r-rlang r-vctrs))
     (native-inputs
      (list r-knitr))
     (home-page "https://github.com/hadley/purrr")
diff --git a/gnu/packages/sync.scm b/gnu/packages/sync.scm
index 8330b96dd7..b15953984b 100644
--- a/gnu/packages/sync.scm
+++ b/gnu/packages/sync.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015-2020, 2022 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015-2020, 2022-2023 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2021 Ludovic Courtès <ludo@gnu.org>
@@ -366,7 +366,7 @@ silently and reliably flow across to every other.")
 (define-public onedrive
   (package
     (name "onedrive")
-    (version "2.4.21")
+    (version "2.4.22")
     (source
       (origin
         (method git-fetch)
@@ -375,7 +375,7 @@ silently and reliably flow across to every other.")
                (commit (string-append "v" version))))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "04rnkc6ap9mkghvlj102f2gvnjqg3bs4vw9q3wm869fsflnm3599"))))
+         (base32 "1lh915rs3zjfgdjhn35bhnn6zfknj4xd86s5jj3wznifj4f5kn7w"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -391,16 +391,12 @@ silently and reliably flow across to every other.")
        #:phases
        #~(modify-phases %standard-phases
          (add-after 'unpack 'link-to-external-libraries
-           (lambda* (#:key inputs #:allow-other-keys)
-             (setenv "DCFLAGS" (string-append
-                                 ;; The default linker is ld.gold.
-                                 "--linker=\"\" "
-                                 ;; Only link necessary libraries.
-                                 "-L--as-needed "))))
+           (lambda _
+             ;; Only link necessary libraries.
+             (setenv "DCFLAGS" "-L--as-needed")))
          (add-after 'configure 'adjust-makefile
            (lambda _
              (substitute* "Makefile"
-               (("-L/gnu") "-Wl,-rpath=/gnu")
                (("-O ") "-O2 "))))
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index f6673388d2..06b7b8b725 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -56,6 +56,7 @@
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system go)
   #:use-module (guix build-system meson)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module (guix git-download)
@@ -241,7 +242,7 @@ keybindings have different functions.")
 (define-public asciinema
   (package
     (name "asciinema")
-    (version "2.1.0")
+    (version "2.2.0")
     (source
      (origin
        (method git-fetch)
@@ -250,16 +251,18 @@ keybindings have different functions.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1alcz018jrrpasrmgs8nw775a6pf62xq2xgs54c4mb396prdqy4x"))))
-    (build-system python-build-system)
+        (base32 "0pcrghfi9p1p40d0339lcmhcv24hm1vxqr4rsdln34v385vqv14a"))))
+    (build-system pyproject-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _ (invoke "nosetests" "-v"))))))
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'fix-python-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (substitute* "tests/pty_test.py"
+                     (("python3") (search-input-file inputs "/bin/python3"))))))))
     (native-inputs
      ;; For tests.
-     (list python-nose))
+     (list python-pytest))
     (home-page "https://asciinema.org")
     (synopsis "Terminal session recorder")
     (description
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 4e7c183eee..182c1e5add 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -62,6 +62,7 @@
 ;;; Copyright © 2022 Bird <birdsite@airmail.cc>
 ;;; Copyright © 2022 Jai Vetrivelan <jaivetrivelan@gmail.com>
 ;;; Copyright © 2022 Chadwain Holness <chadwainholness@gmail.com>
+;;; Copyright © 2022 Andy Tai <atai@atai.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -4711,7 +4712,7 @@ create smoother and stable videos.")
 (define-public libopenshot
   (package
     (name "libopenshot")
-    (version "0.2.7")
+    (version "0.3.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4720,7 +4721,7 @@ create smoother and stable videos.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0i9bsn8gklm1mvj60l3d3xrxdgy8svpxjfqcwsr308j5zjn30pv8"))
+                "0q2899hbaqwh1gxyl9x84l116g82glk0wmr3r1xvfwb107m3mvx9"))
               (modules '((guix build utils)))
               (snippet '(begin
                           ;; Allow overriding of the python installation dir
@@ -4746,6 +4747,7 @@ create smoother and stable videos.")
            libopenshot-audio
            qtbase-5
            qtmultimedia-5
+           qtsvg-5
            zeromq))
     (arguments
      `(#:configure-flags
@@ -4774,7 +4776,7 @@ API.  It includes bindings for Python, Ruby, and other languages.")
 (define-public openshot
   (package
     (name "openshot")
-    (version "2.6.1")
+    (version "3.0.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4783,7 +4785,7 @@ API.  It includes bindings for Python, Ruby, and other languages.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0pa8iwl217503bjlqg2zlrw5lxyq5hvxrf5apxrh3843hj1w1myv"))
+                "1az59whx9sga6m8m2c3ndfls5h07r0jn4jipnyxckpxl32vpd147"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -4795,10 +4797,12 @@ API.  It includes bindings for Python, Ruby, and other languages.")
            font-dejavu
            libopenshot
            python
-           python-pyqt
+           python-pyqt-without-qtwebkit
+           python-pyqtwebengine
            python-pyzmq
            python-requests
-           qtsvg-5))
+           qtsvg-5
+           qtwebengine-5))
     (arguments
      `(#:modules ((guix build python-build-system)
                   (guix build qt-utils)
@@ -4820,12 +4824,6 @@ API.  It includes bindings for Python, Ruby, and other languages.")
                           (("fonts") "share/fonts/truetype")
                           (("[A-Za-z_-]+.ttf") "DejaVuSans.ttf")))
                       #t))
-                  ;; https://github.com/OpenShot/openshot-qt/issues/4502
-                  (add-before 'ensure-no-mtimes-pre-1980 'fix-symbolic-link
-                    (lambda _
-                      (delete-file "images/Humanity/actions/custom/razor_line_with_razor.png")
-                      (symlink "../../../../src/timeline/media/images/razor_line_with_razor.png"
-                               "images/Humanity/actions/custom/razor_line_with_razor.png")))
                   (add-before 'install 'set-tmp-home
                     (lambda _
                       ;; src/classes/info.py "needs" to create several
@@ -4834,10 +4832,16 @@ API.  It includes bindings for Python, Ruby, and other languages.")
                       #t))
                   (add-after 'install 'wrap-program
                     (lambda* (#:key outputs inputs #:allow-other-keys)
-                      (let ((out (assoc-ref outputs "out")))
+                      (let ((out (assoc-ref outputs "out"))
+                            (qtwebengine-process-path
+                             (search-input-file
+                              inputs "/lib/qt5/libexec/QtWebEngineProcess")))
                         (wrap-qt-program "openshot-qt"
-                                         #:output out #:inputs inputs))
-                      #t)))))
+                                         #:output out #:inputs inputs)
+                        ;; Help the program discover QtWebEngine at runtime.
+                        (wrap-program (string-append out "/bin/openshot-qt")
+                          `("QTWEBENGINEPROCESS_PATH" =
+                            (,qtwebengine-process-path)))))))))
     (home-page "https://www.openshot.org/")
     (synopsis "Video editor")
     (description "OpenShot takes your videos, photos, and music files and
@@ -4892,9 +4896,7 @@ transitions, and effects and then export your film to many common formats.")
                  `("PATH" ":" prefix
                    ,(list (string-append mlt "/bin"))))))))))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)
-       ("qttools-5" ,qttools-5)))
+     (list pkg-config python-wrapper qttools-5))
     (inputs
      (list bash-minimal
            ffmpeg
@@ -4902,9 +4904,6 @@ transitions, and effects and then export your film to many common formats.")
            frei0r-plugins
            jack-1
            ladspa
-           lame
-           libvpx
-           libx264
            mlt
            pulseaudio
            qtbase-5
@@ -4914,7 +4913,6 @@ transitions, and effects and then export your film to many common formats.")
            qtquickcontrols-5
            qtquickcontrols2-5
            qtsvg-5
-           qtwebkit
            qtwebsockets-5
            qtx11extras
            sdl2))
@@ -5600,7 +5598,7 @@ for details on how to change this.")
 (define-public svtplay-dl
   (package
     (name "svtplay-dl")
-    (version "4.14")
+    (version "4.17")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -5609,7 +5607,7 @@ for details on how to change this.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1wdrdszalvhv80m5jizbvjz4jc08acmbpxcsslyfb5cwh842in8m"))))
+                "0yjxmvldskw4pji3lg69pbx05izvxahz9my7z5p31mkiz6v33dmx"))))
     (build-system python-build-system)
     (inputs (list ffmpeg python-pyaml python-requests python-pysocks
                   python-cryptography))
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 18fe606c7b..a13467663e 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -56,7 +56,7 @@
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 muradm <mail@muradm.net>
 ;;; Copyright © 2022 Elais Player <elais@fastmail.com>
-;;; Copyright © 2022 Trevor Richards <trev@trevdev.ca>
+;;; Copyright © 2022, 2023 Trevor Richards <trev@trevdev.ca>
 ;;; Copyright © 2022 Fredrik Salomonsson <plattfot@posteo.net>
 ;;; Copyright © 2022 ( <paren@disroot.org>
 ;;; Copyright © 2022 zamfofex <zamfofex@twdb.moe>
@@ -2358,6 +2358,25 @@ interface[fn:dbus-spec].  It shows notifications using stumpwm:message
 by default.")
     (license license:gpl3+)))
 
+(define-public sbcl-stumpwm-battery-portable
+  (package
+    (inherit stumpwm-contrib)
+    (name "sbcl-stumpwm-battery-portable")
+    (build-system asdf-build-system/sbcl)
+    (inputs
+     (list sbcl-cl-ppcre
+           (list stumpwm "lib")))
+    (arguments
+     '(#:asd-systems '("battery-portable")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'chdir
+           (lambda _ (chdir "modeline/battery-portable"))))))
+    (synopsis "Battery level indicator for StumpWM")
+    (description "This module provides a battery level indicator for the
+modeline.  It can be displayed in the modeline with %B.")
+    (license (list license:expat license:gpl3+))))
+
 (define-public lemonbar
   (package
     (name "lemonbar")
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 9fd77642a1..fe1f0fd20a 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2017, 2020, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2017 Nikita <nikita@n0.is>
-;;; Copyright © 2018, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2018, 2020, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017, 2019 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2019 Tim Gesthuizen <tim.gesthuizen@yahoo.de>
@@ -760,7 +760,7 @@ site} for more information."
                                                (bluetooth-configuration-enable-adv-mon-interleave-scan
                                                 config))
                                           1 0))
-   
+
    "\n[GATT]"
    "\nCache = " (symbol->string (bluetooth-configuration-cache config))
    "\nKeySize = " (number->string (bluetooth-configuration-key-size config))
@@ -1541,6 +1541,11 @@ rules."
                                       (package-direct-input-selector
                                        "efl")
                                       enlightenment-package))
+          (service-extension udev-service-type
+                             (compose list
+                                      (package-direct-input-selector
+                                        "ddcutil")
+                                      enlightenment-package))
           (service-extension setuid-program-service-type
                              enlightenment-setuid-programs)
           (service-extension profile-service-type
diff --git a/gnu/services/sound.scm b/gnu/services/sound.scm
index 8410ba2418..3e778f3cea 100644
--- a/gnu/services/sound.scm
+++ b/gnu/services/sound.scm
@@ -204,17 +204,13 @@ computed-file object~%") file))))
                   '()
                   `(("default.pa.d" ,(extra-script-files->file-union
                                       extra-script-files))))
-            ,@(if (null? daemon-conf)
-                  '()
-                  `(("daemon.conf"
-                     ,(apply mixed-text-file "daemon.conf"
-                             "default-script-file = " default-script-file "\n"
-                             (map pulseaudio-conf-entry daemon-conf)))))
-            ,@(if (null? client-conf)
-                  '()
-                  `(("client.conf"
-                     ,(apply mixed-text-file "client.conf"
-                             (map pulseaudio-conf-entry client-conf))))))))))))
+            ("daemon.conf"
+             ,(apply mixed-text-file "daemon.conf"
+                     "default-script-file = /etc/pulse/default.pa\n"
+                     (map pulseaudio-conf-entry daemon-conf)))
+            ("client.conf"
+             ,(apply mixed-text-file "client.conf"
+                     (map pulseaudio-conf-entry client-conf))))))))))
 
 (define pulseaudio-service-type
   (service-type
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index 1ed3580315..f6d24820a8 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -33,6 +33,7 @@
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-35)
+  #:use-module (srfi srfi-71)
   #:use-module (ice-9 receive)
   #:use-module (web uri)
   #:use-module (guix memoization)
@@ -83,16 +84,16 @@
 (define %input-style
   (make-parameter 'variable)) ; or 'specification
 
-(define (string->licenses license-string)
+(define (string->licenses license-string license-prefix)
   (let ((licenses
          (map string-trim-both
               (string-tokenize license-string
                                (char-set-complement (char-set #\|))))))
-    (string->license licenses)))
+    (string->license licenses license-prefix)))
 
-(define string->license
-  (let ((prefix identity))
-    (match-lambda
+(define (string->license license-string license-prefix)
+  (let ((prefix license-prefix))
+    (match license-string
       ("AGPL-3" (prefix 'agpl3))
       ("AGPL (>= 3)" (prefix 'agpl3+))
       ("Artistic-2.0" (prefix 'artistic2.0))
@@ -138,8 +139,8 @@
       ("MIT + file LICENSE" (prefix 'expat))
       ("file LICENSE"
        `(,(prefix 'fsdg-compatible) "file://LICENSE"))
-      ((x) (string->license x))
-      ((lst ...) `(list ,@(map string->license lst)))
+      ((x) (string->license x license-prefix))
+      ((lst ...) `(list ,@(map (cut string->license <> license-prefix) lst)))
       (unknown `(,(prefix 'fsdg-compatible) ,unknown)))))
 
 (define (description->alist description)
@@ -395,7 +396,9 @@ empty list when the FIELD cannot be found."
         "c++11"
         "c++14"
         "c++17"
+        "c99"
         "getopt::long"
+        "gnu"
         "posix.1-2001"
         "linux"
         "none"
@@ -406,42 +409,44 @@ empty list when the FIELD cannot be found."
 (define (transform-sysname sysname)
   "Return a Guix package name for the common package name SYSNAME."
   (match sysname
+    ("booktabs" "texlive-booktabs")
+    ("bowtie2" "bowtie")
+    ("cat" "coreutils")
     ("java" "openjdk")
+    ("exiftool" "perl-image-exiftool")
     ("fftw3" "fftw")
-    ("tcl/tk" "tcl")
-    ("booktabs" "texlive-booktabs")
     ("freetype2" "freetype")
+    ("gettext" "gnu-gettext")
+    ("gmake" "gnu-make")
+    ("libarchive-devel" "libarchive")
+    ("libarchive_dev" "libarchive")
+    ("libbz2" "bzip2")
+    ("libexpat" "expat")
+    ("liblz4" "lz4")
+    ("liblzma" "xz")
+    ("libzstd" "zstd")
+    ("libxml2-devel" "libxml2")
+    ("libz" "zlib")
     ("mariadb-devel" "mariadb")
     ("mysql56_dev" "mariadb")
+    ("pandoc-citeproc" "pandoc")
+    ("python3" "python-3")
     ("sqlite3" "sqlite")
+    ("svn" "subversion")
+    ("tcl/tk" "tcl")
     ("udunits-2" "udunits")
+    ("whoami" "coreutils")
     ("x11" "libx11")
     (_ sysname)))
 
 (define cran-guix-name (cut guix-name "r-" <>))
 
-(define (tarball-needs-fortran? tarball)
-  "Check if the TARBALL contains Fortran source files."
-  (define (check pattern)
-    (parameterize ((current-error-port (%make-void-port "rw+"))
-                   (current-output-port (%make-void-port "rw+")))
-      (zero? (system* "tar" "--wildcards" "--list" pattern "-f" tarball))))
-  (or (check "*.f90")
-      (check "*.f95")
-      (check "*.f")))
-
 (define (directory-needs-fortran? dir)
   "Check if the directory DIR contains Fortran source files."
-  (match (find-files dir "\\.f(90|95)$")
+  (match (find-files dir "\\.f(90|95)?$")
     (() #f)
     (_ #t)))
 
-(define (needs-fortran? thing tarball?)
-  "Check if the THING contains Fortran source files."
-  (if tarball?
-      (tarball-needs-fortran? thing)
-      (directory-needs-fortran? thing)))
-
 (define (files-match-pattern? directory regexp . file-patterns)
   "Return #T if any of the files matching FILE-PATTERNS in the DIRECTORY match
 the given REGEXP."
@@ -457,58 +462,42 @@ the given REGEXP."
                     (else (loop))))))))
          (apply find-files directory file-patterns))))
 
-(define (tarball-files-match-pattern? tarball regexp . file-patterns)
-  "Return #T if any of the files represented by FILE-PATTERNS in the TARBALL
-match the given REGEXP."
-  (call-with-temporary-directory
-   (lambda (dir)
-     (parameterize ((current-error-port (%make-void-port "rw+")))
-       (apply system* "tar"
-              "xf" tarball "-C" dir
-              `("--wildcards" ,@file-patterns)))
-     (files-match-pattern? dir regexp))))
-
 (define (directory-needs-zlib? dir)
   "Return #T if any of the Makevars files in the src directory DIR contain a
 zlib linker flag."
   (files-match-pattern? dir "-lz" "(Makevars.*|configure.*)"))
 
-(define (tarball-needs-zlib? tarball)
-  "Return #T if any of the Makevars files in the src directory of the TARBALL
-contain a zlib linker flag."
-  (tarball-files-match-pattern?
-   tarball "-lz"
-   "*/src/Makevars*" "*/src/configure*" "*/configure*"))
-
-(define (needs-zlib? thing tarball?)
-  "Check if the THING contains files indicating a dependency on zlib."
-  (if tarball?
-      (tarball-needs-zlib? thing)
-      (directory-needs-zlib? thing)))
-
 (define (directory-needs-pkg-config? dir)
   "Return #T if any of the Makevars files in the src directory DIR reference
 the pkg-config tool."
   (files-match-pattern? dir "pkg-config"
                         "(Makevars.*|configure.*)"))
 
-(define (tarball-needs-pkg-config? tarball)
-  "Return #T if any of the Makevars files in the src directory of the TARBALL
-reference the pkg-config tool."
-  (tarball-files-match-pattern?
-   tarball "pkg-config"
-   "*/src/Makevars*" "*/src/configure*" "*/configure*"))
-
-(define (needs-pkg-config? thing tarball?)
-  "Check if the THING contains files indicating a dependency on pkg-config."
+(define (source-dir->dependencies dir)
+  "Guess dependencies of R package source in DIR and return two values: a list
+of package names for INPUTS and another list of names of NATIVE-INPUTS."
+  (values
+   (if (directory-needs-zlib? dir) '("zlib") '())
+   (append
+       (if (directory-needs-pkg-config? dir) '("pkg-config") '())
+       (if (directory-needs-fortran? dir) '("gfortran") '()))))
+
+(define (source->dependencies source tarball?)
+  "SOURCE-DIR->DEPENDENCIES, but for directories and tarballs as indicated
+by TARBALL?"
   (if tarball?
-      (tarball-needs-pkg-config? thing)
-      (directory-needs-pkg-config? thing)))
+    (call-with-temporary-directory
+     (lambda (dir)
+       (parameterize ((current-error-port (%make-void-port "rw+")))
+         (system* "tar" "xf" source "-C" dir))
+       (source-dir->dependencies dir)))
+    (source-dir->dependencies source)))
 
 (define (needs-knitr? meta)
   (member "knitr" (listify meta "VignetteBuilder")))
 
-(define (description->package repository meta)
+(define* (description->package repository meta #:key (license-prefix identity)
+                               (download-source download))
   "Return the `package' s-expression for an R package published on REPOSITORY
 from the alist META, which was derived from the R package's DESCRIPTION file."
   (let* ((base-url   (case repository
@@ -528,7 +517,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file."
          (name       (assoc-ref meta "Package"))
          (synopsis   (assoc-ref meta "Title"))
          (version    (assoc-ref meta "Version"))
-         (license    (string->licenses (assoc-ref meta "License")))
+         (license    (string->licenses (assoc-ref meta "License") license-prefix))
          ;; Some packages have multiple home pages.  Some have none.
          (home-page  (case repository
                        ((git) (assoc-ref meta 'git))
@@ -550,12 +539,15 @@ from the alist META, which was derived from the R package's DESCRIPTION file."
                           (_ #f)))))
          (git?       (if (assoc-ref meta 'git) #true #false))
          (hg?        (if (assoc-ref meta 'hg) #true #false))
-         (source     (download source-url #:method (cond
-                                                    (git? 'git)
-                                                    (hg? 'hg)
-                                                    (else #f))))
+         (source     (download-source source-url #:method (cond
+                                                           (git? 'git)
+                                                           (hg? 'hg)
+                                                           (else #f))))
+         (tarball?   (not (or git? hg?)))
+         (source-inputs source-native-inputs
+          (source->dependencies source tarball?))
          (sysdepends (append
-                      (if (needs-zlib? source (not (or git? hg?))) '("zlib") '())
+                      source-inputs
                       (filter (lambda (name)
                                 (not (member name invalid-packages)))
                               (map string-downcase (listify meta "SystemRequirements")))))
@@ -615,10 +607,7 @@ from the alist META, which was derived from the R package's DESCRIPTION file."
               ,@(maybe-inputs (map transform-sysname sysdepends))
               ,@(maybe-inputs (map cran-guix-name propagate) 'propagated-inputs)
               ,@(maybe-inputs
-                 `(,@(if (needs-fortran? source (not (or git? hg?)))
-                         '("gfortran") '())
-                   ,@(if (needs-pkg-config? source (not (or git? hg?)))
-                         '("pkg-config") '())
+                 `(,@source-native-inputs
                    ,@(if (needs-knitr? meta)
                          '("r-knitr") '()))
                  'native-inputs)
@@ -644,31 +633,41 @@ from the alist META, which was derived from the R package's DESCRIPTION file."
 
 (define cran->guix-package
   (memoize
-   (lambda* (package-name #:key (repo 'cran) version)
+   (lambda* (package-name #:key (repo 'cran) version (license-prefix identity)
+                          (fetch-description fetch-description)
+                          (download-source download)
+                          #:allow-other-keys)
      "Fetch the metadata for PACKAGE-NAME from REPO and return the `package'
 s-expression corresponding to that package, or #f on failure."
      (let ((description (fetch-description repo package-name version)))
        (if description
-           (description->package repo description)
+           (description->package repo description
+                                 #:license-prefix license-prefix
+                                 #:download-source download-source)
            (case repo
              ((git)
               ;; Retry import from Bioconductor
-              (cran->guix-package package-name #:repo 'bioconductor))
+              (cran->guix-package package-name #:repo 'bioconductor
+                                  #:license-prefix license-prefix))
              ((hg)
               ;; Retry import from Bioconductor
-              (cran->guix-package package-name #:repo 'bioconductor))
+              (cran->guix-package package-name #:repo 'bioconductor
+                                  #:license-prefix license-prefix))
              ((bioconductor)
               ;; Retry import from CRAN
-              (cran->guix-package package-name #:repo 'cran))
+              (cran->guix-package package-name #:repo 'cran
+                                  #:license-prefix license-prefix))
              (else
               (values #f '()))))))))
 
-(define* (cran-recursive-import package-name #:key (repo 'cran) version)
+(define* (cran-recursive-import package-name #:key (repo 'cran) version
+                                (license-prefix identity))
   (recursive-import package-name
                     #:version version
                     #:repo repo
                     #:repo->guix-package cran->guix-package
-                    #:guix-name cran-guix-name))
+                    #:guix-name cran-guix-name
+                    #:license-prefix license-prefix))
 
 
 ;;;
diff --git a/guix/import/crate.scm b/guix/import/crate.scm
index 339dbcd74c..c17d96ef41 100644
--- a/guix/import/crate.scm
+++ b/guix/import/crate.scm
@@ -217,7 +217,8 @@ and LICENSE."
                          'unknown-license!)))
               (string-split string (string->char-set " /"))))
 
-(define* (crate->guix-package crate-name #:key version include-dev-deps? repo)
+(define* (crate->guix-package crate-name #:key version include-dev-deps?
+                              #:allow-other-keys)
   "Fetch the metadata for CRATE-NAME from crates.io, and return the
 `package' s-expression corresponding to that package, or #f on failure.
 When VERSION is specified, convert it into a semver range and attempt to fetch
diff --git a/guix/import/egg.scm b/guix/import/egg.scm
index 10a40fe4f8..90d97909b5 100644
--- a/guix/import/egg.scm
+++ b/guix/import/egg.scm
@@ -171,7 +171,8 @@ FILE is specified, return the package metadata in FILE."
 ;;; Egg importer.
 ;;;
 
-(define* (egg->guix-package name version #:key (file #f) (source #f))
+(define* (egg->guix-package name version #:key (file #f) (source #f)
+                            #:allow-other-keys)
   "Import a CHICKEN egg called NAME from either the given .egg FILE, or from the
 latest NAME metadata downloaded from the official repository if FILE is #f.
 Return a <package> record or #f on failure.  If VERSION is specified, import
diff --git a/guix/import/elm.scm b/guix/import/elm.scm
index 74902b8617..c8fb15343f 100644
--- a/guix/import/elm.scm
+++ b/guix/import/elm.scm
@@ -190,7 +190,7 @@ given NAME and VERSION, and a list of Elm packages it depends on."
 
 (define elm->guix-package
   (memoize
-   (lambda* (package-name #:key repo version)
+   (lambda* (package-name #:key version #:allow-other-keys)
      "Fetch the metadata for PACKAGE-NAME, an Elm package registered at
 package.elm.org, and return two values: the `package' s-expression
 corresponding to that package (or #f on failure) and a list of Elm
diff --git a/guix/import/gem.scm b/guix/import/gem.scm
index 8ad0662628..c8d6cd4d2d 100644
--- a/guix/import/gem.scm
+++ b/guix/import/gem.scm
@@ -124,7 +124,8 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES."
                  ((license) (license->symbol license))
                  (_ `(list ,@(map license->symbol licenses)))))))
 
-(define* (gem->guix-package package-name #:key (repo 'rubygems) version)
+(define* (gem->guix-package package-name #:key (repo 'rubygems) version
+                            #:allow-other-keys)
   "Fetch the metadata for PACKAGE-NAME from rubygems.org, and return the
 `package' s-expression corresponding to that package, or #f on failure.
 Optionally include a VERSION string to fetch a specific version gem."
diff --git a/guix/import/gnu.scm b/guix/import/gnu.scm
index 139c32a545..cff088f423 100644
--- a/guix/import/gnu.scm
+++ b/guix/import/gnu.scm
@@ -109,7 +109,8 @@ download policy (see 'download-tarball' for details.)"
        #f))))
 
 (define* (gnu->guix-package name
-                            #:key (key-download 'interactive))
+                            #:key (key-download 'interactive)
+                            #:allow-other-keys)
   "Return the package declaration for NAME as an s-expression.  Use
 KEY-DOWNLOAD as the OpenPGP key download policy (see 'download-tarball' for
 details.)"
diff --git a/guix/import/go.scm b/guix/import/go.scm
index d00c13475a..90d4c8931d 100644
--- a/guix/import/go.scm
+++ b/guix/import/go.scm
@@ -602,7 +602,8 @@ available versions:~{ ~a~}.")
 (define* (go-module->guix-package module-path #:key
                                   (goproxy "https://proxy.golang.org")
                                   version
-                                  pin-versions?)
+                                  pin-versions?
+                                  #:allow-other-keys)
   "Return the package S-expression corresponding to MODULE-PATH at VERSION, a Go package.
 The meta-data is fetched from the GOPROXY server and https://pkg.go.dev/.
 When VERSION is unspecified, the latest version available is used."
@@ -687,7 +688,7 @@ This package and its dependencies won't be imported.~%")
    package-name
    #:repo->guix-package
    (memoize
-    (lambda* (name #:key version repo)
+    (lambda* (name #:key version repo #:allow-other-keys)
       (receive (package-sexp dependencies)
           (go-module->guix-package* name #:goproxy goproxy
                                     #:version version
diff --git a/guix/import/hackage.scm b/guix/import/hackage.scm
index 3c2cd75db4..7bc2908405 100644
--- a/guix/import/hackage.scm
+++ b/guix/import/hackage.scm
@@ -326,7 +326,8 @@ the hash of the Cabal file."
 (define* (hackage->guix-package package-name #:key
                                 (include-test-dependencies? #t)
                                 (port #f)
-                                (cabal-environment '()))
+                                (cabal-environment '())
+                                #:allow-other-keys)
   "Fetch the Cabal file for PACKAGE-NAME from hackage.haskell.org, or, if the
 called with keyword parameter PORT, from PORT.  Return the `package'
 S-expression corresponding to that package, or #f on failure.
@@ -353,7 +354,7 @@ respectively."
 
 (define* (hackage-recursive-import package-name . args)
   (recursive-import package-name
-                    #:repo->guix-package (lambda* (name #:key repo version)
+                    #:repo->guix-package (lambda* (name #:key version #:allow-other-keys)
                                            (apply hackage->guix-package/m
                                                   (cons name args)))
                     #:guix-name hackage-name->package-name))
diff --git a/guix/import/hexpm.scm b/guix/import/hexpm.scm
index 8a009fd245..dac5d1756f 100644
--- a/guix/import/hexpm.scm
+++ b/guix/import/hexpm.scm
@@ -234,7 +234,7 @@ build-system, and DEPENDENCIES the inputs for the package."
           (fold (lambda (a b)
                   (if (version>? a b) a b)) (car versions) versions)))))
 
-(define* (hexpm->guix-package package-name #:key repo version)
+(define* (hexpm->guix-package package-name #:key version #:allow-other-keys)
   "Fetch the metadata for PACKAGE-NAME from hexpms.io, and return the
 `package' s-expression corresponding to that package, or #f on failure.
 When VERSION is specified, attempt to fetch that version; otherwise fetch the
diff --git a/guix/import/minetest.scm b/guix/import/minetest.scm
index 1f1cfc834d..e5775e2fa9 100644
--- a/guix/import/minetest.scm
+++ b/guix/import/minetest.scm
@@ -441,7 +441,8 @@ DEPENDENCIES as a list of AUTHOR/NAME strings."
                #f)))))
    dependency-list))
 
-(define* (%minetest->guix-package author/name #:key (sort %default-sort-key))
+(define* (%minetest->guix-package author/name #:key (sort %default-sort-key)
+                                  #:allow-other-keys)
   "Fetch the metadata for AUTHOR/NAME from https://content.minetest.net, and
 return the 'package' S-expression corresponding to that package, or raise an
 exception on failure.  On success, also return the upstream dependencies as a
@@ -477,7 +478,7 @@ list of AUTHOR/NAME strings."
   (memoize %minetest->guix-package))
 
 (define* (minetest-recursive-import author/name #:key (sort %default-sort-key))
-  (define* (minetest->guix-package* author/name #:key repo version)
+  (define* (minetest->guix-package* author/name #:key version #:allow-other-keys)
     (minetest->guix-package author/name #:sort sort))
   (recursive-import author/name
                     #:repo->guix-package minetest->guix-package*
diff --git a/guix/import/opam.scm b/guix/import/opam.scm
index 59dbb7cb8b..29b2b886bf 100644
--- a/guix/import/opam.scm
+++ b/guix/import/opam.scm
@@ -340,7 +340,7 @@ path to the repository."
                     (sha256 (base32 ,(guix-hash-url temp)))))))
         'no-source-information)))
 
-(define* (opam->guix-package name #:key (repo 'opam) version)
+(define* (opam->guix-package name #:key (repo 'opam) version #:allow-other-keys)
   "Import OPAM package NAME from REPOSITORY (a directory name) or, if
 REPOSITORY is #f, from the official OPAM repository.  Return a 'package' sexp
 or #f on failure."
diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm
index 0e5998b36e..c9aaacbc3f 100644
--- a/guix/import/pypi.scm
+++ b/guix/import/pypi.scm
@@ -492,7 +492,7 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE."
 
 (define pypi->guix-package
   (memoize
-   (lambda* (package-name #:key repo version)
+   (lambda* (package-name #:key version #:allow-other-keys)
      "Fetch the metadata for PACKAGE-NAME from pypi.org, and return the
 `package' s-expression corresponding to that package, or #f on failure."
      (let* ((project (pypi-fetch package-name))
diff --git a/guix/import/stackage.scm b/guix/import/stackage.scm
index e54df95985..70d3e271f4 100644
--- a/guix/import/stackage.scm
+++ b/guix/import/stackage.scm
@@ -109,7 +109,8 @@
              (lts-version %default-lts-version)
              (packages
               (stackage-lts-packages
-               (stackage-lts-info-fetch lts-version))))
+               (stackage-lts-info-fetch lts-version)))
+             #:allow-other-keys)
      "Fetch Cabal file for PACKAGE-NAME from hackage.haskell.org.  The retrieved
 version corresponds to the version of PACKAGE-NAME specified in the LTS-VERSION
 release at stackage.org.  Return the `package' S-expression corresponding to
@@ -126,7 +127,7 @@ included in the Stackage LTS release."
 
 (define (stackage-recursive-import package-name . args)
   (recursive-import package-name
-                    #:repo->guix-package (lambda* (name #:key repo version)
+                    #:repo->guix-package (lambda* (name #:key version #:allow-other-keys)
                                            (apply stackage->guix-package (cons name args)))
                     #:guix-name hackage-name->package-name))
 
diff --git a/guix/import/texlive.scm b/guix/import/texlive.scm
index 116bd1f66a..6bf7f92e60 100644
--- a/guix/import/texlive.scm
+++ b/guix/import/texlive.scm
@@ -303,9 +303,9 @@ of those files are returned that are unexpectedly installed."
 (define texlive->guix-package
   (memoize
    (lambda* (name #:key
-                  repo
                   (version (number->string %texlive-revision))
-                  (package-database tlpdb))
+                  (package-database tlpdb)
+                  #:allow-other-keys)
      "Find the metadata for NAME in the tlpdb and return the `package'
 s-expression corresponding to that package, or #f on failure."
      (tlpdb->package name version (package-database)))))
diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index d6b179b57c..41311cb86e 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -580,11 +580,11 @@ obtain a node's uniquely identifying \"key\"."
                    (set-insert (node-name head) visited))))))))
 
 (define* (recursive-import package-name
-                           #:key repo->guix-package guix-name version repo
-                           #:allow-other-keys)
+                           #:key repo->guix-package guix-name version
+                           #:allow-other-keys #:rest rest)
   "Return a list of package expressions for PACKAGE-NAME and all its
 dependencies, sorted in topological order.  For each package,
-call (REPO->GUIX-PACKAGE NAME :KEYS version repo), which should return a
+call (REPO->GUIX-PACKAGE NAME :KEYS version), which should return a
 package expression and a list of dependencies; call (GUIX-NAME PACKAGE-NAME)
 to obtain the Guix package name corresponding to the upstream name."
   (define-record-type <node>
@@ -599,9 +599,12 @@ to obtain the Guix package name corresponding to the upstream name."
     (not (null? (find-packages-by-name (guix-name name) version))))
 
   (define (lookup-node name version)
-    (let* ((package dependencies (repo->guix-package name
-                                                     #:version version
-                                                     #:repo repo))
+    (let* ((pre post (break (cut eq? #:version <>) rest))
+           (post* (match post
+                    ((#:version v . more) more)
+                    (_ post)))
+           (args (append pre (list #:version version) post*))
+           (package dependencies (apply repo->guix-package (cons* name args)))
            (normalized-deps (map (match-lambda
                                    ((name version) (list name version))
                                    (name (list name #f))) dependencies)))
diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm
index 2934d4300a..5298f059f2 100644
--- a/guix/scripts/import/cran.scm
+++ b/guix/scripts/import/cran.scm
@@ -53,6 +53,9 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
   (display (G_ "
   -s, --style=STYLE      choose output style, either specification or variable"))
   (display (G_ "
+  -p, --license-prefix=PREFIX
+                         add custom prefix to licenses"))
+  (display (G_ "
   -V, --version          display version information and exit"))
   (newline)
   (show-bug-report-information))
@@ -74,6 +77,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                  (lambda (opt name arg result)
                    (alist-cons 'style (string->symbol arg)
                                (alist-delete 'style result))))
+         (option '(#\p "license-prefix") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'license-prefix arg
+                               (alist-delete 'license-prefix result))))
          (option '(#\r "recursive") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'recursive #t result)))
@@ -95,7 +102,13 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                             (('argument . value)
                              value)
                             (_ #f))
-                           (reverse opts))))
+                           (reverse opts)))
+         (prefix (assoc-ref opts 'license-prefix))
+         (prefix-proc (if (string? prefix)
+                        (lambda (symbol)
+                          (string->symbol
+                            (string-append prefix (symbol->string symbol))))
+                        identity)))
     (parameterize ((%input-style (assoc-ref opts 'style)))
       (match args
         ((spec)
@@ -107,11 +120,13 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                       (filter identity
                               (cran-recursive-import name
                                                      #:version version
-                                                     #:repo (or (assoc-ref opts 'repo) 'cran)))))
+                                                     #:repo (or (assoc-ref opts 'repo) 'cran)
+                                                     #:license-prefix prefix-proc))))
                ;; Single import
                (let ((sexp (cran->guix-package name
                                                #:version version
-                                               #:repo (or (assoc-ref opts 'repo) 'cran))))
+                                               #:repo (or (assoc-ref opts 'repo) 'cran)
+                                               #:license-prefix prefix-proc)))
                  (unless sexp
                    (leave (G_ "failed to download description for package '~a'~%")
                           name))
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index e0b94ce48d..6498d73c2b 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -183,9 +183,31 @@ specified with `--select'.\n"))
   (newline)
   (show-bug-report-information))
 
+
+;;;
+;;; Utilities.
+;;;
+
+(define-record-type <update-spec>
+  (%update-spec package version)
+  update?
+  (package update-spec-package)
+  (version update-spec-version))
+
+(define* (update-spec package #:optional version)
+  (%update-spec package version))
+
+(define (update-specification->update-spec spec)
+  "Given SPEC, a package name like \"guile@2.0=2.0.8\", return a <update>
+record with two fields: the package to upgrade, and the target version."
+  (match (string-rindex spec #\=)
+    (#f  (update-spec (specification->package spec) #f))
+    (idx (update-spec (specification->package (substring spec 0 idx))
+                      (substring spec (1+ idx))))))
+
 (define (options->update-specs opts)
-  "Return the list of packages requested by OPTS, honoring options like
-'--recursive'."
+  "Return the list of <update-spec> records requested by OPTS, honoring
+options like '--recursive'."
   (define core-package?
     (let* ((input->package (match-lambda
                              ((name (? package? package) _ ...) package)
@@ -220,60 +242,43 @@ update would trigger a complete rebuild."
         (_
          (cons package lst)))))
 
-  (define args-packages
-    ;; Packages explicitly passed as command-line arguments.
-    (match (filter-map (match-lambda
+  (define update-specs
+    ;; Update specs explicitly passed as command-line arguments.
+    (match (append-map (match-lambda
                          (('argument . spec)
                           ;; Take either the specified version or the
                           ;; latest one.
-                          (update-specification->update-spec spec))
+                          (list (update-specification->update-spec spec)))
                          (('expression . exp)
-                          (read/eval-package-expression exp))
-                         (_ #f))
+                          (list (update-spec (read/eval-package-expression exp))))
+                         (('manifest . manifest)
+                          (map update-spec (packages-from-manifest manifest)))
+                         (_
+                          '()))
                        opts)
       (()                                         ;default to all packages
        (let ((select? (match (assoc-ref opts 'select)
                         ('core core-package?)
                         ('non-core (negate core-package?))
                         (_ (const #t)))))
-         (fold-packages (lambda (package result)
-                          (if (select? package)
-                              (keep-newest package result)
-                              result))
-                        '())))
+         (map update-spec
+              (fold-packages (lambda (package result)
+                               (if (select? package)
+                                   (keep-newest package result)
+                                   result))
+                             '()))))
       (some                                       ;user-specified packages
        some)))
 
-  (define packages
-    (match (assoc-ref opts 'manifest)
-      (#f args-packages)
-      ((? string? file) (packages-from-manifest file))))
-
   (if (assoc-ref opts 'recursive?)
-      (mlet %store-monad ((edges (node-edges %bag-node-type
-                                             (all-packages))))
-        (return (node-transitive-edges packages edges)))
+      (mlet* %store-monad ((edges (node-edges %bag-node-type (all-packages)))
+                           (packages -> (node-transitive-edges
+                                         (map update-spec-package update-specs)
+                                         edges)))
+        ;; FIXME: The 'version' field of each update spec is lost.
+        (return (map update-spec packages)))
       (with-monad %store-monad
-        (return packages))))
-
-
-;;;
-;;; Utilities.
-;;;
-
-(define-record-type <update-spec>
-  (update-spec package version)
-  update?
-  (package update-spec-package)
-  (version update-spec-version))
-
-(define (update-specification->update-spec spec)
-  "Given SPEC, a package name like \"guile@2.0=2.0.8\", return a <update>
-record with two fields: the package to upgrade, and the target version."
-  (match (string-rindex spec #\=)
-    (#f  (update-spec (specification->package spec) #f))
-    (idx (update-spec (specification->package (substring spec 0 idx))
-                      (substring spec (1+ idx))))))
+        (return update-specs))))
 
 
 ;;;
@@ -382,10 +387,15 @@ downloaded and authenticated; not updating~%")
       (when warn?
         (warn-no-updater package))))
 
-(define* (check-for-package-update package updaters #:key warn?)
-  "Check whether an update is available for PACKAGE and print a message.  When
-WARN? is true and no updater exists for PACKAGE, print a warning."
-  (match (package-latest-release package updaters)
+(define* (check-for-package-update update-spec updaters #:key warn?)
+  "Check whether UPDATE-SPEC is feasible, and print a message.
+When WARN? is true and no updater exists for PACKAGE, print a warning."
+  (define package
+    (update-spec-package update-spec))
+
+  (match (package-latest-release package updaters
+                                 #:version
+                                 (update-spec-version update-spec))
     ((? upstream-source? source)
      (let ((loc (or (package-field-location package 'version)
                     (package-location package))))
@@ -403,23 +413,34 @@ WARN? is true and no updater exists for PACKAGE, print a warning."
                   (package-version package)
                   (package-name package))))
          (else
-          (when warn?
-            (warning loc
-                     (G_ "~a is greater than \
+          (if (update-spec-version update-spec)
+              (info loc
+                    (G_ "~a would be downgraded from ~a to ~a~%")
+                    (package-name package)
+                    (package-version package)
+                    (upstream-source-version source))
+              (when warn?
+                (warning loc
+                         (G_ "~a is greater than \
 the latest known version of ~a (~a)~%")
-                     (package-version package)
-                     (package-name package)
-                     (upstream-source-version source)))))))
+                         (package-version package)
+                         (package-name package)
+                         (upstream-source-version source))))))))
     (#f
      (when warn?
        ;; Distinguish between "no updater" and "failing updater."
        (match (lookup-updater package updaters)
          ((? upstream-updater? updater)
-          (warning (package-location package)
-                   (G_ "'~a' updater failed to determine available \
+          (if (update-spec-version update-spec)
+              (warning (G_ "'~a' updater failed to find version ~a of '~a'~%")
+                       (upstream-updater-name updater)
+                       (update-spec-version update-spec)
+                       (package-name package))
+              (warning (package-location package)
+                       (G_ "'~a' updater failed to determine available \
 releases for ~a~%")
-                   (upstream-updater-name updater)
-                   (package-name package)))
+                       (upstream-updater-name updater)
+                       (package-name package))))
          (#f
           (warn-no-updater package)))))))
 
@@ -591,5 +612,5 @@ all are dependent packages: ~{~a~^ ~}~%")
              (else
               (for-each (cut check-for-package-update <> updaters
                              #:warn? warn?)
-                        (map update-spec-package update-specs))
+                        update-specs)
               (return #t)))))))))
diff --git a/guix/ui.scm b/guix/ui.scm
index 3bca3b1e40..f26c4534aa 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012-2022 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com>
@@ -518,7 +518,7 @@ See the \"Application Setup\" section in the manual, for more info.\n"))
   "Display version information for COMMAND and `(exit 0)'."
   (simple-format #t "~a (~a) ~a~%"
                  command %guix-package-name %guix-version)
-  (format #t "Copyright ~a 2022 ~a"
+  (format #t "Copyright ~a 2023 ~a"
           ;; TRANSLATORS: Translate "(C)" to the copyright symbol
           ;; (C-in-a-circle), if this symbol is available in the user's
           ;; locale.  Otherwise, do not translate "(C)"; leave it as-is.  */
diff --git a/guix/upstream.scm b/guix/upstream.scm
index f3ab9ab78b..4c72388bf3 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -501,11 +501,22 @@ SOURCE, an <upstream-source>."
 changes for PACKAGE; return #f (three values) when PACKAGE is up-to-date;
 raise an error when the updater could not determine available releases.
 KEY-DOWNLOAD specifies a download policy for missing OpenPGP keys; allowed
-values: 'always', 'never', and 'interactive' (default)."
+values: 'always', 'never', and 'interactive' (default).
+
+When VERSION is specified, update PACKAGE to that version, even if that is a
+downgrade."
   (match (package-latest-release package updaters #:version version)
     ((? upstream-source? source)
-     (if (version>? (upstream-source-version source)
-                    (package-version package))
+     (if (or (version>? (upstream-source-version source)
+                        (package-version package))
+             (and version
+                  (begin
+                    (warning (package-location package)
+                             (G_ "downgrading '~a' from ~a to ~a~%")
+                             (package-name package)
+                             (package-version package)
+                             (upstream-source-version source))
+                    #t)))
          (let ((method (match (package-source package)
                          ((? origin? origin)
                           (origin-method origin))
diff --git a/tests/gnu-maintenance.scm b/tests/gnu-maintenance.scm
index fcaa2a068e..516e02ec6a 100644
--- a/tests/gnu-maintenance.scm
+++ b/tests/gnu-maintenance.scm
@@ -79,7 +79,7 @@
             (uri (string-append (%local-url) "/foo-1.tar.gz"))))
           (properties
            `((release-monitoring-url . ,(%local-url))))))
-      (define update ((upstream-updater-latest %generic-html-updater) package))
+      (define update ((upstream-updater-import %generic-html-updater) package))
       (define expected-new-url "http://another-site/foo-2.tar.gz")
       (and (pk 'u update)
            (equal? (upstream-source-version update) "2")
@@ -104,7 +104,7 @@
             (uri (string-append (%local-url) "/foo-1.tar.gz"))))
           (properties
            `((release-monitoring-url . ,(%local-url))))))
-      (define update ((upstream-updater-latest %generic-html-updater) package))
+      (define update ((upstream-updater-import %generic-html-updater) package))
       (define expected-new-url
         (string-append (%local-url) "/foo-2.tar.gz"))
       (and (pk 'u update)
@@ -135,7 +135,7 @@
             (uri (string-append (%local-url) "/foo-1.tar.gz"))))
           (properties
            `((release-monitoring-url . ,(%local-url))))))
-      (define update ((upstream-updater-latest %generic-html-updater) package))
+      (define update ((upstream-updater-import %generic-html-updater) package))
       (define expected-new-url
         (string-append (%local-url) "/foo-2.tar.gz"))
       (define expected-signature-url
diff --git a/tests/import-utils.scm b/tests/import-utils.scm
index f50f730873..44dff14597 100644
--- a/tests/import-utils.scm
+++ b/tests/import-utils.scm
@@ -67,12 +67,12 @@ Differences are hard to spot, e.g. in CLOS vs. GOOPS."))
                     #:repo 'repo
                     #:repo->guix-package
                     (match-lambda*
-                      (("foo" #:version #f #:repo 'repo)
+                      (("foo" #:repo 'repo . rest)
                        (values '(package
                                   (name "foo")
                                   (inputs `(("bar" ,bar))))
                                '("bar")))
-                      (("bar" #:version #f #:repo 'repo)
+                      (("bar" #:repo 'repo . rest)
                        (values '(package
                                   (name "bar"))
                                '())))
@@ -84,7 +84,7 @@ Differences are hard to spot, e.g. in CLOS vs. GOOPS."))
                     #:repo 'repo
                     #:repo->guix-package
                     (match-lambda*
-                      (("foo" #:version #f #:repo 'repo)
+                      (("foo" #:repo 'repo . rest)
                        (values #f '())))
                     #:guix-name identity))
 
@@ -96,12 +96,12 @@ Differences are hard to spot, e.g. in CLOS vs. GOOPS."))
                     #:repo 'repo
                     #:repo->guix-package
                     (match-lambda*
-                      (("foo" #:version #f #:repo 'repo)
+                      (("foo" #:repo 'repo . rest)
                        (values '(package
                                   (name "foo")
                                   (inputs `(("bar" ,bar))))
                                '("bar")))
-                      (("bar" #:version #f #:repo 'repo)
+                      (("bar" #:repo 'repo . rest)
                        (values #f '())))
                     #:guix-name identity))