summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--doc/emacs.texi26
-rw-r--r--doc/guix.texi61
-rw-r--r--emacs.am3
-rw-r--r--emacs/guix-info.el6
-rw-r--r--emacs/guix-license.el130
-rw-r--r--emacs/guix-list.el27
-rw-r--r--emacs/guix-main.scm63
-rw-r--r--emacs/guix-messages.el15
-rw-r--r--emacs/guix-read.el11
-rw-r--r--emacs/guix-ui-generation.el2
-rw-r--r--emacs/guix-ui-package.el24
-rw-r--r--emacs/guix-ui-system-generation.el2
-rw-r--r--gnu-system.am1
-rw-r--r--gnu/packages/admin.scm29
-rw-r--r--gnu/packages/adns.scm29
-rw-r--r--gnu/packages/aria2.scm49
-rw-r--r--gnu/packages/aspell.scm6
-rw-r--r--gnu/packages/audio.scm4
-rw-r--r--gnu/packages/bioinformatics.scm12
-rw-r--r--gnu/packages/bittorrent.scm67
-rw-r--r--gnu/packages/check.scm25
-rw-r--r--gnu/packages/compression.scm29
-rw-r--r--gnu/packages/enlightenment.scm40
-rw-r--r--gnu/packages/ruby.scm841
-rw-r--r--gnu/packages/tls.scm4
-rw-r--r--gnu/packages/web.scm4
-rw-r--r--gnu/services/base.scm6
-rw-r--r--gnu/services/dmd.scm6
-rw-r--r--gnu/system.scm1
30 files changed, 1426 insertions, 101 deletions
diff --git a/NEWS b/NEWS
index 0084394941..010789e2e4 100644
--- a/NEWS
+++ b/NEWS
@@ -14,9 +14,10 @@ Please send Guix bug reports to bug-guix@gnu.org.
 
 ** Package management
 
+*** Emacs interface for licenses
 *** Emacs interface for system generations
 *** Emacs interface for hydra.gnu.org
-*** Changes in Emacs interface variables
+*** Changes in Emacs interface variables and faces
 In the following names, BUFFER-TYPE means "info" or "list";
 ENTRY-TYPE means "package", "output" or "generation".
 
@@ -30,6 +31,7 @@ ENTRY-TYPE means "package", "output" or "generation".
 - guix-buffer-name-function -> guix-ui-buffer-name-function
 - guix-update-after-operation -> guix-ui-update-after-operation
 - guix-search-params -> guix-package-search-params
+- guix-BUFFER-TYPE-file-path (face) -> guix-BUFFER-TYPE-file-name
 
 **** Replaced
 - guix-list-column-format, guix-list-column-value-methods ->
diff --git a/doc/emacs.texi b/doc/emacs.texi
index eb470ab4ca..8020e0ace3 100644
--- a/doc/emacs.texi
+++ b/doc/emacs.texi
@@ -9,6 +9,7 @@ Guix convenient and fun.
 @menu
 * Initial Setup: Emacs Initial Setup.	Preparing @file{~/.emacs}.
 * Package Management: Emacs Package Management.	Managing packages and generations.
+* Licenses: Emacs Licenses.		Interface for licenses of Guix packages.
 * Popup Interface: Emacs Popup Interface.	Magit-like interface for guix commands.
 * Prettify Mode: Emacs Prettify.	Abbreviating @file{/gnu/store/@dots{}} file names.
 * Build Log Mode: Emacs Build Log.	Highlighting Guix build logs.
@@ -158,6 +159,9 @@ but cannot be found among available packages).
 @item M-x guix-packages-by-name
 Display package(s) with the specified name.
 
+@item M-x guix-packages-by-license
+Display package(s) with the specified license.
+
 @item M-x guix-search-by-regexp
 Search for packages by a specified regexp.  By default ``name'',
 ``synopsis'' and ``description'' of the packages will be searched.  This
@@ -355,6 +359,7 @@ emacs, The GNU Emacs Manual}) which can be used to:
 @item install/remove a package;
 @item jump to a package location;
 @item browse home page of a package;
+@item browse license URL;
 @item describe packages from ``Inputs'' fields.
 @end itemize
 
@@ -516,6 +521,27 @@ Various settings for ``info'' buffers.
 @end table
 
 
+@node Emacs Licenses
+@section Licenses
+
+If you want to browse the URL of a particular license, or to look at a
+list of licenses, you may use the following commands:
+
+@table @kbd
+
+@item M-x guix-browse-license-url
+Choose a license from a completion list to browse its URL using
+@code{browse-url} function (@pxref{Browse-URL,,, emacs, The GNU Emacs
+Manual}).
+
+@item M-x guix-licenses
+Display a list of available licenses.  You can press @kbd{@key{RET}}
+there to display packages with this license in the same way as @kbd{M-x
+guix-packages-by-license} would do (@pxref{Emacs Commands}).
+
+@end table
+
+
 @node Emacs Popup Interface
 @section Popup Interface
 
diff --git a/doc/guix.texi b/doc/guix.texi
index a650a55d51..a6ba9485eb 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -15,8 +15,8 @@ Copyright @copyright{} 2013, 2014 Andreas Enge@*
 Copyright @copyright{} 2013 Nikita Karetnikov@*
 Copyright @copyright{} 2015 Mathieu Lirzin@*
 Copyright @copyright{} 2014 Pierre-Antoine Rault@*
-Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer
-Copyright @copyright{} 2015 Leo Famulari
+Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@*
+Copyright @copyright{} 2015, 2016 Leo Famulari
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -111,6 +111,7 @@ Emacs Interface
 
 * Initial Setup: Emacs Initial Setup.	Preparing @file{~/.emacs}.
 * Package Management: Emacs Package Management.	Managing packages and generations.
+* Licenses: Emacs Licenses.		Interface for licenses of Guix packages.
 * Popup Interface: Emacs Popup Interface.	Magit-like interface for guix commands.
 * Prettify Mode: Emacs Prettify.	Abbreviating @file{/gnu/store/@dots{}} file names.
 * Build Log Mode: Emacs Build Log.	Highlighting Guix build logs.
@@ -174,6 +175,7 @@ System Configuration
 * Initial RAM Disk::            Linux-Libre bootstrapping.
 * GRUB Configuration::          Configuring the boot loader.
 * Invoking guix system::        Instantiating a system configuration.
+* Running GuixSD in a VM::      How to run GuixSD in a virtual machine.
 * Defining Services::           Adding new service definitions.
 
 Services
@@ -5693,6 +5695,7 @@ instance to support new system services.
 * Initial RAM Disk::            Linux-Libre bootstrapping.
 * GRUB Configuration::          Configuring the boot loader.
 * Invoking guix system::        Instantiating a system configuration.
+* Running GuixSD in a VM::      How to run GuixSD in a virtual machine.
 * Defining Services::           Adding new service definitions.
 @end menu
 
@@ -9194,7 +9197,8 @@ in @var{file} that stands alone.  Use the @option{--image-size} option
 to specify the size of the image.
 
 When using @code{vm-image}, the returned image is in qcow2 format, which
-the QEMU emulator can efficiently use.
+the QEMU emulator can efficiently use. @xref{Running GuixSD in a VM},
+for more information on how to run the image in a virtual machine.
 
 When using @code{disk-image}, a raw disk image is produced; it can be
 copied as is to a USB stick, for instance.  Assuming @code{/dev/sdc} is
@@ -9333,6 +9337,57 @@ graph} of dmd services of the operating system defined in @var{file}.
 
 @end table
 
+@node Running GuixSD in a VM
+@subsection Running GuixSD in a virtual machine
+
+One way to run GuixSD in a virtual machine (VM) is to build a GuixSD
+virtual machine image using @command{guix system vm-image}
+(@pxref{Invoking guix system}).  The returned image is in qcow2 format,
+which the @uref{http://qemu.org/, QEMU emulator} can efficiently use.
+
+To run the image in QEMU, copy it out of the store (@pxref{The Store})
+and give yourself permission to write to the copy.  When invoking QEMU,
+you must choose a system emulator that is suitable for your hardware
+platform.  Here is a minimal QEMU invocation that will boot the result
+of @command{guix system vm-image} on x86_64 hardware:
+
+@example
+$ qemu-system-x86_64 \
+   -net user -net nic,model=virtio \
+   -enable-kvm -m 256 /tmp/qemu-image
+@end example
+
+Here is what each of these options means:
+
+@table @code
+@item qemu-system-x86_64
+This specifies the hardware platform to emulate.  This should match the
+host.
+
+@item -net user
+Enable the unprivileged user-mode network stack.  The guest OS can
+access the host but not vice versa.  This is the simplest way to get the
+guest OS online.  If you don't choose a network stack, the boot will
+fail.
+
+@item -net nic,model=virtio
+You must create a network interface of a given model.  If you don't
+create a NIC, the boot will fail.  Assuming your hardware platform is
+x86_64, you can get a list of available NIC models by running
+@command{qemu-system-x86_64 -net nic,model=help}.
+
+@item -enable-kvm
+If your system has hardware virtualization extensions, enabling the
+Linux kernel's virtual machine support (KVM) will make things run
+faster.
+
+@item -m 256
+RAM available to the guest OS, in mebibytes.  Defaults to 128@tie{}MiB,
+which may be insufficent for some operations.
+
+@item /tmp/qemu-image
+The file name of the qcow2 image.
+@end table
 
 @node Defining Services
 @subsection Defining Services
diff --git a/emacs.am b/emacs.am
index d0d4dfb9bd..6af9596ce9 100644
--- a/emacs.am
+++ b/emacs.am
@@ -1,5 +1,5 @@
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+# Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 #
 # This file is part of GNU Guix.
 #
@@ -37,6 +37,7 @@ ELFILES =					\
   emacs/guix-hydra-jobset.el			\
   emacs/guix-info.el				\
   emacs/guix-init.el				\
+  emacs/guix-license.el				\
   emacs/guix-list.el				\
   emacs/guix-messages.el			\
   emacs/guix-pcomplete.el			\
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index 644533eb29..6aefd2f3f6 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -42,9 +42,9 @@
   "Face used for titles of parameters."
   :group 'guix-info-faces)
 
-(defface guix-info-file-path
+(defface guix-info-file-name
   '((t :inherit link))
-  "Face used for file paths."
+  "Face used for file names."
   :group 'guix-info-faces)
 
 (defface guix-info-url
@@ -337,7 +337,7 @@ BUTTON-OR-FACE is a button type)."
 
 (define-button-type 'guix-file
   :supertype 'guix
-  'face 'guix-info-file-path
+  'face 'guix-info-file-name
   'help-echo "Find file"
   'action (lambda (btn)
             (guix-find-file (button-label btn))))
diff --git a/emacs/guix-license.el b/emacs/guix-license.el
new file mode 100644
index 0000000000..a99d7af98d
--- /dev/null
+++ b/emacs/guix-license.el
@@ -0,0 +1,130 @@
+;;; guix-license.el --- Licenses
+
+;; Copyright © 2016 Alex Kost <alezost@gmail.com>
+
+;; This file is part of GNU Guix.
+
+;; GNU Guix is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Guix is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file provides the code to work with licenses of Guix packages.
+
+;;; Code:
+
+(require 'guix-buffer)
+(require 'guix-list)
+(require 'guix-info)
+(require 'guix-read)
+(require 'guix-backend)
+(require 'guix-guile)
+
+(guix-define-entry-type license)
+
+(defun guix-lookup-license-url (license)
+  "Return URL of a LICENSE."
+  (or (guix-eval-read (guix-make-guile-expression
+                       'lookup-license-uri license))
+      (error "Hm, I don't know URL of '%s' license" license)))
+
+(defun guix-license-get-entries (search-type &rest args)
+  "Receive 'license' entries.
+SEARCH-TYPE may be one of the following symbols: `all', `id', `name'."
+  (guix-eval-read
+   (apply #'guix-make-guile-expression
+          'license-entries search-type args)))
+
+(defun guix-license-get-display (search-type &rest args)
+  "Search for licenses and show results."
+  (apply #'guix-list-get-display-entries
+         'license search-type args))
+
+
+;;; License 'info'
+
+(guix-info-define-interface license
+  :buffer-name "*Guix License Info*"
+  :get-entries-function 'guix-license-get-entries
+  :format '((name ignore (simple guix-info-heading))
+            ignore
+            guix-license-insert-packages-button
+            (url ignore (simple guix-url))
+            guix-license-insert-comment)
+  :titles '((url . "URL")))
+
+(declare-function guix-packages-by-license "guix-ui-package")
+
+(defun guix-license-insert-packages-button (entry)
+  "Insert button to display packages by license ENTRY."
+  (guix-info-insert-action-button
+   "Packages"
+   (lambda (btn)
+     (guix-packages-by-license (button-get btn 'license)))
+   "Show packages with this license"
+   'license (guix-entry-value entry 'name)))
+
+(defun guix-license-insert-comment (entry)
+  "Insert 'comment' of a license ENTRY."
+  (let ((comment (guix-entry-value entry 'comment)))
+    (if (and comment
+             (string-match-p "^http" comment))
+        (guix-info-insert-value-simple comment 'guix-url)
+      (guix-info-insert-title-simple
+       (guix-info-param-title 'license 'comment))
+      (guix-info-insert-value-indent comment))))
+
+
+;;; License 'list'
+
+(guix-list-define-interface license
+  :buffer-name "*Guix Licenses*"
+  :get-entries-function 'guix-license-get-entries
+  :describe-function 'guix-license-list-describe
+  :format '((name nil 40 t)
+            (url guix-list-get-url 50 t))
+  :titles '((name . "License"))
+  :sort-key '(name))
+
+(let ((map guix-license-list-mode-map))
+  (define-key map (kbd "RET") 'guix-license-list-show-packages))
+
+(defun guix-license-list-describe (ids)
+  "Describe licenses with IDS (list of identifiers)."
+  (guix-buffer-display-entries
+   (guix-entries-by-ids ids (guix-buffer-current-entries))
+   'info 'license (cl-list* 'id ids) 'add))
+
+(defun guix-license-list-show-packages ()
+  "Display packages with the license at point."
+  (interactive)
+  (guix-packages-by-license (guix-list-current-id)))
+
+
+;;; Interactive commands
+
+;;;###autoload
+(defun guix-browse-license-url (license)
+  "Browse URL of a LICENSE."
+  (interactive (list (guix-read-license-name)))
+  (browse-url (guix-lookup-license-url license)))
+
+;;;###autoload
+(defun guix-licenses ()
+  "Display licenses of the Guix packages."
+  (interactive)
+  (guix-license-get-display 'all))
+
+(provide 'guix-license)
+
+;;; guix-license.el ends here
diff --git a/emacs/guix-list.el b/emacs/guix-list.el
index 7e57f42cb2..c91c67cb29 100644
--- a/emacs/guix-list.el
+++ b/emacs/guix-list.el
@@ -33,9 +33,14 @@
 
 (guix-define-buffer-type list)
 
-(defface guix-list-file-path
-  '((t :inherit guix-info-file-path))
-  "Face used for file paths."
+(defface guix-list-file-name
+  '((t :inherit guix-info-file-name))
+  "Face used for file names."
+  :group 'guix-list-faces)
+
+(defface guix-list-url
+  '((t :inherit guix-info-url))
+  "Face used for URLs."
   :group 'guix-list-faces)
 
 (defface guix-list-time
@@ -214,14 +219,22 @@ VAL may be nil."
   (guix-get-string (guix-get-time-string seconds)
                    'guix-list-time))
 
-(defun guix-list-get-file-path (path &optional _)
-  "Return PATH button specification for `tabulated-list-entries'."
-  (list path
-        'face 'guix-list-file-path
+(defun guix-list-get-file-name (file-name &optional _)
+  "Return FILE-NAME button specification for `tabulated-list-entries'."
+  (list file-name
+        'face 'guix-list-file-name
         'action (lambda (btn) (find-file (button-label btn)))
         'follow-link t
         'help-echo "Find file"))
 
+(defun guix-list-get-url (url &optional _)
+  "Return URL button specification for `tabulated-list-entries'."
+  (list url
+        'face 'guix-list-url
+        'action (lambda (btn) (browse-url (button-label btn)))
+        'follow-link t
+        'help-echo "Browse URL"))
+
 
 ;;; 'List' lines
 
diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm
index 236c882e3c..335686ed25 100644
--- a/emacs/guix-main.scm
+++ b/emacs/guix-main.scm
@@ -403,6 +403,12 @@ MATCH-PARAMS is a list of parameters that REGEXP can match."
   (let ((re (make-regexp regexp regexp/icase)))
     (matching-packages (cut package-match? <> re))))
 
+(define (packages-by-license license)
+  "Return a list of packages with LICENSE."
+  (matching-packages
+   (lambda (package)
+     (memq license (list-maybe (package-license package))))))
+
 (define (all-available-packages)
   "Return a list of all available packages."
   (matching-packages (const #t)))
@@ -663,6 +669,9 @@ ENTRIES is a list of installed manifest entries."
          (manifest-output-proc  (apply-to-first manifest-output-patterns))
          (regexp-proc           (lambda (_ regexp params . __)
                                   (packages-by-regexp regexp params)))
+         (license-proc          (lambda (_ license-name)
+                                  (packages-by-license
+                                   (lookup-license license-name))))
          (all-proc              (lambda _ (all-available-packages)))
          (newest-proc           (lambda _ (newest-available-packages))))
     `((package
@@ -671,6 +680,7 @@ ENTRIES is a list of installed manifest entries."
        (installed        . ,manifest-package-proc)
        (obsolete         . ,(apply-to-first obsolete-package-patterns))
        (regexp           . ,regexp-proc)
+       (license          . ,license-proc)
        (all-available    . ,all-proc)
        (newest-available . ,newest-proc))
       (output
@@ -679,6 +689,7 @@ ENTRIES is a list of installed manifest entries."
        (installed        . ,manifest-output-proc)
        (obsolete         . ,(apply-to-first obsolete-output-patterns))
        (regexp           . ,regexp-proc)
+       (license          . ,license-proc)
        (all-available    . ,all-proc)
        (newest-available . ,newest-proc)))))
 
@@ -1042,3 +1053,55 @@ Return #t if the shell command was executed successfully."
 ;; See the comment to 'guix-package-names' function in "guix-popup.el".
 (define (package-names-lists)
   (map list (package-names)))
+
+
+;;; Licenses
+
+(define %licenses
+  (delay
+    (filter license?
+            (module-map (lambda (_ var)
+                          (variable-ref var))
+                        (resolve-interface '(guix licenses))))))
+
+(define (licenses)
+  (force %licenses))
+
+(define (license-names)
+  "Return a list of names of available licenses."
+  (map license-name (licenses)))
+
+(define lookup-license
+  (memoize
+   (lambda (name)
+     "Return a license by its name."
+     (find (lambda (l)
+             (string=? name (license-name l)))
+           (licenses)))))
+
+(define (lookup-license-uri name)
+  "Return a license URI by its name."
+  (and=> (lookup-license name)
+         license-uri))
+
+(define %license-param-alist
+  `((id      . ,license-name)
+    (name    . ,license-name)
+    (url     . ,license-uri)
+    (comment . ,license-comment)))
+
+(define license->sexp
+  (object-transformer %license-param-alist))
+
+(define (find-licenses search-type . search-values)
+  "Return a list of licenses depending on SEARCH-TYPE and SEARCH-VALUES."
+  (case search-type
+    ((id name)
+     (let ((names search-values))
+       (filter-map lookup-license names)))
+    ((all)
+     (licenses))))
+
+(define (license-entries search-type . search-values)
+  (map license->sexp
+       (apply find-licenses search-type search-values)))
diff --git a/emacs/guix-messages.el b/emacs/guix-messages.el
index c4f15dcac2..de0331fff8 100644
--- a/emacs/guix-messages.el
+++ b/emacs/guix-messages.el
@@ -36,6 +36,10 @@
      (name
       ,(lambda (_ entries names)
          (guix-message-packages-by-name entries 'package names)))
+     (license
+      ,(lambda (_ entries licenses)
+         (apply #'guix-message-packages-by-license
+                entries 'package licenses)))
      (regexp
       (0 "No packages matching '%s'." val)
       (1 "A single package matching '%s'." val)
@@ -64,6 +68,10 @@
      (name
       ,(lambda (_ entries names)
          (guix-message-packages-by-name entries 'output names)))
+     (license
+      ,(lambda (_ entries licenses)
+         (apply #'guix-message-packages-by-license
+                entries 'output licenses)))
      (regexp
       (0 "No package outputs matching '%s'." val)
       (1 "A single package output matching '%s'." val)
@@ -159,6 +167,13 @@ Try \"M-x guix-search-by-name\"."
                             (guix-message-string-name (car names))))))
     (message "%s %s." str-beg str-end)))
 
+(defun guix-message-packages-by-license (entries entry-type license)
+  "Display a message for packages or outputs searched by LICENSE."
+  (let* ((count (length entries))
+         (str-beg (guix-message-string-entries count entry-type))
+         (str-end (format "with license '%s'" license)))
+    (message "%s %s." str-beg str-end)))
+
 (defun guix-message-generations-by-time (profile entries times)
   "Display a message for generations searched by TIMES."
   (let* ((count (length entries))
diff --git a/emacs/guix-read.el b/emacs/guix-read.el
index 3bc7b16587..a1a6b86364 100644
--- a/emacs/guix-read.el
+++ b/emacs/guix-read.el
@@ -1,6 +1,6 @@
 ;;; guix-read.el --- Minibuffer readers
 
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
+;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -58,6 +58,10 @@
                             'package-names-lists)))
    #'string<))
 
+(guix-memoized-defun guix-license-names ()
+  "Return a list of names of available licenses."
+  (guix-eval-read (guix-make-guile-expression 'license-names)))
+
 
 ;;; Readers
 
@@ -122,6 +126,11 @@
  :multiple-prompt "Package,s: "
  :multiple-separator " ")
 
+(guix-define-readers
+ :completions-getter guix-license-names
+ :single-reader guix-read-license-name
+ :single-prompt "License: ")
+
 (provide 'guix-read)
 
 ;;; guix-read.el ends here
diff --git a/emacs/guix-ui-generation.el b/emacs/guix-ui-generation.el
index 4047850f23..74b8ff2579 100644
--- a/emacs/guix-ui-generation.el
+++ b/emacs/guix-ui-generation.el
@@ -166,7 +166,7 @@ current profile's GENERATION."
   :format '((number nil 5 guix-list-sort-numerically-0 :right-align t)
             (current guix-generation-list-get-current 10 t)
             (time guix-list-get-time 20 t)
-            (path guix-list-get-file-path 30 t))
+            (path guix-list-get-file-name 30 t))
   :titles '((number . "N."))
   :sort-key '(number . t)
   :marks '((delete . ?D)))
diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el
index 29514527ce..414bc9b9d2 100644
--- a/emacs/guix-ui-package.el
+++ b/emacs/guix-ui-package.el
@@ -35,6 +35,8 @@
 (require 'guix-entry)
 (require 'guix-utils)
 (require 'guix-hydra-build)
+(require 'guix-read)
+(require 'guix-license)
 
 (guix-ui-define-entry-type package)
 (guix-ui-define-entry-type output)
@@ -220,7 +222,7 @@ ENTRIES is a list of package entries to get info about packages."
             (source simple guix-package-info-insert-source)
             (location format (format guix-package-location))
             (home-url format (format guix-url))
-            (license format (format guix-package-info-license))
+            (license format (format guix-package-license))
             (systems format guix-package-info-insert-systems)
             (inputs format (format guix-package-input))
             (native-inputs format (format guix-package-native-input))
@@ -338,6 +340,13 @@ formatted with this string, an action button is inserted.")
   'action (lambda (btn)
             (guix-find-location (button-label btn))))
 
+(define-button-type 'guix-package-license
+  :supertype 'guix
+  'face 'guix-package-info-license
+  'help-echo "Browse license URL"
+  'action (lambda (btn)
+            (guix-browse-license-url (button-label btn))))
+
 (define-button-type 'guix-package-name
   :supertype 'guix
   'face 'guix-package-info-name-button
@@ -767,7 +776,7 @@ for all ARGS."
             (dependencies simple (indent guix-file))
             (location format (format guix-package-location))
             (home-url format (format guix-url))
-            (license format (format guix-package-info-license))
+            (license format (format guix-package-license))
             (systems format guix-package-info-insert-systems)
             (inputs format (format guix-package-input))
             (native-inputs format (format guix-package-native-input))
@@ -925,6 +934,17 @@ Interactively with prefix, prompt for PROFILE."
   (guix-package-get-display profile 'name name))
 
 ;;;###autoload
+(defun guix-packages-by-license (license &optional profile)
+  "Display Guix packages with LICENSE.
+LICENSE is a license name string.
+If PROFILE is nil, use `guix-current-profile'.
+Interactively with prefix, prompt for PROFILE."
+  (interactive
+   (list (guix-read-license-name)
+         (guix-ui-read-profile)))
+  (guix-package-get-display profile 'license license))
+
+;;;###autoload
 (defun guix-search-by-regexp (regexp &optional params profile)
   "Search for Guix packages by REGEXP.
 PARAMS are package parameters that should be searched.
diff --git a/emacs/guix-ui-system-generation.el b/emacs/guix-ui-system-generation.el
index d79f3bceef..7f4d76d489 100644
--- a/emacs/guix-ui-system-generation.el
+++ b/emacs/guix-ui-system-generation.el
@@ -71,7 +71,7 @@ SEARCH-VALUES."
             (current guix-generation-list-get-current 10 t)
             (label nil 40 t)
             (time guix-list-get-time 20 t)
-            (path guix-list-get-file-path 30 t))
+            (path guix-list-get-file-name 30 t))
   :titles guix-generation-list-titles
   :sort-key '(number . t)
   :marks '((delete . ?D)))
diff --git a/gnu-system.am b/gnu-system.am
index 45511d2eb8..ac386355df 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -36,7 +36,6 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/animation.scm			\
   gnu/packages/apl.scm				\
   gnu/packages/apr.scm				\
-  gnu/packages/aria2.scm			\
   gnu/packages/asciidoc.scm			\
   gnu/packages/aspell.scm			\
   gnu/packages/attr.scm				\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 953c5b4cf8..eca4d9208f 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -58,9 +58,11 @@
   #:use-module (gnu packages image)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages man))
+  #:use-module (gnu packages man)
+  #:use-module (gnu packages autotools))
 
 (define-public dmd
+  ;; Deprecated.  Kept around "just in case."
   (let ((base-version "0.2")
         (patch-level  "01"))
     (package
@@ -99,6 +101,31 @@ interface and is based on GNU Guile.")
       (license license:gpl3+)
       (home-page "http://www.gnu.org/software/dmd/"))))
 
+(define-public shepherd
+  (package
+    (name "shepherd")
+    (version "0.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "ftp://alpha.gnu.org/gnu/dmd/shepherd-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "13mcy2131h7hggqvxbfxyrnbz46aaiaq2agng3x3f789a78n4mnn"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags '("--localstatedir=/var")))
+    (native-inputs `(("pkg-config" ,pkg-config)))
+    (inputs `(("guile" ,guile-2.0)))
+    (synopsis "System service manager")
+    (description
+     "The GNU Shepherd is a daemon-managing daemon, meaning that it supervises
+the execution of system services, replacing similar functionality found in
+typical init systems.  It provides dependency-handling through a convenient
+interface and is based on GNU Guile.")
+    (license license:gpl3+)
+    (home-page "http://www.gnu.org/software/shepherd/")))
+
 (define-public dfc
   (package
    (name "dfc")
diff --git a/gnu/packages/adns.scm b/gnu/packages/adns.scm
index f96b0ab5d0..1af735b6eb 100644
--- a/gnu/packages/adns.scm
+++ b/gnu/packages/adns.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,7 +21,8 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages pkg-config))
 
 (define-public adns
   (package
@@ -53,3 +55,28 @@ functionality.  The library is asynchronous, allowing several concurrent
 calls.  The package also includes several command-line utilities for use in
 scripts.")
     (license gpl3+)))
+
+(define-public c-ares
+  (package
+    (name "c-ares")
+    (version "1.10.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://c-ares.haxx.se/download/" name "-" version
+                    ".tar.gz"))
+              (sha256
+               (base32
+                "1nyka87yf2jfd0y6sspll0yxwb8zi7kyvajrdbjmh4axc5s1cw1x"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://c-ares.haxx.se/")
+    (synopsis "C library for asynchronous DNS requests")
+    (description
+      "C-ares is a C library that performs DNS requests and name resolution
+asynchronously.  It is intended for applications which need to perform DNS
+queries without blocking, or need to perform multiple DNS queries in parallel.
+The primary examples of such applications are servers which communicate with
+multiple clients and programs with graphical user interfaces.")
+    (license (x11-style "http://c-ares.haxx.se/license.html"))))
diff --git a/gnu/packages/aria2.scm b/gnu/packages/aria2.scm
deleted file mode 100644
index 707a3ce0e4..0000000000
--- a/gnu/packages/aria2.scm
+++ /dev/null
@@ -1,49 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-(define-module (gnu packages aria2)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix download)
-  #:use-module (guix packages)
-  #:use-module (guix build-system gnu)
-  #:use-module (gnu packages pkg-config))
-
-(define-public c-ares
-  (package
-    (name "c-ares")
-    (version "1.10.0")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "http://c-ares.haxx.se/download/" name "-" version
-                    ".tar.gz"))
-              (sha256
-               (base32
-                "1nyka87yf2jfd0y6sspll0yxwb8zi7kyvajrdbjmh4axc5s1cw1x"))))
-    (build-system gnu-build-system)
-    (native-inputs
-     `(("pkg-config" ,pkg-config)))
-    (home-page "http://c-ares.haxx.se/")
-    (synopsis "C library for asynchronous DNS requests")
-    (description
-      "C-ares is a C library that performs DNS requests and name resolution
-asynchronously.  It is intended for applications which need to perform DNS
-queries without blocking, or need to perform multiple DNS queries in parallel.
-The primary examples of such applications are servers which communicate with
-multiple clients and programs with graphical user interfaces.")
-    (license (license:x11-style "http://c-ares.haxx.se/license.html"))))
diff --git a/gnu/packages/aspell.scm b/gnu/packages/aspell.scm
index 38ed997163..2425d1cbec 100644
--- a/gnu/packages/aspell.scm
+++ b/gnu/packages/aspell.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -89,10 +89,10 @@ dictionaries, including personal ones.")
 
 (define-public aspell-dict-en
   (aspell-dictionary "en" "English"
-                     #:version "7.1-0"
+                     #:version "2016.01.19-0"
                      #:sha256
                      (base32
-                      "02ldfiny4iakgfgy4sdrzjqdzi7l1rmb6y30lv31kfy5x31g77gz")))
+                      "01h4cl4lngp6mcfbyb47cjrc2gspyg2519dvknd97ki896nx7vcn")))
 
 (define-public aspell-dict-eo
   (aspell-dictionary "eo" "Esperanto"
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 0823aad91e..7f0d87ddf7 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -70,14 +70,14 @@
 (define-public alsa-modular-synth
   (package
     (name "alsa-modular-synth")
-    (version "2.1.1")
+    (version "2.1.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/alsamodular/ams-"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "1nb7qzzqlqa2x8h797jbwi18ihnfkxqg9lyi0c4nvf8ybwzxkzd2"))))
+                "1azbrhpfk4nnybr7kgmc7w6al6xnzppg853vas8gmkh185kk11l0"))))
     (build-system gnu-build-system)
     (inputs
      `(("alsa-lib" ,alsa-lib)
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index a9df676fc6..992ab30fe9 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -2647,7 +2647,7 @@ Roche 454, Ion Torrent and Pacific BioSciences SMRT.")
 (define-public ngs-sdk
   (package
     (name "ngs-sdk")
-    (version "1.2.2")
+    (version "1.2.3")
     (source
      (origin
        (method url-fetch)
@@ -2657,7 +2657,7 @@ Roche 454, Ion Torrent and Pacific BioSciences SMRT.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0rvq61zfw2h9jcz6a33b9xrl20r7s5a9rldvv6rs2qy42khpmf5j"))))
+         "15074fdi94c6pjy83hhk22r86kfvzpaz2i07h3rqg9yy6x3w0pk2"))))
     (build-system gnu-build-system)
     (arguments
      `(#:parallel-build? #f ; not supported
@@ -2711,7 +2711,7 @@ simultaneously.")
 (define-public ncbi-vdb
   (package
     (name "ncbi-vdb")
-    (version "2.5.4")
+    (version "2.5.7")
     (source
      (origin
        (method url-fetch)
@@ -2721,7 +2721,7 @@ simultaneously.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1rcnyc4xkdfcjww2i0s0qrbapys0cxbjcx2sy3qkpslf9f400fgj"))))
+         "0hay5hy8ynva3mi5wbn4wmq1q23qwxc3aqzbb86hg3x4f1r73270"))))
     (build-system gnu-build-system)
     (arguments
      `(#:parallel-build? #f ; not supported
@@ -2951,7 +2951,7 @@ complexity samples.")
 (define-public sra-tools
   (package
     (name "sra-tools")
-    (version "2.5.4")
+    (version "2.5.7")
     (source
      (origin
        (method url-fetch)
@@ -2961,7 +2961,7 @@ complexity samples.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1rxxc8a34g70jcaa2j8sys2x93amlbc24k7az39wldhkzgi96825"))))
+         "0q93qg744x787d08qmjmdafki1wkbvkdwynayjnjd454gkd26jl5"))))
     (build-system gnu-build-system)
     (arguments
      `(#:parallel-build? #f ; not supported
diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm
index 94383dba20..16673edf68 100644
--- a/gnu/packages/bittorrent.scm
+++ b/gnu/packages/bittorrent.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,20 +26,25 @@
   #:use-module (guix build-system python)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module ((guix licenses) #:prefix l:)
-  #:use-module (gnu packages libevent)
+  #:use-module (gnu packages adns)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages curl)
-  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages cyrus-sasl)
+  #:use-module (gnu packages databases)
   #:use-module (gnu packages file)
-  #:use-module (gnu packages linux)
-  #:use-module (gnu packages compression)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
-  #:use-module (gnu packages check)
+  #:use-module (gnu packages libevent)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages nettle)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages curl)
-  #:use-module (gnu packages cyrus-sasl)
-  #:use-module (gnu packages tls))
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages xml))
 
 (define-public transmission
   (package
@@ -192,3 +198,48 @@ XML-RPC over SCGI.")
 interface, for the Transmission BitTorrent daemon.")
     (home-page "https://github.com/fagga/transmission-remote-cli")
     (license l:gpl3+)))
+
+(define-public aria2
+  (package
+    (name "aria2")
+    (version "1.19.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/tatsuhiro-t/aria2/"
+                                  "releases/download/release-" version "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1qwr4al6wlh5f558r0mr1hvdnf7d8ss6qwqn2361k99phk1cdg3a"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags '("--enable-libaria2")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'delete-socket-tests
+           (lambda _
+             (substitute* "test/LpdMessageDispatcherTest.cc"
+               (("CPPUNIT_TEST_SUITE_REGISTRATION\\(LpdMessageDispatcherTest\\);" text)
+                (string-append "// " text)))
+             (substitute* "test/LpdMessageReceiverTest.cc"
+               (("CPPUNIT_TEST_SUITE_REGISTRATION\\(LpdMessageReceiverTest\\);" text)
+                (string-append "// " text))))))))
+    (native-inputs
+     `(("pkg-config", pkg-config)))
+    (inputs
+     `(("c-ares" ,c-ares)
+       ("cppunit" ,cppunit) ; for the tests
+       ("gnutls" ,gnutls)
+       ("gmp" ,gmp)
+       ("libssh2" ,libssh2)
+       ("libxml2" ,libxml2)
+       ("nettle" ,nettle)
+       ("sqlite" ,sqlite)
+       ("zlib" ,zlib)))
+    (home-page "http://aria2.sourceforge.net/")
+    (synopsis "Utility for parallel downloading files")
+    (description
+      "Aria2 is a lightweight, multi-protocol & multi-source command-line
+download utility.  It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
+Aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.")
+    (license l:gpl2+)))
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 3b7a243ba7..21ecd8413a 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,6 +27,7 @@
   #: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 (guix build-system trivial))
 
@@ -147,3 +149,26 @@ supervised tests.")
      "Catch stands for C++ Automated Test Cases in Headers and is a
 multi-paradigm automated test framework for C++ and Objective-C.")
     (license boost1.0)))
+
+(define-public cmocka
+  (package
+    (name "cmocka")
+    (version "1.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://cmocka.org/files/1.0/cmocka-"
+                                  version ".tar.xz"))
+              (sha256
+               (base32
+                "0fvm6rdalqcxckbddch8ycdw6n2ckldblv117n09chi2l7bm0q5k"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:tests? #f)) ; No test target
+    (home-page "https://cmocka.org/")
+    (synopsis "Unit testing framework for C")
+    (description "Cmocka is a unit testing framework for C with support for
+mock objects.  It only requires the standard C library, and works with
+different compilers.  Cmocka supports several different message output formats
+like Test Anything Protocol, Subunit, xUnit XML or the original cmockery output
+format.")
+    (license asl2.0)))
diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm
index 7d22095df1..4a31bf79e2 100644
--- a/gnu/packages/compression.scm
+++ b/gnu/packages/compression.scm
@@ -8,6 +8,7 @@
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2015 Jeff Mickey <j@codemac.net>
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -32,8 +33,10 @@
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
+  #:use-module (gnu packages backup)
   #:use-module (gnu packages base)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages valgrind)
   #:use-module ((srfi srfi-1) #:select (last)))
 
@@ -659,3 +662,29 @@ multiple processors and multiple cores when compressing data.")
     ;; Things under zopfli/ are under ASL2.0, but 4 files at the top-level,
     ;; written by Mark Adler, are under another non-copyleft license.
     (license license:asl2.0)))
+
+(define-public pixz
+  (package
+    (name "pixz")
+    (version "1.0.6")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/vasi/pixz/releases/download/v" version
+                    "/pixz-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1s3j7zw6j5zi3fhdxg287ndr3wf6swac7z21mqd1pyiln530gi82"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("libarchive" ,libarchive)))
+    (home-page "https://github.com/vasi/pixz")
+    (synopsis "Parallel indexing implementation of LZMA")
+    (description
+     "The existing XZ Utils provide great compression in the .xz file format,
+but they produce just one big block of compressed data.  Pixz instead produces
+a collection of smaller blocks which makes random access to the original data
+possible and can compress in parallel.  This is especially useful for large
+tarballs.")
+    (license license:bsd-2)))
diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm
index 3fec6c6fc7..7fbbaac071 100644
--- a/gnu/packages/enlightenment.scm
+++ b/gnu/packages/enlightenment.scm
@@ -23,6 +23,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages compression)
@@ -41,9 +42,10 @@
   #:use-module (gnu packages linux)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages pdf)
-  #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pulseaudio)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages valgrind)
   #:use-module (gnu packages video)
@@ -306,3 +308,39 @@ file manager, wide range of configuration options, plugin system allowing to
 unload unused functionality, with support for touchscreen and suitable for
 embedded systems.")
     (license license:bsd-2)))
+
+(define-public python-efl
+  (package
+    (name "python-efl")
+    (version "1.16.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "python-efl" version))
+        (sha256
+         (base32
+          "1ihay90agl2jx12m7jj8j1cspd7vsak1w7q95rhb6r2srkq0ppxk"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+        (add-before 'build 'set-flags
+         (lambda _
+           (setenv "CFLAGS"
+                   (string-append "-I" (assoc-ref %build-inputs "python-dbus")
+                                  "/include/dbus-1.0")))))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("efl" ,efl)
+       ("elementary" ,elementary)
+       ("python-dbus" ,python-dbus)))
+    (home-page "https://www.enlightenment.org/")
+    (synopsis "Python bindings for EFL")
+    (description
+     "PYTHON-EFL are the python bindings for the whole Enlightenment Foundation
+Libraries stack (eo, evas, ecore, edje, emotion, ethumb and elementary).")
+    (license license:lgpl3)))
+
+(define-public python2-efl
+  (package-with-python2 python-efl))
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index 6e5553bd30..fa7c2f7691 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -1557,6 +1557,161 @@ functionality, making it easier to migrate test suites from bacon to minitest.")
     (home-page "https://github.com/seattlerb/minitest-bacon")
     (license license:expat)))
 
+(define-public ruby-minitest-focus
+  (package
+    (name "ruby-minitest-focus")
+    (version "1.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "minitest-focus" version))
+       (sha256
+        (base32
+         "1zgjslp6d7dzcn8smj595idymgd5j603p9g2jqkfgi28sqbhz6m0"))))
+    (build-system ruby-build-system)
+    (propagated-inputs
+     `(("ruby-minitest" ,ruby-minitest)))
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)))
+    (synopsis "Allows a few specific tests to be focused on")
+    (description
+     "@code{minitest-focus} gives the ability focus on a few tests with ease
+without having to use command-line arguments.  It introduces a @code{focus}
+class method for use in testing classes, specifying that the next defined test
+is to be run.")
+    (home-page "https://github.com/seattlerb/minitest-focus")
+    (license license:expat)))
+
+(define-public ruby-minitest-pretty-diff
+  ;; Use git reference because gem is out of date and does not contain testing
+  ;; script.  There are no releases on GitHub.
+  (let ((commit "11f32e930f574225432f42e5e1ef6e7471efe572"))
+    (package
+      (name "ruby-minitest-pretty-diff")
+      (version (string-append "0.1-1." (string-take commit 8)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/adammck/minitest-pretty_diff.git")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "13y5dhmcckhzd83gj1nfwh41iykbjcm2w7y4pr6j6rpqa5as122r"))))
+      (build-system ruby-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (replace 'check
+             (lambda _
+               (zero? (system* "script/test")))))))
+      (native-inputs
+       `(("bundler" ,bundler)
+         ("ruby-turn" ,ruby-turn)))
+      (synopsis "Pretty-print hashes and arrays in MiniTest")
+      (description
+       "@code{minitest-pretty_diff} monkey-patches
+@code{MiniTest::Assertions#mu_pp} to pretty-print hashes and arrays before
+diffing them.  This makes it easier to spot differences between nested
+structures when tests fail.")
+      (home-page "https://github.com/adammck/minitest-pretty_diff")
+      (license license:expat))))
+
+(define-public ruby-minitest-moar
+  (package
+    (name "ruby-minitest-moar")
+    (version "0.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "minitest-moar" version))
+       (sha256
+        (base32
+         "0nb83blrsab92gcy6nfpw39njys7zisia8pw4igzzfzfl51cis0x"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'clean-dependencies
+           (lambda _
+             ;; Remove all gems defined in the Gemfile because these are not
+             ;; truly needed.
+             (substitute* "Gemfile"
+               (("gem .*") ""))
+             ;; Remove byebug as not needed to run tests.
+             (substitute* "test/test_helper.rb"
+               (("require 'byebug'") ""))
+             #t)))))
+    (native-inputs
+     `(("bundler" ,bundler)
+       ("ruby-minitest" ,ruby-minitest)))
+    (synopsis "Extra features and changes to MiniTest")
+    (description "@code{MiniTest Moar} add some additional features and
+changes some default behaviours in MiniTest.  For instance, Moar replaces the
+MiniTest @code{Object#stub} with a global @code{stub} method.")
+    (home-page "https://github.com/dockyard/minitest-moar")
+    (license license:expat)))
+
+(define-public ruby-minitest-bonus-assertions
+  (package
+    (name "ruby-minitest-bonus-assertions")
+    (version "2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "minitest-bonus-assertions" version))
+       (sha256
+        (base32
+         "11nrd32kwy61ndg9csk7l1ifya79ghrrv3vsrxj57k50m7na6jkm"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'clean-dependencies
+           (lambda _
+             ;; Remove unneeded require statement that would entail another
+             ;; dependency.
+             (substitute* "test/minitest_config.rb"
+               (("require 'minitest/bisect'") ""))
+             #t)))))
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)
+       ("ruby-minitest-pretty-diff" ,ruby-minitest-pretty-diff)
+       ("ruby-minitest-focus" ,ruby-minitest-focus)
+       ("ruby-minitest-moar" ,ruby-minitest-moar)))
+    (synopsis "Bonus assertions for @code{Minitest}")
+    (description
+     "Minitest bonus assertions provides extra MiniTest assertions.  For
+instance, it provides @code{assert_true}, @code{assert_false} and
+@code{assert_set_equal}.")
+    (home-page "https://github.com/halostatue/minitest-bonus-assertions")
+    (license license:expat)))
+
+(define-public ruby-minitest-rg
+  (package
+    (name "ruby-minitest-rg")
+    (version "5.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "minitest-rg" version))
+       (sha256
+        (base32
+         "0sq509ax1x62rd0w10b0hcydcxyk5bxxr3fwrgxv02r8drq2r354"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; Some tests fail even outside Guix, so disable tests.
+     ;; https://github.com/blowmage/minitest-rg/issues/12
+     ;; https://github.com/blowmage/minitest-rg/pull/13
+     `(#:tests? #f))
+    (propagated-inputs
+     `(("ruby-minitest" ,ruby-minitest)))
+    (synopsis "Coloured output for Minitest")
+    (description
+     "@code{minitest-rg} changes the colour of the output from Minitest.")
+    (home-page "http://blowmage.com/minitest-rg")
+    (license license:expat)))
+
 (define-public ruby-daemons
   (package
     (name "ruby-daemons")
@@ -2943,6 +3098,369 @@ used to create both network servers and clients.")
     (home-page "http://rubyeventmachine.com")
     (license (list license:ruby license:gpl3)))) ; GPLv3 only AFAICT
 
+(define-public ruby-turn
+  (package
+    (name "ruby-turn")
+    (version "0.9.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "turn" version))
+       (sha256
+        (base32
+         "1691rc2sq04cw8mxxh340k2j04ll90kwgcy8ddrp6rligmfrf8fw"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; Tests fail because turn changes its environment so can no longer
+         ;; find test/unit.  Instead simply test if the executable runs
+         ;; without issue.
+         (replace 'check
+           (lambda _
+             (zero? (system* "ruby" "-Ilib" "bin/turn" "-h")))))))
+    (propagated-inputs
+     `(("ruby-ansi" ,ruby-ansi)
+       ("ruby-minitest" ,ruby-minitest-4)))
+    (synopsis "Alternate set of alternative runners for MiniTest")
+    (description
+     "TURN provides a set of alternative runners for MiniTest which are both
+colorful and informative.  TURN displays each test on a separate line with
+failures being displayed immediately instead of at the end of the tests.  Note
+that TURN is no longer being maintained.")
+    (home-page "http://rubygems.org/gems/turn")
+    (license license:expat)))
+
+(define-public ruby-mime-types-data
+  (package
+    (name "ruby-mime-types-data")
+    (version "3.2015.1120")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "mime-types-data" version))
+       (sha256
+        (base32
+         "04fzvy02w8d0rrsg8avncn7h58pvwdxj82aps54srb3sam2dkhic"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)))
+    (synopsis "Registry for information about MIME media type definitions")
+    (description
+     "@code{mime-types-data} provides a registry for information about
+Multipurpose Internet Mail Extensions (MIME) media type definitions.  It can
+be used with the Ruby mime-types library or other software to determine
+defined filename extensions for MIME types, or to use filename extensions to
+look up the likely MIME type definitions.")
+    (home-page "https://github.com/mime-types/mime-types-data/")
+    (license license:expat)))
+
+(define-public ruby-mime-types
+  (package
+    (name "ruby-mime-types")
+    (version "3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "mime-types" version))
+       (sha256
+        (base32
+         "1snjc38a9vqvy8j41xld1i1byq9prbl955pbjw7dxqcfcirqlzra"))))
+    (build-system ruby-build-system)
+    (propagated-inputs
+     `(("ruby-mime-types-data" ,ruby-mime-types-data)))
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)
+       ("ruby-fivemat" ,ruby-fivemat)
+       ("ruby-minitest-focus" ,ruby-minitest-focus)
+       ("ruby-minitest-rg" ,ruby-minitest-rg)
+       ("ruby-minitest-bonus-assertions" ,ruby-minitest-bonus-assertions)))
+    (synopsis "Library and registry for MIME content type definitions")
+    (description "The mime-types library provides a library and registry for
+information about Multipurpose Internet Mail Extensions (MIME) content type
+definitions.  It can be used to determine defined filename extensions for MIME
+types, or to use filename extensions to look up the likely MIME type
+definitions.")
+    (home-page "https://github.com/mime-types/ruby-mime-types")
+    (license license:expat)))
+
+(define-public ruby-fivemat
+  (package
+    (name "ruby-fivemat")
+    (version "1.3.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "fivemat" version))
+       (sha256
+        (base32
+         "1gvw6g4yc96l2pcyvigahyfsjxpdjx21iiwzvf965zippchdh6gk"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f)) ; no tests
+    (synopsis "Each test file given its own line of dots")
+    (description
+     "Fivemat is a MiniTest/RSpec/Cucumber formatter that gives each test file
+its own line of dots during testing.  It aims to provide test output that is
+neither too verbose nor too minimal.")
+    (home-page "https://github.com/tpope/fivemat")
+    (license license:expat)))
+
+(define-public ruby-sqlite3
+  (package
+    (name "ruby-sqlite3")
+    (version "1.3.11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "sqlite3" version))
+       (sha256
+        (base32
+         "19r06wglnm6479ffj9dl0fa4p5j2wi6dj7k6k3d0rbx7036cv3ny"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'add-gemtest-file
+           ;; This file exists in the repository but is not distributed.
+           (lambda _ (zero? (system* "touch" ".gemtest")))))))
+    (inputs
+     `(("sqlite" ,sqlite)))
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)
+       ("ruby-mini-portile" ,ruby-mini-portile)))
+    (synopsis "Interface with SQLite3 databases")
+    (description
+     "This module allows Ruby programs to interface with the SQLite3 database
+engine.")
+    (home-page
+     "https://github.com/sparklemotion/sqlite3-ruby")
+    (license license:bsd-3)))
+
+(define-public ruby-shoulda-context
+  (package
+    (name "ruby-shoulda-context")
+    (version "1.2.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "shoulda-context" version))
+       (sha256
+        (base32
+         "06wv2ika5zrbxn0m3qxwk0zkbspxids3zmlq3xxays5qmvl1qb55"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; Do not run tests to avoid circular dependence with rails.
+             ;; Instead just import the library to test.
+             (zero? (system* "ruby" "-Ilib" "-r" "shoulda-context")))))))
+    (synopsis "Test::Unit context framework extracted from Shoulda")
+    (description
+     "@code{shoulda-context} is the context framework extracted from Shoulda.
+Instead of writing Ruby methods with lots_of_underscores, shoulda-context adds
+context, setup, and should blocks combine to produce natural test method
+names.")
+    (home-page "https://github.com/thoughtbot/shoulda-context")
+    (license license:expat)))
+
+(define-public ruby-shoulda-matchers
+  (package
+    (name "ruby-shoulda-matchers")
+    (version "3.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "shoulda-matchers" version))
+       (sha256
+        (base32
+         "1agabvb8i39mjrp3kb78nvhl41xk1i258hdwdlj0fm8nj9yzn1jb"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'fix-import
+           (lambda _
+             ;; A presumed bug reported upstream at
+             ;; https://github.com/thoughtbot/shoulda-matchers/pull/871
+             (substitute* (string-append  "lib/shoulda/matchers/active_model/"
+                                          "validate_inclusion_of_matcher.rb")
+               (("^require 'bigdecimal'")
+                "require 'bigdecimal'; require 'date'"))))
+         (replace 'check
+           (lambda _
+             ;; Do not run tests to avoid circular dependence with rails.  Instead
+             ;; just import the library to test.
+             (zero? (system* "ruby" "-Ilib" "-r" "shoulda-matchers")))))))
+    (propagated-inputs
+     `(("ruby-activesupport" ,ruby-activesupport)))
+    (synopsis "Collection of testing matchers extracted from Shoulda")
+    (description
+     "Shoulda Matchers provides RSpec- and Minitest-compatible one-liners that
+test common Rails functionality.  These tests would otherwise be much longer,
+more complex, and error-prone.")
+    (home-page "https://github.com/thoughtbot/shoulda-matchers")
+    (license license:expat)))
+
+(define-public ruby-shoulda-matchers-2
+  (package
+    (inherit ruby-shoulda-matchers)
+    (version "2.8.0")
+    (source (origin
+              (method url-fetch)
+              (uri (rubygems-uri "shoulda-matchers" version))
+              (sha256
+               (base32
+                "0d3ryqcsk1n9y35bx5wxnqbgw4m8b3c79isazdjnnbg8crdp72d0"))))))
+
+(define-public ruby-shoulda
+  (package
+    (name "ruby-shoulda")
+    (version "3.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "shoulda" version))
+       (sha256
+        (base32
+         "0csmf15a7mcinfq54lfa4arp0f4b2jmwva55m0p94hdf3pxnjymy"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           ;; Don't run tests to avoid circular dependence with rails.  Instead
+           ;; just import the library to test.
+           (lambda _ (zero? (system* "ruby" "-Ilib" "-r" "shoulda")))))))
+    (propagated-inputs
+     `(("ruby-shoulda-context" ,ruby-shoulda-context)
+       ("ruby-shoulda-matchers" ,ruby-shoulda-matchers-2)))
+    (synopsis "Context framework and matchers for testing")
+    (description
+     "@code{shoulda} is a meta-package combining @code{shoulda-context} and
+@code{shoulda-matchers} providing tools for writing tests.")
+    (home-page "https://github.com/thoughtbot/shoulda")
+    (license license:expat)))
+
+(define-public ruby-unf
+  (package
+    (name "ruby-unf")
+    (version "0.1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "unf" version))
+       (sha256
+        (base32
+         "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'add-dependency-to-bundler
+           (lambda _
+             ;; test-unit is required but not provided by the bundler
+             ;; environment.  This is fixed in the upstream repository but fix
+             ;; has not been released.
+             (substitute* "Gemfile"
+               (("^gemspec") "gem 'test-unit'\ngemspec"))
+             #t)))))
+    (propagated-inputs
+     `(("ruby-unf-ext" ,ruby-unf-ext)))
+    (native-inputs
+     `(("ruby-shoulda" ,ruby-shoulda)
+       ("bundler" ,bundler)
+       ("ruby-test-unit" ,ruby-test-unit)))
+    (synopsis "Unicode Normalization Form support to Ruby and JRuby")
+    (description
+     "@code{ruby-unf} is a wrapper library to bring Unicode Normalization Form
+support to both Ruby and JRuby.  It uses @code{unf_ext} on CRuby and
+@code{java.text.Normalizer} on JRuby.")
+    (home-page "https://github.com/knu/ruby-unf")
+    (license license:bsd-2)))
+
+(define-public ruby-domain-name
+  (package
+    (name "ruby-domain-name")
+    (version "0.5.25")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "domain_name" version))
+       (sha256
+        (base32
+         "16qvfrmcwlzz073aas55mpw2nhyhjcn96s524w0g1wlml242hjav"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'fix-versions
+           (lambda _
+             ;; Fix NameError that appears to already be fixed upstream.
+             (substitute* "Rakefile"
+               (("DomainName::VERSION")
+                "Bundler::GemHelper.gemspec.version"))
+             ;; Loosen unnecessarily strict test-unit version specification.
+             (substitute* "domain_name.gemspec"
+               (("<test-unit>, \\[\\\"~> 2.5.5") "<test-unit>, [\">0"))
+             #t)))))
+    (propagated-inputs
+     `(("ruby-unf" ,ruby-unf)))
+    (native-inputs
+     `(("ruby-shoulda" ,ruby-shoulda)
+       ("bundler" ,bundler)
+       ("ruby-test-unit" ,ruby-test-unit)))
+    (synopsis "Domain name manipulation library")
+    (description
+     "@code{domain_name} is a Domain name manipulation library.  It parses a
+domain name ready for extracting the registered domain and TLD (Top Level
+Domain).  It can also be used for cookie domain validation based on the Public
+Suffix List.")
+    (home-page "https://github.com/knu/ruby-domain_name")
+    (license license:bsd-2)))
+
+(define-public ruby-http-cookie
+  (package
+    (name "ruby-http-cookie")
+    (version "1.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "http-cookie" version))
+       (sha256
+        (base32
+         "0cz2fdkngs3jc5w32a6xcl511hy03a7zdiy988jk1sf3bf5v3hdw"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'add-dependency-to-bundler
+           (lambda _
+             ;; Fix NameError
+             (substitute* "Rakefile"
+               (("HTTP::Cookie::VERSION")
+                "Bundler::GemHelper.gemspec.version"))
+             #t)))))
+    (propagated-inputs
+     `(("ruby-domain-name" ,ruby-domain-name)))
+    (native-inputs
+     `(("rubysimplecov" ,ruby-simplecov)
+       ("bundler" ,bundler)
+       ("ruby-sqlite3" ,ruby-sqlite3)
+       ("ruby-test-unit" ,ruby-test-unit)))
+    (synopsis "Handle HTTP Cookies based on RFC 6265")
+    (description
+     "@code{HTTP::Cookie} is a Ruby library to handle HTTP Cookies based on
+RFC 6265.  It has been designed with security, standards compliance and
+compatibility in mind, to behave just the same as today's major web browsers.
+It has built-in support for the legacy @code{cookies.txt} and
+@code{cookies.sqlite} formats of Mozilla Firefox.")
+    (home-page "https://github.com/sparklemotion/http-cookie")
+    (license license:expat)))
+
 (define-public ruby-ansi
   (package
     (name "ruby-ansi")
@@ -3042,3 +3560,326 @@ to the @code{STDOUT} and @code{STDERR} streams are reported, giving extra
 detail to ease debugging.")
     (home-page "http://github.com/wwood/bioruby-commandeer")
     (license license:expat)))
+
+(define-public ruby-rubytest
+  (package
+    (name "ruby-rubytest")
+    (version "0.8.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rubytest" version))
+       (sha256
+        (base32
+         "19jydsdnkl81i9dhdcr4dc34j0ilm68ff2ngnka1hi38xiw4p5qz"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; Disable regular testing to break the cycle rubytest, qed, brass,
+     ;; rubytest, as well as the cycle rubytest, qed, ansi, rubytest.  Instead
+     ;; simply test that the library can be require'd.
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "ruby" "-Ilib" "-r" "rubytest")))))))
+    (propagated-inputs
+     `(("ruby-ansi" ,ruby-ansi)))
+    (synopsis "Universal test harness for Ruby")
+    (description
+     "Rubytest is a testing meta-framework for Ruby.  It can handle any
+compliant test framework and can run tests from multiple frameworks in a
+single pass.")
+    (home-page "http://rubyworks.github.io/rubytest")
+    (license license:bsd-2)))
+
+(define-public ruby-brass
+  (package
+    (name "ruby-brass")
+    (version "1.2.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "brass" version))
+       (sha256
+        (base32
+         "154lp8rp1vmg60ri1j4cb8hqlw37z7bn575h899v8hzxwi11sxka"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; Disable tests to break the cycle brass, lemon, ae, qed, brass.
+     ;; Instead simply test that the library can be require'd.
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "ruby" "-Ilib" "-r" "brass")))))))
+    (synopsis "Basic foundational assertions framework")
+    (description
+     "BRASS (Bare-Metal Ruby Assertion System Standard) is a basic
+foundational assertions framework for other assertion and test frameworks to
+make use of.")
+    (home-page "http://rubyworks.github.io/brass")
+    (license license:bsd-2)))
+
+(define-public ruby-qed
+  (package
+    (name "ruby-qed")
+    (version "2.9.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "qed" version))
+       (sha256
+        (base32
+         "03h4lmlxpcya8j7s2cnyscqlx8v3xl1xgsw5y1wk1scxcgz2vbmr"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; Disable testing to break the cycle qed, ansi, qed, among others.
+     ;; Instead simply test that the executable runs using --copyright.
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "ruby" "-Ilib" "bin/qed" "--copyright")))))))
+    (propagated-inputs
+     `(("ruby-ansi" ,ruby-ansi)
+       ("ruby-brass" ,ruby-brass)))
+    (synopsis "Test framework utilizing literate programming techniques")
+    (description
+     "@dfn{Quality Ensured Demonstrations} (QED) is a test framework for
+@dfn{Test Driven Development} (TDD) and @dfn{Behaviour Driven
+Development} (BDD) utilizing Literate Programming techniques.  QED sits
+somewhere between lower-level testing tools like @code{Test::Unit} and
+requirement specifications systems like Cucumber.")
+    (home-page "http://rubyworks.github.io/qed")
+    (license license:bsd-2)))
+
+(define-public ruby-ae
+  (package
+    (name "ruby-ae")
+    (version "1.8.2")
+    (source
+     (origin
+       (method url-fetch)
+       ;; Fetch from github so tests are included.
+       (uri (string-append
+             "https://github.com/rubyworks/ae/archive/"
+             version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "147jmkx54x7asy2d8m4dyrhhf4hdx4galpnhwzai030y3cdsfrrl"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _ (zero? (system* "qed")))))))
+    (propagated-inputs
+     `(("ruby-ansi" ,ruby-ansi)))
+    (native-inputs
+     `(("ruby-qed" ,ruby-qed)))
+    (synopsis "Assertions library")
+    (description
+     "Assertive Expressive (AE) is an assertions library specifically designed
+for reuse by other test frameworks.")
+    (home-page "http://rubyworks.github.io/ae")
+    (license license:bsd-2)))
+
+(define-public ruby-lemon
+  (package
+    (name "ruby-lemon")
+    (version "0.9.1")
+    (source
+    (origin
+      (method url-fetch)
+      (uri (rubygems-uri "lemon" version))
+      (sha256
+       (base32
+        "0gqhpgjavgpvx23rqpfqcv3d5bs8gc7lr9yvj8kxgp7mfbdc2jcm"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check (lambda _ (zero? (system* "qed")))))))
+    (propagated-inputs
+     `(("ruby-ae" ,ruby-ae)
+       ("ruby-ansi" ,ruby-ansi)
+       ("ruby-rubytest" ,ruby-rubytest)))
+    (native-inputs
+     `(("ruby-qed" ,ruby-qed)))
+    (synopsis "Test framework correlating code structure and test unit")
+    (description
+     "Lemon is a unit testing framework that enforces highly formal
+case-to-class and unit-to-method test construction.  This enforcement can help
+focus concern on individual units of behavior.")
+    (home-page "http://rubyworks.github.io/lemon")
+    (license license:bsd-2)))
+
+(define-public ruby-rubytest-cli
+  (package
+    (name "ruby-rubytest-cli")
+    (version "0.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rubytest-cli" version))
+       (sha256
+        (base32
+         "0n7hv4k1ba4fm3i98c6ydbsqhkxgbp52mhi70ba1x3mqzfvk438p"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f)) ; no tests
+    (propagated-inputs
+     `(("ruby-ansi" ,ruby-ansi)
+       ("ruby-rubytest" ,ruby-rubytest)))
+    (synopsis "Command-line interface for rubytest")
+    (description
+     "Rubytest CLI is a command-line interface for running tests for
+Rubytest-based test frameworks.  It provides the @code{rubytest} executable.")
+    (home-page "http://rubyworks.github.io/rubytest-cli")
+    (license license:bsd-2)))
+
+(define-public ruby-hashery
+  (package
+    (name "ruby-hashery")
+    (version "2.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "hashery" version))
+       (sha256
+        (base32
+         "0xawbljsjarl9l7700bka672ixwznzwih4s9i38p1y9mp8hyx54g"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (and (zero? (system* "qed"))
+                  (zero? (system* "rubytest" "-Ilib" "-Itest" "test/"))))))))
+    (native-inputs
+     `(("ruby-rubytest-cli" ,ruby-rubytest-cli)
+       ("ruby-qed" ,ruby-qed)
+       ("ruby-lemon" ,ruby-lemon)))
+    (synopsis "Hash-like classes with extra features")
+    (description
+     "The Hashery is a tight collection of @code{Hash}-like classes.
+Included are the auto-sorting @code{Dictionary} class, the efficient
+@code{LRUHash}, the flexible @code{OpenHash} and the convenient
+@code{KeyHash}.  Nearly every class is a subclass of the @code{CRUDHash} which
+defines a CRUD (Create, Read, Update and Delete) model on top of Ruby's
+standard @code{Hash} making it possible to subclass and augment to fit any
+specific use case.")
+    (home-page "http://rubyworks.github.io/hashery")
+    (license license:bsd-2)))
+
+(define-public ruby-rc4
+  (package
+    (name "ruby-rc4")
+    (version "0.1.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ruby-rc4" version))
+       (sha256
+        (base32
+         "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "rspec" "spec/rc4_spec.rb")))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec-2)))
+    (synopsis "Implementation of the RC4 algorithm")
+    (description
+     "RubyRC4 is a pure Ruby implementation of the RC4 algorithm.")
+    (home-page "https://github.com/caiges/Ruby-RC4")
+    (license license:expat)))
+
+(define-public ruby-afm
+  (package
+    (name "ruby-afm")
+    (version "0.2.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "afm" version))
+       (sha256
+        (base32
+         "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("bundler" ,bundler)))
+    (synopsis "Read Adobe Font Metrics (afm) files")
+    (description
+     "This library provides methods to read @dfn{Adobe Font Metrics} (afm)
+files and use the data therein.")
+    (home-page "http://github.com/halfbyte/afm")
+    (license license:expat)))
+
+(define-public ruby-ascii85
+  (package
+    (name "ruby-ascii85")
+    (version "1.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "Ascii85" version))
+       (sha256
+        (base32
+         "0j95sbxd18kc8rhcnvl1w37kflqpax1r12h1x47gh4xxn3mz4m7q"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("bundler" ,bundler)))
+    (synopsis "Encode and decode Ascii85 binary-to-text encoding")
+    (description
+     "This library provides methods to encode and decode Ascii85
+binary-to-text encoding.  The main modern use of Ascii85 is in PostScript and
+@dfn{Portable Document Format} (PDF) file formats.")
+    (home-page "https://github.com/datawraith/ascii85gem")
+    (license license:expat)))
+
+(define-public ruby-ttfunk
+  (package
+    (name "ruby-ttfunk")
+    (version "1.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       ;; fetch from github as the gem does not contain testing code
+       (uri (string-append
+             "https://github.com/prawnpdf/ttfunk/archive/"
+             version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1izq84pnm9niyvkzp8k0vl232q9zj41hwmp9na9fzycfh1pbnsl6"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'remove-rubocop
+           (lambda _
+             ;; remove rubocop as a dependency as not needed for testing
+             (substitute* "ttfunk.gemspec"
+               (("spec.add_development_dependency\\('rubocop'.*") ""))
+             (substitute* "Rakefile"
+               (("require 'rubocop/rake_task'") "")
+               (("Rubocop::RakeTask.new") ""))
+             #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)
+       ("bundler" ,bundler)))
+    (synopsis "Font metrics parser for the Prawn PDF generator")
+    (description
+     "TTFunk is a TrueType font parser written in pure Ruby.  It is used as
+part of the Prawn PDF generator.")
+    (home-page "https://github.com/prawnpdf/ttfunk")
+    ;; From the README: "Matz's terms for Ruby, GPLv2, or GPLv3. See LICENSE
+    ;; for details."
+    (license (list license:gpl2 license:gpl3 license:ruby))))
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index be48b25c9a..a22991c906 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -303,7 +303,7 @@ required structures.")
 (define-public libressl
   (package
     (name "libressl")
-    (version "2.2.0")
+    (version "2.2.5")
     (source
      (origin
       (method url-fetch)
@@ -311,7 +311,7 @@ required structures.")
              "http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-"
              version ".tar.gz"))
       (sha256 (base32
-               "0h1haqb4y39p1zihwvnr1ib0zfq5bcqfnbj5jm9l4j2xibrxi44n"))))
+               "0jwidi7fafcdh5qml72dx0ad0kfsk94qxzm29i7wd3cx8v8dxjp3"))))
     (build-system gnu-build-system)
     (native-search-paths
       ;; FIXME: These two variables must designate a single file or directory
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 02317d2fef..a4f4c021e4 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -100,14 +100,14 @@ and its related documentation.")
 (define-public nginx
   (package
     (name "nginx")
-    (version "1.8.0")
+    (version "1.8.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://nginx.org/download/nginx-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1mgkkmmwkhmpn68sdvbd73ssv6lpqhh864fsyvc1ij4hk4is3k13"))))
+                "1dwpyw4pvhj68vxramqxm8f79pqz9lrm8mvifbn49h3615ikqjwg"))))
     (build-system gnu-build-system)
     (inputs `(("pcre" ,pcre)
               ("openssl" ,openssl)
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 25143c80a6..0399c0049d 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
@@ -946,7 +946,9 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
    (extensions
     (list (service-extension dmd-root-service-type guix-dmd-service)
           (service-extension account-service-type guix-accounts)
-          (service-extension activation-service-type guix-activation)))))
+          (service-extension activation-service-type guix-activation)
+          (service-extension profile-service-type
+                             (compose list guix-configuration-guix))))))
 
 (define* (guix-service #:optional (config %default-guix-configuration))
   "Return a service that runs the Guix build daemon according to
diff --git a/gnu/services/dmd.scm b/gnu/services/dmd.scm
index 545087acc9..fb3d3326f8 100644
--- a/gnu/services/dmd.scm
+++ b/gnu/services/dmd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -88,7 +88,9 @@
    ;; list of services provided by the extensions.
    (compose concatenate)
    (extend append)
-   (extensions (list (service-extension boot-service-type dmd-boot-gexp)))))
+   (extensions (list (service-extension boot-service-type dmd-boot-gexp)
+                     (service-extension profile-service-type
+                                        (const (list dmd)))))))
 
 (define %dmd-root-service
   ;; The root dmd service, aka. PID 1.  Its parameter is a list of
diff --git a/gnu/system.scm b/gnu/system.scm
index edcfaf66fe..024518445d 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -353,7 +353,6 @@ explicitly appear in OS."
   ;; Default set of packages globally visible.  It should include anything
   ;; required for basic administrator tasks.
   (cons* procps psmisc which less zile nano
-         (@ (gnu packages admin) dmd) guix
          lsof                                 ;for Guix's 'list-runtime-roots'
          pciutils usbutils
          util-linux inetutils isc-dhcp