diff options
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)))) |