summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarius Bakke <marius@gnu.org>2020-05-26 22:34:46 +0200
committerMarius Bakke <marius@gnu.org>2020-05-26 22:34:46 +0200
commitaa13c5657d4f8b5dd52beda88a9a8ccc59ebca86 (patch)
tree856094a6541a72b70d471ed5265d6e940cb11e55
parent8ab211dbdb7df000a64aceadfe7b53488819d245 (diff)
parentb4f04e0efff1fb6112b84dc6d36ea46215c336b2 (diff)
downloadguix-aa13c5657d4f8b5dd52beda88a9a8ccc59ebca86.tar.gz
Merge branch 'master' into staging
-rw-r--r--.dir-locals.el1
-rw-r--r--.gitignore2
-rw-r--r--.mailmap1
-rw-r--r--configure.ac9
-rw-r--r--doc/build.scm37
-rw-r--r--doc/guix.texi187
-rw-r--r--etc/gnu-store.mount.in14
-rwxr-xr-xetc/guix-install.sh17
-rwxr-xr-xetc/indent-code.el (renamed from etc/indent-code.el.in)52
-rw-r--r--etc/news.scm57
-rw-r--r--gnu/bootloader/depthcharge.scm3
-rw-r--r--gnu/bootloader/extlinux.scm3
-rw-r--r--gnu/bootloader/grub.scm220
-rw-r--r--gnu/build/file-systems.scm6
-rw-r--r--gnu/build/linux-boot.scm63
-rw-r--r--gnu/local.mk8
-rw-r--r--gnu/packages/admin.scm37
-rw-r--r--gnu/packages/antivirus.scm9
-rw-r--r--gnu/packages/astronomy.scm10
-rw-r--r--gnu/packages/audio.scm10
-rw-r--r--gnu/packages/backup.scm4
-rw-r--r--gnu/packages/bioinformatics.scm29
-rw-r--r--gnu/packages/boost.scm41
-rw-r--r--gnu/packages/busybox.scm6
-rw-r--r--gnu/packages/check.scm5
-rw-r--r--gnu/packages/cpp.scm6
-rw-r--r--gnu/packages/cups.scm2
-rw-r--r--gnu/packages/databases.scm26
-rw-r--r--gnu/packages/dictionaries.scm4
-rw-r--r--gnu/packages/dns.scm8
-rw-r--r--gnu/packages/docker.scm4
-rw-r--r--gnu/packages/efi.scm8
-rw-r--r--gnu/packages/elf.scm13
-rw-r--r--gnu/packages/emacs-xyz.scm153
-rw-r--r--gnu/packages/embedded.scm7
-rw-r--r--gnu/packages/emulators.scm4
-rw-r--r--gnu/packages/engineering.scm135
-rw-r--r--gnu/packages/finance.scm68
-rw-r--r--gnu/packages/fonts.scm33
-rw-r--r--gnu/packages/fontutils.scm14
-rw-r--r--gnu/packages/fpga.scm4
-rw-r--r--gnu/packages/game-development.scm71
-rw-r--r--gnu/packages/games.scm104
-rw-r--r--gnu/packages/geo.scm3
-rw-r--r--gnu/packages/gl.scm7
-rw-r--r--gnu/packages/gnome-xyz.scm26
-rw-r--r--gnu/packages/gnome.scm52
-rw-r--r--gnu/packages/gnustep.scm8
-rw-r--r--gnu/packages/graphviz.scm4
-rw-r--r--gnu/packages/gtk.scm5
-rw-r--r--gnu/packages/guile-xyz.scm134
-rw-r--r--gnu/packages/jami.scm256
-rw-r--r--gnu/packages/java-compression.scm4
-rw-r--r--gnu/packages/java.scm206
-rw-r--r--gnu/packages/julia.scm2
-rw-r--r--gnu/packages/kde.scm35
-rw-r--r--gnu/packages/kerberos.scm6
-rw-r--r--gnu/packages/linux.scm69
-rw-r--r--gnu/packages/lisp-xyz.scm353
-rw-r--r--gnu/packages/mail.scm35
-rw-r--r--gnu/packages/maths.scm13
-rw-r--r--gnu/packages/messaging.scm14
-rw-r--r--gnu/packages/mpd.scm6
-rw-r--r--gnu/packages/music.scm20
-rw-r--r--gnu/packages/networking.scm65
-rw-r--r--gnu/packages/ocaml.scm61
-rw-r--r--gnu/packages/openkinect.scm141
-rw-r--r--gnu/packages/pantheon.scm109
-rw-r--r--gnu/packages/patches/http-parser-fix-assertion-on-armhf.patch39
-rw-r--r--gnu/packages/patches/kpmcore-fix-tests.patch30
-rw-r--r--gnu/packages/patches/kpmcore-remove-broken-test.patch139
-rw-r--r--gnu/packages/patches/multipath-tools-sans-systemd.patch83
-rw-r--r--gnu/packages/patches/openjdk-14-builtins.patch11
-rw-r--r--gnu/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch82
-rw-r--r--gnu/packages/patches/soundconverter-remove-gconf-dependency.patch29
-rw-r--r--gnu/packages/perl-check.scm35
-rw-r--r--gnu/packages/perl.scm28
-rw-r--r--gnu/packages/python-web.scm302
-rw-r--r--gnu/packages/python-xyz.scm137
-rw-r--r--gnu/packages/radio.scm4
-rw-r--r--gnu/packages/rails.scm6
-rw-r--r--gnu/packages/ruby.scm559
-rw-r--r--gnu/packages/scanner.scm8
-rw-r--r--gnu/packages/scheme.scm6
-rw-r--r--gnu/packages/shells.scm27
-rw-r--r--gnu/packages/shellutils.scm6
-rw-r--r--gnu/packages/suckless.scm278
-rw-r--r--gnu/packages/syndication.scm27
-rw-r--r--gnu/packages/telephony.scm3
-rw-r--r--gnu/packages/textutils.scm37
-rw-r--r--gnu/packages/tor.scm16
-rw-r--r--gnu/packages/valgrind.scm6
-rw-r--r--gnu/packages/version-control.scm6
-rw-r--r--gnu/packages/video.scm17
-rw-r--r--gnu/packages/virtualization.scm62
-rw-r--r--gnu/packages/vpn.scm8
-rw-r--r--gnu/packages/web-browsers.scm47
-rw-r--r--gnu/packages/web.scm175
-rw-r--r--gnu/packages/wine.scm6
-rw-r--r--gnu/packages/wm.scm10
-rw-r--r--gnu/packages/xdisorg.scm29
-rw-r--r--gnu/packages/xfce.scm12
-rw-r--r--gnu/packages/xml.scm12
-rw-r--r--gnu/packages/xorg.scm12
-rw-r--r--gnu/services/shepherd.scm6
-rw-r--r--gnu/system.scm9
-rw-r--r--gnu/system/file-systems.scm86
-rw-r--r--gnu/system/linux-initrd.scm29
-rw-r--r--gnu/system/vm.scm15
-rw-r--r--gnu/tests/install.scm94
-rw-r--r--guix/build-system/asdf.scm5
-rw-r--r--guix/build-system/guile.scm6
-rw-r--r--guix/build/asdf-build-system.scm54
-rw-r--r--guix/build/minify-build-system.scm9
-rw-r--r--guix/build/syscalls.scm113
-rw-r--r--guix/channels.scm24
-rw-r--r--guix/gexp.scm184
-rw-r--r--guix/licenses.scm4
-rw-r--r--guix/quirks.scm37
-rw-r--r--guix/scripts/describe.scm17
-rw-r--r--guix/scripts/publish.scm1
-rw-r--r--guix/utils.scm21
-rw-r--r--nix/local.mk13
-rw-r--r--tests/file-systems.scm64
-rw-r--r--tests/gexp.scm54
125 files changed, 4679 insertions, 1589 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
index ce305602f2..fcde914e60 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -85,6 +85,7 @@
    (eval . (put 'with-imported-modules 'scheme-indent-function 1))
    (eval . (put 'with-extensions 'scheme-indent-function 1))
    (eval . (put 'with-parameters 'scheme-indent-function 1))
+   (eval . (put 'let-system 'scheme-indent-function 1))
 
    (eval . (put 'with-database 'scheme-indent-function 2))
    (eval . (put 'call-with-transaction 'scheme-indent-function 2))
diff --git a/.gitignore b/.gitignore
index fd2cf56098..05a68b69ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -66,6 +66,7 @@
 /doc/stamp-vti
 /doc/version.texi
 /doc/version-*.texi
+/etc/gnu-store.mount
 /etc/guix-daemon.cil
 /etc/guix-daemon.conf
 /etc/guix-daemon.service
@@ -149,7 +150,6 @@ stamp-h[0-9]
 tmp
 /doc/os-config-lightweight-desktop.texi
 /nix/scripts/download
-/etc/indent-code.el
 /.version
 /doc/stamp-[0-9]
 /gnu/packages/bootstrap
diff --git a/.mailmap b/.mailmap
index 95e6d3ab76..146e65184a 100644
--- a/.mailmap
+++ b/.mailmap
@@ -47,6 +47,7 @@ Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
 Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
 Mathieu Othacehe <m.othacehe@gmail.com>
 Mathieu Othacehe <mathieu.othacehe@parrot.com>
+Mathieu Othacehe <othacehe@gnu.org>
 Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
 nikita <nikita@n0.is>
 nikita <nikita@n0.is> ng0 <ng0@n0.is>
diff --git a/configure.ac b/configure.ac
index a44a605dc0..0a20b476eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -286,15 +286,6 @@ dnl Documentation translation.
 AM_MISSING_PROG([PO4A_TRANSLATE], [po4a-translate])
 AM_MISSING_PROG([PO4A_UPDATEPO], [po4a-updatepo])
 
-dnl Emacs (optional), for 'etc/indent-code.el'.
-AC_PATH_PROG([EMACS], [emacs])
-if test "x$EMACS" = x; then
-    AC_MSG_WARN([Please install GNU Emacs to use etc/indent-code.el.])
-else
-    AC_SUBST([EMACS])
-    AC_CONFIG_FILES([etc/indent-code.el], [chmod +x etc/indent-code.el])
-fi
-
 case "$storedir" in
   /gnu/store)
     ;;
diff --git a/doc/build.scm b/doc/build.scm
index 2b6d0c4aea..def4bdf18a 100644
--- a/doc/build.scm
+++ b/doc/build.scm
@@ -182,30 +182,27 @@ content=\"width=device-width, initial-scale=1\" />"))
   ;; Guile-Lib with a hotfix for (htmlprag).
   (package
     (inherit guile-lib)
-    (source (origin
-              (inherit (package-source guile-lib))
-              (modules '(( guix build utils)))
-              (snippet
-               '(begin
-                  ;; When parsing
-                  ;; "<body><blockquote><p>foo</p>\n</blockquote></body>",
-                  ;; 'html->shtml' would mistakenly close 'blockquote' right
-                  ;; before <p>.  This patch removes 'p' from the
-                  ;; 'parent-constraints' alist to fix that.
-                  (substitute* "src/htmlprag.scm"
-                    (("^[[:blank:]]*\\(p[[:blank:]]+\\. \\(body td th\\)\\).*")
-                     ""))
-                  #t))))
     (arguments
      (substitute-keyword-arguments (package-arguments guile-lib)
        ((#:phases phases '%standard-phases)
         `(modify-phases ,phases
-          (add-before 'check 'skip-known-failure
-            (lambda _
-              ;; XXX: The above change causes one test failure among
-              ;; the htmlprag tests.
-              (setenv "XFAIL_TESTS" "htmlprag.scm")
-              #t))))))))
+           (add-before 'build 'fix-htmlprag
+             (lambda _
+               ;; When parsing
+               ;; "<body><blockquote><p>foo</p>\n</blockquote></body>",
+               ;; 'html->shtml' would mistakenly close 'blockquote' right
+               ;; before <p>.  This patch removes 'p' from the
+               ;; 'parent-constraints' alist to fix that.
+               (substitute* "src/htmlprag.scm"
+                 (("^[[:blank:]]*\\(p[[:blank:]]+\\. \\(body td th\\)\\).*")
+                  ""))
+               #t))
+           (add-before 'check 'skip-known-failure
+             (lambda _
+               ;; XXX: The above change causes one test failure among
+               ;; the htmlprag tests.
+               (setenv "XFAIL_TESTS" "htmlprag.scm")
+               #t))))))))
 
 (define* (syntax-highlighted-html input
                                   #:key
diff --git a/doc/guix.texi b/doc/guix.texi
index a36b9691fb..216422fe31 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -228,6 +228,7 @@ Development
 
 * Invoking guix environment::   Setting up development environments.
 * Invoking guix pack::          Creating software bundles.
+* The GCC toolchain::           Working with languages supported by GCC.
 
 Programming Interface
 
@@ -659,9 +660,10 @@ with these commands:
 @c https://lists.gnu.org/archive/html/guix-devel/2017-01/msg01199.html
 
 @example
-# cp ~root/.config/guix/current/lib/systemd/system/guix-daemon.service \
+# cp ~root/.config/guix/current/lib/systemd/system/gnu-store.mount \
+     ~root/.config/guix/current/lib/systemd/system/guix-daemon.service \
      /etc/systemd/system/
-# systemctl enable --now guix-daemon
+# systemctl enable --now gnu-store.mount guix-daemon
 @end example
 
 If your host distro uses the Upstart init system:
@@ -1772,13 +1774,6 @@ want to avoid auto-loading the Emacs packages installed with Guix, you
 can do so by running Emacs with the @option{--no-site-file} option
 (@pxref{Init File,,, emacs, The GNU Emacs Manual}).
 
-@subsection The GCC toolchain
-
-@c XXX: The contents of this section were moved under
-@c ``Development'', since it makes more sense there and is not specific
-@c foreign distros.  Remove it from here eventually?
-@xref{Packages for C Development}, for information on packages for C/C++
-development.
 
 @node Upgrading Guix
 @section Upgrading Guix
@@ -3044,6 +3039,7 @@ availability of packages:
 
 @item --search=@var{regexp}
 @itemx -s @var{regexp}
+@anchor{guix-search}
 @cindex searching for packages
 List the available packages whose name, synopsis, or description matches
 @var{regexp} (in a case-insensitive fashion), sorted by relevance.
@@ -4475,6 +4471,9 @@ produce a list of channel specifications in JSON format;
 produce a list of channel specifications in Recutils format.
 @end table
 
+@item --list-formats
+Display available formats for @option{--format} option.
+
 @item --profile=@var{profile}
 @itemx -p @var{profile}
 Display information about @var{profile}.
@@ -4674,9 +4673,9 @@ pack} command allows you to create @dfn{application bundles} that can be
 easily distributed to users who do not run Guix.
 
 @menu
-* Invoking guix environment::   Setting up development environments.
-* Invoking guix pack::          Creating software bundles.
-* Packages for C Development::  Working with C code with Guix.
+* Invoking guix environment::  Setting up development environments.
+* Invoking guix pack::         Creating software bundles.
+* The GCC toolchain::          Working with languages supported by GCC.
 @end menu
 
 @node Invoking guix environment
@@ -5387,13 +5386,15 @@ In addition, @command{guix pack} supports all the common build options
 (@pxref{Common Build Options}) and all the package transformation
 options (@pxref{Package Transformation Options}).
 
-@node Packages for C Development
-@section Packages for C Development
+
+@node The GCC toolchain
+@section The GCC toolchain
 
 @cindex GCC
 @cindex ld-wrapper
 @cindex linker wrapper
 @cindex toolchain, for C development
+@cindex toolchain, for Fortran development
 
 If you need a complete toolchain for compiling and linking C or C++
 source code, use the @code{gcc-toolchain} package.  This package
@@ -5407,7 +5408,9 @@ invoke the actual linker with this new set of arguments.  You can instruct the
 wrapper to refuse to link against libraries not in the store by setting the
 @env{GUIX_LD_WRAPPER_ALLOW_IMPURITIES} environment variable to @code{no}.
 
-
+The package @code{gfortran-toolchain} provides a complete GCC toolchain
+for Fortran development.  For other languages, please use
+@samp{guix search gcc toolchain} (@pxref{guix-search,, Invoking guix package}).
 
 @c *********************************************************************
 @node Programming Interface
@@ -6808,8 +6811,9 @@ following phases changed to some specific for Meson:
 
 @item configure
 The phase runs @code{meson} with the flags specified in
-@code{#:configure-flags}.  The flag @option{--build-type} is always set to
-@code{plain} unless something else is specified in @code{#:build-type}.
+@code{#:configure-flags}.  The flag @option{--buildtype} is always set to
+@code{debugoptimized} unless something else is specified in
+@code{#:build-type}.
 
 @item build
 The phase runs @code{ninja} to build the package in parallel by default, but
@@ -8123,6 +8127,32 @@ the second case, the resulting script contains a @code{(string-append
 @dots{})} expression to construct the file name @emph{at run time}.
 @end deffn
 
+@deffn {Scheme Syntax} let-system @var{system} @var{body}@dots{}
+@deffnx {Scheme Syntax} let-system (@var{system} @var{target}) @var{body}@dots{}
+Bind @var{system} to the currently targeted system---e.g.,
+@code{"x86_64-linux"}---within @var{body}.
+
+In the second case, additionally bind @var{target} to the current
+cross-compilation target---a GNU triplet such as
+@code{"arm-linux-gnueabihf"}---or @code{#f} if we are not
+cross-compiling.
+
+@code{let-system} is useful in the occasional case where the object
+spliced into the gexp depends on the target system, as in this example:
+
+@example
+#~(system*
+   #+(let-system system
+       (cond ((string-prefix? "armhf-" system)
+              (file-append qemu "/bin/qemu-system-arm"))
+             ((string-prefix? "x86_64-" system)
+              (file-append qemu "/bin/qemu-system-x86_64"))
+             (else
+              (error "dunno!"))))
+   "-net" "user" #$image)
+@end example
+@end deffn
+
 @deffn {Scheme Syntax} with-parameters ((@var{parameter} @var{value}) @dots{}) @var{exp}
 This macro is similar to the @code{parameterize} form for
 dynamically-bound @dfn{parameters} (@pxref{Parameters,,, guile, GNU
@@ -11664,10 +11694,14 @@ update time on the in-memory version of the file inode), and
 Manual}, for more information on these flags.
 
 @item @code{options} (default: @code{#f})
-This is either @code{#f}, or a string denoting mount options passed to the
-file system driver.  @xref{Mount-Unmount-Remount,,, libc, The GNU C Library
-Reference Manual}, for details and run @command{man 8 mount} for options for
-various file systems.
+This is either @code{#f}, or a string denoting mount options passed to
+the file system driver.  @xref{Mount-Unmount-Remount,,, libc, The GNU C
+Library Reference Manual}, for details and run @command{man 8 mount} for
+options for various file systems.  Note that the
+@code{file-system-options->alist} and @code{alist->file-system-options}
+procedures from @code{(gnu system file-systems)} can be used to convert
+file system options given as an association list to the string
+representation, and vice-versa.
 
 @item @code{mount?} (default: @code{#t})
 This value indicates whether to automatically mount the file system when
@@ -11748,6 +11782,110 @@ and unmount user-space FUSE file systems.  This requires the
 @code{fuse.ko} kernel module to be loaded.
 @end defvr
 
+@node Btrfs file system
+@subsection Btrfs file system
+
+The Btrfs has special features, such as subvolumes, that merit being
+explained in more details.  The following section attempts to cover
+basic as well as complex uses of a Btrfs file system with the Guix
+System.
+
+In its simplest usage, a Btrfs file system can be described, for
+example, by:
+
+@lisp
+(file-system
+  (mount-point "/home")
+  (type "btrfs")
+  (device (file-system-label "my-home")))
+@end lisp
+
+The example below is more complex, as it makes use of a Btrfs
+subvolume, named @code{rootfs}.  The parent Btrfs file system is labeled
+@code{my-btrfs-pool}, and is located on an encrypted device (hence the
+dependency on @code{mapped-devices}):
+
+@lisp
+(file-system
+  (device (file-system-label "my-btrfs-pool"))
+  (mount-point "/")
+  (type "btrfs")
+  (options "subvol=rootfs")
+  (dependencies mapped-devices))
+@end lisp
+
+Some bootloaders, for example GRUB, only mount a Btrfs partition at its
+top level during the early boot, and rely on their configuration to
+refer to the correct subvolume path within that top level.  The
+bootloaders operating in this way typically produce their configuration
+on a running system where the Btrfs partitions are already mounted and
+where the subvolume information is readily available.  As an example,
+@command{grub-mkconfig}, the configuration generator command shipped
+with GRUB, reads @file{/proc/self/mountinfo} to determine the top-level
+path of a subvolume.
+
+The Guix System produces a bootloader configuration using the operating
+system configuration as its sole input; it is therefore necessary to
+extract the subvolume name on which @file{/gnu/store} lives (if any)
+from that operating system configuration.  To better illustrate,
+consider a subvolume named 'rootfs' which contains the root file system
+data.  In such situation, the GRUB bootloader would only see the top
+level of the root Btrfs partition, e.g.:
+
+@example
+/                   (top level)
+├── rootfs          (subvolume directory)
+    ├── gnu         (normal directory)
+        ├── store   (normal directory)
+[...]
+@end example
+
+Thus, the subvolume name must be prepended to the @file{/gnu/store} path
+of the kernel, initrd binaries and any other files referred to in the
+GRUB configuration that must be found during the early boot.
+
+The next example shows a nested hierarchy of subvolumes and
+directories:
+
+@example
+/                   (top level)
+├── rootfs          (subvolume)
+    ├── gnu         (normal directory)
+        ├── store   (subvolume)
+[...]
+@end example
+
+This scenario would work without mounting the 'store' subvolume.
+Mounting 'rootfs' is sufficient, since the subvolume name matches its
+intended mount point in the file system hierarchy.  Alternatively, the
+'store' subvolume could be referred to by setting the @code{subvol}
+option to either @code{/rootfs/gnu/store} or @code{rootfs/gnu/store}.
+
+Finally, a more contrived example of nested subvolumes:
+
+@example
+/                           (top level)
+├── root-snapshots          (subvolume)
+    ├── root-current        (subvolume)
+        ├── guix-store      (subvolume)
+[...]
+@end example
+
+Here, the 'guix-store' subvolume doesn't match its intended mount point,
+so it is necessary to mount it.  The subvolume must be fully specified,
+by passing its file name to the @code{subvol} option.  To illustrate,
+the 'guix-store' subvolume could be mounted on @file{/gnu/store} by using
+a file system declaration such as:
+
+@lisp
+(file-system
+  (device (file-system-label "btrfs-pool-1"))
+  (mount-point "/gnu/store")
+  (type "btrfs")
+  (options "subvol=root-snapshots/root-current/guix-store,\
+compress-force=zstd,space_cache=v2"))
+@end lisp
+
 @node Mapped Devices
 @section Mapped Devices
 
@@ -26504,9 +26642,10 @@ service activation programs and then spawns the GNU@tie{}Shepherd, the
 initialization system.
 
 @item --root=@var{root}
-Mount @var{root} as the root file system.  @var{root} can be a
-device name like @code{/dev/sda1}, a file system label, or a file system
-UUID.
+Mount @var{root} as the root file system.  @var{root} can be a device
+name like @code{/dev/sda1}, a file system label, or a file system UUID.
+When unspecified, the device name from the root file system of the
+operating system declaration is used.
 
 @item --system=@var{system}
 Have @file{/run/booted-system} and @file{/run/current-system} point to
diff --git a/etc/gnu-store.mount.in b/etc/gnu-store.mount.in
new file mode 100644
index 0000000000..c94f2db72b
--- /dev/null
+++ b/etc/gnu-store.mount.in
@@ -0,0 +1,14 @@
+[Unit]
+Description=Read-only @storedir@ for GNU Guix
+DefaultDependencies=no
+ConditionPathExists=@storedir@
+Before=guix-daemon.service
+
+[Install]
+WantedBy=guix-daemon.service
+
+[Mount]
+What=@storedir@
+Where=@storedir@
+Type=none
+Options=bind,ro
diff --git a/etc/guix-install.sh b/etc/guix-install.sh
index 4909d3f162..bcce1d8869 100755
--- a/etc/guix-install.sh
+++ b/etc/guix-install.sh
@@ -3,7 +3,7 @@
 # Copyright © 2017 sharlatan <sharlatanus@gmail.com>
 # Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 # Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
-# Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+# Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 #
 # This file is part of GNU Guix.
 #
@@ -342,7 +342,16 @@ sys_enable_guix_daemon()
                 _msg "${PAS}enabled Guix daemon via upstart"
             ;;
         systemd)
-            { cp "${ROOT_HOME}/.config/guix/current/lib/systemd/system/guix-daemon.service" \
+            { # systemd .mount units must be named after the target directory.
+              # Here we assume a hard-coded name of /gnu/store.
+              # XXX Work around <https://issues.guix.gnu.org/41356> until next release.
+              if [ -f "${ROOT_HOME}/.config/guix/current/lib/systemd/system/gnu-store.mount" ]; then
+                  cp "${ROOT_HOME}/.config/guix/current/lib/systemd/system/gnu-store.mount" \
+                     /etc/systemd/system/;
+                  chmod 664 /etc/systemd/system/gnu-store.mount;
+              fi
+
+              cp "${ROOT_HOME}/.config/guix/current/lib/systemd/system/guix-daemon.service" \
                  /etc/systemd/system/;
               chmod 664 /etc/systemd/system/guix-daemon.service;
 
@@ -357,8 +366,8 @@ sys_enable_guix_daemon()
 	      fi;
 
               systemctl daemon-reload &&
-                  systemctl start guix-daemon &&
-                  systemctl enable guix-daemon; } &&
+                  systemctl start  gnu-store.mount guix-daemon &&
+                  systemctl enable gnu-store.mount guix-daemon; } &&
                 _msg "${PAS}enabled Guix daemon via systemd"
             ;;
         sysv-init)
diff --git a/etc/indent-code.el.in b/etc/indent-code.el
index 6102b5d1ab..255ffb126b 100755
--- a/etc/indent-code.el.in
+++ b/etc/indent-code.el
@@ -1,8 +1,9 @@
-#!@EMACS@ --script
+:;exec emacs --batch --quick --load="$0" --funcall=main "$@"
 ;;; indent-code.el --- Run Emacs to indent a package definition.
 
 ;; Copyright © 2017 Alex Kost <alezost@gmail.com>
 ;; Copyright © 2017 Ludovic Courtès <ludo@gnu.org>
+;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -86,29 +87,30 @@
  (with-syntax 1))
 
 
-(pcase command-line-args-left
-  (`(,file-name ,package-name)
-   ;; Indent the definition of PACKAGE-NAME in FILE-NAME.
-   (find-file file-name)
-   (goto-char (point-min))
-   (if (re-search-forward (concat "^(define\\(-public\\) +"
-                                  package-name)
-                          nil t)
-       (let ((indent-tabs-mode nil))
-         (beginning-of-defun)
-         (indent-sexp)
-         (save-buffer)
-         (message "Done!"))
-     (error "Package '%s' not found in '%s'"
-            package-name file-name)))
-  (`(,file-name)
-   ;; Indent all of FILE-NAME.
-   (find-file file-name)
-   (let ((indent-tabs-mode nil))
-     (indent-region (point-min) (point-max))
-     (save-buffer)
-     (message "Done!")))
-  (x
-   (error "Usage: indent-code.el FILE [PACKAGE]")))
+(defun main ()
+  (pcase command-line-args-left
+    (`(,file-name ,package-name)
+     ;; Indent the definition of PACKAGE-NAME in FILE-NAME.
+     (find-file file-name)
+     (goto-char (point-min))
+     (if (re-search-forward (concat "^(define\\(-public\\) +"
+                                    package-name)
+                            nil t)
+         (let ((indent-tabs-mode nil))
+           (beginning-of-defun)
+           (indent-sexp)
+           (save-buffer)
+           (message "Done!"))
+       (error "Package '%s' not found in '%s'"
+              package-name file-name)))
+    (`(,file-name)
+     ;; Indent all of FILE-NAME.
+     (find-file file-name)
+     (let ((indent-tabs-mode nil))
+       (indent-region (point-min) (point-max))
+       (save-buffer)
+       (message "Done!")))
+    (x
+     (error "Usage: indent-code.el FILE [PACKAGE]"))))
 
 ;;; indent-code.el ends here
diff --git a/etc/news.scm b/etc/news.scm
index c6e4e7d089..6bf88ccb44 100644
--- a/etc/news.scm
+++ b/etc/news.scm
@@ -1,8 +1,10 @@
 ;; GNU Guix news, for use by 'guix pull'.
 ;;
 ;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
 ;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;
 ;; Copying and distribution of this file, with or without modification, are
 ;; permitted in any medium without royalty provided the copyright notice and
@@ -11,9 +13,39 @@
 (channel-news
  (version 0)
 
+ (entry (commit "b460ba7992a0b4af2ddb5927dcf062784539ef7b")
+        (title (en "Add support to boot from a Btrfs subvolume")
+               (de "Unterstützung für Systemstart von einem
+Btrfs-Unterlaufwerk hinzugefügt")
+               (fr "Ajout du support pour démarrer depuis un sous-volume Btrfs")
+               (nl "Nieuwe ondersteuning voor het opstarten vanaf een Btrfs-subvolume"))
+        (body
+         (en "The generation of the GRUB configuration file produced from an
+operating system declaration now takes into account the use of a Btrfs
+subvolume for the partition holding @file{/gnu/store}.  Run the command
+@command{info \"(guix) Btrfs file system\"} for more information and
+examples.")
+         (de "Für die Erzeugung einer GRUB-Konfigurationsdatei aus einer
+Betriebssystemdeklaration kann jetzt ein Btrfs-Unterlaufwerk („Subvolume“) für
+die Partition mit @file{/gnu/store} angegeben werden.  Führen Sie
+@command{info \"(guix) Btrfs file system\"} aus, wenn Sie mehr Informationen
+und Beispiele sehen möchten.")
+         (fr "La génération du fichier de configuration de GRUB produite à
+partir de la déclaration d'un @code{operating-system} tient maintenant compte
+de l'utilisation d'un sous-volume Btrfs pour la partition contenant
+@file{/gnu/store}.  Exécutez la commande @command{info\"(guix) Btrfs file
+system\"} pour des exemples et plus d'information.")
+         (nl "Het opmaken van het GRUB-configuratiebestand op basis van
+een @code{operating-system}-declaratie houdt nu rekening met het gebruik van
+een Btrfs-subvolume voor de partitie die @file{/gnu/store} bevat.  Voer
+@command{info \"(guix) Btrfs file system\"} uit voor meer informatie en
+voorbeelden.")))
+
  (entry (commit "6456232164890dbf5aa20394ee24637feb4b7b9e")
         (title (en "@command{guix pack -RR} introduces a new execution
-engine"))
+engine")
+               (de "@command{guix pack -RR} führt neuen Ausführungstreiber
+ein"))
         (body
          (en "The @command{guix pack -RR} command allows you to create a
 tarball containing @dfn{relocatable binaries}.  Until now, those would rely
@@ -31,7 +63,28 @@ GUIX_EXECUTION_ENGINE=performance
 export GUIX_EXECUTION_ENGINE
 @end example
 
-Run @command{info \"(guix) Invoking guix pack\"} for more information.")))
+Run @command{info \"(guix) Invoking guix pack\"} for more information.")
+         (de "Mit dem Befehl @command{guix pack -RR} können Sie einen Tarball
+mit @dfn{verschieblichen Binärdateien} erzeugen (englisch „Relocatable
+Binaries“).  Bisher wurden diese entweder in „unprivilegierten
+Benutzernamensräumen“ ohne Berechtigungen ausgeführt, oder in PRoot, wenn
+keine unprivilegierten Benutzernamensräume unterstützt wurden.  Allerdings
+fällt bei der Ausführung mit PRoot bei manchen Anwendungen deutlich mehr
+Rechenaufwand an.
+
+Um dem entgegenzuwirken, stellt @command{guix pack -RR} nun eine dritte Option
+zur Verfügung, die sich eine Erweiterung des GNU-Laufzeit-Binders („Run-Time
+Linker“, ld.so) und Fakechroot zu Nutze macht.  Dadurch entsteht fast kein
+Mehraufwand.  Sie können sich die schnellste Option aussuchen, wenn Sie eine
+verschiebliche Binärdatei ausführen, zum Beispiel so:
+
+@example
+GUIX_EXECUTION_ENGINE=performance
+export GUIX_EXECUTION_ENGINE
+@end example
+
+Führen Sie @command{info \"(guix.de) Aufruf von guix pack\"} aus, wenn Sie
+mehr wissen wollen.")))
 
  (entry (commit "88a96c568c47c97d05d883ada5afbc4e1200b10f")
         (title (en "New @option{--path} option for @command{guix graph}")
diff --git a/gnu/bootloader/depthcharge.scm b/gnu/bootloader/depthcharge.scm
index 58cc3f3932..0a50374bd9 100644
--- a/gnu/bootloader/depthcharge.scm
+++ b/gnu/bootloader/depthcharge.scm
@@ -82,7 +82,8 @@
 (define* (depthcharge-configuration-file config entries
                                          #:key
                                          (system (%current-system))
-                                         (old-entries '()))
+                                         (old-entries '())
+                                         #:allow-other-keys)
   (match entries
     ((entry)
      (let ((kernel (menu-entry-linux entry))
diff --git a/gnu/bootloader/extlinux.scm b/gnu/bootloader/extlinux.scm
index 5b4dd84965..6b5ff298e7 100644
--- a/gnu/bootloader/extlinux.scm
+++ b/gnu/bootloader/extlinux.scm
@@ -28,7 +28,8 @@
 (define* (extlinux-configuration-file config entries
                                       #:key
                                       (system (%current-system))
-                                      (old-entries '()))
+                                      (old-entries '())
+                                      #:allow-other-keys)
   "Return the U-Boot configuration file corresponding to CONFIG, a
 <u-boot-configuration> object, and where the store is available at STORE-FS, a
 <file-system> object.  OLD-ENTRIES is taken to be a list of menu entries
diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 3f61b4a963..bb40c551a7 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -37,19 +37,13 @@
   #:use-module (ice-9 regex)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
-  #:export (grub-image
-            grub-image?
-            grub-image-aspect-ratio
-            grub-image-file
-
-            grub-theme
+  #:export (grub-theme
             grub-theme?
-            grub-theme-images
+            grub-theme-image
+            grub-theme-resolution
             grub-theme-color-normal
             grub-theme-color-highlight
-
-            %background-image
-            %default-theme
+            grub-theme-gfxmode
 
             grub-bootloader
             grub-efi-bootloader
@@ -64,96 +58,95 @@
 ;;;
 ;;; Code:
 
-(define (strip-mount-point mount-point file)
-  "Strip MOUNT-POINT from FILE, which is a gexp or other lowerable object
-denoting a file name."
-  (match mount-point
-    ((? string? mount-point)
-     (if (string=? mount-point "/")
-         file
-         #~(let ((file #$file))
-             (if (string-prefix? #$mount-point file)
-                 (substring #$file #$(string-length mount-point))
-                 file))))
-    (#f file)))
-
-(define-record-type* <grub-image>
-  grub-image make-grub-image
-  grub-image?
-  (aspect-ratio    grub-image-aspect-ratio        ;rational number
-                   (default 4/3))
-  (file            grub-image-file))              ;file-valued gexp (SVG)
+(define* (normalize-file file mount-point btrfs-subvolume-file-name)
+  "Strip MOUNT-POINT and prepend BTRFS-SUBVOLUME-FILE-NAME to FILE, a
+G-expression or other lowerable object denoting a file name."
+
+  (define (strip-mount-point mount-point file)
+    (if mount-point
+        (if (string=? mount-point "/")
+            file
+            #~(let ((file #$file))
+                (if (string-prefix? #$mount-point file)
+                    (substring #$file #$(string-length mount-point))
+                    file)))
+        file))
+
+  (define (prepend-btrfs-subvolume-file-name btrfs-subvolume-file-name file)
+    (if btrfs-subvolume-file-name
+        #~(string-append #$btrfs-subvolume-file-name #$file)
+        file))
+
+  (prepend-btrfs-subvolume-file-name btrfs-subvolume-file-name
+                                     (strip-mount-point mount-point file)))
+
+
 
 (define-record-type* <grub-theme>
+  ;; Default theme contributed by Felipe López.
   grub-theme make-grub-theme
   grub-theme?
-  (images          grub-theme-images
-                   (default '()))                 ;list of <grub-image>
+  (image           grub-theme-image
+                   (default (file-append %artwork-repository
+                                         "/grub/GuixSD-fully-black-4-3.svg")))
+  (resolution      grub-theme-resolution
+                   (default '(1024 . 768)))
   (color-normal    grub-theme-color-normal
-                   (default '((fg . cyan) (bg . blue))))
+                   (default '((fg . light-gray) (bg . black))))
   (color-highlight grub-theme-color-highlight
-                   (default '((fg . white) (bg . blue))))
-  (gfxmode         grub-gfxmode
+                   (default '((fg . yellow) (bg . black))))
+  (gfxmode         grub-theme-gfxmode
                    (default '("auto"))))          ;list of string
 
-(define %background-image
-  (grub-image
-   (aspect-ratio 4/3)
-   (file (file-append %artwork-repository
-                      "/grub/GuixSD-fully-black-4-3.svg"))))
-
-(define %default-theme
-  ;; Default theme contributed by Felipe López.
-  (grub-theme
-   (images (list %background-image))
-   (color-highlight '((fg . yellow) (bg . black)))
-   (color-normal    '((fg . light-gray) (bg . black))))) ;XXX: #x303030
-
 
 ;;;
 ;;; Background image & themes.
 ;;;
 
 (define (bootloader-theme config)
-  "Return user defined theme in CONFIG if defined or %default-theme
+  "Return user defined theme in CONFIG if defined or a default theme
 otherwise."
-  (or (bootloader-configuration-theme config) %default-theme))
+  (or (bootloader-configuration-theme config) (grub-theme)))
 
-(define* (svg->png svg #:key width height)
-  "Build a PNG of HEIGHT x WIDTH from SVG."
+(define* (image->png image #:key width height)
+  "Build a PNG of HEIGHT x WIDTH from IMAGE if its file suffix is \".svg\".
+Otherwise the picture in IMAGE is just copied."
   (computed-file "grub-image.png"
                  (with-imported-modules '((gnu build svg))
                    (with-extensions (list guile-rsvg guile-cairo)
-                     #~(begin
-                         (use-modules (gnu build svg))
-                         (svg->png #+svg #$output
-                                   #:width #$width
-                                   #:height #$height))))))
-
-(define* (grub-background-image config #:key (width 1024) (height 768))
-  "Return the GRUB background image defined in CONFIG with a ratio of
-WIDTH/HEIGHT, or #f if none was found."
-  (let* ((ratio (/ width height))
-         (image (find (lambda (image)
-                        (= (grub-image-aspect-ratio image) ratio))
-                      (grub-theme-images
-                       (bootloader-theme config)))))
+                     #~(if (string-suffix? ".svg" #+image)
+                           (begin
+                             (use-modules (gnu build svg))
+                             (svg->png #+image #$output
+                                       #:width #$width
+                                       #:height #$height))
+                           (copy-file #+image #$output))))))
+
+(define* (grub-background-image config)
+  "Return the GRUB background image defined in CONFIG or #f if none was found.
+If the suffix of the image file is \".svg\", then it is converted into a PNG
+file with the resolution provided in CONFIG."
+  (let* ((theme (bootloader-theme config))
+         (image (grub-theme-image theme)))
     (and image
-         (svg->png (grub-image-file image)
-                   #:width width #:height height))))
+         (match (grub-theme-resolution theme)
+           (((? number? width) . (? number? height))
+            (image->png image #:width width #:height height))
+           (_ #f)))))
 
 (define* (eye-candy config store-device store-mount-point
-                    #:key system port)
-  "Return a gexp that writes to PORT (a port-valued gexp) the
-'grub.cfg' part concerned with graphics mode, background images, colors, and
-all that.  STORE-DEVICE designates the device holding the store, and
-STORE-MOUNT-POINT is its mount point; these are used to determine where the
-background image and fonts must be searched for.  SYSTEM must be the target
-system string---e.g., \"x86_64-linux\"."
+                    #:key btrfs-store-subvolume-file-name system port)
+  "Return a gexp that writes to PORT (a port-valued gexp) the 'grub.cfg' part
+concerned with graphics mode, background images, colors, and all that.
+STORE-DEVICE designates the device holding the store, and STORE-MOUNT-POINT is
+its mount point; these are used to determine where the background image and
+fonts must be searched for.  SYSTEM must be the target system string---e.g.,
+\"x86_64-linux\".  BTRFS-STORE-SUBVOLUME-FILE-NAME is the file name of the
+Btrfs subvolume, to be prepended to any store path, if any."
   (define setup-gfxterm-body
     (let ((gfxmode
            (or (and-let* ((theme (bootloader-configuration-theme config))
-                          (gfxmode (grub-gfxmode theme)))
+                          (gfxmode (grub-theme-gfxmode theme)))
                  (string-join gfxmode ";"))
                "auto")))
 
@@ -176,7 +169,7 @@ system string---e.g., \"x86_64-linux\"."
     (if (memq 'gfxterm (bootloader-configuration-terminal-outputs config))
         #~(format #f "if loadfont ~a; then
   setup_gfxterm
-fi~%" #$font-file)
+fi~%" #+font-file)
         ""))
 
   (define (theme-colors type)
@@ -186,11 +179,14 @@ fi~%" #$font-file)
                      (symbol->string (assoc-ref colors 'bg)))))
 
   (define font-file
-    (strip-mount-point store-mount-point
-                       (file-append grub "/share/grub/unicode.pf2")))
+    (normalize-file (file-append grub "/share/grub/unicode.pf2")
+                    store-mount-point
+                    btrfs-store-subvolume-file-name))
 
   (define image
-    (grub-background-image config))
+    (normalize-file (grub-background-image config)
+                    store-mount-point
+                    btrfs-store-subvolume-file-name))
 
   (and image
        #~(format #$port "
@@ -215,7 +211,7 @@ fi~%"
                  #$(setup-gfxterm config font-file)
                  #$(grub-setup-io config)
 
-                 #$(strip-mount-point store-mount-point image)
+                 #$image
                  #$(theme-colors grub-theme-color-normal)
                  #$(theme-colors grub-theme-color-highlight))))
 
@@ -237,7 +233,7 @@ the 'share/X11/xkb/symbols/' directory of 'xkeyboard-config'."
 
           ;; 'grub-kbdcomp' passes all its arguments but '-o' to 'ckbcomp'
           ;; (from the 'console-setup' package).
-          (invoke #$(file-append grub "/bin/grub-mklayout")
+          (invoke #+(file-append grub "/bin/grub-mklayout")
                   "-i" #+(keyboard-layout->console-keymap layout)
                   "-o" #$output))))
 
@@ -323,52 +319,66 @@ code."
 (define* (grub-configuration-file config entries
                                   #:key
                                   (system (%current-system))
-                                  (old-entries '()))
+                                  (old-entries '())
+                                  btrfs-subvolume-file-name)
   "Return the GRUB configuration file corresponding to CONFIG, a
 <bootloader-configuration> object, and where the store is available at
-STORE-FS, a <file-system> object.  OLD-ENTRIES is taken to be a list of menu
-entries corresponding to old generations of the system."
+STORE-FS, a <file-system> object.  OLD-ENTRIES is taken to be a list
+of menu entries corresponding to old generations of the system.
+BTRFS-SUBVOLUME-FILE-NAME may be used to specify on which subvolume a
+Btrfs root file system resides."
   (define all-entries
     (append entries (bootloader-configuration-menu-entries config)))
   (define (menu-entry->gexp entry)
-    (let ((device (menu-entry-device entry))
-          (device-mount-point (menu-entry-device-mount-point entry))
-          (label (menu-entry-label entry))
-          (kernel (menu-entry-linux entry))
-          (arguments (menu-entry-linux-arguments entry))
-          (initrd (menu-entry-initrd entry)))
+    (let* ((device (menu-entry-device entry))
+           (device-mount-point (menu-entry-device-mount-point entry))
+           (label (menu-entry-label entry))
+           (arguments (menu-entry-linux-arguments entry))
+           (kernel (normalize-file (menu-entry-linux entry)
+                                   device-mount-point
+                                   btrfs-subvolume-file-name))
+           (initrd (normalize-file (menu-entry-initrd entry)
+                                   device-mount-point
+                                   btrfs-subvolume-file-name)))
       ;; Here DEVICE is the store and DEVICE-MOUNT-POINT is its mount point.
       ;; Use the right file names for KERNEL and INITRD in case
       ;; DEVICE-MOUNT-POINT is not "/", meaning that the store is on a
       ;; separate partition.
-      (let ((kernel  (strip-mount-point device-mount-point kernel))
-            (initrd  (strip-mount-point device-mount-point initrd)))
-        #~(format port "menuentry ~s {
+
+      ;; When BTRFS-SUBVOLUME-FILE-NAME is defined, prepend it the kernel and
+      ;; initrd paths, to allow booting from a Btrfs subvolume.
+      #~(format port "menuentry ~s {
   ~a
   linux ~a ~a
   initrd ~a
 }~%"
-                  #$label
-                  #$(grub-root-search device kernel)
-                  #$kernel (string-join (list #$@arguments))
-                  #$initrd))))
+                #$label
+                #$(grub-root-search device kernel)
+                #$kernel (string-join (list #$@arguments))
+                #$initrd)))
   (define sugar
     (eye-candy config
                (menu-entry-device (first all-entries))
                (menu-entry-device-mount-point (first all-entries))
+               #:btrfs-store-subvolume-file-name btrfs-subvolume-file-name
                #:system system
                #:port #~port))
 
   (define keyboard-layout-config
-    (let ((layout (bootloader-configuration-keyboard-layout config))
-          (grub   (bootloader-package
-                   (bootloader-configuration-bootloader config))))
-      #~(let ((keymap #$(and layout
-                             (keyboard-layout-file layout #:grub grub))))
-          (when keymap
-            (format port "\
+    (let* ((layout (bootloader-configuration-keyboard-layout config))
+           (grub   (bootloader-package
+                    (bootloader-configuration-bootloader config)))
+           (keymap* (and layout
+                         (keyboard-layout-file layout #:grub grub)))
+           (keymap (and keymap*
+                        (if btrfs-subvolume-file-name
+                            #~(string-append #$btrfs-subvolume-file-name
+                                             #$keymap*)
+                            keymap*))))
+      #~(when #$keymap
+          (format port "\
 insmod keylayouts
-keymap ~a~%" keymap)))))
+keymap ~a~%" #$keymap))))
 
   (define builder
     #~(call-with-output-file #$output
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index b920e8fc62..ad92d8a496 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -661,8 +661,10 @@ were found."
 
   (match spec
     ((? string?)
-     ;; Nothing to do, but wait until SPEC shows up.
-     (resolve identity spec identity))
+     (if (string-contains spec ":/")
+         spec                  ; do not resolve NFS devices
+         ;; Nothing to do, but wait until SPEC shows up.
+         (resolve identity spec identity)))
     ((? file-system-label?)
      ;; Resolve the label.
      (resolve find-partition-by-label
diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index c6f9df5f29..f08bb11514 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -498,25 +498,13 @@ upon error."
   (define (root-mount-point? fs)
     (string=? (file-system-mount-point fs) "/"))
 
-  (define root-fs-type
-    (or (any (lambda (fs)
-               (and (root-mount-point? fs)
-                    (file-system-type fs)))
-             mounts)
-        "ext4"))
-
-  (define root-fs-flags
-    (mount-flags->bit-mask (or (any (lambda (fs)
-                                      (and (root-mount-point? fs)
-                                           (file-system-flags fs)))
-                                    mounts)
-                               '())))
-
-  (define root-fs-options
-    (any (lambda (fs)
-           (and (root-mount-point? fs)
-                (file-system-options fs)))
-         mounts))
+  (define (device-string->file-system-device device-string)
+    ;; The "--root=SPEC" kernel command-line option always provides a
+    ;; string, but the string can represent a device, a UUID, or a
+    ;; label.  So check for all three.
+    (cond ((string-prefix? "/" device-string) device-string)
+          ((uuid device-string) => identity)
+          (else (file-system-label device-string))))
 
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
@@ -526,7 +514,21 @@ upon error."
       (mount-essential-file-systems)
       (let* ((args    (linux-command-line))
              (to-load (find-long-option "--load" args))
-             (root    (find-long-option "--root" args)))
+             (root-fs (find root-mount-point? mounts))
+             (root-fs-type (or (and=> root-fs file-system-type)
+                               "ext4"))
+             (root-fs-device (and=> root-fs file-system-device))
+             (root-fs-flags (mount-flags->bit-mask
+                             (or (and=> root-fs file-system-flags)
+                                 '())))
+             (root-options (if root-fs
+                               (file-system-options root-fs)
+                               #f))
+             ;; --root takes precedence over the 'device' field of the root
+             ;; <file-system> record.
+             (root-device (or (and=> (find-long-option "--root" args)
+                                     device-string->file-system-device)
+                              root-fs-device)))
 
         (when (member "--repl" args)
           (start-repl))
@@ -561,21 +563,12 @@ upon error."
 
         (setenv "EXT2FS_NO_MTAB_OK" "1")
 
-        (if root
-            ;; The "--root=SPEC" kernel command-line option always provides a
-            ;; string, but the string can represent a device, a UUID, or a
-            ;; label.  So check for all three.
-            (let ((device-spec (cond ((string-prefix? "/" root) root)
-                                     ((uuid root) => identity)
-                                     ((string-contains root ":/") #f) ; nfs
-                                     (else (file-system-label root)))))
-              (mount-root-file-system (if device-spec
-                                          (canonicalize-device-spec device-spec)
-                                          root)
-                                      root-fs-type
-                                      #:volatile-root? volatile-root?
-                                      #:flags root-fs-flags
-                                      #:options root-fs-options))
+        (if root-device
+            (mount-root-file-system (canonicalize-device-spec root-device)
+                                    root-fs-type
+                                    #:volatile-root? volatile-root?
+                                    #:flags root-fs-flags
+                                    #:options root-options)
             (mount "none" "/root" "tmpfs"))
 
         ;; Mount the specified file systems.
diff --git a/gnu/local.mk b/gnu/local.mk
index 3aaa16401d..2bfd0956ca 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -394,6 +394,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/nvi.scm				\
   %D%/packages/ocaml.scm			\
   %D%/packages/ocr.scm				\
+  %D%/packages/openkinect.scm			\
   %D%/packages/onc-rpc.scm			\
   %D%/packages/opencl.scm			\
   %D%/packages/openbox.scm			\
@@ -403,6 +404,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/orpheus.scm			\
   %D%/packages/ots.scm				\
   %D%/packages/package-management.scm		\
+  %D%/packages/pantheon.scm			\
   %D%/packages/parallel.scm			\
   %D%/packages/password-utils.scm		\
   %D%/packages/patchutils.scm			\
@@ -1079,6 +1081,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/hdf-eos5-remove-gctp.patch		\
   %D%/packages/patches/hdf-eos5-fix-szip.patch			\
   %D%/packages/patches/hdf-eos5-fortrantests.patch		\
+  %D%/packages/patches/http-parser-fix-assertion-on-armhf.patch	\
   %D%/packages/patches/hubbub-sort-entities.patch		\
   %D%/packages/patches/hurd-cross.patch				\
   %D%/packages/patches/hplip-remove-imageprocessor.patch	\
@@ -1135,8 +1138,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/kpackage-allow-external-paths.patch	\
   %D%/packages/patches/kmplayer-aarch64.patch			\
   %D%/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch	\
-  %D%/packages/patches/kpmcore-fix-tests.patch			\
-  %D%/packages/patches/kpmcore-remove-broken-test.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
   %D%/packages/patches/kobodeluxe-const-charp-conversion.patch	\
@@ -1274,6 +1275,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/mozjs38-version-detection.patch		\
   %D%/packages/patches/mrrescue-support-love-11.patch		\
   %D%/packages/patches/mtools-mformat-uninitialized.patch	\
+  %D%/packages/patches/multipath-tools-sans-systemd.patch	\
   %D%/packages/patches/mumps-build-parallelism.patch		\
   %D%/packages/patches/mumps-shared-libseq.patch		\
   %D%/packages/patches/mumps-shared-mumps.patch			\
@@ -1432,6 +1434,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
   %D%/packages/patches/python-pygpgme-fix-pinentry-tests.patch	\
   %D%/packages/patches/python-robotframework-honor-source-date-epoch.patch \
+  %D%/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch	\
   %D%/packages/patches/python-slugify-depend-on-unidecode.patch	\
   %D%/packages/patches/python2-subprocess32-disable-input-test.patch	\
   %D%/packages/patches/python-unittest2-python3-compat.patch	\
@@ -1495,7 +1498,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/slim-display.patch			\
   %D%/packages/patches/snappy-add-O2-flag-in-CmakeLists.txt.patch	\
   %D%/packages/patches/sooperlooper-build-with-wx-30.patch 	\
-  %D%/packages/patches/soundconverter-remove-gconf-dependency.patch	\
   %D%/packages/patches/steghide-fixes.patch			\
   %D%/packages/patches/suitesparse-mongoose-cmake.patch		\
   %D%/packages/patches/superlu-dist-awpm-grid.patch		\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 6083691e19..9314abf5be 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -1229,7 +1229,7 @@ at once based on a Perl regular expression.")
                   #t))))
     (build-system gnu-build-system)
     (arguments
-     '(#:configure-flags (list "ROTT_ETCDIR=/etc/rottlog" ;rc file location
+     `(#:configure-flags (list "ROTT_ETCDIR=/etc/rottlog" ;rc file location
                                "--localstatedir=/var")
 
        ;; Install example config files in OUT/etc.
@@ -1243,6 +1243,20 @@ at once based on a Perl regular expression.")
                       (substitute* "rc/rc"
                         (("/usr/sbin/sendmail") "sendmail"))
                       #t))
+                  (add-after 'unpack 'fix-configure
+                    (lambda* (#:key inputs native-inputs #:allow-other-keys)
+                      ;; Replace outdated config.sub and config.guess:
+                      (for-each (lambda (file)
+                                  (install-file
+                                   (string-append
+                                    (assoc-ref
+                                     (or native-inputs inputs) "automake")
+                                    "/share/automake-"
+                                    ,(version-major+minor
+                                      (package-version automake))
+                                    "/" file) "."))
+                                '("config.sub" "config.guess"))
+                      #t))
                   (add-after 'build 'set-packdir
                     (lambda _
                       ;; Set a default location for archived logs.
@@ -1263,6 +1277,7 @@ at once based on a Perl regular expression.")
                     (lambda _
                       (invoke "make" "install-info"))))))
     (native-inputs `(("texinfo" ,texinfo)
+                     ("automake" ,automake)
                      ("util-linux" ,util-linux))) ; for 'cal'
     (home-page "https://www.gnu.org/software/rottlog/")
     (synopsis "Log rotation and management")
@@ -1676,7 +1691,7 @@ module slots, and the list of I/O ports (e.g. serial, parallel, USB).")
 (define-public acpica
   (package
     (name "acpica")
-    (version "20200326")
+    (version "20200430")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1684,7 +1699,7 @@ module slots, and the list of I/O ports (e.g. serial, parallel, USB).")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0y08l6djjn87jmsp5kj0myjdb48000g20xlfs0a22jzzi383h3by"))))
+                "1hiaz9lrmjzdbi5zl0ajfflja41cixzx2j76iyx02qbjlmy9cfjc"))))
     (build-system gnu-build-system)
     (native-inputs `(("flex" ,flex)
                      ("bison" ,bison)))
@@ -1696,14 +1711,16 @@ module slots, and the list of I/O ports (e.g. serial, parallel, USB).")
        #:tests? #f                      ; no 'check' target
        #:phases (modify-phases %standard-phases (delete 'configure))))
     (home-page "https://acpica.org/")
-    (synopsis "Tools for the development and debug of ACPI tables")
+    (synopsis "Tools for the development and debugging of ACPI tables")
     (description
-     "The ACPI Component Architecture (@dfn{ACPICA}) project provides an
-OS-independent reference implementation of the Advanced Configuration and
-Power Interface Specification (@dfn{ACPI}).  ACPICA code contains those portions
-of ACPI meant to be directly integrated into the host OS as a kernel-resident
-subsystem, and a small set of tools to assist in developing and debugging ACPI
-tables.  This package contains only the user-space tools needed for ACPI table
+     "The @acronym{ACPICA, ACPI Component Architecture} project provides an
+OS-independent reference implementation of the @acronym{ACPI, Advanced
+Configuration and Power Interface} specification.  ACPICA code contains those
+portions of ACPI meant to be directly integrated into the host OS as a
+kernel-resident subsystem, and a small set of tools to assist in developing and
+debugging ACPI tables.
+
+This package contains only the user-space tools needed for ACPI table
 development, not the kernel implementation of ACPI.")
     (license license:gpl2)))            ; dual GPLv2/ACPICA Licence
 
diff --git a/gnu/packages/antivirus.scm b/gnu/packages/antivirus.scm
index dc4cc111e1..367ebe70dd 100644
--- a/gnu/packages/antivirus.scm
+++ b/gnu/packages/antivirus.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016, 2017, 2018, 2019, 2020 Eric Bavier <bavier@posteo.net>
 ;;; Copyright © 2018 Christopher Baines <mail@cbaines.net>
-;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -44,14 +44,14 @@
 (define-public clamav
   (package
     (name "clamav")
-    (version "0.102.2")
+    (version "0.102.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.clamav.net/downloads/production/"
                                   "clamav-" version ".tar.gz"))
               (sha256
                (base32
-                "1lq7r6r2yl8pp3fkn32b0bsmbbl9pg90kpvhsa2clad3xg0drz49"))
+                "14q6vi178ih60yz4ja33b6181va1dcj8fyscnmxfx2crav250c7d"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -59,7 +59,8 @@
                             '("win32"                  ; unnecessary
                               "libclamav/c++/llvm"     ; use system llvm
                               "libclamav/tomsfastmath" ; use system tomsfastmath
-                              "libclamunrar"))))       ; non-free license
+                              "libclamunrar"))         ; non-free license
+                  #t))
               (patches
                (search-patches "clamav-system-tomsfastmath.patch"
                                "clamav-config-llvm-libs.patch"))))
diff --git a/gnu/packages/astronomy.scm b/gnu/packages/astronomy.scm
index 7261c62978..5b4590945d 100644
--- a/gnu/packages/astronomy.scm
+++ b/gnu/packages/astronomy.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2019 by Amar Singh <nly@disroot.org>
 ;;; Copyright © 2020 R Veera Kumar <vkor@vkten.in>
 ;;; Copyright © 2020 Guillaume Le Vaillant <glv@posteo.net>
@@ -128,7 +128,7 @@ header.")
 (define-public gnuastro
   (package
     (name "gnuastro")
-    (version "0.11")
+    (version "0.12")
     (source
      (origin
        (method url-fetch)
@@ -136,7 +136,10 @@ header.")
                            version ".tar.lz"))
        (sha256
         (base32
-         "0c1yc2qb7vrqad96savfn06rn01izlfz0va738signv93qqj5k3v"))))
+         "0ypk1c72q778cixfa52vjxzbd5m4qc6hfjgnipy16sfa7mnspmyf"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags '("--disable-static")))
     (inputs
      `(("cfitsio" ,cfitsio)
        ("gsl" ,gsl)
@@ -147,7 +150,6 @@ header.")
     (native-inputs
      `(("libtool" ,libtool)
        ("lzip" ,lzip)))
-    (build-system gnu-build-system)
     (home-page "https://www.gnu.org/software/gnuastro/")
     (synopsis "Astronomy utilities")
     (description "The GNU Astronomy Utilities (Gnuastro) is a suite of
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 2eeda826b5..35c4001303 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -2191,7 +2191,7 @@ buffers, and audio capture.")
 (define-public patchage
   (package
     (name "patchage")
-    (version "1.0.0")
+    (version "1.0.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.drobilla.net/patchage-"
@@ -2199,10 +2199,10 @@ buffers, and audio capture.")
                                   ".tar.bz2"))
               (sha256
                (base32
-                "1agdpwwi42176l4mxj0c4fsvdiv1ig56bfnnx0msckxmy57df8bb"))))
+                "0dk3fiac10m83mwss3026yz7ygc47c2iw924cwwnh2fyydc9bsy6"))))
     (build-system waf-build-system)
     (arguments
-     `(#:tests? #f ; no check target
+     `(#:tests? #f                      ; no check target
        #:python ,python-2))
     (inputs
      `(("alsa-lib" ,alsa-lib)
@@ -3373,14 +3373,14 @@ with support for HD extensions.")
 (define-public bs1770gain
   (package
     (name "bs1770gain")
-    (version "0.6.7")
+    (version "0.6.9")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://sourceforge/bs1770gain/bs1770gain/"
                            version "/bs1770gain-" version ".tar.gz"))
        (sha256
-        (base32 "13hsbqj1dkpz1gbclnjxv50kr7b4gcjai6c1l38g01433h217qjc"))
+        (base32 "1hcbff3q6xl9rj1pzy3fwy91y6fa99wwrhb31461j9kgc173ls7r"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index 6a5080bcf8..0fe6676cc2 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -1029,14 +1029,14 @@ is format-agnostic, so you can feed virtually any files to it.")
 (define-public burp
   (package
     (name "burp")
-    (version "2.3.24")
+    (version "2.3.26")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/burp/burp-" version
                                   "/burp-" version ".tar.bz2"))
               (sha256
                (base32
-                "0dmahqx8ldqdrx9b47r7ag3m801n7h3kclcqja1cc1jzhfhfq27w"))))
+                "1kwm8wwmzla02cqacgpmac6n5466dqd5czx83lkbp97rmg9017h8"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 32b795948b..a738aa51a8 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -5723,7 +5723,7 @@ Roche 454, Ion Torrent and Pacific BioSciences SMRT.")
 (define-public ngs-sdk
   (package
     (name "ngs-sdk")
-    (version "2.9.6")
+    (version "2.10.5")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -5732,7 +5732,7 @@ Roche 454, Ion Torrent and Pacific BioSciences SMRT.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0d5k5kabgl15as37kj9x65xc92j4gcqms86hvihw3yb6wag0r0q3"))))
+                "1ix51c25hjn57w93qmwzw80xh2i34wx8j2hn7szh8p6w8i3az5qa"))))
     (build-system gnu-build-system)
     (arguments
      `(#:parallel-build? #f ; not supported
@@ -5789,7 +5789,7 @@ simultaneously.")
 (define-public ncbi-vdb
   (package
     (name "ncbi-vdb")
-    (version "2.9.6")
+    (version "2.10.6")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -5798,7 +5798,7 @@ simultaneously.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0knkj1sq34hlivgv5qd6jlczqrs3ldmfgn6vbbw7p4mqxvb9mirk"))))
+                "0m8hlxscidsfqm9x9fyi62q6lpf1dv5115kgjjgnrkl49q9c27m6"))))
     (build-system gnu-build-system)
     (arguments
      `(#:parallel-build? #f ; not supported
@@ -6148,7 +6148,7 @@ sequence itself can be retrieved from these databases.")
 (define-public sra-tools
   (package
     (name "sra-tools")
-    (version "2.9.6")
+    (version "2.10.6")
     (source
      (origin
        (method git-fetch)
@@ -6158,11 +6158,11 @@ sequence itself can be retrieved from these databases.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0vqzap68v81k0zif2mnqfy8pnw2nrhsg87p6mgq8qk3nk2jv2rgy"))))
+         "1cr2mijkfs5sm35ffjs6861qsd1qkgnhnbavdv65zg5d655abbjf"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:parallel-build? #f ; not supported
-       #:tests? #f ; no "check" target
+     `(#:parallel-build? #f             ; not supported
+       #:tests? #f                      ; no "check" target
        #:make-flags
        (list (string-append "DEFAULT_CRT="
                             (assoc-ref %build-inputs "ncbi-vdb")
@@ -6205,6 +6205,9 @@ sequence itself can be retrieved from these databases.")
              ;; Dynamic linking
              (substitute* "tools/copycat/Makefile"
                (("smagic-static") "lmagic"))
+             (substitute* "tools/driver-tool/utf8proc/Makefile"
+               (("CC\\?=gcc") "myCC=gcc")
+               (("\\(CC\\)") "(myCC)"))
 
              ;; The 'configure' script doesn't recognize things like
              ;; '--enable-fast-install'.
@@ -6217,8 +6220,9 @@ sequence itself can be retrieved from these databases.")
                      (string-append "--with-magic-prefix="
                                     (assoc-ref inputs "libmagic"))
                      ;; TODO: building with libxml2 fails with linker errors
-                     ;; (string-append "--with-xml2-prefix="
-                     ;;                (assoc-ref inputs "libxml2"))
+                     #;
+                     (string-append "--with-xml2-prefix="
+                                    (assoc-ref inputs "libxml2"))
                      (string-append "--with-ncbi-vdb-sources="
                                     (assoc-ref inputs "ncbi-vdb"))
                      (string-append "--with-ncbi-vdb-build="
@@ -6234,8 +6238,9 @@ sequence itself can be retrieved from these databases.")
        ("ncbi-vdb" ,ncbi-vdb)
        ("libmagic" ,file)
        ("fuse" ,fuse)
-       ("hdf5" ,hdf5)
-       ("zlib" ,zlib)))
+       ("hdf5" ,hdf5-1.10)
+       ("zlib" ,zlib)
+       ("python" ,python-wrapper)))
     (home-page
      "https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=software")
     (synopsis "Tools and libraries for reading and writing sequencing data")
diff --git a/gnu/packages/boost.scm b/gnu/packages/boost.scm
index 2f2ca289ab..d28c58d663 100644
--- a/gnu/packages/boost.scm
+++ b/gnu/packages/boost.scm
@@ -13,6 +13,7 @@
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2019, 2020 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2020 Jonathan Brielmaier <jonathan.brielmaier@web.de>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -241,12 +242,40 @@ across a broad spectrum of applications.")
     (arguments (substitute-keyword-arguments (package-arguments boost)
       ((#:phases phases)
        `(modify-phases ,phases
-          ;; This was removed after boost-1.67.
-          (add-before 'configure 'more-bin-sh-patching
-            (lambda _
-              (substitute* "tools/build/doc/bjam.qbk"
-                (("/bin/sh") (which "sh")))))
-          (delete 'provide-libboost_python)))))
+          (replace 'configure
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let ((icu (assoc-ref inputs "icu4c"))
+                    (out (assoc-ref outputs "out")))
+                (substitute* (append
+                               (find-files "tools/build/src/engine/" "execunix\\.c.*")
+                               '("libs/config/configure"
+                                 "libs/spirit/classic/phoenix/test/runtest.sh"
+                                 "tools/build/doc/bjam.qbk"
+                                 "tools/build/src/engine/Jambase"))
+                  (("/bin/sh") (which "sh")))
+
+                (setenv "SHELL" (which "sh"))
+                (setenv "CONFIG_SHELL" (which "sh"))
+
+                ,@(if (%current-target-system)
+                    `((call-with-output-file "user-config.jam"
+                        (lambda (port)
+                          (format port
+                                  "using gcc : cross : ~a-c++ ;"
+                                  ,(%current-target-system)))))
+                    '())
+
+                (invoke "./bootstrap.sh"
+                        (string-append "--prefix=" out)
+                        ;; Auto-detection looks for ICU only in traditional
+                        ;; install locations.
+                        (string-append "--with-icu=" icu)
+                        "--with-toolset=gcc"))))
+          (delete 'provide-libboost_python)))
+      ((#:make-flags make-flags)
+       `(cons* "--without-python" ,make-flags))))
+    (native-inputs
+     (alist-delete "python" (package-native-inputs boost)))
     (properties '((hidden? . #t)))))
 
 (define-public boost-sync
diff --git a/gnu/packages/busybox.scm b/gnu/packages/busybox.scm
index 0593b86051..e3431aa31b 100644
--- a/gnu/packages/busybox.scm
+++ b/gnu/packages/busybox.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -113,7 +113,7 @@ any small or embedded system.")
 (define-public toybox
   (package
     (name "toybox")
-    (version "0.8.2")
+    (version "0.8.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -121,7 +121,7 @@ any small or embedded system.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "1mgya8zxgf30i5w3rhsb3n70kwlhifxbajh6wqdsz6rf8kx609ws"))))
+                "00aw9d809wj1bqlb2fsssdgz7rj0363ya14py0gfdm0rkp98zcpa"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index e8547a5096..12e01795ee 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -1703,14 +1703,13 @@ normally the case.")
 (define-public python-pytest-sugar
   (package
     (name "python-pytest-sugar")
-    (version "0.9.2")
+    (version "0.9.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pytest-sugar" version))
        (sha256
-        (base32
-         "1asq7yc4g8bx2sn7yy974mhc9ywvaihasjab4inkirdwn9s7mn7w"))))
+        (base32 "1i0hv3h49zvl62jbiyjag84carbrp3zprqzxffdr291nxavvac0n"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-packaging" ,python-packaging)
diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm
index 7227b8d516..b32f4201c0 100644
--- a/gnu/packages/cpp.scm
+++ b/gnu/packages/cpp.scm
@@ -297,7 +297,7 @@ tools (containers, algorithms) used by other QuantStack packages.")
 (define-public ccls
   (package
     (name "ccls")
-    (version "0.20190823.5")
+    (version "0.20190823.6")
     (source
      (origin
        (method git-fetch)
@@ -305,11 +305,11 @@ tools (containers, algorithms) used by other QuantStack packages.")
              (url "https://github.com/MaskRay/ccls")
              (commit version)))
        (sha256
-        (base32 "0b2pkpzn576b92zcxpwchpkyw2fww6s69818rx4g9z34kzm35zy5"))
+        (base32 "11h5nwk4qqshf3i8yr4bxpnvmidrhkzd0zxhf1xqv8cv6r08k47f"))
        (file-name (git-file-name name version))))
     (build-system cmake-build-system)
     (arguments
-     '(#:tests? #f)) ; no check target.
+     '(#:tests? #f))                    ; no check target
     (inputs
      `(("rapidjson" ,rapidjson)))
     (native-inputs
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
index 0487dc5216..9381cb5794 100644
--- a/gnu/packages/cups.scm
+++ b/gnu/packages/cups.scm
@@ -244,7 +244,7 @@ device-specific programs to convert and print many types of files.")
     (license license:asl2.0)))
 
 (define-public cups
-  (package (inherit cups-minimal)
+  (package/inherit cups-minimal
     (name "cups")
     (arguments
      `(;; Three tests fail:
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index a87a458abf..3f0ebc47a7 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -1459,7 +1459,7 @@ extremely small.")
 (define-public perl-dbi
   (package
     (name "perl-dbi")
-    (version "1.642")
+    (version "1.643")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1467,7 +1467,7 @@ extremely small.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0pbzqazrx7pnw4nbyaf27in4b6yddkirbd2ws7mnqa2n7812a81z"))))
+                "1yinx39960y241vf2sknxj0dfz82a5m9gvklq5rw78k0nlyrjawa"))))
     (build-system perl-build-system)
     (synopsis "Database independent interface for Perl")
     (description "This package provides an database interface for Perl.")
@@ -1703,7 +1703,7 @@ columns, primary keys, unique constraints and relationships.")
 (define-public perl-dbd-sqlite
   (package
     (name "perl-dbd-sqlite")
-    (version "1.62")
+    (version "1.64")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1711,7 +1711,7 @@ columns, primary keys, unique constraints and relationships.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0p78ri1q6xpc1i98i6mlriv8n66iz8r5r11dlsknjm4y58rfz0mx"))))
+                "00gz5aw3xrr92lf9nfk0dhmy7a8jzmxhznddd9b0a8w4a1xqzbpl"))))
     (build-system perl-build-system)
     (inputs `(("sqlite" ,sqlite)))
     (propagated-inputs `(("perl-dbi" ,perl-dbi)))
@@ -2049,17 +2049,14 @@ database.")
 (define-public perl-db-file
  (package
   (name "perl-db-file")
-  (version "1.852")
+  (version "1.853")
   (source
     (origin
       (method url-fetch)
-      (uri (string-append
-             "mirror://cpan/authors/id/P/PM/PMQS/DB_File-"
-             version
-             ".tar.gz"))
+      (uri (string-append "mirror://cpan/authors/id/P/PM/PMQS/DB_File-"
+                          version ".tar.gz"))
       (sha256
-        (base32
-          "14c30xyqx9c1hxw40bqbzls41al8gmklxv5jbk2kknmn4dsrbdrs"))))
+        (base32 "1y967si45vj0skip1hnhicbv9da29fv6qcfwnsbnvj06n36mkj6h"))))
   (build-system perl-build-system)
   (inputs `(("bdb" ,bdb)))
   (native-inputs `(("perl-test-pod" ,perl-test-pod)))
@@ -2382,13 +2379,13 @@ etc., and an SQL engine for performing simple SQL queries.")
 (define-public python-lmdb
   (package
     (name "python-lmdb")
-    (version "0.95")
+    (version "0.98")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "lmdb" version))
               (sha256
                (base32
-                "0nx9f193gzl33r1lbqhb96h1igya7pz8wmahr8m9x5zgc05hal91"))
+                "027pgbdhhdcbwj53vrzr6a60gjhmz4s75gl3180fd4q8pwlbq986"))
               (modules '((guix build utils)))
               (snippet
                ;; Delete bundled lmdb source files.
@@ -2424,9 +2421,6 @@ Memory-Mapped Database} (LMDB), a high-performance key-value store.")
            ;; but not actually needed on platforms currently supported by Guix.
            license:bsd-3))))
 
-(define-public python2-lmdb
-  (package-with-python2 python-lmdb))
-
 (define-public python-orator
   (package
     (name "python-orator")
diff --git a/gnu/packages/dictionaries.scm b/gnu/packages/dictionaries.scm
index 06ccfafb40..4f8c35d040 100644
--- a/gnu/packages/dictionaries.scm
+++ b/gnu/packages/dictionaries.scm
@@ -231,7 +231,7 @@ and a Python library.")
 (define-public translate-shell
   (package
     (name "translate-shell")
-    (version "0.9.6.11")
+    (version "0.9.6.12")
     (source
       (origin
         (method git-fetch)
@@ -240,7 +240,7 @@ and a Python library.")
                (commit (string-append "v" version))))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "137fz3ahzf65hfqcs4k7hhrmfjlhlw7wr3gfsvk88bnyqkyw44sm"))))
+         (base32 "075vqnha21rhr1b61dim7dqlfwm1yffyzcaa83s36rpk9r5sddzx"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm
index 469ef7605d..d0c03ff2d5 100644
--- a/gnu/packages/dns.scm
+++ b/gnu/packages/dns.scm
@@ -119,7 +119,7 @@ and BOOTP/TFTP for network booting of diskless machines.")
 (define-public isc-bind
   (package
     (name "bind")
-    (version "9.16.2")
+    (version "9.16.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -127,7 +127,7 @@ and BOOTP/TFTP for network booting of diskless machines.")
                     "/bind-" version ".tar.xz"))
               (sha256
                (base32
-                "0gwr4p14zy5jqq050n762rfc33km51qwipcwy6bsvk55ziybgrfr"))))
+                "0zjgaspnx0p0rp83h4yj595s25da7fjis94z9frhv3azvq9nbb17"))))
     (build-system gnu-build-system)
     (outputs `("out" "utils"))
     (inputs
@@ -595,14 +595,14 @@ Extensions} (DNSSEC).")
 (define-public knot
   (package
     (name "knot")
-    (version "2.9.3")
+    (version "2.9.4")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://secure.nic.cz/files/knot-dns/"
                            "knot-" version ".tar.xz"))
        (sha256
-        (base32 "0zm0642hkb16sqkqpa84f89f3s0bw44m837r1nia8m89swvz3bgj"))
+        (base32 "00d5lkan1yfxphw8q1vrmfpmg8kykdaky8082m1s1ps03cxckwsp"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/docker.scm b/gnu/packages/docker.scm
index c95ca3f9d7..bf009a792b 100644
--- a/gnu/packages/docker.scm
+++ b/gnu/packages/docker.scm
@@ -544,7 +544,9 @@ built-in registry server of Docker.")
                (install-file (string-append "bundles/dynbinary-daemon/dockerd-"
                                             (getenv "VERSION"))
                              out-bin)
-               #t))))))
+               #t)))
+         (add-after 'install 'remove-go-references
+           (assoc-ref go:%standard-phases 'remove-go-references)))))
     (inputs
      `(("btrfs-progs" ,btrfs-progs)
        ("containerd" ,containerd)       ; for containerd-shim
diff --git a/gnu/packages/efi.scm b/gnu/packages/efi.scm
index d986913243..da00fdf932 100644
--- a/gnu/packages/efi.scm
+++ b/gnu/packages/efi.scm
@@ -37,14 +37,14 @@
 (define-public gnu-efi
   (package
     (name "gnu-efi")
-    (version "3.0.11")
+    (version "3.0.12")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://sourceforge/gnu-efi/"
                            "gnu-efi-" version ".tar.bz2"))
        (sha256
-        (base32 "1ffnc4xbzfggs37ymrgfx76j56kk2644c081ivhr2bjkla9ag3gj"))))
+        (base32 "0sbn6am3k5lqafycggh1g964fcwjwnh0i9hhwrk4ncrwzphz55h1"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; none exist
@@ -54,8 +54,8 @@
        (modify-phases %standard-phases
          (delete 'configure))))
     (synopsis "EFI toolchain")
-    (description "This package provides an EFI (Extensible Firmware
-Interface) toolchain for building programs that can run in the
+    (description "This package provides an @acronym{EFI, Extensible Firmware
+Interface} toolchain for building programs that can run in the
 environment presented by Intel's EFI.")
     (home-page "https://directory.fsf.org/wiki/GNU_EFI")
     ;; Distribution is allowed only when accepting all those licenses.
diff --git a/gnu/packages/elf.scm b/gnu/packages/elf.scm
index 5fa66210db..098c0fc94a 100644
--- a/gnu/packages/elf.scm
+++ b/gnu/packages/elf.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
@@ -38,7 +38,9 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages sphinx)
   #:use-module (gnu packages texinfo)
-  #:use-module (gnu packages xml))
+  #:use-module (gnu packages xml)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26))
 
 (define-public elfutils
   (package
@@ -67,10 +69,11 @@
                                               (assoc-ref %outputs "out")
                                               "/lib"))
 
-       ;; Disable tests on MIPS (without changing
+       ;; Disable tests on MIPS and PowerPC (without changing
        ;; the arguments list on other systems).
-       ,@(if (string-prefix? "mips" (or (%current-target-system)
-                                        (%current-system)))
+       ,@(if (any (cute string-prefix? <> (or (%current-target-system)
+                                              (%current-system)))
+                  '("mips" "powerpc"))
              '(#:tests? #f)
              '())
 
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 015bb06e4a..d952e8ea6c 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -19,7 +19,7 @@
 ;;; Copyright © 2016, 2017, 2018, 2019, 2020 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2017, 2018, 2019, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
-;;; Copyright © 2017, 2018, 2019 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2017, 2018, 2019, 2020 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017 Vasile Dumitrascu <va511e@yahoo.com>
 ;;; Copyright © 2017, 2018 Kyle Meyer <kyle@kyleam.com>
 ;;; Copyright © 2017 Kei Kebreau <kkebreau@posteo.net>
@@ -168,6 +168,7 @@
   #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages wordnet)
   #:use-module (gnu packages photo)
+  #:use-module (gnu packages uml)
   #:use-module (guix utils)
   #:use-module (srfi srfi-1)
   #:use-module (ice-9 match))
@@ -881,21 +882,21 @@ supports type hints, definition-jumping, completion, and more.")
       (license license:gpl3+))))
 
 (define-public emacs-flycheck
-  ;; last release version was more than 300 commits ago
-  (let ((commit "0006a59259ebd02c9199ddc87f0e3ce22793a2ea")
-        (revision "1"))
+  ;; Last release version was more than 500 commits ago.
+  (let ((commit "9bcf6b665e15db94870bebc81dc8248c3eec20d3")
+        (revision "2"))
     (package
       (name "emacs-flycheck")
       (version (git-version "31" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/flycheck/flycheck/")
-                      (commit commit)))
-                (sha256
-                 (base32
-                  "09q3h6ldpg528cfbmsbb1x2vf5hmzgm3fshqn6kdy144jxcdjlf1"))
-                (file-name (git-file-name name version))))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/flycheck/flycheck/")
+               (commit commit)))
+         (sha256
+          (base32 "015ixss5bjr7gvhj8mkw5x2x1hy6fvvsjarr2xpv0gskkkngs7pg"))
+         (file-name (git-file-name name version))))
       (build-system emacs-build-system)
       (propagated-inputs
        `(("emacs-dash" ,emacs-dash)))
@@ -3759,7 +3760,7 @@ for Flow files.")
 (define-public emacs-flycheck-grammalecte
   (package
     (name "emacs-flycheck-grammalecte")
-    (version "1.0")
+    (version "1.2")
     (source
      (origin
        (method url-fetch)
@@ -3767,30 +3768,31 @@ for Flow files.")
                            "flycheck-grammalecte/snapshot/"
                            "flycheck-grammalecte-" version ".tar.xz"))
        (sha256
-        (base32 "02wxaw228dia8cps0v02327hrrribfqb4601qggjpi4l4ms1lf8b"))))
+        (base32 "1mzmzyik843r4j0ibpwqrxmb0g4xmirrf3lxr010bddkmmxf749a"))))
     (build-system emacs-build-system)
     (arguments
      `(#:include '("\\.(el|py)$")
+       #:exclude '("^test-profile.el$")
+       #:emacs ,emacs                   ;need libxml support
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'set-external-executables
-           ;; Hardcode python3 and curl executables in the Emacs library.
+         (add-after 'unpack 'fix-python-executable
+           ;; Hardcode python3 executable in the Emacs library.
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((python3 (string-append (assoc-ref inputs "python")
-                                           "/bin/python3"))
-                   (curl (string-append (assoc-ref inputs "curl")
-                                        "/bin/curl")))
+                                           "/bin/python3")))
                (substitute* "flycheck-grammalecte.el"
-                 (("\"python3?") (string-append "\"" python3))
-                 (("\"curl") (string-append "\"" curl)))
+                 (("\"python3") (string-append "\"" python3)))
                #t)))
-         (add-after 'install 'link-to-grammalecte
-           ;; The package expects grammalecte to be in a sub-directory.
-           ;; Symlink it there from the store.
+         (add-before 'build 'link-to-grammalecte
+           ;; XXX: The Python part of the package requires grammalecte, but
+           ;; the library is not specified in PYTHONPATH, since we're not
+           ;; using Python build system.  As a workaround, we symlink
+           ;; grammalecte libraries here.
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((grammalecte (assoc-ref inputs "grammalecte"))
-                   (out (assoc-ref outputs "out"))
-                   (version ,(version-major+minor (package-version python))))
+             (let* ((out (assoc-ref outputs "out"))
+                    (grammalecte (assoc-ref inputs "grammalecte"))
+                    (version ,(version-major+minor (package-version python))))
                (with-directory-excursion
                    (string-append out "/share/emacs/site-lisp")
                  (symlink (string-append grammalecte "/lib/"
@@ -3799,17 +3801,17 @@ for Flow files.")
                           "grammalecte"))
                #t))))))
     (inputs
-     `(("curl" ,curl)
-       ("grammalecte" ,grammalecte)
+     `(("grammalecte" ,grammalecte)
        ("python" ,python)))
     (propagated-inputs
      `(("emacs-flycheck" ,emacs-flycheck)))
     (home-page "https://git.deparis.io/flycheck-grammalecte/")
     (synopsis "Integrate Grammalecte with Flycheck")
-    (description "Integrate the French grammar and typography checker
-Grammalecte with Flycheck to automatically look for mistakes in your writings.
-It also provides an easy way to find synonyms and antonyms for a given
-word (to avoid repetitions for example).")
+    (description
+     "Integrate the French grammar and typography checker Grammalecte with
+Flycheck to automatically look for mistakes in your writings.  It also
+provides an easy way to find synonyms and antonyms for a given word (to avoid
+repetitions for example).")
     (license license:gpl3+)))
 
 (define-public emacs-flycheck-rust
@@ -12690,7 +12692,7 @@ standard Unix password manager\").")
 (define-public emacs-pass
   (package
     (name "emacs-pass")
-    (version "1.8")
+    (version "2.0")
     (source
      (origin
        (method git-fetch)
@@ -12699,7 +12701,7 @@ standard Unix password manager\").")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "05h4hacv3yygyjcjj004qbyqjpkl4pyhwgp25gsz8mw5c66l70cx"))))
+        (base32 "0jc8j421mlflspg24jvrqc2n3y5n3cpk3hjy560il8g36xi1049p"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-password-store" ,emacs-password-store)
@@ -14917,6 +14919,29 @@ repository, @code{magit-org-todos} will create a section in your Magit status
 buffer with each of your todos.")
       (license license:gpl3+))))
 
+(define-public emacs-vcsh
+  (package
+    (name "emacs-vcsh")
+    (version "0.4.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/stepnem/vcsh-el.git")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "183pffdiqb7qqmjq31wxl3fpv8qswqgg99gb716rddiyk15ysri7"))))
+    (build-system emacs-build-system)
+    (home-page "https://gitlab.com/stepnem/vcsh-el")
+    (synopsis "Emacs VCSH integration")
+    (description
+     "This library provides basic ``enter'' functionality and a few
+convenience commands to initialize a @acronym{VCSH, Version Control System for
+$HOME} repository and add files to it.  It can be used in conjunction with
+Magit.")
+    (license license:public-domain)))
+
 (define-public emacs-f3
   (package
     (name "emacs-f3")
@@ -20716,17 +20741,17 @@ it forcibly
 (define-public emacs-elpher
   (package
     (name "emacs-elpher")
-    (version "1.4.6")
+    (version "2.7.4")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/tgvaughan/elpher")
+             (url "git://thelambdalab.xyz/elpher.git")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "07xansmhn4l0b9ghzf56vyx8cqg0q01aq3pz5ikx2i19v5f0rc66"))))
+         "13ba72sjfyg1xvam131iapzqdf9pkwpn67zlyydmm6bv9pxlr431"))))
     (build-system emacs-build-system)
     (native-inputs
      `(("texinfo" ,texinfo)))
@@ -20736,7 +20761,7 @@ it forcibly
          (add-before 'install 'build-doc
            (lambda _
              (invoke "makeinfo" "elpher.texi"))))))
-    (home-page "https://github.com/tgvaughan/elpher")
+    (home-page "gopher://thelambdalab.xyz/1/projects/elpher/")
     (synopsis "Gopher client for Emacs")
     (description "Elpher is a full-featured gopher client for Emacs.  Its
 features include intuitive keyboard and mouse-driven browsing, out-of-the-box
@@ -22941,3 +22966,51 @@ deleting them with @code{(setq delete-by-moving-to-trash t)}.  This package
 provides a simple but convenient user interface to manage those trashed
 files.")
     (license license:gpl3+)))
+
+(define-public emacs-plantuml-mode
+  (package
+    (name "emacs-plantuml-mode")
+    (version "1.4.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/skuro/plantuml-mode")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0yp41d2dmf3sx7qnl5x0zdjcr9y71b2wwc9m0q31v22xqn938ipc"))))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'use-local-plantuml
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((plantuml (assoc-ref inputs "plantuml"))
+                   (file "plantuml-mode.el"))
+               (chmod file #o644)
+               (emacs-substitute-variables file
+                 ("plantuml-jar-path"
+                  (string-append plantuml "/share/java/plantuml.jar"))
+                 ("plantuml-executable-path"
+                  (string-append plantuml "/bin/plantuml"))
+                 ("plantuml-server-url" 'nil)
+                 ("plantuml-default-exec-mode" ''executable))
+               (emacs-batch-edit-file file
+                 `(progn (progn
+                          (goto-char (point-min))
+                          (re-search-forward "(defun plantuml-download-jar")
+                          (beginning-of-line)
+                          (kill-sexp))
+                         (basic-save-buffer)))
+               #t))))))
+    (inputs
+     `(("plantuml" ,plantuml)))
+    (propagated-inputs
+     `(("emacs-dash" ,emacs-dash)))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/skuro/plantuml-mode")
+    (synopsis "Major mode for editing PlantUML sources")
+    (description "This package provides a major mode for editing PlantUML
+sources.  It features syntax highlighting, autocompletion, preview of buffer
+or region and use of locally installed binaries.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 6ac1a2d7f3..9be1065de2 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -1040,7 +1040,7 @@ the Raspberry Pi chip."))))
 (define-public python-libmpsse
   (package
     (name "python-libmpsse")
-    (version "1.4")
+    (version "1.4.1")
     (source
       (origin
         (method git-fetch)
@@ -1050,7 +1050,7 @@ the Raspberry Pi chip."))))
         (file-name "libmpsse-checkout")
         (sha256
           (base32
-            "14f1kiiia4kfd9mzwx4h63aa8bpz9aknbrrr7mychnsp3arw0z25"))))
+            "1rypfb96k2szqgygp3jnwg2zq9kwmfz0460dsahn3r2vkzml8wn7"))))
     (build-system gnu-build-system)
     (inputs
      `(("libftdi" ,libftdi)
@@ -1073,8 +1073,7 @@ the Raspberry Pi chip."))))
                (chdir "src")
                (setenv "PYDEV" (string-append python
                                "/include/python"
-                               ,(version-major+minor (package-version python))
-                               "m"))
+                               ,(version-major+minor (package-version python))))
                #t)))
          (replace 'install
            (lambda* (#:key inputs outputs make-flags #:allow-other-keys #:rest args)
diff --git a/gnu/packages/emulators.scm b/gnu/packages/emulators.scm
index 85e2016e49..7fad8a775b 100644
--- a/gnu/packages/emulators.scm
+++ b/gnu/packages/emulators.scm
@@ -1274,7 +1274,7 @@ play them on systems for which they were never designed!")
 (define-public mame
   (package
     (name "mame")
-    (version "0.220")
+    (version "0.221")
     (source
      (origin
        (method git-fetch)
@@ -1283,7 +1283,7 @@ play them on systems for which they were never designed!")
              (commit (apply string-append "mame" (string-split version #\.)))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0x3yr195zi7xjr21p1c2l8c0vhg0a0af0mpz4i1w7q7r9krvcvz4"))
+        (base32 "07fl7alj9zlyb93i8lnn4706ndy3qiv0pjvwnwysk5rqa0r3463y"))
        (modules '((guix build utils)))
        (snippet
         ;; Remove bundled libraries.
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 172f8481eb..be86848538 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2020 Vincent Legoll <vincent.legoll@gmail.com>
 ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2020 Ekaitz Zarraga <ekaitz@elenq.tech>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -38,6 +39,7 @@
   #:use-module (guix download)
   #:use-module (guix gexp)
   #:use-module (guix git-download)
+  #:use-module (guix svn-download)
   #:use-module (guix monads)
   #:use-module (guix store)
   #:use-module (guix utils)
@@ -798,16 +800,16 @@ language.")
 (define-public kicad
   (package
     (name "kicad")
-    (version "5.1.5")
+    (version "5.1.6")
     (source
      (origin
-       (method url-fetch)
-       (file-name (string-append name "-" version ".tar.xz"))
-       (uri (string-append
-             "https://launchpad.net/kicad/" (version-major version)
-             ".0/" version "/+download/kicad-" version ".tar.xz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/kicad/code/kicad.git")
+             (commit version)))
        (sha256
-        (base32 "0x3417f2pa7p65s9f7l49rqbnrzy8gz6i0n07mlbxqbnm0fmlql0"))))
+        (base32 "1pa3z0h0679jmgxlzc833h6q85b5paxdp69kf2h93vkaryj58622"))
+       (file-name (git-file-name name version))))
     (build-system cmake-build-system)
     (arguments
      `(#:out-of-source? #t
@@ -821,7 +823,7 @@ language.")
        (modify-phases %standard-phases
          (add-after 'install 'install-translations
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (copy-recursively (assoc-ref inputs "kicad-i18l")
+             (copy-recursively (assoc-ref inputs "kicad-i18n")
                                (assoc-ref outputs "out"))
              #t))
          (add-after 'install 'wrap-program
@@ -859,7 +861,7 @@ language.")
      `(("boost" ,boost)
        ("desktop-file-utils" ,desktop-file-utils)
        ("gettext" ,gettext-minimal)
-       ("kicad-i18l" ,kicad-i18l)
+       ("kicad-i18n" ,kicad-i18n)
        ("pkg-config" ,pkg-config)
        ("swig" ,swig)
        ("zlib" ,zlib)))
@@ -885,10 +887,10 @@ perform specific functions, for example, pcbnew (Editing PCB), eeschema (editing
 electrical diagrams), gerbview (viewing Gerber files) and others.")
     (license license:gpl3+)))
 
-(define kicad-i18l
+(define kicad-i18n
   (package
-    (name "kicad-i18l")
-    (version "5.1.5")
+    (name "kicad-i18n")
+    (version (package-version kicad))
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -897,7 +899,7 @@ electrical diagrams), gerbview (viewing Gerber files) and others.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1rfpifl8vky1gba2angizlb2n7mwmsiai3r6ip6qma60wdj8sbd3"))))
+                "0qryi8xjm23ka363zfl7bbga0v5c31fr3d4nyxp3m168vkv9zhha"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
@@ -906,16 +908,19 @@ electrical diagrams), gerbview (viewing Gerber files) and others.")
          (delete 'check))))
     (native-inputs
      `(("gettext" ,gettext-minimal)))
-    (home-page "https://kicad-pcb.org/")
+    (home-page (package-home-page kicad))
     (synopsis "KiCad GUI translations")
     (description "This package contains the po files that are used for the GUI
 translations for KiCad.")
     (license license:gpl3+)))
 
+(define-public kicad-i18l
+  (deprecated-package "kicad-i18l" kicad-i18n))
+
 (define-public kicad-symbols
   (package
     (name "kicad-symbols")
-    (version "5.1.5")
+    (version (package-version kicad))
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -924,11 +929,11 @@ translations for KiCad.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "048b07ffsaav1ssrchw2p870lvb4rsyb5vnniy670k7q9p16qq6h"))))
+                "12w3rdy085drlikkpb27n9ni7cyg9l0pqy7hnr86cxjcw3l5wcx6"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f))                    ; no tests exist
-    (home-page "https://kicad-pcb.org/")
+    (home-page (package-home-page kicad))
     (synopsis "Official KiCad schematic symbol libraries")
     (description "This package contains the official KiCad schematic symbol
 libraries.")
@@ -944,7 +949,7 @@ libraries.")
   (package
     (inherit kicad-symbols)
     (name "kicad-footprints")
-    (version "5.1.5")
+    (version (package-version kicad))
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -953,7 +958,7 @@ libraries.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1c4whgn14qhz4yqkl46w13p6rpv1k0hsc9s9h9368fxfcz9knb2j"))))
+                "1kmf91a5mmvj9izrv40mkaw1w36yjgn8daczd9rq2wlmd0rdp1zx"))))
     (synopsis "Official KiCad footprint libraries")
     (description "This package contains the official KiCad footprint libraries.")))
 
@@ -961,7 +966,7 @@ libraries.")
   (package
     (inherit kicad-symbols)
     (name "kicad-packages3d")
-    (version "5.1.5")
+    (version (package-version kicad))
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -970,7 +975,7 @@ libraries.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0cff2ms1bsw530kqb1fr1m2pjixyxzwa81mxgac3qpbcf8fnpvaz"))))
+                "0b9jglf77fy0n0r8xs4yqkv6zvipyfvp0z5dnqlzp32csy5aqpi1"))))
     (synopsis "Official KiCad 3D model libraries")
     (description "This package contains the official KiCad 3D model libraries.")))
 
@@ -978,7 +983,7 @@ libraries.")
   (package
     (inherit kicad-symbols)
     (name "kicad-templates")
-    (version "5.1.5")
+    (version (package-version kicad))
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -987,7 +992,7 @@ libraries.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0cs3bm3zb5ngw5ldn0lzw5bvqm4kvcidyrn76438alffwiz2b15g"))))
+                "1hppcsrkn4dk6ggby6ckh0q65qxkywrbyxa4lwpaf7pxjyv498xg"))))
     (synopsis "Official KiCad project and worksheet templates")
     (description "This package contains the official KiCad project and
 worksheet templates.")))
@@ -2042,17 +2047,18 @@ simulator backends @code{Qucsator}, @code{ngspice} and @code{Xyce}.")
 (define-public librepcb
   (package
     (name "librepcb")
-    (version "0.1.3")
+    (version "0.1.4")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://download.librepcb.org/releases/"
                            version "/librepcb-" version "-source.zip"))
        (sha256
-        (base32 "1ich849dsx2hmcwlwbry4mkg374n940l3hy6srh4qms2rm7vd7x0"))))
+        (base32 "1b5dkanz3q0y5ag80w0l85hn7axrachb5m9zvyv4zvzrfy09wa88"))))
     (build-system gnu-build-system)
     (inputs
      `(("qtbase" ,qtbase)
+       ("qtsvg" ,qtsvg)
        ("zlib" ,zlib)))
     (native-inputs
      `(("qttools" ,qttools)             ; for lrelease
@@ -2533,3 +2539,82 @@ without any changes.  And programmers that are familiar with the magellan API
 can continue using it with a free library without the restrictions of the
 official SDK.")
     (license license:bsd-3)))
+
+(define-public openctm
+  (let ((revision 603))
+    ;; Previous versions don't compile, they need to link libGL and libGLU.
+    ;; Fixed in this revision.
+    (package
+      (name "openctm")
+      (version (string-append "1.0.3." (number->string revision)))
+      (source
+       (origin
+         (method svn-fetch)
+         (uri (svn-reference
+               (url "https://svn.code.sf.net/p/openctm/code/trunk")
+               (revision revision)))
+         (file-name (string-append name "-" version "-checkout"))
+         (sha256
+          (base32 "01wb70m48xh5gwhv60a5brv4sxl0i0rh038w32cgnlxn5x86s9f1"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("pkg-config" ,pkg-config)))
+      (inputs
+       `(("mesa" ,mesa)
+         ("glu" ,glu)
+         ("glut" ,freeglut)
+         ("gtk" ,gtk+-2)))
+      (arguments
+       `(#:tests? #f                              ;no tests
+         #:phases
+         (modify-phases %standard-phases
+           (replace 'configure
+             (lambda* (#:key outputs #:allow-other-keys)
+               (rename-file "Makefile.linux" "Makefile")
+               (let ((out (assoc-ref outputs "out")))
+                 ;; Create output directories.
+                 (mkdir-p (string-append out "/lib"))
+                 (mkdir-p (string-append out "/include"))
+                 (mkdir-p (string-append out "/bin"))
+                 ;; Fix rpath.
+                 (substitute* "tools/Makefile.linux"
+                   (("-rpath,\\.")
+                    (string-append "-rpath," out "/lib/"))
+                   (("/usr/local")
+                    out))
+                 ;; Set right output.
+                 (substitute* "Makefile"
+                   (("/usr/lib")
+                    (string-append out "/lib"))
+                   (("\\/usr\\/local")
+                    out))
+                 #t))))))
+      (synopsis "3D triangle mesh format and related tools and libraries")
+      (description "OpenCTM is a file format, a software library and a tool set
+for compression of 3D triangle meshes.  The geometry is compressed to a
+fraction of comparable file formats (3DS, STL, COLLADA...), and the format is
+accessible through a simple API")
+      (license license:zlib)
+      (home-page "http://openctm.sourceforge.net/"))))
+
+(define-public lib3ds
+  (package
+    (name "lib3ds")
+    (version "1.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://storage.googleapis.com/google-code-archive-downloads"
+             "/v2/code.google.com/lib3ds/lib3ds-" version ".zip"))
+       (sha256
+        (base32 "1qr9arfdkjf7q11xhvxwzmhxqz3nhcjkyb8zzfjpz9jm54q0rc7m"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (home-page "https://code.google.com/archive/p/lib3ds")
+    (synopsis "3DS format file toolkit")
+    (description "Lib3ds is a toolkit for handling the 3DS format for 3D
+model files.  Its main goal is to simplify the creation of 3DS import and
+export filters.")
+    (license license:lgpl2.1+)))
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index 7018479665..92a00240f3 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -1227,9 +1227,8 @@ Trezor wallet.")
 
 (define-public bitcoin-abc
   (package
-    (inherit bitcoin-core)
     (name "bitcoin-abc")
-    (version "0.20.7")
+    (version "0.21.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.bitcoinabc.org/"
@@ -1237,12 +1236,10 @@ Trezor wallet.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0py5ilfi4r8qh5r9637vwch27sqrrn0dg9rz8bccnj3lp2xpzw27"))))
+                "1w3c397h2mxsi9471fwyc3yjxw7s4jgvr4q3w2qfh49bhr4wygqj"))))
+    (build-system cmake-build-system)
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("libtool" ,libtool)
-       ("pkg-config" ,pkg-config)
+     `(("pkg-config" ,pkg-config)
        ("python" ,python)               ; for the tests
        ("util-linux" ,util-linux)       ; provides the hexdump command for tests
        ("qttools" ,qttools)))
@@ -1255,7 +1252,28 @@ Trezor wallet.")
        ("protobuf" ,protobuf)
        ("qrencode" ,qrencode)
        ("qtbase" ,qtbase)
+       ("zeromq" ,zeromq)
        ("zlib" ,zlib)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'make-qt-deterministic
+           (lambda _
+             ;; Make Qt deterministic.
+             (setenv "QT_RCC_SOURCE_DATE_OVERRIDE" "1")
+             #t))
+         (add-before 'check 'set-home
+           (lambda _
+             (setenv "HOME" (getenv "TMPDIR")) ; tests write to $HOME
+             #t))
+         (add-after 'check 'check-functional
+           (lambda _
+             (invoke
+              "python3" "./test/functional/test_runner.py"
+              (string-append "--jobs=" (number->string (parallel-job-count)))
+              ;; TODO: find why the abc-miner-fund test fails.
+              "--exclude=abc-miner-fund")
+             #t)))))
     (home-page "https://www.bitcoinabc.org/")
     (synopsis "Bitcoin ABC peer-to-peer full node for the Bitcoin Cash protocol")
     (description
@@ -1269,7 +1287,8 @@ As a fork it implemented changes lowering the time between blocks and now
 offers confimations after less than 5 seconds and have significantly lower
 fees that BTC.  Bitcoin ABC is the reference implementation of the Bitcoin
 Cash protocol.  This package provides the Bitcoin Cash command line client and
-a client based on Qt.  This is a fork of Bitcoin Core.")))
+a client based on Qt.  This is a fork of Bitcoin Core.")
+    (license license:expat)))
 
 (define-public libofx
   (package
@@ -1368,16 +1387,16 @@ entity management.")
 (define-public bitcoin-unlimited
   (package
     (name "bitcoin-unlimited")
-    (version "1.7.0.0")
+    (version "1.8.0.0")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://github.com/BitcoinUnlimited/BitcoinUnlimited.git")
-             (commit (string-append "bucash" version))))
+             (commit (string-append "BCHunlimited" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "05rcd73mg2fb2zb6b1imzspck6jhcy3xymrr7n24kwjrzmvihdpx"))))
+        (base32 "1ivkig6q7i4n389dg1zv06cmfki20bjq0slmshx0p5a1aavkqj7k"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("autoconf" ,autoconf)
@@ -1415,12 +1434,23 @@ entity management.")
                        "/bin/lupdate"))
        #:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'fix-build
+           (lambda _
+             ;; The 'stack' header was not included in unlimited.cpp, which
+             ;; caused the build to fail.
+             (substitute* "src/unlimited.cpp"
+               (("#include <queue>" all)
+                (string-append all "\n#include <stack>")))
+             #t))
          (add-after 'unpack 'fix-tests
            (lambda _
-             ;; TODO: Find why utilprocess_tests never ends. Disable for now.
-             (substitute* "src/test/utilprocess_tests.cpp"
-               (("#if \\(BOOST_OS_LINUX && \\(BOOST_VERSION >= 106500\\)\\)")
-                "#if 0"))
+             ;; TODO: Find why txvalidationcache_tests fails and
+             ;; utilprocess_tests never ends. Disable for now.
+             (substitute* "src/Makefile.test.include"
+               (("test/txvalidationcache_tests.cpp")
+                "")
+               (("test/utilprocess_tests.cpp")
+                ""))
              #t))
          (add-before 'configure 'make-qt-deterministic
            (lambda _
@@ -1442,14 +1472,14 @@ a Qt GUI.")
 (define-public fulcrum
   (package
     (name "fulcrum")
-    (version "1.1.0")
+    (version "1.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://gitlab.com/FloweeTheHub/fulcrum/-/archive/v"
                            version "/fulcrum-v" version ".tar.gz"))
        (sha256
-        (base32 "1xywwgsdhkiblv6la0pfhvn2s9q8vnz6pjg35647rlwzi6ybf0ak"))))
+        (base32 "04w5gw02d39caa8a0l6wkn87kc43zzad2prqsyrcq97vlbkdx6x6"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -1480,14 +1510,14 @@ like Flowee the Hub, which Fulcrum connects to over RPC.")
 (define-public flowee
   (package
     (name "flowee")
-    (version "2020.03.2")
+    (version "2020.03.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://gitlab.com/FloweeTheHub/thehub/-/archive/"
                             version "/thehub-" version ".tar.gz"))
        (sha256
-         (base32 "1m8wfwxljvd2gqpfj1w37xky4isa3h9a7g57cnf3l4r90r4bxj47"))))
+         (base32 "0ksyh7ll3v9p8f5y15vcb2vkrpzb4h0ricag9j90ad4b4rfsnpjw"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags '("-Dbuild_tests=ON" "-Denable_gui=OFF")
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 64d5c17346..f4071f456f 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -33,6 +33,7 @@
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020 John Soo <jsoo1@asu.edu>
 ;;; Copyright © 2020 Raghav Gururajan <raghavgururajan@disroot.org>
+;;; Copyright © 2020 Julien Lepiller <julien@lepiller.eu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1737,3 +1738,35 @@ variation Arial.  Tamil characters are inherently vertically-elliptical.  The
 orthography of Roman glyphs of Meera Inimai are also based on this
 characteristic so that they sit smoothly with the Tamil glyphs.")
     (license license:silofl1.1)))
+
+(define-public font-ipa-mj-mincho
+  (package
+    (name "font-ipa-mj-mincho")
+    (version "006.01")
+    (source (origin
+              (method url-fetch/zipbomb)
+              (uri (string-append "https://mojikiban.ipa.go.jp/OSCDL/IPAmjMincho"
+                                  "/ipamjm" (string-join (string-split version #\.) "")
+                                  ".zip"))
+              (sha256
+               (base32
+                "0s2vs9p7vd7ajnn6c2icli069sjwi4d45a39fczqpwwn507lwj9m"))))
+    (build-system font-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((doc-dir (string-append (assoc-ref outputs "out")
+                                           "/share/doc/font-ipa-mj-mincho")))
+               (mkdir-p doc-dir)
+               (copy-file "Readme.txt" (string-append doc-dir "/README"))
+               (copy-file "IPA_Font_License_Agreement_v1.0.txt"
+                          (string-append doc-dir "/LICENSE"))
+               #t))))))
+    (home-page "https://mojikiban.ipa.go.jp/1300.html")
+    (synopsis "Japanese font from the Information-technology Promotion Agency")
+    (description "MJM Mincho is a font that aims at, for example, allowing you
+to write people's name, or for formal business situations where it is necessary
+to have a detailed and proper character style.")
+    (license license:ipa)))
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index e552ece50b..ab9bd4346f 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -37,6 +37,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages fonts)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
@@ -292,6 +293,12 @@ fonts to/from the WOFF2 format.")
 (define-public fontconfig
   (package
    (name "fontconfig")
+
+   ;; This replacement is not security-related, but works around the fact
+   ;; that gs-fonts are not recognized by newer versions of Pango, causing
+   ;; many applications to fail to find fonts otherwise.
+   (replacement fontconfig/font-dejavu)
+
    (version "2.13.1")
    (source (origin
             (method url-fetch)
@@ -348,6 +355,13 @@ high quality, anti-aliased and subpixel rendered text on a display.")
                        "See COPYING in the distribution."))
    (home-page "https://www.freedesktop.org/wiki/Software/fontconfig")))
 
+(define fontconfig/font-dejavu
+  (package
+    (inherit fontconfig)
+    (inputs
+     ;; XXX: Reuse the name to avoid having to override the configure flags.
+     `(("gs-fonts" ,font-dejavu)))))
+
 (define-public t1lib
   (package
    (name "t1lib")
diff --git a/gnu/packages/fpga.scm b/gnu/packages/fpga.scm
index ed5bc14e31..fda5de60c7 100644
--- a/gnu/packages/fpga.scm
+++ b/gnu/packages/fpga.scm
@@ -340,7 +340,7 @@ FOSS FPGA place and route tool.")
 (define-public gtkwave
   (package
     (name "gtkwave")
-    (version "3.3.103")
+    (version "3.3.104")
     (source
      (origin
        (method url-fetch)
@@ -350,7 +350,7 @@ FOSS FPGA place and route tool.")
                   (string-append "http://gtkwave.sourceforge.net/"
                                  "gtkwave-" version ".tar.gz")))
        (sha256
-        (base32 "1xzaxqbabj4sb4n10yki5acglx3736pwl3kwlq4k7i96rzvsn9f3"))))
+        (base32 "0kw9a33gx60kn069yhx5pyk39x1z3pwaj8l1qqwq943v62lx23fj"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("gperf" ,gperf)
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 26aa4f714b..ac9c2ce864 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -1585,11 +1585,7 @@ games.")
     (build-system scons-build-system)
     (arguments
      `(#:scons ,scons-python2
-       #:scons-flags (list "platform=x11"
-                           ,@(if (string-prefix? "aarch64" (or (%current-target-system)
-                                                               (%current-system)))
-                               `("CCFLAGS=-DNO_THREADS")
-                               '())
+       #:scons-flags (list "platform=x11" "target=release_debug"
                            ;; Avoid using many of the bundled libs.
                            ;; Note: These options can be found in the SConstruct file.
                            "builtin_bullet=no"
@@ -1608,7 +1604,7 @@ games.")
                            "builtin_wslay=no"
                            "builtin_zlib=no"
                            "builtin_zstd=no")
-       #:tests? #f ; There are no tests
+       #:tests? #f                      ; There are no tests
        #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'scons-use-env
@@ -1621,41 +1617,46 @@ games.")
                  "env_base = Environment(tools=custom_tools)\n"
                  "env_base = Environment(ENV=os.environ)")))
              #t))
+         ;; Build headless tools, used for packaging games without depending on X.
+         (add-after 'build 'build-headless
+           (lambda* (#:key scons-flags #:allow-other-keys)
+             (apply invoke "scons"
+                    `(,(string-append "-j" (number->string (parallel-job-count)))
+                      "platform=server" ,@(delete "platform=x11" scons-flags)))))
          (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
+           (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append out "/bin")))
+                    (headless (assoc-ref outputs "headless"))
+                    (zenity (assoc-ref inputs "zenity")))
+               ;; Strip build info from filenames.
                (with-directory-excursion "bin"
-                 (if (file-exists? "godot.x11.tools.64")
-                     (rename-file "godot.x11.tools.64" "godot")
-                     (rename-file "godot.x11.tools.32" "godot"))
-                 (install-file "godot" bin))
-               ;; Tell Godot where to find zenity for OS.alert().
-               (wrap-program (string-append bin "/godot")
-                 `("PATH" ":" prefix
-                   (,(string-append (assoc-ref %build-inputs "zenity") "/bin"))))
-               #t)))
+                 (for-each
+                  (lambda (file)
+                    (let ((dest (car (string-split (basename file) #\.))))
+                      (rename-file file dest)))
+                  (find-files "." "godot.*\\.x11\\.opt\\.tools.*"))
+                 (install-file "godot" (string-append out "/bin"))
+                 (install-file "godot_server" (string-append headless "/bin")))
+               ;; Tell the editor where to find zenity for OS.alert().
+               (wrap-program (string-append out "/bin/godot")
+                 `("PATH" ":" prefix (,(string-append zenity "/bin")))))
+             #t))
          (add-after 'install 'install-godot-desktop
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
-                    (desktop (string-append out "/share/applications"))
-                    (icon-dir (string-append out "/share/pixmaps")))
-               (rename-file "icon.png" "godot.png")
-               (install-file "godot.png" icon-dir)
-               (mkdir-p desktop)
-               (with-output-to-file
-                   (string-append desktop "/godot.desktop")
-                 (lambda _
-                   (format #t
-                           "[Desktop Entry]~@
-                           Name=godot~@
-                           Comment=The godot game engine~@
-                           Exec=~a/bin/godot~@
-                           TryExec=~@*~a/bin/godot~@
-                           Icon=godot~@
-                           Type=Application~%"
-                           out)))
-               #t))))))
+                    (applications (string-append out "/share/applications"))
+                    (icons (string-append out "/share/icons/hicolor")))
+               (mkdir-p applications)
+               (copy-file "misc/dist/linux/org.godotengine.Godot.desktop"
+                          (string-append applications "/godot.desktop"))
+               (for-each (lambda (icon dest)
+                           (mkdir-p (dirname dest))
+                           (copy-file icon dest))
+                         '("icon.png" "icon.svg")
+                         `(,(string-append icons "/256x256/apps/godot.png")
+                           ,(string-append icons "/scalable/apps/godot.svg"))))
+             #t)))))
+    (outputs '("out" "headless"))
     (native-inputs `(("pkg-config" ,pkg-config)))
     (inputs `(("alsa-lib" ,alsa-lib)
               ("bullet" ,bullet)
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 63977f9c47..111e1e0579 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -978,7 +978,7 @@ automata.  The following features are available:
 (define-public julius
   (package
     (name "julius")
-    (version "1.3.0")
+    (version "1.4.0")
     (source
      (origin
        (method git-fetch)
@@ -987,10 +987,18 @@ automata.  The following features are available:
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1ws5lmwdhla73676fj0w26v859n47s0wyxa0mgd0dmkx0x91qriy"))))
+        (base32 "01rygr592ar530qv1flmaiq8icl0qdxgc8lhkcdyn1g09941z47v"))
+       ;; Remove unused bundled libraries.
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           (with-directory-excursion "ext"
+             (for-each delete-file-recursively '("dirent" "png" "SDL2" "zlib")))
+           #t))))
     (build-system cmake-build-system)
     (inputs
-     `(("sdl2" ,sdl2)
+     `(("libpng" ,libpng)
+       ("sdl2" ,sdl2)
        ("sdl2-mixer" ,sdl2-mixer)))
     (home-page "https://github.com/bvschaik/julius")
     (synopsis "Re-implementation of Caesar III game engine")
@@ -1000,7 +1008,6 @@ Julius includes some UI enhancements while preserving the logic (including
 bugs) of the original game, so that saved games are compatible.  This package
 does not include game data.")
     (license (list license:agpl3
-                   license:expat        ; ext/dirent
                    license:zlib))))     ; ext/tinyfiledialogs
 
 (define-public meandmyshadow
@@ -1726,6 +1733,83 @@ can be explored and changed freely.")
                    license:gpl3+
                    license:silofl1.1))))
 
+(define-public superstarfighter
+  (package
+    (name "superstarfighter")
+    (version "0.6.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/notapixelstudio/superstarfighter.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1fly63yf5ls1xwm15if4lxwy67wi84k4gvjllljpykrl18vw2y0y"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                      ;there are no tests
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda _
+             (chdir "godot")
+             (setenv "HOME" (getcwd))
+             (with-output-to-file "export_presets.cfg"
+               (lambda ()
+                 (display
+                  "[preset.0]
+name=\"Guix\"
+platform=\"Linux/X11\"
+runnable=true
+[preset.0.options]")))
+             #t))
+         (replace 'build
+           (lambda _
+             (let ((godot (assoc-ref %build-inputs "godot-headless")))
+               (invoke (string-append godot "/bin/godot_server")
+                       "--export-pack" "Guix"
+                       "superstarfighter.pck" "project.godot"))
+             #t))
+         (replace 'install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin"))
+                    (share (string-append out "/share"))
+                    (data (string-append share "/superstarfighter"))
+                    (icons (string-append share "/icons/hicolor/256x256/apps")))
+               (install-file "superstarfighter.pck" data)
+               (mkdir-p bin)
+               (call-with-output-file (string-append bin "/superstarfighter")
+                 (lambda (port)
+                   (format port
+                           "#!/bin/sh~@
+                            exec ~a/bin/godot --main-pack ~a/superstarfighter.pck~%"
+                           (assoc-ref inputs "godot")
+                           data)
+                   (chmod port #o755)))
+               (mkdir-p icons)
+               (copy-file "icon.png" (string-append icons "/" ,name ".png"))
+               (make-desktop-entry-file
+                (string-append share "/applications/" ,name ".desktop")
+                #:name "SuperStarfighter"
+                #:comment "Fast-paced arcade combat game"
+                #:exec ,name
+                #:icon ,name
+                #:categories '("Game" "ArcadeGame")))
+             #t)))))
+    (native-inputs
+     `(("godot-headless" ,godot "headless")))
+    (inputs
+     `(("godot" ,godot)))
+    (home-page "https://notapixel.itch.io/superstarfighter")
+    (synopsis "Fast-paced local multiplayer arcade game")
+    (description "In SuperStarfighter, up to four local players compete in a
+2D arena with fast-moving ships and missiles.  Different game types are
+available, as well as a single-player mode with AI-controlled ships.")
+    (license (list license:expat         ; game
+                   license:silofl1.1)))) ; fonts
+
 (define-public xshogi
   (package
     (name "xshogi")
@@ -3328,7 +3412,7 @@ Transport Tycoon Deluxe.")
 (define-public openrct2
   (package
     (name "openrct2")
-    (version "0.2.4")
+    (version "0.2.6")
     (source
      (origin
        (method git-fetch)
@@ -3337,7 +3421,7 @@ Transport Tycoon Deluxe.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1rlw3w20llg36sj3bk50g661qw766ng8ma3p42sdkj8br9dw800h"))))
+        (base32 "1vikbkg3wh5ngzdfilb6irbh6nqinf138qpdz8wz9izlvl8s36k4"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags (list "-DDOWNLOAD_OBJECTS=OFF"
@@ -4132,7 +4216,7 @@ with the \"Stamp\" tool within Tux Paint.")
 (define-public supertux
   (package
    (name "supertux")
-   (version "0.6.1.1")
+   (version "0.6.2")
    (source (origin
             (method url-fetch)
             (uri (string-append "https://github.com/SuperTux/supertux/"
@@ -4141,7 +4225,7 @@ with the \"Stamp\" tool within Tux Paint.")
             (file-name (string-append name "-" version ".tar.gz"))
             (sha256
              (base32
-              "0n36qxwjlkdlksximz4s729az6pry2sdjavwgm7m65vfgdiz139f"))
+              "167m3z4m8n76dvbv42m1fnvabpbpsxvr28zk9641916jl9pfba96"))
             (patches
              (search-patches "supertux-unbundle-squirrel.patch"))))
    (arguments
@@ -6752,7 +6836,7 @@ when packaged in Blorb container files or optionally from individual files.")
 (define-public libmanette
   (package
     (name "libmanette")
-    (version "0.2.3")
+    (version "0.2.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/libmanette/"
@@ -6760,7 +6844,7 @@ when packaged in Blorb container files or optionally from individual files.")
                                   "libmanette-" version ".tar.xz"))
               (sha256
                (base32
-                "1zxh7jn2zg7hivmal5zxam6fxvjsd1w6hlw0m2kysk76b8anbw60"))))
+                "1xrc6rh73v5w3kbkflzv1yg8sbxk4wf06hfk95raxhxlssza9q2g"))))
     (build-system meson-build-system)
     (native-inputs
      `(("glib" ,glib "bin")             ; for glib-compile-resources
diff --git a/gnu/packages/geo.scm b/gnu/packages/geo.scm
index 3c76b01c63..dc40974381 100644
--- a/gnu/packages/geo.scm
+++ b/gnu/packages/geo.scm
@@ -1151,7 +1151,8 @@ persisted.
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((dir (string-append (assoc-ref outputs "out") "/share/java/")))
                (mkdir-p dir)
-               (copy-file "JMapViewer.jar" (string-append dir "JMapViewer.jar"))))))))
+               (copy-file "JMapViewer.jar" (string-append dir "JMapViewer.jar"))
+               #t))))))
     (home-page "https://wiki.openstreetmap.org/wiki/JMapViewer")
     (synopsis "OSM map integration in Java")
     (description "JMapViewer is a Java component which easily
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index de9e6090df..3d94ddb23f 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -775,7 +775,7 @@ and visualizations.")
 (define-public gl2ps
   (package
     (name "gl2ps")
-    (version "1.4.0")
+    (version "1.4.2")
     (source
      (origin
        (method url-fetch)
@@ -783,15 +783,14 @@ and visualizations.")
              "http://geuz.org/gl2ps/src/gl2ps-"
              version ".tgz"))
        (sha256
-        (base32
-         "1qpidkz8x3bxqf69hlhyz1m0jmfi9kq24fxsp7rq6wfqzinmxjq3"))))
+        (base32 "1sgzv547h7hrskb9qd0x5yp45kmhvibjwj2mfswv95lg070h074d"))))
     (build-system cmake-build-system)
     (inputs
      `(("libpng" ,libpng)
        ("mesa" ,mesa)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f))  ;; no tests
+     `(#:tests? #f))                    ; no tests
     (home-page "http://www.geuz.org/gl2ps/")
     (synopsis "OpenGL to PostScript printing library")
     (description "GL2PS is a C library providing high quality vector
diff --git a/gnu/packages/gnome-xyz.scm b/gnu/packages/gnome-xyz.scm
index 673b8cf1d7..83e37f97b0 100644
--- a/gnu/packages/gnome-xyz.scm
+++ b/gnu/packages/gnome-xyz.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2019 Leo Prikler <leo.prikler@student.tugraz.at>
+;;; Copyright © 2019, 2020 Leo Prikler <leo.prikler@student.tugraz.at>
 ;;; Copyright © 2019 Alexandros Theodotou <alex@zrythm.org>
 ;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2020 Alex Griffin <a@ajgrf.com>
@@ -46,18 +46,18 @@
 (define-public matcha-theme
   (package
     (name "matcha-theme")
-    (version "2019-11-02")
+    (version "2020-05-09")
     (source
       (origin
         (method git-fetch)
         (uri
           (git-reference
-            (url "https://github.com/vinceliuice/matcha")
+            (url "https://github.com/vinceliuice/Matcha-gtk-theme")
             (commit version)))
         (file-name (git-file-name name version))
         (sha256
           (base32
-            "0wci9ahap8kynq8cbyxr7aba9ndb1d4kiq42xvzr34vw1rhcahrr"))))
+            "0fp3ijynyvncy2byjjyba573p81x2pl2hdzv17mg40r8d5mjlkww"))))
     (build-system trivial-build-system)
     (arguments
      '(#:modules ((guix build utils))
@@ -73,9 +73,9 @@
                    (string-append coreutils "/bin:"
                                   (string-append bash "/bin:")))
            (copy-recursively source (getcwd))
-           (patch-shebang "Install")
+           (patch-shebang "install.sh")
            (mkdir-p themesdir)
-           (invoke "./Install" "-d" themesdir)
+           (invoke "./install.sh" "-d" themesdir)
            #t))))
     (inputs
      `(("gtk-engines" ,gtk-engines)))
@@ -92,7 +92,7 @@ like Gnome, Unity, Budgie, Pantheon, XFCE, Mate and others.")
 (define-public delft-icon-theme
   (package
     (name "delft-icon-theme")
-    (version "1.11")
+    (version "1.12")
     (source
      (origin
        (method git-fetch)
@@ -101,7 +101,7 @@ like Gnome, Unity, Budgie, Pantheon, XFCE, Mate and others.")
              (commit (string-append "v" version))))
        (sha256
         (base32
-         "1m3r4i4m3y3xsjb5f4bik0ylmi64amkfyr0y8pjbvv6gyj492mi6"))
+         "1r6b6jf793jxz15ljniwbqy3vcvsl2712qiigfrfrm46fdxlshjd"))
        (file-name (git-file-name name version))))
     (build-system copy-build-system)
     (arguments
@@ -239,7 +239,7 @@ easier to keep track of apps running in the backround.")
 (define-public gnome-shell-extension-dash-to-dock
   (package
     (name "gnome-shell-extension-dash-to-dock")
-    (version "66")
+    (version "67")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -248,7 +248,7 @@ easier to keep track of apps running in the backround.")
                                            version))))
               (sha256
                (base32
-                "04krl6rxlp1qc97psraf2kwin7h0mx4c7pnfpi7vhplmvasrwkfh"))
+                "1746xm0iyvyzj6m3pvjx11smh9w1s7naz426ki0dlr5l7jh3mpy5"))
               (file-name (git-file-name name version))))
     (build-system gnu-build-system)
     (arguments
@@ -554,8 +554,8 @@ dark elements.  It supports GNOME, Unity, Xfce, and Openbox.")
 
 (define-public papirus-icon-theme
   (let ((version "0.0.0") ;; The package does not use semver
-        (revision "0")
-        (tag "20191201"))
+        (revision "1")
+        (tag "20200430"))
     (package
       (name "papirus-icon-theme")
       (version (git-version version revision tag))
@@ -567,7 +567,7 @@ dark elements.  It supports GNOME, Unity, Xfce, and Openbox.")
                (commit tag)))
          (sha256
           (base32
-           "0lnz1kmz28xh1f4slbsx7ycji5hgszyiyprbf5w5fbjhvi5gzw1h"))
+           "19dfiifc7cjwy0nb1hgzryzaijszsyix303xsgk5xbmhpwrv92hq"))
          (file-name (git-file-name name version))))
       (build-system gnu-build-system)
     (arguments
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index e4bb056e4c..938efbcdf3 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -50,6 +50,7 @@
 ;;; Copyright © 2020 raingloom <raingloom@riseup.net>
 ;;; Copyright © 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2020 Naga Malleswari <nagamalli@riseup.net>
+;;; Copyright © 2020 Ryan Prior <rprior@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -3228,7 +3229,7 @@ libraries written in C.")
 (define-public vte
   (package
     (name "vte")
-    (version "0.58.3")
+    (version "0.60.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/vte/"
@@ -3236,11 +3237,15 @@ libraries written in C.")
                                   "vte-" version ".tar.xz"))
               (sha256
                (base32
-                "0xa9ipwic4jnhhbzlnqbhssz10xkzv61cpkl1ammc6mdq95bbp12"))))
+                "19ccbw0yca78h5qcnm8claj4fg1pj68nj1fsjqqfpzhj7w72i81m"))))
     (build-system meson-build-system)
+    (arguments
+     `(#:configure-flags
+       '("-Dvapi=true"
+         "-D_systemd=false")))
     (native-inputs
      `(("pkg-config" ,pkg-config)
-       ("intltool" ,intltool)
+       ("gettext" ,gettext-minimal)
        ("vala" ,vala)
        ("gobject-introspection" ,gobject-introspection)
        ("glib" ,glib "bin")             ; for glib-genmarshal, etc.
@@ -4435,7 +4440,7 @@ throughout GNOME for API documentation).")
 (define-public cogl
   (package
     (name "cogl")
-    (version "1.22.4")
+    (version "1.22.6")
     (source
      (origin
        (method url-fetch)
@@ -4443,14 +4448,14 @@ throughout GNOME for API documentation).")
                            (version-major+minor version) "/"
                            "cogl-" version ".tar.xz"))
        (sha256
-        (base32 "1q0drs82a8f6glg1v29bb6g2nf15fw0rvdx3d0rgcgfarfaby5sj"))))
+        (base32 "0x8v4n61q89qy27v824bqswpz6bmn801403w2q3pa1lcwk9ln4vd"))))
     ;; NOTE: mutter exports a bundled fork of cogl, so when making changes to
     ;; cogl, corresponding changes may be appropriate in mutter as well.
     (build-system gnu-build-system)
     (native-inputs
      `(("glib:bin" ,glib "bin")     ; for glib-mkenums
        ("gobject-introspection" ,gobject-introspection)
-       ;;("xorg-server" ,xorg-server) ; for the test suite
+       ("xorg-server" ,xorg-server-for-tests)
        ("pkg-config" ,pkg-config)))
     (propagated-inputs
      `(("glib" ,glib)
@@ -4469,7 +4474,8 @@ throughout GNOME for API documentation).")
        ("gst-plugins-base" ,gst-plugins-base)
        ("wayland" ,wayland)))
     (arguments
-     `(#:configure-flags (list "--enable-cogl-gst"
+     `(#:disallowed-references (,xorg-server-for-tests)
+       #:configure-flags (list "--enable-cogl-gst"
                                "--enable-wayland-egl-platform"
                                "--enable-wayland-egl-server"
 
@@ -4478,19 +4484,18 @@ throughout GNOME for API documentation).")
                                (string-append "--with-gl-libname="
                                               (assoc-ref %build-inputs "mesa")
                                               "/lib/libGL.so"))
-       ;; XXX FIXME: All tests fail, with many warnings printed like this:
-       ;;   _FontTransOpen: Unable to Parse address
-       ;;   ${prefix}/share/fonts/X11/misc/
-       #:tests? #f
-       #; #:phases
-       #;
+       #:phases
        (modify-phases %standard-phases
          (add-before 'check 'start-xorg-server
-                     (lambda* (#:key inputs #:allow-other-keys)
-                       ;; The test suite requires a running X server.
-                       (system (format #f "~a/bin/Xvfb :1 &"
-                                       (assoc-ref inputs "xorg-server")))
-                       (setenv "DISPLAY" ":1")
+                     (lambda* (#:key tests? inputs #:allow-other-keys)
+                       (if tests?
+                           (begin
+                             ;; The test suite requires a running X server.
+                             (system (format #f "~a/bin/Xvfb :1 +extension GLX &"
+                                             (assoc-ref inputs "xorg-server")))
+                             (setenv "DISPLAY" ":1")
+                             #t)
+                           (format #t "test suite not run~%"))
                        #t)))))
     (home-page "https://www.cogl3d.org")
     (synopsis "Object oriented GL/GLES Abstraction/Utility Layer")
@@ -5691,7 +5696,7 @@ metadata in photo and video files of various formats.")
 (define-public shotwell
   (package
     (name "shotwell")
-    (version "0.30.8")
+    (version "0.30.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/shotwell/"
@@ -5699,7 +5704,7 @@ metadata in photo and video files of various formats.")
                                   "shotwell-" version ".tar.xz"))
               (sha256
                (base32
-                "1f7m007g6w1sz8s60w6x81ghp2rrjmik8phd958b2hy8zz92wbbj"))))
+                "1y556yyzfya0310v5wqjkf17hy5lhf028iminvvgi2pdfva344id"))))
     (build-system meson-build-system)
     (arguments
      '(#:glib-or-gtk? #t
@@ -9198,7 +9203,7 @@ mp3, Ogg Vorbis and FLAC")
 (define-public soundconverter
   (package
     (name "soundconverter")
-    (version "3.0.1")
+    (version "3.0.2")
     (source
      (origin
        (method url-fetch)
@@ -9207,10 +9212,7 @@ mp3, Ogg Vorbis and FLAC")
                            "soundconverter-" version ".tar.xz"))
 
        (sha256
-        (base32 "1d6x1yf8psqbd9zbybxivfqg55khcnngp2mn92l161dfdk9512c5"))
-       (patches
-        (search-patches
-         "soundconverter-remove-gconf-dependency.patch"))))
+        (base32 "1jv8m82hi23ilrgdznlc1jhp2jm8bw1yrw0chh3qw2l0sixvkl11"))))
     (build-system glib-or-gtk-build-system)
     (arguments
      `(#:imported-modules ((guix build python-build-system)
diff --git a/gnu/packages/gnustep.scm b/gnu/packages/gnustep.scm
index ce68fc77ed..7a8a39eee3 100644
--- a/gnu/packages/gnustep.scm
+++ b/gnu/packages/gnustep.scm
@@ -158,7 +158,7 @@ interface.  It is fast, feature rich, easy to configure, and easy to use.")
 (define-public wmbattery
   (package
     (name "wmbattery")
-    (version "2.51")
+    (version "2.54")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -166,7 +166,7 @@ interface.  It is fast, feature rich, easy to configure, and easy to use.")
                     version ".orig.tar.gz"))
               (sha256
                (base32
-                "084a3irxbmgms4bqaga80mlx9wgvlkx6d2w0ns939yrpfzg87laj"))))
+                "1r4n58mwkm69y1pjs7l64hg8r1lpndrzyrfl2rdgd4zi6v0jhyyw"))))
     (build-system gnu-build-system)
     (arguments '(#:tests? #f)) ; no "check" target
     (inputs
@@ -176,9 +176,7 @@ interface.  It is fast, feature rich, easy to configure, and easy to use.")
        ("libxpm" ,libxpm)
        ("upower" ,upower)))
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("pkg-config" ,pkg-config)))
+     `(("pkg-config" ,pkg-config)))
     (home-page "https://www.dockapps.net/wmbattery")
     (synopsis "Display laptop battery info")
     (description
diff --git a/gnu/packages/graphviz.scm b/gnu/packages/graphviz.scm
index 1a1c2a0da9..815a35a974 100644
--- a/gnu/packages/graphviz.scm
+++ b/gnu/packages/graphviz.scm
@@ -316,8 +316,8 @@ structure and layout algorithms.")
     (synopsis "Interactive viewer for graphviz dot files")
     (description "Xdot is an interactive viewer for graphs written in
 @code{graphviz}’s dot language.  Internally, it uses the xdot output format as
-an intermediate format,and @code{gtk} and @code{cairo} for rendering.  Xdot can
-be used either as a standalone application, or as a python library.")
+an intermediate format, and @code{gtk} and @code{cairo} for rendering.  Xdot
+can be used either as a standalone application, or as a Python library.")
     (license license:lgpl3+)))
 
 (define-public python-pydot
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index a0387cf7bf..350eb8445b 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -318,14 +318,14 @@ functions which were removed.")
 (define-public ganv
   (package
     (name "ganv")
-    (version "1.4.2")
+    (version "1.6.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.drobilla.net/ganv-"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "0g7s5mp14qgbfjdql0k1s8464r21g47ssn5dws6jazsnw6njhl0l"))))
+                "0pik2d3995z0rjcjhb4hsj5fsph3m8khg6j10k6mx4j2j727aq6l"))))
     (build-system waf-build-system)
     (arguments
      `(#:phases
@@ -337,7 +337,6 @@ functions which were removed.")
                      (string-append "-Wl,-rpath="
                                     (assoc-ref outputs "out") "/lib"))
              #t)))
-       #:python ,python-2 ;XXX: The bundled waf fails with Python 3.7.0.
        #:tests? #f)) ; no check target
     (inputs
      `(("gtk" ,gtk+-2)
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index d7f52b08f4..674b1f922b 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -1353,16 +1353,16 @@ PostgreSQL.")
 (define-public guile-config
   (package
     (name "guile-config")
-    (version "0.3.1")
+    (version "0.4.1")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://gitlab.com/a-sassmannshausen/guile-config")
-             (commit (string-append "v" version))))
+             (commit version)))
        (file-name (git-file-name name version))
        (sha256 (base32
-                "0gglsqwpw77gvrqcny8irpqfl7qdf2v8n9ggwrswanxalj4vcbvf"))))
+                "1c59ch96d5p4c7si8qp55fdc15375klf2hyh29y3ap8ahqx9pxqj"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("autoconf" ,autoconf)
@@ -1397,16 +1397,16 @@ above command-line parameters.")
 (define-public guile-hall
   (package
     (name "guile-hall")
-    (version "0.2.1")
+    (version "0.3.1")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://gitlab.com/a-sassmannshausen/guile-hall")
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256 (base32
-                "0dwx5iyg0dmdf64wq0b4w306bapr86jwnw35npgbjq4cqm8qbzqn"))))
+             (commit version)))
+       (file-name "guile-hall-0.3.1-checkout")
+       (sha256
+        (base32 "1s24nigdra6rvclvy15l2aw00c3aq9vv8qwxylzs60darbl36206"))))
     (build-system gnu-build-system)
     (arguments
       `(#:modules
@@ -2375,67 +2375,69 @@ The picture values can directly be displayed in Geiser.")
                       guile-picture-language))
 
 (define-public guile-studio
-  (package
-    (name "guile-studio")
-    (version "0.0.2")
-    (source (origin
-              (method git-fetch)
-              (uri (git-reference
-                    (url "https://git.elephly.net/software/guile-studio.git")
-                    (commit version)))
-              (file-name (git-file-name name version))
-              (sha256
-               (base32
-                "10ls4ra148hd9ra7sin4kh9vv0am5pwk48p7dsjhrlg2l1hsh4hi"))))
-    (build-system gnu-build-system)
-    (arguments
-     `(#:modules
-       ((ice-9 match)
-        (srfi srfi-1)
-        ,@%gnu-build-system-modules)
-       #:tests? #f                    ; there are none
-       #:make-flags
-       (list (string-append "ICONS_DIR="
-                            (assoc-ref %build-inputs "adwaita-icon-theme")
-                            "/share/icons/Adwaita/")
-             (string-append "PICT_DIR="
-                            (assoc-ref %build-inputs "guile-picture-language"))
-             (string-append "EMACS_DIR="
-                            (assoc-ref %build-inputs "emacs"))
-             (string-append "GUILE_DIR="
-                            (assoc-ref %build-inputs "guile"))
-             (string-join (cons "INPUTS="
-                                (filter-map
-                                 (lambda (input)
-                                   (match input
-                                     ((label . pkg)
-                                      (and (string-prefix? "emacs" label) pkg))))
-                                 %build-inputs)))
-             (string-append "PREFIX=" (assoc-ref %outputs "out")))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (delete 'install))))
-    (inputs
-     `(("guile" ,guile-2.2)
-       ("guile-picture-language" ,guile-picture-language)
-       ("emacs" ,emacs)
-       ("emacs-geiser" ,emacs-geiser)
-       ("emacs-company" ,emacs-company)
-       ("emacs-flycheck" ,emacs-flycheck)
-       ("emacs-smart-mode-line" ,emacs-smart-mode-line)
-       ("emacs-paren-face" ,emacs-paren-face)
-       ("adwaita-icon-theme" ,adwaita-icon-theme)))
-    (native-inputs
-     `(("texinfo" ,texinfo)))
-    (home-page "https://gnu.org/software/guile")
-    (synopsis "IDE for Guile")
-    (description
-     "This is Emacs with a few settings that make working with Guile easier
+  (let ((commit "d24d59a68e3f1fa9477e3430fc48a2efe97b805d")
+        (revision "1"))
+    (package
+      (name "guile-studio")
+      (version (git-version "0.0.2" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://git.elephly.net/software/guile-studio.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0kqi0q8a7si65n21b7gn8vbninwcg0fqy5hmvy3l1bi6iync20zr"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:modules
+         ((ice-9 match)
+          (srfi srfi-1)
+          ,@%gnu-build-system-modules)
+         #:tests? #f                    ; there are none
+         #:make-flags
+         (list (string-append "ICONS_DIR="
+                              (assoc-ref %build-inputs "adwaita-icon-theme")
+                              "/share/icons/Adwaita/")
+               (string-append "PICT_DIR="
+                              (assoc-ref %build-inputs "guile-picture-language"))
+               (string-append "EMACS_DIR="
+                              (assoc-ref %build-inputs "emacs"))
+               (string-append "GUILE_DIR="
+                              (assoc-ref %build-inputs "guile"))
+               (string-join (cons "INPUTS="
+                                  (filter-map
+                                   (lambda (input)
+                                     (match input
+                                       ((label . pkg)
+                                        (and (string-prefix? "emacs" label) pkg))))
+                                   %build-inputs)))
+               (string-append "PREFIX=" (assoc-ref %outputs "out")))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (delete 'install))))
+      (inputs
+       `(("guile" ,guile-3.0)
+         ("guile-picture-language" ,guile-picture-language)
+         ("emacs" ,emacs)
+         ("emacs-geiser" ,emacs-geiser)
+         ("emacs-company" ,emacs-company)
+         ("emacs-flycheck" ,emacs-flycheck)
+         ("emacs-smart-mode-line" ,emacs-smart-mode-line)
+         ("emacs-paren-face" ,emacs-paren-face)
+         ("adwaita-icon-theme" ,adwaita-icon-theme)))
+      (native-inputs
+       `(("texinfo" ,texinfo)))
+      (home-page "https://gnu.org/software/guile")
+      (synopsis "IDE for Guile")
+      (description
+       "This is Emacs with a few settings that make working with Guile easier
 for people new to Emacs.  Features include: CUA mode, Geiser, tool bar icons
 to evaluate Guile buffers, support for Guile's very own picture language, code
 completion, a simple mode line, etc.")
-    (license license:gpl3+)))
+      (license license:gpl3+))))
 
 (define-public guile-stis-parser
   (let ((commit "6e85d37ffc333b722f4413a6c648263701eb75bd")
diff --git a/gnu/packages/jami.scm b/gnu/packages/jami.scm
index 84f1d92d34..d5cb3b62f6 100644
--- a/gnu/packages/jami.scm
+++ b/gnu/packages/jami.scm
@@ -59,7 +59,8 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix packages)
-  #:use-module (guix utils))
+  #:use-module (guix utils)
+  #:use-module (srfi srfi-1))
 
 (define %jami-version "20200401.1.6f090de")
 
@@ -186,6 +187,257 @@
                 "selftest: pjlib-test pjlib-util-test pjmedia-test"))
              #t)))))))
 
+;; The following variables are configure flags used by ffmpeg-jami.  They're
+;; from the ring-project/daemon/contrib/src/ffmpeg/rules.mak file. We try to
+;; keep it as close to the official Jami package as possible, to provide all
+;; the codecs and extra features that are expected.
+;;
+;; See:
+;; https://review.jami.net/plugins/gitiles/ring-daemon/+/refs/heads/master/contrib/src/ffmpeg/rules.mak
+
+(define %ffmpeg-default-configure-flags
+  '("--disable-everything"
+    "--enable-zlib"
+    "--enable-gpl"
+    "--enable-swscale"
+    "--enable-bsfs"
+    "--disable-filters"
+    "--disable-programs"
+    "--disable-postproc"
+    "--disable-protocols"
+    "--enable-protocol=crypto"
+    "--enable-protocol=file"
+    "--enable-protocol=rtp"
+    "--enable-protocol=srtp"
+    "--enable-protocol=tcp"
+    "--enable-protocol=udp"
+    "--enable-protocol=unix"
+    "--enable-protocol=pipe"
+
+    ;; enable muxers/demuxers
+    "--disable-demuxers"
+    "--disable-muxers"
+    "--enable-muxer=rtp"
+    "--enable-muxer=g722"
+    "--enable-muxer=h263"
+    "--enable-muxer=h264"
+    "--enable-muxer=hevc"
+    "--enable-muxer=webm"
+    "--enable-muxer=ogg"
+    "--enable-muxer=pcm_s16be"
+    "--enable-muxer=pcm_s16le"
+    "--enable-demuxer=rtp"
+    "--enable-demuxer=mjpeg"
+    "--enable-demuxer=mjpeg_2000"
+    "--enable-demuxer=mpegvideo"
+    "--enable-demuxer=gif"
+    "--enable-demuxer=image_jpeg_pipe"
+    "--enable-demuxer=image_png_pipe"
+    "--enable-demuxer=image_webp_pipe"
+    "--enable-demuxer=matroska"
+    "--enable-demuxer=m4v"
+    "--enable-demuxer=mp3"
+    "--enable-demuxer=ogg"
+    "--enable-demuxer=flac"
+    "--enable-demuxer=wav"
+    "--enable-demuxer=ac3"
+    "--enable-demuxer=g722"
+    "--enable-demuxer=pcm_mulaw"
+    "--enable-demuxer=pcm_alaw"
+    "--enable-demuxer=pcm_s16be"
+    "--enable-demuxer=pcm_s16le"
+    "--enable-demuxer=h263"
+    "--enable-demuxer=h264"
+    "--enable-demuxer=hevc"
+
+    ;; enable parsers
+    "--enable-parser=h263"
+    "--enable-parser=h264"
+    "--enable-parser=hevc"
+    "--enable-parser=mpeg4video"
+    "--enable-parser=vp8"
+    "--enable-parser=vp9"
+    "--enable-parser=opus"
+
+    ;; encoders/decoders
+    "--enable-encoder=adpcm_g722"
+    "--enable-decoder=adpcm_g722"
+    "--enable-encoder=rawvideo"
+    "--enable-decoder=rawvideo"
+    "--enable-encoder=libx264"
+    "--enable-decoder=h264"
+    "--enable-encoder=pcm_alaw"
+    "--enable-decoder=pcm_alaw"
+    "--enable-encoder=pcm_mulaw"
+    "--enable-decoder=pcm_mulaw"
+    "--enable-encoder=mpeg4"
+    "--enable-decoder=mpeg4"
+    "--enable-encoder=libvpx_vp8"
+    "--enable-decoder=vp8"
+    "--enable-decoder=vp9"
+    "--enable-encoder=h263"
+    "--enable-encoder=h263p"
+    "--enable-decoder=h263"
+    "--enable-encoder=mjpeg"
+    "--enable-decoder=mjpeg"
+    "--enable-decoder=mjpegb"
+    "--enable-libspeex"
+    "--enable-libopus"
+    "--enable-libvpx"
+    "--enable-libx264"
+    "--enable-encoder=libspeex"
+    "--enable-decoder=libspeex"
+    "--enable-encoder=libopus"
+    "--enable-decoder=libopus"
+
+    ;; decoders for ringtones and audio streaming
+    "--enable-decoder=flac"
+    "--enable-decoder=vorbis"
+    "--enable-decoder=aac"
+    "--enable-decoder=ac3"
+    "--enable-decoder=eac3"
+    "--enable-decoder=mp3"
+    "--enable-decoder=pcm_u24be"
+    "--enable-decoder=pcm_u24le"
+    "--enable-decoder=pcm_u32be"
+    "--enable-decoder=pcm_u32le"
+    "--enable-decoder=pcm_u8"
+    "--enable-decoder=pcm_f16le"
+    "--enable-decoder=pcm_f24le"
+    "--enable-decoder=pcm_f32be"
+    "--enable-decoder=pcm_f32le"
+    "--enable-decoder=pcm_f64be"
+    "--enable-decoder=pcm_f64le"
+    "--enable-decoder=pcm_s16be"
+    "--enable-decoder=pcm_s16be_planar"
+    "--enable-decoder=pcm_s16le"
+    "--enable-decoder=pcm_s16le_planar"
+    "--enable-decoder=pcm_s24be"
+    "--enable-decoder=pcm_s24le"
+    "--enable-decoder=pcm_s24le_planar"
+    "--enable-decoder=pcm_s32be"
+    "--enable-decoder=pcm_s32le"
+    "--enable-decoder=pcm_s32le_planar"
+    "--enable-decoder=pcm_s64be"
+    "--enable-decoder=pcm_s64le"
+    "--enable-decoder=pcm_s8"
+    "--enable-decoder=pcm_s8_planar"
+    "--enable-decoder=pcm_u16be"
+    "--enable-decoder=pcm_u16le"
+
+    ;; encoders/decoders for images
+    "--enable-encoder=gif"
+    "--enable-decoder=gif"
+    "--enable-encoder=jpegls"
+    "--enable-decoder=jpegls"
+    "--enable-encoder=ljpeg"
+    "--enable-decoder=jpeg2000"
+    "--enable-encoder=png"
+    "--enable-decoder=png"
+    "--enable-encoder=bmp"
+    "--enable-decoder=bmp"
+    "--enable-encoder=tiff"
+    "--enable-decoder=tiff"
+
+    ;; filters
+    "--enable-filter=scale"
+    "--enable-filter=overlay"
+    "--enable-filter=amix"
+    "--enable-filter=amerge"
+    "--enable-filter=aresample"
+    "--enable-filter=format"
+    "--enable-filter=aformat"
+    "--enable-filter=fps"
+    "--enable-filter=transpose"
+    "--enable-filter=pad"))
+
+(define %ffmpeg-linux-configure-flags
+  '("--enable-pic"
+    "--extra-cxxflags=-fPIC"
+    "--extra-cflags=-fPIC"
+    "--target-os=linux"
+    "--enable-indev=v4l2"
+    "--enable-indev=xcbgrab"
+    "--enable-vdpau"
+    "--enable-hwaccel=h264_vdpau"
+    "--enable-hwaccel=mpeg4_vdpau"
+    "--enable-vaapi"
+    "--enable-hwaccel=h264_vaapi"
+    "--enable-hwaccel=mpeg4_vaapi"
+    "--enable-hwaccel=h263_vaapi"
+    "--enable-hwaccel=vp8_vaapi"
+    "--enable-hwaccel=mjpeg_vaapi"
+    "--enable-hwaccel=hevc_vaapi"
+    "--enable-encoder=h264_vaapi"
+    "--enable-encoder=vp8_vaapi"
+    "--enable-encoder=mjpeg_vaapi"
+    "--enable-encoder=hevc_vaapi"))
+
+;; ffnvcodec is not supported on ARM then we enable it here for i386 and
+;; x86_64 architectures.
+(define %ffmpeg-linux-x86-configure-flags
+  '("--arch=x86"
+    "--enable-cuvid"
+    "--enable-ffnvcodec"
+    "--enable-nvdec"
+    "--enable-nvenc"
+    "--enable-hwaccel=h264_nvdec"
+    "--enable-hwaccel=hevc_nvdec"
+    "--enable-hwaccel=vp8_nvdec"
+    "--enable-hwaccel=mjpeg_nvdec"
+    "--enable-encoder=h264_nvenc"
+    "--enable-encoder=hevc_nvenc"))
+
+;; This procedure composes the configure flags list for ffmpeg-jami.
+(define (ffmpeg-compose-configure-flags)
+  (define (system=? s)
+    (string-prefix? s (%current-system)))
+
+  `(,@%ffmpeg-default-configure-flags
+    ,@(if (string-contains (%current-system) "linux")
+          (if (or (system=? "i686")
+                  (system=? "x86_64"))
+              (append %ffmpeg-linux-configure-flags
+                      %ffmpeg-linux-x86-configure-flags)
+              %ffmpeg-linux-configure-flags)
+          '())))
+
+(define-public ffmpeg-jami
+  (package
+    (inherit ffmpeg)
+    (name "ffmpeg-jami")
+    (native-inputs
+     `(("sfl-patches" ,(jami-source))
+       ("libiconv" ,libiconv)
+       ,@(package-native-inputs ffmpeg)))
+    (supported-systems '("x86_64-linux" "i686-linux"
+                         "aarch64-linux" "armhf-linux"))
+    (arguments
+     (append
+      '(#:tests? #f)
+      (substitute-keyword-arguments (package-arguments ffmpeg)
+        ((#:configure-flags '())
+         (ffmpeg-compose-configure-flags))
+        ((#:phases phases)
+         `(modify-phases ,phases
+            (add-after 'unpack 'make-git-checkout-writable
+              (lambda _
+                (for-each make-file-writable (find-files "."))
+                #t))
+            (add-after 'unpack 'apply-patches
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let ((jami-apply-dependency-patches
+                       ,jami-apply-dependency-patches))
+                  ;; These patches come from:
+                  ;; "ring-project/daemon/contrib/src/ffmpeg/rules.mak".
+                  (jami-apply-dependency-patches #:inputs inputs
+                                                 #:dep-name "ffmpeg"
+                                                 #:patches
+                                                 '("remove-mjpeg-log"
+                                                   "change-RTCP-ratio"
+                                                   "rtp_ext_abs_send_time"))
+                  #t))))))))))
+
 (define-public libring
   (package
     (name "libring")
@@ -197,7 +449,7 @@
        ("boost" ,boost)
        ("dbus-c++" ,dbus-c++)
        ("eudev" ,eudev)
-       ("ffmpeg" ,ffmpeg)
+       ("ffmpeg" ,ffmpeg-jami)
        ("flac" ,flac)
        ("gmp" ,gmp)
        ("gsm" ,gsm)
diff --git a/gnu/packages/java-compression.scm b/gnu/packages/java-compression.scm
index 536e1e6530..b1d3ae7060 100644
--- a/gnu/packages/java-compression.scm
+++ b/gnu/packages/java-compression.scm
@@ -282,9 +282,9 @@ It can be used as a replacement for the Apache @code{CBZip2InputStream} /
 @code{CBZip2OutputStream} classes.")
     (license license:expat)))
 
-(define-public java-tukaani-xz
+(define-public java-xz
   (package
-    (name "java-tukaani-xz")
+    (name "java-xz")
     (version "1.6")
     (source (origin
               (method url-fetch)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index e2f79c3dc5..a4659240fc 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016, 2017 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2017, 2019 Carlo Zancanaro <carlo@zancanaro.id.au>
@@ -1808,14 +1808,14 @@ new Date();"))
               (modules '((guix build utils)))
               (snippet
                 `(begin
-                   (for-each delete-file (find-files "." ".*.bin$"))
-                   (for-each delete-file (find-files "." ".*.exe$"))
-                   (for-each delete-file (find-files "." ".*.jar$"))
+                   (for-each delete-file
+                             (find-files "." ".*.(bin|exe|jar)$"))
                    #t))))
     (build-system gnu-build-system)
     (outputs '("out" "jdk" "doc"))
     (arguments
      `(#:tests? #f; require jtreg
+       #:make-flags '("all")
        #:imported-modules
        ((guix build syscalls)
         ,@%gnu-build-system-modules)
@@ -1840,14 +1840,20 @@ new Date();"))
                      "--with-libjpeg=system"
                      (string-append "--prefix=" (assoc-ref outputs "out")))
              #t))
-         (replace 'build
+         (add-before 'build 'write-source-revision-file
            (lambda _
              (with-output-to-file ".src-rev"
                (lambda _
                  (display ,version)))
-             (setenv "GUIX_LD_WRAPPER_ALLOW_IMPURITIES" "yes")
-             (invoke "make" "all")
              #t))
+         (replace 'build
+           (lambda* (#:key make-flags parallel-build? #:allow-other-keys)
+             (apply invoke "make"
+                    `(,@(if parallel-build?
+                            (list (string-append "JOBS="
+                                                 (number->string (parallel-job-count))))
+                            '())
+                      ,@make-flags))))
          ;; Some of the libraries in the lib/ folder link to libjvm.so.
          ;; But that shared object is located in the server/ folder, so it
          ;; cannot be found.  This phase creates a symbolic link in the
@@ -1920,8 +1926,7 @@ new Date();"))
     (native-inputs
      `(("icedtea-8" ,icedtea-8)
        ("icedtea-8:jdk" ,icedtea-8 "jdk")
-       ;; XXX: The build system is not particularly parallel safe and
-       ;; fails with newer versions of GNU Make.
+       ;; XXX: The build system fails with newer versions of GNU Make.
        ("make@4.2" ,gnu-make-4.2)
        ("unzip" ,unzip)
        ("which" ,which)
@@ -1949,9 +1954,7 @@ new Date();"))
               (modules '((guix build utils)))
               (snippet
                 `(begin
-                   (for-each delete-file (find-files "." ".*.bin$"))
-                   (for-each delete-file (find-files "." ".*.exe$"))
-                   (for-each delete-file (find-files "." ".*.jar$"))
+                   (for-each delete-file (find-files "." ".*.(bin|exe|jar)$"))
                    #t))))
     (arguments
       (substitute-keyword-arguments (package-arguments openjdk9)
@@ -1998,9 +2001,7 @@ new Date();"))
               (modules '((guix build utils)))
               (snippet
                 `(begin
-                   (for-each delete-file (find-files "." ".*.bin$"))
-                   (for-each delete-file (find-files "." ".*.exe$"))
-                   (for-each delete-file (find-files "." ".*.jar$"))
+                   (for-each delete-file (find-files "." ".*.(bin|exe|jar)$"))
                    #t))))
     (build-system gnu-build-system)
     (outputs '("out" "jdk" "doc"))
@@ -2012,11 +2013,6 @@ new Date();"))
         ,@%gnu-build-system-modules)
        #:tests? #f; requires jtreg
        ;; TODO package jtreg
-       ;; disable parallel builds, as the openjdk build system does not like -j
-       #:parallel-build? #f
-       #:parallel-tests? #f
-       ;; reenable parallel builds and tests by adding the flags manually
-       #:make-flags (list (string-append "JOBS=" (number->string (parallel-job-count))))
        #:configure-flags
        `("--disable-option-checking" ; --enable-fast-install default flag errors otherwise
          "--disable-warnings-as-errors"
@@ -2033,7 +2029,6 @@ new Date();"))
                          (assoc-ref %build-inputs "freetype") "/include")
          ,(string-append "--with-freetype-lib="
                          (assoc-ref %build-inputs "freetype") "/lib"))
-       ;; TODO
        #:phases
        (modify-phases %standard-phases
          (add-after 'patch-source-shebangs 'fix-java-shebangs
@@ -2043,22 +2038,32 @@ new Date();"))
              (substitute* "make/data/blacklistedcertsconverter/blacklisted.certs.pem"
                (("^#!.*") "#! java BlacklistedCertsConverter SHA-256\n"))
              #t))
-         (replace 'build
+         (add-before 'build 'write-source-revision-file
            (lambda _
              (with-output-to-file ".src-rev"
                (lambda _
                  (display ,version)))
-             (setenv "GUIX_LD_WRAPPER_ALLOW_IMPURITIES" "yes")
-             (invoke "make" "all")
              #t))
+         (replace 'build
+           (lambda* (#:key parallel-build? make-flags #:allow-other-keys)
+             (apply invoke "make" "all"
+                    `(,@(if parallel-build?
+                            (list (string-append "JOBS="
+                                                 (number->string (parallel-job-count))))
+                            '())
+                      ,@make-flags))))
          ;; jdk 11 does not build jre by default any more
          ;; building it anyways
          ;; for further information see:
          ;; https://github.com/AdoptOpenJDK/openjdk-build/issues/356
          (add-after 'build 'build-jre
-           (lambda _
-             (invoke "make" "legacy-jre-image")
-             #t))
+           (lambda* (#:key parallel-build? make-flags #:allow-other-keys)
+             (apply invoke "make" "legacy-jre-image"
+                    `(,@(if parallel-build?
+                            (list (string-append "JOBS="
+                                                 (number->string (parallel-job-count))))
+                            '())
+                      ,@make-flags))))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out"))
@@ -2226,9 +2231,7 @@ new Date();"))
               (modules '((guix build utils)))
               (snippet
                `(begin
-                  (for-each delete-file (find-files "." ".*.bin$"))
-                  (for-each delete-file (find-files "." ".*.exe$"))
-                  (for-each delete-file (find-files "." ".*.jar$"))
+                  (for-each delete-file (find-files "." ".*.(bin|exe|jar)$"))
                   #t))))
     (inputs
      `(("alsa-lib" ,alsa-lib)
@@ -2256,6 +2259,94 @@ new Date();"))
        ("zip" ,zip)))
     (home-page "https://openjdk.java.net/projects/jdk/12")))
 
+(define-public openjdk13
+  (package
+    (inherit openjdk12)
+    (name "openjdk")
+    (version "13.0")
+    (source (origin
+	     (method url-fetch)
+	     (uri "http://hg.openjdk.java.net/jdk/jdk13/archive/9c250a7600e1.tar.bz2")
+	     (file-name (string-append name "-" version ".tar.bz2"))
+	     (sha256
+	      (base32
+	       "0v0ljvx5dyzp96dw4z4ksw3pvasil7783mgnmd1wk9gads5ab8iq"))
+	     (modules '((guix build utils)))
+	     (snippet
+	      `(begin
+		 (for-each delete-file (find-files "." ".*.(bin|exe|jar)$"))
+		 #t))))
+    (inputs
+     `(("alsa-lib" ,alsa-lib)
+       ("cups" ,cups)
+       ("fontconfig" ,fontconfig)
+       ("freetype" ,freetype)
+       ("giflib" ,giflib)
+       ("lcms" ,lcms)
+       ("libjpeg" ,libjpeg-turbo)
+       ("libpng" ,libpng)
+       ("libx11" ,libx11)
+       ("libxext" ,libxext)
+       ("libxrandr" ,libxrandr)
+       ("libxrender" ,libxrender)
+       ("libxt" ,libxt)
+       ("libxtst" ,libxtst)))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("openjdk12:jdk" ,openjdk12 "jdk")
+       ("make@4.2" ,gnu-make-4.2)
+       ("pkg-config" ,pkg-config)
+       ("unzip" ,unzip)
+       ("which" ,which)
+       ("zip" ,zip)))
+    (home-page "https://openjdk.java.net/projects/jdk/13")))
+
+(define-public openjdk14
+  (package
+    (inherit openjdk13)
+    (name "openjdk")
+    (version "14.0")
+    (source (origin
+	      (method url-fetch)
+	      (uri "http://hg.openjdk.java.net/jdk/jdk14/archive/bc54620a3848.tar.bz2")
+	      (file-name (string-append name "-" version ".tar.bz2"))
+	      (sha256
+	       (base32
+	        "0z485pk7r1xpw8004g4nrwrzj17sabgx8yfdbxwfvzkjp8qyajch"))
+	      (modules '((guix build utils)))
+	      (snippet
+	       `(begin
+                  ;; The m4 macro uses 'help' to search for builtins, which is
+                  ;; not available in bash-minimal
+                  (substitute* "make/autoconf/basics.m4"
+                    (("if help") "if command -v"))
+		  (for-each delete-file (find-files "." ".*.(bin|exe|jar)$"))
+		  #t))))
+    (inputs
+     `(("alsa-lib" ,alsa-lib)
+       ("cups" ,cups)
+       ("fontconfig" ,fontconfig)
+       ("freetype" ,freetype)
+       ("giflib" ,giflib)
+       ("lcms" ,lcms)
+       ("libjpeg" ,libjpeg-turbo)
+       ("libpng" ,libpng)
+       ("libx11" ,libx11)
+       ("libxext" ,libxext)
+       ("libxrandr" ,libxrandr)
+       ("libxrender" ,libxrender)
+       ("libxt" ,libxt)
+       ("libxtst" ,libxtst)))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("make@4.2" ,gnu-make-4.2)
+       ("openjdk13:jdk" ,openjdk13 "jdk")
+       ("pkg-config" ,pkg-config)
+       ("unzip" ,unzip)
+       ("which" ,which)
+       ("zip" ,zip)))
+    (home-page "https://openjdk.java.net/projects/jdk/14")))
+
 (define-public icedtea icedtea-8)
 
 
@@ -3312,34 +3403,6 @@ is implemented.")
               license:mpl2.0
               license:lgpl2.1+))))
 
-(define-public java-xz
-  (package
-   (name "java-xz")
-   (version "1.6")
-   (source (origin
-     (method url-fetch)
-     (uri (string-append "http://tukaani.org/xz/xz-java-" version ".zip"))
-     (sha256
-      (base32
-       "1z3p1ri1gvl07inxn0agx44ck8n7wrzfmvkz8nbq3njn8r9wba8x"))))
-   (build-system ant-build-system)
-   (arguments
-    `(#:tests? #f ; There are no tests to run.
-      #:jar-name ,(string-append "xz-" version  ".jar")
-      #:phases
-      (modify-phases %standard-phases
-        ;; The unpack phase enters the "maven" directory by accident.
-        (add-after 'unpack 'chdir
-          (lambda _ (chdir "..") #t)))))
-   (native-inputs
-    `(("unzip" ,unzip)))
-   (home-page "https://tukaani.org/xz/java.html")
-   (synopsis "Implementation of XZ data compression in pure Java")
-   (description "This library aims to be a complete implementation of XZ data
-compression in pure Java.  Single-threaded streamed compression and
-decompression and random access decompression have been fully implemented.")
-   (license license:public-domain)))
-
 ;; java-hamcrest-core uses qdox version 1.12.  We package this version instead
 ;; of the latest release.
 (define-public java-qdox-1.12
@@ -3866,7 +3929,7 @@ reusing it in maven.")
        ("junit" ,java-junit)
        ("classworld" ,java-plexus-classworlds)
        ("xbean" ,java-geronimo-xbean-reflect)
-       ("xz" ,java-tukaani-xz)
+       ("xz" ,java-xz)
        ("guava" ,java-guava)))
     (home-page "https://github.com/codehaus-plexus/plexus-archiver")
     (synopsis "Archiver component of the Plexus project")
@@ -11852,3 +11915,28 @@ involving one or more shared resources having ACID (Atomicity, Consistency,
 Isolation and Durability) properties.")
     ;; either gpl2 only with classpath exception or cddl.
     (license (list license:gpl2 license:cddl1.0))))
+
+(define-public java-picocli
+  (package
+    (name "java-picocli")
+    (version "4.3.2")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/remkop/picocli")
+                     (commit (string-append "v" version))))
+              (sha256
+               (base32
+                "1sxp6rxjfgjd98ly14b3d15dvxkm5wg4g46w12jyhmr0kmkaca3c"))))
+    (build-system ant-build-system)
+    (arguments
+     `(#:jar-name "picocli.jar"
+       #:source-dir "src/main/java"
+       ;; Tests require missing dependencies (junitparams, system-rules)
+       #:tests? #f))
+    (home-page "https://picocli.info")
+    (synopsis "REPL for the JVM")
+    (description "Picocli is a framework for building command line applications
+for the JVM.  It supports colors, autocompletion, subcommands, and more.  Written
+in Java, usable from Groovy, Kotlin, Scala, etc.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/julia.scm b/gnu/packages/julia.scm
index c636fa756b..8db5e66131 100644
--- a/gnu/packages/julia.scm
+++ b/gnu/packages/julia.scm
@@ -416,7 +416,7 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
                         (assoc-ref %build-inputs "utf8proc")
                         "/include")
          "USE_SYSTEM_LLVM=1"
-         "LLVM_VER=6.0.1"
+         "LLVM_VER=8.0.0"
 
          "USE_LLVM_SHLIB=1"
          "USE_SYSTEM_LIBUNWIND=1"
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index bf1ccef3e3..c52feb5725 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -329,14 +329,14 @@ for some KDevelop language plugins (Ruby, PHP, CSS...).")
 (define-public kdiagram
   (package
     (name "kdiagram")
-    (version "2.6.1")
+    (version "2.7.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://kde/stable/kdiagram/" version
                            "/kdiagram-" version ".tar.xz"))
        (sha256
-        (base32 "1c6dbp9gssjrx59z8yxzq1ay56pnw7h28symjrv0gcvhxyjirrxx"))
+        (base32 "1pgvf2q8b59hw0jg5ajmj5nrn4q8cgnifpvdd0fynk2ml6zym8k3"))
        (patches (search-patches
                  "kdiagram-Fix-missing-link-libraries.patch"))))
     (build-system qt-build-system)
@@ -360,7 +360,7 @@ illustrate project schedules.")
 (define-public krita
   (package
     (name "krita")
-    (version "4.2.7.1")
+    (version "4.2.9")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -368,14 +368,14 @@ illustrate project schedules.")
                     "/krita-" version ".tar.gz"))
               (sha256
                (base32
-                "0gcwq1w09gmx53i2fir73l222p41299wagvhbvsxwrz0v3crzliy"))))
+                "1a3djmjhnvlp8dpiz68s0lwg71nv3ypq592jfgsnm5zlxa0vp1cz"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f
        #:configure-flags
        (list "-DBUILD_TESTING=OFF"
              (string-append "-DCMAKE_CXX_FLAGS=-I"
-                            (assoc-ref %build-inputs "ilmbase")
+                            (assoc-ref %build-inputs "openexr")
                             "/include/OpenEXR"))
        #:phases
        (modify-phases %standard-phases
@@ -449,14 +449,14 @@ features include brush stabilizers, brush engines and wrap-around mode.")
 (define-public libkomparediff2
   (package
     (name "libkomparediff2")
-    (version "19.08.2")
+    (version "19.08.3")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "mirror://kde/stable/applications/" version
                             "/src/libkomparediff2-" version ".tar.xz"))
         (sha256
-         (base32 "1mvihd0xpkl8kryf5dvsfgpbgs9af8c9bzq8mmr74gfsvfb8ywy5"))))
+         (base32 "0p8j24d0lzylv5crdzak87016ppgph5hiyxkvapda1m8zlb5dfm1"))))
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
        ("pkg-config" ,pkg-config)))
@@ -481,7 +481,7 @@ used in KDE development tools Kompare and KDevelop.")
 (define-public qca
   (package
     (name "qca")
-    (version "2.2.1")
+    (version "2.3.0")
     (source
       (origin
         (method url-fetch)
@@ -489,7 +489,7 @@ used in KDE development tools Kompare and KDevelop.")
                             "/qca-" version ".tar.xz"))
         (sha256
          (base32
-          "00kv1vsrc8fp556hm8s6yw3240vx3l4067q6vfxrb3gdwgcd45np"))))
+          "1mrj748yz1grgzmfbmffgjkpcqiaj1l3m4pbddwcj7dnl50yys0x"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -507,7 +507,7 @@ cards.")
 (define-public kpmcore
   (package
     (name "kpmcore")
-    (version "4.0.1")
+    (version "4.1.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -516,9 +516,7 @@ cards.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1sslkwcj2cyrn7bpjdjdwikp1q8wrsxpsg2sxxd8hsairgy7ygh3"))
-              (patches (search-patches "kpmcore-fix-tests.patch"
-                                       "kpmcore-remove-broken-test.patch"))))
+                "0jsig7algmab9h0fb09my0axjqzw83zgscamhzl8931lribs6idm"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
@@ -578,7 +576,8 @@ different notification systems.")
           "02lr3xx5s2mgddac4n3lkgr7ppf1z5m6ajs90rjix0vs8a271kp5"))))
     (build-system qt-build-system)
     (arguments
-     `(#:configure-flags '("-DBUILD_TESTING=ON")
+     `(#:configure-flags '("-DBUILD_TESTING=ON"
+                           "-DLIBEXEC_INSTALL_DIR=libexec")
        #:tests? #f)) ; tests fail hard in our build environment
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
@@ -621,7 +620,7 @@ communicate with each other.  Here's a few things KDE Connect can do:
 (define-public kqtquickcharts
   (package
     (name "kqtquickcharts")
-    (version "19.08.2")
+    (version "19.08.3")
     (source
       (origin
         (method url-fetch)
@@ -629,7 +628,7 @@ communicate with each other.  Here's a few things KDE Connect can do:
                             version "/src/kqtquickcharts-" version ".tar.xz"))
         (sha256
          (base32
-          "1yy9fyd8y4g25ljdsbil19qdf4j3mzmzl489sx7rqpm3lfdzjh9k"))))
+          "0kwrqm7aa74plqkkyigi6b2hic6dzrygkgb6hsgj35ycrfn4rigi"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)))
@@ -646,14 +645,14 @@ charts.")
 (define-public kcachegrind
   (package
     (name "kcachegrind")
-    (version "19.04.1")
+    (version "19.08.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kde/stable/applications/" version
                                   "/src/kcachegrind-" version ".tar.xz"))
               (sha256
                (base32
-                "1hhsk64yp6q2xh8j269j4wp9y24ggmii861r6gf02mj1mbn2p1jb"))))
+                "0sm3085vd79svfql6nqjyrwlknnmdyyvi0yjnmyb09mq7djf1icg"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
diff --git a/gnu/packages/kerberos.scm b/gnu/packages/kerberos.scm
index 896d15f485..20ed94b33b 100644
--- a/gnu/packages/kerberos.scm
+++ b/gnu/packages/kerberos.scm
@@ -170,7 +170,7 @@ After installation, the system administrator should generate keys using
 (define-public heimdal
   (package
     (name "heimdal")
-    (version "7.5.0")
+    (version "7.7.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -178,14 +178,14 @@ After installation, the system administrator should generate keys using
                     "heimdal-" version "/" "heimdal-" version ".tar.gz"))
               (sha256
                (base32
-                "1bdc682in55ygrxmhncs7cf4s239apcblci3z8i80wnc1w1s18n5"))
+                "06vx3cb01s4lv3lpv0qzbbj97cln1np1wjphkkmmbk1lsqa36bgh"))
               (modules '((guix build utils)))
               (snippet
                '(begin
                   (substitute* "configure"
                     (("User=.*$") "User=Guix\n")
                     (("Host=.*$") "Host=GNU")
-                    (("Date=.*$") "Date=2017\n"))
+                    (("Date=.*$") "Date=2019\n"))
                   #t))))
     (build-system gnu-build-system)
     (arguments
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index b45b3725d4..a5b901449d 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -370,50 +370,50 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
     (sha256 hash)))
 
 
-(define-public linux-libre-5.6-version "5.6.13")
+(define-public linux-libre-5.6-version "5.6.14")
 (define-public linux-libre-5.6-pristine-source
   (let ((version linux-libre-5.6-version)
-        (hash (base32 "11zriz0jwqizv0pq0laql0svsnspdfnxqykq70v22x39iyfdf9gi")))
+        (hash (base32 "18vyxi64i93v4qyky5q62kkasm1da7wmz91xfkx3j7ki84skyxik")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.6)))
 
-(define-public linux-libre-5.4-version "5.4.41")
+(define-public linux-libre-5.4-version "5.4.42")
 (define-public linux-libre-5.4-pristine-source
   (let ((version linux-libre-5.4-version)
-        (hash (base32 "0mxhz3f0ayz0nggndbikp44kx307yxf16qzsv46hni6p8z1ffr0y")))
+        (hash (base32 "0cdwazpzfrrb2y5fp87v9yihy7v8mlbqjzxpzmv7p83609y1nhsf")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.4)))
 
-(define-public linux-libre-4.19-version "4.19.123")
+(define-public linux-libre-4.19-version "4.19.124")
 (define-public linux-libre-4.19-pristine-source
   (let ((version linux-libre-4.19-version)
-        (hash (base32 "0gwrkbbfy85ajxpg7q6j9mn8mzhmsr1v3wmh5c76p34d3b9i96d7")))
+        (hash (base32 "005dznldnj1m03cbkc5pd2q2cv9jj1j6a0x2vh4p79ypg4c01nfm")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.19)))
 
-(define-public linux-libre-4.14-version "4.14.180")
+(define-public linux-libre-4.14-version "4.14.181")
 (define-public linux-libre-4.14-pristine-source
   (let ((version linux-libre-4.14-version)
-        (hash (base32 "03pd4wpg526n391jwc0kbmbxi059mvq8d42a9qbym9mnv5rzjkj4")))
+        (hash (base32 "0kaasqhmg9in7pf4ldk9z4z1cjgv1c9xdr1ca0pznngygibym6xb")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.14)))
 
-(define-public linux-libre-4.9-version "4.9.223")
+(define-public linux-libre-4.9-version "4.9.224")
 (define-public linux-libre-4.9-pristine-source
   (let ((version linux-libre-4.9-version)
-        (hash (base32 "1r9ag1fhy0g429q44qlqh0qkf42qkhzxa04gxlmnrinqypk00lyg")))
+        (hash (base32 "0jf92cx0b3wq9fxa3169wk4wqvy58hglfk6lsynszy8kjplhfvfz")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.9)))
 
-(define-public linux-libre-4.4-version "4.4.223")
+(define-public linux-libre-4.4-version "4.4.224")
 (define-public linux-libre-4.4-pristine-source
   (let ((version linux-libre-4.4-version)
-        (hash (base32 "09fln0sdfif2zv2jifp24yiqi0vcyj8fqx2jz91g21zvsxk3x5nd")))
+        (hash (base32 "1lb8ypn558vk73bj4a20wq40cig9vmzjn2xzzdws78gfair6hxpg")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.4)))
@@ -3550,9 +3550,9 @@ country-specific regulations for the wireless spectrum.")
                (("cat ")
                 (string-append (assoc-ref inputs "coreutils")
                                "/bin/cat "))
-               (("grep ")
+               (("e?grep " match)
                 (string-append (assoc-ref inputs "grep")
-                               "/bin/grep "))
+                               "/bin/" match))
                (("sed -e")
                 (string-append (assoc-ref inputs "sed")
                                "/bin/sed -e"))
@@ -4191,15 +4191,17 @@ arrays when needed.")
 (define-public multipath-tools
   (package
     (name "multipath-tools")
-    (version "0.8.3")
+    (version "0.8.4")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://git.opensvc.com/?p=multipath-tools/"
-                                  ".git;a=snapshot;h=" version ";sf=tgz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://git.opensvc.com/multipath-tools/.git")
+                    (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1c6ay97wlfv1fl0y8hcfpxhkps14hlnw9gzmj7884micsp7pa9yv"))
+                "14n8pcgnliicqxzc40xvjxk4cafm4qx7a3rsx5qva74r3ydzx8rn"))
+              (patches (search-patches "multipath-tools-sans-systemd.patch"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -4212,10 +4214,13 @@ arrays when needed.")
                   #t))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f                      ; no tests
+     '(#:test-target "test"
+       #:parallel-build? #f             ;XXX: broken in 0.8.4
        #:make-flags (list "CC=gcc"
                           (string-append "DESTDIR="
                                          (assoc-ref %outputs "out"))
+                          ;; Install Udev rules below this directory, relative
+                          ;; to the prefix.
                           "SYSTEMDPATH=lib"
                           (string-append "LDFLAGS=-Wl,-rpath="
                                          (assoc-ref %outputs "out")
@@ -4237,11 +4242,31 @@ arrays when needed.")
                  (("/usr/include/libudev.h")
                   (string-append udev "/include/libudev.h")))
                #t)))
+         (add-after 'unpack 'fix-maybe-uninitialized-variable
+           (lambda _
+             ;; This variable gets initialized later if needed, but GCC 7
+             ;; fails to notice.  Should be fixed for > 0.8.4.
+             ;; https://www.redhat.com/archives/dm-devel/2020-March/msg00137.html
+             (substitute* "libmultipath/structs_vec.c"
+               (("bool is_queueing;")
+                "bool is_queueing = false;"))
+             #t))
+         (add-after 'unpack 'fix-linking-tests
+           (lambda _
+             ;; Add missing linker flag for -lmpathcmd.  This should be fixed
+             ;; for versions > 0.8.4.
+             (substitute* "tests/Makefile"
+               (("-lmultipath -lcmocka")
+                "-lmultipath -L$(mpathcmddir) -lmpathcmd -lcmocka"))
+             #t))
          (delete 'configure))))         ; no configure script
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
-       ("valgrind" ,valgrind)))
+       ("valgrind" ,valgrind)
+
+       ;; For tests.
+       ("cmocka" ,cmocka)))
     (inputs
      `(("json-c" ,json-c-0.13)
        ("libaio" ,libaio)
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index 60fb4b0487..b78eec7f4d 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -2876,7 +2876,41 @@ Lisp implementations.")
       (inputs
        `(("iterate" ,sbcl-iterate)
          ("cffi" ,sbcl-cffi)
-         ("trivial-features" ,sbcl-trivial-features)))
+         ("trivial-features" ,sbcl-trivial-features)
+         ("glib" ,glib)
+         ("cairo" ,cairo)
+         ("pango" ,pango)
+         ("gdk-pixbuf" ,gdk-pixbuf)
+         ("gtk" ,gtk+)))
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'fix-paths
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute* "glib/glib.init.lisp"
+                 (("libglib|libgthread" all)
+                  (string-append (assoc-ref inputs "glib") "/lib/" all)))
+               (substitute* "gobject/gobject.init.lisp"
+                 (("libgobject" all)
+                  (string-append (assoc-ref inputs "glib") "/lib/" all)))
+               (substitute* "gio/gio.init.lisp"
+                 (("libgio" all)
+                  (string-append (assoc-ref inputs "glib") "/lib/" all)))
+               (substitute* "cairo/cairo.init.lisp"
+                 (("libcairo" all)
+                  (string-append (assoc-ref inputs "cairo") "/lib/" all)))
+               (substitute* "pango/pango.init.lisp"
+                 (("libpango" all)
+                  (string-append (assoc-ref inputs "pango") "/lib/" all)))
+               (substitute* "gdk-pixbuf/gdk-pixbuf.init.lisp"
+                 (("libgdk_pixbuf" all)
+                  (string-append (assoc-ref inputs "gdk-pixbuf") "/lib/" all)))
+               (substitute* "gdk/gdk.init.lisp"
+                 (("libgdk" all)
+                  (string-append (assoc-ref inputs "gtk") "/lib/" all)))
+               (substitute* "gdk/gdk.package.lisp"
+                 (("libgtk" all)
+                  (string-append (assoc-ref inputs "gtk") "/lib/" all))))))))
       (home-page "https://github.com/Ferada/cl-cffi-gtk/")
       (synopsis "Common Lisp binding for GTK+3")
       (description
@@ -2889,192 +2923,155 @@ is a library for creating graphical user interfaces.")
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-glib")
     (inputs
-     `(("glib" ,glib)
-       ("bordeaux-threads" ,sbcl-bordeaux-threads)
+     `(("bordeaux-threads" ,sbcl-bordeaux-threads)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "glib/cl-cffi-gtk-glib.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "glib/glib.init.lisp"
-               (("libglib|libgthread" all)
-                (string-append (assoc-ref inputs "glib") "/lib/" all))))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "glib/cl-cffi-gtk-glib.asd")))))
 
 (define-public sbcl-cl-cffi-gtk-gobject
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-gobject")
     (inputs
-     `(("glib" ,glib)
-       ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
+     `(("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ("trivial-garbage" ,sbcl-trivial-garbage)
        ("bordeaux-threads" ,sbcl-bordeaux-threads)
        ("closer-mop" ,sbcl-closer-mop)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "gobject/cl-cffi-gtk-gobject.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "gobject/gobject.init.lisp"
-               (("libgobject" all) (string-append
-                                    (assoc-ref inputs "glib") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-gobject")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "gobject/cl-cffi-gtk-gobject.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-gobject")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk-gio
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-gio")
     (inputs
-     `(("glib" ,glib)
-       ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
+     `(("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ("cl-cffi-gtk-gobject" ,sbcl-cl-cffi-gtk-gobject)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "gio/cl-cffi-gtk-gio.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "gio/gio.init.lisp"
-               (("libgio" all)
-                (string-append
-                 (assoc-ref inputs "glib") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-gio")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "gio/cl-cffi-gtk-gio.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-gio")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk-cairo
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-cairo")
     (inputs
-     `(("cairo" ,cairo)
-       ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
+     `(("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "cairo/cl-cffi-gtk-cairo.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "cairo/cairo.init.lisp"
-               (("libcairo" all)
-                (string-append
-                 (assoc-ref inputs "cairo") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-cairo")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "cairo/cl-cffi-gtk-cairo.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-cairo")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk-pango
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-pango")
     (inputs
-     `(("pango" ,pango)
-       ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
+     `(("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ("cl-cffi-gtk-gobject" ,sbcl-cl-cffi-gtk-gobject)
        ("cl-cffi-gtk-cairo" ,sbcl-cl-cffi-gtk-cairo)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "pango/cl-cffi-gtk-pango.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "pango/pango.init.lisp"
-               (("libpango" all)
-                (string-append
-                 (assoc-ref inputs "pango") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-pango")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "pango/cl-cffi-gtk-pango.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-pango")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk-gdk-pixbuf
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-gdk-pixbuf")
     (inputs
-     `(("gdk-pixbuf" ,gdk-pixbuf)
-       ("cl-cffi-gtk-gobject" ,sbcl-cl-cffi-gtk-gobject)
+     `(("cl-cffi-gtk-gobject" ,sbcl-cl-cffi-gtk-gobject)
        ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "gdk-pixbuf/cl-cffi-gtk-gdk-pixbuf.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "gdk-pixbuf/gdk-pixbuf.init.lisp"
-               (("libgdk_pixbuf" all)
-                (string-append
-                 (assoc-ref inputs "gdk-pixbuf") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-gdk-pixbuf")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "gdk-pixbuf/cl-cffi-gtk-gdk-pixbuf.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-gdk-pixbuf")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk-gdk
   (package
     (inherit sbcl-cl-cffi-gtk-boot0)
     (name "sbcl-cl-cffi-gtk-gdk")
     (inputs
-     `(("gtk" ,gtk+)
-       ("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
+     `(("cl-cffi-gtk-glib" ,sbcl-cl-cffi-gtk-glib)
        ("cl-cffi-gtk-gobject" ,sbcl-cl-cffi-gtk-gobject)
        ("cl-cffi-gtk-gio" ,sbcl-cl-cffi-gtk-gio)
        ("cl-cffi-gtk-gdk-pixbuf" ,sbcl-cl-cffi-gtk-gdk-pixbuf)
@@ -3082,32 +3079,23 @@ is a library for creating graphical user interfaces.")
        ("cl-cffi-gtk-pango" ,sbcl-cl-cffi-gtk-pango)
        ,@(package-inputs sbcl-cl-cffi-gtk-boot0)))
     (arguments
-     `(#:asd-file "gdk/cl-cffi-gtk-gdk.asd"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-paths
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "gdk/gdk.init.lisp"
-               (("libgdk" all)
-                (string-append
-                 (assoc-ref inputs "gtk") "/lib/" all)))
-             (substitute* "gdk/gdk.package.lisp"
-               (("libgtk" all)
-                (string-append
-                 (assoc-ref inputs "gtk") "/lib/" all)))))
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk-gdk")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "gdk/cl-cffi-gtk-gdk.asd")
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk-gdk")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public sbcl-cl-cffi-gtk
   (package
@@ -3122,26 +3110,27 @@ is a library for creating graphical user interfaces.")
     (native-inputs
      `(("fiveam" ,sbcl-fiveam)))
     (arguments
-     `(#:asd-file "gtk/cl-cffi-gtk.asd"
-       #:test-asd-file "test/cl-cffi-gtk-test.asd"
+     (substitute-keyword-arguments (package-arguments sbcl-cl-cffi-gtk-boot0)
+       ((#:asd-file _ "") "gtk/cl-cffi-gtk.asd")
+       ((#:test-asd-file _ "") "test/cl-cffi-gtk-test.asd")
        ;; TODO: Tests fail with memory fault.
        ;; See https://github.com/Ferada/cl-cffi-gtk/issues/24.
-       #:tests? #f
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'install 'link-source
-           ;; Since source is particularly heavy (16MiB+), let's reuse it
-           ;; across the different components of cl-ffi-gtk.
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
-                                               "/share/common-lisp/sbcl-source/"
-                                               "cl-cffi-gtk-glib"))
-                   (out-source (string-append (assoc-ref outputs "out")
-                                              "/share/common-lisp/sbcl-source/"
-                                              "cl-cffi-gtk")))
-               (delete-file-recursively out-source)
-               (symlink glib-source out-source)
-               #t))))))))
+       ((#:tests? _ #f) #f)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'install 'link-source
+             ;; Since source is particularly heavy (16MiB+), let's reuse it
+             ;; across the different components of cl-ffi-gtk.
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((glib-source (string-append (assoc-ref inputs "cl-cffi-gtk-glib")
+                                                 "/share/common-lisp/sbcl-source/"
+                                                 "cl-cffi-gtk-glib"))
+                     (out-source (string-append (assoc-ref outputs "out")
+                                                "/share/common-lisp/sbcl-source/"
+                                                "cl-cffi-gtk")))
+                 (delete-file-recursively out-source)
+                 (symlink glib-source out-source)
+                 #t)))))))))
 
 (define-public cl-cffi-gtk
   (sbcl-package->cl-source-package sbcl-cl-cffi-gtk))
@@ -5568,7 +5557,13 @@ and @code{kqueue(2)}), a pathname library and file-system utilities.")
        ((#:asd-system-name _) "iolib")))))
 
 (define-public cl-iolib
-  (sbcl-package->cl-source-package sbcl-iolib))
+  (let ((parent (sbcl-package->cl-source-package sbcl-iolib)))
+    (package
+      (inherit parent)
+      (propagated-inputs
+       ;; Need header to compile.
+       `(("libfixposix" ,libfixposix)
+         ,@(package-propagated-inputs parent))))))
 
 (define-public sbcl-ieee-floats
   (let ((commit "566b51a005e81ff618554b9b2f0b795d3b29398d")
@@ -5867,8 +5862,8 @@ neat APIs and connection-pooling.  It is meant to supersede Drakma.")
        ;; asdf-build-system/source has its own phases and does not inherit
        ;; from asdf-build-system/sbcl phases.
        (modify-phases %standard-phases/source
-         (add-after 'unpack 'fix-permissions
-           (lambda _ (make-file-writable "t/data/test.gz") #t)))))))
+         ;; Already done in SBCL package.
+         (delete 'reset-gzip-timestamps))))))
 
 (define-public ecl-dexador
   (sbcl-package->ecl-package sbcl-dexador))
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index ca1828b1b1..e3fd416dd9 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -718,7 +718,7 @@ security functionality including PGP, S/MIME, SSH, and SSL.")
 (define-public mu
   (package
     (name "mu")
-    (version "1.4.4")
+    (version "1.4.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/djcb/mu/releases/"
@@ -726,7 +726,7 @@ security functionality including PGP, S/MIME, SSH, and SSL.")
                                   "mu-" version ".tar.xz"))
               (sha256
                (base32
-                "0pmx8zh5fsfhkdl0cr7ydcv6cywhxbgavnjrfr5p2ibz9gx3q3vf"))))
+                "15spbplf9p8cdxqfwnv3x67451sfpna9q5n2kgqqwh2y78i7zlhc"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -1372,7 +1372,7 @@ facilities for checking incoming mail.")
 (define-public dovecot
   (package
     (name "dovecot")
-    (version "2.3.10")
+    (version "2.3.10.1")
     (source
      (origin
        (method url-fetch)
@@ -1380,7 +1380,7 @@ facilities for checking incoming mail.")
                            (version-major+minor version) "/"
                            "dovecot-" version ".tar.gz"))
        (sha256
-        (base32 "1ibiz3k2flablkcqbkvfzsjnq5b5kxximhcrplflsjl57mr88ca7"))))
+        (base32 "035idr2j81s5mngnhd58rih79dhwwak7q01mqbx3rcmi4cpychk6"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -2166,14 +2166,14 @@ converts them to maildir format directories.")
 (define-public mpop
   (package
     (name "mpop")
-    (version "1.4.7")
+    (version "1.4.9")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://marlam.de/mpop/releases/"
                            "mpop-" version ".tar.xz"))
        (sha256
-        (base32 "0c6n5afn9pr4p7gxkv462lysrw52w9fhvavzm99c78dcp9dj5xnk"))))
+        (base32 "0hinmyd4lipy9wi3grwm72vv6xrpf4m08i9g9nlxzxnwfanw885q"))))
     (build-system gnu-build-system)
     (inputs
      `(("gnutls" ,gnutls)))
@@ -2298,14 +2298,14 @@ transfer protocols.")
 (define-public opensmtpd
   (package
     (name "opensmtpd")
-    (version "6.6.4p1")
+    (version "6.7.0p1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://www.opensmtpd.org/archives/"
                            "opensmtpd-" version ".tar.gz"))
        (sha256
-        (base32 "1kyph9ycq0j21dl9n1sq5fns9p4gckdi0fmnf8awrcwrdcm9dyg2"))))
+        (base32 "1f8bp40ywyixflg5qbnang6l210bv4vqa1k2pgm2356bp7bmsgy1"))))
     (build-system gnu-build-system)
     (inputs
      `(("bdb" ,bdb)
@@ -2681,7 +2681,7 @@ operators and scripters.")
     ;; Upstream doesn't use git tags, but does ‘tag’ their releases in the
     ;; commit message.  Hence the lack of GIT-VERSIONing despite using a commit
     ;; ID below.  Don't forget to update it…
-    (version "2.21.99999")
+    (version "2.22")
     (source
      (origin
        (method git-fetch)
@@ -2691,10 +2691,10 @@ operators and scripters.")
        ;; http://alpine.freeiz.com/alpine/readme/README.patches
        (uri (git-reference
              (url "http://repo.or.cz/alpine.git")
-             (commit "abeb2c25935ef8c75f1e5deef0f81276754dc975")))
+             (commit "b50297779a4becb9ceca9c6b5b375d526fe3df78")))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0rqgbw08a5lj41dkp82aq480lqkc4bnxagna7wpqffi821n8gkwz"))
+        (base32 "06js44fvdl7l33hfd4lsxpcd1cz3c0h796cswyzz0lkrzx89yl48"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -2703,7 +2703,11 @@ operators and scripters.")
            #t))))
     (build-system gnu-build-system)
     (arguments
-     `(#:make-flags (list "CC=gcc")
+     `(#:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))))
        #:configure-flags (list (string-append "--with-ssl-include-dir="
                                               (assoc-ref %build-inputs "openssl")
                                               "/include/openssl")
@@ -2720,6 +2724,13 @@ operators and scripters.")
                                "--with-date-stamp=Thu  1 Jan 01:00:01 CET 1970")
        #:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'assume-shadow-passwords
+           ;; Alpine's configure script confuses ‘shadow password support’ with
+           ;; ‘/etc/shadow exists in the build environment’.  It does not.
+           (lambda _
+             (substitute* "configure"
+               (("test -f /etc/shadow") "true"))
+             #t))
          (add-after 'unpack 'make-reproducible
            (lambda _
              ;; This removes time-dependent code to make alpine reproducible.
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index d60c033dbc..e62fb38086 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -8,7 +8,7 @@
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015, 2018 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015, 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015 Fabian Harfert <fhmgufs@web.de>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016, 2018, 2020 Kei Kebreau <kkebreau@posteo.net>
@@ -20,7 +20,7 @@
 ;;; Copyright © 2017 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2017 Theodoros Foradis <theodoros@foradis.org>
 ;;; Copyright © 2017, 2019 Arun Isaac <arunisaac@systemreboot.net>
-;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Dave Love <me@fx@gnu.org>
 ;;; Copyright © 2018, 2019 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2018 Joshua Sierles, Nextjournal <joshua@nextjournal.com>
@@ -472,8 +472,9 @@ precision floating point numbers.")
     (arguments
      (let ((system (%current-system)))
        (cond
-        ((string-prefix? "aarch64" system)
-         ;; Some sparse matrix tests are failing on AArch64:
+        ((or (string-prefix? "aarch64" system)
+             (string-prefix? "powerpc" system))
+         ;; Some sparse matrix tests are failing on AArch64 and PowerPC:
          ;; https://lists.gnu.org/archive/html/bug-gsl/2020-04/msg00001.html
          '(#:phases (modify-phases %standard-phases
                       (add-before 'check 'disable-failing-tests
@@ -4366,7 +4367,7 @@ as equations, scalars, vectors, and matrices.")
 (define-public z3
   (package
     (name "z3")
-    (version "4.8.7")
+    (version "4.8.8")
     (home-page "https://github.com/Z3Prover/z3")
     (source (origin
               (method git-fetch)
@@ -4375,7 +4376,7 @@ as equations, scalars, vectors, and matrices.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0hprcdwhhyjigmhhk6514m71bnmvqci9r8gglrqilgx424r6ff7q"))))
+                "1rn538ghqwxq0v8i6578j8mflk6fyv0cp4hjfqynzvinjbps56da"))))
     (build-system gnu-build-system)
     (arguments
      `(#:imported-modules ((guix build python-build-system)
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 0ba166b591..57ff0835d1 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -704,7 +704,7 @@ else [])"))
                           ;; FIXME: Cannot use this expression as it would
                           ;; introduce a circular dependency at the top level.
                           ;; (version-major+minor (package-version python))
-                          "3.7"
+                          "3.8"
 
                           "/site-packages"))))))
     (native-inputs
@@ -1803,16 +1803,16 @@ notifications, and Python scripting support.")
 (define-public libqmatrixclient
   (package
     (name "libqmatrixclient")
-    (version "0.5.2")
+    (version "0.5.3.2")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-              (url "https://github.com/QMatrixClient/libqmatrixclient")
+              (url "https://github.com/quotient-im/libQuotient")
               (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1bhlqfs7251fss4icx794ka614npr6zyrpp4qwc4q5408ykfm7lr"))))
+        (base32 "0gkwr3yw6k2m0j8cc085b5p2q788rf5nhp1p5hc5d55pc7mci2qs"))))
     (build-system cmake-build-system)
     (inputs
      `(("qtbase" ,qtbase)
@@ -1955,16 +1955,16 @@ There is support for:
 (define-public quaternion
   (package
     (name "quaternion")
-    (version "0.0.9.4c")
+    (version "0.0.9.4e")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-              (url "https://github.com/QMatrixClient/Quaternion")
+              (url "https://github.com/quotient-im/Quaternion")
               (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0gpv6b3nn3lsyym8809kiqkpdszfasldqjpk5s542zyn41gdlql4"))))
+        (base32 "0hqhg7l6wpkdbzrdjvrbqymmahziri07ba0hvbii7dd2p0h248fv"))))
     (build-system qt-build-system)
     (inputs
      `(("libqmatrixclient" ,libqmatrixclient)
diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm
index 755fa5d482..543345d9e0 100644
--- a/gnu/packages/mpd.scm
+++ b/gnu/packages/mpd.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2016, 2018, 2019, 2020 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Evan Straw <evan.straw99@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -183,7 +183,7 @@ player daemon.")
 (define-public ncmpc
   (package
     (name "ncmpc")
-    (version "0.37")
+    (version "0.38")
     (source (origin
               (method url-fetch)
               (uri
@@ -192,7 +192,7 @@ player daemon.")
                               "/ncmpc-" version ".tar.xz"))
               (sha256
                (base32
-                "0p31jpv1vj01bqf1589mnfpv9618cfsv259rlnbqybg1yqkvg3kw"))))
+                "18i73q33xq89abrxjd3hhl05gjniv6ms76ndjlc168ydm8wamh9b"))))
     (build-system meson-build-system)
     (arguments
      `(#:configure-flags
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 9a55f0db3a..3d8a3d4321 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -1436,7 +1436,7 @@ users to select LV2 plugins and run them with jalv.")
 (define-public synthv1
   (package
     (name "synthv1")
-    (version "0.9.13")
+    (version "0.9.14")
     (source (origin
               (method url-fetch)
               (uri
@@ -1444,7 +1444,7 @@ users to select LV2 plugins and run them with jalv.")
                               "/synthv1-" version ".tar.gz"))
               (sha256
                (base32
-                "0bb48myvgvqcibwm68qhd4852pjr2g19rasf059a799d1hzgfq3l"))))
+                "08n83krkak20924flb9azhm9hn40lyfvn29m63zs3lw3wajf0b40"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f))                    ; there are no tests
@@ -1468,7 +1468,7 @@ oscillators and stereo effects.")
 (define-public drumkv1
   (package
     (name "drumkv1")
-    (version "0.9.13")
+    (version "0.9.14")
     (source (origin
               (method url-fetch)
               (uri
@@ -1476,7 +1476,7 @@ oscillators and stereo effects.")
                               "/drumkv1-" version ".tar.gz"))
               (sha256
                (base32
-                "1h88sakxs0b20k8v2sh14y05fin1zqmhnid6h9mk9c37ixxg58ia"))))
+                "0fr7pkp55zvjxf7p22drs93fsjgvqhbd55vxi0srhp2s2wzz5qak"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f))                    ; there are no tests
@@ -1501,7 +1501,7 @@ effects.")
 (define-public samplv1
   (package
     (name "samplv1")
-    (version "0.9.13")
+    (version "0.9.14")
     (source (origin
               (method url-fetch)
               (uri
@@ -1509,7 +1509,7 @@ effects.")
                               "/samplv1-" version ".tar.gz"))
               (sha256
                (base32
-                "0clsp6s5qfnh0xaxbd35vq2ppi72q9dfayrzlgl73800a8p7gh9m"))))
+                "0p3f9wsn1nz93szcl60yxhxdr554zm2z2jlbniwwify765lvasxc"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f))                    ; there are no tests
@@ -1534,7 +1534,7 @@ effects.")
 (define-public padthv1
   (package
     (name "padthv1")
-    (version "0.9.13")
+    (version "0.9.14")
     (source (origin
               (method url-fetch)
               (uri
@@ -1542,7 +1542,7 @@ effects.")
                               "/padthv1-" version ".tar.gz"))
               (sha256
                (base32
-                "1c1zllph86qswcxddz4vpsj6r9w21hbv4gkba0pyd3q7pbfqr7nz"))))
+                "079iwwlkl1gscyv70v9ambad8shxbs0ixdfp0vsl6dbh87b09qzh"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f))                    ; there are no tests
@@ -1755,7 +1755,7 @@ is subjective.")
 (define-public tuxguitar
   (package
     (name "tuxguitar")
-    (version "1.5.3")
+    (version "1.5.4")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1763,7 +1763,7 @@ is subjective.")
                     version "/tuxguitar-" version "-src.tar.gz"))
               (sha256
                (base32
-                "1qy5kjcsl3c86kdlyvsf6dsfmfl1mv8zg0ln6g3qg3i8f35vlpp6"))))
+                "0fjhf56lhlhm84v08917xp4yw8y6d0qajm4qiy1gfp8dm74whwwg"))))
     (build-system ant-build-system)
     (arguments
      `(#:build-target "build"
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index 7ae1240e15..4a2df4fd5a 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015, 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2018, 2020 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015, 2016, 2017 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2016 Raimon Grau <raimonster@gmail.com>
@@ -87,12 +87,14 @@
   #:use-module (gnu packages dejagnu)
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages flex)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages image)
+  #:use-module (gnu packages libevent)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages lua)
@@ -140,7 +142,6 @@
     (build-system glib-or-gtk-build-system)
     (arguments
      `(#:configure-flags (list "--enable-polkit"
-                               "--disable-appindicator" ; Not available
                                "--without-systemdsystemunitdir" ; Not required
                                "--without-systemduserunitdir")  ; Not required
        #:phases
@@ -232,6 +233,7 @@
        ("pycairo" ,python-pycairo)
        ("pygobject" ,python-pygobject)
        ("python" ,python-wrapper)
+       ("libappindicator" ,libappindicator)
        ("libnm" ,network-manager)))
     (synopsis "GTK+ Bluetooth manager")
     (description "Blueman is a Bluetooth management utility using the Bluez
@@ -587,15 +589,19 @@ receiving NDP messages.")
 (define-public ethtool
   (package
     (name "ethtool")
-    (version "5.4")
+    (version "5.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/software/network/"
                                   "ethtool/ethtool-" version ".tar.xz"))
               (sha256
                (base32
-                "0srbqp4a3x9ryrbm5q854375y04ni8j0bmsrl89nmsyn4x4ixy12"))))
+                "159r0hwax0qs5diayw2glxshqxrigk0v67hgmbq56ldddm91n3ya"))))
     (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("libmnl" ,libmnl)))
     (home-page "https://www.kernel.org/pub/software/network/ethtool/")
     (synopsis "Display or change Ethernet device settings")
     (description
@@ -1949,14 +1955,14 @@ returns the user name and other information about the connection.")
 (define-public spiped
   (package
     (name "spiped")
-    (version "1.6.0")
+    (version "1.6.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.tarsnap.com/spiped/spiped-"
                                   version ".tgz"))
               (sha256
                (base32
-                "1r51rdcl7nib1yv3yvgd5alwlkkwmr387brqavaklb0p2bwzixz6"))))
+                "04rpnc53whfky7pp2m9h35gwzwn6788pnl6c1qd576mpknbqjw4d"))))
     (build-system gnu-build-system)
     (arguments
      '(#:test-target "test"
@@ -3132,3 +3138,50 @@ thousands of connections is clearly realistic with today's hardware.")
     (license (list license:gpl2+
                    license:lgpl2.1
                    license:lgpl2.1+))))
+
+(define-public lldpd
+  (package
+    (name "lldpd")
+    (version "1.0.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://media.luffy.cx/files/lldpd/lldpd-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "16fbqrs3l976gdslx647nds8x7sz4h5h3h4l4yxzrayvyh9b5lrd"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; Drop bundled library.
+           (delete-file-recursively "libevent")
+           #t))))
+    (arguments
+     `(#:configure-flags
+       (list
+        "--with-privsep-user=nobody"
+        "--with-privsep-group=nogroup"
+        "--localstatedir=/var"
+        "--enable-pie"
+        "--without-embedded-libevent"
+        (string-append "--with-systemdsystemunitdir="
+                       (assoc-ref %outputs "out")
+                       "/lib/systemd/system"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("libevent" ,libevent)
+       ("libxml2" ,libxml2)
+       ("openssl" ,openssl)
+       ("readline" ,readline)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://vincentbernat.github.io/lldpd/")
+    (synopsis "Locate neighbors of your network equipment")
+    (description
+     "The @dfn{Link Layer Discovery Protocol} (LLDP) is an industry standard
+protocol designed to supplant proprietary Link-Layer protocols such as EDP or
+CDP.  The goal of LLDP is to provide an inter-vendor compatible mechanism to
+deliver Link-Layer notifications to adjacent network devices.  @code{lldpd} is
+an implementation of LLDP.  It also supports some proprietary protocols.")
+    (license license:isc)))
diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 525854676f..877e841b20 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -582,14 +582,14 @@ concrete syntax of the language (Quotations, Syntax Extensions).")
 (define-public hevea
   (package
     (name "hevea")
-    (version "2.33")
+    (version "2.34")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://hevea.inria.fr/old/"
                                   "hevea-" version ".tar.gz"))
               (sha256
                (base32
-                "0115bn6n6hhb08rmj0m508wjcsn1mggiagqly6s941pq811wxymb"))))
+                "1pzyszxw90klpcmhjqrjfc8cw6c0gm4w2blim8ydyxb6rq6qml1s"))))
     (build-system gnu-build-system)
     (inputs
      `(("ocaml" ,ocaml)))
@@ -2192,14 +2192,14 @@ without a complete in-memory representation of the data.")
 (define-public ocaml-ocurl
   (package
     (name "ocaml-ocurl")
-    (version "0.8.2")
+    (version "0.9.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://ygrek.org.ua/p/release/ocurl/ocurl-"
                                   version ".tar.gz"))
               (sha256
                 (base32
-                  "1ax3xdlzgb1zg7d0wr9nwgmh6a45a764m0wk8p6mx07ad94hz0q9"))))
+                  "0n621cxb9012pj280c7821qqsdhypj8qy9qgrah79dkh6a8h2py6"))))
     (build-system ocaml-build-system)
     (arguments
      `(#:phases
@@ -2453,7 +2453,7 @@ compatibility with older compiler to use these new features in their code.")
 (define-public ocaml-fileutils
   (package
     (name "ocaml-fileutils")
-    (version "0.6.0")
+    (version "0.6.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -2462,29 +2462,12 @@ compatibility with older compiler to use these new features in their code.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "06gxbqfssl16xc8y4d34wpm0mwfr0jgph4lmlwfmgazyggnmvc7m"))))
-    (build-system ocaml-build-system)
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'set-topfind
-           (lambda* (#:key inputs #:allow-other-keys)
-             ;; add the line #directory ".." at the top of each file
-             ;; using #use "topfind";; to be able to find topfind
-             (let* ((findlib-path (assoc-ref inputs "findlib"))
-                    (findlib-libdir
-                     (string-append findlib-path "/lib/ocaml/site-lib")))
-               (substitute* "setup.ml"
-                 (("#use \"topfind\";;" all)
-                  (string-append "#directory \"" findlib-libdir "\"\n"
-                                 all))))
-             #t)))))
+                "01qf51b8pb7vyfba7y0kb7ajwj1950im25d7f59821zwsibns3d9"))))
+    (build-system dune-build-system)
     (propagated-inputs
      `(("ocaml-stdlib-shims" ,ocaml-stdlib-shims)))
     (native-inputs
-     `(("ocamlbuild" ,ocamlbuild)
-       ("ocaml-oasis" ,ocaml-oasis)
-       ("ocaml-ounit" ,ocaml-ounit)))
+     `(("ocaml-ounit" ,ocaml-ounit)))
     (home-page "http://ocaml-fileutils.forge.ocamlcore.org")
     (synopsis "Pure OCaml functions to manipulate real file and filename")
     (description "Library to provide pure OCaml functions to manipulate real
@@ -2992,7 +2975,7 @@ XML and Protocol Buffers formats.")
 (define-public bap
   (package
     (name "bap")
-    (version "1.6.0")
+    (version "2.0.0")
     (home-page "https://github.com/BinaryAnalysisPlatform/bap")
     (source (origin
               (method git-fetch)
@@ -3002,7 +2985,7 @@ XML and Protocol Buffers formats.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0ryf2xb37pj2f9mc3p5prqgqrylph9qgq7q9jnbx8b03nzzpa6h6"))))
+                "0lb9xkfp67wjjqr75p6krivmjra7l5673236v9ny4gp0xi0755bk"))))
    (build-system ocaml-build-system)
    (native-inputs
     `(("ocaml-oasis" ,(package-with-ocaml4.07 ocaml-oasis))
@@ -3020,16 +3003,23 @@ XML and Protocol Buffers formats.")
       ("ocaml-ocurl" ,(package-with-ocaml4.07 ocaml-ocurl))
       ("ocaml-piqi" ,ocaml4.07-piqi)
       ("ocaml-ppx-jane" ,ocaml4.07-ppx-jane)
+      ("ocaml-utop" ,ocaml4.07-utop)
       ("ocaml-uuidm" ,(package-with-ocaml4.07 ocaml-uuidm))
       ("ocaml-uri" ,ocaml4.07-uri)
       ("ocaml-zarith" ,(package-with-ocaml4.07 ocaml-zarith))))
    (inputs
-    `(("llvm" ,llvm-3.8)
-      ("gmp" ,gmp)))
+    `(("gmp" ,gmp)
+      ("llvm" ,llvm-3.8)
+      ("ncurses" ,ncurses)))
    (arguments
     `(#:use-make? #t
       #:phases
       (modify-phases %standard-phases
+        (add-before 'configure 'fix-ncurses
+          (lambda _
+            (substitute* "oasis/llvm"
+              (("-lcurses") "-lncurses"))
+            #t))
         (replace 'configure
           (lambda* (#:key outputs inputs #:allow-other-keys)
             ;; add write for user, to prevent a failure in the install phase
@@ -4429,7 +4419,7 @@ storage of large amounts of data.")
 (define-public ocaml-octavius
   (package
     (name "ocaml-octavius")
-    (version "1.2.1")
+    (version "1.2.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4438,8 +4428,17 @@ storage of large amounts of data.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1ck6yj6z5rvqyl39rz87ca1bnk0f1dpgvlk115631hjh8bwpfvfq"))))
+                "1c5m51xcn2jv42kjjpklr6g63sgx1k885wfdp1yr4wrmiaj9cbpx"))))
     (build-system dune-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'make-writable
+           (lambda _
+             (for-each (lambda (file)
+                         (chmod file #o644))
+                       (find-files "." "."))
+             #t)))))
     (properties `((upstream-name . "octavius")))
     (home-page "https://github.com/ocaml-doc/octavius")
     (synopsis "Ocamldoc comment syntax parser")
diff --git a/gnu/packages/openkinect.scm b/gnu/packages/openkinect.scm
new file mode 100644
index 0000000000..536eb5a6fd
--- /dev/null
+++ b/gnu/packages/openkinect.scm
@@ -0,0 +1,141 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 Ekaitz Zarraga <ekaitz@elenq.tech>
+;;;
+;;; 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/>.
+
+(define-module (gnu packages openkinect)
+  #:use-module (guix packages)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages libusb)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages gl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages image-processing))
+
+(define-public libfreenect
+  (let ((version "0.6.1"))
+    (package
+      (name "libfreenect")
+      (version version)
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/OpenKinect/libfreenect")
+                      (commit (string-append "v" version))))
+                (sha256
+                 (base32
+                  "0was1va167rqshmpn382h36yyprpfi9cwillb6ylppmnfdrfrhrr"))))
+      (build-system cmake-build-system)
+      (arguments
+       '(#:tests? #f                    ; package has no tests
+         #:configure-flags
+         '("-DBUILD_FAKENECT=ON"
+           "-DBUILD_CPP=ON"
+           "-DBUILD_EXAMPLES=OFF"       ; available in libfreenect-examples
+           "-DBUILD_CV=OFF"             ; available in libfreenect-cv
+           "-DBUILD_PYTHON=OFF"         ; available in python-libfreenect
+           "-DBUILD_C_SYNC=ON")
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'install 'install-udev-rules
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let* ((out (assoc-ref outputs "out"))
+                      (rules-out (string-append out "/lib/udev/rules.d")))
+                 (install-file "../source/platform/linux/udev/51-kinect.rules"
+                               (string-append rules-out "51-kinect.rules"))
+                 #t))))))
+      (native-inputs
+       `(("pkg-config" ,pkg-config)))
+      (inputs
+       `(("libusb" ,libusb)))
+      (synopsis "Drivers and libraries for the Xbox Kinect device")
+      (description "libfreenect is a userspace driver for the Microsoft Kinect.
+It supports: RGB and Depth Images, Motors, Accelerometer, LED and Audio.")
+      (home-page "https://openkinect.org/")
+      (license license:gpl2+))))
+
+;; Library are already compiled in libfreenect, avoid build it again.
+(define libfreenect-derived-phases
+  '(modify-phases %standard-phases
+     (add-after 'unpack 'patch-CMakeLists.txt
+       (lambda* (#:key outputs #:allow-other-keys)
+         (substitute* "CMakeLists.txt"
+           ((".*libusb.*") "")
+           (("add_subdirectory \\(src\\)") "")
+           ((".*libfreenectConfig.cmake.*") ""))
+         #t))))
+
+(define-public libfreenect-examples
+  (package
+    (inherit libfreenect)
+    (name "libfreenect-examples")
+    (inputs
+     `(("libfreenect" ,libfreenect)
+       ("glut" ,freeglut)))
+    (arguments
+     `(#:tests? #f                      ; package has no tests
+       #:configure-flags '("-DBUILD_EXAMPLES=ON"
+                           "-DBUILD_FAKENECT=OFF"
+                           "-DBUILD_CPP=OFF"
+                           "-DBUILD_C_SYNC=OFF"
+                           "-DBUILD_CV=OFF")
+       #:phases ,libfreenect-derived-phases))
+    (synopsis "Examples for libfreenect, the Xbox Kinect device library")))
+
+(define-public libfreenect-opencv
+  (package
+    (inherit libfreenect)
+    (name "libfreenect-opencv")
+    (inputs
+     `(("libfreenect" ,libfreenect)
+       ("opencv" ,opencv)))
+    (arguments
+     `(#:tests? #f                      ; package has no tests
+       #:configure-flags '("-DBUILD_EXAMPLES=OFF"
+                           "-DBUILD_FAKENECT=OFF"
+                           "-DBUILD_CPP=OFF"
+                           "-DBUILD_C_SYNC=OFF"
+                           "-DBUILD_CV=ON")
+       #:phases ,libfreenect-derived-phases))
+    (synopsis "OpenCV wrapper for libfreenect, the Xbox Kinect device
+library")))
+
+(define-public python-libfreenect
+  (package
+    (inherit libfreenect)
+    (name "python-libfreenect")
+    (native-inputs
+     `(("python-cython" ,python-cython)))
+    (inputs
+     `(("libfreenect" ,libfreenect)))
+    (propagated-inputs
+     `(("python" ,python)
+       ("python-numpy" ,python-numpy)))
+    (arguments
+     `(#:tests? #f                      ; package has no tests
+       #:configure-flags '("-DBUILD_EXAMPLES=OFF"
+                           "-DBUILD_FAKENECT=OFF"
+                           "-DBUILD_CPP=OFF"
+                           "-DBUILD_C_SYNC=OFF"
+                           "-DBUILD_CV=OFF"
+                           "-DBUILD_PYTHON3=ON")
+       #:phases ,libfreenect-derived-phases))
+    (synopsis "Python wrapper for libfreenect, the Xbox Kinect device
+library")))
diff --git a/gnu/packages/pantheon.scm b/gnu/packages/pantheon.scm
new file mode 100644
index 0000000000..72910e5470
--- /dev/null
+++ b/gnu/packages/pantheon.scm
@@ -0,0 +1,109 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 Ryan Prior <rprior@protonmail.com>
+;;;
+;;; 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/>.
+
+(define-module (gnu packages pantheon)
+  #:use-module (gnu packages cmake)
+  #:use-module (gnu packages gettext)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages)
+  #:use-module (guix build-system meson)
+  #:use-module (guix git-download)
+  #:use-module ((guix licenses) :prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix utils))
+
+(define-public granite
+  (package
+    (name "granite")
+    (version "5.4.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/elementary/granite.git")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0acicv3f9gksb352v88lwap8ailjsxdrfknl2xql7blasbjzl2q0"))))
+    (build-system meson-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-icon-cache
+           (lambda _
+             (setenv "DESTDIR" "/")
+             #t)))))
+    (inputs
+     `(("glib" ,glib)
+       ("gtk" ,gtk+)
+       ("libgee" ,libgee)))
+    (native-inputs
+     `(("gettext" ,gettext-minimal)
+       ("gobject-introspection" ,gobject-introspection)
+       ("pkg-config" ,pkg-config)
+       ("vala" ,vala)))
+    (home-page "https://github.com/elementary/granite")
+    (synopsis "Library that extends GTK with common widgets and utilities")
+    (description "Granite is a companion library for GTK+ and GLib.  Among other
+things, it provides complex widgets and convenience functions designed for use
+in apps built for the Pantheon desktop.")
+    (license license:lgpl3+)))
+
+(define-public pantheon-calculator
+  (package
+    (name "pantheon-calculator")
+    (version "1.5.5")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/elementary/calculator.git")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1csxsr2c8qvl97xz9ahwn91z095nzgr0i1mbcb1spljll2sr9lkj"))))
+    (build-system meson-build-system)
+    (arguments
+     `(#:glib-or-gtk? #t
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-schema-cache-generation
+           (lambda _
+             (setenv "DESTDIR" "/")
+             #t)))))
+    (inputs
+     `(("granite" ,granite)
+       ("glib" ,glib)
+       ("gtk" ,gtk+)
+       ("libgee" ,libgee)))
+    (native-inputs
+     `(("cmake" ,cmake)
+       ("glib:bin" ,glib "bin") ; for glib-compile-schemas
+       ("gettext" ,gettext-minimal)
+       ("pkg-config" ,pkg-config)
+       ("vala" ,vala)))
+    (home-page "https://github.com/elementary/calculator")
+    (synopsis "Desktop calculator")
+    (description "Calculator is an application for performing simple
+arithmetic.  It is the default calculator application in the Pantheon
+desktop.")
+    (license license:gpl3)))
diff --git a/gnu/packages/patches/http-parser-fix-assertion-on-armhf.patch b/gnu/packages/patches/http-parser-fix-assertion-on-armhf.patch
new file mode 100644
index 0000000000..79bd3e8dbc
--- /dev/null
+++ b/gnu/packages/patches/http-parser-fix-assertion-on-armhf.patch
@@ -0,0 +1,39 @@
+From: Tobias Geerinckx-Rice <me@tobias.gr>
+Date: Wed, 20 May 2020 19:17:13 +0200
+Subject: [PATCH] gnu: http-client: Fix assertion on armhf-linux.
+
+Copied verbatim from [0] to fix guix pull[1] on ARM systems.
+
+[0]: https://github.com/nodejs/http-parser/pull/510
+[1]: https://issues.guix.gnu.org/40604
+
+From 0e5868aebb9eb92b078d27bb2774c2154dc167e2 Mon Sep 17 00:00:00 2001
+From: Ben Noordhuis <info@bnoordhuis.nl>
+Date: Thu, 30 Apr 2020 11:22:50 +0200
+Subject: [PATCH] Fix sizeof(http_parser) assert
+
+The result should be 32 on both 32 bits and 64 bits architectures
+because of struct padding.
+
+Fixes: https://github.com/nodejs/http-parser/issues/507
+---
+ test.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/test.c b/test.c
+index 7983424..f60a84f 100644
+--- a/test.c
++++ b/test.c
+@@ -4220,8 +4220,11 @@ main (void)
+   patch = version & 255;
+   printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version);
+ 
++  /* Should be 32 on both 32 bits and 64 bits architectures because of
++   * struct padding, see https://github.com/nodejs/http-parser/issues/507.
++   */
+   printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser));
+-  assert(sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *));
++  assert(sizeof(http_parser) == 32);
+ 
+   //// API
+   test_preserve_data();
diff --git a/gnu/packages/patches/kpmcore-fix-tests.patch b/gnu/packages/patches/kpmcore-fix-tests.patch
deleted file mode 100644
index 12043abe72..0000000000
--- a/gnu/packages/patches/kpmcore-fix-tests.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-Git commit c02d59aa6d314678cef9683f96b28e2a1abd82b7 by Andrius Štikonas, on behalf of Hartmut Goebel.
-Committed on 07/11/2019 at 22:16.
-Pushed by stikonas into branch '4.0'.
-
-Fix test for kpmcore: stop helper only if formerly started.
-
-See https://bugs.kde.org/413851 and https://phabricator.kde.org/D25161
-
-diff --git a/src/util/externalcommand.cpp b/src/util/externalcommand.cpp
---- a/src/util/externalcommand.cpp
-+++ b/src/util/externalcommand.cpp
-@@ -433,14 +433,17 @@
- 
- void ExternalCommand::stopHelper()
- {
-+    if (!helperStarted)
-+        return;
-     auto *interface = new org::kde::kpmcore::externalcommand(QStringLiteral("org.kde.kpmcore.externalcommand"),
-                     QStringLiteral("/Helper"), QDBusConnection::systemBus());
-     QByteArray request;
-     const quint64 nonce = interface->getNonce();
-     request.setNum(nonce);
-     QByteArray hash = QCryptographicHash::hash(request, QCryptographicHash::Sha512);
-     interface->exit(privateKey->signMessage(hash, QCA::EMSA3_Raw), nonce);
- 
-+    helperStarted = false;
-     delete privateKey;
-     delete init;
- }
-
diff --git a/gnu/packages/patches/kpmcore-remove-broken-test.patch b/gnu/packages/patches/kpmcore-remove-broken-test.patch
deleted file mode 100644
index d02cca7883..0000000000
--- a/gnu/packages/patches/kpmcore-remove-broken-test.patch
+++ /dev/null
@@ -1,139 +0,0 @@
-From c9a08a593bac8b8610a647db118fea6f2958156d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= <andrius@stikonas.eu>
-Date: Thu, 7 Nov 2019 22:12:00 +0000
-Subject: [PATCH] Remove broken smart unit test.
-
-BUG: 413853
----
- test/CMakeLists.txt |   9 ----
- test/testsmart.cpp  | 102 --------------------------------------------
- 2 files changed, 111 deletions(-)
- delete mode 100644 test/testsmart.cpp
-
-diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
-index 67f63a2..6a300d3 100644
---- a/test/CMakeLists.txt
-+++ b/test/CMakeLists.txt
-@@ -53,12 +53,3 @@ find_package (Threads)
- # Execute external commands as root
- kpm_test(testexternalcommand testexternalcommand.cpp)
- add_test(NAME testexternalcommand COMMAND testexternalcommand ${BACKEND})
--
--# Including SMART files reference
--set(SMARTPARSER ${CMAKE_SOURCE_DIR}/src/core/smartdiskinformation.cpp
--                ${CMAKE_SOURCE_DIR}/src/core/smartattributeparseddata.cpp
--                ${CMAKE_SOURCE_DIR}/src/core/smartparser.cpp)
--
--# Test SMART support
--kpm_test(testsmart testsmart.cpp ${SMARTPARSER})
--add_test(NAME testsmart COMMAND testsmart ${BACKEND})
-diff --git a/test/testsmart.cpp b/test/testsmart.cpp
-deleted file mode 100644
-index 2236af7..0000000
---- a/test/testsmart.cpp
-+++ /dev/null
-@@ -1,102 +0,0 @@
--#include "helpers.h"
--
--#include "util/externalcommand.h"
--#include "backend/corebackend.h"
--#include "backend/corebackendmanager.h"
--#include "core/smartstatus.h"
--#include "core/smartparser.h"
--
--#include <QCoreApplication>
--#include <QDebug>
--
--static QString getDefaultDevicePath();
--static bool testSmartStatus();
--static bool testSmartParser();
--
--int main(int argc, char **argv)
--{
--    QCoreApplication app(argc, argv);
--
--    KPMCoreInitializer i;
--
--    if (argc == 2)
--        i = KPMCoreInitializer(argv[1]);
--
--    if (!i.isValid())
--        return 1;
--
--    CoreBackend *backend = CoreBackendManager::self()->backend();
--
--    if (!backend)
--    {
--        qWarning() << "Couldn't get backend.";
--        return 1;
--    }
--
--    if (!testSmartStatus() || !testSmartParser())
--        return 1;
--
--    return app.exec();
--}
--
--static QString getDefaultDevicePath()
--{
--    // Getting default home partition using 'df -P /home | awk 'END{print $1}'' command
--    ExternalCommand command(QStringLiteral("df"), { QStringLiteral("-P"), QStringLiteral("/home"), QStringLiteral("|"),
--                                                    QStringLiteral("awk"), QStringLiteral("\'END{print $1}\'") });
--
--    if (command.run() && command.exitCode() == 0) {
--        QString output = command.output();
--        return output;
--    }
--
--    return QString();
--}
--
--static bool testSmartStatus()
--{
--    QString devicePath = getDefaultDevicePath();
--
--    SmartStatus smart(devicePath);
--
--    if (smart.devicePath() != devicePath)
--        return false;
--
--    if (!smart.status())
--        return false;
--
--    if (smart.modelName() == QString())
--        return false;
--
--    if (smart.firmware() == QString())
--        return false;
--
--    if (smart.serial() == QString())
--        return false;
--
--    if (smart.selfTestStatus() != SmartStatus::SelfTestStatus::Success)
--        return false;
--
--    if (!smart.isValid())
--        return false;
--
--    return true;
--}
--
--static bool testSmartParser()
--{
--    QString devicePath = getDefaultDevicePath();
--
--    SmartParser parser(devicePath);
--
--    if (!parser.init())
--        return false;
--
--    if (parser.devicePath() != devicePath)
--        return false;
--
--    if (!parser.diskInformation())
--        return false;
--
--    return true;
--}
--- 
-2.17.1
diff --git a/gnu/packages/patches/multipath-tools-sans-systemd.patch b/gnu/packages/patches/multipath-tools-sans-systemd.patch
new file mode 100644
index 0000000000..8f3144718c
--- /dev/null
+++ b/gnu/packages/patches/multipath-tools-sans-systemd.patch
@@ -0,0 +1,83 @@
+Fix various compiler warnings when built without systemd.
+
+Submitted upstream at <https://www.redhat.com/archives/dm-devel/2020-May/thread.html>.
+
+diff --git a/libmultipath/config.c b/libmultipath/config.c
+--- a/libmultipath/config.c
++++ b/libmultipath/config.c
+@@ -696,7 +696,7 @@ process_config_dir(struct config *conf, char *dir)
+ 	pthread_cleanup_pop(1);
+ }
+ 
+-static void set_max_checkint_from_watchdog(struct config *conf)
++static void set_max_checkint_from_watchdog(__attribute__((unused)) struct config *conf)
+ {
+ #ifdef USE_SYSTEMD
+ 	char *envp = getenv("WATCHDOG_USEC");
+diff --git a/multipathd/main.c b/multipathd/main.c
+--- a/multipathd/main.c
++++ b/multipathd/main.c
+@@ -176,6 +176,7 @@ daemon_status(void)
+ /*
+  * I love you too, systemd ...
+  */
++#ifdef USE_SYSTEMD
+ static const char *
+ sd_notify_status(enum daemon_status state)
+ {
+@@ -195,7 +196,6 @@ sd_notify_status(enum daemon_status state)
+ 	return NULL;
+ }
+ 
+-#ifdef USE_SYSTEMD
+ static void do_sd_notify(enum daemon_status old_state,
+ 			 enum daemon_status new_state)
+ {
+@@ -247,7 +247,9 @@ enum daemon_status wait_for_state_change_if(enum daemon_status oldstate,
+ static void __post_config_state(enum daemon_status state)
+ {
+ 	if (state != running_state && running_state != DAEMON_SHUTDOWN) {
+-		enum daemon_status old_state = running_state;
++		/* save state for sd_notify */
++		enum daemon_status
++			__attribute__((unused)) old_state = running_state;
+ 
+ 		running_state = state;
+ 		pthread_cond_broadcast(&config_cond);
+@@ -272,7 +274,9 @@ int set_config_state(enum daemon_status state)
+ 	pthread_cleanup_push(config_cleanup, NULL);
+ 	pthread_mutex_lock(&config_lock);
+ 	if (running_state != state) {
+-		enum daemon_status old_state = running_state;
++		/* save state for sd_notify */
++		enum daemon_status
++			__attribute__((unused)) old_state = running_state;
+ 
+ 		if (running_state == DAEMON_SHUTDOWN)
+ 			rc = EINVAL;
+@@ -2280,7 +2284,6 @@ checkerloop (void *ap)
+ 	struct timespec last_time;
+ 	struct config *conf;
+ 	int foreign_tick = 0;
+-	bool use_watchdog;
+ 
+ 	pthread_cleanup_push(rcu_unregister, NULL);
+ 	rcu_register_thread();
+@@ -2292,11 +2295,15 @@ checkerloop (void *ap)
+ 	get_monotonic_time(&last_time);
+ 	last_time.tv_sec -= 1;
+ 
+-	/* use_watchdog is set from process environment and never changes */
+ 	conf = get_multipath_config();
+-	use_watchdog = conf->use_watchdog;
+ 	put_multipath_config(conf);
+ 
++#ifdef USE_SYSTEMD
++	/* use_watchdog is set from process environment and never changes */
++	bool use_watchdog;
++	use_watchdog = conf->use_watchdog;
++#endif
++
+ 	while (1) {
+ 		struct timespec diff_time, start_time, end_time;
+ 		int num_paths = 0, strict_timing, rc = 0;
diff --git a/gnu/packages/patches/openjdk-14-builtins.patch b/gnu/packages/patches/openjdk-14-builtins.patch
new file mode 100644
index 0000000000..0e7e3dcaa9
--- /dev/null
+++ b/gnu/packages/patches/openjdk-14-builtins.patch
@@ -0,0 +1,11 @@
+--- jdk14-bc54620a3848/make/autoconf/basics.m4	2020-02-07 04:40:54.000000000 +1030
++++ jdk14-bc54620a3848-new/make/autoconf/basics.m4	2020-04-24 10:59:33.056098506 +0930
+@@ -583,7 +583,7 @@
+   BASIC_SETUP_TOOL($1, [AC_PATH_PROGS($1, $2, , $3)])
+   if test "x[$]$1" = x; then
+     AC_MSG_NOTICE([Required tool $2 not found in PATH, checking built-in])
+-    if help $2 > /dev/null 2>&1; then
++    if command -v $2 > /dev/null 2>&1; then
+       AC_MSG_NOTICE([Found $2 as shell built-in. Using it])
+       $1="$2"
+     else
diff --git a/gnu/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch b/gnu/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch
new file mode 100644
index 0000000000..f3b56e42d6
--- /dev/null
+++ b/gnu/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch
@@ -0,0 +1,82 @@
+Fix compatibility with Python 3.8.
+
+Upstream issue: https://github.com/DirectXMan12/should_be/pull/5
+
+diff -x '*.pyc' -Naur shouldbe-0.1.2/should_be/core.py shouldbe-0.1.2.patched/should_be/core.py
+--- shouldbe-0.1.2/should_be/core.py	2019-03-06 07:38:22.000000000 +0100
++++ shouldbe-0.1.2.patched/should_be/core.py	2020-05-18 08:44:24.214664704 +0200
+@@ -103,7 +103,7 @@
+     return resf
+ 
+ 
+-def buildCode(baseCode, argcount=None, kwonlyargcount=None,
++def buildCode(baseCode, argcount=None, posonlyargcount=None, kwonlyargcount=None,
+               nlocals=None, stacksize=None, flags=None,
+               code=None, consts=None, names=None,
+               varnames=None, filename=None, name=None,
+@@ -121,6 +121,24 @@
+                         nlocals or baseCode.co_nlocals,
+                         stacksize or baseCode.co_stacksize,
+                         flags or baseCode.co_flags,
++                        code or baseCode.co_code,
++                        consts or baseCode.co_consts,
++                        names or baseCode.co_names,
++                        varnames or baseCode.co_varnames,
++                        filename or baseCode.co_filename,
++                        name or baseCode.co_name,
++                        firstlineno or baseCode.co_firstlineno,
++                        lnotab or baseCode.co_lnotab,
++                        freevars or baseCode.co_freevars,
++                        cellvars or baseCode.co_cellvars)
++    elif hasattr(baseCode, 'co_posonlyargcount'):
++        # Python 3.8
++        resc = CodeType(argcount or baseCode.co_argcount,
++                        posonlyargcount or baseCode.co_posonlyargcount,
++                        kwonlyargcount or baseCode.co_kwonlyargcount,
++                        nlocals or baseCode.co_nlocals,
++                        stacksize or baseCode.co_stacksize,
++                        flags or baseCode.co_flags,
+                         code or baseCode.co_code,
+                         consts or baseCode.co_consts,
+                         names or baseCode.co_names,
+diff -x '*.pyc' -Naur shouldbe-0.1.2/should_be/tests/test_container_mixin.py shouldbe-0.1.2.patched/should_be/tests/test_container_mixin.py
+--- shouldbe-0.1.2/should_be/tests/test_container_mixin.py	2019-03-01 06:38:16.000000000 +0100
++++ shouldbe-0.1.2.patched/should_be/tests/test_container_mixin.py	2020-05-18 09:00:51.372531064 +0200
+@@ -7,31 +7,31 @@
+         self.lst = [1, 2, 3]
+ 
+     def test_should_include_iter(self):
+-        err_msg = (r'[a-zA-Z0-9.]+ should have included \[.+?\]'
++        err_msg = (r'[a-zA-Z0-9.()]+ should have included \[.+?\]'
+                    r', but did not have items .+')
+-        self.assertRaisesRegexp(AssertionError, err_msg,
++        self.assertRaisesRegex(AssertionError, err_msg,
+                                 self.lst.should_include, [4])
+ 
+         self.lst.should_include([1, 2, 3])
+ 
+     def test_should_include_item(self):
+-        err_msg = (r'[a-zA-Z0-9.]+ should have included .+?'
++        err_msg = (r'[a-zA-Z0-9.()]+ should have included .+?'
+                    r', but did not')
+-        self.assertRaisesRegexp(AssertionError, err_msg,
++        self.assertRaisesRegex(AssertionError, err_msg,
+                                 self.lst.should_include, 4)
+ 
+         self.lst.should_include(3)
+ 
+     def test_shouldnt_include_iter(self):
+         err_msg = 'should not have included'
+-        self.assertRaisesRegexp(AssertionError, err_msg,
++        self.assertRaisesRegex(AssertionError, err_msg,
+                                 self.lst.shouldnt_include, [2, 3])
+ 
+         self.lst.shouldnt_include([4, 5])
+ 
+     def test_shouldnt_include_item(self):
+         err_msg = 'should not have included'
+-        self.assertRaisesRegexp(AssertionError, err_msg,
++        self.assertRaisesRegex(AssertionError, err_msg,
+                                 self.lst.shouldnt_include, 3)
+ 
+         self.lst.shouldnt_include(4)
diff --git a/gnu/packages/patches/soundconverter-remove-gconf-dependency.patch b/gnu/packages/patches/soundconverter-remove-gconf-dependency.patch
deleted file mode 100644
index 29cdeb6e8d..0000000000
--- a/gnu/packages/patches/soundconverter-remove-gconf-dependency.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Tobias Geerinckx-Rice <me@tobias.gr>
-Date: Tue, 19 Feb 2019 07:46:28 +0100
-Subject: [PATCH] gnu: soundconverter: Catch (and ignore) the right error.
-
-Without this patch and GConf:
-
-  Traceback (most recent call last):
-    File "/gnu/…/bin/...soundconverter-real-real-real", line 164, in <module>
-      from soundconverter.batch import cli_convert_main
-    File "/gnu/…/lib/soundconverter/python/soundconverter/batch.py", line 31, in <module>
-      from soundconverter.gstreamer import TagReader
-    File "/gnu/…/lib/soundconverter/python/soundconverter/gstreamer.py", line 70, in <module>
-      gi.require_version('GConf', '2.0')
-    File "/gnu/…/lib/python3.7/site-packages/gi/__init__.py", line 130, in require_version
-      raise ValueError('Namespace %s not available' % namespace)
-  ValueError: Namespace GConf not available
----
-diff -Naur soundconverter-3.0.1/soundconverter/gstreamer.py soundconverter-3.0.1/soundconverter/gstreamer.py
---- soundconverter-3.0.1/soundconverter/gstreamer.py	2018-11-23 20:38:46.000000000 +0100
-+++ soundconverter-3.0.1/soundconverter/gstreamer.py	2019-02-19 07:42:15.767684388 +0100
-@@ -88,7 +88,7 @@
-             profile = description, extension, pipeline
-             audio_profiles_list.append(profile)
-             audio_profiles_dict[description] = profile
--except ImportError:
-+except ValueError:
-     pass
- 
- required_elements = ('decodebin', 'fakesink', 'audioconvert', 'typefind', 'audiorate')
diff --git a/gnu/packages/perl-check.scm b/gnu/packages/perl-check.scm
index 0031b46948..ccd9279f3a 100644
--- a/gnu/packages/perl-check.scm
+++ b/gnu/packages/perl-check.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2018 Kei Kebreau <kkebreau@posteo.net>
+;;; Copyright © 2020 Paul Garlick <pgarlick@tourbillion-technology.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -457,6 +458,40 @@ files, as well as to verify that there are no missing or unknown files.")
 @file{MANIFEST} file matches its distribution.")
     (license perl-license)))
 
+(define-public perl-test-distribution
+  (package
+    (name "perl-test-distribution")
+    (version "2.00")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append
+            "mirror://cpan/authors/id/S/SR/SRSHAH/Test-Distribution-"
+            version ".tar.gz"))
+      (sha256
+       (base32
+        "0s1bj459qaw2x1fckklv9irpf3mr8gp2cm9vlyrb5dyanrzx1v2h"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-module-build" ,perl-module-build)))
+    (propagated-inputs
+     `(("perl-file-find-rule" ,perl-file-find-rule)
+       ("perl-pod-coverage" ,perl-pod-coverage)
+       ("perl-test-pod" ,perl-test-pod)
+       ("perl-test-pod-coverage" ,perl-test-pod-coverage)))
+    (home-page "https://metacpan.org/release/Test-Distribution")
+    (synopsis "Perform tests on all modules of a distribution")
+    (description "When used in a test script @code{Test::Distribution}
+goes through all the modules in your distribution, checks their POD,
+checks that they compile successfully and checks that they all define
+a $VERSION.  In addition, this module performs a number of tests on
+the distribution itself.  It checks that the distributed files match
+the SIGNATURE file, if that file exists.  It checks that the
+distribution is not missing any core description files.  It also
+checks that the complete set of pre-requisite packages are listed in
+the Makefile.PL file.")
+    (license perl-license)))
+
 (define-public perl-test-eol
   (package
     (name "perl-test-eol")
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index d32e7b6ece..220519cde1 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -3079,6 +3079,34 @@ formats, as defined in RFC 2445.  It can be used to parse these formats in
 order to create the appropriate objects.")
     (license (package-license perl))))
 
+(define-public perl-datetime-format-iso8601
+  (package
+    (name "perl-datetime-format-iso8601")
+    (version "0.08")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append
+            "mirror://cpan/authors/id/J/JH/JHOBLITT/DateTime-Format-ISO8601-"
+            version ".tar.gz"))
+      (sha256
+       (base32
+        "1syccqd5jlwms8v78ksnf68xijzl97jky5vbwhnyhxi5gvgfx8xk"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-module-build" ,perl-module-build)))
+    (propagated-inputs
+     `(("perl-datetime" ,perl-datetime)
+       ("perl-datetime-format-builder" ,perl-datetime-format-builder)
+       ("perl-file-find-rule" ,perl-file-find-rule)
+       ("perl-test-distribution" ,perl-test-distribution)
+       ("perl-test-pod" ,perl-test-pod)))
+    (home-page "https://metacpan.org/release/DateTime-Format-ISO8601")
+    (synopsis "Parse ISO8601 date and time formats")
+    (description "@code{DateTime::Format::ISO8601} is a DateTime
+extension that parses almost all ISO8601 date and time formats.")
+    (license perl-license)))
+
 (define-public perl-datetime-format-natural
   (package
     (name "perl-datetime-format-natural")
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index dec75e188c..8459ecd045 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
-;;; Copyright © 2015, 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2016, 2017 Danny Milosavljevic <dannym+a@scratchpost.org>
 ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr>
@@ -222,32 +222,50 @@ comes with a SOCKS proxy client.")
 (define-public python-falcon
   (package
     (name "python-falcon")
-    (version "1.4.1")
+    (version "2.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "falcon" version))
        (sha256
         (base32
-         "1i0vmqsk24z4biirqhpvas9h28wy7nmpy3jvnb6rz2imq04zd09r"))))
+         "1z6mqfv574x6jiawf67ib52g4kk20c2x7xk7wrn1573b8v7r79gf"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           (delete-file-recursively "falcon/vendor")
+           (substitute* "setup.py"
+             ((".*falcon\\.vendor\\.mimeparse.*") ""))
+           (substitute* '("falcon/media/handlers.py"
+                          "falcon/request.py")
+             (("from falcon\\.vendor ") ""))
+           (substitute* "falcon.egg-info/SOURCES.txt"
+             (("falcon/vendor.*") ""))
+           #t))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
-             (invoke "pytest"))))))
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; Skip orjson, which requires rust to build.
+             (substitute* "tests/test_media_handlers.py"
+               (("== 'CPython") "!= 'CPython"))
+             (add-installed-pythonpath inputs outputs)
+             (invoke "pytest" "--ignore" "falcon"))))))
     (propagated-inputs
-     `(("python-mimeparse" ,python-mimeparse)
-       ("python-six" ,python-six)))
+     `(("python-mimeparse" ,python-mimeparse)))
     (native-inputs
      `(("python-cython" ,python-cython) ;for faster binaries
+       ("python-mujson" ,python-mujson)
+       ("python-msgpack" ,python-msgpack)
        ("python-pytest" ,python-pytest)
+       ("python-pytest-runner" ,python-pytest-runner)
        ("python-pyyaml" ,python-pyyaml)
+       ("python-rapidjson" ,python-rapidjson)
        ("python-requests" ,python-requests)
        ("python-testtools" ,python-testtools)
-       ("python-jsonschema" ,python-jsonschema)
-       ("python-msgpack" ,python-msgpack)))
+       ("python-ujson" ,python-ujson)))
     (home-page "https://falconframework.org")
     (synopsis
      "Web framework for building APIs and application backends")
@@ -267,10 +285,15 @@ classes
 @item Compatible with both CPython and PyPy
 @item Cython support for better performance when used with CPython
 @end itemize")
+    (properties `((python2-variant . ,(delay python2-falcon))))
     (license license:asl2.0)))
 
 (define-public python2-falcon
-  (package-with-python2 python-falcon))
+  (let ((falcon (package-with-python2 (strip-python2-variant python-falcon))))
+    (package
+      (inherit falcon)
+      (native-inputs
+       (alist-delete "python-rapidjson" (package-native-inputs falcon))))))
 
 (define-public python-falcon-cors
   (package
@@ -1012,14 +1035,14 @@ your Web app.")
 (define-public python-webob
   (package
     (name "python-webob")
-    (version "1.8.3")
+    (version "1.8.6")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "WebOb" version))
        (sha256
         (base32
-          "1cpqskanmvwia8wqlpcr3ykyxysynjdnbl5namvpg8vw6jnkv1dh"))))
+          "026i3z99nr3px75isa9mbnky5i7rffiv4d124h5kxfjjsxz92fma"))))
     (build-system python-build-system)
     (native-inputs
       `(("python-nose" ,python-nose)))
@@ -3746,3 +3769,258 @@ in Python with a focus on correctness and simplicity.
 Built on top of @code{asyncio}, Python's standard asynchronous I/O framework,
 it provides an elegant coroutine-based API.")
     (license license:bsd-3)))
+
+(define-public python-selenium
+  (package
+    (name "python-selenium")
+    (version "3.141.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "selenium" version))
+       (sha256
+        (base32
+         "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-urllib3" ,python-urllib3)))
+    (home-page
+     "https://github.com/SeleniumHQ/selenium/")
+    (synopsis "Python bindings for Selenium")
+    (description "Selenium enables web browser automation.
+Selenium specifically provides infrastructure for the W3C WebDriver specification
+— a platform and language-neutral coding interface compatible with all
+major web browsers.")
+    (license license:asl2.0)))
+
+(define-public python-rapidjson
+  (package
+    (name "python-rapidjson")
+    (version "0.9.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "python-rapidjson" version))
+        (sha256
+         (base32
+          "18cl2dhx3gds5vg52jxmh9wjlbiy8dx06c3n482rfpdi9dzbv05d"))
+        (modules '((guix build utils)))
+        (snippet
+         '(begin (delete-file-recursively "rapidjson") #t))))
+    (build-system python-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--rj-include-dir="
+                            (assoc-ref %build-inputs "rapidjson")
+                            "/include/rapidjson"))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'build
+           (lambda* (#:key inputs #:allow-other-keys)
+             (invoke "python" "setup.py" "build"
+                     (string-append "--rj-include-dir="
+                                    (assoc-ref %build-inputs "rapidjson")
+                                    "/include/rapidjson"))))
+         (replace 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             ;; Some tests are broken.
+             (delete-file "tests/test_base_types.py")
+             (delete-file "tests/test_validator.py")
+             (invoke "python" "-m" "pytest" "tests"))))))
+    (native-inputs
+     `(("rapidjson" ,rapidjson)
+       ("python-pytest" ,python-pytest)
+       ("python-pytz" ,python-pytz)))
+    (home-page "https://github.com/python-rapidjson/python-rapidjson")
+    (synopsis "Python wrapper around rapidjson")
+    (description "This package provides a python wrapper around rapidjson.")
+    (license license:expat)))
+
+(define-public python-venusian
+  (package
+    (name "python-venusian")
+    (version "3.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "venusian" version))
+       (sha256
+        (base32 "0f7f67dkgxxcjfhpdd5frb9pszkf04lyzzpn5069q0xi89r2p17n"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-runner" ,python-pytest-runner)
+       ("python-pytest-cov" ,python-pytest-cov)))
+    (arguments '(#:test-target "pytest"))
+    (home-page "https://docs.pylonsproject.org/projects/venusian")
+    (synopsis "Library for defering decorator actions")
+    (description
+     "Venusian is a library which allows framework authors to defer decorator
+actions.  Instead of taking actions when a function (or class) decorator is
+executed at import time, you can defer the action usually taken by the
+decorator until a separate scan phase.")
+    (license license:repoze)))
+
+(define-public python-zope-deprecation
+  (package
+    (name "python-zope-deprecation")
+    (version "4.4.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "zope.deprecation" version))
+              (sha256
+               (base32
+                "1pz2cv7gv9y1r3m0bdv7ks1alagmrn5msm5spwdzkb2by0w36i8d"))))
+    (build-system python-build-system)
+    (native-inputs `())
+    (propagated-inputs `())
+    (home-page "https://zopedeprecation.readthedocs.io/")
+    (synopsis "Function for marking deprecations")
+    (description "The @code{zope.deprecation} module provides a function for
+marking modules, classes, functions, methods and properties as deprecated,
+displaying warnings when usaged in application code.")
+    (license license:zpl2.1)))
+
+(define-public python-translationstring
+  (package
+    (name "python-translationstring")
+    (version "1.3")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "translationstring" version))
+              (sha256
+               (base32
+                "0bdpcnd9pv0131dl08h4zbcwmgc45lyvq3pa224xwan5b3x4rr2f"))))
+    (build-system python-build-system)
+    (home-page "http://docs.pylonsproject.org/projects/translationstring")
+    (synopsis "Internationalization tooling for the Pylons project")
+    (description "This package provides a library used by various Pylons
+project packages for internationalization (i18n) duties related to
+translation.")
+    (license license:repoze)))
+
+(define-public python-plaster
+  (package
+    (name "python-plaster")
+    (version "1.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "plaster" version))
+              (sha256
+               (base32
+                "1hy8k0nv2mxq94y5aysk6hjk9ryb4bsd13g83m60hcyzxz3wflc3"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (home-page "https://docs.pylonsproject.org/projects/plaster/en/latest/")
+    (synopsis "Configuration loader for multiple config file formats")
+    (description
+     "Plaster is a loader interface around multiple config file formats.  It
+exists to define a common API for applications to use when they wish to load
+configuration.  The library itself does not aim to handle anything except a
+basic API that applications may use to find and load configuration settings.
+Any specific constraints should be implemented in a pluggable loader which can
+be registered via an entrypoint.")
+    (license license:repoze)))
+
+(define-public python-plaster-pastedeploy
+  (package
+    (name "python-plaster-pastedeploy")
+    (version "0.7")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "plaster_pastedeploy" version))
+              (sha256
+               (base32
+                "1zg7gcsvc1kzay1ry5p699rg2qavfsxqwl17mqxzr0gzw6j9679r"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-plaster" ,python-plaster)
+       ("python-pastedeploy" ,python-pastedeploy)))
+    (home-page "https://github.com/Pylons/plaster_pastedeploy")
+    (synopsis "Plugin for python-plaster adding PasteDeploy syntax")
+    (description
+     "This plugin for @code{python-plaster} adds support for PasteDeploy
+syntax, it provides a plaster @code{Loader} object that can parse ini files
+according to the standard set by PasteDeploy ")
+    (license license:expat)))
+
+(define-public python-hupper
+  (package
+    (name "python-hupper")
+    (version "1.10.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "hupper" version))
+              (sha256
+               (base32
+                "0am0p6g5cz6xmcaf04xq8q6dzdd9qz0phj6gcmpsckf2mcyza61q"))))
+    (build-system python-build-system)
+    (arguments '(#:test-target "pytest"))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-pytest-runner" ,python-pytest-runner)
+       ("python-watchdog" ,python-watchdog)
+       ("python-mock" ,python-mock)
+       ("python-pytest-cov" ,python-pytest-cov)))
+    (propagated-inputs
+     `(("python-pytz" ,python-pytz)))
+    (home-page "https://readthedocs.org/projects/hupper")
+    (synopsis "Integrated process monitor tracking changes to imported Python files")
+    (description
+     "Hupper is an integrated process monitor that will track changes to any
+imported Python files in sys.modules as well as custom paths.  When files are
+changed the process is restarted.")
+    (license license:expat)))
+
+(define-public python-pyramid
+  (package
+    (name "python-pyramid")
+    (version "1.10.4")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "pyramid" version))
+              (sha256
+               (base32
+                "0rkxs1ajycg2zh1c94xlmls56mx5m161sn8112skj0amza6cn36q"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-hupper" ,python-hupper)
+       ("python-plaster-pastedeploy" ,python-plaster-pastedeploy)
+       ("python-translationstring" ,python-translationstring)
+       ("python-venusian" ,python-venusian)
+       ("python-webob" ,python-webob)
+       ("python-zope-deprecation" ,python-zope-deprecation)
+       ("python-zope-interface" ,python-zope-interface)
+       ("python-webtest" ,python-webtest)
+       ("python-zope-component" ,python-zope-component)
+       ("python-plaster" ,python-plaster)))
+    (home-page "https://trypyramid.com/")
+    (synopsis "Python web-framework suitable for small and large sites")
+    (description
+     "Pyramid makes it easy to write web applications.  From minimal
+request/response web apps to larger, grown applications.")
+    (license license:repoze)))
+
+(define-public python-random-user-agent
+  (package
+    (name "python-random-user-agent")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "random_user_agent" version))
+       (sha256
+        (base32
+         "04nhzdh2ki7ybhjrmghxci6hcm6i03vvin2q2ynj87fbr1pa534g"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/Luqman-Ud-Din/random_user_agent")
+    (synopsis "List of user agents")
+    (description
+     "This package provides a list of user agents, from a collection of more
+than 326,000 known user-agents.  Users can pick a random one, or select one
+based on filters.")
+    (license license:expat)))
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index f965c2e9de..ffb93801b1 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -3720,20 +3720,19 @@ Language (TOML) configuration files.")
 (define-public python-jsonrpc-server
   (package
     (name "python-jsonrpc-server")
-    (version "0.3.2")
+    (version "0.3.4")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "python-jsonrpc-server" version))
        (sha256
         (base32
-         "0ddgdp26dfxaz6isjbb12974b3rxavgsqrn2zrmck62cmipg5g05"))))
+         "0dzya99nbi4mw7q85vmyw1wfgbx5dpmysnvm0bwx5m4xbi4zafy7"))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-future" ,python-future)
-       ("python-mock" ,python-mock)
+     `(("python-mock" ,python-mock)
        ("python-pytest" ,python-pytest)
-       ("python-ujson" ,python-ujson)))
+       ("python-ujson" ,python-ujson-1)))
     (home-page
      "https://github.com/palantir/python-jsonrpc-server")
     (synopsis "JSON RPC 2.0 server library")
@@ -9479,16 +9478,17 @@ applications.")
 (define-public python-apipkg
   (package
     (name "python-apipkg")
-    (version "1.4")
+    (version "1.5")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "apipkg" version))
              (sha256
               (base32
-               "1iks5701qnp3dlr3q1d9qm68y2plp2m029irhpz92a44psfkjf1f"))))
+               "1xhak74yj3lqflvpijg15rnkklrigvsp5q7s4as4h6a157d8q8ip"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-pytest" ,python-pytest)))
+     `(("python-pytest" ,python-pytest)
+       ("python-setuptools-scm" ,python-setuptools-scm)))
     (synopsis "Namespace control and lazy-import mechanism")
     (description "With apipkg you can control the exported namespace of a Python
 package and greatly reduce the number of imports for your users.  It is a small
@@ -9496,9 +9496,6 @@ pure Python module that works on virtually all Python versions.")
     (home-page "https://github.com/pytest-dev/apipkg")
     (license license:expat)))
 
-(define-public python2-apipkg
-  (package-with-python2 python-apipkg))
-
 (define-public python-execnet
   (package
     (name "python-execnet")
@@ -11396,14 +11393,14 @@ network support library.")
 (define-public python-ply
   (package
     (name "python-ply")
-    (version "3.10")
+    (version "3.11")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "ply" version))
         (sha256
           (base32
-            "1jxsr1d2f732r6ljhvm827113dckwl6qwakfvpbdhcbhvpvlmscn"))))
+            "18qx113g9bi1ac4indd5phma82zcdq601lxncp3vjn43m2mc3iq0"))))
     (build-system python-build-system)
     (home-page "http://www.dabeaz.com/ply/")
     (synopsis "Python Lex & Yacc")
@@ -11411,9 +11408,6 @@ network support library.")
 It uses LR parsing and does extensive error checking.")
     (license license:bsd-3)))
 
-(define-public python2-ply
-  (package-with-python2 python-ply))
-
 (define-public python-tabulate
   (package
     (name "python-tabulate")
@@ -18324,6 +18318,50 @@ services to what you expect in your tests.")
 (define-public python-ujson
   (package
     (name "python-ujson")
+    (version "2.0.3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "ujson" version))
+        (sha256
+         (base32
+          "18z9gb9ggy1r464b9q1gqs078mqgrkj6dys5a47529rqk3yfybdx"))
+        (modules '((guix build utils)))
+        (snippet
+         '(begin (delete-file-recursively "deps") #t))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'link-to-system-double-conversion
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((d-c (assoc-ref inputs "double-conversion")))
+               (substitute* "setup.py"
+                 (("./deps/double-conversion/double-conversion\"")
+                  (string-append d-c "/include/double-conversion\""))
+                 (("-lstdc++" stdc)
+                  (string-append "-L" d-c "/lib\","
+                                 " \"-ldouble-conversion\","
+                                 " \"" stdc)))
+               #t)))
+         (replace 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (invoke "pytest"))))))
+    (native-inputs
+     `(("double-conversion" ,double-conversion)
+       ("python-setuptools-scm" ,python-setuptools-scm)
+       ("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/ultrajson/ultrajson")
+    (synopsis "Ultra fast JSON encoder and decoder for Python")
+    (description
+     "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with
+bindings for Python 3.")
+    (license license:bsd-3)))
+
+(define-public python-ujson-1
+  (package
+    (inherit python-ujson)
     (version "1.35")
     (source
      (origin
@@ -18332,17 +18370,16 @@ services to what you expect in your tests.")
        (sha256
         (base32
          "11jz5wi7mbgqcsz52iqhpyykiaasila4lq8cmc2d54bfa3jp6q7n"))))
-    (build-system python-build-system)
+    (arguments
+     '(#:phases %standard-phases))
+    (native-inputs '())
     (home-page "http://www.esn.me")
-    (synopsis
-     "Ultra fast JSON encoder and decoder for Python")
     (description
      "UltraJSON is an ultra fast JSON encoder and decoder written in pure C with
- bindings for Python 2.5+ and 3.")
-    (license license:bsd-3)))
+bindings for Python 2.5+ and 3.")))
 
-(define-public python2-ujson
-  (package-with-python2 python-ujson))
+(define-public python2-ujson-1
+  (package-with-python2 python-ujson-1))
 
 (define-public python-iocapture
   ;; The latest release is more than a year older than this commit.
@@ -18749,7 +18786,8 @@ and cuts down boilerplate code when testing libraries for asyncio.")
        (uri (pypi-uri "shouldbe" version))
        (sha256
         (base32
-         "16zbvjxf71dl4yfbgcr6idyim3mdrfvix1dv8b95p0s9z07372pj"))))
+         "16zbvjxf71dl4yfbgcr6idyim3mdrfvix1dv8b95p0s9z07372pj"))
+       (patches (search-patches "python-shouldbe-0.1.2-cpy3.8.patch"))))
     (build-system python-build-system)
     (propagated-inputs
       `(("python-forbiddenfruit" ,python-forbiddenfruit)))
@@ -19862,3 +19900,54 @@ module.  @code{cmd2} provides a wealth of features on top of @code{cmd} to
 make your life easier and eliminates much of the boilerplate code which would
 be necessary when using @code{cmd}.")
     (license license:expat)))
+
+(define-public python-pytidylib
+  (package
+    (name "python-pytidylib")
+    (version "0.3.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "pytidylib" version))
+              (sha256
+               (base32
+                "1wqa9dv5d7swka14rnky862hc7dgk2g3dhlrz57hdn3hb7bwic92"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'qualify-libtidy
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((libtidy (string-append (assoc-ref inputs "tidy")
+                                           "/lib/libtidy.so")))
+               (substitute* "tidylib/tidy.py"
+                 (("ctypes\\.util\\.find_library\\('tidy'\\)")
+                  (format #f "'~a'" libtidy)))
+               #t))))))
+    (inputs `(("tidy" ,tidy)))
+    (home-page "https://github.com/countergram/pytidylib")
+    (synopsis "Python wrapper for HTML Tidy library")
+    (description
+     "PyTidyLib is a Python package that wraps the HTML Tidy library.  This
+allows you, from Python code, to “fix” invalid (X)HTML markup.")
+    (license license:expat)))
+
+(define-public python2-pytidylib
+  (package-with-python2 python-pytidylib))
+
+(define-public python-mujson
+  (package
+    (name "python-mujson")
+    (version "1.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "mujson" version))
+        (sha256
+         (base32
+          "0wbj6r8yzsdx2b0kbldlkznr1a9nn33za2q9x3g0hbg420dwzn97"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/mattgiles/mujson")
+    (synopsis "Use the fastest JSON functions available at import time")
+    (description "This packages selects the fastest JSON functions available
+at import time.")
+    (license license:expat)))
diff --git a/gnu/packages/radio.scm b/gnu/packages/radio.scm
index 123357a2bc..f5dbbf7838 100644
--- a/gnu/packages/radio.scm
+++ b/gnu/packages/radio.scm
@@ -159,7 +159,7 @@ this package.  E.g.: @code{(udev-rules-service 'rtl-sdr rtl-sdr)}")
 (define-public chirp
   (package
     (name "chirp")
-    (version "20181205")
+    (version "20200430")
     (source
      (origin
        (method url-fetch)
@@ -167,7 +167,7 @@ this package.  E.g.: @code{(udev-rules-service 'rtl-sdr rtl-sdr)}")
                            version "/chirp-daily-" version ".tar.gz"))
        (sha256
         (base32
-         "1cp280b95j39xaxs50zn55jigg7pyfpm9n098hmsyxrplqn8z43c"))))
+         "060fzplgmpfrk6wkfaasx7phpfk90mmylk6drbwzk4f9r1655vda"))))
     (build-system python-build-system)
     (inputs
      `(("python2-libxml2" ,python2-libxml2)
diff --git a/gnu/packages/rails.scm b/gnu/packages/rails.scm
index f77c153197..2fc7f0a113 100644
--- a/gnu/packages/rails.scm
+++ b/gnu/packages/rails.scm
@@ -555,12 +555,6 @@ application bootup, plugins, generators, and Rake tasks.")
                ;; tzinfo-data is propagated by ruby-activesupport, but it
                ;; needs to be in the Gemfile to become available.
                (("group :test do") "group :test do\n  gem 'tzinfo-data'"))
-             #t))
-         (add-after 'unpack 'fix-mocha-minitest-require
-           (lambda _
-             (substitute* "test/test_helper.rb"
-               ;; This chanegd in recent versions of Mocha
-               (("mocha/minitest") "mocha/mini_test"))
              #t)))))
     (propagated-inputs
      `(("ruby-actionview" ,ruby-actionview)
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index 4ce42f90bf..94b16957e0 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -1542,6 +1542,49 @@ a Ruby object.")
     (home-page "https://github.com/rails/execjs")
     (license license:expat)))
 
+(define-public ruby-fakefs
+  (package
+    (name "ruby-fakefs")
+    (version "1.2.2")
+    (home-page "https://github.com/fakefs/fakefs")
+    (source (origin
+              ;; The Rubygems release does not contain tests.
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "008dq9knyip2bfbl0mrk8b8r7bv0k3bf128wcfqsgy1rqal4mgwk"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "fakefs.gemspec"
+                        (("`git ls-files lib README.md LICENSE`")
+                         "`find lib README.md LICENSE -type f | sort`"))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      ;; Drop hard version requirements for test dependencies.
+                      (substitute* "fakefs.gemspec"
+                        (("(.*add_development_dependency .*), .*" _ dep)
+                         (string-append dep "\n")))
+                      #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-maxitest" ,ruby-maxitest)
+       ("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Fake file system for Ruby")
+    (description
+     "This package provides a fake file system for use in test suites.  It
+avoids the need for manually creating temporary directories, or dealing
+with platform intricacies in @code{File} and @code{FileUtils}.")
+    (license license:expat)))
+
 (define-public ruby-orderedhash
   (package
     (name "ruby-orderedhash")
@@ -1840,6 +1883,57 @@ libraries such as Libnotify.")
     (home-page "https://github.com/guard/notiffany")
     (license license:expat)))
 
+(define-public ruby-forking-test-runner
+  (package
+    (name "ruby-forking-test-runner")
+    (version "1.6.0")
+    (home-page "https://github.com/grosser/forking_test_runner")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page)
+                                  (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1mrglzkj2nrgisccf2f30zbfmcs0awv1g3lw994b2az90fl39x8m"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "spec"
+       ;; FIXME: ActiveRecord depends on sqlite3 1.3.6, but Guix has
+       ;; 1.4.1, which in turn breaks the tests that use ActiveRecord.
+       #:tests? #f
+       #:phases (modify-phases %standard-phases
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "forking_test_runner.gemspec"
+                        (("`git ls-files lib/ bin/ MIT-LICENSE`")
+                         "`find lib/ bin/ MIT-LICENSE -type f | sort`"))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      ;; Ignore hard coded version constraints for the tests.
+                      (delete-file "Gemfile.lock")
+                      #t))
+                  (add-before 'check 'set-HOME
+                    (lambda _
+                      ;; Many tests invoke Bundler, and fails when Bundler
+                      ;; warns that /homeless-shelter does not exist.
+                      (setenv "HOME" "/tmp")
+                      #t)))))
+    (native-inputs
+     `(("ruby-activerecord" ,ruby-activerecord)
+       ("ruby-bump" ,ruby-bump)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-sqlite3" ,ruby-sqlite3)
+       ("ruby-wwtd" ,ruby-wwtd)))
+    (propagated-inputs
+     `(("ruby-parallel-tests" ,ruby-parallel-tests)))
+    (synopsis "Run every test in a fork")
+    (description
+     "This package is a wrapper around @code{parallel_tests} that runs every
+test in a fork to avoid pollution and get clean output per test.")
+    (license license:expat)))
+
 (define-public ruby-formatador
   (package
     (name "ruby-formatador")
@@ -2311,6 +2405,65 @@ interface for Ruby programs.")
     (home-page "https://github.com/mperham/connection_pool")
     (license license:expat)))
 
+(define-public ruby-fast-gettext
+  (package
+    (name "ruby-fast-gettext")
+    (version "2.0.2")
+    (home-page "https://github.com/grosser/fast_gettext")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page)
+                                  (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1rd48fp89k1sclgn2v26br2glwl3iv7z72mizzzmkdmqalqfn1sa"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "spec"
+       #:phases (modify-phases %standard-phases
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      (delete-file "Gemfile.lock")
+                      #t))
+                  (add-before 'check 'remove-activerecord-test
+                    (lambda _
+                      ;; FIXME: This test fails because ActiveRecord depends on
+                      ;; a different version of ruby-sqlite than the currently
+                      ;; available one.
+                      (delete-file
+                       "spec/fast_gettext/translation_repository/db_spec.rb")
+                      #t))
+                  (add-before 'check 'disable-i18n-test
+                    (lambda _
+                      ;; XXX: This test checks i18n intricasies with Rails 3 and
+                      ;; automatically disables itself for Rails 4.0, but does
+                      ;; not know about newer versions as it has not been updated
+                      ;; since 2014.  Disable for later versions of Rails too.
+                      (substitute* "spec/fast_gettext/vendor/string_spec.rb"
+                        (((string-append "ActiveRecord::VERSION::MAJOR == 4 and "
+                                         "ActiveRecord::VERSION::MINOR == 0"))
+                         "ActiveRecord::VERSION::MAJOR >= 4"))
+                      #t)))))
+    (native-inputs
+     `(;; For tests.
+       ("ruby-activerecord" ,ruby-activerecord)
+       ("ruby-activesupport" ,ruby-activesupport)
+       ("ruby-bump" ,ruby-bump)
+       ("ruby-forking-test-runner" ,ruby-forking-test-runner)
+       ("ruby-i18n" ,ruby-i18n)
+       ("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-single-cov" ,ruby-single-cov)
+       ("ruby-sqlite3" ,ruby-sqlite3)
+       ("ruby-wwtd" ,ruby-wwtd)))
+    (synopsis "Fast implementation of @code{GetText}")
+    (description
+     "This package provides an alternative implementation of the Ruby
+@code{GetText} library that is approximately 12x faster yet thread safe.")
+    ;; Some parts are covered by the Ruby license, see file headers.
+    (license (list license:expat license:ruby))))
+
 (define-public ruby-net-http-persistent
   (package
     (name "ruby-net-http-persistent")
@@ -2987,62 +3140,90 @@ Ruby, but can be used for all programs.")
   (home-page "https://github.com/alexch/rerun/")
   (license license:expat)))
 
+(define-public ruby-maxitest
+  (package
+    (name "ruby-maxitest")
+    (version "3.6.0")
+    (home-page "https://github.com/grosser/maxitest")
+    (source (origin
+              ;; Pull from git because the gem does not contain tests.
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "07b3j0bv3dx5j42jlvpvl07aaxplyi6wq688y3jl8y528ww2hjz8"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "default"
+       #:phases (modify-phases %standard-phases
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "maxitest.gemspec"
+                        (("`git ls-files lib/ bin/ MIT-LICENSE Readme.md`")
+                         "`find lib/ bin/ MIT-LICENSE Readme.md -type f | sort`"))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      ;; Don't use specific versions of dependencies, instead
+                      ;; take whatever is available in Guix.
+                      (delete-file "Gemfile.lock")
+                      #t))
+                  (add-before 'check 'add-mtest-on-PATH
+                    (lambda _
+                      ;; Tests use 'mtest' which is not automatically added on
+                      ;; PATH.
+                      (setenv "PATH" (string-append (getcwd) "/bin:"
+                                                    (getenv "PATH")))
+                      #t)))))
+    (native-inputs
+     `(("ps" ,procps)
+       ("ruby-bump" ,ruby-bump)
+       ("ruby-byebug" ,ruby-byebug)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-wwtd" ,ruby-wwtd)))
+    (propagated-inputs
+     `(("ruby-minitest" ,ruby-minitest)))
+    (synopsis "Minitest with extra features")
+    (description
+     "Maxitest is a wrapper around Minitest with extra functionality such
+as timeouts, an @command{mtest} executable that can run tests by line
+number, support for interrupted tests, better backtraces, and more.")
+    (license license:expat)))
+
 (define-public ruby-mocha
   (package
     (name "ruby-mocha")
-    (version "1.1.0")
+    (version "1.11.2")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "mocha" version))
               (sha256
                (base32
-                "107nmnngbv8lq2g7hbjpn5kplb4v2c8gs9lxrg6vs8gdbddkilzi"))))
+                "0hxmkm8qxd04vwj8mqnpyrf2dwy7g1k9zipdfhl4y71cw7ijm9n4"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'add-test-unit-to-search-path
-          (lambda* (#:key inputs #:allow-other-keys)
-            (let* ((test-unit (assoc-ref inputs "ruby-test-unit")))
-              (substitute* "Rakefile"
-                (("t\\.libs << 'test'" line)
-                 (string-append line "; t.libs << \""
-                                test-unit "/lib/ruby/vendor_ruby"
-                                "/gems/test-unit-"
-                                ,(package-version ruby-test-unit)
-                                "/lib\""))))
-            #t))
-         (add-before 'check 'use-latest-redcarpet
-          (lambda _
-            (substitute* "mocha.gemspec"
-              (("<redcarpet>.freeze, \\[\"~> 1\"\\]")
-               "<redcarpet>.freeze, [\">= 3\"]"))
-            #t))
-         (add-before 'check 'hardcode-version
-          (lambda _
-            ;; Mocha is undefined at build time
-            (substitute* "Rakefile"
-              (("#\\{Mocha::VERSION\\}") ,version))
-            #t))
-         (add-before 'check 'remove-failing-test
-          ;; FIXME: This test fails for reasons unrelated to Guix packaging.
-          (lambda _
-            (delete-file "test/acceptance/stubbing_nil_test.rb")
-            #t)))))
-    (propagated-inputs
-     `(("ruby-metaclass" ,ruby-metaclass)))
+         (add-before 'check 'remove-rubocop-dependency
+           (lambda _
+             ;; Disable dependency on Rubocop, which is just a linter,
+             ;; and would introduce a circular dependency.
+             (substitute* "mocha.gemspec"
+               ((".*rubocop.*")
+                "true\n"))
+             #t)))))
     (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-yard" ,ruby-yard)
-       ("ruby-introspection" ,ruby-introspection)
-       ("ruby-test-unit" ,ruby-test-unit)
-       ("ruby-redcarpet" ,ruby-redcarpet)))
+     `(("ruby-introspection" ,ruby-introspection)))
     (synopsis "Mocking and stubbing library for Ruby")
     (description
      "Mocha is a mocking and stubbing library with JMock/SchMock syntax, which
 allows mocking and stubbing of methods on real (non-mock) classes.")
     (home-page "http://gofreerange.com/mocha/docs")
-    (license license:expat)))
+    ;; Mocha can be used with either license at the users choice.
+    (license (list license:expat license:ruby))))
 
 (define-public ruby-mocha-on-bacon
   (package
@@ -3502,6 +3683,28 @@ URIs using the normal URI.parse method.")
     (home-page "https://github.com/dball/data_uri")
     (license license:expat)))
 
+(define-public ruby-deep-merge
+  (package
+    (name "ruby-deep-merge")
+    (version "1.2.1")
+    (home-page "https://github.com/danielsdeleo/deep_merge")
+    ;; The Rubygem source does not contain the gemspec required for tests.
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page) (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0c9rk23ilhc0n4489y6lda2wzphpzh6ish6fahlbpjhxn82wb931"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-minitest" ,ruby-minitest)))
+    (synopsis "Recursively merge hashes")
+    (description
+     "Deep Merge is a set of utility functions for @code{Hash}.  It permits
+you to merge elements inside a hash together recursively.")
+    (license license:expat)))
+
 (define-public ruby-git
   (package
     (name "ruby-git")
@@ -3538,6 +3741,38 @@ and manipulate Git repositories by wrapping system calls to the git binary.")
     (home-page "https://github.com/schacon/ruby-git")
     (license license:expat)))
 
+(define-public ruby-hocon
+  (package
+    (name "ruby-hocon")
+    (version "1.3.0")
+    (home-page "https://github.com/puppetlabs/ruby-hocon")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page) (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1wz4cswjg3gs1y1bar7j4j88wjimfa9zhvy51jyi177i5dzax416"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (if tests?
+                          (invoke "rspec")
+                          (format #t "test suite not run~%"))
+                      #t)))))
+    (native-inputs
+     `(("bundler" ,bundler)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "HOCON config library")
+    (description
+     "This package provides Ruby support for the @acronym{HOCON,
+Human-Optimized Config Object Notation} configuration file format.  It
+supports parsing and modifying HOCON and JSON files, and rendering parsed
+objects back to a @code{String}.")
+    (license license:asl2.0)))
+
 (define-public ruby-slop
   (package
     (name "ruby-slop")
@@ -3867,6 +4102,70 @@ for select languages.")
     (home-page "http://coderay.rubychan.de")
     (license license:expat)))
 
+(define-public ruby-parallel-tests
+  (package
+    (name "ruby-parallel-tests")
+    (version "2.32.0")
+    (home-page "https://github.com/grosser/parallel_tests")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (string-append name version))
+              (sha256
+               (base32
+                "0l2rjz9fnxv7hvz679v7a75mghsh9x9qpvbyapiavqsx21v42l7m"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "default"
+       #:phases (modify-phases %standard-phases
+                  (add-after 'patch-source-shebangs 'patch-shell-invokations
+                    (lambda _
+                      (substitute* '("lib/parallel_tests/tasks.rb"
+                                     "spec/parallel_tests/tasks_spec.rb")
+                        (("/bin/sh") (which "sh"))
+                        (("/bin/bash") (which "bash")))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      ;; Remove hard coded version constraints, instead just
+                      ;; use whatever versions are available in Guix.
+                      (delete-file "Gemfile.lock")
+                      (substitute* "Gemfile"
+                        (("'minitest',.*")
+                         "'minitest'\n")
+                        (("'cucumber',.*")
+                         "'cucumber'\n"))
+                      #t))
+                  (add-before 'check 'disable-rails-test
+                    (lambda _
+                      ;; XXX: This test attempts to download and run the test
+                      ;; suites of multiple Rails versions(!) directly.
+                      (delete-file "spec/rails_spec.rb")
+                      #t))
+                  (add-before 'check 'set-HOME
+                    (lambda _
+                      ;; Some tests check the output of Bundler, and fail when
+                      ;; Bundler warns that /homeless-shelter does not exist.
+                      (setenv "HOME" "/tmp")
+                      #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-cucumber" ,ruby-cucumber)
+       ("ruby-minitest" ,ruby-minitest)
+       ("ruby-rake" ,ruby-rake)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-spinach" ,ruby-spinach)))
+    (propagated-inputs
+     `(("ruby-parallel" ,ruby-parallel)))
+    (synopsis "Run tests in parallel")
+    (description
+     "This package can speed up @code{Test::Unit}, @code{RSpec},
+@code{Cucumber}, and @code{Spinach} tests by running them concurrently
+across multiple CPU cores.")
+    (license license:expat)))
+
 (define-public ruby-parser
   (package
     (name "ruby-parser")
@@ -4023,6 +4322,61 @@ invocation, and source and documentation browsing.")
     (home-page "https://pryrepl.org")
     (license license:expat)))
 
+(define-public ruby-single-cov
+  (package
+    (name "ruby-single-cov")
+    (version "1.3.2")
+    (home-page "https://github.com/grosser/single_cov")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page)
+                                  (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "05qdzpcai1p23a120gb9bxkfl4y73k9hicx34ch2lsk31lgi9bl7"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "default"
+       #:phases (modify-phases %standard-phases
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "single_cov.gemspec"
+                        (("`git ls-files lib/ bin/ MIT-LICENSE`")
+                         "`find lib/ bin/ MIT-LICENSE -type f | sort`"))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      (delete-file "Gemfile.lock")
+                      #t))
+                  (add-before 'check 'make-files-writable
+                    (lambda _
+                      ;; Tests need to create local directories and open files
+                      ;; with write permissions.
+                      (for-each make-file-writable
+                                (find-files "specs" #:directories? #t))
+                      #t))
+                  (add-before 'check 'disable-failing-test
+                    (lambda _
+                      ;; XXX: This test copies assets from minitest, but can
+                      ;; not cope with the files being read-only.  Just skip
+                      ;; it for now.
+                      (substitute* "specs/single_cov_spec.rb"
+                        (("it \"complains when coverage is bad\"")
+                         "xit \"complains when coverage is bad\""))
+                      #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-minitest" ,ruby-minitest)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-simplecov" ,ruby-simplecov)))
+    (synopsis "Code coverage reporting tool")
+    (description
+     "This package provides actionable code coverage reports for Ruby
+projects.  It has very little overhead and can be easily integrated with
+development tools to catch coverage problems early.")
+    (license license:expat)))
+
 (define-public ruby-guard
   (package
     (name "ruby-guard")
@@ -4072,6 +4426,34 @@ file or directories are modified.")
     (home-page "https://guardgem.org/")
     (license license:expat)))
 
+(define-public ruby-spinach
+  (package
+    (name "ruby-spinach")
+    (version "0.11.0")
+    (home-page "http://github.com/codegram/spinach")
+    (source (origin
+              (method url-fetch)
+              (uri (rubygems-uri "spinach" version))
+              (sha256
+               (base32
+                "1mv053mqz9c8ngqa6wp1ymk2fax6j0yqzax6918akrdr7c3fx3c6"))))
+    (build-system ruby-build-system)
+    (arguments
+       ;; FIXME: Disable tests altogether because they depend on 'capybara'
+       ;; which in turn depends on many other unpackaged gems.  Enable once
+       ;; capybara is available.
+       '(#:tests? #f))
+    (propagated-inputs
+     `(("ruby-colorize" ,ruby-colorize)
+       ("ruby-gherkin-ruby" ,ruby-gherkin-ruby)
+       ("ruby-json" ,ruby-json)))
+    (synopsis "Gherkin-based BDD framework")
+    (description
+     "Spinach is a high-level @acronym{BDD, Behavior-driven development}
+framework that leverages the expressive @code{Gherkin} language to help you
+define executable specifications of your code.")
+    (license license:expat)))
+
 (define-public ruby-tilt
   (package
     (name "ruby-tilt")
@@ -5517,6 +5899,25 @@ It is intended be used by all Cucumber implementations to parse
     (home-page "https://github.com/cucumber-attic/gherkin")
     (license license:expat)))
 
+(define-public ruby-gherkin-ruby
+  (package
+    (name "ruby-gherkin-ruby")
+    (version "0.3.2")
+    (home-page "http://github.com/codegram/gherkin-ruby")
+    (source (origin
+              (method url-fetch)
+              (uri (rubygems-uri "gherkin-ruby" version))
+              (sha256
+               (base32
+                "18ay7yiibf4sl9n94k7mbi4k5zj2igl4j71qcmkswv69znyx0sn1"))))
+    (build-system ruby-build-system)
+    (synopsis "Pure Ruby Gherkin parser")
+    (description
+     "Gherkin-ruby is a Gherkin parser written in pure Ruby and less than
+200 lines of code.")
+    ;; XXX: No license information anywhere but Readme.md.
+    (license license:expat)))
+
 (define-public ruby-aruba
   (package
     (name "ruby-aruba")
@@ -7642,6 +8043,36 @@ is part of Ruby's standard library.  It more closely conforms to RFC 3986,
 RFC 3987, and RFC 6570 (level 4), providing support for IRIs and URI templates.")
     (license license:asl2.0)))
 
+(define-public ruby-colorize
+  (package
+    (name "ruby-colorize")
+    (version "0.8.1")
+    (source (origin
+              (method url-fetch)
+              (uri (rubygems-uri "colorize" version))
+              (sha256
+               (base32
+                "133rqj85n400qk6g3dhf2bmfws34mak1wqihvh3bgy9jhajw580b"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'check 'remove-codeclimate-dependency
+                    (lambda _
+                      (substitute* "test/test_colorize.rb"
+                        ;; Do not hook the tests into the online CodeClimate
+                        ;; service which is unnecessary for these tests.
+                        (("require 'codeclimate-test-reporter'")
+                         "")
+                        (("CodeClimate.*") ""))
+                      #t)))))
+    (synopsis "Add color effects to the @code{String} class")
+    (description
+     "This package extends the @code{String} class and adds a
+@code{ColorizedString} with methods to set text color, background color,
+and text effects.")
+    (home-page "http://github.com/fazibear/colorize")
+    (license license:gpl2+)))
+
 (define-public ruby-colorator
   (package
     (name "ruby-colorator")
@@ -9096,3 +9527,55 @@ which snapshots to consider and what files to include.")
     (home-page
      "https://github.com/hartator/wayback-machine-downloader")
     (license license:expat)))
+
+(define-public ruby-wwtd
+  (package
+    (name "ruby-wwtd")
+    (version "1.4.1")
+    (home-page "http://github.com/grosser/wwtd")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0gw7vfnbb41cy67yw82zji3jkhfsgmzcgzaszm99ax77y18wclf2"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  ;; Remove bundled library.
+                  (delete-file "spec/rake-12.3.0.gem")
+                  #t))))
+    (build-system ruby-build-system)
+    (arguments
+     '(;; XXX: Tests need multiple versions of ruby, wants to run
+       ;; `bundle install`, etc.
+       #:tests? #f
+       #:phases (modify-phases %standard-phases
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "wwtd.gemspec"
+                        (("git ls-files lib/ bin/`")
+                         "find lib/ bin/ -type f |sort`"))
+                      #t))
+                  (add-before 'check 'remove-version-constraints
+                    (lambda _
+                      (delete-file "Gemfile.lock")
+                      #t))
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (if tests?
+                          (invoke "rspec" "spec/")
+                          (format #t "test suite not run~%"))
+                      #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Run @file{.travis.yml} files locally")
+    (description
+     "WWTD is a @dfn{Travis Simulator} that lets you run test matrices
+defined in @file{.travis.yml} on your local machine, using @code{rvm},
+@code{rbenv}, or @code{chruby} to test different versions of Ruby.")
+    (license license:expat)))
diff --git a/gnu/packages/scanner.scm b/gnu/packages/scanner.scm
index 55a642241d..04d5065808 100644
--- a/gnu/packages/scanner.scm
+++ b/gnu/packages/scanner.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2015 Andy Wingo <wingo@igalia.com>
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
-;;; Copyright © 2017, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -39,16 +39,16 @@
 (define-public sane-backends-minimal
   (package
     (name "sane-backends-minimal")
-    (version "1.0.29")
+    (version "1.0.30")
     (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://gitlab.com/sane-project/backends/uploads/"
-                   "54f858b20a364fc35d820df935a86478/"
+                   "c3dd60c9e054b5dee1e7b01a7edc98b0/"
                    "sane-backends-" version ".tar.gz"))
              (sha256
               (base32
-               "1vd83vhl0hddwsdh2jb0k3yzycfghi2xa9lc3ga9r12rbx77n0ma"))
+               "18vryaycps3zpjzxh0wjgg8nv2f4pdvcfxxmdfj28qbzqjlrcp9z"))
              (modules '((guix build utils)))
              (snippet
               ;; Generated HTML files and udev rules normally embed a
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index 46f1826ba1..4551e57d4a 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -395,7 +395,7 @@ implementation techniques and as an expository tool.")
 (define-public racket
   (package
     (name "racket")
-    (version "7.6")
+    (version "7.7")
     (source (origin
               (method url-fetch)
               (uri (list (string-append "http://mirror.racket-lang.org/installers/"
@@ -405,7 +405,7 @@ implementation techniques and as an expository tool.")
                           version "/racket-" version "-src.tgz")))
               (sha256
                (base32
-                "0yagy7qrnz96gwafnj3whh2vs54788k1ci3vkm100h68gsw638b8"))
+                "0cx5h3k0n58cb442qzp3jlc7n1b9dbaxv9blg2rjil2rn119yrb2"))
               (patches (search-patches
                         "racket-store-checksum-override.patch"))))
     (build-system gnu-build-system)
@@ -537,7 +537,7 @@ of libraries.")
                           version "/racket-minimal-" version "-src.tgz")))
               (sha256
                (base32
-                "0id094q9024hj2n3907l7dblp3iix1v5289xzskmh5c26xfygp9y"))
+                "1lxcd4ix8q3089xql48hwccxvcpkinfxwxnc6fhcjdgzqcyxh3ln"))
               (patches (search-patches
                         "racket-store-checksum-override.patch"))))
     (synopsis "Racket without bundled packages such as Dr. Racket")
diff --git a/gnu/packages/shells.scm b/gnu/packages/shells.scm
index b752fb4a90..fa3eccabd4 100644
--- a/gnu/packages/shells.scm
+++ b/gnu/packages/shells.scm
@@ -493,21 +493,31 @@ ksh, and tcsh.")
 (define-public xonsh
   (package
     (name "xonsh")
-    (version "0.6.2")
+    (version "0.9.18")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "xonsh" version))
         (sha256
           (base32
-            "0c2bbmdg0n10q54vq9k1z5n53l0mh1hb1q5xprfhilvrbr6hlcwr"))
+            "1h4rrwzwiwkyi9p49sjn97rl39fqq2r23hchzsw0s3fcwa7m8fkj"))
         (modules '((guix build utils)))
         (snippet
          `(begin
-            ;; Delete bundled ply.
+            ;; Delete bundled PLY.
             (delete-file-recursively "xonsh/ply")
-            (substitute* '("setup.py")
-              (("'xonsh\\.ply\\.ply',") ""))
+            (substitute* "setup.py"
+              (("\"xonsh\\.ply\\.ply\",") ""))
+            ;; Use our properly packaged PLY instead.
+            (substitute* (list "setup.py"
+                               "tests/test_lexer.py"
+                               "xonsh/__amalgam__.py"
+                               "xonsh/lexer.py"
+                               "xonsh/parsers/base.py"
+                               "xonsh/xonfig.py")
+              (("from xonsh\\.ply\\.(.*) import" _ module)
+               (format #f "from ~a import" module))
+              (("from xonsh\\.ply import") "import"))
             #t))))
     (build-system python-build-system)
     (arguments
@@ -780,9 +790,9 @@ Shell (pdksh).")
     (license (list miros
                    isc))))              ; strlcpy.c
 
-(define-public oil-shell
+(define-public oil
   (package
-    (name "oil-shell")
+    (name "oil")
     (version "0.7.0")
     (source (origin
               (method url-fetch)
@@ -826,6 +836,9 @@ is commonly written.")
     (license (list psfl ; The Oil sources include a patched Python 2 source tree
                    asl2.0))))
 
+(define-public oil-shell
+  (deprecated-package "oil-shell" oil))
+
 (define-public gash
   (package
     (name "gash")
diff --git a/gnu/packages/shellutils.scm b/gnu/packages/shellutils.scm
index 7496dd12dc..29e288a402 100644
--- a/gnu/packages/shellutils.scm
+++ b/gnu/packages/shellutils.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2017 Stefan Reichör <stefan@xsteve.at>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Benjamin Slade <slade@jnanam.net>
 ;;; Copyright © 2019 Collin J. Doering <collin@rekahsoft.ca>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
@@ -46,7 +46,7 @@
 (define-public zsh-autosuggestions
   (package
     (name "zsh-autosuggestions")
-    (version "0.6.3")
+    (version "0.6.4")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -55,7 +55,7 @@
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1h8h2mz9wpjpymgl2p7pc146c1jgb3dggpvzwm9ln3in336wl95c"))))
+                "0h52p2waggzfshvy1wvhj4hf06fmzd44bv6j18k3l9rcx6aixzn6"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("ruby" ,ruby)
diff --git a/gnu/packages/suckless.scm b/gnu/packages/suckless.scm
index 0cf334d7e0..5cabb40eb0 100644
--- a/gnu/packages/suckless.scm
+++ b/gnu/packages/suckless.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2017 Alex Griffin <a@ajgrf.com>
-;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,28 +25,28 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages suckless)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix git-download)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system glib-or-gtk)
   #:use-module (gnu packages)
-  #:use-module (gnu packages gnome)
-  #:use-module (gnu packages image)
-  #:use-module (gnu packages xorg)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages cups)
   #:use-module (gnu packages fonts)
-  #:use-module (gnu packages pkg-config)
-  #:use-module (gnu packages webkit)
   #:use-module (gnu packages fontutils)
-  #:use-module (gnu packages mpd)
+  #:use-module (gnu packages gawk)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages libbsd)
   #:use-module (gnu packages linux)
-  #:use-module (gnu packages compression)
-  #:use-module (gnu packages cups)
+  #:use-module (gnu packages mpd)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages gawk)
-  #:use-module (gnu packages base)
-  #:use-module (gnu packages libbsd))
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages webkit)
+  #:use-module (gnu packages xorg)
+  #:use-module (guix build-system glib-or-gtk)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))
 
 (define-public blind
   (package
@@ -61,10 +61,13 @@
                 "0nncvzyipvkkd7zlgzwbjygp82frzs2hvbnk71gxf671np607y94"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f                      ; no check target
-       #:make-flags (list
-                     "CC=gcc"
-                     (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no check target
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure))))         ; no configure script
@@ -147,12 +150,16 @@ optimising the environment for the application in use and the task performed.")
                 "0ia9nqr83bv6x247q30bal0v42chcj9qcjgv59xs6xj46m7iz5xk"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output)
-                          (string-append "FREETYPEINC="
-                                         (assoc-ref %build-inputs "freetype")
-                                         "/include/freetype2"))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)
+               (string-append "FREETYPEINC="
+                              (assoc-ref %build-inputs "freetype")
+                              "/include/freetype2")))
        #:phases
        (modify-phases %standard-phases (delete 'configure))))
     (inputs
@@ -175,15 +182,19 @@ numbers of user-defined menu items efficiently.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "spoon-" version ".tar.gz"))
        (sha256
         (base32
          "1jpmg9k9f4f3lpz0k3cphqjswlyf8lz2sm8ccifiip93kd4rrdj0"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))))
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))))
     (inputs
      `(("libx11" ,libx11)
        ("libxkbfile" ,libxkbfile)
@@ -208,9 +219,13 @@ numbers of user-defined menu items efficiently.")
                 "0sif752303dg33f14k6pgwq2jp1hjyhqv6x4sy3sj281qvdljf5m"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases (modify-phases %standard-phases (delete 'configure))))
     (inputs
      `(("libx11" ,libx11)
@@ -226,19 +241,23 @@ numbers of user-defined menu items efficiently.")
 (define-public st
   (package
     (name "st")
-    (version "0.8.2")
+    (version "0.8.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.suckless.org/st/st-"
                            version ".tar.gz"))
        (sha256
-        (base32 "0ddz2mdp1c7q67rd5vrvws9r0493ln0mlqyc3d73dv8im884xdxf"))))
+        (base32 "0ll5wbw1szs70wdf8zy1y2ig5mfbqw2w4ls8d64r8z3y4gdf76lk"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f                      ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure)
@@ -277,9 +296,13 @@ drawing.")
          "07cmajyafljigy10d21kkyvv5jf3hxkx06pz3rwwk3y3c9x4rvps"))))
     (build-system glib-or-gtk-build-system)
     (arguments
-     '(#:tests? #f ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure)
@@ -323,15 +346,18 @@ point surf to another URI by setting its XProperties.")
      `(#:phases (modify-phases %standard-phases
                   (delete 'configure))  ; no configuration
        #:tests? #f                      ; no test suite
-       #:make-flags (let ((pkg-config (lambda (flag)
-                                        (string-append
-                                         "$(shell pkg-config " flag " "
-                                         "xft fontconfig x11 libpng)"))))
-                      (list
-                       "CC=gcc"
-                       (string-append "PREFIX=" %output)
-                       (string-append "INCS=-I. " (pkg-config "--cflags"))
-                       (string-append "LIBS=" (pkg-config "--libs") " -lm")))))
+       #:make-flags
+       (let ((target ,(%current-target-system))
+             (pkg-config (lambda (flag)
+                           (string-append
+                            "$(shell pkg-config " flag " "
+                            "xft fontconfig x11 libpng)"))))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)
+               (string-append "INCS=-I. " (pkg-config "--cflags"))
+               (string-append "LIBS=" (pkg-config "--libs") " -lm")))))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
@@ -356,15 +382,19 @@ few minutes.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "xbattmon-" version ".tar.gz"))
        (sha256
         (base32
          "1zr6y8lml9xkx0a3dbbsds2qz1bjxvskp7wsckkf8mlsqrbb3xsg"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))))
     (inputs
      `(("libx11" ,libx11)))
     (home-page "https://git.2f30.org/xbattmon/")
@@ -381,7 +411,7 @@ few minutes.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "wificurse-" version ".tar.gz"))
        (sha256
         (base32
          "067ghr1xly5ca41kc83xila1p5hpq0bxfcmc8jvxi2ggm6wrhavn"))))
@@ -414,18 +444,22 @@ drivers capable of injecting packets in wireless networks.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "skroll-" version ".tar.gz"))
        (sha256
         (base32
          "0km6bjfz4ssb1z0xwld6iiixnn7d255ax8yjs3zkdm42z8q9yl0f"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
-         (delete 'configure)))) ; No configure script
+         (delete 'configure))))         ; no configure script
     (home-page "https://2f30.org/")
     (synopsis "Commandline utility which scrolls text")
     (description
@@ -442,18 +476,22 @@ left.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "sbm-" version ".tar.gz"))
        (sha256
         (base32
          "1nks5mkh5wn30kyjzlkjlgi31bv1wq52kbp0r6nzbyfnvfdlywik"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
-         (delete 'configure)))) ; No configure script
+         (delete 'configure))))         ; no configure script
     (home-page "https://git.2f30.org/sbm/")
     (synopsis "Simple bandwidth monitor")
     (description
@@ -468,18 +506,22 @@ left.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "prout-" version ".tar.gz"))
        (sha256
         (base32
          "1s6c3ygg1h1fyxkh8gd7nzjk6qhnwsb4535d2k780kxnwns5fzas"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
-         (delete 'configure)))) ; No configure script
+         (delete 'configure))))         ; no configure script
     (inputs
      `(("cups-minimal" ,cups-minimal)
        ("zlib" ,zlib)))
@@ -507,8 +549,12 @@ cups server to be installed.")
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure)            ; no configure script
@@ -541,8 +587,12 @@ cups server to be installed.")
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure))))         ; no configure script
@@ -559,20 +609,23 @@ environment variable.")
 (define-public fortify-headers
   (package
     (name "fortify-headers")
-    (version "1.0")
+    (version "1.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "fortify-headers-" version ".tar.gz"))
        (sha256
-        (base32
-         "0nvplfg4y4a10x2j12qwmxzlk2q4j6287j0v5f9bfsdayb04qvh2"))))
+        (base32 "1dhz41jq1azcf7rbvga8w6pnx19l1j9r6jwj8qrlrfnjl9hdi9bb"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
          (delete 'configure))))         ; no configure script
@@ -605,18 +658,22 @@ initially intended to be used on musl-based Linux distributions.
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "colors-" version ".tar.gz"))
        (sha256
         (base32
          "1lckmqpgj89841splng0sszbls2ag71ggkgr1wsv9y3v6y87589z"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
-         (delete 'configure)))) ; No configure script
+         (delete 'configure))))         ; no configure script
     (inputs
      `(("libpng" ,libpng)))
     (home-page "https://git.2f30.org/colors/")
@@ -635,25 +692,29 @@ colormap to stdout.")
         (commit "ff4c60635e1f455b0a0b4200f8183fbd5a88225b"))
     (package
       (name "libutf")
-      (version (string-append "0.0.0-" revision "." (string-take commit 7)))
+      (version (git-version "0.0.0" revision commit))
       (source
        (origin
          (method git-fetch)
          (uri (git-reference
                (url "https://github.com/cls/libutf")
                (commit commit)))
-         (file-name (string-append name "-" version "-checkout"))
+         (file-name (git-file-name name version))
          (sha256
           (base32
            "1ih5vjavilzggyr1j1z6w1z12c2fs5fg77cfnv7ami5ivsy3kg3d"))))
       (build-system gnu-build-system)
       (arguments
-       `(#:tests? #f ; No tests
-         #:make-flags (list "CC=gcc"
-                            (string-append "PREFIX=" %output))
+       `(#:tests? #f                    ; no tests
+         #:make-flags
+         (let ((target ,(%current-target-system)))
+           (list (string-append "CC=" (if target
+                                          (string-append target "-gcc")
+                                          "gcc"))
+                 (string-append "PREFIX=" %output)))
          #:phases
          (modify-phases %standard-phases
-           (delete 'configure)))) ; No configure script
+           (delete 'configure))))       ; no configure script
       (inputs
        `(("gawk" ,gawk)))
       (home-page "https://github.com/cls/libutf")
@@ -677,26 +738,29 @@ as -1, to be used instead of U+FFFD.
 
 ;; No release tarballs so far.
 (define-public lchat
-  (let ((revision "3")
-        (commit "f95191970fd59c52a8b09cff32bd8d2135cbfc6b"))
+  (let ((revision "4")
+        (commit "e3b64e67b9b9d832462382246474ce1e7d92217c"))
     (package
       (name "lchat")
-      (version (string-append "0.0.0-" revision "." (string-take commit 7)))
+      (version (git-version "0.0.0" revision commit))
       (source
        (origin
          (method git-fetch)
          (uri (git-reference
                (url "https://github.com/younix/lchat")
                (commit commit)))
-         (file-name (string-append name "-" version "-checkout"))
+         (file-name (git-file-name name version))
          (sha256
-          (base32
-           "07pxzziczhzprmjy61k7nl9i1kxpgnad37qkjf5fn4wf06nqdxpl"))))
+          (base32 "1qcjqbgmsskc04j2r6xl3amkwj05n520sq1wv2mqyqncz42qrxm0"))))
       (build-system gnu-build-system)
       (arguments
        `(#:test-target "test"
-         #:make-flags (list "CC=gcc"
-                            (string-append "PREFIX=" %output))
+         #:make-flags
+         (let ((target ,(%current-target-system)))
+           (list (string-append "CC=" (if target
+                                          (string-append target "-gcc")
+                                          "gcc"))
+                 (string-append "PREFIX=" %output)))
          #:phases
          (modify-phases %standard-phases
            (delete 'configure)          ; no configure script
@@ -733,18 +797,22 @@ chat output in the background.")
      (origin
        (method url-fetch)
        (uri (string-append "https://dl.2f30.org/releases/"
-                           name "-" version ".tar.gz"))
+                           "scron-" version ".tar.gz"))
        (sha256
         (base32
          "066fwa55kqcgfrsqgxh94sqbkxfsr691360xg4ljxr4i75d25s2a"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; No tests
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+     `(#:tests? #f                      ; no tests
+       #:make-flags
+       (let ((target ,(%current-target-system)))
+         (list (string-append "CC=" (if target
+                                        (string-append target "-gcc")
+                                        "gcc"))
+               (string-append "PREFIX=" %output)))
        #:phases
        (modify-phases %standard-phases
-         (delete 'configure)))) ; No configure script
+         (delete 'configure))))         ; no configure script
     (home-page "https://git.2f30.org/scron/")
     (synopsis "Simple cron daemon")
     (description
diff --git a/gnu/packages/syndication.scm b/gnu/packages/syndication.scm
index 658050c54d..f7cdb10f67 100644
--- a/gnu/packages/syndication.scm
+++ b/gnu/packages/syndication.scm
@@ -30,6 +30,7 @@
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages python-web)
@@ -169,3 +170,29 @@ file system, and many more features.")
      "Tuir provides a simple terminal viewer for Reddit (Terminal UI for Reddit).")
     (license (list license:expat
                    license:gpl3+))))    ; tuir/packages/praw
+
+(define-public rawdog
+  (package
+    (name "rawdog")
+    (version "2.23")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://offog.org/files/rawdog-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "18nyg19mwxyqdnykplkqmzb4n27vvrhvp639zai8f81gg9vdbsjp"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2.7))
+    (inputs
+     `(("python2-feedparser" ,python2-feedparser)
+       ("python2-pytidylib" ,python2-pytidylib)))
+    (home-page "https://offog.org/code/rawdog/")
+    (synopsis "RSS Aggregator Without Delusions Of Grandeur")
+    (description
+     "@command{rawdog} is a feed aggregator, capable of producing a personal
+\"river of news\" or a public \"planet\" page.  It supports all common feed
+formats, including all versions of RSS and Atom.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/telephony.scm b/gnu/packages/telephony.scm
index 760c1e0727..4c84ddc85a 100644
--- a/gnu/packages/telephony.scm
+++ b/gnu/packages/telephony.scm
@@ -620,7 +620,8 @@ address of one of the participants.")
                (for-each (lambda (file) (install-file file lib))
                          (find-files "." "\\.so\\."))
                (for-each (lambda (file) (install-file file lib))
-                         (find-files "release/plugins" "\\.so$"))))))))
+                         (find-files "release/plugins" "\\.so$"))
+               #t))))))
     (inputs
      `(("avahi" ,avahi)
        ("boost" ,boost)
diff --git a/gnu/packages/textutils.scm b/gnu/packages/textutils.scm
index ddafd4cc34..6fdcfd227e 100644
--- a/gnu/packages/textutils.scm
+++ b/gnu/packages/textutils.scm
@@ -151,24 +151,27 @@ libenca and several charset conversion libraries and tools.")
        (sha256
         (base32 "1xlkazhdnja4lksn5c9nf4bln5gjqa35a8gwlam5r0728w0h83qq"))))
     (build-system gnu-build-system)
-    (native-inputs           ;test data that is otherwise downloaded with curl
-     `(("NormalizationTest.txt"
-        ,(origin
-           (method url-fetch)
-           (uri (string-append "https://www.unicode.org/Public/13.0.0/ucd/"
-                               "NormalizationTest.txt"))
-           (sha256
-            (base32 "07g0ya4f6zfzvpp24ccxkb2yq568kh83gls85rjl950nv5fya3nn"))))
-       ("GraphemeBreakTest.txt"
-        ,(origin
-           (method url-fetch)
-           (uri (string-append "https://www.unicode.org/Public/13.0.0/ucd/"
-                               "auxiliary/GraphemeBreakTest.txt"))
-           (sha256
-            (base32 "07f8rrvcsq4pibdz6zxggxy8w7zjjqyw2ggclqlhalyv45yv7prj"))))
+    (native-inputs
+     (let ((UNICODE_VERSION "13.0.0"))  ; defined in data/Makefile
+       ;; Test data that is otherwise downloaded with curl.
+       `(("NormalizationTest.txt"
+          ,(origin
+             (method url-fetch)
+             (uri (string-append "https://www.unicode.org/Public/"
+                                 UNICODE_VERSION "/ucd/NormalizationTest.txt"))
+             (sha256
+              (base32 "07g0ya4f6zfzvpp24ccxkb2yq568kh83gls85rjl950nv5fya3nn"))))
+         ("GraphemeBreakTest.txt"
+          ,(origin
+             (method url-fetch)
+             (uri (string-append "https://www.unicode.org/Public/"
+                                 UNICODE_VERSION
+                                 "/ucd/auxiliary/GraphemeBreakTest.txt"))
+             (sha256
+              (base32 "07f8rrvcsq4pibdz6zxggxy8w7zjjqyw2ggclqlhalyv45yv7prj"))))
 
-       ;; For tests.
-       ("perl" ,perl)))
+         ;; For tests.
+         ("perl" ,perl))))
     (arguments
      '(#:make-flags (list "CC=gcc"
                           (string-append "prefix=" (assoc-ref %outputs "out")))
diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm
index 4ec503d2ed..2f2623b0e6 100644
--- a/gnu/packages/tor.scm
+++ b/gnu/packages/tor.scm
@@ -51,24 +51,28 @@
 (define-public tor
   (package
     (name "tor")
-    (version "0.4.2.7")
+    (version "0.4.3.5")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://dist.torproject.org/tor-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "0v82ngwwmmcb7i9563bgsmrjy6xp83xyhqhaljygd0pkvlsxi886"))))
+               "0s6qspi102drn1nk3gfxs51x992xarc44gkfsi8y3l48wr50wsk1"))))
     (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list "--enable-lzma"
+             "--enable-zstd")))
     (native-inputs
      `(("pkg-config" ,pkg-config)
-       ("python" ,python-2)))           ; for tests
+       ("python" ,python)))             ; for tests
     (inputs
-     `(("zlib" ,zlib)
-       ("openssl" ,openssl)
-       ("libevent" ,libevent)
+     `(("libevent" ,libevent)
        ("libseccomp" ,libseccomp)
+       ("openssl" ,openssl)
        ("xz" ,xz)
+       ("zlib" ,zlib)
        ("zstd" ,zstd "lib")))
     (home-page "https://www.torproject.org/")
     (synopsis "Anonymous network router to improve privacy on the Internet")
diff --git a/gnu/packages/valgrind.scm b/gnu/packages/valgrind.scm
index dd080bb327..75e852915e 100644
--- a/gnu/packages/valgrind.scm
+++ b/gnu/packages/valgrind.scm
@@ -47,7 +47,11 @@
     (outputs '("doc"                              ;16 MB
                "out"))
     (arguments
-     '(#:phases
+     `(,@(if (string-prefix? "powerpc" (or (%current-target-system)
+                                           (%current-system)))
+           `(#:make-flags '("CFLAGS+=-maltivec"))
+           '())
+       #:phases
        (modify-phases %standard-phases
          (add-after 'install 'patch-suppression-files
            (lambda* (#:key outputs #:allow-other-keys)
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 6f985bf84d..09ffd8f271 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -24,7 +24,7 @@
 ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2019 Jovany Leandro G.C <bit4bit@riseup.net>
 ;;; Copyright © 2019 Kei Kebreau <kkebreau@posteo.net>
-;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2019, 2020 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2020 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2020 John D. Boy <jboy@bius.moe>
@@ -773,7 +773,7 @@ to lock down your entire repository.")
 (define-public git-remote-gcrypt
   (package
    (name "git-remote-gcrypt")
-   (version "1.0.3")
+   (version "1.3")
    (source (origin
              (method git-fetch)
              (uri (git-reference
@@ -782,7 +782,7 @@ to lock down your entire repository.")
              (file-name (string-append name "-" version "-checkout"))
              (sha256
               (base32
-               "1vay3204729c7wajgn3nxf0s0hzwpdrw14pl6kd8w2ss25gvw2k1"))))
+               "0n8fzvr6y0pxrbvkywlky2bd8jvi0ayp4n9hwi84l1ldmv4a40dh"))))
    (build-system trivial-build-system)
    (arguments
     `(#:modules ((guix build utils))
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 7d86d6a71e..057b6438ed 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -1610,7 +1610,7 @@ To load this plugin, specify the following option when starting mpv:
 (define-public youtube-dl
   (package
     (name "youtube-dl")
-    (version "2020.05.03")
+    (version "2020.05.08")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/ytdl-org/youtube-dl/"
@@ -1618,7 +1618,7 @@ To load this plugin, specify the following option when starting mpv:
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0qigk1bml6vkck4rs0wnmr46j5gkz04zn30jvnw1r4czjs7vnpal"))))
+                "16zxa8ss2rka7cvkqyi67s8i1h9f4nxx88w9vjbxchbga6w0scc6"))))
     (build-system python-build-system)
     (arguments
      ;; The problem here is that the directory for the man page and completion
@@ -2762,14 +2762,15 @@ supported players in addition to this package.")
 (define-public handbrake
   (package
     (name "handbrake")
-    (version "1.3.1")
+    (version "1.3.2")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://download.handbrake.fr/releases/"
-                                  version "/HandBrake-" version "-source.tar.bz2"))
+              (uri (string-append "https://github.com/HandBrake/HandBrake/"
+                                  "releases/download/" version "/"
+                                  "HandBrake-" version "-source.tar.bz2"))
               (sha256
                (base32
-                "09rcrq0kjs1lc1as7w3glbpbfvzldwpx3xv0pfmkn4pl7acxw1f0"))
+                "0w7jxjrccvxp7g15dv0spildg5apmqp4gwbcqmg58va2gylynvzc"))
               (modules '((guix build utils)))
               (snippet
                ;; Remove "contrib" and source not necessary for
@@ -3873,7 +3874,7 @@ transcode or reformat the videos in any way, producing perfect backups.")
 (define-public svt-av1
   (package
     (name "svt-av1")
-    (version "0.8.2")
+    (version "0.8.3")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3882,7 +3883,7 @@ transcode or reformat the videos in any way, producing perfect backups.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0273fxgf4r832y9s0p8hqdj1j1nj8nlz4hylya0b4nsif89yfrhp"))))
+                "1rh4sz1bmrsxyxfxajsffw5jd17djcrymhwsi877v02fgln027qr"))))
     (build-system cmake-build-system)
     ;; SVT-AV1 only supports Intel-compatible CPUs.
     (supported-systems '("x86_64-linux" "i686-linux"))
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 371104cf22..e0b9a21e72 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -312,34 +312,34 @@ server and embedded PowerPC, and S390 guests.")
      (substitute-keyword-arguments (package-arguments qemu)
        ((#:configure-flags _ '(list))
         ;; Restrict to the host's architecture.
-        (let ((arch (car (string-split (or (%current-target-system)
-                                           (%current-system))
-                                       #\-))))
-          (cond ((string=? arch "i686")
-                 '(list "--target-list=i386-softmmu"))
-                ((string-prefix? "x86_64" arch)
-                 '(list "--target-list=i386-softmmu,x86_64-softmmu"))
-                ((string-prefix? "mips64" arch)
-                 '(list (string-append "--target-list=mips-softmmu,mipsel-softmmu,"
-                                       "mips64-softmmu,mips64el-softmmu")))
-                ((string-prefix? "mips" arch)
-                 '(list "--target-list=mips-softmmu,mipsel-softmmu"))
-                ((string-prefix? "aarch64" arch)
-                 '(list "--target-list=arm-softmmu,aarch64-softmmu"))
-                ((string-prefix? "arm" arch)
-                 '(list "--target-list=arm-softmmu"))
-                ((string-prefix? "alpha" arch)
-                 '(list "--target-list=alpha-softmmu"))
-                ((string-prefix? "powerpc64" arch)
-                 '(list "--target-list=ppc-softmmu,ppc64-softmmu"))
-                ((string-prefix? "powerpc" arch)
-                 '(list "--target-list=ppc-softmmu"))
-                ((string-prefix? "s390" arch)
-                 '(list "--target-list=s390x-softmmu"))
-                ((string-prefix? "riscv" arch)
-                 '(list "--target-list=riscv32-softmmu,riscv64-softmmu"))
-                (else   ; An empty list actually builds all the targets.
-                  ''()))))))
+        (match (car (string-split (or (%current-target-system)
+                                      (%current-system))
+                                  #\-))
+          ("i686"
+           '(list "--target-list=i386-softmmu"))
+          ("x86_64"
+           '(list "--target-list=i386-softmmu,x86_64-softmmu"))
+          ("mips64"
+           '(list (string-append "--target-list=mips-softmmu,mipsel-softmmu,"
+                                 "mips64-softmmu,mips64el-softmmu")))
+          ("mips"
+           '(list "--target-list=mips-softmmu,mipsel-softmmu"))
+          ("aarch64"
+           '(list "--target-list=arm-softmmu,aarch64-softmmu"))
+          ("arm"
+           '(list "--target-list=arm-softmmu"))
+          ("alpha"
+           '(list "--target-list=alpha-softmmu"))
+          ("powerpc64"
+           '(list "--target-list=ppc-softmmu,ppc64-softmmu"))
+          ("powerpc"
+           '(list "--target-list=ppc-softmmu"))
+          ("s390"
+           '(list "--target-list=s390x-softmmu"))
+          ("riscv"
+           '(list "--target-list=riscv32-softmmu,riscv64-softmmu"))
+          (else   ; An empty list actually builds all the targets.
+            ''())))))
 
     ;; Remove dependencies on optional libraries, notably GUI libraries.
     (native-inputs (fold alist-delete (package-native-inputs qemu)
@@ -745,14 +745,14 @@ domains, their live performance and resource utilization statistics.")
 (define-public criu
   (package
     (name "criu")
-    (version "3.13")
+    (version "3.14")
     (source (origin
               (method url-fetch)
-              (uri (string-append "http://download.openvz.org/criu/criu-"
+              (uri (string-append "https://download.openvz.org/criu/criu-"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "1yn9ix9lqvqvjrs3a3g6g1wqfniyf9n7giy0mr3jvijmrcm7y0pa"))))
+                "1jrr3v99g18gc0hriz0avq6ccdvyya0j6wwz888sdsc4icc30gzn"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index 369d3200c1..da881493bf 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -247,13 +247,13 @@ the user specifically asks to proxy, so the @dfn{VPN} interface no longer
 (define-public openconnect
   (package
    (name "openconnect")
-   (version "8.09")
+   (version "8.10")
    (source (origin
             (method url-fetch)
             (uri (string-append "ftp://ftp.infradead.org/pub/openconnect/"
                                 "openconnect-" version ".tar.gz"))
             (sha256
-             (base32 "19p91hs6j348qp0v9c7abl3rb8d9ncc37k743qhrn29s9jz0567k"))))
+             (base32 "1cdsx4nsrwawbsisfkldfc9i4qn60g03vxb13nzppr2br9p4rrih"))))
    (build-system gnu-build-system)
    (propagated-inputs
     `(("libxml2" ,libxml2)
@@ -282,7 +282,7 @@ and probably others.")
 (define-public openvpn
   (package
     (name "openvpn")
-    (version "2.4.8")
+    (version "2.4.9")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -290,7 +290,7 @@ and probably others.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "149z3agjy03i66mcj5bplim2mh45s2ps1wmxbxczyzw0nxmsd37v"))))
+                "1qpbllwlha7cffsd5dlddb8rl22g9rar5zflkz1wrcllhvfkl7v4"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags '("--enable-iproute2=yes")))
diff --git a/gnu/packages/web-browsers.scm b/gnu/packages/web-browsers.scm
index 62b7a5bdca..b61ed7f3ca 100644
--- a/gnu/packages/web-browsers.scm
+++ b/gnu/packages/web-browsers.scm
@@ -11,6 +11,7 @@
 ;;; Copyright © 2019 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2019 Brett Gilio <brettg@gnu.org>
 ;;; Copyright © 2020 Raghav Gururajan <raghavgururajan@disroot.org>
+;;; Copyright © 2020 B. Wilson <elaexuotee@wilsonb.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -66,7 +67,8 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system python)
-  #:use-module (guix build-system asdf))
+  #:use-module (guix build-system asdf)
+  #:use-module (guix build-system go))
 
 (define-public midori
   (package
@@ -692,3 +694,46 @@ key-bindings and is fully configurable and extensible in Common Lisp.")
 
 (define-public sbcl-next
   (deprecated-package "sbcl-next" next))
+
+(define-public bombadillo
+  (package
+    (name "bombadillo")
+    (version "2.2.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://tildegit.org/sloum/bombadillo")
+                    (commit version)))
+              (sha256
+               (base32
+                "1m52b1wk48gkqmjy8l0x3jaksrx2v8w6w59lhr7zaw2i0n4f5k0z"))
+              (file-name (git-file-name name version))))
+    (build-system go-build-system)
+    (arguments
+     `(#:import-path "tildegit.org/sloum/bombadillo"
+       #:install-source? #f
+       #:phases (modify-phases %standard-phases
+                  (add-after 'install 'install-data
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let* ((builddir "src/tildegit.org/sloum/bombadillo")
+                             (out (assoc-ref outputs "out"))
+                             (pkg (strip-store-file-name out))
+                             (sharedir (string-append out "/share"))
+                             (appdir (string-append sharedir "/applications"))
+                             (docdir (string-append sharedir "/doc/" pkg))
+                             (mandir (string-append sharedir "/man/man1"))
+                             (pixdir (string-append sharedir "/pixmaps")))
+                        (with-directory-excursion builddir
+                          (install-file "bombadillo.desktop" appdir)
+                          (install-file "LICENSE" docdir)
+                          (install-file "bombadillo.1" mandir)
+                          (install-file "bombadillo-icon.png" pixdir)
+                          #t)))))))
+    (home-page "http://bombadillo.colorfield.space")
+    (synopsis "Terminal browser for the gopher, gemini, and finger protocols")
+    (description "Bombadillo is a non-web browser for the terminal with
+vim-like key bindings, a document pager, configurable settings, and robust
+command selection.  The following protocols are supported as first-class
+citizens: gopher, gemini, finger, and local.  There is also support for telnet,
+http, and https via third-party applications.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 1ccab7777b..da0e1a525a 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -123,9 +123,11 @@
   #:use-module (gnu packages libunwind)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages lisp-xyz)
+  #:use-module (gnu packages lsof)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages markup)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages networking)
   #:use-module (gnu packages nss)
   #:use-module (gnu packages openldap)
   #:use-module (gnu packages openstack)
@@ -3731,6 +3733,35 @@ possibly-temporary error (like a DNS lookup timeout), it'll wait a few seconds
 and retry a few times.")
     (license license:perl-license)))
 
+(define-public perl-lwpx-paranoidagent
+  (package
+    (name "perl-lwpx-paranoidagent")
+    (version "1.12")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append
+            "mirror://cpan/authors/id/S/SA/SAXJAZMAN/lwp/LWPx-ParanoidAgent-"
+            version ".tar.gz"))
+      (sha256
+       (base32
+        "0gfhw3jbs25yya2dryv8xvyn9myngcfcmsybj7gkq62fnznil16c"))))
+    (build-system perl-build-system)
+    (propagated-inputs
+     `(("perl-libwww" ,perl-libwww)
+       ;; Users should instead make sure SSL_ca_path is set properly.
+       ;; ("perl-mozilla-ca" ,perl-mozilla-ca)
+       ("perl-net-dns" ,perl-net-dns)))
+    (home-page "https://metacpan.org/release/LWPx-ParanoidAgent")
+    (synopsis "Security enhanced subclass of LWP::UserAgent")
+    (description "@code{LWPx::ParanoidAgent} is a class subclassing
+@code{LWP::UserAgent} but paranoid against attackers.  Its purpose is
+to vet requests for a remote resource on behalf of a possibly
+malicious user.  The class can do the same as @code{LWP::UserAgent},
+except that proxy support has been removed.  Support for URI schemes
+is limited to http and https.")
+    (license license:perl-license)))
+
 (define-public perl-net-amazon-s3
   (package
     (name "perl-net-amazon-s3")
@@ -4653,15 +4684,14 @@ you'd expect.")
 (define-public uhttpmock
   (package
     (name "uhttpmock")
-    (version "0.5.1")
+    (version "0.5.2")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "http://tecnocode.co.uk/downloads/uhttpmock/"
-                           name "-" version ".tar.xz"))
+                           "uhttpmock-" version ".tar.xz"))
        (sha256
-        (base32
-         "163py4klka423x7li2b685gmg3a6hjf074mlff2ajhmi3l0lm8x6"))))
+        (base32 "0glyx07kxc3s3cx5vp30kfgscl9q6bghcq1zysfyxm24r0h6j58p"))))
     (build-system glib-or-gtk-build-system)
     (native-inputs
      `(("gobject-introspection" ,gobject-introspection)
@@ -4859,6 +4889,13 @@ NetSurf project.")
              (invoke "find"  "doc" "underlays" "-type" "f" "-exec"
                      "touch" "{}" "+")
              #t))
+         (add-before 'check 'pre-check
+           ;; XDG_DATA_DIRS is needed by the podcast.t test.
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "XDG_DATA_DIRS"
+                     (string-append (assoc-ref inputs "shared-mime-info")
+                                    "/share"))
+             #t))
          (add-after 'install 'wrap-programs
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out  (assoc-ref outputs "out"))
@@ -4887,8 +4924,10 @@ NetSurf project.")
        ("perl-file-mimeinfo" ,perl-file-mimeinfo)
        ("perl-html-tagset" ,perl-html-tagset)
        ("perl-image-magick" ,perl-image-magick)
+       ("perl-lwpx-paranoidagent" ,perl-lwpx-paranoidagent)
        ("perl-mail-sendmail" ,perl-mail-sendmail)
        ("perl-timedate" ,perl-timedate)
+       ("perl-xml-feed" ,perl-xml-feed)
        ("perl-xml-sax" ,perl-xml-sax)
        ("perl-xml-simple" ,perl-xml-simple)
        ("perl-xml-twig" ,perl-xml-twig)
@@ -5450,6 +5489,60 @@ HTTP statistics for system administrators that require a visual server report
 on the fly.")
     (license license:x11)))
 
+(define-public hitch
+  (package
+    (name "hitch")
+    (version "1.5.2")
+    (home-page "https://hitch-tls.org/")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append home-page "source/hitch-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1nnzqqigfw78nqhp81a72x1s8d6v49ayw4w5df0zzm2cb1jgv95i"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-before 'check 'pre-check
+                    (lambda _
+                      ;; Most tests attempts to access hitch-tls.org which is
+                      ;; unavailable in the build container.  Run them against
+                      ;; a dummy local web server instead.
+                      (for-each (lambda (test)
+                                  (substitute* test
+                                    (("\\[hitch-tls\\.org\\]:80")
+                                     "[localhost]:8000")))
+                                (find-files "src/tests" "\\.sh$"))
+                      (system "python3 -m http.server &")
+
+                      ;; The build container does not reap zombie processes,
+                      ;; causing stop_hitch to hang indefinitely while waiting
+                      ;; for the process to terminate because 'kill -0' never
+                      ;; succeeds.  Use a different test to see whether the
+                      ;; process has shut down.
+                      (substitute* "src/tests/hitch_test.sh"
+                        (("kill -0 \"\\$HITCH_PID\"")
+                         "$(ps -p $HITCH_PID -o state= | grep -qv '^Z$')"))
+                      #t)))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+
+       ;; For tests.
+       ("curl" ,curl)
+       ("egrep" ,grep)
+       ("lsof" ,lsof)
+       ("python" ,python)))
+    (inputs
+     `(("libev" ,libev)
+       ("openssl" ,openssl)))
+    (synopsis "Scalable TLS proxy")
+    (description
+     "Hitch is a performant TLS proxy based on @code{libev}.  It terminates
+SSL/TLS connections and forwards the unencrypted traffic to a backend such
+as a web server.  It is designed to handle many thousand connections on
+multicore machines.")
+    (license license:bsd-2)))
+
 (define-public httptunnel
   (package
     (name "httptunnel")
@@ -5613,15 +5706,15 @@ configuration language.")
   (package
     (name "varnish-modules")
     (home-page "https://github.com/varnish/varnish-modules")
-    (version "0.15.0")
+    (version "0.16.0")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://download.varnish-software.com"
-                                  "/varnish-modules/varnish-modules-"
-                                  version ".tar.gz"))
+              (uri (string-append "https://github.com/varnish/varnish-modules"
+                                  "/releases/download/varnish-modules-" version
+                                  "/varnish-modules-" version ".tar.gz"))
               (sha256
                (base32
-                "09li9lqa1kb275w1rby2zldyg8r9cfcl4qyv53qyd9xbzilrz751"))))
+                "1ph5bplsip4rycql1c2hgbvmrwbgcrgv2ldgfp7saxxbsv5cpcds"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -5631,7 +5724,7 @@ configuration language.")
     (synopsis "Collection of Varnish modules")
     (description
      "This package provides a collection of modules (@dfn{vmods}) for the Varnish
-cache server, extending the @dfn{Varnish Configuration Language} (VCL) with
+cache server, extending the @acronym{VCL, Varnish Configuration Language} with
 additional capabilities.")
     (license license:bsd-2)))
 
@@ -5838,30 +5931,30 @@ into your tests.  It automatically starts up a HTTP server in a separate thread
 (define-public http-parser
   (package
     (name "http-parser")
-    (version "2.9.3")
+    (version "2.9.4")
     (home-page "https://github.com/nodejs/http-parser")
-    (source (origin
-              (method git-fetch)
-              (uri (git-reference (url home-page)
-                                  (commit (string-append "v" version))))
-              (file-name (git-file-name name version))
-              (patches
-               ;; When parsing URLs, treat an empty port (eg
-               ;; `http://hostname:/`) as if it were unspecified.  This patch is
-               ;; applied to Fedora's http-parser and to libgit2's bundled version.
-               (list
-                (origin
-                  (method url-fetch)
-                  (uri (string-append
-                         "https://src.fedoraproject.org/rpms/http-parser/raw/"
-                         "e89b4c4e2874c19079a5a1a2d2ccc61b551aa289/"
-                         "f/0001-url-treat-empty-port-as-default.patch"))
-                  (sha256
-                   (base32
-                    "0pbxf2nq9pcn299k2b2ls8ldghaqln9glnp79gi57mamx4iy0f6g")))))
-              (sha256
-               (base32
-                "189zi61vczqgmqjd2myjcjbbi5icrk7ccs0kn6nj8hxqiv5j3811"))))
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference (url home-page)
+                           (commit (string-append "v" version))))
+       (sha256
+        (base32 "1vda4dp75pjf5fcph73sy0ifm3xrssrmf927qd1x8g3q46z0cv6c"))
+       (file-name (git-file-name name version))
+       (patches
+        (list
+         (origin
+           ;; Treat an empty port (e.g. `http://hostname:/`) when parsing
+           ;; URLs as if no port were specified.  This patch is applied
+           ;; to Fedora's http-parser and to libgit2's bundled version.
+           (method url-fetch)
+           (uri (string-append
+                 "https://src.fedoraproject.org/rpms/http-parser/raw/"
+                 "e89b4c4e2874c19079a5a1a2d2ccc61b551aa289/"
+                 "f/0001-url-treat-empty-port-as-default.patch"))
+           (sha256
+            (base32
+             "0pbxf2nq9pcn299k2b2ls8ldghaqln9glnp79gi57mamx4iy0f6g")))))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
@@ -5874,6 +5967,14 @@ into your tests.  It automatically starts up a HTTP server in a separate thread
                    '("CC=gcc")))
        #:phases
        (modify-phases %standard-phases
+         ,@(match (%current-system)
+             ("armhf-linux"
+              '((add-before 'check 'apply-assertion.patch
+                  (lambda* (#:key inputs #:allow-other-keys)
+                    (let ((patch (assoc-ref inputs "assertion.patch")))
+                      (invoke "patch" "-p1" "-i" patch)
+                      #t)))))
+             (_ '()))
          ,@(if (%current-target-system)
                '((replace 'configure
                     (lambda* (#:key target #:allow-other-keys)
@@ -5884,6 +5985,14 @@ into your tests.  It automatically starts up a HTTP server in a separate thread
                          (string-append "AR=" target "-ar\n")))
                       #t)))
                '((delete 'configure))))))
+    (native-inputs
+     `(,@(match (%current-system)
+           ("armhf-linux"
+            ;; A fix for <https://issues.guix.gnu.org/40604> which in turn
+            ;; breaks i686-linux builds.
+            `(("assertion.patch"
+               ,@(search-patches "http-parser-fix-assertion-on-armhf.patch"))))
+           (_ '()))))
     (synopsis "HTTP request/response parser for C")
     (description "This is a parser for HTTP messages written in C.  It parses
 both requests and responses.  The parser is designed to be used in
diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm
index 86e0337884..aeec63a1b9 100644
--- a/gnu/packages/wine.scm
+++ b/gnu/packages/wine.scm
@@ -328,7 +328,7 @@ integrate Windows applications into your desktop.")
 (define-public wine-staging-patchset-data
   (package
     (name "wine-staging-patchset-data")
-    (version "5.6")
+    (version "5.8")
     (source
      (origin
        (method git-fetch)
@@ -337,7 +337,7 @@ integrate Windows applications into your desktop.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1i9yiwbyxl0vshc4gbgnhp53m1ray8pkiii876gbiaf93k1irk0d"))))
+        (base32 "07i11alcymkfj1vgadcxd6khvjk1ay0x2dddwrvnc4gag9lvkddr"))))
     (build-system trivial-build-system)
     (native-inputs
      `(("bash" ,bash)
@@ -387,7 +387,7 @@ integrate Windows applications into your desktop.")
                "/wine-" version ".tar.xz")))
        (file-name (string-append name "-" version ".tar.xz"))
        (sha256
-        (base32 "1rh0pk8mbi3bb0di13swzxn7nwnrbfsfizdv472vv3ymf5z8l6ah"))))
+        (base32 "1krk68lsfvisi0zpx7890cz0z5bp7jl7rka5d70vwyj3c7109bfb"))))
     (inputs `(("autoconf" ,autoconf)    ; for autoreconf
               ("ffmpeg" ,ffmpeg)
               ("gtk+" ,gtk+)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index a29a7d9764..1151b8115d 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2016 Al McElrath <hello@yrns.org>
 ;;; Copyright © 2016 Carlo Zancanaro <carlo@zancanaro.id.au>
 ;;; Copyright © 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016, 2017, 2018 Nikita <nikita@n0.is>
+;;; Copyright © 2016, 2017, 2018, 2020 Nikita <nikita@n0.is>
 ;;; Copyright © 2016 doncatnip <gnopap@gmail.com>
 ;;; Copyright © 2016 Ivan Vilata i Balaguer <ivan@selidor.net>
 ;;; Copyright © 2017 Mekeor Melire <mekeor.melire@gmail.com>
@@ -1176,15 +1176,15 @@ It is inspired by Xmonad and dwm.  Its major features include:
 (define-public cwm
   (package
     (name "cwm")
-    (version "6.3")
+    (version "6.6")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "http://chneukirchen.org/releases/cwm-"
+       (uri (string-append "https://leahneukirchen.org/releases/cwm-"
                            version ".tar.gz"))
        (sha256
         (base32
-         "17pdp9cfgh2n3n3905l4rl9qk7b722i8psnarhlc2h98qzx7zmac"))))
+         "0p350pbfn92m21jiq4i324sdskxhs71p435g0mgz7cmzprnhhg92"))))
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags (list "CC=gcc"
@@ -1219,7 +1219,7 @@ It is inspired by Xmonad and dwm.  Its major features include:
     (native-inputs
      `(("pkg-config" ,pkg-config)
        ("bison" ,bison)))
-    (home-page "https://github.com/chneukirchen/cwm")
+    (home-page "https://github.com/leahneukirchen/cwm")
     (synopsis "OpenBSD fork of the calmwm window manager")
     (description "Cwm is a stacking window manager for X11.  It is an OpenBSD
 project derived from the original Calm Window Manager.")
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index 256b86a39a..88719775df 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -58,6 +58,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix hg-download)
   #:use-module (guix utils)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
@@ -2358,3 +2359,31 @@ is to find @file{.desktop} files and offer you a menu to start an application
 using @command{dmenu}.")
     (home-page "https://github.com/enkore/j4-dmenu-desktop")
     (license license:gpl3+)))
+
+(define-public wofi
+  (package
+    (name "wofi")
+    (version "1.1.2")
+    (source (origin
+              (method hg-fetch)
+              (uri (hg-reference
+                    (url "https://hg.sr.ht/~scoopta/wofi")
+                    (changeset (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "086j5wshawjbwdmmmldivfagc2rr7g5a2gk11l0snqqslm294xsn"))))
+    (build-system meson-build-system)
+    (arguments
+     `(#:glib-or-gtk? #t))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("gtk3" ,gtk+)
+       ("wayland" ,wayland)))
+    (synopsis "Launcher/menu program for wayland")
+    (description
+     "Wofi is a launcher/menu program for wlroots based wayland compositors
+such as sway, similar to @command{rofi}.")
+    (home-page "https://hg.sr.ht/~scoopta/wofi")
+    (license license:gpl3+)))
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index 61b64ef553..7a6784b928 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -120,15 +120,15 @@ Xfce Desktop Environment.")
 (define-public xfconf
   (package
     (name "xfconf")
-    (version "4.14.1")
+    (version "4.14.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
-                                  name "/" (version-major+minor version) "/"
-                                  name "-" version ".tar.bz2"))
+                                  "xfconf/" (version-major+minor version) "/"
+                                  "xfconf-" version ".tar.bz2"))
               (sha256
                (base32
-                "0n8d55c98ff7wgwv3qa4g369sv4iasgm1w62zq10kq5f56iy14xq"))))
+                "00hcb96bw5ylfs9ppblchj8zv9026m3dlf7lnmgiq5f6xyh5542q"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -724,7 +724,7 @@ and import the new pictures from your camera.")
 (define-public xfwm4
   (package
     (name "xfwm4")
-    (version "4.14.1")
+    (version "4.14.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
@@ -732,7 +732,7 @@ and import the new pictures from your camera.")
                                   "xfwm4-" version ".tar.bz2"))
               (sha256
                (base32
-                "0a0la57jh618qfl7czsn7mspcraqczkm1m616j7jwxkhh2hq21qh"))))
+                "14pxiymg0hpg3yijbjv5w6259pra4rqq79b7a6mvd8wn4ls40nxi"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index 03daebb4a7..d9efd5264b 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -22,6 +22,7 @@
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2018 Jack Hill <jackhill@jackhill.us>
 ;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2020 Paul Garlick <pgarlick@tourbillion-technology.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -817,16 +818,17 @@ server, collect the answer, and finally decoding the XML to Perl.")
                (base32
                 "1z1a88bpy64j42bbyl8acbfl3dn9iaz47gx6clkgy5sbn4kr0kgk"))))
     (build-system perl-build-system)
-    (arguments
-     `(#:tests? #f))                    ; tests require internet connection
     (native-inputs
      `(("perl-module-build" ,perl-module-build)
        ("perl-uri" ,perl-uri)
        ("perl-class-data-inheritable" ,perl-class-data-inheritable)))
-    (inputs
+    (propagated-inputs
      `(("perl-class-errorhandler" ,perl-class-errorhandler)
        ("perl-datetime" ,perl-datetime)
+       ("perl-datetime-format-flexible" ,perl-datetime-format-flexible)
+       ("perl-datetime-format-iso8601" ,perl-datetime-format-iso8601)
        ("perl-datetime-format-mail" ,perl-datetime-format-mail)
+       ("perl-datetime-format-natural" ,perl-datetime-format-natural)
        ("perl-datetime-format-w3cdtf" ,perl-datetime-format-w3cdtf)
        ("perl-feed-find" ,perl-feed-find)
        ("perl-html-parser" ,perl-html-parser)
@@ -1101,7 +1103,7 @@ C++ programming language.")
 (define-public tinyxml2
   (package
     (name "tinyxml2")
-    (version "7.0.1")
+    (version "8.0.0")
     (source
      (origin
        (method git-fetch)
@@ -1110,7 +1112,7 @@ C++ programming language.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1sf6sch1kawrna2f9dc8f4xl836acqcddkghzdib0s7dl48m9r7m"))))
+        (base32 "0raa8r2hsagk7gjlqjwax95ib8d47ba79n91r4aws2zg8y6ssv1d"))))
     (build-system cmake-build-system)
     (synopsis "Small XML parser for C++")
     (description "TinyXML2 is a small and simple XML parsing library for the
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 25f2793fa1..9a7b856791 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -6615,15 +6615,15 @@ output.")
 (define-public console-setup
   (package
     (name "console-setup")
-    (version "1.194")
+    (version "1.195")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://salsa.debian.org/installer-team/console-setup.git")
-             (commit version)))
+             (commit "38512eb9a97f57ead1f87f6aee6df455f721c645"))) ; no tag
        (sha256
-        (base32 "0fkabv05j5dj10mfrpjyvv7lnxl9qaqkbjhwj72r18i9i4019vgh"))
+        (base32 "0d0xagigs5k3appzz5lzxdjncvnkgz4amz6ks7imiq8kkjixvmfy"))
        (file-name (git-file-name name version))))
     (build-system gnu-build-system)
     (arguments
@@ -6631,7 +6631,7 @@ output.")
        (let ((bash (assoc-ref %build-inputs "bash"))
              (out (assoc-ref %outputs "out")))
          (list (string-append "SHELL=" bash "/bin/bash")))
-       #:tests? #f                                ;no tests
+       #:tests? #f                      ; no tests
        #:phases
        (modify-phases %standard-phases
          (delete 'configure)
@@ -6665,10 +6665,10 @@ output.")
      `(("pkg-config" ,pkg-config)
        ("bdftopcf" ,bdftopcf)
        ("bdfresize" ,bdfresize)
-       ("sharutils" ,sharutils)                   ;for 'uuencode'
+       ("sharutils" ,sharutils)         ; for 'uuencode'
        ("perl" ,perl)))
     (inputs
-     `(("perl" ,perl)))                           ;used by 'ckbcomp'
+     `(("perl" ,perl)))                 ; used by 'ckbcomp'
     (synopsis "Set up the Linux console font and keyboard")
     (description
      "console-setup provides the console with the same keyboard
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index 826a3c2215..77c4d0a8be 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -146,7 +146,7 @@ DEFAULT is given, use it as the service's default value."
   ;; Default set of modules visible in a service's file.
   `((shepherd service)
     (oop goops)
-    (guix build utils)
+    ((guix build utils) #:hide (delete))
     (guix build syscalls)))
 
 (define-record-type* <shepherd-service>
@@ -315,7 +315,9 @@ and return the resulting '.go' file."
           (call-with-error-handling
             (lambda ()
               (apply register-services
-                     (map load-compiled '#$(map scm->go files)))))
+                     (parameterize ((current-warning-port
+                                     (%make-void-port "w")))
+                       (map load-compiled '#$(map scm->go files))))))
 
           (format #t "starting services...~%")
           (for-each (lambda (service)
diff --git a/gnu/system.scm b/gnu/system.scm
index cd75e4d4ba..d929187695 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -8,6 +8,7 @@
 ;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
 ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1102,19 +1103,23 @@ entry."
 (define* (operating-system-bootcfg os #:optional (old-entries '()))
   "Return the bootloader configuration file for OS.  Use OLD-ENTRIES,
 a list of <menu-entry>, to populate the \"old entries\" menu."
-  (let* ((root-fs         (operating-system-root-file-system os))
+  (let* ((file-systems    (operating-system-file-systems os))
+         (root-fs         (operating-system-root-file-system os))
          (root-device     (file-system-device root-fs))
          (params          (operating-system-boot-parameters
                            os root-device
                            #:system-kernel-arguments? #t))
          (entry           (boot-parameters->menu-entry params))
          (bootloader-conf (operating-system-bootloader os)))
+
     (define generate-config-file
       (bootloader-configuration-file-generator
        (bootloader-configuration-bootloader bootloader-conf)))
 
     (generate-config-file bootloader-conf (list entry)
-                          #:old-entries old-entries)))
+                          #:old-entries old-entries
+                          #:btrfs-subvolume-file-name
+			  (btrfs-store-subvolume-file-name file-systems))))
 
 (define* (operating-system-boot-parameters os root-device
                                            #:key system-kernel-arguments?)
diff --git a/gnu/system/file-systems.scm b/gnu/system/file-systems.scm
index b41f66e943..0f94577760 100644
--- a/gnu/system/file-systems.scm
+++ b/gnu/system/file-systems.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,7 +22,10 @@
   #:use-module (ice-9 match)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
   #:use-module (srfi srfi-9)
+  #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-35)
   #:use-module (srfi srfi-9 gnu)
   #:use-module (guix records)
   #:use-module (gnu system uuid)
@@ -38,6 +42,9 @@
             file-system-needed-for-boot?
             file-system-flags
             file-system-options
+            file-system-options->alist
+            alist->file-system-options
+
             file-system-mount?
             file-system-check?
             file-system-create-mount-point?
@@ -45,6 +52,8 @@
             file-system-location
 
             file-system-type-predicate
+            btrfs-subvolume?
+            btrfs-store-subvolume-file-name
 
             file-system-label
             file-system-label?
@@ -251,6 +260,33 @@ UUID-TYPE, a symbol such as 'dce or 'iso9660."
     ((? string?)
      device)))
 
+(define (file-system-options->alist string)
+  "Translate the option string format of a <file-system> record into an
+association list of options or option/value pairs."
+  (if string
+      (let ((options (string-split string #\,)))
+        (map (lambda (param)
+               (let ((=index (string-index param #\=)))
+                 (if =index
+                     (cons (string-take param =index)
+                           (string-drop param (1+ =index)))
+                     param)))
+             options))
+      '()))
+
+(define (alist->file-system-options options)
+  "Return the string representation of OPTIONS, an association list.  The
+string obtained can be used as the option field of a <file-system> record."
+  (if (null? options)
+      #f
+      (string-join (map (match-lambda
+                          ((key . value)
+                           (string-append key "=" value))
+                          (key
+                           key))
+                        options)
+                   ",")))
+
 (define (file-system-needed-for-boot? fs)
   "Return true if FS has the 'needed-for-boot?' flag set, or if it holds the
 store--e.g., if FS is the root file system."
@@ -535,4 +571,54 @@ system has the given TYPE."
   (lambda (fs)
     (string=? (file-system-type fs) type)))
 
+
+;;;
+;;; Btrfs specific helpers.
+;;;
+
+(define (btrfs-subvolume? fs)
+  "Predicate to check if FS, a file-system object, is a Btrfs subvolume."
+  (and-let* ((btrfs-file-system? (string= "btrfs" (file-system-type fs)))
+             (option-keys (map (match-lambda
+                                 ((key . value) key)
+                                 (key key))
+                               (file-system-options->alist
+                                (file-system-options fs)))))
+    (find (cut string-prefix? "subvol" <>) option-keys)))
+
+(define (btrfs-store-subvolume-file-name file-systems)
+  "Return the subvolume file name within the Btrfs top level onto which the
+store is located, else #f."
+
+  (define (prepend-slash/maybe s)
+    (if (string=? "/" (string-take s 1))
+        s
+        (string-append "/" s)))
+
+  (define (file-name-depth file-name)
+    (length (string-tokenize file-name %not-slash)))
+
+  (and-let* ((btrfs-subvolume-fs (filter btrfs-subvolume? file-systems))
+             (btrfs-subvolume-fs*
+              (sort btrfs-subvolume-fs
+                    (lambda (fs1 fs2)
+                      (> (file-name-depth (file-system-mount-point fs1))
+                         (file-name-depth (file-system-mount-point fs2))))))
+             (store-subvolume-fs
+              (find (lambda (fs) (file-prefix? (file-system-mount-point fs)
+                                               (%store-prefix)))
+                    btrfs-subvolume-fs*))
+             (options (file-system-options->alist
+                       (file-system-options store-subvolume-fs))))
+    ;; XXX: Deriving the subvolume name based from a subvolume ID is not
+    ;; supported, as we'd need to query the actual file system.
+    (or (and=> (assoc-ref options "subvol") prepend-slash/maybe)
+        ;; FIXME: Use &fix-hint once it no longer pulls in (guix utils).
+        (raise (condition
+                (&message
+                 (message "The store is on a Btrfs subvolume, but the \
+subvolume name is unknown.
+Hint: Use the \"subvol\" Btrfs file system option.")))))))
+
+
 ;;; file-systems.scm ends here
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index c43d53a210..0971ec29e2 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2017, 2019 Mathieu Othacehe <m.othacehe@gmail.com>
@@ -197,7 +197,7 @@ upon error."
      #~(begin
          (use-modules (gnu build linux-boot)
                       (gnu system file-systems)
-                      (guix build utils)
+                      ((guix build utils) #:hide (delete))
                       (guix build bournish)   ;add the 'bournish' meta-command
                       (srfi srfi-26)
 
@@ -213,18 +213,19 @@ upon error."
              (set-path-environment-variable "PATH" '("bin" "sbin")
                                             '#$helper-packages)))
 
-         (boot-system #:mounts
-                      (map spec->file-system
-                           '#$(map file-system->spec file-systems))
-                      #:pre-mount (lambda ()
-                                    (and #$@device-mapping-commands))
-                      #:linux-modules '#$linux-modules
-                      #:linux-module-directory '#$kodir
-                      #:keymap-file #+(and=> keyboard-layout
-                                             keyboard-layout->console-keymap)
-                      #:qemu-guest-networking? #$qemu-networking?
-                      #:volatile-root? '#$volatile-root?
-                      #:on-error '#$on-error)))
+         (parameterize ((current-warning-port (%make-void-port "w")))
+           (boot-system #:mounts
+                        (map spec->file-system
+                             '#$(map file-system->spec file-systems))
+                        #:pre-mount (lambda ()
+                                      (and #$@device-mapping-commands))
+                        #:linux-modules '#$linux-modules
+                        #:linux-module-directory '#$kodir
+                        #:keymap-file #+(and=> keyboard-layout
+                                               keyboard-layout->console-keymap)
+                        #:qemu-guest-networking? #$qemu-networking?
+                        #:volatile-root? '#$volatile-root?
+                        #:on-error '#$on-error))))
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 163e8b4e9c..3e483fd86c 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -199,6 +199,10 @@ substitutable."
                       (sync)
                       (reboot))))
 
+  (define-syntax-rule (check predicate)
+    (let-system (system target)
+      (predicate (or target system))))
+
   (let ((initrd (or initrd
                     (base-initrd file-systems
                                  #:on-error 'backtrace
@@ -229,7 +233,8 @@ substitutable."
                      (graphs  '#$(match references-graphs
                                    (((graph-files . _) ...) graph-files)
                                    (_ #f)))
-                     (target  #$(or (%current-target-system) (%current-system)))
+                     (target  #$(let-system (system target)
+                                  (or target system)))
                      (size    #$(if (eq? 'guess disk-image-size)
                                     #~(+ (* 70 (expt 2 20)) ;ESP
                                          (estimated-partition-size graphs))
@@ -244,12 +249,8 @@ substitutable."
                                   #:memory-size #$memory-size
                                   #:make-disk-image? #$make-disk-image?
                                   #:single-file-output? #$single-file-output?
-                                  ;; FIXME: ‘target-arm32?’ and
-                                  ;; ‘target-aarch64?’ may not operate on the
-                                  ;; right system/target values.  Rewrite
-                                  ;; using ‘let-system’ when available.
-                                  #:target-arm32? #$(target-arm32?)
-                                  #:target-aarch64? #$(target-aarch64?)
+                                  #:target-arm32? #$(check target-arm32?)
+                                  #:target-aarch64? #$(check target-aarch64?)
                                   #:disk-image-format #$disk-image-format
                                   #:disk-image-size size
                                   #:references-graphs graphs))))))
diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm
index 94d970e1cc..cea26c8ef3 100644
--- a/gnu/tests/install.scm
+++ b/gnu/tests/install.scm
@@ -61,6 +61,7 @@
             %test-raid-root-os
             %test-encrypted-root-os
             %test-btrfs-root-os
+            %test-btrfs-root-on-subvolume-os
             %test-jfs-root-os
             %test-f2fs-root-os
 
@@ -865,6 +866,99 @@ build (current-guix) and then store a couple of full system images.")
 
 
 ;;;
+;;; Btrfs root file system on a subvolume.
+;;;
+
+(define-os-with-source (%btrfs-root-on-subvolume-os
+                        %btrfs-root-on-subvolume-os-source)
+  ;; The OS we want to install.
+  (use-modules (gnu) (gnu tests) (srfi srfi-1))
+
+  (operating-system
+    (host-name "hurd")
+    (timezone "America/Montreal")
+    (locale "en_US.UTF-8")
+    (bootloader (bootloader-configuration
+                 (bootloader grub-bootloader)
+                 (target "/dev/vdb")))
+    (kernel-arguments '("console=ttyS0"))
+    (file-systems (cons* (file-system
+                           (device (file-system-label "btrfs-pool"))
+                           (mount-point "/")
+                           (options "subvol=rootfs,compress=zstd")
+                           (type "btrfs"))
+                         (file-system
+                           (device (file-system-label "btrfs-pool"))
+                           (mount-point "/home")
+                           (options "subvol=homefs,compress=lzo")
+                           (type "btrfs"))
+                         %base-file-systems))
+    (users (cons (user-account
+                  (name "charlie")
+                  (group "users")
+                  (supplementary-groups '("wheel" "audio" "video")))
+                 %base-user-accounts))
+    (services (cons (service marionette-service-type
+                             (marionette-configuration
+                              (imported-modules '((gnu services herd)
+                                                  (guix combinators)))))
+                    %base-services))))
+
+(define %btrfs-root-on-subvolume-installation-script
+  ;; Shell script of a simple installation.
+  "\
+. /etc/profile
+set -e -x
+guix --version
+
+export GUIX_BUILD_OPTIONS=--no-grafts
+ls -l /run/current-system/gc-roots
+parted --script /dev/vdb mklabel gpt \\
+  mkpart primary ext2 1M 3M \\
+  mkpart primary ext2 3M 2G \\
+  set 1 boot on \\
+  set 1 bios_grub on
+
+# Setup the top level Btrfs file system with its subvolume.
+mkfs.btrfs -L btrfs-pool /dev/vdb2
+mount /dev/vdb2 /mnt
+btrfs subvolume create /mnt/rootfs
+btrfs subvolume create /mnt/homefs
+umount /dev/vdb2
+
+# Mount the subvolumes, ready for installation.
+mount LABEL=btrfs-pool -o 'subvol=rootfs,compress=zstd' /mnt
+mkdir /mnt/home
+mount LABEL=btrfs-pool -o 'subvol=homefs,compress=zstd' /mnt/home
+
+herd start cow-store /mnt
+mkdir /mnt/etc
+cp /etc/target-config.scm /mnt/etc/config.scm
+guix system build /mnt/etc/config.scm
+guix system init /mnt/etc/config.scm /mnt --no-substitutes
+sync
+reboot\n")
+
+(define %test-btrfs-root-on-subvolume-os
+  (system-test
+   (name "btrfs-root-on-subvolume-os")
+   (description
+    "Test basic functionality of an OS installed like one would do by hand.
+This test is expensive in terms of CPU and storage usage since we need to
+build (current-guix) and then store a couple of full system images.")
+   (value
+    (mlet* %store-monad
+        ((image
+          (run-install %btrfs-root-on-subvolume-os
+                       %btrfs-root-on-subvolume-os-source
+                       #:script
+                       %btrfs-root-on-subvolume-installation-script))
+         (command (qemu-command/writable-image image)))
+      (run-basic-test %btrfs-root-on-subvolume-os command
+                      "btrfs-root-on-subvolume-os")))))
+
+
+;;;
 ;;; JFS root file system.
 ;;;
 
diff --git a/guix/build-system/asdf.scm b/guix/build-system/asdf.scm
index f794bf006b..630b99e2bf 100644
--- a/guix/build-system/asdf.scm
+++ b/guix/build-system/asdf.scm
@@ -230,7 +230,10 @@ set up using CL source package conventions."
              ((#:phases phases) (list phases-transformer phases))))
           (inputs (new-inputs package-inputs))
           (propagated-inputs (new-propagated-inputs))
-          (native-inputs (new-inputs package-native-inputs))
+          (native-inputs (append (if target-is-source?
+                                     (list (list (package-name pkg) pkg))
+                                     '())
+                                 (new-inputs package-native-inputs)))
           (outputs (if target-is-source?
                        '("out")
                        (package-outputs pkg)))))
diff --git a/guix/build-system/guile.scm b/guix/build-system/guile.scm
index 3693014694..45e735b987 100644
--- a/guix/build-system/guile.scm
+++ b/guix/build-system/guile.scm
@@ -29,6 +29,10 @@
   #:export (%guile-build-system-modules
             guile-build-system))
 
+(define %scheme-file-regexp
+  ;; Regexp to match Scheme files.
+  "\\.(scm|sls)$")
+
 (define %guile-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build guile-build-system)
@@ -80,6 +84,7 @@
                       (system (%current-system))
                       (source-directory ".")
                       not-compiled-file-regexp
+                      (scheme-file-regexp %scheme-file-regexp)
                       (compile-flags %compile-flags)
                       (imported-modules %guile-build-system-modules)
                       (modules '((guix build guile-build-system)
@@ -97,6 +102,7 @@
                                 (source
                                  source))
                     #:source-directory ,source-directory
+                    #:scheme-file-regexp ,scheme-file-regexp
                     #:not-compiled-file-regexp ,not-compiled-file-regexp
                     #:compile-flags ,compile-flags
                     #:phases ,phases
diff --git a/guix/build/asdf-build-system.scm b/guix/build/asdf-build-system.scm
index f3f4b49bcf..25dd031962 100644
--- a/guix/build/asdf-build-system.scm
+++ b/guix/build/asdf-build-system.scm
@@ -85,7 +85,8 @@ valid."
     ;; files before compiling.
     (for-each (lambda (file)
                 (let ((s (lstat file)))
-                  (unless (eq? (stat:type s) 'symlink)
+                  (unless (or (eq? (stat:type s) 'symlink)
+                              (not (access? file W_OK)))
                     (utime file 0 0 0 0))))
               (find-files source #:directories? #t))
     (copy-recursively source target #:keep-mtime? #t)
@@ -97,12 +98,53 @@ valid."
      (find-files target "\\.asd$"))
     #t))
 
-(define* (install #:key outputs #:allow-other-keys)
-  "Copy and symlink all the source files."
+(define* (install #:key inputs outputs #:allow-other-keys)
+  "Copy and symlink all the source files.
+The source files are taken from the corresponding compile package (e.g. SBCL)
+if it's present in the native-inputs."
   (define output (assoc-ref outputs "out"))
-  (copy-files-to-output output
-                        (package-name->name+version
-                         (strip-store-file-name output))))
+  (define package-name
+    (package-name->name+version
+     (strip-store-file-name output)))
+  (define (no-prefix pkgname)
+    (if (string-index pkgname #\-)
+        (string-drop pkgname (1+ (string-index pkgname #\-)))
+        pkgname))
+  (define parent
+    (match (assoc package-name inputs
+                  (lambda (key alist-car)
+                    (let* ((alt-key (no-prefix key))
+                           (alist-car (no-prefix alist-car)))
+                      (or (string=? alist-car key)
+                          (string=? alist-car alt-key)))))
+      (#f #f)
+      (p (cdr p))))
+  (define parent-name
+    (and parent
+         (package-name->name+version (strip-store-file-name parent))))
+  (define parent-source
+    (and parent
+         (string-append parent "/share/common-lisp/"
+                        (string-take parent-name
+                                     (string-index parent-name #\-))
+                        "-source")))
+
+  (define (first-subdirectory directory) ; From gnu-build-system.
+    "Return the file name of the first sub-directory of DIRECTORY."
+    (match (scandir directory
+                    (lambda (file)
+                      (and (not (member file '("." "..")))
+                           (file-is-directory? (string-append directory "/"
+                                                              file)))))
+      ((first . _) first)))
+  (define source-directory
+    (if (and parent-source
+             (file-exists? parent-source))
+        (string-append parent-source "/" (first-subdirectory parent-source))
+        "."))
+
+  (with-directory-excursion source-directory
+    (copy-files-to-output output package-name)))
 
 (define* (copy-source #:key outputs asd-system-name #:allow-other-keys)
   "Copy the source to the library output."
diff --git a/guix/build/minify-build-system.scm b/guix/build/minify-build-system.scm
index 563def88e9..92158a033f 100644
--- a/guix/build/minify-build-system.scm
+++ b/guix/build/minify-build-system.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -54,8 +55,12 @@
   (let* ((out (assoc-ref outputs "out"))
          (js  (string-append out "/share/javascript/")))
     (mkdir-p js)
-    (for-each (cut install-file <> js)
-              (find-files "guix/build" "\\.min\\.js$")))
+    (for-each
+      (lambda (file)
+        (if (not (zero? (stat:size (stat file))))
+          (install-file file js)
+          (error "File is empty: " file)))
+      (find-files "guix/build" "\\.min\\.js$")))
   #t)
 
 (define %standard-phases
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index ff008c5b78..8070c5546f 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -1315,62 +1315,131 @@ bytes."
       40
       32))
 
-(define-c-struct sockaddr-in                      ;<linux/in.h>
-  sizeof-sockaddrin
+(define-c-struct sockaddr-in/linux                ;<linux/in.h>
+  sizeof-sockaddr-in/linux
   (lambda (family port address)
     (make-socket-address family address port))
-  read-sockaddr-in
-  write-sockaddr-in!
+  read-sockaddr-in/linux
+  write-sockaddr-in!/linux
   (family    unsigned-short)
   (port      (int16 ~ big))
   (address   (int32 ~ big)))
 
-(define-c-struct sockaddr-in6                     ;<linux/in6.h>
-  sizeof-sockaddr-in6
+(define-c-struct sockaddr-in/hurd                 ;<netinet/in.h>
+  sizeof-sockaddr-in/hurd
+  (lambda (len family port address zero)
+    (make-socket-address family address port))
+  read-sockaddr-in/hurd
+  write-sockaddr-in!/hurd
+  (len       uint8)
+  (family    uint8)
+  (port      (int16 ~ big))
+  (address   (int32 ~ big))
+  (zero      (array uint8 8)))
+
+(define-c-struct sockaddr-in6/linux               ;<linux/in6.h>
+  sizeof-sockaddr-in6/linux
   (lambda (family port flowinfo address scopeid)
     (make-socket-address family address port flowinfo scopeid))
-  read-sockaddr-in6
-  write-sockaddr-in6!
+  read-sockaddr-in6/linux
+  write-sockaddr-in6!/linux
   (family    unsigned-short)
   (port      (int16 ~ big))
   (flowinfo  (int32 ~ big))
   (address   (int128 ~ big))
   (scopeid   int32))
 
-(define (write-socket-address! sockaddr bv index)
+(define-c-struct sockaddr-in6/hurd                ;<netinet/in.h>
+  sizeof-sockaddr-in6/hurd
+  (lambda (len family port flowinfo address scopeid)
+    (make-socket-address family address port flowinfo scopeid))
+  read-sockaddr-in6/hurd
+  write-sockaddr-in6!/hurd
+  (len       uint8)
+  (family    uint8)
+  (port      (int16 ~ big))
+  (flowinfo  (int32 ~ big))
+  (address   (int128 ~ big))
+  (scopeid   int32))
+
+(define (write-socket-address!/linux sockaddr bv index)
+  "Write SOCKADDR, a socket address as returned by 'make-socket-address', to
+bytevector BV at INDEX."
+  (let ((family (sockaddr:fam sockaddr)))
+    (cond ((= family AF_INET)
+           (write-sockaddr-in!/linux bv index
+                                     family
+                                     (sockaddr:port sockaddr)
+                                     (sockaddr:addr sockaddr)))
+          ((= family AF_INET6)
+           (write-sockaddr-in6!/linux bv index
+                                      family
+                                      (sockaddr:port sockaddr)
+                                      (sockaddr:flowinfo sockaddr)
+                                      (sockaddr:addr sockaddr)
+                                      (sockaddr:scopeid sockaddr)))
+          (else
+           (error "unsupported socket address" sockaddr)))))
+
+(define (write-socket-address!/hurd sockaddr bv index)
   "Write SOCKADDR, a socket address as returned by 'make-socket-address', to
 bytevector BV at INDEX."
   (let ((family (sockaddr:fam sockaddr)))
     (cond ((= family AF_INET)
-           (write-sockaddr-in! bv index
-                               family
-                               (sockaddr:port sockaddr)
-                               (sockaddr:addr sockaddr)))
+           (write-sockaddr-in!/hurd bv index
+                                    sizeof-sockaddr-in/hurd
+                                    family
+                                    (sockaddr:port sockaddr)
+                                    (sockaddr:addr sockaddr)
+                                    '(0 0 0 0 0 0 0 0)))
           ((= family AF_INET6)
-           (write-sockaddr-in6! bv index
-                                family
-                                (sockaddr:port sockaddr)
-                                (sockaddr:flowinfo sockaddr)
-                                (sockaddr:addr sockaddr)
-                                (sockaddr:scopeid sockaddr)))
+           (write-sockaddr-in6!/hurd bv index
+                                     sizeof-sockaddr-in6/hurd
+                                     family
+                                     (sockaddr:port sockaddr)
+                                     (sockaddr:flowinfo sockaddr)
+                                     (sockaddr:addr sockaddr)
+                                     (sockaddr:scopeid sockaddr)))
           (else
            (error "unsupported socket address" sockaddr)))))
 
+(define write-socket-address!
+  (if (string-suffix? "linux-gnu" %host-type)
+      write-socket-address!/linux
+      write-socket-address!/hurd))
+
 (define PF_PACKET 17)                             ;<bits/socket.h>
 (define AF_PACKET PF_PACKET)
 
-(define* (read-socket-address bv #:optional (index 0))
+(define* (read-socket-address/linux bv #:optional (index 0))
+  "Read a socket address from bytevector BV at INDEX."
+  (let ((family (bytevector-u16-native-ref bv index)))
+    (cond ((= family AF_INET)
+           (read-sockaddr-in/linux bv index))
+          ((= family AF_INET6)
+           (read-sockaddr-in6/linux bv index))
+          (else
+           ;; XXX: Unsupported address family, such as AF_PACKET.  Return a
+           ;; vector such that the vector can at least call 'sockaddr:fam'.
+           (vector family)))))
+
+(define* (read-socket-address/hurd bv #:optional (index 0))
   "Read a socket address from bytevector BV at INDEX."
   (let ((family (bytevector-u16-native-ref bv index)))
     (cond ((= family AF_INET)
-           (read-sockaddr-in bv index))
+           (read-sockaddr-in/hurd bv index))
           ((= family AF_INET6)
-           (read-sockaddr-in6 bv index))
+           (read-sockaddr-in6/hurd bv index))
           (else
            ;; XXX: Unsupported address family, such as AF_PACKET.  Return a
            ;; vector such that the vector can at least call 'sockaddr:fam'.
            (vector family)))))
 
+(define read-socket-address
+  (if (string-suffix? "linux-gnu" %host-type)
+      read-socket-address/linux
+      read-socket-address/hurd))
+
 (define %ioctl
   ;; The most terrible interface, live from Scheme.
   (syscall->procedure int "ioctl" (list int unsigned-long '*)))
diff --git a/guix/channels.scm b/guix/channels.scm
index aca8302ba0..f0174de767 100644
--- a/guix/channels.scm
+++ b/guix/channels.scm
@@ -347,6 +347,21 @@ to '%package-module-path'."
       (((predicate . guile) rest ...)
        (if (predicate source) (guile) (loop rest))))))
 
+(define (call-with-guile guile thunk)
+  (lambda (store)
+    (values (parameterize ((%guile-for-build
+                            (if guile
+                                (package-derivation store guile)
+                                (%guile-for-build))))
+              (run-with-store store (thunk)))
+            store)))
+
+(define-syntax-rule (with-guile guile exp ...)
+  "Set GUILE as the '%guile-for-build' parameter for the dynamic extent of
+EXP, a series of monadic expressions."
+  (call-with-guile guile (lambda ()
+                           (mbegin %store-monad exp ...))))
+
 (define (with-trivial-build-handler mvalue)
   "Run MVALUE, a monadic value, with a \"trivial\" build handler installed
 that unconditionally resumes the continuation."
@@ -385,10 +400,7 @@ package modules under SOURCE using CORE, an instance of Guix."
         ;; Note: BUILD can return #f if it does not support %PULL-VERSION.  In
         ;; the future we'll fall back to a previous version of the protocol
         ;; when that happens.
-        (mbegin %store-monad
-          (mwhen guile
-            (set-guile-for-build guile))
-
+        (with-guile guile
           ;; BUILD is usually quite costly.  Install a "trivial" build handler
           ;; so we don't bounce an outer build-accumulator handler that could
           ;; cause us to redo half of the BUILD computation several times just
@@ -750,3 +762,7 @@ NEW.  When OLD is omitted or is #f, return all the news entries of CHANNEL."
       (if (= GIT_ENOTFOUND (git-error-code error))
           '()
           (apply throw key error rest)))))
+
+;;; Local Variables:
+;;; eval: (put 'with-guile 'scheme-indent-function 1)
+;;; End:
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 2a4b36519c..78b8af6fbc 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -37,6 +37,7 @@
             gexp?
             with-imported-modules
             with-extensions
+            let-system
 
             gexp-input
             gexp-input?
@@ -195,7 +196,9 @@ returns its output file name of OBJ's OUTPUT."
     ((? derivation? drv)
      (derivation->output-path drv output))
     ((? string? file)
-     file)))
+     file)
+    ((? self-quoting? obj)
+     obj)))
 
 (define (register-compiler! compiler)
   "Register COMPILER as a gexp compiler."
@@ -226,32 +229,62 @@ procedure to expand it; otherwise return #f."
 corresponding to OBJ for SYSTEM, cross-compiling for TARGET if TARGET is true.
 OBJ must be an object that has an associated gexp compiler, such as a
 <package>."
-  (match (lookup-compiler obj)
-    (#f
-     (raise (condition (&gexp-input-error (input obj)))))
-    (lower
-     ;; Cache in STORE the result of lowering OBJ.
-     (mlet %store-monad ((target (if (eq? target 'current)
-                                     (current-target-system)
-                                     (return target)))
-                         (graft? (grafting?)))
-       (mcached (let ((lower (lookup-compiler obj)))
-                  (lower obj system target))
-                obj
-                system target graft?)))))
+  (mlet %store-monad ((target (if (eq? target 'current)
+                                  (current-target-system)
+                                  (return target)))
+                      (graft? (grafting?)))
+    (let loop ((obj obj))
+      (match (lookup-compiler obj)
+        (#f
+         (raise (condition (&gexp-input-error (input obj)))))
+        (lower
+         ;; Cache in STORE the result of lowering OBJ.
+         (mcached (mlet %store-monad ((lowered (lower obj system target)))
+                    (if (and (struct? lowered)
+                             (not (derivation? lowered)))
+                        (loop lowered)
+                        (return lowered)))
+                  obj
+                  system target graft?))))))
+
+(define* (lower+expand-object obj
+                              #:optional (system (%current-system))
+                              #:key target (output "out"))
+  "Return as a value in %STORE-MONAD the output of object OBJ expands to for
+SYSTEM and TARGET.  Object such as <package>, <file-append>, or <plain-file>
+expand to file names, but it's possible to expand to a plain data type."
+  (let loop ((obj obj)
+             (expand (and (struct? obj) (lookup-expander obj))))
+    (match (lookup-compiler obj)
+      (#f
+       (raise (condition (&gexp-input-error (input obj)))))
+      (lower
+       (mlet* %store-monad ((graft?  (grafting?))
+                            (lowered (mcached (lower obj system target)
+                                              obj
+                                              system target graft?)))
+         ;; LOWER might return something that needs to be further
+         ;; lowered.
+         (if (struct? lowered)
+             ;; If we lack an expander, delegate to that of LOWERED.
+             (if (not expand)
+                 (loop lowered (lookup-expander lowered))
+                 (return (expand obj lowered output)))
+             (return lowered)))))))               ;self-quoting
 
 (define-syntax define-gexp-compiler
   (syntax-rules (=> compiler expander)
     "Define NAME as a compiler for objects matching PREDICATE encountered in
 gexps.
 
-In the simplest form of the macro, BODY must return a derivation for PARAM, an
-object that matches PREDICATE, for SYSTEM and TARGET (the latter of which is
-#f except when cross-compiling.)
+In the simplest form of the macro, BODY must return (1) a derivation for
+a record of the specified type, for SYSTEM and TARGET (the latter of which is
+#f except when cross-compiling), (2) another record that can itself be
+compiled down to a derivation, or (3) an object of a primitive data type.
 
 The more elaborate form allows you to specify an expander:
 
-  (define-gexp-compiler something something?
+  (define-gexp-compiler something-compiler <something>
     compiler => (lambda (param system target) ...)
     expander => (lambda (param drv output) ...))
 
@@ -299,6 +332,52 @@ The expander specifies how an object is converted to its sexp representation."
 
 
 ;;;
+;;; System dependencies.
+;;;
+
+;; Binding form for the current system and cross-compilation target.
+(define-record-type <system-binding>
+  (system-binding proc)
+  system-binding?
+  (proc system-binding-proc))
+
+(define-syntax let-system
+  (syntax-rules ()
+    "Introduce a system binding in a gexp.  The simplest form is:
+
+  (let-system system
+    (cond ((string=? system \"x86_64-linux\") ...)
+          (else ...)))
+
+which binds SYSTEM to the currently targeted system.  The second form is
+similar, but it also shows the cross-compilation target:
+
+  (let-system (system target)
+    ...)
+
+Here TARGET is bound to the cross-compilation triplet or #f."
+    ((_ (system target) exp0 exp ...)
+     (system-binding (lambda (system target)
+                       exp0 exp ...)))
+    ((_ system exp0 exp ...)
+     (system-binding (lambda (system target)
+                       exp0 exp ...)))))
+
+(define-gexp-compiler system-binding-compiler <system-binding>
+  compiler => (lambda (binding system target)
+                (match binding
+                  (($ <system-binding> proc)
+                   (with-monad %store-monad
+                     ;; PROC is expected to return a lowerable object.
+                     ;; 'lower-object' takes care of residualizing it to a
+                     ;; derivation or similar.
+                     (return (proc system target))))))
+
+  ;; Delegate to the expander of the object returned by PROC.
+  expander => #f)
+
+
+;;;
 ;;; File declarations.
 ;;;
 
@@ -676,6 +755,15 @@ GEXP) is false, meaning that GEXP is a plain Scheme object, return the empty
 list."
   (gexp-attribute gexp gexp-self-extensions))
 
+(define (self-quoting? x)
+  (letrec-syntax ((one-of (syntax-rules ()
+                            ((_) #f)
+                            ((_ pred rest ...)
+                             (or (pred x)
+                                 (one-of rest ...))))))
+    (one-of symbol? string? keyword? pair? null? array?
+            number? boolean? char?)))
+
 (define* (lower-inputs inputs
                        #:key system target)
   "Turn any object from INPUTS into a derivation input for SYSTEM or a store
@@ -684,23 +772,32 @@ When TARGET is true, use it as the cross-compilation target triplet."
   (define (store-item? obj)
     (and (string? obj) (store-path? obj)))
 
+  (define filterm
+    (lift1 (cut filter ->bool <>) %store-monad))
+
   (with-monad %store-monad
-    (mapm/accumulate-builds
-     (match-lambda
-       (((? struct? thing) sub-drv ...)
-        (mlet %store-monad ((obj (lower-object
-                                  thing system #:target target)))
-          (return (match obj
-                    ((? derivation? drv)
-                     (let ((outputs (if (null? sub-drv)
-                                        '("out")
-                                        sub-drv)))
-                       (derivation-input drv outputs)))
-                    ((? store-item? item)
-                     item)))))
-       (((? store-item? item))
-        (return item)))
-     inputs)))
+    (>>= (mapm/accumulate-builds
+          (match-lambda
+            (((? struct? thing) sub-drv ...)
+             (mlet %store-monad ((obj (lower-object
+                                       thing system #:target target)))
+               (return (match obj
+                         ((? derivation? drv)
+                          (let ((outputs (if (null? sub-drv)
+                                             '("out")
+                                             sub-drv)))
+                            (derivation-input drv outputs)))
+                         ((? store-item? item)
+                          item)
+                         ((? self-quoting?)
+                          ;; Some inputs such as <system-binding> can lower to
+                          ;; a self-quoting object that FILTERM will filter
+                          ;; out.
+                          #f)))))
+            (((? store-item? item))
+             (return item)))
+          inputs)
+         filterm)))
 
 (define* (lower-reference-graphs graphs #:key system target)
   "Given GRAPHS, a list of (FILE-NAME INPUT ...) lists for use as a
@@ -1116,15 +1213,6 @@ references; otherwise, return only non-native references."
                      (target (%current-target-system)))
   "Return (monadically) the sexp corresponding to EXP for the given OUTPUT,
 and in the current monad setting (system type, etc.)"
-  (define (self-quoting? x)
-    (letrec-syntax ((one-of (syntax-rules ()
-                              ((_) #f)
-                              ((_ pred rest ...)
-                               (or (pred x)
-                                   (one-of rest ...))))))
-      (one-of symbol? string? keyword? pair? null? array?
-              number? boolean? char?)))
-
   (define* (reference->sexp ref #:optional native?)
     (with-monad %store-monad
       (match ref
@@ -1148,12 +1236,10 @@ and in the current monad setting (system type, etc.)"
                   (or n? native?)))
                refs))
         (($ <gexp-input> (? struct? thing) output n?)
-         (let ((target (if (or n? native?) #f target))
-               (expand (lookup-expander thing)))
-           (mlet %store-monad ((obj (lower-object thing system
-                                                  #:target target)))
-             ;; OBJ must be either a derivation or a store file name.
-             (return (expand thing obj output)))))
+         (let ((target (if (or n? native?) #f target)))
+           (lower+expand-object thing system
+                                #:target target
+                                #:output output)))
         (($ <gexp-input> (? self-quoting? x))
          (return x))
         (($ <gexp-input> x)
diff --git a/guix/licenses.scm b/guix/licenses.scm
index a16d2241ad..bf72a33c92 100644
--- a/guix/licenses.scm
+++ b/guix/licenses.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2014, 2015, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2014, 2015, 2017, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
@@ -644,7 +644,7 @@ which may be a file:// URI pointing the package's tree."
 
 (define zlib
   (license "Zlib"
-           "http://www.gzip.org/zlib/zlib_license.html"
+           "https://zlib.net/zlib_license.html"
            "https://www.gnu.org/licenses/license-list#ZLib"))
 
 (define hpnd
diff --git a/guix/quirks.scm b/guix/quirks.scm
index 483169e70d..d180bd2c09 100644
--- a/guix/quirks.scm
+++ b/guix/quirks.scm
@@ -19,6 +19,7 @@
 (define-module (guix quirks)
   #:use-module ((guix build utils) #:select (substitute*))
   #:use-module (srfi srfi-9)
+  #:use-module (ice-9 match)
   #:use-module (ice-9 rdelim)
   #:export (%quirks
 
@@ -117,8 +118,42 @@ corresponds to the given Guix COMMIT, a SHA1 hexadecimal string."
 
    (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import)))
 
+(define %bug-41214-patch
+  ;; Patch for <https://bugs.gnu.org/41214>.  Around v1.0.0, (guix build
+  ;; compile) would use Guile 2.2 procedures to access the set of available
+  ;; compilation options.  These procedures no longer exist in 3.0.
+  (let ()
+    (define (accesses-guile-2.2-optimization-options? source commit)
+      (catch 'system-error
+        (lambda ()
+          (match (call-with-input-file
+                     (string-append source "/guix/build/compile.scm")
+                   read)
+            (('define-module ('guix 'build 'compile)
+               _ ...
+               #:use-module ('language 'tree-il 'optimize)
+               #:use-module ('language 'cps 'optimize)
+               #:export ('%default-optimizations
+                         '%lightweight-optimizations
+                         'compile-files))
+             #t)
+            (_ #f)))
+        (const #f)))
+
+    (define (build-with-guile-2.2 source)
+      (substitute* (string-append source "/" %self-build-file)
+        (("\\(default-guile\\)")
+         (object->string '(car (find-best-packages-by-name "guile" "2.2"))))
+        (("\\(find-best-packages-by-name \"guile-gcrypt\" #f\\)")
+         (object->string '(find-best-packages-by-name "guile2.2-gcrypt" #f))))
+      #t)
+
+    (patch accesses-guile-2.2-optimization-options?
+           build-with-guile-2.2)))
+
 (define %patches
   ;; Bits of past Guix revisions can become incompatible with newer Guix and
   ;; Guile.  This variable lists <patch> records for the Guix source tree that
   ;; apply to the Guix source.
-  (list %bug-41028-patch))
+  (list %bug-41028-patch
+        %bug-41214-patch))
diff --git a/guix/scripts/describe.scm b/guix/scripts/describe.scm
index f13f221da9..7a2dbc453a 100644
--- a/guix/scripts/describe.scm
+++ b/guix/scripts/describe.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
+;;; Copyright © 2020 Ekaitz Zarraga <ekaitz@elenq.tech>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -41,14 +42,26 @@
 ;;;
 ;;; Command-line options.
 ;;;
+(define %available-formats '("human" "channels" "json" "recutils"))
+
+(define (list-formats)
+  (display (G_ "The available formats are:\n"))
+  (newline)
+  (for-each (lambda (f)
+              (format #t "  - ~a~%" f))
+            %available-formats))
 
 (define %options
   ;; Specifications of the command-line options.
   (list (option '(#\f "format") #t #f
                 (lambda (opt name arg result)
-                  (unless (member arg '("human" "channels" "json" "recutils"))
+                  (unless (member arg %available-formats)
                     (leave (G_ "~a: unsupported output format~%") arg))
                   (alist-cons 'format (string->symbol arg) result)))
+        (option '("list-formats") #f #f
+                (lambda (opt name arg result)
+                  (list-formats)
+                  (exit 0)))
         (option '(#\p "profile") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'profile (canonicalize-profile arg)
@@ -71,6 +84,8 @@ Display information about the channels currently in use.\n"))
   (display (G_ "
   -f, --format=FORMAT    display information in the given FORMAT"))
   (display (G_ "
+      --list-formats     display available formats"))
+  (display (G_ "
   -p, --profile=PROFILE  display information about PROFILE"))
   (newline)
   (display (G_ "
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm
index f5b2f5fd4e..a00f08f9d9 100644
--- a/guix/scripts/publish.scm
+++ b/guix/scripts/publish.scm
@@ -851,6 +851,7 @@ blocking."
                                                                          size)
                                                     client))
                           (output   (response-port response)))
+                     (setsockopt client SOL_SOCKET SO_SNDBUF (* 128 1024))
                      (if (file-port? output)
                          (sendfile output input size)
                          (dump-port input output))
diff --git a/guix/utils.scm b/guix/utils.scm
index 3e8e59b8dc..d7b197fa44 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -490,18 +490,21 @@ a character other than '@'."
   (and target
        (string-suffix? "-mingw32" target)))
 
-(define (target-arm32?)
-  (string-prefix? "arm" (or (%current-target-system) (%current-system))))
+(define* (target-arm32? #:optional (target (or (%current-target-system)
+                                               (%current-system))))
+  (string-prefix? "arm" target))
 
-(define (target-aarch64?)
-  (string-prefix? "aarch64" (or (%current-target-system) (%current-system))))
+(define* (target-aarch64? #:optional (target (or (%current-target-system)
+                                                 (%current-system))))
+  (string-prefix? "aarch64" target))
 
-(define (target-arm?)
-  (or (target-arm32?) (target-aarch64?)))
+(define* (target-arm? #:optional (target (or (%current-target-system)
+                                             (%current-system))))
+  (or (target-arm32? target) (target-aarch64? target)))
 
-(define (target-64bit?)
-  (let ((system (or (%current-target-system) (%current-system))))
-    (any (cut string-prefix? <> system) '("x86_64" "aarch64" "mips64" "ppc64"))))
+(define* (target-64bit? #:optional (system (or (%current-target-system)
+                                               (%current-system))))
+  (any (cut string-prefix? <> system) '("x86_64" "aarch64" "mips64" "ppc64")))
 
 (define version-compare
   (let ((strverscmp
diff --git a/nix/local.mk b/nix/local.mk
index a64bdd2137..dbcdde8b0d 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -1,6 +1,7 @@
 # GNU Guix --- Functional package management for GNU
 # Copyright © 2012, 2013, 2014, 2015, 2016, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 # Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
+# Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 #
 # This file is part of GNU Guix.
 #
@@ -155,7 +156,17 @@ noinst_HEADERS =						\
 
 # The '.service' files for systemd.
 systemdservicedir = $(libdir)/systemd/system
-nodist_systemdservice_DATA = etc/guix-daemon.service etc/guix-publish.service
+nodist_systemdservice_DATA =			\
+  etc/gnu-store.mount				\
+  etc/guix-daemon.service			\
+  etc/guix-publish.service
+
+etc/%.mount: etc/%.mount.in	\
+			 $(top_builddir)/config.status
+	$(AM_V_GEN)$(MKDIR_P) "`dirname $@`";	\
+	$(SED) -e 's|@''storedir''@|$(storedir)|' <	\
+	       "$<" > "$@.tmp";		\
+	mv "$@.tmp" "$@"
 
 etc/guix-%.service: etc/guix-%.service.in	\
 			 $(top_builddir)/config.status
diff --git a/tests/file-systems.scm b/tests/file-systems.scm
index 4c28d0ebc5..7f7c373884 100644
--- a/tests/file-systems.scm
+++ b/tests/file-systems.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -64,4 +65,67 @@
           (_ #f))
         (source-module-closure '((gnu system file-systems)))))
 
+(test-equal "file-system-options->alist"
+  '("autodefrag" ("subvol" . "home") ("compress" . "lzo"))
+  (file-system-options->alist "autodefrag,subvol=home,compress=lzo"))
+
+(test-equal "file-system-options->alist (#f)"
+  '()
+  (file-system-options->alist #f))
+
+(test-equal "alist->file-system-options"
+  "autodefrag,subvol=root,compress=lzo"
+  (alist->file-system-options '("autodefrag"
+                                ("subvol" . "root")
+                                ("compress" . "lzo"))))
+
+(test-equal "alist->file-system-options (null)"
+  #f
+  (alist->file-system-options '()))
+
+
+;;;
+;;; Btrfs related.
+;;;
+
+(define %btrfs-root-subvolume
+  (file-system
+    (device (file-system-label "btrfs-pool"))
+    (mount-point "/")
+    (type "btrfs")
+    (options "subvol=rootfs,compress=zstd")))
+
+(define %btrfs-store-subvolid
+  (file-system
+    (device (file-system-label "btrfs-pool"))
+    (mount-point "/gnu/store")
+    (type "btrfs")
+    (options "subvolid=10,compress=zstd")
+    (dependencies (list %btrfs-root-subvolume))))
+
+(define %btrfs-store-subvolume
+  (file-system
+    (device (file-system-label "btrfs-pool"))
+    (mount-point "/gnu/store")
+    (type "btrfs")
+    (options "subvol=/some/nested/file/name")
+    (dependencies (list %btrfs-root-subvolume))))
+
+(test-assert "btrfs-subvolume? (subvol)"
+  (btrfs-subvolume? %btrfs-root-subvolume))
+
+(test-assert "btrfs-subvolume? (subvolid)"
+  (btrfs-subvolume? %btrfs-store-subvolid))
+
+(test-equal "btrfs-store-subvolume-file-name"
+  "/some/nested/file/name"
+  (parameterize ((%store-prefix "/gnu/store"))
+    (btrfs-store-subvolume-file-name (list %btrfs-root-subvolume
+                                           %btrfs-store-subvolume))))
+
+(test-error "btrfs-store-subvolume-file-name (subvolid)"
+            (parameterize ((%store-prefix "/gnu/store"))
+              (btrfs-store-subvolume-file-name (list %btrfs-root-subvolume
+                                                     %btrfs-store-subvolid))))
+
 (test-end)
diff --git a/tests/gexp.scm b/tests/gexp.scm
index 6a42d3eb57..e073a7b816 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -321,6 +321,60 @@
        (string=? result
                  (string-append (derivation->output-path drv)
                                 "/bin/touch"))))))
+(test-equal "let-system"
+  (list `(begin ,(%current-system) #t) '(system-binding) '()
+        'low '() '())
+  (let* ((exp #~(begin
+                  #$(let-system system system)
+                  #t))
+         (low (run-with-store %store (lower-gexp exp))))
+    (list (lowered-gexp-sexp low)
+          (match (gexp-inputs exp)
+            (((($ (@@ (guix gexp) <system-binding>)) "out"))
+             '(system-binding))
+            (x x))
+          (gexp-native-inputs exp)
+          'low
+          (lowered-gexp-inputs low)
+          (lowered-gexp-sources low))))
+
+(test-equal "let-system, target"
+  (list `(list ,(%current-system) #f)
+        `(list ,(%current-system) "aarch64-linux-gnu"))
+  (let ((exp #~(list #$@(let-system (system target)
+                          (list system target)))))
+    (list (gexp->sexp* exp)
+          (gexp->sexp* exp "aarch64-linux-gnu"))))
+
+(test-equal "let-system, ungexp-native, target"
+  `(here it is: ,(%current-system) #f)
+  (let ((exp #~(here it is: #+@(let-system (system target)
+                                 (list system target)))))
+    (gexp->sexp* exp "aarch64-linux-gnu")))
+
+(test-equal "let-system, nested"
+  (list `(system* ,(string-append "qemu-system-" (%current-system))
+                  "-m" "256")
+        '()
+        '(system-binding))
+  (let ((exp #~(system*
+                #+(let-system (system target)
+                    (file-append (@@ (gnu packages virtualization)
+                                     qemu)
+                                 "/bin/qemu-system-"
+                                 system))
+                "-m" "256")))
+    (list (match (gexp->sexp* exp)
+            (('system* command rest ...)
+             `(system* ,(and (string-prefix? (%store-prefix) command)
+                             (basename command))
+                       ,@rest))
+            (x x))
+          (gexp-inputs exp)
+          (match (gexp-native-inputs exp)
+            (((($ (@@ (guix gexp) <system-binding>)) "out"))
+             '(system-binding))
+            (x x)))))
 
 (test-assert "ungexp + ungexp-native"
   (let* ((exp    (gexp (list (ungexp-native %bootstrap-guile)