Merge branch 'master' into core-updates
This commit is contained in:
commit
35995769b5
|
@ -203,6 +203,7 @@ SCM_TESTS = \
|
|||
tests/lint.scm \
|
||||
tests/publish.scm \
|
||||
tests/size.scm \
|
||||
tests/file-systems.scm \
|
||||
tests/containers.scm
|
||||
|
||||
if HAVE_GUILE_JSON
|
||||
|
|
|
@ -760,6 +760,7 @@ explicitly enable substitution @i{via} the @code{set-build-options}
|
|||
remote procedure call (@pxref{The Store}).
|
||||
|
||||
@item --substitute-urls=@var{urls}
|
||||
@anchor{daemon-substitute-urls}
|
||||
Consider @var{urls} the default whitespace-separated list of substitute
|
||||
source URLs. When this option is omitted, @indicateurl{http://hydra.gnu.org}
|
||||
is used.
|
||||
|
@ -1434,9 +1435,12 @@ also result from derivation builds, can be available as substitutes.
|
|||
The @code{hydra.gnu.org} server is a front-end to a build farm that
|
||||
builds packages from the GNU distribution continuously for some
|
||||
architectures, and makes them available as substitutes. This is the
|
||||
default source of substitutes; it can be overridden by passing
|
||||
@command{guix-daemon} the @code{--substitute-urls} option
|
||||
(@pxref{Invoking guix-daemon}).
|
||||
default source of substitutes; it can be overridden by passing the
|
||||
@option{--substitute-urls} option either to @command{guix-daemon}
|
||||
(@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}})
|
||||
or to client tools such as @command{guix package}
|
||||
(@pxref{client-substitute-urls,, client @option{--substitute-urls}
|
||||
option}).
|
||||
|
||||
@cindex security
|
||||
@cindex digital signatures
|
||||
|
@ -3584,6 +3588,16 @@ Do not build the derivations.
|
|||
When substituting a pre-built binary fails, fall back to building
|
||||
packages locally.
|
||||
|
||||
@item --substitute-urls=@var{urls}
|
||||
@anchor{client-substitute-urls}
|
||||
Consider @var{urls} the whitespace-separated list of substitute source
|
||||
URLs, overriding the default list of URLs of @command{guix-daemon}
|
||||
(@pxref{daemon-substitute-urls,, @command{guix-daemon} URLs}).
|
||||
|
||||
This means that substitutes may be downloaded from @var{urls}, provided
|
||||
they are signed by a key authorized by the system administrator
|
||||
(@pxref{Substitutes}).
|
||||
|
||||
@item --no-substitutes
|
||||
Do not use substitutes for build products. That is, always build things
|
||||
locally instead of allowing downloads of pre-built binaries
|
||||
|
@ -4949,8 +4963,24 @@ interpreted as a file name; when it is @code{label}, then @code{device}
|
|||
is interpreted as a partition label name; when it is @code{uuid},
|
||||
@code{device} is interpreted as a partition unique identifier (UUID).
|
||||
|
||||
UUIDs may be converted from their string representation (as shown by the
|
||||
@command{tune2fs -l} command) using the @code{uuid} form, like this:
|
||||
|
||||
@example
|
||||
(file-system
|
||||
(mount-point "/home")
|
||||
(type "ext4")
|
||||
(title 'uuid)
|
||||
(device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
|
||||
@end example
|
||||
|
||||
The @code{label} and @code{uuid} options offer a way to refer to disk
|
||||
partitions without having to hard-code their actual device name.
|
||||
partitions without having to hard-code their actual device
|
||||
name@footnote{Note that, while it is tempting to use
|
||||
@file{/dev/disk/by-uuid} and similar device names to achieve the same
|
||||
result, this is not recommended: These special device nodes are created
|
||||
by the udev daemon and may be unavailable at the time the device is
|
||||
mounted.}.
|
||||
|
||||
However, when a file system's source is a mapped device (@pxref{Mapped
|
||||
Devices}), its @code{device} field @emph{must} refer to the mapped
|
||||
|
|
|
@ -42,19 +42,40 @@ If PROFILE is nil, use `guix-user-profile'."
|
|||
(expand-file-name "share/emacs/site-lisp"
|
||||
(or profile guix-user-profile)))
|
||||
|
||||
(defun guix-emacs-find-autoloads-in-directory (directory)
|
||||
"Return list of Emacs 'autoloads' files in DIRECTORY."
|
||||
(directory-files directory 'full-name "-autoloads\\.el\\'" 'no-sort))
|
||||
|
||||
(defun guix-emacs-subdirs (directory)
|
||||
"Return list of DIRECTORY subdirectories."
|
||||
(cl-remove-if (lambda (file)
|
||||
(or (string-match-p (rx "/." string-end) file)
|
||||
(string-match-p (rx "/.." string-end) file)
|
||||
(not (file-directory-p file))))
|
||||
(directory-files directory 'full-name nil 'no-sort)))
|
||||
|
||||
(defun guix-emacs-find-autoloads (&optional profile)
|
||||
"Return list of autoloads of Emacs packages installed in PROFILE.
|
||||
If PROFILE is nil, use `guix-user-profile'.
|
||||
Return nil if there are no emacs packages installed in PROFILE."
|
||||
(let ((dir (guix-emacs-directory profile)))
|
||||
(if (file-directory-p dir)
|
||||
(directory-files dir 'full-name "-autoloads\\.el\\'")
|
||||
(let ((elisp-root-dir (guix-emacs-directory profile)))
|
||||
(if (file-directory-p elisp-root-dir)
|
||||
(let ((elisp-pkgs-dir (expand-file-name "guix.d" elisp-root-dir))
|
||||
(root-autoloads (guix-emacs-find-autoloads-in-directory
|
||||
elisp-root-dir)))
|
||||
(if (file-directory-p elisp-pkgs-dir)
|
||||
(let ((pkgs-autoloads
|
||||
(cl-mapcan #'guix-emacs-find-autoloads-in-directory
|
||||
(guix-emacs-subdirs elisp-pkgs-dir))))
|
||||
(append root-autoloads pkgs-autoloads))
|
||||
root-autoloads))
|
||||
(message "Directory '%s' does not exist." dir)
|
||||
nil)))
|
||||
|
||||
;;;###autoload
|
||||
(defun guix-emacs-load-autoloads (&optional all)
|
||||
"Load autoloads for Emacs packages installed in a user profile.
|
||||
Add autoloads directories to `load-path'.
|
||||
If ALL is nil, activate only those packages that were installed
|
||||
after the last activation, otherwise activate all Emacs packages
|
||||
installed in `guix-user-profile'."
|
||||
|
@ -65,6 +86,8 @@ installed in `guix-user-profile'."
|
|||
(cl-nset-difference autoloads guix-emacs-autoloads
|
||||
:test #'string=))))
|
||||
(dolist (file files)
|
||||
(cl-pushnew (file-name-directory file) load-path
|
||||
:test #'string=)
|
||||
(load file 'noerror))
|
||||
(setq guix-emacs-autoloads autoloads)))
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
;;; guix-info.el --- Info buffers for displaying entries -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright © 2014 Alex Kost <alezost@gmail.com>
|
||||
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
|
||||
;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
;; This file is part of GNU Guix.
|
||||
|
||||
|
@ -482,6 +483,12 @@ If nil, insert package in a default way.")
|
|||
(defvar guix-package-info-heading-params '(synopsis description)
|
||||
"List of parameters displayed in a heading along with name and version.")
|
||||
|
||||
(defcustom guix-package-info-fill-heading t
|
||||
"If nil, insert heading parameters in a raw form, without
|
||||
filling them to fit the window."
|
||||
:type 'boolean
|
||||
:group 'guix-package-info)
|
||||
|
||||
(defun guix-package-info-insert-heading (entry)
|
||||
"Insert the heading for package ENTRY.
|
||||
Show package name, version, and `guix-package-info-heading-params'."
|
||||
|
@ -494,8 +501,12 @@ Show package name, version, and `guix-package-info-heading-params'."
|
|||
(face (guix-get-symbol (symbol-name param)
|
||||
'info 'package)))
|
||||
(when val
|
||||
(guix-format-insert val (and (facep face) face))
|
||||
(insert "\n\n"))))
|
||||
(let* ((col (min (window-width) fill-column))
|
||||
(val (if guix-package-info-fill-heading
|
||||
(guix-get-filled-string val col)
|
||||
val)))
|
||||
(guix-format-insert val (and (facep face) face))
|
||||
(insert "\n\n")))))
|
||||
guix-package-info-heading-params))
|
||||
|
||||
(defun guix-package-info-insert-with-heading (entry)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
(require 'guix-autoloads)
|
||||
(require 'guix-emacs)
|
||||
|
||||
(defvar guix-load-path
|
||||
(replace-regexp-in-string "${prefix}" "@prefix@" "@emacsuidir@")
|
||||
|
@ -13,9 +12,8 @@ avoid loading autoloads of Emacs packages installed in
|
|||
:type 'boolean
|
||||
:group 'guix)
|
||||
|
||||
(add-to-list 'load-path (guix-emacs-directory))
|
||||
|
||||
(when guix-package-enable-at-startup
|
||||
(require 'guix-emacs)
|
||||
(guix-emacs-load-autoloads 'all))
|
||||
|
||||
(provide 'guix-init)
|
||||
|
|
|
@ -86,6 +86,7 @@ GNU_SYSTEM_MODULES = \
|
|||
gnu/packages/dns.scm \
|
||||
gnu/packages/docbook.scm \
|
||||
gnu/packages/doxygen.scm \
|
||||
gnu/packages/dunst.scm \
|
||||
gnu/packages/ebook.scm \
|
||||
gnu/packages/ed.scm \
|
||||
gnu/packages/elf.scm \
|
||||
|
@ -256,6 +257,7 @@ GNU_SYSTEM_MODULES = \
|
|||
gnu/packages/qemu.scm \
|
||||
gnu/packages/qt.scm \
|
||||
gnu/packages/ratpoison.scm \
|
||||
gnu/packages/rc.scm \
|
||||
gnu/packages/rdesktop.scm \
|
||||
gnu/packages/rdf.scm \
|
||||
gnu/packages/readline.scm \
|
||||
|
@ -272,6 +274,7 @@ GNU_SYSTEM_MODULES = \
|
|||
gnu/packages/search.scm \
|
||||
gnu/packages/serveez.scm \
|
||||
gnu/packages/shishi.scm \
|
||||
gnu/packages/skarnet.scm \
|
||||
gnu/packages/skribilo.scm \
|
||||
gnu/packages/slang.scm \
|
||||
gnu/packages/slim.scm \
|
||||
|
@ -391,6 +394,7 @@ dist_patch_DATA = \
|
|||
gnu/packages/patches/binutils-ld-new-dtags.patch \
|
||||
gnu/packages/patches/binutils-loongson-workaround.patch \
|
||||
gnu/packages/patches/bitlbee-configure-doc-fix.patch \
|
||||
gnu/packages/patches/boost-mips-avoid-m32.patch \
|
||||
gnu/packages/patches/calibre-drop-unrar.patch \
|
||||
gnu/packages/patches/calibre-no-updates-dialog.patch \
|
||||
gnu/packages/patches/cdparanoia-fpic.patch \
|
||||
|
|
|
@ -22,13 +22,16 @@
|
|||
#:use-module (rnrs bytevectors)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 rdelim)
|
||||
#:use-module (ice-9 format)
|
||||
#:use-module (system foreign)
|
||||
#:autoload (system repl repl) (start-repl)
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-26)
|
||||
#:export (disk-partitions
|
||||
partition-label-predicate
|
||||
partition-uuid-predicate
|
||||
find-partition-by-label
|
||||
find-partition-by-uuid
|
||||
canonicalize-device-spec
|
||||
|
||||
MS_RDONLY
|
||||
|
@ -53,9 +56,10 @@
|
|||
;; 'mount' is already defined in the statically linked Guile used for initial
|
||||
;; RAM disks, but in all other cases the (guix build syscalls) module contains
|
||||
;; the mount binding.
|
||||
(unless (defined? 'mount)
|
||||
(module-use! (current-module)
|
||||
(resolve-interface '(guix build syscalls))))
|
||||
(eval-when (expand load eval)
|
||||
(unless (defined? 'mount)
|
||||
(module-use! (current-module)
|
||||
(resolve-interface '(guix build syscalls)))))
|
||||
|
||||
;; Linux mount flags, from libc's <sys/mount.h>.
|
||||
(define MS_RDONLY 1)
|
||||
|
@ -158,29 +162,42 @@ if DEVICE does not contain an ext2 file system."
|
|||
(loop (cons name parts))
|
||||
(loop parts))))))))))
|
||||
|
||||
(define (partition-label-predicate label)
|
||||
"Return a procedure that, when applied to a partition name such as \"sda1\",
|
||||
return #t if that partition's volume name is LABEL."
|
||||
(lambda (part)
|
||||
(let* ((device (string-append "/dev/" part))
|
||||
(sblock (catch 'system-error
|
||||
(lambda ()
|
||||
(read-ext2-superblock device))
|
||||
(lambda args
|
||||
;; When running on the hand-made /dev,
|
||||
;; 'disk-partitions' could return partitions for which
|
||||
;; we have no /dev node. Handle that gracefully.
|
||||
(if (= ENOENT (system-error-errno args))
|
||||
(begin
|
||||
(format (current-error-port)
|
||||
"warning: device '~a' not found~%"
|
||||
device)
|
||||
#f)
|
||||
(apply throw args))))))
|
||||
(and sblock
|
||||
(let ((volume (ext2-superblock-volume-name sblock)))
|
||||
(and volume
|
||||
(string=? volume label)))))))
|
||||
(define (read-ext2-superblock* device)
|
||||
"Like 'read-ext2-superblock', but return #f when DEVICE does not exist
|
||||
instead of throwing an exception."
|
||||
(catch 'system-error
|
||||
(lambda ()
|
||||
(read-ext2-superblock device))
|
||||
(lambda args
|
||||
;; When running on the hand-made /dev,
|
||||
;; 'disk-partitions' could return partitions for which
|
||||
;; we have no /dev node. Handle that gracefully.
|
||||
(if (= ENOENT (system-error-errno args))
|
||||
(begin
|
||||
(format (current-error-port)
|
||||
"warning: device '~a' not found~%" device)
|
||||
#f)
|
||||
(apply throw args)))))
|
||||
|
||||
(define (partition-predicate field =)
|
||||
"Return a predicate that returns true if the FIELD of an ext2 superblock is
|
||||
= to the given value."
|
||||
(lambda (expected)
|
||||
"Return a procedure that, when applied to a partition name such as \"sda1\",
|
||||
returns #t if that partition's volume name is LABEL."
|
||||
(lambda (part)
|
||||
(let* ((device (string-append "/dev/" part))
|
||||
(sblock (read-ext2-superblock* device)))
|
||||
(and sblock
|
||||
(let ((actual (field sblock)))
|
||||
(and actual
|
||||
(= actual expected))))))))
|
||||
|
||||
(define partition-label-predicate
|
||||
(partition-predicate ext2-superblock-volume-name string=?))
|
||||
|
||||
(define partition-uuid-predicate
|
||||
(partition-predicate ext2-superblock-uuid bytevector=?))
|
||||
|
||||
(define (find-partition-by-label label)
|
||||
"Return the first partition found whose volume name is LABEL, or #f if none
|
||||
|
@ -189,6 +206,28 @@ were found."
|
|||
(disk-partitions))
|
||||
(cut string-append "/dev/" <>)))
|
||||
|
||||
(define (find-partition-by-uuid uuid)
|
||||
"Return the first partition whose unique identifier is UUID (a bytevector),
|
||||
or #f if none was found."
|
||||
(and=> (find (partition-uuid-predicate uuid)
|
||||
(disk-partitions))
|
||||
(cut string-append "/dev/" <>)))
|
||||
|
||||
(define-syntax %network-byte-order
|
||||
(identifier-syntax (endianness big)))
|
||||
|
||||
(define (uuid->string uuid)
|
||||
"Convert UUID, a 16-byte bytevector, to its string representation, something
|
||||
like \"6b700d61-5550-48a1-874c-a3d86998990e\"."
|
||||
;; See <https://tools.ietf.org/html/rfc4122>.
|
||||
(let ((time-low (bytevector-uint-ref uuid 0 %network-byte-order 4))
|
||||
(time-mid (bytevector-uint-ref uuid 4 %network-byte-order 2))
|
||||
(time-hi (bytevector-uint-ref uuid 6 %network-byte-order 2))
|
||||
(clock-seq (bytevector-uint-ref uuid 8 %network-byte-order 2))
|
||||
(node (bytevector-uint-ref uuid 10 %network-byte-order 6)))
|
||||
(format #f "~8,'0x-~4,'0x-~4,'0x-~4,'0x-~12,'0x"
|
||||
time-low time-mid time-hi clock-seq node)))
|
||||
|
||||
(define* (canonicalize-device-spec spec #:optional (title 'any))
|
||||
"Return the device name corresponding to SPEC. TITLE is a symbol, one of
|
||||
the following:
|
||||
|
@ -197,6 +236,8 @@ the following:
|
|||
\"/dev/sda1\";
|
||||
• 'label', in which case SPEC is known to designate a partition label--e.g.,
|
||||
\"my-root-part\";
|
||||
• 'uuid', in which case SPEC must be a UUID (a 16-byte bytevector)
|
||||
designating a partition;
|
||||
• 'any', in which case SPEC can be anything.
|
||||
"
|
||||
(define max-trials
|
||||
|
@ -209,30 +250,36 @@ the following:
|
|||
(define canonical-title
|
||||
;; The realm of canonicalization.
|
||||
(if (eq? title 'any)
|
||||
(if (string-prefix? "/" spec)
|
||||
'device
|
||||
'label)
|
||||
(if (string? spec)
|
||||
(if (string-prefix? "/" spec)
|
||||
'device
|
||||
'label)
|
||||
'uuid)
|
||||
title))
|
||||
|
||||
(define (resolve find-partition spec fmt)
|
||||
(let loop ((count 0))
|
||||
(let ((device (find-partition spec)))
|
||||
(or device
|
||||
;; Some devices take a bit of time to appear, most notably USB
|
||||
;; storage devices. Thus, wait for the device to appear.
|
||||
(if (> count max-trials)
|
||||
(error "failed to resolve partition" (fmt spec))
|
||||
(begin
|
||||
(format #t "waiting for partition '~a' to appear...~%"
|
||||
(fmt spec))
|
||||
(sleep 1)
|
||||
(loop (+ 1 count))))))))
|
||||
|
||||
(case canonical-title
|
||||
((device)
|
||||
;; Nothing to do.
|
||||
spec)
|
||||
((label)
|
||||
;; Resolve the label.
|
||||
(let loop ((count 0))
|
||||
(let ((device (find-partition-by-label spec)))
|
||||
(or device
|
||||
;; Some devices take a bit of time to appear, most notably USB
|
||||
;; storage devices. Thus, wait for the device to appear.
|
||||
(if (> count max-trials)
|
||||
(error "failed to resolve partition label" spec)
|
||||
(begin
|
||||
(format #t "waiting for partition '~a' to appear...~%"
|
||||
spec)
|
||||
(sleep 1)
|
||||
(loop (+ 1 count))))))))
|
||||
;; TODO: Add support for UUIDs.
|
||||
(resolve find-partition-by-label spec identity))
|
||||
((uuid)
|
||||
(resolve find-partition-by-uuid spec uuid->string))
|
||||
(else
|
||||
(error "unknown device title" title))))
|
||||
|
||||
|
|
|
@ -480,7 +480,8 @@ tools: server, client, and relay agent.")
|
|||
"14wyjywrdi1ikaj6yc9c72m6m2r64z94lb0gm7k1a3q6q5cj3scs"))))
|
||||
(build-system gnu-build-system)
|
||||
(native-inputs `(("bison" ,bison) ("flex" ,flex)))
|
||||
(arguments '(#:tests? #f)) ; no 'check' target
|
||||
(arguments '(#:configure-flags '("--with-pcap=linux")
|
||||
#:tests? #f)) ; no 'check' target
|
||||
(home-page "http://www.tcpdump.org")
|
||||
(synopsis "Network packet capture library")
|
||||
(description
|
||||
|
|
|
@ -383,7 +383,7 @@ cosine/ sine transforms or DCT/DST).")
|
|||
(lambda _
|
||||
;; First build the tests, in parallel.
|
||||
;; See <http://eigen.tuxfamily.org/index.php?title=Tests>.
|
||||
(let* ((cores (current-processor-count))
|
||||
(let* ((cores (parallel-job-count))
|
||||
(dash-j (format #f "-j~a" cores)))
|
||||
;; These variables are supposed to be honored.
|
||||
(setenv "EIGEN_MAKE_ARGS" dash-j)
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
(define-public boost
|
||||
(package
|
||||
(name "boost")
|
||||
(version "1.57.0")
|
||||
(version "1.58.0")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
|
@ -42,7 +42,8 @@
|
|||
".tar.bz2"))
|
||||
(sha256
|
||||
(base32
|
||||
"0rs94vdmg34bwwj23fllva6mhrml2i7mvmlb11zyrk1k5818q34i"))))
|
||||
"1rfkqxns60171q62cppiyzj8pmsbwp1l8jd7p6crriryqd7j1z7x"))
|
||||
(patches (list (search-patch "boost-mips-avoid-m32.patch")))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs `(("zlib" ,zlib)))
|
||||
(native-inputs
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
|
||||
;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -28,7 +28,7 @@
|
|||
(define-public ccache
|
||||
(package
|
||||
(name "ccache")
|
||||
(version "3.1.10")
|
||||
(version "3.2.2")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
|
@ -36,16 +36,18 @@
|
|||
version ".tar.xz"))
|
||||
(sha256
|
||||
(base32
|
||||
"0mr8n1nbykxw4rs55ad8wd6xmfhihn09mxpxb91sn9mlsd1ryhw8"))))
|
||||
"1jm0qb3h5sypllaiyj81zp6m009vm50hzjnx994ril94kxlrj3ag"))))
|
||||
(build-system gnu-build-system)
|
||||
(native-inputs `(("perl" ,perl))) ;for test.sh
|
||||
(inputs `(("zlib" ,zlib)))
|
||||
(arguments
|
||||
'(#:phases (alist-cons-before
|
||||
'check 'patch-test-shebangs
|
||||
'check 'setup-tests
|
||||
(lambda _
|
||||
(substitute* '("test/test_hashutil.c" "test.sh")
|
||||
(("#!/bin/sh") (string-append "#!" (which "sh")))))
|
||||
(("#!/bin/sh") (string-append "#!" (which "sh"))))
|
||||
(setenv "SHELL" (which "sh"))
|
||||
#t)
|
||||
%standard-phases)))
|
||||
(home-page "https://ccache.samba.org/")
|
||||
(synopsis "Compiler cache")
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2015 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define-module (gnu packages dunst)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix download)
|
||||
#:use-module (guix build-system gnu)
|
||||
#:use-module ((guix licenses) #:prefix license:)
|
||||
#:use-module (gnu packages base)
|
||||
#:use-module (gnu packages freedesktop)
|
||||
#:use-module (gnu packages glib)
|
||||
#:use-module (gnu packages gtk)
|
||||
#:use-module (gnu packages perl)
|
||||
#:use-module (gnu packages pkg-config)
|
||||
#:use-module (gnu packages xorg))
|
||||
|
||||
(define-public dunst
|
||||
(package
|
||||
(name "dunst")
|
||||
(version "1.1.0")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
"http://knopwob.org/public/dunst-release/dunst-"
|
||||
version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32
|
||||
"0w3hilzwanwsp4q6dxbdj6l0mvpg4fq02wf8isll8kmbx9kz2ay7"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
'(#:tests? #f ; no check target
|
||||
#:make-flags (list "CC=gcc"
|
||||
(string-append "PREFIX=" %output))
|
||||
#:phases (modify-phases %standard-phases
|
||||
(delete 'configure))))
|
||||
(native-inputs
|
||||
`(("pkg-config" ,pkg-config)
|
||||
("perl" ,perl) ; for pod2man
|
||||
("which" ,which)))
|
||||
(inputs
|
||||
`(("dbus" ,dbus)
|
||||
("glib" ,glib)
|
||||
("cairo" ,cairo)
|
||||
("pango" ,pango)
|
||||
("libx11" ,libx11)
|
||||
("libxext" ,libxext)
|
||||
("libxft" ,libxft)
|
||||
("libxscrnsaver" ,libxscrnsaver)
|
||||
("libxinerama" ,libxinerama)
|
||||
("libxdg-basedir" ,libxdg-basedir)))
|
||||
(home-page "http://knopwob.org/dunst")
|
||||
(synopsis "Customizable and lightweight notification daemon")
|
||||
(description
|
||||
"Dunst is a highly configurable and minimalistic notification daemon.
|
||||
It provides 'org.freedesktop.Notifications' D-Bus service, so it is
|
||||
started automatically on the first call via D-Bus.")
|
||||
(license license:bsd-3)))
|
|
@ -91,6 +91,39 @@ freedesktop.org project.")
|
|||
other applications that need to directly deal with input devices.")
|
||||
(license license:x11)))
|
||||
|
||||
(define-public libxdg-basedir
|
||||
(package
|
||||
(name "libxdg-basedir")
|
||||
(version "1.2.0")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
"https://github.com/devnev/libxdg-basedir/archive/"
|
||||
name "-" version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"0s28c7sfwqimsmb3kn91mx7wi55fs3flhbmynl9k60rrllr00aqw"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
'(#:phases
|
||||
(modify-phases %standard-phases
|
||||
(add-after 'unpack 'autogen
|
||||
(lambda _
|
||||
;; Run 'configure' in its own phase, not now.
|
||||
(substitute* "autogen.sh"
|
||||
(("^.*\\./configure.*") ""))
|
||||
(zero? (system* "sh" "autogen.sh")))))))
|
||||
(native-inputs
|
||||
`(("autoconf" ,autoconf)
|
||||
("automake" ,automake)
|
||||
("libtool" ,libtool)))
|
||||
(home-page "https://github.com/devnev/libxdg-basedir")
|
||||
(synopsis "Implementation of the XDG Base Directory specification")
|
||||
(description
|
||||
"libxdg-basedir is a C library providing some functions to use with
|
||||
the freedesktop.org XDG Base Directory specification.")
|
||||
(license license:expat)))
|
||||
|
||||
(define-public elogind
|
||||
(let ((commit "14405a9"))
|
||||
(package
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
#:use-module (gnu packages compression)
|
||||
#:use-module (gnu packages multiprecision)
|
||||
#:use-module (gnu packages texinfo)
|
||||
#:use-module (gnu packages doxygen)
|
||||
#:use-module (gnu packages xml)
|
||||
#:use-module (gnu packages docbook)
|
||||
#:use-module (gnu packages graphviz)
|
||||
#:use-module (gnu packages elf)
|
||||
#:use-module (gnu packages perl)
|
||||
#:use-module (guix packages)
|
||||
|
@ -544,6 +548,65 @@ using compilers other than GCC."
|
|||
(define-public gcc-objc++-4.8
|
||||
(custom-gcc gcc-4.8 "gcc-objc++" '("obj-c++")))
|
||||
|
||||
(define (make-libstdc++-doc gcc)
|
||||
"Return a package with the libstdc++ documentation for GCC."
|
||||
(package
|
||||
(inherit gcc)
|
||||
(name "libstdc++-doc")
|
||||
(version (package-version gcc))
|
||||
(synopsis "GNU libstdc++ documentation")
|
||||
(outputs '("out"))
|
||||
(native-inputs `(("doxygen" ,doxygen)
|
||||
("texinfo" ,texinfo)
|
||||
("libxml2" ,libxml2)
|
||||
("libxslt" ,libxslt)
|
||||
("docbook-xml" ,docbook-xml)
|
||||
("docbook-xsl" ,docbook-xsl)
|
||||
("graphviz" ,graphviz))) ;for 'dot', invoked by 'doxygen'
|
||||
(inputs '())
|
||||
(propagated-inputs '())
|
||||
(arguments
|
||||
'(#:out-of-source? #t
|
||||
#:tests? #f ;it's just documentation
|
||||
#:phases (modify-phases %standard-phases
|
||||
(add-before 'configure 'chdir
|
||||
(lambda _
|
||||
(chdir "libstdc++-v3")))
|
||||
(add-before 'configure 'set-xsl-directory
|
||||
(lambda* (#:key inputs #:allow-other-keys)
|
||||
(let ((docbook (assoc-ref inputs "docbook-xsl")))
|
||||
(substitute* (find-files "doc"
|
||||
"^Makefile\\.in$")
|
||||
(("@XSL_STYLE_DIR@")
|
||||
(string-append
|
||||
docbook "/xml/xsl/"
|
||||
(string-drop
|
||||
docbook
|
||||
(+ 34
|
||||
(string-length
|
||||
(%store-directory))))))))))
|
||||
(replace 'build
|
||||
(lambda _
|
||||
;; XXX: There's also a 'doc-info' target, but it
|
||||
;; relies on docbook2X, which itself relies on
|
||||
;; DocBook 4.1.2, which is not really usable
|
||||
;; (lacks a catalog.xml.)
|
||||
(zero? (system* "make"
|
||||
"doc-html"
|
||||
"doc-man"))))
|
||||
(replace 'install
|
||||
(lambda* (#:key outputs #:allow-other-keys)
|
||||
(let ((out (assoc-ref outputs "out")))
|
||||
(zero? (system* "make"
|
||||
"doc-install-html"
|
||||
"doc-install-man"))))))))))
|
||||
|
||||
(define-public libstdc++-doc-4.9
|
||||
(make-libstdc++-doc gcc-4.9))
|
||||
|
||||
(define-public libstdc++-doc-5.1
|
||||
(make-libstdc++-doc gcc-5.1))
|
||||
|
||||
(define-public isl
|
||||
(package
|
||||
(name "isl")
|
||||
|
|
|
@ -2090,11 +2090,12 @@ floating in an ocean using only your brain and a little bit of luck.")
|
|||
("desktop-file-utils" ,desktop-file-utils)
|
||||
("intltool" ,intltool)
|
||||
("itstool" ,itstool)))
|
||||
(propagated-inputs
|
||||
`(("dconf" ,dconf)))
|
||||
(inputs
|
||||
`(("gtk+" ,gtk+)
|
||||
("vte" ,vte)
|
||||
("gnutls" ,gnutls)
|
||||
("dconf" ,dconf)
|
||||
("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
|
||||
("util-linux" ,util-linux)
|
||||
("vala" ,vala)))
|
||||
|
@ -2914,3 +2915,89 @@ which can read a large number of file formats.")
|
|||
;; to be used and distributed together with GStreamer and Totem. See
|
||||
;; file://COPYING in the source distribution for details.
|
||||
(license license:gpl2+)))
|
||||
|
||||
(define-public rhythmbox
|
||||
(package
|
||||
(name "rhythmbox")
|
||||
(version "3.2.1")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "mirror://gnome/sources/" name "/"
|
||||
(version-major+minor version) "/"
|
||||
name "-" version ".tar.xz"))
|
||||
(sha256
|
||||
(base32
|
||||
"0f3radhlji7rxl760yl2vm49fvfslympxrpm8497acbmbd7wlhxz"))))
|
||||
(build-system glib-or-gtk-build-system)
|
||||
(arguments
|
||||
`(#:configure-flags
|
||||
(list "--enable-lirc"
|
||||
"--enable-python"
|
||||
"--enable-vala"
|
||||
"--with-brasero"
|
||||
"--with-gudev"
|
||||
"--with-libsecret")
|
||||
#:phases
|
||||
(modify-phases %standard-phases
|
||||
(add-after
|
||||
'install 'wrap-rhythmbox
|
||||
(lambda* (#:key inputs outputs #:allow-other-keys)
|
||||
(let ((out (assoc-ref outputs "out"))
|
||||
(gi-typelib-path (getenv "GI_TYPELIB_PATH"))
|
||||
(gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH"))
|
||||
(grl-plugin-path (getenv "GRL_PLUGIN_PATH")))
|
||||
(wrap-program (string-append out "/bin/rhythmbox")
|
||||
`("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path))
|
||||
`("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path))
|
||||
`("GRL_PLUGIN_PATH" ":" prefix (,grl-plugin-path))))
|
||||
#t)))))
|
||||
(propagated-inputs
|
||||
`(("dconf" ,dconf)))
|
||||
(native-inputs
|
||||
`(("intltool" ,intltool)
|
||||
("glib" ,glib "bin")
|
||||
("gobject-introspection" ,gobject-introspection)
|
||||
("desktop-file-utils" ,desktop-file-utils)
|
||||
("pkg-config" ,pkg-config)))
|
||||
(inputs
|
||||
`(("json-glib" ,json-glib)
|
||||
("tdb" ,tdb)
|
||||
("gnome-desktop" ,gnome-desktop)
|
||||
("python" ,python)
|
||||
("python-pygobject" ,python2-pygobject)
|
||||
("vala" ,vala)
|
||||
("gmime" ,gmime)
|
||||
("nettle" ,nettle)
|
||||
("itstool" ,itstool)
|
||||
("adwaita-icon-theme" ,adwaita-icon-theme)
|
||||
("grilo" ,grilo)
|
||||
("grilo-plugins" ,grilo-plugins)
|
||||
("gstreamer" ,gstreamer)
|
||||
("gst-plugins-base" ,gst-plugins-base)
|
||||
("gst-plugins-good" ,gst-plugins-good)
|
||||
("eudev" ,eudev)
|
||||
("totem-pl-parser" ,totem-pl-parser)
|
||||
;;("libmtp" ,libmtp) FIXME: Not detected
|
||||
("libsecret" ,libsecret)
|
||||
("libsoup" ,libsoup)
|
||||
("libnotify" ,libnotify)
|
||||
("libpeas" ,libpeas)
|
||||
("lirc" ,lirc)
|
||||
;; TODO: clutter* only used by visualizer plugin, which also requires mx
|
||||
;;("clutter" ,clutter)
|
||||
;;("clutter-gtk" ,clutter-gtk)
|
||||
;;("clutter-gst" ,clutter-gst)
|
||||
("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
|
||||
("atk" ,atk)
|
||||
("pango" ,pango)
|
||||
("gtk+" ,gtk+)
|
||||
;; TODO:
|
||||
;; * libgpod
|
||||
;; * mx
|
||||
;; * webkit
|
||||
("brasero" ,brasero)))
|
||||
(home-page "https://wiki.gnome.org/Apps/Rhythmbox")
|
||||
(synopsis "Music player for GNOME")
|
||||
(description "Rhythmbox is a music playing application for GNOME. It
|
||||
supports playlists, song ratings, and any codecs installed through gstreamer.")
|
||||
(license license:gpl2+)))
|
||||
|
|
|
@ -210,7 +210,7 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
|
|||
#f)))
|
||||
|
||||
(define-public linux-libre
|
||||
(let* ((version "4.1.1")
|
||||
(let* ((version "4.1.2")
|
||||
(build-phase
|
||||
'(lambda* (#:key system inputs #:allow-other-keys #:rest args)
|
||||
;; Apply the neat patch.
|
||||
|
@ -283,7 +283,7 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
|
|||
(uri (linux-libre-urls version))
|
||||
(sha256
|
||||
(base32
|
||||
"12fdrawzjqhlmjvw79iy9419pf7m3k29xcjri57i4ynaf3yfzkk0"))))
|
||||
"0clgjpcw1xzqa7jpm6k5fafg3wnc28mzyar3xgr4vbm6zb61fl7k"))))
|
||||
(build-system gnu-build-system)
|
||||
(native-inputs `(("perl" ,perl)
|
||||
("bc" ,bc)
|
||||
|
|
|
@ -424,7 +424,14 @@ Editor. It is compatible with Power Tab Editor 1.7 and Guitar Pro.")
|
|||
(list (string-append "PREFIX=" (assoc-ref %outputs "out"))
|
||||
(string-append "FONTFILE="
|
||||
(assoc-ref %build-inputs "font-bitstream-vera")
|
||||
"/share/fonts/truetype/VeraBd.ttf"))
|
||||
"/share/fonts/truetype/VeraBd.ttf")
|
||||
;; Disable unsupported optimization flags on non-x86
|
||||
,@(let ((system (or (%current-target-system)
|
||||
(%current-system))))
|
||||
(if (or (string-prefix? "x86_64" system)
|
||||
(string-prefix? "i686" system))
|
||||
'()
|
||||
'("OPTIMIZATIONS=-ffast-math -fomit-frame-pointer -O3"))))
|
||||
#:phases
|
||||
(modify-phases %standard-phases
|
||||
(add-before 'build 'set-CC-variable
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#:use-module (gnu packages linux)
|
||||
#:use-module (gnu packages pkg-config)
|
||||
#:use-module (gnu packages tls)
|
||||
#:use-module (gnu packages libevent)
|
||||
#:use-module ((guix licenses) #:prefix l:)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix utils)
|
||||
|
@ -34,7 +35,7 @@
|
|||
(define-public ntp
|
||||
(package
|
||||
(name "ntp")
|
||||
(version "4.2.8p2")
|
||||
(version "4.2.8p3")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
|
@ -43,17 +44,39 @@
|
|||
"/ntp-" version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"0ccv9kh5asxpk7bjn73vwrqimbkbfl743bgx0km47bfajl7bqs8d"))))
|
||||
"13zkzcvjm5kbxl4xbcmaq07slplhmpkgahzcqnqlba3cxpra9341"))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
;; Remove the bundled copy of libevent, but we must keep
|
||||
;; sntp/libevent/build-aux since configure.ac contains
|
||||
;; AC_CONFIG_AUX_DIR([sntp/libevent/build-aux])
|
||||
(rename-file "sntp/libevent/build-aux"
|
||||
"sntp/libevent:build-aux")
|
||||
(delete-file-recursively "sntp/libevent")
|
||||
(mkdir "sntp/libevent")
|
||||
(rename-file "sntp/libevent:build-aux"
|
||||
"sntp/libevent/build-aux")
|
||||
#t))))
|
||||
(native-inputs `(("which" ,which)
|
||||
("pkg-config" ,pkg-config)))
|
||||
(inputs
|
||||
`(("openssl" ,openssl)
|
||||
("libevent" ,libevent)
|
||||
;; Build with POSIX capabilities support on GNU/Linux. This allows 'ntpd'
|
||||
;; to run as non-root (when invoked with '-u'.)
|
||||
,@(if (string-suffix? "-linux"
|
||||
(or (%current-target-system) (%current-system)))
|
||||
`(("libcap" ,libcap))
|
||||
'())))
|
||||
(arguments
|
||||
`(#:phases
|
||||
(modify-phases %standard-phases
|
||||
(add-after 'unpack 'disable-network-test
|
||||
(lambda _
|
||||
(substitute* "tests/libntp/Makefile.in"
|
||||
(("test-decodenetnum\\$\\(EXEEXT\\) ") ""))
|
||||
#t)))))
|
||||
(build-system gnu-build-system)
|
||||
(synopsis "Real time clock synchonization system")
|
||||
(description "NTP is a system designed to synchronize the clocks of
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
The following patch prevents the use of the -m32 flag on mips, where it
|
||||
is not understood by gcc, as well as other non-x86 architectures.
|
||||
|
||||
diff -u -r boost_1_58_0.orig/tools/build/src/tools/gcc.jam boost_1_58_0/tools/build/src/tools/gcc.jam
|
||||
--- boost_1_58_0.orig/tools/build/src/tools/gcc.jam 2015-04-04 19:25:07.000000000 +0200
|
||||
+++ boost_1_58_0/tools/build/src/tools/gcc.jam 2015-07-10 01:08:19.822733823 +0200
|
||||
@@ -451,7 +451,7 @@
|
||||
else
|
||||
{
|
||||
local arch = [ feature.get-values architecture : $(properties) ] ;
|
||||
- if $(arch) != arm
|
||||
+ if $(arch) = x86
|
||||
{
|
||||
if $(model) = 32
|
||||
{
|
|
@ -35,7 +35,7 @@
|
|||
(define-public polkit
|
||||
(package
|
||||
(name "polkit")
|
||||
(version "0.112")
|
||||
(version "0.113")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
|
@ -43,7 +43,7 @@
|
|||
name "-" version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"1xkary7yirdcjdva950nqyhmsz48qhrdsr78zciahj27p8yg95fn"))
|
||||
"109w86kfqrgz83g9ivggplmgc77rz8kx8646izvm2jb57h4rbh71"))
|
||||
(patches (list (search-patch "polkit-drop-test.patch")))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs
|
||||
|
|
|
@ -30,15 +30,15 @@
|
|||
(define-public pumpa
|
||||
(package
|
||||
(name "pumpa")
|
||||
(version "0.9")
|
||||
(version "0.9.1")
|
||||
(source (origin
|
||||
(method git-fetch) ; no source tarballs
|
||||
(uri (git-reference
|
||||
(url "https://gitorious.org/pumpa/pumpa.git")
|
||||
(url "git://pumpa.branchable.com/")
|
||||
(commit (string-append "v" version))))
|
||||
(sha256
|
||||
(base32
|
||||
"0v55xq17wnc9mvpmrm5r3rjrsg9npnjv1lznbz8ppk77ba8pwimy"))))
|
||||
"14s0m46yqph8bs5rjpmiq42f020j9l3mygan2zj93z6qzypwd07f"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
'(#:phases (alist-replace
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2015 Jeff Mickey <j@codemac.net>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
||||
;;; under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||
;;; your option) any later version.
|
||||
;;;
|
||||
;;; GNU Guix is distributed in the hope that it will be useful, but
|
||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define-module (gnu packages rc)
|
||||
#:use-module (gnu packages autotools)
|
||||
#:use-module (gnu packages perl)
|
||||
#:use-module (gnu packages pkg-config)
|
||||
#:use-module (gnu packages readline)
|
||||
#:use-module (guix build-system gnu)
|
||||
#:use-module (guix git-download)
|
||||
#:use-module (guix licenses)
|
||||
#:use-module (guix packages))
|
||||
|
||||
(define-public rc
|
||||
(package
|
||||
(name "rc")
|
||||
(version "1.7.4")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "git://github.com/rakitzis/rc.git")
|
||||
;; commit name 'release: rc-1.7.4'
|
||||
(commit "c884da53a7c885d46ace2b92de78946855b18e92")))
|
||||
(sha256
|
||||
(base32
|
||||
"00mgzvrrh9w96xa85g4gjbsvq02f08k4jwjcdnxq7kyh5xgiw95l"))
|
||||
(file-name (string-append name "-" version "-checkout"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
`(#:configure-flags
|
||||
'("--with-edit=gnu")
|
||||
#:phases
|
||||
(modify-phases %standard-phases
|
||||
(add-after
|
||||
'unpack 'autoreconf
|
||||
(lambda _ (zero? (system* "autoreconf" "-vfi"))))
|
||||
(add-before
|
||||
'autoreconf 'patch-trip.rc
|
||||
(lambda _
|
||||
(substitute* "trip.rc"
|
||||
(("/bin/pwd") (which "pwd"))
|
||||
(("/bin/sh") (which "sh"))
|
||||
(("/bin/rm") (which "rm"))
|
||||
(("/bin\\)") (string-append (dirname (which "rm")) ")")))
|
||||
#t)))))
|
||||
(inputs `(("readline" ,readline)
|
||||
("perl" ,perl)))
|
||||
(native-inputs `(("autoconf" ,autoconf)
|
||||
("automake" ,automake)
|
||||
("libtool" ,libtool)
|
||||
("pkg-config" ,pkg-config)))
|
||||
(synopsis "Alternative implementation of the rc shell by Byron Rakitzis")
|
||||
(description
|
||||
"This is a reimplementation by Byron Rakitzis of the Plan 9 shell. It
|
||||
has a small feature set similar to a traditional Bourne shell.")
|
||||
(home-page "http://github.com/rakitzis/rc")
|
||||
(license zlib)))
|
|
@ -0,0 +1,92 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2015 Claes Wallin <claes.wallin@greatsinodevelopment.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 GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define-module (gnu packages skarnet)
|
||||
#:use-module (gnu packages)
|
||||
#:use-module (guix licenses)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix download)
|
||||
#:use-module (guix build-system gnu))
|
||||
|
||||
(define-public skalibs
|
||||
(package
|
||||
(name "skalibs")
|
||||
(version "2.3.5.1")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "http://skarnet.org/software/skalibs/skalibs-"
|
||||
version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"1m31wph4qr4mqgv51nzwd9nw0x5vmpkcxr48i216wn3dpy3mvxwy"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
'(#:configure-flags '("--enable-force-devr") ; do not analyze /dev/random
|
||||
#:tests? #f)) ; no tests exist
|
||||
(home-page "http://skarnet.org/software/skalibs/")
|
||||
(synopsis "Platform abstraction libraries for skarnet.org software")
|
||||
(description
|
||||
"This package provides lightweight C libraries isolating the developer
|
||||
from portability issues, providing a unified systems API on all platforms,
|
||||
including primitive data types, cryptography, and POSIX concepts like sockets
|
||||
and file system operations. It is used by all skarnet.org software.")
|
||||
(license isc)))
|
||||
|
||||
(define-public execline
|
||||
(package
|
||||
(name "execline")
|
||||
(version "2.1.2.2")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "http://skarnet.org/software/execline/execline-"
|
||||
version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"01pckac5zijf6icrhwicbmq92yq68gfkf1yl03rr2v4q3cn8r85f"))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs `(("skalibs" ,skalibs)))
|
||||
(arguments
|
||||
'(#:configure-flags (list
|
||||
(string-append "--with-lib="
|
||||
(assoc-ref %build-inputs "skalibs")
|
||||
"/lib/skalibs")
|
||||
(string-append "--with-sysdeps="
|
||||
(assoc-ref %build-inputs "skalibs")
|
||||
"/lib/skalibs/sysdeps"))
|
||||
#:phases (modify-phases %standard-phases
|
||||
(add-after
|
||||
'install 'post-install
|
||||
(lambda* (#:key inputs outputs #:allow-other-keys)
|
||||
(let* ((out (assoc-ref outputs "out"))
|
||||
(bin (string-append out "/bin")))
|
||||
(wrap-program (string-append bin "/execlineb")
|
||||
`("PATH" ":" prefix (,bin)))))))
|
||||
#:tests? #f)) ; No tests exist.
|
||||
(home-page "http://skarnet.org/software/execline/")
|
||||
(license isc)
|
||||
(synopsis "Non-interactive shell-like language with minimal overhead")
|
||||
(description
|
||||
"Execline is a (non-interactive) scripting language, separated into a
|
||||
parser (execlineb) and a set of commands meant to execute one another in a
|
||||
chain-execution fashion, storing the whole script in the argument array.
|
||||
It features conditional loops, getopt-style option handling, file name
|
||||
globbing, redirection and other shell concepts, expressed as discrete commands
|
||||
rather than in special syntax, minimizing runtime footprint and
|
||||
complexity.")))
|
|
@ -122,16 +122,18 @@ a server that supports the SSH-2 protocol.")
|
|||
(define-public openssh
|
||||
(package
|
||||
(name "openssh")
|
||||
(version "6.8p1")
|
||||
(version "6.9p1")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (let ((tail (string-append name "-" version ".tar.gz")))
|
||||
(list (string-append "ftp://ftp.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
|
||||
(list (string-append "http://openbsd.cs.fau.de/pub/OpenBSD/OpenSSH/portable/"
|
||||
tail)
|
||||
(string-append "ftp://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
|
||||
(string-append "http://ftp.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
|
||||
tail)
|
||||
(string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
|
||||
tail))))
|
||||
(sha256 (base32
|
||||
"03hnrqvjq6ghg1mp3gkarfxh6g3x1n1vjrzpbc5lh9717vklrxiz"))))
|
||||
"1zkci5nbpb4frmzj2vr3kv9j47x2h72kvybcpr0d8mzk73sls1vf"))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs `(("groff" ,groff)
|
||||
("openssl" ,openssl)
|
||||
|
|
|
@ -18,9 +18,13 @@
|
|||
|
||||
(define-module (gnu system file-systems)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 regex)
|
||||
#:use-module (guix gexp)
|
||||
#:use-module (guix records)
|
||||
#:use-module (guix store)
|
||||
#:use-module (rnrs bytevectors)
|
||||
#:use-module ((gnu build file-systems) #:select (uuid->string))
|
||||
#:re-export (uuid->string)
|
||||
#:export (<file-system>
|
||||
file-system
|
||||
file-system?
|
||||
|
@ -35,6 +39,8 @@
|
|||
file-system-create-mount-point?
|
||||
|
||||
file-system->spec
|
||||
string->uuid
|
||||
uuid
|
||||
|
||||
%fuse-control-file-system
|
||||
%binary-format-file-system
|
||||
|
@ -106,6 +112,57 @@ initrd code."
|
|||
(($ <file-system> device title mount-point type flags options _ check?)
|
||||
(list device title mount-point type flags options check?))))
|
||||
|
||||
(define %uuid-rx
|
||||
;; The regexp of a UUID.
|
||||
(make-regexp "^([[:xdigit:]]{8})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{12})$"))
|
||||
|
||||
(define (string->uuid str)
|
||||
"Parse STR as a DCE UUID (see <https://tools.ietf.org/html/rfc4122>) and
|
||||
return its contents as a 16-byte bytevector. Return #f if STR is not a valid
|
||||
UUID representation."
|
||||
(and=> (regexp-exec %uuid-rx str)
|
||||
(lambda (match)
|
||||
(letrec-syntax ((hex->number
|
||||
(syntax-rules ()
|
||||
((_ index)
|
||||
(string->number (match:substring match index)
|
||||
16))))
|
||||
(put!
|
||||
(syntax-rules ()
|
||||
((_ bv index (number len) rest ...)
|
||||
(begin
|
||||
(bytevector-uint-set! bv index number
|
||||
(endianness big) len)
|
||||
(put! bv (+ index len) rest ...)))
|
||||
((_ bv index)
|
||||
bv))))
|
||||
(let ((time-low (hex->number 1))
|
||||
(time-mid (hex->number 2))
|
||||
(time-hi (hex->number 3))
|
||||
(clock-seq (hex->number 4))
|
||||
(node (hex->number 5))
|
||||
(uuid (make-bytevector 16)))
|
||||
(put! uuid 0
|
||||
(time-low 4) (time-mid 2) (time-hi 2)
|
||||
(clock-seq 2) (node 6)))))))
|
||||
|
||||
(define-syntax uuid
|
||||
(lambda (s)
|
||||
"Return the bytevector corresponding to the given UUID representation."
|
||||
(syntax-case s ()
|
||||
((_ str)
|
||||
(string? (syntax->datum #'str))
|
||||
;; A literal string: do the conversion at expansion time.
|
||||
(with-syntax ((bv (string->uuid (syntax->datum #'str))))
|
||||
#''bv))
|
||||
((_ str)
|
||||
#'(string->uuid str)))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Common file systems.
|
||||
;;;
|
||||
|
||||
(define %fuse-control-file-system
|
||||
;; Control file system for Linux' file systems in user-space (FUSE).
|
||||
(file-system
|
||||
|
@ -208,7 +265,7 @@ initrd code."
|
|||
;; https://github.com/docker/libcontainer/blob/master/SPEC.md#filesystem
|
||||
(define %container-file-systems
|
||||
(list
|
||||
;; Psuedo-terminal file system.
|
||||
;; Pseudo-terminal file system.
|
||||
(file-system
|
||||
(device "none")
|
||||
(mount-point "/dev/pts")
|
||||
|
|
|
@ -342,7 +342,7 @@ Use Alt-F2 for documentation.
|
|||
parted ddrescue
|
||||
grub ;mostly so xrefs to its manual work
|
||||
cryptsetup
|
||||
wireless-tools iw wpa-supplicant-light
|
||||
wireless-tools iw wpa-supplicant-light iproute
|
||||
;; XXX: We used to have GNU fdisk here, but as of version
|
||||
;; 2.0.0a, that pulls Guile 1.8, which takes unreasonable
|
||||
;; space; furthermore util-linux's fdisk is already
|
||||
|
|
|
@ -117,6 +117,9 @@ options handled by 'set-build-options-from-command-line', and listed in
|
|||
--fallback fall back to building when the substituter fails"))
|
||||
(display (_ "
|
||||
--no-substitutes build instead of resorting to pre-built substitutes"))
|
||||
(display (_ "
|
||||
--substitute-urls=URLS
|
||||
fetch substitute from URLS if they are authorized"))
|
||||
(display (_ "
|
||||
--no-build-hook do not attempt to offload builds via the build hook"))
|
||||
(display (_ "
|
||||
|
@ -141,6 +144,8 @@ options handled by 'set-build-options-from-command-line', and listed in
|
|||
#:max-build-jobs (or (assoc-ref opts 'max-jobs) 1)
|
||||
#:fallback? (assoc-ref opts 'fallback?)
|
||||
#:use-substitutes? (assoc-ref opts 'substitutes?)
|
||||
#:substitute-urls (or (assoc-ref opts 'substitute-urls)
|
||||
%default-substitute-urls)
|
||||
#:use-build-hook? (assoc-ref opts 'build-hook?)
|
||||
#:max-silent-time (assoc-ref opts 'max-silent-time)
|
||||
#:timeout (assoc-ref opts 'timeout)
|
||||
|
@ -177,6 +182,13 @@ options handled by 'set-build-options-from-command-line', and listed in
|
|||
(alist-cons 'substitutes? #f
|
||||
(alist-delete 'substitutes? result))
|
||||
rest)))
|
||||
(option '("substitute-urls") #t #f
|
||||
(lambda (opt name arg result . rest)
|
||||
(apply values
|
||||
(alist-cons 'substitute-urls
|
||||
(string-tokenize arg)
|
||||
(alist-delete 'substitute-urls result))
|
||||
rest)))
|
||||
(option '("no-build-hook") #f #f
|
||||
(lambda (opt name arg result . rest)
|
||||
(apply values
|
||||
|
|
|
@ -34,8 +34,6 @@
|
|||
#:use-module (ice-9 regex)
|
||||
#:use-module (ice-9 format)
|
||||
#:use-module (web uri)
|
||||
#:use-module (srfi srfi-34)
|
||||
#:use-module (srfi srfi-35)
|
||||
#:use-module ((guix build download)
|
||||
#:select (maybe-expand-mirrors
|
||||
open-connection-for-uri))
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#:use-module (guix records)
|
||||
#:use-module (guix serialization)
|
||||
#:use-module (guix hash)
|
||||
#:use-module (guix base32)
|
||||
#:use-module (guix base64)
|
||||
#:use-module (guix pk-crypto)
|
||||
#:use-module (guix pki)
|
||||
|
@ -184,37 +185,29 @@ to the caller without emitting an error message."
|
|||
(setvbuf port _IONBF)))
|
||||
(http-fetch uri #:text? #f #:port port))))))))
|
||||
|
||||
(define-record-type <cache>
|
||||
(%make-cache url store-directory wants-mass-query?)
|
||||
cache?
|
||||
(url cache-url)
|
||||
(store-directory cache-store-directory)
|
||||
(wants-mass-query? cache-wants-mass-query?))
|
||||
(define-record-type <cache-info>
|
||||
(%make-cache-info url store-directory wants-mass-query?)
|
||||
cache-info?
|
||||
(url cache-info-url)
|
||||
(store-directory cache-info-store-directory)
|
||||
(wants-mass-query? cache-info-wants-mass-query?))
|
||||
|
||||
(define (open-cache url)
|
||||
"Open the binary cache at URL. Return a <cache> object on success, or #f on
|
||||
failure."
|
||||
(define (download-cache-info url)
|
||||
(define (download-cache-info url)
|
||||
"Download the information for the cache at URL. Return a <cache-info>
|
||||
object on success, or #f on failure."
|
||||
(define (download url)
|
||||
;; Download the `nix-cache-info' from URL, and return its contents as an
|
||||
;; list of key/value pairs.
|
||||
(and=> (false-if-exception (fetch (string->uri url)))
|
||||
fields->alist))
|
||||
|
||||
(and=> (download-cache-info (string-append url "/nix-cache-info"))
|
||||
(and=> (download (string-append url "/nix-cache-info"))
|
||||
(lambda (properties)
|
||||
(alist->record properties
|
||||
(cut %make-cache url <...>)
|
||||
(cut %make-cache-info url <...>)
|
||||
'("StoreDir" "WantMassQuery")))))
|
||||
|
||||
(define-syntax-rule (open-cache* url)
|
||||
"Delayed variant of 'open-cache' that also lets the user know that they're
|
||||
gonna have to wait."
|
||||
(delay (begin
|
||||
(format (current-error-port)
|
||||
(_ "updating list of substitutes from '~a'...\r")
|
||||
url)
|
||||
(open-cache url))))
|
||||
|
||||
|
||||
(define-record-type <narinfo>
|
||||
(%make-narinfo path uri uri-base compression file-hash file-size nar-hash nar-size
|
||||
references deriver system signature contents)
|
||||
|
@ -379,20 +372,23 @@ the cache STR originates form."
|
|||
(make-time time-monotonic 0 date)))
|
||||
|
||||
|
||||
(define (narinfo-cache-file path)
|
||||
"Return the name of the local file that contains an entry for PATH."
|
||||
(define (narinfo-cache-file cache-url path)
|
||||
"Return the name of the local file that contains an entry for PATH. The
|
||||
entry is stored in a sub-directory specific to CACHE-URL."
|
||||
(string-append %narinfo-cache-directory "/"
|
||||
(store-path-hash-part path)))
|
||||
(bytevector->base32-string (sha256 (string->utf8 cache-url)))
|
||||
"/" (store-path-hash-part path)))
|
||||
|
||||
(define (cached-narinfo path)
|
||||
"Check locally if we have valid info about PATH. Return two values: a
|
||||
Boolean indicating whether we have valid cached info, and that info, which may
|
||||
be either #f (when PATH is unavailable) or the narinfo for PATH."
|
||||
(define (cached-narinfo cache-url path)
|
||||
"Check locally if we have valid info about PATH coming from CACHE-URL.
|
||||
Return two values: a Boolean indicating whether we have valid cached info, and
|
||||
that info, which may be either #f (when PATH is unavailable) or the narinfo
|
||||
for PATH."
|
||||
(define now
|
||||
(current-time time-monotonic))
|
||||
|
||||
(define cache-file
|
||||
(narinfo-cache-file path))
|
||||
(narinfo-cache-file cache-url path))
|
||||
|
||||
(catch 'system-error
|
||||
(lambda ()
|
||||
|
@ -418,9 +414,9 @@ be either #f (when PATH is unavailable) or the narinfo for PATH."
|
|||
(lambda _
|
||||
(values #f #f))))
|
||||
|
||||
(define (cache-narinfo! cache path narinfo)
|
||||
"Cache locally NARNIFO for PATH, which originates from CACHE. NARINFO may
|
||||
be #f, in which case it indicates that PATH is unavailable at CACHE."
|
||||
(define (cache-narinfo! cache-url path narinfo)
|
||||
"Cache locally NARNIFO for PATH, which originates from CACHE-URL. NARINFO
|
||||
may be #f, in which case it indicates that PATH is unavailable at CACHE-URL."
|
||||
(define now
|
||||
(current-time time-monotonic))
|
||||
|
||||
|
@ -430,9 +426,12 @@ be #f, in which case it indicates that PATH is unavailable at CACHE."
|
|||
(date ,(time-second now))
|
||||
(value ,(and=> narinfo narinfo->string))))
|
||||
|
||||
(with-atomic-file-output (narinfo-cache-file path)
|
||||
(lambda (out)
|
||||
(write (cache-entry (cache-url cache) narinfo) out)))
|
||||
(let ((file (narinfo-cache-file cache-url path)))
|
||||
(mkdir-p (dirname file))
|
||||
(with-atomic-file-output file
|
||||
(lambda (out)
|
||||
(write (cache-entry cache-url narinfo) out))))
|
||||
|
||||
narinfo)
|
||||
|
||||
(define (narinfo-request cache-url path)
|
||||
|
@ -491,11 +490,8 @@ if file doesn't exist, and the narinfo otherwise."
|
|||
#f
|
||||
(apply throw args)))))
|
||||
|
||||
(define (fetch-narinfos cache paths)
|
||||
"Retrieve all the narinfos for PATHS from CACHE and return them."
|
||||
(define url
|
||||
(cache-url cache))
|
||||
|
||||
(define (fetch-narinfos url paths)
|
||||
"Retrieve all the narinfos for PATHS from the cache at URL and return them."
|
||||
(define update-progress!
|
||||
(let ((done 0))
|
||||
(lambda ()
|
||||
|
@ -513,7 +509,7 @@ if file doesn't exist, and the narinfo otherwise."
|
|||
(case (response-code response)
|
||||
((200) ; hit
|
||||
(let ((narinfo (read-narinfo port url #:size len)))
|
||||
(cache-narinfo! cache (narinfo-path narinfo) narinfo)
|
||||
(cache-narinfo! url (narinfo-path narinfo) narinfo)
|
||||
(update-progress!)
|
||||
narinfo))
|
||||
((404) ; failure
|
||||
|
@ -522,7 +518,7 @@ if file doesn't exist, and the narinfo otherwise."
|
|||
(if len
|
||||
(get-bytevector-n port len)
|
||||
(read-to-eof port))
|
||||
(cache-narinfo! cache
|
||||
(cache-narinfo! url
|
||||
(find (cut string-contains <> hash-part) paths)
|
||||
#f)
|
||||
(update-progress!))
|
||||
|
@ -533,7 +529,12 @@ if file doesn't exist, and the narinfo otherwise."
|
|||
(read-to-eof port))
|
||||
#f))))
|
||||
|
||||
(and (string=? (cache-store-directory cache) (%store-prefix))
|
||||
(define cache-info
|
||||
(download-cache-info url))
|
||||
|
||||
(and cache-info
|
||||
(string=? (cache-info-store-directory cache-info)
|
||||
(%store-prefix))
|
||||
(let ((uri (string->uri url)))
|
||||
(case (and=> uri uri-scheme)
|
||||
((http)
|
||||
|
@ -559,7 +560,7 @@ information is available locally."
|
|||
(let-values (((cached missing)
|
||||
(fold2 (lambda (path cached missing)
|
||||
(let-values (((valid? value)
|
||||
(cached-narinfo path)))
|
||||
(cached-narinfo cache path)))
|
||||
(if valid?
|
||||
(values (cons value cached) missing)
|
||||
(values cached (cons path missing)))))
|
||||
|
@ -568,11 +569,8 @@ information is available locally."
|
|||
paths)))
|
||||
(if (null? missing)
|
||||
cached
|
||||
(let* ((cache (force cache))
|
||||
(missing (if cache
|
||||
(fetch-narinfos cache missing)
|
||||
'())))
|
||||
(append cached missing)))))
|
||||
(let ((missing (fetch-narinfos cache missing)))
|
||||
(append cached (or missing '()))))))
|
||||
|
||||
(define (lookup-narinfo cache path)
|
||||
"Return the narinfo for PATH in CACHE, or #f when no substitute for PATH was
|
||||
|
@ -580,8 +578,8 @@ found."
|
|||
(match (lookup-narinfos cache (list path))
|
||||
((answer) answer)))
|
||||
|
||||
(define (remove-expired-cached-narinfos)
|
||||
"Remove expired narinfo entries from the cache. The sole purpose of this
|
||||
(define (remove-expired-cached-narinfos directory)
|
||||
"Remove expired narinfo entries from DIRECTORY. The sole purpose of this
|
||||
function is to make sure `%narinfo-cache-directory' doesn't grow
|
||||
indefinitely."
|
||||
(define now
|
||||
|
@ -605,16 +603,25 @@ indefinitely."
|
|||
#t)))
|
||||
|
||||
(for-each (lambda (file)
|
||||
(let ((file (string-append %narinfo-cache-directory
|
||||
"/" file)))
|
||||
(let ((file (string-append directory "/" file)))
|
||||
(when (expired? file)
|
||||
;; Wrap in `false-if-exception' because FILE might have been
|
||||
;; deleted in the meantime (TOCTTOU).
|
||||
(false-if-exception (delete-file file)))))
|
||||
(scandir %narinfo-cache-directory
|
||||
(scandir directory
|
||||
(lambda (file)
|
||||
(= (string-length file) 32)))))
|
||||
|
||||
(define (narinfo-cache-directories)
|
||||
"Return the list of narinfo cache directories (one per cache URL.)"
|
||||
(map (cut string-append %narinfo-cache-directory "/" <>)
|
||||
(scandir %narinfo-cache-directory
|
||||
(lambda (item)
|
||||
(and (not (member item '("." "..")))
|
||||
(file-is-directory?
|
||||
(string-append %narinfo-cache-directory
|
||||
"/" item)))))))
|
||||
|
||||
(define (maybe-remove-expired-cached-narinfo)
|
||||
"Remove expired narinfo entries from the cache if deemed necessary."
|
||||
(define now
|
||||
|
@ -628,8 +635,10 @@ indefinitely."
|
|||
(call-with-input-file expiry-file read))
|
||||
0))
|
||||
|
||||
(when (obsolete? last-expiry-date now %narinfo-expired-cache-entry-removal-delay)
|
||||
(remove-expired-cached-narinfos)
|
||||
(when (obsolete? last-expiry-date now
|
||||
%narinfo-expired-cache-entry-removal-delay)
|
||||
(for-each remove-expired-cached-narinfos
|
||||
(narinfo-cache-directories))
|
||||
(call-with-output-file expiry-file
|
||||
(cute write (time-second now) <>))))
|
||||
|
||||
|
@ -688,6 +697,95 @@ Internal tool to substitute a pre-built binary to a local build.\n"))
|
|||
(show-bug-report-information))
|
||||
|
||||
|
||||
|
||||
;;;
|
||||
;;; Daemon/substituter protocol.
|
||||
;;;
|
||||
|
||||
(define (display-narinfo-data narinfo)
|
||||
"Write to the current output port the contents of NARINFO is the format
|
||||
expected by the daemon."
|
||||
(format #t "~a\n~a\n~a\n"
|
||||
(narinfo-path narinfo)
|
||||
(or (and=> (narinfo-deriver narinfo)
|
||||
(cute string-append (%store-prefix) "/" <>))
|
||||
"")
|
||||
(length (narinfo-references narinfo)))
|
||||
(for-each (cute format #t "~a/~a~%" (%store-prefix) <>)
|
||||
(narinfo-references narinfo))
|
||||
(format #t "~a\n~a\n"
|
||||
(or (narinfo-file-size narinfo) 0)
|
||||
(or (narinfo-size narinfo) 0)))
|
||||
|
||||
(define* (process-query command
|
||||
#:key cache-url acl)
|
||||
"Reply to COMMAND, a query as written by the daemon to this process's
|
||||
standard input. Use ACL as the access-control list against which to check
|
||||
authorized substitutes."
|
||||
(define (valid? obj)
|
||||
(and (narinfo? obj) (valid-narinfo? obj acl)))
|
||||
|
||||
(match (string-tokenize command)
|
||||
(("have" paths ..1)
|
||||
;; Return the subset of PATHS available in CACHE-URL.
|
||||
(let ((substitutable (lookup-narinfos cache-url paths)))
|
||||
(for-each (lambda (narinfo)
|
||||
(format #t "~a~%" (narinfo-path narinfo)))
|
||||
(filter valid? substitutable))
|
||||
(newline)))
|
||||
(("info" paths ..1)
|
||||
;; Reply info about PATHS if it's in CACHE-URL.
|
||||
(let ((substitutable (lookup-narinfos cache-url paths)))
|
||||
(for-each display-narinfo-data (filter valid? substitutable))
|
||||
(newline)))
|
||||
(wtf
|
||||
(error "unknown `--query' command" wtf))))
|
||||
|
||||
(define* (process-substitution store-item destination
|
||||
#:key cache-url acl)
|
||||
"Substitute STORE-ITEM (a store file name) from CACHE-URL, and write it to
|
||||
DESTINATION as a nar file. Verify the substitute against ACL."
|
||||
(let* ((narinfo (lookup-narinfo cache-url store-item))
|
||||
(uri (narinfo-uri narinfo)))
|
||||
;; Make sure it is signed and everything.
|
||||
(assert-valid-narinfo narinfo acl)
|
||||
|
||||
;; Tell the daemon what the expected hash of the Nar itself is.
|
||||
(format #t "~a~%" (narinfo-hash narinfo))
|
||||
|
||||
(format (current-error-port) "downloading `~a'~:[~*~; (~,1f MiB installed)~]...~%"
|
||||
store-item
|
||||
|
||||
;; Use the Nar size as an estimate of the installed size.
|
||||
(narinfo-size narinfo)
|
||||
(and=> (narinfo-size narinfo)
|
||||
(cute / <> (expt 2. 20))))
|
||||
(let*-values (((raw download-size)
|
||||
;; Note that Hydra currently generates Nars on the fly
|
||||
;; and doesn't specify a Content-Length, so
|
||||
;; DOWNLOAD-SIZE is #f in practice.
|
||||
(fetch uri #:buffered? #f #:timeout? #f))
|
||||
((progress)
|
||||
(let* ((comp (narinfo-compression narinfo))
|
||||
(dl-size (or download-size
|
||||
(and (equal? comp "none")
|
||||
(narinfo-size narinfo))))
|
||||
(progress (progress-proc (uri-abbreviation uri)
|
||||
dl-size
|
||||
(current-error-port))))
|
||||
(progress-report-port progress raw)))
|
||||
((input pids)
|
||||
(decompressed-port (and=> (narinfo-compression narinfo)
|
||||
string->symbol)
|
||||
progress)))
|
||||
;; Unpack the Nar at INPUT into DESTINATION.
|
||||
(restore-file input destination)
|
||||
|
||||
;; Skip a line after what 'progress-proc' printed.
|
||||
(newline (current-error-port))
|
||||
|
||||
(every (compose zero? cdr waitpid) pids))))
|
||||
|
||||
|
||||
;;;
|
||||
;;; Entry point.
|
||||
|
@ -737,12 +835,15 @@ substitutes may be unavailable\n")))))
|
|||
found."
|
||||
(assoc-ref (daemon-options) option))
|
||||
|
||||
(define-syntax-rule (or* a b)
|
||||
(let ((first a))
|
||||
(if (or (not first) (string-null? first))
|
||||
b
|
||||
first)))
|
||||
|
||||
(define %cache-url
|
||||
(match (and=> ;; TODO: Uncomment the following lines when multiple
|
||||
;; substitute sources are supported.
|
||||
;; (find-daemon-option "untrusted-substitute-urls") ;client
|
||||
;; " "
|
||||
(find-daemon-option "substitute-urls") ;admin
|
||||
(match (and=> (or* (find-daemon-option "untrusted-substitute-urls") ;client
|
||||
(find-daemon-option "substitute-urls")) ;admin
|
||||
string-tokenize)
|
||||
((url)
|
||||
url)
|
||||
|
@ -788,94 +889,19 @@ substituter disabled~%")
|
|||
(with-error-handling ; for signature errors
|
||||
(match args
|
||||
(("--query")
|
||||
(let ((cache (open-cache* %cache-url))
|
||||
(acl (current-acl)))
|
||||
(define (valid? obj)
|
||||
(and (narinfo? obj) (valid-narinfo? obj acl)))
|
||||
|
||||
(let ((acl (current-acl)))
|
||||
(let loop ((command (read-line)))
|
||||
(or (eof-object? command)
|
||||
(begin
|
||||
(match (string-tokenize command)
|
||||
(("have" paths ..1)
|
||||
;; Return the subset of PATHS available in CACHE.
|
||||
(let ((substitutable
|
||||
(if cache
|
||||
(lookup-narinfos cache paths)
|
||||
'())))
|
||||
(for-each (lambda (narinfo)
|
||||
(format #t "~a~%" (narinfo-path narinfo)))
|
||||
(filter valid? substitutable))
|
||||
(newline)))
|
||||
(("info" paths ..1)
|
||||
;; Reply info about PATHS if it's in CACHE.
|
||||
(let ((substitutable
|
||||
(if cache
|
||||
(lookup-narinfos cache paths)
|
||||
'())))
|
||||
(for-each (lambda (narinfo)
|
||||
(format #t "~a\n~a\n~a\n"
|
||||
(narinfo-path narinfo)
|
||||
(or (and=> (narinfo-deriver narinfo)
|
||||
(cute string-append
|
||||
(%store-prefix) "/"
|
||||
<>))
|
||||
"")
|
||||
(length (narinfo-references narinfo)))
|
||||
(for-each (cute format #t "~a/~a~%"
|
||||
(%store-prefix) <>)
|
||||
(narinfo-references narinfo))
|
||||
(format #t "~a\n~a\n"
|
||||
(or (narinfo-file-size narinfo) 0)
|
||||
(or (narinfo-size narinfo) 0)))
|
||||
(filter valid? substitutable))
|
||||
(newline)))
|
||||
(wtf
|
||||
(error "unknown `--query' command" wtf)))
|
||||
(process-query command
|
||||
#:cache-url %cache-url
|
||||
#:acl acl)
|
||||
(loop (read-line)))))))
|
||||
(("--substitute" store-path destination)
|
||||
;; Download STORE-PATH and add store it as a Nar in file DESTINATION.
|
||||
(let* ((cache (open-cache* %cache-url))
|
||||
(narinfo (lookup-narinfo cache store-path))
|
||||
(uri (narinfo-uri narinfo)))
|
||||
;; Make sure it is signed and everything.
|
||||
(assert-valid-narinfo narinfo)
|
||||
|
||||
;; Tell the daemon what the expected hash of the Nar itself is.
|
||||
(format #t "~a~%" (narinfo-hash narinfo))
|
||||
|
||||
(format (current-error-port) "downloading `~a'~:[~*~; (~,1f MiB installed)~]...~%"
|
||||
store-path
|
||||
|
||||
;; Use the Nar size as an estimate of the installed size.
|
||||
(narinfo-size narinfo)
|
||||
(and=> (narinfo-size narinfo)
|
||||
(cute / <> (expt 2. 20))))
|
||||
(let*-values (((raw download-size)
|
||||
;; Note that Hydra currently generates Nars on the fly
|
||||
;; and doesn't specify a Content-Length, so
|
||||
;; DOWNLOAD-SIZE is #f in practice.
|
||||
(fetch uri #:buffered? #f #:timeout? #f))
|
||||
((progress)
|
||||
(let* ((comp (narinfo-compression narinfo))
|
||||
(dl-size (or download-size
|
||||
(and (equal? comp "none")
|
||||
(narinfo-size narinfo))))
|
||||
(progress (progress-proc (uri-abbreviation uri)
|
||||
dl-size
|
||||
(current-error-port))))
|
||||
(progress-report-port progress raw)))
|
||||
((input pids)
|
||||
(decompressed-port (and=> (narinfo-compression narinfo)
|
||||
string->symbol)
|
||||
progress)))
|
||||
;; Unpack the Nar at INPUT into DESTINATION.
|
||||
(restore-file input destination)
|
||||
|
||||
;; Skip a line after what 'progress-proc' printed.
|
||||
(newline (current-error-port))
|
||||
|
||||
(every (compose zero? cdr waitpid) pids))))
|
||||
(process-substitution store-path destination
|
||||
#:cache-url %cache-url
|
||||
#:acl (current-acl)))
|
||||
(("--version")
|
||||
(show-version-and-exit "guix substitute"))
|
||||
(("--help")
|
||||
|
@ -883,7 +909,6 @@ substituter disabled~%")
|
|||
(opts
|
||||
(leave (_ "~a: unrecognized options~%") opts))))))
|
||||
|
||||
|
||||
;;; Local Variables:
|
||||
;;; eval: (put 'with-timeout 'scheme-indent-function 1)
|
||||
;;; End:
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#:use-module (ice-9 popen)
|
||||
#:export (%daemon-socket-file
|
||||
%gc-roots-directory
|
||||
%default-substitute-urls
|
||||
|
||||
nix-server?
|
||||
nix-server-major-version
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
network-reachable?
|
||||
shebang-too-long?
|
||||
mock
|
||||
%test-substitute-urls
|
||||
%substitute-directory
|
||||
with-derivation-narinfo
|
||||
with-derivation-substitute
|
||||
|
@ -49,6 +50,12 @@
|
|||
;;;
|
||||
;;; Code:
|
||||
|
||||
(define %test-substitute-urls
|
||||
;; URLs where to look for substitutes during tests.
|
||||
(make-parameter
|
||||
(or (and=> (getenv "GUIX_BINARY_SUBSTITUTE_URL") list)
|
||||
'())))
|
||||
|
||||
(define (open-connection-for-tests)
|
||||
"Open a connection to the build daemon for tests purposes and return it."
|
||||
(guard (c ((nix-error? c)
|
||||
|
@ -57,7 +64,9 @@
|
|||
#f))
|
||||
(let ((store (open-connection)))
|
||||
;; Make sure we build everything by ourselves.
|
||||
(set-build-options store #:use-substitutes? #f)
|
||||
(set-build-options store
|
||||
#:use-substitutes? #f
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
|
||||
;; Use the bootstrap Guile when running tests, so we don't end up
|
||||
;; building everything in the temporary test store.
|
||||
|
|
|
@ -612,7 +612,8 @@
|
|||
(output (derivation->output-path drv)))
|
||||
|
||||
;; Make sure substitutes are usable.
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
|
||||
(with-derivation-narinfo drv
|
||||
(let-values (((build download)
|
||||
|
@ -634,7 +635,8 @@
|
|||
(output (derivation->output-path drv)))
|
||||
|
||||
;; Make sure substitutes are usable.
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
|
||||
(with-derivation-narinfo drv
|
||||
(let-values (((build download)
|
||||
|
@ -655,7 +657,8 @@
|
|||
(output (derivation->output-path drv)))
|
||||
|
||||
;; Make sure substitutes are usable.
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
|
||||
(with-derivation-narinfo drv
|
||||
(let-values (((build download)
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
|
||||
;;;
|
||||
;;; 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 (test-file-systems)
|
||||
#:use-module (gnu system file-systems)
|
||||
#:use-module (srfi srfi-64)
|
||||
#:use-module (rnrs bytevectors))
|
||||
|
||||
;; Test the (gnu system file-systems) module.
|
||||
|
||||
(test-begin "file-systems")
|
||||
|
||||
(test-equal "uuid->string"
|
||||
"c5307e6b-d1ba-499d-89c5-cb0b143577c4"
|
||||
(uuid->string
|
||||
#vu8(197 48 126 107 209 186 73 157 137 197 203 11 20 53 119 196)))
|
||||
|
||||
(test-equal "string->uuid"
|
||||
'(16 "4dab5feb-d176-45de-b287-9b0a6e4c01cb")
|
||||
(let ((uuid (string->uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
|
||||
(list (bytevector-length uuid) (uuid->string uuid))))
|
||||
|
||||
(test-assert "uuid"
|
||||
(let ((str "4dab5feb-d176-45de-b287-9b0a6e4c01cb"))
|
||||
(bytevector=? (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")
|
||||
(string->uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb"))))
|
||||
|
||||
(test-end)
|
||||
|
||||
|
||||
(exit (= (test-runner-fail-count (test-runner-current)) 0))
|
|
@ -1,5 +1,5 @@
|
|||
# GNU Guix --- Functional package management for GNU
|
||||
# Copyright © 2012, 2014 Ludovic Courtès <ludo@gnu.org>
|
||||
# Copyright © 2012, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
|
||||
#
|
||||
# This file is part of GNU Guix.
|
||||
#
|
||||
|
@ -54,11 +54,12 @@ EOF
|
|||
rm -f "$XDG_CACHE_HOME/guix/substitute/$hash_part"
|
||||
|
||||
# Make sure we see the substitute.
|
||||
guile -c '
|
||||
guile -c "
|
||||
(use-modules (guix))
|
||||
(define store (open-connection))
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(exit (has-substitutes? store "'"$out"'"))'
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls (list \"$GUIX_BINARY_SUBSTITUTE_URL\"))
|
||||
(exit (has-substitutes? store \"$out\"))"
|
||||
|
||||
# Now, run guix-daemon --no-substitutes.
|
||||
socket="$NIX_STATE_DIR/alternate-socket"
|
||||
|
@ -72,6 +73,7 @@ guile -c "
|
|||
(define store (open-connection \"$socket\"))
|
||||
|
||||
;; This setting MUST NOT override the daemon's --no-substitutes.
|
||||
(set-build-options store #:use-substitutes? #t)
|
||||
(set-build-options store #:use-substitutes? #t
|
||||
#:substitute-urls (list \"$GUIX_BINARY_SUBSTITUTE_URL\"))
|
||||
|
||||
(exit (not (has-substitutes? store \"$out\")))"
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#:use-module (guix packages)
|
||||
#:use-module (guix derivations)
|
||||
#:use-module (guix serialization)
|
||||
#:use-module (guix build utils)
|
||||
#:use-module (guix gexp)
|
||||
#:use-module (gnu packages)
|
||||
#:use-module (gnu packages bootstrap)
|
||||
|
@ -371,13 +372,13 @@
|
|||
(with-derivation-narinfo d
|
||||
;; Remove entry from the local cache.
|
||||
(false-if-exception
|
||||
(delete-file (string-append (getenv "XDG_CACHE_HOME")
|
||||
"/guix/substitute/"
|
||||
(store-path-hash-part o))))
|
||||
(delete-file-recursively (string-append (getenv "XDG_CACHE_HOME")
|
||||
"/guix/substitute")))
|
||||
|
||||
;; Make sure 'guix substitute' correctly communicates the above
|
||||
;; data.
|
||||
(set-build-options s #:use-substitutes? #t)
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(and (has-substitutes? s o)
|
||||
(equal? (list o) (substitutable-paths s (list o)))
|
||||
(match (pk 'spi (substitutable-path-info s (list o)))
|
||||
|
@ -387,6 +388,34 @@
|
|||
(null? (substitutable-references s))
|
||||
(equal? (substitutable-nar-size s) 1234)))))))))
|
||||
|
||||
(test-assert "substitute query, alternating URLs"
|
||||
(let* ((d (with-store s
|
||||
(package-derivation s %bootstrap-guile (%current-system))))
|
||||
(o (derivation->output-path d)))
|
||||
(with-derivation-narinfo d
|
||||
;; Remove entry from the local cache.
|
||||
(false-if-exception
|
||||
(delete-file-recursively (string-append (getenv "XDG_CACHE_HOME")
|
||||
"/guix/substitute")))
|
||||
|
||||
;; Note: We reconnect to the daemon to force a new instance of 'guix
|
||||
;; substitute' to be used; otherwise the #:substitute-urls of
|
||||
;; 'set-build-options' would have no effect.
|
||||
|
||||
(and (with-store s ;the right substitute URL
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(has-substitutes? s o))
|
||||
(with-store s ;the wrong one
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (list
|
||||
"http://does-not-exist"))
|
||||
(not (has-substitutes? s o)))
|
||||
(with-store s ;the right one again
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(has-substitutes? s o))))))
|
||||
|
||||
(test-assert "substitute"
|
||||
(with-store s
|
||||
(let* ((c (random-text)) ; contents of the output
|
||||
|
@ -400,7 +429,8 @@
|
|||
(package-derivation s %bootstrap-guile (%current-system))))
|
||||
(o (derivation->output-path d)))
|
||||
(with-derivation-substitute d c
|
||||
(set-build-options s #:use-substitutes? #t)
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(and (has-substitutes? s o)
|
||||
(build-derivations s (list d))
|
||||
(equal? c (call-with-input-file o get-string-all)))))))
|
||||
|
@ -418,7 +448,8 @@
|
|||
(package-derivation s %bootstrap-guile (%current-system))))
|
||||
(o (derivation->output-path d)))
|
||||
(with-derivation-substitute d c
|
||||
(set-build-options s #:use-substitutes? #t)
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(and (has-substitutes? s o)
|
||||
(build-things s (list o)) ;give the output path
|
||||
(valid-path? s o)
|
||||
|
@ -442,7 +473,8 @@
|
|||
;; Make sure we use 'guix substitute'.
|
||||
(set-build-options s
|
||||
#:use-substitutes? #t
|
||||
#:fallback? #f)
|
||||
#:fallback? #f
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(and (has-substitutes? s o)
|
||||
(guard (c ((nix-protocol-error? c)
|
||||
;; XXX: the daemon writes "hash mismatch in downloaded
|
||||
|
@ -467,13 +499,16 @@
|
|||
;; Create fake substituter data, to be read by 'guix substitute'.
|
||||
(with-derivation-narinfo d
|
||||
;; Make sure we use 'guix substitute'.
|
||||
(set-build-options s #:use-substitutes? #t)
|
||||
(set-build-options s #:use-substitutes? #t
|
||||
#:substitute-urls (%test-substitute-urls))
|
||||
(and (has-substitutes? s o)
|
||||
(guard (c ((nix-protocol-error? c)
|
||||
;; The substituter failed as expected. Now make
|
||||
;; sure that #:fallback? #t works correctly.
|
||||
(set-build-options s
|
||||
#:use-substitutes? #t
|
||||
#:substitute-urls
|
||||
(%test-substitute-urls)
|
||||
#:fallback? #t)
|
||||
(and (build-derivations s (list d))
|
||||
(equal? t (call-with-input-file o
|
||||
|
|
|
@ -80,6 +80,8 @@
|
|||
(define (user-namespace pid)
|
||||
(string-append "/proc/" (number->string pid) "/ns/user"))
|
||||
|
||||
(unless (file-exists? (user-namespace (getpid)))
|
||||
(test-skip 1))
|
||||
(test-assert "clone"
|
||||
(match (clone (logior CLONE_NEWUSER SIGCHLD))
|
||||
(0 (primitive-exit 42))
|
||||
|
@ -91,6 +93,8 @@
|
|||
((_ . status)
|
||||
(= 42 (status:exit-val status))))))))
|
||||
|
||||
(unless (file-exists? (user-namespace (getpid)))
|
||||
(test-skip 1))
|
||||
(test-assert "setns"
|
||||
(match (clone (logior CLONE_NEWUSER SIGCHLD))
|
||||
(0 (primitive-exit 0))
|
||||
|
@ -118,6 +122,8 @@
|
|||
(waitpid fork-pid)
|
||||
result))))))))
|
||||
|
||||
(unless (file-exists? (user-namespace (getpid)))
|
||||
(test-skip 1))
|
||||
(test-assert "pivot-root"
|
||||
(match (pipe)
|
||||
((in . out)
|
||||
|
|
Loading…
Reference in New Issue