~ruther/guix-local

e0b47290a704c954d00d86e0c120fe44946f29f9 — Ludovic Courtès 9 years ago 3ebba94
services: Add 'gc-root-service-type'.

* gnu/services.scm (gc-roots->system-entry): New procedure.
(gc-root-service-type): New variable.
1 files changed, 28 insertions(+), 0 deletions(-)

M gnu/services.scm
M gnu/services.scm => gnu/services.scm +28 -0
@@ 73,6 73,7 @@
            setuid-program-service-type
            profile-service-type
            firmware-service-type
            gc-root-service-type

            %boot-service
            %activation-service


@@ 489,6 490,33 @@ kernel."
                (compose concatenate)
                (extend append)))

(define (gc-roots->system-entry roots)
  "Return an entry in the system's output containing symlinks to ROOTS."
  (mlet %store-monad ((entry (gexp->derivation
                              "gc-roots"
                              #~(let ((roots '#$roots))
                                  (mkdir #$output)
                                  (chdir #$output)
                                  (for-each symlink
                                            roots
                                            (map number->string
                                                 (iota (length roots))))))))
    (return (if (null? roots)
                '()
                `(("gc-roots" ,entry))))))

(define gc-root-service-type
  ;; A service to associate extra garbage-collector roots to the system.  This
  ;; is a simple hack that guarantees that the system retains references to
  ;; the given list of roots.  Roots must be "lowerable" objects like
  ;; packages, or derivations.
  (service-type (name 'gc-roots)
                (extensions
                 (list (service-extension system-service-type
                                          gc-roots->system-entry)))
                (compose concatenate)
                (extend append)))


;;;
;;; Service folding.