summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-09-24 11:26:30 +0200
committerLudovic Courtès <ludo@gnu.org>2014-09-24 14:06:09 +0200
commit300868ba57e3786dae399f3cac4fff39ad6c316f (patch)
treef7fb1e6d2e2e7cf0aec10f233d1286cd3f855b57
parentc107b54108f6640504371d414f8a47191b92dbb8 (diff)
downloadguix-300868ba57e3786dae399f3cac4fff39ad6c316f.tar.gz
guix build: Add -L/--load-path as a common option.
* guix/scripts/build.scm (show-build-options-help): Document -L.
  (%standard-build-options): Add -L/--load-path.
* tests/guix-package.sh: Test it.
-rw-r--r--doc/guix.texi21
-rw-r--r--guix/scripts/build.scm14
-rw-r--r--tests/guix-package.sh19
3 files changed, 48 insertions, 6 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index a63602162d..bdba88e2e2 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -2492,6 +2492,14 @@ following:
 
 @table @code
 
+@item --load-path=@var{directory}
+@itemx -L @var{directory}
+Add @var{directory} to the front of the package module search path
+(@pxref{Package Modules}).
+
+This allows users to define their own packages and make them visible to
+the command-line tools.
+
 @item --keep-failed
 @itemx -K
 Keep the build tree of failed builds.  Thus, if a build fail, its build
@@ -3951,17 +3959,22 @@ Reference Manual}).  For instance, the @code{(gnu packages emacs)}
 module exports a variable named @code{emacs}, which is bound to a
 @code{<package>} object (@pxref{Defining Packages}).
 
-The @code{(gnu packages @dots{})} module name space is special: it is
+The @code{(gnu packages @dots{})} module name space is
 automatically scanned for packages by the command-line tools.  For
 instance, when running @code{guix package -i emacs}, all the @code{(gnu
 packages @dots{})} modules are scanned until one that exports a package
 object whose name is @code{emacs} is found.  This package search
 facility is implemented in the @code{(gnu packages)} module.
 
+@cindex customization, of packages
 Users can store package definitions in modules with different
-names---e.g., @code{(my-packages emacs)}.  In that case, 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.
+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.
 
 The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}:
 each package is built based solely on other packages in the
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 09401e923c..cde2a25613 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -33,7 +33,7 @@
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-37)
-  #:autoload   (gnu packages) (specification->package)
+  #:autoload   (gnu packages) (specification->package %package-module-path)
   #:autoload   (guix download) (download-to-store)
   #:export (%standard-build-options
             set-build-options-from-command-line
@@ -100,6 +100,8 @@ the new package's version number from URI."
 options handled by 'set-build-options-from-command-line', and listed in
 '%standard-build-options'."
   (display (_ "
+  -L, --load-path=DIR    prepend DIR to the package module search path"))
+  (display (_ "
   -K, --keep-failed      keep build tree of failed builds"))
   (display (_ "
   -n, --dry-run          do not build the derivations"))
@@ -136,7 +138,15 @@ options handled by 'set-build-options-from-command-line', and listed in
 
 (define %standard-build-options
   ;; List of standard command-line options for tools that build something.
-  (list (option '(#\K "keep-failed") #f #f
+  (list (option '(#\L "load-path") #t #f
+                (lambda (opt name arg result . rest)
+                  ;; XXX: Imperatively modify the search paths.
+                  (%package-module-path (cons arg (%package-module-path)))
+                  (set! %load-path (cons arg %load-path))
+                  (set! %load-compiled-path (cons arg %load-compiled-path))
+
+                  (apply values (cons result rest))))
+        (option '(#\K "keep-failed") #f #f
                 (lambda (opt name arg result . rest)
                   (apply values
                          (alist-cons 'keep-failed? #t result)
diff --git a/tests/guix-package.sh b/tests/guix-package.sh
index 580aa506b3..59b71d842d 100644
--- a/tests/guix-package.sh
+++ b/tests/guix-package.sh
@@ -255,3 +255,22 @@ set -o pipefail || true
 guix package -A g | head -1 2> "$HOME/err1"
 guix package -I | head -1 2> "$HOME/err2"
 test "`cat "$HOME/err1" "$HOME/err2"`" = ""
+
+# Make sure '-L' extends the package module search path.
+module_dir="t-guix-package-$$"
+mkdir "$module_dir"
+trap "rm -rf $module_dir" EXIT
+
+cat > "$module_dir/foo.scm"<<EOF
+(define-module (foo)
+  #:use-module (guix packages)
+  #:use-module (gnu packages emacs))
+
+(define-public x
+  (package (inherit emacs)
+    (name "emacs-foo-bar")
+    (version "42")))
+EOF
+
+guix package -A emacs-foo-bar -L "$module_dir" | grep 42
+guix package -i emacs-foo-bar-42 -n -L "$module_dir"