summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi67
-rw-r--r--gnu/local.mk4
-rw-r--r--gnu/packages/admin.scm5
-rw-r--r--gnu/packages/algebra.scm71
-rw-r--r--gnu/packages/android.scm2
-rw-r--r--gnu/packages/anthy.scm2
-rw-r--r--gnu/packages/antivirus.scm4
-rw-r--r--gnu/packages/aux-files/linux-libre/4.19-arm64.conf2
-rw-r--r--gnu/packages/aux-files/linux-libre/4.20-arm64.conf2
-rw-r--r--gnu/packages/axoloti.scm28
-rw-r--r--gnu/packages/benchmark.scm7
-rw-r--r--gnu/packages/cdrom.scm23
-rw-r--r--gnu/packages/code.scm5
-rw-r--r--gnu/packages/connman.scm7
-rw-r--r--gnu/packages/coq.scm66
-rw-r--r--gnu/packages/crypto.scm15
-rw-r--r--gnu/packages/display-managers.scm2
-rw-r--r--gnu/packages/emacs-xyz.scm64
-rw-r--r--gnu/packages/emacs.scm17
-rw-r--r--gnu/packages/embedded.scm8
-rw-r--r--gnu/packages/engineering.scm8
-rw-r--r--gnu/packages/entr.scm39
-rw-r--r--gnu/packages/freedesktop.scm6
-rw-r--r--gnu/packages/ftp.scm6
-rw-r--r--gnu/packages/games.scm4
-rw-r--r--gnu/packages/gnucash.scm185
-rw-r--r--gnu/packages/gnupg.scm21
-rw-r--r--gnu/packages/graphics.scm7
-rw-r--r--gnu/packages/guile.scm75
-rw-r--r--gnu/packages/haskell.scm90
-rw-r--r--gnu/packages/image-viewers.scm52
-rw-r--r--gnu/packages/linux.scm34
-rw-r--r--gnu/packages/lirc.scm33
-rw-r--r--gnu/packages/lisp.scm7
-rw-r--r--gnu/packages/messaging.scm62
-rw-r--r--gnu/packages/multiprecision.scm10
-rw-r--r--gnu/packages/music.scm4
-rw-r--r--gnu/packages/ocaml.scm128
-rw-r--r--gnu/packages/openstack.scm6
-rw-r--r--gnu/packages/password-utils.scm17
-rw-r--r--gnu/packages/patches/gnucash-disable-failing-tests.patch39
-rw-r--r--gnu/packages/patches/gnucash-price-quotes-perl.patch24
-rw-r--r--gnu/packages/python-check.scm58
-rw-r--r--gnu/packages/python-crypto.scm24
-rw-r--r--gnu/packages/python-xyz.scm187
-rw-r--r--gnu/packages/qt.scm12
-rw-r--r--gnu/packages/rdf.scm16
-rw-r--r--gnu/packages/regex.scm6
-rw-r--r--gnu/packages/samba.scm28
-rw-r--r--gnu/packages/synergy.scm95
-rw-r--r--gnu/packages/tex.scm208
-rw-r--r--gnu/packages/textutils.scm4
-rw-r--r--gnu/packages/tls.scm6
-rw-r--r--gnu/packages/uucp.scm8
-rw-r--r--gnu/packages/vulkan.scm2
-rw-r--r--gnu/packages/wicd.scm2
-rw-r--r--gnu/packages/wine.scm88
-rw-r--r--gnu/packages/wm.scm2
-rw-r--r--gnu/packages/xfce.scm4
-rw-r--r--gnu/system/examples/bare-bones.tmpl10
-rw-r--r--gnu/system/examples/beaglebone-black.tmpl24
-rw-r--r--gnu/system/examples/desktop.tmpl32
-rw-r--r--gnu/system/examples/lightweight-desktop.tmpl16
-rw-r--r--gnu/system/examples/vm-image.tmpl12
-rw-r--r--guix/licenses.scm9
-rw-r--r--guix/packages.scm25
-rw-r--r--guix/records.scm54
-rw-r--r--guix/scripts/refresh.scm6
-rw-r--r--guix/scripts/weather.scm174
-rw-r--r--guix/store/deduplication.scm11
-rw-r--r--guix/tests.scm19
-rw-r--r--guix/ui.scm2
-rw-r--r--tests/packages.scm23
-rw-r--r--tests/services.scm4
74 files changed, 1546 insertions, 883 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index ceec8caa46..a03a9f6df2 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2106,8 +2106,8 @@ manual}).
 @cindex UEFI, installation
 @cindex ESP, EFI system partition
 If you instead wish to use EFI-based GRUB, a FAT32 @dfn{EFI System Partition}
-(ESP) is required.  This partition should be mounted at @file{/boot/efi} and
-must have the @code{esp} flag set.  E.g., for @command{parted}:
+(ESP) is required.  This partition can be mounted at @file{/boot/efi} for
+instance and must have the @code{esp} flag set.  E.g., for @command{parted}:
 
 @example
 parted /dev/sda set 1 esp on
@@ -2169,9 +2169,9 @@ mount LABEL=my-root /mnt
 @end example
 
 Also mount any other file systems you would like to use on the target
-system relative to this path.  If you have @file{/boot} on a separate
-partition for example, mount it at @file{/mnt/boot} now so it is found
-by @code{guix system init} afterwards.
+system relative to this path.  If you have opted for @file{/boot/efi} as an
+EFI mount point for example, mount it at @file{/mnt/boot/efi} now so it is
+found by @code{guix system init} afterwards.
 
 Finally, if you plan to use one or more swap partitions (@pxref{Memory
 Concepts, swap space,, libc, The GNU C Library Reference Manual}), make
@@ -2253,8 +2253,9 @@ you want to install GRUB on.  It should mention @code{grub-bootloader} if
 you are installing GRUB in the legacy way, or @code{grub-efi-bootloader}
 for newer UEFI systems.  For legacy systems, the @code{target} field
 names a device, like @code{/dev/sda}; for UEFI systems it names a path
-to a mounted EFI partition, like @code{/boot/efi}, and do make sure the
-path is actually mounted.
+to a mounted EFI partition, like @code{/boot/efi}; do make sure the path is
+currently mounted and a @code{file-sytem} entry is specified in your
+configuration.
 
 @item
 Be sure that your file system labels match the value of their respective
@@ -9708,7 +9709,9 @@ key is authorized.  It also reports the size of the compressed archives
 (``nars'') provided by the server, the size the corresponding store
 items occupy in the store (assuming deduplication is turned off), and
 the server's throughput.  The second part gives continuous integration
-(CI) statistics, if the server supports it.
+(CI) statistics, if the server supports it.  In addition, using the
+@option{--coverage} option, @command{guix weather} can list ``important''
+package substitutes missing on the server (see below).
 
 To achieve that, @command{guix weather} queries over HTTP(S) meta-data
 (@dfn{narinfos}) for all the relevant store items.  Like @command{guix
@@ -9736,6 +9739,37 @@ Instead of querying substitutes for all the packages, only ask for those
 specified in @var{file}.  @var{file} must contain a @dfn{manifest}, as
 with the @code{-m} option of @command{guix package} (@pxref{Invoking
 guix package}).
+
+@item --coverage[=@var{count}]
+@itemx -c [@var{count}]
+Report on substitute coverage for packages: list packages with at least
+@var{count} dependents (zero by default) for which substitutes are
+unavailable.  Dependent packages themselves are not listed: if @var{b} depends
+on @var{a} and @var{a} has no substitutes, only @var{a} is listed, even though
+@var{b} usually lacks substitutes as well.  The result looks like this:
+
+@example
+$ guix weather --substitute-urls=https://ci.guix.info -c 10
+computing 8,983 package derivations for x86_64-linux...
+looking for 9,343 store items on https://ci.guix.info...
+updating substitutes from 'https://ci.guix.info'... 100.0%
+https://ci.guix.info
+  64.7% substitutes available (6,047 out of 9,343)
+@dots{}
+2502 packages are missing from 'https://ci.guix.info' for 'x86_64-linux', among which:
+    58  kcoreaddons@@5.49.0      /gnu/store/@dots{}-kcoreaddons-5.49.0
+    46  qgpgme@@1.11.1           /gnu/store/@dots{}-qgpgme-1.11.1
+    37  perl-http-cookiejar@@0.008  /gnu/store/@dots{}-perl-http-cookiejar-0.008
+    @dots{}
+@end example
+
+What this example shows is that @code{kcoreaddons} and presumably the 58
+packages that depend on it have no substitutes at @code{ci.guix.info};
+likewise for @code{qgpgme} and the 46 packages that depend on it.
+
+If you are a Guix developer, or if you are taking care of this build farm,
+you'll probably want to have a closer look at these packages: they may simply
+fail to build.
 @end table
 
 @node Invoking guix processes
@@ -10887,9 +10921,9 @@ system, you will want to append services to @var{%base-services}, like
 this:
 
 @example
-(cons* (service avahi-service-type)
-       (service openssh-service-type)
-       %base-services)
+(append (list (service avahi-service-type)
+              (service openssh-service-type))
+        %base-services)
 @end example
 @end defvr
 
@@ -11519,11 +11553,12 @@ well as in the @var{groups} field of the @var{operating-system} record.
   ;; @dots{}
 
   (services
-    (modify-services %desktop-services
-      (udev-service-type config =>
-       (udev-configuration (inherit config)
-       (rules (cons* android-udev-rules
-              (udev-configuration-rules config))))))))
+   (modify-services %desktop-services
+     (udev-service-type
+      config =>
+      (udev-configuration (inherit config)
+                          (rules (cons android-udev-rules
+                                       (udev-configuration-rules config))))))))
 @end example
 
 @defvr {Scheme Variable} urandom-seed-service-type
diff --git a/gnu/local.mk b/gnu/local.mk
index 99603b3be9..f339f32e73 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -371,6 +371,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/pure.scm				\
   %D%/packages/pv.scm				\
   %D%/packages/python.scm			\
+  %D%/packages/python-check.scm			\
   %D%/packages/python-compression.scm		\
   %D%/packages/python-crypto.scm		\
   %D%/packages/python-web.scm			\
@@ -829,8 +830,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/gmp-faulty-test.patch			\
   %D%/packages/patches/gnome-todo-libical-compat.patch		\
   %D%/packages/patches/gnome-tweak-tool-search-paths.patch	\
-  %D%/packages/patches/gnucash-price-quotes-perl.patch		\
-  %D%/packages/patches/gnucash-disable-failing-tests.patch	\
+  %D%/packages/patches/gnucash-fix-test-transaction-failure.patch \
   %D%/packages/patches/gnutls-skip-trust-store-test.patch	\
   %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \
   %D%/packages/patches/gobject-introspection-cc.patch		\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 815ce19718..0c0ec3d4bc 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -23,6 +23,7 @@
 ;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr>
 ;;; Copyright © 2018 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
+;;; Copyright © 2019 Brett Gilio <brettg@posteo.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1602,14 +1603,14 @@ of supported upstream metrics systems simultaneously.")
 (define-public ansible
   (package
     (name "ansible")
-    (version "2.7.5")
+    (version "2.7.6")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "ansible" version))
        (sha256
         (base32
-         "1fsif2jmkrrgiawsd8r6sxrqvh01fvrmdhas0p540a6i9fby3yda"))))
+         "0f7b2ghm34ql8yv90wr0ngd6w7wyvnlcxpc3snkj86kcjsnmx1bd"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-bcrypt" ,python-bcrypt)
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index 46ad548e38..757b1111d6 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2013, 2015, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016, 2017, 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2014, 2018 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2016, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
@@ -138,43 +138,46 @@ solve the shortest vector problem.")
 
 (define-public pari-gp
   (package
-   (name "pari-gp")
-   (version "2.11.1")
-   (source (origin
-            (method url-fetch)
-            (uri (string-append
-                  "https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-"
-                  version ".tar.gz"))
-            (sha256
-              (base32
+    (name "pari-gp")
+    (version "2.11.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
                 "1jfax92jpydjd02fwl30r6b8kfzqqd6sm4yx94gidyz9lqjb7a94"))))
-   (build-system gnu-build-system)
-   (native-inputs `(("texlive" ,texlive-tiny)))
-   (inputs `(("gmp" ,gmp)
-             ("libx11" ,libx11)
-             ("perl" ,perl)
-             ("readline" ,readline)))
-   (arguments
-    '(#:make-flags '("all")
-      #:test-target "dobench"
-      #:phases (modify-phases %standard-phases
-                 (replace 'configure
-                          (lambda* (#:key outputs #:allow-other-keys)
-                           (let ((out (assoc-ref outputs "out")))
-                            (zero?
-                             (system* "./Configure"
-                                      (string-append "--prefix=" out)))))))))
-   (synopsis "PARI/GP, a computer algebra system for number theory")
-   (description
-    "PARI/GP is a widely used computer algebra system designed for fast
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("texlive" ,(texlive-union
+                    (list texlive-fonts-amsfonts
+                          texlive-latex-amsfonts)))))
+    (inputs `(("gmp" ,gmp)
+              ("libx11" ,libx11)
+              ("perl" ,perl)
+              ("readline" ,readline)))
+    (arguments
+     '(#:make-flags '("all")
+       #:test-target "dobench"
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (invoke "./Configure"
+                     (string-append "--prefix="
+                                    (assoc-ref outputs "out"))))))))
+    (synopsis "PARI/GP, a computer algebra system for number theory")
+    (description
+     "PARI/GP is a widely used computer algebra system designed for fast
 computations in number theory (factorisations, algebraic number theory,
 elliptic curves...), but it also contains a large number of other useful
 functions to compute with mathematical entities such as matrices,
 polynomials, power series, algebraic numbers, etc., and a lot of
 transcendental functions.
 PARI is also available as a C library to allow for faster computations.")
-   (license license:gpl2+)
-   (home-page "https://pari.math.u-bordeaux.fr/")))
+    (license license:gpl2+)
+    (home-page "https://pari.math.u-bordeaux.fr/")))
 
 (define-public gp2c
   (package
@@ -354,11 +357,11 @@ or text interfaces) or as a C++ library.")
                    (mpfr (assoc-ref inputs "mpfr")))
                ;; do not pass "--enable-fast-install", which makes the
                ;; homebrew configure process fail
-               (zero? (system*
-                       "./configure"
+               (invoke "./configure"
                        (string-append "--prefix=" out)
                        (string-append "--with-gmp=" gmp)
-                       (string-append "--with-mpfr=" mpfr)))))))))
+                       (string-append "--with-mpfr=" mpfr))
+               #t))))))
    (synopsis "Fast library for number theory")
    (description
     "FLINT is a C library for number theory.  It supports arithmetic
diff --git a/gnu/packages/android.scm b/gnu/packages/android.scm
index d5a60cb5bb..17bf428fe6 100644
--- a/gnu/packages/android.scm
+++ b/gnu/packages/android.scm
@@ -759,7 +759,7 @@ def _FindRepo():
          (delete 'build) ; nothing to build
          (replace 'check
            (lambda _
-             (zero? (system* "python" "-m" "nose"))))
+             (invoke "python" "-m" "nose")))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
diff --git a/gnu/packages/anthy.scm b/gnu/packages/anthy.scm
index 7cd35b622d..170e439465 100644
--- a/gnu/packages/anthy.scm
+++ b/gnu/packages/anthy.scm
@@ -47,7 +47,7 @@
          (replace 'check
            (lambda _
              (with-directory-excursion "test"
-               (zero? (system* "./anthy" "--all"))))))))
+               (invoke "./anthy" "--all")))))))
     (home-page "http://anthy.osdn.jp/")
     (synopsis "Japanese input method")
     (description "Anthy is a Japanese input method for converting
diff --git a/gnu/packages/antivirus.scm b/gnu/packages/antivirus.scm
index 95749761bd..c3f11865e2 100644
--- a/gnu/packages/antivirus.scm
+++ b/gnu/packages/antivirus.scm
@@ -112,8 +112,10 @@
        ;; install sample .conf files to %output/etc rather than /etc/clamav
        #:make-flags (list (string-append "sysconfdir=" %output "/etc"))
        #:phases (modify-phases %standard-phases
+                  ;; Regenerate configure script.  Without this we don't get
+                  ;; the correct value for LLVM linker variables.
                   (add-after 'unpack 'reconf
-                    (lambda _ (zero? (system* "autoreconf" "-vfi"))))
+                    (lambda _ (invoke "autoreconf" "-vfi")))
                   (add-before 'configure 'patch-llvm-config
                     (lambda _
                       (substitute* '("libclamav/c++/detect.cpp"
diff --git a/gnu/packages/aux-files/linux-libre/4.19-arm64.conf b/gnu/packages/aux-files/linux-libre/4.19-arm64.conf
index ba6fa177b7..73cd300c18 100644
--- a/gnu/packages/aux-files/linux-libre/4.19-arm64.conf
+++ b/gnu/packages/aux-files/linux-libre/4.19-arm64.conf
@@ -7860,7 +7860,7 @@ CONFIG_CRYPTO_VMAC=m
 #
 # Digest
 #
-CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_CRC32C=y
 CONFIG_CRYPTO_CRC32=m
 CONFIG_CRYPTO_CRCT10DIF=y
 CONFIG_CRYPTO_GHASH=m
diff --git a/gnu/packages/aux-files/linux-libre/4.20-arm64.conf b/gnu/packages/aux-files/linux-libre/4.20-arm64.conf
index 9e71cadf0c..3833e3e363 100644
--- a/gnu/packages/aux-files/linux-libre/4.20-arm64.conf
+++ b/gnu/packages/aux-files/linux-libre/4.20-arm64.conf
@@ -7932,7 +7932,7 @@ CONFIG_CRYPTO_VMAC=m
 #
 # Digest
 #
-CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_CRC32C=y
 CONFIG_CRYPTO_CRC32=m
 CONFIG_CRYPTO_CRCT10DIF=y
 CONFIG_CRYPTO_GHASH=m
diff --git a/gnu/packages/axoloti.scm b/gnu/packages/axoloti.scm
index 4963bb33cf..6a76ad6be7 100644
--- a/gnu/packages/axoloti.scm
+++ b/gnu/packages/axoloti.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -94,10 +94,10 @@
          (add-after 'unpack 'patch-paths
            (lambda* (#:key inputs #:allow-other-keys)
              ;; prepare ChibiOS
-             (and (zero? (system* "unzip" "-o" (assoc-ref inputs "chibios")))
-                  (zero? (system* "mv" "ChibiOS_2.6.9" "chibios"))
-                  (with-directory-excursion "chibios/ext"
-                    (zero? (system* "unzip" "-o" "fatfs-0.9-patched.zip"))))
+             (invoke "unzip" "-o" (assoc-ref inputs "chibios"))
+             (invoke "mv" "ChibiOS_2.6.9" "chibios")
+             (with-directory-excursion "chibios/ext"
+               (invoke "unzip" "-o" "fatfs-0.9-patched.zip"))
 
              ;; Remove source of non-determinism in ChibiOS
              (substitute* "chibios/os/various/shell.c"
@@ -149,7 +149,7 @@
                        (string-append toolchain
                                       "/arm-none-eabi/lib")))
              (with-directory-excursion "platform_linux"
-               (zero? (system* "sh" "compile_firmware.sh")))))
+               (invoke "sh" "compile_firmware.sh"))))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out   (assoc-ref outputs "out"))
@@ -284,14 +284,14 @@ runtime.")
                     port)))
 
                ;; Build it!
-               (zero? (system* "ant"
-                               (string-append "-Djavac.classpath=" classpath)
-                               "-Dbuild.runtime=true"
-                               "-Dbuild.time=01/01/1970 00:00:00"
-                               "-Djavac.source=1.7"
-                               "-Djavac.target=1.7"
-                               (string-append "-Dtag.short.version="
-                                              ,version))))))
+               (invoke "ant"
+                       (string-append "-Djavac.classpath=" classpath)
+                       "-Dbuild.runtime=true"
+                       "-Dbuild.time=01/01/1970 00:00:00"
+                       "-Djavac.source=1.7"
+                       "-Djavac.target=1.7"
+                       (string-append "-Dtag.short.version="
+                                      ,version)))))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out   (assoc-ref outputs "out"))
diff --git a/gnu/packages/benchmark.scm b/gnu/packages/benchmark.scm
index e97e827cea..c670a9af1c 100644
--- a/gnu/packages/benchmark.scm
+++ b/gnu/packages/benchmark.scm
@@ -135,10 +135,9 @@ is to write a job file matching the I/O load one wants to simulate.")
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((mpi-home (assoc-ref inputs "mpi")))
-               (zero?
-                ;; Not safe for parallel build
-                (system* "make" "-C" "imb/src" "-f" "make_mpich" "SHELL=sh"
-                         (string-append "MPI_HOME=" mpi-home))))))
+               ;; Not safe for parallel build
+               (invoke "make" "-C" "imb/src" "-f" "make_mpich" "SHELL=sh"
+                       (string-append "MPI_HOME=" mpi-home)))))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
diff --git a/gnu/packages/cdrom.scm b/gnu/packages/cdrom.scm
index cf095a17b7..b44cc3bce9 100644
--- a/gnu/packages/cdrom.scm
+++ b/gnu/packages/cdrom.scm
@@ -11,7 +11,7 @@
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
-;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2019 Eric Bavier <bavier@member.fsf.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -246,7 +246,12 @@ reconstruction capability.")
     (inputs
      `(("linux-headers" ,linux-libre-headers)))
     (arguments
-     `(#:phases
+     `(#:make-flags
+       (list "RM=rm" "LN=ln" "SYMLINK=ln -s"
+             "CONFIG_SHELL=sh" "CCOM=gcc"
+             (string-append "INS_BASE=" (assoc-ref %outputs "out"))
+             (string-append "INS_RBASE=" (assoc-ref %outputs "out")))
+       #:phases
        (modify-phases %standard-phases
          (delete 'configure)
          (add-before 'build 'set-linux-headers
@@ -261,19 +266,7 @@ reconstruction capability.")
                                   (find-files "DEFAULTS_ENG" "^Defaults\\.")
                                   (find-files "TEMPLATES" "^Defaults\\."))
                (("/opt/schily") (assoc-ref %outputs "out")))
-             #t))
-         (replace 'build
-           (lambda _
-             (zero?
-              (system* "make" "CONFIG_SHELL=sh" "CCOM=gcc" "RM=rm"))))
-         (replace 'install
-           (lambda _
-             (zero?
-              (system* "make"
-                       "RM=rm" "LN=ln" "SYMLINK=ln -s"
-                       (string-append "INS_BASE=" (assoc-ref %outputs "out"))
-                       (string-append "INS_RBASE=" (assoc-ref %outputs "out"))
-                       "install" )))))
+             #t)))
        #:tests? #f))  ; no tests
    (synopsis "Command line utilities to manipulate and burn CD/DVD/BD images")
    (description "cdrtools is a collection of command line utilities to create
diff --git a/gnu/packages/code.scm b/gnu/packages/code.scm
index 3a575ad380..cfe014e81e 100644
--- a/gnu/packages/code.scm
+++ b/gnu/packages/code.scm
@@ -186,14 +186,15 @@ around in a large, deeply nested project.")
                                   (mkdir-p (string-append out
                                                           "/share/man/man1"))
                                   (mkdir-p (string-append out
-                                                          "/share/doc")))))
+                                                          "/share/doc"))
+                                  #t)))
                   (replace 'check
                            (lambda _
                              (setenv "HOME" (getcwd))
                              (setenv "PATH"
                                      (string-append (getcwd) ":"
                                                     (getenv "PATH")))
-                             (zero? (system* "make" "test")))))
+                             (invoke "make" "test"))))
 
         #:make-flags (list (string-append "PREFIX="
                                           (assoc-ref %outputs "out")))))
diff --git a/gnu/packages/connman.scm b/gnu/packages/connman.scm
index 1dbbe7c1c2..1290dd010d 100644
--- a/gnu/packages/connman.scm
+++ b/gnu/packages/connman.scm
@@ -160,10 +160,9 @@ sharing) to clients via USB, ethernet, WiFi, cellular and Bluetooth.")
        (modify-phases %standard-phases
          (replace 'configure
            (lambda* (#:key outputs #:allow-other-keys)
-             (zero?
-              (system* "qmake"
-                       (string-append "PREFIX="
-                                      (assoc-ref outputs "out"))))))
+             (invoke "qmake"
+                     (string-append "PREFIX="
+                                    (assoc-ref outputs "out")))))
          (add-before 'install 'fix-Makefiles
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
diff --git a/gnu/packages/coq.scm b/gnu/packages/coq.scm
index 3a898814c3..51dd5dedcf 100644
--- a/gnu/packages/coq.scm
+++ b/gnu/packages/coq.scm
@@ -155,17 +155,16 @@ It is developed using Objective Caml and Camlp5.")
                                           "EMACS=" emacs "/bin/emacs")))
                         #t)))
          (add-after 'unpack 'clean
-                    (lambda _
-                      ;; Delete the pre-compiled elc files for Emacs 23.
-                      (zero? (system* "make" "clean"))))
+           (lambda _
+             ;; Delete the pre-compiled elc files for Emacs 23.
+             (invoke "make" "clean")))
          (add-after 'install 'install-doc
-                    (lambda* (#:key make-flags #:allow-other-keys)
-                      ;; XXX FIXME avoid building/installing pdf files,
-                      ;; due to unresolved errors building them.
-                      (substitute* "Makefile"
-                        ((" [^ ]*\\.pdf") ""))
-                      (zero? (apply system* "make" "install-doc"
-                                    make-flags)))))))
+           (lambda* (#:key make-flags #:allow-other-keys)
+             ;; XXX FIXME avoid building/installing pdf files,
+             ;; due to unresolved errors building them.
+             (substitute* "Makefile"
+               ((" [^ ]*\\.pdf") ""))
+             (apply invoke "make" "install-doc" make-flags))))))
     (home-page "http://proofgeneral.inf.ed.ac.uk/")
     (synopsis "Generic front-end for proof assistants based on Emacs")
     (description
@@ -255,16 +254,14 @@ inside Coq.")
          (add-before 'configure 'fix-remake
            (lambda _
              (substitute* "remake.cpp"
-               (("/bin/sh") (which "sh")))))
+               (("/bin/sh") (which "sh")))
+             #t))
          (replace 'build
-           (lambda _
-             (zero? (system* "./remake"))))
+           (lambda _ (invoke "./remake")))
          (replace 'check
-           (lambda _
-             (zero? (system* "./remake" "check"))))
+           (lambda _ (invoke "./remake" "check")))
          (replace 'install
-           (lambda _
-             (zero? (system* "./remake" "install")))))))
+           (lambda _ (invoke "./remake" "install"))))))
     (home-page "http://gappa.gforge.inria.fr/")
     (synopsis "Verify and formally prove properties on numerical programs")
     (description "Gappa is a tool intended to help verifying and formally proving
@@ -298,15 +295,14 @@ assistant.")
        (modify-phases %standard-phases
          (delete 'configure)
          (add-before 'build 'chdir
-           (lambda _
-             (chdir "mathcomp")))
+           (lambda _ (chdir "mathcomp") #t))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (setenv "COQLIB" (string-append (assoc-ref outputs "out") "/lib/coq/"))
-             (zero? (system* "make" "-f" "Makefile.coq"
-                             (string-append "COQLIB=" (assoc-ref outputs "out")
-                                            "/lib/coq/")
-                             "install")))))))
+             (invoke "make" "-f" "Makefile.coq"
+                     (string-append "COQLIB=" (assoc-ref outputs "out")
+                                    "/lib/coq/")
+                     "install"))))))
     (home-page "https://math-comp.github.io/math-comp/")
     (synopsis "Mathematical Components for Coq")
     (description "Mathematical Components for Coq has its origins in the formal
@@ -351,16 +347,14 @@ part of the distribution.")
          (add-before 'configure 'fix-remake
            (lambda _
              (substitute* "remake.cpp"
-               (("/bin/sh") (which "sh")))))
+               (("/bin/sh") (which "sh")))
+             #t))
          (replace 'build
-           (lambda _
-             (zero? (system* "./remake"))))
+           (lambda _ (invoke "./remake")))
          (replace 'check
-           (lambda _
-             (zero? (system* "./remake" "check"))))
+           (lambda _ (invoke "./remake" "check")))
          (replace 'install
-           (lambda _
-             (zero? (system* "./remake" "install")))))))
+           (lambda _ (invoke "./remake" "install"))))))
     (home-page "http://coquelicot.saclay.inria.fr/index.html")
     (synopsis "Coq library for Reals")
     (description "Coquelicot is an easier way of writing formulas and theorem
@@ -436,16 +430,14 @@ provides BigN, BigZ, BigQ that used to be part of Coq standard library.")
          (add-before 'configure 'fix-remake
            (lambda _
              (substitute* "remake.cpp"
-               (("/bin/sh") (which "sh")))))
+               (("/bin/sh") (which "sh")))
+             #t))
          (replace 'build
-           (lambda _
-             (zero? (system* "./remake"))))
+           (lambda _ (invoke "./remake")))
          (replace 'check
-           (lambda _
-             (zero? (system* "./remake" "check"))))
+           (lambda _ (invoke "./remake" "check")))
          (replace 'install
-           (lambda _
-             (zero? (system* "./remake" "install")))))))
+           (lambda _ (invoke "./remake" "install"))))))
     (home-page "http://coq-interval.gforge.inria.fr/")
     (synopsis "Coq tactics to simplify inequality proofs")
     (description "Interval provides vernacular files containing tactics for
diff --git a/gnu/packages/crypto.scm b/gnu/packages/crypto.scm
index 2c63e53191..bef8235a97 100644
--- a/gnu/packages/crypto.scm
+++ b/gnu/packages/crypto.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
-;;; Copyright © 2015, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox>
 ;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
@@ -303,13 +303,12 @@ secure operations. ")
            (delete 'configure)
            (replace 'check
              (lambda _
-               (and
-                 (zero? (system* "./worgen" "8-12" "top1000.txt" "3-10" "top400nouns.txt"
-                                 "3-6" "top150adjectives.txt" "3-6"))
-                 (zero? (system* "./eschalot" "-r" "^guix|^guixsd"))
-                 (zero? (system* "./eschalot" "-r" "^gnu|^free"))
-                 (zero? (system* "./eschalot" "-r" "^cyber|^hack"))
-                 (zero? (system* "./eschalot" "-r" "^troll")))))
+               (invoke "./worgen" "8-12" "top1000.txt" "3-10" "top400nouns.txt"
+                       "3-6" "top150adjectives.txt" "3-6")
+               (invoke "./eschalot" "-r" "^guix|^guixsd")
+               (invoke "./eschalot" "-r" "^gnu|^free")
+               (invoke "./eschalot" "-r" "^cyber|^hack")
+               (invoke "./eschalot" "-r" "^troll")))
            ;; Make install can not create the bin dir, create it.
            (add-before 'install 'create-bin-dir
              (lambda* (#:key outputs #:allow-other-keys)
diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm
index 5baaa6c102..502cdde7da 100644
--- a/gnu/packages/display-managers.scm
+++ b/gnu/packages/display-managers.scm
@@ -107,7 +107,7 @@
          (replace 'check
            (lambda _
              (setenv "DBUS_FATAL_WARNINGS" "0")
-             (zero? (system* "dbus-launch" "ctest" "."))))
+             (invoke "dbus-launch" "ctest" ".")))
          (add-before 'check 'check-setup
            (lambda _
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 02e227d42d..bd084bd2d8 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -4648,7 +4648,7 @@ indentation (space indentation only).
 (define-public emacs-elpy
   (package
     (name "emacs-elpy")
-    (version "1.27.0")
+    (version "1.28.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4657,7 +4657,7 @@ indentation (space indentation only).
               (file-name (string-append name "-" version "-checkout"))
               (sha256
                (base32
-                "1b76y0kzk7s9ya8k9bpsgn31i9l0rxs4iz6lg7snhjgh03k0ssgv"))))
+                "073bwxwjzcbmvpcz9q2xjwzx9x7hkvjni6fwvikh6yawzjp56jis"))))
     (build-system emacs-build-system)
     (arguments
      `(#:include (cons* "^elpy/[^/]+\\.py$" "^snippets\\/" %default-include)
@@ -6037,7 +6037,7 @@ highlights quasi-quoted expressions.")
 (define-public emacspeak
   (package
     (name "emacspeak")
-    (version "48.0")
+    (version "49.0")
     (source
      (origin
        (method url-fetch)
@@ -6046,7 +6046,7 @@ highlights quasi-quoted expressions.")
              version "/emacspeak-" version ".tar.bz2"))
        (sha256
         (base32
-         "07imi3hji06b3r7v7v59978q76s8a7ynmxwfc9j03pgnv965lpjy"))))
+         "1smf26m7201z0bk49lzbw9zhbjfi6wylidfjixb8ylp6g0wnh8dx"))))
     (build-system gnu-build-system)
     (arguments
      '(#:make-flags (list (string-append "prefix="
@@ -6081,9 +6081,8 @@ highlights quasi-quoted expressions.")
                   "stumpwm" "xsl"))
                ;; Make sure emacspeak is loaded from the correct directory.
                (substitute* "etc/emacspeak.sh"
-                 (("exec FLAVOR.*")
-                  (string-append "exec " emacs " -l " lisp
-                                 "/lisp/emacspeak-setup.el $CL_ALL")))
+                 (("/lisp/emacspeak-setup.el")
+                  (string-append lisp "/lisp/emacspeak-setup.el")))
                ;; Install the convenient startup script.
                (mkdir-p bin)
                (copy-file "etc/emacspeak.sh" (string-append bin "/emacspeak")))
@@ -10160,6 +10159,32 @@ time is being spent during Emacs startup in order to optimize startup time.")
   ;; A new mpv backend is included in Emms from 5.0.
   (deprecated-package "emacs-emms-player-simple-mpv" emacs-emms))
 
+(define-public emacs-magit-gerrit
+  (let ((version "0.3")
+        (revision "1")
+        (commit "ece6f369694aca17f3ac166ed2801b432acfe20d"))
+    (package
+      (name "emacs-magit-gerrit")
+      (version (git-version version revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/terranpro/magit-gerrit.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0mms0gxv9a3ns8lk5k2wjibm3088y1cmpr3axjdh6ppv7r5wdvii"))))
+      (build-system emacs-build-system)
+      (propagated-inputs
+       `(("emacs-magit" ,emacs-magit)))
+      (home-page "https://github.com/terranpro/magit-gerrit")
+      (synopsis "Magit extension for Gerrit")
+      (description "This Magit extension provides integration with Gerrit,
+which makes it possible to conduct Gerrit code reviews directly from within
+Emacs.")
+      (license license:gpl3+))))
+
 (define-public emacs-magit-org-todos-el
   (let ((commit "df206287737b9671f2e36ae7b1474ebbe9940d2a"))
     (package
@@ -12920,3 +12945,28 @@ to open SQLite databases.")
 Nix expressions.  It supports syntax highlighting, indenting and refilling of
 comments.")
     (license license:lgpl2.1+)))
+
+(define-public emacs-simple-mpc
+  ;; There have been no releases.
+  (let ((commit "bee8520e81292b4c7353e45b193f9a13b482f5b2")
+        (revision "1"))
+    (package
+      (name "emacs-simple-mpc")
+      (version (git-version "0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/jorenvo/simple-mpc.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1ja06pv007cmzjjgka95jlg31k7d29jrih1yxyblsxv85s9sg21q"))))
+      (build-system emacs-build-system)
+      (propagated-inputs `(("emacs-s" ,emacs-s)))
+      (home-page "https://github.com/jorenvo/simple-mpc")
+      (synopsis "Simple Emacs frontend to mpc")
+      (description "This package provides an Emacs major mode which acts as a
+front end to mpc, a client for the @dfn{Music Player Daemon} (MPD).")
+      (license license:gpl3+))))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index a488289f11..7e8dcadf96 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -59,6 +59,7 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages webkit)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
   #:use-module (guix utils)
@@ -210,6 +211,22 @@ languages.")
     (native-inputs
      `(("pkg-config" ,pkg-config)))))
 
+(define-public emacs-xwidgets
+  (package
+    (inherit emacs)
+    (name "emacs-xwidgets")
+    (synopsis "The extensible, customizable, self-documenting text
+editor (with xwidgets support)")
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       '("--with-xwidgets")
+       ,@(package-arguments emacs)))
+    (inputs
+     `(("webkitgtk" ,webkitgtk)
+       ("libxcomposite" ,libxcomposite)
+       ,@(package-inputs emacs)))))
+
 (define-public emacs-no-x
   (package (inherit emacs)
     (name "emacs-no-x")
diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index f20d1e17c7..1e7fd098cb 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -348,8 +348,8 @@ SEGGER J-Link and compatible devices.")
          (replace 'configure
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "./configure"
-                               (string-append "--prefix=" out)))))))))
+               (invoke "./configure"
+                       (string-append "--prefix=" out))))))))
     (home-page "http://jim.tcl.tk")
     (synopsis "Small footprint Tcl implementation")
     (description "Jim is a small footprint implementation of the Tcl programming
@@ -575,7 +575,7 @@ with a layered architecture of JTAG interface and TAP support.")
            ;; have to create the target directories at build time.
            (add-before 'build 'create-target-directories
              (lambda* (#:key make-flags #:allow-other-keys)
-               (zero? (apply system* "make" "install-dirs" make-flags))))
+               (apply invoke "make" "install-dirs" make-flags)))
            (add-before 'build 'set-cross-environment-variables
              (lambda* (#:key outputs #:allow-other-keys)
                (setenv "CROSS_LIBRARY_PATH"
@@ -589,7 +589,7 @@ with a layered architecture of JTAG interface and TAP support.")
                #t))
            (add-before 'install 'install-includes
              (lambda* (#:key make-flags #:allow-other-keys)
-               (zero? (apply system* "make" "install-includes" make-flags)))))))
+               (apply invoke "make" "install-includes" make-flags))))))
       (native-inputs
        `(("propeller-gcc" ,propeller-gcc)
          ("propeller-binutils" ,propeller-binutils)
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 85e08289b5..9501e772fd 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2016, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 David Thompson <davet@gnu.org>
@@ -390,9 +390,9 @@ optimizer; and it can produce photorealistic and design review images.")
          (replace 'configure
            ;; The configure script doesn't tolerate most of our configure flags.
            (lambda* (#:key outputs #:allow-other-keys)
-             (zero? (system* "sh" "configure"
-                             (string-append "--prefix="
-                                            (assoc-ref outputs "out")))))))))
+             (invoke "sh" "configure"
+                     (string-append "--prefix="
+                                    (assoc-ref outputs "out"))))))))
     (home-page "http://repo.hu/projects/pcb-rnd/")
     (description "PCB RND is a fork of the GNU PCB circuit board editing tool
 featuring various improvements and bug fixes.")))
diff --git a/gnu/packages/entr.scm b/gnu/packages/entr.scm
index 11d28e60f7..19667ce23f 100644
--- a/gnu/packages/entr.scm
+++ b/gnu/packages/entr.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com>
 ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,33 +27,35 @@
 (define-public entr
   (package
     (name "entr")
-    (version "3.6")
+    (version "4.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://entrproject.org/code/entr-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1sy81np6kgmq04kfn2ckf4fp7jcf5d1963shgmapx3al3kc4c9x4"))))
+                "0y7gvyf0iykpf3gfw09m21hy51m6qn4cpkbrm4nnn7pwrwycj0y5"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
-       #:phases (modify-phases %standard-phases
-                  (replace 'configure
-                    (lambda* (#:key outputs #:allow-other-keys)
-                      (let ((out (assoc-ref outputs "out")))
-                        (setenv "CONFIG_SHELL" (which "bash"))
-                        (setenv "CC" (which "gcc"))
-                        (setenv "DESTDIR" (string-append out "/"))
-                        (setenv "PREFIX" "")
-                        (setenv "MANPREFIX" "man")
-                        (zero? (system* "./configure")))))
-                  (add-before 'build 'remove-fhs-file-names
-                    (lambda _
-                      ;; Use the tools available in $PATH.
-                      (substitute* "entr.c"
-                        (("/bin/cat") "cat")
-                        (("/usr/bin/clear") "clear")))))))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (setenv "CONFIG_SHELL" (which "bash"))
+               (setenv "CC" (which "gcc"))
+               (setenv "DESTDIR" (string-append out "/"))
+               (setenv "PREFIX" "")
+               (setenv "MANPREFIX" "man")
+               (invoke "./configure"))))
+         (add-before 'build 'remove-fhs-file-names
+           (lambda _
+             ;; Use the tools available in $PATH.
+             (substitute* "entr.c"
+               (("/bin/cat") "cat")
+               (("/usr/bin/clear") "clear"))
+             #t)))))
     (home-page "http://entrproject.org/")
     (synopsis "Run arbitrary commands when files change")
     (description
diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index 3130103eaf..7c497ccc75 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015, 2017 Andy Wingo <wingo@pobox.com>
 ;;; Copyright © 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
 ;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Kei Kebreau <kkebreau@posteo.net>
@@ -209,12 +209,12 @@ other applications that need to directly deal with input devices.")
     (arguments
      '(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'autogen
+         (add-after 'unpack 'patch-autogen
            (lambda _
              ;; Run 'configure' in its own phase, not now.
              (substitute* "autogen.sh"
                (("^.*\\./configure.*") ""))
-             (zero? (system* "sh" "autogen.sh")))))))
+             #t)))))
     (native-inputs
      `(("autoconf" ,autoconf)
        ("automake" ,automake)
diff --git a/gnu/packages/ftp.scm b/gnu/packages/ftp.scm
index 8ad782ad85..bc44d7537a 100644
--- a/gnu/packages/ftp.scm
+++ b/gnu/packages/ftp.scm
@@ -126,9 +126,9 @@ reliability in mind.")
                     (let ((out (assoc-ref outputs "out")))
                       (setenv "CONFIG_SHELL" (which "sh"))
                       (setenv "SHELL" (which "sh"))
-                      (zero? (system* "./configure"
-                                      (string-append "--prefix=" out)))))))
-                #:tests? #f))           ;there are no tests
+                      (invoke "./configure"
+                              (string-append "--prefix=" out))))))
+       #:tests? #f)) ;there are no tests
     (inputs `(("ncurses" ,ncurses)))
     (home-page "http://www.ncftp.com/ncftp/")
     (synopsis "Command-line File Transfer Protocol (FTP) client")
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 176f56e7a2..3fb284618b 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -4027,7 +4027,7 @@ emerges from a sewer hole and pulls her below ground.")
 (define-public cdogs-sdl
   (package
     (name "cdogs-sdl")
-    (version "0.6.8")
+    (version "0.6.9")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4036,7 +4036,7 @@ emerges from a sewer hole and pulls her below ground.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1v0adxm4xsix6r6j9hs7vmss7pxrb37azwfazr54p1dmfz4s6rp8"))))
+                "13gyv2hzk43za1n3lsjnd5v64xlzfzq7n10scd1rcbsnk1n007zr"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags
diff --git a/gnu/packages/gnucash.scm b/gnu/packages/gnucash.scm
index b546233873..8f1bc20bc2 100644
--- a/gnu/packages/gnucash.scm
+++ b/gnu/packages/gnucash.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -49,20 +50,20 @@
   #:use-module (gnu packages xml))
 
 (define-public gnucash
+  ;; TODO: Unbundle libraries such as guile-json found under the "borrowed/"
+  ;; directory.
   (package
     (name "gnucash")
-    (version "3.3")
+    (version "3.4")
     (source
      (origin
-      (method url-fetch)
-      (uri (string-append "mirror://sourceforge/gnucash/gnucash%20%28stable%29/"
-                          version "/gnucash-" version ".tar.bz2"))
-      (sha256
-       (base32
-        "0grr5qi5rn1xvr7qx5d7mcxa2mcgycy2b325ry73bb485a6yv5l3"))
-      (patches (search-patches "gnucash-price-quotes-perl.patch"
-                               "gnucash-disable-failing-tests.patch"
-                               "gnucash-fix-test-transaction-failure.patch"))))
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/gnucash/gnucash%20%28stable%29/"
+                           version "/gnucash-" version ".tar.bz2"))
+       (sha256
+        (base32
+         "1ms2wg4sh5gq3rpjmmnp85rh5nc9ahca1imxkvhz4d3yiwy8hm52"))
+       (patches (search-patches "gnucash-fix-test-transaction-failure.patch"))))
     (build-system cmake-build-system)
     (inputs
      `(("guile" ,guile-2.2)
@@ -79,18 +80,18 @@
        ("perl-finance-quote" ,perl-finance-quote)
        ("tzdata" ,tzdata-for-tests)))
     (native-inputs
-     `(("glib" ,glib "bin") ; glib-compile-schemas, etc.
+     `(("glib" ,glib "bin")             ; glib-compile-schemas, etc.
        ("intltool" ,intltool)
        ("googlemock" ,(package-source googletest))
        ("googletest" ,googletest)
        ("gnucash-docs" ,gnucash-docs)
        ("pkg-config" ,pkg-config)))
-    (outputs '("out" "doc"))
+    (outputs '("out" "doc" "debug"))
     (arguments
      `(#:test-target "check"
        #:configure-flags
-       (list "-DWITH_OFX=OFF"  ; libofx is not available yet
-             "-DWITH_SQL=OFF") ; without dbi.h
+       (list "-DWITH_OFX=OFF"           ; libofx is not available yet
+             "-DWITH_SQL=OFF")          ; without dbi.h
        #:make-flags '("GUILE_AUTO_COMPILE=0")
        #:modules ((guix build cmake-build-system)
                   ((guix build glib-or-gtk-build-system) #:prefix glib-or-gtk:)
@@ -119,44 +120,64 @@
                  (("set\\(SHELL /bin/bash\\)")
                   (string-append "set(SHELL " (which "bash") ")")))
                #t)))
+         ;; After wrapping gnc-fq-check and gnc-fq-helper we can no longer
+         ;; execute them with perl, so execute them directly instead.
+         (add-after 'unpack 'fix-finance-quote-check
+           (lambda _
+             (substitute* "libgnucash/scm/price-quotes.scm"
+               (("\"perl\" \"-w\" ") ""))
+             #t))
+         ;; The test-stress-options unit test is known to fail, so we disable
+         ;; it (see: https://bugs.gnucash.org/show_bug.cgi?id=796877).
+         (add-after 'unpack 'disable-stress-options-test
+           (lambda _
+             (substitute* "gnucash/report/standard-reports/test/CMakeLists.txt"
+               (("test-stress-options.scm") ""))
+             #t))
+         ;; The qof test requires the en_US, en_GB, and fr_FR locales.
+         (add-before 'check 'install-locales
+           (lambda _
+             (setenv "LOCPATH" (getcwd))
+             (invoke "localedef" "-i" "en_US" "-f" "UTF-8" "./en_US.UTF-8")
+             (invoke "localedef" "-i" "en_GB" "-f" "UTF-8" "./en_GB.UTF-8")
+             (invoke "localedef" "-i" "fr_FR" "-f" "UTF-8" "./fr_FR.UTF-8")
+             #t))
          ;; There are about 100 megabytes of documentation.
-         (add-after
-          'install 'install-docs
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (let ((docs (assoc-ref inputs "gnucash-docs"))
-                  (doc-output (assoc-ref outputs "doc")))
-              (mkdir-p (string-append doc-output "/share"))
-              (symlink (string-append docs "/share/gnome")
-                       (string-append doc-output "/share/gnome"))
-              #t)))
-         (add-after
-          'install-docs 'wrap-programs
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (for-each (lambda (prog)
-                        (wrap-program (string-append (assoc-ref outputs "out")
-                                                     "/bin/" prog)
-                          `("PERL5LIB" ":" prefix
-                            ,(map (lambda (o)
-                                    (string-append o "/lib/perl5/site_perl/"
-                                                   ,(package-version perl)))
-                                  (if (string=? prog "gnc-fq-helper")
-                                      (list
-                                       ,@(transitive-input-references
-                                          'inputs
-                                          (map (lambda (l)
-                                                 (assoc l (inputs)))
-                                               '("perl-finance-quote"
-                                                 "perl-date-manip"))))
-                                      (list
-                                       ,@(transitive-input-references
-                                          'inputs
-                                          (map (lambda (l)
-                                                 (assoc l (inputs)))
-                                               '("perl-finance-quote")))))))))
-                      '("gnucash"
-                        "gnc-fq-check"
-                        "gnc-fq-helper"
-                        "gnc-fq-dump"))))
+         (add-after 'install 'install-docs
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((docs (assoc-ref inputs "gnucash-docs"))
+                   (doc-output (assoc-ref outputs "doc")))
+               (mkdir-p (string-append doc-output "/share"))
+               (symlink (string-append docs "/share/gnome")
+                        (string-append doc-output "/share/gnome"))
+               #t)))
+         (add-after 'install-docs 'wrap-programs
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (for-each (lambda (prog)
+                         (wrap-program (string-append (assoc-ref outputs "out")
+                                                      "/bin/" prog)
+                           `("PERL5LIB" ":" prefix
+                             ,(map (lambda (o)
+                                     (string-append o "/lib/perl5/site_perl/"
+                                                    ,(package-version perl)))
+                                   (if (string=? prog "gnc-fq-helper")
+                                       (list
+                                        ,@(transitive-input-references
+                                           'inputs
+                                           (map (lambda (l)
+                                                  (assoc l (inputs)))
+                                                '("perl-finance-quote"
+                                                  "perl-date-manip"))))
+                                       (list
+                                        ,@(transitive-input-references
+                                           'inputs
+                                           (map (lambda (l)
+                                                  (assoc l (inputs)))
+                                                '("perl-finance-quote")))))))))
+                       '("gnucash"
+                         "gnc-fq-check"
+                         "gnc-fq-helper"
+                         "gnc-fq-dump"))))
          (add-after 'install 'glib-or-gtk-compile-schemas
            (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-compile-schemas))
          (add-after 'install 'glib-or-gtk-wrap
@@ -168,44 +189,46 @@
 It can be used to track bank accounts, stocks, income and expenses, based on
 the double-entry accounting practice.  It includes support for QIF/OFX/HBCI
 import and transaction matching.  It also automates several tasks, such as
-financial calculations or scheduled transactions.")
+financial calculations or scheduled transactions.
+
+To make the GnuCash documentation available, its doc output must be
+installed as well as Yelp, the Gnome help browser.")
     (license license:gpl3+)))
 
 ;; This package is not public, since we use it to build the "doc" output of
 ;; the gnucash package (see above).  It would be confusing if it were public.
 (define gnucash-docs
-  (package
-    (name "gnucash-docs")
-    (version (package-version gnucash))
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://sourceforge/gnucash/gnucash%20%28stable%29/"
-                           version "/gnucash-docs-" version ".tar.gz"))
-       (sha256
-        (base32
-         "10v4hw4lh888r8yv473pqrvzfjg8dwamk62sghs93rn88ndwm16c"))))
-    (build-system gnu-build-system)
-    ;; These are native-inputs because they are only required for building the
-    ;; documentation.
-    (native-inputs
-     `(("libxml2" ,libxml2)
-       ;; The "check" target needs the docbook xml packages for validating the
-       ;; DocBook XML during the tests.
-       ("docbook-xml-4.4" ,docbook-xml-4.4)
-       ("docbook-xml-4.2" ,docbook-xml-4.2)
-       ("docbook-xml-4.1.2" ,docbook-xml-4.1.2)
-       ("libxslt" ,libxslt)
-       ("docbook-xsl" ,docbook-xsl)
-       ("scrollkeeper" ,scrollkeeper)))
-    (home-page "https://www.gnucash.org/")
-    (synopsis "Documentation for GnuCash")
-    (description
-     "User guide and other documentation for GnuCash in various languages.
+  (let ((revision "a"))              ;set to the empty string when no revision
+    (package
+      (name "gnucash-docs")
+      (version (package-version gnucash))
+      (source
+       (origin
+         (method url-fetch)
+         (uri (string-append "mirror://sourceforge/gnucash/gnucash%20%28stable%29/"
+                             version "/gnucash-docs-" version revision ".tar.gz"))
+         (sha256
+          (base32
+           "0bgjxpxgk7hy8ihn1kvd8p6vv191q5md2hz6jb9mqc4aykpvdlq7"))))
+      (build-system gnu-build-system)
+      ;; These are native-inputs because they are only required for building the
+      ;; documentation.
+      (native-inputs
+       `(("libxml2" ,libxml2)
+         ;; The "check" target needs the docbook xml package for validating the
+         ;; DocBook XML during the tests.
+         ("docbook-xml" ,docbook-xml)
+         ("libxslt" ,libxslt)
+         ("docbook-xsl" ,docbook-xsl)
+         ("scrollkeeper" ,scrollkeeper)))
+      (home-page "https://www.gnucash.org/")
+      (synopsis "Documentation for GnuCash")
+      (description
+       "User guide and other documentation for GnuCash in various languages.
 This package exists because the GnuCash project maintains its documentation in
 an entirely separate package from the actual GnuCash program.  It is intended
 to be read using the GNOME Yelp program.")
-    (license (list license:fdl1.1+ license:gpl3+))))
+      (license (list license:fdl1.1+ license:gpl3+)))))
 
 (define-public gwenhywfar
   (package
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 145130f042..2b3ee89d35 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net>
@@ -369,7 +369,7 @@ libskba (working with X.509 certificates and CMS data).")
 (define-public gpgme
   (package
     (name "gpgme")
-    (version "1.11.1")
+    (version "1.12.0")
     (source
      (origin
       (method url-fetch)
@@ -377,7 +377,16 @@ libskba (working with X.509 certificates and CMS data).")
                           ".tar.bz2"))
       (sha256
        (base32
-        "0vxx5xaag3rhp4g2arp5qm77gvz4kj0m3hnpvhkdvqyjfhbi26rd"))))
+        "1n4c1q2ls7sqx1vpr3p5n8vbjkw6kqp8jxqa28p0x9j36wf9bp5l"))
+      ;; One test fails because the conflict keys have expired.  See
+      ;; https://dev.gnupg.org/T3815
+      (patches (list (origin
+                       (method url-fetch)
+                       (uri "https://dev.gnupg.org/rM66376f3e206a1aa791d712fb8577bb3490268f60?diff=1")
+                       (file-name "gpgme-fix-conflict-test-keys.patch")
+                       (sha256
+                        (base32
+                         "0j718iy5a9fhkrfs4gzrnm4ggi163prqf1i8lfmqczswvz88zfly")))))))
     (build-system gnu-build-system)
     (native-inputs
      `(("gnupg" ,gnupg)))
@@ -523,11 +532,9 @@ distributed separately.")
      `(#:phases
        (modify-phases %standard-phases
          (add-before 'build 'make-build
-           (lambda _
-             (zero? (system* "make" "build"))))
+           (lambda _ (invoke "make" "build")))
          (replace 'check
-           (lambda _
-             (zero? (system* "make" "check")))))))
+           (lambda _ (invoke "make" "check"))))))
     (build-system python-build-system)
     (native-inputs
      `(("gnupg" ,gnupg-1)))
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index a25816778a..bf4cc89b08 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -651,8 +651,8 @@ output.")
                     (replace 'configure
                       (lambda* (#:key outputs #:allow-other-keys)
                         (let ((out (assoc-ref outputs "out")))
-                          (zero? (system* "qmake"
-                                          (string-append "prefix=" out))))))
+                          (invoke "qmake"
+                                  (string-append "prefix=" out)))))
                     (add-after 'install 'wrap-program
                       (lambda* (#:key outputs #:allow-other-keys)
                         (let* ((out (assoc-ref outputs "out"))
@@ -668,7 +668,8 @@ output.")
 cd \"~a\"
 exec -a \"$0\" ~a/.brdf-real~%"
                                         data bin)))
-                            (chmod "brdf" #o555))))))))
+                            (chmod "brdf" #o555)))
+                        #t)))))
       (native-inputs
        `(("qttools" ,qttools))) ;for 'qmake'
       (inputs
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index b1447a1d2e..98221a83eb 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015, 2017 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
-;;; Copyright © 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Erik Edrosa <erik.edrosa@gmail.com>
 ;;; Copyright © 2016 Eraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 Alex Kost <alezost@gmail.com>
@@ -1288,7 +1288,7 @@ key-value cache and store.")
 (define-public guile-wisp
   (package
     (name "guile-wisp")
-    (version "0.9.8")
+    (version "0.9.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://bitbucket.org/ArneBab/"
@@ -1296,57 +1296,48 @@ key-value cache and store.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1f2bbicq1rxnwmiplrm4r75wj06w385mjkyvi7g4k740bgwcrzxr"))))
+                "1xa0f0fvcrimqap50azv5872bfx8jbhc6baxa1prpbwcksbh8gdz"))))
     (build-system gnu-build-system)
     (arguments
      `(#:modules ((guix build gnu-build-system)
                   (guix build utils)
                   (ice-9 rdelim)
                   (ice-9 popen))
-
        #:phases
        (modify-phases %standard-phases
-         (add-before 'configure 'substitute-before-config
-
-          (lambda* (#:key inputs #:allow-other-keys)
-            (let ((bash (assoc-ref inputs "bash")))
-              ;; Puts together some test files with /bin/bash hardcoded
-              (substitute* "Makefile.in"
-                (("/usr/bin/env bash")
-                 (string-append bash "/bin/bash"))
-                (("\\$\\(GUILE_EFFECTIVE_VERSION\\)/site")
-                 "site/$(GUILE_EFFECTIVE_VERSION)")) ;use the right order
-              #t)))
-
+         (add-before 'configure 'patch-/usr/bin/env
+           (lambda _
+             (substitute* "Makefile.in"
+               (("/usr/bin/env bash") (which "bash"))
+               (("\\$\\(GUILE_EFFECTIVE_VERSION\\)/site")
+                "site/$(GUILE_EFFECTIVE_VERSION)")) ;use the right order
+             #t))
          ;; auto compilation breaks, but if we set HOME to /tmp,
          ;; that works ok
-         (add-before
-          'check 'auto-compile-hacky-workaround
-          (lambda _
-            (setenv "HOME" "/tmp")
-            #t))
+         (add-before 'check 'auto-compile-hacky-workaround
+           (lambda _ (setenv "HOME" "/tmp") #t))
          (add-after 'install 'install-go-files
-          (lambda* (#:key outputs inputs #:allow-other-keys)
-            (let* ((out (assoc-ref outputs "out"))
-                   (effective (read-line
-                               (open-pipe* OPEN_READ
-                                           "guile" "-c"
-                                           "(display (effective-version))")))
-                   (module-dir (string-append out "/share/guile/site/"
-                                              effective))
-                   (object-dir (string-append out "/lib/guile/" effective
-                                              "/site-ccache"))
-                   (prefix     (string-length module-dir)))
-              ;; compile to the destination
-              (for-each (lambda (file)
-                          (let* ((base (string-drop (string-drop-right file 4)
-                                                    prefix))
-                                 (go   (string-append object-dir base ".go")))
-                           (invoke "guild" "compile" "-L" module-dir
-                                    file "-o" go)))
-                        (find-files module-dir "\\.scm$"))
-              #t))))))
-    (home-page "http://draketo.de/english/wisp")
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (effective (read-line
+                                (open-pipe* OPEN_READ
+                                            "guile" "-c"
+                                            "(display (effective-version))")))
+                    (module-dir (string-append out "/share/guile/site/"
+                                               effective))
+                    (object-dir (string-append out "/lib/guile/" effective
+                                               "/site-ccache"))
+                    (prefix     (string-length module-dir)))
+               ;; compile to the destination
+               (for-each (lambda (file)
+                           (let* ((base (string-drop (string-drop-right file 4)
+                                                     prefix))
+                                  (go   (string-append object-dir base ".go")))
+                             (invoke "guild" "compile" "-L" module-dir
+                                     file "-o" go)))
+                         (find-files module-dir "\\.scm$"))
+               #t))))))
+    (home-page "https://draketo.de/english/wisp")
     (inputs
      `(("guile" ,guile-2.2)))
     (native-inputs
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index 9433ae0570..255e902e66 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -11403,4 +11403,94 @@ from a shell.  The @code{tldr} pages are a community effort to simplify the
 man pages with practical examples.")
     (license license:bsd-3)))
 
+(define-public ghc-c2hs
+  (package
+    (name "ghc-c2hs")
+    (version "0.28.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/c2hs/c2hs-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1nplgxfin139x12sb656f5870rpdclrhzi8mq8pry035qld15pci"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-language-c" ,ghc-language-c)
+       ("ghc-dlist" ,ghc-dlist)))
+    (native-inputs
+     `(("ghc-test-framework" ,ghc-test-framework)
+       ("ghc-test-framework-hunit" ,ghc-test-framework-hunit)
+       ("ghc-hunit" ,ghc-hunit)
+       ("ghc-shelly" ,ghc-shelly)
+       ("ghc-text" ,ghc-text)
+       ("gcc" ,gcc)))
+    (arguments
+     `(;; XXX: Test failures are induced by a parse error in <bits/floatn.h>
+       ;; of glibc 2.28.
+       #:tests? #f
+
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'set-cc
+           ;; add a cc executable in the path, needed for some tests to pass
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((gcc (assoc-ref inputs "gcc"))
+                   (tmpbin (tmpnam))
+                   (curpath (getenv "PATH")))
+               (mkdir-p tmpbin)
+               (symlink (which "gcc") (string-append tmpbin "/cc"))
+               (setenv "PATH" (string-append tmpbin ":" curpath)))
+             #t))
+         (add-after 'check 'remove-cc
+           ;; clean the tmp dir made in 'set-cc
+           (lambda _
+             (let* ((cc-path (which "cc"))
+                    (cc-dir (dirname cc-path)))
+               (delete-file-recursively cc-dir)
+               #t))))))
+    (home-page "https://github.com/haskell/c2hs")
+    (synopsis "Create Haskell bindings to C libraries")
+    (description "C->Haskell assists in the development of Haskell bindings to
+C libraries.  It extracts interface information from C header files and
+generates Haskell code with foreign imports and marshaling.  Unlike writing
+foreign imports by hand (or using hsc2hs), this ensures that C functions are
+imported with the correct Haskell types.")
+    (license license:gpl2)))
+
+(define-public ghc-libmpd
+  (package
+    (name "ghc-libmpd")
+    (version "0.9.0.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/libmpd/libmpd-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1931m23iqb4wddpdidm4ph746zpaw41kkjzmb074j7yyfpk7x1jv"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-attoparsec" ,ghc-attoparsec)
+       ("ghc-old-locale" ,ghc-old-locale)
+       ("ghc-text" ,ghc-text)
+       ("ghc-data-default-class" ,ghc-data-default-class)
+       ("ghc-network" ,ghc-network)
+       ("ghc-utf8-string" ,ghc-utf8-string)))
+    (native-inputs
+     `(("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-hspec" ,ghc-hspec)
+       ("hspec-discover" ,hspec-discover)))
+    (home-page "https://github.com/vimus/libmpd-haskell")
+    (synopsis "Haskell client library for the Music Player Daemon")
+    (description "This package provides a pure Haskell client library for the
+Music Player Daemon.")
+    (license license:expat)))
+
 ;;; haskell.scm ends here
diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm
index ce9e2b381c..895802cc94 100644
--- a/gnu/packages/image-viewers.scm
+++ b/gnu/packages/image-viewers.scm
@@ -8,7 +8,7 @@
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2017 nee <nee-git@hidamari.blue>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -126,28 +126,25 @@ actions.")
 
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'autogen
+         (add-before 'bootstrap 'pre-bootstrap
            (lambda _
              (define (write-dummy-changelog port)
                (display "See Git history for a change log.\n" port))
-
-             (setenv "NOCONFIGURE" "true")
-
              ;; Create ChangeLog{,.html} to placate the makefile, which would
              ;; otherwise require access to the Git repo.
              (call-with-output-file "ChangeLog"
                write-dummy-changelog)
              (call-with-output-file "ChangeLog.html"
                write-dummy-changelog)
-
-             (zero? (system* "sh" "autogen.sh")))))))
+             (setenv "NOCONFIGURE" "true")
+             #t)))))
     (inputs
      `(("clutter" ,clutter)
        ("libchamplain" ,libchamplain)
        ("lcms" ,lcms)
        ("exiv2" ,exiv2)
        ("libpng" ,libpng)
-       ("gtk+" ,gtk+-2)))
+       ("gtk+" ,gtk+)))
     (native-inputs
      `(("autoconf" ,autoconf)
        ("automake" ,automake)
@@ -304,37 +301,24 @@ your images.  Among its features are:
      `(#:tests? #f                      ; no tests
        #:phases
        (modify-phases %standard-phases
-         (replace 'configure
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let* ((magic (assoc-ref %build-inputs "imagemagick"))
-                    (convert (string-append magic "/bin/convert")))
-               (substitute* "catimg"
-                 ;; By replacing "convert", we also replace the "convert"
-                 ;; in the message 'The version of convert is too old, don't
-                 ;; expect good results :('.  This should not happen, but in
-                 ;; practice this error message should not affect us.
-                 (("convert") convert))
-               #t)))
-         (replace 'build
+         (add-after 'unpack 'patch-convert
            (lambda _
-             (let* ((out (assoc-ref %outputs "out"))
-                    (man (string-append out "/share/man/man1")))
-               (zero? (system* "cmake"
-                               (string-append "-DCMAKE_INSTALL_PREFIX=" out)
-                               (string-append "-DMAN_OUTPUT_PATH=" man)
-                               "."))
-               (zero? (system* "make")))))
-         (add-before 'install 'install-script
+             (substitute* "catimg"
+               ;; By replacing "convert", we also replace the "convert"
+               ;; in the message 'The version of convert is too old, don't
+               ;; expect good results :('.  This should not happen, but in
+               ;; practice this error message should not affect us.
+               (("convert") (which "convert")))
+             #t))
+         (add-after 'install 'install-script
            (lambda* (#:key outputs #:allow-other-keys)
              ;; The bash script lacks an file extension.  We have to rename
              ;; it so that the C program and the bash script can be happy
              ;; side by side.
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append out "/bin")))
-               (install-file "catimg" bin)
-               (rename-file (string-append bin "/catimg")
-                            (string-append bin "/catimg.sh"))
-               #t))))))
+             (copy-file "../source/catimg"
+                        (string-append (assoc-ref outputs "out")
+                                       "/bin/catimg.sh"))
+             #t)))))
     (inputs
      `(("imagemagick" ,imagemagick))) ; for the bash script version
     (home-page "https://github.com/posva/catimg")
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1d47d2caaf..7a7bb9cf0c 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -12,7 +12,7 @@
 ;;; Copyright © 2016 Raymond Nicholson <rain1@openmailbox.org>
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2016, 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr>
-;;; Copyright © 2016, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016, 2017, 2018 Marius Bakke <mbakke@fastmail.com>
@@ -441,8 +441,8 @@ It has been modified to remove all non-free binary blobs.")
                     #:patches %linux-libre-4.19-patches
                     #:configuration-file kernel-config))
 
-(define %linux-libre-4.14-version "4.14.94")
-(define %linux-libre-4.14-hash "06yf4ggdf9dn7zh17pv1kx84sn39mbxpfhsx1mdckzwpis7lcjzs")
+(define %linux-libre-4.14-version "4.14.95")
+(define %linux-libre-4.14-hash "07bxbwb5fan96aws6g91vxkrvl80a53wjbl8xkh4q3c6iah8wkvf")
 
 (define-public linux-libre-4.14
   (make-linux-libre %linux-libre-4.14-version
@@ -451,8 +451,8 @@ It has been modified to remove all non-free binary blobs.")
                     #:configuration-file kernel-config))
 
 (define-public linux-libre-4.9
-  (make-linux-libre "4.9.151"
-                    "0pjcqmn03zb0n83rlfkrq10k7fl7dbh3ll2d8k9sqi3m81c3843h"
+  (make-linux-libre "4.9.152"
+                    "0qssksykzbcy58aqvmxk9h1xpaqvfwp31xvxfmwxdh7z4n3yn60y"
                     '("x86_64-linux" "i686-linux")
                     #:configuration-file kernel-config))
 
@@ -1506,25 +1506,23 @@ transparently through a bridge.")
          (add-after 'install 'install-python
            (lambda* (#:key outputs #:allow-other-keys)
              (define (python-inst python)
-               (let ((ldflags (format #f "LDFLAGS=-Wl,-rpath=~a/lib"
-                                      (assoc-ref %outputs "out")))
-                     (pyout (assoc-ref %outputs python)))
-                 (and
-                  (zero? (system (format #f "~a ~a setup.py build"
-                                         ldflags python pyout)))
-                  (zero?
-                   (system (format #f "~a ~a setup.py install --prefix=~a"
-                                   ldflags python pyout)))
-                  (zero? (system* python "setup.py" "clean")))))
+               (invoke python "setup.py" "build")
+               (invoke python "setup.py" "install"
+                       (string-append "--prefix="
+                                      (assoc-ref %outputs python)))
+               (invoke python "setup.py" "clean"))
+             (setenv "LDFLAGS" (format #f "-Wl,-rpath=~a/lib"
+                                       (assoc-ref %outputs "out")))
              (with-directory-excursion "./python"
-               (every python-inst '("python2" "python3")))))
+               (for-each python-inst '("python2" "python3")))
+             #t))
          (add-after 'install 'install-doc
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((dest (string-append (assoc-ref outputs "doc")
                                         "/share/doc/libnl")))
                (mkdir-p dest)
-               (zero? (system* "tar" "xf" (assoc-ref inputs "libnl3-doc")
-                               "--strip-components=1" "-C" dest))))))))
+               (invoke "tar" "xf" (assoc-ref inputs "libnl3-doc")
+                       "--strip-components=1" "-C" dest)))))))
     (home-page "https://www.infradead.org/~tgr/libnl/")
     (synopsis "NetLink protocol library suite")
     (description
diff --git a/gnu/packages/lirc.scm b/gnu/packages/lirc.scm
index b04cc887fb..627c79f979 100644
--- a/gnu/packages/lirc.scm
+++ b/gnu/packages/lirc.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016, 2017 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -104,33 +105,32 @@ on just one button press.")
     (license license:gpl2+)))
 
 (define-public python-lirc
-  (let ((commit "4091fe918f3eed2513dad008828565cace408d2f")
-        (revision "1"))
+  (let ((commit "c28708bbeb6e02d85f13dd7e0b24e8e86abc215b")
+        (revision "2"))
     (package
       (name "python-lirc")
-      (version (string-append "1.2.1-" revision "." (string-take commit 7)))
+      (version (git-version "1.2.1" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/tompreston/python-lirc.git")
-                 (commit commit)))
-          (sha256
-            (base32
-              "0cm47s5pvijfs3v2k7hmpxv3mvp4n5la0ihnsczk5ym3iq166jil"))
-          (file-name (string-append name "-" version))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/tompreston/python-lirc.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "13s9zqyfh871ls1aha47rhmk13b4mcyfckcn2sw70bvc26832gk6"))))
       (build-system python-build-system)
       (inputs
        `(("lirc" ,lirc)))
       (native-inputs
        `(("python-cython" ,python-cython)))
       (arguments
-       `(#:tests? #f ; the only tests that exist are human-interactive
+       `(#:tests? #f         ; the only tests that exist are interactive
          #:phases
          (modify-phases %standard-phases
            (add-before 'build 'build-from-cython-files
-             (lambda _
-               (zero? (system* "make" "py3")))))))
+             (lambda _ (invoke "make" "py3"))))))
       (home-page "https://github.com/tompreston/python-lirc")
       (synopsis "Python bindings for LIRC")
       (description "@code{lirc} is a Python module which provides LIRC bindings.")
@@ -146,7 +146,6 @@ on just one button press.")
            #:phases
            (modify-phases %standard-phases
              (add-before 'build 'build-from-cython-files
-               (lambda _
-                 (zero? (system* "make" "py2")))))))
+               (lambda _ (invoke "make" "py2"))))))
         (native-inputs
          `(("python2-cython" ,python2-cython))))))
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 05f325e60d..465454aad6 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -505,8 +505,9 @@ statistical profiler, a code coverage tool, and many other extensions.")
        (modify-phases %standard-phases
          (replace 'unpack
            (lambda* (#:key inputs #:allow-other-keys)
-             (and (zero? (system* "tar" "xzvf" (assoc-ref inputs "ccl")))
-                  (begin (chdir "ccl") #t))))
+             (invoke "tar" "xzvf" (assoc-ref inputs "ccl"))
+             (chdir "ccl")
+             #t))
          (delete 'configure)
          (add-before 'build 'pre-build
            ;; Enter the source directory for the current platform's lisp
@@ -527,7 +528,7 @@ statistical profiler, a code coverage tool, and many other extensions.")
              (substitute* '("Makefile")
                (("/bin/rm") "rm"))
              (setenv "CC" "gcc")
-             (zero? (system* "make" "clean"))))
+             (invoke "make" "clean")))
          ;; XXX Do we need to recompile the heap image as well for Guix?
          ;; For now just use the one we already got in the tarball.
          (replace 'install
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index be39d14b53..3356cb3992 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2014, 2017 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2015, 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
@@ -186,18 +186,18 @@ end-to-end encryption.")
        (modify-phases %standard-phases
          (add-after 'install 'install-etc
            (lambda* (#:key (make-flags '()) #:allow-other-keys)
-             (zero? (apply system* "make" "install-etc" make-flags))))
+             (apply invoke "make" "install-etc" make-flags)))
          (add-after 'install-etc 'install-lib
            (lambda* (#:key (make-flags '()) #:allow-other-keys)
-             (zero? (apply system* "make" "install-dev" make-flags))))
+             (apply invoke "make" "install-dev" make-flags)))
          (replace 'configure
            ;; bitlbee's configure script does not tolerate many of the
            ;; variable settings that Guix would pass to it.
            (lambda* (#:key outputs #:allow-other-keys)
-             (zero? (system* "./configure"
-                             (string-append "--prefix="
-                                            (assoc-ref outputs "out"))
-                             "--otr=1")))))))
+             (invoke "./configure"
+                     (string-append "--prefix="
+                                    (assoc-ref outputs "out"))
+                     "--otr=1"))))))
     (synopsis "IRC to instant messaging gateway")
     (description "BitlBee brings IM (instant messaging) to IRC clients, for
 people who have an IRC client running all the time and don't want to run an
@@ -225,12 +225,12 @@ identi.ca and status.net).")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'autogen
+         (add-after 'unpack 'patch-autogen
            (lambda _
              (let ((sh (which "sh")))
                (substitute* "autogen.sh" (("/bin/sh") sh))
-               (setenv "CONFIG_SHELL" sh)
-               (zero? (system* "./autogen.sh")))))
+               (setenv "CONFIG_SHELL" sh))
+             #t))
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (invoke "./configure"
@@ -718,20 +718,20 @@ on Axolotl and PEP.")
 (define-public dino
   ;; The only release tarball is for version 0.0, but it is very old and fails
   ;; to build.
-  (let ((commit "f25fadde2d6c9492b9cafe2cddbcc7b966942e47")
-        (revision "3"))
+  (let ((commit "8e14ac6d714b7f88e16de31a6c795e811dc27417")
+        (revision "4"))
     (package
       (name "dino")
-      (version (string-append "0.0-" revision "." (string-take commit 9)))
+      (version (git-version "0.0" revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
                       (url "https://github.com/dino/dino.git")
                       (commit commit)))
-                (file-name (string-append name "-" version "-checkout"))
+                (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1nhzrw3pbpybn9qclckk6z427vbgnqd0y1l63zd1rfw4zw099mzs"))))
+                  "0xfmwnc2f8lsvmp7m8ggikzqjaw5z6wmxrv6j5ljha5ckffrdd9m"))))
       (build-system cmake-build-system)
       (arguments
        `(#:tests? #f ; there are no tests
@@ -750,14 +750,10 @@ on Axolotl and PEP.")
            ;; libsignal-protocol-c, so we need to put the sources there.
            (add-after 'unpack 'unpack-sources
              (lambda* (#:key inputs #:allow-other-keys)
-               (let ((unpack (lambda (source target)
-                               (with-directory-excursion target
-                                 (zero? (system* "tar" "xvf"
-                                                 (assoc-ref inputs source)
-                                                 "--strip-components=1"))))))
-                 (unpack "libsignal-protocol-c-source"
-                         "plugins/signal-protocol/libsignal-protocol-c")
-                 #t)))
+               (with-directory-excursion "plugins/signal-protocol/libsignal-protocol-c"
+                 (invoke "tar" "xvf"
+                         (assoc-ref inputs "libsignal-protocol-c-source")
+                         "--strip-components=1"))))
            (add-after 'install 'glib-or-gtk-wrap
              (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap)))))
       (inputs
@@ -765,7 +761,8 @@ on Axolotl and PEP.")
          ("libsignal-protocol-c" ,libsignal-protocol-c)
          ("libgcrypt" ,libgcrypt)
          ("libsoup" ,libsoup)
-         ("sqlite" ,sqlite)
+         ("qrencode" ,qrencode)
+         ("sqlite" ,sqlite-with-column-metadata)
          ("gpgme" ,gpgme)
          ("gtk+" ,gtk+)
          ("glib-networking" ,glib-networking)
@@ -1269,7 +1266,7 @@ into existing applications.")
 (define-public perl-net-psyc
   (package
     (name "perl-net-psyc")
-    (version "1.1")
+    (version "1.3")
     (source
      (origin
        (method url-fetch)
@@ -1278,13 +1275,10 @@ into existing applications.")
        (file-name (string-append name "-" version ".zip"))
        (sha256
         (base32
-         "1lw6807qrbmvzbrjn1rna1dhir2k70xpcjvyjn45y35hav333a42"))
-       ;; psycmp3 currently depends on MP3::List and rxaudio (shareware),
-       ;; we can add it back when this is no longer the case.
-       (snippet '(begin
-                   (delete-file "contrib/psycmp3")
-                   #t))))
+         "0vsjclglkwgbyd9m5ad642fyysxw2x725nhq4r2m9pvqaq6s5yf2"))))
     (build-system perl-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
     (inputs
      `(("perl-curses" ,perl-curses)
        ("perl-io-socket-ssl" ,perl-io-socket-ssl)))
@@ -1296,8 +1290,7 @@ into existing applications.")
          ;; (leaves out psycion) and says
          ;; "# Just to give you a rough idea". XXX: Fix it upstream.
          (replace 'build
-           (lambda _
-             (zero? (system* "make" "manuals"))))
+           (lambda _ (invoke "make" "manuals")))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
@@ -1538,9 +1531,6 @@ support, and more.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'autogen
-           (lambda _
-             (zero? (system* "sh" "autogen.sh"))))
          ;; For 'system' commands in Scheme code.
          (add-after 'install 'wrap-program
            (lambda* (#:key inputs outputs #:allow-other-keys)
diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm
index 71e1efcd8c..c17321a9b3 100644
--- a/gnu/packages/multiprecision.scm
+++ b/gnu/packages/multiprecision.scm
@@ -255,11 +255,11 @@ and numerical quadrature programs are included.")
          (delete 'configure)            ;no configuration
          (replace 'check
            (lambda* (#:key make-flags #:allow-other-keys)
-             (and (zero? (apply system* "make"
-                                "stest" "test_standalone"
-                                make-flags))
-                  (zero? (system* "./stest"))
-                  (zero? (system* "./test")))))
+             (apply invoke "make"
+                    "stest" "test_standalone"
+                    make-flags)
+             (invoke "./stest")
+             (invoke "./test")))
          (add-before 'install 'install-nogroup
            (lambda _
              ;; Let permissions inherit from the current process
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 5522d94c33..f4f96079b9 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -2771,8 +2771,10 @@ of tools for manipulating and accessing your music.")
     (inputs
      `(("alsa-lib" ,alsa-lib)
        ("jack" ,jack-1)
+       ("rtmidi" ,rtmidi)
        ("sdl" ,sdl2)
-       ("zlib" ,zlib)))
+       ("zlib" ,zlib)
+       ("zziplib" ,zziplib)))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (synopsis "Music tracker for working with .MOD/.XM module files")
diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index deba67c4d7..a32cee44dc 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -10,8 +10,9 @@
 ;;; Copyright © 2017 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Peter Kreye <kreyepr@gmail.com>
-;;; Copyright © 2018 Gabriel Hondet <gabrielhondet@gmail.com>
+;;; Copyright © 2018, 2019 Gabriel Hondet <gabrielhondet@gmail.com>
 ;;; Copyright © 2018 Kei Kebreau <kkebreau@posteo.net>
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -191,19 +192,18 @@ patch-/bin/sh-references: ~a: changing `\"/bin/sh\"' to `~a'~%"
                     (mandir (string-append out "/share/man")))
                ;; Custom configure script doesn't recognize
                ;; --prefix=<PREFIX> syntax (with equals sign).
-               (zero? (system* "./configure"
-                               "--prefix" out
-                               "--mandir" mandir)))))
+               (invoke "./configure"
+                       "--prefix" out
+                       "--mandir" mandir))))
          (replace 'build
            (lambda _
-             (zero? (system* "make" "-j" (number->string
-                                          (parallel-job-count))
-                             "world.opt"))))
+             (invoke "make" "-j" (number->string (parallel-job-count))
+                     "world.opt")))
          (delete 'check)
          (add-after 'install 'check
            (lambda _
              (with-directory-excursion "testsuite"
-               (zero? (system* "make" "all")))))
+               (invoke "make" "all"))))
          (add-before 'check 'prepare-socket-test
            (lambda _
              (format (current-error-port)
@@ -254,7 +254,7 @@ functional, imperative and object-oriented styles of programming.")
            (replace 'build
              (lambda _
                ;; Specifying '-j' at all causes the build to fail.
-               (zero? (system* "make" "world.opt"))))
+               (invoke "make" "world.opt")))
            ,@(if (string=? "aarch64-linux" (%current-system))
                ;; Custom configure script doesn't recongnize aarch64.
                '((replace 'configure
@@ -269,11 +269,9 @@ functional, imperative and object-oriented styles of programming.")
            (replace 'check
              (lambda _
                (with-directory-excursion "testsuite"
-                 (zero? (system*
-                         "make"
-                         "all"
+                 (invoke "make" "all"
                          (string-append
-                          "TOPDIR=" (getcwd) "/.."))))))))))))
+                          "TOPDIR=" (getcwd) "/..")))))))))))
 
 (define-public ocaml-4.07
   (package
@@ -449,26 +447,26 @@ Git-friendly development workflow.")
        ;; which  fails on the second attempt.
        #:parallel-build? #f
        #:make-flags '("all")
-       #:phases (modify-phases %standard-phases
-                  (replace
-                   'configure
-                   (lambda* (#:key outputs #:allow-other-keys)
-                     ;; This is a home-made 'configure' script.
-                     (let ((out (assoc-ref outputs "out")))
-                       (zero? (system* "./configure"
-                                       (string-append "--libdir=" out
-                                                      "/lib/ocaml/site-lib")
-                                       (string-append "--bindir=" out "/bin")
-                                       (string-append "--pkgdir=" out
-                                                      "/lib/ocaml/site-lib"))))))
-                  (add-after 'install 'install-meta
-                    (lambda* (#:key outputs #:allow-other-keys)
-                      (let ((out (assoc-ref outputs "out")))
-                        (substitute* "camlp4/META.in"
-                          (("directory = .*")
-                            (string-append "directory = \"" out
-                                           "/lib/ocaml/site-lib/camlp4\"\n")))
-                        (zero? (system* "make" "install-META"))))))))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             ;; This is a home-made 'configure' script.
+             (let ((out (assoc-ref outputs "out")))
+               (invoke "./configure"
+                       (string-append "--libdir=" out
+                                      "/lib/ocaml/site-lib")
+                       (string-append "--bindir=" out "/bin")
+                       (string-append "--pkgdir=" out
+                                      "/lib/ocaml/site-lib")))))
+         (add-after 'install 'install-meta
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* "camlp4/META.in"
+                 (("directory = .*")
+                  (string-append "directory = \"" out
+                                 "/lib/ocaml/site-lib/camlp4\"\n")))
+               (invoke "make" "install-META")))))))
     (home-page "https://github.com/ocaml/camlp4")
     (synopsis "Write parsers in OCaml")
     (description
@@ -1151,8 +1149,7 @@ files in these formats.")
        #:phases
        (modify-phases %standard-phases
          (replace 'configure
-           (lambda* (#:key #:allow-other-keys)
-             (zero? (system* "./configure")))))))
+           (lambda _ (invoke "./configure"))))))
     (home-page "https://forge.ocamlcore.org/projects/zarith/")
     (synopsis "Implements arbitrary-precision integers")
     (description "Implements arithmetic and logical operations over
@@ -1768,15 +1765,17 @@ spans without being subject to operating system calendar time adjustments.")
 (define-public ocaml-cmdliner
   (package
     (name "ocaml-cmdliner")
-    (version "0.9.8")
+    (version "1.0.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://erratique.ch/software/cmdliner/releases/"
                                   "cmdliner-" version ".tbz"))
               (sha256
                (base32
-                "0hdxlkgiwjml9dpaa80282a8350if7mc1m6yz2mrd7gci3fszykx"))))
+                "18jqphjiifljlh9jg8zpl6310p3iwyaqphdkmf89acyaix0s4kj1"))))
     (build-system ocaml-build-system)
+    (inputs
+     `(("ocaml-result" ,ocaml-result)))
     (native-inputs
      `(("ocamlbuild" ,ocamlbuild)
        ("opam" ,opam)))
@@ -1785,6 +1784,12 @@ spans without being subject to operating system calendar time adjustments.")
        #:build-flags '("native=true" "native-dynlink=true")
        #:phases
        (modify-phases %standard-phases
+         (replace 'install
+           ;; The makefile says 'adjust on cli invocation'
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (invoke "make" "install" (string-append "PREFIX=" out))
+               #t)))
          (delete 'configure))))
     (home-page "http://erratique.ch/software/cmdliner")
     (synopsis "Declarative definition of command line interfaces for OCaml")
@@ -1802,14 +1807,14 @@ most of the POSIX and GNU conventions.")
 (define-public ocaml-fmt
   (package
     (name "ocaml-fmt")
-    (version "0.8.0")
+    (version "0.8.5")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "http://erratique.ch/software/fmt/releases/fmt-"
                             version ".tbz"))
         (sha256 (base32
-                  "16y7ibndnairb53j8a6qgipyqwjxncn4pl9jiw5bxjfjm59108px"))))
+                  "1zj9azcxcn6skmb69ykgmi9z8c50yskwg03wqgh87lypgjdcz060"))))
     (build-system ocaml-build-system)
     (native-inputs
      `(("ocamlbuild" ,ocamlbuild)
@@ -1817,6 +1822,7 @@ most of the POSIX and GNU conventions.")
        ("topkg" ,ocaml-topkg)))
     (propagated-inputs
      `(("result" ,ocaml-result)
+       ("ocaml-uchar" ,ocaml-uchar)
        ("cmdliner" ,ocaml-cmdliner)))
     (arguments `(#:tests? #f
                  #:build-flags (list "build" "--with-base-unix" "true"
@@ -2269,14 +2275,14 @@ representation of the data.")
 (define-public ocaml-uchar
   (package
     (name "ocaml-uchar")
-    (version "0.0.1")
+    (version "0.0.2")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "https://github.com/ocaml/uchar/releases/download/v"
                             version "/uchar-" version ".tbz"))
         (sha256 (base32
-                  "0ficw1x7ymbd6m8hqw3w1aycwm1hbwd6bad3c5pspwnzh3qlikhi"))))
+                  "1w2saw7zanf9m9ffvz2lvcxvlm118pws2x1wym526xmydhqpyfa7"))))
     (build-system ocaml-build-system)
     (arguments
      `(#:tests? #f
@@ -4342,13 +4348,12 @@ is provide a description of your project and Jbuilder will do the rest.")
        (modify-phases %standard-phases
          (delete 'configure)
          (replace 'build
-           (lambda* (#:key #:allow-other-keys)
-             (zero? (system* "jbuilder" "build"))))
+           (lambda _ (invoke "jbuilder" "build")))
          (delete 'check)
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "jbuilder" "install" "--prefix" out))))))))
+               (invoke "jbuilder" "install" "--prefix" out)))))))
     (native-inputs
      `(("jbuilder" ,ocaml-jbuilder)))
     (propagated-inputs
@@ -4420,9 +4425,9 @@ instead of bindings to a C library.")
              (let* ((out (assoc-ref outputs "out"))
                     (libdir (string-append out "/lib/ocaml/site-lib")))
                (mkdir-p libdir)
-               (zero? (system* "jbuilder" "install"
-                               "--prefix" out
-                               "--libdir" libdir))))))))
+               (invoke "jbuilder" "install"
+                       "--prefix" out
+                       "--libdir" libdir)))))))
     (native-inputs
      `(("ocaml" ,ocaml)
        ("cppo" ,ocaml-cppo)
@@ -4749,6 +4754,35 @@ speedup, polymorphic variants and optional syntax for tuples and variants.
 yojson package.  The program @code{atdgen} can be used to derive OCaml-JSON
 serializers and deserializers from type definitions.")
     (license license:bsd-3)))
+ 
+(define-public ocaml-craml
+  (package
+    (name "ocaml-craml")
+    (version "1.0.0")
+    (home-page "https://github.com/realworldocaml/craml")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url (string-append home-page ".git"))
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "197xjp4vmzdymf2ndinw271ihpf45h04mx8gqj8ypspxdr5fj1a5"))))
+    (build-system dune-build-system)
+    (inputs
+     `(("ocaml-fmt" ,ocaml-fmt)
+       ("ocaml-astring" ,ocaml-astring)
+       ("ocaml-logs" ,ocaml-logs)
+       ("ocaml-cmdliner" ,ocaml-cmdliner)))
+    (synopsis
+     "CRAM-testing framework for testing command line applications")
+    (description "CRAM is a is functional testing framework for command line
+applications.  @code{craml} is freely inspired by the
+Mercurial's @code{https://www.selenic.com/blog/?p=663, unified test
+format}.  @code{craml} is released as a single binary (called @code{craml}).")
+    (license license:isc)))
 
 (define-public ocaml-merlin
   (package
diff --git a/gnu/packages/openstack.scm b/gnu/packages/openstack.scm
index c30b15e137..2906a574cf 100644
--- a/gnu/packages/openstack.scm
+++ b/gnu/packages/openstack.scm
@@ -582,7 +582,7 @@ in transmittable and storable formats, such as JSON and MessagePack.")
          (add-before 'check 'init-git
            (lambda _
              ;; reno expects a git repo
-             (zero? (system* "git" "init")))))))
+             (invoke "git" "init"))))))
     (propagated-inputs
       `(("python-dulwich" ,python-dulwich)
         ("python-pbr" ,python-pbr)
@@ -596,7 +596,7 @@ in transmittable and storable formats, such as JSON and MessagePack.")
         ("python-docutils" ,python-docutils)
         ("python-sphinx" ,python-sphinx)
         ("gnupg" ,gnupg)
-        ("git" ,git)))
+        ("git" ,git-minimal)))
     (home-page "http://docs.openstack.org/developer/reno/")
     (synopsis "Release notes manager")
     (description "Reno is a tool for storing release notes in a git repository
@@ -626,7 +626,7 @@ and building documentation from them.")
              ;; Note: Upstream tests would have also built the release notes.
              ;; That only would work if we were in a git checkout.
              ;; Therefore, we don't do it here.
-             (zero? (system* "python" "setup.py" "build_sphinx")))))))
+             (invoke "python" "setup.py" "build_sphinx"))))))
     (propagated-inputs
       `(("python-requests" ,python-requests)))
     (native-inputs
diff --git a/gnu/packages/password-utils.scm b/gnu/packages/password-utils.scm
index 5b60ad9cc8..9fd5a6ff0d 100644
--- a/gnu/packages/password-utils.scm
+++ b/gnu/packages/password-utils.scm
@@ -381,15 +381,14 @@ random passwords that pass the checks.")
                #t)))
          (add-after 'install 'manpage
            (lambda* (#:key outputs #:allow-other-keys)
-             (and
-              ;; Without this substitution, it fails with
-              ;; ImportError: No module named 'gpg'
-              (substitute* "Makefile"
-                (("PYTHONPATH=.") ""))
-              (zero? (system* "make" "assword.1"))
-              (install-file
-               "assword.1"
-               (string-append (assoc-ref outputs "out") "/share/man/man1"))))))))
+             ;; Without this substitution, it fails with
+             ;; ImportError: No module named 'gpg'
+             (substitute* "Makefile"
+               (("PYTHONPATH=.") ""))
+             (invoke "make" "assword.1")
+             (install-file
+              "assword.1"
+              (string-append (assoc-ref outputs "out") "/share/man/man1")))))))
     (build-system python-build-system)
     (native-inputs
      `(("txt2man" ,txt2man)))
diff --git a/gnu/packages/patches/gnucash-disable-failing-tests.patch b/gnu/packages/patches/gnucash-disable-failing-tests.patch
deleted file mode 100644
index e0fdd86b5d..0000000000
--- a/gnu/packages/patches/gnucash-disable-failing-tests.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-test-stress-options.scm does not exist, and test-qof passes when run in the
-build directory after the gnucash build.
-
-diff -ur gnucash-3.3.old/gnucash/report/standard-reports/test/CMakeLists.txt gnucash-3.3/gnucash/report/standard-reports/test/CMakeLists.txt
---- gnucash-3.3.old/gnucash/report/standard-reports/test/CMakeLists.txt	2018-10-04 09:29:00.916641417 -0400
-+++ gnucash-3.3/gnucash/report/standard-reports/test/CMakeLists.txt	2018-10-04 09:30:52.962504860 -0400
-@@ -13,10 +13,6 @@
-   test-income-gst.scm
- )
- 
--set(scm_test_with_textual_ports_SOURCES
--    test-stress-options.scm
--)
--
- set(GUILE_DEPENDS
-   scm-gnc-module
-   scm-app-utils
-@@ -31,9 +27,6 @@
- 
- if (HAVE_SRFI64)
-   gnc_add_scheme_tests("${scm_test_with_srfi64_SOURCES}")
--  if (HAVE_TEXT_PORTS)
--    gnc_add_scheme_tests("${scm_test_with_textual_ports_SOURCES}")
--  endif (HAVE_TEXT_PORTS)
- endif (HAVE_SRFI64)
- 
- gnc_add_scheme_tests("${scm_test_standard_reports_SOURCES}")
-diff -ur gnucash-3.3.old/libgnucash/engine/test/CMakeLists.txt gnucash-3.3/libgnucash/engine/test/CMakeLists.txt
---- gnucash-3.3.old/libgnucash/engine/test/CMakeLists.txt	2018-10-04 09:29:00.876640751 -0400
-+++ gnucash-3.3/libgnucash/engine/test/CMakeLists.txt	2018-10-05 10:46:22.542962546 -0400
-@@ -54,8 +54,6 @@
- # This test does not run on Win32
- if (NOT WIN32)
-   set(SOURCES ${test_qof_SOURCES} ${CMAKE_SOURCE_DIR}/common/test-core/unittest-support.c)
--  add_engine_test(test-qof "${SOURCES}")
--  target_compile_definitions(test-qof PRIVATE TESTPROG=test_qof)
- 
-   set(SOURCES ${test_engine_SOURCES} ${CMAKE_SOURCE_DIR}/common/test-core/unittest-support.c)
-   add_engine_test(test-engine "${SOURCES}")
diff --git a/gnu/packages/patches/gnucash-price-quotes-perl.patch b/gnu/packages/patches/gnucash-price-quotes-perl.patch
deleted file mode 100644
index 3101ddb007..0000000000
--- a/gnu/packages/patches/gnucash-price-quotes-perl.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-After wrapping gnc-fq-check and gnc-fq-helper we can no longer execute them
-with perl, so execute them directly instead.
-
-diff -ur gnucash-3.2.old/libgnucash/scm/price-quotes.scm gnucash-3.2/libgnucash/scm/price-quotes.scm
---- gnucash-3.2.old/libgnucash/scm/price-quotes.scm	2018-09-15 00:48:33.718389646 -0400
-+++ gnucash-3.2/libgnucash/scm/price-quotes.scm	2018-09-15 13:51:49.249862724 -0400
-@@ -74,7 +74,7 @@
-     (define (start-program)
-       (if (not (string-null? gnc:*finance-quote-check*))
-           (set! program (gnc-spawn-process-async
--                         (list "perl" "-w" gnc:*finance-quote-check*) #t))))
-+                         (list gnc:*finance-quote-check*) #t))))
- 
-     (define (get-sources)
-       (if (not (null? program))
-@@ -158,7 +158,7 @@
-     (define (start-quoter)
-       (if (not (string-null? gnc:*finance-quote-helper*))
-           (set! quoter (gnc-spawn-process-async
--                        (list "perl" "-w" gnc:*finance-quote-helper*) #t))))
-+                        (list gnc:*finance-quote-helper*) #t))))
- 
-     (define (get-quotes)
-       (if (not (null? quoter))
diff --git a/gnu/packages/python-check.scm b/gnu/packages/python-check.scm
new file mode 100644
index 0000000000..2a5dbaeb30
--- /dev/null
+++ b/gnu/packages/python-check.scm
@@ -0,0 +1,58 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; 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 python-check)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages python-web)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (guix utils)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system python))
+
+(define-public python-coveralls
+  (package
+    (name "python-coveralls")
+    (version "1.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "coveralls" version))
+       (sha256
+        (base32
+         "0vfdny96gcq05qk5wxdbfxfaaprdk7c9q2pqvg7ac5l9sf48wqxb"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-coverage" ,python-coverage)
+       ("python-docopt" ,python-docopt)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-requests" ,python-requests)
+       ("python-sh" ,python-sh)
+       ("python-urllib3" ,python-urllib3)))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/coveralls-clients/coveralls-python")
+    (synopsis "Show coverage stats online via coveralls.io")
+    (description
+     "Coveralls.io is a service for publishing code coverage statistics online.
+This package provides seamless integration with coverage.py (and thus pytest,
+nosetests, etc...) in Python projects.")
+    (license license:expat)))
diff --git a/gnu/packages/python-crypto.scm b/gnu/packages/python-crypto.scm
index 9a20b5a772..377ec53d26 100644
--- a/gnu/packages/python-crypto.scm
+++ b/gnu/packages/python-crypto.scm
@@ -11,7 +11,7 @@
 ;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Danny Milosavljevic <dannym+a@scratchpost.org>
 ;;; Copyright © 2016, 2017 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2017 Carlo Zancanaro <carlo@zancanaro.id.au>
@@ -434,14 +434,14 @@ message digests and key derivation functions.")
 (define-public python-pyopenssl
   (package
     (name "python-pyopenssl")
-    (version "18.0.0")
+    (version "19.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pyOpenSSL" version))
        (sha256
         (base32
-         "1055rb456nvrjcij3sqj6c6l3kmh5cqqay0nsmx3pxq07d1g3234"))))
+         "007j40y7x3k8xj54dy2qnij9lldfp71k9mkflhd9vqbdiwrndjmf"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
@@ -450,15 +450,15 @@ message digests and key derivation functions.")
          (add-after 'install 'check
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (add-installed-pythonpath inputs outputs)
-             (zero? (system* "py.test" "-v" "-k"
-                             (string-append
-                              ;; This test tries to look up certificates from
-                              ;; the compiled-in default path in OpenSSL, which
-                              ;; does not exist in the build environment.
-                              "not test_fallback_default_verify_paths "
-                              ;; This test attempts to make a connection to
-                              ;; an external web service.
-                              "and not test_set_default_verify_paths"))))))))
+             (invoke "py.test" "-v" "-k"
+                     (string-append
+                      ;; This test tries to look up certificates from
+                      ;; the compiled-in default path in OpenSSL, which
+                      ;; does not exist in the build environment.
+                      "not test_fallback_default_verify_paths "
+                      ;; This test attempts to make a connection to
+                      ;; an external web service.
+                      "and not test_set_default_verify_paths")))))))
     (propagated-inputs
      `(("python-cryptography" ,python-cryptography)
        ("python-six" ,python-six)))
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 35ac4e69f5..2294b59f33 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -113,6 +113,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages qt)
@@ -434,42 +435,80 @@ concepts.")
 (define-public python2-h5py
   (package-with-python2 python-h5py))
 
+(define-public python-sh
+  (package
+    (name "python-sh")
+    (version "1.12.14")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "sh" version))
+       (sha256
+        (base32
+         "1z2hx357xp3v4cv44xmqp7lli3frndqpyfmpbxf7n76h7s1zaaxm"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/amoffat/sh")
+    (synopsis "Python subprocess replacement")
+    (description "This package provides a replacement for Python's
+@code{subprocess} feature.")
+    (license license:expat)))
+
+(define-public python-cftime
+  (package
+    (name "python-cftime")
+    (version "1.0.3.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "cftime" version))
+       (sha256
+        (base32
+         "0362dhxbzk593walyjz30dll6y2y79wialik647cbwdsf3ad0x6x"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-numpy" ,python-numpy)))
+    (native-inputs
+     `(("python-coveralls" ,python-coveralls)
+       ("python-cython" ,python-cython)
+       ("python-pytest-cov" ,python-pytest-cov)))
+    (home-page "https://github.com/Unidata/cftime")
+    (synopsis "Library for time handling")
+    (description
+     "This package provides time-handling functionality that used to be part
+of the netcdf4 package before.")
+    ;; This package claims to include code under the GPLv3 but is released
+    ;; under ISC.
+    (license (list license:isc license:gpl3+))))
+
 (define-public python-netcdf4
   (package
     (name "python-netcdf4")
-    (version "1.2.9")
+    (version "1.4.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "netCDF4" version))
        (sha256
         (base32
-         "1h6jq338amlbk0ilzvjyl7cck80i0bah9a5spn9in71vy2qxm7i5"))))
+         "0c0sklgrmv15ygliin8qq0hp7vanmbi74m6zpi0r1ksr0hssyd5r"))))
     (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'configure-locations
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "HDF5_DIR" (assoc-ref inputs "hdf5"))
+             #t)))))
     (native-inputs
      `(("python-cython" ,python-cython)))
     (propagated-inputs
-     `(("python-numpy" ,python-numpy)))
+     `(("python-numpy" ,python-numpy)
+       ("python-cftime" ,python-cftime)))
     (inputs
      `(("netcdf" ,netcdf)
        ("hdf4" ,hdf4)
        ("hdf5" ,hdf5)))
-    (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (setenv "NO_NET" "1") ; disable opendap tests
-             (with-directory-excursion "test"
-               (setenv "PYTHONPATH" ; find and add the library we just built
-                       (string-append
-                        (car (find-files "../build" "lib.*"
-                                         #:directories? #:t
-                                         #:fail-on-error? #:t))
-                        ":" (getenv "PYTHONPATH")))
-               (zero? (system* "python" "run_all.py"))))))))
-    (home-page
-     "https://github.com/Unidata/netcdf4-python")
+    (home-page "https://github.com/Unidata/netcdf4-python")
     (synopsis "Python/numpy interface to the netCDF library")
     (description "Netcdf4-python is a Python interface to the netCDF C
 library.  netCDF version 4 has many features not found in earlier
@@ -1710,7 +1749,7 @@ version numbers.")
     (arguments
      '(#:phases
        (modify-phases %standard-phases
-         (replace 'check (lambda _ (zero? (system* "nosetests")))))))
+         (replace 'check (lambda _ (invoke "nosetests"))))))
     (native-inputs
      `(("python-nose" ,python-nose)
        ("python-vcversioner" ,python-vcversioner)))
@@ -2106,7 +2145,7 @@ logic-free templating system Mustache.")
               (modify-phases %standard-phases
                 (replace 'check
                   (lambda _
-                    (zero? (system* "python" "test_pystache.py")))))))))
+                    (invoke "python" "test_pystache.py"))))))))
 
 (define-public python-joblib
   (package
@@ -2855,8 +2894,7 @@ objects.")
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
-             (zero? (system* "nosetests" "-v")))))))
+           (lambda _ (invoke "nosetests" "-v"))))))
     (propagated-inputs
      `(("python-colormath" ,python-colormath)))
     (native-inputs
@@ -2963,12 +3001,12 @@ color scales, and color space conversion easy.  It has support for:
                (with-directory-excursion "doc"
                  (copy-recursively sphinx-theme-checkout scipy-sphinx-theme)
                  (mkdir-p html)
-                 (system* "make" "html" pyver)
-                 (system* "make" "latex" "PAPER=a4" pyver)
-                 (system* "make" "-C" "build/latex"
+                 (invoke "make" "html" pyver)
+                 (invoke "make" "latex" "PAPER=a4" pyver)
+                 (invoke "make" "-C" "build/latex"
                           "all-pdf" "PAPER=a4" pyver)
                  ;; FIXME: Generation of the info file fails.
-                 ;; (system* "make" "info" pyver)
+                 ;; (invoke "make" "info" pyver)
                  ;; (mkdir-p info)
                  ;; (copy-file "build/texinfo/numpy.info"
                  ;;            (string-append info "/numpy.info"))
@@ -3193,7 +3231,7 @@ To address this and enable easy cycling over arbitrary @code{kwargs}, the
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             (zero? (system* "nosetests" "--all-modules" "-v" "colorspacious")))))))
+             (invoke "nosetests" "--all-modules" "-v" "colorspacious"))))))
     (home-page "https://github.com/njsmith/colorspacious")
     (synopsis "Python library for colorspace conversions")
     (description "@code{colorspacious} is a Python library that lets you
@@ -3376,24 +3414,25 @@ toolkits.")
 (define-public python2-pysnptools
   (package
     (name "python2-pysnptools")
-    (version "0.3.9")
+    (version "0.3.13")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "pysnptools" version ".zip"))
+       (uri (pypi-uri "pysnptools" version))
        (sha256
         (base32
-         "1wybggjzz8zw7aav4pjsg2h22xp17a1lghrprza1pxwlm7wf96y2"))))
+         "0lnis5xsl7bi0hz4f7gbicahzi5zlxkc21nk3g374xv8fb5hb3qm"))))
     (build-system python-build-system)
     (arguments
-     `(#:python ,python-2)) ; only Python 2.7 is supported
+     `(#:python ,python-2 ; only Python 2.7 is supported
+       #:tests? #f))      ; test files (e.g. examples/toydata.bim) not included
     (propagated-inputs
      `(("python2-numpy" ,python2-numpy)
        ("python2-scipy" ,python2-scipy)
        ("python2-pandas" ,python2-pandas)))
     (native-inputs
-     `(("unzip" ,unzip)))
-    (home-page "http://research.microsoft.com/en-us/um/redmond/projects/mscompbio/")
+     `(("python2-cython" ,python2-cython)))
+    (home-page "http://microsoftgenomics.github.io/PySnpTools/")
     (synopsis "Library for reading and manipulating genetic data")
     (description
      "PySnpTools is a library for reading and manipulating genetic data.  It
@@ -3603,7 +3642,8 @@ where key might be occurred more than once in the container.")
              ;; The package uses nosetest for running the tests.
              ;; Adding this initfile allows to run the test suite
              ;; without requiring nosetest.
-             (zero? (system* "touch" "tests/__init__.py")))))))
+             (with-output-to-file "tests/__init__.py" newline)
+             #t)))))
     (propagated-inputs
      `(("python-six" ,python-six)))
     (native-inputs
@@ -3803,7 +3843,8 @@ a general image processing tool.")
          (replace 'check
            (lambda _
              (with-directory-excursion "tests"
-               (zero? (system* "python" "all_tests.py")))))
+               (invoke "python" "all_tests.py"))
+             #t))
          (add-after 'install 'install-doc
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
@@ -4145,7 +4186,7 @@ cluster without needing to write any wrapper code yourself.")
              ;; It's easier to run tests after install.
              ;; Make installed package available for running the tests
              (add-installed-pythonpath inputs outputs)
-             (zero? (system* "py.test" "-v")))))))
+             (invoke "py.test" "-v"))))))
     (home-page "https://github.com/nickstenning/honcho")
     (synopsis "Manage Procfile-based applications")
     (description
@@ -4854,7 +4895,7 @@ libxml2 and libxslt.")
          ;; For more information, see the file 'convert-py3k' in the source
          ;; distribution.
          (replace 'check
-           (lambda _ (zero? (system* "./convert-py3k")))))))
+           (lambda _ (invoke "./convert-py3k"))))))
     (home-page
      "https://www.crummy.com/software/BeautifulSoup/bs4/")
     (synopsis
@@ -5101,8 +5142,7 @@ and statistical routines from scipy and statsmodels.")
      (modify-phases %standard-phases
        (replace 'check
          (lambda _
-           (zero?
-            (system* "python" "mpmath/tests/runtests.py" "-local")))))))
+           (invoke "python" "mpmath/tests/runtests.py" "-local"))))))
   (home-page "http://mpmath.org")
   (synopsis "Arbitrary-precision floating-point arithmetic in python")
   (description
@@ -5324,7 +5364,7 @@ Python 2 and Python 3.")
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             (zero? (system* "py.test" "-v")))))))
+             (invoke "py.test" "-v"))))))
     (native-inputs
      `(("python2-pytest" ,python2-pytest)))
     (home-page "https://github.com/chrippa/backports.shutil_get_terminal_size")
@@ -5668,7 +5708,7 @@ PEP8_PLUGIN('break_before_binary_operator'),"))
              (setenv "PYTHONPATH"
                      (string-append (getcwd) "/build/lib:"
                                     (getenv "PYTHONPATH")))
-             (zero? (system* "py.test" "-v")))))))
+             (invoke "py.test" "-v"))))))
     (native-inputs
      `(("python-flake8" ,python-flake8)
        ("python-mock" ,python-mock)
@@ -5754,8 +5794,7 @@ markdown_py is also provided to convert Markdown files to HTML.")
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
-                  (lambda _
-                    (zero? (system* "nosetests")))))))
+           (lambda _ (invoke "nosetests"))))))
     (home-page "https://github.com/pexpect/ptyprocess")
     (synopsis "Run a subprocess in a pseudo terminal")
     (description
@@ -5809,7 +5848,7 @@ pseudo terminal (pty), and interact with both the process and its pty.")
              (add-installed-pythonpath inputs outputs)
              (setenv "PATH" (string-append (getenv "PATH") ":"
                                            (assoc-ref outputs "out") "/bin"))
-             (zero? (system* "make" "test")))))))
+             (invoke "make" "test"))))))
     (build-system python-build-system)
     (native-inputs
      `(("python-coverage" ,python-coverage)
@@ -6090,7 +6129,7 @@ and MAC network addresses.")
        (modify-phases %standard-phases
          ;; Current test in setup.py does not work as of 1.0.0, so use nose to
          ;; run tests instead for now.
-         (replace 'check (lambda _ (zero? (system* "nosetests")))))))
+         (replace 'check (lambda _ (invoke "nosetests"))))))
     (native-inputs `(("python-nose"       ,python-nose)))
     (home-page "http://www.python-excel.org/")
     (synopsis "Library for extracting data from Excel files")
@@ -6166,14 +6205,14 @@ printing of sub-tables by specifying a row range.")
              #t))
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
-             (zero? (system* "python" "setup.py" "build"
-                             (string-append "--hdf5="
-                                            (assoc-ref inputs "hdf5"))))))
+             (invoke "python" "setup.py" "build"
+                     (string-append "--hdf5="
+                                    (assoc-ref inputs "hdf5")))))
          (replace 'check
            (lambda* (#:key inputs #:allow-other-keys)
-             (zero? (system* "python" "setup.py" "check"
-                             (string-append "--hdf5="
-                                            (assoc-ref inputs "hdf5")))))))))
+             (invoke "python" "setup.py" "check"
+                     (string-append "--hdf5="
+                                    (assoc-ref inputs "hdf5"))))))))
     (propagated-inputs
      `(("python-numexpr" ,python-numexpr)
        ("python-numpy" ,python-numpy)))
@@ -6278,8 +6317,7 @@ implementations of ASN.1-based codecs and protocols.")
        #:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda* _
-             (zero? (system* "python" "ipaddr_test.py")))))))
+           (lambda _ (invoke "python" "ipaddr_test.py"))))))
     (home-page "https://github.com/google/ipaddr-py")
     (synopsis "IP address manipulation library")
     (description
@@ -8489,7 +8527,7 @@ module, adding support for Unicode strings.")
        (modify-phases %standard-phases
          (replace 'check
            ;; Many tests fail, but the installation proceeds.
-           (lambda _ (zero? (system* "make" "-C" "test" "test")))))))
+           (lambda _ (invoke "make" "-C" "test" "test"))))))
     (native-inputs
      `(("which" ,which))) ; required for tests
     (propagated-inputs
@@ -9497,8 +9535,7 @@ parsing UK postcodes.")
    '(#:phases
      (modify-phases %standard-phases
        (replace 'check
-         (lambda _
-           (zero? (system* "python" "-m" "unittest" "-v" "tests")))))))
+         (lambda _ (invoke "python" "-m" "unittest" "-v" "tests"))))))
   (native-inputs
    `(;; For testing
      ("python-email-validator" ,python-email-validator)
@@ -9634,17 +9671,17 @@ characters, mouse support, and auto suggestions.")
 (define-public python-jedi
   (package
     (name "python-jedi")
-    (version "0.13.1")
+    (version "0.13.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "jedi" version))
        (sha256
         (base32
-         "0j11q42g5vjkyhhjpyy8nb0gdxs78m3rpjai7p1hvgpyl9rkyjdp"))))
+         "1za944msp0f8x36qa8l309jhv0kzlsdh7r9nj3z12y8npnsh45sp"))))
     (build-system python-build-system)
     (arguments
-     `( ;; Many tests are failing with Python 3.7.x as of version 0.13.1 (see:
+     `( ;; Many tests are failing with Python 3.7.x as of version 0.13.2 (see:
         ;; https://github.com/davidhalter/jedi/issues/1263)
        #:tests? #f
        #:phases
@@ -9991,9 +10028,9 @@ discovery, monitoring and configuration.")
            ;; The test runner invokes python2 and python3 for test*.py.
            ;; To avoid having both in inputs, we replicate it here.
            (lambda _
-             (every (lambda (test-file)
-                      (zero? (system* "python" test-file)))
-                    (find-files "tests" "^test.*\\.py$")))))))
+             (for-each (lambda (test-file) (invoke "python" test-file))
+                       (find-files "tests" "^test.*\\.py$"))
+             #t)))))
     (build-system python-build-system)
     (home-page "https://github.com/eea/odfpy")
     (synopsis "Python API and tools to manipulate OpenDocument files")
@@ -10392,7 +10429,7 @@ is used by PostgreSQL and the OpenSSH Server for example.")
              (setenv "PYTHONPATH"
                      (string-append (getcwd) "/build/lib:"
                                     (getenv "PYTHONPATH")))
-             (zero? (system* "py.test" "-vv" )))))))
+             (invoke "py.test" "-vv" ))))))
     (native-inputs
      `(("python-pytest" ,python-pytest)))
     (home-page
@@ -10512,7 +10549,7 @@ PNG, JPEG, JPEG2000 and GIF files in pure Python.")
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             (zero? (system* "python" "test3.py")))))))
+             (invoke "python" "test3.py"))))))
     (home-page "https://github.com/gfxmonk/termstyle")
     (synopsis "Console text coloring for Python")
     (description "This package provides console text coloring for Python.")
@@ -10720,7 +10757,7 @@ protocols written in pure Python.")
              (setenv "PYTHONPATH"
                      (string-append (getcwd) "/build/lib:"
                                     (getenv "PYTHONPATH")))
-             (zero? (system* "python" "test/test_pbkdf2.py")))))))
+             (invoke "python" "test/test_pbkdf2.py"))))))
     (propagated-inputs
      `(("python-pycrypto" ,python-pycrypto)))  ; optional
     (home-page "https://www.dlitz.net/software/python-pbkdf2/")
@@ -10928,7 +10965,7 @@ Problem} (SAT) solver.")
          (add-after 'install 'check
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (add-installed-pythonpath inputs outputs)
-             (zero? (system* "python" "test/testordereddict.py")))))))
+             (invoke "python" "test/testordereddict.py"))))))
     (home-page "https://bitbucket.org/ruamel/ordereddict")
     (synopsis "Version of dict that keeps keys in insertion order")
     (description
@@ -11185,7 +11222,7 @@ protocols.")
              ;; Disable python3 tests
              (substitute* "check"
                (("python3") "# python3"))
-             (zero? (system* "./check")))))))
+             (invoke "./check"))))))
     (native-inputs
      `(("python2-coverage-test-runner" ,python2-coverage-test-runner)
        ("python2-pep8" ,python2-pep8)))
@@ -11225,8 +11262,7 @@ iterating over input files.")
          ;; and fails.
          (delete 'check)
          (add-before 'build 'check
-           (lambda _
-             (zero? (system* "make" "check")))))))
+           (lambda _ (invoke "make" "check"))))))
     (home-page "https://liw.fi/ttystatus/")
     (synopsis "Python library for showing progress reporting and
 status updates on terminals")
@@ -11288,8 +11324,7 @@ happens using the @code{logging} library.")
          ;; and fails.
          (delete 'check)
          (add-before 'build 'check
-           (lambda _
-             (zero? (system* "make" "check")))))))
+           (lambda _ (invoke "make" "check"))))))
     (native-inputs
      `(("cmdtest" ,cmdtest)
        ("python2-coverage-test-runner" ,python2-coverage-test-runner)))
@@ -12303,7 +12338,7 @@ Swagger 2.0).")
              (setenv "PYTHONPATH" (string-append (getcwd)
                                                  ":"
                                                  (getenv "PYTHONPATH")))
-             (zero? (system* "py.test")))))))
+             (invoke "py.test"))))))
     (propagated-inputs
      `(("python-flask" ,python-flask)
        ("python-pyyaml" ,python-pyyaml)
@@ -13149,9 +13184,9 @@ is the new Pyro version that is actively developed.")
        (modify-phases %standard-phases
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
-             (zero? (system* "python" "setup.py" "build"
-                             (string-append "--netcdf_prefix="
-                                            (assoc-ref inputs "netcdf")))))))))
+             (invoke "python" "setup.py" "build"
+                     (string-append "--netcdf_prefix="
+                                    (assoc-ref inputs "netcdf"))))))))
     (home-page "https://bitbucket.org/khinsen/scientificpython")
     (synopsis "Python modules for scientific computing")
     (description "ScientificPython is a collection of Python modules that are
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 8c376bf259..9c61d3c9ef 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -1907,11 +1907,11 @@ contain over 620 classes.")
                     (lib (string-append out "/lib/python"
                                         python-major+minor
                                         "/site-packages")))
-               (zero? (system* "python" "configure.py"
-                               "--confirm-license"
-                               "--bindir" bin
-                               "--destdir" lib
-                               "--sipdir" sip))))))))
+               (invoke "python" "configure.py"
+                       "--confirm-license"
+                       "--bindir" bin
+                       "--destdir" lib
+                       "--sipdir" sip)))))))
     (license (list license:gpl2 license:gpl3)))) ; choice of either license
 
 (define-public qscintilla
@@ -2103,7 +2103,7 @@ securely.  It will not store any data unencrypted unless explicitly requested.")
              (substitute* '("doc/doc.pro")
                ;; We'll install them in the 'install-man-pages' phase.
                (("^unix:doc\\.files.*") ""))
-             (zero? (system* "qmake")))))
+             (invoke "qmake"))))
        (add-after 'install 'install-man-pages
          (lambda* (#:key outputs #:allow-other-keys)
            (let* ((out (assoc-ref outputs "out"))
diff --git a/gnu/packages/rdf.scm b/gnu/packages/rdf.scm
index 7fd893c374..4a3efd8d3f 100644
--- a/gnu/packages/rdf.scm
+++ b/gnu/packages/rdf.scm
@@ -304,13 +304,10 @@ ideal (e.g. in LV2 implementations or embedded applications).")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-              "https://pypi.python.org/packages/source/r/rdflib/rdflib-"
-              version
-              ".tar.gz"))
+        (uri (pypi-uri "rdflib" version))
         (sha256
-          (base32
-            "0398c714znnhaa2x7v51b269hk20iz073knq2mvmqp2ma92z27fs"))))
+         (base32
+          "0398c714znnhaa2x7v51b269hk20iz073knq2mvmqp2ma92z27fs"))))
     (build-system python-build-system)
     (arguments
      '(;; FIXME: Three test failures. Should be fixed next release.
@@ -321,7 +318,7 @@ ideal (e.g. in LV2 implementations or embedded applications).")
        ;;     (lambda _
        ;;       ;; Run tests from the build directory so python3 only
        ;;       ;; sees the installed 2to3 version.
-       ;;       (zero? (system* "nosetests" "--where=./build/src")))))))
+       ;;       (invoke "nosetests" "--where=./build/src"))))))
     (native-inputs
      `(("python-nose" ,python-nose)))
     (propagated-inputs
@@ -329,13 +326,12 @@ ideal (e.g. in LV2 implementations or embedded applications).")
         ("python-isodate" ,python-isodate)
         ("python-pyparsing" ,python-pyparsing)))
     (home-page "https://github.com/RDFLib/rdflib")
-    (synopsis
-      "Python RDF library")
+    (synopsis "Python RDF library")
     (description
       "RDFLib is a Python library for working with RDF, a simple yet
 powerful language for representing information.")
     (license (non-copyleft "file://LICENSE"
-                        "See LICENSE in the distribution."))))
+                           "See LICENSE in the distribution."))))
 
 (define-public python2-rdflib
   (package-with-python2 python-rdflib))
diff --git a/gnu/packages/regex.scm b/gnu/packages/regex.scm
index f526d1c237..bfd30278e9 100644
--- a/gnu/packages/regex.scm
+++ b/gnu/packages/regex.scm
@@ -91,9 +91,9 @@ Python.  It is a C++ library.")
              ;; The tests require the availability of the
              ;; 'en_US.ISO-8859-1' locale.
              (setenv "LOCPATH" (getcwd))
-             (zero? (system* "localedef" "--no-archive"
-                             "--prefix" (getcwd) "-i" "en_US"
-                             "-f" "ISO-8859-1" "./en_US.ISO-8859-1")))))))
+             (invoke "localedef" "--no-archive"
+                     "--prefix" (getcwd) "-i" "en_US"
+                     "-f" "ISO-8859-1" "./en_US.ISO-8859-1"))))))
     (synopsis "Approximate regex matching library and agrep utility")
     (description "Superset of the POSIX regex API, enabling approximate
 matching.  Also ships a version of the agrep utility which behaves similar to
diff --git a/gnu/packages/samba.scm b/gnu/packages/samba.scm
index 213e416a4d..5ddc8748f3 100644
--- a/gnu/packages/samba.scm
+++ b/gnu/packages/samba.scm
@@ -287,15 +287,9 @@ destructors.  It is the core memory allocator used in Samba.")
         `(modify-phases ,phases
            (replace 'build
              (lambda _
-               (letrec-syntax ((shell (syntax-rules ()
-                                        ((_ (command ...) rest ...)
-                                         (and (zero? (system* command ...))
-                                              (shell rest ...)))
-                                        ((_)
-                                         #t))))
-                 (shell ("gcc" "-c" "-Ibin/default" "-I" "lib/replace"
-                         "-I." "-Wall" "-g" "talloc.c")
-                        ("ar" "rc" "libtalloc.a" "talloc.o")))))
+               (invoke "gcc" "-c" "-Ibin/default" "-I" "lib/replace"
+                       "-I." "-Wall" "-g" "talloc.c")
+               (invoke "ar" "rc" "libtalloc.a" "talloc.o")))
            (replace 'install
              (lambda* (#:key outputs #:allow-other-keys)
                (let* ((out     (assoc-ref outputs "out"))
@@ -326,9 +320,9 @@ destructors.  It is the core memory allocator used in Samba.")
            ;; tevent uses a custom configuration script that runs waf.
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "./configure"
-                               (string-append "--prefix=" out)
-                               "--bundled-libraries=NONE"))))))))
+               (invoke "./configure"
+                       (string-append "--prefix=" out)
+                       "--bundled-libraries=NONE")))))))
     (native-inputs
      `(("pkg-config" ,pkg-config)
        ("python" ,python-2)))
@@ -374,11 +368,11 @@ many event types, including timers, signals, and the classic file descriptor eve
            ;; ldb use a custom configuration script that runs waf.
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "./configure"
-                               (string-append "--prefix=" out)
-                               (string-append "--with-modulesdir=" out
-                                              "/lib/ldb/modules")
-                               "--bundled-libraries=NONE"))))))))
+               (invoke "./configure"
+                       (string-append "--prefix=" out)
+                       (string-append "--with-modulesdir=" out
+                                      "/lib/ldb/modules")
+                       "--bundled-libraries=NONE")))))))
     (native-inputs
      `(("cmocka" ,cmocka)
        ("pkg-config" ,pkg-config)
diff --git a/gnu/packages/synergy.scm b/gnu/packages/synergy.scm
index ec1872cc00..da8787285f 100644
--- a/gnu/packages/synergy.scm
+++ b/gnu/packages/synergy.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Vasile Dumitrascu <va511e@yahoo.com>
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,12 +22,14 @@
 (define-module (gnu packages synergy)
   #:use-module (guix packages)
   #:use-module ((guix licenses) #:select (gpl2))
-  #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system cmake)
   #:use-module (gnu packages)
+  #:use-module (gnu packages avahi)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages qt)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages xorg)
   #:use-module (srfi srfi-26))
@@ -34,80 +37,52 @@
 (define-public synergy
   (package
     (name "synergy")
-    (version "1.8.8")
+    (version "1.10.1")
     (source
      (origin
-      (method url-fetch)
-      (uri (string-append "https://github.com/symless/synergy-core/archive/"
-                          "v" version "-stable.tar.gz"))
-      (file-name (string-append name "-" version ".tar.gz"))
+      (method git-fetch)
+      (uri (git-reference
+            (url "https://github.com/symless/synergy-core.git")
+            (commit (string-append "v" version "-stable"))))
+      (file-name (git-file-name name version))
       (sha256
        (base32
-        "052z1yiwck9hlshf8in2dgz6p7jxmq9yfj32mfzjaygpz6mmmr4y"))
+        "112w2xrp04cysd14xk1ax7cllqpcki0pyica4ivrdngr5qw0r9hp"))
       (modules '((guix build utils)))
       (snippet
-       ;; Remove ~14MB of unnecessary bundled source and binaries
+       ;; Remove unnecessary bundled source and binaries
        '(begin
-          (for-each delete-file-recursively
-                    `("ext/bonjour"
-                      "ext/LICENSE (OpenSSL)"
-                      ,@(find-files "ext" "openssl-.*\\.tar\\.gz")
-                      "ext/openssl-osx"
-                      "ext/openssl-win32"
-                      "ext/openssl-win64"))
+          (delete-file-recursively "ext/openssl")
           #t))))
     (build-system cmake-build-system)
-    (native-inputs `(("unzip" ,unzip)))
+    (arguments
+     `(#:tests? #f ; there is no test target
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-headers
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "CPLUS_INCLUDE_PATH"
+                     (string-append (assoc-ref inputs "avahi")
+                                    "/include/avahi-compat-libdns_sd/:"
+                                    (getenv "CPLUS_INCLUDE_PATH")))
+             ;; See https://github.com/symless/synergy-core/pull/6359/
+             (substitute* "src/gui/src/ScreenSetupView.cpp"
+               (("#include <QtGui>" m)
+                (string-append m "\n#include <QHeaderView>")))
+             (substitute* "src/gui/src/ActionDialog.cpp"
+               (("#include <QtGui>" m)
+                (string-append m "\n#include <QButtonGroup>")))
+             #t)))))
     (inputs
-     `(("python"  ,python-wrapper)
+     `(("avahi" ,avahi)
+       ("python"  ,python-wrapper)
        ("openssl" ,openssl)
        ("curl"    ,curl)
        ("libxi"   ,libxi)
        ("libx11"  ,libx11)
        ("libxtst" ,libxtst)
-       ("xinput"  ,xinput)))
-    (arguments
-     `(#:phases
-       (let ((srcdir (string-append "../synergy-core-" ,version "-stable")))
-         (modify-phases %standard-phases
-           (add-before 'configure 'unpack-aux-src
-             ;; TODO: package and use from system
-             (lambda* (#:key inputs #:allow-other-keys)
-               (let ((unzip (string-append
-                             (assoc-ref inputs "unzip")
-                             "/bin/unzip")))
-                 (with-directory-excursion "ext"
-                   (for-each
-                    (lambda (f)
-                      (system* unzip "-d" f (string-append f ".zip")))
-                    '("gmock-1.6.0" "gtest-1.6.0"))))
-               #t))
-          (replace 'check
-            ;; Don't run "integtests" as it requires network and an X display.
-            (lambda _
-              (zero? (system* (string-append srcdir "/bin/unittests")))))
-          (replace 'install
-            ;; There currently is no installation process, see:
-            ;; http://synergy-project.org/spit/issues/details/3317/
-            (lambda* (#:key outputs #:allow-other-keys)
-              (let* ((out (assoc-ref outputs "out"))
-                     (bin (string-append out "/bin"))
-                     (ex  (string-append out "/share/doc/synergy-"
-                                         ,version "/examples")))
-                (begin
-                  (for-each
-                   (lambda (f)
-                     (install-file (string-append srcdir "/bin/" f) bin))
-                   '("synergyc" "synergys" "synergyd"
-                     "usynergy" "syntool"))
-                  ;; Install example configuration files
-                  (for-each
-                   (lambda (e)
-                     (install-file (string-append srcdir "/doc/" e) ex))
-                   '("synergy.conf.example"
-                     "synergy.conf.example-advanced"
-                     "synergy.conf.example-basic"))))
-              #t))))))
+       ("xinput"  ,xinput)
+       ("qtbase" ,qtbase)))
     (home-page "https://symless.com/synergy")
     (synopsis "Mouse and keyboard sharing utility")
     (description
diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index d4e2075975..2852b37676 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -547,6 +547,42 @@ converters, will completely supplant the older patterns.")
 build fonts using the Metafont system.")
     (license license:knuth)))
 
+(define-public texlive-tex-fontinst-base
+  (package
+    (name "texlive-tex-fontinst-base")
+    (version (number->string %texlive-revision))
+    (source (origin
+              (method svn-fetch)
+              (uri (svn-reference
+                    (url (string-append "svn://www.tug.org/texlive/tags/"
+                                        %texlive-tag "/Master/texmf-dist/"
+                                        "/tex/fontinst/base"))
+                    (revision %texlive-revision)))
+              (file-name (string-append name "-" version "-checkout"))
+              (sha256
+               (base32
+                "12gnb8hc45p47pqn31msvi4mpr3wxbbbf2k4xhmshjqykwzlx508"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let ((target (string-append (assoc-ref %outputs "out")
+                                      "/share/texmf-dist/tex/fontinst/base")))
+           (mkdir-p target)
+           (copy-recursively (assoc-ref %build-inputs "source") target)
+           #t))))
+    (home-page "https://www.ctan.org/pkg/fontinst")
+    (synopsis "Tools for converting and installing fonts for TeX and LaTeX")
+    (description "This package provides TeX macros for converting Adobe Font
+Metric files to TeX metric and virtual font format.  Fontinst helps mainly
+with the number crunching and shovelling parts of font installation.  This
+means in practice that it creates a number of files which give the TeX
+metrics (and related information) for a font family that TeX needs to do any
+typesetting in these fonts.")
+    (license license:lppl1.1+)))
+
 (define-public texlive-fontname
   (package
     (name "texlive-fontname")
@@ -616,31 +652,37 @@ documents.")
                        (string-append (getcwd) ":"
                                       mf "/share/texmf-dist/metafont/base")))
              (mkdir "build")
+             (mkdir-p "pk/ljfour/public/cm/dpi600")
              (for-each (lambda (font)
                          (format #t "building font ~a\n" font)
                          (invoke "mf" "-progname=mf"
                                  "-output-directory=build"
                                  (string-append "\\"
                                                 "mode:=ljfour; "
-                                                "mag:=1; "
+                                                "mag:=1+0/600; "
                                                 "batchmode; "
                                                 "input "
-                                                (basename font ".mf"))))
+                                                (basename font ".mf")))
+                         (invoke "gftopk"
+                                 (string-append "build/"
+                                                (basename font ".mf") ".600gf")
+                                 (string-append "pk/ljfour/public/cm/dpi600/"
+                                                (basename font ".mf") ".pk")))
                        (find-files "." "cm(.*[0-9]+.*|inch)\\.mf$"))
              #t))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (tfm (string-append
-                          out "/share/texmf-dist/fonts/tfm/public/cm"))
-                    (mf (string-append
-                         out "/share/texmf-dist/fonts/source/public/cm"))
-                    (type1 (string-append
-                            out "/share/texmf-dist/fonts/type1/public/amsfonts/cm")))
+             (let* ((out   (assoc-ref outputs "out"))
+                    (fonts (string-append out "/share/texmf-dist/fonts/"))
+                    (pk    (string-append fonts "pk"))
+                    (tfm   (string-append fonts "tfm/public/cm"))
+                    (mf    (string-append fonts "source/public/cm"))
+                    (type1 (string-append fonts "type1/public/amsfonts/cm")))
                (for-each (cut install-file <> tfm)
                          (find-files "build" "\\.*"))
                (for-each (cut install-file <> mf)
                          (find-files "." "\\.mf"))
+               (copy-recursively "pk" pk)
                (mkdir-p type1)
                (copy-recursively (assoc-ref inputs "cm-type1") type1)
                #t))))))
@@ -974,6 +1016,7 @@ symbol fonts.")
     (arguments
      `(#:modules ((guix build gnu-build-system)
                   (guix build utils)
+                  (ice-9 match)
                   (srfi srfi-1)
                   (srfi srfi-26))
        #:tests? #f                      ; no tests
@@ -982,7 +1025,7 @@ symbol fonts.")
          (delete 'configure)
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
-             (let ((mf (assoc-ref inputs "texlive-metafont-base"))
+             (let ((mf (assoc-ref inputs "texlive-union"))
                    (cwd (getcwd)))
                ;; Make METAFONT reproducible
                (setenv "SOURCE_DATE_EPOCH" "1")
@@ -1012,24 +1055,112 @@ symbol fonts.")
                                                   (getcwd) "/"
                                                   (basename font ".mf")))))
                        (find-files "." "[0-9]+\\.mf$"))
+
+             ;; There are no metafont sources for the Euler fonts, so we
+             ;; convert the afm files instead.
+             (mkdir "build/euler")
+             (for-each (lambda (font)
+                         (format #t "converting afm font ~a\n" (basename font ".afm"))
+                         (invoke "afm2tfm" font
+                                 (string-append "build/euler/"
+                                                (basename font ".tfm"))))
+                       (find-files (assoc-ref inputs "amsfonts-afm")
+                                   "\\.afm$"))
+
+             ;; Frustratingly, not all fonts can be created this way.  To
+             ;; generate eufm8.tfm, for example, we first scale down
+             ;; eufm10.afm to eufm8.pl, and then generate the tfm file from
+             ;; the pl file.
+             (with-directory-excursion "build/euler"
+               (setenv "TEXINPUTS"
+                       (string-append (getcwd) "//:"
+                                      (assoc-ref inputs "amsfonts-afm") "//:"
+                                      (assoc-ref inputs "texlive-union") "//"))
+               (for-each (match-lambda
+                           (((target-base target-size)
+                             (source-base source-size))
+                            (let ((factor (number->string
+                                           (truncate/ (* 1000 target-size)
+                                                      source-size))))
+                              (invoke "tex"
+                                      "-interaction=scrollmode"
+                                      (string-append "\\input fontinst.sty "
+                                                     "\\transformfont{" target-base "}"
+                                                     "{\\scalefont{" factor "}"
+                                                     "{\\fromafm{" source-base "}}} "
+                                                     "\\bye")))
+                            (invoke "pltotf"
+                                    (string-append target-base ".pl")
+                                    (string-append target-base ".tfm"))
+                            (delete-file (string-append target-base ".pl"))))
+
+                         '((("eufm8" 8) ("eufm10" 10))
+
+                           (("eufb6" 6) ("eufb7" 7))
+                           (("eufb8" 8) ("eufb10" 10))
+                           (("eufb9" 9) ("eufb10" 10))
+
+                           (("eufm6" 6) ("eufb7" 7))
+                           (("eufm9" 9) ("eufb10" 10))
+
+                           (("eurb6" 6) ("eurb7" 7))
+                           (("eurb8" 8) ("eurb10" 10))
+                           (("eurb9" 9) ("eurb10" 10))
+
+                           (("eurm6" 6) ("eurm7" 7))
+                           (("eurm8" 8) ("eurm10" 10))
+                           (("eurm9" 9) ("eurm10" 10)))))
              #t))
          (replace 'install
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (fonts (string-append out "/share/texmf-dist/fonts"))
-                    (tfm (string-append fonts "/tfm/public/amsfonts"))
-                    (mf  (string-append fonts "/source/public/amsfonts"))
-                    (type1 (string-append fonts "/type1/public/amsfonts")))
-               (for-each (cut install-file <> tfm)
-                         (find-files "build" "\\.*"))
-               (for-each (cut install-file <> mf)
-                         (find-files "." "\\.mf"))
-               (copy-recursively (assoc-ref inputs "amsfonts-type1") type1)
-               #t))))))
+             (let* ((out  (assoc-ref outputs "out"))
+                    (root (string-append out "/share/texmf-dist/fonts/"))
+                    (pkgs '(("amsfonts-afm"   . "afm/public/amsfonts")
+                            ("amsfonts-type1" . "type1/public/amsfonts")
+                            ("amsfonts-map"   . "map/dvips/amsfonts"))))
+               (for-each (match-lambda
+                           ((pkg . dir)
+                            (let ((target (string-append root dir)))
+                              (mkdir-p target)
+                              (copy-recursively (assoc-ref inputs pkg)
+                                                target))))
+                         pkgs)
+               (copy-recursively (assoc-ref inputs "amsfonts-plain")
+                                 (string-append out "/share/texmf-dist/tex/plain/amsfonts"))
+               (let* ((tfm (string-append root "tfm/public/amsfonts"))
+                      (mf  (string-append root "source/public/amsfonts")))
+                 (copy-recursively "build" tfm)
+                 (for-each (cut install-file <> mf)
+                           (find-files "." "\\.mf"))
+                 #t)))))))
     (native-inputs
-     `(("texlive-fonts-cm" ,texlive-fonts-cm)
-       ("texlive-metafont-base" ,texlive-metafont-base)
-       ("texlive-bin" ,texlive-bin)
+     `(("texlive-union" ,(texlive-union (list texlive-tex-fontinst-base
+                                              texlive-fonts-cm
+                                              texlive-metafont-base)))
+       ("amsfonts-plain"
+        ,(origin
+           (method svn-fetch)
+           (uri (svn-reference
+                 (url (string-append "svn://www.tug.org/texlive/tags/"
+                                     %texlive-tag "/Master/texmf-dist/"
+                                     "/tex/plain/amsfonts"))
+                 (revision %texlive-revision)))
+           (file-name (string-append name "-plain-" version "-checkout"))
+           (sha256
+            (base32
+             "1hi8c9rkfb6395sxf7fhkr91xygfg8am1hqij9g3h2c7qx3714qp"))))
+       ("amsfonts-map"
+        ,(origin
+           (method svn-fetch)
+           (uri (svn-reference
+                 (url (string-append "svn://www.tug.org/texlive/tags/"
+                                     %texlive-tag "/Master/texmf-dist/"
+                                     "/fonts/map/dvips/amsfonts"))
+                 (revision %texlive-revision)))
+           (file-name (string-append name "-map-" version "-checkout"))
+           (sha256
+            (base32
+             "1lrj3bd9ybj4aawzlygc6qvakbrwc5s0mc5n9rpic331frv3axfs"))))
        ("amsfonts-type1"
         ,(origin
            (method svn-fetch)
@@ -1041,7 +1172,19 @@ symbol fonts.")
            (file-name (string-append name "-type1-" version "-checkout"))
            (sha256
             (base32
-             "1zfz33vn6gm19njy74n8wmn7sljrimfhwns5z8qqhxqfh1g4qip2"))))))
+             "1zfz33vn6gm19njy74n8wmn7sljrimfhwns5z8qqhxqfh1g4qip2"))))
+       ("amsfonts-afm"
+        ,(origin
+           (method svn-fetch)
+           (uri (svn-reference
+                 (url (string-append "svn://www.tug.org/texlive/tags/"
+                                     %texlive-tag "/Master/texmf-dist/"
+                                     "/fonts/afm/public/amsfonts"))
+                 (revision %texlive-revision)))
+           (file-name (string-append name "-afm-" version "-checkout"))
+           (sha256
+            (base32
+             "1fifzkaihmjgchnk7dmw0c23k0cz999dxnc78ivmqvgi1dhx0iv8"))))))
     (home-page "https://www.ctan.org/pkg/amsfonts")
     (synopsis "TeX fonts from the American Mathematical Society")
     (description
@@ -1169,15 +1312,8 @@ book).")
                         (getcwd) ":"
                         (getcwd) "/build:"
                         (string-join
-                         (append-map (match-lambda
-                                       ((_ . dir)
-                                        (find-files dir
-                                                    (lambda (_ stat)
-                                                      (eq? 'directory (stat:type stat)))
-                                                    #:directories? #t
-                                                    #:stat stat)))
-                                     inputs)
-                         ":")))
+                         (map (match-lambda ((_ . dir) dir)) inputs)
+                         "//:")))
 
                ;; Create an empty texsys.cfg, because latex.ltx wants to include
                ;; it.  This file must exist and it's fine if it's empty.
@@ -1407,9 +1543,7 @@ users, via its Plain TeX version.)")
     (build-system texlive-build-system)
     (arguments
      '(#:tex-directory "latex/fancyvrb"
-       ;; We exclude "fvrb-ex" to avoid a dependency on texlive-luaotfload and
-       ;; thus texlive-luatex-lualibs.
-       #:build-targets '("fancyvrb.ins")))
+       #:tex-format "latex"))
     (home-page "https://www.ctan.org/pkg/fancyvrb")
     (synopsis "Sophisticated verbatim text")
     (description
diff --git a/gnu/packages/textutils.scm b/gnu/packages/textutils.scm
index 9cd5a203c4..d2f84420c6 100644
--- a/gnu/packages/textutils.scm
+++ b/gnu/packages/textutils.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2015, 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2015 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
@@ -405,7 +405,7 @@ regular expression object can be specified.")
              #t))
          (replace 'install
            (lambda* (#:key make-flags #:allow-other-keys)
-             (zero? (apply system* "make" `("global_install" ,@make-flags))))))))
+             (apply invoke "make" `("global_install" ,@make-flags)))))))
     (home-page "http://www.winfield.demon.nl/")
     (synopsis "Microsoft Word document reader")
     (description "Antiword is an application for displaying Microsoft Word
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 607610f91c..9d8ecbd339 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -530,13 +530,13 @@ netcat implementation that supports TLS.")
   (package
     (name "python-acme")
     ;; Remember to update the hash of certbot when updating python-acme.
-    (version "0.29.1")
+    (version "0.30.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "acme" version))
               (sha256
                (base32
-                "0z5l966b1asbcdzl77bmywf22c1q0xill00jj7qyml9wx2nh7qm2"))))
+                "0icly11gaiv5cl57225rdwjbs56ah077csk32skcygf7pq06sjwq"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -587,7 +587,7 @@ netcat implementation that supports TLS.")
               (uri (pypi-uri name version))
               (sha256
                (base32
-                "14i6yrcb9s7ygy99gccfc8jscymi24xb72s5lgg9b2y40z909ikg"))))
+                "1s29rlnmgxq42wd4bpc7bma1hx9wnpw4y6dfznrfj33hfmngwcfn"))))
     (build-system python-build-system)
     (arguments
      `(,@(substitute-keyword-arguments (package-arguments python-acme)
diff --git a/gnu/packages/uucp.scm b/gnu/packages/uucp.scm
index f5d9c70052..1bb4fdb975 100644
--- a/gnu/packages/uucp.scm
+++ b/gnu/packages/uucp.scm
@@ -43,10 +43,10 @@
              ;; that we pass by default.
              (setenv "CONFIG_SHELL" (which "sh"))
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "./configure"
-                               (string-append "--prefix=" out)
-                               (string-append "--infodir=" out
-                                              "/share/info")))))))))
+               (invoke "./configure"
+                       (string-append "--prefix=" out)
+                       (string-append "--infodir=" out
+                                      "/share/info"))))))))
     (home-page "https://www.gnu.org/software/uucp/uucp.html")
     (synopsis "UUCP protocol implementation")
     (description
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 56982dbda8..61ffb427b2 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -376,7 +376,7 @@ shader compilation.")
         ("spirv-tools" ,spirv-tools)
         ("vulkan-headers" ,vulkan-headers)
         ("vulkan-loader" ,vulkan-loader)
-        ("wine" ,wine) ; Needed for 'widl'.
+        ("wine-minimal" ,wine-minimal) ; Needed for 'widl'.
         ("xcb-util" ,xcb-util)
         ("xcb-util-keysyms" ,xcb-util-keysyms)
         ("xcb-util-wm" ,xcb-util-wm)))
diff --git a/gnu/packages/wicd.scm b/gnu/packages/wicd.scm
index 01113bcb94..fec39ad530 100644
--- a/gnu/packages/wicd.scm
+++ b/gnu/packages/wicd.scm
@@ -168,7 +168,7 @@
                  (format #t
                          "running ~s with command ~s and parameters ~s~%"
                          "python setup.py" "configure" params)
-                 (zero? (apply system* "python" "setup.py" "configure" params))))))
+                 (apply invoke "python" "setup.py" "configure" params)))))
          (add-after 'install 'post-install
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm
index 42bec5cca5..83625914db 100644
--- a/gnu/packages/wine.scm
+++ b/gnu/packages/wine.scm
@@ -66,7 +66,8 @@
   #:use-module (gnu packages vulkan)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
-  #:use-module (ice-9 match))
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
 
 (define-public wine
   (package
@@ -125,6 +126,7 @@
        ("sdl2" ,sdl2)
        ("unixodbc" ,unixodbc)
        ("v4l-utils" ,v4l-utils)
+       ("vkd3d" ,vkd3d)
        ("vulkan-loader" ,vulkan-loader)
        ("zlib" ,zlib)))
     (arguments
@@ -149,6 +151,27 @@
 
        #:phases
        (modify-phases %standard-phases
+         ;; Explicitely set the 32-bit version of vulkan-loader when installing
+         ;; to i686-linux or x86_64-linux.
+         ;; TODO: Add more JSON files as they become available in Mesa.
+         ,@(match (%current-system)
+             ((or "i686-linux" "x86_64-linux")
+              `((add-after 'install 'wrap-executable
+                  (lambda* (#:key inputs outputs #:allow-other-keys)
+                    (let* ((out (assoc-ref outputs "out"))
+                           (icd (string-append out "/share/vulkan/icd.d")))
+                      (mkdir-p icd)
+                      (copy-file (string-append (assoc-ref inputs "mesa")
+                                 "/share/vulkan/icd.d/radeon_icd.i686.json")
+                                 (string-append icd "/radeon_icd.i686.json"))
+                      (wrap-program (string-append out "/bin/wine-preloader")
+                                    `("VK_ICD_FILENAMES" ":" =
+                                      (,(string-append icd
+                                        "/radeon_icd.i686.json"))))
+                      #t)))))
+             (_
+              `())
+             )
          (add-after 'configure 'patch-dlopen-paths
            ;; Hardcode dlopened sonames to absolute paths.
            (lambda _
@@ -186,6 +209,34 @@ integrate Windows applications into your desktop.")
              (string-append "libdir=" %output "/lib/wine64"))
        #:phases
        (modify-phases %standard-phases
+         ;; Explicitely set both the 64-bit and 32-bit versions of vulkan-loader
+         ;; when installing to x86_64-linux so both are available.
+         ;; TODO: Add more JSON files as they become available in Mesa.
+         ,@(match (%current-system)
+           ((or "x86_64-linux")
+             `((add-after 'copy-wine32-binaries 'wrap-executable
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (let* ((out (assoc-ref outputs "out")))
+                   (wrap-program (string-append out "/bin/wine-preloader")
+                                 `("VK_ICD_FILENAMES" ":" =
+                                   (,(string-append (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/radeon_icd.x86_64.json" ":"
+                                     (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/intel_icd.x86_64.json" ":"
+                                     (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json"))))
+                   (wrap-program (string-append out "/bin/wine64-preloader")
+                                 `("VK_ICD_FILENAMES" ":" =
+                                   (,(string-append (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/radeon_icd.x86_64.json"
+                                     ":" (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/intel_icd.x86_64.json"
+                                     ":" (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json"))))
+                   #t)))))
+           (_
+            `())
+           )
          (add-after 'install 'copy-wine32-binaries
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((wine32 (assoc-ref %build-inputs "wine"))
@@ -193,7 +244,9 @@ integrate Windows applications into your desktop.")
                ;; Copy the 32-bit binaries needed for WoW64.
                (copy-file (string-append wine32 "/bin/wine")
                           (string-append out "/bin/wine"))
-               (copy-file (string-append wine32 "/bin/wine-preloader")
+               ;; Copy the real 32-bit wine-preloader instead of the wrapped
+               ;; version.
+               (copy-file (string-append wine32 "/bin/.wine-preloader-real")
                           (string-append out "/bin/wine-preloader"))
                #t)))
          (add-after 'compress-documentation 'copy-wine32-manpage
@@ -224,6 +277,36 @@ integrate Windows applications into your desktop.")
     (synopsis "Implementation of the Windows API (WoW64 version)")
     (supported-systems '("x86_64-linux" "aarch64-linux"))))
 
+;; This minimal build of Wine is needed to prevent a circular dependency with
+;; vkd3d.
+(define-public wine-minimal
+  (package
+    (inherit wine)
+    (name "wine-minimal")
+    (native-inputs (fold alist-delete (package-native-inputs wine)
+               '("gettext" "perl" "pkg-config")))
+    (inputs `())
+    (arguments
+     `(#:validate-runpath? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'configure 'patch-dlopen-paths
+           ;; Hardcode dlopened sonames to absolute paths.
+           (lambda _
+             (let* ((library-path (search-path-as-string->list
+                                   (getenv "LIBRARY_PATH")))
+                    (find-so (lambda (soname)
+                               (search-path library-path soname))))
+               (substitute* "include/config.h"
+                 (("(#define SONAME_.* )\"(.*)\"" _ defso soname)
+                  (format #f "~a\"~a\"" defso (find-so soname))))
+               #t))))
+       #:configure-flags
+       (list "--without-freetype"
+             "--without-x")
+       ,@(strip-keyword-arguments '(#:configure-flags #:phases)
+                                  (package-arguments wine))))))
+
 (define-public wine-staging-patchset-data
   (package
     (name "wine-staging-patchset-data")
@@ -291,7 +374,6 @@ integrate Windows applications into your desktop.")
               ("mesa" ,mesa)
               ("python" ,python)
               ("util-linux" ,util-linux) ; for hexdump
-              ("vkd3d" ,vkd3d)
               ("wine-staging-patchset-data" ,wine-staging-patchset-data)
               ,@(package-inputs wine)))
     (arguments
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index a761bce235..7bf634759a 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -800,7 +800,7 @@ experience.")
            (lambda _
              ;; There aren't any tests, so just make sure the binary
              ;; gets built and can be run successfully.
-             (zero? (system* "../build/awesome" "-v"))))
+             (invoke "../build/awesome" "-v")))
          (add-after 'install 'wrap
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((awesome (assoc-ref outputs "out"))
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index 79eb64d13a..b47fe5d301 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Florian Paul Schmidt <mista.tapas@gmx.net>
 ;;; Copyright © 2016 Kei Kebreau <kkebreau@posteo.net>
-;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Petter <petter@mykolab.ch>
 ;;; Copyright © 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
@@ -126,7 +126,7 @@ Xfce Desktop Environment.")
                      (string-append %output "/share"))
              ;; For the missing '/etc/machine-id'.
              (setenv "DBUS_FATAL_WARNINGS" "0");
-             (zero? (system* "dbus-launch" "make" "check"))))
+             (invoke "dbus-launch" "make" "check")))
          (delete 'check))))
     (native-inputs
      `(("pkg-config" ,pkg-config)
diff --git a/gnu/system/examples/bare-bones.tmpl b/gnu/system/examples/bare-bones.tmpl
index 902dacbe57..a88bab034f 100644
--- a/gnu/system/examples/bare-bones.tmpl
+++ b/gnu/system/examples/bare-bones.tmpl
@@ -44,8 +44,8 @@
 
   ;; Add services to the baseline: a DHCP client and
   ;; an SSH server.
-  (services (cons* (service dhcp-client-service-type)
-                   (service openssh-service-type
-                            (openssh-configuration
-                              (port-number 2222)))
-                   %base-services)))
+  (services (append (list (service dhcp-client-service-type)
+                          (service openssh-service-type
+                                   (openssh-configuration
+                                    (port-number 2222))))
+                    %base-services)))
diff --git a/gnu/system/examples/beaglebone-black.tmpl b/gnu/system/examples/beaglebone-black.tmpl
index efef682e3a..11678063b2 100644
--- a/gnu/system/examples/beaglebone-black.tmpl
+++ b/gnu/system/examples/beaglebone-black.tmpl
@@ -43,15 +43,15 @@
                %base-user-accounts))
 
   ;; Globally-installed packages.
-  (packages (cons* screen openssh %base-packages))
-
-  (services (cons* (service dhcp-client-service-type)
-                   ;; mingetty does not work on serial lines.
-                   ;; Use agetty with board-specific serial parameters.
-                   (agetty-service
-                    (agetty-configuration
-                     (extra-options '("-L"))
-                     (baud-rate "115200")
-                     (term "vt100")
-                     (tty "ttyO0")))
-                   %base-services)))
+  (packages (append (list screen openssh) %base-packages))
+
+  (services (append (list (service dhcp-client-service-type)
+                          ;; mingetty does not work on serial lines.
+                          ;; Use agetty with board-specific serial parameters.
+                          (agetty-service
+                           (agetty-configuration
+                            (extra-options '("-L"))
+                            (baud-rate "115200")
+                            (term "vt100")
+                            (tty "ttyO0"))))
+                  %base-services)))
diff --git a/gnu/system/examples/desktop.tmpl b/gnu/system/examples/desktop.tmpl
index 1b8d46afaf..c59bf92681 100644
--- a/gnu/system/examples/desktop.tmpl
+++ b/gnu/system/examples/desktop.tmpl
@@ -25,12 +25,17 @@
           (target "my-root")
           (type luks-device-mapping))))
 
-  (file-systems (cons (file-system
-                        (device (file-system-label "my-root"))
-                        (mount-point "/")
-                        (type "ext4")
-                        (dependencies mapped-devices))
-                      %base-file-systems))
+  (file-systems (append
+                 (list (file-system
+                         (device (file-system-label "my-root"))
+                         (mount-point "/")
+                         (type "ext4")
+                         (dependencies mapped-devices))
+                       (file-system
+                         (device (uuid "1234-ABCD" 'fat))
+                         (mount-point "/boot/efi")
+                         (type "vfat")))
+                 %base-file-systems))
 
   (users (cons (user-account
                 (name "bob")
@@ -42,17 +47,20 @@
                %base-user-accounts))
 
   ;; This is where we specify system-wide packages.
-  (packages (cons* nss-certs         ;for HTTPS access
-                   gvfs              ;for user mounts
-                   %base-packages))
+  (packages (append (list
+                     ;; for HTTPS access
+                     nss-certs
+                     ;; for user mounts
+                     gvfs)
+                    %base-packages))
 
   ;; Add GNOME and/or Xfce---we can choose at the log-in
   ;; screen with F1.  Use the "desktop" services, which
   ;; include the X11 log-in service, networking with
   ;; NetworkManager, and more.
-  (services (cons* (gnome-desktop-service)
-                   (xfce-desktop-service)
-                   %desktop-services))
+  (services (append (list (gnome-desktop-service)
+                          (xfce-desktop-service))
+                    %desktop-services))
 
   ;; Allow resolution of '.local' host names with mDNS.
   (name-service-switch %mdns-host-lookup-nss))
diff --git a/gnu/system/examples/lightweight-desktop.tmpl b/gnu/system/examples/lightweight-desktop.tmpl
index 360ee62ffe..a234badd2b 100644
--- a/gnu/system/examples/lightweight-desktop.tmpl
+++ b/gnu/system/examples/lightweight-desktop.tmpl
@@ -19,15 +19,16 @@
 
   ;; Assume the target root file system is labelled "my-root",
   ;; and the EFI System Partition has UUID 1234-ABCD.
-  (file-systems (cons* (file-system
+  (file-systems (append
+                 (list (file-system
                          (device (file-system-label "my-root"))
                          (mount-point "/")
                          (type "ext4"))
                        (file-system
                          (device (uuid "1234-ABCD" 'fat))
                          (mount-point "/boot/efi")
-                         (type "vfat"))
-                       %base-file-systems))
+                         (type "vfat")))
+                 %base-file-systems))
 
   (users (cons (user-account
                 (name "alice")
@@ -40,9 +41,12 @@
 
   ;; Add a bunch of window managers; we can choose one at
   ;; the log-in screen with F1.
-  (packages (cons* ratpoison i3-wm i3status dmenu ;window managers
-                   nss-certs                      ;for HTTPS access
-                   %base-packages))
+  (packages (append (list
+                     ;; window managers
+                     ratpoison i3-wm i3status dmenu
+                     ;; for HTTPS access
+                     nss-certs)
+                    %base-packages))
 
   ;; Use the "desktop" services, which include the X11
   ;; log-in service, networking with NetworkManager, and more.
diff --git a/gnu/system/examples/vm-image.tmpl b/gnu/system/examples/vm-image.tmpl
index f149f67113..4d292c1bc6 100644
--- a/gnu/system/examples/vm-image.tmpl
+++ b/gnu/system/examples/vm-image.tmpl
@@ -24,7 +24,7 @@ partprobe, and then 2) resizing the filesystem with resize2fs.\n"))
   (timezone "Etc/UTC")
   (locale "en_US.utf8")
 
-(firmware '())
+  (firmware '())
 
   ;; Assuming /dev/sdX is the target hard disk, and "my-root" is
   ;; the label of the target root file system.
@@ -44,10 +44,12 @@ partprobe, and then 2) resizing the filesystem with resize2fs.\n"))
   (users %base-user-accounts)
 
   ;; Globally-installed packages.
-  (packages (cons* nvi fdisk
-                   grub   ; mostly so xrefs to its manual work
-                   parted ; partprobe
-                   %base-packages))
+  (packages (append (list nvi fdisk
+                          ;; mostly so xrefs to its manual work
+                          grub
+                          ;; partprobe
+                          parted)
+                    %base-packages))
 
   (services (modify-services %base-services
               (login-service-type config =>
diff --git a/guix/licenses.scm b/guix/licenses.scm
index 4ef18fb326..4ef3ed188c 100644
--- a/guix/licenses.scm
+++ b/guix/licenses.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Fabian Harfert <fhmgufs@web.de>
@@ -65,7 +65,7 @@
             ipa
             knuth
             lgpl2.0 lgpl2.0+ lgpl2.1 lgpl2.1+ lgpl3 lgpl3+
-            lppl lppl1.0+ lppl1.2 lppl1.2+
+            lppl lppl1.0+ lppl1.1+ lppl1.2 lppl1.2+
             lppl1.3 lppl1.3+
             lppl1.3a lppl1.3a+
             lppl1.3b lppl1.3b+
@@ -421,6 +421,11 @@ at URI, which may be a file:// URI pointing the package's tree."
            "https://www.latex-project.org/lppl/lppl-1-0/"
            "LaTeX Project Public License 1.0"))
 
+(define lppl1.1+
+  (license "LPPL 1.1+"
+           "https://www.latex-project.org/lppl/lppl-1-1/"
+           "LaTeX Project Public License 1.1"))
+
 (define lppl1.2
   (license "LPPL 1.2"
            "http://directory.fsf.org/wiki/License:LPPLv1.2"
diff --git a/guix/packages.scm b/guix/packages.scm
index e4c2ac3be5..f191327718 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2017, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
@@ -133,6 +133,7 @@
             bag-transitive-host-inputs
             bag-transitive-build-inputs
             bag-transitive-target-inputs
+            package-closure
 
             default-guile
             default-guile-derivation
@@ -798,6 +799,28 @@ dependencies are known to build on SYSTEM."
   "Return the \"target inputs\" of BAG, recursively."
   (transitive-inputs (bag-target-inputs bag)))
 
+(define* (package-closure packages #:key (system (%current-system)))
+  "Return the closure of PACKAGES on SYSTEM--i.e., PACKAGES and the list of
+packages they depend on, recursively."
+  (let loop ((packages packages)
+             (visited  vlist-null)
+             (closure  (list->setq packages)))
+    (match packages
+      (()
+       (set->list closure))
+      ((package . rest)
+       (if (vhash-assq package visited)
+           (loop rest visited closure)
+           (let* ((bag          (package->bag package system))
+                  (dependencies (filter-map (match-lambda
+                                              ((label (? package? package) . _)
+                                               package)
+                                              (_ #f))
+                                            (bag-direct-inputs bag))))
+             (loop (append dependencies rest)
+                   (vhash-consq package #t visited)
+                   (fold set-insert closure dependencies))))))))
+
 (define* (package-mapping proc #:optional (cut? (const #f)))
   "Return a procedure that, given a package, applies PROC to all the packages
 depended on and returns the resulting package.  The procedure stops recursion
diff --git a/guix/records.scm b/guix/records.scm
index 6b3c25cefa..0649c90ea3 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Mark H Weaver <mhw@netris.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -44,31 +44,6 @@
                        (format #f fmt args ...)
                        form))))
 
-(define (report-invalid-field-specifier name bindings)
-  "Report the first invalid binding among BINDINGS."
-  (let loop ((bindings bindings))
-    (syntax-case bindings ()
-      (((field value) rest ...)                   ;good
-       (loop #'(rest ...)))
-      ((weird _ ...)                              ;weird!
-       (syntax-violation name "invalid field specifier" #'weird)))))
-
-(define (report-duplicate-field-specifier name ctor)
-  "Report the first duplicate identifier among the bindings in CTOR."
-  (syntax-case ctor ()
-    ((_ bindings ...)
-     (let loop ((bindings #'(bindings ...))
-                (seen   '()))
-       (syntax-case bindings ()
-         (((field value) rest ...)
-          (not (memq (syntax->datum #'field) seen))
-          (loop #'(rest ...) (cons (syntax->datum #'field) seen)))
-         ((duplicate rest ...)
-          (syntax-violation name "duplicate field initializer"
-                            #'duplicate))
-         (()
-          #t))))))
-
 (eval-when (expand load eval)
   ;; The procedures below are needed both at run time and at expansion time.
 
@@ -91,7 +66,32 @@ interface\" (ABI) for TYPE is equal to COOKIE."
           ;; recompiled.
           (throw 'record-abi-mismatch-error 'abi-check
                  "~a: record ABI mismatch; recompilation needed"
-                 (list #,type) '())))))
+                 (list #,type) '()))))
+
+  (define (report-invalid-field-specifier name bindings)
+    "Report the first invalid binding among BINDINGS."
+    (let loop ((bindings bindings))
+      (syntax-case bindings ()
+        (((field value) rest ...)                   ;good
+         (loop #'(rest ...)))
+        ((weird _ ...)                              ;weird!
+         (syntax-violation name "invalid field specifier" #'weird)))))
+
+  (define (report-duplicate-field-specifier name ctor)
+    "Report the first duplicate identifier among the bindings in CTOR."
+    (syntax-case ctor ()
+      ((_ bindings ...)
+       (let loop ((bindings #'(bindings ...))
+                  (seen   '()))
+         (syntax-case bindings ()
+           (((field value) rest ...)
+            (not (memq (syntax->datum #'field) seen))
+            (loop #'(rest ...) (cons (syntax->datum #'field) seen)))
+           ((duplicate rest ...)
+            (syntax-violation name "duplicate field initializer"
+                              #'duplicate))
+           (()
+            #t)))))))
 
 (define-syntax make-syntactic-constructor
   (syntax-rules ()
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index a0de9f6c10..5b0f345cde 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -400,7 +400,7 @@ the latest known version of ~a (~a)~%")
                    (package-version package)))
 
   (mlet %store-monad ((edges (node-back-edges %bag-node-type
-                                              (all-packages))))
+                                              (package-closure (all-packages)))))
     (let* ((dependents (node-transitive-edges packages edges))
            (covering   (filter (lambda (node)
                                  (null? (edges node)))
@@ -419,8 +419,8 @@ the latest known version of ~a (~a)~%")
                  (full-name x)))
         (lst
          (format (current-output-port)
-                 (N_ "Building the following package would ensure ~d \
-dependent packages are rebuilt: ~*~{~a~^ ~}~%"
+                 (N_ "Building the following ~*package would ensure ~d \
+dependent packages are rebuilt: ~{~a~^ ~}~%"
                      "Building the following ~d packages would ensure ~d \
 dependent packages are rebuilt: ~{~a~^ ~}~%"
                      (length covering))
diff --git a/guix/scripts/weather.scm b/guix/scripts/weather.scm
index 98b7338fb9..4b12f9550e 100644
--- a/guix/scripts/weather.scm
+++ b/guix/scripts/weather.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Kyle Meyer <kyle@kyleam.com>
 ;;;
@@ -32,6 +32,9 @@
   #:use-module (guix scripts substitute)
   #:use-module (guix http-client)
   #:use-module (guix ci)
+  #:use-module (guix sets)
+  #:use-module (guix graph)
+  #:autoload   (guix scripts graph) (%bag-node-type)
   #:use-module (gnu packages)
   #:use-module (web uri)
   #:use-module (srfi srfi-1)
@@ -41,6 +44,7 @@
   #:use-module (srfi srfi-37)
   #:use-module (ice-9 match)
   #:use-module (ice-9 format)
+  #:use-module (ice-9 vlist)
   #:export (guix-weather))
 
 (define (all-packages)
@@ -51,7 +55,10 @@
                       (cons* replacement package result))
                      (#f
                       (cons package result))))
-                 '()))
+                 '()
+
+                 ;; Dismiss deprecated packages but keep hidden packages.
+                 #:select? (negate package-superseded)))
 
 (define (call-with-progress-reporter reporter proc)
   "This is a variant of 'call-with-progress-reporter' that works with monadic
@@ -254,6 +261,10 @@ Report the availability of substitutes.\n"))
   -m, --manifest=MANIFEST
                          look up substitutes for packages specified in MANIFEST"))
   (display (G_ "
+  -c, --coverage[=COUNT]
+                         show substitute coverage for packages with at least
+                         COUNT dependents"))
+  (display (G_ "
   -s, --system=SYSTEM    consider substitutes for SYSTEM--e.g., \"i686-linux\""))
   (newline)
   (display (G_ "
@@ -286,6 +297,11 @@ Report the availability of substitutes.\n"))
          (option '(#\m "manifest") #t #f
                  (lambda (opt name arg result)
                    (alist-cons 'manifest arg result)))
+         (option '(#\c "coverage") #f #t
+                 (lambda (opt name arg result)
+                   (alist-cons 'coverage
+                               (if arg (string->number* arg) 0)
+                               result)))
          (option '(#\s "system") #t #f
                  (lambda (opt name arg result)
                    (alist-cons 'system arg result)))))
@@ -302,6 +318,153 @@ Report the availability of substitutes.\n"))
 
 
 ;;;
+;;; Missing package substitutes.
+;;;
+
+(define* (package-partition-boundary pred packages
+                                     #:key (system (%current-system)))
+  "Return the subset of PACKAGES that are at the \"boundary\" between those
+that match PRED and those that don't.  The returned packages themselves do not
+match PRED but they have at least one direct dependency that does.
+
+Note: The assumption is that, if P matches PRED, then all the dependencies of
+P match PRED as well."
+  ;; XXX: Graph theoreticians surely have something to teach us about this...
+  (let loop ((packages packages)
+             (result (setq))
+             (visited vlist-null))
+    (define (visited? package)
+      (vhash-assq package visited))
+
+    (match packages
+      ((package . rest)
+       (cond ((visited? package)
+              (loop rest result visited))
+             ((pred package)
+              (loop rest result (vhash-consq package #t visited)))
+             (else
+              (let* ((bag  (package->bag package system))
+                     (deps (filter-map (match-lambda
+                                         ((label (? package? package) . _)
+                                          (and (not (pred package))
+                                               package))
+                                         (_ #f))
+                                       (bag-direct-inputs bag))))
+                (loop (append deps rest)
+                      (if (null? deps)
+                          (set-insert package result)
+                          result)
+                      (vhash-consq package #t visited))))))
+      (()
+       (set->list result)))))
+
+(define (package->output-mapping packages system)
+  "Return a vhash that maps each item of PACKAGES to its corresponding output
+store file names for SYSTEM."
+  (foldm %store-monad
+         (lambda (package mapping)
+           (mlet %store-monad ((drv (package->derivation package system
+                                                         #:graft? #f)))
+             (return (vhash-consq package
+                                  (match (derivation->output-paths drv)
+                                    (((names . outputs) ...)
+                                     outputs))
+                                  mapping))))
+         vlist-null
+         packages))
+
+(define (substitute-oracle server items)
+  "Return a procedure that, when passed a store item (one of those listed in
+ITEMS), returns true if SERVER has a substitute for it, false otherwise."
+  (define available
+    (fold (lambda (narinfo set)
+            (set-insert (narinfo-path narinfo) set))
+          (set)
+          (lookup-narinfos server items)))
+
+  (cut set-contains? available <>))
+
+(define* (report-package-coverage-per-system server packages system
+                                             #:key (threshold 0))
+  "Report on the subset of PACKAGES that lacks SYSTEM substitutes on SERVER,
+sorted by decreasing number of dependents.  Do not display those with less
+than THRESHOLD dependents."
+  (mlet* %store-monad ((packages -> (package-closure packages #:system system))
+                       (mapping    (package->output-mapping packages system))
+                       (back-edges (node-back-edges %bag-node-type packages)))
+    (define items
+      (vhash-fold (lambda (package items result)
+                    (append items result))
+                  '()
+                  mapping))
+
+    (define substitutable?
+      (substitute-oracle server items))
+
+    (define substitutable-package?
+      (lambda (package)
+        (match (vhash-assq package mapping)
+          ((_ . items)
+           (find substitutable? items))
+          (#f
+           #f))))
+
+    (define missing
+      (package-partition-boundary substitutable-package? packages
+                                  #:system system))
+
+    (define missing-count
+      (length missing))
+
+    (if (zero? threshold)
+        (format #t (N_ "The following ~a package is missing from '~a' for \
+'~a':~%"
+                       "The following ~a packages are missing from '~a' for \
+'~a':~%"
+                       missing-count)
+                missing-count server system)
+        (format #t (N_ "~a package is missing from '~a' for '~a':~%"
+                       "~a packages are missing from '~a' for '~a', among \
+which:~%"
+                       missing-count)
+                missing-count server system))
+
+    (for-each (match-lambda
+                ((package count)
+                 (match (vhash-assq package mapping)
+                   ((_ . items)
+                    (when (>= count threshold)
+                      (format #t "  ~4d\t~a@~a\t~{~a ~}~%"
+                              count
+                              (package-name package) (package-version package)
+                              items)))
+                   (#f                      ;PACKAGE must be an internal thing
+                    #f))))
+              (sort (zip missing
+                         (map (lambda (package)
+                                (node-reachable-count (list package)
+                                                      back-edges))
+                              missing))
+                    (match-lambda*
+                      (((_ count1) (_ count2))
+                       (< count2 count1)))))
+    (return #t)))
+
+(define* (report-package-coverage server packages systems
+                                  #:key (threshold 0))
+  "Report on the substitute coverage for PACKAGES, for each of SYSTEMS, on
+SERVER.  Display information for packages with at least THRESHOLD dependents."
+  (with-store store
+    (run-with-store store
+      (foldm %store-monad
+             (lambda (system _)
+               (report-package-coverage-per-system server packages system
+                                                   #:threshold threshold))
+             #f
+             systems))))
+
+
+;;;
 ;;; Entry point.
 ;;;
 
@@ -331,7 +494,12 @@ Report the availability of substitutes.\n"))
                                       (package-outputs packages system))
                                     systems)))))))
         (for-each (lambda (server)
-                    (report-server-coverage server items))
+                    (report-server-coverage server items)
+                    (match (assoc-ref opts 'coverage)
+                      (#f #f)
+                      (threshold
+                       (report-package-coverage server packages systems
+                                                #:threshold threshold))))
                   urls)))))
 
 ;;; Local Variables:
diff --git a/guix/store/deduplication.scm b/guix/store/deduplication.scm
index a777940f86..8ca16a4cd8 100644
--- a/guix/store/deduplication.scm
+++ b/guix/store/deduplication.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017 Caleb Ristvedt <caleb.ristvedt@cune.org>
-;;; Copyright © 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -109,8 +109,9 @@ Note: TARGET, TO-REPLACE, and SWAP-DIRECTORY must be on the same file system."
         (get-temp-link target swap-directory))
       (lambda args
         ;; We get ENOSPC when we can't fit an additional entry in
-        ;; SWAP-DIRECTORY.
-        (if (= ENOSPC (system-error-errno args))
+        ;; SWAP-DIRECTORY.  If it's EMLINK, then TARGET has reached its
+        ;; maximum number of links.
+        (if (memv (system-error-errno args) `(,ENOSPC ,EMLINK))
             #f
             (apply throw args)))))
 
@@ -169,4 +170,8 @@ under STORE."
                          ;; more entries in .links, but that's fine: we can
                          ;; just stop.
                          #f)
+                        ((= errno EMLINK)
+                         ;; PATH has reached the maximum number of links, but
+                         ;; that's OK: we just can't deduplicate it more.
+                         #f)
                         (else (apply throw args))))))))))
diff --git a/guix/tests.scm b/guix/tests.scm
index 16a426c4f9..749a4edd7a 100644
--- a/guix/tests.scm
+++ b/guix/tests.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -334,18 +334,19 @@ CONTENTS."
 (define-syntax-rule (dummy-package name* extra-fields ...)
   "Return a \"dummy\" package called NAME*, with all its compulsory fields
 initialized with default values, and with EXTRA-FIELDS set as specified."
-  (package extra-fields ...
-           (name name*) (version "0") (source #f)
-           (build-system gnu-build-system)
-           (synopsis #f) (description #f)
-           (home-page #f) (license #f)))
+  (let ((p (package
+             (name name*) (version "0") (source #f)
+             (build-system gnu-build-system)
+             (synopsis #f) (description #f)
+             (home-page #f) (license #f))))
+    (package (inherit p) extra-fields ...)))
 
 (define-syntax-rule (dummy-origin extra-fields ...)
   "Return a \"dummy\" origin, with all its compulsory fields initialized with
 default values, and with EXTRA-FIELDS set as specified."
-  (origin extra-fields ...
-          (method #f) (uri "http://www.example.com")
-          (sha256 (base32 (make-string 52 #\x)))))
+  (let ((o (origin (method #f) (uri "http://www.example.com")
+                   (sha256 (base32 (make-string 52 #\x))))))
+    (origin (inherit o) extra-fields ...)))
 
 ;; Local Variables:
 ;; eval: (put 'call-with-derivation-narinfo 'scheme-indent-function 1)
diff --git a/guix/ui.scm b/guix/ui.scm
index 9ff56ea85c..9eab4ba3f7 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -690,7 +690,7 @@ or remove one of them from the profile.")
                     (strerror (store-connection-error-code c))))
             ((store-protocol-error? c)
              ;; FIXME: Server-provided error messages aren't i18n'd.
-             (leave (G_ "build failed: ~a~%")
+             (leave (G_ "~a~%")
                     (store-protocol-error-message c)))
             ((derivation-missing-output-error? c)
              (leave (G_ "reference to invalid output '~a' of derivation '~a'~%")
diff --git a/tests/packages.scm b/tests/packages.scm
index 29e5e4103c..e5704ae4b9 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -249,6 +249,28 @@
           (package-transitive-supported-systems d)
           (package-transitive-supported-systems e))))
 
+(test-assert "package-closure"
+  (let-syntax ((dummy-package/no-implicit
+                (syntax-rules ()
+                  ((_ name rest ...)
+                   (package
+                     (inherit (dummy-package name rest ...))
+                     (build-system trivial-build-system))))))
+    (let* ((a (dummy-package/no-implicit "a"))
+           (b (dummy-package/no-implicit "b"
+                (propagated-inputs `(("a" ,a)))))
+           (c (dummy-package/no-implicit "c"
+                (inputs `(("a" ,a)))))
+           (d (dummy-package/no-implicit "d"
+                (native-inputs `(("b" ,b)))))
+           (e (dummy-package/no-implicit "e"
+                (inputs `(("c" ,c) ("d" ,d))))))
+      (lset= eq?
+             (list a b c d e)
+             (package-closure (list e))
+             (package-closure (list e d))
+             (package-closure (list e c b))))))
+
 (test-equal "origin-actual-file-name"
   "foo-1.tar.gz"
   (let ((o (dummy-origin (uri "http://www.example.com/foo-1.tar.gz"))))
@@ -1180,4 +1202,5 @@
 
 ;;; Local Variables:
 ;;; eval: (put 'dummy-package 'scheme-indent-function 1)
+;;; eval: (put 'dummy-package/no-implicit 'scheme-indent-function 1)
 ;;; End:
diff --git a/tests/services.scm b/tests/services.scm
index 5827dee80d..44ad0022c6 100644
--- a/tests/services.scm
+++ b/tests/services.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -143,7 +143,7 @@
                            (default-value 'dflt)
                            (compose concatenate)
                            (extend cons)))
-         (t2 (service-type (name 't2) (extensions '())
+         (t2 (service-type (name 't2)
                            (default-value 'dflt2)
                            (compose concatenate)
                            (extend cons)