summaryrefslogtreecommitdiff
path: root/gnu/build/install.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/build/install.scm')
-rw-r--r--gnu/build/install.scm47
1 files changed, 45 insertions, 2 deletions
diff --git a/gnu/build/install.scm b/gnu/build/install.scm
index aa901f6971..76536daf49 100644
--- a/gnu/build/install.scm
+++ b/gnu/build/install.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -18,12 +18,14 @@
(define-module (gnu build install)
#:use-module (guix build utils)
+ #:use-module (guix build store-copy)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
#:export (install-grub
populate-root-file-system
reset-timestamps
- register-closure))
+ register-closure
+ populate-single-profile-directory))
;;; Commentary:
;;;
@@ -118,6 +120,8 @@ STORE."
(directory "/bin")
(directory "/tmp" 0 0 #o1777) ; sticky bit
+ (directory "/var/tmp" 0 0 #o1777)
+ (directory "/var/lock" 0 0 #o1777)
(directory "/root" 0 0) ; an exception
(directory "/home" 0 0)))
@@ -156,4 +160,43 @@ by 'guix-register'. As a side effect, this resets timestamps on store files."
(unless (zero? status)
(error "failed to register store items" closure))))
+(define* (populate-single-profile-directory directory
+ #:key profile closure)
+ "Populate DIRECTORY with a store containing PROFILE, whose closure is given
+in the file called CLOSURE (as generated by #:references-graphs.) DIRECTORY
+is initialized to contain a single profile under /root pointing to PROFILE.
+This is used to create the self-contained Guix tarball."
+ (define (scope file)
+ (string-append directory "/" file))
+
+ (define %root-profile
+ "/var/guix/profiles/per-user/root")
+
+ (define (mkdir-p* dir)
+ (mkdir-p (scope dir)))
+
+ (define (symlink* old new)
+ (symlink old (scope new)))
+
+ ;; Populate the store.
+ (populate-store (list closure) directory)
+ (register-closure (canonicalize-path directory) closure)
+
+ ;; XXX: 'guix-register' registers profiles as GC roots but the symlink
+ ;; target uses $TMPDIR. Fix that.
+ (delete-file (scope "/var/guix/gcroots/profiles"))
+ (symlink* "/var/guix/profiles"
+ "/var/guix/gcroots/profiles")
+
+ ;; Make root's profile, which makes it a GC root.
+ (mkdir-p* %root-profile)
+ (symlink* profile
+ (string-append %root-profile "/guix-profile-1-link"))
+ (symlink* (string-append %root-profile "/guix-profile-1-link")
+ (string-append %root-profile "/guix-profile"))
+
+ (mkdir-p* "/root")
+ (symlink* (string-append %root-profile "/guix-profile")
+ "/root/.guix-profile"))
+
;;; install.scm ends here