aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-11-20 23:51:26 +0100
committerLudovic Courtès <ludo@gnu.org>2013-11-20 23:51:26 +0100
commitedae5b3d50692c25e29fe65fdc14ae3ccdce884d (patch)
treeec257af3a922fd96bda8b8b16c00c8d0beaf445a
parent1dba64079c5aaa1fb40e4b1d989f1f06efd6cb63 (diff)
parente3aaefe71bd26daf6fdbfd0634f68a90985e059b (diff)
downloadpatches-edae5b3d50692c25e29fe65fdc14ae3ccdce884d.tar
patches-edae5b3d50692c25e29fe65fdc14ae3ccdce884d.tar.gz
Merge branch 'master' into core-updates
Conflicts: guix/packages.scm
-rw-r--r--README24
-rwxr-xr-xbuild-aux/list-packages.scm61
-rw-r--r--doc/guix.texi46
-rw-r--r--gnu-system.am5
-rw-r--r--gnu/packages/apl.scm50
-rw-r--r--gnu/packages/autogen.scm4
-rw-r--r--gnu/packages/base.scm9
-rw-r--r--gnu/packages/bison.scm4
-rw-r--r--gnu/packages/cflow.scm4
-rw-r--r--gnu/packages/complexity.scm49
-rw-r--r--gnu/packages/freeipmi.scm4
-rw-r--r--gnu/packages/gnunet.scm4
-rw-r--r--gnu/packages/gnuzilla.scm97
-rw-r--r--gnu/packages/gvpe.scm48
-rw-r--r--gnu/packages/kde.scm37
-rw-r--r--gnu/packages/lightning.scm4
-rw-r--r--gnu/packages/linux.scm4
-rw-r--r--gnu/packages/parallel.scm47
-rw-r--r--gnu/packages/qt.scm72
-rw-r--r--gnu/packages/sdl.scm47
-rw-r--r--gnu/packages/version-control.scm6
-rw-r--r--gnu/system/vm.scm2
-rw-r--r--guix/build-system/python.scm3
-rw-r--r--guix/derivations.scm118
-rw-r--r--guix/packages.scm40
-rw-r--r--guix/scripts/build.scm181
-rwxr-xr-xguix/scripts/substitute-binary.scm32
-rw-r--r--guix/store.scm32
-rw-r--r--guix/ui.scm31
-rw-r--r--guix/utils.scm24
-rw-r--r--po/LINGUAS1
-rw-r--r--po/sr.po1304
-rw-r--r--tests/derivations.scm52
-rw-r--r--tests/guix-build.sh19
-rw-r--r--tests/packages.scm17
-rw-r--r--tests/store.scm36
-rw-r--r--tests/utils.scm8
37 files changed, 2298 insertions, 228 deletions
diff --git a/README b/README
index 33d5b68460..30c90aeb1e 100644
--- a/README
+++ b/README
@@ -50,26 +50,16 @@ You can re-build and re-install Guix using a system that already runs Guix.
To do so:
- Install the dependencies (see 'Requirements' above) and build tools using
- Guix. You should have the following packages installed in your user
- profile:
-
- - autoconf
- - automake
- - bzip2
- - gcc
- - gettext
- - glibc
- - guile
- - ld-wrapper
- - libgcrypt
- - pkg-config
- - sqlite
+ Guix:
+
+ guix package --install={autoconf,automake,bzip2,gcc,binutils,ld-wrapper,glibc,gettext,guile,libgcrypt,pkg-config,sqlite}
- set the environment variables that Guix recommends you to set during the
package installation process:
- ACLOCAL, CPATH, LIBRARY_PATH, PATH, PKG_CONFIG_PATH
- In addition, set
- GUIX_LD_WRAPPER_ALLOW_IMPURITIES=yes
+ ACLOCAL_PATH, CPATH, LIBRARY_PATH, PKG_CONFIG_PATH
+
+ - set the PATH environment variable to refer to the profile:
+ PATH=$HOME/.guix-profile/bin:$PATH
- re-run the configure script passing it the option
`--with-libgcrypt-prefix=$HOME/.guix-profile/'
diff --git a/build-aux/list-packages.scm b/build-aux/list-packages.scm
index 6e73cffb86..6cf2c53491 100755
--- a/build-aux/list-packages.scm
+++ b/build-aux/list-packages.scm
@@ -71,12 +71,14 @@ of packages still to be processed in REMAINING. Also Introduces a call to the
JavaScript prep_pkg_descs function as part of the output of PACKAGE, every
time the length of DESCRIPTION-IDS, increasing, is 15 or when REMAINING,
decreasing, is 1."
+ (define (location-url loc)
+ (string-append "http://git.savannah.gnu.org/cgit/guix.git/tree/"
+ (location-file loc) "#n"
+ (number->string (location-line loc))))
+
(define (source-url package)
(let ((loc (package-location package)))
- (and loc
- (string-append "http://git.savannah.gnu.org/cgit/guix.git/tree/"
- (location-file loc) "#n"
- (number->string (location-line loc))))))
+ (and loc (location-url loc))))
(define (license package)
(define ->sxml
@@ -103,26 +105,37 @@ decreasing, is 1."
"http://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/patches/"
(basename patch)))
- (match (and (origin? (package-source package))
- (origin-patches (package-source package)))
- ((patches ..1)
- `(div "patches: "
- ,(let loop ((patches patches)
- (number 1)
- (links '()))
- (match patches
- (()
- (list-join (reverse links) ", "))
- ((patch rest ...)
- (loop rest
- (+ 1 number)
- (cons `(a (@ (href ,(patch-url patch))
- (title ,(string-append
- "Link to "
- (basename patch))))
- ,(number->string number))
- links)))))))
- (_ #f)))
+ (define (snippet-link snippet)
+ (let ((loc (package-field-location package 'source)))
+ `(a (@ (href ,(location-url loc))
+ (title "Link to patch snippet"))
+ "snippet")))
+
+ (and (origin? (package-source package))
+ (let ((patches (origin-patches (package-source package)))
+ (snippet (origin-snippet (package-source package))))
+ (and (or (pair? patches) snippet)
+ `(div "patches: "
+ ,(let loop ((patches patches)
+ (number 1)
+ (links '()))
+ (match patches
+ (()
+ (let* ((additional (and snippet
+ (snippet-link snippet)))
+ (links (if additional
+ (cons additional links)
+ links)))
+ (list-join (reverse links) ", ")))
+ ((patch rest ...)
+ (loop rest
+ (+ 1 number)
+ (cons `(a (@ (href ,(patch-url patch))
+ (title ,(string-append
+ "Link to "
+ (basename patch))))
+ ,(number->string number))
+ links))))))))))
(define (status package)
(define (url system)
diff --git a/doc/guix.texi b/doc/guix.texi
index 4fb14063d0..81f85d1b2f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -95,7 +95,7 @@ always produces the same result when passed a given set of inputs. It
cannot alter the system's environment in
any way; for instance, it cannot create, modify, or delete files outside
of its build and installation directories. This is achieved by running
-build processes in isolated environments (or @dfn{chroots}), where only their
+build processes in isolated environments (or @dfn{containers}), where only their
explicit inputs are visible.
@cindex store
@@ -224,6 +224,7 @@ The @code{guix-daemon} program may then be run as @code{root} with:
# guix-daemon --build-users-group=guix-builder
@end example
+@cindex chroot
@noindent
This way, the daemon starts build processes in a chroot, under one of
the @code{guix-builder} users. On GNU/Linux, by default, the chroot
@@ -271,6 +272,10 @@ is normally run as @code{root} like this:
@noindent
For details on how to set it up, @ref{Setting Up the Daemon}.
+@cindex chroot
+@cindex container, build environment
+@cindex build environment
+@cindex reproducible builds
By default, @command{guix-daemon} launches build processes under
different UIDs, taken from the build group specified with
@code{--build-users-group}. In addition, each build process is run in a
@@ -278,7 +283,10 @@ chroot environment that only contains the subset of the store that the
build process depends on, as specified by its derivation
(@pxref{Programming Interface, derivation}), plus a set of specific
system directories. By default, the latter contains @file{/dev} and
-@file{/dev/pts}.
+@file{/dev/pts}. Furthermore, on GNU/Linux, the build environment is a
+@dfn{container}: in addition to having its own file system tree, it has
+a separate mount name space, its own PID name space, network name space,
+etc. This helps achieve reproducible builds (@pxref{Features}).
The following command-line options are supported:
@@ -447,13 +455,18 @@ profiles, and remove those that are provably no longer referenced
generations of their profile so that the packages they refer to can be
collected.
+@cindex reproducibility
+@cindex reproducible builds
Finally, Guix takes a @dfn{purely functional} approach to package
management, as described in the introduction (@pxref{Introduction}).
Each @file{/nix/store} package directory name contains a hash of all the
inputs that were used to build that package---compiler, libraries, build
scripts, etc. This direct correspondence allows users to make sure a
given package installation matches the current state of their
-distribution, and helps maximize @dfn{reproducibility}.
+distribution. It also helps maximize @dfn{build reproducibility}:
+thanks to the isolated build environments that are used, a given build
+is likely to yield bit-identical files when performed on different
+machines (@pxref{Invoking guix-daemon, container}).
@cindex substitute
This foundation allows Guix to support @dfn{transparent binary/source
@@ -1470,12 +1483,16 @@ The @var{options} may be zero or more of the following:
@item --expression=@var{expr}
@itemx -e @var{expr}
-Build the package @var{expr} evaluates to.
+Build the package or derivation @var{expr} evaluates to.
For example, @var{expr} may be @code{(@@ (gnu packages guile)
guile-1.8)}, which unambiguously designates this specific variant of
version 1.8 of Guile.
+Alternately, @var{expr} may refer to a zero-argument monadic procedure
+(@pxref{The Store Monad}). The procedure must return a derivation as a
+monadic value, which is then passed through @code{run-with-store}.
+
@item --source
@itemx -S
Build the packages' source derivations, rather than the packages
@@ -1546,6 +1563,22 @@ Use the given verbosity level. @var{level} must be an integer between 0
and 5; higher means more verbose output. Setting a level of 4 or more
may be helpful when debugging setup issues with the build daemon.
+@item --log-file
+Return the build log file names for the given
+@var{package-or-derivation}s, or raise an error if build logs are
+missing.
+
+This works regardless of how packages or derivations are specified. For
+instance, the following invocations are equivalent:
+
+@example
+guix build --log-file `guix build -d guile`
+guix build --log-file `guix build guile`
+guix build --log-file guile
+guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)'
+@end example
+
+
@end table
Behind the scenes, @command{guix build} is essentially an interface to
@@ -1708,8 +1741,9 @@ Guix comes with a distribution of free software@footnote{The term
users of that software}.} that form the basis of the GNU system. This
includes core GNU packages such as GNU libc, GCC, and Binutils, as well
as many GNU and non-GNU applications. The complete list of available
-packages can be seen by running @command{guix package} (@pxref{Invoking
-guix package}):
+packages can be browsed
+@url{http://www.gnu.org/software/guix/package-list.html,on-line} or by
+running @command{guix package} (@pxref{Invoking guix package}):
@example
guix package --list-available
diff --git a/gnu-system.am b/gnu-system.am
index 3b300ffaf1..2c893e4d7f 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -26,6 +26,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/acct.scm \
gnu/packages/acl.scm \
gnu/packages/algebra.scm \
+ gnu/packages/apl.scm \
gnu/packages/apr.scm \
gnu/packages/aspell.scm \
gnu/packages/attr.scm \
@@ -43,6 +44,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/check.scm \
gnu/packages/cmake.scm \
gnu/packages/compression.scm \
+ gnu/packages/complexity.scm \
gnu/packages/cpio.scm \
gnu/packages/cppi.scm \
gnu/packages/cross-base.scm \
@@ -77,6 +79,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/gnunet.scm \
gnu/packages/gnupg.scm \
gnu/packages/gnutls.scm \
+ gnu/packages/gnuzilla.scm \
gnu/packages/gperf.scm \
gnu/packages/gprolog.scm \
gnu/packages/graphviz.scm \
@@ -88,6 +91,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/gtk.scm \
gnu/packages/guile.scm \
gnu/packages/gv.scm \
+ gnu/packages/gvpe.scm \
gnu/packages/help2man.scm \
gnu/packages/hugs.scm \
gnu/packages/icu4c.scm \
@@ -139,6 +143,7 @@ GNU_SYSTEM_MODULES = \
gnu/packages/openldap.scm \
gnu/packages/openssl.scm \
gnu/packages/package-management.scm \
+ gnu/packages/parallel.scm \
gnu/packages/parted.scm \
gnu/packages/patchelf.scm \
gnu/packages/pcre.scm \
diff --git a/gnu/packages/apl.scm b/gnu/packages/apl.scm
new file mode 100644
index 0000000000..5750abbddf
--- /dev/null
+++ b/gnu/packages/apl.scm
@@ -0,0 +1,50 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.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 (gnu packages apl)
+ #:use-module (guix licenses)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system gnu)
+ #:use-module ((gnu packages gettext)
+ #:renamer (symbol-prefix-proc 'guix:))
+ #:use-module (gnu packages maths)
+ #:use-module (gnu packages readline))
+
+(define-public apl
+ (package
+ (name "apl")
+ (version "1.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/apl/apl-" version ".tar.gz"))
+ (sha256
+ (base32
+ "1myinxa0m3y4fanpxflfakfk3m1s8641wdlbwbs0vg5yp10xm0m3"))))
+ (build-system gnu-build-system)
+ (home-page "http://www.gnu.org/software/apl/")
+ (inputs
+ `(("gettext" ,guix:gettext)
+ ("lapack" ,lapack)
+ ("readline" ,readline)))
+ (synopsis "APL interpreter")
+ (description
+ "GNU APL is a free interpreter for the programming language APL. It is
+an implementation of the ISO standard 13751.")
+ (license gpl3+)))
diff --git a/gnu/packages/autogen.scm b/gnu/packages/autogen.scm
index 3109c2bf0b..9615c1e065 100644
--- a/gnu/packages/autogen.scm
+++ b/gnu/packages/autogen.scm
@@ -28,7 +28,7 @@
(define-public autogen
(package
(name "autogen")
- (version "5.18.1")
+ (version "5.18.2")
(source
(origin
(method url-fetch)
@@ -37,7 +37,7 @@
version ".tar.gz"))
(sha256
(base32
- "0k0gkr5inr9wb3ws30q6bbiqg3qm3ryvl9cznym2xis4lm216d53"))))
+ "0s2021bwpq6h199cbbranz96hhm5s7v66lc68h8v198vqbg049yc"))))
(build-system gnu-build-system)
(inputs `(("which" ,which)
("guile" ,guile-2.0)))
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 7de7689b24..e835b418b2 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -49,19 +49,14 @@
(define-public hello
(package
(name "hello")
- (version "2.8")
+ (version "2.9")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/hello/hello-" version
".tar.gz"))
(sha256
- (base32 "0wqd8sjmxfskrflaxywc7gqw7sfawrfvdxd9skxawzfgyy0pzdz6"))))
+ (base32 "19qy37gkasc4csb1d3bdiz9snn8mir2p3aj0jgzmfv0r2hi7mfzc"))))
(build-system gnu-build-system)
- (arguments '(#:configure-flags
- `("--disable-dependency-tracking"
- ,(string-append "--with-gawk=" ; for illustration purposes
- (assoc-ref %build-inputs "gawk")))))
- (inputs `(("gawk" ,gawk)))
(synopsis "Hello, GNU world: An example GNU package")
(description
"GNU Hello prints the message \"Hello, world!\" and then exits. It
diff --git a/gnu/packages/bison.scm b/gnu/packages/bison.scm
index 8782096cf0..b0eab278e3 100644
--- a/gnu/packages/bison.scm
+++ b/gnu/packages/bison.scm
@@ -30,7 +30,7 @@
(define bison
(package
(name "bison")
- (version "3.0")
+ (version "3.0.1")
(source
(origin
(method url-fetch)
@@ -38,7 +38,7 @@
version ".tar.xz"))
(sha256
(base32
- "1j14fqgi9wzqgsy4fhkcdrv4hv6rrvhvn84axs520w9b022mbb79"))))
+ "1jx2ymvhl6h2jq6sf0lrk7ggfc2v1ri49yib8ppir0vdnh1znkll"))))
(build-system gnu-build-system)
(native-inputs `(("perl" ,perl)))
(inputs `(("flex" ,flex)))
diff --git a/gnu/packages/cflow.scm b/gnu/packages/cflow.scm
index 52552e3fe1..76ab5506d6 100644
--- a/gnu/packages/cflow.scm
+++ b/gnu/packages/cflow.scm
@@ -35,6 +35,10 @@
(base32
"1jkbq97ajcf834z68hbn3xfhiz921zhn39gklml1racf0kb3jzh3"))))
(build-system gnu-build-system)
+
+ ;; Needed to have cflow-mode.el installed.
+ (native-inputs `(("emacs" ,emacs)))
+
(home-page "http://www.gnu.org/software/cflow/")
(synopsis "Create a graph of control flow within a program")
(description
diff --git a/gnu/packages/complexity.scm b/gnu/packages/complexity.scm
new file mode 100644
index 0000000000..5216b7e39c
--- /dev/null
+++ b/gnu/packages/complexity.scm
@@ -0,0 +1,49 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 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 (gnu packages complexity)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix licenses)
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages texinfo)
+ #:use-module (gnu packages autogen))
+
+(define-public complexity
+ (package
+ (name "complexity")
+ (version "1.1")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/complexity/complexity-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "1aad7n35ymxbj5dlpvm64dcd71b6i7hbmps0g7nkf47vj53l6y2j"))))
+ (build-system gnu-build-system)
+ (native-inputs
+ `(("texinfo" ,texinfo)
+ ("autogen" ,autogen)))
+ (home-page "http://www.gnu.org/software/complexity/")
+ (synopsis "Analyze complexity of C functions")
+ (description
+ "GNU complexity provides tools for finding procedures that are
+convoluted, overly long or otherwise difficult to understand. This
+may help in learning or reviewing unfamiliar code or perhaps
+highlighting your own code that seemed comprehensible when you wrote it.")
+ (license gpl3+)))
diff --git a/gnu/packages/freeipmi.scm b/gnu/packages/freeipmi.scm
index 06917e1949..34b577b6f8 100644
--- a/gnu/packages/freeipmi.scm
+++ b/gnu/packages/freeipmi.scm
@@ -27,14 +27,14 @@
(define-public freeipmi
(package
(name "freeipmi")
- (version "1.3.2")
+ (version "1.3.3")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/freeipmi/freeipmi-"
version ".tar.gz"))
(sha256
(base32
- "1gz2r3zp8ag4cd5cflh4fy8mpvwcx1wdr37mkqkph3m5lx2w48qb"))))
+ "0pmgr66k4cx0gdwzfby6643m15bb4q2yx2g5r2jr3qidrfyxhi3j"))))
(build-system gnu-build-system)
(inputs
`(("readline" ,readline) ("libgcrypt" ,libgcrypt)))
diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm
index 35be20a3af..0f5f32b9b4 100644
--- a/gnu/packages/gnunet.scm
+++ b/gnu/packages/gnunet.scm
@@ -38,14 +38,14 @@
(define-public libextractor
(package
(name "libextractor")
- (version "1.1")
+ (version "1.2")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/libextractor/libextractor-"
version ".tar.gz"))
(sha256
(base32
- "1zvj64ig456c9ya3r8ib48ms42cnli9y7ig5p04xqm16z7vw5dyb"))))
+ "1n7z6s5ils6xmf6b0z1xda41maxj94c1n6wlyyxmacs5lrkh2a96"))))
(build-system gnu-build-system)
;; WARNING: Checks require /dev/shm to be in the build chroot, especially
;; not to be a symbolic link to /run/shm.
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
new file mode 100644
index 0000000000..ff7de4fe96
--- /dev/null
+++ b/gnu/packages/gnuzilla.scm
@@ -0,0 +1,97 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;;
+;;; 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 gnuzilla)
+ #:use-module (gnu packages)
+ #:use-module ((guix licenses)
+ #:renamer (symbol-prefix-proc 'license:))
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages gstreamer)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages perl)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages yasm)
+ #:use-module (gnu packages zip))
+
+(define-public icecat
+ (package
+ (name "icecat")
+ (version "24.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/gnuzilla/"
+ (substring version 0 (string-index version #\.))
+ "/icecat-" version ".tar.gz"))
+ (sha256
+ (base32
+ "1vxzjwmhad6yxx4sk9zvapjgv5salcv10id061q0991ii3dycy9a"))))
+ (build-system gnu-build-system)
+ (inputs
+ `(("alsa-lib" ,alsa-lib)
+ ("dbus" ,dbus)
+ ("dbus-glib" ,dbus-glib)
+ ("glib" ,glib)
+ ("gstreamer" ,gstreamer-0.10)
+ ("gst-plugins-base" ,gst-plugins-base-0.10)
+ ("gtk+" ,gtk+-2)
+ ("libxt" ,libxt)
+ ("mesa" ,mesa)
+ ("perl" ,perl)
+ ("pkg-config" ,pkg-config)
+ ("python" ,python-2) ; Python 3 not supported
+ ("python2-pysqlite" ,python2-pysqlite)
+ ("unzip" ,unzip)
+ ("yasm" ,yasm)
+ ("zip" ,zip)))
+ (arguments
+ `(#:tests? #f ; no check target
+ #:phases
+ (alist-cons-before
+ 'patch-source-shebangs 'sanitise
+ (lambda _
+ ;; delete dangling symlinks
+ (delete-file "browser/base/content/.#aboutDialog.xul")
+ (delete-file "browser/base/content/abouthome/.#aboutHome.xhtml")
+ (delete-file "browser/branding/unofficial/content/.#aboutHome.xhtml")
+ (delete-file "toolkit/crashreporter/google-breakpad/autotools/compile"))
+ (alist-replace
+ 'configure
+ ;; configure does not work followed by both "SHELL=..." and
+ ;; "CONFIG_SHELL=..."; set environment variables instead
+ (lambda* (#:key outputs configure-flags #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out")))
+ (setenv "SHELL" (which "bash"))
+ (setenv "CONFIG_SHELL" (which "bash"))
+ (zero? (system* "./configure"
+ (string-append "--prefix=" out)
+ "--disable-webrtc")))) ; webrtc creates an error
+ %standard-phases))))
+ (home-page "http://www.gnu.org/software/gnuzilla/")
+ (synopsis "Entirely free browser derived from Mozilla Firefox")
+ (description
+ "IceCat is the GNU version of the Firefox browser. It is entirely free
+software, which does not recommend non-free plugins and addons. It also
+features extra privacy-protecting features built in.")
+ (license license:mpl2.0))) ; and others, see toolkit/content/license.html
diff --git a/gnu/packages/gvpe.scm b/gnu/packages/gvpe.scm
new file mode 100644
index 0000000000..1018428306
--- /dev/null
+++ b/gnu/packages/gvpe.scm
@@ -0,0 +1,48 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 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 (gnu packages gvpe)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module ((guix licenses) #:select (gpl3+))
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages openssl)
+ #:use-module ((gnu packages compression) #:select (zlib)))
+
+(define-public gvpe
+ (package
+ (name "gvpe")
+ (version "2.25")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/gvpe/gvpe-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "1gsipcysvsk80gvyn9jnk9g0xg4ng9yd5zp066jnmpgs52d2vhvk"))))
+ (build-system gnu-build-system)
+ (home-page "http://software.schmorp.de/pkg/gvpe.html")
+ (inputs `(("openssl" ,openssl)
+ ("zlib" ,zlib)))
+ (synopsis "Secure VPN among multiple nodes over an untrusted network")
+ (description
+ "The GNU Virtual Private Ethernet creates a virtual network
+with multiple nodes using a variety of transport protocols. It works
+by creating encrypted host-to-host tunnels between multiple
+endpoints.")
+ (license gpl3+)))
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index 3da261ccd1..aaf425db63 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -17,11 +17,15 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages kde)
- #:use-module ((guix licenses) #:select (bsd-2))
+ #:use-module ((guix licenses) #:select (bsd-2 lgpl2.1+))
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix build-system cmake)
- #:use-module (gnu packages qt))
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages pulseaudio)
+ #:use-module (gnu packages qt)
+ #:use-module (gnu packages xorg))
(define-public automoc4
(package
@@ -44,3 +48,32 @@
(synopsis "build tool for KDE")
(description "KDE desktop environment")
(license bsd-2)))
+
+(define-public phonon
+ (package
+ (name "phonon")
+ (version "4.7.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "http://download.kde.org/stable/" name
+ "/" version "/"
+ name "-" version ".tar.xz"))
+ (sha256
+ (base32
+ "1sxrnwm16dxy32xmrqf26762wmbqing1zx8i4vlvzgzvd9xy39ac"))))
+ (build-system cmake-build-system)
+ ;; FIXME: Add interpreter ruby once available.
+ ;; Add optional input libqtzeitgeist.
+ (inputs
+ `(("automoc4" ,automoc4)
+ ("glib" ,glib)
+ ("libx11" ,libx11)
+ ("pkg-config" ,pkg-config)
+ ("pulseaudio" ,pulseaudio)
+ ("qt" ,qt-4)))
+ (arguments
+ `(#:tests? #f)) ; no test target
+ (home-page "http://phonon.kde.org/")
+ (synopsis "Qt 4 multimedia API")
+ (description "KDE desktop environment")
+ (license lgpl2.1+)))
diff --git a/gnu/packages/lightning.scm b/gnu/packages/lightning.scm
index 03255e0617..8ec433e0b8 100644
--- a/gnu/packages/lightning.scm
+++ b/gnu/packages/lightning.scm
@@ -25,14 +25,14 @@
(define-public lightning
(package
(name "lightning")
- (version "2.0.1")
+ (version "2.0.2")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/lightning/lightning-"
version ".tar.gz"))
(sha256
(base32
- "1cc19rpgrqvpkzb19ffsxw3k254m46npbkx8cbgv3dbxjf9sf4v5"))))
+ "100ya7dx12403gimif7p2q7ahd8vxqrxpxqzqr1zqci825nb0b43"))))
(build-system gnu-build-system)
(synopsis "Library for generating assembly code at runtime")
(description
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 7176c37a87..e1f8b4f46d 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -145,7 +145,7 @@
(license gpl2+)))
(define-public linux-libre
- (let* ((version "3.11")
+ (let* ((version "3.12")
(build-phase
'(lambda* (#:key system #:allow-other-keys #:rest args)
(let ((arch (car (string-split system #\-))))
@@ -191,7 +191,7 @@
(uri (linux-libre-urls version))
(sha256
(base32
- "1vlk04xkvyy1kc9zz556md173rn1qzlnvhz7c9sljv4bpk3mdspl"))))
+ "0drjxm9h2k9bik2mhrqqqi6cm5rn2db647wf0zvb58xldj0zmhb6"))))
(build-system gnu-build-system)
(native-inputs `(("perl" ,perl)
("bc" ,bc)
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
new file mode 100644
index 0000000000..946e1acb6d
--- /dev/null
+++ b/gnu/packages/parallel.scm
@@ -0,0 +1,47 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Eric Bavier <bavier@member.fsf.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 (gnu packages parallel)
+ #:use-module (guix packages)
+ #:use-module (guix licenses)
+ #:use-module (guix download)
+ #:use-module (guix build-system gnu)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages perl))
+
+(define-public parallel
+ (package
+ (name "parallel")
+ (version "20131022")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/parallel/parallel-"
+ version ".tar.bz2"))
+ (sha256
+ (base32
+ "1ydn8aj72wfjdvldzjwah9cvqay8vzr3dbspa5l0g2y10dx0qa4k"))))
+ (build-system gnu-build-system)
+ (inputs `(("perl" ,perl)))
+ (home-page "http://www.gnu.org/software/parallel/")
+ (synopsis "Build and execute command lines in parallel")
+ (description
+ "GNU Parallel is a tool for executing shell jobs in parallel using one
+or more computers. Jobs can consist of single commands or of scripts
+and they are executed on lists of files, hosts, users or other items.")
+ (license gpl3+)))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 2a0872bcdc..6aa467acef 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -118,22 +118,28 @@ X11 (yet).")
(("/bin/pwd") (which "pwd")))
;; do not pass "--enable-fast-install", which makes the
;; configure process fail
- (zero? (system* "./configure"
- "-verbose"
- "-prefix" out
- "-opensource"
- "-confirm-license"
- ;; drop all special machine instructions
- "-no-sse2"
- "-no-sse3"
- "-no-ssse3"
- "-no-sse4.1"
- "-no-sse4.2"
- "-no-avx"
- "-no-avx2"
- "-no-neon"
- "-no-mips_dsp"
- "-no-mips_dspr2"))))
+ (zero? (system*
+ "./configure"
+ "-verbose"
+ "-prefix" out
+ "-opensource"
+ "-confirm-license"
+ ;; drop special machine instructions not supported
+ ;; on all instances of the target
+ ,@(if (string-prefix? "x86_64"
+ (or (%current-target-system)
+ (%current-system)))
+ '()
+ '("-no-sse2"))
+ "-no-sse3"
+ "-no-ssse3"
+ "-no-sse4.1"
+ "-no-sse4.2"
+ "-no-avx"
+ "-no-avx2"
+ "-no-neon"
+ "-no-mips_dsp"
+ "-no-mips_dspr2"))))
%standard-phases)))
(home-page "http://qt-project.org/")
(synopsis "Cross-platform GUI library")
@@ -165,20 +171,26 @@ developers using C++ or QML, a CSS & JavaScript like language.")
(("/bin/pwd") (which "pwd")))
;; do not pass "--enable-fast-install", which makes the
;; configure process fail
- (zero? (system* "./configure"
- "-verbose"
- "-prefix" out
- "-opensource"
- "-confirm-license"
- ;; drop all special machine instructions
- "-no-mmx"
+ (zero? (system*
+ "./configure"
+ "-verbose"
+ "-prefix" out
+ "-opensource"
+ "-confirm-license"
+ ;; drop special machine instructions not supported
+ ;; on all instances of the target
+ ,@(if (string-prefix? "x86_64"
+ (or (%current-target-system)
+ (%current-system)))
+ '()
+ '("-no-mmx"
"-no-3dnow"
"-no-sse"
- "-no-sse2"
- "-no-sse3"
- "-no-ssse3"
- "-no-sse4.1"
- "-no-sse4.2"
- "-no-avx"
- "-no-neon"))))
+ "-no-sse2"))
+ "-no-sse3"
+ "-no-ssse3"
+ "-no-sse4.1"
+ "-no-sse4.2"
+ "-no-avx"
+ "-no-neon"))))
%standard-phases)))))
diff --git a/gnu/packages/sdl.scm b/gnu/packages/sdl.scm
index ceb21735bc..e8fd65cf5c 100644
--- a/gnu/packages/sdl.scm
+++ b/gnu/packages/sdl.scm
@@ -23,8 +23,53 @@
#:use-module (guix download)
#:use-module (guix build-system gnu)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages pulseaudio)
#:use-module (gnu packages xorg)
- #:export (libmikmod))
+ #:export (sdl
+ sdl2
+ libmikmod))
+
+(define sdl
+ (package
+ (name "sdl")
+ (version "1.2.15")
+ (source (origin
+ (method url-fetch)
+ (uri
+ (string-append "http://libsdl.org/release/SDL-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "005d993xcac8236fpvd1iawkz4wqjybkpn8dbwaliqz5jfkidlyn"))))
+ (build-system gnu-build-system)
+ (arguments '(#:tests? #f)) ; no check target
+ (inputs `(("libx11" ,libx11)
+ ("libxrandr" ,libxrandr)
+ ("mesa" ,mesa)
+ ("alsa-lib" ,alsa-lib)
+ ("pkg-config" ,pkg-config)
+ ("pulseaudio" ,pulseaudio)))
+ (synopsis "Cross platform game development library")
+ (description "Simple DirectMedia Layer is a cross-platform development
+library designed to provide low level access to audio, keyboard, mouse,
+joystick, and graphics hardware.")
+ (home-page "http://libsdl.org/")
+ (license lgpl2.1)))
+
+(define sdl2
+ (package (inherit sdl)
+ (name "sdl2")
+ (version "2.0.0")
+ (source (origin
+ (method url-fetch)
+ (uri
+ (string-append "http://libsdl.org/release/SDL2-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "0y3in99brki7vc2mb4c0w39v70mf4h341mblhh8nmq4h7lawhskg"))))
+ (license bsd-3)))
(define libmikmod
(package
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 6c0328556e..3d88ff8a4a 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -29,6 +29,7 @@
#:use-module (gnu packages gettext)
#:use-module (gnu packages apr)
#:use-module (gnu packages curl)
+ #:use-module (gnu packages ed)
#:use-module (gnu packages nano)
#:use-module (gnu packages openssl)
#:use-module (gnu packages perl)
@@ -262,15 +263,16 @@ projects, from individuals to large-scale enterprise operations.")
(define-public rcs
(package
(name "rcs")
- (version "5.9.0")
+ (version "5.9.1")
(source (origin
(method url-fetch)
(uri (string-append "mirror://gnu/rcs/rcs-"
version ".tar.xz"))
(sha256
(base32
- "0w26vsx732dcmb5qfhlkkzvrk1sx6d74qibrn914n14j0ci90jcq"))))
+ "1376amzaj7x6ar3xi1dldc0hgfa3n7412c46wqk2h2f2lf67jsk0"))))
(build-system gnu-build-system)
+ (native-inputs `(("ed" ,ed)))
(home-page "http://www.gnu.org/software/rcs/")
(synopsis "Per-file local revision control system")
(description
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index db055fa5fc..2413a97150 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -134,7 +134,7 @@ made available under the /xchg CIFS share."
(setenv "PATH" cu)
,(if make-disk-image?
- `(zero? (system* img "create" "image.qcow2"
+ `(zero? (system* img "create" "-f" "qcow2" "image.qcow2"
,(number->string disk-image-size)))
'(begin))
diff --git a/guix/build-system/python.scm b/guix/build-system/python.scm
index 32b1f36a94..a97135fe0c 100644
--- a/guix/build-system/python.scm
+++ b/guix/build-system/python.scm
@@ -96,6 +96,7 @@ prepended to the name."
#:key
(python (default-python))
(tests? #t)
+ (test-target "test")
(configure-flags ''())
(phases '(@ (guix build python-build-system)
%standard-phases))
@@ -124,7 +125,7 @@ provides a 'setup.py' file as its build system."
source)
#:configure-flags ,configure-flags
#:system ,system
- #:test-target "test"
+ #:test-target ,test-target
#:tests? ,tests?
#:phases ,phases
#:outputs %outputs
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 48e9d5ec05..63c1ba4f2b 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -25,6 +25,7 @@
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (ice-9 rdelim)
+ #:use-module (ice-9 vlist)
#:use-module (guix store)
#:use-module (guix utils)
#:use-module (guix hash)
@@ -63,6 +64,7 @@
derivation-path->output-path
derivation-path->output-paths
derivation
+ map-derivation
%guile-for-build
imported-modules
@@ -539,15 +541,6 @@ advance, such as a file download.
When REFERENCES-GRAPHS is true, it must be a list of file name/store path
pairs. In that case, the reference graph of each store path is exported in
the build environment in the corresponding file, in a simple text format."
- (define direct-store-path?
- (let ((len (+ 1 (string-length (%store-prefix)))))
- (lambda (p)
- ;; Return #t if P is a store path, and not a sub-directory of a
- ;; store path. This predicate is needed because files *under* a
- ;; store path are not valid inputs.
- (and (store-path? p)
- (not (string-index (substring p len) #\/))))))
-
(define (add-output-paths drv)
;; Return DRV with an actual store path for each of its output and the
;; corresponding environment variable.
@@ -655,6 +648,113 @@ the build environment in the corresponding file, in a simple text format."
inputs))))
(set-file-name drv file))))
+(define* (map-derivation store drv mapping
+ #:key (system (%current-system)))
+ "Given MAPPING, a list of pairs of derivations, return a derivation based on
+DRV where all the 'car's of MAPPING have been replaced by its 'cdr's,
+recursively."
+ (define (substitute str initial replacements)
+ (fold (lambda (path replacement result)
+ (string-replace-substring result path
+ replacement))
+ str
+ initial replacements))
+
+ (define (substitute-file file initial replacements)
+ (define contents
+ (with-fluids ((%default-port-encoding #f))
+ (call-with-input-file file get-string-all)))
+
+ (let ((updated (substitute contents initial replacements)))
+ (if (string=? updated contents)
+ file
+ ;; XXX: permissions aren't preserved.
+ (add-text-to-store store (store-path-package-name file)
+ updated))))
+
+ (define input->output-paths
+ (match-lambda
+ (((? derivation? drv))
+ (list (derivation->output-path drv)))
+ (((? derivation? drv) sub-drvs ...)
+ (map (cut derivation->output-path drv <>)
+ sub-drvs))
+ ((file)
+ (list file))))
+
+ (let ((mapping (fold (lambda (pair result)
+ (match pair
+ (((? derivation? orig) . replacement)
+ (vhash-cons (derivation-file-name orig)
+ replacement result))
+ ((file . replacement)
+ (vhash-cons file replacement result))))
+ vlist-null
+ mapping)))
+ (define rewritten-input
+ ;; Rewrite the given input according to MAPPING, and return an input
+ ;; in the format used in 'derivation' calls.
+ (memoize
+ (lambda (input loop)
+ (match input
+ (($ <derivation-input> path (sub-drvs ...))
+ (match (vhash-assoc path mapping)
+ ((_ . (? derivation? replacement))
+ (cons replacement sub-drvs))
+ ((_ . replacement)
+ (list replacement))
+ (#f
+ (let* ((drv (loop (call-with-input-file path read-derivation))))
+ (cons drv sub-drvs)))))))))
+
+ (let loop ((drv drv))
+ (let* ((inputs (map (cut rewritten-input <> loop)
+ (derivation-inputs drv)))
+ (initial (append-map derivation-input-output-paths
+ (derivation-inputs drv)))
+ (replacements (append-map input->output-paths inputs))
+
+ ;; Sources typically refer to the output directories of the
+ ;; original inputs, INITIAL. Rewrite them by substituting
+ ;; REPLACEMENTS.
+ (sources (map (lambda (source)
+ (match (vhash-assoc source mapping)
+ ((_ . replacement)
+ replacement)
+ (#f
+ (substitute-file source
+ initial replacements))))
+ (derivation-sources drv)))
+
+ ;; Now augment the lists of initials and replacements.
+ (initial (append (derivation-sources drv) initial))
+ (replacements (append sources replacements))
+ (name (store-path-package-name
+ (string-drop-right (derivation-file-name drv)
+ 4))))
+ (derivation store name
+ (substitute (derivation-builder drv)
+ initial replacements)
+ (map (cut substitute <> initial replacements)
+ (derivation-builder-arguments drv))
+ #:system system
+ #:env-vars (map (match-lambda
+ ((var . value)
+ `(,var
+ . ,(substitute value initial
+ replacements))))
+ (derivation-builder-environment-vars drv))
+ #:inputs (append (map list sources) inputs)
+ #:outputs (map car (derivation-outputs drv))
+ #:hash (match (derivation-outputs drv)
+ ((($ <derivation-output> _ algo hash))
+ hash)
+ (_ #f))
+ #:hash-algo (match (derivation-outputs drv)
+ ((($ <derivation-output> _ algo hash))
+ algo)
+ (_ #f)))))))
+
;;;
;;; Store compatibility layer.
diff --git a/guix/packages.scm b/guix/packages.scm
index 9a2f08d862..c1247b71ac 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -224,24 +224,26 @@ corresponds to the arguments expected by `set-path-environment-variable'."
(($ <location> file line column)
(catch 'system
(lambda ()
- (call-with-input-file (search-path %load-path file)
- (lambda (port)
- (goto port line column)
- (match (read port)
- (('package inits ...)
- (let ((field (assoc field inits)))
- (match field
- ((_ value)
- ;; Put the `or' here, and not in the first argument of
- ;; `and=>', to work around a compiler bug in 2.0.5.
- (or (and=> (source-properties value)
- source-properties->location)
- (and=> (source-properties field)
- source-properties->location)))
- (_
- #f))))
- (_
- #f)))))
+ ;; In general we want to keep relative file names for modules.
+ (with-fluids ((%file-port-name-canonicalization 'relative))
+ (call-with-input-file (search-path %load-path file)
+ (lambda (port)
+ (goto port line column)
+ (match (read port)
+ (('package inits ...)
+ (let ((field (assoc field inits)))
+ (match field
+ ((_ value)
+ ;; Put the `or' here, and not in the first argument of
+ ;; `and=>', to work around a compiler bug in 2.0.5.
+ (or (and=> (source-properties value)
+ source-properties->location)
+ (and=> (source-properties field)
+ source-properties->location)))
+ (_
+ #f))))
+ (_
+ #f))))))
(lambda _
#f)))
(_ #f)))
@@ -419,7 +421,7 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
#:modules modules
#:imported-modules modules
#:guile-for-build guile)))
- ((and (? string?) (? store-path?) file)
+ ((and (? string?) (? direct-store-path?) file)
file)
((? string? file)
(add-to-store store (basename file) #t "sha256" file))))
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index a06755dc7a..dd9a9b8127 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -23,6 +23,7 @@
#:use-module (guix derivations)
#:use-module (guix packages)
#:use-module (guix utils)
+ #:use-module (guix monads)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (ice-9 vlist)
@@ -38,19 +39,23 @@
(define %store
(make-parameter #f))
-(define (derivations-from-package-expressions str package-derivation
- system source?)
+(define (derivation-from-expression str package-derivation
+ system source?)
"Read/eval STR and return the corresponding derivation path for SYSTEM.
-When SOURCE? is true, return the derivations of the package sources;
-otherwise, use PACKAGE-DERIVATION to compute the derivation of a package."
- (let ((p (read/eval-package-expression str)))
- (if source?
- (let ((source (package-source p)))
- (if source
- (package-source-derivation (%store) source)
- (leave (_ "package `~a' has no source~%")
- (package-name p))))
- (package-derivation (%store) p system))))
+When SOURCE? is true and STR evaluates to a package, return the derivation of
+the package source; otherwise, use PACKAGE-DERIVATION to compute the
+derivation of a package."
+ (match (read/eval str)
+ ((? package? p)
+ (if source?
+ (let ((source (package-source p)))
+ (if source
+ (package-source-derivation (%store) source)
+ (leave (_ "package `~a' has no source~%")
+ (package-name p))))
+ (package-derivation (%store) p system)))
+ ((? procedure? proc)
+ (run-with-store (%store) (proc) #:system system))))
;;;
@@ -68,7 +73,7 @@ otherwise, use PACKAGE-DERIVATION to compute the derivation of a package."
(display (_ "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...
Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
(display (_ "
- -e, --expression=EXPR build the package EXPR evaluates to"))
+ -e, --expression=EXPR build the package or derivation EXPR evaluates to"))
(display (_ "
-S, --source build the packages' source derivations"))
(display (_ "
@@ -95,6 +100,8 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
as a garbage collector root"))
(display (_ "
--verbosity=LEVEL use the given verbosity LEVEL"))
+ (display (_ "
+ --log-file return the log file names for the given derivations"))
(newline)
(display (_ "
-h, --help display this help and exit"))
@@ -161,7 +168,10 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
(lambda (opt name arg result)
(let ((level (string->number arg)))
(alist-cons 'verbosity level
- (alist-delete 'verbosity result)))))))
+ (alist-delete 'verbosity result)))))
+ (option '("log-file") #f #f
+ (lambda (opt name arg result)
+ (alist-cons 'log-file? #t result)))))
;;;
@@ -235,68 +245,89 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
(leave (_ "~A: unknown package~%") name))))))
(with-error-handling
- (let ((opts (parse-options)))
- (define package->derivation
- (match (assoc-ref opts 'target)
- (#f package-derivation)
- (triplet
- (cut package-cross-derivation <> <> triplet <>))))
+ ;; Ask for absolute file names so that .drv file names passed from the
+ ;; user to 'read-derivation' are absolute when it returns.
+ (with-fluids ((%file-port-name-canonicalization 'absolute))
+ (let ((opts (parse-options)))
+ (define package->derivation
+ (match (assoc-ref opts 'target)
+ (#f package-derivation)
+ (triplet
+ (cut package-cross-derivation <> <> triplet <>))))
- (parameterize ((%store (open-connection)))
- (let* ((src? (assoc-ref opts 'source?))
- (sys (assoc-ref opts 'system))
- (drv (filter-map (match-lambda
- (('expression . str)
- (derivations-from-package-expressions
- str package->derivation sys src?))
- (('argument . (? derivation-path? drv))
- (call-with-input-file drv read-derivation))
- (('argument . (? string? x))
- (let ((p (find-package x)))
- (if src?
- (let ((s (package-source p)))
- (package-source-derivation
- (%store) s))
- (package->derivation (%store) p sys))))
- (_ #f))
- opts))
- (roots (filter-map (match-lambda
- (('gc-root . root) root)
- (_ #f))
- opts)))
+ (parameterize ((%store (open-connection)))
+ (let* ((src? (assoc-ref opts 'source?))
+ (sys (assoc-ref opts 'system))
+ (drv (filter-map (match-lambda
+ (('expression . str)
+ (derivation-from-expression
+ str package->derivation sys src?))
+ (('argument . (? derivation-path? drv))
+ (call-with-input-file drv read-derivation))
+ (('argument . (? store-path?))
+ ;; Nothing to do; maybe for --log-file.
+ #f)
+ (('argument . (? string? x))
+ (let ((p (find-package x)))
+ (if src?
+ (let ((s (package-source p)))
+ (package-source-derivation
+ (%store) s))
+ (package->derivation (%store) p sys))))
+ (_ #f))
+ opts))
+ (roots (filter-map (match-lambda
+ (('gc-root . root) root)
+ (_ #f))
+ opts)))
- (show-what-to-build (%store) drv
- #:use-substitutes? (assoc-ref opts 'substitutes?)
- #:dry-run? (assoc-ref opts 'dry-run?))
+ (unless (assoc-ref opts 'log-file?)
+ (show-what-to-build (%store) drv
+ #:use-substitutes? (assoc-ref opts 'substitutes?)
+ #:dry-run? (assoc-ref opts 'dry-run?)))
- ;; TODO: Add more options.
- (set-build-options (%store)
- #:keep-failed? (assoc-ref opts 'keep-failed?)
- #:build-cores (or (assoc-ref opts 'cores) 0)
- #:fallback? (assoc-ref opts 'fallback?)
- #:use-substitutes? (assoc-ref opts 'substitutes?)
- #:max-silent-time (assoc-ref opts 'max-silent-time)
- #:verbosity (assoc-ref opts 'verbosity))
+ ;; TODO: Add more options.
+ (set-build-options (%store)
+ #:keep-failed? (assoc-ref opts 'keep-failed?)
+ #:build-cores (or (assoc-ref opts 'cores) 0)
+ #:fallback? (assoc-ref opts 'fallback?)
+ #:use-substitutes? (assoc-ref opts 'substitutes?)
+ #:max-silent-time (assoc-ref opts 'max-silent-time)
+ #:verbosity (assoc-ref opts 'verbosity))
- (if (assoc-ref opts 'derivations-only?)
- (begin
- (format #t "~{~a~%~}" (map derivation-file-name drv))
- (for-each (cut register-root <> <>)
- (map (compose list derivation-file-name) drv)
- roots))
- (or (assoc-ref opts 'dry-run?)
- (and (build-derivations (%store) drv)
- (for-each (lambda (d)
- (format #t "~{~a~%~}"
- (map (match-lambda
- ((out-name . out)
- (derivation->output-path
- d out-name)))
- (derivation-outputs d))))
- drv)
- (for-each (cut register-root <> <>)
- (map (lambda (drv)
- (map cdr
- (derivation->output-paths drv)))
- drv)
- roots)))))))))
+ (cond ((assoc-ref opts 'log-file?)
+ (for-each (lambda (file)
+ (let ((log (log-file (%store) file)))
+ (if log
+ (format #t "~a~%" log)
+ (leave (_ "no build log for '~a'~%")
+ file))))
+ (delete-duplicates
+ (append (map derivation-file-name drv)
+ (filter-map (match-lambda
+ (('argument
+ . (? store-path? file))
+ file)
+ (_ #f))
+ opts)))))
+ ((assoc-ref opts 'derivations-only?)
+ (format #t "~{~a~%~}" (map derivation-file-name drv))
+ (for-each (cut register-root <> <>)
+ (map (compose list derivation-file-name) drv)
+ roots))
+ ((not (assoc-ref opts 'dry-run?))
+ (and (build-derivations (%store) drv)
+ (for-each (lambda (d)
+ (format #t "~{~a~%~}"
+ (map (match-lambda
+ ((out-name . out)
+ (derivation->output-path
+ d out-name)))
+ (derivation-outputs d))))
+ drv)
+ (for-each (cut register-root <> <>)
+ (map (lambda (drv)
+ (map cdr
+ (derivation->output-paths drv)))
+ drv)
+ roots))))))))))
diff --git a/guix/scripts/substitute-binary.scm b/guix/scripts/substitute-binary.scm
index 1afc93bbc9..83e3d25dba 100755
--- a/guix/scripts/substitute-binary.scm
+++ b/guix/scripts/substitute-binary.scm
@@ -123,7 +123,8 @@ again."
(lambda ()
body ...)
(lambda args
- ;; The SIGALRM triggers EINTR, because of the bug at
+ ;; Before Guile v2.0.9-39-gfe51c7b, the SIGALRM triggers EINTR
+ ;; because of the bug at
;; <http://lists.gnu.org/archive/html/guile-devel/2013-06/msg00050.html>.
;; When that happens, try again. Note: SA_RESTART cannot be
;; used because of <http://bugs.gnu.org/14640>.
@@ -162,10 +163,17 @@ provide."
(warning (_ "while fetching ~a: server is unresponsive~%")
(uri->string uri))
(warning (_ "try `--no-substitutes' if the problem persists~%"))
- (when port
- (close-port port)))
+
+ ;; Before Guile v2.0.9-39-gfe51c7b, EINTR was reported to the user,
+ ;; and thus PORT had to be closed and re-opened. This is not the
+ ;; case afterward.
+ (unless (or (guile-version>? "2.0.9")
+ (version>? (version) "2.0.9.39"))
+ (when port
+ (close-port port))))
(begin
- (set! port (open-socket-for-uri uri #:buffered? buffered?))
+ (when (or (not port) (port-closed? port))
+ (set! port (open-socket-for-uri uri #:buffered? buffered?)))
(http-fetch uri #:text? #f #:port port)))))))
(define-record-type <cache>
@@ -290,6 +298,12 @@ reading PORT."
(time>? (subtract-duration now (make-time time-duration 0 ttl))
(make-time time-monotonic 0 date)))
+(define %lookup-threads
+ ;; Number of threads spawned to perform lookup operations. This means we
+ ;; can have this many simultaneous HTTP GET requests to the server, which
+ ;; limits the impact of connection latency.
+ 20)
+
(define (lookup-narinfo cache path)
"Check locally if we have valid info about PATH, otherwise go to CACHE and
check what it has."
@@ -489,8 +503,9 @@ Internal tool to substitute a pre-built binary to a local build.\n"))
;; Return the subset of PATHS available in CACHE.
(let ((substitutable
(if cache
- (par-map (cut lookup-narinfo cache <>)
- paths)
+ (n-par-map %lookup-threads
+ (cut lookup-narinfo cache <>)
+ paths)
'())))
(for-each (lambda (narinfo)
(when narinfo
@@ -501,8 +516,9 @@ Internal tool to substitute a pre-built binary to a local build.\n"))
;; Reply info about PATHS if it's in CACHE.
(let ((substitutable
(if cache
- (par-map (cut lookup-narinfo cache <>)
- paths)
+ (n-par-map %lookup-threads
+ (cut lookup-narinfo cache <>)
+ paths)
'())))
(for-each (lambda (narinfo)
(format #t "~a\n~a\n~a\n"
diff --git a/guix/store.scm b/guix/store.scm
index 0f1e2f9466..2821cacdcc 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -85,9 +85,11 @@
%store-prefix
store-path?
+ direct-store-path?
derivation-path?
store-path-package-name
- store-path-hash-part))
+ store-path-hash-part
+ log-file))
(define %protocol-version #x10c)
@@ -639,6 +641,14 @@ collected, and the number of bytes freed."
;; `isStorePath' in Nix does something similar.
(string-prefix? (%store-prefix) path))
+(define (direct-store-path? path)
+ "Return #t if PATH is a store path, and not a sub-directory of a store path.
+This predicate is sometimes needed because files *under* a store path are not
+valid inputs."
+ (and (store-path? path)
+ (let ((len (+ 1 (string-length (%store-prefix)))))
+ (not (string-index (substring path len) #\/)))))
+
(define (derivation-path? path)
"Return #t if PATH is a derivation path."
(and (store-path? path) (string-suffix? ".drv" path)))
@@ -660,3 +670,23 @@ syntactically valid store path."
"/([0-9a-df-np-sv-z]{32})-[^/]+$"))))
(and=> (regexp-exec path-rx path)
(cut match:substring <> 1))))
+
+(define (log-file store file)
+ "Return the build log file for FILE, or #f if none could be found. FILE
+must be an absolute store file name, or a derivation file name."
+ (define state-dir ; XXX: factorize
+ (or (getenv "NIX_STATE_DIR") %state-directory))
+
+ (cond ((derivation-path? file)
+ (let* ((base (basename file))
+ (log (string-append (dirname state-dir) ; XXX: ditto
+ "/log/nix/drvs/"
+ (string-take base 2) "/"
+ (string-drop base 2) ".bz2")))
+ (and (file-exists? log) log)))
+ (else
+ (match (valid-derivers store file)
+ ((derivers ...)
+ ;; Return the first that works.
+ (any (cut log-file store <>) derivers))
+ (_ #f)))))
diff --git a/guix/ui.scm b/guix/ui.scm
index 8a28574c3c..f15419f7a8 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -45,6 +45,7 @@
show-what-to-build
call-with-error-handling
with-error-handling
+ read/eval
read/eval-package-expression
location->string
switch-symlinks
@@ -193,25 +194,29 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
(leave (_ "~a~%")
(strerror (system-error-errno args)))))))
-(define (read/eval-package-expression str)
- "Read and evaluate STR and return the package it refers to, or exit an
-error."
+(define (read/eval str)
+ "Read and evaluate STR, raising an error if something goes wrong."
(let ((exp (catch #t
(lambda ()
(call-with-input-string str read))
(lambda args
(leave (_ "failed to read expression ~s: ~s~%")
str args)))))
- (let ((p (catch #t
- (lambda ()
- (eval exp the-scm-module))
- (lambda args
- (leave (_ "failed to evaluate expression `~a': ~s~%")
- exp args)))))
- (if (package? p)
- p
- (leave (_ "expression `~s' does not evaluate to a package~%")
- exp)))))
+ (catch #t
+ (lambda ()
+ (eval exp the-scm-module))
+ (lambda args
+ (leave (_ "failed to evaluate expression `~a': ~s~%")
+ exp args)))))
+
+(define (read/eval-package-expression str)
+ "Read and evaluate STR and return the package it refers to, or exit an
+error."
+ (match (read/eval str)
+ ((? package? p) p)
+ (_
+ (leave (_ "expression ~s does not evaluate to a package~%")
+ str))))
(define* (show-what-to-build store drv
#:key dry-run? (use-substitutes? #t))
diff --git a/guix/utils.scm b/guix/utils.scm
index 1f3c0c8ad6..b730340eda 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013 Mark H Weaver <mhw@netris.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -62,6 +63,7 @@
guile-version>?
package-name->name+version
string-tokenize*
+ string-replace-substring
file-extension
file-sans-extension
call-with-temporary-output-file
@@ -387,6 +389,28 @@ like `string-tokenize', but SEPARATOR is a string."
(else
(reverse (cons string result))))))
+(define* (string-replace-substring str substr replacement
+ #:optional
+ (start 0)
+ (end (string-length str)))
+ "Replace all occurrences of SUBSTR in the START--END range of STR by
+REPLACEMENT."
+ (match (string-length substr)
+ (0
+ (error "string-replace-substring: empty substring"))
+ (substr-length
+ (let loop ((start start)
+ (pieces (list (substring str 0 start))))
+ (match (string-contains str substr start end)
+ (#f
+ (string-concatenate-reverse
+ (cons (substring str start) pieces)))
+ (index
+ (loop (+ index substr-length)
+ (cons* replacement
+ (substring str start index)
+ pieces))))))))
+
(define (call-with-temporary-output-file proc)
"Call PROC with a name of a temporary file and open output port to that
file; close the file and delete it when leaving the dynamic extent of this
diff --git a/po/LINGUAS b/po/LINGUAS
index 25ccd9d9dc..95242bc24c 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -4,3 +4,4 @@ en@boldquot
en@quot
eo
pt_BR
+sr
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000000..a1f3f253f6
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,1304 @@
+# Serbian translation of guix.
+# Copyright (C) 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the guix package.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: guix 0.4-pre2\n"
+"Report-Msgid-Bugs-To: ludo@gnu.org\n"
+"POT-Creation-Date: 2013-09-25 16:04+0200\n"
+"PO-Revision-Date: 2013-11-08 11:41+0200\n"
+"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Language-Team: Serbian <(nothing)>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: gnu/packages.scm:94
+#, scheme-format
+msgid "cannot access `~a': ~a~%"
+msgstr "не могу да приступим „~a“: ~a~%"
+
+#: gnu/packages/base.scm:65
+msgid "Hello, GNU world: An example GNU package"
+msgstr "Поздрав, Гну народе: Пример Гну пакета"
+
+#: gnu/packages/base.scm:66
+msgid "Yeah..."
+msgstr "Да..."
+
+#: gnu/packages/base.scm:82
+msgid "Print lines matching a pattern"
+msgstr "Исписује редове који одговарају шаблону"
+
+#: gnu/packages/base.scm:84
+msgid ""
+"The grep command searches one or more input files for lines containing a\n"
+"match to a specified pattern. By default, grep prints the matching\n"
+"lines."
+msgstr ""
+"Наредба греп претражује једну или више улазних датоотека за редовима који\n"
+"садрже поклапање са наведеним шаблоном. По основи, греп исписује поклопљене\n"
+"редове."
+
+#: gnu/packages/base.scm:102
+msgid "Stream editor"
+msgstr "Уређивач протока"
+
+#: gnu/packages/base.scm:117
+msgid ""
+"Sed (stream editor) isn't really a true text editor or text processor.\n"
+"Instead, it is used to filter text, i.e., it takes text input and performs\n"
+"some operation (or set of operations) on it and outputs the modified text.\n"
+"Sed is typically used for extracting part of a file using pattern matching or\n"
+"substituting multiple occurrences of a string within a file."
+msgstr ""
+"Сед (уређивач протока) није стварно прави уређивач или обрађивач текста.\n"
+"Напротив, користи се за издвајање текста, тј. узима улаз текста и обавља\n"
+"неке радње (или скуп радњи) на њему и даје излаз измењеног текста.\n"
+"Сед се углавном користи за издвајање дела датотеке користећи поклапање\n"
+"шаблона или замењује више појава ниске унутар датотеке."
+
+#: gnu/packages/base.scm:140
+msgid "Managing tar archives"
+msgstr "Управљање тар архивама"
+
+#: gnu/packages/base.scm:142
+msgid ""
+"The Tar program provides the ability to create tar archives, as well as\n"
+"various other kinds of manipulation. For example, you can use Tar on\n"
+"previously created archives to extract files, to store additional files, or\n"
+"to update or list files which were already stored.\n"
+"\n"
+"Initially, tar archives were used to store files conveniently on magnetic\n"
+"tape. The name \"Tar\" comes from this use; it stands for tape archiver.\n"
+"Despite the utility's name, Tar can direct its output to available devices,\n"
+"files, or other programs (using pipes), it can even access remote devices or\n"
+"files (as archives)."
+msgstr ""
+"Програм Тар обезбеђује способност стварања тар архива, као и разне друге\n"
+"врсте управљања. На пример, можете да користите Тар на већ направљеним\n"
+"архивама за извлачење датотека, за ускладиштење додатних датотека, или\n"
+"за освежавање или исписивање датотека које су већ ускладиштене.\n"
+"\n"
+"На почетку, тар архиве су биле коришћене за пригодно чување датотека на\n"
+"магнетским тракама. Назив „Тар“ је настао из такве употребе; и значи\n"
+"архивар трака. Без обзира на назив помагала, Тар може да успери свој излаз\n"
+"ка доступним уређајима, датотекама, или другим програмима (употребом спојки)\n"
+"чак може и да приступи удаљеним уређајима или датотекама (као архивама)."
+
+#: gnu/packages/base.scm:173
+msgid "Apply differences to originals, with optional backups"
+msgstr "Примењивање разлика на оригинале, са опционалним резервама"
+
+#: gnu/packages/base.scm:175
+msgid ""
+"GNU Patch takes a patch file containing a difference listing produced by\n"
+"the diff program and applies those differences to one or more original files,\n"
+"producing patched versions."
+msgstr ""
+"Гнуова закрпа узима датотеку закрпе која садржи списак разлика произведен\n"
+"програмом за разлике (diff) и примењује те разлике на једној или више\n"
+"изворних датотека, стварајући прикрпљена издања."
+
+#: gnu/packages/base.scm:193
+msgid "Comparing and merging files"
+msgstr "Упоређивање и стапање датотека"
+
+#: gnu/packages/base.scm:195
+msgid ""
+"GNU Diffutils is a package of several programs related to finding\n"
+"differences between files.\n"
+"\n"
+"Computer users often find occasion to ask how two files differ. Perhaps one\n"
+"file is a newer version of the other file. Or maybe the two files started out\n"
+"as identical copies but were changed by different people.\n"
+"\n"
+"You can use the diff command to show differences between two files, or each\n"
+"corresponding file in two directories. diff outputs differences between files\n"
+"line by line in any of several formats, selectable by command line\n"
+"options. This set of differences is often called a ‘diff’ or ‘patch’. For\n"
+"files that are identical, diff normally produces no output; for\n"
+"binary (non-text) files, diff normally reports only that they are different.\n"
+"\n"
+"You can use the cmp command to show the offsets and line numbers where two\n"
+"files differ. cmp can also show all the characters that differ between the\n"
+"two files, side by side.\n"
+"\n"
+"You can use the diff3 command to show differences among three files. When two\n"
+"people have made independent changes to a common original, diff3 can report\n"
+"the differences between the original and the two changed versions, and can\n"
+"produce a merged file that contains both persons' changes together with\n"
+"warnings about conflicts.\n"
+"\n"
+"You can use the sdiff command to merge two files interactively."
+msgstr ""
+"„GNU Diffutils“ је пакет неколико програма намењених за проналажење\n"
+"разлика између датотека.\n"
+"\n"
+"Корисници рачунара често желе да знају у чему се разликују две датотеке.\n"
+"Можда је једна датотека новије издање оне друге. Или су можда обе датотеке\n"
+"започете као истоветни умношци али су их измениле другачије особе.\n"
+"\n"
+"Можете да користите наредбу „diff“ да покажете разлике између две датотеке\n"
+"или сваку одговарајућу датотеку у два директоријума. дифф исписује разлике\n"
+"између датотека ред по ред у било ком од неколико записа, бирањем опција\n"
+"линије наредби. Овај скуп разлика се често назива „diff“ или „patch“. За\n"
+"датотеке које су исте, дифф обично не даје резултат; за извршне (не-текстуалне)\n"
+"датотеке, дифф обично извештава само о томе да се оне разликују.\n"
+"\n"
+"\n"
+"Можете да користите наредбу „cmp“ да прикажете помераје и бројеве редова\n"
+"где се две датотеке разликују. цмп може такође да покаже све знакове који\n"
+"се разликују између две датотеке, један поред другог.\n"
+"\n"
+"Можете да користите наредбу „diff3“ да прикажете разлике између три датотеке.\n"
+"Када два корисника направе независне измене у заједничком оригиналу, дифф3\n"
+"може да извести о разликама између оригинала и два измењена издања, и може да\n"
+"направи стопљену датотеку која заједно садржи измене обе особе са упозорењима о сукобима.\n"
+"\n"
+"Можете да користите наредбу „sdiff“ да међудејствено стопите две датотеке."
+
+#: gnu/packages/base.scm:246
+msgid "Operating on files matching given criteria"
+msgstr "Радње над датотекама према датим условима"
+
+#: gnu/packages/base.scm:248
+msgid ""
+"The GNU Find Utilities are the basic directory searching utilities of\n"
+"the GNU operating system. These programs are typically used in conjunction\n"
+"with other programs to provide modular and powerful directory search and file\n"
+"locating capabilities to other commands.\n"
+"\n"
+"The tools supplied with this package are:\n"
+"\n"
+" * find - search for files in a directory hierarchy;\n"
+" * locate - list files in databases that match a pattern;\n"
+" * updatedb - update a file name database;\n"
+" * xargs - build and execute command lines from standard input.\n"
+msgstr ""
+"„GNU Find Utilities“ су основна помагала за претраживање директоријума\n"
+"Гнуовог оперативног система. Ови програми се обично користе у спрези\n"
+"са другим програмима да обезбеде модуларне и моћне могућности претраге\n"
+"директоријума и налажења датотека другим наредбама.\n"
+"\n"
+"Алати који иду уз овај пакет су:\n"
+"\n"
+" * find — тражи датотеке у хијерархији директоријума;\n"
+" * locate — исписује датотеке у базама података које одговарају шаблону;\n"
+" * updatedb — освежава базу података назива датотеке;\n"
+" * xargs — гради редове извршавања наредбе са стандардног улаза.\n"
+
+#: gnu/packages/base.scm:298
+msgid "Core GNU utilities (file, text, shell)"
+msgstr "Гнуова кључна помагала (датотека, текст, шкољка)"
+
+#: gnu/packages/base.scm:300
+msgid ""
+"The GNU Core Utilities are the basic file, shell and text manipulation\n"
+"utilities of the GNU operating system. These are the core utilities which\n"
+"are expected to exist on every operating system."
+msgstr ""
+"Гнуова кључна помагала су основни алати за управљање датотекама, шкољком\n"
+"и текстом за Гнуов оперативни систем. То су кључна помагала за која се\n"
+"очекује да постоје на сваком оперативном систему."
+
+#: gnu/packages/base.scm:333
+msgid "Remake files automatically"
+msgstr "Самостално поновно стварање датотека"
+
+#: gnu/packages/base.scm:335
+msgid ""
+"Make is a tool which controls the generation of executables and other\n"
+"non-source files of a program from the program's source files.\n"
+"\n"
+"Make gets its knowledge of how to build your program from a file called the\n"
+"makefile, which lists each of the non-source files and how to compute it from\n"
+"other files. When you write a program, you should write a makefile for it, so\n"
+"that it is possible to use Make to build and install the program."
+msgstr ""
+"Мејк је алат који управља стварањем извршних и других не-изворних датотека\n"
+"програма из изворних датотека програма.\n"
+"\n"
+"Мејк сазнаје како да изгради ваш програм из датотеке зване „makefile“, која\n"
+"исписује сваку не-изворну датотеку и како да је прорчуна из других датотека.\n"
+"Када пишете програм треба да напишете и његову „makefile“ датотеку, тако\n"
+"да буде могуће користити Мејк за изградњу и инсталацију програма."
+
+#: gnu/packages/base.scm:379
+msgid "Binary utilities: bfd gas gprof ld"
+msgstr "Бинарна помагала: bfd gas gprof ld"
+
+#: gnu/packages/base.scm:381
+msgid ""
+"The GNU Binutils are a collection of binary tools. The main ones are\n"
+"`ld' (the GNU linker) and `as' (the GNU assembler). They also include the\n"
+"BFD (Binary File Descriptor) library, `gprof', `nm', `strip', etc."
+msgstr ""
+"Гнуова бинпомагала јесу скуп бинарних алата. Главни су „ld“ (Гнуов везник) и „as“ (Гнуов асемблер). У њих такође спадају библиотека „BFD“\n"
+"(Binary File Descriptor), „gprof“, „nm“, „strip“, итд."
+
+#: gnu/packages/base.scm:500
+msgid "The GNU C Library"
+msgstr "Гну Ц библиотека"
+
+#: gnu/packages/base.scm:502
+msgid ""
+"Any Unix-like operating system needs a C library: the library which\n"
+"defines the \"system calls\" and other basic facilities such as open, malloc,\n"
+"printf, exit...\n"
+"\n"
+"The GNU C library is used as the C library in the GNU system and most systems\n"
+"with the Linux kernel."
+msgstr ""
+"Сваком Јуниксоликом оперативном систему је потребна Ц библиотека: библиотека\n"
+"која одређује „системске позиве“ и остале основне олакшице као што су\n"
+"„open, malloc, printf, exit...“\n"
+"\n"
+"Гнуова Ц библиотека се користи као Ц библиотека у Гнуовом систему и већини\n"
+"система са Линукс језгром."
+
+#: gnu/packages/base.scm:571
+msgid "Database of current and historical time zones"
+msgstr "База података о текућим и застарелим временским зонама"
+
+#: gnu/packages/base.scm:572
+msgid ""
+"The Time Zone Database (often called tz or zoneinfo)\n"
+"contains code and data that represent the history of local time for many\n"
+"representative locations around the globe. It is updated periodically to\n"
+"reflect changes made by political bodies to time zone boundaries, UTC offsets,\n"
+"and daylight-saving rules."
+msgstr ""
+"База података временске зоне (често називана „tz“ или „zoneinfo“)\n"
+"садржи код и податке који представљају историјат месног времена за\n"
+"многа представљајућа места широм света. Повремено се освежава како\n"
+"би осликала промене на границама временских зона које доносе политичка\n"
+"тела, помераје КУВ-а, и правила уштеде дневног светла."
+
+#: gnu/packages/base.scm:990
+msgid "The linker wrapper"
+msgstr "Омотач повезивача"
+
+#: gnu/packages/base.scm:992
+msgid ""
+"The linker wrapper (or `ld-wrapper') wraps the linker to add any\n"
+"missing `-rpath' flags, and to detect any misuse of libraries outside of the\n"
+"store."
+msgstr ""
+"Омотач повезивача (или „ld-wrapper“) обмотава повезивача да би додао\n"
+"недостајућу опцију „-rpath“, и да би открио лоше коришћење библиотека\n"
+"изван складишта."
+
+#: gnu/packages/guile.scm:97 gnu/packages/guile.scm:166
+msgid "Scheme implementation intended especially for extensions"
+msgstr "Примена шеме нарочито осмишљена за проширења"
+
+#: gnu/packages/guile.scm:99
+msgid ""
+"GNU Guile 1.8 is an interpreter for the Scheme programming language,\n"
+"packaged as a library that can be embedded into programs to make them\n"
+"extensible. It supports many SRFIs."
+msgstr ""
+"Гну Гуиле 1.8 је преводилац програмског језика Шеме, запакован као\n"
+"библиотека која може бити уграђена у програме како би их учинила\n"
+"проширивим. Подржава многе СРФИ-ове."
+
+#: gnu/packages/guile.scm:168
+msgid ""
+"GNU Guile is an implementation of the Scheme programming language, with\n"
+"support for many SRFIs, packaged for use in a wide variety of environments.\n"
+"In addition to implementing the R5RS Scheme standard and a large subset of\n"
+"R6RS, Guile includes a module system, full access to POSIX system calls,\n"
+"networking support, multiple threads, dynamic linking, a foreign function\n"
+"call interface, and powerful string processing."
+msgstr ""
+"Гну Гуиле је примена програмског језика Шеме, са подршком за многе\n"
+"СРФИ-ове запакован за коришћење у разним окружењима.\n"
+"Као додатак примене Р5РС стандарда Шеме и великог подскупа Р6РС, Гуиле\n"
+"обухвата систем модула, потпун приступ системским позивима ПОСИКС-а, пподршку умрежавања, вишеструке нити, динамичко повезивање, сучеље позива\n"
+"страних функција, и моћну обраду ниске."
+
+#: gnu/packages/guile.scm:212
+msgid "Framework for building readers for GNU Guile"
+msgstr "Радни склоп за изградњу читача за Гну Гуила"
+
+#: gnu/packages/guile.scm:214
+msgid ""
+"Guile-Reader is a simple framework for building readers for GNU Guile.\n"
+"\n"
+"The idea is to make it easy to build procedures that extend Guile’s read\n"
+"procedure. Readers supporting various syntax variants can easily be written,\n"
+"possibly by re-using existing “token readers” of a standard Scheme\n"
+"readers. For example, it is used to implement Skribilo’s R5RS-derived\n"
+"document syntax.\n"
+"\n"
+"Guile-Reader’s approach is similar to Common Lisp’s “read table”, but\n"
+"hopefully more powerful and flexible (for instance, one may instantiate as\n"
+"many readers as needed)."
+msgstr ""
+"Гуиле-читач је једноставан радни склоп за изградњу читача за Гну Гуила.\n"
+"\n"
+"Замисао је олакшати изградњу поступака који проширују Гуилов поступак\n"
+"читања. Читачи који подржавају разне варијанте синтаксе могу бити лако\n"
+"написани, по могућству поновним коришћењем постојећих „читача “ читача\n"
+"стандардне Шеме. На пример, користи се за примену синтаксе документа која произилази из Р5РС Скрибилоа.\n"
+"\n"
+"Приступ Гуиле-читача је сличан Општем Лисповом „читању табеле“, али је на\n"
+"срећу много моћнији и прилагодљивији (на пример, неко може да покрене\n"
+"онолико читача колико му је потребно)."
+
+#: gnu/packages/guile.scm:266
+msgid "Guile bindings to ncurses"
+msgstr "Гуилеово повезивање са ен-курсом"
+
+#: gnu/packages/guile.scm:268
+msgid ""
+"GNU Guile-Ncurses is a library for the Guile Scheme interpreter that\n"
+"provides functions for creating text user interfaces. The text user interface\n"
+"functionality is built on the ncurses libraries: curses, form, panel, and\n"
+"menu."
+msgstr ""
+"Гну Гуиле Ен-курсис је библиотека за преводиоца Гуле Шеме која обезбеђује\n"
+"функције за стварање текстуалног корисничког сучеља. Функционалност текстуалног\n"
+"корисничког сучеља је изграђена на ен-курсис библиотекама: „curses, form,\n"
+"panel, и menu“."
+
+#: gnu/packages/guile.scm:292
+msgid "Run jobs at scheduled times"
+msgstr "Покретање послова у заказано време"
+
+#: gnu/packages/guile.scm:294
+msgid ""
+"The GNU package mcron (Mellor's cron) is a 100% compatible replacement\n"
+"for Vixie cron. It is written in pure Guile, and allows configuration files\n"
+"to be written in scheme (as well as Vixie's original format) for infinite\n"
+"flexibility in specifying when jobs should be run. Mcron was written by Dale\n"
+"Mellor."
+msgstr ""
+"Гнуов пакет „mcron“ (Мелоров крон) је 100% сагласна замена за Викси крон.\n"
+"Написан је у чистом Гуилу, и допушта да датотеке подешавања буду записане\n"
+"у шеми (као и у Виксијевом изворном запису) са бескрајном сагласношћу у\n"
+"навођењу када послови требају да се покрену. Написао га је Дејл Мелор."
+
+#: gnu/packages/guile.scm:323
+msgid "Collection of useful Guile Scheme modules"
+msgstr "Збирка корисних модула Гуиле Шеме"
+
+#: gnu/packages/guile.scm:325
+msgid ""
+"guile-lib is intended as an accumulation place for pure-scheme Guile\n"
+"modules, allowing for people to cooperate integrating their generic Guile\n"
+"modules into a coherent library. Think \"a down-scaled, limited-scope CPAN\n"
+"for Guile\"."
+msgstr ""
+"гуиле-библ је замишљена као место скупљања за Гуиле модуле чисте-шеме,\n"
+"омогућавајући људима да сарађују сједињавајући њихове опште Гуиле модуле\n"
+"у обједињену библиотеку. Сетите се само „down-scaled, limited-scope CPAN\n"
+"for Guile“."
+
+#: gnu/packages/lout.scm:109
+msgid "Lout, a document layout system similar in style to LaTeX"
+msgstr "Лоут, систем изгледа документа сличан у стилу ЛаТеХ-у"
+
+#: gnu/packages/lout.scm:111
+msgid ""
+"The Lout document formatting system is now reads a high-level description of\n"
+"a document similar in style to LaTeX and produces a PostScript or plain text\n"
+"output file.\n"
+"\n"
+"Lout offers an unprecedented range of advanced features, including optimal\n"
+"paragraph and page breaking, automatic hyphenation, PostScript EPS file\n"
+"inclusion and generation, equation formatting, tables, diagrams, rotation and\n"
+"scaling, sorted indexes, bibliographic databases, running headers and\n"
+"odd-even pages, automatic cross referencing, multilingual documents including\n"
+"hyphenation (most European languages are supported), formatting of computer\n"
+"programs, and much more, all ready to use. Furthermore, Lout is easily\n"
+"extended with definitions which are very much easier to write than troff of\n"
+"TeX macros because Lout is a high-level, purely functional language, the\n"
+"outcome of an eight-year research project that went back to the\n"
+"beginning."
+msgstr ""
+"Лоут систем обликовања докумената сада чита опис документа виоког нивоа\n"
+"сличан по стилу ЛаТеХ-у и даје излазну датотеку у Постскрипту или\n"
+"обичном тексту. \n"
+"\n"
+"Лоут нуди опсег напредних функција без премца, укључујући оптималан\n"
+"завршетак пасуса и странице, самосталан прелом реда, укључивање и\n"
+"стварање Постскрипт ЕПС датотеке, обликовање једначине, табеле,\n"
+"дијаграме, окретање и промену величине, поређане пописе, библиографске\n"
+"базе података, покретања заглавља и парних-непарних страница, самостално\n"
+"унакрсно упућивање, вишејезичне документе укључујући завршетак реда\n"
+"(већина европских језика је подржана), обликовање рачунарских програма,\n"
+"и још много тога, све спремно за употребу. Такође, Лоут је лако проширив\n"
+"одредницама које су много лакше за писање него трофф ТеХ макроа зато што\n"
+"је Лоут језик високог нивоа, потпуно функционалан, резултат пројекта\n"
+"осмогодишњег истраживања који се вратио на почетак."
+
+#: gnu/packages/recutils.scm:49
+msgid "Manipulate plain text files as databases"
+msgstr "Управљајте датотекама обичног текста као базама подтака"
+
+#: gnu/packages/recutils.scm:51
+msgid ""
+"GNU recutils is a set of tools and libraries to access human-editable,\n"
+"text-based databases called recfiles. The data is stored as a sequence of\n"
+"records, each record containing an arbitrary number of named fields."
+msgstr ""
+"Гну рекутилс је скуп алата и библиотека за приступ базама података заснованим на\n"
+"тексту, званим „recfiles“ које корисници могу да мењају. Подаци су ускладиштени\n"
+"као низ снимака, сваки снимак садржи одговарајући број именованих поља."
+
+#: guix/scripts/build.scm:51
+#, scheme-format
+msgid "package `~a' has no source~%"
+msgstr "пакет „~a“ нема извор~%"
+
+#: guix/scripts/build.scm:68
+msgid ""
+"Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n"
+"Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"
+msgstr ""
+"Употреба: guix build [ОПЦИЈА]... ПАКЕТ-ИЛИ-ИЗВЕДНИЦА...\n"
+"Изграђује дати ПАКЕТ-ИЛИ-ИЗВЕДНИЦУ и исписује њихове путање излаза.\n"
+
+#: guix/scripts/build.scm:70
+msgid ""
+"\n"
+" -e, --expression=EXPR build the package EXPR evaluates to"
+msgstr ""
+"\n"
+" -e, --expression=ИЗРАЗ изграђује процене ИЗРАЗА пакета на"
+
+#: guix/scripts/build.scm:72
+msgid ""
+"\n"
+" -S, --source build the packages' source derivations"
+msgstr ""
+"\n"
+" -S, --source изграђује изведенице извора пакета"
+
+#: guix/scripts/build.scm:74
+msgid ""
+"\n"
+" -s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\""
+msgstr ""
+"\n"
+" -s, --system=СИСТЕМ покушава да изгради за СИСТЕМ--e.g., „i686-linux“"
+
+#: guix/scripts/build.scm:76
+msgid ""
+"\n"
+" --target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\""
+msgstr ""
+"\n"
+" --target=ТРОЈКА унакрсно изграђује за ТРОЈКУ--e.g., „armel-linux-gnu“"
+
+#: guix/scripts/build.scm:78
+msgid ""
+"\n"
+" -d, --derivations return the derivation paths of the given packages"
+msgstr ""
+"\n"
+" -d, --derivations исписује путање изведенице датог пакета"
+
+#: guix/scripts/build.scm:80
+msgid ""
+"\n"
+" -K, --keep-failed keep build tree of failed builds"
+msgstr ""
+"\n"
+" -K, --keep-failed задржава стабло изградње неуспелих изградњи"
+
+#: guix/scripts/build.scm:82
+msgid ""
+"\n"
+" -n, --dry-run do not build the derivations"
+msgstr ""
+"\n"
+" -n, --dry-run не изграђује изведенице"
+
+#: guix/scripts/build.scm:84 guix/scripts/package.scm:519
+msgid ""
+"\n"
+" --fallback fall back to building when the substituter fails"
+msgstr ""
+"\n"
+" --fallback враћа се на изградњу када заменик не успе"
+
+#: guix/scripts/build.scm:86 guix/scripts/package.scm:521
+msgid ""
+"\n"
+" --no-substitutes build instead of resorting to pre-built substitutes"
+msgstr ""
+"\n"
+" --no-substitutes изграђује уместо да поново ређа заменике предизградње"
+
+#: guix/scripts/build.scm:88 guix/scripts/package.scm:523
+msgid ""
+"\n"
+" --max-silent-time=SECONDS\n"
+" mark the build as failed after SECONDS of silence"
+msgstr ""
+"\n"
+" --max-silent-time=СЕКУНДЕ\n"
+" означава изградњу неупелом након СЕКУНДЕ мировања"
+
+#: guix/scripts/build.scm:91
+msgid ""
+"\n"
+" -c, --cores=N allow the use of up to N CPU cores for the build"
+msgstr ""
+"\n"
+" -c, --cores=N омогућава коришћење до N језгра процесора за изградњу"
+
+#: guix/scripts/build.scm:93
+msgid ""
+"\n"
+" -r, --root=FILE make FILE a symlink to the result, and register it\n"
+" as a garbage collector root"
+msgstr ""
+"\n"
+" -r, --root=ДАТОТЕКА чини ДАТОТЕКУ симболичком везом ка резултату, и бележи је\n"
+" као корен скупљача ђубра"
+
+#: guix/scripts/build.scm:96
+msgid ""
+"\n"
+" --verbosity=LEVEL use the given verbosity LEVEL"
+msgstr ""
+"\n"
+" --verbosity=НИВО користи дати НИВО опширности"
+
+#: guix/scripts/build.scm:99 guix/scripts/download.scm:53
+#: guix/scripts/package.scm:540 guix/scripts/gc.scm:58
+#: guix/scripts/hash.scm:51 guix/scripts/pull.scm:152
+#: guix/scripts/substitute-binary.scm:463
+msgid ""
+"\n"
+" -h, --help display this help and exit"
+msgstr ""
+"\n"
+" -h, --help приказује ову помоћ и излази"
+
+#: guix/scripts/build.scm:101 guix/scripts/download.scm:55
+#: guix/scripts/package.scm:542 guix/scripts/gc.scm:60
+#: guix/scripts/hash.scm:53 guix/scripts/pull.scm:154
+#: guix/scripts/substitute-binary.scm:465
+msgid ""
+"\n"
+" -V, --version display version information and exit"
+msgstr ""
+"\n"
+" -V, --version приказује податке о издању и излази"
+
+#: guix/scripts/build.scm:141
+#, scheme-format
+msgid "~a: not a number~%"
+msgstr "~a: није број~%"
+
+#: guix/scripts/build.scm:176 guix/scripts/download.scm:96
+#: guix/scripts/package.scm:628 guix/scripts/gc.scm:152
+#: guix/scripts/pull.scm:181
+#, scheme-format
+msgid "~A: unrecognized option~%"
+msgstr "~A: непозната опција~%"
+
+#: guix/scripts/build.scm:202
+#, scheme-format
+msgid "failed to create GC root `~a': ~a~%"
+msgstr "нисам успео да направим ГЦ корен „~a“: ~a~%"
+
+#: guix/scripts/build.scm:226 guix/scripts/package.scm:674
+#, scheme-format
+msgid "ambiguous package specification `~a'~%"
+msgstr "нејасна одредница пакета „~a“~%"
+
+#: guix/scripts/build.scm:227 guix/scripts/package.scm:676
+#, scheme-format
+msgid "choosing ~a from ~a~%"
+msgstr "бирам ~a из ~a~%"
+
+#: guix/scripts/build.scm:233
+#, scheme-format
+msgid "~A: package not found for version ~a~%"
+msgstr "~A: нисам пронашао пакет за издање ~a~%"
+
+#: guix/scripts/build.scm:235
+#, scheme-format
+msgid "~A: unknown package~%"
+msgstr "~A: непознат пакет~%"
+
+#: guix/scripts/download.scm:44
+msgid ""
+"Usage: guix download [OPTION] URL\n"
+"Download the file at URL, add it to the store, and print its store path\n"
+"and the hash of its contents.\n"
+"\n"
+"Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n"
+"('hex' and 'hexadecimal' can be used as well).\n"
+msgstr ""
+"Употреба: guix download [ОПЦИЈА] АДРЕСА\n"
+"Преузима датотеку са адресе, додаје је у складиште, и исписује њену путању\n"
+"складиштења и хеш њеног садржаја.\n"
+"\n"
+"Подржани записи: „nix-base32“ (основни), „base32“, и „base16“\n"
+"(„hex“ и „hexadecimal“ могу такође бити коришћени).\n"
+
+#: guix/scripts/download.scm:50 guix/scripts/hash.scm:48
+msgid ""
+"\n"
+" -f, --format=FMT write the hash in the given format"
+msgstr ""
+"\n"
+" -f, --format=ФМТ записује хеш у датом запису"
+
+#: guix/scripts/download.scm:73 guix/scripts/hash.scm:71
+#, scheme-format
+msgid "unsupported hash format: ~a~%"
+msgstr "неподржани запис хеша: ~a~%"
+
+#: guix/scripts/download.scm:106
+#, scheme-format
+msgid "~a: failed to parse URI~%"
+msgstr "~a: нисам успео да обрадим путању~%"
+
+#: guix/scripts/download.scm:117
+#, scheme-format
+msgid "~a: download failed~%"
+msgstr "~a: преузимање није успело~%"
+
+#: guix/scripts/package.scm:227
+#, scheme-format
+msgid "switching from generation ~a to ~a~%"
+msgstr "пребацујем се са генерације ~a на ~a~%"
+
+#: guix/scripts/package.scm:232
+#, scheme-format
+msgid "profile `~a' does not exist~%"
+msgstr "профил „~a“ не постоји~%"
+
+#: guix/scripts/package.scm:236
+#, scheme-format
+msgid "nothing to do: already at the empty profile~%"
+msgstr "ништа за урадити: већ сам у празном профилу~%"
+
+#: guix/scripts/package.scm:242
+#, scheme-format
+msgid "failed to build the empty profile~%"
+msgstr "нисам успео да изградим празан профил~%"
+
+#: guix/scripts/package.scm:413
+#, scheme-format
+msgid "looking for the latest release of GNU ~a..."
+msgstr "тражим последње издање Гнуа ~a..."
+
+#: guix/scripts/package.scm:417
+#, scheme-format
+msgid "~a: note: using ~a but ~a is available upstream~%"
+msgstr "~a: напомена: користим ~a али ~a је доступно узводно~%"
+
+#: guix/scripts/package.scm:481
+#, scheme-format
+msgid "The following environment variable definitions may be needed:~%"
+msgstr "Следеће одреднице променљиве окружења могу бити потребне:~%"
+
+#: guix/scripts/package.scm:496
+msgid ""
+"Usage: guix package [OPTION]... PACKAGES...\n"
+"Install, remove, or upgrade PACKAGES in a single transaction.\n"
+msgstr ""
+"Употреба: guix package [ОПЦИЈА]... ПАКЕТИ...\n"
+"Инсталирајте, уклоните, или доградите ПАКЕТЕ у једном прелазу.\n"
+
+#: guix/scripts/package.scm:498
+msgid ""
+"\n"
+" -i, --install=PACKAGE install PACKAGE"
+msgstr ""
+"\n"
+" -i, --install=ПАКЕТ инсталира ПАКЕТ"
+
+#: guix/scripts/package.scm:500
+msgid ""
+"\n"
+" -e, --install-from-expression=EXP\n"
+" install the package EXP evaluates to"
+msgstr ""
+"\n"
+" -e, --install-from-expression=ИЗР\n"
+" инсталира процене ИЗР пакета у"
+
+#: guix/scripts/package.scm:503
+msgid ""
+"\n"
+" -r, --remove=PACKAGE remove PACKAGE"
+msgstr ""
+"\n"
+" -r, --remove=ПАКЕТ уклања ПАКЕТ"
+
+#: guix/scripts/package.scm:505
+msgid ""
+"\n"
+" -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP"
+msgstr ""
+"\n"
+" -u, --upgrade[=РЕГИЗР] дограђује све инсталиране пакете који одговарају РЕГИЗРАЗУ"
+
+#: guix/scripts/package.scm:507
+msgid ""
+"\n"
+" --roll-back roll back to the previous generation"
+msgstr ""
+"\n"
+" --roll-back враћа се на претходну генерацију"
+
+#: guix/scripts/package.scm:509
+msgid ""
+"\n"
+" --search-paths display needed environment variable definitions"
+msgstr ""
+"\n"
+" --search-paths приказује потребне одреднице променљиве окружења"
+
+#: guix/scripts/package.scm:511
+msgid ""
+"\n"
+" -l, --list-generations[=PATTERN]\n"
+" list generations matching PATTERN"
+msgstr ""
+"\n"
+" -l, --list-generations[=ШАБЛОН]\n"
+" исписује генерације које одговарају ШАБЛОНУ"
+
+#: guix/scripts/package.scm:515
+msgid ""
+"\n"
+" -p, --profile=PROFILE use PROFILE instead of the user's default profile"
+msgstr ""
+"\n"
+" -p, --profile=ПРОФИЛ користи ПРОФИЛ уместо корисничког подразумеваног"
+
+#: guix/scripts/package.scm:517
+msgid ""
+"\n"
+" -n, --dry-run show what would be done without actually doing it"
+msgstr ""
+"\n"
+" -n, --dry-run показује шта би требало да се уради а да заправо ништа не ради"
+
+#: guix/scripts/package.scm:526
+msgid ""
+"\n"
+" --bootstrap use the bootstrap Guile to build the profile"
+msgstr ""
+"\n"
+" --bootstrap користи Гуиле почетног учитавања да изгради профил"
+
+#: guix/scripts/package.scm:528 guix/scripts/pull.scm:147
+msgid ""
+"\n"
+" --verbose produce verbose output"
+msgstr ""
+"\n"
+" --verbose ствара опширан излаз"
+
+#: guix/scripts/package.scm:531
+msgid ""
+"\n"
+" -s, --search=REGEXP search in synopsis and description using REGEXP"
+msgstr ""
+"\n"
+" -s, --search=РЕГИЗР тражи у скици и опису користећи РЕГИЗР"
+
+#: guix/scripts/package.scm:533
+msgid ""
+"\n"
+" -I, --list-installed[=REGEXP]\n"
+" list installed packages matching REGEXP"
+msgstr ""
+"\n"
+" -I, --list-installed[=РЕГИЗР]\n"
+" исписује инсталиране пакете који одговарају РЕГИЗРАЗУ"
+
+#: guix/scripts/package.scm:536
+msgid ""
+"\n"
+" -A, --list-available[=REGEXP]\n"
+" list available packages matching REGEXP"
+msgstr ""
+"\n"
+" -A, --list-available[=РЕГИЗР]\n"
+" исписује доступне пакете који одговарају РЕГИЗРАЗУ"
+
+#: guix/scripts/package.scm:630
+#, scheme-format
+msgid "~A: extraneous argument~%"
+msgstr "~A: страни аргумент~%"
+
+#: guix/scripts/package.scm:658
+#, scheme-format
+msgid "package `~a' lacks output `~a'~%"
+msgstr "пакету „~a“ недостаје излаз „~a“~%"
+
+#: guix/scripts/package.scm:682
+#, scheme-format
+msgid "~a: package not found~%"
+msgstr "~a: нисам пронашао пакет~%"
+
+#: guix/scripts/package.scm:705
+#, scheme-format
+msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%"
+msgstr "Покушајте „info '(guix) Invoking guix package'“ за више података.~%"
+
+#: guix/scripts/package.scm:727
+#, scheme-format
+msgid "error: while creating directory `~a': ~a~%"
+msgstr "грешка: приликом стварања директоријума „~a“: ~a~%"
+
+#: guix/scripts/package.scm:731
+#, scheme-format
+msgid "Please create the `~a' directory, with you as the owner.~%"
+msgstr "Направите директоријум „~a“, у вашем власништву.~%"
+
+#: guix/scripts/package.scm:738
+#, scheme-format
+msgid "error: directory `~a' is not owned by you~%"
+msgstr "грешка: директоријум „~a“ није у вашем власништву~%"
+
+#: guix/scripts/package.scm:741
+#, scheme-format
+msgid "Please change the owner of `~a' to user ~s.~%"
+msgstr "Поставите као власника ~s над „~a“.~%"
+
+#: guix/scripts/package.scm:799
+#, scheme-format
+msgid "The following package would be removed:~% ~{~a~%~}~%"
+msgstr "Следећи пакети би требали бити уклоњени:~% ~{~a~%~}~%"
+
+#: guix/scripts/package.scm:804
+#, scheme-format
+msgid "The following package will be removed:~% ~{~a~%~}~%"
+msgstr "Следећи пакети ће бити уклоњени:~% ~{~a~%~}~%"
+
+#: guix/scripts/package.scm:816
+#, scheme-format
+msgid "The following package would be installed:~%~{~a~%~}~%"
+msgstr "Следећи пакети би требали бити инсталирани:~%~{~a~%~}~%"
+
+#: guix/scripts/package.scm:821
+#, scheme-format
+msgid "The following package will be installed:~%~{~a~%~}~%"
+msgstr "Следећи пакети ће бити инсталирани:~%~{~a~%~}~%"
+
+#: guix/scripts/package.scm:933
+#, scheme-format
+msgid "nothing to be done~%"
+msgstr "ништа неће бити урађено~%"
+
+#: guix/scripts/package.scm:944
+#, scheme-format
+msgid "~a package in profile~%"
+msgstr "~a пакет у профилу~%"
+
+#: guix/scripts/package.scm:959
+#, scheme-format
+msgid "Generation ~a\t~a~%"
+msgstr "Генерација ~a\t~a~%"
+
+#: guix/scripts/package.scm:977
+#, scheme-format
+msgid "profile '~a' does not exist~%"
+msgstr "профил „~a“ не постоји~%"
+
+#: guix/scripts/package.scm:986
+#, scheme-format
+msgid "invalid syntax: ~a~%"
+msgstr "неисправна синтакса: ~a~%"
+
+#: guix/scripts/gc.scm:39
+msgid ""
+"Usage: guix gc [OPTION]... PATHS...\n"
+"Invoke the garbage collector.\n"
+msgstr ""
+"Употреба: guix gc [ОПЦИЈА]... ПУТАЊЕ...\n"
+"Позовите скупљача ђубра.\n"
+
+#: guix/scripts/gc.scm:41
+msgid ""
+"\n"
+" -C, --collect-garbage[=MIN]\n"
+" collect at least MIN bytes of garbage"
+msgstr ""
+"\n"
+" -C, --collect-garbage[=НАЈМ]\n"
+" скупља барем НАЈМ бајтова ђубра"
+
+#: guix/scripts/gc.scm:44
+msgid ""
+"\n"
+" -d, --delete attempt to delete PATHS"
+msgstr ""
+"\n"
+" -d, --delete покушава да обрише ПУТАЊЕ"
+
+#: guix/scripts/gc.scm:46
+msgid ""
+"\n"
+" --list-dead list dead paths"
+msgstr ""
+"\n"
+" --list-dead исписује мртве путање"
+
+#: guix/scripts/gc.scm:48
+msgid ""
+"\n"
+" --list-live list live paths"
+msgstr ""
+"\n"
+" --list-dead исписује живе путање"
+
+#: guix/scripts/gc.scm:51
+msgid ""
+"\n"
+" --references list the references of PATHS"
+msgstr ""
+"\n"
+" --references исписује упуте ПУТАЊА"
+
+#: guix/scripts/gc.scm:53
+msgid ""
+"\n"
+" -R, --requisites list the requisites of PATHS"
+msgstr ""
+"\n"
+" --references исписује захтеве ПУТАЊА"
+
+#: guix/scripts/gc.scm:55
+msgid ""
+"\n"
+" --referrers list the referrers of PATHS"
+msgstr ""
+"\n"
+" --referrers исписује убрајаче ПУТАЊА"
+
+#: guix/scripts/gc.scm:92
+#, scheme-format
+msgid "unknown unit: ~a~%"
+msgstr "непозната јединица: ~a~%"
+
+#: guix/scripts/gc.scm:93
+#, scheme-format
+msgid "invalid number: ~a~%"
+msgstr "неисправан број: ~a~%"
+
+#: guix/scripts/gc.scm:114
+#, scheme-format
+msgid "invalid amount of storage: ~a~%"
+msgstr "неисправан износ складишта: ~a~%"
+
+#: guix/scripts/hash.scm:43
+msgid ""
+"Usage: guix hash [OPTION] FILE\n"
+"Return the cryptographic hash of FILE.\n"
+"\n"
+"Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n"
+"('hex' and 'hexadecimal' can be used as well).\n"
+msgstr ""
+"Употреба: guix hash [ОПЦИЈА] ДАТОТЕКА\n"
+"Исписује шифрерски хеш ДАТОТЕКЕ.\n"
+"\n"
+"Подржани записи: „nix-base32“ (задато), „base32“, и „base16“\n"
+"(„hex“ и „hexadecimal“ могу такође бити коришћени).\n"
+
+#: guix/scripts/hash.scm:96
+#, scheme-format
+msgid "unrecognized option: ~a~%"
+msgstr "непозната опција: ~a~%"
+
+#: guix/scripts/hash.scm:123 guix/ui.scm:187
+#, scheme-format
+msgid "~a~%"
+msgstr "~a~%"
+
+#: guix/scripts/hash.scm:126
+#, scheme-format
+msgid "wrong number of arguments~%"
+msgstr "погрешан број аргумената~%"
+
+#: guix/scripts/pull.scm:145
+msgid ""
+"Usage: guix pull [OPTION]...\n"
+"Download and deploy the latest version of Guix.\n"
+msgstr ""
+"Употреба: guix pull [ОПЦИЈА]...\n"
+"Преузима и развија најновије издање Гуикса.\n"
+
+#: guix/scripts/pull.scm:149
+msgid ""
+"\n"
+" --bootstrap use the bootstrap Guile to build the new Guix"
+msgstr ""
+"\n"
+" --bootstrap користи Гуиле почетног учитавања да изгради нови Гуикс"
+
+#: guix/scripts/pull.scm:183
+#, scheme-format
+msgid "~A: unexpected argument~%"
+msgstr "~A: неочекивани аргумент~%"
+
+#: guix/scripts/pull.scm:192
+msgid "failed to download up-to-date source, exiting\n"
+msgstr "нисам успео да преузмем најсвежији извор, излазим\n"
+
+#: guix/scripts/pull.scm:211
+#, scheme-format
+msgid "updated ~a successfully deployed under `~a'~%"
+msgstr "ажурирани ~a је успешно развијен под „~a“~%"
+
+#: guix/scripts/pull.scm:214
+#, scheme-format
+msgid "failed to update Guix, check the build log~%"
+msgstr "нисам успео да ажурирам Гуикс, проверите дневник изградње~%"
+
+#: guix/scripts/pull.scm:216
+msgid "Guix already up to date\n"
+msgstr "Гуикс је већ ажуриран\n"
+
+#: guix/scripts/substitute-binary.scm:162
+#, scheme-format
+msgid "while fetching ~a: server is unresponsive~%"
+msgstr "приликом довлачења ~a: сервер не одговара~%"
+
+#: guix/scripts/substitute-binary.scm:164
+#, scheme-format
+msgid "try `--no-substitutes' if the problem persists~%"
+msgstr "покушајте „--no-substitutes“ ако се неприлике наставе~%"
+
+#: guix/scripts/substitute-binary.scm:425
+#, scheme-format
+msgid "Downloading, please wait...~%"
+msgstr "Преузима, молим сачекајте...~%"
+
+#: guix/scripts/substitute-binary.scm:427
+#, scheme-format
+msgid "(Please consider upgrading Guile to get proper progress report.)~%"
+msgstr "(Размотрите надоградњу Гуила да добијете извештај о његовом напредовању.)~%"
+
+#: guix/scripts/substitute-binary.scm:444
+#, scheme-format
+msgid "host name lookup error: ~a~%"
+msgstr "грешка тражења назива домаћина: ~a~%"
+
+#: guix/scripts/substitute-binary.scm:453
+msgid ""
+"Usage: guix substitute-binary [OPTION]...\n"
+"Internal tool to substitute a pre-built binary to a local build.\n"
+msgstr ""
+"Употреба: guix substitute-binary [ОПЦИЈА]...\n"
+"Унутрашњи алат за замену пре-изграђеног извршног у месну изградњу.\n"
+
+#: guix/scripts/substitute-binary.scm:455
+msgid ""
+"\n"
+" --query report on the availability of substitutes for the\n"
+" store file names passed on the standard input"
+msgstr ""
+"\n"
+" --query извештава о доступности заменика за називе датотека\n"
+" складишта прослеђених на стандардном улазу"
+
+#: guix/scripts/substitute-binary.scm:458
+msgid ""
+"\n"
+" --substitute STORE-FILE DESTINATION\n"
+" download STORE-FILE and store it as a Nar in file\n"
+" DESTINATION"
+msgstr ""
+"\n"
+" --substitute ОДРЕДИШТЕ СКЛАДИШНЕ-ДАТОТЕКЕ\n"
+" преузима СКЛАДИШНУ-ДАТОТЕКУ и смешта је као Нар удатотеци\n"
+" ОДРЕДИШТЕ"
+
+#: guix/scripts/substitute-binary.scm:567
+#, scheme-format
+msgid "~a: unrecognized options~%"
+msgstr "~a: непозната опција~%"
+
+#: guix/gnu-maintenance.scm:344
+#, scheme-format
+msgid "signature verification failed for `~a'~%"
+msgstr "није успела провера потписа за „~a“~%"
+
+#: guix/gnu-maintenance.scm:346
+#, scheme-format
+msgid "(could be because the public key is not in your keyring)~%"
+msgstr "(може бити зато што јавни кључ није у вашем привеску)~%"
+
+#: guix/gnu-maintenance.scm:421
+#, scheme-format
+msgid "~a: could not locate source file"
+msgstr "~a: не могу да пронађем изворну датотеку"
+
+#: guix/gnu-maintenance.scm:426
+#, scheme-format
+msgid "~a: ~a: no `version' field in source; skipping~%"
+msgstr "~a: ~a: нема поља „version“ у извору; прескачем~%"
+
+#: guix/ui.scm:120
+#, scheme-format
+msgid "failed to install locale: ~a~%"
+msgstr "нисам успео да инсталирам локалитет: ~a~%"
+
+#: guix/ui.scm:142
+#, scheme-format
+msgid ""
+"\n"
+"Report bugs to: ~a."
+msgstr ""
+"\n"
+"Грешке пријавите на: ~a."
+
+#: guix/ui.scm:144
+#, scheme-format
+msgid ""
+"\n"
+"~a home page: <~a>"
+msgstr ""
+"\n"
+"~a матична страница: <~a>"
+
+#: guix/ui.scm:146
+msgid ""
+"\n"
+"General help using GNU software: <http://www.gnu.org/gethelp/>"
+msgstr ""
+"\n"
+"Општа помоћ користећи ГНУ софтвер: <http://www.gnu.org/gethelp/>"
+
+#: guix/ui.scm:153
+#, scheme-format
+msgid "~a: invalid number~%"
+msgstr "~a: неисправан број~%"
+
+#: guix/ui.scm:164
+#, scheme-format
+msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%"
+msgstr "~a:~a:~a: пакет „~a“ садржи неисправан улаз: ~s~%"
+
+#: guix/ui.scm:171
+#, scheme-format
+msgid "~a: ~a: build system `~a' does not support cross builds~%"
+msgstr "~a: ~a: систем изградње „~a“ не садржи унакрсне изградње~%"
+
+#: guix/ui.scm:176
+#, scheme-format
+msgid "failed to connect to `~a': ~a~%"
+msgstr "нисам успео да се повежем на „~a“: ~a~%"
+
+#: guix/ui.scm:181
+#, scheme-format
+msgid "build failed: ~a~%"
+msgstr "изградња није успела: ~a~%"
+
+#: guix/ui.scm:197
+#, scheme-format
+msgid "failed to read expression ~s: ~s~%"
+msgstr "нисам успео да прочитам израз ~s: ~s~%"
+
+#: guix/ui.scm:203
+#, scheme-format
+msgid "failed to evaluate expression `~a': ~s~%"
+msgstr "нисам успео да проценим израз „~a“: ~s~%"
+
+#: guix/ui.scm:207
+#, scheme-format
+msgid "expression `~s' does not evaluate to a package~%"
+msgstr "израз „~s“ се не процењује на пакет~%"
+
+#: guix/ui.scm:253
+#, scheme-format
+msgid "~:[The following derivation would be built:~%~{ ~a~%~}~;~]"
+msgstr "~:[Следећа изводница би требала бити изграђена:~%~{ ~a~%~}~;~]"
+
+#: guix/ui.scm:258
+#, scheme-format
+msgid "~:[The following file would be downloaded:~%~{ ~a~%~}~;~]"
+msgstr "~:[Следећа датотека би требала бити преузета:~%~{ ~a~%~}~;~]"
+
+#: guix/ui.scm:264
+#, scheme-format
+msgid "~:[The following derivation will be built:~%~{ ~a~%~}~;~]"
+msgstr "~:[Следећа изводница ће бити изграђена:~%~{ ~a~%~}~;~]"
+
+#: guix/ui.scm:269
+#, scheme-format
+msgid "~:[The following file will be downloaded:~%~{ ~a~%~}~;~]"
+msgstr "~:[Следећа датотека ће бити преузета:~%~{ ~a~%~}~;~]"
+
+#: guix/ui.scm:286
+msgid "<unknown location>"
+msgstr "<непознато место>"
+
+#: guix/ui.scm:314
+#, scheme-format
+msgid "failed to create configuration directory `~a': ~a~%"
+msgstr "нисам успео да направим директоријум подешавања „~a“: ~a~%"
+
+#: guix/ui.scm:390 guix/ui.scm:400
+msgid "unknown"
+msgstr "непознато"
+
+#: guix/ui.scm:484
+#, scheme-format
+msgid "invalid argument: ~a~%"
+msgstr "неисправан аргумент: ~a~%"
+
+#: guix/ui.scm:489
+#, scheme-format
+msgid "Try `guix --help' for more information.~%"
+msgstr "Пробајте „guix --help“ за више података.~%"
+
+#: guix/ui.scm:516
+msgid ""
+"Usage: guix COMMAND ARGS...\n"
+"Run COMMAND with ARGS.\n"
+msgstr ""
+"Употреба: guix НАРЕДБА АРГУМЕНТИ...\n"
+"Покрените НАРЕДБУ са АРГУМЕНТИМА.\n"
+
+#: guix/ui.scm:519
+msgid "COMMAND must be one of the sub-commands listed below:\n"
+msgstr "НАРЕДБА мора бити једна од подкоманди наведених испод:\n"
+
+#: guix/ui.scm:538
+#, scheme-format
+msgid "guix: ~a: command not found~%"
+msgstr "guix: ~a: нисам пронашао наредбу~%"
+
+#: guix/ui.scm:556
+#, scheme-format
+msgid "guix: missing command name~%"
+msgstr "guix: недостаје назив наредбе~%"
+
+#: guix/ui.scm:564
+#, scheme-format
+msgid "guix: unrecognized option '~a'~%"
+msgstr "guix: непозната опција „~a“~%"
+
+#: guix/http-client.scm:186
+#, scheme-format
+msgid "using Guile ~a, which does not support ~s encoding~%"
+msgstr "користим Гуиле ~a, који не подржава ~s кодирање~%"
+
+#: guix/http-client.scm:189
+#, scheme-format
+msgid "download failed; use a newer Guile~%"
+msgstr "преузимање није успело; користите новији Гуиле~%"
+
+#: guix/http-client.scm:201
+#, scheme-format
+msgid "following redirection to `~a'...~%"
+msgstr "пратим преусмеравање на „~a“...~%"
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 273db22765..a4e073bf07 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -26,6 +26,7 @@
#:use-module ((guix packages) #:select (package-derivation))
#:use-module ((gnu packages) #:select (search-bootstrap-binary))
#:use-module (gnu packages bootstrap)
+ #:use-module ((gnu packages guile) #:select (guile-1.8))
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
@@ -690,6 +691,57 @@ Deriver: ~a~%"
((p2 . _)
(string<? p1 p2)))))))))))))
+
+(test-equal "map-derivation"
+ "hello"
+ (let* ((joke (package-derivation %store guile-1.8))
+ (good (package-derivation %store %bootstrap-guile))
+ (drv1 (build-expression->derivation %store "original-drv1"
+ (%current-system)
+ #f ; systematically fail
+ '()
+ #:guile-for-build joke))
+ (drv2 (build-expression->derivation %store "original-drv2"
+ (%current-system)
+ '(call-with-output-file %output
+ (lambda (p)
+ (display "hello" p)))
+ '()))
+ (drv3 (build-expression->derivation %store "drv-to-remap"
+ (%current-system)
+ '(let ((in (assoc-ref
+ %build-inputs "in")))
+ (copy-file in %output))
+ `(("in" ,drv1))
+ #:guile-for-build joke))
+ (drv4 (map-derivation %store drv3 `((,drv1 . ,drv2)
+ (,joke . ,good))))
+ (out (derivation->output-path drv4)))
+ (and (build-derivations %store (list (pk 'remapped drv4)))
+ (call-with-input-file out get-string-all))))
+
+(test-equal "map-derivation, sources"
+ "hello"
+ (let* ((script1 (add-text-to-store %store "fail.sh" "exit 1"))
+ (script2 (add-text-to-store %store "hi.sh" "echo -n hello > $out"))
+ (bash-full (package-derivation %store (@ (gnu packages bash) bash)))
+ (drv1 (derivation %store "drv-to-remap"
+
+ ;; XXX: This wouldn't work in practice, but if
+ ;; we append "/bin/bash" then we can't replace
+ ;; it with the bootstrap bash, which is a
+ ;; single file.
+ (derivation->output-path bash-full)
+
+ `("-e" ,script1)
+ #:inputs `((,bash-full) (,script1))))
+ (drv2 (map-derivation %store drv1
+ `((,bash-full . ,%bash)
+ (,script1 . ,script2))))
+ (out (derivation->output-path drv2)))
+ (and (build-derivations %store (list (pk 'remapped* drv2)))
+ (call-with-input-file out get-string-all))))
+
(test-end)
diff --git a/tests/guix-build.sh b/tests/guix-build.sh
index 83de9f5285..391e7b9da3 100644
--- a/tests/guix-build.sh
+++ b/tests/guix-build.sh
@@ -36,6 +36,17 @@ guix build -e '(@@ (gnu packages base) %bootstrap-guile)' | \
guix build hello -d | \
grep -e '-hello-[0-9\.]\+\.drv$'
+# Should all return valid log files.
+drv="`guix build -d -e '(@@ (gnu packages base) %bootstrap-guile)'`"
+out="`guix build -e '(@@ (gnu packages base) %bootstrap-guile)'`"
+log="`guix build --log-file $drv`"
+echo "$log" | grep log/.*guile.*drv
+test -f "$log"
+test "`guix build -e '(@@ (gnu packages base) %bootstrap-guile)' --log-file`" \
+ = "$log"
+test "`guix build --log-file guile-bootstrap`" = "$log"
+test "`guix build --log-file $out`" = "$log"
+
# Should fail because the name/version combination could not be found.
if guix build hello-0.0.1 -n; then false; else true; fi
@@ -61,3 +72,11 @@ if guix build -n time-3.2; # FAIL, version not found
then false; else true; fi
if guix build -n something-that-will-never-exist; # FAIL
then false; else true; fi
+
+# Invoking a monadic procedure.
+guix build -e "(begin
+ (use-modules (guix monads) (guix utils))
+ (lambda ()
+ (derivation-expression \"test\" (%current-system)
+ '(mkdir %output) '())))" \
+ --dry-run
diff --git a/tests/packages.scm b/tests/packages.scm
index 8d0d205f54..04e3b0bce9 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -81,6 +81,12 @@
(list version `(version ,version))))
(not (package-field-location %bootstrap-guile 'does-not-exist)))))
+;; Make sure we don't change the file name to an absolute file name.
+(test-equal "package-field-location, relative file name"
+ (location-file (package-location %bootstrap-guile))
+ (with-fluids ((%file-port-name-canonicalization 'absolute))
+ (location-file (package-field-location %bootstrap-guile 'version))))
+
(test-assert "package-transitive-inputs"
(let* ((a (dummy-package "a"))
(b (dummy-package "b"
@@ -122,6 +128,17 @@
(package-source package))))
(string=? file source)))
+(test-assert "package-source-derivation, indirect store path"
+ (let* ((dir (add-to-store %store "guix-build" #t "sha256"
+ (dirname (search-path %load-path
+ "guix/build/utils.scm"))))
+ (package (package (inherit (dummy-package "p"))
+ (source (string-append dir "/utils.scm"))))
+ (source (package-source-derivation %store
+ (package-source package))))
+ (and (direct-store-path? source)
+ (string-suffix? "utils.scm" source))))
+
(test-equal "package-source-derivation, snippet"
"OK"
(let* ((file (search-bootstrap-binary "guile-2.0.9.tar.xz"
diff --git a/tests/store.scm b/tests/store.scm
index b5e0cb0eab..741803884d 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -65,6 +65,15 @@
(string-append (%store-prefix)
"/foo/bar/283gqy39v3g9dxjy26rynl0zls82fmcg-guile-2.0.7")))
+(test-assert "direct-store-path?"
+ (and (direct-store-path?
+ (string-append (%store-prefix)
+ "/283gqy39v3g9dxjy26rynl0zls82fmcg-guile-2.0.7"))
+ (not (direct-store-path?
+ (string-append
+ (%store-prefix)
+ "/283gqy39v3g9dxjy26rynl0zls82fmcg-guile-2.0.7/bin/guile")))))
+
(test-skip (if %store 0 10))
(test-assert "dead-paths"
@@ -140,6 +149,33 @@
(equal? (valid-derivers %store o)
(list (derivation-file-name d))))))
+(test-assert "log-file, derivation"
+ (let* ((b (add-text-to-store %store "build" "echo $foo > $out" '()))
+ (s (add-to-store %store "bash" #t "sha256"
+ (search-bootstrap-binary "bash"
+ (%current-system))))
+ (d (derivation %store "the-thing"
+ s `("-e" ,b)
+ #:env-vars `(("foo" . ,(random-text)))
+ #:inputs `((,b) (,s)))))
+ (and (build-derivations %store (list d))
+ (file-exists? (pk (log-file %store (derivation-file-name d)))))))
+
+(test-assert "log-file, output file name"
+ (let* ((b (add-text-to-store %store "build" "echo $foo > $out" '()))
+ (s (add-to-store %store "bash" #t "sha256"
+ (search-bootstrap-binary "bash"
+ (%current-system))))
+ (d (derivation %store "the-thing"
+ s `("-e" ,b)
+ #:env-vars `(("foo" . ,(random-text)))
+ #:inputs `((,b) (,s))))
+ (o (derivation->output-path d)))
+ (and (build-derivations %store (list d))
+ (file-exists? (pk (log-file %store o)))
+ (string=? (log-file %store (derivation-file-name d))
+ (log-file %store o)))))
+
(test-assert "no substitutes"
(let* ((s (open-connection))
(d1 (package-derivation s %bootstrap-guile (%current-system)))
diff --git a/tests/utils.scm b/tests/utils.scm
index 4f6ecc514d..017d9170fa 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -82,6 +82,14 @@
(string-tokenize* "foo!bar!" "!")
(string-tokenize* "foo+-+bar+-+baz" "+-+")))
+(test-equal "string-replace-substring"
+ '("foo BAR! baz"
+ "/gnu/store/chbouib"
+ "")
+ (list (string-replace-substring "foo bar baz" "bar" "BAR!")
+ (string-replace-substring "/nix/store/chbouib" "/nix/" "/gnu/")
+ (string-replace-substring "" "foo" "bar")))
+
(test-equal "fold2, 1 list"
(list (reverse (iota 5))
(map - (reverse (iota 5))))