From 8689901f95499e98e0209e75b4f268bf2af325c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 24 Sep 2014 14:05:52 +0200 Subject: [PATCH] Introduce the 'GUIX_PACKAGE_PATH' environment variable. * gnu/packages.scm (%package-module-path): Honor $GUIX_PACKAGE_PATH. * test-env.in: Unset 'GUIX_PACKAGE_PATH'. * tests/guix-package.sh: Test it. * doc/guix.texi (Package Modules): Document it. --- doc/guix.texi | 13 +++++++++++-- gnu/packages.scm | 13 ++++++++++++- test-env.in | 3 +++ tests/guix-package.sh | 6 ++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index bdba88e2e2..f73ce52c4c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -3967,14 +3967,23 @@ object whose name is @code{emacs} is found. This package search facility is implemented in the @code{(gnu packages)} module. @cindex customization, of packages +@cindex package module search path Users can store package definitions in modules with different names---e.g., @code{(my-packages emacs)}. These package definitions will not be visible by default. Thus, users can invoke commands such as @command{guix package} and @command{guix build} have to be used with the @code{-e} option so that they know where to find the package, or use the @code{-L} option of these commands to make those modules visible -(@pxref{Invoking guix build, @code{--load-path}}). The latter makes it -easy to customize the distribution. +(@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. + +@defvr {Environment Variable} GUIX_PACKAGE_PATH +This is a colon-separated list of directories to search for package +modules. Directories listed in this variable take precedence over the +distribution's own modules. +@end defvr The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}: each package is built based solely on other packages in the diff --git a/gnu/packages.scm b/gnu/packages.scm index ddabacd199..6d128280cc 100644 --- a/gnu/packages.scm +++ b/gnu/packages.scm @@ -91,7 +91,18 @@ ;; 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. - (list (cons %distro-root-directory "gnu/packages"))) + (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) + + (make-parameter + (append environment `((,%distro-root-directory . "gnu/packages")))))) (define* (scheme-files directory) "Return the list of Scheme files found under DIRECTORY." diff --git a/test-env.in b/test-env.in index 34f57257d2..302118bb6f 100644 --- a/test-env.in +++ b/test-env.in @@ -93,6 +93,9 @@ unset LANGUAGE LC_MESSAGES=C export LC_MESSAGES +# Ignore user modules. +unset GUIX_PACKAGE_PATH + storedir="@storedir@" prefix="@prefix@" datarootdir="@datarootdir@" diff --git a/tests/guix-package.sh b/tests/guix-package.sh index 59b71d842d..9b0e75e6da 100644 --- a/tests/guix-package.sh +++ b/tests/guix-package.sh @@ -274,3 +274,9 @@ EOF guix package -A emacs-foo-bar -L "$module_dir" | grep 42 guix package -i emacs-foo-bar-42 -n -L "$module_dir" + +# Same thing using the 'GUIX_PACKAGE_PATH' environment variable. +GUIX_PACKAGE_PATH="$module_dir" +export GUIX_PACKAGE_PATH +guix package -A emacs-foo-bar | grep 42 +guix package -i emacs-foo-bar-42 -n