aboutsummaryrefslogtreecommitdiff
path: root/guix/scripts/system.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/scripts/system.scm')
-rw-r--r--guix/scripts/system.scm45
1 files changed, 33 insertions, 12 deletions
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 66ad9192c1..4f1869af38 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -95,8 +95,8 @@
(store-lift show-what-to-build))
-(define* (copy-closure item target
- #:key (log-port (current-error-port)))
+(define* (copy-item item target
+ #:key (log-port (current-error-port)))
"Copy ITEM to the store under root directory TARGET and register it."
(mlet* %store-monad ((refs (references* item)))
(let ((dest (string-append target item))
@@ -118,6 +118,18 @@
(return #t))))
+(define* (copy-closure item target
+ #:key (log-port (current-error-port)))
+ "Copy ITEM and all its dependencies to the store under root directory
+TARGET, and register them."
+ (mlet* %store-monad ((refs (references* item))
+ (to-copy (topologically-sorted*
+ (delete-duplicates (cons item refs)
+ string=?))))
+ (sequence %store-monad
+ (map (cut copy-item <> target #:log-port log-port)
+ to-copy))))
+
(define* (install os-drv target
#:key (log-port (current-output-port))
grub? grub.cfg device)
@@ -136,16 +148,10 @@ When GRUB? is true, install GRUB on DEVICE, using GRUB.CFG."
(mkdir-p (string-append target (%store-prefix)))
;; Copy items to the new store.
- (sequence %store-monad
- (map (cut copy-closure <> target #:log-port log-port)
- to-copy))))))
+ (copy-closure to-copy target #:log-port log-port)))))
(mlet* %store-monad ((os-dir -> (derivation->output-path os-drv))
- (refs (references* os-dir))
- (lst -> (delete-duplicates (cons os-dir refs)
- string=?))
- (to-copy (topologically-sorted* lst))
- (% (maybe-copy to-copy)))
+ (% (maybe-copy os-dir)))
;; Create a bunch of additional files.
(format log-port "populating '~a'...~%" target)
@@ -166,6 +172,16 @@ When GRUB? is true, install GRUB on DEVICE, using GRUB.CFG."
;; The system profile.
(string-append %state-directory "/profiles/system"))
+(define-syntax-rule (save-environment-excursion body ...)
+ "Save the current environment variables, run BODY..., and restore them."
+ (let ((env (environ)))
+ (dynamic-wind
+ (const #t)
+ (lambda ()
+ body ...)
+ (lambda ()
+ (environ env)))))
+
(define* (switch-to-system os
#:optional (profile %system-profile))
"Make a new generation of PROFILE pointing to the directory of OS, switch to
@@ -179,7 +195,11 @@ it atomically, and then run OS's activation script."
(switch-symlinks profile generation)
(format #t (_ "activating system...~%"))
- (return (primitive-load (derivation->output-path script)))
+
+ ;; The activation script may change $PATH, among others, so protect
+ ;; against that.
+ (return (save-environment-excursion
+ (primitive-load (derivation->output-path script))))
;; TODO: Run 'deco reload ...'.
)))
@@ -293,7 +313,8 @@ actions."
(mlet %store-monad ((% (switch-to-system os)))
(when grub?
(unless (false-if-exception
- (install-grub grub.cfg device "/"))
+ (install-grub (derivation->output-path grub.cfg)
+ device "/"))
(leave (_ "failed to install GRUB on device '~a'~%")
device)))
(return #t)))