aboutsummaryrefslogtreecommitdiff
path: root/guix-build.in
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-10-30 00:20:53 +0100
committerLudovic Courtès <ludo@gnu.org>2012-10-30 00:20:53 +0100
commit34811f02bf176c307ebe329aaefab8ed616a10df (patch)
treee6f80462f7755d136a4b753e291c4a6c0b7ba3d6 /guix-build.in
parentc8c88afaa14f760ec71ffb2ef0d712b7e42cc71f (diff)
downloadgnu-guix-34811f02bf176c307ebe329aaefab8ed616a10df.tar
gnu-guix-34811f02bf176c307ebe329aaefab8ed616a10df.tar.gz
guix-build: Add `--root'.
* guix/store.scm (add-indirect-root): New operation. * guix-build.in (show-help): Document `--root'. (%options): Add `--root'. (guix-build)[register-root]: New procedure. Call it when `--root' is passed.
Diffstat (limited to 'guix-build.in')
-rw-r--r--guix-build.in46
1 files changed, 44 insertions, 2 deletions
diff --git a/guix-build.in b/guix-build.in
index bd32ce951e..7089a74731 100644
--- a/guix-build.in
+++ b/guix-build.in
@@ -101,6 +101,9 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
--no-substitutes build instead of resorting to pre-built substitutes"))
(display (_ "
-c, --cores=N allow the use of up to N CPU cores for the build"))
+ (display (_ "
+ -r, --root=FILE make FILE a symlink to the result, and register it
+ as a garbage collector root"))
(newline)
(display (_ "
-h, --help display this help and exit"))
@@ -151,7 +154,10 @@ Report bugs to: ~a.~%") "@PACKAGE_BUGREPORT@"))
(option '("no-substitutes") #f #f
(lambda (opt name arg result)
(alist-cons 'substitutes? #f
- (alist-delete 'substitutes? result))))))
+ (alist-delete 'substitutes? result))))
+ (option '(#\r "root") #t #f
+ (lambda (opt name arg result)
+ (alist-cons 'gc-root arg result)))))
;;;
@@ -168,6 +174,33 @@ Report bugs to: ~a.~%") "@PACKAGE_BUGREPORT@"))
(alist-cons 'argument arg result))
%default-options))
+ (define (register-root drv root)
+ ;; Register ROOT as an indirect GC root for DRV's outputs.
+ (let* ((root (string-append (canonicalize-path (dirname root))
+ "/" root))
+ (drv* (call-with-input-file drv read-derivation))
+ (outputs (derivation-outputs drv*))
+ (outputs* (map (compose derivation-output-path cdr) outputs)))
+ (catch 'system-error
+ (lambda ()
+ (match outputs*
+ ((output)
+ (symlink output root)
+ (add-indirect-root %store root))
+ ((outputs ...)
+ (fold (lambda (output count)
+ (let ((root (string-append root "-" (number->string count))))
+ (symlink output root)
+ (add-indirect-root %store root))
+ (+ 1 count))
+ 0
+ outputs))))
+ (lambda args
+ (format (current-error-port)
+ (_ "failed to create GC root `~a': ~a~%")
+ root (strerror (system-error-errno args)))
+ (exit 1)))))
+
(setlocale LC_ALL "")
(textdomain "guix")
(setvbuf (current-output-port) _IOLBF)
@@ -244,7 +277,16 @@ Report bugs to: ~a.~%") "@PACKAGE_BUGREPORT@"))
(derivation-path->output-path
d out-name)))
(derivation-outputs drv)))))
- drv)))))))
+ drv)
+ (let ((roots (filter-map (match-lambda
+ (('gc-root . root)
+ root)
+ (_ #f))
+ opts)))
+ (when roots
+ (for-each (cut register-root <> <>)
+ drv roots)
+ #t))))))))
;; Local Variables:
;; eval: (put 'guard 'scheme-indent-function 1)