system: Add (guix build activation).
* gnu/services/dmd.scm (dmd-configuration-file): Remove 'etc' parameter. Move /etc activation code to... * guix/build/activation.scm: ... here; new file. * gnu/system.scm (operating-system-boot-script): Augment script: add (guix build activation) to the load path; call 'activate-etc'. * Makefile.am (MODULES): Add guix/build/activation.scm.master
parent
864068e204
commit
4dfe6c58ee
|
@ -71,6 +71,7 @@ MODULES = \
|
|||
guix/build/rpath.scm \
|
||||
guix/build/svn.scm \
|
||||
guix/build/vm.scm \
|
||||
guix/build/activation.scm \
|
||||
guix/packages.scm \
|
||||
guix/snix.scm \
|
||||
guix/scripts/download.scm \
|
||||
|
|
|
@ -30,9 +30,8 @@
|
|||
;;;
|
||||
;;; Code:
|
||||
|
||||
(define (dmd-configuration-file services etc)
|
||||
"Return the dmd configuration file for SERVICES, that initializes /etc from
|
||||
ETC (the derivation that builds the /etc directory) on startup."
|
||||
(define (dmd-configuration-file services)
|
||||
"Return the dmd configuration file for SERVICES."
|
||||
(define config
|
||||
#~(begin
|
||||
(use-modules (ice-9 ftw))
|
||||
|
@ -48,28 +47,6 @@ ETC (the derivation that builds the /etc directory) on startup."
|
|||
#:stop #$(service-stop service)))
|
||||
services))
|
||||
|
||||
;; /etc is a mixture of static and dynamic settings. Here is where we
|
||||
;; initialize it from the static part.
|
||||
(format #t "populating /etc from ~a...~%" #$etc)
|
||||
(let ((rm-f (lambda (f)
|
||||
(false-if-exception (delete-file f)))))
|
||||
(rm-f "/etc/static")
|
||||
(symlink #$etc "/etc/static")
|
||||
(for-each (lambda (file)
|
||||
;; TODO: Handle 'shadow' specially so that changed
|
||||
;; password aren't lost.
|
||||
(let ((target (string-append "/etc/" file))
|
||||
(source (string-append "/etc/static/" file)))
|
||||
(rm-f target)
|
||||
(symlink source target)))
|
||||
(scandir #$etc
|
||||
(lambda (file)
|
||||
(not (member file '("." ".."))))))
|
||||
|
||||
;; Prevent ETC from being GC'd.
|
||||
(rm-f "/var/guix/gcroots/etc-directory")
|
||||
(symlink #$etc "/var/guix/gcroots/etc-directory"))
|
||||
|
||||
;; guix-daemon 0.6 aborts if 'PATH' is undefined, so work around it.
|
||||
(setenv "PATH" "/run/current-system/bin")
|
||||
|
||||
|
|
|
@ -256,10 +256,25 @@ we're running in the final root."
|
|||
(mlet* %store-monad
|
||||
((services (sequence %store-monad (operating-system-services os)))
|
||||
(etc (operating-system-etc-directory os))
|
||||
(dmd-conf (dmd-configuration-file services etc)))
|
||||
(modules (imported-modules '((guix build activation))))
|
||||
(compiled (compiled-modules '((guix build activation))))
|
||||
(dmd-conf (dmd-configuration-file services)))
|
||||
(gexp->file "boot"
|
||||
#~(execl (string-append #$dmd "/bin/dmd")
|
||||
"dmd" "--config" #$dmd-conf))))
|
||||
#~(begin
|
||||
(eval-when (expand load eval)
|
||||
;; Make sure 'use-modules' below succeeds.
|
||||
(set! %load-path (cons #$modules %load-path))
|
||||
(set! %load-compiled-path
|
||||
(cons #$compiled %load-compiled-path)))
|
||||
|
||||
(use-modules (guix build activation))
|
||||
|
||||
;; Populate /etc.
|
||||
(activate-etc #$etc)
|
||||
|
||||
;; Start dmd.
|
||||
(execl (string-append #$dmd "/bin/dmd")
|
||||
"dmd" "--config" #$dmd-conf)))))
|
||||
|
||||
(define (operating-system-derivation os)
|
||||
"Return a derivation that builds OS."
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
;;; GNU Guix --- Functional package management for GNU
|
||||
;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
||||
;;; under the terms of the GNU General Public License as published by
|
||||
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||
;;; your option) any later version.
|
||||
;;;
|
||||
;;; GNU Guix is distributed in the hope that it will be useful, but
|
||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;; GNU General Public License for more details.
|
||||
;;;
|
||||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define-module (guix build activation)
|
||||
#:use-module (ice-9 ftw)
|
||||
#:export (activate-etc))
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
;;; This module provides "activation" helpers. Activation is the process that
|
||||
;;; consists in setting up system-wide files and directories so that an
|
||||
;;; 'operating-system' configuration becomes active.
|
||||
;;;
|
||||
;;; Code:
|
||||
|
||||
(define (activate-etc etc)
|
||||
"Install ETC, a directory in the store, as the source of static files for
|
||||
/etc."
|
||||
|
||||
;; /etc is a mixture of static and dynamic settings. Here is where we
|
||||
;; initialize it from the static part.
|
||||
|
||||
(format #t "populating /etc from ~a...~%" etc)
|
||||
(let ((rm-f (lambda (f)
|
||||
(false-if-exception (delete-file f)))))
|
||||
(rm-f "/etc/static")
|
||||
(symlink etc "/etc/static")
|
||||
(for-each (lambda (file)
|
||||
;; TODO: Handle 'shadow' specially so that changed
|
||||
;; password aren't lost.
|
||||
(let ((target (string-append "/etc/" file))
|
||||
(source (string-append "/etc/static/" file)))
|
||||
(rm-f target)
|
||||
(symlink source target)))
|
||||
(scandir etc
|
||||
(lambda (file)
|
||||
(not (member file '("." ".."))))
|
||||
|
||||
;; The default is 'string-locale<?', but we don't have
|
||||
;; it when run from the initrd's statically-linked
|
||||
;; Guile.
|
||||
string<?))
|
||||
|
||||
;; Prevent ETC from being GC'd.
|
||||
(rm-f "/var/guix/gcroots/etc-directory")
|
||||
(symlink etc "/var/guix/gcroots/etc-directory")))
|
||||
|
||||
;;; activation.scm ends here
|
Reference in New Issue