add glue for nix-files changes

544aafc4bb9e… · Ryan Schanzenbacher ·

parent 01dd62a2d6cb… view tree

Changed files

diff --git a/home-config/home-configuration.scm b/home-config/home-configuration.scm
index 47cd45c..80500a1 100644
--- a/home-config/home-configuration.scm
+++ b/home-config/home-configuration.scm
@@ -16,10 +16,12 @@
(gnu home services desktop)
(gnu home services gnupg)
(gnu home services fontutils)
+ (gnu home services shepherd)
(gnu home services)
(ryan-services pipewire)
(ryan-services spotify)
(ryan-services file-manager)
+ (ryan-services guix-home-loader)
(ryan-config utils)
(ryan-packages freedesktop)
(ryan-packages calcurse)
@@ -219,6 +221,9 @@
; (prefer
; (family "DejaVu Sans Mono")))))
(service home-dbus-service-type)
+ (simple-service 'home-manager-shepherd
+ home-shepherd-service-type
+ (list home-manager-shepherd-loader))
(service downloads-garbage-collector-service-type
(downloads-garbage-collector-configuration
(user "ryan")))
diff --git a/home-config/nix-files b/home-config/nix-files
index 3d32373..aeb9107 160000
--- a/home-config/nix-files
+++ b/home-config/nix-files
@@ -1 +1 @@
-Subproject commit 3d323731bc263a72c8429f79186f8d9d0c704213
+Subproject commit aeb9107982a669bb3d2f270a6d8e78eb021f6501
diff --git a/modules/ryan-services/guix-home-loader.scm b/modules/ryan-services/guix-home-loader.scm
new file mode 100644
index 0000000..46c8bf5
--- /dev/null
+++ b/modules/ryan-services/guix-home-loader.scm
@@ -0,0 +1,50 @@
+;;; Add to the Guix Home configuration (home-configuration.scm).
+;;;
+;;; Registers the Shepherd services that home-manager's targets.guix module
+;;; generates into $XDG_STATE_HOME/home-manager/shepherd, every time the
+;;; user Shepherd starts. Each file is evaluated in a fresh module that uses
+;;; (shepherd service) -- the same thing `herd load root FILE` does, which is
+;;; what home-manager activation uses while Shepherd is already running.
+;;;
+;;; Needs: (use-modules (gnu services) (gnu home services shepherd) (guix gexp))
+(define-module (ryan-services guix-home-loader)
+ #:use-module (gnu services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (guix gexp))
+
+(define-public home-manager-shepherd-loader
+ (shepherd-service
+ (provision '(home-manager-services))
+ (documentation "Register Shepherd services generated by home-manager.")
+ (one-shot? #t)
+ (modules '((ice-9 ftw) (shepherd service)))
+ (start
+ #~(lambda _
+ (let* ((state (or (getenv "XDG_STATE_HOME")
+ (string-append (getenv "HOME") "/.local/state")))
+ (dir (string-append state "/home-manager/shepherd"))
+ ;; scandir sorts with string<? and returns #f if dir is absent.
+ (files (or (scandir dir (lambda (f) (string-suffix? ".scm" f)))
+ '())))
+ (for-each
+ (lambda (f)
+ (let ((file (string-append dir "/" f))
+ (m (make-fresh-user-module)))
+ (module-use! m (resolve-interface '(shepherd service)))
+ ;; One bad file must not keep the rest from registering.
+ (catch #t
+ (lambda ()
+ (save-module-excursion
+ (lambda ()
+ (set-current-module m)
+ (primitive-load file))))
+ (lambda (key . args)
+ (format (current-error-port)
+ "home-manager-services: ~a: ~a ~s~%" file key args)))))
+ files)
+ #t)))))
+
+;; In (home-environment (services (list ...))):
+;; (simple-service 'home-manager-shepherd
+;; home-shepherd-service-type
+;; (list home-manager-shepherd-loader))