Merge branch 'master' into core-updates
[jackhill/guix/guix.git] / gnu / packages / package-management.scm
index f31f872..f3a1cda 100644 (file)
@@ -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 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix gexp)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
-  #:use-module ((guix licenses) #:select (gpl2+ gpl3+ lgpl2.1+))
+  #:use-module (guix build-system python)
+  #:use-module ((guix build utils) #:select (with-directory-excursion))
+  #:use-module ((guix licenses) #:select (gpl2+ gpl3+ lgpl2.1+ asl2.0))
   #:use-module (gnu packages)
   #:use-module (gnu packages guile)
-  #:use-module ((gnu packages compression) #:select (bzip2 gzip))
+  #:use-module (gnu packages file)
+  #:use-module (gnu packages backup)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages nettle)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages man)
   #:use-module (gnu packages emacs)
-  #:use-module (gnu packages openssl)
-  #:use-module (gnu packages bdw-gc))
+  #:use-module (gnu packages bdw-gc)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages popt)
+  #:use-module (gnu packages gnuzilla)
+  #:use-module (gnu packages cpio)
+  #:use-module (gnu packages tls)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:use-module (ice-9 popen)
+  #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 match))
 
 (define (boot-guile-uri arch)
   "Return the URI for the bootstrap Guile tarball for ARCH."
                      arch "-linux"
                      "/20131110/guile-2.0.9.tar.xz")))
 
-(define-public guix-0.8.1
+(define-public guix-0.10.0
   (package
     (name "guix")
-    (version "0.8.1")
+    (version "0.10.0")
     (source (origin
              (method url-fetch)
              (uri (string-append "ftp://alpha.gnu.org/gnu/guix/guix-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "12h5ldj1yf0za6ladlr8h7nx2gqrv2dxcsiwyqayvrza93lijkf5"))))
+               "0d4afwy7bpqi4k4bzvwc4ga4shwssis1nrvdw53qjyg9bw1a8lbn"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags (list
                           "--localstatedir=/var"
                           "--sysconfdir=/etc"
+                          (string-append "--with-bash-completion-dir="
+                                         (assoc-ref %outputs "out")
+                                         "/etc/bash_completion.d")
                           (string-append "--with-libgcrypt-prefix="
                                          (assoc-ref %build-inputs
                                                     "libgcrypt")))
-       #:phases (alist-cons-before
-                 'configure 'copy-bootstrap-guile
-                 (lambda* (#:key system inputs #:allow-other-keys)
-                   (define (boot-guile-version arch)
-                     (if (string=? "armhf" arch)
-                         "2.0.11"
-                         "2.0.9"))
-
-                   (define (copy arch)
-                     (let ((guile  (assoc-ref inputs
-                                              (string-append "boot-guile/"
-                                                             arch)))
-                           (target (string-append "gnu/packages/bootstrap/"
-                                                  arch "-linux/"
-                                                  "/guile-"
-                                                  (boot-guile-version arch)
-                                                  ".tar.xz")))
-                       (copy-file guile target)))
-
-                   (copy "i686")
-                   (copy "x86_64")
-                   (copy "mips64el")
-                   (copy "armhf")
-                   #t)
-                 %standard-phases)))
+       #:parallel-tests? #f           ;work around <http://bugs.gnu.org/21097>
+       #:phases (modify-phases %standard-phases
+                  (add-before
+                   'configure 'copy-bootstrap-guile
+                   (lambda* (#:key system inputs #:allow-other-keys)
+                     (define (boot-guile-version arch)
+                       (if (string=? "armhf" arch)
+                           "2.0.11"
+                           "2.0.9"))
+
+                     (define (copy arch)
+                       (let ((guile  (assoc-ref inputs
+                                                (string-append "boot-guile/"
+                                                               arch)))
+                             (target (string-append "gnu/packages/bootstrap/"
+                                                    arch "-linux/"
+                                                    "/guile-"
+                                                    (boot-guile-version arch)
+                                                    ".tar.xz")))
+                         (copy-file guile target)))
+
+                     (copy "i686")
+                     (copy "x86_64")
+                     (copy "mips64el")
+                     (copy "armhf")
+                     #t))
+                  (add-after
+                   'unpack 'disable-container-tests
+                   ;; XXX FIXME: These tests fail within the build container.
+                   (lambda _
+                     (substitute* "tests/syscalls.scm"
+                       (("^\\(test-assert \"(clone|setns|pivot-root)\"" all)
+                        (string-append "(test-skip 1)\n" all)))
+                     (substitute* "tests/containers.scm"
+                       (("^\\(test-assert" all)
+                        (string-append "(test-skip 1)\n" all)))
+                     (when (file-exists? "tests/guix-environment-container.sh")
+                       (substitute* "tests/guix-environment-container.sh"
+                         (("guix environment --version")
+                          "exit 77\n")))
+                     #t))
+                  (add-before 'check 'set-SHELL
+                    (lambda _
+                      ;; 'guix environment' tests rely on 'SHELL' having a
+                      ;; correct value, so set it.
+                      (setenv "SHELL" (which "sh"))
+                      #t))
+                  (add-after
+                   'install 'wrap-program
+                   (lambda* (#:key inputs outputs #:allow-other-keys)
+                     ;; Make sure the 'guix' command finds GnuTLS and
+                     ;; Guile-JSON automatically.
+                     (let* ((out    (assoc-ref outputs "out"))
+                            (json   (assoc-ref inputs "guile-json"))
+                            (gnutls (assoc-ref inputs "gnutls"))
+                            (path   (string-append
+                                     json "/share/guile/site/2.0:"
+                                     gnutls "/share/guile/site/2.0")))
+
+                       ;; Ignore user settings so that a bogus
+                       ;; GUILE_LOAD_COMPILED_PATH does not prevent use of
+                       ;; 'guix', notably when it contains entries pointing to
+                       ;; incompatible .go files as reported at
+                       ;; <https://lists.gnu.org/archive/html/guix-devel/2016-03/msg01261.html>.
+                       (wrap-program (string-append out "/bin/guix")
+                         `("GUILE_LOAD_PATH" ":" = (,path))
+                         `("GUILE_LOAD_COMPILED_PATH" ":" = (,path)))
+
+                       #t))))))
     (native-inputs `(("pkg-config" ,pkg-config)
-                     ("emacs" ,emacs-no-x)))      ;for guix.el
+                     ("emacs" ,emacs-minimal)))   ;for guix.el
     (inputs
      (let ((boot-guile (lambda (arch hash)
                          (origin
                        (base32
                         "1mi3brl7l58aww34rawhvja84xc7l1b4hmwdmc36fp9q9mfx0lg5"))))))
     (propagated-inputs
-     `(("guile-json" ,guile-json)
+     `(("gnutls" ,gnutls)                         ;for 'guix download' & co.
+       ("guile-json" ,guile-json)
        ("geiser" ,geiser)))                       ;for guix.el
 
     (home-page "http://www.gnu.org/software/guix")
@@ -138,59 +202,152 @@ also a distribution thereof.  It includes a virtual machine image.  Besides
 the usual package management features, it also supports transactional
 upgrades and roll-backs, per-user profiles, and much more.  It is based on
 the Nix package manager.")
-    (license gpl3+)))
+    (license gpl3+)
+    (properties '((ftp-server . "alpha.gnu.org")))))
 
 (define guix-devel
   ;; Development version of Guix.
-  (let ((commit "9586011"))
-    (package (inherit guix-0.8.1)
-      (version (string-append "0.8.1." commit))
+  ;;
+  ;; Note: use a very short commit id; with a longer one, the limit on
+  ;; hash-bang lines would be exceeded while running the tests.
+  (let ((commit "e9017c98d61f305b624bacaa30e8891ec0100980"))
+    (package (inherit guix-0.10.0)
+      (version (string-append "0.10.0-0." (string-take commit 4)))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "git://git.sv.gnu.org/guix.git")
+                      ;; "git://git.sv.gnu.org/guix.git" temporarily
+                      ;; unavailable (XXX).
+                      (url "http://git.savannah.gnu.org/r/guix.git")
                       (commit commit)))
                 (sha256
                  (base32
-                  "0dcmw8gz2qxknjnh9k8rdwmgysnxnvawdmlg1pyzngakwlsy1c3z"))))
+                  "13mfk10cw6fk4diclzld56xwabshanxjcczdrjlj0wisaz32h3nl"))
+                (file-name (string-append "guix-" version "-checkout"))))
       (arguments
-       (substitute-keyword-arguments (package-arguments guix-0.8.1)
+       (substitute-keyword-arguments (package-arguments guix-0.10.0)
+         ((#:configure-flags flags)
+          ;; Set 'DOT_USER_PROGRAM' to the empty string so we don't keep a
+          ;; reference to Graphviz, whose closure is pretty big (too big for
+          ;; the GuixSD installation image.)
+          `(cons "ac_cv_path_DOT_USER_PROGRAM=dot" ,flags))
          ((#:phases phases)
-          `(alist-cons-after
-            'unpack 'bootstrap
-            (lambda _
-              ;; Make sure 'msgmerge' can modify the PO files.
-              (for-each (lambda (po)
-                          (chmod po #o666))
-                        (find-files "." "\\.po$"))
-
-              (zero? (system* "sh" "bootstrap")))
-            ,phases))))
+          `(modify-phases ,phases
+             (add-after
+              'unpack 'bootstrap
+              (lambda _
+                ;; Make sure 'msgmerge' can modify the PO files.
+                (for-each (lambda (po)
+                            (chmod po #o666))
+                          (find-files "." "\\.po$"))
+
+                (zero? (system* "sh" "bootstrap"))))))))
       (native-inputs
        `(("autoconf" ,(autoconf-wrapper))
          ("automake" ,automake)
          ("gettext" ,gnu-gettext)
          ("texinfo" ,texinfo)
          ("graphviz" ,graphviz)
-         ,@(package-native-inputs guix-0.8.1))))))
+         ("help2man" ,help2man)
+         ,@(package-native-inputs guix-0.10.0))))))
 
 (define-public guix guix-devel)
 
+(define (source-file? file stat)
+  "Return true if FILE is likely a source file, false if it is a typical
+generated file."
+  (define (wrong-extension? file)
+    (or (string-suffix? "~" file)
+        (member (file-extension file)
+                '("o" "a" "lo" "so" "go"))))
+
+  (match (basename file)
+    ((or ".git" "autom4te.cache" "configure" "Makefile" "Makefile.in" ".libs")
+     #f)
+    ((? wrong-extension?)
+     #f)
+    (_
+     #t)))
+
+(define (make-git-predicate directory)
+  "Return a predicate that returns true if a file is part of the Git checkout
+living at DIRECTORY.  Upon Git failure, return #f instead of a predicate."
+  (define (parent-directory? thing directory)
+    ;; Return #t if DIRECTORY is the parent of THING.
+    (or (string-suffix? thing directory)
+        (and (string-index thing #\/)
+             (parent-directory? (dirname thing) directory))))
+
+  (let* ((pipe        (with-directory-excursion directory
+                        (open-pipe* OPEN_READ "git" "ls-files")))
+         (files       (let loop ((lines '()))
+                        (match (read-line pipe)
+                          ((? eof-object?)
+                           (reverse lines))
+                          (line
+                           (loop (cons line lines))))))
+         (status      (close-pipe pipe)))
+    (and (zero? status)
+         (lambda (file stat)
+           (match (stat:type stat)
+             ('directory
+              ;; 'git ls-files' does not list directories, only regular files,
+              ;; so we need this special trick.
+              (any (cut parent-directory? <> file) files))
+             ((or 'regular 'symlink)
+              (any (cut string-suffix? <> file) files))
+             (_
+              #f))))))
+
+(define-public current-guix
+  (let ((select? (delay (or (make-git-predicate
+                             (string-append (current-source-directory)
+                                            "/../.."))
+                            source-file?))))
+    (lambda ()
+      "Return a package representing Guix built from the current source tree.
+This works by adding the current source tree to the store (after filtering it
+out) and returning a package that uses that as its 'source'."
+      (package
+        (inherit guix)
+        (version (string-append (package-version guix) "+"))
+        (source (local-file "../.." "guix-current"
+                            #:recursive? #t
+                            #:select? (force select?)))))))
+
+\f
+;;;
+;;; Other tools.
+;;;
+
 (define-public nix
   (package
     (name "nix")
-    (version "1.8")
+    (version "1.11.2")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://nixos.org/releases/nix/nix-"
                                  version "/nix-" version ".tar.xz"))
              (sha256
               (base32
-               "077hircacgi9y4n6kf48qp4laz1h3ab6sif3rcci1jy13f05w2m3"))))
+               "1mk9z75gklxcv6kzwwz1h5r2ci5kjy6bh7qwk4m5lf5v9s0k64pw"))))
     (build-system gnu-build-system)
     ;; XXX: Should we pass '--with-store-dir=/gnu/store'?  But then we'd also
     ;; need '--localstatedir=/var'.  But then!  The thing would use /var/nix
     ;; instead of /var/guix.  So in the end, we do nothing special.
+    (arguments
+     '(#:configure-flags
+       ;; Set the prefixes of Perl libraries to avoid propagation.
+       (let ((perl-libdir (lambda (p)
+                            (string-append
+                             (assoc-ref %build-inputs p)
+                             "/lib/perl5/site_perl"))))
+         (list (string-append "--with-dbi="
+                              (perl-libdir "perl-dbi"))
+               (string-append "--with-dbd-sqlite="
+                              (perl-libdir "perl-dbd-sqlite"))
+               (string-append "--with-www-curl="
+                              (perl-libdir "perl-www-curl"))))))
     (native-inputs `(("perl" ,perl)
                      ("pkg-config" ,pkg-config)))
     (inputs `(("curl" ,curl)
@@ -215,21 +372,22 @@ sub-directory.")
 (define-public stow
   (package
     (name "stow")
-    (version "2.2.0")
+    (version "2.2.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/stow/stow-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0arw1nsdlcvd7javkbk2bdvnc31d7dmb6fr25xyyi6ng76cxg2cb"))))
+                "1pvky9fayms4r6fhns8jd0vavszd7d979w62vfd5n88v614pdxz2"))))
     (build-system gnu-build-system)
     (inputs
      `(("perl" ,perl)))
     (native-inputs
      `(("perl-test-simple" ,perl-test-simple)
        ("perl-test-output" ,perl-test-output)
-       ("perl-capture-tiny" ,perl-capture-tiny)))
+       ("perl-capture-tiny" ,perl-capture-tiny)
+       ("perl-io-stringy" ,perl-io-stringy)))
     (home-page "https://www.gnu.org/software/stow/")
     (synopsis "Managing installed software packages")
     (description
@@ -239,3 +397,122 @@ typically used for managing software packages installed from source, by
 letting you install them apart in distinct directories and then create
 symlinks to the files in a common directory such as /usr/local.")
     (license gpl2+)))
+
+(define-public rpm
+  (package
+    (name "rpm")
+    (version "4.12.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://rpm.org/releases/rpm-4.12.x/rpm-"
+                                  version ".tar.bz2"))
+              (sha256
+               (base32
+                "0a82ym8phx7g0f3k6smvxnvzh7yv857l42xafk49689kzhld5pbp"))
+              (patches (search-patches "rpm-CVE-2014-8118.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags '("--with-external-db"   ;use the system's bdb
+                           "--enable-python"
+                           "--without-lua")
+       #:phases (modify-phases %standard-phases
+                  (add-before 'configure 'set-nspr-search-path
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      ;; nspr.pc contains the right -I flag pointing to
+                      ;; 'include/nspr', but unfortunately 'configure' doesn't
+                      ;; use 'pkg-config'.  Thus, augment CPATH.
+                      ;; Likewise for NSS.
+                      (let ((nspr (assoc-ref inputs "nspr"))
+                            (nss  (assoc-ref inputs "nss")))
+                        (setenv "CPATH"
+                                (string-append (getenv "C_INCLUDE_PATH") ":"
+                                               nspr "/include/nspr:"
+                                               nss "/include/nss"))
+                        (setenv "LIBRARY_PATH"
+                                (string-append (getenv "LIBRARY_PATH") ":"
+                                               nss "/lib/nss"))
+                        #t)))
+                  (add-after 'install 'fix-rpm-symlinks
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      ;; 'make install' gets these symlinks wrong.  Fix them.
+                      (let* ((out (assoc-ref outputs "out"))
+                             (bin (string-append out "/bin")))
+                        (with-directory-excursion bin
+                          (for-each (lambda (file)
+                                      (delete-file file)
+                                      (symlink "rpm" file))
+                                    '("rpmquery" "rpmverify"))
+                          #t)))))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("python" ,python-2)
+       ("xz" ,xz)
+       ("bdb" ,bdb)
+       ("popt" ,popt)
+       ("nss" ,nss)
+       ("nspr" ,nspr)
+       ("libarchive" ,libarchive)
+       ("nettle" ,nettle)            ;XXX: actually a dependency of libarchive
+       ("file" ,file)
+       ("bzip2" ,bzip2)
+       ("zlib" ,zlib)
+       ("cpio" ,cpio)))
+    (home-page "http://www.rpm.org/")
+    (synopsis "The RPM Package Manager")
+    (description
+     "The RPM Package Manager (RPM) is a command-line driven package
+management system capable of installing, uninstalling, verifying, querying,
+and updating computer software packages.  Each software package consists of an
+archive of files along with information about the package like its version, a
+description.  There is also a library permitting developers to manage such
+transactions from C or Python.")
+
+    ;; The whole is GPLv2+; librpm itself is dual-licensed LGPLv2+ | GPLv2+.
+    (license gpl2+)))
+
+(define-public diffoscope
+  (package
+    (name "diffoscope")
+    (version "51")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri name version))
+              (sha256
+               (base32
+                "18rn6rrwh586228vnaf1nq0wayh19zbvfc0qmnbys6ln2pv2v007"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  ;; setup.py mistakenly requires python-magic from PyPi, even
+                  ;; though the Python bindings of `file` are sufficient.
+                  ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=815844
+                  (add-after 'unpack 'dependency-on-python-magic
+                    (lambda _
+                      (substitute* "setup.py"
+                        (("'python-magic',") ""))))
+                  (add-before 'build 'disable-egg-zipping
+                    (lambda _
+                      ;; Leave the .egg file uncompressed.
+                      (let ((port (open-file "setup.cfg" "a")))
+                        (display "\n[easy_install]\nzip_ok = 0\n"
+                                 port)
+                        (close-port port)
+                        #t))))))
+    (inputs `(("rpm" ,rpm)                        ;for rpm-python
+              ("python-file" ,python-file)
+              ("python-debian" ,python-debian)
+              ("python-libarchive-c" ,python-libarchive-c)
+              ("python-tlsh" ,python-tlsh)
+
+              ;; Below are modules used for tests.
+              ("python-pytest" ,python-pytest)
+              ("python-chardet" ,python-chardet)))
+    (home-page "http://diffoscope.org/")
+    (synopsis "Compare files, archives, and directories in depth")
+    (description
+     "Diffoscope tries to get to the bottom of what makes files or directories
+different.  It recursively unpacks archives of many kinds and transforms
+various binary formats into more human readable forms to compare them.  It can
+compare two tarballs, ISO images, or PDFs just as easily.")
+    (license gpl3+)))