Migration This is my new public git source viewer. Source coming soon. Please contact with concerns/bugs. Contact me

modules/ryan-services/guix-home-loader.scm

f6e54e21eef482faae05e8b157f7ee8d18260378 · 2.2 KB · 50 lines raw

1 ;;; Add to the Guix Home configuration (home-configuration.scm).
2 ;;;
3 ;;; Registers the Shepherd services that home-manager's targets.guix module
4 ;;; generates into $XDG_STATE_HOME/home-manager/shepherd, every time the
5 ;;; user Shepherd starts. Each file is evaluated in a fresh module that uses
6 ;;; (shepherd service) -- the same thing `herd load root FILE` does, which is
7 ;;; what home-manager activation uses while Shepherd is already running.
8 ;;;
9 ;;; Needs: (use-modules (gnu services) (gnu home services shepherd) (guix gexp))
10 (define-module (ryan-services guix-home-loader)
11 #:use-module (gnu services)
12 #:use-module (gnu home services shepherd)
13 #:use-module (guix gexp))
14
15 (define-public home-manager-shepherd-loader
16 (shepherd-service
17 (provision '(home-manager-services))
18 (documentation "Register Shepherd services generated by home-manager.")
19 (one-shot? #t)
20 (modules '((ice-9 ftw) (shepherd service)))
21 (start
22 #~(lambda _
23 (let* ((state (or (getenv "XDG_STATE_HOME")
24 (string-append (getenv "HOME") "/.local/state")))
25 (dir (string-append state "/home-manager/shepherd"))
26 ;; scandir sorts with string<? and returns #f if dir is absent.
27 (files (or (scandir dir (lambda (f) (string-suffix? ".scm" f)))
28 '())))
29 (for-each
30 (lambda (f)
31 (let ((file (string-append dir "/" f))
32 (m (make-fresh-user-module)))
33 (module-use! m (resolve-interface '(shepherd service)))
34 ;; One bad file must not keep the rest from registering.
35 (catch #t
36 (lambda ()
37 (save-module-excursion
38 (lambda ()
39 (set-current-module m)
40 (primitive-load file))))
41 (lambda (key . args)
42 (format (current-error-port)
43 "home-manager-services: ~a: ~a ~s~%" file key args)))))
44 files)
45 #t)))))
46
47 ;; In (home-environment (services (list ...))):
48 ;; (simple-service 'home-manager-shepherd
49 ;; home-shepherd-service-type
50 ;; (list home-manager-shepherd-loader))