aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015, 2016, 2017, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Joshua S. Grant <jgrant@parenthetical.io>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;;
;;; 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 <http://www.gnu.org/licenses/>.

(define-module (gnu)
  #:use-module (guix i18n)
  #:use-module (guix diagnostics)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (ice-9 match)
  #:use-module (guix packages)
  #:use-module (gnu packages)
  #:use-module (gnu services)
  #:export (use-package-modules
            use-service-modules
            use-system-modules))

;;; Commentary:
;;;
;;; This composite module re-exports core parts the (gnu …) public modules.
;;;
;;; Code:

(eval-when (eval load compile)
  (begin
    (define %public-modules
      '((gnu system)
        (gnu system mapped-devices)
        (gnu system file-systems)
        (gnu bootloader)
        (gnu bootloader grub)
        (gnu system keyboard)
        (gnu system pam)
        (gnu system shadow)                       ; 'user-account'
        (gnu system linux-initrd)
        (gnu system nss)
        (gnu services)
        (gnu services base)
        (gnu packages)
        (gnu packages base)
        (guix gexp)))                             ; so gexps can be used

    (for-each (let ((i (module-public-interface (current-module))))
                (lambda (m)
                  (module-use! i (resolve-interface m))))
              %public-modules)))

(define (%try-use-modules modules location make-hint)
  "Attempt to load all of MODULES.  Report errors as coming from LOCATION, a
<location> record, and use MAKE-HINT to produce a fix hint."
  (define (location->string loc)
    (match loc
      (#f "")
      (($ <location> file line column)
       (format #f "~a:~a:~a: " file line column))))

  (for-each (lambda (module)
              (catch 'misc-error
                (lambda ()
                  (process-use-modules `((,module))))
                (lambda _
                  (raise
                   (apply
                    make-compound-condition
                    (formatted-message (G_ "module ~a not found")
                                       module)
                    (condition
                     (&error-location (location location)))
                    (or (and=> (make-hint module) list)
                        '()))))))
            modules))

(define (package-module-hint module)
  (define last-name
    (match module
      ((_ ... last)
       (symbol->string last))))

  (match (find-packages-by-name last-name)
    (()
     (condition
      (&fix-hint
       (hint (G_ "\
You may use @command{guix package --show=foo | grep location} to search
for the location of package @code{foo}.
If you get the line @code{location: gnu/packages/bar.scm:174:2},
add @code{bar} to the @code{use-package-modules} form.")))))
    ((package _ ...)
     (condition
      (&fix-hint
       (hint (format #f (G_ "\
Try adding @code{(use-package-modules ~a)}.")
                     (basename (location-file (package-location package))
                               ".scm"))))))))

(define (service-module-hint module)
  (define last-name
    (match module
      ((_ ... last)
       last)))

  (match (lookup-service-types last-name)
    (()
     (condition
      (&fix-hint
       (hint (format #f (G_ "\
You may use @command{guix system search ~a} to search for a service
matching @code{~a}.
If you get the line @code{location: gnu/services/foo.scm:188:2},
add @code{foo} to the @code{use-service-modules} form.")
                     last-name last-name)))))
    ((package _ ...)
     (condition
      (&fix-hint
       (hint (format #f (G_ "\
Try adding @code{(use-service-modules ~a)}.")
                     (basename (location-file (service-type-location package))
                               ".scm"))))))))

(define-syntax-rule (try-use-modules hint modules ...)
  (eval-when (expand load eval)
    (%try-use-modules '(modules ...)
                      (source-properties->location
                       (current-source-location))
                      hint)))

(define-syntax-rule (use-package-modules module ...)
  (try-use-modules package-module-hint
                   (gnu packages module) ...))

(define-syntax-rule (use-service-modules module ...)
  (try-use-modules service-module-hint
                   (gnu services module) ...))

(define-syntax-rule (use-system-modules module ...)
  (try-use-modules (const #f)                     ;no hint
                   (gnu system module) ...))

;;; gnu.scm ends here
635affa99a4040'>system: De-monadify 'operating-system-boot-parameters'....* gnu/system.scm (operating-system-boot-parameters): Turn to direct style instead of monadic. (operating-system-bootcfg): Adjust accordingly. (operating-system-boot-parameters-file): Likewise. Ludovic Courtès 2018-11-18linux-initrd: Return file-like objects instead of monadic values....This is an incompatible change visible to users via the 'initrd' field of 'operating-system'. However, assuming the user's 'initrd' value tail-calls to 'raw-initrd' or 'base-initrd', the switch to non-monadic style is invisible. * gnu/system/linux-initrd.scm (expression->initrd): Use 'computed-file' instead of 'gexp->derivation'. (raw-initrd, base-initrd): Adjust docstring to mention non-monadic return. * gnu/system/vm.scm (expression->derivation-in-linux-vm): Adjust accordingly. * gnu/system.scm (operating-system-directory-base-entries) (operating-system-initrd-file) (operating-system-boot-parameters): Adjust accordingly. * doc/guix.texi (operating-system Reference) (Initial RAM Disk): Update. Ludovic Courtès 2018-11-18system: Simplify kernel argument handling....* gnu/system.scm (bootable-kernel-arguments): Remove 'kernel-arguments' parameter and return only the base list of kernel arguments. Rename 'system.drv' to 'system'. (operating-system-kernel-arguments): Adjust accordingly and remove 'system.drv' parameter. (read-boot-parameters-file): Adjust accordingly. Remove 'if params' since dominating code assumed PARAMS is always true. (operating-system-boot-parameters): Remove 'system.drv' parameter; add #:system-kernel-arguments? instead and honor it. (operating-system-bootcfg): Adjust accordingly. (operating-system-boot-parameters-file): Likewise. * gnu/system/vm.scm (system-qemu-image/shared-store-script): Remove 'os-drv' variable. Adjust call to 'operating-system-kernel-arguments'. Ludovic Courtès 2018-11-18bootloader: De-monadify configuration file generators....* gnu/bootloader/extlinux.scm: Remove unneeded imports. (extlinux-configuration-file): Use 'computed-file' instead of 'gexp->derivation'. * gnu/bootloader/grub.scm (svg->png): Likewise. (grub-background-image, eye-candy): Adjust accordingly, return non-monadically. (grub-configuration-file): Likewise, and use 'computed-file' instead of 'gexp->derivation'. * gnu/bootloader/u-boot.scm: Remove unneeded imports. * gnu/system.scm: Add 'lower-object' call. Ludovic Courtès 2018-09-26services: shepherd: Add workaround for 0.5.0 in containers....* gnu/services/shepherd.scm (%containerized-shepherd-service): New service. * gnu/system.scm (essential-services): Use it when CONTAINER? is true. Ludovic Courtès 2018-06-21system: Mapped devices needed for boot do not yield Shepherd services....Fixes <https://bugs.gnu.org/31889>. Reported by Taylan Kammer <taylanbayirli@gmail.com>. * gnu/system.scm (non-boot-file-system-service)[mapped-devices-for-boot]: New variable. Remove dependencies of FS that are members of MAPPED-DEVICES-FOR-BOOT. (mapped-device-user): Rename to... (mapped-device-users): ... this. Use 'filter' instead of 'find'. (operating-system-user-mapped-devices) (operating-system-boot-mapped-devices): Use 'any file-system-needed-for-boot?' instead of looking at the first user. * tests/system.scm ("non-boot-file-system-service"): New test. Ludovic Courtès 2018-06-20services: boot: Take gexps instead of monadic gexps....* gnu/services.scm (compute-boot-script): Rename 'mexps' to 'gexps' and remove 'mlet' form. (boot-service-type): Update comment. (cleanup-gexp): Remove 'with-monad' and 'return'. (activation-script): Rewrite in non-monadic style: use 'scheme-file' instead of 'gexp->file'. (gexps->activation-gexp): Remove 'mlet', return a gexp. * gnu/services/shepherd.scm (shepherd-boot-gexp): Remove 'with-monad' and 'return'. * gnu/system.scm (operating-system-boot-script): Remove outdated comment. * gnu/tests/base.scm (%cleanup-os): For 'dirty-service', remove 'with-monad' and 'return'. Ludovic Courtès 2018-06-20services: boot: Reverse the order of boot expressions....* gnu/services.scm (compute-boot-script): Reverse MEXPS. * gnu/system.scm (essential-services): Reverse order of %SHEPHERD-ROOT-SERVICE, %ACTIVATION-SERVICE, and CLEANUP-SERVICE-TYPE. Ludovic Courtès 2018-06-18system: Have /run/setuid-programs first in $PATH....Fixes <https://bugs.gnu.org/31814>. Reported by Clément Lassieur <clement@lassieur.org>. * gnu/system.scm (operating-system-etc-service)["profile"]: Arrange so that /run/setuid-programs comes first in $PATH. Ludovic Courtès 2018-06-12system: Move ~/.config/guix/current first in PATH and INFOPATH....Fixes <https://bugs.gnu.org/31770>. Reported by iyzsong@member.fsf.org (宋文武). * gnu/system.scm (operating-system-etc-service)["profile"]: Arrange so that ~/.config/guix/current comes first in PATH and INFOPATH. Ludovic Courtès 2018-06-09system: Honor ~/.config/guix/current in /etc/profile....* gnu/system.scm (operating-system-etc-service)[profile]: Add ~/.config/guix/current/share/info to INFOPATH. Treat ~/.guix-profile and ~/.config/guix/current in the same way. Ludovic Courtès 2018-06-01Merge branch 'master' into core-updatesLudovic Courtès 2018-05-31system: 'read-boot-parameters' provides a more meaningful warning....'system' here was bound to Guile's 'system' procedure. * gnu/system.scm (read-boot-parameters): Fix argument for fallback warning. Ludovic Courtès 2018-05-28Merge branch 'master' into core-updatesMark H Weaver 2018-05-28file-systems: Remove 'title' field and add <file-system-label>....The 'title' field was easily overlooked and was an endless source of confusion. Now, the value of the 'device' field is self-contained. * gnu/system/file-systems.scm (<file-system>): Change constructor name to '%file-system'. [title]: Remove. (<file-system-label>): New record type with printer. (report-deprecation, device-expression) (process-file-system-declaration, file-system): New macros. (file-system-title): New procedure. (file-system->spec, spec->file-system): Adjust to handle <file-system-label>. * gnu/system.scm (bootable-kernel-arguments): Add case for 'file-system-label?'. (read-boot-parameters): Likewise. (mapped-device-user): Avoid 'file-system-title'. (fs->boot-device): Remove. (operating-system-boot-parameters): Use 'file-system-device' instead of 'fs->boot-device'. (device->sexp): Add case for 'file-system-label?'. * gnu/bootloader/grub.scm (grub-root-search): Add case for 'file-system-label?'. * gnu/system/examples/bare-bones.tmpl, gnu/system/examples/beaglebone-black.tmpl, gnu/system/examples/lightweight-desktop.tmpl, gnu/system/examples/vm-image.tmpl: Remove uses of 'title'. * gnu/system/vm.scm (virtualized-operating-system): Remove uses of 'file-system-title'. * guix/scripts/system.scm (check-file-system-availability): Likewise, and adjust fix-it hint. (check-initrd-modules)[file-system-/dev]: Likewise. * gnu/build/file-systems.scm (canonicalize-device-spec): Remove 'title' parameter. [canonical-title]: Remove. Match on SPEC's type rather than on CANONICAL-TITLE. (mount-file-system): Adjust caller. * gnu/build/linux-boot.scm (boot-system): Interpret ROOT here. * gnu/services/base.scm (file-system->fstab-entry): Remove use of 'file-system-title'. * doc/guix.texi (File Systems): Remove documentation of the 'title' field. Rewrite documentation of 'device' and document 'file-system-label'. Ludovic Courtès 2018-05-21Merge branch 'master' into core-updatesMark H Weaver 2018-05-19file-systems: Do not export <file-system>....* gnu/system/file-systems.scm (<file-system>): Do not export. * gnu/system.scm (operating-system-root-file-system): Use an accessor instead of 'match'. Ludovic Courtès 2018-04-12Merge branch 'master' into core-updatesMark H Weaver 2018-04-11system: Provide a fall-back PATH for non-login shells started with su(1)....* gnu/system.scm (operating-system-etc-service): Provide values for ENV_PATH and ENV_SUPATH in '/etc/login.defs'. Leo Famulari 2018-03-29Merge branch 'master' into core-updatesMarius Bakke 2018-03-20gnu: util-linux: Fix CVE-2018-7738 without grafting....* gnu/packages/linux.scm (util-linux)[replacement]: Remove field. (util-linux-2.31.1): New variable. * gnu/system.scm (%base-packages): Use util-linux-2.31.1. Leo Famulari 2018-03-07services: file-systems: Include 'user-file-systems' service....Previously the KNOWN-FS value used in 'essential-services' would be incomplete: it would lack all the file systems provided by services that extend 'file-system-service-type' (/sys/fs/cgroup, /proc/sys/fs/binfmt_misc, etc.) Consequently, upon shutdown, 'user-processes' would unmount these file systems before their corresponding service had been stopped; when their corresponding (e.g., 'file-system-/proc/sys/fs/binfmt_misc') was stopped, its 'umount' call would fail. This was harmless in practice, but this patch makes sure things work as intended and file systems are unmounted in the right order. * gnu/services/base.scm (file-system-shepherd-services): Instantiate 'user-file-systems' Shepherd service from here. (user-unmount-service-type, user-unmount-service): Remove. * gnu/system.scm (essential-services): Remove call to 'user-unmount-service'. * gnu/system/install.scm (cow-store-service-type): Adjust comment. Ludovic Courtès 2018-03-02system: Add 'initrd-modules' field....* gnu/system.scm (<operating-system>)[initrd-modules]: New field. (operating-system-initrd-file): Pass #:linux-modules to 'make-initrd'. * gnu/system/linux-initrd.scm (default-initrd-modules): New procedure. (%base-initrd-modules): New macro. (base-initrd): Add #:linux-modules and honor it. * gnu/system/install.scm (embedded-installation-os): Use 'initrd-modules' instead of 'initrd'. * gnu/tests/install.scm (%raid-root-os): Likewise. * doc/guix.texi (operating-system Reference): Add 'initrd-modules'. (Initial RAM Disk): Document it. Adjust example to not use #:extra-modules. Ludovic Courtès 2018-01-23Merge branch 'master' into core-updatesMark H Weaver 2018-01-21services: Missing services are automatically instantiated....This simplifies OS configuration: users no longer need to be aware of what a given service depends on. See the discussion at <https://lists.gnu.org/archive/html/guix-devel/2018-01/msg00114.html>. * gnu/services.scm (missing-target-error): New procedure. (service-back-edges): Use it. (instantiate-missing-services): New procedure. * gnu/system.scm (operating-system-services): Call 'instantiate-missing-services'. * tests/services.scm ("instantiate-missing-services") ("instantiate-missing-services, no default value"): New tests. * gnu/services/version-control.scm (cgit-service-type)[extensions]: Add FCGIWRAP-SERVICE-TYPE. * gnu/tests/version-control.scm (%cgit-os): Remove NGINX-SERVICE-TYPE and FCGIWRAP-SERVICE-TYPE instances. * doc/guix.texi (Log Rotation): Remove 'mcron-service-type' in example. (Miscellaneous Services): Remove 'nginx-service-type' and 'fcgiwrap-service-type' in Cgit example. Ludovic Courtès 2018-01-11Merge branch 'master' into core-updatesLeo Famulari 2018-01-09system: Export operating-system-user-kernel-arguments....* gnu/system.scm (operating-system-user-kernel-arguments): Export it. Danny Milosavljevic 2017-12-31Merge remote-tracking branch 'origin/master' into core-updatesEfraim Flashner 2017-12-22services: 'user-processes-service-type' can now be extended....* gnu/services/base.scm (user-processes-shepherd-service): New procedure, taken from former 'user-processes-service-type'. Add REQUIREMENTS argument; remove GRACE-DELAY argument. (user-processes-service-type): Redefine in terms of 'service-type'. (user-processes-service): Remove. (file-system-service-type): Extend USER-PROCESSES-SERVICE-TYPE. * gnu/system.scm (essential-services): Use USER-PROCESSES-SERVICE-TYPE directly. Ludovic Courtès 2017-12-05Merge branch 'master' into core-updatesMarius Bakke 2017-11-20Add semicolon in commands that set GUIX_PROFILE....Fixes <https://bugs.gnu.org/28223>. Reported by Rosebud Uplink <Uplink.Introversion@outlook.com>. * doc/guix.texi (Binary Installation): Add missing semicolon after 'GUIX_PROFILE=' line. (Invoking guix package): Likewise. * gnu/system.scm (operating-system-etc-service)[profile]: Likewise. * guix/build/profiles.scm (build-etc/profile): Likewise. Ludovic Courtès 2017-11-19Merge branch 'master' into core-updatesMarius Bakke 2017-11-13services: guix: Remove dependency on 'lsof'....This is a followup to b8f59cdc20e9d83ce63523ef917e95fcee07f134: 'list-runtime-roots' no longer depends on 'lsof'. * gnu/services/base.scm (<guix-configuration>)[lsof]: Remove. (guix-shepherd-service): Adjust accordingly. * doc/guix.texi (Base Services): Adjust accordingly. * gnu/system.scm (%base-packages): Remove LSOF. Ludovic Courtès 2017-11-09system: Do not set 'TZ'....Fixes <https://bugs.gnu.org/29212>. Reported by Diego Nicola Barbato <dnbarbato@posteo.de>. * gnu/system.scm (operating-system-environment-variables): Remove "TZ". Ludovic Courtès 2017-11-02gnu: rfkill: Mark as superseded by util-linux....* gnu/packages/linux.scm (rfkill)[properties]: New field, superseded by util-linux. * gnu/system.scm (%base-packages): Remove rfkill. Efraim Flashner 2017-10-10system: operating-system-etc-service: Set XCURSOR_PATH....* gnu/system.scm (operating-system-etc-service): Set XCURSOR_PATH environment variable so that libxcursor finds cursors in user and system profiles. * gnu/packages/xorg.scm (libxcursor): Add a TODO for better handling of XCURSOR_PATH in other profiles. Thomas Danckaert 2017-10-07system: Really filter out Linux device names for the store....This is a followup to db4e8fd5d4a07d3be8ce68fb96722ef7077c0eee. Fixes <https://bugs.gnu.org/28445>. Reported by Mark H Weaver <mhw@netris.org>. * gnu/system.scm (ensure-not-/dev): New procedure. (read-boot-parameters)[ensure-not-/dev]: Remove. (operating-system-boot-parameters): Use it. Ludovic Courtès 2017-09-21system: <boot-parameters> does not use "/dev" device names....Fixes <https://bugs.gnu.org/28445>. Reported by Mark H Weaver and Roel Janssen. * gnu/system.scm (read-boot-parameters)[ensure-not-/dev]: New procedure. Use it. Ludovic Courtès 2017-09-20gnu: system: Fix computation of boot parameters for LUKS devices....* gnu/system.scm (read-boot-parameters): Fix store-device computation for root devices of type "device", like the LUKS partition described in the manual. From a patch from https://debbugs.gnu.org/cgi/bugreport.cgi?bug=28445#23. Signed-off-by: Andy Wingo <wingo@igalia.com> Andy Wingo 2017-09-19system: Create "/etc/hostname"....* gnu/system.scm (operating-system-etc-service): Add a plain-file with the operating-system-host-name. Thomas Danckaert 2017-09-18system: Define 'DICPATH' in /etc/profile....* gnu/system.scm (operating-system-etc-service) <profile>: Define 'DICPATH'. Ludovic Courtès