summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--build-aux/compile-as-derivation.scm21
-rw-r--r--build-aux/update-NEWS.scm9
-rw-r--r--doc/guix.texi281
-rw-r--r--gnu/local.mk3
-rw-r--r--gnu/packages.scm27
-rw-r--r--gnu/packages/admin.scm4
-rw-r--r--gnu/packages/bioinformatics.scm8
-rw-r--r--gnu/packages/cpp.scm2
-rw-r--r--gnu/packages/emacs.scm39
-rw-r--r--gnu/packages/enlightenment.scm35
-rw-r--r--gnu/packages/games.scm8
-rw-r--r--gnu/packages/gnu-pw-mgr.scm4
-rw-r--r--gnu/packages/linux.scm43
-rw-r--r--gnu/packages/mail.scm4
-rw-r--r--gnu/packages/messaging.scm15
-rw-r--r--gnu/packages/monitoring.scm83
-rw-r--r--gnu/packages/music.scm7
-rw-r--r--gnu/packages/patches/haskell-mode-make-check.patch35
-rw-r--r--gnu/packages/patches/haskell-mode-unused-variables.patch44
-rw-r--r--gnu/packages/patches/rust-1.19-mrustc.patch28
-rw-r--r--gnu/packages/python.scm12
-rw-r--r--gnu/packages/ruby.scm871
-rw-r--r--gnu/packages/rust.scm335
-rw-r--r--gnu/packages/wine.scm6
-rw-r--r--guix/channels.scm292
-rw-r--r--guix/describe.scm73
-rw-r--r--guix/discovery.scm13
-rw-r--r--guix/scripts/pull.scm218
-rw-r--r--guix/self.scm7
-rw-r--r--po/guix/POTFILES.in1
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