From 300868ba57e3786dae399f3cac4fff39ad6c316f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 24 Sep 2014 11:26:30 +0200 Subject: 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. --- doc/guix.texi | 21 +++++++++++++++++---- guix/scripts/build.scm | 14 ++++++++++++-- tests/guix-package.sh | 19 +++++++++++++++++++ 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{} 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 @@ -99,6 +99,8 @@ the new package's version number from URI." "Display on the current output port help about the standard command-line 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 (_ " @@ -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"<