;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès ;;; Copyright © 2015, 2017 Ricardo Wurmus ;;; Copyright © 2017 Muriithi Frederick Muriuki ;;; Copyright © 2017, 2018 Oleg Pykhalov ;;; Copyright © 2017 Roel Janssen ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice ;;; Copyright © 2018 Julien Lepiller ;;; Copyright © 2018 Rutger Helling ;;; Copyright © 2018 Sou Bunnbu ;;; Copyright © 2018 Eric Bavier ;;; ;;; 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 . (define-module (gnu packages package-management) #:use-module (gnu packages) #:use-module (gnu packages acl) #:use-module (gnu packages attr) #:use-module (gnu packages avahi) #:use-module (gnu packages autotools) #:use-module (gnu packages backup) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages bison) #:use-module (gnu packages bootstrap) ;for 'bootstrap-guile-origin' #:use-module (gnu packages check) #:use-module (gnu packages compression) #:use-module (gnu packages cpio) #:use-module (gnu packages crypto) #:use-module (gnu packages curl) #:use-module (gnu packages databases) #:use-module (gnu packages docbook) #:use-module (gnu packages emacs) #:use-module (gnu packages file) #:use-module (gnu packages gettext) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) #:use-module (gnu packages gnupg) #:use-module (gnu packages gnuzilla) #:use-module (gnu packages graphviz) #:use-module (gnu packages gtk) #:use-module (gnu packages guile) #:use-module (gnu packages linux) #:use-module (gnu packages lisp) #:use-module (gnu packages man) #:use-module (gnu packages nettle) #:use-module (gnu packages patchutils) #:use-module (gnu packages perl) #:use-module (gnu packages perl-check) #:use-module (gnu packages pkg-config) #:use-module (gnu packages popt) #:use-module (gnu packages python) #:use-module (gnu packages python-web) #:use-module (gnu packages serialization) #:use-module (gnu packages ssh) #:use-module (gnu packages texinfo) #:use-module (gnu packages time) #:use-module (gnu packages tls) #:use-module (gnu packages vim) #:use-module (gnu packages virtualization) #:use-module (gnu packages web) #:use-module (gnu packages xml) #:use-module (gnu packages xorg) #:use-module (guix build-system emacs) #:use-module (guix build-system gnu) #:use-module (guix build-system meson) #:use-module (guix build-system python) #:use-module (guix download) #:use-module (guix gexp) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) #:use-module (ice-9 match) #:use-module (srfi srfi-1)) (define (boot-guile-uri arch) "Return the URI for the bootstrap Guile tarball for ARCH." (cond ((string=? "armhf" arch) (string-append "http://alpha.gnu.org/gnu/guix/bootstrap/" arch "-linux" "/20150101/guile-2.0.11.tar.xz")) ((string=? "aarch64" arch) (string-append "http://alpha.gnu.org/gnu/guix/bootstrap/" arch "-linux/20170217/guile-2.0.14.tar.xz")) (else (string-append "http://alpha.gnu.org/gnu/guix/bootstrap/" arch "-linux" "/20131110/guile-2.0.9.tar.xz")))) (define-public guix ;; Latest version of Guix, which may or may not correspond to a release. ;; Note: the 'update-guix-package.scm' script expects this definition to ;; start precisely like this. (let ((version "0.16.0") (commit "7ba2b27467a39956f10e2e11061d9569e4b7d632") (revision 8)) (package (name "guix") (version (if (zero? revision) version (string-append version "-" (number->string revision) "." (string-take commit 7)))) (source (origin (method git-fetch) (uri (git-reference (url "https://git.savannah.gnu.org/r/guix.git") (commit commit))) (sha256 (base32 "14srgkl0vyr6q7azv76nncp63gngmm71y18ybyj9f6l6s4shbcm4")) (file-name (string-append "guix-" version "-checkout")))) (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")) ;; 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.) "ac_cv_path_DOT_USER_PROGRAM=dot" ;; To avoid problems with the length of shebangs, ;; choose a fixed-width and short directory name ;; for tests. "ac_cv_guix_test_root=/tmp/guix-tests") #:parallel-tests? #f ;work around #:modules ((guix build gnu-build-system) (guix build utils) (srfi srfi-26) (ice-9 popen) (ice-9 rdelim)) #:phases (modify-phases %standard-phases (replace 'bootstrap (lambda _ ;; Make sure 'msgmerge' can modify the PO files. (for-each (lambda (po) (chmod po #o666)) (find-files "." "\\.po$")) (patch-shebang "build-aux/git-version-gen") (call-with-output-file ".tarball-version" (lambda (port) (display ,version port))) (invoke "sh" "bootstrap"))) (add-before 'check 'copy-bootstrap-guile (lambda* (#:key system inputs #:allow-other-keys) ;; Copy the bootstrap guile tarball in the store used ;; by the test suite. (define (intern tarball) (let ((base (strip-store-file-name tarball))) (copy-file tarball base) (invoke "./test-env" "guix" "download" (string-append "file://" (getcwd) "/" base)) (delete-file base))) (intern (assoc-ref inputs "boot-guile")) ;; On x86_64 some tests need the i686 Guile. ,@(if (and (not (%current-target-system)) (string=? (%current-system) "x86_64-linux")) '((intern (assoc-ref inputs "boot-guile/i686"))) '()) #t)) (add-after 'unpack 'disable-failing-tests ;; XXX FIXME: These tests fail within the build container. (lambda _ (substitute* "tests/syscalls.scm" (("^\\(test-(assert|equal) \"(clone|setns|pivot-root)\"" all) (string-append "(test-skip 1)\n" all))) (substitute* "tests/containers.scm" (("^\\(test-(assert|equal)" 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, ;; Guile-JSON, and Guile-Git automatically. (let* ((out (assoc-ref outputs "out")) (guile (assoc-ref inputs "guile")) (gcrypt (assoc-ref inputs "guile-gcrypt")) (json (assoc-ref inputs "guile-json")) (sqlite (assoc-ref inputs "guile-sqlite3")) (git (assoc-ref inputs "guile-git")) (bs (assoc-ref inputs "guile-bytestructures")) (ssh (assoc-ref inputs "guile-ssh")) (gnutls (assoc-ref inputs "gnutls")) (deps (list gcrypt json sqlite gnutls git bs ssh)) (effective (read-line (open-pipe* OPEN_READ (string-append guile "/bin/guile") "-c" "(display (effective-version))"))) (path (string-join (map (cut string-append <> "/share/guile/site/" effective) (delete #f deps)) ":")) (gopath (string-join (map (cut string-append <> "/lib/guile/" effective "/site-ccache") (delete #f deps)) ":"))) (wrap-program (string-append out "/bin/guix") `("GUILE_LOAD_PATH" ":" prefix (,path)) `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,gopath))) #t)))))) (native-inputs `(("pkg-config" ,pkg-config) ;; XXX: Keep the development inputs here even though ;; they're unnecessary, just so that 'guix environment ;; guix' always contains them. ("autoconf" ,autoconf-wrapper) ("automake" ,automake) ("gettext" ,gettext-minimal) ("texinfo" ,texinfo) ("graphviz" ,graphviz) ("help2man" ,help2man) ("po4a" ,po4a))) (inputs `(("bzip2" ,bzip2) ("gzip" ,gzip) ("zlib" ,zlib) ;for 'guix publish' ("sqlite" ,sqlite) ("libgcrypt" ,libgcrypt) ("guile" ,guile-2.2) ;; Many tests rely on the 'guile-bootstrap' package, which is why we ;; have it here. ("boot-guile" ,(bootstrap-guile-origin (%current-system))) ;; Some of the tests use "unshare" when it is available. ("util-linux" ,util-linux) ,@(if (and (not (%current-target-system)) (string=? (%current-system) "x86_64-linux")) `(("boot-guile/i686" ,(bootstrap-guile-origin "i686-linux"))) '()))) (propagated-inputs `(("gnutls" ,gnutls) ("guile-gcrypt" ,guile-gcrypt) ("guile-json" ,guile-json) ("guile-sqlite3" ,guile-sqlite3) ("guile-ssh" ,guile-ssh) ("guile-git" ,guile-git))) (home-page "https://www.gnu.org/software/guix/") (synopsis "Functional package manager for installed software packages and versions") (description "GNU Guix is a functional package manager for the GNU system, and is 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 license:gpl3+) (properties '((ftp-server . "alpha.gnu.org")))))) ;; Alias for backward compatibility. (define-public guix-devel guix) (define-public guix-daemon ;; This package is for internal consumption: it allows us to quickly build ;; the 'guix-daemon' program and use that in (guix self), used by 'guix ;; pull'. (package (inherit guix) (properties `((hidden? . #t))) (name "guix-daemon") ;; Use a minimum set of dependencies. (native-inputs (fold alist-delete (package-native-inputs guix) '("po4a" "graphviz" "help2man"))) (inputs `(("gnutls" ,gnutls) ("guile-git" ,guile-git) ("guile-json" ,guile-json) ("guile-gcrypt" ,guile-gcrypt) ,@(fold alist-delete (package-inputs guix) '("boot-guile" "boot-guile/i686" "util-linux")))) (propagated-inputs '()) (arguments (substitute-keyword-arguments (package-arguments guix) ((#:configure-flags flags '()) ;; Pretend we have those libraries; we don't actually need them. `(append ,flags '("guix_cv_have_recent_guile_sqlite3=yes" "guix_cv_have_recent_guile_ssh=yes"))) ((#:tests? #f #f) #f) ((#:phases phases '%standard-phases) `(modify-phases ,phases (replace 'build (lambda _ (invoke "make" "nix/libstore/schema.sql.hh") (invoke "make" "-j" (number->string (parallel-job-count)) "guix-daemon"))) (delete 'copy-bootstrap-guile) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (invoke "make" "install-binPROGRAMS" "install-nodist_pkglibexecSCRIPTS") ;; We need to tell 'guix-daemon' which 'guix' command to use. ;; Here we use a questionable hack where we hard-code root's ;; current guix, which could be wrong (XXX). Note that scripts ;; like 'guix perform-download' do not run as root so we assume ;; that they have access to /var/guix/profiles/per-user/root. (let ((out (assoc-ref outputs "out"))) (substitute* (find-files (string-append out "/libexec")) (("exec \".*/bin/guix\"") "exec /var/guix/profiles/per-user/root/current-guix/bin/guix")) #t))) (delete 'wrap-program))))))) (define-public guile2.0-guix (package (inherit guix) (name "guile2.0-guix") (inputs `(("guile" ,guile-2.0) ,@(alist-delete "guile" (package-inputs guix)))) (propagated-inputs `(("gnutls" ,gnutls/guile-2.0) ("guile-gcrypt" ,guile2.0-gcrypt) ("guile-json" ,guile2.0-json) ("guile-sqlite3" ,guile2.0-sqlite3) ("guile-ssh" ,guile2.0-ssh) ("guile-git" ,guile2.0-git))))) (define-public guix-minimal ;; A version of Guix which is built with the minimal set of dependencies, as ;; outlined in the README "Requirements" section. Intended as a CI job, so ;; marked as hidden. (let ((guix guile2.0-guix)) (hidden-package (package (inherit guix) (name "guix-minimal") (inputs `(("guile" ,guile-2.0.13) ,@(alist-delete "guile" (package-inputs guix)))) (propagated-inputs (fold alist-delete (package-propagated-inputs guix) '("guile-ssh"))))))) (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-public current-guix (let* ((repository-root (canonicalize-path (string-append (current-source-directory) "/../.."))) (select? (delay (or (git-predicate repository-root) 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 repository-root "guix-current" #:recursive? #t #:select? (force select?))))))) ;;; ;;; Other tools. ;;; (define-public nix (package (name "nix") (version "2.0.4") (source (origin (method url-fetch) (uri (string-append "http://nixos.org/releases/nix/nix-" version "/nix-" version ".tar.xz")) (sha256 (base32 "0ss9svxlh1pvrdmnqjvjyqjmbqmrdbyfarvbb14i9d4bggzl0r8n")))) (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("curl" ,curl) ("bzip2" ,bzip2) ("libgc" ,libgc) ("libseccomp" ,libseccomp) ("libsodium" ,libsodium) ("openssl" ,openssl) ("sqlite" ,sqlite) ("xz" ,xz))) (home-page "https://nixos.org/nix/") (synopsis "The Nix package manager") (description "Nix is a purely functional package manager. This means that it treats packages like values in purely functional programming languages such as Haskell—they are built by functions that don't have side-effects, and they never change after they have been built. Nix stores packages in the Nix store, usually the directory /nix/store, where each package has its own unique sub-directory.") (license license:lgpl2.1+))) (define-public emacs-nix-mode (package (name "emacs-nix-mode") (version "1.2.2") (source (origin (method url-fetch) (uri (string-append "https://github.com/NixOS/nix-mode/archive/v" version ".tar.gz")) (fi2016-08-09gnu: bash-completion: Update to 2.3. Update the patch....* gnu/packages/bash.scm (bash-completion): Update to 2.3. * gnu/packages/patches/bash-completion-directories.patch: New version of the patch for the same purpose. Tomáš Čech 2016-08-09