;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 Andrew Tropin ;;; ;;; 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 . (define-module (gnu home) #:use-module (gnu home services) #:use-module (gnu home services symlink-manager) #:use-module (gnu home services shells) #:use-module (gnu home services xdg) #:use-module (gnu home services fontutils) #:use-module (gnu services) #:use-module (guix records) #:use-module (guix diagnostics) #:use-module (guix gexp) #:use-module (guix store) #:export (home-environment home-environment? this-home-environment home-environment-derivation home-environment-user-services home-environment-essential-services home-environment-services home-environment-location home-environment-with-provenance)) ;;; Comment: ;;; ;;; This module provides a record for managing ;;; per-user packages and configuration files in the similar way as ;;; do for system packages and configuration files. ;;; ;;; Code: (define-record-type* home-environment make-home-environment home-environment? this-home-environment (packages home-environment-packages ; list of (PACKAGE OUTPUT...) (default '())) (essential-services home-environment-essential-services ; list of services (thunked) (default (home-environment-default-essential-services this-home-environment))) (services home-environment-user-services (default '())) (location home-environment-location ; (default (and=> (current-source-location) source-properties->location)) (innate))) (define (home-environment-default-essential-services he) "Return the list of essential services for home environment." (list (service home-run-on-first-login-service-type) (service home-activation-service-type) (service home-environment-variables-service-type) (service home-symlink-manager-service-type) (service home-fontconfig-service-type) (service home-xdg-base-directories-service-type) (service home-shell-profile-service-type) (service home-service-type) (service home-profile-service-type (home-environment-packages he)))) (define* (home-environment-services he) "Return all the services of home environment." (instantiate-missing-services (append (home-environment-user-services he) (home-environment-essential-services he)))) (define* (home-environment-derivation he) "Return a derivation that builds OS." (let* ((services (home-environment-services he)) (home (fold-services services #:target-type home-service-type))) (service-value home))) (define* (home-environment-with-provenance he config-file) "Return a variant of HE that stores its own provenance information, including CONFIG-FILE, if available. This is achieved by adding an instance of HOME-PROVENANCE-SERVICE-TYPE to its services." (home-environment (inherit he) (services (cons (service home-provenance-service-type config-file) (home-environment-user-services he))))) (define-gexp-compiler (home-environment-compiler (he ) system target) ((store-lift (lambda (store) (run-with-store store (home-environment-derivation he) #:system system #:target target))))) to refer to 'this-record'....* guix/records.scm (this-record): New syntax parameter. (make-syntactic-constructor)[wrap-field-value]: When F is thunked, return a one-argument lambda instead of a thunk, and parameterize THIS-RECORD. (define-record-type*)[thunked-field-accessor-definition]: Pass X to (real-get X). * tests/records.scm ("define-record-type* & thunked & this-record") ("define-record-type* & thunked & default & this-record") ("define-record-type* & thunked & inherit & this-record"): New tests. Ludovic Courtès 2019-01-22records: Detect duplicate field initializers....* guix/records.scm (report-duplicate-field-specifier): New procedure. (make-syntactic-constructor): Call it. * tests/records.scm ("define-record-type* & duplicate initializers"): New test. Co-authored-by: Mark H Weaver <mhw@netris.org> Ludovic Courtès 2018-08-31records: Adjust to test changes in 'record-abi-mismatch-error'....Fixes a test failure introduced in de5cbd4a38a33e0412f1c481fe8e01a871dc13e5. * guix/records.scm (abi-check): Refer to TYPE in an unquoted context so we get at the RTD. * tests/records.scm ("ABI checks"): Adjust 'catch' handler to changes in the 'record-abi-mismatch-error' arguments. Ludovic Courtès 2018-05-23records: Insert record type ABI checks in constructors....* guix/records.scm (print-record-abi-mismatch-error): New procedure. <top level>: Add 'set-exception-printer!' call. (current-abi-identifier, abi-check): New procedures. (make-syntactic-constructor): Add #:abi-cookie parameter. Insert calls to 'abi-check'. (define-record-type*)[compute-abi-cookie]: New procedure. Use it and emit a definition of the 'current-abi-identifier' for TYPE. * tests/records.scm ("ABI checks"): New test. Ludovic Courtès