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
544aafc4bb9e2e055c90130f7d924975b9ad2354
· 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)) |