> Hi, > > Looking at this definition in gnu/system.scm [1] I am trying to figure > out what 'os' is: > > (define* (operating-system-kernel-arguments > os root-device #:key (version %boot-parameters-version)) > "Return all the kernel arguments, including the ones not specified directly > by the user. VERSION should match that of the target record > object that will contain the kernel parameters." > (append (bootable-kernel-arguments os root-device version) > (operating-system-user-kernel-arguments os))) > > The same file also contains a record definition for > so it seemed reasonable to assume that 'os' referred to such a > record. In fact, the second procedure inside the 'append' above, > operating-system-user-kernel-arguments, is one of the accessors [2] > (even though the name does not match the field). Yes, it is supposed to be an record (of course, scheme does not enforce that in any way and it may end up being any other type during runtime if there is a bug in some other code). > In the first procedure bootable-kernel-arguments [3] however, 'os' > (which is called 'system' there) is used like a string, although inside > a gexp: > > (define* (bootable-kernel-arguments system root-device version) > "Return a list of kernel arguments (gexps) to boot SYSTEM from ROOT-DEVICE. > VERSION is the target version of the boot-parameters record." > ;; If the version is newer than 0, we use the new style initrd parameter > ;; names, otherwise we use the legacy ones. This is to maintain backward > ;; compatibility when producing bootloader configurations for older > ;; generations. > (define version>0? (> version 0)) > (list (string-append (if version>0? "root=" "--root=") > ;; Note: Always use the DCE format because that's what > ;; (gnu build linux-boot) expects for the 'root' > ;; kernel command-line option. > (file-system-device->string root-device > #:uuid-type 'dce)) > #~(string-append (if #$version>0? "gnu.system=" "--system=") #$system) > #~(string-append (if #$version>0? "gnu.load=" "--load=") > #$system "/boot"))) > > I know objects in the store become paths when unquoted via '#$'. Does > that also work for Guix records declared via define-record-type* [4] > (please note the asterisk)? Thanks! The record is expanded to a store path because there is a (define-gexp-compiler ...) form for it in gnu/system.scm[1]. The gexp expansion mechanism is explained quite well in a "Dissecting Guix" blog post[2]. [1]: https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/system.scm#n1623 [2]: https://guix.gnu.org/en/blog/2023/dissecting-guix-part-3-g-expressions/