summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am9
-rw-r--r--configure.ac4
-rw-r--r--doc/guix.texi16
-rw-r--r--gnu/local.mk2
-rw-r--r--gnu/packages/astronomy.scm1
-rw-r--r--gnu/packages/audacity.scm4
-rw-r--r--gnu/packages/backup.scm24
-rw-r--r--gnu/packages/bootloaders.scm6
-rw-r--r--gnu/packages/compton.scm3
-rw-r--r--gnu/packages/display-managers.scm5
-rw-r--r--gnu/packages/dns.scm12
-rw-r--r--gnu/packages/game-development.scm51
-rw-r--r--gnu/packages/games.scm154
-rw-r--r--gnu/packages/gnome.scm4
-rw-r--r--gnu/packages/image.scm4
-rw-r--r--gnu/packages/kde-frameworks.scm22
-rw-r--r--gnu/packages/kodi.scm293
-rw-r--r--gnu/packages/linux.scm3
-rw-r--r--gnu/packages/mail.scm54
-rw-r--r--gnu/packages/messaging.scm112
-rw-r--r--gnu/packages/mpd.scm4
-rw-r--r--gnu/packages/music.scm53
-rw-r--r--gnu/packages/ntp.scm4
-rw-r--r--gnu/packages/ots.scm34
-rw-r--r--gnu/packages/patches/ngircd-no-dns-in-tests.patch368
-rw-r--r--gnu/packages/patches/vim-CVE-2017-5953.patch32
-rw-r--r--gnu/packages/perl.scm44
-rw-r--r--gnu/packages/pretty-print.scm29
-rw-r--r--gnu/packages/python.scm265
-rw-r--r--gnu/packages/qt.scm1
-rw-r--r--gnu/packages/ssh.scm4
-rw-r--r--gnu/packages/statistics.scm35
-rw-r--r--gnu/packages/text-editors.scm1
-rw-r--r--gnu/packages/version-control.scm16
-rw-r--r--gnu/packages/video.scm4
-rw-r--r--gnu/packages/vim.scm29
-rw-r--r--gnu/packages/web.scm12
-rw-r--r--gnu/packages/wm.scm28
-rw-r--r--gnu/packages/wxwidgets.scm30
-rw-r--r--gnu/services/base.scm2
-rw-r--r--gnu/services/ssh.scm110
-rw-r--r--gnu/system/file-systems.scm29
-rw-r--r--gnu/system/linux-initrd.scm23
-rw-r--r--gnu/tests/ssh.scm109
-rw-r--r--guix/build/download.scm13
-rw-r--r--guix/download.scm1
-rw-r--r--guix/ftp-client.scm7
-rw-r--r--scripts/guix.in11
-rw-r--r--tests/file-systems.scm12
49 files changed, 1318 insertions, 775 deletions
diff --git a/Makefile.am b/Makefile.am
index 577cb5ebf3..91b5f64e4c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -221,7 +221,8 @@ GOBJECTS = $(MODULES:%.scm=%.go) guix/config.go $(dist_noinst_DATA:%.scm=%.go)
 nobase_dist_guilemodule_DATA =                  \
   $(MODULES) $(AUX_FILES) $(EXAMPLES)            \
   $(MISC_DISTRO_FILES)
-nobase_nodist_guilemodule_DATA = $(GOBJECTS) guix/config.scm
+nobase_nodist_guilemodule_DATA = guix/config.scm
+nobase_nodist_guileobject_DATA = $(GOBJECTS)
 
 # Do we need to provide our own non-broken (srfi srfi-37) module?
 if INSTALL_SRFI_37
@@ -456,14 +457,14 @@ SUFFIXES = .go
 # files.  See
 # <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
 # for details.
-guix_install_go_files = install-nobase_nodist_guilemoduleDATA
+guix_install_go_files = install-nobase_nodist_guileobjectDATA
 $(guix_install_go_files): install-nobase_dist_guilemoduleDATA
 
 # The above trick doesn't work for 'config.go' because both 'config.scm' and
-# 'config.go' are listed in $(nobase_nodist_guilemodule_DATA).  Thus, give it
+# 'config.go' are listed in $(nobase_nodist_guileobject_DATA).  Thus, give it
 # special treatment.
 install-data-hook: set-bootstrap-executable-permissions
-	touch "$(DESTDIR)$(guilemoduledir)/guix/config.go"
+	touch "$(DESTDIR)$(guileobjectdir)/guix/config.go"
 
 
 SUBDIRS = po/guix po/packages
diff --git a/configure.ac b/configure.ac
index 76f52e0ec3..2b4620c44b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -85,9 +85,11 @@ if test "x$GUILE_EFFECTIVE_VERSION" = "x2.0"; then
   PKG_CHECK_MODULES([GUILE], [guile-2.0 >= 2.0.9])
 fi
 
-dnl Installation directory for .scm and .go files.
+dnl Installation directories for .scm and .go files.
 guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION"
+guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache"
 AC_SUBST([guilemoduledir])
+AC_SUBST([guileobjectdir])
 
 dnl The GnuTLS bindings are necessary for substitutes over HTTPS and for 'guix
 dnl pull', among other things.
diff --git a/doc/guix.texi b/doc/guix.texi
index c72a612b4c..efd4887bbe 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9516,6 +9516,22 @@ equivalent role to password authentication, you should disable either
 @item @code{print-last-log?} (default: @code{#t})
 Specifies whether @command{sshd} should print the date and time of the
 last user login when a user logs in interactively.
+
+@item @code{subsystems} (default: @code{'(("sftp" "internal-sftp"))})
+Configures external subsystems (e.g. file transfer daemon).
+
+This is a list of two-element lists, each of which containing the
+subsystem name and a command (with optional arguments) to execute upon
+subsystem request.
+
+The command @command{internal-sftp} implements an in-process SFTP
+server.  Alternately, one can specify the @command{sftp-server} command:
+@example
+(service openssh-service-type
+         (openssh-configuration
+          (subsystems
+           '(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))
+@end example
 @end table
 @end deftp
 
diff --git a/gnu/local.mk b/gnu/local.mk
index 256682effa..b8db8712d9 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -778,7 +778,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/netsurf-y2038-tests.patch		\
   %D%/packages/patches/netsurf-longer-test-timeout.patch	\
   %D%/packages/patches/ngircd-handle-zombies.patch		\
-  %D%/packages/patches/ngircd-no-dns-in-tests.patch		\
   %D%/packages/patches/ninja-zero-mtime.patch			\
   %D%/packages/patches/node-9077.patch				\
   %D%/packages/patches/nss-increase-test-timeout.patch		\
@@ -964,7 +963,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/util-linux-CVE-2017-2616.patch		\
   %D%/packages/patches/upower-builddir.patch			\
   %D%/packages/patches/valgrind-enable-arm.patch		\
-  %D%/packages/patches/vim-CVE-2017-5953.patch			\
   %D%/packages/patches/virglrenderer-CVE-2017-6386.patch 	\
   %D%/packages/patches/vorbis-tools-CVE-2014-9638+CVE-2014-9639.patch		\
   %D%/packages/patches/vorbis-tools-CVE-2014-9640.patch		\
diff --git a/gnu/packages/astronomy.scm b/gnu/packages/astronomy.scm
index 2695530fee..9f5e4aeb78 100644
--- a/gnu/packages/astronomy.scm
+++ b/gnu/packages/astronomy.scm
@@ -143,6 +143,7 @@ programs for the manipulation and analysis of astronomical data.")
         #:phases (modify-phases %standard-phases
                    (add-before 'check 'set-offscreen-display
                      (lambda _
+                       ;; make Qt render "offscreen", required for tests
                        (setenv "QT_QPA_PLATFORM" "offscreen")
                        (setenv "HOME" "/tmp")
                        #t)))))
diff --git a/gnu/packages/audacity.scm b/gnu/packages/audacity.scm
index a70d0e3a69..c448d0c1f2 100644
--- a/gnu/packages/audacity.scm
+++ b/gnu/packages/audacity.scm
@@ -52,8 +52,8 @@
     (inputs
      ;; TODO: Add portSMF and libwidgetextra once they're packaged.  In-tree
      ;; versions shipping with Audacity are used for now.
-     `(("wxwidgets" ,wxwidgets-gtk2)
-       ("gtk" ,gtk+-2)
+     `(("wxwidgets" ,wxwidgets)
+       ("gtk" ,gtk+)
        ("alsa-lib" ,alsa-lib)
        ("jack" ,jack-1)
        ("expat" ,expat)
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index 9e20b9f033..bdf8884ab2 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -639,7 +639,23 @@ NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.")
          "0qlipsq50hca71zc0dp1mg9zs12qm0sbblw7qfzl0hj6mk2rv1by"))))
     (build-system python-build-system)
     (arguments
-     `(#:python ,python-2))
+     `(#:python ,python-2
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'check
+                  (lambda _
+                    (substitute* "obnamlib/vfs_local_tests.py"
+                      ;; Check for the nobody user instead of root
+                      (("self.fs.get_username\\(0\\), 'root'")
+                       "self.fs.get_username(65534), 'nobody'")
+                      ;; Disable tests checking for root group
+                      (("self.fs.get_groupname\\(0\\)") "'root'"))
+                    (substitute* "obnamlib/vfs_local.py"
+                      ;; Don't cover get_groupname function
+                      (("def get_groupname\\(self, gid\\):")
+                       "def get_groupname(self, gid):  # pragma: no cover"))
+                    ;; Can't run network tests
+                    (zero? (system* "./check" "--unit-tests")))))))
     (inputs
      `(("python2-cliapp" ,python2-cliapp)
        ("python2-larch" ,python2-larch)
@@ -647,6 +663,12 @@ NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.")
        ("python2-pyaml" ,python2-pyaml)
        ("python2-tracing" ,python2-tracing)
        ("python2-ttystatus" ,python2-ttystatus)))
+    (native-inputs
+     `(("gnupg" ,gnupg)
+       ("python2-coverage" ,python2-coverage)
+       ("python2-coverage-test-runner" ,python2-coverage-test-runner)
+       ("python2-pep8" ,python2-pep8)
+       ("python2-pylint" ,python2-pylint)))
     (home-page "https://obnam.org/")
     (synopsis "Easy and secure backup program")
     (description "Obnam is an easy, secure backup program.  Features
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index 5fc6bf2e29..a3f436373d 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -228,15 +228,15 @@ menu to select one of the installed operating systems.")
 (define-public dtc
   (package
     (name "dtc")
-    (version "1.4.2")
+    (version "1.4.4")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "https://www.kernel.org/pub/software/utils/dtc/"
+                    "mirror://kernel.org/software/utils/dtc/"
                     "dtc-" version ".tar.xz"))
               (sha256
                (base32
-                "1b7si8niyca4wxbfah3qw4p4wli81mc1qwfhaswvrfqahklnwi8k"))))
+                "1yygyvnnpdh241hl90n9p3kxcdvk3jxmsr4ndb961c8mq3ak21s7"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("bison" ,bison)
diff --git a/gnu/packages/compton.scm b/gnu/packages/compton.scm
index a0a644db7b..323807091a 100644
--- a/gnu/packages/compton.scm
+++ b/gnu/packages/compton.scm
@@ -50,7 +50,6 @@
       (build-system gnu-build-system)
       (inputs
        `(("dbus" ,dbus)
-         ("docbook-xml" ,docbook-xml)
          ("libconfig" ,libconfig)
          ("libx11" ,libx11)
          ("libxcomposite" ,libxcomposite)
@@ -58,10 +57,8 @@
          ("libxext" ,libxext)
          ("libxfixes" ,libxfixes)
          ("libxinerama" ,libxinerama)
-         ("libxml2" ,libxml2)
          ("libxrandr" ,libxrandr)
          ("libxrender" ,libxrender)
-         ("libxslt" ,libxslt)
          ("mesa" ,mesa)
          ("xprop" ,xprop)
          ("xwininfo" ,xwininfo)))
diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm
index 80b45af103..307bc864ec 100644
--- a/gnu/packages/display-managers.scm
+++ b/gnu/packages/display-managers.scm
@@ -41,7 +41,7 @@
 (define-public greenisland
   (package
     (name "greenisland")
-    (version "0.8.1")
+    (version "0.9.0.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -50,7 +50,7 @@
                     "greenisland-" version ".tar.xz"))
               (sha256
                (base32
-                "1c9rlq7fqrsd5nb37anjvnp9xspqjz1kc0fvydv5xdy3abg8mw40"))))
+                "1flmha31hmii6m2mdvmn1q5dc0fhnvgc4lp1b4wgkz20y7x4f1fm"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
@@ -100,6 +100,7 @@
          (add-before 'check 'check-setup
            (lambda _
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "XDG_RUNTIME_DIR" (getcwd))
              #t))
diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm
index d09abc1366..ec89abc670 100644
--- a/gnu/packages/dns.scm
+++ b/gnu/packages/dns.scm
@@ -294,8 +294,10 @@ asynchronous fashion.")
     (arguments
      `(#:phases (modify-phases %standard-phases
                   (add-before 'configure 'omit-example-configurations
-                              (lambda _ (substitute* "Makefile.in"
-                                          ((" (etc|var)") "")))))
+                              (lambda _
+                                (substitute* "Makefile.in"
+                                  ((" (etc|var)") ""))
+                                #t)))
        #:configure-flags (list "--sysconfdir=/etc"      "--localstatedir=/var"
                                "--enable-shared"        "--disable-static"
                                "--enable-messages"      "--enable-ctrl"
@@ -334,7 +336,8 @@ Extensions} (DNSSEC).")
                     (("contrib/dnstap ") ""))
                   (with-directory-excursion "src/contrib"
                     (for-each delete-file-recursively
-                              (list "dnstap" "lmdb")))))))
+                              (list "dnstap" "lmdb")))
+                  #t))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -354,7 +357,8 @@ Extensions} (DNSSEC).")
          (add-before 'configure 'disable-directory-pre-creation
            (lambda _
              ;; Don't install empty directories like ‘/etc’ outside the store.
-             (substitute* "src/Makefile.in" (("\\$\\(INSTALL\\) -d") "true"))))
+             (substitute* "src/Makefile.in" (("\\$\\(INSTALL\\) -d") "true"))
+             #t))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 908ce48347..6525f94304 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
+;;; Copyright © 2016, 2017 Kei Kebreau <kei@openmailbox.org>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Julian Graham <joolean@gmail.com>
 ;;;
@@ -95,6 +95,55 @@
 is used in some video games and movies.")
     (license license:zlib)))
 
+(define-public deutex
+  (package
+   (name "deutex")
+   (version "4.4.902")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "https://github.com/Doom-Utils/" name
+                                "/archive/v" version ".tar.gz"))
+            (file-name (string-append name "-" version ".tar.gz"))
+            (sha256
+             (base32
+              "0rwz1yzgd539x4h25kzhar4q02xyxjwfrcpz4m8ixi312a82p7cn"))))
+   (build-system gnu-build-system)
+   (arguments
+    '(#:tests? #f ; no check target
+      #:phases
+      (modify-phases %standard-phases
+        ;; The provided configure script takes a restricted number of arguments.
+        (replace 'configure
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (zero? (system* "./configure" "--prefix"
+                                   (assoc-ref %outputs "out")))))
+        ;; "make install" is broken for this package.
+        ;; Notably, the binaries overrwrite one another upon installation as
+        ;; they are all installed to the "bin" file in the output directory,
+        ;; and the manual page fails to install because the directory for the
+        ;; manual page is not created.
+        (replace 'install
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref %outputs "out"))
+                          (bin (string-append out "/bin"))
+                          (share (string-append out "/share")))
+                     (install-file "deusf" bin)
+                     (install-file "deutex" bin)
+                     (install-file "deutex.6" (string-append share "/man/man6")))
+                   #t)))))
+   (home-page "https://github.com/Doom-Utils/deutex")
+   (synopsis "WAD file composer for Doom and related games")
+   (description
+    "DeuTex is a wad composer for Doom, Heretic, Hexen and Strife. It can be
+used to extract the lumps of a wad and save them as individual files.
+Conversely, it can also build a wad from separate files.  When extracting a
+lump to a file, it does not just copy the raw data, it converts it to an
+appropriate format (such as PPM for graphics, Sun audio for samples, etc.).
+Conversely, when it reads files for inclusion in pwads, it does the necessary
+conversions (for example, from PPM to Doom picture format).  In addition,
+DeuTex has functions such as merging wads, etc.")
+   (license license:gpl2+)))
+
 (define-public gzochi
   (package
     (name "gzochi")
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index f264ef206f..67fcb7b496 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -25,6 +25,7 @@
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Steve Webber <webber.sl@gmail.com>
 ;;; Copyright © 2017 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
+;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -58,6 +59,7 @@
   #:use-module (gnu packages audio)
   #:use-module (gnu packages avahi)
   #:use-module (gnu packages boost)
+  #:use-module (gnu packages documentation)
   #:use-module (gnu packages fltk)
   #:use-module (gnu packages fribidi)
   #:use-module (gnu packages game-development)
@@ -69,6 +71,7 @@
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages libcanberra)
   #:use-module (gnu packages libunwind)
   #:use-module (gnu packages haskell)
@@ -107,12 +110,85 @@
   #:use-module (gnu packages tls)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages cyrus-sasl)
+  #:use-module (gnu packages messaging)
+  #:use-module (gnu packages upnp)
+  #:use-module (gnu packages wxwidgets)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system haskell)
   #:use-module (guix build-system python)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system trivial))
 
+(define-public freedoom
+  (package
+   (name "freedoom")
+   (version "0.11.1")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "https://github.com/" name "/" name
+                                "/archive/v" version ".tar.gz"))
+            (file-name (string-append name "-" version ".tar.gz"))
+            (sha256
+             (base32
+              "060dqppd9fi079yw6c82klsjaslcabq6xan67wf9hs0cy39i0kpv"))))
+   (build-system gnu-build-system)
+   (arguments
+    '(#:make-flags `(,(string-append "prefix=" (assoc-ref %outputs "out")))
+      #:parallel-build? #f
+      #:tests? #f ; no check target
+      #:phases
+      (modify-phases %standard-phases
+        (add-before 'unpack 'no (lambda _ #t))
+        (replace 'configure
+                 (lambda* (#:key inputs outputs #:allow-other-keys)
+                   (let* ((dejavu (assoc-ref inputs "font-dejavu"))
+                          (freedoom (assoc-ref outputs "out"))
+                          (wad-dir (string-append freedoom "/share/games/doom")))
+                     ;; Replace the font-searching function in a shell
+                     ;; script with a direct path to the required font.
+                     ;; This is necessary because ImageMagick can only find the
+                     ;; most basic fonts while in the build environment.
+                     (substitute* "graphics/titlepic/create_caption"
+                       (("font=\\$\\(find_font.*$")
+                        (string-append
+                         "font=" dejavu
+                         "/share/fonts/truetype/DejaVuSansCondensed-Bold.ttf\n")))
+                     ;; Make icon creation reproducible.
+                     (substitute* "dist/Makefile"
+                       (("freedm.png")
+                        "-define png:exclude-chunks=date freedm.png")
+                       (("freedoom1.png")
+                        "-define png:exclude-chunks=date freedoom1.png")
+                       (("freedoom2.png")
+                        "-define png:exclude-chunks=date freedoom2.png"))
+                     ;; Make sure that the install scripts know where to find
+                     ;; the appropriate WAD files.
+                     (substitute* "dist/freedoom"
+                       (("IWAD=freedm.wad")
+                        (string-append "IWAD=" wad-dir "/freedm.wad"))
+                       (("IWAD=freedoom1.wad")
+                        (string-append "IWAD=" wad-dir "/freedoom1.wad"))
+                       (("IWAD=freedoom2.wad")
+                        (string-append "IWAD=" wad-dir "/freedoom2.wad")))
+                     #t))))))
+   (native-inputs
+    `(("asciidoc" ,asciidoc)
+      ("deutex" ,deutex)
+      ("font-dejavu" ,font-dejavu)
+      ("imagemagick" ,imagemagick)
+      ("python" ,python-2)))
+   (inputs
+    `(("prboom-plus" ,prboom-plus)))
+   (home-page "https://freedoom.github.io/")
+   (synopsis "Free content game based on the Doom engine")
+   (description
+    "The Freedoom project aims to create a complete free content first person
+shooter game.  Freedoom by itself is just the raw material for a game: it must
+be paired with a compatible game engine (such as @code{prboom-plus}) to be
+played.  Freedoom complements the Doom engine with free levels, artwork, sound
+effects and music to make a completely free game.")
+   (license license:bsd-3)))
+
 (define-public gnubg
   (package
     (name "gnubg")
@@ -3267,3 +3343,81 @@ This command works on piped data.  Pipe any ASCII or UTF-8 text to nms, and
 it will apply the hollywood effect, initially showing encrypted data, then
 starting a decryption sequence to reveal the original plaintext characters.")
     (license license:expat)))
+
+(define-public megaglest-data
+  (package
+    (name "megaglest-data")
+    (version "3.13.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/MegaGlest/megaglest-data"
+             "/releases/download/" version "/megaglest-data-"
+             version ".tar.xz"))
+       (sha256
+        (base32
+         "0ipgza33z89fw3si32iafm981f3fvm0zldvbxj29whghd2k3rpj3"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:tests? #f))
+    (home-page "https://megaglest.org/")
+    (synopsis "Data files for MegaGlest")
+    (description "This package contains the data files required for MegaGlest.")
+    (license license:cc-by-sa3.0)))
+
+(define-public megaglest
+  (package
+    (name "megaglest")
+    (version "3.13.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/MegaGlest/megaglest-source"
+             "/releases/download/" version "/megaglest-source-"
+             version ".tar.xz"))
+       (sha256
+        (base32
+         "1ffck3ii1wp5k3nn5p0ga06jgp7pzk4zw0xln3xim2w7qrxzdzh9"))))
+    (build-system cmake-build-system)
+    (inputs
+     `(("curl" ,curl)
+       ("fontconfig" ,fontconfig)
+       ("ftgl" ,ftgl)
+       ("glew" ,glew)
+       ("libjpeg-turbo" ,libjpeg-turbo)
+       ("megaglest-data" ,megaglest-data)
+       ("mesa" ,mesa)
+       ("miniupnpc" ,miniupnpc)
+       ("openal" ,openal)
+       ("libircclient" ,libircclient)
+       ("libpng" ,libpng)
+       ("libvorbis" ,libvorbis)
+       ("lua" ,lua)
+       ("sdl2" ,sdl2)
+       ("wxwidgets" ,wxwidgets)))
+    (native-inputs
+     `(("cppunit" ,cppunit)
+       ("pkg-config" ,pkg-config)))
+    (arguments
+     `(#:configure-flags
+       (list (string-append "-DCUSTOM_DATA_INSTALL_PATH="
+                            (assoc-ref %build-inputs "megaglest-data")
+                            "/share/megaglest")
+             "-DBUILD_MEGAGLEST_TESTS=ON")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-ini-search-path
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (substitute* "source/glest_game/global/config.cpp"
+                        (("/usr/share/megaglest/")
+                         (string-append (assoc-ref outputs "out")
+                                        "/share/megaglest/"))))))
+       #:test-target "megaglest_tests"))
+    (home-page "https://megaglest.org/")
+    (synopsis "3D real-time strategy (RTS) game")
+    (description "MegaGlest is a cross-platform 3D real-time strategy (RTS)
+game, where you control the armies of one of seven different factions: Tech,
+Magic, Egypt, Indians, Norsemen, Persian or Romans.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index cfd8b24290..f8fafdbc7a 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -3658,7 +3658,7 @@ USB transfers with your high-level application or system daemon.")
 (define-public simple-scan
   (package
     (name "simple-scan")
-    (version "3.22.0.1")
+    (version "3.24.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://launchpad.net/simple-scan/"
@@ -3667,7 +3667,7 @@ USB transfers with your high-level application or system daemon.")
                                   version ".tar.xz"))
               (sha256
                (base32
-                "0l1b3llkdlqq0bcjx1cadba67l2zb4zfykdaprpjbjbr6gkbc1f5"))))
+                "19klldnbnknpq6ikz9x93861ywcyg0pg9ngijvw66ncbnb7lx912"))))
     (build-system glib-or-gtk-build-system)
     (inputs
      `(("gtk" ,gtk+)
diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm
index 9c0e695f9a..fb6536b8c0 100644
--- a/gnu/packages/image.scm
+++ b/gnu/packages/image.scm
@@ -932,7 +932,7 @@ ISO/IEC 15444-1).")
 (define-public zimg
   (package
     (name "zimg")
-    (version "2.3")
+    (version "2.5")
     (source
       (origin
         (method url-fetch)
@@ -941,7 +941,7 @@ ISO/IEC 15444-1).")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "1yh6kkq8596a9cxcmcxzqvwbwmxwqapwsq31xpccznw6z62j75h9"))))
+          "0kbq2dy659645fmgxpzg38b6y6x82kwkydhc380kdkaikv2brcjh"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("autoconf" ,autoconf)
diff --git a/gnu/packages/kde-frameworks.scm b/gnu/packages/kde-frameworks.scm
index 7b90c1436b..1001813db3 100644
--- a/gnu/packages/kde-frameworks.scm
+++ b/gnu/packages/kde-frameworks.scm
@@ -650,6 +650,7 @@ infrastructure.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -984,7 +985,8 @@ represented by a QPoint or a QSize.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
-             (setenv "QT_QPA_PLATFORM" "offscreen") ; a better solution to Xvfb
+             ;; make Qt render "offscreen", required for tests
+             (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; enable debug info
              (setenv "DBUS_FATAL_WARNINGS" "0")
              #t))
@@ -1307,6 +1309,7 @@ utilities.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -1692,6 +1695,7 @@ gallons).")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "HOME" (getcwd))
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t))
          (replace 'check
@@ -1816,6 +1820,7 @@ by which applications, and what documents have been linked to which activity.")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "HOME" (getcwd))
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -1894,6 +1899,7 @@ KCModules can be created with the KConfigWidgets framework.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2024,6 +2030,7 @@ started on demand.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2096,6 +2103,7 @@ with su and ssh respectively.")
            (lambda _
              (setenv "HOME" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2139,6 +2147,7 @@ emoticons coming from different providers.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2188,6 +2197,7 @@ window does not need focus for them to be activated.")
                                     "/share"))
              (setenv "HOME" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2297,6 +2307,7 @@ makes starting KDE applications faster and reduces memory consumption.")
              (setenv "HOME" (getcwd))
              (setenv "XDG_RUNTIME_DIR" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     ;;(replace 'check
@@ -2361,6 +2372,7 @@ KIO enabled infrastructure.")
            (lambda _ ; XDG_DATA_DIRS isn't set
              (setenv "HOME" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2454,6 +2466,7 @@ notifications which can be embedded in your application.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2494,6 +2507,7 @@ widgets with a user-interface defined in terms of actions.")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2550,6 +2564,7 @@ to easily extend the contacts collection.")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2595,6 +2610,7 @@ typed.")
            (lambda _
              (setenv "HOME" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2661,6 +2677,7 @@ types or handled by application specific code.")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "HOME" (getcwd))
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
              #t)))))
@@ -2708,6 +2725,7 @@ library.")
        (modify-phases %standard-phases
          (add-before 'check 'check-setup
            (lambda _
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2798,6 +2816,7 @@ the passwords on KDE work spaces.")
          (add-before 'check 'check-setup
            (lambda _
              (setenv "HOME" (getcwd))
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
              #t)))))
@@ -2910,6 +2929,7 @@ setUrl, setUserAgent and call.")
            (lambda _
              (setenv "HOME" (getcwd))
              (setenv "CTEST_OUTPUT_ON_FAILURE" "1") ; Enable debug output
+             ;; make Qt render "offscreen", required for tests
              (setenv "QT_QPA_PLATFORM" "offscreen")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
diff --git a/gnu/packages/kodi.scm b/gnu/packages/kodi.scm
index 929894d61e..a60e2c0548 100644
--- a/gnu/packages/kodi.scm
+++ b/gnu/packages/kodi.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,13 +23,13 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages audio)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages avahi)
   #:use-module (gnu packages base)
-  #:use-module (gnu packages boost)
   #:use-module (gnu packages cdrom)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
@@ -52,6 +53,7 @@
   #:use-module (gnu packages mp3)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
   #:use-module (gnu packages samba)
@@ -119,153 +121,301 @@ generator library for C++.")
       (home-page "https://github.com/graeme-hill/crossguid")
       (license license:expat))))
 
+;; Kodi requires using their own special forks of these libraries.
+;; In addition, it insists on downloading and building these as part
+;; of the standard build process. To make things easier, we bootstrap
+;; and patch shebangs here, so we don't have to worry about it later.
+(define libdvdnav/kodi
+  (let ((commit "981488f7f27554b103cca10c1fbeba027396c94a"))
+    (package
+      (name "libdvdnav-bootstrapped")
+      (version commit)
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/xbmc/libdvdnav.git")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "089pswc51l3avh95zl4cpsh7gh1innh7b2y4xgx840mcmy46ycr8"))))
+      (build-system gnu-build-system)
+      (arguments
+       '(#:tests? #f
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'bootstrap
+             (lambda _ (zero? (system* "autoreconf" "-vif"))))
+           (delete 'configure)
+           (delete 'build)
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (copy-recursively "." (assoc-ref outputs "out"))
+               #t)))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("libtool" ,libtool)
+         ("pkg-config" ,pkg-config)))
+      (home-page "https://github.com/xbmc/libdvdnav")
+      (synopsis (package-synopsis libdvdnav))
+      (description (package-description libdvdnav))
+      (license license:gpl2+))))
+
+(define libdvdread/kodi
+  (let ((commit "17d99db97e7b8f23077b342369d3c22a6250affd"))
+    (package
+      (name "libdvdread-bootstrapped")
+      (version commit)
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/xbmc/libdvdread.git")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "1gr5aq1cjr3as9mnwrw29cxn4m6f6pfrxdahkdcjy70q3ldg90sl"))))
+      (build-system gnu-build-system)
+      (arguments
+       '(#:tests? #f
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'bootstrap
+             (lambda _ (zero? (system* "autoreconf" "-vif"))))
+           (delete 'configure)
+           (delete 'build)
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (copy-recursively "." (assoc-ref outputs "out"))
+               #t)))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("libtool" ,libtool)
+         ("pkg-config" ,pkg-config)))
+      (home-page "https://github.com/xbmc/libdvdread")
+      (synopsis (package-synopsis libdvdread))
+      (description (package-description libdvdread))
+      (license (list license:gpl2+ license:lgpl2.1+)))))
+
+(define libdvdcss/kodi
+  (let ((commit "2f12236bc1c92f73c21e973363f79eb300de603f"))
+    (package
+      (name "libdvdcss-bootstrapped")
+      (version commit)
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/xbmc/libdvdcss.git")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "198r0q73i55ga1dvyqq9nfcri0zq08b94hy8671lg14i3izx44dd"))))
+      (build-system gnu-build-system)
+      (arguments
+       '(#:tests? #f
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'bootstrap
+             (lambda _ (zero? (system* "autoreconf" "-vif"))))
+           (delete 'configure)
+           (delete 'build)
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (copy-recursively "." (assoc-ref outputs "out"))
+               #t)))))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("libtool" ,libtool)
+         ("pkg-config" ,pkg-config)))
+      (home-page "https://github.com/xbmc/libdvdcss")
+      (synopsis (package-synopsis libdvdcss))
+      (description (package-description libdvdcss))
+      (license license:gpl2+))))
+
 (define-public kodi
+  ;; We package the git version because the current released
+  ;; version was cut while the cmake transition was in turmoil.
+  (let ((commit "b35147e2bec41ce332b9788f4a6ac94d2e5999e3")
+        (revision "0"))
   (package
     (name "kodi")
-    (version "16.0")
+    (version (string-append "18.0_alpha-" revision "-" (string-take commit 7)))
     (source (origin
-              (method url-fetch)
-              (uri (string-append "http://mirrors.kodi.tv/releases/source/"
-                                  version "-Jarvis.tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/xbmc/xbmc.git")
+                    (commit commit)))
+              (file-name (string-append name "-" version "-checkout"))
               (sha256
                (base32
-                "0iirspvv7czf785l2lqf232dvdaj87srbn9ni97ngvnd6w9yl884"))
+                "0rhb9rcz5h8mky8mx6idzybnpgjh2lxcjkh16z1x6fr4pis2jcbj"))
               (snippet
-               ;; Delete bundled ffmpeg.
-               ;; TODO: Delete every other bundled library.
                '(begin
                   (use-modules (guix build utils))
-                  (delete-file-recursively "tools/depends/target/ffmpeg")))
+                  (for-each delete-file-recursively
+                            '("project/BuildDependencies/bin/"
+                              ;; TODO: Purge these jars.
+                              ;;"tools/codegenerator/groovy"
+                              ;; And these sources:
+                              ;; "tools/depend/native/JsonSchemaBuilder"
+                              ;; "tools/depend/native/TexturePacker"
+                              ;; "lib/UnrarXlib"
+                              ;; "lib/gtest"
+                              ;; "lib/cpluff"
+                              ;; "lib/libexif"
+                              ;; "lib/libUPnP"
+                              "lib/libUPnP/Neptune/ThirdParty"
+                              "project/Win32BuildSetup/tools/7z"))
+                  #t))
               (modules '((guix build utils)))))
-    (build-system gnu-build-system)
+    (build-system cmake-build-system)
     (arguments
-     '(#:configure-flags '("--with-ffmpeg=shared") ; don't use bundled ffmpeg
+     '(#:modules ((srfi srfi-1)
+                  (guix build cmake-build-system)
+                  (guix build utils))
+       #:configure-flags
+       (list "-DENABLE_INTERNAL_FFMPEG=OFF"
+             "-DENABLE_INTERNAL_CROSSGUID=OFF"
+             (string-append "-Dlibdvdread_URL="
+                            (assoc-ref %build-inputs "libdvdread-bootstrapped"))
+             (string-append "-Dlibdvdnav_URL="
+                            (assoc-ref %build-inputs "libdvdnav-bootstrapped"))
+             (string-append "-Dlibdvdcss_URL="
+                            (assoc-ref %build-inputs "libdvdcss-bootstrapped"))
+             "-DENABLE_NONFREE=OFF")
        #:phases
        (modify-phases %standard-phases
-         ;; JsonSchemaBuilder is a small tool needed by the build system that
-         ;; comes bundled with the source.  The build system tries to build it
-         ;; during the bootstrapping phase, which causes serious issues
+         ;; The build system tries to bootstrap these bundled components
+         ;; during the regular build phase, which causes serious issues
          ;; because there's no time for shebangs to be patched.  So, we
          ;; bootstrap it on our own instead.
-         (add-after 'unpack 'bootstrap-jsonschemabuilder
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((dir "tools/depends/native/JsonSchemaBuilder/src"))
-               (with-directory-excursion dir
-                 (zero? (system* "sh" "autogen.sh"))))))
-         ;; Now we can do the regular bootstrapping process, but only after
-         ;; the first round of shebang patching.  We must repeat the patching
-         ;; after bootstrapping so that all of the files generated by the
-         ;; Autotools et al. are patched appropriately.
-         (add-after 'patch-source-shebangs 'bootstrap
-           (lambda* (#:key inputs #:allow-other-keys)
-             ;; We bootstrapped JsonSchemaBuilder in the previous phase, so we
-             ;; need to make sure it isn't done a second time.  Otherwise, it
-             ;; would undo the shebang patching that we worked so hard for.
-             (substitute* '("tools/depends/native/JsonSchemaBuilder/Makefile")
-               (("\\./autogen\\.sh") ""))
-             ;; This essentially does what their 'bootstrap' script does, but
-             ;; additionally passes the correct CONFIG_SHELL.
-             (let ((bash (string-append (assoc-ref inputs "bash") "/bin/sh")))
-               (define (run-make makefile)
-                 (zero? (system* "make" "-f" makefile
-                                 "BOOTSTRAP_STANDALONE=1"
-                                 (string-append "CONFIG_SHELL=" bash))))
-               (and (run-make "bootstrap.mk")
-                    (run-make "codegenerator.mk")))))
-         (add-after 'bootstrap 'patch-source-shebangs-again
-           (assoc-ref %standard-phases 'patch-source-shebangs))
-         ;; 3 tests fail that appear harmless, so we disable them.
-         (add-before 'check 'disable-some-tests
+         (add-after 'unpack 'bootstrap-bundled-software
+           (lambda _
+             (let ((dirs '("tools/depends/native/JsonSchemaBuilder/src"
+                           "lib/cpluff")))
+               (every (lambda (third-party)
+                        (with-directory-excursion third-party
+                          (zero? (system* "autoreconf" "-vif"))))
+                      dirs))))
+         (add-after 'bootstrap-bundled-software 'patch-stuff
            (lambda _
+             ;; Prevent the build scripts from calling autoreconf in the
+             ;; build stage.  Otherwise, it would undo the bootstrapping
+             ;; and shebang patching that we worked so hard for.
+             (substitute* "cmake/modules/FindCpluff.cmake"
+               (("autoreconf -vif") "true"))
+             (substitute* "lib/cpluff/po/Makefile.in.in"
+               (("/bin/sh") (which "sh")))
+             (substitute* "cmake/modules/FindLibDvd.cmake"
+               ;; The libdvd* sources that we bootstrapped separately are
+               ;; unpacked in the build phase. This is our best opportunity
+               ;; to make them writable before the build process starts.
+               (("autoreconf -vif") "chmod -R u+w ."))
+
+             ;; Let's disable some tests that are known not to work here.
+             ;; Doing this later while in the cmake "../build" directory
+             ;; is trickier.
              (substitute* '("xbmc/utils/test/TestSystemInfo.cpp")
                (("TEST_F\\(TestSystemInfo, GetOsPrettyNameWithVersion\\)")
                 "TEST_F(TestSystemInfo, DISABLED_GetOsPrettyNameWithVersion)")
                (("TEST_F\\(TestSystemInfo, GetOsName\\)")
                 "TEST_F(TestSystemInfo, DISABLED_GetOsName)")
                (("TEST_F\\(TestSystemInfo, GetOsVersion\\)")
-                "TEST_F(TestSystemInfo, DISABLED_GetOsVersion)")))))))
+                "TEST_F(TestSystemInfo, DISABLED_GetOsVersion)"))
+             ;; FIXME: Why are these failing.
+             (substitute* "xbmc/network/test/TestWebServer.cpp"
+               (("TEST_F\\(TestWebServer, Can")
+                "TEST_F(TestWebServer, DISABLED_Can"))
+             #t))
+         (add-before 'build 'set-build-environment
+           (lambda _
+             ;; Some bundled build scripts fall back to /bin/sh
+             ;; if this is not set.
+             (setenv "CONFIG_SHELL" (which "sh"))
+             #t))
+         (add-before 'check 'build-kodi-test
+           (lambda _
+             (zero? (system* "make" "kodi-test"))))
+         (add-after 'install 'wrap
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out"))
+                   (curl (string-append (assoc-ref inputs "curl") "/lib")))
+               (wrap-program (string-append out "/bin/kodi")
+                 `("LD_LIBRARY_PATH" suffix (,curl)))
+               #t))))))
     ;; TODO: Add dependencies for:
-    ;; - vdpau
     ;; - nfs
-    ;;
-    ;; FIXME: libusb detection fails.
-    ;;
-    ;; FIXME: As you can see, we use a lot of external libraries, but it seems
-    ;; that a few bundled ones are still being used.
+    ;; - cec
+    ;; - plist
+    ;; - shairplay
     (native-inputs
      `(("autoconf" ,autoconf)
        ("automake" ,automake)
-       ("cmake" ,cmake)
-       ("doxygen" ,doxygen)
-       ("gawk" ,gawk)
        ("gettext" ,gettext-minimal)
        ("icedtea" ,icedtea) ; needed at build-time only, mandatory
+       ("libdvdcss-bootstrapped" ,libdvdcss/kodi)
+       ("libdvdnav-bootstrapped" ,libdvdnav/kodi)
+       ("libdvdread-bootstrapped" ,libdvdread/kodi)
        ("libtool" ,libtool)
        ("pkg-config" ,pkg-config)
        ("swig" ,swig)
-       ("which" ,which)
        ("yasm" ,yasm)))
     (inputs
      `(("alsa-lib" ,alsa-lib)
        ("avahi" ,avahi)
        ("bluez" ,bluez)
-       ("boost" ,boost)
-       ("bzip2" ,bzip2)
        ("crossguid" ,crossguid)
        ("curl" ,curl)
        ("dcadec" ,dcadec)
        ("dbus" ,dbus)
-       ("enca" ,enca)
        ("eudev" ,eudev)
        ("ffmpeg" ,ffmpeg)
        ("flac" ,flac)
+       ("fmt" ,fmt)
        ("fontconfig" ,fontconfig)
        ("freetype" ,freetype)
        ("fribidi" ,fribidi)
+       ("giflib" ,giflib)
        ("glew" ,glew)
        ("gnutls" ,gnutls)
-       ("gperf" ,gperf)
-       ("jasper" ,jasper)
        ("lame" ,lame)
+       ("lcms" ,lcms)
        ("libass" ,libass)
        ("libbluray" ,libbluray)
        ("libcap" ,libcap)
        ("libcdio" ,libcdio)
+       ("libdrm" ,libdrm)
        ("libgcrypt" ,libgcrypt)
        ("libjpeg" ,libjpeg)
        ("libltdl" ,libltdl)
        ("libmad" ,libmad)
        ("libmicrohttpd" ,libmicrohttpd)
-       ("libmodplug" ,libmodplug)
        ("libmpeg2" ,libmpeg2)
        ("libogg" ,libogg)
        ("libpng" ,libpng)
-       ("libsamplerate" ,libsamplerate)
        ("libssh" ,libssh)
        ("libtiff" ,libtiff)
        ("libva" ,libva)
        ("libvorbis" ,libvorbis)
        ("libxml2" ,libxml2)
-       ("libxmu" ,libxmu)
        ("libxrandr" ,libxrandr)
        ("libxrender" ,libxrender)
        ("libxslt" ,libxslt)
-       ("libxt" ,libxt)
        ("libyajl" ,libyajl)
        ("lzo" ,lzo)
-       ("mesa-utils" ,mesa-utils)
        ("mysql" ,mysql)
        ("openssl" ,openssl)
        ("pcre" ,pcre)
        ("pulseaudio" ,pulseaudio)
        ("python" ,python-2)
        ("samba" ,samba)
-       ("sdl2" ,sdl2)
        ("sqlite" ,sqlite)
        ("taglib" ,taglib)
        ("tinyxml" ,tinyxml)
-       ("unzip" ,unzip)
        ("util-linux" ,util-linux)
        ("zip" ,zip)
        ("zlib" ,zlib)))
@@ -274,4 +424,11 @@ generator library for C++.")
 music, games, etc.  Kodi is highly customizable and features a theme and
 plug-in system.")
     (home-page "http://kodi.tv")
-    (license license:gpl2+)))
+    ;; XBMC is largely GPL2+, with some library components as LGPL2.1+, but
+    ;; there are some other licenses spread throughout.
+    (license (list license:gpl2+ license:lgpl2.1+
+                   license:gpl3+                  ;WiiRemote client
+                   license:expat                  ;cpluff, dbwrappers
+                   license:public-domain          ;cpluff/examples
+                   license:bsd-3                  ;misc, gtest
+                   license:bsd-2)))))             ;xbmc/freebsd
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 8f13a38b5f..ea7be23d74 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -2222,8 +2222,6 @@ in a digital read-out.")
 
        ;; Documentation.
        ("libxml2" ,libxml2)                       ;for $XML_CATALOG_FILES
-       ("libxslt" ,libxslt)
-       ("docbook-xml" ,docbook-xml)
        ("docbook-xsl" ,docbook-xsl)
        ("xmlto" ,xmlto)
        ("asciidoc" ,asciidoc)))
@@ -2801,7 +2799,6 @@ and copy/paste text in the console and in xterm.")
                      ("xmlto" ,xmlto)
                      ;; For building documentation.
                      ("libxml2" ,libxml2)
-                     ("docbook-xml" ,docbook-xml)
                      ("docbook-xsl" ,docbook-xsl)
                      ;; For tests.
                      ("which" ,which)))
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index f387204d06..369fb69d9b 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com>
 ;;; Copyright © 2016, 2017 <contact.ng0@cryptolab.net>
 ;;; Copyright © 2016 Clément Lassieur <clement@lassieur.org>
-;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2016, 2017 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
@@ -423,8 +423,7 @@ and corrections.  It is based on a Bayesian filter.")
                 "0i5dvygps1ai2qwgamab8kngrp0c5m3bgaw0jk34l8ypsk54wj8r"))))
     (build-system python-build-system)
     (native-inputs
-     `(("asciidoc" ,asciidoc)
-       ("libxslt" ,libxslt)))  ; for xsltproc
+     `(("asciidoc" ,asciidoc)))
     (inputs `(("python2-pysqlite" ,python2-pysqlite)
               ("python2-six" ,python2-six)))
     (arguments
@@ -2099,3 +2098,52 @@ indexed mbox files.  There are two programs: @code{bindex} and @code{bit}.
 are supported).  @code{bit} is a CGI/SSI program that generates web pages
 on the fly.  Both programs are written in C and are very fast.")
     (license license:expat)))
+
+(define-public swaks
+  (package
+    (name "swaks")
+    (version "20170101.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "http://jetmore.org/john/code/swaks/files/swaks-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "0pli4mlhasnqqxmmxalwyg3x7n2vhcbgsnp2xgddamjavv82vrl4"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-net-dns" ,perl-net-dns)
+       ("perl-net-ssleay" ,perl-net-ssleay)))
+    (arguments
+     `(#:tests? #f ; No tests
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (replace 'build
+           (lambda _
+             (zero? (system* "pod2man" "doc/ref.pod" "swaks.1"))))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (install-file "swaks" (string-append out "/bin"))
+               (install-file "swaks.1" (string-append out "/share/man/man1")))
+             #t))
+         (add-after 'install 'wrap-program
+           (lambda* (#:key outputs #:allow-other-keys)
+             (wrap-program (string-append (assoc-ref outputs "out")
+                                          "/bin/swaks")
+               `("PERL5LIB" ":" = (,(getenv "PERL5LIB"))))
+             #t)))))
+    (home-page "http://jetmore.org/john/code/swaks/")
+    (synopsis "Featureful SMTP test tool")
+    (description "Swaks is a flexible, scriptable, transaction-oriented SMTP
+test tool.  It handles SMTP features and extensions such as TLS,
+authentication, and pipelining; multiple versions of the SMTP protocol
+including SMTP, ESMTP, and LMTP; and multiple transport methods including
+unix-domain sockets, internet-domain sockets, and pipes to spawned processes.
+Options can be specified in environment variables, configuration files, and
+the command line allowing maximum configurability and ease of use for
+operators and scripters.")
+    (license gpl2+)))
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 7aa7b7bfe5..c32bffcb89 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -9,6 +9,8 @@
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2016, 2017 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017 Mekeor Melire <mekeor.melire@gmail.com>
+;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -201,16 +203,15 @@ dictionaries.  HexChat can be extended with multiple addons.")
 (define-public ngircd
   (package
     (name "ngircd")
-    (version "22")
+    (version "24")
     (source (origin
               (method url-fetch)
-              (uri (string-append "http://arthur.barton.de/pub/ngircd/ngircd-"
+              (uri (string-append "https://arthur.barton.de/pub/ngircd/ngircd-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "17k3g9qd9d010czk5846qxvzkmw4fihv8l6m2a2287crbxm3xhd4"))
-              (patches (search-patches "ngircd-no-dns-in-tests.patch"
-                                       "ngircd-handle-zombies.patch"))))
+                "020h9d1awyxqr0l42x1fhs47q7cmm17fdxzjish8p2kq23ma0gqp"))
+              (patches (search-patches "ngircd-handle-zombies.patch"))))
     (build-system gnu-build-system)
     ;; Needed for the test suite.
     (native-inputs `(("procps" ,procps)
@@ -234,34 +235,34 @@ dictionaries.  HexChat can be extended with multiple addons.")
                '("--with-pam")
                '()))
        #:phases
-       ;; Necessary for the test suite.
-       (alist-cons-after
-        'configure 'post-configure
-        (lambda _
-          (substitute* "src/ngircd/Makefile"
-            (("/bin/sh") (which "sh")))
-          ;; The default getpid.sh does a sloppy grep over 'ps -ax' output,
-          ;; which fails arbitrarily.
-          (with-output-to-file "src/testsuite/getpid.sh"
-            (lambda ()
-              (display
-               (string-append
-                "#!" (which "sh") "\n"
-                "ps -C \"$1\" -o pid=\n"))))
-          ;; Our variant of getpid.sh does not work for interpreter names if a
-          ;; shebang script is run directly as "./foo", so patch cases where
-          ;; the test suite relies on this.
-          (substitute* "src/testsuite/start-server.sh"
-            ;; It runs 'getpid.sh sh' to test if it works at all.  Run it on
-            ;; 'make' instead.
-            (("getpid.sh sh") "getpid.sh make")))
-        %standard-phases)))
-    (home-page "http://ngircd.barton.de/")
+       (modify-phases %standard-phases
+         ;; Necessary for the test suite.
+         (add-after 'configure 'post-configure
+           (lambda _
+             (substitute* "src/ngircd/Makefile"
+               (("/bin/sh") (which "sh")))
+             ;; The default getpid.sh does a sloppy grep over 'ps -ax' output,
+             ;; which fails arbitrarily.
+             (with-output-to-file "src/testsuite/getpid.sh"
+               (lambda ()
+                 (display
+                  (string-append
+                   "#!" (which "sh") "\n"
+                   "ps -C \"$1\" -o pid=\n"))))
+             ;; Our variant of getpid.sh does not match interpreter names
+             ;; when the script's shebang is invoked directly as "./foo".
+             ;; Patch cases where the test suite relies on this.
+             (substitute* "src/testsuite/start-server.sh"
+               ;; It runs 'getpid.sh sh' to test if it works at all.  Run it on
+               ;; 'make' instead.
+               (("getpid.sh sh") "getpid.sh make")))))))
+    (home-page "https://ngircd.barton.de/")
     (synopsis "Lightweight Internet Relay Chat server for small networks")
     (description
-     "ngIRCd is a lightweight Internet Relay Chat server for small or private
-networks.  It is easy to configure, can cope with dynamic IP addresses, and
-supports IPv6, SSL-protected connections as well as PAM for authentication.")
+     "ngIRCd is a lightweight @dfn{Internet Relay Chat} (IRC) server for small
+or private networks.  It is easy to configure, can cope with dynamic IP
+addresses, and supports IPv6, SSL-protected connections, as well as PAM for
+authentication.")
     (license license:gpl2+)))
 
 (define-public pidgin
@@ -398,12 +399,23 @@ compromised.")
                 "1jia6kq6bp8yxfj02d5vj9vqb4pylqcldspyjj6iz82kkka2a0ig"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:tests? #f ; tries to download GoogleTest with wget
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'unpack-googletest
+           (lambda* (#:key inputs #:allow-other-keys)
+             (zero? (system* "tar" "xf"
+                             (assoc-ref inputs "googletest-source"))))))
        #:configure-flags '("--enable-python"
                            "--enable-perl"
-                           "--enable-cyrus")))
+                           "--enable-cyrus"
+                           ,(string-append "--with-gtest="
+                                          "googletest-release-"
+                                          (package-version googletest)
+                                          "/googletest"))
+       #:test-target "test"))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
+     `(("googletest-source" ,(package-source googletest))
+       ("pkg-config" ,pkg-config)
        ("perl" ,perl)
        ("python" ,python)))
     (inputs
@@ -1329,4 +1341,36 @@ using ncurses and libmesode, inspired by Irssi.")
         (home-page "http://www.profanity.im")
         (license license:gpl3+)))
 
+(define-public libircclient
+  (package
+    (name "libircclient")
+    (version "1.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/libircclient/libircclient/"
+                           version "/libircclient-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0r60i76jh4drjh2jgp5sx71chagqllmkaq49zv67nrhqwvp9ghw1"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("openssl" ,openssl)))
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--libdir="
+                            (assoc-ref %outputs "out") "/lib")
+             "--enable-shared"
+             "--enable-ipv6"
+             "--enable-openssl")
+       ;; no test suite
+       #:tests? #f))
+    (home-page "https://www.ulduzsoft.com/libircclient/")
+    (synopsis "Library implementing the client IRC protocol")
+    (description "Libircclient is a library which implements the client IRC
+protocol.  It is designed to be small, fast, portable and compatible with the
+RFC standards as well as non-standard but popular features.  It can be used for
+building the IRC clients and bots.")
+    (license license:lgpl3+)))
+
 ;;; messaging.scm ends here
diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm
index b817f1cf27..db37814463 100644
--- a/gnu/packages/mpd.scm
+++ b/gnu/packages/mpd.scm
@@ -75,7 +75,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
 (define-public mpd
   (package
     (name "mpd")
-    (version "0.20.4")
+    (version "0.20.6")
     (source (origin
               (method url-fetch)
               (uri
@@ -84,7 +84,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                               "/mpd-" version ".tar.xz"))
               (sha256
                (base32
-                "0a4psqsf71vc6hfgyv55jclsx8yb7lf4w840qlq6cq8j3hsjaavi"))))
+                "0isbpa79m7zf09w3s1ry638cw96rxasy1ch66zl01k75i48mw1gl"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 5067ee8afa..416a3304ff 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2017 ng0 <contact.ng0@cryptolab.net>
+;;; Copyright © 2017 Rodger Fox <thylakoid@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2827,3 +2828,55 @@ collections and wantlists, inventory, and orders.")
 conversions between time and pulses, tempo map handling and more.  The only dependencies
 are a C compiler and glib.  Full API documentation and examples are included.")
     (license license:bsd-2)))
+
+(define-public lmms
+  (package
+    (name "lmms")
+    (version "1.1.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/LMMS/lmms/archive/v"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1g76z7ha3hd53vbqaq9n1qg6s3lw8zzaw51iny6y2bz0j1xqwcsr"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:tests? #f ; no tests
+       #:phases
+       (modify-phases %standard-phases
+         (add-before
+          'configure 'set-ldflags
+          (lambda* (#:key outputs #:allow-other-keys)
+            (setenv "LDFLAGS"
+                    (string-append
+                     "-Wl,-rpath=\""
+                     (assoc-ref outputs "out") "/lib/lmms"
+                     ":"
+                     (assoc-ref outputs "out") "/lib/lmms/ladspa"
+                     "\"")))))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("sdl" ,sdl)
+       ("qt" ,qt-4)
+       ("fltk" ,fltk)
+       ("libogg" ,libogg)
+       ("libsamplerate" ,libsamplerate)
+       ("fluidsynth" ,fluidsynth)
+       ("libvorbis" ,libvorbis)
+       ("alsa-lib" ,alsa-lib)
+       ("portaudio" ,portaudio)
+       ("ladspa" ,ladspa)
+       ("libsndfile1" ,libsndfile)
+       ("libxft" ,libxft)
+       ("freetype2" ,freetype)
+       ("fftw3f" ,fftwf)))
+    (home-page "https://lmms.io/")
+    (synopsis "Music composition tool")
+    (description "LMMS is a digital audio workstation.  It includes tools for sequencing
+melodies and beats and for mixing and arranging songs.  LMMS includes instruments based on
+audio samples and various soft sythesizers.  It can receive input from a MIDI keyboard.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/ntp.scm b/gnu/packages/ntp.scm
index 13781fbdad..00526f526f 100644
--- a/gnu/packages/ntp.scm
+++ b/gnu/packages/ntp.scm
@@ -39,7 +39,7 @@
 (define-public ntp
   (package
    (name "ntp")
-   (version "4.2.8p9")
+   (version "4.2.8p10")
    (source
      (origin
        (method url-fetch)
@@ -53,7 +53,7 @@
                     "/ntp-" version ".tar.gz")))
        (sha256
         (base32
-         "0whbyf82lrczbri4adbsa4hg1ppfa6c7qcj7nhjwdfp1g1vjh95p"))
+         "17xrk7gxrl3hgg0i73n8qm53knyh01lf0f3l1zx9x6r1cip3dlnx"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/ots.scm b/gnu/packages/ots.scm
index f1900746b6..73dd5e4832 100644
--- a/gnu/packages/ots.scm
+++ b/gnu/packages/ots.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Marek Benc <merkur32@gmail.com>
+;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -35,9 +36,13 @@
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://sourceforge/libots/libots/"
-                           name "-" version "/" name "-" version
-                           ".tar.gz"))
+       ;; libots seems to have left sourceforge and taken their release
+       ;; tarballs with them
+       (uri (list (string-append "mirror://debian/pool/main/o/ots/ots_"
+                                 version ".orig.tar.gz")
+                  (string-append "mirror://sourceforge/libots/libots/"
+                                 name "-" version "/" name "-" version
+                                 ".tar.gz")))
        (sha256
         (base32 "0dz1ccd7ymzk4swz1aly4im0k3pascnshmgg1whd2rk14li8v47a"))
        (patches (search-patches "ots-no-include-missing-file.patch"))))
@@ -48,17 +53,18 @@
      ;; before libots-1.la has been built.
      '(#:parallel-build? #f
 
-       #:phases (alist-cons-after
-                 'configure 'set-shared-lib-extension
-                 (lambda _
-                   ;; For some reason, the 'libtool' script (from Libtool
-                   ;; 1.5.2, Debian variant) sets 'shrext_cmds' instead of
-                   ;; 'shrext' for the shared library file name extension.
-                   ;; This leads to the creation of 'libots-1' instead of
-                   ;; 'libots-1.so'.  Fix that.
-                   (substitute* "libtool"
-                     (("shrext_cmds") "shrext")))
-                 %standard-phases)))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'configure 'set-shared-lib-extension
+           (lambda _
+             ;; For some reason, the 'libtool' script (from Libtool
+             ;; 1.5.2, Debian variant) sets 'shrext_cmds' instead of
+             ;; 'shrext' for the shared library file name extension.
+             ;; This leads to the creation of 'libots-1' instead of
+             ;; 'libots-1.so'.  Fix that.
+             (substitute* "libtool"
+               (("shrext_cmds") "shrext"))
+             #t)))))
     (inputs
       `(("glib" ,glib)
         ("popt" ,popt)
diff --git a/gnu/packages/patches/ngircd-no-dns-in-tests.patch b/gnu/packages/patches/ngircd-no-dns-in-tests.patch
deleted file mode 100644
index 748661de45..0000000000
--- a/gnu/packages/patches/ngircd-no-dns-in-tests.patch
+++ /dev/null
@@ -1,368 +0,0 @@
-From 3f807e104572b38143a1015be57d875088ceaebb Mon Sep 17 00:00:00 2001
-From: Alexander Barton <alex@barton.de>
-Date: Thu, 17 Apr 2014 23:57:38 +0200
-Subject: [PATCH] Test suite: Don't use DNS lookups
-
-Different operating systems do behave quite differently when doing DNS
-lookups, for example "127.0.0.1" sometimes resolves to "localhost" and
-sometimes to "localhost.localdomain" (for example OpenBSD). And other
-systems resolve "localhost" to the real host name (for example Cygwin).
-
-So not using DNS at all makes the test site much more portable.
----
- src/testsuite/channel-test.e        |  2 +-
- src/testsuite/check-idle.e          |  2 +-
- src/testsuite/connect-test.e        |  2 +-
- src/testsuite/invite-test.e         |  2 +-
- src/testsuite/join-test.e           |  2 +-
- src/testsuite/kick-test.e           |  2 +-
- src/testsuite/message-test.e        | 31 ++++++++++++-------------------
- src/testsuite/misc-test.e           |  8 ++++----
- src/testsuite/mode-test.e           |  2 +-
- src/testsuite/ngircd-test1.conf     |  1 +
- src/testsuite/ngircd-test2.conf     |  1 +
- src/testsuite/opless-channel-test.e |  2 +-
- src/testsuite/server-link-test.e    |  2 +-
- src/testsuite/stress-A.e            |  2 +-
- src/testsuite/who-test.e            |  6 +++---
- src/testsuite/whois-test.e          | 14 +++++++-------
- 16 files changed, 38 insertions(+), 43 deletions(-)
-
-diff --git a/src/testsuite/channel-test.e b/src/testsuite/channel-test.e
-index dd7eb66..39ad16a 100644
---- a/src/testsuite/channel-test.e
-+++ b/src/testsuite/channel-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # Channel test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/check-idle.e b/src/testsuite/check-idle.e
-index 41b8eb4..ad112b2 100644
---- a/src/testsuite/check-idle.e
-+++ b/src/testsuite/check-idle.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # Idle test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/connect-test.e b/src/testsuite/connect-test.e
-index 662f5f7..b51be0d 100644
---- a/src/testsuite/connect-test.e
-+++ b/src/testsuite/connect-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # Server connect test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/invite-test.e b/src/testsuite/invite-test.e
-index 3716d19..5179d8a 100644
---- a/src/testsuite/invite-test.e
-+++ b/src/testsuite/invite-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # INVITE test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/join-test.e b/src/testsuite/join-test.e
-index 28b4c54..c088f5c 100644
---- a/src/testsuite/join-test.e
-+++ b/src/testsuite/join-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # JOIN test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
-        timeout { exit 1 }
-        "Connected"
-diff --git a/src/testsuite/kick-test.e b/src/testsuite/kick-test.e
-index 3d3c1ee..89da611 100644
---- a/src/testsuite/kick-test.e
-+++ b/src/testsuite/kick-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # KICK test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
-        timeout { exit 1 }
-        "Connected"
-diff --git a/src/testsuite/message-test.e b/src/testsuite/message-test.e
-index 0e70640..5dc325d 100644
---- a/src/testsuite/message-test.e
-+++ b/src/testsuite/message-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # PRIVMSG and NOTICE test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-@@ -72,24 +72,17 @@ expect {
- 	"MODE nick :-b"
- }
- 
--# The following two tests using "localhost" as host name
--# had to be disabled, because there are operating systems
--# out there, that use "localhost.<domain>" as host name
--# for 127.0.0.1 instead of just "localhost".
--# (for example OpenBSD 4, OpenSolaris, ...)
--#
--#send "privmsg ~user\%localhost :test\r"
--#expect {
--#	timeout { exit 1 }
--#	"@* PRIVMSG nick :test"
--#}
--#
--#send "privmsg Nick!~User@LocalHost :test\r"
--#expect {
--#	timeout { exit 1 }
--#	"@* PRIVMSG nick :test"
--#	"401"
--#}
-+send "privmsg ~user\%127.0.0.1 :test\r"
-+expect {
-+	timeout { exit 1 }
-+	"@* PRIVMSG nick :test"
-+}
-+
-+send "privmsg Nick!~User@127.0.0.1 :test\r"
-+expect {
-+	timeout { exit 1 }
-+	"@* PRIVMSG nick :test"
-+}
- 
- send "away :away\r"
- expect {
-diff --git a/src/testsuite/misc-test.e b/src/testsuite/misc-test.e
-index a83bc5b..f69e7c3 100644
---- a/src/testsuite/misc-test.e
-+++ b/src/testsuite/misc-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # Misc test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-@@ -130,7 +130,7 @@ expect {
- send "userhost nick\r"
- expect {
- 	timeout { exit 1 }
--	-re ":ngircd.test.server 302 nick :?nick=+.*@(localhos.*|127.0.0.1)"
-+	-re ":ngircd.test.server 302 nick :?nick=+.*@127.0.0.1"
- }
- 
- send "userhost doesnotexist\r"
-@@ -142,7 +142,7 @@ expect {
- send "userhost nick doesnotexist nick doesnotexist\r"
- expect {
- 	timeout { exit 1 }
--	-re ":ngircd.test.server 302 nick :nick=+.*@(localhos.*|127.0.0.1) nick=+.*@(localhos.*|127.0.0.1)"
-+	-re ":ngircd.test.server 302 nick :nick=+.*@127.0.0.1 nick=+.*@127.0.0.1"
- }
- 
- send "away :testing\r"
-@@ -154,7 +154,7 @@ expect {
- send "userhost nick nick nick nick nick nick\r"
- expect {
- 	timeout { exit 1 }
--	-re ":ngircd.test.server 302 nick :nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1) nick=-.*@(localhos.*|127.0.0.1)\r"
-+	-re ":ngircd.test.server 302 nick :nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1 nick=-.*@127.0.0.1\r"
- }
- 
- send "quit\r"
-diff --git a/src/testsuite/mode-test.e b/src/testsuite/mode-test.e
-index d6726a4..86e4f2d 100644
---- a/src/testsuite/mode-test.e
-+++ b/src/testsuite/mode-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # MODE test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/ngircd-test1.conf b/src/testsuite/ngircd-test1.conf
-index 0d0cccc..4dec533 100644
---- a/src/testsuite/ngircd-test1.conf
-+++ b/src/testsuite/ngircd-test1.conf
-@@ -17,6 +17,7 @@
- 	OperCanUseMode = yes
- 	Ident = no
- 	IncludeDir = /var/empty
-+	DNS = no
- 	PAM = no
- 
- [Operator]
-diff --git a/src/testsuite/ngircd-test2.conf b/src/testsuite/ngircd-test2.conf
-index c9d7f6c..0d24c4a 100644
---- a/src/testsuite/ngircd-test2.conf
-+++ b/src/testsuite/ngircd-test2.conf
-@@ -17,6 +17,7 @@
- 	OperCanUseMode = yes
- 	Ident = no
- 	IncludeDir = /var/empty
-+	DNS = no
- 	PAM = no
- 
- [Operator]
-diff --git a/src/testsuite/opless-channel-test.e b/src/testsuite/opless-channel-test.e
-index 7d94172..4611fe1 100644
---- a/src/testsuite/opless-channel-test.e
-+++ b/src/testsuite/opless-channel-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # Op-less channel test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
-        timeout { exit 1 }
-        "Connected"
-diff --git a/src/testsuite/server-link-test.e b/src/testsuite/server-link-test.e
-index cf3fae8..910f8c8 100644
---- a/src/testsuite/server-link-test.e
-+++ b/src/testsuite/server-link-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # server-server link test
- 
--spawn telnet localhost 6790
-+spawn telnet 127.0.0.1 6790
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/stress-A.e b/src/testsuite/stress-A.e
-index 256d5d1..d51adaa 100644
---- a/src/testsuite/stress-A.e
-+++ b/src/testsuite/stress-A.e
-@@ -3,7 +3,7 @@
- 
- set timeout 30
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-diff --git a/src/testsuite/who-test.e b/src/testsuite/who-test.e
-index a41e6b6..39d50ed 100644
---- a/src/testsuite/who-test.e
-+++ b/src/testsuite/who-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # WHO test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-@@ -62,7 +62,7 @@ expect {
- 	":ngircd.test.server 352 nick #channel * * ngircd.test.server nick G@ :0 Real Name"
- }
- 
--send "who localhos*\r"
-+send "who 127.0.0.*\r"
- expect {
- 	timeout { exit 1 }
- 	":ngircd.test.server 352 nick \* * * ngircd.test.server nick G :0 Real Name"
-@@ -120,7 +120,7 @@ expect {
- 	"305 nick"
- }
- 
--send "who ??cal*ho*\r"
-+send "who ??7.*0*\r"
- expect {
- 	timeout { exit 1 }
- 	":ngircd.test.server 352 nick \* * * ngircd.test.server nick H* :0 Real Name"
-diff --git a/src/testsuite/whois-test.e b/src/testsuite/whois-test.e
-index 16b1184..44eee66 100644
---- a/src/testsuite/whois-test.e
-+++ b/src/testsuite/whois-test.e
-@@ -1,7 +1,7 @@
- # ngIRCd test suite
- # WHOIS test
- 
--spawn telnet localhost 6789
-+spawn telnet 127.0.0.1 6789
- expect {
- 	timeout { exit 1 }
- 	"Connected"
-@@ -17,7 +17,7 @@ expect {
- send "whois nick\r"
- expect {
- 	timeout { exit 1 }
--	"311 nick nick ~user localhost* \* :Real Name\r"
-+	"311 nick nick ~user 127.0.0.1 \* :Real Name\r"
- }
- expect {
- 	timeout { exit 1 }
-@@ -27,25 +27,25 @@ expect {
- send "whois *\r"
- expect {
- 	timeout { exit 1 }
--	"311 nick nick ~user localhost* \* :Real Name\r"
-+	"311 nick nick ~user 127.0.0.1* \* :Real Name\r"
- }
- 
- send "whois n*\r"
- expect {
- 	timeout { exit 1 }
--	"311 nick nick ~user localhost* \* :Real Name\r"
-+	"311 nick nick ~user 127.0.0.1* \* :Real Name\r"
- }
- 
- send "whois ?ick\r"
- expect {
- 	timeout { exit 1 }
--	"311 nick nick ~user localhost* \* :Real Name\r"
-+	"311 nick nick ~user 127.0.0.1* \* :Real Name\r"
- }
- 
- send "whois ????,n?*k\r"
- expect {
- 	timeout { exit 1 }
--	"311 nick nick ~user localhost* \* :Real Name\r"
-+	"311 nick nick ~user 127.0.0.1* \* :Real Name\r"
- }
- 
- send "whois unknown\r"
-@@ -61,7 +61,7 @@ expect {
- send "whois ngircd.test.server2 nick\r"
- expect {
- 	timeout { exit 1 }
--	":ngircd.test.server2 311 nick nick ~user localhost* \* :Real Name\r"
-+	":ngircd.test.server2 311 nick nick ~user 127.0.0.1* \* :Real Name\r"
- }
- 
- send "whois nosuchserver unknown\r"
--- 
-1.9.1
-
diff --git a/gnu/packages/patches/vim-CVE-2017-5953.patch b/gnu/packages/patches/vim-CVE-2017-5953.patch
deleted file mode 100644
index 070f98c2cb..0000000000
--- a/gnu/packages/patches/vim-CVE-2017-5953.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-Fix CVE-2017-5953:
-
-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5953
-https://groups.google.com/forum/#!topic/vim_dev/t-3RSdEnrHY
-
-This change is adapted from the upstream source repository:
-
-https://github.com/vim/vim/commit/6d3c8586fc81b022e9f06c611b9926108fb878c7
-
-diff --git a/src/spellfile.c b/src/spellfile.c
-index c7d87c6..00ef019 100644
---- a/src/spellfile.c
-+++ b/src/spellfile.c
-@@ -1585,7 +1585,7 @@ spell_read_tree(
-     int		prefixtree,	/* TRUE for the prefix tree */
-     int		prefixcnt)	/* when "prefixtree" is TRUE: prefix count */
- {
--    int		len;
-+    long	len;
-     int		idx;
-     char_u	*bp;
-     idx_T	*ip;
-@@ -1595,6 +1595,9 @@ spell_read_tree(
-     len = get4c(fd);
-     if (len < 0)
- 	return SP_TRUNCERROR;
-+    if (len >= LONG_MAX / (long)sizeof(int))
-+	/* Invalid length, multiply with sizeof(int) would overflow. */
-+	return SP_FORMERROR;
-     if (len > 0)
-     {
- 	/* Allocate the byte array. */
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 840e0b763e..086e1fae03 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2017 Raoul J.P. Bonnal <ilpuccio.febo@gmail.com>
 ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2017 humanitiesNerd <catonano@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1369,6 +1370,26 @@ contained in Appendix A of FIPS Publication 181, \"Standard for Automated
 Password Generator\".")
     (license (package-license perl))))
 
+(define-public perl-crypt-rc4
+  (package
+    (name "perl-crypt-rc4")
+    (version "2.02")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/S/SI/SIFUKURT/Crypt-RC4-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1sp099cws0q225h6j4y68hmfd1lnv5877gihjs40f8n2ddf45i2y"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/Crypt-RC4")
+    (synopsis "Perl implementation of the RC4 encryption algorithm")
+    (description "A pure Perl implementation of the RC4 algorithm.")
+    (license (package-license perl))))
+
 (define-public perl-cwd-guard
   (package
     (name "perl-cwd-guard")
@@ -5157,6 +5178,29 @@ inherit from in order to allow your objects to generate unique cryptographic
 signatures.")
     (license (package-license perl))))
 
+(define-public perl-ole-storage-lite
+  (package
+    (name "perl-ole-storage-lite")
+    (version "0.19")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/J/JM/JMCNAMARA/OLE-Storage_Lite-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "179cxwqxb0f9dpx8954nvwjmggxxi5ndnang41yav1dx6mf0abp7"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/OLE-Storage_Lite")
+    (synopsis "Read and write OLE storage files")
+    (description "This module allows you to read and write
+an OLE-Structured file.  @dfn{OLE} (Object Linking and Embedding) is a
+technology to store hierarchical information such as links to other
+documents within a single file.")
+    (license (package-license perl))))
+
 (define-public perl-package-anon
   (package
     (name "perl-package-anon")
diff --git a/gnu/packages/pretty-print.scm b/gnu/packages/pretty-print.scm
index 8819b8adaf..3af7777304 100644
--- a/gnu/packages/pretty-print.scm
+++ b/gnu/packages/pretty-print.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,6 +23,7 @@
   #:use-module (guix packages)
   #:use-module (guix licenses)
   #:use-module (guix download)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
   #:use-module (gnu packages ghostscript)
@@ -34,7 +36,8 @@
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages perl)
-  #:use-module (gnu packages pkg-config))
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages zip))
 
 (define-public a2ps
   (package
@@ -147,6 +150,30 @@ It also includes the capability to perform syntax highlighting for several
 different programming languages.")
     (license gpl3+)))
 
+(define-public fmt
+  (package
+    (name "fmt")
+    (version "3.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/fmtlib/fmt/releases/download/"
+                    version "/fmt-" version ".zip"))
+              (sha256
+               (base32
+                "0l4514mk83cjimynci3ghrfdchjy8cya1qa45c1fg2lsj7fg16jc"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (home-page "http://fmtlib.net/latest/")
+    (synopsis "Small and fast C++ formatting library")
+    (description
+     "@code{fmt} (formerly @code{cppformat}) is a formatting library for C++.
+It can be used as a safe alternative to @code{printf} or as a fast alternative
+to @code{IOStreams}.")
+    ;; The library is bsd-2, but documentation and tests include other licenses.
+    (license (list bsd-2 bsd-3 psfl))))
+
 (define-public source-highlight
   (package
     (name "source-highlight")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 1903247d77..ea1d691c18 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -1749,14 +1749,14 @@ standard library.")
 (define-public python-py
   (package
     (name "python-py")
-    (version "1.4.31")
+    (version "1.4.32")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "py" version))
        (sha256
         (base32
-         "0561gz2w3i825gyl42mcq14y3dcgkapfiv5zv9a2bz15qxiijl56"))))
+         "19s1pql9pq85h1qzsdwgyb8a3k1qgkvh33b02m8kfqhizz8rzf64"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: "ImportError: 'test' module incorrectly imported from
@@ -3144,14 +3144,14 @@ augment the changelog, but it can be used for other documents, too.")
 (define-public python-feedgenerator
   (package
     (name "python-feedgenerator")
-    (version "1.8")
+    (version "1.9")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "feedgenerator" version))
        (sha256
         (base32
-         "0mkimp1fpdan4p3882vzcws4l594k71ich4g0wq97jbra7p602n0"))
+         "01mirwkm7xfx539hmvj7g9da1j51gw5lsx74dr0glizskjm5vq2s"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -5873,6 +5873,9 @@ of the structure, dynamics, and functions of complex networks.")
     (arguments
      ;; TODO: Package missing test dependencies.
      '(#:tests? #f))
+    (propagated-inputs
+     `(("python-wrapt" ,python-wrapt)
+       ("python-requests" ,python-requests)))
     (home-page "https://bitbucket.org/snakemake/snakemake/wiki/Home")
     (synopsis "Python-based execution environment for make-like workflows")
     (description
@@ -6491,14 +6494,14 @@ Python.")
 (define-public python-markdown
   (package
     (name "python-markdown")
-    (version "2.6.7")
+    (version "2.6.8")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Markdown" version))
        (sha256
         (base32
-         "1h055llfd0ps0ig7qb3v1j9068xv90dc9s7xkhkgz9zg8r4g5sys"))))
+         "0cqfhr1km2s5d8jm6hbwgkrrj9hvkjf2gab3s2axlrw1clgaij0a"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -6858,17 +6861,14 @@ and MAC network addresses.")
 (define-public python-wrapt
   (package
     (name "python-wrapt")
-    (version "1.10.5")
+    (version "1.10.8")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-               "https://pypi.python.org/packages/source/w/wrapt/wrapt-"
-               version
-               ".tar.gz"))
+        (uri (pypi-uri "wrapt" version))
         (sha256
           (base32
-            "0cq8rlpzkxzk48b50yrfhzn1d1hrq4gjcdqlrgq4v5palgiv9jwr"))))
+            "0wrcm1mydvfivbkzz0h81ygzdchnscshi6xvy5n3r21r9s0px8af"))))
     (build-system python-build-system)
     (arguments
      ;; Tests are not included in the tarball, they are only available in the
@@ -8247,15 +8247,14 @@ security policies on Python objects.")
 (define-public python-zope-component
   (package
     (name "python-zope-component")
-    (version "4.2.2")
+    (version "4.3.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/z"
-                           "/zope.component/zope.component-" version ".tar.gz"))
+       (uri (pypi-uri "zope.component" version))
        (sha256
         (base32
-         "06pqr8m5jv12xjyy5b59hh9anl61cxkzhw9mka33r3nxalmi2b18"))))
+         "1hlvzwj1kcfz1qms1dzhwsshpsf38z9clmyksb1gh41n8k3kchdv"))))
     (build-system python-build-system)
     (arguments
      ;; Skip tests due to circular dependency with python-zope-security.
@@ -8497,14 +8496,14 @@ the standard library.")
 (define-public python-texttable
   (package
     (name "python-texttable")
-    (version "0.8.4")
+    (version "0.8.7")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "texttable" version))
        (sha256
         (base32
-         "0bkhs4dx9s6g7fpb969hygq56hyz4ncfamlynw72s0n6nqfbd1w5"))))
+         "1liiiydgkg37i46a418aw19fyf6z3ds51wdwwpyjbs12x0phhf4a"))))
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; no tests
     (home-page "https://github.com/foutaise/texttable/")
@@ -8542,13 +8541,13 @@ WebSocket usage in Python programs.")
 (define-public python-atomicwrites
   (package
     (name "python-atomicwrites")
-    (version "1.1.0")
+    (version "1.1.5")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "atomicwrites" version))
              (sha256
               (base32
-               "1s01dci8arsl9d9vr5nz1fk9znldp1z3l4yl43f0c27z12b8yxl0"))))
+               "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214"))))
     (build-system python-build-system)
     (synopsis "Atomic file writes in Python")
     (description "Library for atomic file writes using platform dependent tools
@@ -10053,14 +10052,14 @@ introspection of @code{zope.interface} instances in code.")
 (define-public python-psycopg2
   (package
     (name "python-psycopg2")
-    (version "2.6.1")
+    (version "2.6.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "psycopg2" version))
        (sha256
         (base32
-         "0k4hshvrwsh8yagydyxgmd0pjm29lwdxkngcq9fzfzkmpsxrmkva"))))
+         "0p60z2gwfcal30y2w8gprflchp1kcg9qblc5rn782p4wxl90wjbh"))))
     (build-system python-build-system)
     (arguments
      ;; Tests would require a postgresql database "psycopg2_test"
@@ -11163,17 +11162,14 @@ are optionally backed by a C extension built on librdkafka.")
 (define-public python-wcwidth
  (package
   (name "python-wcwidth")
-  (version "0.1.6")
+  (version "0.1.7")
   (source
     (origin
       (method url-fetch)
-      (uri (string-append
-             "https://pypi.python.org/packages/"
-             "c2/d1/7689293086a8d5320025080cde0e3155b94ae0a7496fb89a3fbaa92c354a/"
-             "wcwidth-" version ".tar.gz"))
+      (uri (pypi-uri "wcwidth" version))
       (sha256
         (base32
-          "02wjrpf001gjdjsaxxbzcwfg19crlk2dbddayrfc2v06f53yrcyw"))))
+          "0pn6dflzm609m4r3i8ik5ni9ijjbb5fa3vg1n7hn6vkd49r77wrx"))))
   (build-system python-build-system)
   (home-page "https://github.com/jquast/wcwidth")
   (synopsis "Measure number of terminal column cells of wide-character codes")
@@ -12542,13 +12538,13 @@ English stemmer.")
 (define-public python-sphinx-cloud-sptheme
   (package
     (name "python-sphinx-cloud-sptheme")
-    (version "1.7.1")
+    (version "1.8.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "cloud_sptheme" version))
               (sha256
                (base32
-                "0zm9ap4p5dzln8f1m2immadaxv2xpg8jg4w53y52rhfl7pdb58vy"))))
+                "1dniqb6a39yh786f86c4jn666rwnyi1jvzn4616zhcchb7sfdshd"))))
     (build-system python-build-system)
     ;; FIXME: The 'pypi' release archive does not contain tests.
     (arguments '(#:tests? #f))
@@ -13671,3 +13667,212 @@ users' sessions over extended periods of time.")
 
 (define-public python2-flask-login
   (package-with-python2 python-flask-login))
+
+(define-public python-astroid
+  (package
+    (name "python-astroid")
+    (version "1.4.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/PyCQA/astroid/archive/astroid-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "0j0wgy54d13a470vm4b9rdjk99n1hmdxpf34x9k3pbmi9w9b566z"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-lazy-object-proxy" ,python-lazy-object-proxy)
+       ("python-six" ,python-six)
+       ("python-wrapt" ,python-wrapt)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+                  (lambda _
+                    (zero? (system* "python" "-m" "unittest" "discover"
+                                    "-p" "unittest*.py")))))))
+    (home-page "https://github.com/PyCQA/astroid")
+    (synopsis "Common base representation of python source code for pylint and
+other projects")
+    (description "@code{python-astroid} provides a common base representation
+of python source code for projects such as pychecker, pyreverse, pylint, etc.
+
+It provides a compatible representation which comes from the _ast module.  It
+rebuilds the tree generated by the builtin _ast module by recursively walking
+down the AST and building an extended ast.  The new node classes have
+additional methods and attributes for different usages.  They include some
+support for static inference and local name scopes.  Furthermore, astroid
+builds partial trees by inspecting living objects.")
+   (license license:lgpl2.1+)))
+
+(define-public python2-astroid
+  (package-with-python2 python-astroid))
+
+(define-public python-isort
+  (package
+    (name "python-isort")
+    (version "4.2.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/timothycrosley/isort/archive/"
+             version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0zsrgkb0krn5476yncy5dd56k7dk34zqb4bnlvwy44ixgilyjmfh"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/timothycrosley/isort")
+    (synopsis "Python utility/library to sort python imports")
+    (description "@code{python-isort} is a python utility/library to sort
+imports alphabetically, and automatically separated into sections.  It
+provides a command line utility, a python library and plugins for various
+editors.")
+    (license license:expat)))
+
+(define-public python2-isort
+  (package-with-python2 python-isort))
+
+(define-public python2-backports-functools-lru-cache
+  (package
+    (name "python2-backports-functools-lru-cache")
+    (version "1.3")
+    (source
+     (origin
+       (method url-fetch)
+       ;; only the pypi tarballs contain the necessary metadata
+       (uri (pypi-uri "backports.functools_lru_cache" version))
+       (sha256
+        (base32
+         "158ysf2hb0q4p4695abfiym9x1ywg0dgh8a3apd7gqaaxjy22jj4"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python2-setuptools-scm" ,python2-setuptools-scm)))
+    (arguments
+     `(#:python ,python-2))
+    (home-page "https://github.com/jaraco/backports.functools_lru_cache")
+    (synopsis "Backport of functools.lru_cache from Python 3.3")
+    (description "@code{python2-backports-functools-lru-cache} is a backport
+of @code{functools.lru_cache} from python 3.3.")
+    (license license:expat)))
+
+(define-public python-configparser
+  (package
+    (name "python-configparser")
+    (version "3.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://bitbucket.org/ambv/configparser/get/"
+             version ".tar.bz2"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0waq40as14abwzbb321hfz4vr1fi363nscy32ga14qvfygrg96wa"))))
+    (build-system python-build-system)
+    (home-page "http://docs.python.org/py3k/library/configparser.html")
+    (synopsis "Backport of configparser from python 3.5")
+    (description "@code{python-configparser} is a backport of
+@code{configparser} from Python 3.5 so that it can be used directly
+in other versions.")
+    (license license:expat)))
+
+(define-public python2-configparser
+  (package-with-python2 python-configparser))
+
+(define-public python2-coverage-test-runner
+  (package
+    (name "python2-coverage-test-runner")
+    (version "1.11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "http://git.liw.fi/cgi-bin/cgit/cgit.cgi/"
+             "coverage-test-runner/snapshot/coverage-test-runner-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "0y1m7z3dl63kmhcmydl1mwg0hacnf6ghrx9dah17j9iasssfa3g7"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "./testrun")))))))
+    (propagated-inputs
+     `(("python2-coverage" ,python2-coverage)))
+    (home-page "https://liw.fi/coverage-test-runner/")
+    (synopsis "Python module for running unit tests")
+    (description "@code{CoverageTestRunner} is a python module for running
+unit tests and failing them if the unit test module does not excercise all
+statements in the module it tests.")
+    (license license:gpl3+)))
+
+(define-public python-pylint
+  (package
+    (name "python-pylint")
+    (version "1.6.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/PyCQA/pylint/archive/pylint-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "08pmgflmq2zrzrn9nkfadzwa5vybz46wvwxhrsd2mjlcgsh4rzbm"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-tox" ,python-tox)))
+    (propagated-inputs
+     `(("python-astroid" ,python-astroid)
+       ("python-isort" ,python-isort)
+       ("python-mccabe" ,python-mccabe)
+       ("python-six" ,python-six)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+                  (lambda _
+                    ;; Somehow, tests for python2-pylint
+                    ;; fail if run from the build directory
+                    (let ((work "/tmp/work"))
+                      (mkdir-p work)
+                      (setenv "PYTHONPATH"
+                              (string-append (getenv "PYTHONPATH") ":" work))
+                      (copy-recursively "." work)
+                      (with-directory-excursion "/tmp"
+                        (zero? (system* "python" "-m" "unittest" "discover"
+                                        "-s" (string-append work "/pylint/test")
+                                        "-p" "*test_*.py")))))))))
+    (home-page "https://github.com/PyCQA/pylint")
+    (synopsis "Python source code analyzer which looks for coding standard
+errors")
+    (description "Pylint is a Python source code analyzer which looks
+for programming errors, helps enforcing a coding standard and sniffs
+for some code smells (as defined in Martin Fowler's Refactoring book).
+
+Pylint has many rules enabled by default, way too much to silence them
+all on a minimally sized program.  It's highly configurable and handle
+pragmas to control it from within your code.  Additionally, it is
+possible to write plugins to add your own checks.")
+    (license license:gpl2+)))
+
+(define-public python2-pylint
+  (let ((pylint (package-with-python2 python-pylint)))
+    (package (inherit pylint)
+             (propagated-inputs
+              `(("python2-backports-functools-lru-cache"
+                 ,python2-backports-functools-lru-cache)
+                ("python2-configparser" ,python2-configparser)
+                ,@(package-propagated-inputs pylint))))))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 47a7caae48..fb242a01da 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -568,6 +568,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                #t)))
             (add-before 'check 'set-display
               (lambda _
+                ;; make Qt render "offscreen", required for tests
                 (setenv "QT_QPA_PLATFORM" "offscreen")
                 #t)))))))
 
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index 068e870f93..5501dd722c 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -120,7 +120,7 @@ a server that supports the SSH-2 protocol.")
 (define-public openssh
   (package
    (name "openssh")
-   (version "7.4p1")
+   (version "7.5p1")
    (source (origin
             (method url-fetch)
             (uri (let ((tail (string-append name "-" version ".tar.gz")))
@@ -131,7 +131,7 @@ a server that supports the SSH-2 protocol.")
                          (string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
                                         tail))))
             (sha256 (base32
-                     "1l8r3x4fr2kb6xm95s7kjdif1wp6f94d4kljh4qjj9109shw87qv"))))
+                     "1w7rb5gbrikxdkp8w7zxnci4549gk4bw1lml01s59w5rzb2y6ilq"))))
    (build-system gnu-build-system)
    (inputs `(("groff" ,groff)
              ("openssl" ,openssl)
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index d0bed4dd7f..a90ac2f427 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -5151,3 +5151,38 @@ genome-wide association studies can be analyzed efficiently.")
     (description
      "This package provides a pure R implementation of the t-SNE algorithm.")
     (license license:gpl2+)))
+
+(define-public r-cairo
+  (package
+    (name "r-cairo")
+    (version "1.5-9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "Cairo" version))
+       (sha256
+        (base32
+         "1x1q99r3r978rlkkm5gixkv03p0mcr6k7ydcqdmisrwnmrn7p1ia"))))
+    (properties `((upstream-name . "Cairo")))
+    (build-system r-build-system)
+    (inputs
+     `(("cairo" ,cairo)
+       ("libxt" ,libxt)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://www.rforge.net/Cairo/")
+    (synopsis "R graphics device using Cairo graphics library")
+    (description
+     "This package provides a Cairo graphics device that can be use to
+create high-quality vector (PDF, PostScript and SVG) and bitmap
+output (PNG,JPEG,TIFF), and high-quality rendering in displays (X11
+and Win32).  Since it uses the same back-end for all output, copying
+across formats is WYSIWYG.  Files are created without the dependence
+on X11 or other external programs.  This device supports alpha
+channel (semi-transparent drawing) and resulting images can contain
+transparent and semi-transparent regions.  It is ideal for use in
+server environments (file output) and as a replacement for other
+devices that don't have Cairo's capabilities such as alpha support or
+anti-aliasing.  Backends are modular such that any subset of backends
+is supported.")
+    (license license:gpl2)))
diff --git a/gnu/packages/text-editors.scm b/gnu/packages/text-editors.scm
index 4b6aa07ee8..a093baa3bd 100644
--- a/gnu/packages/text-editors.scm
+++ b/gnu/packages/text-editors.scm
@@ -137,7 +137,6 @@ based command language.")
                ;; without them the tests fail.
                (zero? (system* "chmod" "-R" "u+w" "../test")))))))
       (native-inputs `(("gcc" ,gcc-5)
-                       ("libxslt" ,libxslt)
                        ("asciidoc" ,asciidoc)
                        ("ruby" ,ruby)))
       (inputs `(("gcc:lib" ,gcc-5 "lib")
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index aee424fbc9..71e499085f 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -112,14 +112,14 @@ as well as the classic centralized workflow.")
 (define-public git
   (package
    (name "git")
-   (version "2.12.0")
+   (version "2.12.1")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://kernel.org/software/scm/git/git-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "09r0lcjj5v2apj39f0ziqzjq2bi1jpnhszc9q4n0ab86g5j7c88q"))))
+              "18mdlg4ws78s4asfrn6licm9v6qw4wp9m0kdjq0y2r5pci1nf4fv"))))
    (build-system gnu-build-system)
    (native-inputs
     `(("native-perl" ,perl)
@@ -132,7 +132,7 @@ as well as the classic centralized workflow.")
                 version ".tar.xz"))
           (sha256
            (base32
-            "0ws7h04ijqr2l0pp9qbds65v9cd70v0qfpnhqncn9zqfspw5d0wb"))))))
+            "1km0sbrqgni0q88abh4zb1m7xa9ld3d4qi36095b11a3vr6w7xgv"))))))
    (inputs
     `(("curl" ,curl)
       ("expat" ,expat)
@@ -451,11 +451,7 @@ to lock down your entire repository.")
                     #t)))))))
     (native-inputs
      ;; For building manpage.
-     `(("asciidoc" ,asciidoc)
-       ("docbook-xml" ,docbook-xml)
-       ("docbook-xsl" ,docbook-xsl)
-       ("xmllint" ,libxml2)
-       ("xsltprot" ,libxslt)))
+     `(("asciidoc" ,asciidoc)))
     (inputs
      `(("git:src" ,(package-source git@2.9))
        ("openssl" ,openssl)
@@ -857,10 +853,6 @@ RCS, PRCS, and Aegis packages.")
        (list "CC=gcc" (string-append "prefix?=" (assoc-ref %outputs "out")))))
     (inputs `(("git" ,git)))
     (native-inputs `(("asciidoc"    ,asciidoc)
-                     ("docbook-xml" ,docbook-xml)
-                     ("docbook-xsl" ,docbook-xsl)
-                     ("xmllint"     ,libxml2)
-                     ("xsltproc"    ,libxslt)
                      ;; These are needed for the tests.
                      ("cvs"    ,cvs)
                      ("python" ,python-2)
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 0d2803dd64..cf54bbf9a4 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -1311,7 +1311,7 @@ capabilities.")
 (define-public vapoursynth
   (package
     (name "vapoursynth")
-    (version "35")
+    (version "37")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1320,7 +1320,7 @@ capabilities.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0629ys2lf618n9cc644xlvx0vx52v2fp3sx14p4mx5rg9nlasb3n"))))
+                "1g3hc079jw4mz1cmkv2y28pdb556wqc8ql7iravgh1rg8j3f1zi5"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("autoconf" ,autoconf)
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 82403feb1d..3dbd6d952b 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 ng0 <contact.ng0@cryptolab.net>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,6 +23,7 @@
 (define-module (gnu packages vim)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system cmake)
@@ -58,16 +60,15 @@
 (define-public vim
   (package
     (name "vim")
-    (version "8.0.0300")
+    (version "8.0.0494")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/vim/vim/archive/v"
                                  version ".tar.gz"))
              (file-name (string-append name "-" version ".tar.gz"))
-             (patches (search-patches "vim-CVE-2017-5953.patch"))
              (sha256
               (base32
-               "04samk2bakyixbxyc3p0g6ypls45105sikibg0wc6lmak9bqjs85"))))
+               "08kzimdyla35ndrbn68jf8pmzm7nd2qrydnvk57j089m6ajic62r"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
@@ -128,9 +129,27 @@ configuration files.")
              "--enable-xim"
              "--disable-selinux"
              "--enable-gui")
-       ,@(package-arguments vim)))
+       ,@(substitute-keyword-arguments (package-arguments vim)
+           ((#:phases phases)
+            `(modify-phases ,phases
+               (add-after 'build 'drop-failing-tests
+                 (lambda _
+                   ;; These tests fail mysteriously with GUI enabled.
+                   ;; https://github.com/vim/vim/issues/1460
+                   (substitute* "src/testdir/test_cmdline.vim"
+                     (("call assert_equal\\(.+getcmd.+\\(\\)\\)") ""))
+                   #t))
+               (add-before 'check 'start-xserver
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; Some tests require an X server, but does not start one.
+                   (let ((xorg-server (assoc-ref inputs "xorg-server"))
+                         (display ":1"))
+                     (setenv "DISPLAY" display)
+                     (zero? (system (string-append xorg-server "/bin/Xvfb "
+                                                    display " &")))))))))))
     (native-inputs
-     `(("pkg-config" ,pkg-config)))
+     `(("pkg-config" ,pkg-config)
+       ("xorg-server" ,xorg-server)))
     (inputs
      `(("acl" ,acl)
        ("atk" ,atk)
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index a0e76d52c4..7fb94005e8 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -626,11 +626,7 @@ used to validate and fix HTML data.")
         %standard-phases)))
     ;; All of the below are used to generate the documentation
     ;; (Should they be propagated inputs of asciidoc ??)
-    (native-inputs `(("asciidoc" ,asciidoc)
-                     ("libxml2" ,libxml2)
-                     ("docbook-xml" ,docbook-xml)
-                     ("docbook-xsl" ,docbook-xsl)
-                     ("libxslt" ,libxslt)))
+    (native-inputs `(("asciidoc" ,asciidoc)))
     (home-page "https://tinyproxy.github.io/")
     (synopsis "Light-weight HTTP/HTTPS proxy daemon")
     (description "Tinyproxy is a light-weight HTTP/HTTPS proxy
@@ -4479,11 +4475,7 @@ exploit attempts.")
          "0pf91nc0xcykahc3x7ww525c9czm8zpg80nxl8n2mrzc4ilgvass"))))
     (build-system python-build-system)
     (native-inputs
-     `(("asciidoc" ,asciidoc)
-       ("docbook-xsl" ,docbook-xsl)
-       ("docbook-xml" ,docbook-xml)
-       ("libxml2" ,libxml2)             ;for xmllint
-       ("libxslt" ,libxslt)))           ;for xsltproc
+     `(("asciidoc" ,asciidoc)))
     (inputs
      `(("python-colorama" ,python-colorama)
        ("python-cssutils" ,python-cssutils)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 7d76a2d202..b95f2e7a6f 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -177,26 +177,12 @@ commands would.")
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags
-       (let* ((docbook-xsl-name-version ,(string-append
-                                          (package-name docbook-xsl) "-"
-                                          (package-version  docbook-xsl)))
-              (docbook-xsl-catalog-file (string-append
-                                         (assoc-ref %build-inputs "docbook-xsl")
-                                         "/xml/xsl/"
-                                         docbook-xsl-name-version
-                                         "/catalog.xml"))
-              (docbook-xml-catalog-file (string-append
-                                         (assoc-ref %build-inputs "docbook-xml")
-                                         "/xml/dtd/docbook/catalog.xml")))
-         ;; Reference the catalog files required to build the manpages.
-         (list (string-append "XML_CATALOG_FILES=" docbook-xsl-catalog-file " "
-                              docbook-xml-catalog-file)
-              "CC=gcc"
-              (string-append "PREFIX=" %output)
-              ;; This works around the following error:
-              ;; 'error: ‘for’ loop initial declarations are only allowed in C99
-              ;; or C11 mode'
-              "CFLAGS=-std=c11"))
+       (list "CC=gcc"
+             (string-append "PREFIX=" %output)
+             ;; This works around the following error:
+             ;; 'error: ‘for’ loop initial declarations are only allowed in C99
+             ;; or C11 mode'
+             "CFLAGS=-std=c11")
        ;; The build system tries to build in a separate directory, but that
        ;; seems to be unnecessary.
        #:configure-flags '("--disable-builddir")
@@ -215,7 +201,6 @@ commands would.")
        ("asciidoc" ,asciidoc)
        ("xmlto" ,xmlto)
        ("perl-pod-simple" ,perl-pod-simple)
-       ("docbook-xml" ,docbook-xml)
        ("libx11" ,libx11)
        ("pcre" ,pcre)
        ("startup-notification" ,startup-notification)
@@ -226,6 +211,7 @@ commands would.")
        ("perl" ,perl)
        ("pkg-config" ,pkg-config)
        ;; For building the documentation.
+       ("libxml2" ,libxml2)
        ("docbook-xsl" ,docbook-xsl)))
     (home-page "https://i3wm.org/")
     (synopsis "Improved tiling window manager")
diff --git a/gnu/packages/wxwidgets.scm b/gnu/packages/wxwidgets.scm
index 52fa8184dd..077195cca7 100644
--- a/gnu/packages/wxwidgets.scm
+++ b/gnu/packages/wxwidgets.scm
@@ -65,7 +65,7 @@
        ("libsm" ,libsm)
        ("libtiff" ,libtiff)
        ("mesa" ,mesa)
-       ("webkitgtk" ,webkitgtk-2.4)
+       ("webkitgtk" ,webkitgtk)
        ("sdl" ,sdl)))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -89,34 +89,6 @@ a graphical user interface.  It has language bindings for Python, Perl, Ruby
 and many other languages.")
     (license (list l:lgpl2.0+ (l:fsf-free "file://doc/license.txt")))))
 
-(define-public wxwidgets-2
-  (package
-    (inherit wxwidgets)
-    (version "2.8.12")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/wxWidgets/wxWidgets/"
-                           "releases/download/v" version
-                           "/wxGTK-" version ".tar.gz"))
-       (sha256
-        (base32 "1gjs9vfga60mk4j4ngiwsk9h6c7j22pw26m3asxr1jwvqbr8kkqk"))))
-    (inputs
-     `(("gtk" ,gtk+-2)
-       ("libjpeg" ,libjpeg)
-       ("libtiff" ,libtiff)
-       ("libmspack" ,libmspack)
-       ("sdl" ,sdl)
-       ("unixodbc" ,unixodbc)))
-    (arguments
-     `(#:configure-flags
-       '("--enable-unicode" "--with-regex=sys" "--with-sdl")
-       #:make-flags
-       (list (string-append "LDFLAGS=-Wl,-rpath="
-                            (assoc-ref %outputs "out") "/lib"))
-       ;; No 'check' target.
-       #:tests? #f))))
-
 (define-public wxwidgets-gtk2
   (package (inherit wxwidgets)
            (inputs `(("gtk+" ,gtk+-2)
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index dad1911d31..77efef15eb 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -31,6 +31,8 @@
   #:use-module (gnu system shadow)                ; 'user-account', etc.
   #:use-module (gnu system file-systems)          ; 'file-system', etc.
   #:use-module (gnu system mapped-devices)
+  #:use-module ((gnu system linux-initrd)
+                #:select (file-system-packages))
   #:use-module (gnu packages admin)
   #:use-module ((gnu packages linux)
                 #:select (alsa-utils crda eudev e2fsprogs fuse gpm kbd lvm2 rng-tools))
diff --git a/gnu/services/ssh.scm b/gnu/services/ssh.scm
index d8a3ad35ad..b7f9887b30 100644
--- a/gnu/services/ssh.scm
+++ b/gnu/services/ssh.scm
@@ -260,28 +260,42 @@ The other options should be self-descriptive."
 (define-record-type* <openssh-configuration>
   openssh-configuration make-openssh-configuration
   openssh-configuration?
-  (openssh               openssh-configuration-openssh ;package
+  ;; <package>
+  (openssh               openssh-configuration-openssh
                          (default openssh))
+  ;; string
   (pid-file              openssh-configuration-pid-file
                          (default "/var/run/sshd.pid"))
-  (port-number           openssh-configuration-port-number ;integer
+  ;; integer
+  (port-number           openssh-configuration-port-number
                          (default 22))
-  (permit-root-login     openssh-configuration-permit-root-login ;Boolean | 'without-password
+  ;; Boolean | 'without-password
+  (permit-root-login     openssh-configuration-permit-root-login
                          (default #f))
-  (allow-empty-passwords? openssh-configuration-allow-empty-passwords? ;Boolean
+  ;; Boolean
+  (allow-empty-passwords? openssh-configuration-allow-empty-passwords?
                           (default #f))
-  (password-authentication? openssh-configuration-password-authentication? ;Boolean
+  ;; Boolean
+  (password-authentication? openssh-configuration-password-authentication?
                             (default #t))
+  ;; Boolean
   (public-key-authentication? openssh-configuration-public-key-authentication?
-                              (default #t))                         ;Boolean
-  (x11-forwarding?       openssh-configuration-x11-forwarding? ;Boolean
+                              (default #t))
+  ;; Boolean
+  (x11-forwarding?       openssh-configuration-x11-forwarding?
                          (default #f))
+  ;; Boolean
   (challenge-response-authentication? openssh-challenge-response-authentication?
-                                      (default #f)) ;Boolean
+                                      (default #f))
+  ;; Boolean
   (use-pam?              openssh-configuration-use-pam?
-                         (default #t)) ;Boolean
+                         (default #t))
+  ;; Boolean
   (print-last-log?       openssh-configuration-print-last-log?
-                         (default #t))) ;Boolean
+                         (default #t))
+  ;; list of two-element lists
+  (subsystems            openssh-configuration-subsystems
+                         (default '(("sftp" "internal-sftp")))))
 
 (define %openssh-accounts
   (list (user-group (name "sshd") (system? #t))
@@ -316,40 +330,48 @@ The other options should be self-descriptive."
   "Return the sshd configuration file corresponding to CONFIG."
   (computed-file
    "sshd_config"
-   #~(call-with-output-file #$output
-       (lambda (port)
-         (display "# Generated by 'openssh-service'.\n" port)
-         (format port "Port ~a\n"
-                 #$(number->string (openssh-configuration-port-number config)))
-         (format port "PermitRootLogin ~a\n"
-                 #$(match (openssh-configuration-permit-root-login config)
-                     (#t "yes")
-                     (#f "no")
-                     ('without-password "without-password")))
-         (format port "PermitEmptyPasswords ~a\n"
-                 #$(if (openssh-configuration-allow-empty-passwords? config)
-                       "yes" "no"))
-         (format port "PasswordAuthentication ~a\n"
-                 #$(if (openssh-configuration-password-authentication? config)
-                       "yes" "no"))
-         (format port "PubkeyAuthentication ~a\n"
-                 #$(if (openssh-configuration-public-key-authentication? config)
-                       "yes" "no"))
-         (format port "X11Forwarding ~a\n"
-                 #$(if (openssh-configuration-x11-forwarding? config)
-                       "yes" "no"))
-         (format port "PidFile ~a\n"
-                 #$(openssh-configuration-pid-file config))
-         (format port "ChallengeResponseAuthentication ~a\n"
-                 #$(if (openssh-challenge-response-authentication? config)
-                       "yes" "no"))
-         (format port "UsePAM ~a\n"
-                 #$(if (openssh-configuration-use-pam? config)
-                       "yes" "no"))
-         (format port "PrintLastLog ~a\n"
-                 #$(if (openssh-configuration-print-last-log? config)
-                       "yes" "no"))
-         #t))))
+   #~(begin
+       (use-modules (ice-9 match))
+       (call-with-output-file #$output
+         (lambda (port)
+           (display "# Generated by 'openssh-service'.\n" port)
+           (format port "Port ~a\n"
+                   #$(number->string
+                      (openssh-configuration-port-number config)))
+           (format port "PermitRootLogin ~a\n"
+                   #$(match (openssh-configuration-permit-root-login config)
+                       (#t "yes")
+                       (#f "no")
+                       ('without-password "without-password")))
+           (format port "PermitEmptyPasswords ~a\n"
+                   #$(if (openssh-configuration-allow-empty-passwords? config)
+                         "yes" "no"))
+           (format port "PasswordAuthentication ~a\n"
+                   #$(if (openssh-configuration-password-authentication? config)
+                         "yes" "no"))
+           (format port "PubkeyAuthentication ~a\n"
+                   #$(if (openssh-configuration-public-key-authentication?
+                          config)
+                         "yes" "no"))
+           (format port "X11Forwarding ~a\n"
+                   #$(if (openssh-configuration-x11-forwarding? config)
+                         "yes" "no"))
+           (format port "PidFile ~a\n"
+                   #$(openssh-configuration-pid-file config))
+           (format port "ChallengeResponseAuthentication ~a\n"
+                   #$(if (openssh-challenge-response-authentication? config)
+                         "yes" "no"))
+           (format port "UsePAM ~a\n"
+                   #$(if (openssh-configuration-use-pam? config)
+                         "yes" "no"))
+           (format port "PrintLastLog ~a\n"
+                   #$(if (openssh-configuration-print-last-log? config)
+                         "yes" "no"))
+           (for-each
+            (match-lambda
+              ((name command) (format port "Subsystem\t~a\t~a\n" name command)))
+            '#$(openssh-configuration-subsystems config))
+           #t)))))
 
 (define (openssh-shepherd-service config)
   "Return a <shepherd-service> for openssh with CONFIG."
diff --git a/gnu/system/file-systems.scm b/gnu/system/file-systems.scm
index 8107722c74..bbac23fbdf 100644
--- a/gnu/system/file-systems.scm
+++ b/gnu/system/file-systems.scm
@@ -22,8 +22,6 @@
   #:use-module (guix records)
   #:use-module ((gnu build file-systems)
                 #:select (string->uuid uuid->string))
-  #:use-module (gnu packages linux)
-  #:use-module (gnu packages disk)
   #:re-export (string->uuid
                uuid->string)
   #:export (<file-system>
@@ -41,6 +39,8 @@
             file-system-create-mount-point?
             file-system-dependencies
 
+            file-system-type-predicate
+
             file-system->spec
             spec->file-system
             specification->file-system-mapping
@@ -67,8 +67,6 @@
 
             file-system-mapping->bind-mount
 
-            file-system-packages
-
             %store-mapping
             %network-configuration-files
             %network-file-mappings))
@@ -77,6 +75,9 @@
 ;;;
 ;;; Declaring file systems to be mounted.
 ;;;
+;;; Note: this file system is used both in the Shepherd and on the "host
+;;; side", so it must not include (gnu packages …) modules.
+;;;
 ;;; Code:
 
 ;; File system declaration.
@@ -416,25 +417,9 @@ a bind mount."
               %network-configuration-files))
 
 (define (file-system-type-predicate type)
+  "Return a predicate that, when passed a file system, returns #t if that file
+system has the given TYPE."
   (lambda (fs)
     (string=? (file-system-type fs) type)))
 
-(define* (file-system-packages file-systems #:key (volatile-root? #f))
- `(,@(if (find (lambda (fs)
-                 (string-prefix? "ext" (file-system-type fs)))
-               file-systems)
-         (list e2fsck/static)
-         '())
-   ,@(if (find (lambda (fs)
-                 (string-suffix? "fat" (file-system-type fs)))
-               file-systems)
-         (list fatfsck/static)
-         '())
-   ,@(if (find (file-system-type-predicate "btrfs") file-systems)
-         (list btrfs-progs/static)
-         '())
-   ,@(if volatile-root?
-         (list unionfs-fuse/static)
-         '())))
-
 ;;; file-systems.scm ends here
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 1f1c306828..dfe198e43e 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
@@ -43,6 +43,7 @@
   #:use-module (srfi srfi-26)
   #:export (expression->initrd
             raw-initrd
+            file-system-packages
             base-initrd))
 
 
@@ -199,6 +200,26 @@ to it are lost."
                         #:volatile-root? '#$volatile-root?)))
      #:name "raw-initrd")))
 
+(define* (file-system-packages file-systems #:key (volatile-root? #f))
+  "Return the list of statically-linked, stripped packages to check
+FILE-SYSTEMS."
+  `(,@(if (find (lambda (fs)
+                  (string-prefix? "ext" (file-system-type fs)))
+                file-systems)
+          (list e2fsck/static)
+          '())
+    ,@(if (find (lambda (fs)
+                  (string-suffix? "fat" (file-system-type fs)))
+                file-systems)
+          (list fatfsck/static)
+          '())
+    ,@(if (find (file-system-type-predicate "btrfs") file-systems)
+          (list btrfs-progs/static)
+          '())
+    ,@(if volatile-root?
+          (list unionfs-fuse/static)
+          '())))
+
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
diff --git a/gnu/tests/ssh.scm b/gnu/tests/ssh.scm
index 456476e69d..c1582c4737 100644
--- a/gnu/tests/ssh.scm
+++ b/gnu/tests/ssh.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -54,10 +55,12 @@
     (services (cons service
                     (operating-system-user-services %base-os)))))
 
-(define (run-ssh-test name ssh-service pid-file)
+(define* (run-ssh-test name ssh-service pid-file #:key (sftp? #f))
   "Run a test of an OS running SSH-SERVICE, which writes its PID to PID-FILE.
 SSH-SERVICE must be configured to listen on port 22 and to allow for root and
-empty-password logins."
+empty-password logins.
+
+When SFTP? is true, run an SFTP server test."
   (mlet* %store-monad ((os ->   (marionette-operating-system
                                  (os-with-service ssh-service)
                                  #:imported-modules '((gnu services herd)
@@ -80,7 +83,8 @@ empty-password logins."
                          (ice-9 match)
                          (ssh session)
                          (ssh auth)
-                         (ssh channel))
+                         (ssh channel)
+                         (ssh sftp))
 
             (define marionette
               ;; Enable TCP forwarding of the guest's port 22.
@@ -101,6 +105,47 @@ empty-password logins."
                          (error "file didn't show up" ,file))))
                marionette))
 
+            (define (make-session-for-test)
+              "Make a session with predefined parameters for a test."
+              (make-session #:user "root"
+                            #:port 2222
+                            #:host "localhost"
+                            #:log-verbosity 'protocol))
+
+            (define (call-with-connected-session proc)
+              "Call the one-argument procedure PROC with a freshly created and
+connected SSH session object, return the result of the procedure call.  The
+session is disconnected when the PROC is finished."
+              (let ((session (make-session-for-test)))
+                (dynamic-wind
+                  (lambda ()
+                    (let ((result (connect! session)))
+                      (unless (equal? result 'ok)
+                        (error "Could not connect to a server"
+                               session result))))
+                  (lambda () (proc session))
+                  (lambda () (disconnect! session)))))
+
+            (define (call-with-connected-session/auth proc)
+              "Make an authenticated session.  We should be able to connect as
+root with an empty password."
+              (call-with-connected-session
+               (lambda (session)
+                 ;; Try the simple authentication methods.  Dropbear requires
+                 ;; 'none' when there are no passwords, whereas OpenSSH accepts
+                 ;; 'password' with an empty password.
+                 (let loop ((methods (list (cut userauth-password! <> "")
+                                           (cut userauth-none! <>))))
+                   (match methods
+                     (()
+                      (error "all the authentication methods failed"))
+                     ((auth rest ...)
+                      (match (pk 'auth (auth session))
+                        ('success
+                         (proc session))
+                        ('denied
+                         (loop rest)))))))))
+
             (mkdir #$output)
             (chdir #$output)
 
@@ -131,37 +176,34 @@ empty-password logins."
                          (current-services))))
                marionette))
 
-            ;; Connect to the guest over SSH.  We should be able to connect as
-            ;; "root" with an empty password.  Make sure we can run a shell
+            ;; Connect to the guest over SSH.  Make sure we can run a shell
             ;; command there.
-            (test-equal "connect"
+            (test-equal "shell command"
+              'hello
+              (call-with-connected-session/auth
+               (lambda (session)
+                 ;; FIXME: 'get-server-public-key' segfaults.
+                 ;; (get-server-public-key session)
+                 (let ((channel (make-channel session)))
+                   (channel-open-session channel)
+                   (channel-request-exec channel "echo hello > /root/witness")
+                   (and (zero? (channel-get-exit-status channel))
+                        (wait-for-file "/root/witness"))))))
+
+            ;; Connect to the guest over SFTP.  Make sure we can write and
+            ;; read a file there.
+            (unless #$sftp?
+              (test-skip 1))
+            (test-equal "SFTP file writing and reading"
               'hello
-              (let* ((session (make-session #:user "root"
-                                            #:port 2222 #:host "localhost"
-                                            #:log-verbosity 'protocol)))
-                (match (connect! session)
-                  ('ok
-                   ;; Try the simple authentication methods.  Dropbear
-                   ;; requires 'none' when there are no passwords, whereas
-                   ;; OpenSSH accepts 'password' with an empty password.
-                   (let loop ((methods (list (cut userauth-password! <> "")
-                                             (cut userauth-none! <>))))
-                     (match methods
-                       (()
-                        (error "all the authentication methods failed"))
-                       ((auth rest ...)
-                        (match (pk 'auth (auth session))
-                          ('success
-                           ;; FIXME: 'get-server-public-key' segfaults.
-                           ;; (get-server-public-key session)
-                           (let ((channel (make-channel session)))
-                             (channel-open-session channel)
-                             (channel-request-exec channel
-                                                   "echo hello > /root/witness")
-                             (and (zero? (channel-get-exit-status channel))
-                                  (wait-for-file "/root/witness"))))
-                          ('denied
-                           (loop rest))))))))))
+              (call-with-connected-session/auth
+               (lambda (session)
+                 (let ((sftp-session (make-sftp-session session))
+                       (witness "/root/sftp-witness"))
+                   (call-with-remote-output-file sftp-session witness
+                                                 (cut display "hello" <>))
+                   (call-with-remote-input-file sftp-session witness
+                                                read)))))
 
             (test-end)
             (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
@@ -179,7 +221,8 @@ empty-password logins."
                                  (openssh-configuration
                                   (permit-root-login #t)
                                   (allow-empty-passwords? #t)))
-                        "/var/run/sshd.pid"))))
+                        "/var/run/sshd.pid"
+                        #:sftp? #t))))
 
 (define %test-dropbear
   (system-test
diff --git a/guix/build/download.scm b/guix/build/download.scm
index 36c815c167..c5dddf83de 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -241,7 +241,18 @@ and 'guix publish', something like
 (define* (ftp-fetch uri file #:key timeout)
   "Fetch data from URI and write it to FILE.  Return FILE on success.  Bail
 out if the connection could not be established in less than TIMEOUT seconds."
-  (let* ((conn (ftp-open (uri-host uri) #:timeout timeout))
+  (let* ((userinfo (string-split (uri-userinfo uri) #\:))
+         (conn (match userinfo
+                 (("")
+                  (ftp-open (uri-host uri) #:timeout timeout))
+                 (((? string? user))
+                  (ftp-open (uri-host uri) #:timeout timeout
+                                           #:username user))
+                 (((? string? user) (? string? pass))
+                  (ftp-open (uri-host uri) #:timeout timeout
+                                           #:username user
+                                           #:password pass))
+                 (_ (ftp-open (uri-host uri) #:timeout timeout))))
          (size (false-if-exception (ftp-size conn (uri-path uri))))
          (in   (ftp-retr conn (basename (uri-path uri))
                          (dirname (uri-path uri)))))
diff --git a/guix/download.scm b/guix/download.scm
index dda18ff04d..3f9263d757 100644
--- a/guix/download.scm
+++ b/guix/download.scm
@@ -125,7 +125,6 @@
        "http://vorboss.dl.sourceforge.net/project/"
        "http://netassist.dl.sourceforge.net/project/")
       (kernel.org
-       "http://www.all.kernel.org/pub/"
        "http://ramses.wh2.tu-dresden.de/pub/mirrors/kernel.org/"
        "http://linux-kernel.uio.no/pub/"
        "http://kernel.osuosl.org/pub/"
diff --git a/guix/ftp-client.scm b/guix/ftp-client.scm
index 0a179282ed..054a00ad7f 100644
--- a/guix/ftp-client.scm
+++ b/guix/ftp-client.scm
@@ -121,7 +121,10 @@ seconds to wait for the connection to succeed."
              (raise-error errno)))))
       (connect s sockaddr)))
 
-(define* (ftp-open host #:optional (port "ftp") #:key timeout)
+(define* (ftp-open host #:optional (port "ftp")
+                        #:key timeout
+                              (username "anonymous")
+                              (password "guix@example.com"))
   "Open an FTP connection to HOST on PORT (a service-identifying string,
 or a TCP port number), and return it.
 
@@ -156,7 +159,7 @@ TIMEOUT, an ETIMEDOUT error is raised."
                (if (eqv? code 220)
                    (begin
                      ;;(%ftp-command "OPTS UTF8 ON" 200 s)
-                     (%ftp-login "anonymous" "guix@example.com" s)
+                     (%ftp-login username password s)
                      (%make-ftp-connection s ai))
                    (begin
                      (close s)
diff --git a/scripts/guix.in b/scripts/guix.in
index 5d6921dd09..e20c274242 100644
--- a/scripts/guix.in
+++ b/scripts/guix.in
@@ -30,10 +30,12 @@
 
   (define config-lookup
     (let ((config '(("prefix"         . "@prefix@")
+                    ("exec_prefix"    . "@exec_prefix@")
                     ("datarootdir"    . "@datarootdir@")
                     ("guilemoduledir" . "@guilemoduledir@")
+                    ("guileobjectdir" . "@guileobjectdir@")
                     ("localedir"      . "@localedir@")))
-          (var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}")))
+          (var-ref-regexp (make-regexp "\\$\\{([a-z_]+)\\}")))
       (define (expand-var-ref match)
         (lookup (match:substring match 1)))
       (define (expand str)
@@ -45,14 +47,17 @@
 
   (define (maybe-augment-load-paths!)
     (unless (getenv "GUIX_UNINSTALLED")
-      (let ((module-dir (config-lookup "guilemoduledir")))
+      (let ((module-dir (config-lookup "guilemoduledir"))
+            (object-dir (config-lookup "guileobjectdir")))
         (push! module-dir %load-path)
-        (push! module-dir %load-compiled-path))
+        (push! object-dir %load-compiled-path))
       (let ((updates-dir (and=> (or (getenv "XDG_CONFIG_HOME")
                                     (and=> (getenv "HOME")
                                            (cut string-append <> "/.config")))
                                 (cut string-append <> "/guix/latest"))))
         (when (and updates-dir (file-exists? updates-dir))
+          ;; XXX: Currently 'guix pull' puts both .scm and .go files in
+          ;; UPDATES-DIR.
           (push! updates-dir %load-path)
           (push! updates-dir %load-compiled-path)))))
 
diff --git a/tests/file-systems.scm b/tests/file-systems.scm
index 467ee8ca5d..12f4f09c57 100644
--- a/tests/file-systems.scm
+++ b/tests/file-systems.scm
@@ -20,8 +20,10 @@
   #:use-module (guix store)
   #:use-module (guix modules)
   #:use-module (gnu system file-systems)
+  #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-64)
-  #:use-module (rnrs bytevectors))
+  #:use-module (rnrs bytevectors)
+  #:use-module (ice-9 match))
 
 ;; Test the (gnu system file-systems) module.
 
@@ -80,4 +82,12 @@
   (not (member '(guix config)
                (source-module-closure '((gnu system file-systems))))))
 
+(test-equal "does not pull (gnu packages …)"
+  ;; Same story: (gnu packages …) should not be pulled.
+  #f
+  (find (match-lambda
+          (('gnu 'packages _ ..1) #t)
+          (_ #f))
+        (source-module-closure '((gnu system file-systems)))))
+
 (test-end)