summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi13
-rw-r--r--gnu/packages.scm13
-rw-r--r--test-env.in3
-rw-r--r--tests/guix-package.sh6
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