diff options
31 files changed, 2155 insertions, 375 deletions
diff --git a/Makefile.am b/Makefile.am index 324674a60e..af6870cf67 100644 --- a/Makefile.am +++ b/Makefile.am @@ -86,6 +86,8 @@ MODULES = \ guix/derivations.scm \ guix/grafts.scm \ guix/inferior.scm \ + guix/describe.scm \ + guix/channels.scm \ guix/gnu-maintenance.scm \ guix/self.scm \ guix/upstream.scm \ diff --git a/build-aux/compile-as-derivation.scm b/build-aux/compile-as-derivation.scm index 59a84b1415..d945a8c79c 100644 --- a/build-aux/compile-as-derivation.scm +++ b/build-aux/compile-as-derivation.scm @@ -20,13 +20,20 @@ (use-modules (srfi srfi-26)) -;; Add ~/.config/guix/latest to the search path. -(add-to-load-path - (and=> (or (getenv "XDG_CONFIG_HOME") - (and=> (getenv "HOME") - (cut string-append <> "/.config"))) - (cute string-append <> "/guix/current/share/guile/site/" - (effective-version)))) +;; Add ~/.config/guix/current to the search path. +(eval-when (expand load eval) + (and=> (or (getenv "XDG_CONFIG_HOME") + (and=> (getenv "HOME") + (cut string-append <> "/.config/guix/current"))) + (lambda (current) + (set! %load-path + (cons (string-append current "/share/guile/site/" + (effective-version)) + %load-path)) + (set! %load-compiled-path + (cons (string-append current "/lib/guile/" (effective-version) + "/site-ccache") + %load-compiled-path))))) (use-modules (guix) (guix ui) (guix git-download) diff --git a/build-aux/update-NEWS.scm b/build-aux/update-NEWS.scm index 2e8f68c9a8..a9dffef1d2 100644 --- a/build-aux/update-NEWS.scm +++ b/build-aux/update-NEWS.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2017 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -128,11 +128,10 @@ paragraph." (define (main . args) (match args ((news-file data-directory) - ;; Don't browse things listed in the user's $GUIX_PACKAGE_PATH. Here we - ;; assume that the last item in (%package-module-path) is the distro - ;; directory. + ;; Don't browse things listed in the user's $GUIX_PACKAGE_PATH and + ;; in external channels. (parameterize ((%package-module-path - (list (last (%package-module-path))))) + %default-package-module-path)) (define (package-file version) (string-append data-directory "/packages-" version ".txt")) diff --git a/doc/guix.texi b/doc/guix.texi index 8611059791..307f915dbb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -146,17 +146,18 @@ Package Management * Packages with Multiple Outputs:: Single source package, multiple outputs. * Invoking guix gc:: Running the garbage collector. * Invoking guix pull:: Fetching the latest Guix and distribution. +* Channels:: Customizing the package collection. * Invoking guix pack:: Creating software bundles. * Invoking guix archive:: Exporting and importing store files. Substitutes -* Official Substitute Server:: One particular source of substitutes. -* Substitute Server Authorization:: How to enable or disable substitutes. -* Substitute Authentication:: How Guix verifies substitutes. -* Proxy Settings:: How to get substitutes via proxy. -* Substitution Failure:: What happens when substitution fails. -* On Trusting Binaries:: How can you trust that binary blob? +* Official Substitute Server:: One particular source of substitutes. +* Substitute Server Authorization:: How to enable or disable substitutes. +* Substitute Authentication:: How Guix verifies substitutes. +* Proxy Settings:: How to get substitutes via proxy. +* Substitution Failure:: What happens when substitution fails. +* On Trusting Binaries:: How can you trust that binary blob? Programming Interface @@ -202,7 +203,7 @@ GNU Distribution * System Installation:: Installing the whole operating system. * System Configuration:: Configuring the operating system. -* Documentation:: Browsing software user manuals. +* Documentation:: Browsing software user manuals. * Installing Debugging Files:: Feeding the debugger. * Security Updates:: Deploying security fixes quickly. * Package Modules:: Packages from the programmer's viewpoint. @@ -264,7 +265,7 @@ Services * Audio Services:: The MPD. * Virtualization Services:: Virtualization services. * Version Control Services:: Providing remote access to Git repositories. -* Game Services:: Game servers. +* Game Services:: Game servers. * Miscellaneous Services:: Other services. Defining Services @@ -1694,6 +1695,7 @@ guix package -i emacs-guix * Packages with Multiple Outputs:: Single source package, multiple outputs. * Invoking guix gc:: Running the garbage collector. * Invoking guix pull:: Fetching the latest Guix and distribution. +* Channels:: Customizing the package collection. * Invoking guix pack:: Creating software bundles. * Invoking guix archive:: Exporting and importing store files. @end menu @@ -2276,12 +2278,12 @@ pre-built package binaries, but source tarballs, for instance, which also result from derivation builds, can be available as substitutes. @menu -* Official Substitute Server:: One particular source of substitutes. -* Substitute Server Authorization:: How to enable or disable substitutes. -* Substitute Authentication:: How Guix verifies substitutes. -* Proxy Settings:: How to get substitutes via proxy. -* Substitution Failure:: What happens when substitution fails. -* On Trusting Binaries:: How can you trust that binary blob? +* Official Substitute Server:: One particular source of substitutes. +* Substitute Server Authorization:: How to enable or disable substitutes. +* Substitute Authentication:: How Guix verifies substitutes. +* Proxy Settings:: How to get substitutes via proxy. +* Substitution Failure:: What happens when substitution fails. +* On Trusting Binaries:: How can you trust that binary blob? @end menu @node Official Substitute Server @@ -2746,7 +2748,8 @@ the distribution currently available on your local machine. To update that distribution, along with the Guix tools, you must run @command{guix pull}: the command downloads the latest Guix source code and package descriptions, and deploys it. Source code is downloaded from a -@uref{https://git-scm.com, Git} repository. +@uref{https://git-scm.com, Git} repository, by default the official +GNU@tie{}Guix repository, though this can be customized. On completion, @command{guix package} will use packages and package versions from this just-retrieved copy of Guix. Not only that, but all @@ -2821,20 +2824,23 @@ but it supports the following options: Produce verbose output, writing build logs to the standard error output. @item --url=@var{url} -Download Guix from the Git repository at @var{url}. - -@vindex GUIX_PULL_URL -By default, the source is taken from its canonical Git repository at -@code{gnu.org}, for the stable branch of Guix. To use a different source, -set the @code{GUIX_PULL_URL} environment variable. - -@item --commit=@var{commit} -Deploy @var{commit}, a valid Git commit ID represented as a hexadecimal -string. - -@item --branch=@var{branch} -Deploy the tip of @var{branch}, the name of a Git branch available on -the repository at @var{url}. +@itemx --commit=@var{commit} +@itemx --branch=@var{branch} +Download code from the specified @var{url}, at the given @var{commit} (a valid +Git commit ID represented as a hexadecimal string), or @var{branch}. + +@cindex @file{channels.scm}, configuration file +@cindex configuration file for channels +These options are provided for convenience, but you can also specify your +configuration in the @file{~/.config/guix/channels.scm} file or using the +@option{--channels} option (see below). + +@item --channels=@var{file} +@itemx -C @var{file} +Read the list of channels from @var{file} instead of +@file{~/.config/guix/channels.scm}. @var{file} must contain Scheme code that +evaluates to a list of channel objects. @xref{Channels}, for more +information. @item --list-generations[=@var{pattern}] @itemx -l [@var{pattern}] @@ -2848,9 +2854,180 @@ Use the bootstrap Guile to build the latest Guix. This option is only useful to Guix developers. @end table +The @dfn{channel} mechanism allows you to instruct @command{guix pull} which +repository and branch to pull from, as well as @emph{additional} repositories +containing package modules that should be deployed. @xref{Channels}, for more +information. + In addition, @command{guix pull} supports all the common build options (@pxref{Common Build Options}). +@node Channels +@section Channels + +@cindex channels +@cindex @file{channels.scm}, configuration file +@cindex configuration file for channels +@cindex @command{guix pull}, configuration file +@cindex configuration of @command{guix pull} +Guix and its package collection are updated by running @command{guix pull} +(@pxref{Invoking guix pull}). By default @command{guix pull} downloads and +deploys Guix itself from the official GNU@tie{}Guix repository. This can be +customized by defining @dfn{channels} in the +@file{~/.config/guix/channels.scm} file. A channel specifies a URL and branch +of a Git repository to be deployed, and @command{guix pull} can be instructed +to pull from one or more channels. In other words, channels can be used to +@emph{customize} and to @emph{extend} Guix, as we will see below. + +@subsection Using a Custom Guix Channel + +The channel called @code{guix} specifies where Guix itself---its command-line +tools as well as its package collection---should be downloaded. For instance, +suppose you want to update from your own copy of the Guix repository at +@code{example.org}, and specifically the @code{super-hacks} branch, you can +write in @code{~/.config/guix/channels.scm} this specification: + +@lisp +;; Tell 'guix pull' to use my own repo. +(list (channel + (name 'guix) + (url "https://example.org/my-guix.git") + (branch "super-hacks"))) +@end lisp + +@noindent +From there on, @command{guix pull} will fetch code from the @code{super-hacks} +branch of the repository at @code{example.org}. + +@subsection Specifying Additional Channels + +@cindex extending the package collection (channels) +@cindex personal packages (channels) +@cindex channels, for personal packages +You can also specify @emph{additional channels} to pull from. Let's say you +have a bunch of custom package variants or personal packages that you think +would make little sense to contribute to the Guix project, but would like to +have these packages transparently available to you at the command line. You +would first write modules containing those package definitions (@pxref{Package +Modules}), maintain them in a Git repository, and then you and anyone else can +use it as an additional channel to get packages from. Neat, no? + +@c What follows stems from discussions at +@c <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22629#134> as well as +@c earlier discussions on guix-devel@gnu.org. +@quotation Warning +Before you, dear user, shout---``woow this is @emph{soooo coool}!''---and +publish your personal channel to the world, we would like to share a few words +of caution: + +@itemize +@item +Before publishing a channel, please consider contributing your package +definitions to Guix proper (@pxref{Contributing}). Guix as a project is open +to free software of all sorts, and packages in Guix proper are readily +available to all Guix users and benefit from the project's quality assurance +process. + +@item +When you maintain package definitions outside Guix, we, Guix developers, +consider that @emph{the compatibility burden is on you}. Remember that +package modules and package definitions are just Scheme code that uses various +programming interfaces (APIs). We want to remain free to change these APIs to +keep improving Guix, possibly in ways that break your channel. We never +change APIs gratuitously, but we will @emph{not} commit to freezing APIs +either. + +@item +Corollary: if you're using an external channel and that channel breaks, please +@emph{report the issue to the channel authors}, not to the Guix project. +@end itemize + +You've been warned! Having said this, we believe external channels are a +practical way to exert your freedom to augment Guix' package collection and to +share your improvements, which are basic tenets of +@uref{https://www.gnu.org/philosophy/free-sw.html, free software}. Please +email us at @email{guix-devel@@gnu.org} if you'd like to discuss this. +@end quotation + +Once you have a Git repository containing your own package modules, you can +write @code{~/.config/guix/channels.scm} to instruct @command{guix pull} to +pull from your personal channel @emph{in addition} to the default Guix +channel(s): + +@vindex %default-channels +@lisp +;; Add my personal packages to those Guix provides. +(cons (channel + (name 'my-personal-packages) + (url "https://example.org/personal-packages.git")) + %default-channels) +@end lisp + +@noindent +Note that the snippet above is (as always!) Scheme code; we use @code{cons} to +add a channel the list of channels that the variable @code{%default-channels} +is bound to (@pxref{Pairs, @code{cons} and lists,, guile, GNU Guile Reference +Manual}). With this file in place, @command{guix pull} builds not only Guix +but also the package modules from your own repository. The result in +@file{~/.config/guix/current} is the union of Guix with your own package +modules: + +@example +$ guix pull --list-generations +@dots{} +Generation 19 Aug 27 2018 16:20:48 + guix d894ab8 + repository URL: https://git.savannah.gnu.org/git/guix.git + branch: master + commit: d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300 + my-personal-packages dd3df5e + repository URL: https://example.org/personal-packages.git + branch: master + commit: dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb + 11 new packages: my-gimp, my-emacs-with-cool-features, @dots{} + 4 packages upgraded: emacs-racket-mode@@0.0.2-2.1b78827, @dots{} +@end example + +@noindent +The output of @command{guix pull} above shows that Generation@tie{}19 includes +both Guix and packages from the @code{my-personal-packages} channel. Among +the new and upgraded packages that are listed, some like @code{my-gimp} and +@code{my-emacs-with-cool-features} might come from +@code{my-personal-packages}, while others come from the Guix default channel. + +@subsection Replicating Guix + +@cindex pinning, channels +@cindex replicating Guix +@cindex reproducibility, of Guix +The @command{guix pull --list-generations} output above shows precisely which +commits were used to build this instance of Guix. We can thus replicate it, +say, on another machine, by providing a channel specification in +@file{~/.config/guix/channels.scm} that is ``pinned'' to these commits: + +@lisp +;; Deploy specific commits of my channels of interest. +(list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300")) + (channel + (name 'my-personal-packages) + (url "https://example.org/personal-packages.git") + (branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb"))) +@end lisp + +At this point the two machines run the @emph{exact same Guix}, with access to +the @emph{exact same packages}. The output of @command{guix build gimp} on +one machine will be exactly the same, bit for bit, as the output of the same +command on the other machine. It also means both machines have access to all +the source code of Guix and, transitively, to all the source code of every +package it defines. + +This gives you super powers, allowing you to track the provenance of binary +artifacts with very fine grain, and to reproduce software environments at +will---some sort of ``meta reproducibility'' capabilities, if you will. + @node Invoking guix pack @section Invoking @command{guix pack} @@ -3431,9 +3608,9 @@ more information on how to test package definitions, and @ref{Invoking guix lint}, for information on how to check a definition for style conformance. @vindex GUIX_PACKAGE_PATH -Lastly, @pxref{Package Modules}, for information +Lastly, @pxref{Channels}, for information on how to extend the distribution by adding your own package definitions -to @code{GUIX_PACKAGE_PATH}. +in a ``channel''. Finally, updating the package definition to a new upstream version can be partly automated by the @command{guix refresh} command @@ -6255,8 +6432,8 @@ and that of Vim. If you are using a Guix Git checkout (@pxref{Building from Git}), or have created your own packages on @code{GUIX_PACKAGE_PATH} -(@pxref{Defining Packages}), you will be able to edit the package -recipes. Otherwise, you will be able to examine the read-only recipes +(@pxref{Package Modules}), you will be able to edit the package +recipes. In other cases, you will be able to examine the read-only recipes for packages currently in the store. @@ -8376,7 +8553,7 @@ For information on porting to other architectures or kernels, @menu * System Installation:: Installing the whole operating system. * System Configuration:: Configuring the operating system. -* Documentation:: Browsing software user manuals. +* Documentation:: Browsing software user manuals. * Installing Debugging Files:: Feeding the debugger. * Security Updates:: Deploying security fixes quickly. * Package Modules:: Packages from the programmer's viewpoint. @@ -8415,7 +8592,7 @@ available. @menu * Limitations:: What you can expect. * Hardware Considerations:: Supported hardware. -* USB Stick and DVD Installation:: Preparing the installation medium. +* USB Stick and DVD Installation:: Preparing the installation medium. * Preparing for Installation:: Networking, partitioning, etc. * Proceeding with the Installation:: The real thing. * Installing GuixSD in a VM:: GuixSD playground. @@ -10096,7 +10273,7 @@ declaration. * Audio Services:: The MPD. * Virtualization Services:: Virtualization services. * Version Control Services:: Providing remote access to Git repositories. -* Game Services:: Game servers. +* Game Services:: Game servers. * Miscellaneous Services:: Other services. @end menu @@ -13362,7 +13539,7 @@ Users need to be in the @code{lp} group to access the D-Bus service. The @code{(gnu services sound)} module provides a service to configure the Advanced Linux Sound Architecture (ALSA) system, which making PulseAudio the -prefered ALSA output driver. +preferred ALSA output driver. @deffn {Scheme Variable} alsa-service-type This is the type for the @uref{https://alsa-project.org/, Advanced Linux Sound @@ -17248,7 +17425,7 @@ When true, don't read the hostnames in /etc/hosts. @item @code{port} (default: @code{53}) The port to listen on. Setting this to zero completely disables DNS -funtion, leaving only DHCP and/or TFTP. +responses, leaving only DHCP and/or TFTP functions. @item @code{local-service?} (default: @code{#t}) Accept DNS queries only from hosts whose address is on a local subnet, @@ -22641,16 +22818,24 @@ name and module name must match. For instance, the @code{(my-packages emacs)} module must be stored in a @file{my-packages/emacs.scm} file relative to the load path specified with @option{--load-path} or @code{GUIX_PACKAGE_PATH}. @xref{Modules and the File System,,, -guile, GNU Guile Reference Manual}, for details.}. These package definitions -will not be visible by default. Users can invoke commands such as -@command{guix package} and @command{guix build} with the -@code{-e} option so that they know where to find the package. Better -yet, they can use the -@code{-L} option of these commands to make those modules visible -(@pxref{Invoking guix build, @code{--load-path}}), or define the -@code{GUIX_PACKAGE_PATH} environment variable. This environment -variable makes it easy to extend or customize the distribution and is -honored by all the user interfaces. +guile, GNU Guile Reference Manual}, for details.}. There are two ways to make +these package definitions visible to the user interfaces: + +@enumerate +@item +By adding the directory containing your package modules to the search path +with the @code{-L} flag of @command{guix package} and other commands +(@pxref{Common Build Options}), or by setting the @code{GUIX_PACKAGE_PATH} +environment variable described below. + +@item +By defining a @dfn{channel} and configuring @command{guix pull} so that it +pulls from it. A channel is essentially a Git repository containing package +modules. @xref{Channels}, for more information on how to define and use +channels. +@end enumerate + +@code{GUIX_PACKAGE_PATH} works similarly to other search path variables: @defvr {Environment Variable} GUIX_PACKAGE_PATH This is a colon-separated list of directories to search for additional diff --git a/gnu/local.mk b/gnu/local.mk index 3b92a7ac0e..d929ec0da8 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -791,6 +791,8 @@ dist_patch_DATA = \ %D%/packages/patches/gtkglext-disable-disable-deprecated.patch \ %D%/packages/patches/gzdoom-search-in-installed-share.patch \ %D%/packages/patches/handbrake-pkg-config-path.patch \ + %D%/packages/patches/haskell-mode-unused-variables.patch \ + %D%/packages/patches/haskell-mode-make-check.patch \ %D%/packages/patches/hdf4-architectures.patch \ %D%/packages/patches/hdf4-reproducibility.patch \ %D%/packages/patches/hdf4-shared-fortran.patch \ @@ -1124,6 +1126,7 @@ dist_patch_DATA = \ %D%/packages/patches/ruby-concurrent-test-arm.patch \ %D%/packages/patches/ruby-rack-ignore-failing-test.patch \ %D%/packages/patches/ruby-tzinfo-data-ignore-broken-test.patch\ + %D%/packages/patches/rust-1.19-mrustc.patch \ %D%/packages/patches/rust-bootstrap-stage0-test.patch \ %D%/packages/patches/rust-coresimd-doctest.patch \ %D%/packages/patches/rxvt-unicode-escape-sequences.patch \ diff --git a/gnu/packages.scm b/gnu/packages.scm index 7b954769e9..532297239d 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -30,6 +30,7 @@ #:select ((package-name->name+version . hyphen-separated-name->name+version))) #:autoload (guix profiles) (packages->manifest) + #:use-module (guix describe) #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (srfi srfi-1) @@ -46,6 +47,7 @@ %auxiliary-files-path %bootstrap-binaries-path %package-module-path + %default-package-module-path fold-packages @@ -130,22 +132,31 @@ for system '~a'") ("gnu/packages.scm" gnu/) ("guix.scm")))) +(define %default-package-module-path + ;; Default search path for package modules. + `((,%distro-root-directory . "gnu/packages"))) + (define %package-module-path ;; Search path for package modules. Each item must be either a directory ;; name or a pair whose car is a directory and whose cdr is a sub-directory ;; to narrow the search. (let* ((not-colon (char-set-complement (char-set #\:))) (environment (string-tokenize (or (getenv "GUIX_PACKAGE_PATH") "") - not-colon))) - ;; Automatically add items from $GUIX_PACKAGE_PATH to Guile's search path. - (for-each (lambda (directory) - (set! %load-path (cons directory %load-path)) - (set! %load-compiled-path - (cons directory %load-compiled-path))) - environment) + not-colon)) + (channels (package-path-entries))) + ;; Automatically add channels and items from $GUIX_PACKAGE_PATH to Guile's + ;; search path. For historical reasons, $GUIX_PACKAGE_PATH goes to the + ;; front; channels go to the back so that they don't override Guix' own + ;; modules. + (set! %load-path + (append environment %load-path channels)) + (set! %load-compiled-path + (append environment %load-compiled-path channels)) (make-parameter - (append environment `((,%distro-root-directory . "gnu/packages")))))) + (append environment + %default-package-module-path + channels)))) (define %patch-path ;; Define it after '%package-module-path' so that '%load-path' contains user diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm index 3d58780b95..8807ab18b5 100644 --- a/gnu/packages/admin.scm +++ b/gnu/packages/admin.scm @@ -963,7 +963,7 @@ system administrator.") (define-public sudo (package (name "sudo") - (version "1.8.24") + (version "1.8.25") (source (origin (method url-fetch) (uri @@ -973,7 +973,7 @@ system administrator.") version ".tar.gz"))) (sha256 (base32 - "1s2v49n905wf3phmdnaa6v1dwck2lrcin0flg85z7klf35x5b25l")) + "0hfw6pcwjvv1vvnhb4n1p210306jm4npz99p9cfhbd33yrhhzkwx")) (modules '((guix build utils))) (snippet '(begin diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm index 22a00894c2..f60fc4c84c 100644 --- a/gnu/packages/bioinformatics.scm +++ b/gnu/packages/bioinformatics.scm @@ -3602,7 +3602,7 @@ experiments and provide highly stable thresholds based on reproducibility.") (define-public jellyfish (package (name "jellyfish") - (version "2.2.7") + (version "2.2.10") (source (origin (method url-fetch) (uri (string-append "https://github.com/gmarcais/Jellyfish/" @@ -3610,7 +3610,7 @@ experiments and provide highly stable thresholds based on reproducibility.") "/jellyfish-" version ".tar.gz")) (sha256 (base32 - "1a1iwq9pq54k2m9ypvwl5s0bqfl64gwh9dx5af9i382ajas2016q")))) + "1k4pc3fvv6w1km2yph4m5sd78fbxp21d6xyzgmy0gjihzc6mb249")))) (build-system gnu-build-system) (outputs '("out" ;for library "ruby" ;for Ruby bindings @@ -3647,8 +3647,8 @@ DNA sequences. It outputs its k-mer counts in a binary format, which can be translated into a human-readable text format using the @code{jellyfish dump} command, or queried for specific k-mers with @code{jellyfish query}.") (home-page "http://www.genome.umd.edu/jellyfish.html") - ;; From their website: JELLYFISH runs on 64-bit Intel-compatible processors - (supported-systems '("x86_64-linux")) + ;; JELLYFISH seems to be 64-bit only. + (supported-systems '("x86_64-linux" "aarch64-linux" "mips64el-linux")) ;; The combined work is published under the GPLv3 or later. Individual ;; files such as lib/jsoncpp.cpp are released under the Expat license. (license (list license:gpl3+ license:expat)))) diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm index 0160e42f6a..d591e6a884 100644 --- a/gnu/packages/cpp.scm +++ b/gnu/packages/cpp.scm @@ -236,7 +236,7 @@ as ordering relation.") (build-system cmake-build-system) (synopsis "JSON parser and printer library for C++") (description "JSON for Modern C++ is a C++ JSON library that provides -intutive syntax and trivial integration.") +intuitive syntax and trivial integration.") (license license:expat))) (define-public xtl diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm index a1ce64ffaa..8f0c564f88 100644 --- a/gnu/packages/emacs.scm +++ b/gnu/packages/emacs.scm @@ -646,7 +646,11 @@ only a handful of functions that are not resource-specific.") "https://github.com/haskell/haskell-mode/archive/v" version ".tar.gz")) (sha256 - (base32 "0g6lcjw7lcgavv3yrd8xjcyqgfyjl787y32r1z14amw2f009m78h")))) + (base32 "0g6lcjw7lcgavv3yrd8xjcyqgfyjl787y32r1z14amw2f009m78h")) + (patches + (search-patches ; backport test failure fixes + "haskell-mode-unused-variables.patch" + "haskell-mode-make-check.patch")))) (inputs `(("emacs-el-search" ,emacs-el-search) ; for tests ("emacs-stream" ,emacs-stream))) ; for tests @@ -686,12 +690,11 @@ only a handful of functions that are not resource-specific.") (_ "")) inputs))) (substitute* (find-files "." "\\.el") (("/bin/sh") sh)) - (substitute* "tests/haskell-code-conventions.el" - ;; Function name recently changed in "emacs-el-search". - (("el-search--search-pattern") "el-search-forward") - ;; Don't contact home. - (("\\(when \\(>= emacs-major-version 25\\)") - "(require 'el-search) (when nil")) + ;; embed filename to fix test failure + (let ((file "tests/haskell-cabal-tests.el")) + (substitute* file + (("\\(buffer-file-name\\)") + (format #f "(or (buffer-file-name) ~s)" file)))) #t))) (replace 'install @@ -9003,7 +9006,7 @@ continue.") (define-public emacs-elisp-refs (package (name "emacs-elisp-refs") - (version "1.2") + (version "1.3") (source (origin (method url-fetch) @@ -9012,14 +9015,15 @@ continue.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "0fj6wphwrvbslw46w7wgdk3b4bfr312ygj3lbgr9qw63lpqw26nl")))) + "02nzcn3v14n7mp7q32j5r4wdlpsw3zixzh6cf0cdyarfir6dly3p")))) (build-system emacs-build-system) (propagated-inputs `(("emacs-dash" ,emacs-dash) ("emacs-f" ,emacs-f) ("emacs-list-utils" ,emacs-list-utils) ("emacs-loop" ,emacs-loop) - ("emacs-s" ,emacs-s))) + ("emacs-s" ,emacs-s) + ("emacs-shut-up" ,emacs-shut-up))) (home-page "https://github.com/Wilfred/elisp-refs") (synopsis "Find callers of elisp functions or macros") (description "Find references to functions, macros or variables. Unlike a @@ -9563,11 +9567,12 @@ duplicate hook and function names further into a single declarative call.") "0rf2rnzg82pdqch041yyx3f9ddixffkk9s2ydzg8hwy66sg3385n")))) (build-system emacs-build-system) (home-page "https://github.com/Malabarba/fancy-narrow/releases") - (synopsis "Immitate narrow-to-region with more eye-candy") - (description "Unlike narrow-to-region, which completely hides text outside -the narrowed region, this package simply deemphasizes the text, makes it -readonly, and makes it unreachable. This leads to a much more natural -feeling, where the region stays static (instead of being brutally moved to a + (synopsis "Imitate @code{narrow-to-region} with more eye candy") + (description + "Unlike @code{narrow-to-region}, which completely hides text outside +the narrowed region, this package simply de-emphasizes the text, makes it +read-only, and makes it unreachable. This leads to a much more natural +feeling where the region stays static (instead of being brutally moved to a blank slate) and is clearly highlighted with respect to the rest of the buffer.") (license license:gpl2+))) @@ -9659,7 +9664,7 @@ downloading manager for Emacs.") (define-public emacs-helpful (package (name "emacs-helpful") - (version "0.1") + (version "0.13") (source (origin (method url-fetch) (uri (string-append @@ -9668,7 +9673,7 @@ downloading manager for Emacs.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "16dx566qzrjj0bf43lnw7h1qlvgs94brqplamw8kppp2ylr72qs9")))) + "11kj04y1fa3vnw2991cyqf6adz6bb3hlrdkvypjnmpb0s64q64b6")))) (build-system emacs-build-system) (propagated-inputs `(("emacs-elisp-refs" ,emacs-elisp-refs))) diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm index 15ec492793..40a5ec1cf4 100644 --- a/gnu/packages/enlightenment.scm +++ b/gnu/packages/enlightenment.scm @@ -62,7 +62,7 @@ (define-public efl (package (name "efl") - (version "1.20.7") + (version "1.21.0") (source (origin (method url-fetch) (uri (string-append @@ -70,7 +70,7 @@ version ".tar.xz")) (sha256 (base32 - "1zkn5ix81xck3n84dxvkjh4alwc6zj8x989d0zqi5c6ppijvgadh")))) + "0jxfrcz2aq1synxzd6sh9nhxz7fg9qgz0idr8zj6gaiplmwbwrby")))) (outputs '("out" ; 49 MB "include")) ; 17 MB (build-system gnu-build-system) @@ -312,35 +312,36 @@ embedded systems.") (define-public python-efl (package (name "python-efl") - (version "1.20.0") + (version "1.21.0") (source (origin (method url-fetch) - (uri (list - (pypi-uri "python-efl" version) - (string-append "http://download.enlightenment.org/rel/bindings/" - "python/python-efl-" version ".tar.gz"))) + (uri (string-append "http://download.enlightenment.org/rel/bindings/" + "python/python-efl-" version ".tar.xz")) (sha256 (base32 - "1680pgpf501nhbc9arm0nfj6rpcw17aryh0pgmmmszxlgpifpdzy")))) + "08x2cv8hnf004c3711250wrax21ffj5y8951pvk77h98als4pq47")))) (build-system python-build-system) (arguments '(#:phases (modify-phases %standard-phases - (replace 'build - (lambda _ - (zero? - (system* "env" "ENABLE_CYTHON=1" "python" "setup.py" "build")))) + (replace 'build + (lambda _ + (setenv "ENABLE_CYTHON" "1") + (invoke "python" "setup.py" "build"))) (add-before 'build 'set-flags - (lambda _ - (setenv "CFLAGS" - (string-append "-I" (assoc-ref %build-inputs "python-dbus") - "/include/dbus-1.0")) - #t)) + (lambda _ + (setenv "CFLAGS" + (string-append "-I" (assoc-ref %build-inputs "python-dbus") + "/include/dbus-1.0")) + #t)) (add-before 'check 'set-environment (lambda _ ;; Some tests require write access to HOME. (setenv "HOME" "/tmp") + ;; These tests try to connect to the internet. + (delete-file "tests/ecore/test_09_file_download.py") + (delete-file "tests/ecore/test_11_con.py") #t))))) (native-inputs `(("pkg-config" ,pkg-config) diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm index 3c5063f69b..728f763806 100644 --- a/gnu/packages/games.scm +++ b/gnu/packages/games.scm @@ -2470,7 +2470,7 @@ Transport Tycoon Deluxe.") (define openrct2-objects (package (name "openrct2-objects") - (version "1.0.2") + (version "1.0.6") (source (origin (method url-fetch) @@ -2479,7 +2479,7 @@ Transport Tycoon Deluxe.") (file-name (string-append name "-" version ".zip")) (sha256 (base32 - "1z92afhbv13j1ig6fz0x8w9vdmfchssv16vwwhb0vj40pn1g1rwy")))) + "00kfy95zx6g4ldr6br5p7bwkwfx6pw9v78fd3rvghjnwyvf5fhki")))) (build-system trivial-build-system) (native-inputs `(("bash" ,bash) @@ -2511,7 +2511,7 @@ Transport Tycoon Deluxe.") (define-public openrct2 (package (name "openrct2") - (version "0.2.0") + (version "0.2.1") (source (origin (method url-fetch) @@ -2519,7 +2519,7 @@ Transport Tycoon Deluxe.") version ".tar.gz")) (sha256 (base32 - "1yrbjra27n2xxb1x47v962lc3qi8gwm5ws4f97952nvn533zrwxz")) + "1fxzk037xphpyk7vv5jfrcz739zrj86p43pnf5gjjv9rjxwv7m8f")) (file-name (string-append name "-" version ".tar.gz")))) (build-system cmake-build-system) (arguments diff --git a/gnu/packages/gnu-pw-mgr.scm b/gnu/packages/gnu-pw-mgr.scm index 38f9e8187a..a56bc09e61 100644 --- a/gnu/packages/gnu-pw-mgr.scm +++ b/gnu/packages/gnu-pw-mgr.scm @@ -30,7 +30,7 @@ (define-public gnu-pw-mgr (package (name "gnu-pw-mgr") - (version "2.3.3") + (version "2.4.2") (source (origin (method url-fetch) @@ -38,7 +38,7 @@ version ".tar.xz")) (sha256 (base32 - "04xh38j7l0sfnb01kp05xc908pvqfc0lph94k7n9bi46zy3qy7ma")))) + "1yvdzc5w37qrjrkby5699ygj9bhkvgi3zk9k9jcjry1j6b7wdl17")))) (build-system gnu-build-system) (arguments '(#:phases diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 63b3ece8e1..02d723316d 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -29,6 +29,7 @@ ;;; Copyright © 2017 Dave Love <fx@gnu.org> ;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr> ;;; Copyright © 2018 Brendan Tildesley <brendan.tildesley@openmailbox.org> +;;; Copyright © 2018 Manuel Graf <graf@init.at> ;;; ;;; This file is part of GNU Guix. ;;; @@ -3622,6 +3623,48 @@ The following service daemons are also provided: license:cc0 ; most files in ccan/ license:bsd-3)))) ; providers/hfi1verbs are dual GPL2/BSD-3 +(define-public perftest + (package + (name "perftest") + (version "4.2-0.8") + (source + (origin + (method url-fetch) + (uri (string-append "https://github.com/linux-rdma/perftest/releases/download/V" + version "/perftest-" version ".g0e24e67.tar.gz")) + (sha256 + (base32 "1r3pxn7cx3grb8myb4q1b0pk447pc06cifd0v7ym13xw00372dlx")))) + (build-system gnu-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-header-paths + (lambda _ + (substitute* '("src/raw_ethernet_fs_rate.c" + "src/raw_ethernet_resources.c" + "src/raw_ethernet_resources.h" + "src/raw_ethernet_send_burst_lat.c" + "src/raw_ethernet_send_bw.c" + "src/raw_ethernet_send_lat.c") + (("/usr/include/netinet/ip.h") "netinet/ip.h")) + #t))))) + (inputs `(("rdma-core" ,rdma-core))) + (home-page "https://github.com/linux-rdma/perftest/") + (synopsis "Open Fabrics Enterprise Distribution (OFED) Performance Tests") + (description "This is a collection of tests written over uverbs intended for +use as a performance micro-benchmark. The tests may be used for hardware or +software tuning as well as for functional testing. + +The collection contains a set of bandwidth and latency benchmark such as: +@enumerate +@item Send - @code{ib_send_bw} and @code{ib_send_lat} +@item RDMA Read - @code{ib_read_bw} and @code{ib_read_lat} +@item RDMA Write - @code{ib_write_bw} and @code{ib_wriet_lat} +@item RDMA Atomic - @code{ib_atomic_bw} and @code{ib_atomic_lat} +@item Native Ethernet (when working with MOFED2) - @code{raw_ethernet_bw}, @code{raw_ethernet_lat} +@end enumerate") + (license license:gpl2))) + (define-public rng-tools (package (name "rng-tools") diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm index 1f7e971d60..4944dd7622 100644 --- a/gnu/packages/mail.scm +++ b/gnu/packages/mail.scm @@ -706,9 +706,9 @@ attachments, create new maildirs, and so on.") ("python2-pygpgme" ,python2-pygpgme) ("python2-notmuch" ,python2-notmuch))) (home-page "https://github.com/pazz/alot") - (synopsis "Commandline MUA using notmuch") + (synopsis "Command-line MUA using @code{notmuch}") (description - "Alot is an experimental terminal mail user agent (MUA) based on + "Alot is an experimental terminal mail user agent (@dfn{MUA}) based on @code{notmuch} mail. It is written in Python using the @code{urwid} toolkit.") (license gpl3+))) diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm index b03cb8f03a..42a0847b7a 100644 --- a/gnu/packages/messaging.scm +++ b/gnu/packages/messaging.scm @@ -548,14 +548,14 @@ simultaneously and therefore appear under the same nickname on IRC.") (define-public python-nbxmpp (package (name "python-nbxmpp") - (version "0.6.6") + (version "0.6.7") (source (origin (method url-fetch) (uri (pypi-uri "nbxmpp" version)) (sha256 (base32 - "0bp60syqc3qp2i28phvadxlpwizjbr6bxw4m363p9yn5fl687qnh")))) + "0fas4iawjfdmkz8vr042wpq6b2qispi6fy35g4a62jw50jb1saav")))) (build-system python-build-system) (arguments `(#:tests? #f)) ; no tests @@ -873,7 +873,7 @@ protocols.") (define-public c-toxcore (package (name "c-toxcore") - (version "0.2.6") + (version "0.2.7") (source (origin (method url-fetch) @@ -882,7 +882,7 @@ protocols.") (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "04b3ifkj64yy06vph0hlq24mw9fh24zmq1qdf40fmj24vvgfmjpl")))) + "1lcw979zakyb5kzy8yfk87js3bzfz3k2jxidda6ga6ljdnqdpxmy")))) (arguments `(#:tests? #f)) ; FIXME: Testsuite seems to stay stuck on test 3. Disable ; for now. @@ -1565,7 +1565,7 @@ using ncurses and libmesode, inspired by Irssi.") (define-public libircclient (package (name "libircclient") - (version "1.9") + (version "1.10") (source (origin (method url-fetch) @@ -1573,7 +1573,7 @@ using ncurses and libmesode, inspired by Irssi.") version "/libircclient-" version ".tar.gz")) (sha256 (base32 - "0r60i76jh4drjh2jgp5sx71chagqllmkaq49zv67nrhqwvp9ghw1")))) + "0b9wa0h3xc31wpqlvgxgnvqp5wgx3kwsf5s9432m5cj8ycx6zcmv")))) (build-system gnu-build-system) (inputs `(("openssl" ,openssl))) @@ -1584,8 +1584,7 @@ using ncurses and libmesode, inspired by Irssi.") "--enable-shared" "--enable-ipv6" "--enable-openssl") - ;; no test suite - #:tests? #f)) + #:tests? #f)) ; no test suite (home-page "https://www.ulduzsoft.com/libircclient/") (synopsis "Library implementing the client IRC protocol") (description "Libircclient is a library which implements the client IRC diff --git a/gnu/packages/monitoring.scm b/gnu/packages/monitoring.scm index fae62d5493..12d736a76a 100644 --- a/gnu/packages/monitoring.scm +++ b/gnu/packages/monitoring.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2018 Gábor Boskovits <boskovits@gmail.com> +;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,18 +30,25 @@ #:use-module (guix build-system python) #:use-module (guix build-system gnu) #:use-module (guix build-system go) + #:use-module (guix utils) #:use-module (gnu packages admin) #:use-module (gnu packages base) + #:use-module (gnu packages curl) #:use-module (gnu packages check) #:use-module (gnu packages compression) + #:use-module (gnu packages databases) #:use-module (gnu packages django) #:use-module (gnu packages gd) #:use-module (gnu packages image) #:use-module (gnu packages mail) + #:use-module (gnu packages networking) + #:use-module (gnu packages libevent) + #:use-module (gnu packages pcre) #:use-module (gnu packages perl) #:use-module (gnu packages python) #:use-module (gnu packages python-web) - #:use-module (gnu packages time)) + #:use-module (gnu packages time) + #:use-module (gnu packages tls)) (define-public nagios (package @@ -138,6 +146,79 @@ etc. via a Web interface. Features include: @end itemize\n") (license license:gpl2))) +(define-public zabbix-agentd + (package + (name "zabbix-agentd") + (version "3.4.11") + (source + (origin + (method url-fetch) + (uri (string-append + "mirror://sourceforge/zabbix/ZABBIX%20Latest%20Stable/" version + "/zabbix-" version ".tar.gz")) + (sha256 + (base32 + "0qxgf6hx7ibhjmxd2sxizkjc8df4c9d31wz5hhql409ws98qf173")))) + (build-system gnu-build-system) + (arguments + `(#:configure-flags + (list "--enable-agent" + (string-append "--with-iconv=" + (assoc-ref %build-inputs "libiconv")) + (string-append "--with-libpcre=" + (assoc-ref %build-inputs "pcre"))))) + (inputs + `(("libiconv" ,libiconv) + ("pcre" ,pcre))) + (home-page "https://www.zabbix.com/") + (synopsis "Distributed monitoring solution (client-side agent)") + (description "This package provides a distributed monitoring +solution (client-side agent)") + (license license:gpl2))) + +(define-public zabbix-server + (package + (inherit zabbix-agentd) + (name "zabbix-server") + (arguments + (substitute-keyword-arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'install-frontend + (lambda* (#:key outputs #:allow-other-keys) + (let* ((php (string-append (assoc-ref outputs "out") + "/share/zabbix/php")) + (front-end-conf (string-append php "/conf")) + (etc (string-append php "/etc"))) + (mkdir-p php) + (copy-recursively "./frontends/php" php) + (rename-file front-end-conf + (string-append front-end-conf "-example")) + (symlink "/etc/zabbix" front-end-conf))))) + ,@(package-arguments zabbix-agentd)) + ((#:configure-flags flags) + `(cons* "--enable-server" + "--with-postgresql" + (string-append "--with-libevent=" + (assoc-ref %build-inputs "libevent")) + "--with-net-snmp" + (string-append "--with-gnutls=" + (assoc-ref %build-inputs "gnutls")) + "--with-libcurl" + ,flags)))) + (inputs + `(("curl" ,curl) + ("libevent" ,libevent) + ("gnutls" ,gnutls) + ("postgresql" ,postgresql) + ("zlib" ,zlib) + ("net-snmp" ,net-snmp) + ("curl" ,curl) + ,@(package-inputs zabbix-agentd))) + (synopsis "Distributed monitoring solution (server-side)") + (description "This package provides a distributed monitoring +solution (server-side)"))) + (define-public darkstat (package (name "darkstat") diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm index edffcfce96..ba21e5da2b 100644 --- a/gnu/packages/music.scm +++ b/gnu/packages/music.scm @@ -3685,7 +3685,7 @@ specification and header.") (define-public rosegarden (package (name "rosegarden") - (version "17.04") + (version "18.06") (source (origin (method url-fetch) (uri (string-append @@ -3693,7 +3693,7 @@ specification and header.") version "/rosegarden-" version ".tar.bz2")) (sha256 (base32 - "1khfcj22asdhjh0jvhkqsz200wgmigkhsrcz09ffia5hqm0n32lq")))) + "04qc80sqb2ji42pq3mayhvqqn39hlxzymsywpbpzfpchr19chxx7")))) (build-system cmake-build-system) (arguments `(#:configure-flags '("-DUSE_QT5=1") ; "-DCMAKE_BUILD_TYPE=Release" @@ -3747,6 +3747,7 @@ specification and header.") ;; Tests create files in $HOME/.local/share/rosegarden . (mkdir-p "/tmp/foo") (setenv "HOME" "/tmp/foo") + (setenv "XDG_RUNTIME_DIR" "/tmp/foo") #t))))) (inputs `(("alsa-lib" ,alsa-lib) @@ -3773,7 +3774,7 @@ sequencer") (description "Rosegarden is a music composition and editing environment based around a MIDI sequencer that features a rich understanding of music notation and includes basic support for digital audio.") - (home-page "http://www.rosegardenmusic.com/") + (home-page "https://www.rosegardenmusic.com/") (license license:gpl2))) (define-public patchmatrix diff --git a/gnu/packages/patches/haskell-mode-make-check.patch b/gnu/packages/patches/haskell-mode-make-check.patch new file mode 100644 index 0000000000..a4d4d525f2 --- /dev/null +++ b/gnu/packages/patches/haskell-mode-make-check.patch @@ -0,0 +1,35 @@ +Copied from upstream repository. +Hunk #2 is removed since it cannot be applied and it is not needed. + +From 7cead7137bf54851c1b7df5a3854351296d21276 Mon Sep 17 00:00:00 2001 +From: Vasantha Ganesh K <vasanthaganesh.k@tuta.io> +Date: Thu, 22 Jun 2017 23:38:40 +0530 +Subject: [PATCH] removed `check-conventions' from make + +--- + Makefile | 7 +- + tests/haskell-code-conventions.el | 165 ------------------------------ + 2 files changed, 1 insertion(+), 171 deletions(-) + delete mode 100644 tests/haskell-code-conventions.el + +diff --git a/Makefile b/Makefile +index b2c89d6..aa907c5 100644 +--- a/Makefile ++++ b/Makefile +@@ -79,12 +79,7 @@ build-$(EMACS_VERSION)/build-flag : build-$(EMACS_VERSION) $(patsubst %.el,build + check-%: tests/%-tests.el + $(BATCH) -l "$<" -f ert-run-tests-batch-and-exit; + +-check: compile $(AUTOLOADS) check-ert check-conventions +- +-check-conventions : +- $(BATCH) -l tests/haskell-code-conventions.el \ +- -f haskell-check-conventions-batch-and-exit +- @echo "conventions are okay" ++check: compile $(AUTOLOADS) check-ert + + check-ert: $(ELCHECKS) + $(BATCH) --eval "(when (= emacs-major-version 24) \ +-- +2.18.0 + diff --git a/gnu/packages/patches/haskell-mode-unused-variables.patch b/gnu/packages/patches/haskell-mode-unused-variables.patch new file mode 100644 index 0000000000..b175fae28c --- /dev/null +++ b/gnu/packages/patches/haskell-mode-unused-variables.patch @@ -0,0 +1,44 @@ +Copied verbatim from upstream repository. + +From cee22450ee30e79952f594796721dc6b17798ee6 Mon Sep 17 00:00:00 2001 +From: Sascha Wilde <wilde@sha-bang.de> +Date: Fri, 23 Sep 2016 15:35:59 +0200 +Subject: [PATCH] Removed unused lexical variables. + +--- + haskell-lexeme.el | 3 +-- + haskell-process.el | 4 +--- + 2 files changed, 2 insertions(+), 5 deletions(-) + +diff --git a/haskell-lexeme.el b/haskell-lexeme.el +index 4256a79..b832560 100644 +--- a/haskell-lexeme.el ++++ b/haskell-lexeme.el +@@ -138,8 +138,7 @@ When match is successful, match-data will contain: + (match-text 2) - whole qualified identifier + (match-text 3) - unqualified part of identifier + (match-text 4) - closing backtick" +- (let ((begin (point)) +- (match-data-old (match-data)) ++ (let ((match-data-old (match-data)) + first-backtick-start + last-backtick-start + qid-start +diff --git a/haskell-process.el b/haskell-process.el +index b4efba2..4f3f859 100644 +--- a/haskell-process.el ++++ b/haskell-process.el +@@ -160,9 +160,7 @@ HPTYPE is the result of calling `'haskell-process-type`' function." + (defun haskell-process-log (msg) + "Effective append MSG to the process log (if enabled)." + (when haskell-process-log +- (let* ((append-to (get-buffer-create "*haskell-process-log*")) +- (windows (get-buffer-window-list append-to t t)) +- move-point-in-windows) ++ (let* ((append-to (get-buffer-create "*haskell-process-log*"))) + (with-current-buffer append-to + ;; point should follow insertion so that it stays at the end + ;; of the buffer +-- +2.18.0 + diff --git a/gnu/packages/patches/rust-1.19-mrustc.patch b/gnu/packages/patches/rust-1.19-mrustc.patch new file mode 100644 index 0000000000..261162172e --- /dev/null +++ b/gnu/packages/patches/rust-1.19-mrustc.patch @@ -0,0 +1,28 @@ +See https://github.com/thepowersgang/mrustc/archive/v0.8.0.tar.gz + +--- rustc-1.19.0-src-orig/src/libcore/intrinsics.rs ++++ rustc-1.19.0-src/src/libcore/intrinsics.rs +@@ -678,5 +678,9 @@ + pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize; + ++ /// Obtain the length of a slice pointer ++ #[cfg(rust_compiler="mrustc")] ++ pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize; ++ + /// Gets a static string slice containing the name of a type. + pub fn type_name<T: ?Sized>() -> &'static str; + +--- rustc-1.19.0-src-orig/src/libcore/slice/mod.rs ++++ rustc-1.19.0-src/src/libcore/slice/mod.rs +@@ -413,6 +413,8 @@ + #[inline] + fn len(&self) -> usize { +- unsafe { +- mem::transmute::<&[T], Repr<T>>(self).len +- } ++ #[cfg(not(rust_compiler="mrustc"))] ++ let rv = unsafe { mem::transmute::<&[T], Repr<T>>(self).len }; ++ #[cfg(rust_compiler="mrustc")] ++ let rv = unsafe { ::intrinsics::mrustc_slice_len(self) }; ++ rv + } diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index fd1fdbf82d..9fdadfbd73 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -3755,6 +3755,18 @@ functions.") (arguments `(#:phases (modify-phases %standard-phases + (add-after 'unpack 'disable-broken-tests + (lambda _ + (substitute* "scipy/sparse/linalg/dsolve/tests/test_linsolve.py" + (("^( +)def test_threads_parallel\\(self\\):" m indent) + (string-append indent + "@pytest.mark.skip(reason=\"Disabled by Guix\")\n" + m))) + (substitute* "scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py" + (("^def test_parallel_threads\\(\\):" m) + (string-append "@pytest.mark.skip(reason=\"Disabled by Guix\")\n" + m))) + #t)) (add-before 'build 'configure-openblas (lambda* (#:key inputs #:allow-other-keys) (call-with-output-file "site.cfg" diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm index 908dfd5751..616b86934d 100644 --- a/gnu/packages/ruby.scm +++ b/gnu/packages/ruby.scm @@ -37,6 +37,7 @@ #:use-module (gnu packages java) #:use-module (gnu packages libffi) #:use-module (gnu packages maths) + #:use-module (gnu packages ncurses) #:use-module (gnu packages networking) #:use-module (gnu packages python) #:use-module (gnu packages ragel) @@ -193,6 +194,25 @@ a focus on simplicity and productivity.") (("/bin/sh") (which "sh"))) #t))))))) +(define-public ruby-concurrent + (package + (name "ruby-concurrent") + (version "1.0.5") + (source (origin + (method url-fetch) + (uri (rubygems-uri "concurrent-ruby" version)) + (sha256 + (base32 + "183lszf5gx84kcpb779v6a2y0mx9sssy8dgppng1z9a505nj1qcf")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (home-page "https://github.com/ruby-concurrency/concurrent-ruby") + (synopsis "Concurrency tools for Ruby") + (description "This gem provides concurrency tools for Ruby. It provides +a library of common thread-safe types and data-structures as well as abstractions +for concurrency and communication between threads.") + (license license:expat))) + (define-public ruby-highline (package (name "ruby-highline") @@ -262,16 +282,17 @@ packaging native C and Java extensions in Ruby.") (define-public ruby-i18n (package (name "ruby-i18n") - (version "0.7.0") + (version "1.1.0") (source (origin (method url-fetch) (uri (rubygems-uri "i18n" version)) (sha256 (base32 - "1i5z1ykl8zhszsxcs8mzl8d0dxgs3ylz8qlzrw74jb0gplkx6758")))) + "0ppvmla21hssvrfm8g1n2fnb4lxn4yhy9qmmba0imanflgldrjmr")))) (build-system ruby-build-system) (arguments '(#:tests? #f)) ; no tests + (propagated-inputs `(("concurrent-ruby" ,ruby-concurrent))) (synopsis "Internationalization library for Ruby") (description "Ruby i18n is an internationalization and localization solution for Ruby programs. It features translation and localization, @@ -3013,17 +3034,28 @@ you about the changes.") (home-page "https://github.com/guard/listen") (license license:expat))) +(define-public ruby-listen-3.0 + (package + (inherit ruby-listen) + (version "3.0.8") + (source (origin + (method url-fetch) + (uri (rubygems-uri "listen" version)) + (sha256 + (base32 + "1l0y7hbyfiwpvk172r28hsdqsifq1ls39hsfmzi1vy4ll0smd14i")))))) + (define-public ruby-activesupport (package (name "ruby-activesupport") - (version "5.1.4") + (version "5.2.1") (source (origin (method url-fetch) (uri (rubygems-uri "activesupport" version)) (sha256 (base32 - "0sgf4rsfr7jcaqsx0wwzx4l4k9xsjlwv0mzl08pxiyp1qzyx8scr")))) + "0ziy6xk31k4fs115cdkba1ys4i8nzcyri7a2jig7nx7k5h7li6l2")))) (build-system ruby-build-system) (arguments `(#:phases @@ -4658,7 +4690,7 @@ binary-to-text encoding. The main modern use of Ascii85 is in PostScript and (define-public ruby-ttfunk (package (name "ruby-ttfunk") - (version "1.4.0") + (version "1.5.1") (source (origin (method url-fetch) @@ -4669,12 +4701,18 @@ binary-to-text encoding. The main modern use of Ascii85 is in PostScript and (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 - "1izq84pnm9niyvkzp8k0vl232q9zj41hwmp9na9fzycfh1pbnsl6")))) + "1ymcn12n5iws401yz03zsj8rr653fdqq13czsrciq09phgh9jzc5")))) (build-system ruby-build-system) (arguments `(#:test-target "spec" #:phases (modify-phases %standard-phases + (add-before 'build 'remove-ssh + (lambda _ + ;; remove dependency on an ssh key pair that doesn't exist + (substitute* "ttfunk.gemspec" + (("spec.signing_key.*") "")) + #t)) (add-before 'check 'remove-rubocop (lambda _ ;; remove rubocop as a dependency as not needed for testing @@ -4682,10 +4720,11 @@ binary-to-text encoding. The main modern use of Ascii85 is in PostScript and (("spec.add_development_dependency\\('rubocop'.*") "")) (substitute* "Rakefile" (("require 'rubocop/rake_task'") "") - (("Rubocop::RakeTask.new") "")) + (("RuboCop::RakeTask.new") "")) #t))))) (native-inputs `(("ruby-rspec" ,ruby-rspec) + ("ruby-yard" ,ruby-yard) ("bundler" ,bundler))) (synopsis "Font metrics parser for the Prawn PDF generator") (description @@ -5070,3 +5109,821 @@ programs running in the background, in Ruby.") (sha256 (base32 "0a61922kmvcxyj5l70fycapr87gz1dzzlkfpq85rfqk5vdh3d28p")))))) + +(define-public ruby-public-suffix + (package + (name "ruby-public-suffix") + (version "3.0.3") + (source (origin + (method url-fetch) + (uri (rubygems-uri "public_suffix" version)) + (sha256 + (base32 + "08q64b5br692dd3v0a9wq9q5dvycc6kmiqmjbdxkxbfizggsvx6l")))) + (build-system ruby-build-system) + (arguments + ;; Tests require network + `(#:tests? #f)) + (home-page "https://simonecarletti.com/code/publicsuffix-ruby/") + (synopsis "Domain name parser") + (description "The gem @code{public_suffix} is a domain name parser, +written in Ruby, and based on the @dfn{Public Suffix List}. A public suffix +is one under which Internet users can (or historically could) directly +register names. Some examples of public suffixes are @code{.com}, +@code{.co.uk} and @code{pvt.k12.ma.us}. The Public Suffix List is a list of +all known public suffixes.") + (license license:expat))) + +(define-public ruby-addressable + (package + (name "ruby-addressable") + (version "2.5.2") + (source (origin + (method url-fetch) + (uri (rubygems-uri "addressable" version)) + (sha256 + (base32 + "0viqszpkggqi8hq87pqp0xykhvz60g99nwmkwsb0v45kc2liwxvk")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-public-suffix" ,ruby-public-suffix))) + (arguments + ;; No test target + `(#:tests? #f)) + (home-page "https://github.com/sporkmonger/addressable") + (synopsis "Alternative URI implementation") + (description "Addressable is a replacement for the URI implementation that +is part of Ruby's standard library. It more closely conforms to RFC 3986, +RFC 3987, and RFC 6570 (level 4), providing support for IRIs and URI templates.") + (license license:asl2.0))) + +(define-public ruby-colorator + (package + (name "ruby-colorator") + (version "1.1.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "colorator" version)) + (sha256 + (base32 + "0f7wvpam948cglrciyqd798gdc6z3cfijciavd0dfixgaypmvy72")))) + (build-system ruby-build-system) + (arguments + ;; No test target + `(#:tests? #f)) + (home-page "http://octopress.org/colorator/") + (synopsis "Terminal color library") + (description "Colorator is a Ruby gem that helps you colorize your text +for the terminal.") + (license license:expat))) + +(define-public ruby-command-line-reporter + (package + (name "ruby-command-line-reporter") + (version "4.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "command_line_reporter" version)) + (sha256 + (base32 + "1qma35xrb772whxwy1rs9bicb9d6lvz0s2dd2dnn4fr6zcbcxc0a")))) + (build-system ruby-build-system) + (arguments + ;; No Rakefile + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-before 'build 'fix-dependencies + (lambda _ + (substitute* ".gemspec" + ;; colored is unmaintained + (("colored") "colorator") + ;; colorator version + (("= 1.2") "= 1.1")) + #t))))) + (propagated-inputs `(("ruby-colorator" ,ruby-colorator))) + (home-page "https://github.com/wbailey/command_line_reporter") + (synopsis "Report production while executing Ruby scripts") + (description "This gem provides a DSL that makes it easy to write reports +of various types in ruby. It eliminates the need to litter your source with +puts statements, instead providing a more readable, expressive interface to +your application.") + (license license:asl2.0))) + +(define-public ruby-command-line-reporter-3 + (package + (inherit ruby-command-line-reporter) + (version "3.3.6") + (source (origin + (method url-fetch) + (uri (rubygems-uri "command_line_reporter" version)) + (sha256 + (base32 + "1h39zqqxp3k4qk49ajpx0jps1vmvxgkh43mqkb6znk583bl0fv71")))))) + +(define-public ruby-rdoc + (package + (name "ruby-rdoc") + (version "6.0.4") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "rdoc" version)) + (sha256 + (base32 + "0anv42cqcdc6g4n386mrva7mgav5i0c2ry3yzvzzc6z6hymkmcr7")))) + (build-system ruby-build-system) + (native-inputs + `(("bundler" ,bundler))) + (home-page "https://ruby.github.io/rdoc/") + (synopsis "HTML and command-line documentation utility") + (description "RDoc produces HTML and command-line documentation for Ruby +projects. RDoc includes the +rdoc+ and +ri+ tools for generating and displaying +documentation from the command-line.") + (license license:gpl2+))) + +(define-public ruby-sass-listen + (package + (name "ruby-sass-listen") + (version "4.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "sass-listen" version)) + (sha256 + (base32 + "0xw3q46cmahkgyldid5hwyiwacp590zj2vmswlll68ryvmvcp7df")))) + (build-system ruby-build-system) + (arguments + ;; No test target + `(#:tests? #f)) + (propagated-inputs + `(("ruby-rb-fsevent" ,ruby-rb-fsevent) + ("ruby-rb-inotify" ,ruby-rb-inotify))) + (home-page "https://github.com/sass/listen") + (synopsis "File modification notification library") + (description "The Listen gem listens to file modifications and notifies you +about the changes.") + (license license:expat))) + +(define-public ruby-terminfo + (package + (name "ruby-terminfo") + (version "0.1.1") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "ruby-terminfo" version)) + (sha256 + (base32 + "0rl4ic5pzvrpgd42z0c1s2n3j39c9znksblxxvmhkzrc0ckyg2cm")))) + (build-system ruby-build-system) + (arguments + `(#:test-target "test" + ;; Rakefile requires old packages and would need modification to + ;; work with current software. + #:tests? #f)) + (inputs + `(("ncurses" ,ncurses))) + (native-inputs + `(("ruby-rubygems-tasks" ,ruby-rubygems-tasks) + ("ruby-rdoc" ,ruby-rdoc))) + (home-page "http://www.a-k-r.org/ruby-terminfo/") + (synopsis "Terminfo binding for Ruby") + (description "Ruby-terminfo provides terminfo binding for Ruby.") + (license license:bsd-3))) + +(define-public ruby-diffy + (package + (name "ruby-diffy") + (version "3.2.1") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "diffy" version)) + (sha256 + (base32 + "119imrkn01agwhx5raxhknsi331y5i4yda7r0ws0an6905ximzjg")))) + (build-system ruby-build-system) + (arguments + ;; No tests + `(#:tests? #f)) + (native-inputs + `(("ruby-rspec" ,ruby-rspec))) + (home-page "https://github.com/samg/diffy") + (synopsis "Convenient diffing in ruby") + (description "Diffy provides a convenient way to generate a diff from two +strings or files.") + (license license:expat))) + +(define-public ruby-sass-spec + (package + (name "ruby-sass-spec") + (version "3.5.4") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/sass/sass-spec/archive/v" + version ".tar.gz")) + (file-name (string-append name "-" version ".tar.gz")) + (sha256 + (base32 + "0nx8lp7c9qa58w489crgqa3c489xsyarn1a8h4np9mwwfqm1h3rr")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-command-line-reporter-3" ,ruby-command-line-reporter-3) + ("ruby-diffy" ,ruby-diffy) + ("ruby-terminfo" ,ruby-terminfo))) + (arguments + ;; No Rakefile + `(#:tests? #f)) + (home-page "https://github.com/sass/sass-spec") + (synopsis "Test suite for Sass") + (description "Sass Spec is a test suite for Sass. Test cases are all in +the @file{spec} directory.") + (license license:expat))) + +(define-public ruby-sass + (package + (name "ruby-sass") + (version "3.5.7") + (source (origin + (method url-fetch) + (uri (rubygems-uri "sass" version)) + (sha256 + (base32 + "1sy7xsbgpcy90j5ynbq967yplffp74pvph3r8ivn2sv2b44q6i61")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-sass-listen" ,ruby-sass-listen))) + (native-inputs + `(("ruby-sass-spec" ,ruby-sass-spec))) + (home-page "http://sass-lang.com/") + (synopsis "CSS extension language") + (description "Sass is a CSS extension language. It extends CSS with +features that don't exist yet like variables, nesting, mixins and inheritance.") + (license license:expat))) + +(define-public ruby-jekyll-sass-converter + (package + (name "ruby-jekyll-sass-converter") + (version "1.5.2") + (source (origin + (method url-fetch) + (uri (rubygems-uri "jekyll-sass-converter" version)) + (sha256 + (base32 + "008ikh5fk0n6ri54mylcl8jn0mq8p2nfyfqif2q3pp0lwilkcxsk")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-sass" ,ruby-sass))) + (arguments + ;; No rakefile + `(#:tests? #f)) + (home-page "https://github.com/jekyll/jekyll-sass-converter") + (synopsis "Sass converter for Jekyll") + (description "This gem provide built-in support for the Sass converter +in Jekyll.") + (license license:expat))) + +(define-public ruby-jekyll-watch + (package + (name "ruby-jekyll-watch") + (version "2.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "jekyll-watch" version)) + (sha256 + (base32 + "0m7scvj3ki8bmyx5v8pzibpg6my10nycnc28lip98dskf8iakprp")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-listen-3.0" ,ruby-listen-3.0))) + (arguments + ;; No rakefile + `(#:tests? #f)) + (home-page "https://github.com/jekyll/jekyll-watch") + (synopsis "Jekyll auto-rebuild support") + (description "This gems add the @code{--watch} switch to the jekyll CLI +interface. It allows Jekyll to rebuild your site when a file changes.") + (license license:expat))) + +(define-public ruby-parallel + (package + (name "ruby-parallel") + (version "1.12.1") + (source (origin + (method url-fetch) + (uri (rubygems-uri "parallel" version)) + (sha256 + (base32 + "01hj8v1qnyl5ndrs33g8ld8ibk0rbcqdpkpznr04gkbxd11pqn67")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (home-page "https://github.com/grosser/parallel") + (synopsis "Parallel processing in Ruby") + (description "Parallel allows you to run any code in parallel Processes +(to use all CPUs) or Threads(to speedup blocking operations). It is best +suited for map-reduce or e.g. parallel downloads/uploads.") + (license license:expat))) + +(define-public ruby-cane + (package + (name "ruby-cane") + (version "3.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "cane" version)) + (sha256 + (base32 + "0yf5za3l7lhrqa3g56sah73wh33lbxy5y3cb7ij0a2bp1b4kwhih")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (home-page "https://github.com/square/cane") + (propagated-inputs + `(("ruby-parallel" ,ruby-parallel))) + (synopsis "Code quality threshold checking") + (description "Cane fails your build if code quality thresholds are not met.") + (license license:asl2.0))) + +(define-public ruby-morecane + (package + (name "ruby-morecane") + (version "0.2.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "morecane" version)) + (sha256 + (base32 + "0w70vb8z5bdhvr21h660aa43m5948pv0bd27z7ngai2iwdvqd771")))) + (build-system ruby-build-system) + (home-page "https://github.com/yob/morecane") + (arguments `(#:tests? #f)); No rakefile + (propagated-inputs + `(("ruby-parallel" ,ruby-parallel))) + (synopsis "Extra checks for cane") + (description "The cane gem provides a great framework for running quality +checks over your ruby project as part of continuous integration build. It +comes with a few checks out of the box, but also provides an API for loading +custom checks. This gem provides a set of additional checks.") + (license license:expat))) + +(define-public ruby-pdf-reader + (package + (name "ruby-pdf-reader") + (version "2.1.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "pdf-reader" version)) + (sha256 + (base32 + "1b3ig4wpcgdbqa7yw0ahwbmikkkywn2a22bfmrknl5ls7g066x45")))) + (build-system ruby-build-system) + (arguments `(#:test-target "spec")) + (native-inputs + `(("bundler" ,bundler) + ("ruby-rspec" ,ruby-rspec) + ("ruby-cane" ,ruby-cane) + ("ruby-morecane" ,ruby-morecane))) + (propagated-inputs + `(("ruby-afm" ,ruby-afm) + ("ruby-ascii85" ,ruby-ascii85) + ("ruby-hashery" ,ruby-hashery) + ("ruby-rc4" ,ruby-rc4) + ("ruby-ttfunk" ,ruby-ttfunk))) + (home-page "https://github.com/yob/pdf-reader") + (synopsis "PDF parser in Ruby") + (description "The PDF::Reader library implements a PDF parser conforming as +much as possible to the PDF specification from Adobe. It provides programmatic +access to the contents of a PDF file with a high degree of flexibility.") + (license license:gpl3+))) + +(define-public ruby-pdf-inspector + (package + (name "ruby-pdf-inspector") + (version "1.3.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "pdf-inspector" version)) + (sha256 + (base32 + "1g853az4xzgqxr5xiwhb76g4sqmjg4s79mm35mp676zjsrwpa47w")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-pdf-reader" ,ruby-pdf-reader))) + (arguments `(#:tests? #f)); No rakefile + (home-page "https://github.com/prawnpdf/pdf-inspector") + (synopsis "Analysis classes for inspecting PDF output") + (description "This library provides a number of PDF::Reader based tools for +use in testing PDF output. Presently, the primary purpose of this tool is to +support the tests found in Prawn, a pure Ruby PDF generation library.") + (license license:gpl3+))) + +(define-public ruby-pdf-core + (package + (name "ruby-pdf-core") + (version "0.8.1") + (source (origin + (method url-fetch) + (uri (rubygems-uri "pdf-core" version)) + (sha256 + (base32 + "15d6m99bc8bbzlkcg13qfpjjzphfg5x905pjbfygvpcxsm8gnsvg")))) + (build-system ruby-build-system) + (arguments + ; No test target + `(#:tests? #f)) + (home-page "https://github.com/prawnpdf/pdf-core") + (synopsis "Low level PDF features for Prawn") + (description "This is an experimental gem that extracts low-level PDF +functionality from Prawn.") + (license license:gpl3+))) + +(define-public ruby-yard + (package + (name "ruby-yard") + (version "0.9.16") + (source (origin + (method url-fetch) + (uri (rubygems-uri "yard" version)) + (sha256 + (base32 + "0lmmr1839qgbb3zxfa7jf5mzy17yjl1yirwlgzdhws4452gqhn67")))) + (build-system ruby-build-system) + (arguments `(#:test-target "spec")) + (home-page "https://yardoc.org/") + (synopsis "Ruby documentation tool") + (description "YARD is a documentation generation tool for the Ruby +programming language. It enables the user to generate consistent, usable +documentation that can be exported to a number of formats very easily, and +also supports extending for custom Ruby constructs such as custom class level +definitions.") + (license license:expat))) + +(define-public ruby-prawn + (package + (name "ruby-prawn") + (version "2.2.2") + (source (origin + (method url-fetch) + (uri (rubygems-uri "prawn" version)) + (sha256 + (base32 + "1qdjf1v6sfl44g3rqxlg8k4jrzkwaxgvh2l4xws97a8f3xv4na4m")))) + (build-system ruby-build-system) + (arguments + ; No tests + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-before 'build 'fix-dependencies + (lambda _ + (substitute* "prawn.gemspec" + (("~> 0.7.0") "~> 0.7")) + #t))))) + (propagated-inputs + `(("ruby-pdf-core" ,ruby-pdf-core) + ("ruby-ttfunk" ,ruby-ttfunk))) + (native-inputs + `(("bundler" ,bundler) + ("ruby-pdf-inspector" ,ruby-pdf-inspector) + ("ruby-rspec" ,ruby-rspec) + ("ruby-simplecov" ,ruby-simplecov) + ("ruby-yard" ,ruby-yard))) + (home-page "http://prawnpdf.org/api-docs/2.0/") + (synopsis "PDF generation for Ruby") + (description "Prawn is a pure Ruby PDF generation library.") + (license license:gpl3+))) + +(define-public ruby-prawn-table + (package + (name "ruby-prawn-table") + (version "0.2.2") + (source (origin + (method url-fetch) + (uri (rubygems-uri "prawn-table" version)) + (sha256 + (base32 + "1nxd6qmxqwl850icp18wjh5k0s3amxcajdrkjyzpfgq0kvilcv9k")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (propagated-inputs + `(("ruby-prawn" ,ruby-prawn))) + (home-page "https://github.com/prawnpdf/prawn-table") + (synopsis "Tables support for Prawn") + (description "This gem provides tables support for Prawn.") + (license license:gpl3+))) + +(define-public ruby-kramdown + (package + (name "ruby-kramdown") + (version "1.17.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "kramdown" version)) + (sha256 + (base32 + "1n1c4jmrh5ig8iv1rw81s4mw4xsp4v97hvf8zkigv4hn5h542qjq")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); FIXME: some test failures + (native-inputs + `(("ruby-prawn" ,ruby-prawn) + ("ruby-prawn-table" ,ruby-prawn-table))) + (home-page "https://kramdown.gettalong.org/") + (synopsis "Markdown parsing and converting library") + (description "Kramdown is a library for parsing and converting a superset +of Markdown. It is completely written in Ruby, supports standard Markdown +(with some minor modifications) and various extensions that have been made +popular by the PHP @code{Markdown Extra} package and @code{Maruku}.") + (license license:expat))) + +(define-public ruby-http-parser.rb + (package + (name "ruby-http-parser.rb") + (version "0.6.0") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "http_parser.rb" version)) + (sha256 + (base32 + "15nidriy0v5yqfjsgsra51wmknxci2n2grliz78sf9pga3n0l7gi")))) + (build-system ruby-build-system) + (arguments + ;; No tests + `(#:tests? #f)) + (native-inputs + `(("ruby-rake-compiler" ,ruby-rake-compiler) + ("ruby-rspec" ,ruby-rspec))) + (home-page "https://github.com/tmm1/http_parser.rb") + (synopsis "HTTP parser un Ruby") + (description "This gem is a simple callback-based HTTP request/response +parser for writing http servers, clients and proxies.") + (license license:expat))) + +(define-public ruby-em-websocket + (package + (name "ruby-em-websocket") + (version "0.5.1") + (source + (origin + (method url-fetch) + (uri (rubygems-uri "em-websocket" version)) + (sha256 + (base32 + "1bsw8vjz0z267j40nhbmrvfz7dvacq4p0pagvyp17jif6mj6v7n3")))) + (build-system ruby-build-system) + (arguments + ;; No tests + `(#:tests? #f)) + (propagated-inputs + `(("ruby-eventmachine" ,ruby-eventmachine) + ("ruby-http-parser.rb" ,ruby-http-parser.rb))) + (native-inputs + `(("bundler" ,bundler) + ("ruby-rspec" ,ruby-rspec))) + (home-page "https://github.com/igrigorik/em-websocket") + (synopsis "EventMachine based WebSocket server") + (description "Em-websocket is an EventMachine based WebSocket server +implementation.") + (license license:expat))) + +(define-public ruby-rouge + (package + (name "ruby-rouge") + (version "3.2.1") + (source (origin + (method url-fetch) + (uri (rubygems-uri "rouge" version)) + (sha256 + (base32 + "0h79gn2wmn1wix2d27lgiaimccyj8gvizrllyym500pir408x62f")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (home-page "http://rouge.jneen.net/") + (synopsis "Code highlighter") + (description "Rouge is a code highlighter written in Ruby. It supports more +than 100 languages and outputs HTML or ANSI 256-color text. Its HTML output +is compatible with stylesheets designed for pygments.") + (license (list + ;; rouge is licensed under expat + license:expat + ;; pygments is licensed under bsd-2 + license:bsd-2)))) + +(define-public ruby-rouge-2 + (package + (inherit ruby-rouge) + (version "2.2.1") + (source (origin + (method url-fetch) + (uri (rubygems-uri "rouge" version)) + (sha256 + (base32 + "02kpahk5nkc33yxnn75649kzxaz073wvazr2zyg491nndykgnvcs")))))) + +(define-public ruby-hashie + (package + (name "ruby-hashie") + (version "3.6.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "hashie" version)) + (sha256 + (base32 + "13bdzfp25c8k51ayzxqkbzag3wj5gc1jd8h7d985nsq6pn57g5xh")))) + (build-system ruby-build-system) + (native-inputs + `(("bundler" ,bundler))) + (arguments `(#:tests? #f)); FIXME: Could not locate Gemfile or .bundle/ directory + (home-page "https://github.com/intridea/hashie") + (synopsis "Extensions to Ruby Hashes") + (description "Hashie is a collection of classes and mixins that make Ruby +hashes more powerful.") + (license license:expat))) + +(define-public ruby-heredoc-unindent + (package + (name "ruby-heredoc-unindent") + (version "1.2.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "heredoc_unindent" version)) + (sha256 + (base32 + "14ijr2fsjwhrkjkcaz81d5xnfa4vvgvcflrff83avqw9klm011yw")))) + (build-system ruby-build-system) + (native-inputs + `(("ruby-hoe" ,ruby-hoe))) + (home-page "https://github.com/adrianomitre/heredoc_unindent") + (synopsis "Heredoc indentation cleaner") + (description "This gem removes common margin from indented strings, such +as the ones produced by indented heredocs. In other words, it strips out +leading whitespace chars at the beggining of each line, but only as much as +the line with the smallest margin. + +It is acknowledged that many strings defined by heredocs are just code and +fact is that most parsers are insensitive to indentation. If, however, the +strings are to be used otherwise, be it for printing or testing, the extra +indentation will probably be an issue and hence this gem.") + (license license:expat))) + +(define-public ruby-safe-yaml + (package + (name "ruby-safe-yaml") + (version "1.0.4") + (source (origin + (method url-fetch) + (uri (rubygems-uri "safe_yaml" version)) + (sha256 + (base32 + "1hly915584hyi9q9vgd968x2nsi5yag9jyf5kq60lwzi5scr7094")))) + (build-system ruby-build-system) + (native-inputs + `(("ruby-rspec" ,ruby-rspec) + ("ruby-hashie" ,ruby-hashie) + ("ruby-heredoc-unindent" ,ruby-heredoc-unindent))) + (arguments `(#:test-target "spec" + #:tests? #f));; FIXME: one failure + (home-page "https://github.com/dtao/safe_yaml") + (synopsis "YAML parser") + (description "The SafeYAML gem provides an alternative implementation of +YAML.load suitable for accepting user input in Ruby applications.") + (license license:expat))) + +(define-public ruby-mercenary + (package + (name "ruby-mercenary") + (version "0.3.6") + (source (origin + (method url-fetch) + (uri (rubygems-uri "mercenary" version)) + (sha256 + (base32 + "10la0xw82dh5mqab8bl0dk21zld63cqxb1g16fk8cb39ylc4n21a")))) + (build-system ruby-build-system) + (arguments `(#:test-target "spec")) + (native-inputs + `(("bundler" ,bundler))) + (home-page "https://github.com/jekyll/mercenary") + (synopsis "Command-line apps library in Ruby") + (description "Mercenary is a lightweight and flexible library for writing +command-line apps in Ruby.") + (license license:expat))) + +(define-public ruby-liquid + (package + (name "ruby-liquid") + (version "4.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "liquid" version)) + (sha256 + (base32 + "17fa0jgwm9a935fyvzy8bysz7j5n1vf1x2wzqkdfd5k08dbw3x2y")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); No rakefile + (home-page "https://shopify.github.io/liquid/") + (synopsis "Template language") + (description "Liquid is a template language written in Ruby. It is used +to load dynamic content on storefronts.") + (license license:expat))) + +(define-public ruby-forwardable-extended + (package + (name "ruby-forwardable-extended") + (version "2.6.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "forwardable-extended" version)) + (sha256 + (base32 + "15zcqfxfvsnprwm8agia85x64vjzr2w0xn9vxfnxzgcv8s699v0v")))) + (build-system ruby-build-system) + (arguments `(#:tests? #f)); Cyclic dependency on luna-rspec-formatters + (home-page "https://github.com/envygeeks/forwardable-extended") + (synopsis "Delegation to hashes and instance variables in Forwardable") + (description "Forwardable Extended provides more @code{Forwardable} +methods for your source as @code{Forwardable::Extended}.") + (license license:expat))) + +(define-public ruby-pathutil + (package + (name "ruby-pathutil") + (version "0.16.1") + (source (origin + (method url-fetch) + (uri (rubygems-uri "pathutil" version)) + (sha256 + (base32 + "0wc18ms1rzi44lpjychyw2a96jcmgxqdvy2949r4vvb5f4p0lgvz")))) + (build-system ruby-build-system) + (propagated-inputs + `(("ruby-forwardable-extended" ,ruby-forwardable-extended))) + (native-inputs + `(("bundler" ,bundler) + ("ruby-rspec" ,ruby-rspec))) + ;; Fails with: cannot load such file -- + ;; /tmp/guix-build-ruby-pathutil-0.16.0.drv-0/gem/benchmark/support/task + (arguments `(#:tests? #f)) + (home-page "https://github.com/envygeeks/pathutil") + (synopsis "Extended implementation of Pathname") + (description "Pathutil tries to be a faster pure Ruby implementation of +Pathname.") + (license license:expat))) + +(define-public jekyll + (package + (name "jekyll") + (version "3.8.3") + (source (origin + (method url-fetch) + (uri (rubygems-uri "jekyll" version)) + (sha256 + (base32 + "1iw90wihk9dscgmppf5v6lysg3kjmnx50mjyl4gghkdb4spw97xk")))) + (build-system ruby-build-system) + (arguments + ;; No rakefile, but a test subdirectory + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-before 'build 'fix-i18n + (lambda _ + (substitute* ".gemspec" + (("~> 0.7") ">= 0.7")) + #t))))) + (propagated-inputs + `(("ruby-addressable" ,ruby-addressable) + ("ruby-colorator" ,ruby-colorator) + ("ruby-em-websocket" ,ruby-em-websocket) + ("ruby-i18n" ,ruby-i18n) + ("ruby-jekyll-sass-converter" ,ruby-jekyll-sass-converter) + ("ruby-jekyll-watch" ,ruby-jekyll-watch) + ("ruby-kramdown" ,ruby-kramdown) + ("ruby-liquid" ,ruby-liquid) + ("ruby-mercenary" ,ruby-mercenary) + ("ruby-pathutil" ,ruby-pathutil) + ("ruby-rouge" ,ruby-rouge-2) + ("ruby-safe-yaml" ,ruby-safe-yaml))) + (home-page "https://jekyllrb.com/") + (synopsis "Static site generator") + (description "Jekyll is a simple, blog aware, static site generator.") + (license license:expat))) + +(define-public ruby-jekyll-paginate-v2 + (package + (name "ruby-jekyll-paginate-v2") + (version "2.0.0") + (source (origin + (method url-fetch) + (uri (rubygems-uri "jekyll-paginate-v2" version)) + (sha256 + (base32 + "154bfpyml6abxww9868hhyfvxasl8qhsc5zy2q30c7dxaj0igdib")))) + (build-system ruby-build-system) + (propagated-inputs + `(("jekyll" ,jekyll))) + (home-page "https://github.com/sverrirs/jekyll-paginate-v2") + (synopsis "Pagination Generator for Jekyll 3") + (description "The Pagination Generator forms the core of the pagination +logic in Jekyll. It calculates and generates the pagination pages.") + (license license:expat))) diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm index 0695f8c7d2..631dcfd67c 100644 --- a/gnu/packages/rust.scm +++ b/gnu/packages/rust.scm @@ -167,14 +167,120 @@ in turn be used to build the final Rust.") (snippet '(begin (delete-file-recursively "src/llvm") #t)) (patches (map search-patch patches)))) +(define* (rust-bootstrapped-package base-rust version checksum + #:key (patches '())) + "Bootstrap rust VERSION with source checksum CHECKSUM patched with PATCHES using BASE-RUST." + (package + (inherit base-rust) + (version version) + (source + (rust-source version checksum #:patches patches)) + (native-inputs + (alist-replace "cargo-bootstrap" (list base-rust "cargo") + (alist-replace "rustc-bootstrap" (list base-rust) + (package-native-inputs base-rust)))))) + +(define-public mrustc + (let ((rustc-version "1.19.0")) + (package + (name "mrustc") + (version "0.8.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/thepowersgang/mrustc.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0a7v8ccyzp1sdkwni8h1698hxpfz2sxhcpx42n6l2pbm0rbjp08i")))) + (outputs '("out" "cargo")) + (build-system gnu-build-system) + (inputs + `(("llvm" ,llvm-3.9.1))) + (native-inputs + `(("bison" ,bison) + ("flex" ,flex) + ;; Required for the libstd sources. + ("rustc" + ,(rust-source "1.19.0" "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm")))) + (arguments + `(#:tests? #f + #:make-flags (list (string-append "LLVM_CONFIG=" + (assoc-ref %build-inputs "llvm") + "/bin/llvm-config")) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-date + (lambda _ + (substitute* "Makefile" + (("shell date") "shell date -d @1")) + #t)) + (add-after 'patch-date 'unpack-target-compiler + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "minicargo.mk" + ;; Don't try to build LLVM. + (("^[$][(]LLVM_CONFIG[)]:") "xxx:") + ;; Build for the correct target architecture. + (("^RUSTC_TARGET := x86_64-unknown-linux-gnu") + (string-append "RUSTC_TARGET := " + ,(or (%current-target-system) + (nix-system->gnu-triplet-for-rust))))) + (invoke "tar" "xf" (assoc-ref inputs "rustc")) + (chdir "rustc-1.19.0-src") + (invoke "patch" "-p0" "../rust_src.patch") + (chdir "..") + #t)) + (replace 'configure + (lambda* (#:key inputs #:allow-other-keys) + (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc")) + #t)) + (add-after 'build 'build-minicargo + (lambda _ + (for-each (lambda (target) + (invoke "make" "-f" "minicargo.mk" target)) + '("output/libstd.hir" "output/libpanic_unwind.hir" + "output/libproc_macro.hir" "output/libtest.hir")) + ;; Technically the above already does it - but we want to be clear. + (invoke "make" "-C" "tools/minicargo"))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) + (tools-bin (string-append out "/tools/bin")) + (cargo-out (assoc-ref outputs "cargo")) + (cargo-bin (string-append cargo-out "/bin")) + (lib (string-append out "/lib")) + (lib/rust (string-append lib "/mrust")) + (gcc (assoc-ref inputs "gcc"))) + ;; These files are not reproducible. + (for-each delete-file (find-files "output" "\\.txt$")) + (mkdir-p lib) + (copy-recursively "output" lib/rust) + (mkdir-p bin) + (mkdir-p tools-bin) + (install-file "bin/mrustc" bin) + ;; minicargo uses relative paths to resolve mrustc. + (install-file "tools/bin/minicargo" tools-bin) + (install-file "tools/bin/minicargo" cargo-bin) + #t)))))) + (synopsis "Compiler for the Rust progamming language") + (description "Rust is a systems programming language that provides memory +safety and thread safety guarantees.") + (home-page "https://github.com/thepowersgang/mrustc") + ;; Dual licensed. + (license (list license:asl2.0 license:expat))))) + (define rust-1.19 (package (name "rust") (version "1.19.0") - (source (rust-source version "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm")) + (source (rust-source version "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm" + #:patches '("rust-1.19-mrustc.patch"))) (outputs '("out" "cargo")) (arguments `(#:imported-modules ,%cargo-build-system-modules ;for `generate-checksums' + #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system)) #:phases (modify-phases %standard-phases (add-after 'unpack 'set-env @@ -187,6 +293,24 @@ in turn be used to build the final Rust.") ;; guix llvm-3.9.1 package installs only shared libraries (setenv "LLVM_LINK_SHARED" "1") #t)) + (add-after 'unpack 'patch-cargo-tomls + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "src/librustc_errors/Cargo.toml" + (("[[]dependencies[]]") " +[dependencies] +term = \"0.4.4\" +")) + (substitute* "src/librustc/Cargo.toml" + (("[[]dependencies[]]") " +[dependencies] +getopts = { path = \"../libgetopts\" } +")) + (substitute* "src/librustdoc/Cargo.toml" + (("[[]dependencies[]]") " +[dependencies] +test = { path = \"../libtest\" } +")) + #t)) (add-after 'unpack 'patch-tests (lambda* (#:key inputs #:allow-other-keys) (let ((bash (assoc-ref inputs "bash"))) @@ -243,12 +367,97 @@ in turn be used to build the final Rust.") (generate-checksums dir ,%cargo-reference-project-file))) (find-files "src/vendor" ".cargo-checksum.json")) #t)) + ;; This phase is overridden by newer versions. (replace 'configure (const #t)) + ;; This phase is overridden by newer versions. + (replace 'build + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((rustc-bootstrap (assoc-ref inputs "rustc-bootstrap"))) + (setenv "CFG_COMPILER_HOST_TRIPLE" + ,(nix-system->gnu-triplet (%current-system))) + (setenv "CFG_RELEASE" "") + (setenv "CFG_RELEASE_CHANNEL" "stable") + (setenv "CFG_LIBDIR_RELATIVE" "lib") + (setenv "CFG_VERSION" "1.19.0-stable-mrustc") + ; bad: (setenv "CFG_PREFIX" "mrustc") ; FIXME output path. + (mkdir-p "output") + (invoke (string-append rustc-bootstrap "/tools/bin/minicargo") + "src/rustc" "--vendor-dir" "src/vendor" + "--output-dir" "output/rustc-build" + "-L" (string-append rustc-bootstrap "/lib/mrust") + "-j" "1") + (install-file "output/rustc-build/rustc" "output") ; FIXME: Remove? + (setenv "CFG_COMPILER_HOST_TRIPLE" #f) + (setenv "CFG_RELEASE" #f) + (setenv "CFG_RELEASE_CHANNEL" #f) + (setenv "CFG_VERSION" #f) + (setenv "CFG_PREFIX" #f) + (setenv "CFG_LIBDIR_RELATIVE" #f) + (invoke (string-append rustc-bootstrap "/tools/bin/minicargo") + "src/tools/cargo" "--vendor-dir" "src/vendor" + "--output-dir" "output/cargo-build" + "-L" "output/" + "-L" (string-append rustc-bootstrap "/lib/mrust") + "-j" "1") + ;; Now use the newly-built rustc to build the libraries. + ;; One day that could be replaced by: + ;; (invoke "output/cargo-build/cargo" "build" + ;; "--manifest-path" "src/bootstrap/Cargo.toml" + ;; "--verbose") ; "--locked" "--frozen" + ;; but right now, Cargo has problems with libstd's circular + ;; dependencies. + (mkdir-p "output/target-libs") + (for-each ((@ (ice-9 match) match-lambda) + ((name . flags) + (write name) + (newline) + (apply invoke + "output/rustc-build/rustc" + "-C" (string-append "linker=" + (getenv "CC")) + "-L" "output/target-libs" + (string-append "src/" name "/lib.rs") + "-o" + (string-append "output/target-libs/" + (car (string-split name #\/)) + ".rlib") + flags))) + '(("libcore") + ("libstd_unicode") + ("liballoc") + ("libcollections") + ("librand") + ("liblibc/src" "--cfg" "stdbuild") + ("libunwind" "-l" "gcc_s") + ("libcompiler_builtins") + ("liballoc_system") + ("libpanic_unwind") + ;; Uses "cc" to link. + ("libstd" "-l" "dl" "-l" "rt" "-l" "pthread") + ("libarena"))) + #t))) + ;; This phase is overridden by newer versions. (replace 'check (const #t)) + ;; This phase is overridden by newer versions. (replace 'install - (const #t))))) + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (target-system ,(or (%current-target-system) + (nix-system->gnu-triplet + (%current-system)))) + (out-libs (string-append out "/lib/rustlib/" + target-system "/lib"))) + ;(setenv "CFG_PREFIX" out) + (mkdir-p out-libs) + (copy-recursively "output/target-libs" out-libs) + (install-file "output/rustc-build/rustc" + (string-append out "/bin")) + (install-file "output/cargo-build/cargo" + (string-append (assoc-ref outputs "cargo") + "/bin"))) + #t))))) (build-system gnu-build-system) (native-inputs `(("bison" ,bison) ; For the tests @@ -258,8 +467,8 @@ in turn be used to build the final Rust.") ("git" ,git) ("procps" ,procps) ; For the tests ("python-2" ,python-2) - ("rustc-bootstrap" ,rust-bootstrap) - ("cargo-bootstrap" ,rust-bootstrap "cargo") + ("rustc-bootstrap" ,mrustc) + ("cargo-bootstrap" ,mrustc "cargo") ("pkg-config" ,pkg-config) ; For "cargo" ("which" ,which))) (inputs @@ -289,110 +498,6 @@ safety and thread safety guarantees.") ;; Dual licensed. (license (list license:asl2.0 license:expat)))) -(define* (rust-bootstrapped-package base-rust version checksum - #:key (patches '())) - "Bootstrap rust VERSION with source checksum CHECKSUM patched with PATCHES using BASE-RUST." - (package - (inherit base-rust) - (version version) - (source - (rust-source version checksum #:patches patches)) - (native-inputs - (alist-replace "cargo-bootstrap" (list base-rust "cargo") - (alist-replace "rustc-bootstrap" (list base-rust) - (package-native-inputs base-rust)))))) - -(define-public mrustc - (let ((rustc-version "1.19.0")) - (package - (name "mrustc") - (version "0.8.0") - (source (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/thepowersgang/mrustc.git") - (commit (string-append "v" version)))) - (file-name (git-file-name name version)) - (sha256 - (base32 - "0a7v8ccyzp1sdkwni8h1698hxpfz2sxhcpx42n6l2pbm0rbjp08i")))) - (outputs '("out" "cargo")) - (build-system gnu-build-system) - (inputs - `(("llvm" ,llvm-3.9.1))) - (native-inputs - `(("bison" ,bison) - ("flex" ,flex) - ;; Required for the libstd sources. - ("rustc" - ,(rust-source "1.19.0" "0l8c14qsf42rmkqy92ahij4vf356dbyspxcips1aswpvad81y8qm")))) - (arguments - `(#:tests? #f - #:make-flags (list (string-append "LLVM_CONFIG=" - (assoc-ref %build-inputs "llvm") - "/bin/llvm-config")) - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'patch-date - (lambda _ - (substitute* "Makefile" - (("shell date") "shell date -d @1")) - #t)) - (add-after 'patch-date 'unpack-target-compiler - (lambda* (#:key inputs outputs #:allow-other-keys) - (substitute* "minicargo.mk" - ;; Don't try to build LLVM. - (("^[$][(]LLVM_CONFIG[)]:") "xxx:") - ;; Build for the correct target architecture. - (("^RUSTC_TARGET := x86_64-unknown-linux-gnu") - (string-append "RUSTC_TARGET := " - ,(or (%current-target-system) - (nix-system->gnu-triplet-for-rust))))) - (invoke "tar" "xf" (assoc-ref inputs "rustc")) - (chdir "rustc-1.19.0-src") - (invoke "patch" "-p0" "../rust_src.patch") - (chdir "..") - #t)) - (replace 'configure - (lambda* (#:key inputs #:allow-other-keys) - (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc")) - #t)) - (add-after 'build 'build-minicargo - (lambda _ - (for-each (lambda (target) - (invoke "make" "-f" "minicargo.mk" target)) - '("output/libstd.hir" "output/libpanic_unwind.hir" - "output/libproc_macro.hir" "output/libtest.hir")) - ;; Technically the above already does it - but we want to be clear. - (invoke "make" "-C" "tools/minicargo"))) - (replace 'install - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (bin (string-append out "/bin")) - (tools-bin (string-append out "/tools/bin")) - (cargo-out (assoc-ref outputs "cargo")) - (cargo-bin (string-append cargo-out "/bin")) - (lib (string-append out "/lib")) - (lib/rust (string-append lib "/mrust")) - (gcc (assoc-ref inputs "gcc"))) - ;; These files are not reproducible. - (for-each delete-file (find-files "output" "\\.txt$")) - (mkdir-p lib) - (copy-recursively "output" lib/rust) - (mkdir-p bin) - (mkdir-p tools-bin) - (install-file "bin/mrustc" bin) - ;; minicargo uses relative paths to resolve mrustc. - (install-file "tools/bin/minicargo" tools-bin) - (install-file "tools/bin/minicargo" cargo-bin) - #t)))))) - (synopsis "Compiler for the Rust progamming language") - (description "Rust is a systems programming language that provides memory -safety and thread safety guarantees.") - (home-page "https://github.com/thepowersgang/mrustc") - ;; Dual licensed. - (license (list license:asl2.0 license:expat))))) - (define-public rust-1.23 (package (inherit rust-1.19) @@ -400,6 +505,18 @@ safety and thread safety guarantees.") (version "1.23.0") (source (rust-source version "14fb8vhjzsxlbi6yrn1r6fl5dlbdd1m92dn5zj5gmzfwf4w9ar3l")) (outputs '("out" "doc" "cargo")) + (native-inputs + `(("bison" ,bison) ; For the tests + ("cmake" ,cmake) + ("flex" ,flex) ; For the tests + ("gdb" ,gdb) ; For the tests + ("git" ,git) + ("procps" ,procps) ; For the tests + ("python-2" ,python-2) + ("rustc-bootstrap" ,rust-bootstrap) + ("cargo-bootstrap" ,rust-bootstrap "cargo") + ("pkg-config" ,pkg-config) ; For "cargo" + ("which" ,which))) (arguments (substitute-keyword-arguments (package-arguments rust-1.19) ((#:phases phases) @@ -410,6 +527,8 @@ safety and thread safety guarantees.") (substitute* "src/binaryen/CMakeLists.txt" (("ADD_COMPILE_FLAG\\(\\\"-march=native\\\"\\)") "")) #t)) + ;; TODO: Revisit this and find out whether that's needed after all. + (delete 'patch-cargo-tomls) (add-after 'patch-tests 'patch-cargo-tests (lambda _ (substitute* "src/tools/cargo/tests/build.rs" diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm index 9c1257b2a1..b818a3ccb5 100644 --- a/gnu/packages/wine.scm +++ b/gnu/packages/wine.scm @@ -225,7 +225,7 @@ integrate Windows applications into your desktop.") (define-public wine-staging-patchset-data (package (name "wine-staging-patchset-data") - (version "3.14") + (version "3.15") (source (origin (method git-fetch) @@ -235,7 +235,7 @@ integrate Windows applications into your desktop.") (file-name (git-file-name name version)) (sha256 (base32 - "0h6gck0p92hin0m13q1hnlfnqs4vy474w66ppinvqms2zn3vibgi")))) + "1rgbx4qnxaarkq5n8nvj57q0rhxcqbwm5897ws962fgxh6zymg9n")))) (build-system trivial-build-system) (native-inputs `(("bash" ,bash) @@ -281,7 +281,7 @@ integrate Windows applications into your desktop.") (file-name (string-append name "-" version ".tar.xz")) (sha256 (base32 - "01dhn3a6k3dwnrbz4bxvszhh5sxwy6s89y459g805hjmq8s6d2a7")))) + "07mmd8r70ciqrxzdg2m2mg34kcnb43dk9nw1ljm8jbcznsawv8ic")))) (inputs `(("autoconf" ,autoconf) ; for autoreconf ("gtk+" ,gtk+) ("libva" ,libva) diff --git a/guix/channels.scm b/guix/channels.scm new file mode 100644 index 0000000000..ec3e05eaf5 --- /dev/null +++ b/guix/channels.scm @@ -0,0 +1,292 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2018 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 (guix channels) + #:use-module (guix git) + #:use-module (guix records) + #:use-module (guix gexp) + #:use-module (guix discovery) + #:use-module (guix monads) + #:use-module (guix profiles) + #:use-module (guix derivations) + #:use-module (guix store) + #:use-module (guix i18n) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-11) + #:autoload (guix self) (whole-package) + #:use-module (ice-9 match) + #:export (channel + channel? + channel-name + channel-url + channel-branch + channel-commit + channel-location + + %default-channels + + channel-instance? + channel-instance-channel + channel-instance-commit + channel-instance-checkout + + latest-channel-instances + channel-instance-derivations + latest-channel-derivations + channel-instances->manifest)) + +;;; Commentary: +;;; +;;; This module implements "channels." A channel is usually a source of +;;; package definitions. There's a special channel, the 'guix' channel, that +;;; provides all of Guix, including its commands and its documentation. +;;; User-defined channels are expected to typically provide a bunch of .scm +;;; files meant to be added to the '%package-search-path'. +;;; +;;; This module provides tools to fetch and update channels from a Git +;;; repository and to build them. +;;; +;;; Code: + +(define-record-type* <channel> channel make-channel + channel? + (name channel-name) + (url channel-url) + (branch channel-branch (default "master")) + (commit channel-commit (default #f)) + (location channel-location + (default (current-source-location)) (innate))) +;; TODO: Add a way to express dependencies among channels. + +(define %default-channels + ;; Default list of channels. + (list (channel + (name 'guix) + (branch "origin/master") + (url "https://git.savannah.gnu.org/git/guix.git")))) + +(define (guix-channel? channel) + "Return true if CHANNEL is the 'guix' channel." + (eq? 'guix (channel-name channel))) + +(define-record-type <channel-instance> + (channel-instance channel commit checkout) + channel-instance? + (channel channel-instance-channel) + (commit channel-instance-commit) + (checkout channel-instance-checkout)) + +(define (channel-reference channel) + "Return the \"reference\" for CHANNEL, an sexp suitable for +'latest-repository-commit'." + (match (channel-commit channel) + (#f `(branch . ,(channel-branch channel))) + (commit `(commit . ,(channel-commit channel))))) + +(define (latest-channel-instances store channels) + "Return a list of channel instances corresponding to the latest checkouts of +CHANNELS." + (map (lambda (channel) + (format (current-error-port) + (G_ "Updating channel '~a' from Git repository at '~a'...~%") + (channel-name channel) + (channel-url channel)) + (let-values (((checkout commit) + (latest-repository-commit store (channel-url channel) + #:ref (channel-reference + channel)))) + (channel-instance channel commit checkout))) + channels)) + +(define %self-build-file + ;; The file containing code to build Guix. This serves the same purpose as + ;; a makefile, and, similarly, is intended to always keep this name. + "build-aux/build-self.scm") + +(define %pull-version + ;; This is the version of the 'guix pull' protocol. It specifies what's + ;; expected from %SELF-BUILD-FILE. The initial version ("0") was when we'd + ;; place a set of compiled Guile modules in ~/.config/guix/latest. + 1) + +(define (standard-module-derivation name source dependencies) + "Return a derivation that builds the Scheme modules in SOURCE and that +depend on DEPENDENCIES, a list of lowerable objects. The assumption is that +SOURCE contains package modules to be added to '%package-module-path'." + (define modules + (scheme-modules* source)) + + ;; FIXME: We should load, say SOURCE/.guix-channel.scm, which would allow + ;; channel publishers to specify things such as the sub-directory where .scm + ;; files live, files to exclude from the channel, preferred substitute URLs, + ;; etc. + (mlet* %store-monad ((compiled + (compiled-modules modules + #:name name + #:module-path (list source) + #:extensions dependencies))) + + (gexp->derivation name + (with-extensions dependencies + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + + (let ((go (string-append #$output "/lib/guile/" + (effective-version) + "/site-ccache")) + (scm (string-append #$output + "/share/guile/site/" + (effective-version)))) + (mkdir-p (dirname go)) + (symlink #$compiled go) + (mkdir-p (dirname scm)) + (symlink #$source scm)))))))) + +(define* (build-from-source name source + #:key verbose? commit + (dependencies '())) + "Return a derivation to build Guix from SOURCE, using the self-build script +contained therein. Use COMMIT as the version string." + ;; Running the self-build script makes it easier to update the build + ;; procedure: the self-build script of the Guix-to-be-installed contains the + ;; right dependencies, build procedure, etc., which the Guix-in-use may not + ;; be know. + (define script + (string-append source "/" %self-build-file)) + + (if (file-exists? script) + (let ((build (save-module-excursion + (lambda () + (primitive-load script))))) + ;; BUILD must be a monadic procedure of at least one argument: the + ;; source tree. + ;; + ;; Note: BUILD can return #f if it does not support %PULL-VERSION. In + ;; the future we'll fall back to a previous version of the protocol + ;; when that happens. + (build source #:verbose? verbose? #:version commit + #:pull-version %pull-version)) + + ;; Build a set of modules that extend Guix using the standard method. + (standard-module-derivation name source dependencies))) + +(define* (build-channel-instance instance #:optional (dependencies '())) + "Return, as a monadic value, the derivation for INSTANCE, a channel +instance. DEPENDENCIES is a list of extensions providing Guile modules that +INSTANCE depends on." + (build-from-source (symbol->string + (channel-name (channel-instance-channel instance))) + (channel-instance-checkout instance) + #:commit (channel-instance-commit instance) + #:dependencies dependencies)) + +(define (channel-instance-derivations instances) + "Return the list of derivations to build INSTANCES, in the same order as +INSTANCES." + (define core-instance + ;; The 'guix' channel is treated specially: it's an implicit dependency of + ;; all the other channels. + (find (lambda (instance) + (guix-channel? (channel-instance-channel instance))) + instances)) + + (mlet %store-monad ((core (build-channel-instance core-instance))) + (mapm %store-monad + (lambda (instance) + (if (eq? instance core-instance) + (return core) + (build-channel-instance instance + (list core)))) + instances))) + +(define latest-channel-derivations + (let ((latest-channel-instances (store-lift latest-channel-instances))) + (lambda (channels) + "Return, as a monadic value, the list of derivations for the latest +instances of CHANNELS." + (mlet %store-monad ((instances (latest-channel-instances channels))) + (channel-instance-derivations instances))))) + +(define (whole-package-for-legacy name modules) + "Return a full-blown Guix package for MODULES, a derivation that builds Guix +modules in the old ~/.config/guix/latest style." + (define packages + (resolve-interface '(gnu packages guile))) + + (letrec-syntax ((list (syntax-rules (->) + ((_) + '()) + ((_ (module -> variable) rest ...) + (cons (module-ref (resolve-interface + '(gnu packages module)) + 'variable) + (list rest ...))) + ((_ variable rest ...) + (cons (module-ref packages 'variable) + (list rest ...)))))) + (whole-package name modules + + ;; In the "old style", %SELF-BUILD-FILE would simply return a + ;; derivation that builds modules. We have to infer what the + ;; dependencies of these modules were. + (list guile-json guile-git guile-bytestructures + (ssh -> guile-ssh) (tls -> gnutls))))) + +(define (old-style-guix? drv) + "Return true if DRV corresponds to a ~/.config/guix/latest style of +derivation." + ;; Here we rely on a gross historical fact: that derivations produced by the + ;; "old style" (before commit 8a0d9bc8a3f153159d9e239a151c0fa98f1e12d8, + ;; dated May 30, 2018) did not depend on "guix-command.drv". + (not (find (lambda (input) + (string-suffix? "-guix-command.drv" + (derivation-input-path input))) + (derivation-inputs drv)))) + +(define (channel-instances->manifest instances) + "Return a profile manifest with entries for all of INSTANCES, a list of +channel instances." + (define instance->entry + (match-lambda + ((instance drv) + (let ((commit (channel-instance-commit instance)) + (channel (channel-instance-channel instance))) + (with-monad %store-monad + (return (manifest-entry + (name (symbol->string (channel-name channel))) + (version (string-take commit 7)) + (item (if (guix-channel? channel) + (if (old-style-guix? drv) + (whole-package-for-legacy + (string-append name "-" version) + drv) + drv) + drv)) + (properties + `((source (repository + (version 0) + (url ,(channel-url channel)) + (branch ,(channel-branch channel)) + (commit ,commit)))))))))))) + + (mlet* %store-monad ((derivations (channel-instance-derivations instances)) + (entries (mapm %store-monad instance->entry + (zip instances derivations)))) + (return (manifest entries)))) diff --git a/guix/describe.scm b/guix/describe.scm new file mode 100644 index 0000000000..3122a762fe --- /dev/null +++ b/guix/describe.scm @@ -0,0 +1,73 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2018 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 (guix describe) + #:use-module (guix memoization) + #:use-module (guix profiles) + #:use-module (srfi srfi-1) + #:use-module (ice-9 match) + #:export (package-path-entries)) + +;;; Commentary: +;;; +;;; This module provides supporting code to allow a Guix instance to find, at +;;; run time, which profile it's in (profiles created by 'guix pull'). That +;;; allows it to read meta-information about itself (e.g., repository URL and +;;; commit ID) and to find other channels available in the same profile. It's +;;; a bit like ELPA's pkg-info.el. +;;; +;;; Code: + +(define current-profile + (mlambda () + "Return the profile (created by 'guix pull') the calling process lives in, +or #f if this is not applicable." + (match (command-line) + ((program . _) + (and (string-suffix? "/bin/guix" program) + ;; Note: We want to do _lexical dot-dot resolution_. Using ".." + ;; for real would instead take us into the /gnu/store directory + ;; that ~/.config/guix/current/bin points to, whereas we want to + ;; obtain ~/.config/guix/current. + (let ((candidate (dirname (dirname program)))) + (and (file-exists? (string-append candidate "/manifest")) + candidate))))))) + +(define current-profile-entries + (mlambda () + "Return the list of entries in the 'guix pull' profile the calling process +lives in, or #f if this is not applicable." + (match (current-profile) + (#f '()) + (profile + (let ((manifest (profile-manifest profile))) + (manifest-entries manifest)))))) + +(define package-path-entries + (mlambda () + "Return a list of package path entries to be added to the package search +path. These entries are taken from the 'guix pull' profile the calling +process lives in, when applicable." + ;; Filter out Guix itself. + (filter-map (lambda (entry) + (and (not (string=? (manifest-entry-name entry) + "guix")) + (string-append (manifest-entry-item entry) + "/share/guile/site/" + (effective-version)))) + (current-profile-entries)))) diff --git a/guix/discovery.scm b/guix/discovery.scm index 2b627d108e..3fc6e2c9e7 100644 --- a/guix/discovery.scm +++ b/guix/discovery.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -27,6 +27,7 @@ #:use-module (ice-9 ftw) #:export (scheme-files scheme-modules + scheme-modules* fold-modules all-modules fold-module-public-variables)) @@ -115,6 +116,16 @@ name and the exception key and arguments." (string-append directory "/" sub-directory) directory)))) +(define* (scheme-modules* directory #:optional sub-directory) + "Return the list of module names found under SUB-DIRECTORY in DIRECTORY. +This is a source-only variant that does not try to load files." + (let ((prefix (string-length directory))) + (map (lambda (file) + (file-name->module-name (string-drop file prefix))) + (scheme-files (if sub-directory + (string-append directory "/" sub-directory) + directory))))) + (define* (fold-modules proc init path #:key (warn (const #f))) "Fold over all the Scheme modules present in PATH, a list of directories. Call (PROC MODULE RESULT) for each module that is found." diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm index ee68c21a4c..18c04f05dd 100644 --- a/guix/scripts/pull.scm +++ b/guix/scripts/pull.scm @@ -30,26 +30,19 @@ #:use-module (guix grafts) #:use-module (guix memoization) #:use-module (guix monads) + #:use-module (guix channels) #:autoload (guix inferior) (open-inferior) #:use-module (guix scripts build) - #:autoload (guix self) (whole-package) #:use-module (guix git) #:use-module (git) #:use-module (gnu packages) - #:autoload (gnu packages ssh) (guile-ssh) - #:autoload (gnu packages tls) (gnutls) #:use-module ((guix scripts package) #:select (build-and-use-profile)) - #:use-module ((guix build utils) - #:select (with-directory-excursion delete-file-recursively)) - #:use-module ((guix build download) - #:select (%x509-certificate-directory)) #:use-module (gnu packages base) #:use-module (gnu packages guile) #:use-module ((gnu packages bootstrap) #:select (%bootstrap-guile)) #:use-module ((gnu packages certs) #:select (le-certs)) #:use-module (srfi srfi-1) - #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:use-module (srfi srfi-37) @@ -57,9 +50,6 @@ #:use-module (ice-9 vlist) #:export (guix-pull)) -(define %repository-url - (or (getenv "GUIX_PULL_URL") "https://git.savannah.gnu.org/git/guix.git")) - ;;; ;;; Command-line options. @@ -67,9 +57,7 @@ (define %default-options ;; Alist of default option values. - `((repository-url . ,%repository-url) - (ref . (branch . "origin/master")) - (system . ,(%current-system)) + `((system . ,(%current-system)) (substitutes? . #t) (build-hook? . #t) (graft? . #t) @@ -81,6 +69,8 @@ Download and deploy the latest version of Guix.\n")) (display (G_ " --verbose produce verbose output")) (display (G_ " + -C, --channels=FILE deploy the channels defined in FILE")) + (display (G_ " --url=URL download from the Git repository at URL")) (display (G_ " --commit=COMMIT download the specified COMMIT")) @@ -105,6 +95,9 @@ Download and deploy the latest version of Guix.\n")) (cons* (option '("verbose") #f #f (lambda (opt name arg result) (alist-cons 'verbose? #t result))) + (option '(#\C "channels") #t #f + (lambda (opt name arg result) + (alist-cons 'channel-file arg result))) (option '(#\l "list-generations") #f #t (lambda (opt name arg result) (cons `(query list-generations ,(or arg "")) @@ -142,70 +135,6 @@ Download and deploy the latest version of Guix.\n")) (define indirect-root-added (store-lift add-indirect-root)) -(define %self-build-file - ;; The file containing code to build Guix. This serves the same purpose as - ;; a makefile, and, similarly, is intended to always keep this name. - "build-aux/build-self.scm") - -(define %pull-version - ;; This is the version of the 'guix pull' protocol. It specifies what's - ;; expected from %SELF-BUILD-FILE. The initial version ("0") was when we'd - ;; place a set of compiled Guile modules in ~/.config/guix/latest. - 1) - -(define* (build-from-source source - #:key verbose? commit) - "Return a derivation to build Guix from SOURCE, using the self-build script -contained therein. Use COMMIT as the version string." - ;; Running the self-build script makes it easier to update the build - ;; procedure: the self-build script of the Guix-to-be-installed contains the - ;; right dependencies, build procedure, etc., which the Guix-in-use may not - ;; be know. - (let* ((script (string-append source "/" %self-build-file)) - (build (primitive-load script))) - ;; BUILD must be a monadic procedure of at least one argument: the source - ;; tree. - ;; - ;; Note: BUILD can return #f if it does not support %PULL-VERSION. In the - ;; future we'll fall back to a previous version of the protocol when that - ;; happens. - (build source #:verbose? verbose? #:version commit - #:pull-version %pull-version))) - -(define (whole-package-for-legacy name modules) - "Return a full-blown Guix package for MODULES, a derivation that builds Guix -modules in the old ~/.config/guix/latest style." - (whole-package name modules - - ;; In the "old style", %SELF-BUILD-FILE would simply return a - ;; derivation that builds modules. We have to infer what the - ;; dependencies of these modules were. - (list guile-json guile-git guile-bytestructures - guile-ssh gnutls))) - -(define* (derivation->manifest-entry drv - #:key url branch commit) - "Return a manifest entry for DRV, which represents Guix at COMMIT. Record -URL, BRANCH, and COMMIT as a property in the manifest entry." - (mbegin %store-monad - (what-to-build (list drv)) - (built-derivations (list drv)) - (let ((out (derivation->output-path drv))) - (return (manifest-entry - (name "guix") - (version (string-take commit 7)) - (item (if (file-exists? (string-append out "/bin/guix")) - drv - (whole-package-for-legacy (string-append name "-" - version) - drv))) - (properties - `((source (repository - (version 0) - (url ,url) - (branch ,branch) - (commit ,commit)))))))))) - (define (display-profile-news profile) "Display what's up in PROFILE--new packages, and all that." (match (memv (generation-number profile) @@ -223,8 +152,8 @@ URL, BRANCH, and COMMIT as a property in the manifest entry." #:heading (G_ "New in this revision:\n")))) (_ #t))) -(define* (build-and-install source config-dir - #:key verbose? url branch commit) +(define* (build-and-install instances config-dir + #:key verbose?) "Build the tool from SOURCE, and install it in CONFIG-DIR." (define update-profile (store-lift build-and-use-profile)) @@ -232,15 +161,9 @@ URL, BRANCH, and COMMIT as a property in the manifest entry." (define profile (string-append config-dir "/current")) - (mlet* %store-monad ((drv (build-from-source source - #:commit commit - #:verbose? verbose?)) - (entry (derivation->manifest-entry drv - #:url url - #:branch branch - #:commit commit))) + (mlet %store-monad ((manifest (channel-instances->manifest instances))) (mbegin %store-monad - (update-profile profile (manifest (list entry))) + (update-profile profile manifest) (return (display-profile-news profile))))) (define (honor-lets-encrypt-certificates! store) @@ -426,45 +349,106 @@ and ALIST2 differ, display HEADING upfront." ((numbers ...) (list-generations profile numbers))))))))) +(define (channel-list opts) + "Return the list of channels to use. If OPTS specify a channel file, +channels are read from there; otherwise, if ~/.config/guix/channels.scm +exists, read it; otherwise %DEFAULT-CHANNELS is used. Apply channel +transformations specified in OPTS (resulting from '--url', '--commit', or +'--branch'), if any." + (define file + (assoc-ref opts 'channel-file)) + + (define default-file + (string-append (config-directory) "/channels.scm")) + + (define (load-channels file) + (let ((result (load* file (make-user-module '((guix channels)))))) + (if (and (list? result) (every channel? result)) + result + (leave (G_ "'~a' did not return a list of channels~%") file)))) + + (define channels + (cond (file + (load-channels file)) + ((file-exists? default-file) + (load-channels default-file)) + (else + %default-channels))) + + (define (environment-variable) + (match (getenv "GUIX_PULL_URL") + (#f #f) + (url + (warning (G_ "The 'GUIX_PULL_URL' environment variable is deprecated. +Use '~/.config/guix/channels.scm' instead.")) + url))) + + (let ((ref (assoc-ref opts 'ref)) + (url (or (assoc-ref opts 'repository-url) + (environment-variable)))) + (if (or ref url) + (match channels + ((one) + ;; When there's only one channel, apply '--url', '--commit', and + ;; '--branch' to this specific channel. + (let ((url (or url (channel-url one)))) + (list (match ref + (('commit . commit) + (channel (inherit one) + (url url) (commit commit) (branch #f))) + (('branch . branch) + (channel (inherit one) + (url url) (commit #f) (branch branch))) + (#f + (channel (inherit one) (url url))))))) + (_ + ;; Otherwise bail out. + (leave + (G_ "'--url', '--commit', and '--branch' are not applicable~%")))) + channels))) + (define (guix-pull . args) - (define (use-le-certs? url) - (string-prefix? "https://git.savannah.gnu.org/" url)) - (with-error-handling (with-git-error-handling - (let* ((opts (parse-command-line args %options - (list %default-options))) - (url (assoc-ref opts 'repository-url)) - (ref (assoc-ref opts 'ref)) - (cache (string-append (cache-directory) "/pull"))) + (let* ((opts (parse-command-line args %options + (list %default-options))) + (cache (string-append (cache-directory) "/pull")) + (channels (channel-list opts))) + (cond ((assoc-ref opts 'query) (process-query opts)) ((assoc-ref opts 'dry-run?) #t) ;XXX: not very useful (else (with-store store - (parameterize ((%graft? (assoc-ref opts 'graft?))) + (parameterize ((%graft? (assoc-ref opts 'graft?)) + (%repository-cache-directory cache)) (set-build-options-from-command-line store opts) - ;; For reproducibility, always refer to the LE certificates - ;; when we know we're talking to Savannah. - (when (use-le-certs? url) - (honor-lets-encrypt-certificates! store)) - - (format (current-error-port) - (G_ "Updating from Git repository at '~a'...~%") - url) - - (let-values (((checkout commit) - (latest-repository-commit store url - #:ref ref - #:cache-directory - cache))) + ;; When certificates are already installed, use them. + ;; Otherwise, use the Let's Encrypt certificates, which we + ;; know Savannah uses. + (let ((certs (or (getenv "SSL_CERT_DIR") "/etc/ssl/certs"))) + (unless (file-exists? certs) + (honor-lets-encrypt-certificates! store))) + (let ((instances (latest-channel-instances store channels))) (format (current-error-port) - (G_ "Building from Git commit ~a...~%") - commit) + (N_ "Building from this channel:~%" + "Building from these channels:~%" + (length instances))) + (for-each (lambda (instance) + (let ((channel + (channel-instance-channel instance))) + (format (current-error-port) + " ~10a~a\t~a~%" + (channel-name channel) + (channel-url channel) + (string-take + (channel-instance-commit instance) + 7)))) + instances) (parameterize ((%guile-for-build (package-derivation store @@ -472,13 +456,7 @@ and ALIST2 differ, display HEADING upfront." %bootstrap-guile (canonical-package guile-2.2))))) (run-with-store store - (build-and-install checkout (config-directory) - #:url url - #:branch (match ref - (('branch . branch) - branch) - (_ #f)) - #:commit commit + (build-and-install instances (config-directory) #:verbose? (assoc-ref opts 'verbose?))))))))))))) diff --git a/guix/self.scm b/guix/self.scm index 90649db17f..81f9b0cfd5 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -206,13 +206,6 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'." (local-file file #:recursive? #t))) (find-files (string-append directory "/" sub-directory) pred))) -(define (scheme-modules* directory sub-directory) - "Return the list of module names found under SUB-DIRECTORY in DIRECTORY." - (let ((prefix (string-length directory))) - (map (lambda (file) - (file-name->module-name (string-drop file prefix))) - (scheme-files (string-append directory "/" sub-directory))))) - (define* (sub-directory item sub-directory) "Return SUB-DIRECTORY within ITEM, which may be a file name or a file-like object." diff --git a/po/guix/POTFILES.in b/po/guix/POTFILES.in index d11f408d42..7f881355e7 100644 --- a/po/guix/POTFILES.in +++ b/po/guix/POTFILES.in @@ -38,4 +38,5 @@ guix/upstream.scm guix/ui.scm guix/http-client.scm guix/nar.scm +guix/channels.scm nix/nix-daemon/guix-daemon.cc |